From e134a15c074477fa8839a9273352df8ac2cd1cc0 Mon Sep 17 00:00:00 2001 From: aalokb <32146639+aalokb@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:08:31 -0700 Subject: [PATCH 01/15] Refactored all code smells listed in the found-issues section --- src/canvas.js | 136 +++++++++++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 57 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 89498c3..5bf2d26 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -7,63 +7,85 @@ var lineColor = consts.GRID_LINE_COLOR; var boxBorderColor = consts.BOX_BORDER_COLOR; +function lineProperties(ctx,p1,p2,color){ + this.ctx = ctx; + this.p1 = p1; + this.p2 = p2; + this.color = color; +} + +function gridProperties(el,gridSize,colCount,rowCount,color1,color2){ + this.el = el; + this.gridSize = gridSize; + this.colCount = colCount; + this.rowCount = rowCount; + this.color1 = color1; + this.color2 = color2; +} + //Draw a single line in canvas context -var drawLine = function(ctx,p1,p2,color){ - ctx.beginPath(); - ctx.moveTo(p1.x,p1.y); - ctx.lineTo(p2.x,p2.y); - - ctx.lineWidth=1; - ctx.strokeStyle= color; - - ctx.stroke(); - ctx.closePath(); -}; +var drawLine = function(lineProps){ + lineProps.ctx.beginPath(); + + var p1 = lineProps.p1; + var p2 = lineProps.p2; + + lineProps.ctx.moveTo(p1.x,p1.y); + lineProps.ctx.lineTo(p2.x,p2.y); + lineProps.ctx.lineWidth = 1; + lineProps.ctx.strokeStyle = color; + + lineProps.ctx.stroke(); + lineProps.ctx.closePath(); +}; //Draw game grids -var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ - - - - var ctx = el.getContext('2d'); - var width = el.width; - var height = el.height; - - ctx.rect(0, 0, width, height); - - var grd = ctx.createLinearGradient(0, 0, 0, height); - grd.addColorStop(0, color1); - grd.addColorStop(1, color2); - ctx.fillStyle = grd; - ctx.fill(); - - - for (var i = 1; i < colCount; i++) { - var x = gridSize*i+0.5; - drawLine(ctx,{x:x,y:0},{x:x,y:height},lineColor); - }; - for (var i = 1; i < rowCount; i++) { - var y = gridSize*i+0.5; - drawLine(ctx,{x:0,y:y},{x:width,y:y},lineColor); - }; +var drawGrids = function(gridProps){ + var ctx = gridProps.el.getContext('2d'); + var width = gridProps.el.width; + var height = gridProps.el.height; + + ctx.rect(0, 0, width, height); + + var grd = ctx.createLinearGradient(0, 0, 0, height); + grd.addColorStop(0, gridProps.color1); + grd.addColorStop(1, gridProps.color2); + ctx.fillStyle = grd; + ctx.fill(); + + var lineProps = lineProperties(ctx, 0, 0, lineColor); + + for (var i = 1; i < gridProps.colCount; i++) { + var x = gridProps.gridSize*i+0.5; + lineProps.p1 = {x:x,y:0}; + lineProps.p2 = {x:x,y:height}; + drawLine(lineProps); + }; + + for (var i = 1; i < gridProps.rowCount; i++) { + var y = gridProps.gridSize*i+0.5; + lineProps.p1 = {x:0,y:y}; + lineProps.p2 = {x:width,y:y}; + drawLine(lineProps); + }; }; //Draw box of shape (shape is the composition of boxes) -var drawBox = function(ctx,color,x,y,gridSize){ - if (y<0){ - return; - } + var drawBox = function(ctx,color,x,y,gridSize){ + if (y<0){ + return; + } - ctx.beginPath(); - ctx.rect(x,y,gridSize,gridSize); - ctx.fillStyle = color; - ctx.fill(); - ctx.strokeStyle= boxBorderColor; - ctx.lineWidth=1; - ctx.stroke(); - ctx.closePath(); -} + ctx.beginPath(); + ctx.rect(x,y,gridSize,gridSize); + ctx.fillStyle = color; + ctx.fill(); + ctx.strokeStyle= boxBorderColor; + ctx.lineWidth=1; + ctx.stroke(); + ctx.closePath(); + } /* Canvas main object, use to draw all games data. @@ -94,9 +116,10 @@ var tetrisCanvas = { //Draw game scene, grids drawScene:function(){ this.clearScene(); - drawGrids(this.scene,this.gridSize, + var gridProps = gridProperties(this.scene,this.gridSize, consts.COLUMN_COUNT,consts.ROW_COUNT, - consts.SCENE_BG_START,consts.SCENE_BG_END); + consts.SCENE_BG_START,consts.SCENE_BG_END); /// + drawGrids(gridProps); }, //Draw game data drawMatrix:function(matrix){ @@ -111,9 +134,10 @@ var tetrisCanvas = { }, //Draw preview data drawPreview:function(){ - drawGrids(this.preview,this.previewGridSize, + var gridProps = gridProperties(this.preview,this.previewGridSize, consts.PREVIEW_COUNT,consts.PREVIEW_COUNT, consts.PREVIEW_BG,consts.PREVIEW_BG); + drawGrids(gridProps); /// }, //Draw acitve shape in game drawShape:function(shape){ @@ -124,8 +148,7 @@ var tetrisCanvas = { var gsize = this.gridSize; for(var i = 0;i Date: Mon, 18 Mar 2019 19:10:39 -0700 Subject: [PATCH 02/15] Restart Button in HTML --- index.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 3ae0174..5ae2e62 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@

Game Over !

Score: 0

Restart

- +
@@ -23,6 +23,9 @@

Level:
1

Score:
0

+ +

Click above to restart game

