From 796ba8a2c0f6def5034f5efc927dff0c46f5cb87 Mon Sep 17 00:00:00 2001 From: Benjamin Koltes <benjamin.koltes@student.ecp.fr> Date: Tue, 29 Mar 2016 13:55:32 +0200 Subject: [PATCH] triangles --- __pycache__/camera.cpython-33.pyc | Bin 1100 -> 1100 bytes __pycache__/intersection.cpython-33.pyc | Bin 1765 -> 2619 bytes __pycache__/operation_vector.cpython-33.pyc | Bin 6254 -> 7430 bytes __pycache__/raytracer.cpython-33.pyc | Bin 3415 -> 3415 bytes __pycache__/scene.cpython-33.pyc | Bin 2054 -> 2548 bytes intersection.py | 32 ++++++++++++++++++ operation_vector.py | 2 +- scene.py | 7 ++++ .../script_triangle_multi.cpython-33.pyc | Bin 0 -> 2416 bytes scripts/script_triangle.py | 24 ++++++------- scripts/script_triangle_multi.py | 18 +++++----- scripts/triangle.png | Bin 0 -> 1541 bytes scripts/try.png | Bin 1610 -> 955 bytes 13 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 scripts/__pycache__/script_triangle_multi.cpython-33.pyc create mode 100644 scripts/triangle.png diff --git a/__pycache__/camera.cpython-33.pyc b/__pycache__/camera.cpython-33.pyc index 7ac9cd14ce80218af0287c5e0f604d59b9c1e5cf..9162902ab8f1d7ebd4d0c8cfd5ee667372bea14a 100644 GIT binary patch delta 16 XcmX@ZafX9^9uF^9PtLE6?5->TFW3cS delta 16 XcmX@ZafX9^9uF^<&8>GE*<D!xFaQO1 diff --git a/__pycache__/intersection.cpython-33.pyc b/__pycache__/intersection.cpython-33.pyc index fae1ae74b367b9008f501976711328e4472c8010..b1778d74fdf9ad5c715e15622e77de29694fd838 100644 GIT binary patch delta 1397 zcmaFLyIZ7w9uF^<Xy&glRSpJ*WCkR_%)r3lz`(#zoXWt!kix)_!pM-rzz_muF+x~O z3^_~;xy%ev%nZ3K3{fl$jP5DS3@I!OEes&CnTa8al_7<dA%zVj62-=l!p@Mw0cNu^ zq;N8%m~nwQ91JPk48a;a3=9mJAU9|*GB7Zdf(R`QCJ>W_fq@~hBr&fP#4E_0SoE1q zh=GAYPjB)}Mp;I-$=ey*H6Q{pnRz9tMa8MfC7JnodIgoGAVWQo#8@X!VN&52W?*1o zWnf@%26?fbY4dTW$&B?c7)qEJY8V)r85v4=8L~MTin5t%7#OnnK!REP3=&y949yG- zwY*@y0GLFG@-fu#GSu)fI6_tNGt@9M)bKNiq%bpNGcgo>WlUjU2nLzQ&rrj}AOVts zs*tV~V5niLXQ&YX=@AjH6=Wz8WT+8@+5pl6af1LuGYdnp9TV6jeg<x+{t_XOK9GUU zj11BuwL%Of++giOAQPII8G=iMq4AKy&d|)r2zH7F2Ll6xUnVF>GeH5Y0uK9hPy{eA zJg^6ce{v}(A*AM|fO!fUB9j|fW_Xo?bcPgVCg!E*q=Mt5%n(8uKq#Y9eg+1Hg8a<9 z63;xiLXc63NyVk0fG;S@%q!6lo-D;$Y7I6!6HI1-NoYJ*fH?)FYzzzxdHF@Ti8&e| z$AO7bNOVs=$12Ch4T?mM$)8va>*bh)7{wUH7zG#w7+IJk8Tpvx7+IKP83mY2IYFrl zmJpIb9tIf(G8^PBa6$kjcu<gnVut}7NshHF;GhMGFhWIG8ERM<YFHUWQWzPsSs98f z7*d!Rf>W3of>Y`l7=krGM*D%oGQ<s$d_#&#Q^7uWOUx-w)d1NG4yyu4$Q2lYJ(~z7 zlfa>#Twn;Ljlf<86HtF+By&)V6erf_rUqxGq}qZ4gbU<7Mj=Kaa8Q7wtT+)O5BELD zsqC<9;LX6mP{II8F*RVX)-Z!oTahzNkcj~#jwZ+q7G#2|tWRNN2nL4+C?G)L>KEds z0isdtF9q3)79b!Yu;&ZFBrG66g+Mac=U@Vt_o2zn2sypEf<gfl&J2w9j4VvplBAyo z=VTK$WeJewxrrqiV22?UG?T;F<jql?4z&r{BCyL41k{a_cd{u7fJz@OMlMD%CSf)n HBOVR_7DoJf delta 561 zcmdlj@|3rJ9uF_qt>?GGcC#=rBr_lZW(EcZ2L=X)Vsi!th7<;d6h?*|28IwQi;*G3 zJ%x!Og_)s+0Yo-4F+?#jq_8lgu!2OQm>E*o7=ks}85kHcL56BDGB7Zdf(Wf-5D5|k z(Gw3nGXdG+Y!wq)oLW>I<CL10m6)5E7vqwjT$-DjSArzuo>>x;l3Es@lb=4>kVBL+ zK0Y%qvm`#Ab@Ca;cJhpgWKv{gnOx1J!q3aVz`)ADz~Bt>^K{0|>zF1pa)5mvtid|j zkX43BgLiT=>kJU(%2t}J0rCQvC?&@OF`0QKsYS)9$t9Wjd3ptvrJSIkf{Af~9HBQ^ zlHE`cRl-k$WpV|lauN>%1A`|_b!L7Zsw%Lv5CmBc1cmTqIWAr<HU<U;E=DdUVKx8; CHj$$M diff --git a/__pycache__/operation_vector.cpython-33.pyc b/__pycache__/operation_vector.cpython-33.pyc index 6985a18e0b64f2524fb9bd0aa6ba3ed8b3334944..e84bbd2848fce4b6cdc33127148be27cedf31906 100644 GIT binary patch delta 1681 zcmaE7&}PLskB66Q^}|nLcQ<mTF`2k9Ffce<#e^2878S=hrRHTN=4R%_xa237=BDPA zAPKo=mc*o_mc{4fr%!GW6`h>R&pvq~(;Bi3*c`#E!brC6$^D#cljpL$Cf|U?taW5- z-fY7rPNCaN*vYqkGB3v#vfV!U4#y1gHTQFxC9{B%3<Cp0u^a;fLkc592?Ik3BSQ@X zLlzT5GXq02BM6D7FfoV+YcMk~F!+_SGcYiOr6!l;7ip9-GB7Y`g2hWglEo!Or62=y zGK)(}Ss54@lJoP6QYLXrlJ7<*uIuD$?&oCRY|YI^VeBUHlvCmaw#mPEQYkWEa|5po z*?y3myqj-2+178)<+mZ*YSGO{1d_?uJ=sa<KiLikmnliY<mb!HzlH0`bNk{3QSvl` ai{ja0&E$L9QoNpg&6mZK$=4hxAqxOeiAT@? delta 483 zcmZp(dS}2nkB67*n!@|A3mZApnApS^7#Q^QCMQUWPTs+^8Hu}j3$qF%5`XdoF}BI- ztgn%UqS@+@xSN&O#W8era3GXOOHK~v+<>HGvJck`WG=`GV{U`V2|S!;A`A=+DU1vy z3=B043|Wi}%?u39j11zz8cYlf41T3-3=9lmsmUezMPPwaW(Ed^;*z4td$^U6P1NAI zj?8@^#<tmymmR~EOZdvslugd!Pem2t*sLHRg``t*a=YMkBqf{Eg=~<dMK`|@PDbWW zo+0`lN%`alVl7DA&1=Q$VX7A=NWz$t6Qm_4ua&BYtCXICU`kGQl!=FPB}FH{l#vAh DB6Mm; diff --git a/__pycache__/raytracer.cpython-33.pyc b/__pycache__/raytracer.cpython-33.pyc index 89eb08a1605bcffef331f543624caa5026ea71a1..02d8c7a6d69ecbd0f4849f8bd080bbabd9c1a4f9 100644 GIT binary patch delta 16 XcmcaEbzO>m9uF_qR+i5j*#me1F~tRJ delta 16 XcmcaEbzO>m9uF^<lI4eu>;b$0F7E{k diff --git a/__pycache__/scene.cpython-33.pyc b/__pycache__/scene.cpython-33.pyc index ac3f713769654225108a1111d89b0afaa5f39b8a..89952a162f1aa67ab673f4253845d919d5613d25 100644 GIT binary patch delta 367 zcmZn@_#&)4kB66Q=Fd-I>zElBk{OTyGXn#I0|Ns?anwX*H%a#t4u%v?h86}8+04Wc z#ln!n#SpB)y)j>aNj{_~GchkcCpDQBY5<64Vqjo!1{t6+c^;E`ND2c(um&Ro1B0Ii z3j+f~DM-4^074l;D5Fvi1_p-Q#FEsa%)}fGkRhcYwZ*A9X%H1?>L-UXn#gg1>;P$G zVB`eDQb7g=2AGp3UuCXQfN?lMN<kJ2FoLauiBB$M5t}$eYjZV|1tX*2<Soog83i^+ zv9L2TN=;5;-M}a}S(t4dqvGU4Y@1~yL1wTqFfa%(^04qQmx5dwoSd4M>Zidvc_O<8 XJJit0o7p{iK+fV~5@r)-7v=;2Q0hme delta 140 zcmew&+$NwrkB66w<L<jK4rT_1WCkR_%)r3lz`(#z>^@Q1jV*<PAy|WRW0L^W<~SA; z#>olHtdpm+E@b4~Y{|yX$S6G7k$nTB_~cLQ>lmdbFXY%PBLvdQ#=yWJz{tbG!(7VB gz`zikoSK*Fr@=D0fKy}gQch<skUSTYFq<$Z0I+5oApigX diff --git a/intersection.py b/intersection.py index 9995590..13b87b9 100644 --- a/intersection.py +++ b/intersection.py @@ -1,5 +1,6 @@ from operation_vector import * from scene import * +from math import atan, pi class Intersection: def __init__(self, position, normal, object): @@ -35,7 +36,38 @@ def intersect(objet, ray): else: return Intersection(position, -(position - centre).normalized(), objet) + elif type(objet) is Triangle: + i = (objet.v1 - objet.v0).normalized() + j = (objet.v2 - objet.v0).normalized() + n = (i^j).normalized() + if l*n == 0: + return None + + px = ((objet.v0 - o)*n)/(l*n) + p = o + px*l + + if not(pointInTriangle(p, objet.v0, objet.v1, objet.v2)): + return None + + normal = -n*((l*n)/abs(l*n)) + return Intersection(p, normal, objet) + + else: + print('c',end = ' ') +def sameSide(p1, p2, a,b): + cp1 = (b-a)^(p1-a) + cp2 = (b-a)^(p2-a) + if cp1*cp2 >= 0: + return True + else: + return False + +def pointInTriangle(p, a, b, c): + if sameSide(p, a, b, c) and sameSide(p, b, a, c) and sameSide(p, c, a, b): + return True + else: + return False diff --git a/operation_vector.py b/operation_vector.py index fe5ffd2..c0a4af0 100644 --- a/operation_vector.py +++ b/operation_vector.py @@ -45,7 +45,7 @@ class Vector: return vector1 + (-1 * vector2) def __repr__(self): - return 'Vector' + str(self.coord()) + return 'Vector(' + str(list(self.coord())) + ')' def __str__(self): return '/ ' + str(self.x) + '\n| ' + str(self.y) + '\n\\ ' + str(self.z) + '\n' diff --git a/scene.py b/scene.py index c18a96b..c252592 100644 --- a/scene.py +++ b/scene.py @@ -6,6 +6,13 @@ class Sphere: self.radius = rayon self.material = material +class Triangle: + def __init__(self, v0, v1, v2, material): + self.v0 = v0 + self.v1 = v1 + self.v2 = v2 + self.material = material + class Material: def __init__(self, color, ambiant, diffuse, specular, shininess, reflection): self.color = color diff --git a/scripts/__pycache__/script_triangle_multi.cpython-33.pyc b/scripts/__pycache__/script_triangle_multi.cpython-33.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb3a5a80b95934132e49a6ce92b5e23a35fa7d7 GIT binary patch literal 2416 zcmbQo!^?Fu=U3PdHU@@d1|-1Fz`)?Zz`#)K%gn%#!oZNi$dJRp5XHcd%D|At$dJXv zkix{!%*en9l4EAbVP?o>VTfXZ@L3pgSQ$b<GAs-^Y;YDkgvH2^!@&^62{x6LA%}}0 zmzyDq8={kuA%}+{iU%ym$dJR!5XH-o!p4xo&d|cZ5XHxkBFqrO%n-%T5GBA6CCHG< z!jQ_(kSf5C!o|?c%n-%QkSfHGDh$@n01`}R201c?n*oZzCO5M&M2R4&<N~S3sZtcC z609tRfdQvVF(j2-NVbF7DO?OGU_XOw7iUNjXNZzuNR?nn;bRa^5nzx=;bstyl7u;) z4<w!{$si7~EJ_M2A;FL$i6$WpmXKyhkwKG?0ZTyQjt}bQC|QP7IfhgzhE!>WR9S{p zF@|OqhA4Tkpfp3O3|LSUET{k$l!6J0fCUv9Qk58*85p8i8B&#z%!h>uDCA+Dg*d#K zi6KgbA(fROOO+v20TdUEP>v!pM;^{mV@Oqja5x#V)M2s9&yWU=$S4hlR859dEs%IK zBS>A8HcUhS#BF9|h|&Rz@GxZQGNfuVr0OuFGBczzf*b)N1wrg)R*>Q-J%&_$h7>`D zY$k>xPv%r!hAaby6tFo_h775O3|U4DseBBndJG_M7=uMjK>lY0$(ce}oD5lJ45`K- z^RmoA?gFJoesF5kU`XX=ND*R4)c_g5m<P^9!5Xp*3=El|tmaqB#K6Fyr>DWlz`#(- z#=yYfoS2(hlnCL21hpVckW^-Fabj6&GDsAp7bFD2&Y(OBB5D{IVpth!85wGs7;2dr zYFQX+Ss6;enYDz8p@x|ui<zN@k)ehO<dzy1kVp+HC|0vrKptskWC#XZ=BL35at+93 zc?G2)c4ARcVr3~O0|P@zQDSmxJctLfx+t+SKCuL>Bso97C`AJ#SPF7r37E_TlUZPo zC4)T%R$H8$nwMJ2!@$6hmlR)=nwFDVk(r;T0rC`>C=CP!gjGyvacWU<j8ke}R$^{u zUW`kAa%paAUI~(rduB;YN@`hrPJVh!adJ^+K}j)`jxQ<7Ow3EqNsZ4f%_+&$E2u0L zLw0|BZfQwQW<gPYa%yogA1DY}K=w0=GU8E}c>)x1A|L|f$#jqo28IXrnJ<_b7&19P z;-FB=WCpQ7=9PlP;^T7@GxOr(!9IpLORpd=T?4ERY$lih8Jxb#C*nobw%_(p2Dd}H zmay2ad2iJm(qlbR-Z+YJJ3ys=+h_j&|NlRn2V?993u{<_A`xUmab<BS$T0<pB^ltT zNGvEw%}W6@p|JvrH%Q7uiXc$T=VYd5lz?NtD6tY8`9)wAd8N4pmEgpiS5PXzz`&53 zSW=LaUy_rVq?ehSn4StY9g<?f+A~X1i%RnIbBas(L8?J<0uB7kymUN44zZ&GLREr; z5INC+1K2mQB(*3rF$ZjCSZZ=feo?6?$QForX?$@(Mru)Nd{RzoX)0Ekvecpy>@r39 zrRk}q;#f^f%uCKl1t;-jFqs2(WtjnlGK5e@5Xu<r(hz8(ECr=FSW<|G*ue`<p3p=K za!@IX2*~l^pbrM;9#CcsE&v5MD1tzBbxvt+W@=GtDHj6+Lt;uwe11|^YBD75KwL;n zg5tC)wJ5*16r?3FEiDt|1yJh9$t;HC<f6p9^i*(yDatR0s7ubzDb3A;unUUvQ%aK| zN|O^o!3Ig=d5O8H@$q1N0r~kkU`7Fm0ZM|oi3O$HAa_A5j0f>SPD#$mFNWBam7kdh z_8z3H0lBUywKyZOAQfCBAP5>24j@n1<mRW8=A_zz@^Eno0|NsOqX3ftBNrI*FbXj8 zF!C_*u<$bqF={~}8>0}TBp8Y^f*}(pqb?&a2r}_9N-zq6)H3lfg7kpQkz)h^mE<1! literal 0 HcmV?d00001 diff --git a/scripts/script_triangle.py b/scripts/script_triangle.py index 4dac2c8..b77c4cc 100644 --- a/scripts/script_triangle.py +++ b/scripts/script_triangle.py @@ -14,21 +14,21 @@ materiau_sphere_rouge = Material(Vector((1,0,0)), .5, .3, .3, 100, .3) materiau_sphere_blanche = Material(Vector((1,1,1)), .5, .3, .3, 100, 0) materiau_sphere_verte= Material(Vector((0,1,0)), .5, .3, .3, 100, .3) c = (8+2*(3**.5))**.5 -l = 0+0*((c**2 - 4)**.5) -v0 = Vector([0,0,2+l]) -v1 = Vector([0,2,2+l]) -v2 = Vector([2,0,2+l]) +l = ((c**2 - 4)**.5) v3 = Vector([0,0,2]) -#triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) -#triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) -#triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) -triangle_blanc = Triangle(v0,v1,v2,materiau_sphere_blanche) +v1 = Vector([2,0,4]) +v2 = Vector([-1,l,4]) +v0 = Vector([-1,-l,4]) +triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) +triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) +triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) +#triangle_blanc = Triangle(v0,v1,v2,materiau_sphere_blanche) lumiere = Spotlight(Vector((1,1,0)), Vector((1,1,1))) scene = Scene() -#scene.add_object(sphere_blanche) -#scene.add_object(triangle_bleu) -#scene.add_object(triangle_rouge) -scene.add_object(triangle_blanc) +scene.add_object(triangle_vert) +scene.add_object(triangle_bleu) +scene.add_object(triangle_rouge) +#scene.add_object(triangle_blanc) scene.add_light(lumiere) affiche = raytracer_render(camera, scene) imsave('try.png',affiche) diff --git a/scripts/script_triangle_multi.py b/scripts/script_triangle_multi.py index f3fabc5..b51df60 100644 --- a/scripts/script_triangle_multi.py +++ b/scripts/script_triangle_multi.py @@ -25,18 +25,18 @@ c = (8+2*(3**.5))**.5 l = (c**2 - 4)**.5 v0 = Vector([0,2,2+l]) v1 = Vector([3**.5,-1,2+l]) -v2 = Vector([3**.5,-1,2+l]) +v2 = Vector([-3**.5,-1,2+l]) v3 = Vector([0,0,2]) -#triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) -#triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) -#triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) -triangle_blanc = Triangle(v0,v2,v3,materiau_sphere_blanche) +triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) +triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) +triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) +#triangle_blanc = Triangle(v0,v2,v3,materiau_sphere_blanche) scene = Scene() lumiere = Spotlight(Vector([0,0,0]), Vector([1,1,1])) -#scene.add_object(sphere_blanche) -#scene.add_object(triangle_bleu) -#scene.add_object(triangle_rouge) -scene.add_object(triangle_blanc) +scene.add_object(triangle_vert) +scene.add_object(triangle_bleu) +scene.add_object(triangle_rouge) +#scene.add_object(triangle_blanc) scene.add_light(lumiere) affiche = np.zeros((nx, ny, 3)) rows = list(range(nx)) diff --git a/scripts/triangle.png b/scripts/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..4903dab3f31361c73814004329e1137c9c72c6d7 GIT binary patch literal 1541 zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Bd2>3~M9S&0}C-U@3O;4B_D5;Hcq9>0n@B z;4JWnEM{QfPXuAc752+B85mfXd%8G=RLpsM_jOTlsmQU1p~tgR1lS6uJT#CwwX{IM z)kQ?mMeowDg}qlwp1-|k{d>xj%CxM7y19>@m}mc;yv26as>w`JwWi-$8&rikSeP0e z6a)q{Rm3sxTrFeSbcb&@Hg6XH^}FgF_kj;#fij_2AE$?w8a-~kS;%x#+5fdk*W%6l z<=6gGo^X$4llr`?Q4*nFU$}NAdo$fEe13i9=SG`93y&BwG`?B!IdM(gdjARkV=9<) zIa7{r;e34Xw2>{F(gfK{CFeROH?QSPVc)|0c*UxB|3gCm`;_1OHrGKcCs<<j_1X81 z7qDy!IDbB_ob&O$)kWVVW;lqYnVRnM>)UOAeY%B>g@r_;&XHeMsavDi8qef(7`)q~ zC!DOpG&AtB<>4n0VvT1M<{Iy6DGUkSem~^%-CgGtn*~m^>}o5#`8)4_)N;X&L=&c& z4zr8h?q^6$cW}G*ZO%p03GeSsTWQGH*t6uV)z#9iMwZJ|Cp0cC&02Bw)$RMQA0517 znIgg@d1Auz9<%&xSCeSr6AZJit=!18^Xs}hFVs~g=;nN`aGPIW{JCG~_z{*%&euz` zrd&Ps%Y?JB<VyNnDWwV0@4W?#1w6cS-_MoGzMCY+wDZV?*CF#8*41m=ce565%-Qhr zx$jv)kL+`*&B7kdxpHr$t)^wmpB5HMSD8?J>(7@7n#@0+trt3ah9zkB^_9!E`|iy% zT;I&M<mK{({h}V%Hy^+1pIW7J;2@jP5yhG_nTL&JViczP_U<$PrI@_))6P3<cMGtK zpP0P)y8fzH7g^%p*M{D;`2D$k)vmgCwewfKdbM+Zy`FGNCf|p1hh=9d&R;*rZ^GoQ z)4y&n{W;_Dm;Wukd>^J)*sZ)AefpPf_U-A*qO;HU@BQ?>B7D9dpTUHwhDwq~2Gbri zFt3!#pOs^s=y&ej^VB@{a*zCNQ5Saq3;Q^^XwAKRc00#wvf)=B&#J#`RsHkX;}h4X zpXOL{F(CVTYIbP%?uF~-x;~09;?}<AR(pM&WM@W!+KHvtuCMEBf1Atyx-_Wt@A;4G z)p~s<T)X8r#g6^^viiq-4XOr?R<mDzoGkrbeP`L9`J9)$uYW$tarr=HvXI(|u(0Qo z?Ve9E^IsBGefw;=aIAh9i%|#X^>xuoGbf2=8@$fGejz)w|9m>{?OB{gJHBMp+zx#+ zssH!4?cMQVJc|t+-8RqCIRDtabUx3!e{&~s8ts}m@AlWbw>{S%U1;Q}W_WCK>)ViE z14p%~@5J5}hJXB??`OX@%uRVhWJzsQZO8L(`e);vOqvBwtZB2FZy?rqX5Hz{t>$~) zpL_jM|65~$M|_X$pMR5?6Pk4V&gcK$`}@`D<r_+Q-4wc~D&5?Wb+`KJpOr7pc5ThL zwr=N41?$Aix2_s^zWZ-+z4eYa(@o9X`C;b+ST+^+y-w1|p8VwC>7RP{<`uHtjFdg6 z-sY9BcH&(2EDiNg{`fOhE5Efmd^=Vc8?jZcGbK7~&E8GF{zg8(ruX`4n9qd0C3$bH zzDb-i^O>;s+4pt1uNmsy6}O}xZ5rgI7SqA~N(-wr4*uJ5fq{X6!PC{xWt~$(69AvS BiqQZ7 literal 0 HcmV?d00001 diff --git a/scripts/try.png b/scripts/try.png index 09abf45b713453cc820b6eca100672c98914e8f3..95846b642e6cc8cc5fcc12b1a048252d89e8c8e0 100644 GIT binary patch literal 955 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4mJh`hJr^^Ll_tsSc;uILpV4%IBGajIv5xj zI14-?iy0XB6G519h5hnO1_tI>PZ!6KiaBrZ9L&4yAkzBq@taEiUpfi`LP8!o69lx) zavF3`iAAkqViMa@TA}$%;Z5Si9xKV;RmVQwC{~*j-}S~K^Yxe4vddi;F@6y5S{C|J zIN&#Di%#PNRe?<`PSYGt2ysL*DS9iU5GnXN!{MCQe1~OyY)dq2nPyt?O(^63wDL=3 z%8I%PVh6Z>G(UD&DV@^%Ry(7?`nK;^jjv5P1=<(h#5-rXtrR|TJR&!L{a$B>y&7K| zTO@Y>4d30K?Y@%x$N>lDISY2@?96gn$)3V+`2V|h;YZ)H9al1|v|YR*@ZnqbkKB3k zDICd9@0PU+C<<9~*`E+-EC0{-k(2Yg<YTs<ttveKzfZW)!f@xhaNGnziHwHb9<#Z= zz2;Q!ILwjH#&*G;b7QTWh~0#i@{qaPcQc-vQEMimH-Yz(KvmtH{5}50Y;C-)>__JJ zOnG_W-(TVP0&L%^*|-__x!5}ndpH(+mGM6)Q8kBgsf|bX7genyUdQuyLwL5^+I~oV zvP#FJ``=2By?qbL?7#KCw@$0|@tjhmpqs;zAi~D*htIC|)s%?iUJIu%&)np)aCg0+ z4A=ZJj)2Zn4K43iB#9T;Cp*=#_<!8~us!;?#I$u!9iw{ohaJ&-;(O<Ul~{F7<`g#X zf8zDJ-xP)Z`=$D_N-=!DSHAB|`5MNY_!-rOwYLrX_j=Y%yd1^%MCz}Ap~wR6;{DwT zUwL1rwA?73<`BvDMCx1061`~tOM+|mRZV`pExGZYpI!IEXY7R%?Rug7%bi<lUp8`X zckVyiX{3Kb^w;u(Oa;f~pSo}OC8LwM^7hVvXUsbfefT7@$R>{O;HyIiHYPlCn92S` zD0A}1B{of0D-UgAd*XhQzo_#^ip|qj4(t2AX9dpe?upm8?}%P?=wwA0f78{OhNhOw zRrEb}gxIc^KlsYzz{%E0{6};{_4~vRzIvP&d3s~XQ^ud151#&K7yQQf`lQC`f4bhT n+W-A`Wa*QgQVFN&YxWa*r>qqDS8|bofq}u()z4*}Q$iB}D1VRF delta 1557 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 -- GitLab