Implement Tic-Tac-Toe Game

Fix Currency Counter Sometimes Adding Decimals
This commit is contained in:
Alan Moon 2025-07-05 13:40:16 -07:00
parent 7b599863d8
commit 042671da91
20 changed files with 1458 additions and 222 deletions

View File

@ -0,0 +1,13 @@
namespace QtCNETAPI.Enums
{
public enum GameStatus
{
WaitingForPlayer,
SelectingSymbol,
Ongoing,
P1Win,
P2Win,
NoWin,
PlayerDisconnected
}
}

View File

@ -0,0 +1,9 @@
namespace QtCNETAPI.Enums
{
public enum TicTacToeSymbol
{
X,
O,
Blank
}
}

View File

@ -0,0 +1,16 @@
using QtCNETAPI.Enums;
using QtCNETAPI.Models;
namespace QtCNETAPI.Schema
{
public class GameRoom
{
public string Id { get; set; } = string.Empty;
public GameStatus Status { get; set; }
public TicTacToeBoard Board { get; set; } = new();
public User? Player1 { get; set; }
public TicTacToeSymbol P1Symbol { get; set; } = TicTacToeSymbol.Blank;
public User? Player2 { get; set; }
public TicTacToeSymbol P2Symbol { get; set; } = TicTacToeSymbol.Blank;
}
}

View File

@ -0,0 +1,17 @@
using QtCNETAPI.Enums;
namespace QtCNETAPI.Schema
{
public class TicTacToeBoard
{
public TicTacToeSymbol Square1 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square2 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square3 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square4 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square5 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square6 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square7 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square8 { get; set; } = TicTacToeSymbol.Blank;
public TicTacToeSymbol Square9 { get; set; } = TicTacToeSymbol.Blank;
}
}

View File

@ -0,0 +1,10 @@
using QtCNETAPI.Models;
namespace QtCNETAPI.Schema
{
public class TicTacToeMove
{
public User User { get; set; } = new();
public int Point { get; set; }
}
}

View File

@ -21,7 +21,6 @@ namespace qtc_net_client_2.Forms
IApiService _apiService;
AudioService AudioService = new();
private List<User> UserList = new();
public ChatRoom(IGatewayService gatewayService, IApiService apiService)
{
_gatewayService = gatewayService;

View File

@ -32,6 +32,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
ListViewItem listViewItem1 = new ListViewItem("Stock Market", 0);
ListViewItem listViewItem2 = new ListViewItem("Guess The Number", 1);
ListViewItem listViewItem3 = new ListViewItem("Tic-Tac-Toe (Multiplayer)", "Tic-tac-toe.png");
tbcMain = new TabControl();
tbpContacts = new TabPage();
lvContacts = new ListView();
@ -229,7 +230,8 @@
lvGames.Anchor = AnchorStyles.Left | AnchorStyles.Right;
listViewItem1.Tag = "StockMarketGame";
listViewItem2.Tag = "GuessTheNumberGame";
lvGames.Items.AddRange(new ListViewItem[] { listViewItem1, listViewItem2 });
listViewItem3.Tag = "TicTacToeGame";
lvGames.Items.AddRange(new ListViewItem[] { listViewItem1, listViewItem2, listViewItem3 });
lvGames.LargeImageList = ilGames;
lvGames.Location = new Point(0, 0);
lvGames.MultiSelect = false;
@ -247,6 +249,7 @@
ilGames.TransparentColor = Color.Transparent;
ilGames.Images.SetKeyName(0, "dollar-money.gif");
ilGames.Images.SetKeyName(1, "NumberGuessGameIcon.png");
ilGames.Images.SetKeyName(2, "Tic-tac-toe.png");
//
// ilTabIcons
//

View File

@ -274,7 +274,7 @@ namespace qtc_net_client_2
var result = await _apiService.AddCurrencyToCurrentUser(tokenJackpotSpinner.TokensWon, true);
if (result.Success)
{
lblCurrencyAmount.Text = (_apiService.CurrentUser.CurrencyAmount + tokenJackpotSpinner.TokensWon).ToString("N");
lblCurrencyAmount.Text = (_apiService.CurrentUser.CurrencyAmount + tokenJackpotSpinner.TokensWon).ToString("N0");
llblClaimSpin.Visible = false;
}
else MessageBox.Show("We Were Unable To Claim Your Prize At This Time. Please Try Again Later.", "Uh Oh.", MessageBoxButtons.OK, MessageBoxIcon.Error);
@ -322,6 +322,10 @@ namespace qtc_net_client_2
GuessTheNumber guessTheNumber = new GuessTheNumber(_apiService);
guessTheNumber.Show();
break;
case "TicTacToeGame":
TicTacToeGame ticTacToeGame = new TicTacToeGame(_apiService);
ticTacToeGame.Show();
break;
}
}
}

View File

