From 0e3a86d2b210c248188d424fa2e412392a6b47f4 Mon Sep 17 00:00:00 2001 From: ayazb7 <60544937+ayazb7@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:52:59 +0100 Subject: [PATCH] Adding Grid UI and graphics changes --- .../soton/comp1206/component/GameBlock.java | 13 ++- .../soton/comp1206/component/PieceBoard.java | 16 +++ .../java/uk/ac/soton/comp1206/game/Game.java | 53 +++++----- .../uk/ac/soton/comp1206/game/GamePiece.java | 1 + .../java/uk/ac/soton/comp1206/game/Grid.java | 8 +- .../soton/comp1206/scene/ChallengeScene.java | 97 ++++++++++++++---- .../uk/ac/soton/comp1206/scene/MenuScene.java | 8 +- .../ac/soton/comp1206/utility/Multimedia.java | 13 ++- .../soton/comp1206/component/GameBlock.class | Bin 4306 -> 4846 bytes .../uk/ac/soton/comp1206/game/Game.class | Bin 6340 -> 6194 bytes .../uk/ac/soton/comp1206/game/GamePiece.class | Bin 3892 -> 3892 bytes .../uk/ac/soton/comp1206/game/Grid.class | Bin 2805 -> 2919 bytes .../soton/comp1206/scene/ChallengeScene.class | Bin 6373 -> 7401 bytes .../ac/soton/comp1206/scene/MenuScene.class | Bin 4282 -> 4179 bytes 14 files changed, 144 insertions(+), 65 deletions(-) create mode 100644 tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java index e6c5c78..272c525 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java @@ -4,6 +4,7 @@ import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.value.ObservableValue; import javafx.scene.canvas.Canvas; +import javafx.scene.effect.BlendMode; import javafx.scene.paint.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -119,14 +120,17 @@ public class GameBlock extends Canvas { var gc = getGraphicsContext2D(); //Clear - gc.clearRect(0,0,width,height); + gc.clearRect(0.0D, 0.0D, this.width, this.height); //Fill - gc.setFill(Color.WHITE); - gc.fillRect(0,0, width, height); + Color gradStart = Color.color(0.0D, 0.0D, 0.6D, 0.3D); + Color gradEnd = Color.color(0.0D, 0.0D, 0.2D, 0.5D); + gc.setFill(new LinearGradient(0.0D, 0.0D, 1.0D, 1.0D, true, CycleMethod.REFLECT, new Stop(0.0D, gradStart), new Stop(1.0D, gradEnd))); + gc.fillRect(0.0D, 0.0D, this.width, this.height); //Border - gc.setStroke(Color.BLACK); + gc.setStroke(Color.WHITE); + gc.setGlobalAlpha(0.7); gc.strokeRect(0,0,width,height); } @@ -142,6 +146,7 @@ public class GameBlock extends Canvas { //Colour fill gc.setFill(colour); + gc.setGlobalAlpha(1); gc.fillRect(0,0, width, height); //Border diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java new file mode 100644 index 0000000..c2d35fd --- /dev/null +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java @@ -0,0 +1,16 @@ +package uk.ac.soton.comp1206.component; + +import uk.ac.soton.comp1206.game.GamePiece; + +public class PieceBoard extends GameBoard { + + private GamePiece pieceToDisplay; + + public PieceBoard(double width, double height) { + super(3, 3, width, height); + } + + public void displayPiece(GamePiece piece) { + this.pieceToDisplay = piece; + } +} diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java index d1dd5e0..af904f4 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java @@ -33,17 +33,13 @@ public class Game { */ protected final Grid grid; - private GamePiece currentPiece; + protected GamePiece currentPiece; + protected GamePiece nextPiece; - private SimpleIntegerProperty score; - - private IntegerProperty level; - - private IntegerProperty lives; - - private IntegerProperty multiplier; - - private final Multimedia multimedia; + private IntegerProperty score = new SimpleIntegerProperty(0); + private IntegerProperty level = new SimpleIntegerProperty(0); + private IntegerProperty lives = new SimpleIntegerProperty(0); + private IntegerProperty multiplier = new SimpleIntegerProperty(0); private int remainder = 0; @@ -56,13 +52,6 @@ public class Game { this.cols = cols; this.rows = rows; - this.score = new SimpleIntegerProperty(0); - this.level = new SimpleIntegerProperty(0); - this.lives = new SimpleIntegerProperty(3); - this.multiplier = new SimpleIntegerProperty(1); - - this.multimedia = new Multimedia(); - //Create a new grid model to represent the game state this.grid = new Grid(cols,rows); } @@ -80,6 +69,14 @@ public class Game { */ public void initialiseGame() { logger.info("Initialising game"); + + this.score.set(0); + this.level.set(0); + this.lives.set(3); + this.multiplier.set(1); + + this.nextPiece = spawnPiece(); + nextPiece(); this.currentPiece = spawnPiece(); } @@ -103,13 +100,19 @@ public class Game { public GamePiece spawnPiece() { Random rand = new Random(); - int value = rand.nextInt(15); - logger.info("Spawning piece of value " + (value + 1)); - return GamePiece.createPiece(value); + GamePiece piece = GamePiece.createPiece(3, rand.nextInt(3)); + logger.info("Spawning piece: {}" , piece); + return piece; } - public void nextPiece() { - this.currentPiece = spawnPiece(); + public GamePiece nextPiece() { + this.currentPiece = this.nextPiece; + this.nextPiece = spawnPiece(); + + logger.info("Current piece is : {}", this.currentPiece); + logger.info("Next piece is: {}", this.nextPiece); + + return this.currentPiece; } public void afterPiece() { @@ -146,7 +149,6 @@ public class Game { } } - int numGridBlocks = 0; /** @@ -177,7 +179,6 @@ public class Game { int newScore = score.get() + (fullCols.size() + fullRows.size()) * numGridBlocks * 10 * multiplier.get(); this.setScore(newScore); int newRemainder = score.get() % 1000; - System.out.println("newRemainder = " + newRemainder + " remainder = " + remainder); if (newRemainder < remainder) { this.setLevel(level.get() + 1); remainder = 0; @@ -187,7 +188,7 @@ public class Game { if (fullCols.size() != 0 || fullRows.size() != 0) { logger.info("Removing rows/columns"); - multimedia.playSound("clear.wav"); + Multimedia.playSound("clear.wav"); this.setMultiplier(multiplier.get() + 1); } else { this.setMultiplier(1); @@ -241,7 +242,7 @@ public class Game { public void setLevel(int level) { logger.info("Increasing level to " + level); - multimedia.playSound("level.wav"); + Multimedia.playSound("level.wav"); this.level.set(level); } diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java index 763897a..761666e 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java @@ -28,6 +28,7 @@ public class GamePiece { */ private final String name; + /** * Create a new GamePiece of the specified piece number * @param piece piece number diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java index fc583da..7905236 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java @@ -35,8 +35,6 @@ public class Grid { */ private final SimpleIntegerProperty[][] grid; - private final Multimedia multimedia; - /** * Create a new Grid with the specified number of columns and rows and initialise them * @param cols number of columns @@ -49,8 +47,6 @@ public class Grid { //Create the grid itself grid = new SimpleIntegerProperty[cols][rows]; - this.multimedia = new Multimedia(); - //Add a SimpleIntegerProperty to every block in the grid for(var y = 0; y < rows; y++) { for(var x = 0; x < cols; x++) { @@ -106,7 +102,7 @@ public class Grid { if (value == 0) continue; if (get(x + placeX, y + placeY) != 0) { logger.info("Cannot place piece here"); - multimedia.playSound("fail.wav"); + Multimedia.playSound("fail.wav"); return false; } } @@ -118,7 +114,7 @@ public class Grid { if (!this.canPlayPiece(gamePiece, placeX, placeY)) return false; logger.info("Placing block at x:{} y:{}",placeX,placeY); - multimedia.playSound("place.wav"); + Multimedia.playSound("place.wav"); int[][] blocks = gamePiece.getBlocks(); placeX = placeX - 1; placeY = placeY - 1; diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java index 8279850..b5fbf96 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java @@ -1,19 +1,26 @@ package uk.ac.soton.comp1206.scene; import javafx.beans.property.Property; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; import javafx.scene.text.Text; import javafx.util.converter.NumberStringConverter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import uk.ac.soton.comp1206.component.GameBlock; import uk.ac.soton.comp1206.component.GameBoard; +import uk.ac.soton.comp1206.component.PieceBoard; import uk.ac.soton.comp1206.game.Game; import uk.ac.soton.comp1206.ui.GamePane; import uk.ac.soton.comp1206.ui.GameWindow; import uk.ac.soton.comp1206.utility.Multimedia; +import java.util.ArrayList; + /** * The Single Player challenge scene. Holds the UI for the single player challenge mode in the game. */ @@ -22,8 +29,6 @@ public class ChallengeScene extends BaseScene { private static final Logger logger = LogManager.getLogger(MenuScene.class); protected Game game; - private Multimedia multimedia; - /** * Create a new Single Player challenge scene * @param gameWindow the Game Window @@ -44,7 +49,8 @@ public class ChallengeScene extends BaseScene { root = new GamePane(gameWindow.getWidth(),gameWindow.getHeight()); - var challengePane = new StackPane(); + StackPane challengePane = new StackPane(); + challengePane.setBackground(new Background(new BackgroundFill[] { new BackgroundFill((Paint) Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY) })); challengePane.setMaxWidth(gameWindow.getWidth()); challengePane.setMaxHeight(gameWindow.getHeight()); challengePane.getStyleClass().add("menu-background"); @@ -53,36 +59,41 @@ public class ChallengeScene extends BaseScene { var mainPane = new BorderPane(); challengePane.getChildren().add(mainPane); - var board = new GameBoard(game.getGrid(),gameWindow.getWidth()/2,gameWindow.getWidth()/2); - mainPane.setCenter(board); + //Header of Challenge Scene + HBox header = buildHeader(); + + mainPane.setTop(header); + + HBox boards = buildBoards(); + + mainPane.setCenter(boards); + } + + public HBox buildHeader() { + //Header of Challenge Scene HBox header = new HBox(); + //VBox to hold the Score title and value VBox scoreBox = new VBox(); var scoreTitle = new Text("Score"); scoreTitle.getStyleClass().add("heading"); var scoreValue = new Text(); - scoreValue.textProperty().bindBidirectional(game.getScore(), new NumberStringConverter()); + scoreValue.textProperty().bind(game.getScore().asString()); scoreValue.getStyleClass().add("score"); scoreBox.getChildren().addAll(scoreTitle,scoreValue); scoreBox.setAlignment(Pos.BASELINE_CENTER); header.getChildren().add(scoreBox); - Region space = new Region(); - space.setMaxWidth(140); - HBox.setHgrow(space,Priority.ALWAYS); - header.getChildren().add(space); - var challengeTitle = new Text("Challenge Scene"); + //Challenge scene title + var challengeTitle = new Text("Challenge Mode"); challengeTitle.getStyleClass().add("title"); header.getChildren().add(challengeTitle); - Region space2 = new Region(); - space2.setMaxWidth(140); - HBox.setHgrow(space2,Priority.ALWAYS); - header.getChildren().add(space2); + //VBox to store lives title and value VBox livesBox = new VBox(); var livesTitle = new Text("Lives"); livesTitle.getStyleClass().add("heading"); @@ -93,12 +104,60 @@ public class ChallengeScene extends BaseScene { livesBox.setAlignment(Pos.BASELINE_CENTER); header.getChildren().add(livesBox); + header.setAlignment(Pos.CENTER); + header.setSpacing(140); - mainPane.setTop(header); + return header; + } + + public HBox buildBoards() { + HBox boards = new HBox(); + var board = new GameBoard(game.getGrid(),gameWindow.getWidth()/2,gameWindow.getWidth()/2); //Handle block on gameboard grid being clicked board.setOnBlockClick(this::blockClicked); + + boards.getChildren().add(board); + + VBox gameInfo = new VBox(); + + var hiScoreTitle = new Text("High Score"); + hiScoreTitle.getStyleClass().add("heading"); + gameInfo.getChildren().add(hiScoreTitle); + + var hiScoreVal = new Text("10000"); + hiScoreVal.getStyleClass().add("hiscore"); + gameInfo.getChildren().add(hiScoreVal); + + var levelTitle = new Text("Level"); + levelTitle.getStyleClass().add("heading"); + gameInfo.getChildren().add(levelTitle); + + var levelVal = new Text(); + levelVal.textProperty().bind(game.getLevel().asString()); + levelVal.getStyleClass().add("level"); + gameInfo.getChildren().add(levelVal); + + var incomingTitle = new Text("Incoming"); + incomingTitle.getStyleClass().add("heading"); + gameInfo.getChildren().add(incomingTitle); + + PieceBoard currentPieceBoard = new PieceBoard(gameWindow.getWidth()/6, gameWindow.getWidth()/6); + gameInfo.getChildren().add(currentPieceBoard); + + PieceBoard nextPieceBoard = new PieceBoard(gameWindow.getWidth()/10, gameWindow.getWidth()/10); + gameInfo.getChildren().add(nextPieceBoard); + + gameInfo.setAlignment(Pos.CENTER); + gameInfo.setSpacing(10); + + boards.getChildren().add(gameInfo); + + boards.setAlignment(Pos.CENTER); + boards.setSpacing(100); + + return boards; } /** @@ -109,14 +168,14 @@ public class ChallengeScene extends BaseScene { game.blockClicked(gameBlock); } + /** * Setup the game object and model */ public void setupGame() { logger.info("Starting a new challenge"); - multimedia = new Multimedia(); - multimedia.playBackgroundMusic("game_start.wav", false); - Multimedia.getBackgroundPlayer().setOnEndOfMedia(() -> multimedia.playBackgroundMusic("game.wav", true)); + Multimedia.playBackgroundMusic("game_start.wav", false); + Multimedia.getBackgroundPlayer().setOnEndOfMedia(() -> Multimedia.playBackgroundMusic("game.wav", true)); //Start new game game = new Game(5, 5); } diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java index 7d65d35..82084aa 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java @@ -19,8 +19,6 @@ public class MenuScene extends BaseScene { private static final Logger logger = LogManager.getLogger(MenuScene.class); - private Multimedia multimedia; - /** * Create a new menu scene * @param gameWindow the Game Window this will be displayed in @@ -73,9 +71,7 @@ public class MenuScene extends BaseScene { mainPane.setTop(menuWidgets); mainPane.setCenter(menuButtons); - multimedia = new Multimedia(); - multimedia.playBackgroundMusic("menu.mp3", true); - + Multimedia.playBackgroundMusic("menu.mp3", true); } /** @@ -91,7 +87,7 @@ public class MenuScene extends BaseScene { * @param event event */ private void startGame(MouseEvent event) { - multimedia.stopSound(); + Multimedia.stopSound(); gameWindow.startChallenge(); } diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java index 7019bc0..ad81aba 100644 --- a/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java +++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java @@ -13,7 +13,7 @@ public class Multimedia { private static MediaPlayer mediaPlayer; private static MediaPlayer backgroundPlayer; - public void playBackgroundMusic(String music, boolean toLoop) { + public static void playBackgroundMusic(String music, boolean toLoop) { String toPlay = Multimedia.class.getResource("/music/" + music).toExternalForm(); try{ Media play = new Media(toPlay); @@ -30,7 +30,7 @@ public class Multimedia { } } - public void playSound(String sound) { + public static void playSound(String sound) { String toPlay = Multimedia.class.getResource("/sounds/" + sound).toExternalForm(); try{ @@ -45,8 +45,13 @@ public class Multimedia { } } - public void stopSound() { - backgroundPlayer.stop(); + public static void stopSound() { + if (mediaPlayer != null) { + mediaPlayer.stop(); + } + if (backgroundPlayer != null) { + backgroundPlayer.stop(); + } } public static MediaPlayer getBackgroundPlayer() { diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/component/GameBlock.class b/tetrecs/target/classes/uk/ac/soton/comp1206/component/GameBlock.class index 7c9c377343b37d114af6e8c5f0f596739e75fa20..191944d061dfb8e127c3714cc9e7ba0b0dea72d2 100644 GIT binary patch delta 2200 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 delta 1665 zcmaE-dP$M%)W2Q(7#J9A8Ln;Q+Q=-x$q>X4%+3(P!w||4#>gNs`5}wM<T_T(ya*nK zNCr1X2KM6A61U8p94-bQhG-s!7={2w29C7MoSdN4<PwnXI39+0kXBYFA4g|zkg`M` zh9r<y&f?UP;F6;J>{O6w3J*gnNHbS4SO}z@i@}&7orfWVA#<_-n=yAbLk>GbE)PQ< zL;hqxwp_MC9)==@;>icu^y`BdN_iN{K-O@F1UdQz2RH_~`h|e3ui#;*1c`IFxVi=e zc=~yR1gm)%YCwX_L9Q+!ejN`(J&4cdALQug?g|oW<Y8z63q`v6`1pr|gj#qQT0uhG z5Fz&<S64rfcsox$LkCEL#mCbZthtMap&KN?3Rlz1!_Ws3;dF5f@`j5};9-~u66FPn zhJ*$MhWdL3gH4#s!!QLT!wqtFuy>@BPbgS?8V|#CkT{EDV5lR=@|ipgvlyJh7#X-g zBEF76o_=73b9fl$f)&Da&gWrR021Kwb#?I!^$iFO3h)7|T*Sk$m?3Pl0Y@y;<i%Wv z`HpZg9A!Ah&TyQE;RM6U%_ZC{jEtuz-{ml#yoN_k`79R$FT*(=hE)u!1sGN{GVplj z<)s!m=Oh*vrxvp_Tw-KUoh;8IJDH1@i{%O<gB+M+$}7$ciYk9zN7f|_j0{UBPvwnr zU&g?|V8p<~z`)?ez{23bAi&_wAj;swAkE;*pvd6IpvK_Opv@4(V8{^6V9pT6V9gN8 z;K2~Zu$+N`!H$8Afq}u3VFkm=$!2`!^{W_GGcYkMWnf@PW?*DsVPIfj)!N3Oy^(=| zftdkh5f=j!SdxVy1#Ey8L=ngU1`uFnSi`WEff1yUVI9MIuxeI@4GilUm>EE(@Id9( zFl=IAWZ2BWz`(??g@KVlmw}Cek%4jP<hOiA^&pFczy@bCa53aC2r}d|C@>U)Erb}L z2(@r40|NsK1Ct;h0~6RUj9|BSF>rz{w$s|i;O?W%$EUT0K}>54gVZ(#Z|zMCf!i3u zQ3Rv3H!;L+V@QAs)<cvggWSsm_O%=XI|BnlIRh(06@xHCErS$89fJl#BZEFe6N4>7 zGuUBb5G$b$V`Z>p*v7D(fsuiU!Ii-c6j=-m43ii*8JHOu7;Hce^VLCdn2z=~hH$V@ zJ<PFDIuLh(MPY&%&gx=dW$0xPW|+Vr!7!0QjbRFdF2hs?YldlHXDL7|ggT3X!G>W6 z!%hZ9237`humhPG7#VgkSVJAC4~hg+Q0!@KVUS$|jvi2KfFg&1VJ_H2NDQz-O=M)) z4beT>QBX`Bp>`=&wR@my>jWjiu?#VHEs|OexVae&nb5Qt%)kT=Tu!Ym3_RM~7}7v7 zgPb0>GH@_#0~-Q~1x~0T3=EtMd%@`uqyyq`kO(O4)k6~BJ_Zhk{ouq0O7+vhsg8l6 zT8MWCL)K=70s(=&3_+31n;1%hBUv^vlm|z$Zepkkj%3@!P#YY{zKNkBIFe%%LvwJX z0NW;pw%|ws_Du|(!I1(Sn;3e6BLz4&G4uyV3UF;=m=qi-z`coKYH*|g&nAW$!I6;y zyqg$i2S*C<ZDN=g94WxRiD6;zW(IqZQyIa@4wBi#7&sWD8JHOkfMeqz!yyI+29Q?{ dGcYrpVmQNap5X!m0|OTWBf~|8%M4c;BmrA=J`ex^ diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class index 7e03052f6beac83c683a6cc7985ca105d8c325b4..54142e5420e92cd5cec8ffadb11a9b80935bf8b5 100644 GIT binary patch literal 6194 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 literal 6340 zcmX^0Z`VEs1_oP3aV`cX24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3Va(ro?2Wc}j&lKedV<ow(MLn8w-{q)4#RDJiv z+*C#e&Z5-Z#LT>u)FMU(Mo*A#J{|^skXDxD{G4KtfFKWp5Llonzr2{8L4=V(8{~+z z3jL(i#Jpntf};F_)S{9~{ou^pf}B*(ypq)P)S>{WC>Mh;gBZy1;*1O|8lDgrO7bvB zF-S8quofrh7o{>X==zXgqBY1-vOElO4DyT&tU0M=sX2@c>Nre5a}8LpA`gQSL~mwU zD%guEJPfKJ5w6_QoRZ9foXpfBb_R7u26e2#S6Y&plUY)!?+a3#o0^iD$i<+>zzlMh z77v3qgAOAD#2~O7BZH<7k;YiFGw9)uv!cutE(To&15kh(GBU7gctS(en1{iH!IY7K zCA}y!g^@u4yOofLFUm{-hl4o}g9U>nBLiDbetJ460Vw+97p3bb79=KTr0RnNGxO3x zv`Ln}4_Jvc2ZJ>u18;CiVo^zEUb+IvJZ=VC20L~JdmaV{21iB)c>+c-GO%RkrR6g+ zh-!eN43d_EONuh{(ycYaxEMGXoOu{rKxv&1l&&)qb25ulL5Y=v!HtnY&@(Ty1S|%# zAEd*BhryG<i;;n=xFE4SFCa5DIhBz?T?0qJgIo<x{$PdRpzz^g@MZ90WZ+3IEh<XQ zD*?+eGN|GU#>CuIurg~dh5&{@c7`AxhG2#eMg|S6u?@<6`FW{%C19JKa`Kb2L9vxu z5&_P*o*+ZQco@P#Ca|QZmPB$eL^3kSgB2<y=VT^lr=}<*mMByx*eX=lDkxNfX)cCn zh8T8+SRRHrhImE>K~Oe=geWxOGcvH3CFYc-`lm56h-r9gB853rg*7Mw6G5?;#K>TY zB~p;IK#Ck|Oc7AT=`y77Fr+f1F*0x#<Rn&t!-kPTOM|E|^z_t>0>xwo4?`v>?zs}v zN>Yo!W`KmVc^Gm)!kl@j6_ChbXUKz<hM@eYAC#DvlAp`PkjuafA_{pJiWrI+8Q4J@ zJo8E*g^#BY0|P@T4?`J4IU|F3Zen(-bADcOVo7*rNrrQNUU5lcUP&=1X`%!aG;wk< zR5DbtGgR|1)G*XCGALt>X4JIB$iSUkl$uxqNhpjA8lV^;LZ3A|Lp>vdFgP~BzH=-p zO04wBEH2?<r~`RWm!XM=p&67`*wa%>obz*vLB&EV4?`PFEGWMmEY`up(8<un$iSSQ zS^_OFJVA!^@G$f;^f59pC#Ix;e2gVdqd@8=@Gwkdn8e7yky(;jlvt8q1WHHHWCV7a zCsf>;n_&vWRCb1GJPgwrW-u}cAzTkr!pOj$kyz}PT2TT{^HCrjvv?S0Gt6ORU;#xG zBZG(r)NG_G&Ki`;=kYMi2l<U7Gp{5Jl%hc%UdY3+h+#1!19LIRb8H%(pyCiz<17XF zIt1kY<va{4K>ApUGpka$7*;VXWoKB;$e;>x9cC2<%@c^qi-Tb;55qbJaYhD?;?$C0 zP<6%0uz_JCJHsX(hRqCHU}+HS+~CUMlGI#A2Il<I5=I75NRVdc>jxBN=9L7O6s0ES zS_?5SGHe5-!0n)b^u(Ufb~5Z@XV}fdum@D4LXrWhF^mlC1t3Fn@<6#`9}mNRm=k?K z^&tntK}H7Apw!&_GEgxIs<`!&^K(jb^NKkb4l^=vCg-Fk7U`8ImVs)nqdW}9Ko)_s zZE${RUJA(26FdwjL5A`cr<Q<gI&ifp#K6Q*3JT#fpr98QVqj({<zP6^$iNA%h#^L< zVmKqjzygxE%*Y@Tlv<ox0<JC)wJR6HRfcQq4A*%WZZO<rWKhOeY4|4QC4#Fb&h*q0 zNIk^JV1iswIp-u67h7xk;4>vXwaA*0fyFsLC6$qZ-zPIK)vq)+DYYmhF)1gNkwM5O zKRGccEU_pP#D@y9lw@QU6R1oRb5pHB4H;0C$jHEx1S;5_A;mQ#gD#H34@+fWtr^D1 zzzHfoz(qbIgBJF36Ps2>2F40T2F6N82DXBn#N^ZzMh3<xNIjjL?VDHt^G;D>UJA&o zptP?K&b*LP6XXGKEy2jZl2)3N!^pq^qCmw8JQ;(P!;2wns1i^q!^ps!SDNcyl$io{ zc`+jcM_y_<IIA!+@Z_bI2O*l6VyMAfS&#~Kn-(OqpxR;s5d`NgXwI~@vu0!fm3bih z7#WoC*YTj14kH5xDBXav1tWtdw0I$y^Fba2X#=$oAtpdQ#G8(s9U#Sm4^)*+at^4; zV#mn96`WsMl$`382})a>pw^2XD9{-h1f25oONvX15(|7&OEU6Piuu_XnYb948ClpF zS$P=B7}*#ZR6t50wRmP;S$=k^KBNYM)KzYY$tC$km5dBCkh1_(A;eIR#JrT8)M6E% z{QT_F0_5r%Vi2+jipG%2f>dNlsPbr}cz`wmkV|Q(5zdJ@Il-AFsn#5f9E=Q-!JwuX zsPriSHOCb4(-go-Oo5Suk&BT*4mn*Y*eWn8z&j!!9tR^2BLg2e$Q3e+74q`SLHhU@ z8ALtvKs9PH$Y5}Zqfn9$k`iEKkV29|lr&&@Mg|_wyu8#Ra6yq;%+4qbtpQL%8C&47 zGm0`Y$YDeXic&@fHb_V_C^B#`FflMNa5G4On$`>q3?iVu6PV^_-~rPn45kbW3{0T* zCYY9DkOtFo4Dw)F2}-MiX(3R50xZrA)-TM!$iT{A$iT>Oi-CdR5Cba%GXn!djMjDr zMlI&84D4FcTN!w@WVSL0XzgYYj%41>Ai9-70*NgHX0w6C6~Js3Fk4w`H-lQ_b_R{D z44PWI8FVA1WwtZuZ)Gsr2)6w;0|SE|12+Q$gE<2Wg8>64g9QU0gC&D7gEfOZgAIc= zgDrzOgB^o2g9C#fgEK=kgA2nQ1_lNNi2E4sGTdVTff!Kdl7SKAW^l+bF)%XRXJCW+ z$B_ZVXJFvp#9$_5wUfbyi9u@{gA>9Dd|>0e7`Pa`8Tc4{z*g{pjpK(}!3gR*K#g;S z8Yc`g&J|*u);0$Btqk7iMg}o(F$6ORF@zu)DGWFA0mDP6ky{y97+4t?7%a87G5FhR zZ(|6x0~sD6vx6Z@b_YY$PKE>)2CXd&Mp|1Kyk%s!F(jL@h_cLN;MUs4kgm0jAq!+N zGXp3%l^8g{!NAH8%fQ8uz#zkr$e_)T#9+XX%wWQh!eGIW26l`I#6qZJ7#J)W9x*&- z03`zxh9?X>3``7M4EhXD8F(0&8MGPr7@jdaXJBD?!N9=4!NB;B!Ge*Ik%1A^KZ1H8 zkAWE+iYmJqawE4h<ojp~@NZ)%u-(L9Cc~1ji=l*p0UT5^I~Xc9z#|`2p))XKGH@_t zG4L~FGsrXKfL#ZPU=^tAI2dFYUNXF5U}WHD5M_7`b{!+A=?=Bq92z5>S{U&F8t7nP zC}7}VC<Ge}iB?Xi!Hl480mKmImkcZn><kQyuXi)lMQ&$k@PX34%yzP%px?&OxQM}? z#f*j7j8&8sBGR&mK@!B06=mJV&_0WSjoFN)g_Uvn|A(O1;n4=g-8P2q@D^sq<^T5( zVUQ@REH;C5&<)bw#?WuYBFVCoVKO7bOa^xlYbGPZ0fy*p40Fv`na$Wl*+32hJ6a9I z5@i)-+s4p7lR*f^W8TKFpoN*Sg^h9f|0~P?Z`C2)Og6B;VP>+4vZ9-*wS_@q8^aRq zZ4AqFwlOSAkj)U_%Fx=vpuCM?Wk!M-i<T(MHik7&Rf5bf3d~qHF{}p%FZ(Wrtqcs? z7<NE-ix?!dw6-wFY-3o-lCX_oFSuM<&cLZ9%DR<-9b~~Q1}=~tGa1xCdFKE)wP|f( z&=fkfjo}DLFUV4m-s8&|IJ8){F&qcw8WwP_ImTefz`#(#z`;<;Aiz+?Aj?qApukYW zpwCdtV8c+yV9!v);L6a*;Kk6y5X?};5XsQVkjBu(kjc=^P{Gi{(8|!u(818n(8n-= zVKT!+hB*wK42u}1F)U%2&2X4u4#OpexeN~&<}tisn9uN@VGhGrhD8iN7?v}NGpt}# zV_3;(!mx_bfnhbHGs6l-Plk1jJ`5Wfa~L);7BOsQtY_H5IDug+<4lHajLR6dGp=LU z$+(4K591+*y^LoV_Ay>%*w6Ts;UMEHhQr__zKB79L771boOf9n6c~&d-hlJ25Q957 zXEQV8FergptPGiO*=PoLunuO1W6*rh#&DRy2%?Tria{UDVq+9%FaoP%1!WZmNCC{j z_?Y1>!#f5>1_8#~4DT7<F)%SKVRUEs04hBga~SFwJ~HqyurSs$<S=|<;9+28_{_k- zAjZJN0MYpcuJa266S$0tVUYgEAjHm4$Iej4_?JO|kx}{=1M4pa-d_x?e;63ih5j<I zGqN*G`O6^9$f)rXq>$+k11p-yUxq|RMpj-W76wL!uMFQH*`7h40aT7LFo1J3qF@5m z9SjVozyS&=GgzUXWd!w*v1sO9125GenlEA1+{O@sMY909=37`be`olCMY9aLv+rTm z{1dBY1$51iuxkE=RkH-T=4V(n|Hi6W8C~-$teV#`h(rAx%)kV02Z?WDFq7WJa0*(Z zfJzVPZ49SDxtR%^n<4f2I|e?6_Y7hTAHc?fQX2z<I5ZMLEGY(1#4>_9xljudpcW`V zEI5m>KvU=(s1Vu0AS1nv;R3=YNd5Jhfsf$}gE+%i26={WNVX}!ZBt;7gWC27?j2CG z1k|kK)Y`(JfNCtH*80i7!SD;oI9RR4z`)6%1U2p?+_-Y6<29vO<}-*ud~gx!gXIjo zpfd3itV~pfSqEt|h=JPze;HUA{xOI#GB7AGGBIc{G9y{73HOO6gDTi+P)mS?fk_NB zKK&Qo)KUbuniv>3g*bLFT-nTE1_~-haHK#og)jp%!#{9F`44KYF(@#wf*KNx>|l}; cOmc%sUNFheD9FITz{SAGD8wkjD8?WO0JLTT^#A|> diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/GamePiece.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/GamePiece.class index 8590c34d155c9dc7b40da0d08787509f20795464..ddf9544daf0af815a0ae54f0b67fcb34868d21c6 100644 GIT binary patch delta 286 zcmdlYw?%G)B3Hc{gAaoyLpy^O!(;}1hI0%C47V6e8ATb)7!?_;8Dki17&90g85c7+ zF|KEDXMDxr!T6oQm&u61kI9}Pn5l{(gsGh&lIajb6w`TzcxEn!1ZHuDROTRtH0F4Q zZ01=EIn2u$3Yi}<6fwVNC}+`Ps9-T?sAVZ)sAH*TXl4l9ynu_Jk+YY9m7$-3i($g# z9o*A3XECra%x2(Zn8U!wFqc7?VF80I!$JlvhD8kK42v1;85T0QGAv;5W>_}4f@ccj z+R41UHjG;*d+~bm?qy(S*vG)lu$MuQ;lShtyw7xxF$gjoXOLq!!Jy4>lEH%EG=nR{ p8HON+vkdVJ=NWPsE-+LwTx4itxXjSaaAoplJ~zfYlYjA90RTk@M;HJA delta 286 zcmdlYw?%G)B3HdCgAaoSLpy^e!(;|MhI0)147V6e7)2RO85J3<7-JZ$88a9h7#A}* zGOlNEV|>Nn&iI|dhslV+m&u+Xh^dMpn5ms1g6R-LB-43@IA$(}cxG{i6y_j?ROWbw zEaq7Z+04rs3YZ@;6f(bOC}YuLC}%Nes9`B$sAZ{VXkrN5ynu_Jk+X+^m7$M;i=lt= z4({oiGZ|PIW-)Lw%x2(Yn8P5<FrPt|VF7~{!$JmghD8ka3=0@s8Rj#1Gc284!83(% z&17C)8^$e@y?8x&_b{+C>}B9)*ux;muz&Ib-e<Z;83Y-QF~~6-XV7Li!C=8~iouoP oG(!->8HRX<a|}5Q=NT#)E-<t)Tw>^ExIB3?pBv-t$-nrl03cdM*8l(j diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/Grid.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/Grid.class index 2db3128f7f1a99970c6eb3b5f28bc952ebf73173..002e059f2affcc6dc3522671f50858fd1a9f5865 100644 GIT binary patch delta 1341 zcmew=`dp0b)W2Q(7#J9A8Ok<t1u)5RFjz7&aHJ(>=IE6tmT@syGuW^**zz#gF_<$l zs87yk6xAp#$;`<tsnqu^%_+&uO-;#6WMtqh$VsdW&M(bN;bP!maNuEZWN@0C!epoI z!pI;Mkdv64nU}7Rl#`#Ft&muvP+?VFt59iGUCYJb#^BD*;K9S-$>25lER!{x4-bPG zgYRTMW*b!w27idb$*B;xa4-b&Fvu_jF*2}eczSwjhOsk*Oio~y<qKm7XJ?4uVTfdi zVq{RBe34mZ^K#}%jEs4ctyoK0qZt?(VkU244G)fGU|`T<;9_84&}Lv^&|%<Y&}HCb zFkp~iFlLZvFk#SOFlDf0Fk!G~FlKONuwaN|U|=v|U}aEZkY$Kx;9+24kYdngNMPV$ zU}j)oaAQbhNSYkSCeD~Vxr|MLJ%u3^Y|~sesd|u2Yz&MH3=EE7Qxw2DI6*oXK!6i$ z9!Q=OY#tK>BgkhU{R|8Ykqk@>EDQ_`yjoirgrtpRjAXYlNNr?bU|?bZ8O+7N#K6Gd z&A`Lp12$X>q8M&CFM~43wII`Zp{6r1@G_)<-Ob1#&!7#mXL2OF2H2f^V7G-c@GwL$ z@G?ZfjpSuuVn}Dm0L${j4d;iuoF8g-G6Mqx8v~;cJA)zvBPilQrZX@wg2I@Cfq@}i zdmDqY6^jf@imfb5iXF2Vt0=1^%f3Yn{>=4eY@%$EETXJN`xY@+gBhZ1dS>jR?6Vly zmNO`8iL%Nhh_cBhY-7-z$sn?cK}X17Cxa0agOJ4z1}o+@Eo_X-{~u^!WnBJ$J<A#f z1_owu09i5cF)%R1Gq5ovFmN#>GVn1ZGe|O|FsL)6G8i(XF<3IBGk7p$Fa*^zWHN*^ zWHCfCq%g!YBr~Kk<bk~(#K6H|$e;lZGIj<T24}EW*%$;FLcrc<1$he|B<T#93|ZjF zPG`tw-~q=@IztXPxY-yI8FCr&7+4rU!6e1N_Lo7Bogts`4+9tD9|jj0#$OEbzZh75 zF|aZ)G88a4LBr0LfrSASb`@IMGP2tk>}N5sGOq!7-&tk{gRATg2G^Yo-Yg74emfYf zCYx}&)dzrs;u1J04q^mF5d#lH34<I%DT6XY8G|N6IfE`k1%n|&6@v{!HG>yJ4MPY+ zEkg`L9YYpFHA4YI6+;<ABRnKR7{s6<Vb5R)4G9wlCwNFyFeF+tB!QAOLj^o2D&Rp; z0SyXG27jcWkY-@#`OBcr&X7OZfJ?N#kU;_Bbq0L~MsQfNYHeX)2gNBQ(L-`mC)iOu z5CzZ(U}Px5s+kvE^F%C~IT(sTiPw-JhJgW`enH;g6bjzK5W1N`2bAX+!AS~Yy%+-{ KLkTz^mI46hm&Y9d delta 1242 zcmaDZ_EnVY)W2Q(7#J9A8FDvr1u$`OF>o+g@-SF2SWn){WT$P*$RHJvlbD>Dm#&bM zlb@WekXWKnVO3qLP-#_N%f(>N;K0t{$iv{o;5=E5*_zFjhrx`&ZE`%bjTp!z4;}^? z22Vx?HVsctPt7oP2JguSm}U8V8T{B8{COAx7y=m?lqVaq$ZTe3nZ(GLI(ZgrDQge| zBSY|H5w`H)5C#SYEe0+y$-<z`z{#M)z{jA^Ai-e7AkSdTpuu3mV98+2V9#L0;L2dm z5X!*7V8X!4pu`}{5XQj6z``KKpv@4@z{9}Iz`)?f5Wx^Rc^{iNW7OnpYzpkr3^8Dv z{<2BcgKT1BU}RumZ~&X40M@|?(!l@%oM7`n@|<Avm>3vAJ_G4zU|@)3U}9ilU|`_Y z+QJ|tZ6sqPyNy9=BLf2i69dR#E(RtB1_mz%9tLl);aU*IaKm{SltHcqna&F}oq>Uu zAr|azMh1BXZIC^acd~1M-N^@b8%Reu1201)+(=#qCWbhMc(5!#+;D!l%lV;ZM=>xk zurV<Durnw!FoI$lWI6)_qY?uP0|x^GLz4D324yQ28I}}VS(X$#W;0e%R!Nq9ix|9^ z>&@6i*(6y+S&jBBVlV?UMA`Jr*hSfAF|aLXkkb-nl}Qj~lTFyhpgEI)e-nd_kikv{ zBPIssH7#t6%l{v3VP#zYe+$bR1_lOZaM+kJ@G>wk#4)fj#4~U)BrxzXBr!-bBr~Wp zq%asVq%v4Cq%n9fq%#CDWH5v<)F(4UF(ff0Fyw%J9mK%FV91~h4k>m983sGB57`(5 z8T`S%W(D~M9ugpZiQqU+Vn|}(0Y^#_Lozs&*%)FNQW#PhSQtQ|BgMe>mqC!7A&v15 z0~g~T1{ua*3{t-sSbv!@ure?*q%&AUgUkdPWW`$AGP2tkEM_sVGOq#o+D2vvgPrUS z2D_aME-Va_7je4PyMsgE5;z17VuU~e0}n$HgB(LKg9<|lg9bw>gAPMEgE>P5gDXQN zgFizRLpVb<Ln=cBLpDP>Lm@*QJOKO|#GnCS#b5{x0DT50cmNbb0w9=yfuWcofdLW% z#qba)hK7I&gFjLTNHehW{AEx=4FX<J5P(A<gFyil0+aV~iGh<OB<r++-NXY9VpfQ) z42%q!5VZ^p4EhX=5IL<a47{Ku0LdN@&3#xjb1-CqQYr(;?Vz*@&WS=^I~aU6Gw6Ww X7b8Q62qZN#FffQRFfwF=GhGe<Hq)(( diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class index d3b846bf114e63d4cac1d643ca442a651e0a42dc..db3f11b372bf64a21aa8eddfd74d0f4317da0970 100644 GIT binary patch delta 4004 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 delta 2952 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 L6Qc{G8-pYOQbDkL diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class index 71d171fc0b09428b00659938d81a5d448b8b49c5..ab27c55069861c8e139ae82305e1f07cad2366a0 100644 GIT binary patch delta 808 zcmdm`cv*q#)W2Q(7#J9A86Iuqa$=X}V3^6sz>%ApSE`p=V9doZn_&(+!(1MQc?|O> z`?G6JzR7NAKbv7855pn`dqxJ%;*$J=;QZ3O6fOoGh9x`<OF^Q1#U+VFCC(X%IXS6$ z>8V@{%NbU%GpyucSjDiKkwJNKKZnfbR1PO5z7t#wCmBw$Go0pOP-ZwYc`Mfu`E!g6 zTu!B#IVqWW=?aYeYz!B;7%nngVrRI_!*GS+>gE~TER2lTC(q@PRldo^z`<~fhhaa% z0Re^sj0`-Ud3mWt&N+$2#i_;Y4EGorR3|^=Qe|Ujc)-XYH~Ar#++;OgAyGyKDF$u^ z9tH*mRt81}Rt7c(Mus($LwOZl*D^3L@G&qmFfd3nurkOn@H5CVtYctc5My9sU|<kn zSkJJ50R#jXG#RuQ7#SEDHZs_QbTcq8flT6HU|>|;yqi~!v0i8f%MONF8yOfFm>59D z7BR>$Ffgbvh%l%z=rU+9m@;TGI5KE4_%diSL^9|wq%-I-<TL0qR52JbG%*-6bTgPR zOlB};n9X3uu$;k?VH1ND!+r*9hSLnT3|AQJ8SXPUFuY-KWcbeD#K^+n!pOtm$|%g> z&M3j)!6?VzRnMrx;0<<r5Chm%P`8^hd|=qbu$h68A)jFz!xo0E3``7742v1IF>GgG zX6R;^#jt~6Cj$$^CWc~$T@1S!SQ)M`1TySl*v`PlaG$}AVK2jO26hHUhJ7%9GiWm~ zFff8J!mn%$jP(o*48dUgc_6Y-`<XzI1qm?*cLqjqxN`4cSfI6qL46y;VuTrxXozB9 zW{76sVu%471&Ic3s8I|I+zba94lyt?a4;N(J4X?09fL0erx3>uhGm->*g<A8g5v-b z(F_bC49pBi!0~dF;TQu0gAfA~!*K>ihO-Rk8JHQaG2CFd&2Wc-fq{#Gk>M`GeTIh& Fk^ru+pd0`I delta 912 zcmcbtuuGBa)W2Q(7#J9A8J=(Ca$;v=XPC*zpgyrtbaFkrkUST|3<f(+1`dWfJPdOg z<}osG<(B4@Wag%(WF|5)XigSn69cJ}wB}$~z{tRno0?aums?;A(zb|)VKKv!$rITP zZDuem<6&6NV9&_FSzMA|5S(9{m%_!M!?2QvVHHS}uec<!sKhxVF()TAFFlouVGYAt zc7}C44C@&-Z2rfd$i#P+i{Tu@d3J^iJPgVV7boX(9g)Ax$iU@PnwgW5nU}7>$j`=b zm5bpT!*zCs8$1j*8E$P3;AUZTyu-*KuHloFSeBSpp`TionpdLl3L>pF!}wVl?r|}2 zFx=;1IKpsLfZ-@31CM83UTTqZPGWI!YB4**V@3wm$p^W`CvV{5V`FD{%E%xG<+4w{ z$0H=m#304M&A`LJz`z6w90mpkRt81}Rt7c(Muv@(S$P#*H!(0U@G&qmFfhn6urkOo z@H5CWY-V6!5My9sU|<kn*ut=t0R#jXG#RuQ7#SEDwlUa)bTcq8i7>D-a4;}1nrzPI zm1C^e+RZQ{ay!GUtqilZwlK^Vn$NP0Vc|xw-5^`a7-Sh37}OX<7&I7k8MGKo8MGN3 z8FUzY8FU#U8T1&^84MWm84MY!7>pU37)%+u8O#_aGng~XX0Tvb&S1^3iNS_pKZ7m9 zX$E_SD-4bd_ZgfR-Y_^bd}nZBWMOb)tmk2HXB1}eWRzg=Vw7X>Vbo;sWi)2+2YV+7 z;!vn}Od0+&Y-iZPz{rr#aFk&u!!8CUh9-th47(ZjFfcQ8GpuCT%dn4ug<%sz6T^On z0}QMTR~Ql)4l?XvU}Lz?5Xx|f;Q#|W10%y>SWqx%GceRMFfuSOFd{q*3S<U`aIpP6 z5J{;0OrZFL1R{es10y)7`9Wc}jbW+Q76$cg3@Z@EKw>A3ft?|qfsY{pY#bzZ_@Txz zFz_=RV@Ns9z{tSCa02coMX;R=44gt7I~Z1PW?%=I$;beT3y9N17?>GOg5&2D!)XQv p1|bF}hBFL|43`+LFfcRRX1L4nfZ-tn0|OTWBf}$xCk)RRBmosNzbpU% -- GitLab