+
From 828d7b97b00b8ea2b22c45437f31a642c3334532 Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:11:36 -0700 Subject: [PATCH 03/15] Update tetris.js --- dist/tetris.js | 70 +++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/dist/tetris.js b/dist/tetris.js index dd30e84..ff24788 100644 --- a/dist/tetris.js +++ b/dist/tetris.js @@ -13,10 +13,10 @@ var drawLine = function(ctx,p1,p2,color){ ctx.beginPath(); ctx.moveTo(p1.x,p1.y); ctx.lineTo(p2.x,p2.y); - + ctx.lineWidth=1; ctx.strokeStyle= color; - + ctx.stroke(); ctx.closePath(); }; @@ -25,7 +25,7 @@ var drawLine = function(ctx,p1,p2,color){ //Draw game grids var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ - + var ctx = el.getContext('2d'); var width = el.width; @@ -34,11 +34,11 @@ var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ ctx.rect(0, 0, width, height); var grd = ctx.createLinearGradient(0, 0, 0, height); - grd.addColorStop(0, color1); + grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; ctx.fill(); - + for (var i = 1; i < colCount; i++) { var x = gridSize*i+0.5; @@ -81,7 +81,7 @@ var tetrisCanvas = { this.previewGridSize = preview.width / consts.PREVIEW_COUNT; this.drawScene(); - + }, //Clear game canvas @@ -108,7 +108,7 @@ var tetrisCanvas = { drawBox(this.sceneContext,row[j],j*this.gridSize,i*this.gridSize,this.gridSize); } } - } + } }, //Draw preview data drawPreview:function(){ @@ -179,10 +179,10 @@ var rowCount = 20; //previewCount var previewCount = 6; -//scene gradient start color +//scene gradient start color var sceneBgStart = '#8e9ba6'; -//scene gradient end color +//scene gradient end color var sceneBgEnd = '#5c6975'; //preview background color @@ -199,8 +199,8 @@ var boxBorderColor = 'rgba(255,255,255,0.5)'; var defaultInterval = 600; -// Level update interval -var levelInterval = 120 * 1000; +// Level update interval +var levelInterval = 120 * 1000; @@ -285,11 +285,11 @@ var checkFullRows = function(matrix){ } } - return rowNumbers; + return rowNumbers; }; /** - Remove one row from game matrix. + Remove one row from game matrix. copy each previous row data to next row which row number less than row; */ var removeOneRow = function(matrix,row){ @@ -300,9 +300,9 @@ var removeOneRow = function(matrix,row){ matrix[i][j] = matrix[i-1][j]; }else{ matrix[i][j] = 0 ; - } + } } - } + } }; /** Remove rows from game matrix by row numbers. @@ -332,7 +332,7 @@ var checkGameOver = function(matrix){ */ var calcRewards = function(rows){ if (rows&&rows.length>1){ - return Math.pow(2,rows.length - 1)*100; + return Math.pow(2,rows.length - 1)*100; } return 0; }; @@ -372,11 +372,11 @@ function Tetris(id){ Tetris.prototype = { init:function(options){ - + var cfg = this.config = utils.extend(options,defaults); this.interval = consts.DEFAULT_INTERVAL; - - + + views.init(this.id, cfg.maxWidth,cfg.maxHeight); canvas.init(views.scene,views.preview); @@ -416,16 +416,17 @@ Tetris.prototype = { this.currentTime = new Date().getTime(); this.prevTime = this.currentTime; }, + //Game over gamveOver:function(){ }, // All key event handlers _keydownHandler:function(e){ - + var matrix = this.matrix; - if(!e) { + if(!e) { var e = window.event; } if (this.isGameOver||!this.shape){ @@ -435,10 +436,10 @@ Tetris.prototype = { switch(e.keyCode){ case 37:{this.shape.goLeft(matrix);this._draw();} break; - + case 39:{this.shape.goRight(matrix);this._draw();} break; - + case 38:{this.shape.rotate(matrix);this._draw();} break; @@ -458,6 +459,7 @@ Tetris.prototype = { _initEvents:function(){ window.addEventListener('keydown',utils.proxy(this._keydownHandler,this),false); views.btnRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); + views.NewRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); }, // Fire a new random shape @@ -467,10 +469,10 @@ Tetris.prototype = { this._draw(); canvas.drawPreviewShape(this.preparedShape); }, - + // Draw game data _draw:function(){ - canvas.drawScene(); + canvas.drawScene(); canvas.drawShape(this.shape); canvas.drawMatrix(this.matrix); }, @@ -486,7 +488,7 @@ Tetris.prototype = { this._checkLevel(); } if (!this.isGameOver){ - window.requestAnimationFrame(utils.proxy(this._refresh,this)); + window.requestAnimationFrame(utils.proxy(this._refresh,this)); } }, // Update game data @@ -510,7 +512,7 @@ Tetris.prototype = { var rows = checkFullRows(this.matrix); if (rows.length){ removeRows(this.matrix,rows); - + var score = calcScore(rows); var reward = calcRewards(rows); this.score += score + reward; @@ -546,7 +548,7 @@ var COLORS = consts.COLORS; var COLUMN_COUNT = consts.COLUMN_COUNT; /** - Defined all shapes used in Tetris game. + Defined all shapes used in Tetris game. You can add more shapes if you wish. */ @@ -801,7 +803,7 @@ ShapeZR.prototype = { canDown:function(matrix){ return isShapeCanMove(this,matrix,'down'); }, - //Move the shape down + //Move the shape down goDown:function(matrix){ if (isShapeCanMove(this,matrix,'down')){ this.y+=1; @@ -999,6 +1001,7 @@ var rewardInfo = $('rewardInfo'); var reward = $('reward'); var gameOver = $('gameOver'); var btnRestart = $('restart'); +var NewRestart = $('restart_button'); var finalScore = $('finalScore'); @@ -1065,6 +1068,9 @@ var tetrisView = { this.scene = scene; this.preview = preview; this.btnRestart = btnRestart; + + this.NewRestart = NewRestart; + layoutView(this.container,maxW,maxH); this.scene.focus(); @@ -1072,9 +1078,9 @@ var tetrisView = { rewardInfo.className = 'invisible'; }); }, - // Update the score + // Update the score setScore:function(scoreNumber){ - score.innerHTML = scoreNumber; + score.innerHTML = scoreNumber; }, // Update the finnal score setFinalScore:function(scoreNumber){ @@ -1088,7 +1094,7 @@ var tetrisView = { setReward:function(rewardScore){ if (rewardScore>0){ reward.innerHTML = rewardScore; - rewardInfo.className = 'fadeOutUp animated'; + rewardInfo.className = 'fadeOutUp animated'; }else{ rewardInfo.className = 'invisible'; } From a3ca8295dc9d48bca8708c844182e34352469c8a Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:13:56 -0700 Subject: [PATCH 04/15] Pause/Play Button JS --- dist/tetris.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dist/tetris.js b/dist/tetris.js index ff24788..924cea9 100644 --- a/dist/tetris.js +++ b/dist/tetris.js @@ -416,7 +416,19 @@ Tetris.prototype = { this.currentTime = new Date().getTime(); this.prevTime = this.currentTime; }, + //New pause + Newpause:function(){ + if(PlayBool == true){ + this.running = false; + this.currentTime = new Date().getTime(); + this.prevTime = this.currentTime; + PlayBool = false; + } + else{ + start(); + } + }, //Game over gamveOver:function(){ @@ -460,6 +472,8 @@ Tetris.prototype = { window.addEventListener('keydown',utils.proxy(this._keydownHandler,this),false); views.btnRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); views.NewRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); + views.NewPause.addEventListener('click',utils.proxy(this.pause,this),false); + views.NewPlay.addEventListener('click',utils.proxy(this.start,this),false); }, // Fire a new random shape @@ -1002,6 +1016,8 @@ var reward = $('reward'); var gameOver = $('gameOver'); var btnRestart = $('restart'); var NewRestart = $('restart_button'); +var NewPause = $('pause_button'); +var NewPlay = $('play_button'); var finalScore = $('finalScore'); @@ -1068,9 +1084,9 @@ var tetrisView = { this.scene = scene; this.preview = preview; this.btnRestart = btnRestart; - + this.NewPlay = NewPlay; this.NewRestart = NewRestart; - + this.NewPause = NewPause; layoutView(this.container,maxW,maxH); this.scene.focus(); From 9bcd3c83f18a338dd8472e1ad41731317d36fd9c Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:14:19 -0700 Subject: [PATCH 05/15] HTML changes for pause/play button --- index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.html b/index.html index 5ae2e62..e16ba6f 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,8 @@

Level:
1

Score:
0

+ +

Click above to restart game

From efd99b7b9b54572c3a464f2ffe0e2c34ad52d9e6 Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:15:17 -0700 Subject: [PATCH 06/15] Images for File --- PlayButton.png | Bin 0 -> 38110 bytes pause.png | Bin 0 -> 4051 bytes restart.png | Bin 0 -> 27700 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 PlayButton.png create mode 100644 pause.png create mode 100644 restart.png diff --git a/PlayButton.png b/PlayButton.png new file mode 100644 index 0000000000000000000000000000000000000000..602cd080e961f87103fda257c5893ec781b35c00 GIT binary patch literal 38110 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 literal 0 HcmV?d00001 diff --git a/pause.png b/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..1f82daa621ce4936ad094ac25dc763bdf58534a2 GIT binary patch literal 4051 zcmeHKdo+~m8fOe+Oj1oL5p~*OyM)}5qN1a67s*z%T^hM;b>!BR*}ABL-2K}t$Wao=8BHz_F;fG8<>8Sr>f@IwMy3?a0_RP3{W`$$PDTH~PEXVuj=Bo_O%W@Y7-pf#J9lp1y44h90T*D9+;77WjPPFq7M3>jPc8!v_9-`~15(l`8MLe% zMjoqxTe4IM>zdLqI6XT%J2Tvz@zc@`zdZPTTqOM1a`*TKRWe_cw?*2nMtomi_SD?< zmFmx+)Ft@JmUXtD+BdCv*RSa!9??}~_N=k|oQGOoWgnF8`+gL+alRMt6ng#V;x{r+ z<<@Qyt}yi`7#}%z?cm?i&g9CeF;~ni9WW~<$|=u%+#{7M zmQBR$KFL}cbrW5`qo8)+Sfi5u$f+a+L-zC$=YgM9QYHT|Iy*3SLFZn*$Fk)%AEsxf zUL?O9qK0eMCCw#CNi9*{XS>TihBM9)MSBxeFemKG)n3x-_HSeBr?@IyFs$2Lnji0y z(|Td|k11aJ*=X(EVXU&_EB^Y5OH8RY51epqt|7xJ0q56wF|2PD+HDhk?&3|cURuOv zPwe1_R8wxNTqn#vV2#e)(ep5yfBk4X&AnrC)TlkkWH6X!+mXOj6$k{^?&!Ie_Xzag z9E-4bOx5n3j4fpan}z`Y>sF0X+;|i*x2DJ6>q#kRjBnlEnV6V3o=o3Zc#mv-5GUf9~X@uB0O;OU~Nnw#jLiIBnAi{g}q>Qbo-ZZ>`#9=x@;+*K+7~ZI{G2zQS13FuD;v*pgn` zrGii2?vJ`ja5y@373+{~6i;*fbbf5($E+MgNkjZpNz$1N1;&aAr~?Ft_4sFy1-=Q* zS&k2~i{0|y6`~|zt5`+h5uKf3oi*aj6TQt5b;6#Z)IhDQGjo<*d?){`zLw~U(I5ZL zEvhF8Mj}MNe>%w|c3WP@ZkJdQR*o{;N(Kf7{Oubi1#p04JU$Y@CKa_@m?N}iNUH$%3-mZbB8emCH6iTYRqD2`k^So>C3=W8M?KdVN6-| zmgG8S6<*M$IXRyWCHf6<-GnE&w>)P?X5Z;33?b zHxsv*&bkD+Cn`RQe(pt57YSedc>Vr&9FKQ++X#p*~GDp!2Pwr z(vjWrTS;Y@o#_E9cZ zGQQe{q`;d>oOh~ zG)%(-l1?-bKEvAL=p;CO4=>Wq29EC^ zxdCB1G~iR+E!LEhud}xRrode{%4)@YyXDWtMNYE(H zwUUwm1s=HBVK)VZ2$L;vX7RM+qtyRyNO-9kfC~KmhGR2G`ynF*o8suJ90Hgatsvw+bO{=_furt`yt2WS z>YWN`;EzZx;N6X?2iL6ZtJv3BM*qBJX)@Dm`xkFnIiWY_*3a!d{XZ*I9B19CGM{iL zZBw&Zob|J9ql)Q zjppO`=@g2_XQx94`Jqkd_k(M%HFgaT0T;vf*N$6+ewX!yapl7O??z@$hfTX^+b2md YThS7#3roFg;qTGDJx;cdb{{?W2NT6WWdHyG literal 0 HcmV?d00001 diff --git a/restart.png b/restart.png new file mode 100644 index 0000000000000000000000000000000000000000..04b87688ecb3404d11828c1d06f7fea156393e77 GIT binary patch literal 27700 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 F{{w}!*}DJ$ literal 0 HcmV?d00001 From 29f6a1b3c56a18c7c1e75c35cc0604be87ea46b8 Mon Sep 17 00:00:00 2001 From: kramerje <32287763+kramerje@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:15:33 -0700 Subject: [PATCH 07/15] Update Information Added info button and modal window information. --- index.html | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 3ae0174..1406f1e 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@

Game Over !

Score: 0

Restart

- +
@@ -23,10 +23,38 @@

Level:
1

Score:
0

+
+
+ + + From 3e83d5c7ba2ae90d38b7b5e6f87c6df524138636 Mon Sep 17 00:00:00 2001 From: kramerje <32287763+kramerje@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:16:24 -0700 Subject: [PATCH 08/15] Update tetris.js Added functionality for the info button and close modal button. --- dist/tetris.js | 98 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 32 deletions(-) diff --git a/dist/tetris.js b/dist/tetris.js index dd30e84..d9b3b74 100644 --- a/dist/tetris.js +++ b/dist/tetris.js @@ -13,10 +13,10 @@ var drawLine = function(ctx,p1,p2,color){ ctx.beginPath(); ctx.moveTo(p1.x,p1.y); ctx.lineTo(p2.x,p2.y); - + ctx.lineWidth=1; ctx.strokeStyle= color; - + ctx.stroke(); ctx.closePath(); }; @@ -25,7 +25,7 @@ var drawLine = function(ctx,p1,p2,color){ //Draw game grids var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ - + var ctx = el.getContext('2d'); var width = el.width; @@ -34,11 +34,11 @@ var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ ctx.rect(0, 0, width, height); var grd = ctx.createLinearGradient(0, 0, 0, height); - grd.addColorStop(0, color1); + grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; ctx.fill(); - + for (var i = 1; i < colCount; i++) { var x = gridSize*i+0.5; @@ -81,7 +81,7 @@ var tetrisCanvas = { this.previewGridSize = preview.width / consts.PREVIEW_COUNT; this.drawScene(); - + }, //Clear game canvas @@ -108,7 +108,7 @@ var tetrisCanvas = { drawBox(this.sceneContext,row[j],j*this.gridSize,i*this.gridSize,this.gridSize); } } - } + } }, //Draw preview data drawPreview:function(){ @@ -179,10 +179,10 @@ var rowCount = 20; //previewCount var previewCount = 6; -//scene gradient start color +//scene gradient start color var sceneBgStart = '#8e9ba6'; -//scene gradient end color +//scene gradient end color var sceneBgEnd = '#5c6975'; //preview background color @@ -199,8 +199,8 @@ var boxBorderColor = 'rgba(255,255,255,0.5)'; var defaultInterval = 600; -// Level update interval -var levelInterval = 120 * 1000; +// Level update interval +var levelInterval = 120 * 1000; @@ -285,11 +285,11 @@ var checkFullRows = function(matrix){ } } - return rowNumbers; + return rowNumbers; }; /** - Remove one row from game matrix. + Remove one row from game matrix. copy each previous row data to next row which row number less than row; */ var removeOneRow = function(matrix,row){ @@ -300,9 +300,9 @@ var removeOneRow = function(matrix,row){ matrix[i][j] = matrix[i-1][j]; }else{ matrix[i][j] = 0 ; - } + } } - } + } }; /** Remove rows from game matrix by row numbers. @@ -332,7 +332,7 @@ var checkGameOver = function(matrix){ */ var calcRewards = function(rows){ if (rows&&rows.length>1){ - return Math.pow(2,rows.length - 1)*100; + return Math.pow(2,rows.length - 1)*100; } return 0; }; @@ -372,11 +372,11 @@ function Tetris(id){ Tetris.prototype = { init:function(options){ - + var cfg = this.config = utils.extend(options,defaults); this.interval = consts.DEFAULT_INTERVAL; - - + + views.init(this.id, cfg.maxWidth,cfg.maxHeight); canvas.init(views.scene,views.preview); @@ -422,10 +422,10 @@ Tetris.prototype = { }, // All key event handlers _keydownHandler:function(e){ - + var matrix = this.matrix; - if(!e) { + if(!e) { var e = window.event; } if (this.isGameOver||!this.shape){ @@ -435,10 +435,10 @@ Tetris.prototype = { switch(e.keyCode){ case 37:{this.shape.goLeft(matrix);this._draw();} break; - + case 39:{this.shape.goRight(matrix);this._draw();} break; - + case 38:{this.shape.rotate(matrix);this._draw();} break; @@ -467,10 +467,10 @@ Tetris.prototype = { this._draw(); canvas.drawPreviewShape(this.preparedShape); }, - + // Draw game data _draw:function(){ - canvas.drawScene(); + canvas.drawScene(); canvas.drawShape(this.shape); canvas.drawMatrix(this.matrix); }, @@ -486,7 +486,7 @@ Tetris.prototype = { this._checkLevel(); } if (!this.isGameOver){ - window.requestAnimationFrame(utils.proxy(this._refresh,this)); + window.requestAnimationFrame(utils.proxy(this._refresh,this)); } }, // Update game data @@ -510,7 +510,7 @@ Tetris.prototype = { var rows = checkFullRows(this.matrix); if (rows.length){ removeRows(this.matrix,rows); - + var score = calcScore(rows); var reward = calcRewards(rows); this.score += score + reward; @@ -546,7 +546,7 @@ var COLORS = consts.COLORS; var COLUMN_COUNT = consts.COLUMN_COUNT; /** - Defined all shapes used in Tetris game. + Defined all shapes used in Tetris game. You can add more shapes if you wish. */ @@ -801,7 +801,7 @@ ShapeZR.prototype = { canDown:function(matrix){ return isShapeCanMove(this,matrix,'down'); }, - //Move the shape down + //Move the shape down goDown:function(matrix){ if (isShapeCanMove(this,matrix,'down')){ this.y+=1; @@ -999,6 +999,7 @@ var rewardInfo = $('rewardInfo'); var reward = $('reward'); var gameOver = $('gameOver'); var btnRestart = $('restart'); +var btnInfo = $('info_button'); var finalScore = $('finalScore'); @@ -1006,6 +1007,39 @@ var finalScore = $('finalScore'); var SIDE_WIDTH = consts.SIDE_WIDTH; +function showInfoModal() { + + var modalBackdrop = document.getElementById('modal_backdrop'); + var infoModal = document.getElementById('info_modal'); + + // Show the modal and its backdrop. + modalBackdrop.classList.remove('hidden'); + infoModal.classList.remove('hidden'); + +} + +function hideInfoModal() { + + var modalBackdrop = document.getElementById('modal_backdrop'); + var infoModal = document.getElementById('info_modal'); + + // Show the modal and its backdrop. + modalBackdrop.classList.add('hidden'); + infoModal.classList.add('hidden'); + +} + +var infoButton = document.getElementById('info_button'); +if (infoButton) { + infoButton.addEventListener('click', showInfoModal); +}; + +var modalCloseButton = document.querySelector('#info_modal .info_close_button'); +if (modalCloseButton) { + modalCloseButton.addEventListener('click', hideInfoModal); +}; + + /** Caculate the game container size */ @@ -1072,9 +1106,9 @@ var tetrisView = { rewardInfo.className = 'invisible'; }); }, - // Update the score + // Update the score setScore:function(scoreNumber){ - score.innerHTML = scoreNumber; + score.innerHTML = scoreNumber; }, // Update the finnal score setFinalScore:function(scoreNumber){ @@ -1088,7 +1122,7 @@ var tetrisView = { setReward:function(rewardScore){ if (rewardScore>0){ reward.innerHTML = rewardScore; - rewardInfo.className = 'fadeOutUp animated'; + rewardInfo.className = 'fadeOutUp animated'; }else{ rewardInfo.className = 'invisible'; } From 89568c0935dff27d0eed94d66fc1cb7b2e2cb751 Mon Sep 17 00:00:00 2001 From: aalokb <32146639+aalokb@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:16:49 -0700 Subject: [PATCH 09/15] Included error handling for Game Over Unit --- src/main.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 612d602..b1a4752 100644 --- a/src/main.js +++ b/src/main.js @@ -84,6 +84,9 @@ var removeRows = function(matrix,rows){ Check game data to determin wether the game is over */ var checkGameOver = function(matrix){ + if (matrix.length < 1 || matrix[0].length < 1){ + return false; + } var firstRow = matrix[0]; for(var i = 0;i Date: Mon, 18 Mar 2019 19:18:01 -0700 Subject: [PATCH 10/15] Update styles.css Added style for information feature to remain consistent with the product. --- css/styles.css | 71 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/css/styles.css b/css/styles.css index ba018ee..b3f2165 100644 --- a/css/styles.css +++ b/css/styles.css @@ -15,7 +15,7 @@ body{ top:50%; position: absolute; background: #555; - + } #scene{ @@ -94,8 +94,75 @@ body{ height:20px; } +#info_button{ + position: absolute; + height: 40px; + width: 40px; + bottom: 0; + right: 0; +} + + +#modal_backdrop{ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + background-color: rgba(0, 0, 0, 0.65); +} +#info_modal{ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1010; + overflow: scroll; +} +.info_dialog{ + width: auto; + max-width: 600px; + min-width: 350px; + min-height: 300px; + margin: 40px auto; + background-color: #fff; + border-radius: 15px; +} + +.info_header{ + position: relative; + padding: 10px 20px; + height: 20px; +} + +.info_controls_header{ + position: relative; + padding: 10px 20px; +} + +.info_instructions_header{ + position: relative; + padding: 10px 20px; +} + +.info_close_button{ + float: right; + border: none; + background: none; + cursor: pointer; + font-size: large; + padding: 10px; + position: relative; + z-index: 1000; +} + +.hidden{ + display: none; +} .invisible{ @@ -138,4 +205,4 @@ body{ .fadeOutUp { -webkit-animation-name: fadeOutUp; animation-name: fadeOutUp; -} \ No newline at end of file +} From e0b06878ca2d9716387082b2266eca6b36af8cad Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:18:10 -0700 Subject: [PATCH 11/15] Updated Tetris.js to have restart button functionality --- dist/tetris.js | 81 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/dist/tetris.js b/dist/tetris.js index dd30e84..987b173 100644 --- a/dist/tetris.js +++ b/dist/tetris.js @@ -13,10 +13,10 @@ var drawLine = function(ctx,p1,p2,color){ ctx.beginPath(); ctx.moveTo(p1.x,p1.y); ctx.lineTo(p2.x,p2.y); - + ctx.lineWidth=1; ctx.strokeStyle= color; - + ctx.stroke(); ctx.closePath(); }; @@ -25,7 +25,7 @@ var drawLine = function(ctx,p1,p2,color){ //Draw game grids var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ - + var ctx = el.getContext('2d'); var width = el.width; @@ -34,11 +34,11 @@ var drawGrids = function(el,gridSize,colCount,rowCount,color1,color2){ ctx.rect(0, 0, width, height); var grd = ctx.createLinearGradient(0, 0, 0, height); - grd.addColorStop(0, color1); + grd.addColorStop(0, color1); grd.addColorStop(1, color2); ctx.fillStyle = grd; ctx.fill(); - + for (var i = 1; i < colCount; i++) { var x = gridSize*i+0.5; @@ -81,7 +81,7 @@ var tetrisCanvas = { this.previewGridSize = preview.width / consts.PREVIEW_COUNT; this.drawScene(); - + }, //Clear game canvas @@ -108,7 +108,7 @@ var tetrisCanvas = { drawBox(this.sceneContext,row[j],j*this.gridSize,i*this.gridSize,this.gridSize); } } - } + } }, //Draw preview data drawPreview:function(){ @@ -179,10 +179,10 @@ var rowCount = 20; //previewCount var previewCount = 6; -//scene gradient start color +//scene gradient start color var sceneBgStart = '#8e9ba6'; -//scene gradient end color +//scene gradient end color var sceneBgEnd = '#5c6975'; //preview background color @@ -199,8 +199,8 @@ var boxBorderColor = 'rgba(255,255,255,0.5)'; var defaultInterval = 600; -// Level update interval -var levelInterval = 120 * 1000; +// Level update interval +var levelInterval = 120 * 1000; @@ -285,11 +285,11 @@ var checkFullRows = function(matrix){ } } - return rowNumbers; + return rowNumbers; }; /** - Remove one row from game matrix. + Remove one row from game matrix. copy each previous row data to next row which row number less than row; */ var removeOneRow = function(matrix,row){ @@ -300,9 +300,9 @@ var removeOneRow = function(matrix,row){ matrix[i][j] = matrix[i-1][j]; }else{ matrix[i][j] = 0 ; - } + } } - } + } }; /** Remove rows from game matrix by row numbers. @@ -332,7 +332,7 @@ var checkGameOver = function(matrix){ */ var calcRewards = function(rows){ if (rows&&rows.length>1){ - return Math.pow(2,rows.length - 1)*100; + return Math.pow(2,rows.length - 1)*100; } return 0; }; @@ -372,11 +372,11 @@ function Tetris(id){ Tetris.prototype = { init:function(options){ - + var cfg = this.config = utils.extend(options,defaults); this.interval = consts.DEFAULT_INTERVAL; - - + + views.init(this.id, cfg.maxWidth,cfg.maxHeight); canvas.init(views.scene,views.preview); @@ -416,16 +416,29 @@ Tetris.prototype = { this.currentTime = new Date().getTime(); this.prevTime = this.currentTime; }, + //New pause + Newpause:function(){ + if(PlayBool == true){ + this.running = false; + this.currentTime = new Date().getTime(); + this.prevTime = this.currentTime; + PlayBool = false; + } + else{ + start(); + } + + }, //Game over gamveOver:function(){ }, // All key event handlers _keydownHandler:function(e){ - + var matrix = this.matrix; - if(!e) { + if(!e) { var e = window.event; } if (this.isGameOver||!this.shape){ @@ -435,10 +448,10 @@ Tetris.prototype = { switch(e.keyCode){ case 37:{this.shape.goLeft(matrix);this._draw();} break; - + case 39:{this.shape.goRight(matrix);this._draw();} break; - + case 38:{this.shape.rotate(matrix);this._draw();} break; @@ -458,6 +471,8 @@ Tetris.prototype = { _initEvents:function(){ window.addEventListener('keydown',utils.proxy(this._keydownHandler,this),false); views.btnRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); + views.NewRestart.addEventListener('click',utils.proxy(this._restartHandler,this),false); + }, // Fire a new random shape @@ -467,10 +482,10 @@ Tetris.prototype = { this._draw(); canvas.drawPreviewShape(this.preparedShape); }, - + // Draw game data _draw:function(){ - canvas.drawScene(); + canvas.drawScene(); canvas.drawShape(this.shape); canvas.drawMatrix(this.matrix); }, @@ -486,7 +501,7 @@ Tetris.prototype = { this._checkLevel(); } if (!this.isGameOver){ - window.requestAnimationFrame(utils.proxy(this._refresh,this)); + window.requestAnimationFrame(utils.proxy(this._refresh,this)); } }, // Update game data @@ -510,7 +525,7 @@ Tetris.prototype = { var rows = checkFullRows(this.matrix); if (rows.length){ removeRows(this.matrix,rows); - + var score = calcScore(rows); var reward = calcRewards(rows); this.score += score + reward; @@ -546,7 +561,7 @@ var COLORS = consts.COLORS; var COLUMN_COUNT = consts.COLUMN_COUNT; /** - Defined all shapes used in Tetris game. + Defined all shapes used in Tetris game. You can add more shapes if you wish. */ @@ -801,7 +816,7 @@ ShapeZR.prototype = { canDown:function(matrix){ return isShapeCanMove(this,matrix,'down'); }, - //Move the shape down + //Move the shape down goDown:function(matrix){ if (isShapeCanMove(this,matrix,'down')){ this.y+=1; @@ -999,6 +1014,7 @@ var rewardInfo = $('rewardInfo'); var reward = $('reward'); var gameOver = $('gameOver'); var btnRestart = $('restart'); +var NewRestart = $('restart_button'); var finalScore = $('finalScore'); @@ -1065,6 +1081,7 @@ var tetrisView = { this.scene = scene; this.preview = preview; this.btnRestart = btnRestart; + this.NewRestart = NewRestart; layoutView(this.container,maxW,maxH); this.scene.focus(); @@ -1072,9 +1089,9 @@ var tetrisView = { rewardInfo.className = 'invisible'; }); }, - // Update the score + // Update the score setScore:function(scoreNumber){ - score.innerHTML = scoreNumber; + score.innerHTML = scoreNumber; }, // Update the finnal score setFinalScore:function(scoreNumber){ @@ -1088,7 +1105,7 @@ var tetrisView = { setReward:function(rewardScore){ if (rewardScore>0){ reward.innerHTML = rewardScore; - rewardInfo.className = 'fadeOutUp animated'; + rewardInfo.className = 'fadeOutUp animated'; }else{ rewardInfo.className = 'invisible'; } From 9ed8cca4ffcec8c01e108e7c32ef2d135f9416ee Mon Sep 17 00:00:00 2001 From: Nikhil Anand <43323927+NikhilAnand1998@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:18:46 -0700 Subject: [PATCH 12/15] HTML Changes for restart button --- index.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 3ae0174..5ae2e62 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@

Game Over !

Score: 0

Restart

- +
@@ -23,6 +23,9 @@

Level:
1

Score:
0

+ +

Click above to restart game

+
From a6907e11862135b9e2326c78fbee0510ebfc95df Mon Sep 17 00:00:00 2001 From: kramerje <32287763+kramerje@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:28:47 -0700 Subject: [PATCH 13/15] Add info image for button --- images/info.png | Bin 0 -> 26183 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/info.png diff --git a/images/info.png b/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..5e94354f8712e7737b1eb3b36cce726df2fb928b GIT binary patch literal 26183 zcmZr&c|6qH`yUA{L`k+#go=z^vP=u9RBo%CB3nWsW-^Sp*@lGdTahH$Ni?=B(O^PR zWE*2B>&y_tnE9R0RQGr5e*e*Z-T9nzp0hm9d7k(4eopvbXN~waiEVF|tv}a4jgGi5uZ+S|xfcO*xo*JZm*|sNqn^+Mx6d`T1j!Degu7 zo4zU2PeSj7-pGDw)M#6ZzIgB5!LNnMr%ltJGZ&^l!dZ_dB&I<3nI@OgX}USv^p{71 z`Jq3A8wksnrx)EmtKL35J-{Q09Jveq8OLf3U~rffVcq$9PJZwQFYNKMFdOH9|8RKP zG9!N#2K`Uym+pyr7ybJlli&pG9f}dOC9giEx?;hg4wR*+mozaU3vDhW?*d@zYFGbq0 zCArdqT&CETAJvNIrMaZgx1aHj&0Pow{qQE=9?R~aRJh7dh4Fynd7gm}=RN!)^Co+n zzRo{=sws)PgUbKBi801W@GFt`OxTS|bgZo}wQ>)u%{C8ki2sr$q-SUDGcz^iN)sOT zshe9!Z$ULVdF4AWb9S%Xcc`*bv%PX+Xj~=JB`MP>TvMRyMBc@3$IuO&a4$;q%38S= zY&1H5bP&THlJ=IS>rv9XvO&SK^c+JJpEng{mTW+^4KZl5@P4nfk?3GIP>{1=NS3Y z&#}0EWz3gtYX)k=6Xj-3^<|1nqFGYnWK8K3+i~p9=5`(#Rz0VO4KjZI^;?*?=cZ#S zoXYGT{Au^~(X@3JwD7)&?+IQnV)Hd!idj)ZZA1k%n%hHn0cPvma0Di!SM zHrn&Y8AjZXzI>H9BI^j-VFwO^hsV&jj|wx-<}!)mwA}@yP>Zf(HA=lMl=7@lb-YGK zt6%C})|a;Nd_JnE?z|((P)t%Z@UBlZ6aV;F81G>rNO^K%d#gW|lNahg5tc0qL(Ozr z1nK^}zT3%A?Y6q?$^?TDdRALuye|b=%=Z$CVKwmjE5UtOoW5~+{{viuvTaVXN2u8Z zHaFb8$H3Ggwr{mvK?PAib;Ra?BW!=V=2|mf{T1T=BO*8EH`U8z8D1t`GxmOb$#Zj4 z#Z4T-GS&q3gmtL4N`S_RTSxmte-sWC5%!j~JV+}rFDy}vK4Rq;vXtaNzbo(QlfU&w zN=iRcnaqRaB7NL8Gl~@rRBe*NWl=4#mW^PLMs&%gav{47Hm@*O@}1gqz}{A;Odf96 zn&0%s*yj%15w?ptA{3#es(QZSREB-L)m8JC$9Nm2>IdAD>PBJ$d}?f@-k>>)=5bY< z5ZvOr!l_!_yZRzrB@#%u`kZsInN zREO$ELhFsLGJ|+1Z?6O=O2an<8S=SyQVjz(Qr5wZGo0Eh_y`$Qjve0|fSgBwkts6P zJ+@$g_l_y*@Cg$}Dp7dxYYC(a2`D}GF!S}PJT_imyN~IS)im%$yER9~gWuMvpR%zm z>f>*?1CxYokYih!L0rPP8bwY=Kz!b_87RipTIAF7O=kS{cngMLCbJO;v#rQPF#S=4EntY!M;gHvS2qKNdmkGRevT?0#)oVsQ{bG0TDzX7eAp7n zz{Hs4L_yI&GsLJEw>XYY)<{&+`|u#mO=xh_Em+Z8WTpCxwM;?5vA-8#xb4k|Z%aKx zu)h(7A-*gPuvoNa+QZTi62?4%XV;dI#g(rd9cW3l&Ar0&)r!pEtChodU*@nHrA*(v zW{sM8KxWR1tWstcYciKllWgL^*^Il8jreG9qg4K04s3e5}hh)W#*?vPaP1izr$t2V{;Am z+-*^pkvf7a@w1YNFQ}1$188;1?e0{l1IBNbar~UA7@z7^Jf}aC^ zbH>1?paU&Q=RA^4wOVxVCi55eO&!ZQpNDWk_Z17p0E#jC5RxUbuE!ayv+ zIT&0VA#`

K$Xx`&XH-E>R7SEm(I@T|3Y^#ME`slZWtV^RlTz=ao=ojdze`ZCer*%_r50oRJM) zV!fDSSElKAKf%pa`pgsDS`$&EeRR9SPfBd=YH`9pf2~R42wV>COQ`gjxdtvhT|8B} z33FdJrl7WK_@&~6Sj>e3UDpY;>ou{MmZV_Ct|wRZJ07IDn%BArxf#~B(RZ2MY<=DBW*bnL9=1=Fs-Fjulmc^uChO_a+Cr_Vgm= zfywJguDtqjdGxM^)MCYF4oYT;8Qy~rFV9QEmiKZ{i&k;r;p1!VUlzh_Zk*J22xr2Z zFl0fgS{127#IUx;7z|``QiVL!=QF=zt2RbkFKuI3Dt6twOd?&`bC8!##D~*uc(eh?~|Kr zmFZI|ZGS6D#&j$CE_{>R0ants2!5<~;pMWt{#s~*Qt@&e?xI3n>RPJud+;gWZ1LE_8;D=w{u8aB*LR`b zwL}6OhoqE#ZxL!vF%co+vnt_ixq@KalEtk`-Cx|%a%JKYBi!P0R|Oa5MOBZ0f1}LW zbX!{+2Wc~s)-X`+(nx$dm+5F;E0jEu<-ThnvdZVi4R1bb&Q08@-JAC+O+eXQS=pw^;Id`Wm`WbN03(q+Vk04qkR-T;9e1+P0dmM)7(y@sX;L# z%6Mx08=oWgwL|s+&xMrzbz&kje9F;P8 z3SXLirReiZ@t6xS@T#$oAa3Y(>9PF+BuqWH$?AdicBlf44ynTXR7rP;iVe$xE?KcUFsDucgcxG@t8!HtN~Ad zi%|N?=jnkXwTFRmk|hXhU$>P#K`Ta@C4`Fg23#4euDIO~Q_h(EO!R+LK2Twajk*73K=?mGBhm1TK$ zj)5t*E3e|FaPi~TCX%boYl|)*W`+4;iwflq2~ciF2*)!`toAsI1gA?zhwZ3Hoi9A= zQ!r^`OIpawi{jZ`J91a62*(*2+b5Q=>Q%|pnj}?Vtz&M4PT$J%l;#welDBHSlG_M{ zNSD0bhMIQSN^^XFiF@cE#2G^J9fQ z6L7zbN)c$13#hR%Jg4oH2RYvz#u~E77a0D4`aN`-l{9gca3&+jCm5BkWYb;Hm2bRc?En+jT|y<$ z+b*{qsCp*;h*bDh4n|4W`ZI2tuG0HX=txIks%(m+f|i4LYyyxO69+U6Yzd97h8<|X zg+rj3>F-_}CJ`y!-P)$Zk_aKW0T+xPT3##a7Uey2k#*Z{zH+b6N^|m$y~Jc(qN?Xlx=&!aOTOr;l-Th?;+6LJsc^z5bK3|-eTn0v zX?5qQn=@OXjWFFgL_O{ruR*SyHRb)F6&VfZ7Z~1-@)8Q*{eI)!YPIbsLD|--s4o;c zVhWOT;ra3jD=lahej!dnl5&%lza+O)2Fjqkb+Mmm(It~G=?y7u1c7GI+1(y}$VO#8 zH)Gq9Y?OZUtY>BIDxXI1}i@ zUjn8HbxRLRfsGkil#EVJ4H>UXQxbbZ`gT6=Lp0D;ujaBnnVwdRx?!v8g}}KeR%eT=^m*gzz|i9ipG|u@4&k-5az~1xY?$qdCi?|B$I%leKO!mlF}k#oiy^;GKXUAx@ro=Y*WJoF z(?suT2UL4o))8Q8+NZV-uaOONSc1YE#agaZPN;Z!*}lGBmT@{{JODT!dmzlGFT8I) zXkxivchatF*BS4D2uJ&MltDNJF0TqJ33#Ky`@I&?k|aOvs^vyLYtc2B;LI5dAx_5c z#9h_T7Ar1QnX8{D%uF)d9X6NN^n1Ydy*(4mue`{*Txnt8r9plS17K4_H&FIbEh=RN zLJxXZghgnLeB!+lA zd-7ADGI2tjCvBpZeMpy%=|%G%{s+vvmU5EuRRm8>3XWbY(rOW4PcRj3bNETzMZVL1 zYdsN?$$1a8iLd)4YwrR0<^60IM%#Ns497ERI*V#wa4BU{bE(NTpt(I%h7Rp2olIX` zQO%$9-IB1m_FmX=f#JH5|M&rIh?y~Pmpd?hg_{u~8@K$B)!L8h(k|$z%CTh{wbB4Z z`o!15MLX1B@n=(+MD8ofx8fg3ir;8t+!B^r9qVLoMes!56rNbbnYK^3opH6v7yi2@ zvrb1dPu4Xx^I?z^`~d6BX`_Wlg5_`(;?(PgA4V_P-5zQbR)aZ&vD&4q`&>cjkf!r3 zbdU*l%Z3}*)kPLl@O*7A#94`LT~E}x{TK0v{$`E}My?MvH`LNLCGkuE7=a(hi^|UK zkYDNlGJdh@N&+h_NkqO$Yqv+?n_-1E5A#~$6_oA8WeDR{oruy9d+SVIwR$ch61KLD zI52Kv62_XHHFMYae#8v}&`QGY41kZ7-tf({8+leybQCC%7a3(xfIP3$)h%qj2EoZZ zsLO3Viuf(2`?>G*>yGRzx(ig%3C;w!qmcE~hjYTQiPGi}+-ZtRAboU?-%QS&&DVz! zv83UNw-3^$l9n@ruK_DMZ#7{~=C8h}^yvYElen2;!st3Bi`%^4)JmSpr(!WVaqd)$c)|P`Zt(UeDsit~2du zWw425{B4KUW)a?n_rq9osm6(t5zQNbBH;()E*2!3$zpCg=zTQEJceG{zn1yx#QU3Y z-utqsJhirW=+)Dgn8hLxUXL2pD3_#t{xWmA>WVCjlZd!<_8QD??Qhq6!Wh^1%icwT z#JXt7KC{UB)Xg3rpKp|0T)VJtEM3squgZa$=UCMM!gry;eDm4&imW{ILX~!5@mMVj za`x2Xia-l+5yqpqnc=mX(c0&f%-XEaO^rwjv7QZ^_;Cs_Ux^K^^+o6(Oc=lJBxd;_ zKxha5{P)n@3eCGEbMui^y?u^vcM9Wq3Sx`I$UQABEnAN2)~71Ki-!ilv3x;_06jGn z56m4N=w^*ZD~t}ZZoa6zsnTpq+8%0QVH4TRiL0XW(k_(8daU+OrxDOEEr#bTS4{*9 zx;8d}-{yH~_p*1i;CN6$RWT27>+c}V$D>PSTNqA>9J_+L6nULwLm-n-oW8si zI(y~FwEvN-akm?vQyTqMw5o2ZH$TAfVWDQwjTAC2s3c@gNiqc$M0ART9Gw)ox z@r)HA{$^VT&{f6ibm8_BmSvqz9gJsTr?)Fh{){B7yeY%wE^E>z?YFmV&-vsMcE6d( zVG~>Dp)ST_k(K#sKeJ@c2al7aaKU3X?mE=w;Ys6vNzKw9@Y1IV*5Uhl9WF`;dZmP zF#W}$T*PLgbqqXFntCCHi=7g-Geal{_TND3anH-4T_tCJww)?c&k zvZ{Sos++cG_f@5C8`!sS$tW?e2UqEHx)GR*8p`iW#lS2#7G0egt}YHWG!P-$7L%w^ z%-$n*93FDnFXjNaeGS^Yyhdm`wq<%vHza_&H zq~+~PgSD`)S%e)&7>&6w)_u_8p_9ScjzgJxDt&JKVAXZ^D&bENKwS-!oy zPW#Mn6NmM(%=S=*t=;35fbV1cZgW_<18P?f`f_k|Q#97svBqpg zIu}ToxRCv!l*2aFa+56c@z#vIubZe`IR9F1dwqo|wB{Zs;lF-?9S1zxgusR5LS9w1 zQN$=~R8XLSW2q@NVGG8Rf~4fA|LX8>c!$MMEMB=ztH<+M zgrtQ^zg2MC7NGxpuEQ4$DEwNS0Rr@OLpKget3FPa>d?%jOK@%dA2v-X7MsjJJos?W z>tqCi~ApYNpGL)yruhleuuoT3g=+s z?`un)-huC`M{JFgz@Bb<@Dx*a@cI*PI?T|0suP zy0&QDwcI5;?p=vQ$U3^1YE=(lQ$fx}TuTzAEGLg#ZR{~1z{{8C3b~hc0sOVvHZ}KQ zv?7&$!+bV1&FT{Tv@Ur+qtGgHx3&(x+3kaeWOUocAtrP=Mkq3`n%3JtfRD_;O%(jC zUeaF-n>8Uxvv#@!@p2H9?ibZ{tBnMoqvvl7-T@QDmtvE-fPm^{#*i-{Wd+ave)9h0XrIM#< zmOz6P^40*-g`<`X1{Zi%Ub27+QM!C5`r&#Ty^tK5Q~zfG+G3Rn{6tQ zz5R}{=jW|cr1(Ybx4io&N0nkMELfDB(a;qgZ3h~)M-vh-cu6zQ)n)!*E#Ov*v~MrS=&mF-5MMT4c*kyO)3}szVLhb}L?SMo0Psxp$T0d) zs;HxuEEQ4Mad(+NWH5lIKY_`QvD!Gt47IPhS0;?fl6Ul-y--+BS`R;vv3tcPqZxr- zVnG+y2QjXFRfqEFDj-+wgJk?WkM${;@BC?Dhl*FIb|Wx!;ts-x4$lsTv%BSbh3Y(D zsX?@yXrb*!&Q?p6>b07jT>d?p@*cMf+GR#^Ez`p`pD6<-bfe9;13@R5yK@f&`HE!O z1H9zC$Mz;_+3D)_*Zo;Bf<}=CH3R-2QQZD&C)S%5|B>jJlz9*I(9Z_UL3)}#wXM~| z2;G2xa#WGF&%A>_y2DsPtZwqFKS+}egkvz1TXr-J2_KB-t!;&?g|-@i}H)AiBn>qf(7i@t3>KB)9WtWgh&~=Hz&*WCzeDf#t~RQPFO| zFO)c17kzAB(uOk?`#u1)5_F*m@R!@kw`)G!`4U6H@*b`z$Oy%JkkXO)G-08-+-sF| zW~*S8{k3aPBEU3ybxlafe9{rq=3#-ggZsk(7LzDj1lH79XfXX`pD~$V=O3#xowe-I zUw*ZOK%PAvk@Nt!IZja56j|GP?sC`Qtlsy;qKX}rAz(4BM(O<-i5(%gYHKd;U(`_! zVADblXJXslQ-dZP%U{i0b8NV_jv$+%awncZmUGf%#GnDz0vxrfdU0{rGme*;)n`(# zOtgS7Ewi_IxdpA1DlLck{B0{3Q5czj`Al){;z#p{I>)L;WrQFFM!1www8&q&52NSR zc(8m!hOEb6wFb5#%dhNJ8RY~*JZ__I?(0XW??UNkH+VY)Jg|BP;$q2>s&-ckR*tBi z=zylSwl<71Y?2{_x-1v1A>Bj;eCHxg&OORlipvexPdszLJAhwK5Q!pcJhZreQvXW)7YzcPNrrAAN8j)oo!o}|+w<1ugBg#f2RuKK(}wbOmtmIHu^=qi>8vy zrbR_G(86re4B=6S2k=%x5bdUPgN^Gg*H5K42*i>zU;+O5P~5ik+SS*6ZG-!tJ5|I1yyyhERF==cnN zcnsDLibk7>DqgZS7nKTZ#8M_5jhg;TbxAt~+3OwRnrK(0H$MfEBb1`$;*MLKigM5m z_;(Lx{H2B-0!vrs8V=4z~PQ-zmNf zS=7}XQDii^YkQFvJ1;$nS4D=9`0|8Zt^}x`oKX8E29!f7R@CWH((*WAGxlY<WnbdHyE4teW7Fb%jE^6q9tR@~5&^XUBr7-8nyzoL5*6|LIA-gW<4`3%Iy`Z| zZ+_ZV#PJEB}6V5u=~4bSE(>_Tn075mEpe` zBtZL+A(KfTCPHK3KL6Fc_lv-qBc4`?059x-t-j{pB%UHm+#c>n!p)cz4iJS*@Oq%z zV(+EUyVNH_9jhMW`z!&U>s0O;%q>pkq*tfj2doDPuACYXmxRpS^oA+9qBxGpOO$9) z7;wQmDeCy5^BGb)rh*cmn*Y$o1-7uYF(gBKpgv?eQLF2RfRWeoT zGjx?+=bb&xQw6g95STh%-h|jWZ<<>pqM^Hb8JaL@1`k`PUIvbDsk9RaM7?Nj5_PgO z^se$D*J@;FRFIY zC?IV*x0JrE%cR>T@^X=l3xL;e$7v114l~X$rfH%eC2d6#wcoo&e_V9Sg>ioEtp?3M zZ_CS8wlw5sK3LQ6X?TDqH&}b8j@PlTyVImDr|S5fXXp_u(^l-REmT51rV5L~!s?Rq zRz5>Le$kj?)Ra#cfdpf5Zc`l~A(ZzTT`Lwz$AS$R(8YUlH4RVaGrqD%9~X^f#eZkK zw}@VPxEva7krB7Ty$9sA*}aN*$u`-NufZN*MjWmWRRo~E(Td7)e^l|MWZr@^a zn6pN#6waNt&b}yUnJ@&~#j3}r^Z|lUUfqrh)c%ZZtikA$UxUhpWdN%NoayQgtT-$T zqske`;3RMjy^9yLS)m0ZlI}t7e_vF?_j0t_c(b!O=u{mU1IRk^YOq$sycLn&f5U`c z@#)e&TaTYAPnW!5i(hn6I-WA_1bXfsxp%;8H*+H|jD1corw%_oga|7%Hva`Zxasrw zK^eq^@y8d1Wn@jkK`{+T*G&R&Qty>=dbg&@!N>uK8pm})C7WU z*2g>oe^$?H@0ve6`k8k+J7Rr-{zbvfO9j|%p8)N}bMgGp{zQ1`?ZsQtw71j<7eK}*OKA;T7iD)IW{I1 z&Tdi(=M3D@;Fu_+EePbB0!*-YwtN-VuZGyzz$186!^>0dC%sgFuVq9HP9zdf^Tf}^!;Vk;G=Nj)g0rO#u1&lrcOx!aGWxxPV1h9C43xOXndH|#g z^o%5!TrQj)GEuV)Y{(t#TX)FRg!gmEupnCwbh4k;2vW2{77XK@^Cw;X4M4|$qz7~z zUeO#pzA3Eksh*|`DYp+aS5@3B6hq0&DB37^n1U4ZpAH`zw zF79{9iUY?u>BMyItf%x1j-YHUhFQ*sU zV$*L3V?UbD2XNz0`>E^)lnwSc9WMtQ;6i*6Y~zxMYPUK$xD$(ef&U*Ys-d|CcfhK@ zU=t|`vW1Cq9!lJgOuuo9kfFO_Jka;>H*yk5!x}gAZ_ZRkQG>hL>i37j*)!01q>f(L z!o{v#F={cO&E4E&sWZ0$#8YeBXUVsys|p)GJGWuK3TN?68?6)OUT2|G{TebYZK+Wl zlNAwn?^bvmuLVI_1^{n6=%e9jgZHMQ)Imee8OgQ8W1#|~f#1;lFW;_6U9gVa?q&$d z3D4u0Z1!xp>ogpM=796-;!6)$d);8($|%yhb4N-vu)&8oEL9!MRkFlIt9uzt23`B=yzOyP)Ms%iFJN|(dWPn-<$~qs~YhRTs;%EGGS=|N=oDzS~wFpsP&dS zLqq?%*DHAjRO>Xr^`ir(B@Jlm4?^|Urvp_3VfY)Y6z6IC0OX6|2W^X;zz3&BTawGp z|JY^IYd@wUzQM^Al1P;(@t|6J%VrJ-?Eq`m+XHR+JvNcOfE+6ToD9Qp^HQVn@rC*u zyf6SvUB*4ze)Bo`;N?xP9uRH8i36A^@MMg3s-O-6F|w$Us^Tby zai50K%rQ_za^5yFOcPihh5hhwj+;5A^`{}B2^vGrBM6NdaAt3u{eQLZL%6rTF!odV zw&2VKj7kP7oj1@pD(I;=G=eZl(tQR7s9+I!ifH>Y*Gkj)1l6eU-j_@Vw^7kEoDX+> zh0@(yoPoZ!Nla@I$di&~JPvP21oah#CwoYtkb7%nT%Q+$=G?c@5fDE3)hX zb3`Vsk%ntf!m_S>n(=+)_LVjNHhz8w zxs(4}ZAj|Q+ndr3%zg1F+p zE>N%ss<6VJSii>+bc0vAQ&>P6nW1dJ>IatN&zxtXrdjJa+wtmSuTj~x=y$=(CTeUo zrUGmwPhV8f&s?~$^7lNa_AeJfZTLQWQ_j_)(2`9EN46G|T@06=90G3hqyKT;pBRe& zZl_**t?ekJL8Pda4*7{A41c#Qy&r>qTU^Mk;GNsFCiNnrJ)z+P`fB}|_~ftyqeoMQlff+_^ywgXb@6Zs|tW5HaO|7rEA z*>obL+cAkxB#ISk*2S{FeSti;^-(!F^s=`JJREbdb>X$Tu#5uv5L?=gX4th$TD!u3 z7>r!=fb?&SUDbs@LIIFs09VsX5MBX6UvlrlXB|mr+o4`v+teB0qX1g13ENtj$3{P` zH?GS= zqQE_sH8BPO=8s$7_c8iwSDwy+*d^dCDTslf@Mhk*_ugz(-bT>+KK4WT-~GSx>wU^M zEdrH$#~B{b0c~-0f>}*%6VZZ1Dx{#ZF-hMU&LE-vbnkDF{%!l>19&L>$|_(t`%U)& z9O#>)jUc99zaa46jN&|Q%gfy>x4zBoibAae$|y~7{Fm;NP#N-hQ(L=y&sYC;?av+u zlnDedvo771&?<+6$Pi@M6C5D76j(#U47oK^(2#}#q52=8KNlf3;L-|qYuy&Gj4{Yt zoFnDSWz(Bp_^T0t_os_zBz&0Q`I_iWzazs3JoUq`jacLFcN=g&>hBl4P-m|Wk-*V3K6!Wt08_ZzM86K0aSD5p~cPyv4z9uQo? z7n@s?ia@BKun8E)PAn$KryiW16agiB$i?eiC}2%QdG#FeV&am$@CB z7cPkN&$>{e^;5=EKmgsr&|-gW+`Z*fybZ@mKFE8p(2b_YL*DoF(k|vXn88r$iro`Z z9Q#8MXSP0fKfDcE+{9T|=c+wxJ<4P~0oH>)UdF`JT9JJ#63|hd|Fe z#bUH$IKmbM3vcT{6j{<h_uCb;e)jLdzIu?;Nt?_Dcky zWC5(!#s(F`anl;yu09a#2ToZp?(hH{Kw1wOyT||Q4t#3>wA!=&$KqOhqr{_iMW7|4 zDt^wU?qc?^uNFC6Uf!8ddjFSrXiuHr{TUbN+D2ZYrYUNwqom*3soqUAVtdp4L@BmM zkxWUcU79{k4vo#tLD&47^R!yJNpkCfQpIS8zcMKH(5l5~fvTu99?I|_S4XWVxUG#d z9IE#MoaCQ$!7syLOo^W1Tt3o2r>@ZjQKzM#MWcX4W5b3HhMj=_f{&;KiKPdZynVT8 zW2vH69&A$d`-!6fZ7eH8=H|ugZ(%o+<{ZH-%RBQ#f*kc3K&LLhLFUOEpN6pd*SA#) zju-F4`lbLr7$jm85HXq%yi90@)E(sHL8b*uAKh9(RSr12p3QNuZSCcibR7a2IPE~N z9fd8U62r6_&od5 zVckYXJ2>EuwJ;*W*rsPC*O6)#H+d8~m`(pS4}E+Yaw}FlXpKE9q5>>)YRikCFgLomOB3>4|Uzg$Ig5ef5`;cVZ^L;rF(~67|Uw*MpE5_ju5`J zb#_Zq>A$lF<{-2?v^%@mO!ixtGjdjaxE@B%oaSPY2nBeJotT##Fak*z|RH8nygEx85GtAn0Yi1Dguc z3K#cF1h#Dic-Ozfi|UpEtA4AO5$^8{81anO$A9nu>{Qoh_*;hvwPye-1G_1mqzkyt z>ny)_fNOt{1fESO?H9~WX0<$~y>uQ!1b2n(P)Po6^3zJT5H? zG9{`OUwmFTYsx8WH@Lpuppxleu2iY`M_Pz6SGLyK+HaLtgroRHACi6Qf)>L z2sI6~WYcB9|2fL2h|N64xG;rLD(aZtS=N>LhP1w@hT{RA=BZRSuWP6!o#_`mAxiuF zf@-2xw~mWnxpDzUl^bupkbtWZGQ!a+qhP(HIu%*l2g|FBzXNRfzm+8}NrE!J!?p0&kmCV{ztUFjCnn4l-z}rvl>4 znft0=1IA2JHYGpg4tR{hGuL;0d=iIQQYfjreZrwyBqm@Zn0c87Okk>TN%GZJx|L$a z+ZBz^WT`rNqp?2<>ObQ42&-Wo1JoNM>@E9%vhf0P-xF?_UHUrsV~)f66T$M*q2>uX zW$zFLle-~MCys*s6SF7;tWk_EzIksk`52&k%Bp~&A0nY_kv2jX@L3Y*AbFhz1P0aT zIXzG7UU7(=wvugqOj2!m015^#V`CgpNXUmj{e6gh8^F|4+ffowYolD(hhk;G2T8&V zRP;im$lqKPYKm3*PPZTM>GlAK31kkP3%72xUw)QkLvxz1NP3wnTLbQ9i`tqe$s zoo${f-4T+r9}Wn_)g(a>znK#o|Mg-*wVj{^J%^9kF=e%3|`!Ns${yv)M9V6L^?;YpTXLB*!H8eimH71N`@7_hZ3jiQ_L z!r^nqE#@G#>7$_WZl?BGKxTD1SS;et#s2vJEk~z=_Kb&PItDy(APW(ya{!;&*xQt?no|RhzVEw>@l)Th5Ok=cD@n zhA)lZ#x~Z7HP~4P-0$sHzY>`T=Gw-=n?93|U&Q5KW%SvX3a3J8Of#J~12w=1q;Udr zNew5xQtwgVCdJMLD86S%wArK7TQCNPHZnWjs= zlzyn{X&h!{Zu9?maAVX;-WB3J?XQxhHJ|CK$e7@>qwM{b5eL#iVYd^JUdq7kc>|W1 zf9rmF0jDG7DagEBeE&Ot`dsYorxH&^7dIghJEHBVApQjQM`Hk7CFvN|)pNqsW@SX> zBg(VijE7nAwHaU+Z(q4JkayCffp|`L2q5T9)p(q_2r!&0xU+5nJ$PYez>%^46npeu zmrp4NI$HBeG=b%=WPNAvj_5Z+Dpfn}W;U>GNG<`q@c|+M^9k(bg)mS8%@t|%=OZ1P zQeS`v5xWjt>c81oDEN`2c}bPbg@#0n&@6Tud_)k+M*qH@sQgJ zRy?qw=~9sAp@R^j|4M^gXJz&U(lg55_c|S0Al;NM3I?ajsj;km&c{AFjPbHwyc7_q z{&`~R`{L2k`zy?zo#tPB#K^f|x!)0AdO+hQ_qBj=%SJ)UZD(6zIw(%(x^MI|<+&8G z{5Ikxx<97bja@K^HDW@JsK692auwR68%TZHGpHJgev}#$^j78v32Cb0nk;y|r>nqS z(Vd#F;d(jh3Z+#G;y09ZUXSju1%}>B6L&oO)<|vVYHm6_g&qwRYYulSR<9HCzWE|{ z;#KJ@u9g5vtWhmMvcY|OY)Bm_Kua8Wn*@Jh#h}R-f#7mIf{ItbrUHv^rc1?R;ogvL z0T2k?dEetd~-Ncb?3ee3u^OSQV12aN;uH z=D^{&n3$OBxQPf(B8$hq{Rrp`(I8``-(Na?bG+o~RVI4lco0-@ho0Y(?&XIT0fEYF0^4ZV@-T{{VCzF+mlVy<8B zxtgKUS6%+NEeywt-3k~>6Z;9unWM3wx*5?AyxQaFrEUN4o0>^d;^Nk0u4RLd2fLy* z{O9)k=-*FBnJ${(5UM}~j}=V`ih>fv-(J!xFpV3&zUG;D|2V2&S6OV?(aO8Wn%ZGttuU@$%B@A!=VXrQkO+5Jut` zOm}#FL8$BDm)LTPT|2bEW`LKMz-e}@9n5>nR9u>yYI$ZfCjNWH*QGtIF)10(=dR;_ zX>@f+zcKp)vHU(XWwweWuzU)4mbbP6DRY-X?EhWg#Sx2HSyhUSesy`Xb=jB01~NaI z6(YXdl0W9wZM%Jh!Piy=P49PozjLG561@D8O)@H!1(o0x6DTZT1>EHUJamgG*~?vX zUj#8Lou?<({B&#o?Jw+R&PZawnSYUGX+0J6)I4DDuj~8RwXRd|(h*&(+wMk!7zeVpM>d5?h_kj@9 zw=ivKJ)K(^?k)-Vel0|9K!fXe>yDAvV$8TFGdBSx{ZY^T;mF;Wwl_~QmgWs!z7)$A z2Ou@54rZp&d}p2wXTaNXx7wC(=zLfSz4?$Z&T}@LH8$*)&75@nAwuFN3}8Z^9il7H zhoJxyQV}oqD^(h_#rxr`*@(Llvt6e=jd zmp09{peRrcRG`<<0D$5MN`D>K)z-HQvA+@*70nYP=kNT#y3RkI>3xsmp-6GmRZ(iB z7hR^ zjmI4vfNKYLd1?bIj=;+Ua8-u%+js#(G^+siD)wnW!qK*k?!gCTUWe5bt*)Jj7?{C% zMX@ov^=5B_Kt_XFu!d2!c(eSqjk-~r(;pY^=T7_VY>BD1zz4xmj6m>cYeI0^JNB7V zDrejDWoB@dLt1zxEb-POhkfW)@F?cj6TnL;N|c^2;4-s+87r8H$u)>V%HBuWFortz zz-u}PbGtqO13nQrcop+&2$h}{cVEitZG}CT>_im^ki{550^nu>`-6 zXb7+C5lv)oEf!qQsXf42pygF8q552Q*`4VZGvMSX|E-9iq!n;Su2!5(m$jV{()ULi z1UiC!KGAue$YEJ5RGPiCK=WC#MIQFw!0zEMB8-uDE9Jwy2b04wy{KkUp7w7U#?|7- zm*&eHHmiq4QtqCz0{gGeLxoV_*d!bOK0sqDa(o3B?35vuu4w_TgdTjoy$p`8{d?e` zqF%Wa0rZWo%D(OB=pZVe*su$Ew_W^U>mE!GD|UilOR)VlX5z`7`6&q_t??XkhHp8H zW#ZIeNmvD;urU>~<~6~2uz1hkbk9tW%f91avk5>FBlC%Phk7B#{T;9Q?{eQO-W?~; zvpb7Dx;>CLUD0q0kU$yz1r+if{cfp$QNwb;P`n=rwz4<)*@me?<7}YpRfIw?Oa*R2 z?j9IaUsRu!?g5j&6M3lT%pBf<9j#|RW!=;a^^H+)@$sLlunzx33&6XfhB-vc1Lzcl zK1p>7yqa<1#O_)p1BOopm!l^OJE_iph_7$m=nj)5(kJcn5QqEAz|r8b93}!;3U4vi zXPjgRg|B01V>Bq#l)TzQ2frs|4>gFP(6Nj`V&cRlrO8xnBaP&}<$a0E&F-QV$xu3t zbUR?9WQDvHh8w5$-|l(%QvSJMsZax>0^q4@-qNp$bqZnI^&qB)b-|7zGB|tyA<#UC z-AF1!cZxU3T_4d~{?y>=aL`Iq!L9zk7!GG)1p*Mq_OT_%3mng*PyJCWLpx#Bs68u2 z4*L$k=}D&;a<}V)-A!Yy8#2Z!4`3JIMtJqgXD;mq-6}4D=`BAXJ81;|bMVMbSMK8! zS6W6{*F|A+8wGZ1ijByrPYBl>7|`9>q)iFa){hL)H=)^vcdwe^bixAr8T;;j6f1qA zf$3T8ae1{ZJZ(}Bw6Uw+@^)O{g52?lnr(PB;hAgi!7och6XxCB_eKF0 zA!x~=$=Ed$?B{6a6M-y3cC}~pMrb@O^%Ih)`r{CqAWis!bUVczS1bD2nUMbi+H+Nn z!MZ@ytCP|r)y-k2`<<=3{mNGvRX-7bXm-+%9p1#g!Z;yGuFOeLa9%7_JWR=gY6{e^ zDWxS}nDYjuQ9-7akZ{^5-mh?hsOu)Jr{9f-ea11X@e zeD~AwrPY>uME5)-7|W^U5qADn3x&;#K1yxs53Ln$GBt%MEN-choNBo4hsfufrN74S zKxAPtdhuwTvg*2aUI{L*O=>U948~?!W&&NR?<2ZY5|oPcNo!J^g?Z!MC$BP*JPycE zZFAS}uHP(m9sLjUbFQJKG<2)TBm{Db^UzY_a9%o4QI;6XTd6wo%9Xn+b`&LnXp&K; zbXkFP?msS0LY{$w0}HZ#`>m9Bd@0OlBu~$r+Ge{&|4>vV>B#S!=e2+V1Cg0+Qo5tE z*w1XRdPDmNjMN@}qJ_qK_n@XZ0_URsoka>ir)&-I2ZtHNRI2)0|B+u2j#yhyiOSky zz$bp|&0FK4l8%Pu%&^49n~j;MJ}905$g7X?*#9UmZ zw97mSLfBi;Vy{Vw1zs#1V_Sbz76@4!Tz0oD??nj($mv-&>f18Bdr{ETT4d$CTu))|RCv9otjBSo-}x zInST}{s7UgG=~dMw|3fdNmnu1H*+weMF0~X@IY*e0{>upr;Ca*8mz1~SJZ8oR%MG< zA)GxzMNk*XRq;CJZsyd>t{47NT-8M?@PR<7yuMT?R*geMd>bi%%7Zo^Mk%@cSVv&J z`w@xG8k|9_@hQ_FYJn2z*yRdKVg@}^l1I-9M9?|*KB5}Q*OAc@-xQibN~xK+1@WZy_sE3^XTTTMryEJzZF->O z^|ky=|MYQp?eHs6R%Rd9fjzX~gp;^un5XEdT5k4b`qU#$#WTRjnloK=uOBZu+{lbz zoE70(epNi)#(bFK_FtFC^w9xb5qk*wk>FM!rj41)pNGu>nChD();8vY&6H)A1UZ%Z z9Pccq&(SAzS0-cSLc$S%OoraDf4!s=xXT8)R;{3nscyjsIG+LtN;19sj=T~P!Hz9q ztR~O5Xj%N(>!65VY`|+Oo_J!&Zsn=mY9^UAy}0l?9Ncyukr^hg4mOuWDHz22XTRg- zMaMfEX;?I$VB!pXEn#^_Qg{{~vF1jr)`l+PSbqYy-JaAwn(ZX4bBlY(m;y04syV!B z{bY%^G~q;bBM>&Tdi+4j+}oj7w&uPjq8J1=TV357a%qb%+M<4K9V`9&n`!-BB*X2_ z;9M>9dvVSM^ood{7?B?r#3=stKo+n;w5>^Y0gb+7%r#`i1baoU&zv z`T($}2A@K&p6N$G3I`ud((WYO^|T1d)~h}gRdXkxbpNRm_(ON1o79AoVST(0g}wtP zNJoSjaHGIb{Rn>ijdCG;CC92$Qn5?}5NnN{ZN=kJ)<2HbeP8Gd1P|K}G%e>QVzEA` z?S=seC9eC@!?my~iERjSI?f12SQuUrDx{1LpyF6}2I6#f=3doy`%qrIvZn~s)zy|!j>IRC(Dx_2ZM zR(KC4RZ+lV&h0~RdxSR9b5_*3FQeNJK~2bo*S>R2q8h+}0qaTgQSwkS`p*Me5*|td zt95@Q=)OB30;-=S6LSsJ)2*K@i%3)qe3wbI{`5;ZWLzO4(g>Cqgw&lSCgD z?Ys3{zfBDRoyK78b1isA_NVV1K5bT~&Tva3aHg*+Rzg;)7!}P|mXG7^tAp1B#Kte_ zJfPN11N+#G3u;5xe5y8)TK>C%DVD!P(0FmfUYsSS+y);5v}P0b=hEa8@@yp7 z@s$6Rsr!C$Wl7!&)7PsD(g)Y12$cEe$cn&nmf^NDrEA4{jGT*6&jmNCR2E0MX$$23 zKoWN21#S)88fM&Jkl}Q0IB-3&x7mR07kq=nx}lx@3S=#KU^(wv@v*$j9MIJK8LEu* z<~3=4cY2%Ah2G|v2HxA6KkfIbDSkz2F95Q}G|bDh)C11hPC1tV7<;X6m`fRD8Njl$ zugN5UWV_v`VT$;dEqDgxMZNPa;y}-LUdTzdyM650Xcd2TAGJVcP8Qx_K#=P+=u=3b zpHLpfwVkgl1=u)9Sb+lutluV)S6U9v z&JGTNIDIL21jTjAKnsxH%5Wbcu_16_I#1Po(7(_!1iY2ZQhuj)OUMo}C1cbcw0el- z&PERDrBIyKXFw0D0q+0rBSkcse@d6653Et4RZXZ5)VPX7?-LWg%Qt7&vs3HJyGa zH4S2bY#e@}IXnR{%kd1>6-IpugQL4^PchHXpe@o!Rt=wqQG;0hly?2(%+O4IYqZ9qx~sABJTP2i^?S`rux5YIK_{=OM` zmySX3V@O&_@~%n?y%jkc*k9#;i-zV7?@IVs0S+&yzOBS8)GOQP}b zE~iUqJYT4p@WEG~=rFT)Arrper$SxVS+jO-ZwsZO;DgmaG~$^X!q75&b=+AC($>T9 z36~0N&9J$I!0f&f4C2i4d-i*0t^c!6gQfCpcraUDdajqe<6*QO8C-fe7KVx1vBo Date: Mon, 18 Mar 2019 19:32:33 -0700 Subject: [PATCH 14/15] Updated Styles for it --- css/styles.css | 77 +++++++++----------------------------------------- 1 file changed, 13 insertions(+), 64 deletions(-) diff --git a/css/styles.css b/css/styles.css index b3f2165..a3652d8 100644 --- a/css/styles.css +++ b/css/styles.css @@ -93,76 +93,25 @@ body{ font-weight: bold; height:20px; } - -#info_button{ - position: absolute; - height: 40px; - width: 40px; - bottom: 0; - right: 0; -} - - -#modal_backdrop{ - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1000; - background-color: rgba(0, 0, 0, 0.65); -} - -#info_modal{ - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1010; - overflow: scroll; -} - -.info_dialog{ - width: auto; - max-width: 600px; - min-width: 350px; - min-height: 300px; - margin: 40px auto; - background-color: #fff; - border-radius: 15px; +#restartInfo{ + color:#fff; + font-weight: bold; + font-size: 18px; } - -.info_header{ - position: relative; - padding: 10px 20px; - height: 20px; +#restart_button{ + height: 50px; + width: 50px; } - -.info_controls_header{ - position: relative; - padding: 10px 20px; +#pause_button{ + height:50px; + width: 50px; } - -.info_instructions_header{ - position: relative; - padding: 10px 20px; +#play_button{ + height: 50px; + width: 50px; } -.info_close_button{ - float: right; - border: none; - background: none; - cursor: pointer; - font-size: large; - padding: 10px; - position: relative; - z-index: 1000; -} -.hidden{ - display: none; -} .invisible{ From e6de308075cbe6b0a70c21a1c23ece3773cf9c64 Mon Sep 17 00:00:00 2001 From: kramerje <32287763+kramerje@users.noreply.github.com> Date: Mon, 18 Mar 2019 19:41:37 -0700 Subject: [PATCH 15/15] Update styles.css --- css/styles.css | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/css/styles.css b/css/styles.css index a3652d8..1f25a6d 100644 --- a/css/styles.css +++ b/css/styles.css @@ -111,7 +111,75 @@ body{ width: 50px; } +#info_button{ + position: absolute; + height: 40px; + width: 40px; + bottom: 0; + right: 0; +} + + +#modal_backdrop{ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + background-color: rgba(0, 0, 0, 0.65); +} + +#info_modal{ + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1010; + overflow: scroll; +} + +.info_dialog{ + width: auto; + max-width: 600px; + min-width: 350px; + min-height: 300px; + margin: 40px auto; + background-color: #fff; + border-radius: 15px; +} +.info_header{ + position: relative; + padding: 10px 20px; + height: 20px; +} + +.info_controls_header{ + position: relative; + padding: 10px 20px; +} + +.info_instructions_header{ + position: relative; + padding: 10px 20px; +} + +.info_close_button{ + float: right; + border: none; + background: none; + cursor: pointer; + font-size: large; + padding: 10px; + position: relative; + z-index: 1000; +} + +.hidden{ + display: none; +} .invisible{