@ -128,7 +128,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA0A0AAAJNU0Z0AUkBTAMBAQAB
2AEAAdgBAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAD
4AEAAeABAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAD
rQH/A7oB/wO6Af8DuQH/A7oB/wO6Af8D2gX/A/wB/wP+Df8D/QH/A/wR/wP8Af8D/g3/A/0B/wPZAf8D
ugH/A7oB/wO6Af8DugH/A7oB/wO6Af//AIEAA58B/wO6Af8DugH/A7oB/wO6Af8DugH/A9oJ/wP9Af8D
/g3/A/0B/wP9Ef8D/AH/A/4N/wPaAf8DugH/A7oB/wO6Af8DugH/A7oB/wO6Af//AIEAA6IB/wO6Af8D
@ -196,93 +196,93 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAKhQAAAJNU0Z0AUkBTAIBAQQB
AAGQAQABkAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAGhQAAAJNU0Z0AUkBTAIBAQQB
AAGYAQABmAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B
0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB
BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA0sB9QMkAfsDNgH+AzYB/gMkAfsDUwH0A2IB
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBRQFXAUUB9QEhAVIBIQH7ARIBUgESAf4BEgFSARIB/gEhAVIB
IQH7AU0BUwFNAfQDYgHhA1EBoQMeASoQAAMgAS0DVAGrA1sB5AFFAlcB9QEhAlIB+wESAlIB/gESAlIB
/gEhAlIB+wFNAlMB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAkUBVwH1AiEBUgH7AhIBUgH+AhIB
UgH+AiEBUgH7Ak0BUwH0A2IB4QNRAaEDHgEqDAADGwElA1gBvQNaAfIDOgH+AzAB/wM5Af8DPAH/AzYB
/wMqAf8DJAH/A0AB/QNYAfADVgGyAxoBIwgAAxsBJQNYAb0BVQFaAVUB8gESAVoBEgH+AQABVwEAAf8B
AAFnAQAB/wEAAWwBAAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ASQBQAEkAf0BUwFdAVMB8ANWAbIB
GQEaARkBIwgAAxsBJQNYAb0BVQJaAfIBEgJaAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8B
AAJAAf8BJAJAAf0BUwJdAfADVgGyARkCGgEjCAADGwElA1gBvQJVAVoB8gISAVoB/gIAAVcB/wIAAWcB
/wIAAWwB/wIAAWEB/wIAAUwB/wIAAUAB/wIkAUAB/QJTAV0B8ANWAbICGQEaASMEAAMDAQQDUgGlA14B
8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB/wNkAf8DTAH/AzEB/wM2Af4DXAHuA1ABmgMDAQQDAwEEAVIB
UwFSAaUBUAFvAVAB8wEAAYIBAAH/AQABmQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB
/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB/wESAVIBEgH+AVkBYAFZAe4DUAGaAwMBBAMDAQQBUgJTAaUB
UAJvAfMBAAKCAf8BAAKZAf8BAAK2Af8BAALMAf8BAALTAf8BAALLAf8BAAKzAf8BAAKIAf8BAAJXAf8B
EgJSAf4BWQJgAe4DUAGaAwMBBAMDAQQCUgFTAaUCUAFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8C
AAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8CEgFSAf4CWQFgAe4DUAGaAwMBBAMtAUQDYAHoA3UB
YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA0wB9QMkAfsDNwH+AzcB/gMkAfsDUwH0A2IB
4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBRgFYAUYB9QEhAVMBIQH7ARMBUwETAf4BEwFTARMB/gEhAVMB
IQH7AU8BUwFPAfQDYgHhA1EBoQMeASoQAAMgAS0DVAGrA1sB5AFGAlgB9QEhAlMB+wETAlMB/gETAlMB
/gEhAlMB+wFPAlMB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAkYBWAH1AiEBUwH7AhMBUwH+AhMB
UwH+AiEBUwH7Ak8BUwH0A2IB4QNRAaEDHgEqDAADGwElA1gBvQNaAfIDOwH+AzAB/wM5Af8DPAH/AzYB
/wMqAf8DJAH/A0AB/QNZAfADVgGyAxoBIwgAAxsBJQNYAb0BVwFaAVcB8gETAVsBEwH+AQABVwEAAf8B
AAFnAQAB/wEAAWwBAAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ASYBQAEmAf0BVAFeAVQB8ANWAbIB
GQEaARkBIwgAAxsBJQNYAb0BVwJaAfIBEwJbAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8B
AAJAAf8BJgJAAf0BVAJeAfADVgGyARkCGgEjCAADGwElA1gBvQJXAVoB8gITAVsB/gIAAVcB/wIAAWcB
/wIAAWwB/wIAAWEB/wIAAUwB/wIAAUAB/wImAUAB/QJUAV4B8ANWAbICGQEaASMEAAMDAQQDUgGlA18B
8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB/wNkAf8DTAH/AzEB/wM3Af4DXQHuA1ABmgMDAQQDAwEEAVIB
UwFSAaUBUQFvAVEB8wEAAYIBAAH/AQABmQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB
/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB/wETAVMBEwH+AVoBYQFaAe4DUAGaAwMBBAMDAQQBUgJTAaUB
UQJvAfMBAAKCAf8BAAKZAf8BAAK2Af8BAALMAf8BAALTAf8BAALLAf8BAAKzAf8BAAKIAf8BAAJXAf8B
EwJTAf4BWgJhAe4DUAGaAwMBBAMDAQQCUgFTAaUCUQFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8C
AAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8CEwFTAf4CWgFhAe4DUAGaAwMBBAMtAUQDYAHoA3YB
/gNuAf8DewH/A4UB/wOKAf8DjAH/A4oB/wOFAf8DdgH/A1cB/wMyAf8DQAH9A14B3QMqAT8DLQFEAWAB
aQFgAegBEgGQARIB/gEAAcYBAAH/AQAB3AEAAf8BAAHuAQAB/wEAAfgBAAH/AQAB+wEAAf8BAAH5AQAB
/wEAAe8BAAH/AQAB1AEAAf8BAAGcAQAB/wEAAVoBAAH/ASQBQAEkAf0DXgHdAyoBPwMtAUQBYAJpAegB
EgKQAf4BAALGAf8BAALcAf8BAALuAf8BAAL4Af8BAAL7Af8BAAL5Af8BAALvAf8BAALUAf8BAAKcAf8B
AAJaAf8BJAJAAf0DXgHdAyoBPwMtAUQCYAFpAegCEgGQAf4CAAHGAf8CAAHcAf8CAAHuAf8CAAH4Af8C
AAH7Af8CAAH5Af8CAAHvAf8CAAHUAf8CAAGcAf8CAAFaAf8CJAFAAf0DXgHdAyoBPwNOAZUDdwH4A38B
/wOFAf8DigH/A40B/wOOAf8DjgH/A44B/wONAf8DiQH/A3cB/wNNAf8DJQH/A1oB8gNKAYsDTgGVATwB
kgE8AfgBAAHlAQAB/wEAAe8BAAH/AQAB+AEAAf8BAAH9AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wEAAf4BAAH/AQAB9gEAAf8BAAHVAQAB/wEAAYsBAAH/AQABQQEAAf8BVQFaAVUB8gNKAYsDTgGVATwC
kgH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8BAAP/AQAC/gH/AQAC9gH/AQAC1QH/AQAC
iwH/AQACQQH/AVUCWgHyA0oBiwNOAZUCPAGSAfgCAAHlAf8CAAHvAf8CAAH4Af8CAAH9Af8CAAL/AgAC
/wIAAv8CAAH+Af8CAAH2Af8CAAHVAf8CAAGLAf8CAAFBAf8CVQFaAfIDSgGLA18B0wN+AfwDkwH/A44B
aQFgAegBEwGOARMB/gEAAcYBAAH/AQAB3AEAAf8BAAHuAQAB/wEAAfgBAAH/AQAB+wEAAf8BAAH5AQAB
/wEAAe8BAAH/AQAB1AEAAf8BAAGcAQAB/wEAAVoBAAH/ASYBQAEmAf0DXgHdAyoBPwMtAUQBYAJpAegB
EwKOAf4BAALGAf8BAALcAf8BAALuAf8BAAL4Af8BAAL7Af8BAAL5Af8BAALvAf8BAALUAf8BAAKcAf8B
AAJaAf8BJgJAAf0DXgHdAyoBPwMtAUQCYAFpAegCEwGOAf4CAAHGAf8CAAHcAf8CAAHuAf8CAAH4Af8C
AAH7Af8CAAH5Af8CAAHvAf8CAAHUAf8CAAGcAf8CAAFaAf8CJgFAAf0DXgHdAyoBPwNOAZUDdwH4A38B
/wOFAf8DigH/A40B/wOOAf8DjgH/A44B/wONAf8DiQH/A3cB/wNNAf8DJQH/A1oB8gNKAYsDTgGVAT0B
kAE9AfgBAAHlAQAB/wEAAe8BAAH/AQAB+AEAAf8BAAH9AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wEAAf4BAAH/AQAB9gEAAf8BAAHVAQAB/wEAAYsBAAH/AQABQQEAAf8BVwFaAVcB8gNKAYsDTgGVAT0C
kAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8BAAP/AQAC/gH/AQAC9gH/AQAC1QH/AQAC
iwH/AQACQQH/AVcCWgHyA0oBiwNOAZUCPQGQAfgCAAHlAf8CAAHvAf8CAAH4Af8CAAH9Af8CAAL/AgAC
/wIAAv8CAAH+Af8CAAH2Af8CAAHVAf8CAAGLAf8CAAFBAf8CVwFaAfIDSgGLA18B0wN+AfwDkwH/A44B
/wONAf8DjgH/A44B/wOOAf8DjgH/A44B/wONAf8DhQH/A2cB/wM0Af8DQQH5A1oBxAFbAV8BWwHTASsB
vAErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB/gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB/wEAAbkBAAH/AQABXQEAAf8BNQFBATUB+QNaAcQBWwJfAdMB
KwK8AfwBDgL7Af8BAwL9Af8BAAL+Af8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv0B/wEAAu8B/wEAArkB
/wEAAl0B/wE1AkEB+QNaAcQCWwFfAdMCKwG8AfwCDgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8C
AAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B/wI1AUEB+QNaAcQDbgH1A4AB/gOfAf8DkwH/A48B
/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAUoBhQFKAfUBNgHbATYB
ugErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB/gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB/wEAAbkBAAH/AQABXQEAAf8BOAFBATgB+QNaAcQBWwJfAdMB
KwK6AfwBDgL7Af8BAwL9Af8BAAL+Af8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv0B/wEAAu8B/wEAArkB
/wEAAl0B/wE4AkEB+QNaAcQCWwFfAdMCKwG6AfwCDgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8C
AAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B/wI4AUEB+QNaAcQDbgH1A4AB/gOfAf8DkwH/A48B
/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAUsBgwFLAfUBNwHZATcB
/gEnAf8BJwH/AQsB/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wEkAUABJAH9A2IB4QFKAoUB9QE2AtsB
/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB/wEAAoEB/wEkAkAB
/QNiAeECSgGFAfUCNgHbAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH5Af8C
AAHWAf8CAAGBAf8CJAFAAf0DYgHhA3UB9gOKAf4DqwH/A5kB/wOQAf8DjgH/A44B/wOOAf8DjgH/A44B
/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAYsBSAH2AVkB2wFZAf4BQgH/AUIB/wEZAf8BGQH/AQQB
/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wEmAUABJgH9A2IB4QFLAoMB9QE3AtkB
/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB/wEAAoEB/wEmAkAB
/QNiAeECSwGDAfUCNwHZAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH5Af8C
AAHWAf8CAAGBAf8CJgFAAf0DYgHhA3QB9gOIAf4DqwH/A5kB/wOQAf8DjgH/A44B/wOOAf8DjgH/A44B
/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAYcBSAH2AVoB2QFaAf4BQgH/AUIB/wEZAf8BGQH/AQQB
/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB
/wEAAeQBAAH/AQABmAEAAf8BJAFAASQB/QNeAeIBSAKLAfYBWQLbAf4BQgP/ARkD/wEEA/8BAAP/AQAD
/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BJAJAAf0DXgHiAkgBiwH2AlkB2wH+AkIC
/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgABmAH/AiQBQAH9A14B
4gNhAdYDjAH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOCAf8DXAH/A00B
+gNaAccBXAFhAVwB1gFkAcABZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB/wEBAf8BAAH/AQAB
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB/wEAAaUBAAH/ASYB
TQEmAfoDWgHHAVwCYQHWAWQCwAH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC
/gH/AQAC6gH/AQACpQH/ASYCTQH6A1oBxwJcAWEB1gJkAcAB/AJfAv8CLwL/AgwC/wIBAv8CAAL/AgAC
/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wImAU0B+gNaAccDUAGaA44B+QPFAf8DsgH/A5wB
/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1ABmgFqAaUBagH5AXwB
/wEAAeQBAAH/AQABmAEAAf8BJgFAASYB/QNeAeIBSAKHAfYBWgLZAf4BQgP/ARkD/wEEA/8BAAP/AQAD
/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BJgJAAf0DXgHiAkgBhwH2AloB2QH+AkIC
/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgABmAH/AiYBQAH9A14B
4gNhAdYDiQH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOCAf8DXAH/A00B
+gNaAccBXAFhAVwB1gFkAb4BZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB/wEBAf8BAAH/AQAB
/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB/wEAAaUBAAH/AScB
TQEnAfoDWgHHAVwCYQHWAWQCvgH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC
/gH/AQAC6gH/AQACpQH/AScCTQH6A1oBxwJcAWEB1gJkAb4B/AJfAv8CLwL/AgwC/wIBAv8CAAL/AgAC
/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wInAU0B+gNaAccDUAGaA40B+QPFAf8DsgH/A5wB
/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1ABmgFqAaEBagH5AXwB
/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB
/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVUBawFVAfIDTAGQA1ABmgFqAqUB+QF8A/8B
UQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B/wFVAmsB8gNMAZAD
UAGaAmoBpQH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB/gH/AgAB6wH/AgAB
rQH/AlUBawHyA0wBkAMvAUkDbAHrA6wB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B/wOQAf8DkwH/A5MB
/wOFAf8DVAH9A2AB4AMtAUUDLwFJAWwBbQFsAesBgAHbAYAB/gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B
/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB/wEKAf8BCgH+AQoB/wEBAe0BAQH/ASQB
tgEkAf0BYAFmAWAB4AMtAUUDLwFJAWwCbQHrAYAC2wH+AX8D/wFJA/8BHwP/AQwD/wEFA/8BAwP/AQUD
/wEKA/8BCgL+Af8BAQLtAf8BJAK2Af0BYAJmAeADLQFFAy8BSQJsAW0B6wKAAdsB/gJ/Av8CSQL/Ah8C
/wIMAv8CBQL/AgMC/wIFAv8CCgL/AgoB/gH/AgEB7QH/AiQBtgH9AmABZgHgAy0BRQMDAQQDVgGuA38B
9QPZAf8DywH/A7cB/wOnAf8DnQH/A5oB/wOcAf8DnwH/A5sB/wOJAf8DaAHwA1IBowMDAQQDAwEEA1YB
rgFwAYUBcAH1AagB/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B
/wEfAf8BJgH/ASYB/wEdAf8BHQH/AQUB8wEFAf8BUwFsAVMB8ANSAaMDAwEEAwMBBANWAa4BcAKFAfUB
qAP/AYkD/wFcA/8BNwP/ASID/wEbA/8BHwP/ASYD/wEdA/8BBQLzAf8BUwJsAfADUgGjAwMBBAMDAQQD
VgGuAnABhQH1AqgC/wKJAv8CXAL/AjcC/wIiAv8CGwL/Ah8C/wImAv8CHQL/AgUB8wH/AlMBbAHwA1IB
owMDAQQEAAMcAScDXQHHA38B9gO7Af4D1wH/A8wB/wPCAf8DuwH/A7cB/wOxAf8DgAH+A2sB9ANZAbwD
GwEmCAADHAEnA10BxwF4AYsBeAH2AZMB2wGTAf4BpQH/AaUB/wGLAf8BiwH/AXQB/wF0Af8BZgH/AWYB
/wFcAf8BXAH/AU4B/wFOAf8BQgHbAUIB/gFQAX8BUAH0AVcBWQFXAbwDGwEmCAADHAEnA10BxwF4AosB
9gGTAtsB/gGlA/8BiwP/AXQD/wFmA/8BXAP/AU4D/wFCAtsB/gFQAn8B9AFXAlkBvAMbASYIAAMcAScD
XQHHAngBiwH2ApMB2wH+AqUC/wKLAv8CdAL/AmYC/wJcAv8CTgL/AkIB2wH+AlABfwH0AlcBWQG8AxsB
JgwAAyEBMANZAbYDbQHuA6EB+gO+Af0D1AH/A8wB/wO+Af0DigH5A2wB6wNVAawDHwEsEAADIQEwA1kB
tgFrAW8BawHuAYoBqwGKAfoBrgHJAa4B/QGfAf8BnwH/AYwB/wGMAf8BZAHJAWQB/QFoAaUBaAH5AWEB
bQFhAesDVQGsAx8BLBAAAyEBMANZAbYBawJvAe4BigKrAfoBrgLJAf0BnwP/AYwD/wFkAskB/QFoAqUB
+QFhAm0B6wNVAawDHwEsEAADIQEwA1kBtgJrAW8B7gKKAasB+gKuAckB/QKfAv8CjAL/AmQByQH9AmgB
pQH5AmEBbQHrA1UBrAMfASwUAAMGAQcDNgFYA1UBrANmAeUDrwH8A5kB+wNlAeIDUwGnAzMBUQMGAQcY
AAMGAQcDNgFYA1UBrAFmAWcBZgHlAX4BwAF+AfwBeQG2AXkB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcD
NgFYA1UBrAFmAmcB5QF+AsAB/AF5ArYB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrAJmAWcB
5QJ+AcAB/AJ5AbYB+wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQAB
AQYAAQEWAAP/gQAB4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQFQ
AAGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBws=
/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVcBawFXAfIDTAGQA1ABmgFqAqEB+QF8A/8B
UQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B/wFXAmsB8gNMAZAD
UAGaAmoBoQH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB/gH/AgAB6wH/AgAB
rQH/AlcBawHyA0wBkAMvAUkDbAHrA6oB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B/wOQAf8DkwH/A5MB
/wOFAf8DUwH9A2AB4AMtAUUDLwFJA2wB6wGAAdkBgAH+AX8B/wF/Af8BSQH/AUkB/wEfAf8BHwH/AQwB
/wEMAf8BBQH/AQUB/wEDAf8BAwH/AQUB/wEFAf8BCgH/AQoB/wEKAf4BCgH/AQEB7QEBAf8BJgG2ASYB
/QFgAWYBYAHgAy0BRQMvAUkDbAHrAYAC2QH+AX8D/wFJA/8BHwP/AQwD/wEFA/8BAwP/AQUD/wEKA/8B
CgL+Af8BAQLtAf8BJgK2Af0BYAJmAeADLQFFAy8BSQNsAesCgAHZAf4CfwL/AkkC/wIfAv8CDAL/AgUC
/wIDAv8CBQL/AgoC/wIKAf4B/wIBAe0B/wImAbYB/QJgAWYB4AMtAUUDAwEEA1YBrgN8AfUD2QH/A8sB
/wO3Af8DpwH/A50B/wOaAf8DnAH/A58B/wObAf8DiQH/A2gB8ANSAaMDAwEEAwMBBANWAa4BbwGDAW8B
9QGoAf8BqAH/AYkB/wGJAf8BXAH/AVwB/wE3Af8BNwH/ASIB/wEiAf8BGwH/ARsB/wEfAf8BHwH/ASYB
/wEmAf8BHQH/AR0B/wEFAfMBBQH/AVQBawFUAfADUgGjAwMBBAMDAQQDVgGuAW8CgwH1AagD/wGJA/8B
XAP/ATcD/wEiA/8BGwP/AR8D/wEmA/8BHQP/AQUC8wH/AVQCawHwA1IBowMDAQQDAwEEA1YBrgJvAYMB
9QKoAv8CiQL/AlwC/wI3Av8CIgL/AhsC/wIfAv8CJgL/Ah0C/wIFAfMB/wJUAWsB8ANSAaMDAwEEBAAD
HAEnA10BxwN9AfYDuQH+A9cB/wPMAf8DwgH/A7sB/wO3Af8DsQH/A4AB/gNpAfQDWQG8AxsBJggAAxwB
JwNdAccBdwGHAXcB9gGRAdkBkQH+AaUB/wGlAf8BiwH/AYsB/wF0Af8BdAH/AWYB/wFmAf8BXAH/AVwB
/wFOAf8BTgH/AUMB2QFDAf4BUgF9AVIB9AFXAVkBVwG8AxsBJggAAxwBJwNdAccBdwKHAfYBkQLZAf4B
pQP/AYsD/wF0A/8BZgP/AVwD/wFOA/8BQwLZAf4BUgJ9AfQBVwJZAbwDGwEmCAADHAEnA10BxwJ3AYcB
9gKRAdkB/gKlAv8CiwL/AnQC/wJmAv8CXAL/Ak4C/wJDAdkB/gJSAX0B9AJXAVkBvAMbASYMAAMhATAD
WQG2A2wB7gOfAfoDvgH9A9QB/wPMAf8DvgH9A4kB+QNsAesDVQGsAx8BLBAAAyEBMANZAbYBagFuAWoB
7gGHAakBhwH6Aa4BxgGuAf0BnwH/AZ8B/wGMAf8BjAH/AWMBxgFjAf0BaAGhAWgB+QFhAWwBYQHrA1UB
rAMfASwQAAMhATADWQG2AWoCbgHuAYcCqQH6Aa4CxgH9AZ8D/wGMA/8BYwLGAf0BaAKhAfkBYQJsAesD
VQGsAx8BLBAAAyEBMANZAbYCagFuAe4ChwGpAfoCrgHGAf0CnwL/AowC/wJjAcYB/QJoAaEB+QJhAWwB
6wNVAawDHwEsFAADBgEHAzYBWANVAawDZgHlA60B/AOYAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYB
WANVAawDZgHlAX4BvgF+AfwBdwGyAXcB+wNlAeIDUwGnAzMBUQMGAQcYAAMGAQcDNgFYA1UBrANmAeUB
fgK+AfwBdwKyAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlAn4BvgH8AncBsgH7A2UB
4gNTAacDMwFRAwYBBwwAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/+BAAHgAQcB
4AEHAeABBwHgAQcBwAEDAcABAwHAAQMBwAEDAYABAQGAAQEBgAEBAYABAVAAAYABAQGAAQEBgAEBAYAB
AQHAAQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHCw==
</value>
</data>
<metadata name="ilGames.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -292,142 +292,166 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAoh8AAAJNU0Z0AUkBTAIBAQIB
AAFQAQEBUAEBASABAAEgAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABgAMAASADAAEBAQABIAYAAUB6
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAPCUAAAJNU0Z0AUkBTAIBAQMB
AAFYAQEBWAEBASABAAEgAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABgAMAASADAAEBAQABIAYAAUB6
AANcAecBCAEKAQAB/wMqAUAMAAMqAUADNgFXAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwD
PwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAI7AToBYgMzAVEDGAEh/wB1AAMhATADRgGAFAAB
FQEfAQQB/wENARUBAAH/AQgBCgEAAf8BCAEKAQAB/wwAA0QBegNTAacCYQFdAc8CYQFdAc8CYQFdAc8C
PwFsAz8BbAM/AWwDPwFsAz8BbAM/AWwDPwFsAz8BbAI7AToBYgMzAVEDGAEhVAADZAGiA28BwCAAA2YB
pgNtAbzwAAMhATADRgGAFAABFQEfAQQB/wENARUBAAH/AQgBCgEAAf8BCAEKAQAB/wwAA0QBegNTAacC
YQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8C
YQFdAc8CYQFdAc8CYAFdAc4DWQG7AlABTwGbAyoBQP8AaQADWgG/AQgBCgEAAf8BCAEKAQAB/wEIAQoB
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8DWgG/A1oBvwFDAXQBBwH/AUcBdwEMAf8B
JQFHAQAB/wEOARkBAAH/DAACSwFKAYoCWgFYAb0CZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
ZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
YwFaAekCXwFbAdMDVQGvAy4BSP8AZQABCAEKAQAB/wEQAR4BAAH/ASEBQQEAAf8BJwFLAQAB/wEmAUoB
AAH/ASEBQQEAAf8BEAEeAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEpAU4BAAH/AVoBlgEQAf8B
WgGcARAB/wFzAbYBJgH/ARgBLgEAAf8MAANJAYYCWgFYAbcCZQFgAeMCZQFgAeMCZQFgAeMCZQFgAeMC
agFhAeYCagFeAe0BdAFoAVMB9AGuAXcBKwH8Af8BeAEAAv8BeAEAAf8BcAFuAU8B9QJqAWEB5gJlAWAB
4wJlAWAB4wJlAWAB4wJlAV4B4gJeAVsBzQJVAVMBqgIuAS0BRv8AYQABCAEKAQAB/wE9AXEBAgH/AUwB
hgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AUwBfwEPAf8BOwFnAQgB
/wEhATQBCAH/AVMBjgELAf8BWgGcARAB/wFyAbMBJwH/AVMBgQEbAf8QAAMrAUEDNgFZAkABPwFuAkAB
PwFuAkABPwFuAkABPwFuA0QBewJRAVABnwJdAVsBxQFmAmIB7gH/AXgBAAL/AXgBAAH/Al8BXQHJA0UB
fAJAAT8BbgJAAT8BbgJAAT8BbgM/AW0DOwFjAzMBUgMZASL/AF0AARUBKQEAAf8BSgGEAQQB/wFSAYwB
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVIBjAEQAf8B
WgGUARAB/wFWAZABDAH/AVoBmgEQAf8BWgGcARAB/wFyAakBMAH/AQgBCgEAAf8BCAEKAQAB/wwAAwwB
EAMRARYDFQEcAxUBHAMVARwDFQEcAyEBMAI+AT0BaQJTAVIBpQJmAV8B5QH/AXgBAAL/AXgBAAH/AlUB
UwGqAyIBMQMVARwDFQEcAxUBHAMUARsDEwEZAxABFQMHAQn/AFkAARYBJwECAf8BSQGAAQcB/wFSAYwB
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQsB/wFSAYwBEAH/AVIBjAEQAf8B
WAGSARAB/wFaAZQBEAH/AVoBmwEQAf8BWgGcARAB/wFcAZ4BEgH/ATsBbQEDAf8BCAEKAQAB/wEIAQoB
AAH/AQgBCgEAAf8IAAMFBAYECAEKAwgBCgMIAQoDCAEKAxcBHwI5ATgBXQNRAZ4CZQFgAeMB/wF4AQAC
/wF4AQAB/wNSAaMDGAEhAwgBCgMIAQoDCAEKAwgBCgMHAQkDBgEHAwIBA/8AVQADXQHfAUcBgAEDAf8B
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwB
EAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8B
WgGYARAB/wEWASoBAAH/AQgBCgEAAf8BCAEKAQAB/xwAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgB
AAH/AlEBUAGfAxIBGP8AcQABLAFQAQAB/wFKAYwBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBDgH/AVUBkgEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEQAf8BWgGcARAB
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWAGSARYB/wEQAR4BAAH/AQgB
CgEAAf8cAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARj/AHUAA0sBjwEzAV4B
AAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BfwHAATMB/wFfAZ4BFwH/ASABPwEAAf8B
CAEKAQAB/wFSAYwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGVARcB/wFaAZQB
GAH/AVoBlAEYAf8BWgGUARgB/wEIAQoBAAH/AQgBCgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC
/wF4AQAB/wJRAVABnwMSARgUAAQBAwMBBAMGBAcBCQMHAQkDBAEFBAIEAf8ATQABQgF7AQAB/wFSAYwB
CAH/AXsBxgEpAf8DMwFQBAADDAEQATkBawEAAf8BWgGcARAB/wFaAZwBEAH/AV0BlwETAf8BVgGUAQwB
/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BKQFQAQAB/wEIAQoBAAH/GAAD
EgEXAzUBVgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYFAAEAgMJAQwDDwEUAxMBGgMSARgD
CgENAwQBBQQB/wBRAAEIAQoBAAH/DAABEwEjAQAB/wFaAZQBEAH/AVoBnAEQAf8BlAHWAUoB/wENAREB
AgH/ATEBWgEAAf8BWgGUARIB/wFaAZQBGAH/AVoBlAEYAf8BYwGcARgB/wFjAaUBFwH/AWsBpQEhAf8B
EAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwUBBgMdASkD
MAFKAjsBPAFlAjsBPAFkAygBPAIVARYBHQMGAQj/AD0AA10B3wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wMzAVADOgFgAUsBhQEHAf8BWgGUARAB/wFaAZwBEAH/ATkB
awEAAf8DCQEMARABHgEAAf8BVAGOARIB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AXMB
tAEpAf8BEAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkB
DAMzAVACTAFNAZECXQFfAckCWwFdAcoDRAF6AykBPQMMARD/ADkAAQgBCgEAAf8BCAEKAQAB/wEIAQoB
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/ATMBXwECAf8B
WgGUARAB/wFaAZwBEAH/Aa0B5wFjAf8BEAEeAQAB/wEIAQoBAAH/ARQBJgEAAf8BVAGOARIB/wFiAZsB
GAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AWMBnAEhAf8BGAEuAQAB/xgAAxIBFwM1AVYDUAGaA2IB
4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkBCwMuAUcDSAGEAlkBXAHDAlwBXwHLA0kBhQMuAUcD
DwET/wA1AAEIAQoBAAH/ASsBUgEAAf8BQQFyAQUB/wFKAYQBBgH/AUoBhAEGAf8BSgGEAQYB/wFCAXMB
BgH/ASkBUAEAAf8BEAEeAQAB/wEfAToBAAH/AVUBjwELAf8BWgGVARAB/wFaAZwBEAH/AdYB/wGMAf8B
EAEeAQAB/wEYAS4BAAH/AUIBeAEDAf8BWgGUARgB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUB
YQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYQFdAc8CYAFdAc4DWQG7AlABTwGbAyoBQFQAA3QB0AN7Ae4g
AAN1AdQDegHp5AADWgG/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoB
AAH/AQgBCgEAAf8DWgG/A1oBvwFDAXQBBwH/AUcBdwEMAf8BJQFHAQAB/wEOARkBAAH/DAACSwFKAYoC
WgFYAb0CZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoC
ZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCZwFdAeoCYwFaAekCXwFbAdMDVQGvAy4BSFQAA3QB
0AN7Ae4gAAN1AdQDegHp4AABCAEKAQAB/wEQAR4BAAH/ASEBQQEAAf8BJwFLAQAB/wEmAUoBAAH/ASEB
QQEAAf8BEAEeAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEpAU4BAAH/AVoBlgEQAf8BWgGcARAB
/wFzAbYBJgH/ARgBLgEAAf8MAANJAYYCWgFYAbcCZQFgAeMCZQFgAeMCZQFgAeMCZQFgAeMCagFhAeYC
agFeAe0BcwFoAVMB9AGsAXcBKwH8Af8BeAEAAv8BeAEAAf8BbwFuAVEB9QJqAWEB5gJlAWAB4wJlAWAB
4wJlAWAB4wJlAV4B4gJeAVsBzQJVAVMBqgIuAS0BRlQAA3QB0AN7Ae4gAAN1AdQDegHp3AABCAEKAQAB
/wE9AXEBAgH/AUwBhgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AUwB
fwEPAf8BOwFnAQgB/wEhATQBCAH/AVMBjgELAf8BWgGcARAB/wFyAbMBJwH/AVMBgQEbAf8QAAMrAUED
NgFZAkABPwFuAkABPwFuAkABPwFuAkABPwFuA0QBewJRAVABnwJdAVsBxQFlAmIB7gH/AXgBAAL/AXgB
AAH/Al8BXQHJA0UBfAJAAT8BbgJAAT8BbgJAAT8BbgM/AW0DOwFjAzMBUgMZASJUAAN0AdADewHuIAAD
dQHUA3oB6dgAARUBKQEAAf8BSgGEAQQB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFWAZABDAH/AVoBmgEQAf8BWgGcARAB
/wFyAakBMAH/AQgBCgEAAf8BCAEKAQAB/wwAAwwBEAMRARYDFQEcAxUBHAMVARwDFQEcAyEBMAI+AT0B
aQJTAVIBpQJmAV8B5QH/AXgBAAL/AXgBAAH/AlUBUwGqAyIBMQMVARwDFQEcAxUBHAMUARsDEwEZAxAB
FQMHAQlUAAN0AdADewHuIAADdQHUA3oB6dQAARYBJwECAf8BSQGAAQcB/wFSAYwBCAH/AVIBjAEIAf8B
UgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQsB/wFSAYwBEAH/AVIBjAEQAf8BWAGSARAB/wFaAZQB
EAH/AVoBmwEQAf8BWgGcARAB/wFcAZ4BEgH/ATsBbQEDAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8I
AAMFBAYECAEKAwgBCgMIAQoDCAEKAxcBHwI5ATgBXQNRAZ4CZQFgAeMB/wF4AQAC/wF4AQAB/wNSAaMD
GAEhAwgBCgMIAQoDCAEKAwgBCgMHAQkDBgEHAwIBA1QAA3QB0AN7Ae4gAAN1AdQDegHp0AADXQHfAUcB
gAEDAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB
/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB
nAEQAf8BWgGYARAB/wEWASoBAAH/AQgBCgEAAf8BCAEKAQAB/xwAAxIBFwM1AVYDUAGaA2IB4QH/AXgB
AAL/AXgBAAH/AlEBUAGfAxIBGHAAA3QB0AN7Ae4gAAN1AdQDegHp0AABLAFQAQAB/wFKAYwBAAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBDgH/AVUBkgEQAf8BWgGcARAB
/wFaAZwBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB
lAEYAf8BWAGSARYB/wEQAR4BAAH/AQgBCgEAAf8cAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB
/wJRAVABnwMSARhwAAN0AdADewHuIAADdQHUA3oB6dQAA0sBjwEzAV4BAAH/AVIBjAEIAf8BUgGMAQgB
/wFSAYwBCAH/AVIBjAEQAf8BfwHAATMB/wFfAZ4BFwH/ASABPwEAAf8BCAEKAQAB/wFSAYwBEAH/AVoB
nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGVARcB/wFaAZQBGAH/AVoBlAEYAf8BWgGUARgB
/wEIAQoBAAH/AQgBCgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARgU
AAQBAwMBBAMGBAcBCQMHAQkDBAEFBAIEARQAAxIBFgMkAS8DJAEvAyQBLwMkAS8DJAEvAyQBLwMkAS8D
JAEvAyQBLwN1AdkDfAHxAyQBLwMkAS8DJAEvAyQBLwMkAS8DJAEvAyQBLwMkAS8DdwHcA3sB7QMkAS8D
JAEvAyQBLwMkAS8DJAEvAyQBLwMkAS8DJAEvAyQBLwMOARG4AAFCAXsBAAH/AVIBjAEIAf8BewHGASkB
/wMzAVAEAAMMARABOQFrAQAB/wFaAZwBEAH/AVoBnAEQAf8BXQGXARMB/wFWAZQBDAH/AVoBnAEQAf8B
WgGUARgB/wFaAZQBGAH/AWMBnAEYAf8BYwGlARcB/wEpAVABAAH/AQgBCgEAAf8YAAMSARcDNQFWA1AB
mgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARgUAAQCAwkBDAMPARQDEwEaAxIBGAMKAQ0DBAEFBAEU
AAN7AegDfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B
/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B
/wN/Af8DcwHPvAABCAEKAQAB/wwAARMBIwEAAf8BWgGUARAB/wFaAZwBEAH/AZQB1gFKAf8BDQERAQIB
/wExAVoBAAH/AVoBlAESAf8BWgGUARgB/wFaAZQBGAH/AWMBnAEYAf8BYwGlARcB/wFrAaUBIQH/ARAB
HgEAAf8YAAMSARcDNQFWA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVABnwMSARgUAAMFAQYDHQEpAzAB
SgI7ATwBZQI7ATwBZAMoATwCFQEWAR0DBgEIFAADRgFkA1wBjwNcAY8DXAGPA1wBjwNcAY8DXAGPA1wB
jwNcAY8DXAGPA3oB6gN9AfgDXAGPA1wBjwNcAY8DXAGPA1wBjwNcAY8DXAGPA1wBjwN7AewDfAH1A1wB
jwNcAY8DXAGPA1wBjwNcAY8DXAGPA1wBjwNcAY8DXAGPAz4BVqgAA10B3wEIAQoBAAH/AQgBCgEAAf8B
CAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wMzAVADOgFgAUsBhQEHAf8BWgGUARAB/wFaAZwB
EAH/ATkBawEAAf8DCQEMARABHgEAAf8BVAGOARIB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUB
FwH/AXMBtAEpAf8BEAEeAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIB
GBQAAwYBCAMkATQDPAFmA1MBpwNYAbgCRwFIAYMDMQFNAw8BFP8AMQABKAFNAQAB/wFOAYgBBwH/AVIB
GBQAAwkBDAMzAVACTAFNAZECXQFfAckCWwFdAcoDRAF6AykBPQMMARA8AAN0AdADewHuIAADdQHUA3oB
6cwAAQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8B
CAEKAQAB/wEIAQoBAAH/ATMBXwECAf8BWgGUARAB/wFaAZwBEAH/Aa0B5wFjAf8BEAEeAQAB/wEIAQoB
AAH/ARQBJgEAAf8BVAGOARIB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AWMBnAEhAf8B
GAEuAQAB/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwkBCwMuAUcD
SAGEAlkBXAHDAlwBXwHLA0kBhQMuAUcDDwETPAADdAHQA3sB7iAAA3UB1AN6AenIAAEIAQoBAAH/ASsB
UgEAAf8BQQFyAQUB/wFKAYQBBgH/AUoBhAEGAf8BSgGEAQYB/wFCAXMBBgH/ASkBUAEAAf8BEAEeAQAB
/wEfAToBAAH/AVUBjwELAf8BWgGVARAB/wFaAZwBEAH/AdYB/wGMAf8BEAEeAQAB/wEYAS4BAAH/AUIB
eAEDAf8BWgGUARgB/wFiAZsBGAH/AWMBnAEYAf8BYwGlARcB/wFjAaUBFwH/AXMBtAEpAf8BEAEeAQAB
/xgAAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwYBCAMkATQDPAFmA1MB
pwNYAbgCRwFIAYMDMQFNAw8BFDwAA3QB0AN7Ae4gAAN1AdQDegHpxAABKAFNAQAB/wFOAYgBBwH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB
/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB/wFjAaUBFwH/AUIBewEAAf8BSgGEAQYB/wFSAYwBCAH/AVoB
mAEUAf8BWgGUARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFjAaUBFwH/AZQByQFNAf8EAAMQARUD
GgEkAyEBLwMRARYEAgQBAxIBFwM1AVYDUAGaA2IB4QH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBQAAwMB
BAMTARkDJQE2AjsBPAFkAkEBQgFyAzMBUQMhAS8DCQEM/wAtAAEpAU4BAgH/AVIBjAEIAf8BUgGMAQgB
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AVIB
jAEQAf8BWgGUARAB/wFaAZUBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB
/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AWMBpQEXAf8BYwGlARcB/wFlAaABIQH/BAAD
HgErAjEBMAFMAzsBYwMiATEDBwEJAwQBBQMSARgDNgFXA1ABmgNiAeEB/wF4AQAC/wF4AQAB/wJRAVAB
nwMSARgcAAMHAQkDHAEnAyMBMgIZARoBIwMPARQDBAEF/wApAANGAYABTgGIAQcB/wFSAYwBCAH/AVIB
BAMTARkDJQE2AjsBPAFkAkEBQgFyAzMBUQMhAS8DCQEMPAADdAHQA3sB7iAAA3UB1AN6AenAAAEpAU4B
AgH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
UgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZUBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwB
EAH/AVoBnAEQAf8BWgGUARgB/wFaAZQBGAH/AWMBnAEYAf8BYwGcARgB/wFjAaUBFwH/AWMBpQEXAf8B
YwGlARcB/wFlAaABIQH/BAADHgErAjEBMAFMAzsBYwMiATEDBwEJAwQBBQMSARgDNgFXA1ABmgNiAeEB
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgcAAMHAQkDHAEnAyMBMgIZARoBIwMPARQDBAEFPAADdAHQA3sB
7iAAA3UB1AN6Aem8AANGAYABTgGIAQcB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFjAZwBGAH/AWMB
oQEYAf8BYwGlARcB/wFjAaUBFwH/AXgBugEsAf8BCAEKAQAB/wQAAyQBNANFAXwCWgFYAbcDTgGUAz8B
bQMoATsDHwEsAzkBXgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAADEgEXAzwBZgNKAYkD
QAFvAy4BRwMOARI8AAN0AdADewHuIAADdQHUA3oB6bwAATUBXgEHAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB
/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoB
lAEYAf8BWgGUARgB/wFjAZwBGAH/AWMBoQEYAf8BYwGlARcB/wFjAaUBFwH/AXgBugEsAf8BCAEKAQAB
/wQAAyQBNANFAXwCWgFYAbcDTgGUAz8BbQMoATsDHwEsAzkBXgNQAZoDYgHhAf8BeAEAAv8BeAEAAf8C
UQFQAZ8DEgEYHAADEgEXAzwBZgNKAYkDQAFvAy4BRwMOARL/ACkAATUBXgEHAf8BUgGMAQgB/wFSAYwB
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
UgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGbARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZYB
FgH/AVoBlAEYAf8BXQGXARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFwAbMBIAH/ASsBUAEEAf8I
AAMnAToCUwFRAaIBmwFfASEB+wJlAVwB5wJcAVoBxAJDAUIBdQMxAU0CQAE/AW4CUQFQAZ8CZQFgAeMB
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgcAAMZASIDTgGVAlsBXgHNAlYBVwGyA0QBegMdASkDBgEIBAIE
Af8AHQABSgGEAQYB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BZwGpARcB
/wFSAYwBCAH/AUoBhAEGAf8BSgGEAQYB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB/wFaAZwBEAH/AVoB
nAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFfAZgBGAH/AWMBngEYAf8BYwGlARcB
/wFrAakBHQH/ASkBUAEAAf8MAAMiATEDTgGYAm8BWwHzAmgBXQHwAmoBYQHmAloBVwHCAlUBUwGqA1MB
pwJZAVcBvAJsAWEB6wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBwAAxQBGwJDAUQBdwJWAVkBtgJbAV4B
zQJWAVgBswM/AWwDJgE4AwwBDwMCAQP/AB0AAUoBhAEGAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8B
UgGMAQgB/wFpAaQBHgH/ASwBUAEDAf8BCAEKAQAB/wE3AWEBBwH/AVIBjAEOAf8BUgGMARAB/wF/AcEB
MgH/AVsBXgFbAdMDWgG/AS8BWQEAAf8BRAF6AQUB/wFQAYoBCAH/AVoBnAEOAf8BWgGcARAB/wFaAZwB
EAH/AU8BhgEQAf8BRAF0AQwB/wNaAb8QAAIaARkBIwNEAXsCXQFbAcoCYwFfAdoCaQFgAegCZwFZAe8B
ZgFlAV0B7AJhAVwB1gJfAVsB2AF0AWgBUwH0Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAADDwETAzQB
UwNNAZICXQFhAc8CXQFhAdQCUgFUAagCQQFCAXIDJgE4AxQBGwMGAQgDAgED/wAVAAFKAYwBAAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BZwGdAScB/wEIAQoBAAH/AQoBDwEAAf8BQgF3AQMB
/wFSAYwBEAH/AVoBnAEQAf8BJQFBAQUB/wQAAzoBYAEIAQoBAAH/AQgBCgEAAf8EAANGAYADRgGAA0YB
gBwAAwoBDQMiATEDNAFUA0QBeAJRAVABnwJhAV0BzwJqAV4B7QFmAWUBXQHsAmgBXQHwAZsBXwEhAfsB
/wF4AQAC/wF4AQAB/wJRAVABnwMSARgcAAMGAQgDGAEhAzEBTQJMAU0BkQJYAVoBvQJdAWEB0QJZAVwB
wwJRAVMBogM9AWcCGQEaASMDDAEP/wAVAAE7AW0BAgH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUwGOARAB/wEPARsBAAH/ASMBQwEAAf8BUgGMARAB/wFSAYwBEAH/AXsBvQEwAf8BCAEKAQAB
/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/ygAAwMBBAMJAQsD
IgExAzgBWwJPAU4BlwJfAVwByAJmAV8B5QGGAW8BUQH3Ab4BXQE2Af0B/wF4AQAC/wF4AQAB/wJRAVAB
nwMSARgcAAQBAwIBAwMVARwDNQFWAksBTAGPAlwBXwHIAl0BYwHfAmABZQHjAlIBUwGlAzQBUwMcASf/
ABUAAQgBCgEAAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AU4BggEPAf8B
SgGEAQYB/wFSAYwBEAH/AWMBpQEXAf8BCAEKAQAB/wEIAQoBAAH/ARMBIwEAAf8BQgFzAQYB/wEgAT8B
AAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB/yAABAEDAwEEAwwBEAMYASAD
KQE9Az4BagJXAVYBtQJmAV8B5QGGAW8BUQH3Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYIAAEAQMHAQkD
FAEbAyoBQANDAXYDVQGvAloBYwHpAlsBXwHQAlABUQGfAzMBUf8AGQABQgFzAQYB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMARAB/wFSAYwBEAH/AUoBhAEGAf8BEAEeAQAB
/wExAVoBAAH/AU0BhAENAf8BWgGcARAB/wFaAZwBEAH/AVIBjAEIAf8BEAEeAQAB/wEIAQoBAAH/AQgB
CgEAAf8DRgGALAADAgEDAwsBDgMgAS4DQwF2AlcBVQGxAmYBYAHgAXcBYwFIAfYBjgFqAUEB+QJRAVAB
nAMSARcMAAQBAwwBEAMXAR8DHQEoAx0BKAMMAQ8IAAMPARQCJgEnATkCRwFIAYMDYgHhAlwBZQHnA14B
0gI/AUABbv8AHQABSQGJAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
UgGMARAB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwB
EAH/AVoBlAEYAf8BQgFzAQYB/wEKAQ4BAAH/MAAEAQMDAQQDDAEPAx4BKgM6AWECWQFXAbkCYwFbAeQB
ZgJiAe4CTwFOAZcDEgEXDAADAgEDAyEBLwM2AVkCQgFDAXUCQQFCAXMDHgErCAADBAEFAwwBDwM4AVwC
XQFgAc4CXQFmAewCWQFnAe8DRgF//wAhAAE6AWsBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEQAf8BUgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB
/wFaAZQBGAH/AVoBlAEYAf8BYwGlARcB/wEZASwBAwH/OAADAgEDAwgBCgMgAS0CQQFAAXECTQFMAZED
UAGaAjsBOgFiAwwBDwwAAwMBBAMrAUEDRAF6A1MBpwNVAa0DNwFaAxgBIAMJAQsDBgEHAw0BEQM5AV8C
XQFhAdECWQFnAe8CWwFvAfMCRgFHAYH/ACUAASwBVQEAAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8B
UgGMARAB/wFaAZQBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZQB
GAH/AVoBlAEYAf8BIQFBAQAB/0AABAIDBwEJAxAEFQEcAhYBFQEdAw8BEwMCAQMMAAMDAQQDMANLAUwB
jwJbAV0BygJbAWEB3gNOAZQDNAFTAxUBHAMNAREDHgErAkMBRAF3Al0BYwHfAmEBcAHxAloBYwHpA0QB
e/8AIQABEgEiAQAB/wFMAYYBBgH/AVIBjAEIAf8BWgGcARAB/wFQAYoBCAH/AVIBjAEQAf8BWgGUARAB
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAERAf8BaQGrAR8B/wEIAQoBAAH/bAAD
AgEDAyEBLwM6AWEDVQGtAl8BYwHaA1oBvwJQAVEBnwNEAXoCQQFCAXIDSQGFAlYBVwGyAl4BagHtAmAB
ZAHbAlUBVwGxAzgBW/8AIQABEAEeAQAB/wFIAX0BBwH/AVkBkwETAf8BVQGIARgB/wgAASEBQQEAAf8B
QgF7AQAB/wFSAYwBCAH/AVUBkQEIAf8BOQFmAQQB/wNZAe94AAMGAQgDFwEfA0QBewJZAVwBxgJbAWMB
5AJTAXQB9AJiAWYB7gJiAWYB7gJhAXAB8QJIAXcB9gIrAa4B/AJZAVwBvgM+AWsDJAE0/wApAAEeAToB
AAH/nAAEAgMJAQwDKgM/AUABbgNOAZYCVgFYAbMCWQFcAcECWgFdAccCWgFdAccCVwFZAbkCUQFSAaQC
QAFBAXEDJQE2AxMBGf8A0QAEAQMLAQ4DJgE4AzkBXgNGAX0CSgFLAYsDSgGJAz4BawMqAT8DFwEfAwIB
A/8ABQABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEAA/8BxwIAAQcB/wgAAv8B
zwGHAgABBwH/CAAB/wH+AQABBwIAAQcB/wgAAf8B/AEAAQcCAAEHAf8IAAH/AfgBAAEPAgABBwH/CAAB
/wHwAQABBwIAAQcB/wgAAf8B4AEAAQMCAAEHAf8IAAH/AcABAAEBAfwBAwL/CAAB/wHAAQABAQH8AQMC
/wgAAf8B4AIAAfwBAwHgAR8IAAH/AfwBIAEAAfwBAwHgAR8IAAH/Af4B4AEAAfwBAwHgAR8IAAH/AcAC
AAH8AQMB4AEfCAAB/wGAAgAB/AEDAeABHwgAAf8DAAH8AQMB4AEfCAAB/gIAAQEBAAEDAeABHwgAAfwC
AAEBAQABAwH4AR8IAAH4AgABAQEAAQMB+AEfCAAB+AIAAQMBAAEDAfgBAwgAAfgCAAEHAQABAwH4AQMI
AAH4AgABDwEAAQMB+AkAAfgBAAFEAX8BAAEDAfgJAAH4AQABAQH/AYABAwH4CQAB+AIAAX8BgAEDAfwJ
AAH8AgABfwHwAQMBgQGACAAB/gIAAf8B8AEDAYEBgAgAAf8CAAH/AfwBAwGACQAB/wGAAQEB/wH+AQMB
gAkAAf8BAAEDA/8BgAkAAf8BDAEPA/8BwAkAAf8B3wT/AcAJAAb/AfABAQgACw==
/wFaAZQBEAH/AVoBlAEQAf8BWgGbARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZYBFgH/AVoB
lAEYAf8BXQGXARgB/wFjAZwBGAH/AWMBpQEXAf8BYwGlARcB/wFwAbMBIAH/ASsBUAEEAf8IAAMnAToC
UwFRAaIBmgFfASEB+wJlAVwB5wJcAVoBxAJDAUIBdQMxAU0CQAE/AW4CUQFQAZ8CZQFgAeMB/wF4AQAC
/wF4AQAB/wJRAVABnwMSARgcAAMZASIDTgGVAlsBXgHNAlYBVwGyA0QBegMdASkDBgEIBAIEATAAA3QB
0AN7Ae4gAAN1AdQDegHpvAABSgGEAQYB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BZwGpARcB/wFSAYwBCAH/AUoBhAEGAf8BSgGEAQYB/wFSAYwBEAH/AVoBlAEQAf8BWgGXARAB
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBlAEYAf8BWgGUARgB/wFfAZgBGAH/AWMB
ngEYAf8BYwGlARcB/wFrAakBHQH/ASkBUAEAAf8MAAMiATEDTgGYAm8BXAHzAmgBXgHwAmoBYQHmAloB
VwHCAlUBUwGqA1MBpwJZAVcBvAJsAWEB6wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGBwAAxQBGwJDAUQB
dwJWAVkBtgJbAV4BzQJWAVgBswM/AWwDJgE4AwwBDwMCAQMIAAMCAQMDDgERAw4BEQMOAREDDgERAw4B
EQMOAREDDgERAw4BEQMOAREDdAHTA3sB7wMOAREDDgERAw4BEQMOAREDDgERAw4BEQMOAREDDgERA3QB
1wN7AeoDDgERAw4BEQMOAREDDgERAw4BEQMOAREDDgERAw4BEQMOAREDBAEFlAABSgGEAQYB/wFSAYwB
CAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AWkBpAEeAf8BLAFQAQMB/wEIAQoBAAH/ATcBYQEHAf8B
UgGMAQ4B/wFSAYwBEAH/AX8BwQEyAf8BWwFeAVsB0wNaAb8BLwFZAQAB/wFEAXoBBQH/AVABigEIAf8B
WgGcAQ4B/wFaAZwBEAH/AVoBnAEQAf8BTwGGARAB/wFEAXQBDAH/A1oBvxAAAhoBGQEjA0QBewJdAVsB
ygJjAV8B2gJpAWAB6AJnAVkB7wJlAV0B7AJhAVwB1gJfAVsB2AFzAWgBUwH0Af8BeAEAAv8BeAEAAf8C
UQFQAZ8DEgEYHAADDwETAzQBUwNNAZICXQFhAc8CXQFhAdQCUgFUAagCQQFCAXIDJgE4AxQBGwMGAQgD
AgEDA3ABwgN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
fwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8DfwH/A38B/wN/Af8D
fwH/A38B/wN4AdyUAAFKAYwBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BZwGdAScB
/wEIAQoBAAH/AQoBDwEAAf8BQgF3AQMB/wFSAYwBEAH/AVoBnAEQAf8BJQFBAQUB/wQAAzoBYAEIAQoB
AAH/AQgBCgEAAf8EAANGAYADRgGAA0YBgBwAAwoBDQMiATEDNAFUA0QBeAJRAVABnwJhAV0BzwJqAV4B
7QJlAV0B7AJoAV4B8AGaAV8BIQH7Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAADBgEIAxgBIQMxAU0C
TAFNAZECWAFaAb0CXQFhAdECWQFcAcMCUQFTAaIDPQFnAhkBGgEjAwwBDwNMAW8DaAGtA2gBrQNoAa0D
aAGtA2gBrQNoAa0DaAGtA2gBrQNoAa0DewHwA30B+gNoAa0DaAGtA2gBrQNoAa0DaAGtA2gBrQNoAa0D
aAGtA3wB8QN9AfgDaAGtA2gBrQNoAa0DaAGtA2gBrQNoAa0DaAGtA2gBrQNoAa0DVQGBlAABOwFtAQIB
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVMBjgEQAf8BDwEbAQAB/wEjAUMBAAH/AVIB
jAEQAf8BUgGMARAB/wF7Ab0BMAH/AQgBCgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8BCAEKAQAB
/wEIAQoBAAH/AQgBCgEAAf8oAAMDAQQDCQELAyIBMQM4AVsCTwFOAZcCXwFcAcgCZgFfAeUBhQFvAVEB
9wG+AVwBOAH9Af8BeAEAAv8BeAEAAf8CUQFQAZ8DEgEYHAAEAQMCAQMDFQEcAzUBVgJLAUwBjwJcAV8B
yAJdAWMB3wJgAWUB4wJSAVMBpQM0AVMDHAEnKAADdAHQA3sB7iAAA3UB1AN6Aem8AAEIAQoBAAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFOAYIBDwH/AUoBhAEGAf8BUgGMARAB
/wFjAaUBFwH/AQgBCgEAAf8BCAEKAQAB/wETASMBAAH/AUIBcwEGAf8BIAE/AQAB/wEIAQoBAAH/AQgB
CgEAAf8BCAEKAQAB/wEIAQoBAAH/AQgBCgEAAf8gAAQBAwMBBAMMARADGAEgAykBPQM+AWoCVwFWAbUC
ZgFfAeUBhQFvAVEB9wH/AXgBAAL/AXgBAAH/AlEBUAGfAxIBGCAABAEDBwEJAxQBGwMqAUADQwF2A1UB
rwJaAWMB6QJbAV8B0AJQAVEBnwMzAVEoAAN0AdADewHuIAADdQHUA3oB6cAAAUIBcwEGAf8BUgGMAQgB
/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBCAH/AVIBjAEQAf8BUgGMARAB/wFKAYQBBgH/ARAB
HgEAAf8BMQFaAQAB/wFNAYQBDQH/AVoBnAEQAf8BWgGcARAB/wFSAYwBCAH/ARABHgEAAf8BCAEKAQAB
/wEIAQoBAAH/A0YBgCwAAwIBAwMLAQ4DIAEuA0MBdgJXAVUBsQJmAWAB4AF2AWMBSAH2AY0BagFBAfkC
UQFQAZwDEgEXDAAEAQMMARADFwEfAx0BKAMdASgDDAEPCAADDwEUAiYBJwE5AkcBSAGDA2IB4QJcAWUB
5wNeAdICPwFAAW4oAAN0AdADewHuIAADdQHUA3oB6cQAAUkBiQEAAf8BUgGMAQgB/wFSAYwBCAH/AVIB
jAEIAf8BUgGMAQgB/wFSAYwBEAH/AVIBjAEQAf8BUgGMARAB/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB
/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZQBGAH/AUIBcwEGAf8BCgEOAQAB/zAABAEDAwEEAwwB
DwMeASoDOgFhAlkBVwG5AmMBWwHkAWUCYgHuAk8BTgGXAxIBFwwAAwIBAwMhAS8DNgFZAkIBQwF1AkEB
QgFzAx4BKwgAAwQBBQMMAQ8DOAFcAl0BYAHOAl0BZQHsAlkBZwHvA0YBfygAA3QB0AN7Ae4gAAN1AdQD
egHpyAABOgFrAQAB/wFSAYwBCAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AVIBjAEQAf8BWgGUARAB
/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB/wFaAZQBGAH/AWMB
pQEXAf8BGQEsAQMB/zgAAwIBAwMIAQoDIAEtAkEBQAFxAk0BTAGRA1ABmgI7AToBYgMMAQ8MAAMDAQQD
KwFBA0QBegNTAacDVQGtAzcBWgMYASADCQELAwYBBwMNAREDOQFfAl0BYQHRAlkBZwHvAlwBbwHzAkYB
RwGBKAADdAHQA3sB7iAAA3UB1AN6AenMAAEsAVUBAAH/AVIBjAEIAf8BUgGMAQgB/wFSAYwBEAH/AVIB
jAEQAf8BWgGUARAB/wFaAZQBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGUARgB
/wFaAZQBGAH/ASEBQQEAAf9AAAQCAwcBCQMQBBUBHAIWARUBHQMPARMDAgEDDAADAwEEAzADSwFMAY8C
WwFdAcoCWwFhAd4DTgGUAzQBUwMVARwDDQERAx4BKwJDAUQBdwJdAWMB3wJiAXAB8QJaAWMB6QNEAXso
AAN0AdADewHuIAADdQHUA3oB6cgAARIBIgEAAf8BTAGGAQYB/wFSAYwBCAH/AVoBnAEQAf8BUAGKAQgB
/wFSAYwBEAH/AVoBlAEQAf8BWgGcARAB/wFaAZwBEAH/AVoBnAEQAf8BWgGcARAB/wFaAZwBEQH/AWkB
qwEfAf8BCAEKAQAB/2wAAwIBAwMhAS8DOgFhA1UBrQJfAWMB2gNaAb8CUAFRAZ8DRAF6AkEBQgFyA0kB
hQJWAVcBsgJeAWoB7QJgAWQB2wJVAVcBsQM4AVsoAAN0AdADewHuIAADdQHUA3oB6cgAARABHgEAAf8B
SAF9AQcB/wFZAZMBEwH/AVUBiAEYAf8IAAEhAUEBAAH/AUIBewEAAf8BUgGMAQgB/wFVAZEBCAH/ATkB
ZgEEAf8DWQHveAADBgEIAxcBHwNEAXsCWQFcAcYCWwFjAeQCUwFzAfQCYgFlAe4CYgFlAe4CYgFwAfEC
SAF2AfYCKwGsAfwCWQFcAb4DPgFrAyQBNCgAA3QB0AN7Ae4gAAN1AdQDegHp0AABHgE6AQAB/5wABAID
CQEMAyoDPwFAAW4DTgGWAlYBWAGzAlkBXAHBAloBXQHHAloBXQHHAlcBWQG5AlEBUgGkAkABQQFxAyUB
NgMTARkoAAN0AdADewHuIAADdQHUA3oB6f8AeQAEAQMLAQ4DJgE4AzkBXgNGAX0CSgFLAYsDSgGJAz4B
awMqAT8DFwEfAwIBAywAA2QBogNuAb8gAANmAaYDbQG7qAABQgFNAT4HAAE+AwABKAMAAYADAAEgAwAB
AQEAAQEGAAECFgAD/wEAA/8BxwIAAQcC/wHPAfMB/wQAAv8BzwGHAgABBwL/Ac8B8wH/BAAB/wH+AQAB
BwIAAQcC/wHPAfMB/wQAAf8B/AEAAQcCAAEHAv8BzwHzAf8EAAH/AfgBAAEPAgABBwL/Ac8B8wH/BAAB
/wHwAQABBwIAAQcC/wHPAfMB/wQAAf8B4AEAAQMCAAEHAv8BzwHzAf8EAAH/AcABAAEBAfwBAwP/Ac8B
8wH/BAAB/wHAAQABAQH8AQMD/wHPAfMB/wQAAf8B4AIAAfwBAwHgAR8IAAH/AfwBIAEAAfwBAwHgAR8I
AAH/Af4B4AEAAfwBAwHgAR8IAAH/AcACAAH8AQMB4AEfAf8BzwHzAf8EAAH/AYACAAH8AQMB4AEfAf8B
zwHzAf8EAAH/AwAB/AEDAeABHwH/Ac8B8wH/BAAB/gIAAQEBAAEDAeABHwH/Ac8B8wH/BAAB/AIAAQEB
AAEDAfgBHwH/Ac8B8wH/BAAB+AIAAQEBAAEDAfgBHwH/Ac8B8wH/BAAB+AIAAQMBAAEDAfgBAwH/Ac8B
8wH/BAAB+AIAAQcBAAEDAfgBAwgAAfgCAAEPAQABAwH4CQAB+AEAAUQBfwEAAQMB+AkAAfgBAAEBAf8B
gAEDAfgBAAH/Ac8B8wH/BAAB+AIAAX8BgAEDAfwBAAH/Ac8B8wH/BAAB/AIAAX8B8AEDAYEBgAH/Ac8B
8wH/BAAB/gIAAf8B8AEDAYEBgAH/Ac8B8wH/BAAB/wIAAf8B/AEDAYABAAH/Ac8B8wH/BAAB/wGAAQEB
/wH+AQMBgAEAAf8BzwHzAf8EAAH/AQABAwP/AYABAAH/Ac8B8wH/BAAB/wEMAQ8D/wHAAQAB/wHPAfMB
/wQAAf8B3wT/AcABAAH/Ac8B8wH/BAAG/wHwAQEB/wHPAfMB/wQACw==
</value>
</data>
<metadata name="ilTabIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -438,7 +462,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAuhIAAAJNU0Z0AUkBTAIBAQQB
AAFQAQIBUAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
AAFYAQIBWAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/
AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/ACIAA2cB7wJnAVkB7wFnAV0BWQHvAWcBWwFZAe8B
ZwFbAVkB7wFnAlkB7wFnAWQBWQHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvA2cB7wNnAe8DZwHvAwcB
CQMqAT8DRQF8A1kBuwNjAd8DaAH0A4AB/gOBAf8DgQH/A4EB/wOAAf4DaAH0A2MB3wNaAboDRAF6AycB
@ -464,7 +488,7 @@
YAH/AYMBggF/Af8BhQGCAX0B/wGzAZMBRAH/Ac8BlAEAAf8B3gHMAZ8B/wOwAf8DsAH/A7AB/wOwAf8D
sAH/A7AB/wOwAf8DsAH/A6gB/wMCAQMDGgEjAzgBXANUAagDYgHXA3AB8QOAAf4DgQH/A4EB/wOBAf8D
gQH9A2gB8ANhAdQDUwGlAzYBWQMYASAIAAMaASQDUgGgAmMBSAH2AaIBcwEAAf8BrgF8AQAB/wGwAX0B
AAH/AagBeAEAAf8BlQFqAQAB/wKAAUoB/gFcAlkBxgNXAbUDFgEeCAAB/wGyAW8B/wH9AYABEQH/AfwB
AAH/AagBeAEAAf8BlQFqAQAB/wKAAUsB/gFcAlkBxgNXAbUDFgEeCAAB/wGyAW8B/wH9AYABEQH/AfwB
dwEBAf8B/QF3AQAC/wF4AQAC/wF/AQ8C/wGSATsC/wGzAYMC/wHqAeAC/wGQAT0C/wF7AQoB/wH8AXcB
AAH/AeUBbAEAAf8BsQFUAQAB/wGEAUsBGgH/A2MB3wT/AdkBqgE3Af8BvgGYATgB/wHAAZgBNgH/AdwB
ogEUAf8BzwGUAQAB/wHeAcwBnwH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DkwH/RAAD
@ -501,7 +525,7 @@
zgGfAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPnAf8D5wH/A+cB/wPAAf8DZAHbA2gB9AOBAf8DgQH/A4EB
/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DVQGvAwcBCQNiAe4B8QG8ATsB
/wH6AeoBwgH/A9wB/wN3Af8DaAH/A2gB/wNoAf8DMgn/AfIB3QGpAf8B6gGpAQgB/wM+AWoEAANeAdIB
fwFxAWoB+QH/AbsBfQL/AaMBUgL/AZABLAL/AYIBEwL/AX0BCAL/AXoBBAL/AXkBAgL/AXoBBAL/AX0B
fQFvAWoB+QH/AbsBfQL/AaMBUgL/AZABLAL/AYIBEwL/AX0BCAL/AXoBBAL/AXkBAgL/AXoBBAL/AX0B
CQL/AYABDwL/AX8BDQH/AfgBhgEgAf8DaAH0A1gBuAT/AdcBsQFSAf8BmgGPAXQB/wGgAZIBbQH/AeAB
rwE3Af8B5wGpARAB/wHrAdUBoAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DkwH/AzwB
ZANfAckDfQH6A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DfQH6A1UB
@ -511,7 +535,7 @@
8QHBAUkB/wH5AeMBrAH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DiQH/A4kB/wOJAf8DmgH/AwYBCAMxAUwD
UAGbA2UB7AN9AfoDgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A30B+gNqAe0DUAGbAy8BSQgAAyIB
MQNfAckCfQFnAfoB8wHKAWUB/wH5AeEBpgH/AfsB7QHMAf8B+wHsAcgB/wH4Ad0BmwH/A4AB/gJlAV4B
4gM9AWgEAQwAA0IBcgNjAdUBfwF1AWoB+QH/AckBmQL/AbwBfwL/Aa4BZgL/AaQBUwL/AZ8BSgL/AZ8B
4gM9AWgEAQwAA0IBcgNjAdUBfQFzAWoB+QH/AckBmQL/AbwBfwL/Aa4BZgL/AaQBUwL/AZ8BSgL/AZ8B
SwL/AaMBUQL/AacBWAH/A3wB+ANdAccDOwFiBABA/wgAAwUBBgMSARcDOgFgA1EBnwNfAdMDZwHvA2MB
9gNiAe4DXgHSA1EBngM5AV8DEQEWAwUBBhQAAw8BEwNHAYIDZAHbAn4BbwH8A2cB6gNUAagDKAE7HAAD
PAFlA14B0gH/Ae8B4AL/AdwBvAL/Ac0BnwL/AcEBigL/AbsBfwL/Ab8BhgL/Ac0BoQL/AekB1gH/A1wB

