From df9ec46280fe74fdd48655b7791e405c45d5221c Mon Sep 17 00:00:00 2001 From: Akhilesh Garg Date: Tue, 13 Oct 2020 01:47:33 +0530 Subject: [PATCH] Initial Commit : JavaFX TicTacToe Basic Game --- Screenshots/GameBoard.JPG | Bin 0 -> 24613 bytes Screenshots/ResultPage.JPG | Bin 0 -> 27584 bytes Screenshots/WelcomePage.JPG | Bin 0 -> 28301 bytes module-info.java | 7 + src/TicTacToeJavaFX/GameBoard.fxml | 27 ++ src/TicTacToeJavaFX/GameBoardController.java | 317 ++++++++++++++++++ src/TicTacToeJavaFX/GameResult.fxml | 42 +++ src/TicTacToeJavaFX/GameResultController.java | 76 +++++ src/TicTacToeJavaFX/Main.java | 36 ++ src/TicTacToeJavaFX/WelcomeScreen.fxml | 56 ++++ .../WelcomeScreenController.java | 121 +++++++ src/module-info.java | 7 + 12 files changed, 689 insertions(+) create mode 100644 Screenshots/GameBoard.JPG create mode 100644 Screenshots/ResultPage.JPG create mode 100644 Screenshots/WelcomePage.JPG create mode 100644 module-info.java create mode 100644 src/TicTacToeJavaFX/GameBoard.fxml create mode 100644 src/TicTacToeJavaFX/GameBoardController.java create mode 100644 src/TicTacToeJavaFX/GameResult.fxml create mode 100644 src/TicTacToeJavaFX/GameResultController.java create mode 100644 src/TicTacToeJavaFX/Main.java create mode 100644 src/TicTacToeJavaFX/WelcomeScreen.fxml create mode 100644 src/TicTacToeJavaFX/WelcomeScreenController.java create mode 100644 src/module-info.java diff --git a/Screenshots/GameBoard.JPG b/Screenshots/GameBoard.JPG new file mode 100644 index 0000000000000000000000000000000000000000..97f2f363cf815932d55f81af42f9a658fb02385f GIT binary patch literal 24613 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 literal 0 HcmV?d00001 diff --git a/Screenshots/ResultPage.JPG b/Screenshots/ResultPage.JPG new file mode 100644 index 0000000000000000000000000000000000000000..994f96f7b2d4d765f7d6001b0bfd807dea4f4bf5 GIT binary patch literal 27584 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 literal 0 HcmV?d00001 diff --git a/Screenshots/WelcomePage.JPG b/Screenshots/WelcomePage.JPG new file mode 100644 index 0000000000000000000000000000000000000000..a6d502adfea8a960a494658ec6fb87271d3e47fc GIT binary patch literal 28301 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 {U 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 R5*)tsXvd_fYwG{s1OQ-U>T3W1 literal 0 HcmV?d00001 diff --git a/module-info.java b/module-info.java new file mode 100644 index 0000000..037b345 --- /dev/null +++ b/module-info.java @@ -0,0 +1,7 @@ +module RuralBankingManagement { + + requires javafx.fxml; + requires javafx.controls; + + opens com.akgarg.bankingsystem; +} \ No newline at end of file diff --git a/src/TicTacToeJavaFX/GameBoard.fxml b/src/TicTacToeJavaFX/GameBoard.fxml new file mode 100644 index 0000000..63bf065 --- /dev/null +++ b/src/TicTacToeJavaFX/GameBoard.fxml @@ -0,0 +1,27 @@ + + + +
+ + + + + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/src/TicTacToeJavaFX/GameBoardController.java b/src/TicTacToeJavaFX/GameBoardController.java new file mode 100644 index 0000000..af229f0 --- /dev/null +++ b/src/TicTacToeJavaFX/GameBoardController.java @@ -0,0 +1,317 @@ +package TicTacToeJavaFX; + +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.input.MouseEvent; +import javafx.scene.paint.Paint; +import javafx.scene.text.Font; +import javafx.stage.Stage; + +import java.io.IOException; + +public class GameBoardController { + + private String playerOneName, playerTwoName; + private int turnsCount = 0; + private String playerOneSymbol; + private String playerTwoSymbol; + private String playerOneColor, playerTwoColor; + + @FXML + private Button btn1; + @FXML + private Button btn2; + @FXML + private Button btn3; + @FXML + private Button btn4; + @FXML + private Button btn5; + @FXML + private Button btn6; + @FXML + private Button btn7; + @FXML + private Button btn8; + @FXML + private Button btn9; + + // this method set the width and height of the buttons which are going to be visible on the game board + private void setButtonDimensions(double width, double height) { + btn1.setPrefWidth(width / 3); + btn2.setPrefWidth(width / 3); + btn3.setPrefWidth(width / 3); + btn4.setPrefWidth(width / 3); + btn5.setPrefWidth(width / 3); + btn6.setPrefWidth(width / 3); + btn7.setPrefWidth(width / 3); + btn8.setPrefWidth(width / 3); + btn9.setPrefWidth(width / 3); + + btn1.setPrefHeight(height / 3); + btn2.setPrefHeight(height / 3); + btn3.setPrefHeight(height / 3); + btn4.setPrefHeight(height / 3); + btn5.setPrefHeight(height / 3); + btn6.setPrefHeight(height / 3); + btn7.setPrefHeight(height / 3); + btn8.setPrefHeight(height / 3); + btn9.setPrefHeight(height / 3); + } + + public void initialize() { + setButtonDimensions(Main.STAGE_DEFAULT_WIDTH, Main.STAGE_DEFAULT_HEIGHT); + setButtonsFont(Main.BUTTON_DEFAULT_FONT_SIZE); + + if (WelcomeScreenController.getPlayerOneName().equals("")) { + playerOneName = "Player 1"; + } else { + playerOneName = WelcomeScreenController.getPlayerOneName(); + } + + if (WelcomeScreenController.getPlayerTwoName().equals("")) { + playerTwoName = "Player 2"; + } else { + playerTwoName = WelcomeScreenController.getPlayerTwoName(); + } + + playerOneSymbol = WelcomeScreenController.getPlayerOneSymbol(); + playerTwoSymbol = WelcomeScreenController.getPlayerTwoSymbol(); + + playerOneColor = WelcomeScreenController.getPlayerOneColor(); + playerTwoColor = WelcomeScreenController.getPlayerTwoColor(); + + btn1.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn1.getText().equals("")) { + turnsCount++; + btn1.setText(playerOneSymbol); + btn1.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn1.getText().equals("")) { + turnsCount++; + btn1.setText(playerTwoSymbol); + btn1.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn1.getText()); + } + }); + + btn2.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn2.getText().equals("")) { + turnsCount++; + btn2.setText(playerOneSymbol); + btn2.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn2.getText().equals("")) { + turnsCount++; + btn2.setText(playerTwoSymbol); + btn2.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn2.getText()); + } + }); + + btn3.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn3.getText().equals("")) { + turnsCount++; + btn3.setText(playerOneSymbol); + btn3.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn3.getText().equals("")) { + turnsCount++; + btn3.setText(playerTwoSymbol); + btn3.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn3.getText()); + } + }); + + btn4.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn4.getText().equals("")) { + turnsCount++; + btn4.setText(playerOneSymbol); + btn4.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn4.getText().equals("")) { + turnsCount++; + btn4.setText(playerTwoSymbol); + btn4.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn4.getText()); + } + }); + + btn5.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn5.getText().equals("")) { + turnsCount++; + btn5.setText(playerOneSymbol); + btn5.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn5.getText().equals("")) { + turnsCount++; + btn5.setText(playerTwoSymbol); + btn5.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn5.getText()); + } + }); + + btn6.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn6.getText().equals("")) { + turnsCount++; + btn6.setText(playerOneSymbol); + btn6.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn6.getText().equals("")) { + turnsCount++; + btn6.setText(playerTwoSymbol); + btn6.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn6.getText()); + } + }); + + btn7.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn7.getText().equals("")) { + turnsCount++; + btn7.setText(playerOneSymbol); + btn7.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn7.getText().equals("")) { + turnsCount++; + btn7.setText(playerTwoSymbol); + btn7.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn7.getText()); + } + }); + + btn8.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn8.getText().equals("")) { + turnsCount++; + btn8.setText(playerOneSymbol); + btn8.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn8.getText().equals("")) { + turnsCount++; + btn8.setText(playerTwoSymbol); + btn8.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn8.getText()); + } + }); + + btn9.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if (turnsCount % 2 == 0 && btn9.getText().equals("")) { + turnsCount++; + btn9.setText(playerOneSymbol); + btn9.setTextFill(Paint.valueOf(playerOneColor)); + } else if (turnsCount % 2 != 0 && btn9.getText().equals("")) { + turnsCount++; + btn9.setText(playerTwoSymbol); + btn9.setTextFill(Paint.valueOf(playerTwoColor)); + } + resultTest(Main.getPrimaryStage(), btn9.getText()); + } + }); + } + + // this method set the font size of the text which will be visible on the button (either 'O' or 'X') + private void setButtonsFont(double font) { + Font font1 = new Font(font); + btn1.setFont(font1); + btn2.setFont(font1); + btn3.setFont(font1); + btn4.setFont(font1); + btn5.setFont(font1); + btn6.setFont(font1); + btn7.setFont(font1); + btn8.setFont(font1); + btn9.setFont(font1); + } + + // this method check the all possible conditions of winning of a player and + // also check for draw case when all blocks are filled with the data provided by the players playing game + private void resultTest(Stage primaryStage, String buttonText) { + if (btn1.getText().equals(btn2.getText()) && btn2.getText().equals(btn3.getText()) && + !btn1.getText().equals("") && !btn2.getText().equals("") && !btn3.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn1.getText().equals(btn4.getText()) && btn4.getText().equals(btn7.getText()) && + !btn1.getText().equals("") && !btn4.getText().equals("") && !btn7.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn3.getText().equals(btn6.getText()) && btn6.getText().equals(btn9.getText()) && + !btn3.getText().equals("") && !btn6.getText().equals("") && !btn9.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn7.getText().equals(btn8.getText()) && btn8.getText().equals(btn9.getText()) && + !btn7.getText().equals("") && !btn8.getText().equals("") && !btn9.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn3.getText().equals(btn5.getText()) && btn5.getText().equals(btn7.getText()) && + !btn3.getText().equals("") && !btn5.getText().equals("") && !btn7.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn1.getText().equals(btn5.getText()) && btn5.getText().equals(btn9.getText()) && + !btn1.getText().equals("") && !btn5.getText().equals("") && !btn9.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn2.getText().equals(btn5.getText()) && btn5.getText().equals(btn8.getText()) && + !btn2.getText().equals("") && !btn5.getText().equals("") && !btn8.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else if (btn4.getText().equals(btn5.getText()) && btn5.getText().equals(btn6.getText()) && + !btn4.getText().equals("") && !btn5.getText().equals("") && !btn6.getText().equals("")) { + System.out.println("Game Over"); + gameOverDialog(primaryStage, buttonText); + } else { + if (!btn1.getText().equals("") && !btn2.getText().equals("") && !btn3.getText().equals("") && !btn4.getText().equals("") && !btn5.getText().equals("") && + !btn6.getText().equals("") && !btn7.getText().equals("") && !btn8.getText().equals("") && !btn9.getText().equals("")) { + System.out.println("Game Draw"); + gameOverDialog(primaryStage, "Draw"); + } + } + } + + // this method is used to display the final result of the game + // this method will be called only when either any of player wins the game + // or game get draw. In other cases, this method will not be called by resultTest method + private void gameOverDialog(Stage primaryStage, String buttonText) { + Parent root = null; + FXMLLoader fxmlLoader = new FXMLLoader(); + fxmlLoader.setLocation(getClass().getResource("GameResult.fxml")); + GameResultController gameResultController = null; + + try { + primaryStage.setScene(new Scene(fxmlLoader.load(), Main.STAGE_DEFAULT_WIDTH, Main.STAGE_DEFAULT_HEIGHT)); + gameResultController = fxmlLoader.getController(); + + if (buttonText.equals("Draw")) { + gameResultController.setGameResultText("Draw", ""); + } else { + if (playerOneSymbol.equals(buttonText)) { + gameResultController.setGameResultText("win", playerOneName); + } else { + gameResultController.setGameResultText("win", playerTwoName); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/TicTacToeJavaFX/GameResult.fxml b/src/TicTacToeJavaFX/GameResult.fxml new file mode 100644 index 0000000..0b2c101 --- /dev/null +++ b/src/TicTacToeJavaFX/GameResult.fxml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + + + + +
diff --git a/src/TicTacToeJavaFX/GameResultController.java b/src/TicTacToeJavaFX/GameResultController.java new file mode 100644 index 0000000..3d7aaa3 --- /dev/null +++ b/src/TicTacToeJavaFX/GameResultController.java @@ -0,0 +1,76 @@ +package TicTacToeJavaFX; + +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.input.MouseEvent; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; + +import java.io.IOException; + +public class GameResultController { + + @FXML + private Label congratsLabel; + @FXML + private Label winnerName; + @FXML + private Label gameOverLabel; + @FXML + private Label complementLabel; + @FXML + private Button playAgainButton; + @FXML + private Button exitGameButton; + + // this method dynamically update the content of the final result scene of the game according to the game result + void setGameResultText(String gameResultText1, String winner) { + if (gameResultText1.equals("Draw")) { + gameOverLabel.setFont(Font.font("Algerian", FontWeight.BOLD, 45)); + congratsLabel.setFont(new Font(35)); + winnerName.setFont(new Font(30)); + congratsLabel.setVisible(false); + complementLabel.setVisible(false); + winnerName.setText("Game Draw"); + } else { + gameOverLabel.setFont(Font.font("Algerian", FontWeight.BOLD, 45)); + congratsLabel.setFont(new Font(35)); + winnerName.setFont(new Font(25)); + congratsLabel.setVisible(true); + complementLabel.setVisible(true); + + if (winner.length() > 30) { + winnerName.setText(winner.substring(0, 30)); + } else { + winnerName.setText(winner); + } + + winnerName.setWrapText(true); + } + } + + public void initialize() { + playAgainButton.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + try { + Main.getPrimaryStage().setScene(new Scene + (FXMLLoader.load(getClass().getResource("WelcomeScreen.fxml")), Main.STAGE_DEFAULT_WIDTH, Main.STAGE_DEFAULT_HEIGHT)); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + }); + + exitGameButton.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + Main.getPrimaryStage().close(); + } + }); + } +} diff --git a/src/TicTacToeJavaFX/Main.java b/src/TicTacToeJavaFX/Main.java new file mode 100644 index 0000000..b2b6ee1 --- /dev/null +++ b/src/TicTacToeJavaFX/Main.java @@ -0,0 +1,36 @@ +package TicTacToeJavaFX; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +public class Main extends Application { + + static final int STAGE_DEFAULT_WIDTH = 300; + static final int STAGE_DEFAULT_HEIGHT = 300; + static final int BUTTON_DEFAULT_FONT_SIZE = 40; + + private static Stage stage; + + // method used to retrieve the primaryStage + static Stage getPrimaryStage() { + return stage; + } + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) throws Exception { + stage = primaryStage; + Parent root = FXMLLoader.load(getClass().getResource("WelcomeScreen.fxml")); + primaryStage.setTitle("Tic Tac Toe"); + Scene scene = new Scene(root, STAGE_DEFAULT_WIDTH, STAGE_DEFAULT_HEIGHT); + primaryStage.setScene(scene); + primaryStage.setResizable(false); + primaryStage.show(); + } +} diff --git a/src/TicTacToeJavaFX/WelcomeScreen.fxml b/src/TicTacToeJavaFX/WelcomeScreen.fxml new file mode 100644 index 0000000..b8787d2 --- /dev/null +++ b/src/TicTacToeJavaFX/WelcomeScreen.fxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/TicTacToeJavaFX/WelcomeScreenController.java b/src/TicTacToeJavaFX/WelcomeScreenController.java new file mode 100644 index 0000000..b7d7615 --- /dev/null +++ b/src/TicTacToeJavaFX/WelcomeScreenController.java @@ -0,0 +1,121 @@ +package TicTacToeJavaFX; + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; + +import java.io.IOException; + +public class WelcomeScreenController { + + private static final Font font = new Font(14); + private static String playerOneName; + private static String playerTwoName; + private static String playerOneSymbol; + private static String playerTwoSymbol; + private static String playerOneColor; + private static String playerTwoColor; + + private ToggleGroup toggleGroup; + @FXML + private Label playerOneNameLabel; + @FXML + private TextField playerOneNameField; + + @FXML + private Label playerTwoNameLabel; + @FXML + private TextField playerTwoNameField; + + @FXML + private Label playerOneSymbolLabel; + @FXML + private RadioButton crossSymbol; + @FXML + private RadioButton zeroSymbol; + + @FXML + private Label playerOneColorLabel; + @FXML + private ColorPicker playerOneColorPicker; + + @FXML + private Label playerTwoColorLabel; + @FXML + private ColorPicker playerTwoColorPicker; + + @FXML + private Button startGameButton; + + static String getPlayerOneName() { + return playerOneName; + } + + static String getPlayerTwoName() { + return playerTwoName; + } + + static String getPlayerOneSymbol() { + return playerOneSymbol; + } + + static String getPlayerTwoSymbol() { + return playerTwoSymbol; + } + + static String getPlayerOneColor() { + return playerOneColor; + } + + static String getPlayerTwoColor() { + return playerTwoColor; + } + + public void initialize() { + toggleGroup = new ToggleGroup(); + crossSymbol.setToggleGroup(toggleGroup); + zeroSymbol.setToggleGroup(toggleGroup); + + playerOneNameLabel.setFont(font); + playerTwoNameLabel.setFont(font); + playerOneSymbolLabel.setFont(font); + playerOneColorLabel.setFont(font); + playerTwoColorLabel.setFont(font); + + playerOneColorPicker.setValue(Color.BLACK); + playerTwoColorPicker.setValue(Color.BLACK); + + startGameButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent actionEvent) { + playerOneName = playerOneNameField.getText(); + playerTwoName = playerTwoNameField.getText(); + + if (crossSymbol.isSelected()) { + playerOneSymbol = "X"; + playerTwoSymbol = "O"; + } else { + playerOneSymbol = "O"; + playerTwoSymbol = "X"; + } + + playerOneColor = playerOneColorPicker.getValue().toString(); + playerTwoColor = playerTwoColorPicker.getValue().toString(); + + try { + Parent root = FXMLLoader.load(getClass().getResource("GameBoard.fxml")); + Scene scene = new Scene(root, Main.STAGE_DEFAULT_WIDTH, Main.STAGE_DEFAULT_HEIGHT); + Main.getPrimaryStage().setScene(scene); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } +} diff --git a/src/module-info.java b/src/module-info.java new file mode 100644 index 0000000..7f08896 --- /dev/null +++ b/src/module-info.java @@ -0,0 +1,7 @@ +module SampleJavaFX { + + requires javafx.fxml; + requires javafx.controls; + + opens TicTacToeJavaFX; +} \ No newline at end of file