From ac072e6c1b8115cea4d8291023bb84f0dcbe7a30 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 19 Mar 2020 09:14:42 +0800 Subject: [PATCH] add dedup doc --- docs/images/lib2x-dedup-1.JPG | Bin 0 -> 27679 bytes docs/images/lib2x-dedup-2.JPG | Bin 0 -> 33161 bytes docs/lib2x-dedup.md | 45 ++++++++++++++++++++++++++++++++++ src/util/dedup.scad | 10 ++++++++ 4 files changed, 55 insertions(+) create mode 100644 docs/images/lib2x-dedup-1.JPG create mode 100644 docs/images/lib2x-dedup-2.JPG create mode 100644 docs/lib2x-dedup.md diff --git a/docs/images/lib2x-dedup-1.JPG b/docs/images/lib2x-dedup-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..9664cf4807727662afcaf21bdc78b2147be21f09 GIT binary patch literal 27679 zcmeIa1y~$e)-YVS1_2H zXJ>cc)$jfGf4*tBUAL;M@2zw0Irn(qf4yG-uw*4=Bmo#07{CMi2iz}WEl7A+TL6H( zJiq_|05Sj%BM87kdq~g|*Y2_EnNoejEV|0Kn?oBK_%ebm+MVv;m}B&^P2C zz29HIW8ilT{EmU&G4MMEe#gN7ix`k~1-V$;Lm@|qg!@U8z=diI>5=fi^sAzye(J+< za05Ve^q=~F(khTY{J`ArTE+j1^z%E+zhmHc4E&CP-!bqz2L6Nr4mJ)p0X9wnc794W zet{qVe86A31^}{vD*ysq0Bhif5^}$YMr7sU;wZq%Y7b&DHghmBXEAlKWA!k0WMyYz zV+DjnJsgcqZOmOLP0TH=?S*Og8(U~8t<8jKHM!;4J$t*oWJoXu6e6x2+;Y)tvh zXhlUHpbB{ic-T4GnY$QMdf3_8g9JQ;AOAGE0JQ((GV5azA!joS0hQ;Hf4BpBCj9sh z&*JXx&f?C=;^1t_%FfTv&&tNZ%E7@5y@MI#Y42j}!E6tr`ojRv%|WKl){ZXL4)&Bk z1~fKtaCH%W?CNT5CSYM~!EIt@#?5SE%xT8V&TeMRY;4BK&TPiXX~xUV&c|WFZu0mK z)0>(8GP|Rzv+YlFo0+nj+nU>%+q;0E*kEUU%=+^~|EK1JqUe`N|0?>SFhcJU5O+2= zb}@erZ6ZGwm6?r`nVnzlj|1KSS4_)Le6WsBY^HRbuaF0C4~b z0Ra&K9tjZv5g7>y8TBC=RL4NY!^A>=NQg&FM2JU7KtfLYh=h!WjDYYl%VQckdPXKj zVoFv{Rt64Q21bS-gTNpmBcr0A;-aD9GLRCIGW^r8`&Qr~GR!(`3mnX20QMma+(VfA z4uAq0ctn7PDt|;P|L}r=g@Z>xL_$VEMT6c@jRnBMz`?=7!yzERL*tY%zR=GB_=gDC zkJ!Z!ag>db9y{T3yo$;|rg~Q1hNm)eK+S359EgI7Pe4dSO!I`6j-G*wn}?T=UqJl1 zgrtb^-GY8tDC!rr`PK@L2rZKg@i`Oe1OEp#U~_YW@YE( z=H(X@R#aA1*VNY4H+*jI=FpaG8=sh*`uc5pacOyFb!~lPbL;Tv_~i8L{NnQJ z2V5`!+|OYB0@-iidI*IJ79JiB9_a^MFtF~>2KNvi;SoC`wwN-Ku@lZ?j#tRI&!RHQ z+fb-DRSxh>oJUacsks(u4u6356J-AwV1fSML-_WCzeU4rH`8a2njSQ>mA5O{7-HNMH;>&l^fpAEOfo_IoE%))K84Ir z3@qkOJHn_z5MjC|X^OHlQ@#?B6OH73sZuPTo9p&;JlEt^8N_{pYmw+4AM|YCDdG$C z@=cu+Wog*@76ktstu3A2>*-Hnk7ovpK7XxXBq)k?X`<~+anCI(Tr#={8 zAEP;{CV10kG$S@Ro-GBe*sW=b#a>D}J96sixTV=-Z@MMgrxCo|C2;>MnkKuTNn zsmljt2})GD%zz(_zXiuXZ~GJJNbo+k?wG$T=8HDlM##B;rSoJku(F<^e>$qko9Ev# zwuD&XHQSxlPM!eR6VXJeEIG4JXcK>d^+cp?1)}F@cwi)ORe;P;y8p5ky0(TUsBLe* z21fHx>Sd~^Qwx9EYe5?T5K(`DuTs;PVl&X`1X*)|W(ESKb3)pwLnX!ONwLIw9_OUP z{v+i62SNbd@zmdPGm{3{b;5(!ZhzXc-lv z#V_=;n6!vf#hC3GQCMBT@NbHY&+3wffelobaDm`eSK+&r>*|P;;vb}g=`x=d5Wfm2 zgyw;;0R>h@xW8JyKQ7~c!;$|w4bH=UX-l`Rs&0ps*7?}L8hoaSgY7)C`X=imZ8QpH zBnlBQ?tk#!aN56zqSLFh%IWw)$w=rCrPtzjHO_{ZUUDlwYDT&)0a^OFSA&AA05sCQXd~)ub9B=WA�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 Qa8=<9{tr_+(*3vp53>@rr~m)} literal 0 HcmV?d00001 diff --git a/docs/images/lib2x-dedup-2.JPG b/docs/images/lib2x-dedup-2.JPG new file mode 100644 index 0000000000000000000000000000000000000000..c33b9c64f11834a152d188a3b29531fd8b038216 GIT binary patch literal 33161 zcmeFZ1z225wl>^Ya1HK3f(3WCAPqqi+@+B~;~oeWAP`)G6Wkpdmq2iL4^DvKPLRKI zY|c58nLBgu{qA@F=R2JgU3>59UAtDTTI;QMRqgwk`(*%@oHS4x00RR9aD)B>+^=9Q zOSxH^0RRdL07d`+fCPYt5d^?ObBNFbxgbjbJTwmj&8w!Qe*Xqw003BhJET8dM}r=V zKofv;2l@x;d+x8#UlRCB0)I*1FA4l5fxjg1|DpusoE@DkZJ;ejh=ltIN#H^eLq;V0 zZ~5xzsGst1>|6jqboAfye?t{WvEL>47pnMwQGfnw^IsD9O9FpM;4caMC4s+5fP;;L zO@NJ4fSsR`jbDJB1NtBEqjLa&9Kadi2yg;e0=|Qg`xR6o3nwQ#0ajKUM;0SfTVoK5 zi7lAb&B%_GorR4RASCK$XJldpa-uW_nOoWj(;YOn(otHP3e#zDE3hfpNrEgaWj!1~ z&pi}hn0Q#3@SDBT6^0wT+{In=sW+cNc)>zn^BM5)pDRH4{*M zD*a0d=#enhFVEuY>dNBE$ztnZ&dScu&(F%n!OFqG3@yRz=x*a=2{Nd3zVo`M`r z94zgeENyKlzu(Zv*w)!en9AAN(p13A$c)?A)Rddq*of1VnVsF#h}p=LlbzX=lhc%! zo1KrtjNO>(m+DPTeyiQi*}?j!x=l@3LDnEJ$i~SLDh+m4D%PJL`oF7AsEB^6^oQby zwh>xJK+*wZ?Eh=MZEY#?Gl2fNebB?7Gte7DwGJ5>S%~%bb^g5&emVnHI_U3y zQ&H$IDgOsPe^v5t3HdK^{Uxq{O9KB^;lH%&FLC`_68N_Y|D|33KNHvAU@pi8ifvt? zAohM9APGQ3KzM)vkN5!L0TLo25(+jd6l0*^VPc_S6XFpQ5#kXNkdV_oA|azCBOs(= zp`xW{V0ywtOv%d0%E&>-$i(>lCNPLdNGQlCxTvVOjHHC5jQ{rMz72ql1WOLv2M0q1 zfW?M^!-l!<1W-T&j|k9E<@adiFCQ3KICz8yh)BpNsL%p6SO8cUI5=2%I0OWEXq*zp z3wj*@kBxxyh+X`_Llq-LDtlZG->45r)Dji#c&ej^G@Ql`e#j{J1cXGyw2$fN85p^^ zd3gEw1tgzJNz2Fr<(|J#Q`gYc(l#*#nVDNyzI1eQc5!uc_wauc5E%3}I3zkIHZDHl zePU8(R(4KqUVcGgWmR=eEu^l#;bTYVr>^dv-oCN%iOH$ync2CO)wT7F&8;unJ4eSS zr)TFEmsi){+XVxF`?*=awd_yr!iKgB79JiB9`Sp-U|?OL2@V?`;Su`-9B~yyBm0L` z9KJ}n5>X#2+L5U_RS)ru9Y#^`X}DHskG?nUr5*0+Y@mJFmv>*)IV_(iqoH@KIg*8+V>aM_t5 z3;-1=+@F(L#ze7=ZE0~y8S`di)$Dn)+lG2H`WjQSc;C7M=Y(1kfIc$>uz6N?ndH|0 zbWCOtJ@;1qD`ui%`$jwIyAhjcNk;ZNCP^RJg=SjE*ZB8<;J|`1tFqxaTkVevX+)GY zW^X^hMV#FOUfQ|Sn(C&(mH`!fptbvazwQ5~w0RFGZ;~`Rwn(G@jJzyWJc~NaAhY_vtn&30?dViMwJ7|d|b07|#kOMw#R5((XOW-zro*g^a zJ%G?cJMPp4+rTUBPWOGW?T1(LiDK~anr3P)x(}{=s5flf_)5I)0krax&}w|E2S?fLyKTBkPvs6qH7QD5;Ja8#|Wfrzmal$nG3q+ zQf2cKQUKkRKKU9!6YavdPe(_W^s-I;h-|MpA)+*0^C+M@U@!Su4ZcIoI=d9-6@=WQ zP_g788@ad{YO{2EBw^tE=QUx$tyC^A7naia0@^qEh{_=cjD3SMoSiUm%z=HYZsDsW z1{8V<#a13&{-zC}vY9i&w5L^p20Y91n*{2$Xd1l+pJ88v=1&YKNo)a1d2^p!m;1w5 zUb!m+ZH1Fl8MPdEX~yJVmLT*zzrfx*-?IT;LCOVyp58gz(UKG)B?m$r7Z|FKCsm#@ zAIB5bg{9%qFd1oecsBFvo)W*#F)7mQewCxI^I2Oyon>`SEtPMktTALQ-0 z8YXh_tZp*qMWYwXcIk(}1I2G*4Y3_G7&x0Bd5%|6*+D1ZxS4AQoB{2Gz_Y8zlVwgs zA|peO()A8g#}|WB=&2qGC+ft*@I=#uDdUmZy-CUN0OJKOw?e!>!mZo`_PndTTEB73 z?-{&Y+`MX0J^0+1I$xD?lCoL50~nmV5zMw)0#2UpzA9k8AaP$5ePyG_F)Ax!G4JEb z0FQ;l4_oEEg5NTJXN%$XPPwL=YF^c4!q7zs--OBiR)BFJ1nNkhkYs13&X9gSj|e$! zO;8>MpVbAydQpJ_HRw{3-Deo-*G(1IQ^+!K@WZQ)P=*bxJ`wg6qoo)ryAa3Y` z^PW+iZ&u96O&F`5e)Ylnf|^OHsFj%k2yX%Aa49ev`I*`OEk^0T!?6AN z9{-`CD}BAywnS3b5WmmNB8b|%&@`Q7(j3>>nNoXYME@0e-A|SVR$7dEL`4iLe3{_W zd%%+A67Ai@9i6{c^}DTZDIoKdD3g%iK=hg)fgcIAnjdOWPUBIl&szK{7fMoXEW*h= zi{fA@HcMPbv`ie)d>zlq3Euvf%w=OY*1gY%K9}C#4E88&?*?kWY0N>~TWn(+FZQ=w zzHSL^@s~8vXTwP0D#Pf04ia58Srx^yNGn?JuKjT1F1Oq(SI0u@LoH@aDeX3?oZV}4hkO8hbQ?ek*UeS-dzrxZt)6lwWEnU!(=z;9z_fK=_GTdKuflCN}W- z7jby!2RWHO{H>QVXY=Gv26zh`5mC%%uU<5UaD9bQVl*@I;T0;C9oidkh5P2($wMIm zS@Akdd)C1HrRg}QSsJVqrbcie5L#3m@fC2*v51IbG&#XN|7wA^6i0)Ubg0xg8kb{~BV9;`PCLZFhJ?#;k) zvp5T-fjq+#x@ev+yg`lG{a^jo;Qh0^%PzI~b|)7f zbPq5D%iIHGw4RGO#i~eAqR?mh{FJgvUY1*EKlo6zSR7%SHxG1X?1XW7q1s7LgSKoR z&3NYc`pG>&q2=%{R0PyGF}7-#(i5cvXGcT+ZcD}{RJMy2wSyzc0<{HyEN|446$J7e z?e)a!fA!>PZ2YE#Y3ekkAy??v2LPfrfF1Xj%t!=W6|w(yNy-scPrKiiAxhPhzKemF z7Z6HToXwFgfkd6p&5R2(cn|o z=WTVFu5`PUwNkdHv;sV}s%!CdHVl_ezT)H85X11cG#G%NIA9%H z<+FFM>c~CdD|-Gt;L9%Km_T4mp_aU@(+CiLG&Tt}jzmw>umHUSmIG;BgBQGV%PD@D zlg$zaKIa3C)?l7mWE;V|CH3FxYR!@ZX}+p0C@Ly(6-?%->8F%!=Wh_nNQW#@*Vj}Z zolP`sy{*B-&_?H&&@}MM?|Aw6#71c2cA4kkkrL~Mv)TL!J&7y2mD!Q0ONE|gLwL}t zAipw+BV%)NFAeizwp+m6_!-Oc9GI(Jle+Ov@12hO zQwX_rH0}eKYIoYELk$ZOU)^azkqBZvZwohD)p713`RK7;M-%(Uslwml1w*IRSt@$e zAXv}n;F#LY9MsF?-tg}1h1GmJJ5oGCdVqlZ{9+=aiQ!`jW8vv~dTz!V{eF0ENavx!eCrC#;XUBIbx!2- zZ6f%*tj6ZV^D~3%!Q#-~?2!AAqmJ{_07nnk8wC-{m(wK!9zyKfkq=g)weVQzsL9l# zN&s|`#-0FVW=Q@HeuH9yYyJ+-6;Hff(@Af2ZKu?eZUBxQ%re^4W8ZrKZfnO`^AW){ zX_O>SULnj$F;360y&Zv#L*f21Ox-eu=CL*)xl^ENt|iMh)1vlbYEHKwVP4*QeQ4hp z_%=YOGVEB+haj3whjI_jUUY?jocXn$$7kgcJ@2X79E)Cfk>t_@=el9S&Y*bIix%yw zm)CUE%JE!ft z@!G{e;S8vmwfrcZ42GBzV#68Rs$>86opipg6^{!f%vP|nGM~0K8WBQvq;A;Yx9zIa z7mWt%k|ymX^RkP3TTu}^8tl}PQwLrRkUw*=-wo7$@hK(94~D|W-ZiM?u@ zjqL19*(&&8RU)SIc6D<$`t|jJf`@ul5#lqi)et-vss^4~0lS8HN4ZD#G&T8(_FY{G zEXmWE2UMlomE*v(s;@AIL)O4&sEv9pQk@|Le7YMl%Wj1$iQ*`-Xl!D_G6vhS?s)xS z1BJ#QBAG>q`K>##YDPhB8ibefNUG0JSCTY?g(J_BZo2N4v9_l0an2Kcxyo+h^cFS; zkBjZL;yxyn#K6ZnbaD<2phC9L`e>Bi=$%)#Z?z@GnLg-oT!xa1PR+U8AZ}<+2D{z^ zsPAH+POty-Es2$;(FXm{k;~}avx4lYJS*E(tGe^xF@B#RMV^Wq8HyZ->#l%oEA6K1 z)TvYygJ*5YJ&1938GsDr7^{d_gyqn1Ohi17kSVvX&sIM$G(KWfR@^2`pP8%46EJvd zW+4a8JBfiT$z{2X22?O|D6FUuA z_vZS#pM&FALy`AGZD6%xw1lFAeZ9;o|1DEoX5)tx0gNH=4K8$?xsp%bU6eT-H8au;~ef6n!V7gV|OfSfrAQj94ABF$O z6yRS|{u;#B{=5VBgFo5H!UH^eo2HA`7r{f-u;@h2q%QN2hGIp+dwrpy)MjN zj&!!GWD`+|rAKb-DuJHdke)d z9bN|!QiRck*htSX2XZLAUvLn_+`ZD^H=s*2bN;fLLf`+iX5Mk+g9JyOJC#+z+|It% zJbzShJAd0(QIxQe0e=nS#W=jw3t-M+gML>gK=kSeq+Sk>Xc;?iy1U zEpM0^!YGZ~yQ1^X{ZV9{7H$^dVw4XxDMzIE1w6J=W|&Xs-N)AIE!pVWd~)Z=`vd`5Q^|djLh!6W$&Xl<~>)`}^J;N%`8t(y7 z_Wrp(hwp&*>-qxB}o<#k*R0UiW-CW=A)6L%{z}jF< z+MH6_(h8d6(}nCpaRf~#N0 zj?>o%Q0y@}T0>YpA53oXE*O_(qe~g>^!n&ZBQL=?N4n`n?u5trw@{|%s{WM|U%wP$ zS*br0{A!pNXSKTpp2%4Ua*@jt6e}QOHZ} zc-DiQ32uhRZXc!9Brw@35K}@;d`Ir+#*&zuco{F#Z(?IL}esjePLztGnxF5E-JM?TB717NgZ z$*TcR9XFX%rsnxas4RWROaak1ewy_Mei`zYoo3nRh5{#)o=W_y+T~CN;kvzTJz9GY z?o$D;wPAst*$CsW-9(fr{-+dMc`6TzOdRHo>Lq3Y5Bj2&ay_Q!K!kOD5zN{Nao5e> zWW%i33I+P?BlS|a8ch!WW3w_zM`!eG5%7TTL%!bqmoK-Po;&cgTeC-dcCAItcpLQ9 z9o0n?DaWZb%uh_k@^5B>b0(V#_ehTfGWzlCBqF@!R`&C(it5d+H>K&|x8TZe7>SwI z?5|>vqC$1Sww!9;BfCllY4%2HfHWV7(tjU`DqV^M zCivFZ8FXTiG`Z2jf6V%R>Eqx?JO>4Do>(P4Je>attQVw{hg9FvZYQ7bp=IUUY?JB7 zMDH2%x1*SF?Cg8zAyVMI7b2Co7PHNQo=KCo>`j}qQgp) z`mpy7{O#}w-p8WbqUUJM_khvb8i;N+F-vmR^HN|iFlr-J(Ys3Ov9~uBTL61R>tmi=2f%`~ z65Qk5s^*#rFwU-0ec;a0v#&|Wa9M`SD?x~nGAp{Z5K9ojyRDX~c~wYN{KqBw(kEN> zA>5|XCXeDiP*V9)k&PJwbPxkSY2Jw9mmlwVU^E&Pv0E#+Wk@-4B2d)xs)vzJb`23x zkdpG?qT`_`BG*o*R-YP_e7->#WJqxMKJ8S>n{xdq7+S=T`_S%fJ@VoFb?H74ho+UXzTKvkA?fH>ro`rV&m2c0mWZ zvD>6_*QjpYJOg|Krwt&+XJ9-X%QEdzoxGQZWbFjYo?6ago}P?7cgXq!aLLAk3{@lt zj&NH*_h4IVp-ddt!D4RpO{?f7)0|-HBpyOS!fm?ky8DtwY@^Wao!NqYqxWFrv@8Ga zppw4h=*-NY73cf$!eLYNZHsKXBi7prB0))0lOsxszJ`#M>RUN550DrTGyq_;kLp(1 z^cI-&|HO`W50Ha68zQntiVI(_QIvSusJ%CW>Sm$bu->`QjTBLzXD`XAnw8EsorT*Z zkb^*(15KitRkoGh^xK~s)8UJ)Q!HuRgnVxpGtV>6RT5WTJwZqz;?dgucE|B z6`l(A8{6AR) zccw+HCLc$VW`GM$ObzY3D|Rm@8JSkuwc@PRxD|7%T}RFsM#A{@pf*O|sBWhJeQaN0 zB_2tfjvZnhA{_N+*wlYQq^Z+>zKOV2y7g!EJ_VP6r~Y^-v-&#X*tFlojBS+`r?T2t zdQ)uGt4+CE(8qJ)jY^&u zI&#sReDKIZi60Bm%(KI#?N88ZoF>!@n_?P)t@XD%1G@SBhplt1D_EoVfNIZ!S}#9L z(c$65O?RtC7x%@KEuqaC`pn9d`s|GbOD#?M%%t|?G%Ypd*M=JWghCi@Tjb4{rB6eh zf54ZK+~L~4`rKZ8oJvQh~u2>4@ytDgzrN->N@QrwV z8M)TuxG(`C!31P{+ z^uo1%KzBnuK6jFB)ex6Y!4~K)wP15sY=-`Lyp6Gv6)r40MrN)F2!f(!0q3+l9ItI_ zbGE_9-i>JK^j&t2ykfFjs5(ySOS7$EbhobR-oZl6p-PwXr|;b+X_A4|fda9ZwuG<0 z&>B*^>|PL6!cbG1y=%RqI8FcdKp#pr&TG$?nthfYb+RRyL1zNiRwRK1zEsV1MlsPx ze-2dBt>`7>U)x;X3S(#hLvY8dPQKhSUxsMxI8CTXImG`%12&04bWs_pvkqhL>)XB+ zlXB9nvK_qx4V*-j-~!Z#63V>%MwzqyJ(wQW>%hZ0xE)Mft8?Rx26aw$D5b?zQQ3t~ zX1lmt@4fjZle$r5z7c6c@qGNO1i^5J2nl2qDc(cXblmV6U2J5VWL~s2vImB+Z5gvv zV(X}^sGn0{rXg*}UYmJzYx)DR{pPc2C_?^%0kyjScHjm!?ED?n*r+E6#3!4(+ne5j ziXm7}B5Y<69dJ1E81tyf5Oc6ChcT+Sk6#i5GDJS8bX9*N3OArzdd8>BQv|=`vQHbf zLk~yA6lSF~nj7=HCPKX_xGl^n2P-*%Z=GfgEWsiEK)OfQKYoTbLBFEvZdgHE>1%Hd z+7ouYID@6s*7_x6$;Ub{k~lNQjegNw`MEGsD(|Gnm#54o!F$w!*DJ8P3RpAda4?<& zb{i5tIh8N)0Y2UQ4Nj0Ki|PLC9aXpRW7OQYz=8&y#~X8G@R4n}0at+%yhB9D@K_mS z2zbdXCA10W9xr)#VRf3M4?rXfpWyRs`vwXL8TyT-rIc~^8Rh)V(B--|uXp<9j+d+& zh0`q|;cAwYOB{_8q@^;{!cvq^Mt?T-Ke6g?E4$w5Pb=@*-aF8azMtI)S~QnEi~$P; z#Ob+H6Ph7v1GvD1wFQN}4)Hz53SOSZp?gHeLnzPibXl+s4TUlFzWeb|H&6)Dlzi)JpnDPr;)RPZuv5 zbR^Ne6-wXRBT<^T30u;b2dmn$x^P15_=Xgv@3s6(r5wg8Y%$fZnd1nGCFrpM<60garlkf-|k>Y^mN9*sqU5W5=usO(0*}~{7 zl|~|KeWu}`Hoe}#Xyq>2Zgn-Y`%(I2^Q#6_uUD0n|K8>#<@Af3DZ_cb;c;N&7qW9q zYt8lD1xs=dt;cxs>Y{6=!@lk_9?mfcEioFexE5(L(woW zg;KWC1R|bABK|Hi_jkcEwRt`5^8thq7kV~W(E&C=#}O~~7lk@HChqR&<--TMOoq#Q zchpy=QxmjmFXUn@TRI1&myQ-@2W+ejQ+*z2PWF(madYEpY)2{3B(5|=CwIA&|B1o; z-Fd;*X1U*{<}5DVCavy%9clV(UK8P2xu@!qc@KCQou&j(5mKE zQ+@np5t^OnmKnXvaz1FecC6SH8I-P3b2qGFX`9bv#F`so@F+4h%hR4`S%aqHftZ>M zxrreeBZIFrv-T3$49rg5M1Ymy;#!$#L>vjF3ah+x~GCcg!|#lunm#{OuCOI&P12q!2=_^Xa_khkZ!jk>c<$HiM@6^{3eQoR$!e?*QEi`Q( z#V|^5qVZGJo_<4e>L=V|PFq=x5Y*n>1g`VboX~_0cwErIh5PyND@d>FU3RE8>JnDJ zdzAaM&4hCSH_6FpVlPBcU6oDLZS9Gh?ltka+W5g4UyVhHqpKJ5&cggcRdRqyCG%0N z3JDE+XF7xR9!*L#&;T`c>ij(fuUf5D-J?$Pc)ZmPI!HeW`29vm{9vhCq7b(3d@sTP zkc*=LNF61~R6t1S-wyARH!9s`1YGGYp)wz-0ZYu;Wxw4oP1|A6^cuNyIaeDtc=CZV z%>f4En@sQ%{`%^w$<>`tN}Ku2+Ve4QVx?*CR`1R9rhx@oM5^q$4P z!IFW;UV`i<-t~`v6``J0GBE*zxu;S+E^s7KvYstDSM+0XbkiJrDOdu>!LwSk*VcCj zor(IL7q5wVm+0#!X&UPx=;rWj+$9rHl>$NoT9KaNqHc8#JTtqf~g~@WV=}si-H*`#isZzC9Xe?r$ zN(MW-G@auoaDi)zvRfdPQ%>ELNh_iDO1S;pO{IA0#t_WZkZxw;&;lY+mc5Ymn&6sx zscZ-_XS<_`=$vtVrE@bx%*1Wp)3k#rwUU1>MA2orqHp}kjXkwq&YN?)rKOgqF6SBy z=pA69C+E|T>E2OqqM#ndq!?DqV=|Ol&~BMShHjg>a^pk4(igX)-WJ_qqf>m78Tw{E zLwRy@bCqTu-v}{JogH!rR;WjkTyfv82^}5#iy^ z@U-y@n*pwLpnuxrhhXH`KT77C|jD7gDThIl5 zUb*p0Pyuu7SA+3qR`MUyl+N-hqfUzk{Q_~ZyqFlCiCW(7$b45>_9xVK7#oy+FvGB= zqgv96EJrRNuCz_MbA-u+!AvWS_{*)H7L!+~yb_u{o=d5)JsDUSm;-18{_0jTRntyP z!mkGpNxlZ)_Bhtz`#ILUFeyvwrX)p6ZN|f^EMr=dy9cB%72gAJ+%+UwKb|{oFJX;- zEu%i(XD+4;e9I&i3!RW{HDc!P}g6)I?QO#kt{i#sr_i| za>%ZbpwI=e6?Z@9sw#GJ!?Nqakdy;=Rj$=Nzz8Dm3Q-UCz@;Hq1a1{<2}8MKd#=N? z19f%v8%67ilrfgwbR8c7-)g`bO1T_>(g5+34R>Sj?SGg9vmtD24J~n#=g__ z#7#Mzh|VAtDZGl`6aD|CyzW7Wjp&3rg=z6VexlSU+c zMcx|bmbmC`9z&}Pp^`G8{#n8tw|Y-SFaQ|7kh*ZO-RF= zw#s+YaNMZsAUeolQ3qa|OdIi{!mjsNSpVS1yVQbxn5i_<3*C4Ih&VS(3xPnez z1RAhfE;PE+g_3UhPKUaZvG?cyvOwxbu{+P_@^JWpGGTAq={rfE)8{5De&OXZnyw)P zsdHYv&DZF6h9`e-EHfD8|G9q1t*e@x-glk=OGuIuHqY+H!&`fkzDzpY@?BQ-eiL-j zwx1Cr?#9S|Nezi$)w@@3%;;d0;O`KVYV=*T1r!!n4d&Zznefa3U5Xku4h!UnfTZ*C zdgxLbl*q~RdjRVt9rrUTxg&FPs3{#!`7bFU6!jzMNw3dYRt?mn6$Mb5!yk%1*JXA} zV?SIR4&ibuF0OH}PNYteGY^)>htUMDBt*O?Z!YqMj5axDzC6rrId`3N%GzpplYg9y z9sq|jOM`ZkZ9;lhmN-;iQ`q{lg)plXm9KkoXD}G`?fcHcF$6)iWDB}-Iz+h74^pM@ zj%6}_tjB-Pf8zZq#INK0=MyTI=~*|495eG!RE6^+Pz7+>D)|As_J=r#R(TT-!8^N( z;s9|%o7o+i58Xr;+}a@x&a{eh_AV9*3{0E_wMX35K?Lkgh{7@hfIIIT%XtGGy@*rG zs3Fd3a*Q4(ND=L;Wdb(dlLu-3rEo#ySi7dS;Bi z5c;xGq2*s}+mGzse|WCc_7mr(CUd(DZX-sw5N5ak)ih9-CCh>3jA2t3&+KC)dn6x4 zMj5J5+1JCR;o|h=8t77qGE|bG+YpOS6Ye^Wtz09$?7Rr|!YsQ@3Oe z@$-O{s73UokekUY#My8?yHR^H`7wmPfbbtXeD01oavjFh4%!4E^QZ~O(3APkIRGe( z`Sppq1pW|s{b?wuezNBxI({52yy(JCbW_M^Rp1Px7rBqf6mI7jF1~zvuk z1+ie_i$Ln$S!dJ&UNo1&r$ZR{G(@sGo5@Dq*I|X9a^3wjwQif7NB{X^Hz%IfKr9@%2R9IUTJiKXmK$X6`(Q3&<)r9`)2_p_06#QphnrS`{;OMsX zE4bKo#c2qzvnynC$a$6fcBGLg&){83c{@dr4y$3ArJ38)vHVg6|P>XE_{HRl#aBF-+DwrVngYDVV-@P`Y_S*Dd`%i%f;?5 zA=1C~!mqvY%lAt}6wfYo!ElsPzG1k6EyAr5}*s9sj!18d-$y;dhSkPZ+kevBUm}hnQhob+}%ep-Y;N{kRX5d6=e_BkgLR42k1M z!(czqyF}CesCFLCJJ!Wr@J)8^To@yy%-B@GtKvOdWM^Z?86q72MG@XLE@%*UnC#0} zs7X@(k^O-Ehi(2vBkR3!m0Hf}#Z{@Fr8vW%i~3NcI^%6FaU5#AV`&n1E^#x_ex^Xd z!tE#4UM-dydyYM=0 zV)|j04oQjeqWe6Fd$ITz0_ehx2rxyM%jEeLxAs|qoHNMz73;+D5&Ij{SY>Ft_euX| zr~ZYye|-jpXsM9L(UNbVizdkcc^b?|h@GQu1|1a(3zAQw78aNr3Ex8*lw>~P*PHB7 z)ANV|Rd#s{v@TI98qv~1W7Q|UOg_ZYPsFyP9iJ70nLZ_nR0)WKobMvHTYIBW%GaWL z+No#Kf@-X%H=U{Z`ai3i*CknrWrqByPkh7wtkD0};~y?E`1^75OEqv-9gg!lN`kum zq&CZpHfsRWG!KB=!Th$KT)8va8;_)}2-=)?L*4qH!VMDdM%jGX{j$L3Izujnl@NvQt_dFr)>Z)#VKoJs(<^Q+d8uOE*Kc!p}BaOj=z zuO!CbS^FOh4wzzH4r?_^$dJ4V9AZ>A9p74b-Z;X->n#PWV0I2z4o-%OJ|Y2>SSdLG@ZTSH?8XFbdbt#PGwR7X}R?`Fr8r?9$f; z4=f<%^T2$|BQgoXr&iuJgXjaE(d~2+m6Wu}0Y;Gn0yvDKmonU5f_GA%aTa7Kq-rKt zzj?}H(gZz;i67>7*96F-hBbNv+egj`-JXAKC2tL0RZ9?B2#*edZm+DlQOdhJP&u4F z&pXV%=3X!m5vc068@`))A?8S8R)r~nT!8^4^!#G_7;XwlW^O;FbQE! z-6>~e7WD93^wfdm8QO-oIVhUN3}{+nYH2(j?EU2Xnf0|$B3Z|(&IC#%v-jiXLy2TI zHD4%^jKtN(Vq;iU6Ti7{u?z`7i|%I%kext_H+BQSL@OA&$=}i5p%d5E-1&1~Bo=-q zX~HsYCcq`29%#!|&z+oq`epBlElv1>q zc?Zt`QFEQ3UZo}uj&<{lqtYU$&Y3Bh#iOLjQ{JhSSa26!J#3$M zG-DsuIjIlve=C_MTG!~(=(QSG__Ro#!mb=2x&)mmb^OdfClfj1B&w-PWH}Vs04@N_ zrmvQt|AhRz`44`#e`kt?h=(y!XN$JN*S}{iCdIz{`L^HAA9frwR0Ltu$Hir%@N$%n zC^qLcv7sF+VpVAP*os#R&!NN5+*6`d=Gfh0G_A8y555>&RY}OVo%eAEM4Uv z3z_HL1M(Y3p_@s2q86oSL+idCaJU!lbs=d+;s8m+<~-yW7BFn@9#T|!_n3F2QI5NM zLzgs&f3r>8g+6o`&w~BM`IeA5BJrGhP0ns@iQ|VIb&t3P{;-^?R5K|<7)Iza6F&^$ zPx{4S8Xp@lAWjgE(kOFBcVhUEqYtpFSjg1Pn}}(aYM(ndbh7VHL=eXhAfv5BV1A zyQDo(08rDj&U{4jZE6lL;oFyK4a8$0b%?0Ttose+&DKpo3$?e$yhJ6G*dpFpz5~+O z%k0myioT&p*HIkH7^i88e;f@g+fUkA1tRtHOiB>~0C?C~hE8INn(;yjK{r7258e5q z@2Hwa%MP58_e-~0YMdcq^41Vchm3hYO4*0O{6_u>bgUy7`ynB7o2dPorQpZmuiPVn zxD|Y+QL;TCYCj}?c#Tl6pf%fI(N*`A2ttc<50<>U#5^56u{3L*W6vY%)x{RW(2SeG z9-*{qT07xN=ydcybULNaSLxoa9!>`t)zt-T1g>rydb5(mg3aOKeB8wZE=o&7hDx~A zlXK5sev;O$e0GdZ@@Y=Go>9_LkhY(}2)?MM?&6Cge;ZxIhmwYgqsKv6Q1;;S{I+_9 zfuL;HCf~=3#jwt0&rT?1SyoWoaPy6=qXS)U%zx&besG9%06Iigxc`XA{|RmNBPt7e zj`%}|$hj)2rwAon?_ zrl~n#&k6FhDUry~U1X;ggYeLe%!51?Q_dNDsXsr^9KR9NkF%#+MiQY*p^SJZtoNRn zLbFpMU4D0aVyO6va&~K)=QGv~FAFyrEqA{yC%JRv!eHDGK&1{KLmN{DHCJVp>bb-6 zeu(e_rMfs6gvT=E>yv#<`}xcH%K1Cb)omqvQ?(Sdpn(s)T&VB*y=zuR3vHc5LW*H z(O5)pn1s{>9#0h&`i2Hi>8cu`j!Z3*3-vY5A$>wU+4a3}!5Tw5QMVv8X^rf{W}nTw z{?%L7cY=GO25&qIlcJOPyWF3QOB9Fsx2eF|N$W7WQXD1#LC02i6jM(?U&^d3E{>kb zEYVM`%&NYjaxU#j?k;BwJ?7W##*D0iP(E9|QrJ zqu1d}(~$a!FHeKCh|2<;$ZWQ4&h)5;HjlZG@zx{|Iw^5v66mi+{D26ul*dRyldPBG zToG3{M~HX09zoERLb-^*KW&%&yP*6p^M9BDxBj;CGU&CS!}#0U(iOIOJC0m9 zPhg$Fq3s>)x}F)wJg#SWa#P21*VMFeoxIqAbJ}zmFsD5SJ!L@y**ZfnChQ)V%{^+!R?|FX8|8Ob8AHd&tZJPy! z6DDb;nuNiax$>b11EE7irQIHV0+qXXbnv0MbyPV>Xw6S}M~*y+?famGY5OCD-K0I* zOf@eA8Wrj+YW0(pvm9->oT;yEcCd``-94I5no1>(v+XG};-{@|cF&))>?bkMm9eR8 z`DBSfz()svN(wiXTbm^KW%R3Q_zFnS#A1P?Vu(GeTc1f%a`aS`@ba}K>xUra%EamZ z9hA7ON4{uzo9%Fjewg;atQ*GBCec+3?l7v&V@}d=?Kurhl1J(vF<@3g%4r~rXX~%t zd&a93NN2gUDkb&`sfH%;Ux_@t43c>c9X4el-mXoBI{IA_GDI|ISH9M3k^cO2;Xy5j zabbHAfqT!@RU!Ky_Fu&D#Q;dbYmk?7nJu||+H3`T#>GR3s)|A--v{kuqdyH=7%4ow z0VUz$3MrxZVJbYWOcZ?%X*iZ;4eIIq^%+o22;*}0ddLy=wcjj3J9gUOJ^w(rP} zMSPu;7xh90s8+ovG7TKt<60D9eLOaV>xXoKKlAp(3)5&t0BKB8)qn0aDZ`W1WK4Sg zy;EG@UVTF8%hhZ*MPqY;s0m?+Bl>RZDwZ5-h}9eM1lc=hEo2xlXGQjfv{%&y3RZ>l z8HK{_rb}mLDu+U(7`Q7oYFqH9J-Izbcam0jT+rU=>__0>FIVyNQxj354@SN+!Sl$! zywExliCGnd#!ptrtrm&-ydCWU{4g&#tD+h$;LF!p#Ll_HjE+zxniKk?wMvi;3vC|4 zRPAT`AUfDjwNP`kPih9sVO@A=p3zUd^HbPyI(@+diJu-NdQ$ob%Jz3b86#{9xmaEJeA36;e*c4%BaIv>)k!2RuvF( z$e9j54X}Oe7-+1KFcuS=+{tvdwZ zoz8g1r+B3Th1HT}(2f+A=vQk*{TiMxqLyL2)JS@=;!C30_qNeaVm%1{tk-10B#nbb zi0O#>X{vgkjGsd-BBX7ugwbE&;eAzWA1OKN+ziv|Hghw-p=&j2 z!e62uWvxymWulBj76ejOpy95Cw{0PgLAVaEw~4C|%3A}0sCd{h6+;gc@ycbpJw2ui z70@)WfC!zIPgEIXpc8}dYej{{$%-N-?{M8@)KAjC@qT?S54osSG?@+cn%HVxXC!7=h^ZcZ0%ay^a)O61mt&G$<>AAtr zJaP(W+yc+LT?23!SitKt@eD*VNpGU6ZPwD7Wl-FQU_uQ1uj8Y~`d26(4g%1KnRKfA zaKzBGg5cL^JX3uxN~hbk_49HrJ!Q(89Cj3#t|}=BL1+?&p>{7|`4BhP;gWVc)?)&k z_qc;oj({DD3nzOIm5=bITFtYp?nvq?c^_7D==t;#^bv)B6i3{69?Cw%!8z7!41H}v z#U!OBw;`;$Eu^mPdsnVNIZ*CmAYwQ-~?i&1~TWBv!PJt-d4=W988lkJ3oPyE{IkF${eerR}6V_A2xQy1mM8j!B7j$~WKO%Y~4;G(T^)F2D|h zblv>&I$e=5EGXbcex-j{azZ1j)<*>Dkh&+7pqdtb@e1>dBZs_^p!U<6CKEB|RRRr8ewy?}mRh-SHwzHN6`@LJcS! z3^kVnfA6^dh(2MY46Vr7Dn@GFR7_CEB2xq5D}34=1~68pL*cp{)6)L&2%jnqP$PFG zuvtHmKCjP{f@dcTljmP~fwq2*7v#F!`c~j!*|~IIyh?R~+&sAqFBWfxS(>gk=b)&i84l}rnh1+oG4Iv5*J>8D z_u3%lJmQIaGG}UI!`?6-ltB4Ybmn(I`=OHlv+IS#wg+a-|6ecX9n@sA@9_vI2uPC- z3P>VK00Du}iwFov6$1$%Xy~CsfKUWccm)YndH|&csnSd6z4syzdQqgK6qUR;-aDtC z<9+X(JLk`xXP=p8X7}0s?tVYNZ`~%S=EjS&#rHp61V9R+m1c$v9h}tHwmna+Ux0Nm z@4=q->`Ujqy(iz#n=u8YVWmi!475njgiU33jvoaAyGGhoO_^u+LAy}xQ`Bh#+op~h zGc*_PwLci@Zcv)|ka_Pvbs}IJR^~ zLgck-4r#zlK$G$32gOpQn-{dN%5KP%=w@abEh&XDXHRy$n)C5kw)kxk#{A)P3{a=` znp`s3vmw4K(-A9NVH=HtdB5BT8V29gmsgDoKbj%VaHV>8p5#WzO3|sSEFPRI5vei= zEhwvgi+8&nw)V~Y37!v-nXL^HNfO;B;XjDMzX4ju+yxFWvFLDd8zmlT6 zFC0CV)V11)t53@3QY}xU46c7jb?(*WD1p{MhL4+pODy|(JIC?b$m#BTE5P(7QDLk* zgDr4>_>`rLREVubY?}J$*~P}T&u^Hbefo~9ganE?%{}kDAlChP(2uTmB{4&Pzv;Ka zA43c$<~#h135VNQhPN91qs;ScQzsgfdkI}#-_Ea-&uKbreJ7h!*T|FM(3jcK&^i!Y z6qCqkxST2ZSU7ofWdmok1|63iQk@vSWaW1NeJ|ex zUiMoB8l|~q?B>sd_ad*b+@sD{(sz)fe>nr{ht=B`W>broshctR1{uqck3Tb?aNp7q zUJ2COTsJ7X=r~vw9{SJD7}@wyl!C*csRH#n*mO=PU#Rd-P;o6c`P3M@!smo|jtN|T z(Fga~2z0Un%K)KmpQf$20B869GjwzI{t<6^_dTF1K1kN;4Yyw~67H`$cE7}>pv5iM ztQ}^psb8v2$>qaU{?#CY(H!MI_dlPrs$KyqhZLg*#Cu8MFW!lzvqNjAN%2)=wO#Y_ zwzDz?@4MsfmfhXluM34fh;IJEd(46-QVv%(T%SM@M8ILqbXJ0h*R}%o)_kQ9#$dND ztu+xMjWCwh|K_srole8-y8EXv6Z&YTRIi8)flE`*K7S%XQ@TbgAYu6Q#<$UR`%L0g z^oy4^8hrY`v97Y;r$FAtC*^GsL(3(!b*6xbDOP;8mZ^&njfh7CnQ=9)xV}~K%Dz{| zvZNlfLj2lmH;&j%TJD}`3ZK^W3#M`bGFu9Cb*?Z8H1Iu*=|?p)?YdPldB~-PjThUi zu`IDy)ERGgUE86H6;ZbI`JPQCi~4Nxt*JGNYIB}MN7Itr-dXmj>Pl)HS zG)+e8#{j1Ao2{>JF2uu0=}~i}#e6vWSL@Kf^Q_onnPn1#SdtO>q4rjz*i@C*vpS)p z7=hUf^gYoy7%_IUm%@s;vPb9PiUYeA4s`I^qy&r9k~5}>N@|B3yOyu^0b6=%9{eqE z=QyPOmE15Ss7`Wh!Q#Sb_Sne!H14ev!T3o4A=~y$PiVK{bM-q`o<@9QoqXtPRW9F5 zTE-}Q+6-dh!*6SOMQeoL0nIiZb zw}p`7Rq>YA`^>SbC zB4KA`Z@FX3q$tlPX6IhGp0RR?#;`H66}(%%&=<#o`EtwN;|3tMkG8kCFK9uO!oO&U z@?!DH?Y8;rHIXZ3qf7NEH~KaCS)mVwxPr5}S6zLB1}SNqKW%cNB8w29gaTWa0DBSn zKEI@ddkYkd@s=trfHO7H+@y1Q^QuLv+RL@e1(`3Ocr>}si{T5ly+utmwRY#4SSYoq zg`f2+*2mey+&g)D##(-FQA-0_hiX_+ek6whn=_SJ^kRCgkY9vHM-;V>Y6quAIKS*p zjtlOSYdcZ<9p-zBen<--ls9go_CXx>@-)GLsPXd4_El*}ADZ^~7Qf;|Ho38Pt*L^PThi5d_1u~*H#)T%!LO*N8WD-%NbcBNIPXc5aM{kA4X)68 z{$NIi7FWn6_YzSry%NgatXTWepKYmNmv)+9x(Uy6a6X6<^rnC$R&X=8d(<>}bjo^i z9(;zIarVpJor%Z#rnPeLm7&LVt{ol<+Pd+8-6{7nv>IT3oc_ID6Kq3Z_>xiOC7$~e z_@-@h+0oUI~!AOyR)a~zvUyHn5y5e7)+M8F1mccTazaLthhswfe?6 zo>`0~$mDljhyhxci>b^EQIdO1&O8GnGs4Q% zY~aXJGjmYRKqVn$c7uU%M_GVlrc4CkHAC~*1WS%}lEznyN{%P=N!Tn)z^?MH_!h8I zx1#{BE$IXDhR1XiBJy-S3E4$wo;&y+JKV3rr0)N`CjT2#>Q8M!3?3eJG_W=GpzDbB zURGtbN^FidTTCh-xFdLb^&EraS~t_CY)Elj4q;RFMWap*_LlsClkj^+ZLwwwEWn3c zGKI8D?rA)CaZcU7JZrxs&hhszs7t9p@de11F*EVy;>=Eb3)T@xGseL+5V?&MgW4G2rWlBuf6FeBM$y|(% zJM2^+erN0u!q(Wad?rVf{~DkK3stJ8%W-ttNL27PQ#}y5*xk{@dtN^F%Q=BaXWObh z-K-;6b|pH-3A5^K^g*bYABl|&26^0+;Z}cYy(v+FOcVL6UKQ6i1{=r~M0*W9*&Ghh zOLSm4brp-COX{#9rQX3%)}0MYMNfK+S0SvWuRf-oF(|{G@+d-mqAh8+pRnR8l<4L4 zK*VyS$J;rADR1l{bgXz(?iGq!*`_w^MGOX~?oEs1&s9?ldbGFk~>z$8QShA-SN?lvq%meC$)wn(`s-10i`X;R!4$ zR`auQz9@B;5Ik&Z8x-y{b>Gx}a+yidJE=nbI=3hFb;_9I-zY0LyK7(RDN2l4C!pCL zm@95OEs?MK+)r4C%A;uc$YYM9C`&0XuLvVGM(`+H-pdE7<3cVKsh|vAM36lf4h5l`1X@!pAaI-a zi>y4dctgn|tnG)Yz6vJ)E5wwCd z&$;SBa(y(;WM|unEDd`^e7-~?quyFTiuMN+c^6={R9;U^V*hJ0r|BS=kBx0{9FeK7 zKtyu)5|UM`iLa*eg~i?7kHKVPPSU{J?au+WNQMeg$o4Pt+f34F%87$}^uKL2j=7+Y zoWy5%D&RehH@(`k+#&lnJ5_e5it2vmB>m?DA>HSN_OL|3x@u@`Wbgb4P4>&2`L(1U z!}swQD*254VQ0I2y^iPWQf|&St2vHU7V3C&yO}XxFjL@unPab9m zhRncs731+PZ#X{Jrn1qG$0VOf6B)}efKTAq{ikV&BA=)>PX9@-Lqg7{rppytHkH8( zjuHE{JR&yVg&Zk`${^gVrb;vE;4zXX%(pZfpbI*sNKrcovr<|R9ppC|U&LNC%jflP z6S}sy)n&e~UQ{Akxyrf^grmYO;M(NzjF0Z0W%H_wIPe3b5tmt;33 zbZs3UENTZJZqJzY0svqg8gSX-tzJzY!TshAm#teQv6~_g4r%paL`vQHDRv)Tg^rFKn6vYGB#n=Lk5E~S5k|SkMj!~l0UWPPEzc={!RDl>L&7hIG zb>^2@5|~?*Ytw~q7(;E;q%YL~IL~8>LZdU==h&TXQoaP_kU|9y@cq>BhBfw7Gs?WQ zS5=Ax|4f3D*yCSN07ex6s9HZ9y`P&ZRNh^e^641qLdC=1YE>=%eg*fKiaQGLqfq%- z3hlO>${tuQKX7C$e3n&BRM^|22TQN?6Y4oQ4t%+-L?v*U;mUu6==)FhVSyhEZKtcS zL0ESw`ot@koCuNBr82aI*}+uOgX-*H8VUXL?3okl1XHxQ$4pT9MubjO0#r_Pj|${ma#G3P`B#bN@RGgC8{)UqhQgF~~>ZmTFEOB!I?P zDo%q0&;Y|tuq1%SN<4-H&;$#X{roL7tczXQ; + use ; + + pts1 = px_circle(10, filled = true); + pts2 = [for(p = px_circle(5, filled = true)) p + [10, 0]]; + + // simple union + pts3 = dedup(concat(pts1, pts2)); + for(p = pts3) { + translate(p) + square(1, center = true); + } + +![dedup](images/lib2x-dedup-1.JPG) + + use ; + use ; + use ; + + pts1 = px_circle(20, filled = true); + pts2 = [for(p = px_circle(10, filled = true)) p + [20, 0]]; + + sorted_pts = sort(sort(concat(pts1, pts2), by = "x"), by = "y"); + + // simple union + pts3 = dedup(sorted_pts, sorted = true); + for(p = pts3) { + translate(p) + square(1, center = true); + } + +![dedup](images/lib2x-dedup-2.JPG) \ No newline at end of file diff --git a/src/util/dedup.scad b/src/util/dedup.scad index 335b78eb..38f71e08 100644 --- a/src/util/dedup.scad +++ b/src/util/dedup.scad @@ -1,3 +1,13 @@ +/** +* dedup.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-dedup.html +* +**/ + use ; function dedup(lt, sorted = false) =