View File

@ -0,0 +1,457 @@
namespace qtc_net_client_2
{
partial class TicTacToeGame
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
pBoard = new Panel();
btnSquare9 = new Button();
btnSquare1 = new Button();
btnSquare7 = new Button();
btnSquare8 = new Button();
btnSquare6 = new Button();
btnSquare4 = new Button();
btnSquare5 = new Button();
btnSquare3 = new Button();
btnSquare2 = new Button();
pbBoard = new PictureBox();
pSymbolSelection = new Panel();
btnOSelect = new Button();
btnXSelect = new Button();
label1 = new Label();
pLoading = new Panel();
btnPlayAgain = new Button();
lblPlayAgain = new Label();
lblLoadStatus = new Label();
lblPlayerOne = new Label();
lblP1Username = new Label();
lblP2Username = new Label();
lblPlayerTwo = new Label();
lvUserlist = new ListView();
rtxtChatbox = new RichTextBox();
btnSend = new Button();
rtxtChat = new RichTextBox();
lblJackpotWon = new Label();
pBoard.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pbBoard).BeginInit();
pSymbolSelection.SuspendLayout();
pLoading.SuspendLayout();
SuspendLayout();
//
// pBoard
//
pBoard.Controls.Add(btnSquare9);
pBoard.Controls.Add(btnSquare1);
pBoard.Controls.Add(btnSquare7);
pBoard.Controls.Add(btnSquare8);
pBoard.Controls.Add(btnSquare6);
pBoard.Controls.Add(btnSquare4);
pBoard.Controls.Add(btnSquare5);
pBoard.Controls.Add(btnSquare3);
pBoard.Controls.Add(btnSquare2);
pBoard.Controls.Add(pbBoard);
pBoard.Enabled = false;
pBoard.Location = new Point(30, 18);
pBoard.Name = "pBoard";
pBoard.Size = new Size(541, 474);
pBoard.TabIndex = 0;
//
// btnSquare9
//
btnSquare9.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare9.FlatAppearance.BorderSize = 0;
btnSquare9.FlatStyle = FlatStyle.Flat;
btnSquare9.Location = new Point(374, 341);
btnSquare9.Name = "btnSquare9";
btnSquare9.Size = new Size(99, 90);
btnSquare9.TabIndex = 11;
btnSquare9.UseVisualStyleBackColor = true;
btnSquare9.Click += btnSquareX_Click;
//
// btnSquare1
//
btnSquare1.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare1.FlatAppearance.BorderSize = 0;
btnSquare1.FlatStyle = FlatStyle.Flat;
btnSquare1.Location = new Point(79, 49);
btnSquare1.Name = "btnSquare1";
btnSquare1.Size = new Size(99, 90);
btnSquare1.TabIndex = 4;
btnSquare1.UseVisualStyleBackColor = true;
btnSquare1.Click += btnSquareX_Click;
//
// btnSquare7
//
btnSquare7.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare7.FlatAppearance.BorderSize = 0;
btnSquare7.FlatStyle = FlatStyle.Flat;
btnSquare7.Location = new Point(79, 341);
btnSquare7.Name = "btnSquare7";
btnSquare7.Size = new Size(99, 90);
btnSquare7.TabIndex = 10;
btnSquare7.UseVisualStyleBackColor = true;
btnSquare7.Click += btnSquareX_Click;
//
// btnSquare8
//
btnSquare8.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare8.FlatAppearance.BorderSize = 0;
btnSquare8.FlatStyle = FlatStyle.Flat;
btnSquare8.Location = new Point(229, 341);
btnSquare8.Name = "btnSquare8";
btnSquare8.Size = new Size(99, 90);
btnSquare8.TabIndex = 9;
btnSquare8.UseVisualStyleBackColor = true;
btnSquare8.Click += btnSquareX_Click;
//
// btnSquare6
//
btnSquare6.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare6.FlatAppearance.BorderSize = 0;
btnSquare6.FlatStyle = FlatStyle.Flat;
btnSquare6.Location = new Point(374, 195);
btnSquare6.Name = "btnSquare6";
btnSquare6.Size = new Size(99, 90);
btnSquare6.TabIndex = 8;
btnSquare6.UseVisualStyleBackColor = true;
btnSquare6.Click += btnSquareX_Click;
//
// btnSquare4
//
btnSquare4.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare4.FlatAppearance.BorderSize = 0;
btnSquare4.FlatStyle = FlatStyle.Flat;
btnSquare4.Location = new Point(79, 195);
btnSquare4.Name = "btnSquare4";
btnSquare4.Size = new Size(99, 90);
btnSquare4.TabIndex = 7;
btnSquare4.UseVisualStyleBackColor = true;
btnSquare4.Click += btnSquareX_Click;
//
// btnSquare5
//
btnSquare5.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare5.FlatAppearance.BorderSize = 0;
btnSquare5.FlatStyle = FlatStyle.Flat;
btnSquare5.Location = new Point(229, 195);
btnSquare5.Name = "btnSquare5";
btnSquare5.Size = new Size(99, 90);
btnSquare5.TabIndex = 6;
btnSquare5.UseVisualStyleBackColor = true;
btnSquare5.Click += btnSquareX_Click;
//
// btnSquare3
//
btnSquare3.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare3.FlatAppearance.BorderSize = 0;
btnSquare3.FlatStyle = FlatStyle.Flat;
btnSquare3.Location = new Point(374, 49);
btnSquare3.Name = "btnSquare3";
btnSquare3.Size = new Size(99, 90);
btnSquare3.TabIndex = 5;
btnSquare3.UseVisualStyleBackColor = true;
btnSquare3.Click += btnSquareX_Click;
//
// btnSquare2
//
btnSquare2.BackgroundImageLayout = ImageLayout.Stretch;
btnSquare2.FlatAppearance.BorderSize = 0;
btnSquare2.FlatStyle = FlatStyle.Flat;
btnSquare2.Location = new Point(229, 49);
btnSquare2.Name = "btnSquare2";
btnSquare2.Size = new Size(99, 90);
btnSquare2.TabIndex = 3;
btnSquare2.UseVisualStyleBackColor = true;
btnSquare2.Click += btnSquareX_Click;
//
// pbBoard
//
pbBoard.Image = Properties.Resources.Tic_tac_toe;
pbBoard.Location = new Point(27, 15);
pbBoard.Name = "pbBoard";
pbBoard.Size = new Size(501, 444);
pbBoard.SizeMode = PictureBoxSizeMode.Zoom;
pbBoard.TabIndex = 0;
pbBoard.TabStop = false;
//
// pSymbolSelection
//
pSymbolSelection.BorderStyle = BorderStyle.FixedSingle;
pSymbolSelection.Controls.Add(btnOSelect);
pSymbolSelection.Controls.Add(btnXSelect);
pSymbolSelection.Controls.Add(label1);
pSymbolSelection.Location = new Point(161, 109);
pSymbolSelection.Name = "pSymbolSelection";
pSymbolSelection.Size = new Size(275, 255);
pSymbolSelection.TabIndex = 3;
pSymbolSelection.Visible = false;
//
// btnOSelect
//
btnOSelect.BackgroundImage = Properties.Resources.O;
btnOSelect.BackgroundImageLayout = ImageLayout.Stretch;
btnOSelect.FlatAppearance.BorderSize = 0;
btnOSelect.FlatStyle = FlatStyle.Flat;
btnOSelect.Location = new Point(157, 104);
btnOSelect.Name = "btnOSelect";
btnOSelect.Size = new Size(91, 89);
btnOSelect.TabIndex = 2;
btnOSelect.UseVisualStyleBackColor = true;
btnOSelect.Click += btnOSelect_Click;
//
// btnXSelect
//
btnXSelect.BackgroundImage = Properties.Resources.X;
btnXSelect.BackgroundImageLayout = ImageLayout.Stretch;
btnXSelect.FlatAppearance.BorderSize = 0;
btnXSelect.FlatStyle = FlatStyle.Flat;
btnXSelect.Location = new Point(34, 103);
btnXSelect.Name = "btnXSelect";
btnXSelect.Size = new Size(91, 89);
btnXSelect.TabIndex = 1;
btnXSelect.UseVisualStyleBackColor = true;
btnXSelect.Click += btnXSelect_Click;
//
// label1
//
label1.Font = new Font("Segoe UI", 15F, FontStyle.Bold, GraphicsUnit.Point, 0);
label1.ForeColor = Color.White;
label1.Location = new Point(11, 14);
label1.Name = "label1";
label1.Size = new Size(250, 49);
label1.TabIndex = 0;
label1.Text = "Please Select Symbol";
label1.TextAlign = ContentAlignment.MiddleCenter;
//
// pLoading
//
pLoading.BorderStyle = BorderStyle.FixedSingle;
pLoading.Controls.Add(btnPlayAgain);
pLoading.Controls.Add(lblPlayAgain);
pLoading.Controls.Add(lblLoadStatus);
pLoading.Location = new Point(161, 109);
pLoading.Name = "pLoading";
pLoading.Size = new Size(275, 255);
pLoading.TabIndex = 2;
pLoading.Visible = false;
//
// btnPlayAgain
//
btnPlayAgain.Location = new Point(97, 223);
btnPlayAgain.Name = "btnPlayAgain";
btnPlayAgain.Size = new Size(75, 23);
btnPlayAgain.TabIndex = 2;
btnPlayAgain.Text = "Play Again";
btnPlayAgain.UseVisualStyleBackColor = true;
btnPlayAgain.Visible = false;
btnPlayAgain.Click += btnPlayAgain_Click;
//
// lblPlayAgain
//
lblPlayAgain.ForeColor = Color.White;
lblPlayAgain.Location = new Point(28, 134);
lblPlayAgain.Name = "lblPlayAgain";
lblPlayAgain.Size = new Size(218, 86);
lblPlayAgain.TabIndex = 1;
lblPlayAgain.Text = "If you wish to play with a different user, you can close\r\nthis window and match up again. Otherwise click\r\n\"Play Again\"";
lblPlayAgain.TextAlign = ContentAlignment.MiddleCenter;
lblPlayAgain.Visible = false;
//
// lblLoadStatus
//
lblLoadStatus.Font = new Font("Segoe UI", 21.75F, FontStyle.Bold, GraphicsUnit.Point, 0);
lblLoadStatus.ForeColor = Color.White;
lblLoadStatus.Location = new Point(11, 4);
lblLoadStatus.Name = "lblLoadStatus";
lblLoadStatus.Size = new Size(250, 130);
lblLoadStatus.TabIndex = 0;
lblLoadStatus.Text = "Text";
lblLoadStatus.TextAlign = ContentAlignment.MiddleCenter;
//
// lblPlayerOne
//
lblPlayerOne.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
lblPlayerOne.ForeColor = Color.White;
lblPlayerOne.Location = new Point(30, 501);
lblPlayerOne.Name = "lblPlayerOne";
lblPlayerOne.Size = new Size(29, 23);
lblPlayerOne.TabIndex = 2;
lblPlayerOne.Text = "P1";
//
// lblP1Username
//
lblP1Username.AutoSize = true;
lblP1Username.Font = new Font("Segoe UI", 15F, FontStyle.Bold | FontStyle.Italic);
lblP1Username.ForeColor = Color.White;
lblP1Username.Location = new Point(26, 519);
lblP1Username.Name = "lblP1Username";
lblP1Username.Size = new Size(105, 28);
lblP1Username.TabIndex = 3;
lblP1Username.Text = "Username";
//
// lblP2Username
//
lblP2Username.AutoSize = true;
lblP2Username.Font = new Font("Segoe UI", 15F, FontStyle.Bold | FontStyle.Italic);
lblP2Username.ForeColor = Color.White;
lblP2Username.Location = new Point(466, 519);
lblP2Username.Name = "lblP2Username";
lblP2Username.Size = new Size(105, 28);
lblP2Username.TabIndex = 5;
lblP2Username.Text = "Username";
lblP2Username.TextAlign = ContentAlignment.MiddleRight;
//
// lblPlayerTwo
//
lblPlayerTwo.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
lblPlayerTwo.ForeColor = Color.White;
lblPlayerTwo.Location = new Point(540, 501);
lblPlayerTwo.Name = "lblPlayerTwo";
lblPlayerTwo.Size = new Size(29, 23);
lblPlayerTwo.TabIndex = 4;
lblPlayerTwo.Text = "P2";
//
// lvUserlist
//
lvUserlist.Alignment = ListViewAlignment.Left;
lvUserlist.Location = new Point(577, 48);
lvUserlist.MultiSelect = false;
lvUserlist.Name = "lvUserlist";
lvUserlist.Size = new Size(309, 211);
lvUserlist.TabIndex = 6;
lvUserlist.UseCompatibleStateImageBehavior = false;
lvUserlist.View = View.SmallIcon;
//
// rtxtChatbox
//
rtxtChatbox.Location = new Point(577, 497);
rtxtChatbox.Name = "rtxtChatbox";
rtxtChatbox.Size = new Size(230, 49);
rtxtChatbox.TabIndex = 8;
rtxtChatbox.Text = "";
rtxtChatbox.KeyDown += rtxtChatbox_KeyDown;
//
// btnSend
//
btnSend.BackgroundImage = Properties.Resources.SendIcon;
btnSend.BackgroundImageLayout = ImageLayout.Zoom;
btnSend.FlatAppearance.BorderSize = 0;
btnSend.FlatStyle = FlatStyle.Flat;
btnSend.Location = new Point(811, 497);
btnSend.Name = "btnSend";
btnSend.Size = new Size(75, 50);
btnSend.TabIndex = 9;
btnSend.UseVisualStyleBackColor = true;
btnSend.Click += btnSend_Click;
//
// rtxtChat
//
rtxtChat.Font = new Font("Segoe UI", 10F);
rtxtChat.HideSelection = false;
rtxtChat.Location = new Point(577, 265);
rtxtChat.Name = "rtxtChat";
rtxtChat.ReadOnly = true;
rtxtChat.Size = new Size(309, 227);
rtxtChat.TabIndex = 10;
rtxtChat.Text = "";
//
// lblJackpotWon
//
lblJackpotWon.AutoSize = true;
lblJackpotWon.Font = new Font("Segoe UI", 12F, FontStyle.Bold | FontStyle.Italic);
lblJackpotWon.ForeColor = Color.Blue;
lblJackpotWon.Location = new Point(744, 18);
lblJackpotWon.Name = "lblJackpotWon";
lblJackpotWon.Size = new Size(142, 21);
lblJackpotWon.TabIndex = 11;
lblJackpotWon.Text = "3 Wins = Jackpot!";
//
// TicTacToeGame
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.DodgerBlue;
ClientSize = new Size(898, 558);
Controls.Add(lblJackpotWon);
Controls.Add(rtxtChat);
Controls.Add(btnSend);
Controls.Add(rtxtChatbox);
Controls.Add(lvUserlist);
Controls.Add(lblP2Username);
Controls.Add(lblPlayerTwo);
Controls.Add(lblP1Username);
Controls.Add(lblPlayerOne);
Controls.Add(pLoading);
Controls.Add(pSymbolSelection);
Controls.Add(pBoard);
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
Name = "TicTacToeGame";
StartPosition = FormStartPosition.CenterScreen;
Text = "QtC.NET qGame - qTic-Tac-Toe";
FormClosed += TicTacToeGame_FormClosed;
Load += Main_Load;
pBoard.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pbBoard).EndInit();
pSymbolSelection.ResumeLayout(false);
pLoading.ResumeLayout(false);
ResumeLayout(false);
PerformLayout();
}
#endregion
private Panel pBoard;
private PictureBox pbBoard;
private Button btnSquare9;
private Button btnSquare7;
private Button btnSquare8;
private Button btnSquare6;
private Button btnSquare4;
private Button btnSquare5;
private Button btnSquare3;
private Button btnSquare1;
private Button btnSquare2;
private Panel pLoading;
private Label lblLoadStatus;
private Label lblPlayerOne;
private Label lblP1Username;
private Label lblP2Username;
private Label lblPlayerTwo;
private Panel pSymbolSelection;
private Button btnOSelect;
private Button btnXSelect;
private Label label1;
private ListView lvUserlist;
private RichTextBox rtxtChatbox;
private Button btnSend;
private Label lblPlayAgain;
private Button btnPlayAgain;
private RichTextBox rtxtChat;
private Label lblJackpotWon;
}
}

