From ae260edfc074efd11471ebbc686ec1b6c5f29d91 Mon Sep 17 00:00:00 2001 From: davpapp Date: Tue, 13 Mar 2018 10:33:32 -0400 Subject: [PATCH] Beginnings of multithreading have begun --- src/DropperThread.java | 40 +++++++++++ src/IronMiner.java | 78 +++++++++++++-------- src/MultiThreadingExample.java | 13 ++++ src/TrackerThread.java | 77 ++++++++++++++++++++ src/main.java | 16 +---- target/classes/DropperThread.class | Bin 0 -> 1628 bytes target/classes/IronMiner.class | Bin 5803 -> 5010 bytes target/classes/MultiThreadingExample.class | Bin 0 -> 563 bytes target/classes/TrackerThread.class | Bin 0 -> 3416 bytes target/classes/main.class | Bin 1104 -> 1142 bytes 10 files changed, 181 insertions(+), 43 deletions(-) create mode 100644 src/DropperThread.java create mode 100644 src/MultiThreadingExample.java create mode 100644 src/TrackerThread.java create mode 100644 target/classes/DropperThread.class create mode 100644 target/classes/MultiThreadingExample.class create mode 100644 target/classes/TrackerThread.class diff --git a/src/DropperThread.java b/src/DropperThread.java new file mode 100644 index 0000000..51ea051 --- /dev/null +++ b/src/DropperThread.java @@ -0,0 +1,40 @@ +import java.io.IOException; + +public class DropperThread implements Runnable { + Thread dropperThread; + Inventory inventory; + Cursor cursor; + + public DropperThread(Inventory inventory, Cursor cursor) { + this.inventory = inventory; + this.cursor = cursor; + } + + @Override + public void run() { + try { + inventory.update(); + cursor.moveAndRightlickAtCoordinatesWithRandomness(inventory.getClickCoordinatesForInventorySlot(0, 0), 15, 15); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println("~~~~~~~~~~~~~ dropperThread finished!"); + } + + public void start() { + System.out.println("dropperThread started"); + if (dropperThread == null) { + dropperThread = new Thread(this, "dropperThread"); + dropperThread.start(); + } + } + + public void waitTillDone() throws InterruptedException { + dropperThread.join(); + } + +} diff --git a/src/IronMiner.java b/src/IronMiner.java index dbff826..bd9640c 100644 --- a/src/IronMiner.java +++ b/src/IronMiner.java @@ -46,7 +46,6 @@ public class IronMiner { humanBehavior = new HumanBehavior(); cameraCalibrator = new CameraCalibrator(); randomDetector = new RandomDetector(); - worldHopper = new WorldHopper(); } public void run() throws Exception { @@ -73,37 +72,18 @@ public class IronMiner { DetectedObject closestIronOre = getClosestObjectToCharacter(ironOres); if (closestIronOre != null) { - Rect2d boundingBox = closestIronOre.getBoundingRect2d(); - ObjectTracker ironOreTracker = new ObjectTracker(screenCapture, boundingBox); - cursor.moveAndLeftClickAtCoordinatesWithRandomness(closestIronOre.getCenterForClicking(), 10, 10); - long miningStartTime = System.currentTimeMillis(); - int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + System.out.println("Starting threads!"); + TrackerThread trackerThread = new TrackerThread(screenCapture, closestIronOre, objectDetector); + trackerThread.start(); + DropperThread dropperThread = new DropperThread(inventory, cursor); + dropperThread.start(); - boolean objectTrackingFailure = false; - boolean oreAvailable = true; - int oreLostCount = 0; - while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { - long trackingFrameStartTime = System.currentTimeMillis(); - - screenCapture = objectDetector.captureScreenshotGameWindow(); - detectedObjects = objectDetector.getObjectsInImage(screenCapture, 0.15); - ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); - objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); - oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); - if (!oreAvailable) { - oreLostCount++; - } - else { - oreLostCount = 0; - } - } - - inventory.update(); - if (!inventory.inventorySlotIsEmpty(0, 0)) { - cursorTask.dropOre(cursor, inventory); - } + trackerThread.waitTillDone(); + dropperThread.waitTillDone(); + + System.out.println("Both threads finished?"); } humanBehavior.randomlyCheckMiningXP(cursor); @@ -116,6 +96,46 @@ public class IronMiner { System.out.println("Completed full mining session."); } + /*private void dropOre() throws Exception { + inventory.update(); + System.out.println("Thread 1 [mouse hover] finished!"); + //cursorTask.dropOre(cursor, inventory); + }*/ + + /*private void trackOre(DetectedObject closestIronOre, BufferedImage screenCapture) throws Exception { + Rect2d boundingBox = closestIronOre.getBoundingRect2d(); + ObjectTracker ironOreTracker = new ObjectTracker(screenCapture, boundingBox); + + long miningStartTime = System.currentTimeMillis(); + int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + + boolean objectTrackingFailure = false; + boolean oreAvailable = true; + int oreLostCount = 0; + while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { + BufferedImage screenCapture2 = objectDetector.captureScreenshotGameWindow(); + ArrayList detectedObjects = objectDetector.getObjectsInImage(screenCapture2, 0.15); + ArrayList ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); + objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); + oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); + if (!oreAvailable) { + oreLostCount++; + } + else { + oreLostCount = 0; + } + } + System.out.println("Thread 2 [track ore] finished!"); + }*/ + + /*private void dropOre() throws IOException { + inventory.update(); + if (inventory.containsItem("ironOre")) { + cursor.moveAndRightlickAtCoordinatesWithRandomness(inventory.getClickCoordinatesForInventorySlot(0, 0), 15, 15); + // move cursor down 40 pixels + cursor.moveAndLeftClickAtCoordinatesWithRandomness(goalPoint, 20, 5); + } + }*/ private void dropInventoryIfFull() throws Exception { inventory.updateLastSlot(); diff --git a/src/MultiThreadingExample.java b/src/MultiThreadingExample.java new file mode 100644 index 0000000..af7dcb9 --- /dev/null +++ b/src/MultiThreadingExample.java @@ -0,0 +1,13 @@ + +public class MultiThreadingExample { + + public static void main(String[] args) { + // TODO Auto-generated method stub + System.out.println("Starting multithreading..."); + TrackerThread trackerThread = new TrackerThread(); + trackerThread.start(); + DropperThread dropperThread = new DropperThread(); + dropperThread.start(); + } + +} diff --git a/src/TrackerThread.java b/src/TrackerThread.java new file mode 100644 index 0000000..ab26728 --- /dev/null +++ b/src/TrackerThread.java @@ -0,0 +1,77 @@ +import java.awt.AWTException; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; + +import org.opencv.core.Rect2d; + +public class TrackerThread implements Runnable { + Thread trackerThread; + BufferedImage screenCapture; + DetectedObject closestIronOre; + ObjectDetector objectDetector; + + public TrackerThread(BufferedImage screenCapture, DetectedObject closestIronOre, ObjectDetector objectDetector) { + this.screenCapture = screenCapture; + this.closestIronOre = closestIronOre; + this.objectDetector = objectDetector; + } + + @Override + public void run() { + Rect2d boundingBox = closestIronOre.getBoundingRect2d(); + ObjectTracker ironOreTracker; + try { + ironOreTracker = new ObjectTracker(screenCapture, boundingBox); + + long miningStartTime = System.currentTimeMillis(); + int maxTimeToMine = Randomizer.nextGaussianWithinRange(3400, 4519); + + boolean objectTrackingFailure = false; + boolean oreAvailable = true; + int oreLostCount = 0; + while (!objectTrackingFailure && oreLostCount < 3 && !isTimeElapsedOverLimit(miningStartTime, maxTimeToMine)) { + BufferedImage screenCapture2 = objectDetector.captureScreenshotGameWindow(); + ArrayList detectedObjects = objectDetector.getObjectsInImage(screenCapture2, 0.15); + ArrayList ironOres = objectDetector.getObjectsOfClassInList(detectedObjects, "ironOre"); + objectTrackingFailure = ironOreTracker.update(screenCapture, boundingBox); + oreAvailable = objectDetector.isObjectPresentInBoundingBoxInImage(ironOres, boundingBox, "ironOre"); + if (!oreAvailable) { + oreLostCount++; + } + else { + oreLostCount = 0; + } + System.out.println("trackerThread working..."); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (AWTException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + System.out.println("~~~~~~~~~~~~~ trackerThread finished!"); + } + + private boolean isTimeElapsedOverLimit(long startTime, int timeLimit) { + return (System.currentTimeMillis() - startTime) > timeLimit; + } + + public void start() { + System.out.println("TrackerThread started"); + if (trackerThread == null) { + trackerThread = new Thread(this, "trackerThread"); + trackerThread.start(); + } + } + + public void waitTillDone() throws InterruptedException { + trackerThread.join(); + } + +} diff --git a/src/main.java b/src/main.java index 46aaf8f..9f2e9e2 100644 --- a/src/main.java +++ b/src/main.java @@ -10,7 +10,7 @@ public class main { public static void main(String[] args) throws Exception { System.out.println("Starting Iron Miner."); - System.load("/usr/local/cuda/lib64/libcublas.so.9.0"); + System.load("/usr/local/cuda/lib64/libcublas.so.9.0"); System.load("/usr/local/cuda/lib64/libcusolver.so.9.0"); System.load("/usr/local/cuda/lib64/libcudart.so.9.0"); System.load("/usr/local/cuda/lib64/libcufft.so.9.0"); @@ -20,19 +20,7 @@ public class main { IronMiner ironMiner = new IronMiner(); ironMiner.run(); - /*Cursor cursor = new Cursor(); - CursorTask cursorTask = new CursorTask(); - Inventory inventory = new Inventory(); - - while (true) { - inventory.update(); - if (inventory.isInventoryFull()) { - System.out.println("Inventory full. Emptying..."); - cursorTask.optimizedDropAllItemsInInventory(cursor, inventory); - } - Thread.sleep(100); - } */ - //cursor.moveCursorToCoordinates(new Point(620, 420)); + System.out.println("Finished everything!"); } } diff --git a/target/classes/DropperThread.class b/target/classes/DropperThread.class new file mode 100644 index 0000000000000000000000000000000000000000..00e71377b0163d66d00d710704d29911f3ccab9a GIT binary patch literal 1628 zcmZuxZF3V<6n<_Jx@o#4A*B_yv}tJ}Nh1-Z_!2~GN+B3%ZE7p}!P#clW=nE6v$-kq z#lOQ>acr2;8NWK?k79W4ZeATTlf7rpx#v00dE0;A{P{P4+xXEyL|}H?_u6g8KWO-l zWgCbIq)x3ftJt*UNpbi1)Tt{2Qv&IccE2m7b=-95ZI65NQgw7IL@WtRyYkGD%JW|c z%v39b7h0z3UBBb`0`Y1&khJcuD_wO@U?DqpcVN#Q3dG8u?IaMzB@?qq3q-TI!)XXy zHZhHamKIFRz!XSUUFkgOwvL%#$T(f~>Q?j6@?HJjSH@Js?daPR#UPoe-<1hm#j=4V zCNku1BBKLOb=$V3$mJ?lO}eM{P2OFA7Uv6lTW z?*E1=;HH5O1m=Q2^l&~ zbENJV*qoT3+KY~IS|&chr!1z|W$N=GJx1IM;W>A$QXHQPtp7Ux%S_Bx=4XyYr{UNu z3Eag!178eiOd^^15?=`z0r#e4yna0bwl&3=CnY^ag5x{lGL}8t-q%kiNd0V3jK@~H zKQ|XT%JNkl59l(IM>0JmBw~z$X|PX zYvR7{llk0o)q&e=ZhMkRC5A2O82C2h}8{Wlxd;`I>RRod_6rub+y~8lS(LX}lX8sS% z^{~ieUW?Ia4=br;D%r#O(MzPN8$E2i>Dho&TL&X+94xSfA|lsr}=dCH6EYip;q>=r%M;ITc8{G35sKhG<(5#NntriJ&y=EWq_K*mxgSu)VsEKfDF^ C!et@= literal 0 HcmV?d00001 diff --git a/target/classes/IronMiner.class b/target/classes/IronMiner.class index f86848dbb00c5fe4994702680a670058fb8bacbf..9625d95ce522fb357bb83567d8c3a7b27a94575d 100644 GIT binary patch delta 2338 zcmZWq3wRXO75* z?W&bhA0RMd10skIXoXLq)g?%)wzjrVTOX~hk5BDGtzv7dwDnO+`rp|Q;Op+r%(?fT zbM86+|KHiYV>X{}9XD3cx@`4UR>L_vd!sqlbN)I zxtM3*DuI&It20-1xz19F`MBCU5E!X1l(+_8^wq>&LwG!XLIxlXHtPJ61 zfgv;9c-Bp(7gxFMStp+88fD>DtT%9*x6vFnWCLzz6`k2++D)Ye%B#I`!AO;XO#H<5X*ZKyRo^_NJKNQtrw4bcWIHA9QOV?rc(Tr&l}x3k zX3_+&2RlQ!kMWZ;Zu_Z5s}?2G$*y)MG08#$9+23LJ>I*a8vT0`4`Q!pn-j}|R0KbP zcN8cOOKiY??@{wy(d)fpj`BuWhbD*JGf@yIZaxc^dbX1|vmNDeR)6*0mcg^NX9R|O z7n;NAU#9#A+H6{Md3P#hVH}>7cuqA})ZLkgyH0bw%bl6ZxN7MIiQnM2UR;jWe<$&K zyyUHypKJ8->Idlz+@f>zhD{BAUwXsVXMDrL>-d9#Hw3IJCSJ{qnt za8jaAzb<%Dv-7$IQJ5KoG5k-rL0s!Ut##LM!hzu)O&t(Zw@p%Yp~4 zz?B>c%*04~RnpctnuT*2Gy_2l=3=lHa~c8@1LL(lc>N|#)I5Sq^H>lID#H#&aBUvf z#dLq9=dmbe*hU^py!T5ga-Df(Yi#2nmd8SN=xNNSSB)LYV|9sDV&!rD-0$P2(r@Q+ z%VBJsX9w+&N^=mKW2SB9vE?v&=5eM@g&oAUm}N8QZnd;SS-Vv9y^QAi6y=l0{d~08 zsx}UC-!0cl5}n&nN=LR)=|r$^X&w*x_AL<{$VBi1UXS+N)mNsH9b_^EndU=wBdTcE zadZ)MTnrPJ5V}iIj2MRDix`awRP`jzG;nkottq@W;!C)kAT}Yl0Mii1SCB;uR%1F3 zXDg5Y4D2HEyNUWK;yd{{EWk@xNU>f*>0B!`Mk~G+!BR~0^Q8%aLwJl# z>FC2@-UBS{1b#?MV`0zYM|hms!yrz zSGoU}6_)uD1ICh~x;%becs#!qm9%Pk)f8r4jNs)6UhTzeYkTo$#Yw>DWGEX0*0Y`s z7=qi$&_?#L*@vkh>#_YX9YszBi7_nY9lT4pC~JbP@e36D8W^$mjvWYU`vUt0Hqhw^ zZ1EFTF`lmd36)jAU0KI`+!ZL?Bg{ScSI7H%oEU_^s=dVIQmz@CXes^M1Tp=BJl>B5 z_aJHq58*>WI@ZLrnqGWtYdjHo{CB)wt`EN#X1PAW)~3@-2(P2u&Z*-&RvkucWx{Pl zU^^;sH>$CN^E=7zJyhv-OvHUu-Tf5YZomAAERmZJl;7g3f&bf>MrrA+Gl(x!R!?!J z0u@51r7^1%23K`o4aAf%GRYG-LSzae2=t){I;mFdlX*6I95}C!+ED^HHLG4NeCzci zKbN@`oc8A*5uposCDzdj(+Vfn^@@@Wii5(ts=&d6{TxL7sDUnQF;tx6lVpowv<5*4 JTZM{>{{c`q6ueKQ{8bz6)I#bC*-cylhM#^dLj`{Dp-ceE)d#O+<;QEL|8O; zEuna`)}#5OTD;T0xVIymFd}+f!Ft>!V*|nczO=0`WrSlYK8TIxUZG6dq@n{M^Q5p; z>QWKGX456EkfJJLh?^V51+D~=GPbe@^V`niY85FM1Thu4J4_I&s#~1sA;^)W9$%IW zD_D$P6@9qdd_!C;-K*lmxX<)Emc+K>BQowMBj>q#^XUk zomnB4PrTmd>N^x{$3rR}#v|qvjv3NpD)wNndBL%2n$-B*96)h$~>gpI73=+?k4+3K>*LFIE;@I#&9;-;8M#z)Ew1Psg`&!lH$5G zm|MjXv(Qm&E)>Uj`tb=B&*GB=sXGzU46djhdh2yVUu(G;RPkwihA<(L%6eIz45z|z zqa}X1giU&HOS~nfb+W}K%jKBsSTx-ZPc9oJ98qx;pEci9D$@#P;&WDDWfpZ@#S8d6 z!4rx1uoFGm*A~@{mek@{!ssJ7s#;pA*}^oORFT0DV?Q8A|cWh~m#3OO@i0qZVsNzL@$viJNC@zNamsNZP=gbl1jAU42gujdn98AJmipI?`&WZGzd5g0$-`e** zOZ+;!ui|ES%ni=d>D*1D_~YUc#$Kmj^BBRSSRVx*p&)n-5?Q4nW+l?uW@t&HJrd(m z6gMxxzT&4>@P%1~d}qeY_HrYJ92Y*0@b%^Vm{3$GT2ft`{WGtgK+H- zXb=veVZ3|!vv9M5=`N7c-5G4F@ySEDr{3vvp2w>`X9nqd*ID$h@i~01A?&JGSh>bp z-|bf1N(PUv<{;+gda%!f$4_B@AWsP7i-7_m;2uP~B`dW2UlZ1$tHLT`r%!WWiqDbu zxiT0CRG`3HUU2#4vZY)EweLt-g*f_ z2FDJfh-p7RHCfRKel=Tc2B-Md>a%LZ%on_(JCtDc7w}S=qb(16@YPrb=WTko2e0TJ ze3PGVJ^9q|VOA>oP6pq#+9%rWJHrhG<}eq4gqz_)9k;L^1(=7in2*V5;KS0$s|#@p zny>(in7S1o;NNyE;gNMaGz8IwR;0W6&fbX?cnB-8pT!3l5r-HF&oCAS7zu+|i(^>F z6K_2(U;|#qUHA>(&=;{0e`GUn^A-ILR+9^zw_%VLM@S9At@l*VaS7%Z+ ze$JH4K@H;<_$8d2%{lxEzvgOm^Q?b^gH$-F!+4V|=W=RK;J3Upj}zR7x9~gUbDEDK zeUZrm&h}yap2cp?H;6y*mO{=BDB*LEb$jWG+e_^BPb}+#G7MED8pbRcZ_7yV9~F&o zRSRVB2;xyQx+-J4jK9d}=SAYf`5s!ucah^AL7)=O|5XM?xW{5vz^-!e*K3cYSyAXo z|Bd0q2>j;(lrwb|@ZR%a#6!d zoT3t+$a5h>Hv}ZFR5}2cSDNn=ms)D&go7im)t-l1T1a~a;HW)D$Jk`{6!8#bx}Uk7 z9L)p#!TKPou^WCy%`Aq)99~<%2wB1(U_r)=H7FZclS9hpWI=bS4M_gx#1guZg*p7( zMiUs20vjAh6PXg(tV)wuBH5VAPFri|B`%j$>1qfgTpx-1Z9$090+|YdNh1tE3k8=~ zxh~cBb5Pi#s2PX=m;74_KKp~Bl7#qb3wE#(s)pEDO;@$3L?~YjcpR7nU(cT|r zoI?`|v69u5sm9$W9)!NIkYlJ!`HZ)HuEy<~ z(NwrG!`i7-GCpI-Hkw0*+`0CIjVy{KBz`QlqVi&6Ynqk!ssykk8PuZ zS}H}Igl()Eox$$w#JJ*8rs^E56yPXb4Tm6^=~6(3UL-GBi=sApMn2z~qwunTZL%qx wQrF3rehB0@C@NwTWy++VTU0XT*>9-aRjYICd{C6ZvVyg!kfAIcXo2m010kV^5dZ)H literal 0 HcmV?d00001 diff --git a/target/classes/TrackerThread.class b/target/classes/TrackerThread.class new file mode 100644 index 0000000000000000000000000000000000000000..8f72f12559a68ee04f29232b20394c00c81cb4ae GIT binary patch literal 3416 zcmbVOYjYb{8Geo=YbALTr;cUE^yV~iV#$fsrmaft;KrB4$jEVsjYGn9Ev@ZMq+NA) zWjh60F1*mv1jHgXliUd&C;Up7m=hPXicru2N> zwvG9UNo#+rHI<5+T7kzQDtRT>H0?2?=GR>sJr*b#D}K(Z8jEIbw7#%lx@Nf`-)OM6 zRB=4h^9!zHPfLq^#c|VTB4#;ANa{E$wLtE;QYYBkkWeRn(y}doSYV{@e}~-ee!Hv8 zoIq^MDVr%ov0q0UIs~G9nYkncI&~zGlB)wcTA|C;XLRhrUV*lvWt(T~)p-IOAl6=V zN=9YQa4q>B3S<6~+aNW)QRm%{P9nOjpPA7!>HT%~gNGsC%Ae*cU89XH#d9G->G@AI}t0IEi5mpCew)jL`7{P6<3* z3WzwPSm`Y}bXGMlSPZiw&_m=Dhj*iA{Dpr$t$t*jaUG{|Ca6IW%q!T6#sc|IL2^6{ zRQIh)Zp3wst3}K6hZ6X_fMx~MmoX-Fd;vwCn{^IjOfQU843D9tg}`taX`81ly*T5$ zWXI6X5oP($>X^nkwoJWNHhg0FfAipy%=x^I8O#bCvb-SWbFS&J@&$W?siV$n1F6wn z^52DOJDlrMlH{AyaRFZ@rJOoJNe60{lRL+=`$WJrszmn^`?P6l^{hDV6{0gRFp$Dm z@pTPf6WFgf&}^*Z8~7$`QSSD`X&n*LbZS;4U1di6{b(Gmdu)OIkpZ<&Y3n9Z^q}Cmi@{ZbVV9f7{5W(kqfg8 zvlMK(?`$|#*)?_(cu}DD<*h$G&2TJmXnIR#`Jh1Sd^lHFEyA|jNMWaid<_SR9A!b> zLjgxwTa|w8MV`Y|13*Abau8LGRf*87GsQ_sS%JrL)M!_xv^Zl}6?Jb2mQLp+8(F3# zn5Ocz=y?7Z^CYT!n{JvD3|elwH#l!XT5M|-fkb!$stD$>$(}6*;VHT{hr?FPxf5D6 zqfL2d^T5Aa+Zg&s16R$NoZNmD4b#OQRs1QVrmhPOZ_?||y`ka90*^FkvBUMM;q47# zG)ERldYiRL`Yg%@SCu@0U+|D&J%hWwM{Ss8dE@<3hlYfPUp0;YKraC;h3mK}ub5i` znXPTJ@hvg5LszqvuH)A_ekR*MUok8ar&1YrBvDcgMtd55$BzniXoY^k_D$EV*Z8^6 zP?DZL)bV@iDR$Yh*uAM4r|y=_GnV|2X>U5%fON)dm$QU_Er{__;_1}Y#JgTSdDE*W z?|D93sMm&l{QnT&Du^hXj_f_OXZ!CWojrCJUD@Mz(S3*e5j@QQowNe2W3)`tb}w!B zqaBY>nhosnC?4Y*&>_Du=v}U4_d13KlXB6W?7+x6#s*XBE!94;j>2H; zG396-Q~9`(xAx18FXpwhb`!~06JiZ%%Ucl%QqU9Z_x6G+&hKD1A@SQ6dHb{;YdvI2lxaN8s5_I6aGg21MLC25DAo| z<^p%G@XwCXH!rY&RG4F2*#d3k&*SE!uU&f|EwS6t+Z07rG2&DNh80vjlu@<8+&27_ zu*m&3yu*V>Rf1&g9tzpnVT>i!LO`!1!p}(rGVI#Fa3K3Ju3yZy-?)c&@8X&iuH!w~ zLqX)AheiqK82yhk>S-2WLS>?>sJ&q(5*9{1OyT>C8o_TUi1F>Ws%7(B$s`j&hz~Z~ aG(}yoRvJIUWNQX)6QNsyKTsCIAO8!)bXI!+ literal 0 HcmV?d00001 diff --git a/target/classes/main.class b/target/classes/main.class index 10882b7ff30697815f9185f2a90d0fa9a3422d35..1ffd688baaf79fff7c3dce8c4c44970b0dd57ab6 100644 GIT binary patch delta 133 zcmcb>@r{G))W2Q(7#J8#7~D2;ePfd1V6bOo5OK@Q%Ph`FO;JcKOD(D_$;ix0SDeJW zfpZ}P6A&^mI8NTlY$3XdK}g7M8-vtFpa>HK7mze!;F WI|6wo47?0Z49*OUKmBE3*k%18ioxnPr0S=ZAbpQYW