View File

@ -0,0 +1,522 @@
using Microsoft.AspNetCore.SignalR.Client;
using qtc_net_client_2.Forms;
using qtc_net_client_2.Services;
using QtCNETAPI.Enums;
using QtCNETAPI.Models;
using QtCNETAPI.Schema;
using QtCNETAPI.Services.ApiService;
using System.Threading.Tasks;
namespace qtc_net_client_2
{
public partial class TicTacToeGame : Form
{
private HubConnection? GameHubConnection { get; set; }
private GameRoom? CurrentRoom { get; set; }
private IApiService _apiService;
private AudioService _audioService = new();
private int WinCount { get; set; }
private bool JackpotWon { get; set; } = false;
public TicTacToeGame(IApiService apiService)
{
_apiService = apiService;
InitializeComponent();
}
private async void Main_Load(object sender, EventArgs e)
{
// first, connect to the game hub
GameHubConnection = new HubConnectionBuilder()
.WithUrl("http://localhost:5268/tttgame", options =>
{
options.AccessTokenProvider = () => Task.FromResult(_apiService.SessionToken)!;
})
.WithAutomaticReconnect()
.Build();
pLoading.Visible = true;
lblLoadStatus.Text = "Connecting\nTo\nHub...";
GameHubConnection.On<GameRoom>("WaitingForPlayer", (room) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
if (room.Player1 != null)
{
lblP1Username.Text = room.Player1.Username;
lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
}
lblLoadStatus.Text = "Waiting\nFor\nPlayer...";
});
});
GameHubConnection.On<GameRoom>("GameStart", (room) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
pLoading.Visible = false;
pSymbolSelection.Visible = false;
});
});
GameHubConnection.On<GameRoom, string?>("GameEnd", (room, usernameDisconnected) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
if (room.Player1 == null) lblP1Username.Text = "Username";
if (room.Player2 == null) lblP2Username.Text = "Username";
ToggleBoardControl(false);
switch (room.Status)
{
case GameStatus.P1Win:
{
if (_apiService.CurrentUser.Id == room.Player1?.Id)
{
lblLoadStatus.Text = "You Won!";
WinCount++;
if (WinCount >= 3)
{
JackpotWon = true;
lblJackpotWon.Text = "You Won A Spin!";
}
}
else lblLoadStatus.Text = "You Lost!";
lblPlayAgain.Visible = true;
btnPlayAgain.Visible = true;
break;
}
case GameStatus.P2Win:
{
if (_apiService.CurrentUser.Id == room.Player2?.Id)
{
lblLoadStatus.Text = "You Won!";
WinCount++;
if (WinCount >= 3)
{
JackpotWon = true;
lblJackpotWon.Text = "You Won A Spin!";
}
}
else lblLoadStatus.Text = "You Lost!";
lblPlayAgain.Visible = true;
btnPlayAgain.Visible = true;
break;
}
case GameStatus.PlayerDisconnected:
{
if (!string.IsNullOrEmpty(usernameDisconnected))
lblLoadStatus.Text = $"Game Ended.\nUser {usernameDisconnected}\nDisconnected.";
lblPlayAgain.Visible = false;
btnPlayAgain.Visible = false;
break;
}
case GameStatus.NoWin:
lblLoadStatus.Text = "It's a draw!";
lblPlayAgain.Visible = true;
btnPlayAgain.Visible = true;
break;
}
pLoading.Visible = true;
});
});
GameHubConnection.On<GameRoom>("RestartGame", (room) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
if (pLoading.Visible) pLoading.Visible = false;
});
ClearBoard();
ToggleBoardControl(true);
BeginInvoke(delegate ()
{
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
foreach (Button button in buttons)
{
if (button.BackgroundImage == null)
button.Enabled = true;
}
});
});
GameHubConnection.On<GameRoom>("SelectSymbol", (room) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
if (room.Player1 != null)
{
lblP1Username.Text = room.Player1.Username;
if (!lvUserlist.Items.ContainsKey(room.Player1.Id)) lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
}
if (room.Player2 != null)
{
lblP2Username.Text = room.Player2.Username;
if (!lvUserlist.Items.ContainsKey(room.Player2.Id)) lvUserlist.Items.Add(room.Player2.Id, room.Player2.Username, room.Player2.Status);
}
if (pLoading.Visible) pLoading.Visible = false;
pSymbolSelection.Visible = true;
pBoard.Enabled = true;
ToggleAllSquareButtons(false);
});
});
GameHubConnection.On<GameRoom>("SelectingSymbol", (room) =>
{
CurrentRoom = room;
BeginInvoke(delegate ()
{
if (pSymbolSelection.Visible) return;
if (room.Player1 != null)
{
lblP1Username.Text = room.Player1.Username;
if (!lvUserlist.Items.ContainsKey(room.Player1.Id)) lvUserlist.Items.Add(room.Player1.Id, room.Player1.Username, room.Player1.Status);
}
if (room.Player2 != null)
{
lblP2Username.Text = room.Player2.Username;
if (!lvUserlist.Items.ContainsKey(room.Player2.Id)) lvUserlist.Items.Add(room.Player2.Id, room.Player2.Username, room.Player2.Status);
}
pLoading.Visible = true;
lblLoadStatus.Text = $"Player 1\nIs Selecting\nSymbol...";
});
});
GameHubConnection.On<GameRoom, TicTacToeMove>("UpdateBoard", (room, move) =>
{
CurrentRoom = room;
UpdateBoardUI(move);
});
GameHubConnection.On<GameRoom>("StartTurn", (room) =>
{
CurrentRoom = room;
ToggleBoardControl(true);
AddChatMessage("[SERVER] Your Turn!");
});
GameHubConnection.On<GameRoom>("EndTurn", (room) =>
{
CurrentRoom = room;
ToggleBoardControl(false);
AddChatMessage("[SERVER] Other Players Turn");
});
GameHubConnection.On<string>("ReceiveMessage", (msg) =>
{
AddChatMessage(msg);
if (msg.Split('[')[1] != _apiService.CurrentUser.Username)
_audioService.PlaySoundEffect("sndMessage");
});
try { await GameHubConnection.StartAsync(); }
catch (HttpRequestException ex)
{
MessageBox.Show($"Sorry, We Couldn't Connect To The Game Server Due To An Error. Please Try Again Later.\n\n{ex.Message}", "Oops.", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
lblLoadStatus.Text = "Finding\nRoom...";
await GameHubConnection.SendAsync("FindRoom");
}
private async void TicTacToeGame_FormClosed(object sender, FormClosedEventArgs e)
{
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected)
{
if(JackpotWon)
{
// start a jackpot spin
CurrencyJackpotSpinner currencyJackpotSpinner = new CurrencyJackpotSpinner();
var dialogResult = currencyJackpotSpinner.ShowDialog();
if (dialogResult == DialogResult.OK)
{
await _apiService.AddCurrencyToCurrentUser(currencyJackpotSpinner.TokensWon, false);
_apiService.CurrentUser.CurrencyAmount += currencyJackpotSpinner.TokensWon;
// find the main form to refresh currency count
Main? mainForm = (Main?)Application.OpenForms[0];
if (mainForm != null)
mainForm.RefreshCurrencyCounter();
}
}
// stop and dispose connection
await GameHubConnection.StopAsync();
await GameHubConnection.DisposeAsync();
GameHubConnection = null;
}
}
private async void btnXSelect_Click(object sender, EventArgs e) => await SelectSymbol(TicTacToeSymbol.X);
private async void btnOSelect_Click(object sender, EventArgs e) => await SelectSymbol(TicTacToeSymbol.O);
private async void btnPlayAgain_Click(object sender, EventArgs e)
{
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
{
await GameHubConnection.SendAsync("RestartGame", CurrentRoom.Id);
}
}
private async void btnSquareX_Click(object sender, EventArgs e)
{
// create move
TicTacToeMove move = new TicTacToeMove
{
User = _apiService.CurrentUser
};
if (sender is Button btn)
{
switch (btn.Name)
{
case "btnSquare1":
move.Point = 1;
break;
case "btnSquare2":
move.Point = 2;
break;
case "btnSquare3":
move.Point = 3;
break;
case "btnSquare4":
move.Point = 4;
break;
case "btnSquare5":
move.Point = 5;
break;
case "btnSquare6":
move.Point = 6;
break;
case "btnSquare7":
move.Point = 7;
break;
case "btnSquare8":
move.Point = 8;
break;
case "btnSquare9":
move.Point = 9;
break;
}
}
// send move
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
await GameHubConnection.SendAsync("MakeMove", CurrentRoom.Id, move);
}
private async void btnSend_Click(object sender, EventArgs e)
{
if ((GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null) &&
!string.IsNullOrWhiteSpace(rtxtChatbox.Text))
{
await GameHubConnection.SendAsync("SendRoomMessage", CurrentRoom.Id, $"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}");
_audioService.PlaySoundEffect("sndSendClick");
rtxtChatbox.Clear();
}
}
private void rtxtChatbox_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
btnSend_Click(sender, e);
}
private void ToggleBoardControl(bool toggle)
{
if (IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
pBoard.Enabled = toggle;
});
}
}
private void ToggleAllSquareButtons(bool toggle)
{
if (IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
foreach (Button button in buttons)
button.Enabled = toggle;
});
}
}
private async Task SelectSymbol(TicTacToeSymbol symbol)
{
if (GameHubConnection != null && GameHubConnection.State == HubConnectionState.Connected && CurrentRoom != null)
{
await GameHubConnection.SendAsync("SetSymbol", CurrentRoom.Id, symbol);
ToggleAllSquareButtons(true);
}
}
private void UpdateBoardUI(TicTacToeMove move)
{
if (IsHandleCreated && !IsDisposed && CurrentRoom != null)
{
// play move made sound
_audioService.PlaySoundEffect("sndTTTMoveMade");
Invoke(delegate ()
{
switch (CurrentRoom.Board.Square1)
{
case TicTacToeSymbol.X:
btnSquare1.BackgroundImage = Properties.Resources.X;
btnSquare1.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare1.BackgroundImage = Properties.Resources.O;
btnSquare1.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square2)
{
case TicTacToeSymbol.X:
btnSquare2.BackgroundImage = Properties.Resources.X;
btnSquare2.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare2.BackgroundImage = Properties.Resources.O;
btnSquare2.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square3)
{
case TicTacToeSymbol.X:
btnSquare3.BackgroundImage = Properties.Resources.X;
btnSquare3.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare3.BackgroundImage = Properties.Resources.O;
btnSquare3.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square4)
{
case TicTacToeSymbol.X:
btnSquare4.BackgroundImage = Properties.Resources.X;
btnSquare4.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare4.BackgroundImage = Properties.Resources.O;
btnSquare4.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square5)
{
case TicTacToeSymbol.X:
btnSquare5.BackgroundImage = Properties.Resources.X;
btnSquare5.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare5.BackgroundImage = Properties.Resources.O;
btnSquare5.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square6)
{
case TicTacToeSymbol.X:
btnSquare6.BackgroundImage = Properties.Resources.X;
btnSquare6.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare6.BackgroundImage = Properties.Resources.O;
btnSquare6.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square7)
{
case TicTacToeSymbol.X:
btnSquare7.BackgroundImage = Properties.Resources.X;
btnSquare7.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare7.BackgroundImage = Properties.Resources.O;
btnSquare7.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square8)
{
case TicTacToeSymbol.X:
btnSquare8.BackgroundImage = Properties.Resources.X;
btnSquare8.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare8.BackgroundImage = Properties.Resources.O;
btnSquare8.Enabled = false;
break;
}
switch (CurrentRoom.Board.Square9)
{
case TicTacToeSymbol.X:
btnSquare9.BackgroundImage = Properties.Resources.X;
btnSquare9.Enabled = false;
break;
case TicTacToeSymbol.O:
btnSquare9.BackgroundImage = Properties.Resources.O;
btnSquare9.Enabled = false;
break;
}
});
}
}
private void AddChatMessage(string msg)
{
if (IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
rtxtChat.AppendText($"{msg}\n");
});
}
}
private void ClearBoard()
{
if (IsHandleCreated && !IsDisposed)
{
Invoke(delegate ()
{
List<Button> buttons = [btnSquare1, btnSquare2, btnSquare3, btnSquare4, btnSquare5, btnSquare6, btnSquare7, btnSquare8, btnSquare9];
foreach (Button button in buttons)
button.BackgroundImage = null;
});
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -189,6 +189,16 @@ namespace qtc_net_client_2.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap O {
get {
object obj = ResourceManager.GetObject("O", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -248,5 +258,25 @@ namespace qtc_net_client_2.Properties {
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Tic_tac_toe {
get {
object obj = ResourceManager.GetObject("Tic-tac-toe", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap X {
get {
object obj = ResourceManager.GetObject("X", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -124,15 +124,21 @@
<data name="SendIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\SendIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="X" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="left-horn-animated" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Anims\left-horn-animated.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="OfflineIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\OfflineIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="dollar-money" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Tic-tac-toe" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Tic-tac-toe1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="OnlineIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\OnlineIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -148,8 +154,8 @@
<data name="CurrencyIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\CurrencyIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AddContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\AddContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="DefaultPfp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DefaultPfp.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="RequestSentIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\RequestSentIcon.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
@ -169,10 +175,13 @@
<data name="DeclineContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\DeclineContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AddContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\AddContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="AcceptContactIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Icons\AcceptContactIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="dollar-money" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Anims\dollar-money.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="O" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\O.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

View File

@ -62,6 +62,9 @@
<None Update="Sounds\sndTokenWin.wav">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Sounds\sndTTTMoveMade.wav">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>