BLENDER_v245REND SceneGLOB  15xށ];SRxǁށSR1-Animationxȁ ́h́M:M:ԁ]; DATAxȁȁDATAȁɁxȁ DATAɁPɁȁ DATAPɁɁɁDATAɁɁPɁDATAɁ(ʁɁDATA(ʁpʁɁDATApʁʁ(ʁDATAʁˁpʁDATAˁHˁʁDATAHˁˁˁDATAˁˁHˁDATAˁ ́ˁDATA ́ˁDATAh́́ȁɁDATÁ́h́xȁPɁDATÁ@́́ȁɁDATA@́́́Ɂ(ʁDATÁ́@́Ɂ(ʁDATÁ΁́ɁpʁDATA΁`΁́(ʁʁDATA`΁΁΁pʁʁDATA΁΁`΁Ɂ(ʁDATA΁8ρ΁xȁˁDATA8ρρ΁ɁHˁDATAρρ8ρPɁHˁDATAρ(K:ρˁHˁDATA(K:pK:ρpʁˁDATApK:K:(K:ɁˁDATAK:L:pK:ʁˁDATAL:HL:K:ˁˁDATAHL:L:L:ˁ ́DATAL:L:HL:Hˁ ́DATAL: M:L:ɁˁDATA M:hM:L:ˁ ́DATAhM:M: M:ɁˁDATAM:hM:ˁ ́DATAM:_:xȁˁHˁPɁO0]:@^:N:\:DATAN:P:Link and MaterialsEditing>DATAP:(Q:N:MeshEditingF>DATA(Q:@R:P:Anim settingsObject>DATA@R:XS:(Q:DrawObjectF>DATAXS:pT:@R:ConstraintsObject>DATApT:U:XS:EffectsObjectDATAU:V:pT:HooksObjectF>@R:DATAV:W:U:Particle InteractionObject>XS:DATAW:X:V:SoftbodyObject>XS:DATAX:Y:W:OutputRender>DATAY:[:X:RenderRenderF>DATA[:\:Y:AnimRender>DATA\:[:FormatRender>DATA0]:@^:333?V,@DhCDhCC(BDC?z?DATAx@^:0]:333?V,/9DATA_:`:M:ɁȁɁ(ʁ !  DATA`:e:_:ˁˁʁpʁG==o?(d:a:c:DATAa:c:Transform PropertiesView3d>DATAc:a:3D Viewport propertiesView3d>"DATA(d:333?V<????????G==o? A*A?G==o??????*A B??=C ݢM@ݢM@ݢM@? DATAxd:(333?V</9DATAe:m:`:pʁʁ(ʁɁ??PףHg:(l:f:f:DATAf:Transform PropertiesIpo!>DATAXg:`i:333?V\zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA`i:0Sg:333?V\CC|||??l|DATA0Sj:`i: 333?V\zCCHBC|||?CFC= ADATAxj:@k:0S 333?V\0; =rttDATA@k:rYj: 333?V\?zDzDBCl||ll|zDzD=HB DATArY/S@k: 333?V\BzB@l|llFzD #<HB DATA/S(l:rY333?V\??? ???? A???PA A!O?j?}GCHB? A B? #<C DATAx(l:/S333?V\/9DATAm:ԁe: ́ˁɁHˁ (сӁn:ЁDATAn:ЁLink and MaterialsEditing>DATAЁn:MeshEditingF>DATA(сpwU333?VLzCB{ µCB ?BFB= ADATApwUҁ(с 333?VLzCCHBC$?CFC= ADATAҁӁpwU333?VL#DhC`DpJgChCC(BDC?z?DATAxӁҁ333?VL/9DATAԁm:ˁɁˁ ́} ?=o?.ׁ܁ՁցDATAՁցTransform PropertiesView3d>DATAցՁ3D Viewport propertiesView3d>"DATAׁف333?YDATAx`LampLampF>DATAxSpotLamp>DATATexture and InputLamp>DATAMap ToLamp>DATAPreviewMaterial>DATAMaterialMaterial>DATA PreviewWorld>DATA 8WorldWorldF>DATA8P Mist Stars PhysicsWorld>DATAPh8Texture and InputWorld>hDATAhPMap ToWorld>DATAhOutputRender>DATARenderRenderF>DATAAnimRender>DATAFormatRender>DATALink and MaterialsEditing>DATAMeshEditingF>DATA(Mesh ToolsEditing4>DATA(@Mesh Tools 1Editingz>DATA@X(CameraEditingF>DATAXp@ShadersMaterial>}:DATApXTextureMaterial^>DATAo:pAnim settingsObject>DATAo:q:DrawObjectF>DATAq:r:o:ConstraintsObject>DATAr:0s:q:ScriptlinksScript>DATA0s:Ht:r:EffectsObjectq:DATAHt:`u:0s:Map InputMaterial^>pDATA`u:xv:Ht:Map ToMaterial^>pDATAxv:w:`u:AnimAnim>DATAw:x:xv:SoundSound>DATAx:y:w:ListenerSoundF>DATAy:z:x:SequencerSound>DATAz:{:y:ArmatureEditingF>DATA{:}:z:RampsMaterial>DATA}: ~:{:Mirror TranspMaterial>DATA ~:8:}:Mist / Stars / PhysicsWorld>8:DATA8:P: ~:Amb OccWorld>DATAP:h:8:Shadow and SpotLamp>DATAh::P:ModifiersEditing>DATA::h:ShapesEditing>h:DATA:::MultiresEditing>DATA:ȅ::Links and PipelineMaterial>DATAȅ:::Render LayersRender>DATA::ȅ:BakeRender>DATA:::YafRayRenderF>DATA:(::YafRay GIRenderF>DATA(:@::Texture faceEditing>@:DATA@:X:(:UV CalculationEditing>DATAX:p:@:PreviewTexture>DATAp::X:TextureTextureF>DATA::p:ColorsTextureF>p:DATA:::CloudsTexture>DATA:Б::ImageTexture>DATAБ:::Map ImageTexture>DATA::Б:Yafray: Shadow and PhotonsLamp>DATA:::DiffusionMaterial>DATA:0::SpecularityMaterial>:DATA0:H::MirrorMaterialF>`:DATAH:`:0:TransparencyMaterialF>`:DATA`:x:H:SSSMaterialF>DATAx:`:Skeleton GeneratorEditingz>(DATA::333?`(DjDhCD°ΆCC(BDC?z? >m0DATA:О::333?`??? ???? A??@PA Aj?c3>}GCHB? A B? #<C DATAО:::333?`@̌AR|B1@lA A@CC #<@DATAx:О:333?`/9DATA::`߁߁HzkzkDATA:pS:TȺTH">( Y>o?%%?@  p ?jp:țfțf::DATA:Ȥ:Transform PropertiesView3d,>"DATAȤ:::View PropertiesView3dT>"DATA:Ȥ:Background ImageView3dT>"DATAx?j: 333?:P2l4 =fhhDATA:(:?j333?:?3?3^*:T#wM ??3?3^*;xM @T#=?">H1n;' Y>W'z  ;?[ @d-4@zC]*;xM AT#=?">( Y>o??3?3^*:T#wM ?5?5@? B?=w<=C+X<~ 9^*xM ?@T#H¶E @<???? DATA<{jh?@?DATA(: ::333?:#-DpCD,>` D??FF?H?H @<,CDATA :X:(:333?:HDDff&>ffV?=Ga?Wd?DATA$X:: :333?:DATAX:8:X:333?:zC̽̌?zC@22 #< #<`jFzD OBzC̽̌?DATA8:p::333?:AffzAK_tK_tB33 33 B22 A@CC #<@2DATAp:`:8: 333?:?zDzB@22FzD #<HB DATA`:p:p:333?:DdC8CnD fCC(BDC?z?DATAxp:`:333?:Save AsMAGEF PICTUREh:\Blender\Blends\\Jeffery L McGregor\My Documents\My Pictures\p38Lightning.blendatersons Inlet.JPGpgc DATApS:pȺTT( Y>a>o?%%?@ p؝Te{U{U(3SVDATA(3SHSTransform PropertiesView3d,>"DATAHSV(3SView PropertiesView3dT>"DATAVHSBackground ImageView3dT>"DATA؝T(V333?pS?3?3^*:T#wM ??3?3^*;xM @T#=?( Y>%F2n;`>$\ ;?@#3=@zC^*;xM @T#=?( Y>a>o??3?3^*:T#wM ?5?5@?d B?=u<=C+X<~ 9^*xM ?@T#H¶E @<???? DATA<d{jh?@?DATA(VT؝T333?pS#-DpCD,>` D??FF?H?H @<,CDATATCj(V333?pSHDDff&>ffV?=Ga?Wd?DATA$CjnT333?pSDATAXnXbTCj333?pSzC̽̌?zC@22 #< #<`jFzD OBzC̽̌?DATAXbTVn333?pSAffzAK_tK_tB33 33 B22 A@CC #<@2DATAVpSXbT 333?pS?zDzB@22FzD #<HB DATApSeV333?pSDdC8CnD fCC(BDC?z?DATAxepS333?pSSave AsMAGEF PICTUREh:\Blender\Blends\\Jeffery L McGregor\My Documents\My Pictures\p38Lightning.blendatersons Inlet.JPGpgc SRx:`:ށSR3-Materialodel Sing:h:::(::]; DATA::DATA:P:: DATAP::: DATA::P:DATA:(::<DATA(:p::<DATAp::(:DATA::p:DATA:H::,<DATAH:::,DATA:ض:H:DATAض: ::,DATA :h:ض:DATAh: :DATA:::P:DATA:@::::DATA@:::::DATA:и:@::(:DATAи::::(:DATA:`:и::p:DATA`:::P::DATA::`:p::DATA:8::(::DATA8:::::DATA:Ⱥ:8:(::DATAȺ::::H:DATA:X:Ⱥ::H:DATAX:::::DATA::X:p::DATA:0::H:ض:DATA0:x:::ض:DATAx::0::ض:DATA::x:: :DATA:P::ض: :DATAP:::p:h:DATA::P:H:h:DATA:: :h:DATA(::::(::?@Pף;;!::(:p:DATA(:@:OutputRender>DATA@:X:(:RenderRenderF>DATAX:p:@:AnimRender>DATAp:X:FormatRender>DATA:@+333?V\~CA~CA!?AFA= ADATA@+`:: 333?V\zCCHBC ?CFC= ADATA`:p:@+333?V\DhC?DhCC(BDC?z?mDATAp::`:333?V\??? ???? A??@PA Aj?c3>}GCHB? A B? #<C DATA::p:333?V\@̌AR|B1@lA A@CC #<@DATAx::333?V\/9DATA::(:p::P:: !  DATA::::H::(:G@? JL-=-=W-X~:h:::DATA::OutputRender>DATA:::RenderRender>DATA:::AnimRender0>DATA:::FormatRenderH>DATA:::PreviewMaterial>DATA:::MaterialMaterial>DATA:(::ShadersMaterial0>DATA(:@::TextureMaterialD>DATA@:X:(:Map InputMaterial\>DATAX:p:@:Map ToMaterial`>DATAp::X:RampsMaterial>:DATA:p:Mirror TranspMaterialH>DATA::333?VChCCvgCC(BDC?z?DATA:::333?VJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?J>#xu?ܗ=Hi6>(? ?Pb^L?\FAA?4[?[!?@jG>gb>Pb>4Im>k&?]M^L<0@AzA=>Kc<2֍7&> ?:x¸A1vB,jB~@G@? JLJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?@?$$OA B?=Ch?j(4?t'>d DATAX:h::333?VzC AzC A #< #<`jFzD OBDATAxh::333?V;SAVE FILE/usr/home/intrr/blender/blend/untitled.blendDATA:::::ض::U.=w=o?+=+=W+X,X::DATA:@:333?W???h?j(4?t'>????hj(4t'?U.=w=o??OA B??=Ch?j(4?t'>dEh@Eh@Eh@? DATA@:P::333?WDdC>9C,DeCC(BDC?z?DATAXP::@:333?WzC AzC A #< #<`jFzD OBDATAx:P:333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATA::: :h:H:ض:e?B$?AHM+++US:H:DATA::333?W |ݕ/?U~'?3F:?>T8165e?2>Z& 4?ߕ/?7F:?81W~>85e?'?T2>ne@>M@?4z?'''䷄?K??T?v|@?l211A 4Atp>?@@FC>G ?4xB֟&BĭeA(@e?B$?AHMݕ/?U~'?3F:?>T8165e?2>Z& 4?H?N,Z#OA B??=Ch?j(4?t'>dA@A@A@? DATA:::333?W |DdC>9C,DeCC(BDC?z?DATAX:H::333?W |zC AzC A #< #<`jFzD OBDATAxH::333?W | SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATA:::p:h: :&=+=o?US::DATA: :333?W ?3?3:-vk(4??3?3;@k(40v@?&=PU1n;+=ꉖø;ZO{:?JXA54U0AC;@j(40v@?&=+=o??3?3:-vk(4?5?5IXA B??=C:j(4?.vdٚ@ٚ@ٚ@? DATA :0::333?W DdC>9C,DeCC(BDC?z?DATAX0:: :333?W zC AzC A #< #<`jFzD OBDATAx:0:333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendSRx`:+;:SR4-Sequence:::;;$;]; DATA:P:DATAP::: DATA::P: DATA:(::DATA(:p::DATAp::(:DATA::p:DATA:H::DATAH:::DATA::H:DATA: ::TDATA :h::TDATAh:: :DATA:h:DATA:@;P::DATA@;;:::DATA;;@;:(:DATA;;;:p:DATA;`;;(:p:DATA`;;;P::DATA;;`;::DATA;8;;::DATA8;;;:H:DATA;;8;::DATA;;;H::DATA;X;;H::DATAX;;;::DATA;;X;: :DATA;0;;: :DATA0;x;;: :DATAx;;0;(:h:DATA;;x;H:h:DATA;P;;::DATAP;;;p::DATA;P;h::DATA; ;:(:p::@ ;P ;;( ;DATA;;OutputRender>DATA; ;;RenderRenderF>DATA ;( ;;AnimRender>DATA( ; ;FormatRender>DATA@ ;P ;333?WDhCvDhCC(BDC?z?DATAxP ;@ ;333?W/9DATA ;;;:P::: !  DATA;; ;(:h::p:8=i>o? ;;DATA;;333?W&~CB~CB ?BFB= ADATA;;;333?W&zCAzCA  A@FB= A ?DATA;;;333?W&????????8=i>o?fffAD&@??fffA B? #<C DATAx;;333?W&AVE TARGA/t1.blend9DATA;p;;: :::8=H>o?UUU ;;DATA;;333?W*zCAzCA1||1 A@FB= A ?DATA;;;333?W*????????8=H>o?fffA*@??fffA B? #<C DATAx;;333?W*AVE TARGA/t1.blend9DATAp;$;;H:: ::8=>o?SSSTp;(#;DATAXp;;333?W.B̽̌?B̽̌? #< #<`jFzD SQB̽̌?DATA;(#;p;333?W.????????8=>o?fffA@??fffA B? #<C DATAx(#;;333?W.OAD FILE/9DATA$;p;h:H:::8=i>o? %;);DATA%;&;333?W1zCAzCA A@FB= A ?DATA&;);%;333?W1????????8=i>o?fffAD&@??fffA B? #<C DATAx);&;333?W1AVE TARGA/t1.blend9SRx+;`:SR5-ScriptingH,;.;/;3;P3;J;]; DATAH,;,;DATA,;,;H,; DATA,; -;,; DATA -;h-;,;DATAh-;-; -;DATA-;-;h-;DATA-;@.;-;DATA@.;.;-;DATA.;.;@.;DATA.;.;DATA/;`/;,;,;DATA`/;/;/;,;-;DATA/;/;`/;,;-;DATA/;80;/;-;-;DATA80;0;/;h-;@.;DATA0;0;80;-;.;DATA0;1;0;-;.;DATA1;X1;0;@.;.;DATAX1;1;1;h-;-;DATA1;1;X1;H,;h-;DATA1;02;1;H,;.;DATA02;x2;1; -;.;DATAx2;2;02;@.;.;DATA2;3;x2;.;.;DATA3;2; -;-;DATAP3;P4;-;,;,;-; !  DATAP4;X<;P3;h-;-;.;@.;z==o?7;:;P5;h6;DATAP5;h6;Transform PropertiesView3d>DATAh6;P5;3D Viewport propertiesView3d>"DATA7;:;333?Y.|????????z==o?&A*A?z==o??????*A B??=C ?@?@?@? DATAx:;7;333?Y.|/9DATAX<;J;P4;.;.;-; -;??Pף Lp>;H;X=;X=;DATAX=;Transform PropertiesIpo!>DATAxp>;?; 333?Y/|0;> =DATA?;P@;p>;333?Y/|CCx??|?DATAXP@;A;?;333?Y/|zC̽̌?zC@;; #< #<`jFzD OBzC̽̌?DATAA;C;P@;333?Y/|CC|||??l|DATAC;C;A; 333?Y/|zCCHBC|||?CFC= ADATAC;D;C; 333?Y/|?zDzDBCl||ll|zDzD=HB DATAD;E;C; 333?Y/|BzB@l|llFzD #<HB DATAE;H;D;333?Y/|??? ???? A???PA A!O?j?}GCHB? A B? #<C DATAxH;E;333?Y/|/9DATAJ;X<;H,;h-;@.;.;OZ;\;K;Y;DATAK;L;Link and MaterialsEditing>DATAL;M;K;MeshEditingF>DATAM;N;L;Anim settingsObject>DATAN;P;M;DrawObjectF>DATAP;Q;N;ConstraintsObject>DATAQ;0R;P;EffectsObjectDATA0R;HS;Q;HooksObjectF>N;DATAHS;`T;0R;Particle InteractionObject>P;DATA`T;xU;HS;SoftbodyObject>P;DATAxU;V;`T;OutputRender>DATAV;W;xU;RenderRenderF>DATAW;X;V;AnimRender>DATAX;Y;W;FormatRender>DATAY;X;ScriptlinksScript>DATAZ;\;333?Y0|ChC#DhCC(BDC?z?DATAx\;Z;333?Y0|/9SC];SCScenetageain;b;f;Hc;^*;xM @T#=}$%?)>=`^ Miz@b@Lt> ף;i;hf;f;3dd??< dddZ!@  ??`i;`i;?? fff?????o:?L=//..\..\Terragen\Oahu.tga/tmp\L?L?L??>??D Ug;DATAb;pHc;|.0>DATAHc;pc;b;18j>DATAc;pc;Hc;1`v>DATAc;p8d;c;?pn>DATA8d;pd;c;a.p>DATAd;pd;8d;c68r>DATAd;p(e;d;c1{>DATA(e;pxe;d;b=P>DATAxe;pe;(e; cD >DATAe;pf;xe; Dh>DATAf;pe; T>DATA(hf;o,d'=A@DATAf;~L?pB?o: ??F_22 2d 22 22 22 22 22 >8=2 #< #`fff?Ou<?DATAH`i;u1 RenderLayerDATAxi;j;0t;;0;8R0{DATAj;xk;Render Layers(u;;#ðCCpA##BC##BB##B`SCRDATAxk;pl;j;Defocus;;@;@;;f+CCpAf+`7BCf!`7wCCf!`7gDATApl;hm;xk;Normal;;;8; ?{BBpA ?B2{B(AB2,(AB_DATAhm;`n;pl;RGB Curves8;0;؈;؈;;C|CHCpACCA|CCC$B|CCC ZDATA`n;Xo;hm;Normal;;(;Њ;>(BB`BpA>(BBC`>(jB C`W>(jB C_DATAXo;Pp;`n;RGB CurvesЍ;ȏ;p;p;x;Cp7HCpACCwp7CCw CC ZDATAPp;Hq;Xo;Mix;h;;;4pUDCBpA4pUD4psDcCC4WD4pDCC4WD4pDZDATAHq;@r;Pp;CompositeD;;DCBpADD<+1CCYD٤DYD٤D<+wCC@WDATA@r;8s;Hq;Viewer;P;H;;+XBDBpA+XB,ICCD,C,?C,C,?CCCWDATA8s;0t;@r;Viewer H;;H;;CDDBpAC`DνCDDCCCCCNCWDATA0t;8s;Vieweru ;;H;@; Db@BpA DDy1b@` D`D` D`Dy1bYWDATAx(u;u;Image??#ðxCDATAxu;xv;(u;Alpha??#ðxCDATAxxv; w;u;Z??#ðxCDATAx w;w;xv;Normal?#`vCDATAxw;px; w;UV??DATAxpx;y;w;Speed??#`bCDATAxy;y;px;Color?DATAxy;hz;y;Diffuse?DATAxhz;{;y;Specular?DATAx{;{;hz;Shadow? DATAx{;`|;{;AO? DATAx`|;};{;Reflect? DATAx};};`|;Refract? DATAx};X~;};Radio? DATAxX~;;};IndexOB?DATAx;X~;Mist?DATA;`Aff???DATAx;;ImageL?L?L???f+BМ;DATAx;;ZL?L?L???f+B;DATAx@;Image??`7;CDATAx;Normal?? ?2;DATAx;8;Normal<33#Ad>??B4ADATAx8;;Dot???B@DATA;????C?5555;C?(C%(C%`;C?(@Ѿ()@Ҿ(;C?l]{l]{;??????DATA;??DATA`;c 6??DATA;=??DATA;>??DATAx8;;Fac???C$B0;DATAx;;8;Image??CH7B`;DATAx;0;;Black Level??DATAx0;;White Level?????DATAx؈;Image???CCDATAx;Normal??>(BB ;DATAx(;Њ;NormalmAMp???C`4DATAxЊ;(;Dot???C`HDATAx;????C?5555;C?;-;-;C?cAc'aAc'@;C?WSWS;??????DATA;??DATA;&=??DATA@; >??DATA;{X>??DATAxЍ;x;Fac???Cw;DATAxx; ;Ѝ;Image??CwȞ;DATAx ;ȏ;x;Black Level??DATAxȏ; ;White Level?????DATAxp;Image???CxDATAx;;Fac?@4pUDACDATAx;h;;ImageL?L?L??? 4pUDAC;DATAxh;;ImageL?L?L??? 4pUDrCX;DATAx;Image??4psDACDATAx;`;Image?? D<+hC;DATAx`;;;Alpha?? D<+TCDATAx;`;Z?? D<+@CDATA ;DATAx;;Image??+XBC;DATAx;P;;Alpha??+XBCDATAxP;;Z??+XBCDATA ;DATAxH;;Image??CNC;DATAx;;H;Alpha??CNCDATAx;;Z??CNCDATA @;DATAx;8;Image?? Dy8;DATAx8;;;Alpha?? DyDATAx;8;Z?? DyDATA;М;j;xk;xv;;DATAМ;;;j;xk;(u;;DATA;`;М;xk;@r;@;;DATA`;;;xk;hm;@;;DATA;;`;hm;8s;؈;H;DATA;8;;j;pl; w;;DATA8;;;Xo;0t;p;;DATA;Ȟ;8;j;`n; w;;DATAȞ;;;xk;Xo;@;x;DATA;X;Ȟ;hm;Pp;؈;;DATAX;;;Xo;Pp;p;h;DATA;;X;Pp;Hq;;;DATA;0;;`n;Xo;Њ;Ѝ;DATA0;;pl;hm;8;8;IM|H(WWIMp-38J_Franklin.tgH:\Blender\Textures\P38\p-38J_Franklin.tgax;jj??DATA x; Ƞ;DATAȠ;444HO7    ZgG'%   ddl4<$$,$4<,,,,444'%  <<,<<=<<=<<=\\dTT\\deRZ;34>JLUTTTTLTCDL4<,JLUdddt||ttt$$$'%,,$44$HO7,,$?D0?D0?D0ZgGddd,,$ddddllHO7?D0HO7HO7tt|T\dtvl|\\d,,$S\\||üddd\\\$T\d|\\\?D0ddddld,,,+,6T\dldl|||mdcLLL?D0LLLLLL<<=4444,4,,,,,,34>CDDdllt|||||ddd tt|S\\lll\\dLLL444",,<<=TT\\\dddl\\dddllltltt|||'%?D0x|tlllH@--,,,ZgGTWF||\\\|||ļ|~t|lll,,,ddl,4&?<44<,lttdddlltdlltt|tt|tt|tt|t||tt|lltdlllllS\\llt||dllCDDtvl\de||TWFHO74<,,4&tt|tttCDDtt|TTT\\\TT\d\dJLUddlt|llldll\deddlHO7LLLddllttddl\deTLTTTT|||tttKTU|~RZ;TT\LLLtttS\\  4<4 llt||lltdddTTTllldlllttllttt|||t||RZ;LLLTT\||\\l=LD7?  <<,>4$ttt44,\\dHO7<<=TT\llt\de?D0  >4,>4$tt|lll4<,\\\ü|~t||lltTTTLLLtt|LLLddl\\d?D068 >4,>4$lldlll4<,\\\dddddd\\dTLTCDD,,,<<=444CDLT\dlll||Z_$$$TT\$,$-2 --L;1>4,ttttltdddtt|TTT,4&CDDCDDCDDLLLLLL\\\\delltddlt|||||tt|bZ;t||t||llt 8,'bZ;>4$CDLCDD<<=CDDTTTS\\ddldddt||TTTbZ;||tt|tttltt44,%4lttlttTT\ddl?D0tltt||tt|llt|!ٴ&'%'%?<4||JLU>4$ddd|||tt|tt|LLL\\dS\\BLL|tvlll||||||||lttt||t||,,,-$$<4=444-$$$$ |||ttttvl$$$ltttttLJDLLLLLLLLLCDDCDLCDD    dddtt|ttt||llt\\d||||tt|ltt||||tt|tt||\\d\dett|,,,$$$<<=CDD \\dTTTٴ&dddtttlld||||||\\d|lllٴ&||lttTTTCDDLLLKTU\\\|||lt|ddlldl|||\\\llt$$$|lltdllllttt|ddlLLLBLLTTT\\\|||TT\44,  444ddd||ddl\\\S\\LLLTTTlll||b dll444444$$$,,,LLLkd>kd>L;1kd>IM|WH;H(WIMRender Result;Uj??DATA ;IM|H;WIMViewer Node;Nj??DATA ; H;DATAH;IPTx;0;IPObIpo;;LkB@ȳ^OBDATA\;2;*)`@$zA.<: BOBrCDATAp;+&S@*)`@.<+m@?r@'B$zA: BʺAM(BIPT0;;x;IPObIpo.001;;:mQ?_MOBDATA\;2H;*)`@$zA.<: BOBrCDATApH;+&S@*)`@.<+m@?r@'B$zA: BʺAM(BIPT;p;0;IPObIpo.002|Ă1DuuAOBIPTp;;;IPObIpo.003gē8C0AOBIPT;;p;IPObIpo.004\ļC~bAOBIPT;;;IPObIpo.005lDAAOBIPT;;;IPObIpo.006zrD S AOBIPT;;;IPObIpo.007$DGAOBIPT;;;IPObIpo.008hװCCK-AOBIPT;(;;IPObIpo.009q{#tD%<]0BOBIPT(;;IPObIpo.010a D<  ף;>(;;DATA(;X>??????????L>DATA ;TXh0;x;TXText;;;;H;DATA;;EERFDATA;TXhx;P2l0;TXmegabool_r12_hoehrerm;mx;<x;x;f>DATA4;m:\Blender\Scripts\megabool_r12_hoehrermod_v1.pyemeDATAx;;< DATA;;x; <DATA;P;;X<FREEDATAP;;;<%=DATA;;P;< FREEDATA;(;;(<FREEDATA(;p;;h<EFREEDATAp;;(;<FREEDATA;;p;<FREEDATA;H;;`<EFREEDATAH;;;<EFREEDATA;;H;P<EFREEDATA; ;;<EFREEDATA ;h;;@<EFREEDATAh;; ;<EFREEDATA;;h;0<EFREEDATA;@;;<EFREEDATA@;;; <EFREEDATA;;@;<Eq=DATA;;;<E DATA;`;;<EDATA`;;;=EDATA;;`;x=E $UDATA;8;;=E0pDATA8;;;h=E_>?DATA;;8;=EH`|?DATA;;;X=EFREEDATA;X;;=E d>DATAX;;;H=ETDATA;;X;=EFREEDATA;0;;8=EDATA0;x;;=E DATAx;;0;(=EFREEDATA;;x;=E>DATA;P;;=E"{?DATAP;;;=E 1DATA;;P;=EПDATA;(;;=EY?DATA(;p;;=EgDATAp;;(;p=EDATA;;p;=EDATA;H;;` =EI DATAH;;; =E:>DATA;;p;=E>DATA;H;; =EqDATAH;;;=EDATA;;H;=EqDATA; ;;=EDATA ;h;;=EuDATAh;; ;x=EDATA;;h;=EXDATA;@;;h=EOYDATA@;;;=EDATA;;@;X=EG+DATA;;;=EDVDATA;`;;H=EDATA`;;;=Ed1DATA;;`;8=AcDATA;8;;=DVDATA8;;;=DATA;;8; =$DATA;;;x=,pDATA;X;;=0IDATAX;;;@ =WDATA;;X; =DATA;0;;!=DATA0;x;;@!=DATAx;;0;!=VDATA;;x;!=DATA;P;;0"=PDATAP;;;"=WDATA;;P;"= DATA;(;;#=5=DATA(;p;;H#=ɰW>DATAp;;(;#= 5=DATA;;p;#=:74DATA;H;;H$=5=DATAH;;;$=DATA;;H;$= 8KDATA; ;;%= i!3DATA ;h;;H%= DATAh;; ;%= [?DATA;;h;%=ϽDATA;@;;&= DATA@;;;@&= JZDATA;;@;&= DATA;;;&=HϽDATA;`;;&= DATA`;;;8'=WDATA;;`;p'=DATA;8;;'=-K >DATA8;;;(=>DATA;;8;P(= K >DATA;;;(=ɰW>DATA;X;;(=K >DATAX;;;)=}L>DATA;;X;8)=CK >DATA;0;;)=CR>DATA0;x;;(*=C>DATAx;;0;*=DATA;;x;*=6t,?DATA;P;;P+=FREEDATAP;;;+= ?DATA;;P;+=WDATA;(;; ,=[3]DATA(;p;;h,=v?DATAp;;(;,=p?DATA;;p;-=v?DATA;H;;P-={?DATAH;;;-= ?DATA;;H;-=?DATA; ;;.= ?DATA ;h;;X.={?DATAh;; ;.=!WDATA;;h;.=kDATA;@;;8/= ?DATA@;;;p/=[|?DATA;;@;/= ?DATA;;;0=?DATA;`;;X0=< ?DATA`;;;0= {?DATA;;`;1= WDATA;8;;H1=f DATA8;;;1=v?DATA;;8;1=[|?DATA;<;2=v?DATA<X<;P2=){?DATAX<<<2=v?DATA<<X<2= WDATA<0<<03= r=DATA0<x<<p3="d?DATAx<<0<3= \?DATA<<x<4= d?DATA<P<<H4=p?DATAP<<<4=d?DATA<<P<4=d?DATA<(<< 5=%Y?DATA(<p<<h5=/cF?DATAp<<(<5=>?DATA<<p<6=/cF?DATA<H<<@6= %Y?DATAH<<<6=/cF?DATA<<H<6=:9?DATA< <<(7=5WDATA <h<<7=;xDATAh<< <8=&E?DATA<<h<X8=?DATA<@<<8=E?DATA@<<<8=>?DATA<<@<09=E?DATA<<<x9=f?DATA<`<<9=WDATA`<<<:=Cd=DATA<<`<x:=DATA<8<<:=J~>DATA8<<<0;=3DATA<<8<;=&꡴>DATA< <<;=WDATA <X <<8<='DATAX < < <x<='R8DATA < <X <<=0ӾDATA <0 < <==(R8DATA0 <x < <p==&&ɾDATAx < <0 <==R8DATA < <x <>=vDATA <P < <@>=( ESDATAP < < <>=]DATA < <P <>='|DATA <( < <8?='DATA( <p < <?=DATAp < <( <?=4?DATA < <p <@=X DATA <H < <P@=DATA<(<<XH=IɁ=DATA(<p<<H=<)hٽDATAp<<(<HI= 4DATA<<p<I=#*/DATA<H<<I=Eh4DATAH<<<8J=koperDATA<<H<J=DATA< <<(K=@DATA <h<<K=DATAh<< <K=DATA<<h<@L=!DATA<@<<L=HDATA@<<<M= >DATA<<@<XM=!qDATA<<<M= m[nDATA<`<<M=DATA`<<<(N=&bqDATA<<`<N=6xDATA<8<<N= %uDATA8<<<@O=KDATA<<8<O=DATA<<<P=''{DATA<X<<hP=DATAX<<<P=1ZDATA<<X<Q=@m[nDATA<0<<Q=%uDATA0<x<<Q=DATAx<<0< R=FDATA<<x<R=DATA<P<<R=DATAP<<<(S=?DATA<<P<pS= vDATA<(<<S=DATA(<p<<S=$sDATAp<<(<@T=~ DATA<<p<( ? .pyDATA<H<<h ? 1 11DATAH<<< ?=DATA<<H< ? DATA<( <<0!? eDATA( <p <<T=DATAp < <( <!?DATA <!<p <!? DATA!<H!< <"?2| >DATAH!<!<!<H"?HDATA!<!<H!<"?DATA!< "<!<"?p?DATA "<h"<!<#?zDATAh"<"< "<`#?XDATA"<"<h"<#?DATA"<@#<"<#? DATA@#<#<"<H$?+~ESDATA#<#<@#<$?xDATA#<$<#<$?QDATA$<`$<#<8%?QDATA`$<$<$<%?)torADATA$<$<`$<%? ~ESDATA$<8%<$<(&? DATA8%<%<$<h&?DATA%<%<8%<&?) ]DATA%<&<%<'?i DATA&<X&<%<@'?8FREEDATAX&<&<&<'?f5DATA&<&<X&<'?(DATA&<0'<&<H(?׼DATA0'<x'<&<(?DATAx'<'<0'<(?QDATA'<(<x'<)?< DATA(<P(<'<)? DATAP(<(<(<)? ~ESDATA(<(<P(<*? =DATA(<()<(<H*?BDATA()<p)<(<*?.DATAp)<)<()<*?DATA)<*<p)< +?;eDATA*<H*<)<+?GDATAH*<*<*<,?DATA*<*<H*<X,? [DATA*< +<*<,?iDATA +<h+<*<,? yDATAh+<+< +<-? DATA+<+<h+<X-?(DATA+<@,<+<-? DATA@,<,<+<-?yDATA,<,<@,<.?5DATA,<-<,<p.?9;DATA-<`-<,<.?urfDATA`-<-<-<0/?Qm[nDATA-<-<`-</?& =DATA-<8.<-<0?DATA8.<.<-<P0?$uDATA.<.<8.<0? ftmoDATA.</<.<0?9[DATA/<X/<.<H1? %DATAX/</</<1? (&DATA/</<X/<1? DATA/<00</<2?/DATA00<x0</<@2?PDATAx0<0<00<2?#DATA0<1<x0<3? DATA1<P1<0<`3?DATAP1<1<1<3? DATA1<1<P1<3?$DATA1<(2<1<@4? #DATA(2<p2<1<x4?DATAp2<2<(2<4? DATA2<3<p2<5? DATA3<H3<2<H5?WDATAH3<3<3<5?,0DATA3<3<H3<5?@DATA3< 4<3< 6?DATA 4<h4<3<h6?5XDATAh4<4< 4<6?#FREEDATA4<4<h4<(7?EZDATA4<@5<4<7?&@DATA@5<5<4<7?DATA5<5<@5<H8? DATA5<6<5<8?2NDATA6<`6<5<8? DATA`6<6<6<09? jDATA6<6<`6<p9?DATA6<87<6<9?lfDATA87<7<6<9?THADATA7<7<87<8:?aDATA7<8<7<:? DATA8<X8<7<:?.@DATAX8<8<8< ;?J͚DATA8<8<X8<;?֦DATA8<09<8<;?\DATA09<x9<8<0? $uDATAp;<;<(;<>?DATA;<<<p;<>?CDATA<<H<<;<0??DATAH<<<<<<p??ZyDATA<<<<H<<@? 8DATA<< =<<<@@? TDATA =<h=<<<@?DATAh=<=< =<@?DATA=<=<h=< A?ĭDATA=<@><=<XA?%DATA@><><=<A?DATA><><@><A?PDATA><?<><8B?"挼DATA?<`?<><B?LFREEDATA`?<?<?<C? ,DATA?<?<`?<PC? }DATA?<8@<?<C?7 DATA8@<@<?<C?)ڌn=DATA@<@<8@<XD? DATA@<A<@<D?EDATAA<XA<@<D?XcDATAXA<A<A<8E? DATAA<A<XA<xE? DATAA<0B<A<E? #MaDATA0B<xB<A<E?0m[nDATAxB<B<0B<XF?76 cDATAB<C<xB<F?DATAC<PC<B<F? bqDATAPC<C<C<G?KEERFDATAC<C<PC<G? }^DATAC<(D<C<G?DATA(D<pD<C< H?!̽DATApD<D<(D<xH?DATAD<E<pD<H?7xDATAE<HE<D<I?}^DATAHE<E<E<8I? [DATAE<E<HE<xI? >DATAE< F<E<I?DATA F<hF<E<J? DATAhF<F< F<hJ? DATAF<F<hF<J?6'{DATAF<@G<F<K? P+DATA@G<G<F<PK? ,DATAG<G<@G<K? sDATAG<H<G<K?DATAH<`H<G< L?DATA`H<H<H<`L?DATAH<H<`H<L?DATAH<8I<H<L?sed DATA8I<I<H< M?hDATAI<I<8I<`M?yDATAI<J<I<M?DATAJ<XJ<I<N?yDATAXJ<J<J<PN?8DATAJ<J<XJ<N? @DATAJ<0K<J<N?BDATA0K<xK<J<O? (4DATAxK<K<0K<XO? DATAK<L<xK<O?DATAL<PL<K<O?(ިDATAPL<L<L<8P?DATAL<L<PL<P?VDATAL<(M<L<P?NDATA(M<pM<L<Q?ZDATApM<M<(M<Q?PݍDATAM<N<pM<Q?0PDATAN<HN<M<XR?DATAHN<N<N<R?DATAN<N<HN<R?DATAN< O<N< S?PDATA O<hO<N<pS?`DATAhO<O< O<S?DATAO<O<hO<T?=, >DATAO<@P<O<pT?,DATA@P<P<O<T?ĦDATAP<P<@P<T?j,DATAP<Q<P<U?+ИDATAQ<`Q<P<U?:GDATA`Q<Q<Q<`V?.EfDATAQ<Q<`Q<V?DATAQ<8R<Q<W?DATA8R<R<Q<HW?9BXDATAR<R<8R<W?DATAR<S<R<X? BXDATAS<XS<R<HX? DATAXS<S<S<X?eHDATAS<S<XS< Y?DATAS<0T<S<hY?DATA0T<xT<S<Y?DATAxT<T<0T<Y?DATAT<U<xT<HZ?ԆDATAU<PU<T<Z?GDATAPU<U<U<[?^DATAU<U<PU<P[?DATAU<(V<U<[?#DATA(V<pV<U<[?#DATApV<V<(V<0\?#DATAV<W<pV<\?#DATAW<HW<V<\?#DATAHW<W<W< ]?#DATAW<W<HW<p]?#DATAW< X<W<]?Y#DATA X<hX<W<P^?#DATAhX<X< X<^?-#DATAX<X<hX<^?I#DATAX<@Y<X<x_?`DATA@Y<Y<X<`?&DATAY<Y<@Y<h`?1 DATAY<Z<Y<`?DATAZ<`Z<Y<a?DATA`Z<Z<Z<Pa? (DATAZ<Z<`Z<a??DATAZ<8[<Z<b?`DATA8[<[<Z<Hb?4DATA[<[<8[<b?'{DATA[<\<[<b?ٽDATA\<X\<[<@c?*DATAX\<\<\<c?oxDATA\<\<X\<c?QDATA\<0]<\<pd?pDATA0]<x]<\<d?DATAx]<]<0]<e?tersDATA]<^<x]<He?}^DATA^<P^<]<e? DATAP^<^<^<e?DATA^<^<P^<(f? DATA^<(_<^<hf?DATA(_<p_<^<f?#lRDATAp_<_<(_<g?8xDATA_<`<p_<Hg? DATA`<H`<_<g?eneDATAH`<`<`<g? dDATA`<`<H`<h?DATA`< a<`<Ph??DATA a<ha<`<h?CDATAha<a< a<i?C;DATAa<a<ha<xi?C4DATAa<@b<a<i?DATA@b<b<a<(j?]DATAb<b<@b<hj?n DATAb<c<b<j?DATAc<`c<b<k?>IDATA`c<c<c<Hk? `sDATAc<c<`c<k??DATAc<8d<c<k? DATA8d<d<c<l? DATAd<d<8d<Pl?Q:DATAd<e<d<l?DATAe<Xe<d<l?#5&DATAXe<e<e<8m?)DATAe<e<Xe<m? A"DATAe<0f<e<m?[DATA0f<xf<e<n?8xDATAxf<f<0f<Xn?DATAf<g<xf<n?DATAg<Pg<f<n?bEDATAPg<g<g<0o?DATAg<g<Pg<xo?DATAg<(h<g<o?DATA(h<ph<g<p?DATAph<h<(h<Xp?tEdgDATAh<i<ph<p?8DATAi<Hi<h<p?&=DATAHi<i<i<0q? Sbl?DATAi<i<Hi<pq?DATAi< j<i<q?}WDATA j<hj<i<r?DATAhj<j< j<Pr?>IDATAj<j<hj<r?DATAj<@k<j<r?DATA@k<k<j<(s?DATAk<k<@k<ps?qDATAk<l<k<s?>IDATAl<`l<k<t?DATA`l<l<l<Pt?DATAl<l<`l<t?EfDATAl<8m<l<t?%DATA8m<m<l<@u?- DATAm<m<8m<u?TDATAm<n<m<u?DATAn<Xn<m<0v?! DATAXn<n<n<v?/xDATAn<n<Xn<v?DATAn<0o<n<8w?<XDATA0o<xo<n<w?NDATAxo<o<0o<w?pDATAo<p<xo<0x?DATAp<Pp<o<px?5FD5DATAPp<p<p<x?$3DATAp<p<Pp<0y?HD5DATAp<(q<p<xy?DATA(q<pq<p<y?DATApq<q<(q<z?sDATAq<r<pq<Pz?ИDATAr<Hr<q<z? DATAHr<r<r<z?ИDATAr<r<Hr<{?DATAr< s<r<H{?$hYDATA s<hs<r<{?DATAhs<s< s<{? DATAs<s<hs< |?ZDATAs<@t<s<h|?D?DATA@t<t<s<|?.DATAt<t<@t<}?@A"DATAt<u<t<}?&V DATAu<`u<t<}?>DATA`u<u<u<P~?&V DATAu<u<`u<~?,DATAu<8v<u<? DATA8v<v<u<H? DATAv<v<8v<?;DATAv<w<v<?GDATAw<Xw<v<p?(, >DATAXw<w<w<Ѐ?+0DATAw<w<Xw<0?<CDATAw<0x<w<?JDATA0x<xx<w< ?&]u)DATAxx<x<0x<x?+DATAx<y<xx<؂?]u)>DATAy<Py<x<?DATAPy<y<y<`?@vDATAy<y<Py<?:%>DATAy<(z<y<?DATA(z<pz<y<P?ИDATApz<z<(z<0?ZDATAz<{<pz<?,[DATA{<H{<z< ?7 DATAH{<{<{<X?@> DATA{<{<H{<І? DATA{< |<{<? DATA |<h|<{<P? XyDATAh|<|< |<? DATA|<|<h|<Ї? DATA|<@}<|< ?>,DATA@}<}<|<?NDATA}<}<@}<?< DATA}<~<}<X?DATA~<`~<}<? DATA`~<~<~<?@ݭDATA~<~<`~<(?;ODATA~<8<~<?삽DATA8<<~<?DDATA<<8<`? xߦDATA<<<? :DATA<X<<?[DATAX<<< ?DATA<<X<`?KoDATA<0<<? ~[=DATA0<x<< ?G+DATAx<<0<`?!DATA<<x<?-䟏=DATA<P<<? 㟏=DATAP<<<X? ,NDATA<<P<?*-DATA<(<<?hكDATA(<p<<0?2.DATAp<<(<?DATA<<p<?DATA<H<<Ȑ?Y`ͽDATAH<<<X?-DATA<؄<H<?DATA؄< <<?@DATA <h<؄<8?DATAh<< <p?TDATA<<h<? DATA<@<<? DATA@<<<0?DATA<І<@<x?H]DATAІ<<<?ͽDATA<`<І<? DATA`<<<P? @DATA<<`<? DATA<8<<Д?DATA8<<<??DATA<Ȉ<8<P?AC DATAȈ<<<ȕ?DATA<X<Ȉ<?DATAX<<<h?"DATA<<X<?DATA<0<<? DATA0<x<<0? DATAx<<0<x?? DATA<<x<?ADATA<P<<0?9DATAP<<<x?D?DATA<<P<?fsDATA<(<<??y DATA(<p<<X? XDATAp<<(<? T?DATA<<p<ؙ?ͽDATA<H<< ?ͽDATAH<<<p? hDATA<؍<H<?xDATA؍< <<?_e=DATA <h<؍<0?w=DATAh<< <x?_e=DATA<<h<?BDATA<@<<8?j=DATA@<<<?-k"DATA<Џ<@<?þDATAЏ<<<0? DATA<`<Џ<p?EfDATA`<<<?DATA<<`<?DATA<8<<P?:EfDATA8<<<?DATA<ȑ<8<?TDATAȑ<<<`? $DATA<X<ȑ<?LD5DATAX<<<? 0DATA<<X<0?DATA<0<<x?#DATA0<x<<Ƞ? DATAx<<0<?DATA<<x<P?3EսDATA<P<<? DATAP<<<ء? 8DATA<<P<?&040 DATA<(<<p? DATA(<p<<?؈DATAp<<(<?$MHͽDATA<<p<P?y DATA<H<<?DATAH<<<أ?MHͽDATA<ؖ<H<?DATAؖ< <<`?DATA <h<ؖ<? HDATAh<< <?#DATA<<h<@?DATA<@<<? DATA@<<<ȥ?DATA<И<@<?DATAИ<<<P?DATA<`<И<?~=DATA`<<<?DATA<<`<0?  DATA<8<<p?DATA8<<<?b DATA<Ț<8<?DATAȚ<<<@?`ܽDATA<X<Ț<?kDATAX<<<ب?( DATA<<X<8?" DATA<0<<?DATA0<x<<ة?8c DATAx<<0<(?DATA<<x<x?3DATA<P<<?=DATAP<<<(?((ͦDATA<<P<?>DATA<(<<ȫ?)DATA(<p<<(?4DATAp<<(<?DATA<<p<ج?' DATA<H<<0?|ܽDATAH<<<p?(DATA<؟<H<Э?!DATA؟<(<<(?ec[4DATA(<p<؟<p?,DATAp<<(<?, DATA<<p<?- DATA<H<<h?(4DATAH<<<?DATA<ء<H<? on DATAء< <<(?DATA <h<ء<p?.ٶWDATAh<< <а?DATA<<h<?&c DATA<@<<X?(c DATA@<<<?=DATA<У<@<ر?`ܽDATAУ<<< ?+c DATA<`<У<h? DATA`<<<?DATA<<`<?-DATA<8<<H?DATA8<<<?z=DATA<ȥ<8<г?UDATAȥ<<< ? (DATA<X<ȥ<h?DATAX<<<?+z=DATA<<X<?DATA<0<<P?DATA0<x<<?%DATAx<<0<?DATA<<x<(?3DATA<P<<?DATAP<<<?DATA<<P<(?DATA<(<<p?&DATA(<p<<ȷ?"DATAp<<(< ?DATA<<p<X?ADATA<H<<и?DATAH<<< ?DATA<ت<H<h?DATAت< <<?(DATA <h<ت<?8DATAh<< <P?DATA<<h<?DATA<@<<?P`DATA@<<<@?DATA<Ь<@<?DATAЬ<<<л?DATA<`<Ь<?DATA`<<<`?TDATA<<`<?2A"DATA<8<<?Jly EDATA8<<<?!DATA<Ȯ<8<ؽ?Hf0DATAȮ<<<X?wFREEDATA<X<Ȯ<?e DATAX<<<? eBDATA<<X<ؿ?DATA<0<<?ΈDATA0<x<<`?DATAx<<0<?fTzDATA<<x<0?DATA<P<<p??DATAP<<<??DATA<<P<?DATA<(<<0?w DATA(<p<<h?O_?DATAp<<(<?})DATA<<p<?(DATA<H<<X?W DATAH<<<?DATA<س<H<?%c4DATAس< << ? DATA <h<س<h?DATAh<< <?[DATA<<h<?D,~DATA<@<<x?"E?DATA@<<<?DATA<е<@< ?THD5DATAе<<<? &DATA<`<е<?hDATA`<<<H?(DATA<<`<?DATA<8<<?W DATA8<<<0?DATA<ȷ<8<x?@m,vsDATAȷ<<<?DATA<X<ȷ<(?#,DATAX<<<?DATA<<X<?DATA<0<<?&DATA0<x<<`?C軙DATAx<<0<?|DATA<<x<?DATA<P<<`?DATAP<<<?BDATA<<P< ?BDATA<(<<? DATA(<p<<?DATAp<<(<?(+DATA<<p<p?)>DATA<H<<?(DATAH<<<0?xDATA<ؼ<H<x? DATAؼ< <<?nͳDATA <h<ؼ<?5ÕDATAh<< <8? FDATA<<h<x?DATA<@<<?pLLDATA@<<<?*?DATA<о<@<`?&DATAо<<<?"xDATA<`<о<?/nͳDATA`<<<h?DATA<<`<?*_DATA<8<<?MLDATA8<<<P?DATA<<8<?DATA<<<?7JDATA<X<<SDATAX<<<H?'DATA<<X<?GDATA<0<<?%DATA0<x<<p? ~DATAx<<0<?DATA<<x<?ChDATA<P<<x? ?IDATAP<<<?7DATA<<P<? xߦDATA<(<<8? QDATA(<p<<?^ܽDATAp<<(<? DATA<<p< ?DATA<H<<X?--- DATAH<<<?lendDATA<<H<? DATA< <<?DATA <h<<P?DATAh<< <?DATA<<h<?DATA<@<<0?DATA@<<<x? @XDATA<<@<?DATA<<<? DATA<`<<0? DATA`<<<p?2DATA<<`<?DATA<8<< ?,DATA8<<<h?1DATA<<8<?#DATA<<<?T#DATA<X<<h? DATAX<<<?DATA<<X<?A"DATA<0<<X?xDATA0<x<<?0tDATAx<<0<? RDATA<<x<(?*DATA<P<<?MD5DATAP<<<?XDATA<<P<?N?DATA<(<<8?DATA(<p<<?DATAp<<(<?DATA<<p<? DATA<H<<P?'DATAH<<<?FDATA<<H< ?DATA< <<h?<NurbDATA <h<<?+z·DATAh<< <8?uildDATA<<h<? t+DATA<@<<?DATA@<<<?!FREEDATA<<@<h?"DATA<<<?JhDATA<`<<@?)ooDATA`<<<?{DATA<<`<?DATA<8<<8?ثDATA8<<<?DATA<<8<? DATA<<<?PDATA<X<<X? DATAX<<<?DATA<<X<?>DATA<0<<@?DɍDATA0<x<<?DATAx<<0<?HXDATA<<x<?DCDATA<P<<?s DATAP<<<?<ODATA<<P<?GDATA<(<<?8DATA(<p<<p?  DATAp<<(<?> DATA<<p<?DATADATA<H<<H? DATAH<<<?=DATA<<H<?kDATA< << ? DATA <h<<`?x=DATAh<< <?BDATA<<h<?UDATA<@<< ?DATA@<<<h?JDATA<<@<? DATA<<<?A"DATA<`<<(?rDATA`<<<`? DATA<<`<?dDATA<8<<?DATA8<<<8?(DDATA<<8<?5JDATA<<<?DATA<X<<H?>IDATAX<<<?DATA<<X<?DATA<0<<?DATA0<x<<H?DATAx<<0<?DATA<<x<?3DATA<P<<@?DATAP<<<?DATA<<P<? DATA<(<<?DATA(<p<<8?FREEDATAp<<(<?;DATA<<p<?%DATA<H<<?FREEDATAH<<<`?  DATA<<H<?DATA< <<?DATA <h<<0?--- DATAh<< <x?# DATA<<h<?!X@DATA<@<<(?2ZEDATA@<<<?DATA<<@<?!DATA<<<8? DATA<`<<x?XDATA`<<<?DATA<<`<?( DATA<8<<8?DATA8<<<x?8_DATA<<8<?$#DATA<<<@?"DATA<X<<?DATADATAX<<<?4.DATA<<X<8?DATA<0<<?#DATA0<x<<?DATAx<<0<? HD5DATA<<x<P? DATA<P<<?DATAP<<<? DATA<<P<? DATA<(<<X?DATA(<p<<?DATAp<<(<? DATA<<p<?DATA<H<<P?DATAH<<<?3DATA<<H<?DATA< <<0?pDATA <h<<p?޻DATAh<< <?*DATA<<h<?DATA<@<<X?)DATA@<<<?DATA<<@<?DATA<<<8@ DATA<`<<@1DATA`<<<@DATA<<`<0@2mDATA<8<<h@8XDATA8<<<@DATA<<8<@:f unDATA<<<p@)9DATA<X<<@ DATAX<<<@DATA<<X<P@DATA<0<<@>DATA0<x<<@DATAx<<0<@@ pSDATA<<x<@DATA<P<<@,}^DATAP<<<0@8xDATA<<P<@DATA<(<<@CDATA(<p<<0@C1DATAp<<(<@CDATA<<p< @܊DATA<H<<X@hDATAH<<<@b2DATA<<H<@ ЍDATA< <<@,DATA <h<<x@#g"DATAh<< <@DATA<<h< @"DATA<@<<h @FREEDATA@<T=< @ DATAT=U=@< @#DATAU=HU=T=8 @DATAHU=U=U= @DATAU=U=HU= @!|DATAU= V=U=( @xDATA V=hV=U=p @3DATAhV=V= V= @޻DATAV=V=hV= @ DATAV=@W=V=@ @DATA@W=W=V= @DATAW=W=@W= @(ףDATAW=X=W= @ Ȉ=DATAX=`X=W=` @ FMDATA`X=X=X= @dDATAX=X=`X= @DATAX=8Y=X=0@( DATA8Y=Y=X=x@ʀ3DATAY=Y=8Y=@ `XDATAY=Z=Y=@pDATAZ=XZ=Y=P@ RDATAXZ=Z=Z=@?~=DATAZ=Z=XZ=@Ogp=DATAZ=0[=Z=@Fgp=DATA0[=x[=Z=@@%X=DATAx[=[=0[=@@ DATA[=\=x[=@DATA\=P\=[=@-DATAP\=\=\=0@ DATA\=\=P\=p@DATA\=(]=\=@ DATA(]=p]=\=@DATAp]=]=(]=0@ DATA]=^=p]=p@DATA^=H^=]=@DATAH^=^=^=@DATA^=^=H^=8@DATA^= _=^=@ DATA _=h_=^=@'DATAh_=_= _=@DATA_=_=h_=h@DATA_=@`=_=@DATA@`=`=_=@ DATA`=`=@`=@@+DATA`=a=`=@DATAa=`a=`=@DATA`a=a=a= @DATAa=a=`a=h@ DATAa=8b=a=@DATA8b=b=a=@ DATAb=b=8b= @'ЌDATAb=c=b=x@DATAc=Xc=b=@nK?DATAXc=c=c=@!L91=DATAc=c=Xc=h@e:?DATAc=0d=c=@~[=DATA0d=xd=c=@fG=DATAxd=d=0d=0@ ~[=DATAd=e=xd=p@DATAe=Pe=d=@&:>DATAPe=e=e=@_)DATAe=e=Pe=`@DATAe=(f=e=@'V|=DATA(f=pf=e=@3DATApf=f=(f=P@ (>DATAf=g=pf=@HDATAg=Hg=f=@ǯDATAHg=g=g=@XدDATAg=g=Hg=X@DATAg= h=g=@DATA h=hh=g=@ h DATAhh=h= h=(@3DATAh=h=hh=@!DATAh=@i=h=@4DATA@i=i=h=@0FDATAi=i=@i=`@AWDATAi=j=i=@poDATAj=`j=i= @DATA`j=j=j=X @5DATAj=j=`j= @ PDATAj=8k=j=!@DATA8k=k=j=P!@ DATAk=k=8k=!@ DATAk=l=k=!@tDATAl=Xl=k="@DATAXl=l=l=`"@ ȱDATAl=l=Xl="@PADATAl=0m=l="@DATA0m=xm=l= #@DATAxm=m=0m=p#@DDATAm=n=xm=#@<DATAn=Pn=m=($@ @DATAPn=n=n=h$@PDATAn=n=Pn=$@<DATAn=(o=n=%@ {DATA(o=po=n=@%@ MDATApo=o=(o=%@&GDATAo=cpo=%@DATAc8co= &@!PXDATA8cccx&@DATAcc8c&@gDATAccc'@0KDATAcXcc`'@ DATAXccc'@ DATAccXc'@PXDATAc0cc8(@DATA0cxcc(@ DATAxcc0c(@誒DATAccxc)@WDATAcPcc`)@DATAPccc)@ 2mDATAccPc)@ DATAc(cc0*@#DATA(cpcc*@DATApcc(c*@DATAccpc +@DATAcHcch+@ iDATAHccc+@DATAccHc+@ DATAc cc@,@DATA chcc,@d DATAhcc c,@*G DATAcchc0-@.DATAc@cc-@DATA@ccc-@ pDATAcc@c.@(DATAccc`.@ ]DATAc`cc.@#DATA`ccc.@3DATAcc`c`/@$ DATAc8cc/@5&DATA8ccc0@65&DATAcc8ch0@%DATAccc0@YDATAcXcc0@ W DATAXccc(1@޻DATAccXch1@| DATAc0cc2@$DATA0cxccp2@%jDATAxcc0c2@.}DATAccxc(3@(DATAcPccp3@\ DATAPccc3@ l DATAccPc3@DATAc(cc84@ ~E5DATA(cpccx4@ PXDATApcc(c4@;DATAccpc05@DATAcHccx5@ DATAHccc5@ DATAccHc5@+DATAc ccX6@DATA chcc6@DATAhcc c6@DATAcchc7@ DATAc@cch7@DATA@ccc7@ΦDATAcc@c7@4DATAccc`8@! DATAc`cc8@ DATA`ccc8@ )`DATAcc`c89@selfDATAc8ccp9@XDATA8ccc9@ ",sDATAcc8c9@,DCDATAcccH:@ЧDATAcXcc:@hMDATAXccc:@!h DATAccXc8;@XDATAc0ccp;@DATA0cxcc;@DATAxcc0c;@ DATAccxc8<@ 4DATAcPccx<@DATAPccc<@<DATAccPc=@PXDATAc(ccP=@#PDATA(cpcc=@QDATApcc(c=@DATAccpc0>@=DATAcHcch>@ V DATAHccc>@DATAccHc>@DATAc dcH?@DATA dhdc?@DATAhdd d?@ (DATAddhd?@@5DATAd@dd@@@8=DATA@dddx@@DATAdd@d@@iMDATAdddA@D DATAd`ddA@;DATA`dddA@GDATAdd`d0B@DATAd8ddB@DATA8dddB@!oDATAdd8dC@cfDATAdddhC@xDATAdXddC@EDATAXdddC@0KDATAddXd0D@0KDATAd0ddD@*DATA0dxddD@DATAxdd0d(E@b:DATAddxdxE@ݢDATAdPddE@B|=DATAPdddE@ :DATAddPdHF@, :DATAd(ddF@fDATA(dpdd0G@kDATApdd(dG@_:DATAddpdH@3DATAdHddpH@.DATAHdddH@¾DATAddHdI@4DATAd ddpI@4/UvDATA dh ddI@DATAh d d dJ@DATA d dh dXJ@5DATA d@ d dJ@0KDATA@ d d dK@/ DATA d d@ d`K@5 DATA d d dK@5DATA d` d d0L@DATA` d d dhL@DATA d d` dL@xDATA d8 d dL@DATA8 d d d0M@=_DATA d d8 dM@DATA d d dM@2DATA dX d d0N@ DATAX d d dpN@=DATA d dX dN@DATA d0d d(O@DATA0dxd dxO@DATAxdd0dO@DATAddxdP@"DATAdPddpP@;DATAPdddP@DATAddPd(Q@ pDATAd(ddQ@DATA(dpddQ@"DATApdd(d R@DATAddpdhR@*6 DATAdHddR@&DATAHddd S@DATAddHd`S@DATAd ddS@ cfDATA dhddS@FR(DATAhdd d(T@6xXDATAddhdT@"DATAd@ddT@ xDATA@ddd(U@DATAdd@dpU@DATAdddU@DATAd`ddU@DATA`dddV@V DATAdd`dV@5&DATAd8ddV@7!DATA8dddPW@JDATAdd8dW@ DATAdddW@+DATAdXdd0X@FR(DATAXdddxX@ DATAddXdX@DATAd0ddY@DATA0dxddXY@DATAxdd0dY@?DATAdp=xdY@N?DATAp=Hp=d@Z@)KDATAHp=p=p=Z@ dDATAp=p=Hp=Z@RDATAp= q=p=[@,~DATA q=hq=p=`[@DATAhq=q= q=[@DATAq=q=hq=[@8cfDATAq=@r=q=`\@DATA@r=r=q=\@V9RDATAr=r=@r=\@5V(DATAr=s=r=X]@cDATAs=`s=r=]@DATA`s=s=s=0^@:*c9DATAs=s=`s=^@Y=DATAs=8t=s=^@pDATA8t=t=s= _@c!?DATAt=t=8t=_@Ijo=DATAt=u=t=_@:DATAu=Xu=t=h`@DATAXu=u=u=`@.>DATAu=u=Xu=`@u=DATAu=0v=u=0a@u=DATA0v=xv=u=pa@ DATAxv=v=0v=a@ DATAv=w=xv=b@DATAw=Pw=v=Hb@  DATAPw=w=w=b@h^DATAw=w=Pw=b@&~rDATAw=(x=w=(c@DATA(x=px=w=pc@PR(DATApx=x=(x=c@3PR(DATAx=y=px= d@3,?DATAy=Hy=x=d@XPR(DATAHy=y=y=e@?DATAy=y=Hy=Pe@5DATAy= z=y=e@KHDATA z=hz=y=8f@(DATAhz=z= z=f@/DATAz=z=hz=f@DATAz=@{=z=8g@ DATA@{={=z=g@ KR(DATA{={=@{=g@]6@DATA{=|={=h@0DATA|=`|={=ph@ DATA`|=|=|=h@#͈UDATA|=|=`|=i@(o^DATA|=8}=|=pi@DATA8}=}=|=i@7?DATA}=}=8}= j@cDATA}=~=}=j@PR(DATA~=X~=}=k@T9*DATAX~=~=~=Pk@DATA~=~=X~=k@>DATA~=0=~=k@ťDATA0=x=~=8l@~DATAx==0=l@+PR(DATA==x=l@?DATA=P==(m@'*1!DATA`===H}@ DATA==`=}@)T9*DATA=8==}@?DATA8===0~@6hileDATA=ȏ=8=~@DATAȏ===~@sssDATA=X=ȏ=(@o|CDATAX===h@sssDATA==X=@?DATA=0==@໪DATA0=x==0@DATAx==0=h@3DATA==x=Ѐ@DATA=P==@DATAP===X@sssDATA==P=@ѼDATA=(==@"DATA(=p==8@DATAp==(=@QDATA==p=@DATA=H==@DATAH===X@DATA=ؔ=H=@-DATAؔ= ==@[DATA =h=ؔ=(@DATAh== =x@DATA==h=@DATA=@==@u;DATA@===@`MDATA=Ж=@=P@DATAЖ===@DATA=`=Ж=І@Cots_DATA`===H@XDATA==`=@UDATA=8==ȇ@DATA8===@FR(DATA=Ș=8=X@$PR(DATAȘ===@DATA=X=Ș=@$]mDATAX===H@DATA==X=@FDATA=0==@DATA0=x==0@% DATAx==0=@f7DATA==x=@WDATA=P==H@PR(DATAP===@?DATA==P=Ћ@.DATA=(==0@$DATA(=p==p@?DATAp==(=@ªDATA==p=@O"DATA=H==@ "DATAH===@,- DATA=؝=H= @1DATA؝= ==h@8DATA =h=؝=@O1DATAh== =0@(2DATA==h=@UDATA=@==ȏ@-J9*DATA@===(@|DATA=П=@=h@ƍDATAП===@ ~DATA=`=П=@AKDATA`===X@ kDATA==`=@DATA=8==@(DATA8===(@D?DATA=ȡ=8=@ (DATAȡ===@L>DATA=X=ȡ=@3wDATAX===h@+1DATA==X=ȓ@,?DATA=0==(@DATA0=x==p@?DATAx==0=@DATA==x=@0DATA=P==8@DATAP===@PԿDATA==P=ȕ@LDATA=(==@QZDATA(=p==@ 0DATAp==(=ؖ@DATA==p=(@ DATA=H==h@% DATAH===@DATA=ئ=H=@ DATAئ= ==P@ DATA =h=ئ=@ODATAh== =@ DATA==h=0@>IDATA=@==@ D DATA@===@$߸DATA=Ш=@=@ DATAШ===h@xDATA=`=Ш=@ DATA`===@ ?IDATA==`=8@ DATA=8==p@DATA8===@C DATA=Ȫ=8= @C\P=DATAȪ===@C9=DATA=X=Ȫ=@DATAX===H@1X&=DATA==X=@D =DATA=0==Н@ X9DATA0=x==@ DATAx==0=P@DATAh== =@ `DATA==h=@|=DATA=@==8@P=DATA@===x@ W ?DATA=г=@=@DATAг===@&DATA=`=г=@@{DATA`===@ ODATA==`=@89DATA=8==@DATA8===@@lDATA=ȵ=8=@DATAȵ===Ч@n~DATA=X=ȵ= @DATAX===h@[DATA==X=@!DATA=0==P@ tDATA0=x==@?DATAx==0=ȩ@DATA==x=@DATA=P==H@DATAP===@ 0DATA==P=Ȫ@  DATA=(==@DATA(=p==H@DATAp==(=@dDATA==p=Ы@?DATA=H== @zDATAH===p@DATA=غ=H=@gDATAغ= ==@ DATA =h=غ=X@DATAh== =@ Y0DATA==h=@45DATA=@==h@0DATA@===@#DATA=м=@=@ kDATAм===P@ }ʕDATA=`=м=@HV>DATA`===@<DATA==`=@ A>DATA=8==@ ?DATA8===@>$>DATA=Ⱦ=8=0@CρN?DATAȾ===@CDATA=X=Ⱦ= @CDATAX===@DATA==X=в@tg"DATA=0==@a?DATA0=x==X@۾DATAx==0=@ M?DATA==x=@DATA=P==(@~DATAP===h@ =DATA==P=@UvDATA=(==0@UqDATA(=p==@UDATAp==(=@@>DATA==p=@ S>DATA=H==@[`DATAH===P@[聻DATA==H=@[DATA= ==p@vDATA =h==@"JDATAh== =@=DATA==h=@@DATA=@==@8DATA@===ȹ@ DATA==@=@DATA===H@JDATA=`==@TWDATA`===к@ m=DATA==`=@DATA=8==H@n=DATA8===@QF>DATA==8=л@MrV=DATA===P@cODATA=X==@ DATAX===(@=,P=DATA==X=@8>DATA=0==@@l?DATA0=x==0@;DATAx==0=@E{=DATA==x=@/T=DATA=P==x@DATAP===@*(mDATA==P=(@93Y=DATA=(==@blDATA(=p==@y=DATAp==(=@=DATA==p=X@z=DATA=H==@/DATAH===@#DATA==H=8@ Jh=DATA= ==x@#\;3DATA =h==@=DATAh== =@#=DATA==h=`@ DATA=@==@7 DATA@===@J>DATA==@=H@DATA===@DATA=`==@=DATA`===@DATA==`=P@ DATA=8==@'{)DATA8===@ 2| >DATA==8=(@HDATA===@ 166DATA=X==@*>DATAX===0@ܛ >DATA==X=x@ܛ >DATA=0==@b>DATA0=x==@=DATAx==0=P@]TDATA==x=@̷DATAh== =@@DATA==h=@+>DATA=@==@G>DATA@===@R>DATA==@=P@GDATA===@W=DATA=`==@H=DATA`===(@z=DATA==`=h@ DATA=8==@:Z>DATA8===@MDATA==8=(@C>DATA===h@DATA=X==@ ?DATAX===@ JۖDATA==X=0@j DATA=0==h@5*;DATA0=x==@C55?DATAx==0=@C4?DATA==x=@CDATA=P==@DATAP===@@DATA==P=x@(=DATA=(==@DATA(=p==@3DATAp==(= @DATA==p=X@u5?DATA=H==@DATAH===@b<=DATA==H=@rN=DATA= ==8@DATA =h==p@.DATAh== =@`)Y=DATA==h=@Ή=DATA=@==@DATA@===P@Ph>DATA==@=@*=DATA===@nDATA=`==@Ή=DATA`===0@!H5DATA==`=@DATA=8==@nDATA8===@bDATA==8=H@VDATA===@`"DATA=X==@NDATA=@==@DATA@===(@ rG>DATA==@=@'٨=DATA===@ l?DATA=`==@*(=DATA`===x@ =DATA==`=@B ?DATA=8==@DATA8===@@#n=DATA==8=x@ DATA===@=DATA=X==@<#&>DATAX===@@$=DATA==X=@DATA=0==@=DATA0=x==@ ?DATAx==0=H@O8 ѲDATA==x=@hDATA=P==@ DATAP===X@=DATA==P=@xDATA=(==@sDDATA(=p==0@A4?DATAp==(=@$ *c4DATA==p=@[?DATA=H==@ DATAH===@hDATA==H=@*9DATA= ==p@ 3DATA =h==@=DATAh== =@DATA==h=@@3DATA=@==@DATA@===@ ]7DATA==@=0@5?DATA===x@ DATA=`==@ t DATA`===@DATA==`=P@/5DATA=8==@ DATA8===@FDATA==8=@&|DATA===@ DATA=X==@_ټDATAX===P@F߼DATA==X=@!DATA=0==@DATA0=x==@HDATAx==0=P@-ADATA==x=@DATA=P==@-ADATAP===(@*-ADATA==P=@}DATA=(==@&46DATA(=p== @ԧ2DATAp==(=h@!-DATA==p=@ݮ>DATA=H==@!߫ ?DATAH===`@ ϾDATA==H=@ ׾DATA= ==@V=DATA =h==@H׺DATAh== =h@J$DATA==h=@,DATA=@==@.DATA@===h@DATA==@=@|=DATA===@,ODATA=`==H@M"n=DATA`===@C>DATA==`=@DATA=8==H@!=DATA8===@ H DATA==8=@=DATA===(@=DATA=X==h@.DATAX===@ @>DATA==X=@(=DATA=0==P@=DATA0=x==@ j=DATAx==0=@ DATA=>x= @DATA>P>=X@P>DATAP>>>@0DATA>>P>@ ?DATA>(>>8@! ?DATA(>p>>p@T ?DATAp>>(>@ W=DATA>>p>@ DATA>H>>@@=DATAH>>>@0=DATA>>H>@>2=DATA> >>H@)DATA >h>>@'PþDATAh>> >@đDATA>>h>8@DATA>@>>p@f DATA@>>>@V qDATA>>@>@DATA>>>H@V qDATA>`>>@FI=DATA`>>>@&M=DATA>>`>`@DATA>8>>@ DATA8>>>@ =DATA>>8>@@DATA>>>@=DATA>X>>@?DATAX>>>@TZNDATA>>X>@!?DATA>0>>@AQDATA0>x>>0@*,=DATAx>>0>@ =DATA> >x>@N>DATA >P >>Ar3DATAP > > >`ADATA > >P >AnNDATA >( > >A 8Ӌ=DATA( >p > >0ADATAp > >( >hA8Ӌ=DATA > >p >A DATA >H > >ADATAH > > >A-DATA > >H >xA#DATA > > >A! DATA >h > >(ADATAh > > >pADATA > >h >ADATA >@ > >A DATA@ > > >`A DATA > >@ >A DATA >> >ADATA>`> >ADATA`>>>hADATA>>`>AKDATA>8>>(A DATA8>>>ADATA>>8>ADATA>>>ADATA>X>>PA pDATAX>>>AhDATA>>X>Ac0>>ADATA0>x>>XAmavDATAx>>0>ADATA>>x>ADATA>P>>8 A5>> A^DATA>>P> A"(>> A 'DATA(>p>>` ADATAp>>(> A ޾>p> A0AQ?DATA>H>>X AODATAH>>> ADATA>>H> A;=DATA> >>` AAQ?DATA >h>> ADATAh>> > ALC?DATA>>h>8 AU70DATA>@>> AX=DATA@>>>ASDATA>>@>ADATA>>>A#>=DATA>`>>8A+DATA`>>>AYDATA>>`>ADATA>8>>(ADATA8>>>pA"IDATA>>8>ArDATA>>>A#=DATA>X>>pADATAX>>>(AOz?DATA>>X>pA=DATA>0>>A=DATA0>x>>ATS?DATAx>>0>HAyQ?DATA>>x>AC>DATA>P>>AC3?DATAP>>>pAC o?DATA>>P>A`?DATA>(>> Aـp>>XA8DATAp>>(>A>p>A:/;DATA>H>>PAD>>A8/;DATA>>H>AQrDATA> >>HA聻DATA >h>>A+Z͏DATAh>> >A+DATA>>h>@ADATA>@>>Aہ6DATA@>>>A:DATA>>@>A:DATA> >>HAי@DATA >` >>AiDATA` > > >AZTDATA > >` > A$(TDATA >8!> >xAI^@DATA8!>!> >A$g"DATA!>!>8!>PA$-DATA!>">!>AIZDATA">X">!>(A$*DATAX">">">ADATA">">X">A'DATA">0#>">A{DATA0#>x#>">HA%S:DATAx#>#>0#>ADATA#>$>x#>A=DATA$>P$>#>A`DATAP$>$>$>PA ǾDATA$>$>P$>A,Y=DATA$>(%>$>A kDATA(%>p%>$>0A,::DATAp%>%>(%>A [:DATA%>&>p%>A,* =DATA&>H&>%>`B-BDATAH&>&>&>B 9DATA&>&>H&>ؠBDATA&> '>&>(Bt7DATA '>h'>&>hB.{>DATAh'>'> '>ȡBѐ>DATA'>'>h'>B"LADATA'>@(>'>hB=DATA@(>(>'>B=DATA(>(>@(>BBr<=DATA(>)>(>@B{DATA)>`)>(>BDCDATA`)>)>)>BDATA)>)>`)>BDATA)>8*>)>HBDATA8*>*>)>B6DCDATA*>*>8*>BpUDATA*>+>*>(BDATA+>X+>*>pB+DATAX+>+>+>ХB+¾DATA+>+>X+>0BDATA+>0,>+>pBdF>DATA0,>x,>+>BDATAx,>,>0,>BDATA,>->x,>8BDATA->P->,>B>=DATAP->->->اBC]=DATA->->P->B$DATA->(.>->hB$ұ=DATA(.>p.>->BDATAp.>.>(.>BޤVDATA.>/>p.>HBfS5DATA/>H/>.>B1DATAH/>/>/>ةBo=DATA/>/>H/>B4DATA/>(0>/>XB.RDATA(0>p0>/>B-`DATAp0>0>(0>B DATA0>1>p0>PB =DATA1>H1>0>BDATAH1>1>1>BDATA1>1>H1> B.=DATA1> 2>1>BDATA 2>h2>1>ȬB"DATAh2>2> 2> B8 DATA2>2>h2>hBC=DATA2>@3>2>B=DATA@3>3>2>BC=DATA3>3>@3>@BDATA3>4>3>xBz=DATA4>`4>3>ȮB"?DATA`4>4>4>B qDATA4>4>`4>8B8F̲DATA4>85>4>BfG=DATA85>5>4>B'DATA5>5>85>0B+0=DATA5>6>5>B+X6>5>Be"DATAX6>6>6>0B,6>X6>xB2-07>6>B2=DATA07>x7>6>BDATAx7>7>07>HBN*'DATA7>8>x7>BDATA8>P8>7>вB$㽄=DATAP8>8>8>(B$3DATA8>8>P8>Bl=DATA8>(9>8>гBHs=DATA(9>p9>8>B=DATAp9>9>(9>HBDATA9>:>p9>BCgDATA:>H:>9>дB~=DATAH:>:>:>B+gDATA:>:>H:>xB+hDATA:> ;>:>صB,DATA ;>h;>:>8B DATAh;>;> ;>pB &DATA;>;>h;>B?DATA;>@<>;>B DATA@<><>;>@B.i->DATA<><>@<>BK=><>B"DATA=>`=><>@Blq=DATA`=>=>=>BG}=DATA=>=>`=>иBWDATA=>8>>=>BDATA8>>>>=>`BDATA>>>>8>>BDATA>>?>>>BDATA?>X?>>> BDATAX?>?>?>XBDATA?>?>X?>B1DATA?>0@>?>BDATA0@>x@>?>8BDATAx@>@>0@>B+DATA@>A>x@>B+DATAA>PA>@>@BDATAPA>A>A>BDATAA>A>PA>ȼBDATAA>(B>A>BDATA(B>pB>A>HBDATApB>B>(B>BDATAB>C>pB>BDATAC>HC>B> B$DATAHC>C>C>xB$DATAC>C>HC>оBDATAC> D>C> BDATA D>hD>C>XBDATAhD>? D>BDATA?(?hD>BDATA(?p??D>DATAp??(?D>+DATA??p?XE>+DATA?H??E>挼DATAH???E> -DATA??H?0F>{?DATA? ??F>聻DATA ?h??F>.:/;DATAh?? ? G>聻DATA??h?hG>":/;DATA?@??G>aDATA@???H>tDATA??@?PH>aDATA? ??H>4DATA ? ?` ?hI>DATA ?8 ? ?I>E?DATA8 ? ? ?I>2T?DATA ? ?8 ?J> DATA ? ? ?PJ>_DATA ?X ? ?J>#DATAX ? ? ?J>*+DATA ? ?X ?8K> -{?DATA ?0 ? ?xK>?d=DATA0 ?x ? ?K>۹r=DATAx ? ?0 ?L>V=DATA ? ?x ?PL>ߴDATA ?P ? ?L>B d=DATAP ? ? ?M>ADATA ? ?P ?HM>RsDATA ?(? ?M> DATA(?p? ?N>DATAp??(?PN> /DATA??p?N>#aDATA?H??N> DATAH???(O>DATA??H?xO> DATA? ??O>!=DATA ?h??P> {DATAh?? ?PP>#DATA??h?P>/DATA?@??Q>/DATA@???@Q>]DATA??@?Q> DATA???Q>DATA?`??R>DATA`???PR>-DATA??`?R>[DATA?8??R>DATA8???(S>DATA??8?xS> DATA???S>CDATA?X??T>}DATAX???hT>DATA??X?T>%1?DATA?0??U>DATA0?x??XU>%DATAx??0?U>#ŶDATA??x?V>8DATA?P??XV>%DATAP???V>#IDATA??P?W>#8GDATA?(??`W>#wDATA(?p??W>DATAp??(?X>DATA??p?XX>)DATA?H??X>'&DATAH???Y>+UDATA??H?pY>!DATA? ??Y>$8DATA ?h?? Z>"DATAh?? ?xZ>-XDATA??h?Z> DATA?@??([>DATA@???x[>(DATA??@?[>ODATA???\>wDATA?`??X\>xDATA`???\>8DATA??`?\>HDATA?8??]>DATA8???X]>WUDATA??8?]>-DATA???]> +DATA?X??8^> ⅼDATAX???x^>8$DATA??X?^>8/;DATA?0??0_> 28DATAx??0?_>ـ4KyIʊ:DATA??P?a> DATA<<?b>)DATA<<<xb> DATA<`<<b>F=DATA`<<<c>F=DATA<<`<8c>DATA<8<<pc> ?DATA8<<<c>.qt=DATA<<8<d>'*f=DATA<<<hd>X0٦DATA<X<<d> f=DATAX<<<0e>*DATA<X<e>FA4=DATA<#!BPYtDATA <culDATAX<"""DATA(<Name: 'MegaBool r12 (hoehrer_mod v1)'EEDATA<Blender: 241REEDATA(<Group: 'Object'DATAHh<Tooltip: 'Perform boolean operations on meshes and get nice results.'EEDATA<"""DATA<__bpydoc__ ="""\1DATAH`<
EEDATAH< Experimental New Mesh Boolean Operations
EEDATAHP<
DATAH< (C) 2004 Theodore K Schundler (tschundler)(@)(gmail)(com)
EEDATAH@< FOR TESTING ONLY, not for redistribution
EEDATAH< Lastest version available for from:
EEDATAH0< http://astro.scu.edu/~ted/oss/blender/boolean
DATAH<
DATAH < USAGE:
DATAH< -By Menu-
DATAH< * Put this file in ~/.blender/scripts/
DATAH< * Select two objects, then choose "MegaBool" from the
DATAH= scripts menu.
DATAHx= -By Running the script-
DATAH= * Load this file into blender's internal text editor
DATAHh= * Select two objects, then press Alt+P in the test editor
DATAH=
DATAHX= OPERATIONS:
DATAH= On execution of the script, there are four operations
DATAHH= * Intersect - Intersection of the two meshes (logical AND)
DATAH= * Union - Union of the two meshes (logical OR)
DATAH8= * Difference - First selected mesh - Last selected mesh
DATAH= * Cookie Cutter - First mesh's faces are subdivided where
DATAH(= they intersect with the second mesh
DATAH= After the script executes, all "inside" vertices are selected
DATAH=
DATAH= IMPORTANT NOTES:
DATAH= Like any boolean algorithm, normals on the source meshes must
DATAH= be all facing outside. To fix normals, select a mesh, enter
DATAH= edit mode, select all verticies, and press Ctrl+N. Also, all
=DATAHp= intersections must create closed loops. (Basically the meshes
DATAH= should be closed.) If you find a set of meshes that do not work
DATAH` = send me the .blend file and an explaination of the problem.
DATAH = Subsurf should be turned off before using this script.
DATAHP = The new object created by this script will always be given
DATAH = the same name. So if you run the script twice, it will write
DATAH@ = over the last object it created. Used SHIFT+D to duplicate the
DATAH = new mesh, and use the duplicated version.
DATAH0 =
{DATAH = TO DO:
DATAH = * Set materials, UVs, etc., on new mesh
>DATAH = * Intersection of curves? (use splines for smooth shapes)
DATA=afrDATADH=-----------------------------------------------------------------DATAD= XDATAH8= Date: Updates:
DATAH= 16-Aug-2004 Initial Revision - working(?) & ready to go
DATAH(= 17-Aug-2004 Fixed some bugs based on incorrect assumptions.
DATAH= that means even more computation. Also made more
?DATAH= use of the traversalCookies to speed up a some
DATAH= sections
DATAH= 24-Aug-2004 Smart filling & other stuff...
DATAH= 26-Aug-2004 Much cleanup, nothing new / fancy
DATAH= 18-Sep-2004 Re-did filling. 2nd object can now be a set of
DATAHp= loops. Other minor refinements.
DATAH= 24-Sep-2004 Fixed a wrong assumption about vertex ordering
DATAH`= 26-Sep-2004 Got rid of special filling stuff that made face
DATAH= selection work better because with the new edit
1DATAHP= modes, it isn't necissary.
DATAH= 27-Oct-2004 Made some headway with the coplanar problem, but
DATAH@= there is still a colinear problem, and sometimes
DATAH= an issue if a point lies in another objects plane
DATAH0= 01-Nov-2004 Fixed edge crossing tests in joinconcentric
DATAH= 10-Dec-2004 Rewrite of almost everything
DATAH = 08-Apr-2005 Rewrite of alot - completely changed how inside
DATAH= vs outside determination works
DATAH= 24-Apr-2005 Rewrite filling (handles complicated cases faster)
DATAH= fixed dumb mistakes in intersecting edges, fixed
DATAH= transform of vertex normals.
DATAHx= 25-Apr-2005 Fixed compatability issues with released versions
DATAH= of Blender for Vector() constructor.
KDATAHh= 02-May-2005 Fixed some issues with certain angles is building
ZDATAH= loops. Better detection of intersecting edges.
DATAHX= Filling avoids making faces with an area of zero.
3DATAH= Debugging data doesn't display by default, so it
DATAHH= runs faster. Creates a new mesh instead of
DATAH= writting over an old one.
DATAD8= DATA="""DATA=DATA( =__author__ = "Theodore K. Schundler"_DATA0x=__version__ = "r12 hoehrermod v1 2006-06-08"DATA4=__email__ = ('Author EMail, tschundler:scu*edu')eesDATAX@ =__url__ = ('elysiun','Script Web Page, http://astro.scu.edu/~ted/oss/blender/boolean/')DATA =DATA!=import BlenderEDATA@!=from Blender import NMeshs.DATA!=from Blender import ObjectDATA!=from Blender import DrawDATA 0"=from Blender import Mathutils5DATA "=from Blender.Mathutils import *DATA "=import timeDATA#=DATAH#=# added/changed by hoehrerDATA #=import sysdDATA<#=sys.setrecursionlimit(int( 10 * sys.getrecursionlimit() ))dDATAH$=DATA$=traversalCookie=0 DATA $=messages=""DATA %=enorm=0#1txDATA H%=drawxpt=0#1DATA%=makenewobj=1EEDATA%=xpt=[]DATA &=showdbg=0{DATA @&=usepsyco=1dDATA &=fullpsyco=0DATA&=DATA&=if usepsyco:EEDATA8'= try:DATAp'= import psycoEDATA0'= print "Using Psyco for script acceleration"DATA (= except:endDATAP(= usepsyco=0REEDATA(=DATA(=DATA)=DATAD8)=###################################################################DATAD)=# Utility Functions #DATAD(*=###################################################################DATA*=def MidPoint(v1,v2):O3?DATA8*= return (v1*0.49+v2*0.51); #a little bit of jitter ...EDATAP+=DATA+=#Expand Bounding BoxREEDATA +=def ExpandBounds2D(Bounds,v):EEDATA ,= for i in range(2):DATAh,= if (Bounds[0][i]>v[i])::DATA,= Bounds[0][i]=v[i]v?DATA-= if (Bounds[1][i]b2[1][i]) or (b2[0][i]-0.001>b1[1][i]):dDATA 0= return 0DATA 1= return 1enDATAH1=DATA1=def CrossVec2D(v):DATA 1= return Vector([-v[1],v[0]])REEDATA2=DATA,P2=def TestEdgeIntersectEdge2D(pA,pB,pC,pD):DATA2= global showdbgDATA 2= vDC=pD-pCnDATA 03= vBA=pB-pADATA$p3= Base=DotVecs(vBA,CrossVec2D(vDC))DATA3= if Base==0:REEDATA 4= #ParallelDATAH4= return FalseDATA4= CvAC=CrossVec2D(pA-pC)DATA4= uA=DotVecs(vDC,CvAC)/BaseDATA 5= if uA>=0 and uA<=1:WDATAh5= uB=DotVecs(vBA,CvAC)/BaseDATA5= if uB>=0 and uB<=1:F?DATA6= return TrueDATA@6= return FalseDATA6=DATA<6=#Determine if an angle should be regarded as > 180 degreesDATA8(7=def Over180(VectorA,VectorB,EdgeVectorA,EdgeVectorB):EDATA<7= #return DotVecs(VectorA+VectorB,EdgeVectorA+EdgeVectorB)<0DATA(8= return DotVecs(VectorA,EdgeVectorB)<0:DATAX8=DATA 8=def BuildBasis(normal,edge):REEDATA8= e2=CrossVecs(normal,edge)DATA09= return [edge,e2]DATAx9=DATA9=def Make2D(basis,vector):oDATAD:= return Vector([DotVecs(basis[0],vector),DotVecs(basis[1],vector)])DATAx:=DATAL:=#Note, there should probably be three versions of the loop that calls thisDATA40;=#That way there isn't lots of unnecissary branchingDATA(;=def Make2DwIX(index,normscale,vector):DATA;= if normscale>0: DATA8<= if index==0:DATA(x<= return Vector([vector[1],vector[2]])DATA<= if index==1:DATA,== return Vector([vector[0],-vector[2]])DATA(p== return Vector([vector[0],vector[1]])DATA== else:DATA>= if index==0:DATA,@>= return Vector([vector[1],-vector[2]])DATA>= if index==1:DATA(>= return Vector([vector[0],vector[2]])DATA(8?= return Vector([vector[0],-vector[1]])DATA?=DATA?= DATA@=def ExpandBounds(Bounds,v):DATAP@= global showdbgDATA@= for i in range(3):DATA@= if (Bounds[0][i]>v[i]):viDATA(A= Bounds[0][i]=v[i]DATApA= if (Bounds[1][i]b2[1][i]) or (b2[0][i]-0.001>b1[1][i]):REEDATA D= return 0DATA 8E= return 1DATAxE=DATA\E=def FindIntersectLineLine3D(p1,p2,p3,p4,stop_at_a=0,limits=0,advanced=0,tolerance=0.0002):DATA@F= global showdbgDATA F= if limits:DATA F= #First test for shared pointsDATAG= if p1==p3 or p1==p4:DATAXG= return [p1]DATAG= if p2==p3 or p2==p4:DATAG= return [p2]DATA H=DATALXH= #Bounds test...maybe it should be tested to see if this actually helps? DATA@H= if (TestBounds(BuildBounds(p1,p2),BuildBounds(p3,p4))==0):REEDATAHI= return []DATAI=DATAHI= #based on http://astronomy.swin.edu.au/~pbourke/geometry/lineline3d/ZDATAl8J= d2121=DotVecs(p2-p1,p2-p1) #note: square of the edge's length (maybe should be precomputed for all edges?)DATAJ= d4321=DotVecs(p4-p3,p2-p1)DATAD(K= d4343=DotVecs(p4-p3,p4-p3) #note: square of edge's length againDATAK= d1343=DotVecs(p1-p3,p4-p3)DATAK= d1321=DotVecs(p1-p3,p2-p1)DATA$@L= mnad = (d2121*d4343-d4321*d4321)NDATALL= if mnad==0:#mnad>-0.00000000000001 and mnad<0.00000000000001: #parallelxt[DATAM= if showdbg:DATA$XM= print "Edges Parallel!!!",mnadDDATA M= return []DATAM= else:DATA((N= mna = (d1343*d4321-d1321*d4343)/mnadDATA8N= if (limits==0 or (mna>-0.000001 and mna <1.000001)):EDATA$N= mnb = (d1343+mna*d4321)/d4343)DATAL@O= if ((limits==0 and stop_at_a==0) or (mnb > -0.00001 and mnb <1.000001)):DATA O= if mnad<0.001 or advanced:EDATA(P= dv=p1+(p2-p1)*mna-(p3+(p4-p3)*mnb)DATAhP= dis=DotVecs(dv,dv)DATA4P= #Needs to be 0.00001 for animtest to work...DATADQ= #Maybe is I break Quads into tris, this won't be a problem?DATAQ= if dis>tolerance:DATAQ= if showdbg:DATAH R= print "Edges Parallel - late detection",dv,dis,(p3+(p4-p3)*mnb)DATAR= return []DATAR= return [mna,mnb,dis]ceDATA(S= return [mna,mnb]DATA pS= return [] DATAS=DATA(S=def FindDistPointToLine3D(p1,p2,p3):@2DATA@T= global showdbgDATA ( ? Va=p2-p1- DATA h ? Vb=p3-p1DATA ? d=DotVecs(Va,Va)*DATA ? if d!=0:>DATA$0!? p4= ((DotVecs(Vb,Va)/d)*Va)+p1ʲDATAT= else:DATA!? p4=p1DATA !? Vc=p4-p3DATA"? return DotVecs(Vc,Vc)DATAH"?DATA"?def TestVertInEdge3D(v,e):DATA"? global showdbgDATA #? vectA=e.v[1].tco-e.v[0].tcoREEDATA`#? dot = DotVecs(vectA,vectA)DATA#? vectB=v.tco-e.v[0].tcoDATA#? dv=DotVecs(vectA,vectB)FuBDATA,H$? if (dv>=-0.0000001 and dv<=dot+0.0000001):DATA$? vectA.normalize()DATA$? vectB.normalize()DATA8%? dv2=DotVecs(vectA,vectB)4DATA,%? if (dv2>0.99999999 and dv2<1.00000001):DATA %? return 1DATA (&? return 0qDATAh&?DATA,&?def TestIntersectLineLine3D(p1,p2,p3,p4):DATA'? global showdbgDATA<@'? return len(FindIntersectLineLine3D(p1,p2,p3,p4,0,1))==2.fiDATA'?DATA,'?def TestEdgeIntersectLoop3D(p0,p1,loop):DATAH(? global showdbgDATA(? lastv=loop[len(loop)-1]DATA(? for v in loop:DATA@)? if TestIntersectLineLine3D(p0.tco,p1.tco,lastv.tco,v.tco):REEDATA )? return 1DATA )? lastv=vDATA *? return 0mDATAH*?DATA0*?def TestPointSideOfLine3D(point,v0,v1,normal):DATA*? global showdbgDATA< +? #Note: Maybe I should store the edge's normal on the edge?DATAH+? #This function gets called from different loops, so it may be worth itDATA,? cp=CrossVecs(normal,v1-v0)DATAX,?DATA,? s=DotVecs(point-v0,cp)DATA ,? if s < 0:DATA -? return 0DATAX-? else:DATA -? return 1DATA-?DATA8.?#test if a point is within the edges of a convex faceEEDATA<p.?#Basically we make sure the point is on the "inside" sidextDATA .?#of all the edges of the shape.DATAT0/?#it may be worthwhile to optimize this since uit gets a called a lot when fillingDATA(/?def TestPointInConvexLoop(p,l,normal):DATA0? global showdbgDATAP0? lastv=l[len(l)-1]DATA0? for v in l:l()DATA<0? if not TestPointSideOfLine3D(p,lastv.tco,v.tco,normal):leDATA H1? return 0DATA 1? lastv=v>DATA 1? return 1DATA2? DATAT@2?def FindIntersectRayPlane(r_point,r_direction,p_point,p_normal,positive_only=0):DATA2? global showdbgDATA$3? d=DotVecs(p_normal,r_direction)\zDATA`3? if abs(d)<0.0000001:DATA 3? return 0DATA(3? n=DotVecs(p_normal,p_point-r_point)DATA@4? nd=n/dDATAx4? if nd<0 and positive_only:DATA 4? return 0DATA 5? return ndDATAH5?DATA05?def TestPointInPlane(point,normal,facevert):DATA5? global showdbgDATA 6? va=point-facevertDATA8h6? #normal's length should always be 1....why isn't it?EEDATA$6? d=DotVecs(normal,va)/normal.lengthDATAH(7? #must be <0.001 ....apparently much less than 0.001 is a problem too DATA(7? #>=0.001 needed for animtest frame 82DATA7? if d<0.001 and d > -0.001:DATAH8? if showdbg:DATA48? print "Point in Plane:",d,point,normal,facevertDATA 8? return 1BDATA 09? return 0=DATAp9? DATA9?def TestPointInFace(p,f):eDATA9? global showdbgDATA8:? vcount=len(f.v)ռDATA :? if vcount:DATA0:? return TestPointInConvexLoop(p,f.v,f.normal)DATAL ;? else: #This is an infinitely large face, so we test between the two edgesDATA;? v0=f.edges[0].v[0]ҼDATA;? v1=f.edges[1].v[0]=DATA(00 and d1>0:DATA((=? #print "PIF",d0,d1,v0.tco,v1.tco,p9DATA =? return 1DATA=? else:DATA=? #print "PNIF"REEDATA @>? return 0DATA>?_DATAD>?def TestIntersectRayFace(r_point,r_direction,face,positive_only=0):DATA0?? global showdbgDATA\p?? d=FindIntersectRayPlane(r_point,r_direction,face.e[0].v[0].tco,face.normal,positive_only)DATA @? if d==0:DATA @@? return 0DATA@? p=r_point+d*r_directioneDATA @? return TestPointInFace(p,face)DATA A?DATA(XA?def FindIntersectEdgeFace(edge,face):c:DATAA? global showdbgDATAA? r_point=edge.v[0].tcoDATA$8B? r_direction=edge.v[1].tco-r_point?DATAPB? d=FindIntersectRayPlane(r_point,r_direction,face.e[0].v[0].tco,face.normal)REEDATA C? if d==0:DATA PC? return 0DATA8C? #May need to fudge these valus for fuzzy intersectionsDATA,C? if (not edge.infinite) and (d<0 or d>1):DATA XD? return 0DATAD? p=r_point+d*r_direction]])DATA D? if TestPointInFace(p,face):REEDATA 8E? return pDATA xE? return 0=DATAE?DATA4E?def SuperMakeLoop(start,vA,offset,stop,depth=0):DATAXF? global showdbgDATAF? if depth>999:DATAF? if showdbg:DATALG? print "ML(): loop too deep (maybe not a bug if the mesh is complicated)"DATA G? return []DATAG? global traversalCookieDATA$ H? start.travCookie=traversalCookieZ?DATAxH? if start.v[0]==vA:DATAH? vB=start.v[1]DATAI? else:DATA8I? vB=start.v[0]DATAxI? eNormal=start.f[offset][1]DATAI? face=start.f[offset][2]DATAJ? side=start.f[offset][0],v)DATAhJ? if showdbg:*DATA8J? print "ML():Making loop...",vA.tco,vB.tco,start,stopEDATAK? if showdbg:DATAPK? print "ML():\t",start.fDATA K? bestE=[]DATAK? bestAngle=-99DATA L? for e in vB.e:DATA`L? if e!=start:DATAL? if e==stop:DATAL? #all done!DATA M? if showdbg:DATA `M? print "ML(): Loop Done!"DATAM? start.f[offset][3]=1DATA N? return [side,[[start,vA]]]EDATAPN? if e.v[0]==vB:TDATAN? vC=e.v[1]DATA N? else:6=DATAO? vC=e.v[0]DATAXO? if vC==vB:-DATAO? if showdbg:DATA,O? print "ML(): BUG: zero-length edge"DATA8P? dA=(vB.tco-vA.tco)DATAP? dB=(vB.tco-vC.tco)DATAP? if (dB.length<0.00001):DATA\Q? print "ML(): BUG - zero length edge, separate verts - should have caught this earlier"DATAQ? MergeVert(vB,vC)DATA4Q? #is there a way to do this w/o normalization?DATAXR? dA.normalize()DATAR? dB.normalize()bDATAR? DATA S? # added/changed by hoehrerEEDATApS? #vsum=(dA+dB)/2DATAS? vec_temp = dA+dBDATA@T? vsum = Vector(vec_temp[0]/2, vec_temp[1]/2, vec_temp[2]/2)DATApT? DATAT? ang=DotVecs(dA,dB),DATAlT? if ang>0.9999: #this is a test for parallel edges -- see stuff in FindIntersectLineLine3D to avoid sqrtDATA,U? print "ML(): BUG? Edges folded over..."DATA<U? print "ML(): \t- ",start,start.v[0].tco,start.v[1].tcoDATA0`V? print "ML(): \t- ",e,e.v[0].tco,e.v[1].tcoDATAV? ang=-9999999V=DATAW? if showdbg:DATA<HW? print "ML(): Option? ",vB.tco,"->",vC.tco,"(",ang,")"d1DATAW? o180=DotVecs(eNormal,dB)DATAX? if o180>0:DATAHX? ang=-2-angDATAhX? #Maybe add 180 to angle if new vect :dot: current vect's normal <0, then just find smallest angle?sDATA Y? if ang>bestAngle:DATA hY? for fi in range(len(e.f)):nDATAY? f=e.f[fi]DATA Y? if f[2]==face and f[3]==0:DATAHZ? if showdbg:DATAHZ? print "ML(): Have a candidate...",vB.tco,"->",vC.tco,"(",ang,")"DATA[? nsum=eNormal+f[1]DATAP[? nsl=nsum.lengthDATA[? nsum.normalize()DATA[? dp=DotVecs(nsum,vsum)DATA0\? dQ=DotVecs(nsum,dA)DATA\? dW=DotVecs(nsum,dB)DATA \? dE=DotVecs(vsum,eNormal)EDATA ]? dF=DotVecs(vsum,f[1])DATA p]? dN=DotVecs(eNormal,f[1])DATA\]? #note: the nsl>0.0001 thing is for dealing with edges where ang is 180 degrees (-1)8DATAP^? if showdbg:DATA0^? print "ML():\t",ang,nsl,dQ,dW,dp,dE,dFDATAL^? #if (ang>0 or nsl>0.0001) and (abs(dQ-dW)<0.001) and ang>bestAngle:EEDATAdx_? if ((vsum.length<0.001 and dN>0) or (dE>0 and dF>0) or (dE<0 and dF<0)) and ang>bestAngle:DATA(`? #print "ML():\t\t",ang,dp,dQ,dWDATAh`? bestE=[e,fi,f[0],vC]DATA`? bestAngle=angDATAa? if bestE and bestE[2]!=6:DATAPa? if showdbg:DATA@a? print "ML(): found next step",bestE[0],bestE[1],bestE[3].tcoDATAb? start.f[offset][3]=1DATA8Hb? r=SuperMakeLoop(bestE[0],vB,bestE[1],stop,depth+1)REEDATAb? if len(r)>1:DATAb? if r[0]!=0 and r[0]!=5:DATA,@c? if side!=0 and side!=5 and side!=r[0]:DATAc? if showdbg:DATATc? print "ML(): BUG??? State changed midloop from ",side,"to",r[0],"at",vB.tcoDATA pd? if (side==0 or side==5):DATAd? side=r[0]DATAe? #if start.broken==0:DATAHe? # start.setSides(side)DATAe? #if side!=0:DATA e? # start.f[offset][0]=side|ɽDATA (f? lp=r[1]DATAhf? lp.append([start,vA])DATAf? return [side,lp]DATAg? start.f[offset][3]=0RDATAHg? if showdbg:DATA g? print "ML(): loop failed!"DATA g? return []DATAh? DATAPh? DATADh?###################################################################DATADi?# Pretty Quad Filler v2 #DATADxi?###################################################################DATAi?DDATA (j?#ObjectsDATAhj?class LoopElement:DATA j? def __init__(self,co,link):DATAk? global showdbgPDATAHk? self.co=coDATAk? self.link=linkDATA k? self.bb=0DATAl? self.next=0DATAPl? def copy(self):DATAl? global showdbgDATA$l? ne=LoopElement(self.co,self.link)DATA8m? ne.next=self.nextDATA m? return neDATAm? def SetNext(self,next):~DATAn? global showdbgDATAXn? self.next=nextDATAn? def GetNext(self):DATAn? global showdbgDATA0o? return self.nextDATA xo? def Reverse(self,first,prev):DATAo? global showdbgDATAp? next=self.nextDATAXp? self.next=prevDATAp? if next==first: DATAp? next.next=selfDATA 0q? return DATApq? next.Reverse(first,self)DATAq? def GetCo(self):DATAr? global showdbgDATAPr? return self.co?DATAr? def GetNextCo(self):DATAr? global showdbg2DATA(s? return self.next.coDATAps? def GetVector(self):DATAs? global showdbgDATA t? return self.next.co-self.coDATAPt? def GetEdgeNormal(self):DATAt? global showdbgDATA(t? return CrossVec2D(self.GetVector())4DATA0@u? def TestEdgeIntersect(self,ptA,ptB,bb,stop):DATAu? global showdbgADATAu? if not self.bb:DATA$0v? self.bb=BuildBounds2D(self.co)?DATA0v? self.bb=ExpandBounds2D(self.bb,self.next.co)DATA v? if TestBounds2D(self.bb,bb):DATA@8w? if TestEdgeIntersectEdge2D(ptA,ptB,self.co,self.next.co):dDATAw? return TrueDATAw? if self==stop:٤DATA0x? return FalseDATA8px? return self.next.TestEdgeIntersect(ptA,ptB,bb,stop)EEDATA(x? def nFill(self,n,tolerance,stop=0):þDATA0y? global showdbgDATA xy? #print "nFill(",n,stop,")"DATAy? if stop==self:DATAz? return FalseDATAPz? if not stop:DATAz? stop=selfyDATA z? c=selfDATA{? ok=1DATA(H{? #test if we can make a convex loopm:DATA{? DATA{? for i in range(n-2):DATA |? no=c.GetEdgeNormal()DATAh|? no.normalize()DATA0|? #print "\t",c.next.co,c.next.GetVector(),noDATAD}? #this can probably be optimized to jump past the convex pointDATA(}? #maybe convex points can be cached?:DATA@}? if DotVecs(c.GetEdgeNormal(),c.next.GetVector())DATA`? DATA<? #Does it break out of the loop (if the loop size is > n)DATA? if self!=lastpt.next:DATAP? if (not Over180(c.next.GetVector(),c.GetVector()*-1.0,c.next.GetEdgeNormal(),c.GetEdgeNormal())) and DotVecs(self.co-c.next.co,c.next.GetEdgeNormal())<0.00001+tolerance:s\DATA\0? #print "Breaks out of original poly (test 1)",self.co,c.next.co,c.next.GetEdgeNormal()DATA0? return self.next.nFill(n,tolerance,stop)DATA ? DATADX? #ok, so it's convex. But does it intersect any existing edges?DATA І? c=c.nextDATA? if c!=self:DATA P? prev=cDATA ? c=c.nextDATA Ї? #print "cross?",prev.co,c.coDATA@ ? #test through all the other points in the loop to make sureEDATAP? #our face doesn't enclose them (which would mean edges intersect somewhere)EDATA? while c!=self:DATAX? #print "\tcross?",c.coDATA ? tp=selfDATA ? ok=0DATA<(? #Note: should probably use and epsilon instead of zero.DATA? for i in range(n-1): DATAH? if DotVecs(c.co-tp.co,tp.GetEdgeNormal())<0 or c.link==tp.link:ھDATA `? ok=1DATA ? breakDATA? tp=tp.nextDATA ? if not ok:DATAL`? if DotVecs(c.co-tp.co,CrossVec2D(self.co-tp.co))<0 or c.link==tp.link:DATA ? ok=1?DATA ? if not ok:=DATA$`? #print "Cross Fail at ",c.coDATA0? return self.next.nFill(n,tolerance,stop)DATA ? prev=c?DATAX? c=c.nextDATA,? #print "no cross OK ------------------"DATA?DATA40? #Test again that edge doesn't break out of loopDATA? if self!=lastpt.next:DATA? if (not Over180(-1.0*prev.GetVector(),self.GetVector(),prev.GetEdgeNormal(),self.GetEdgeNormal())) and DotVecs(lastpt.co-self.co,prev.GetEdgeNormal())<0.00001+tolerance:DATA\Ȑ? #print "Breaks out of original poly (test 2)",lastpt.co,self.co,prev.next.co,prev.coDATA0X? return self.next.nFill(n,tolerance,stop)DATA? nextnoprev=prevDATA?DATA8? DATAp? #make facetDATA ? c=selfDATA ? facet=[]DATA0? for i in range(n):ͽDATAx? #print "\t",c.coͽDATA? facet.append(c.link)-DATA ? prev=c;DATAP? c=c.nextDATA ? #do nextDATAД? self.next=prevDATA?DATADP? #When moving on to the next step, take a step back if possibleDATAȕ? if self!=lastpt.next:DATA? res=nextnoprev.Fill()EEDATA h? else: DATA? res=self.Fill()DATA ? if res:DATA0? res.append(facet) DATAx? return resDATAD? #for fault tolerance, something is returned if we got this farDATA0? return [facet]DATAx? DATA? else:DATA@? #Apparently there is nothing else in the loop, so we're doneDATA X? c=selfTDATA ? facet=[]DATAؙ? for i in range(n):PDATA ? facet.append(c.link)/DATAp? c=c.nextDATA? return [facet]DATA? DATA0? def Fill(self):;DATAx? global showdbgDATAD? #Maybe this would be better if it kept track of the loop size...DATA 8? #only or two vx? Then done.=DATA0? if self.next==self or self.next.next==self:DATA? #print self,"end"5DATA0? return []DATAp? #only three faces?DATA ? if self.next.next.next==self:DATA? #print self,"end3"DATA<P? return [[self.link,self.next.link,self.next.next.link]]eDATA? #try to fill using QuadsDATA? ret=self.nFill(4,0.01)DATA `? if ret: =DATA? #print self,"quads.."DATA? return retDATA0? #else try trisDATAx? ret=self.nFill(3,0.01)s=DATA Ƞ? if ret:DATA? #print self,"tris.."DATAP? return ret DATA? ret=self.nFill(4,0.0)DATA ء? if ret:##DATA(? #print self,"quads.. hightolerance"DATAp? return ret DATA? #else try trisDATA(? #print self,"high tolerance tris?"DATAP? return self.nFill(3,0.0)DATA? DATAأ? DATA? def display(self,stop):DATA`? global showdbgDATA? if showdbg:DATA$? print "\t",self.co,self.link.tcoDATA@? if self==stop:DATA ? returnDATAȥ? self.next.display(stop)DATA?DATAP?class BSPElement2D:DATA ? def __init__(self,pt,normal):DATA? global showdbgL?DATA0? self.pt=ptDATAp? self.normal=normalDATA? self.inside=0DATA? self.outside=0*DATA@? def TestPoint(self,pt):DATA? global showdbgDATA,ب? return DotVecs(pt-self.pt,self.normal)DATA$8? def AddEdge(self,ptA,ptB,normal):DATA? global showdbgw?=DATAة? testA=self.TestPoint(ptA)DATA(? testB=self.TestPoint(ptB)DATA4x? if testA<0 or testB<0 or (testA==0 and testB==0):DATA? if self.outside:DATA,(? self.outside.AddEdge(ptA,ptB,normal)DATA ? else: DATA,ȫ? self.outside=BSPElement2D(ptA,normal)DATA8(? if testA>0 or testB>0 or (testA==0 and testB==0):REEDATA? if self.inside:DATA(ج? self.inside.AddEdge(ptA,ptB,normal)DATA 0? else:REEDATA,p? self.inside=BSPElement2D(ptA,normal)REEDATA$Э? def TestPointRecursive(self,pt):v=DATA(? global showdbgdirDATAp? if self.TestPoint(pt)>0:DATA? if self.inside:EDATA0? return self.inside.TestPointRecursive(pt)DATA h? else:DATA? return TrueDATA? else:DATA(? if self.outside:DATA0p? return self.outside.TestPointRecursive(pt)DATA а? else:DATA? return FalseDATAX?DATA?class VertexLoop:]DATAر? def __init__(self):XDATA ? global showdbg]=DATA h? self.loopBase=self.loopLast=0DATA? self.enclosed=[]DATA? self.BSPBase=0DATAH? DATA? #Adding points to the loopDATA г? def AddPoint(self,co,link):4DATA ? global showdbg/DATAh? if self.loopLast:DATA? ne=LoopElement(co,link)DATA ? self.loopLast.SetNext(ne)DATAP? self.loopLast=neDATA(? self.bb=ExpandBounds2D(self.bb,co)DATA? else:DATA4(? self.loopBase=self.loopLast=LoopElement(co,link)DATA ? self.bb=BuildBounds2D(co)DATA? def DonePoints(self):DATA(? global showdbgDATA(p? self.loopLast.SetNext(self.loopBase)DATA$ȷ? self.loopBase=self.loopBase.nextDATA ? DATADX? #Are the verts ordered in the right direction for an outer loop?DATA и? def IsWrongDirection(self):$DATA ? global showdbg?DATAh? DATA,? #Find the leftmost point on the objectDATA? leftmost=self.loopBaseDATAP? lp=leftmost.GetNextCo()DATA ? cb=self.loopBase.GetNext()DATA? while cb!=self.loopBase:DATA @? if cb.GetNextCo()[0]0 or DotVecs(refVect,leftmostnext.GetEdgeNormal())>0:DATA? return TrueDATA ؿ? else:DATA? return FalseDATA`? else:DATAh? if DotVecs(refVect,leftmost.GetEdgeNormal())>0 and DotVecs(refVect,leftmostnext.GetEdgeNormal())>0:DATA0? return TrueDATA p? else:DATA? return FalseDATA? DATA0? DATAh? def Reverse(self):DATA? global showdbgDATA,? self.loopBase.Reverse(self.loopBase,0)ѾDATAX?DATA? DATA(? #BSPs for determining loop heirarchy;DATA ? def BuildBSP(self):pDATAh? global showdbg{W=DATA ? current=stop=self.loopBase2DATAH? self.BSPBase=BSPElement2D(current.GetCo(),current.GetEdgeNormal())KDATA$x? while (current.GetNext()!=stop):DATA ? current=current.GetNext()DATAX ? self.BSPBase.AddEdge(current.GetCo(),current.GetNextCo(),current.GetEdgeNormal())DATA$? def TestLoopInLoop(self,other):DATA? global showdbgDATA,H? if not TestBounds2D(self.bb,other.bb):DATA? return FalseDATA? if not self.BSPBase:DATA0? self.BuildBSP()DATADx? return self.BSPBase.TestPointRecursive(other.loopBase.GetCo())DATA? DATA$(? def TestEdgeIntersect(self,pA,pB):DATA? global showdbg_G=DATA? bb=BuildBounds2D(pA)DATA? bb=ExpandBounds2D(bb,pB)DATAD`? self.loopBase.GetNext().TestEdgeIntersect(pA,pB,bb,self.loopBase)DATA? DATA? def JoinLoop(self,other):DATA`? global showdbgw[=DATAD? #Reasonably big distance - bigger than anithing inside the shapeDATAD ? dist=(self.bb[1][0]-self.bb[0][0])*(self.bb[1][1]-self.bb[0][1])DATA ? pair=[]DATA? DATA,? Ostop=Ocurrent=self.loopBase.GetNext()DATA,p? prevVect=self.loopBase.GetVector()*(-1)PDATA,? prevNorm=self.loopBase.GetEdgeNormal()gDATA0? Istop=other.loopBaseDATAx? while (1):%DATA? DATA? Icurrent=IstopDATA8? while (1):~DATA x? Icurrent=Icurrent.GetNext()DATA? DATA,? vect=Icurrent.GetCo()-Ocurrent.GetCo()DATA `? evect=Ocurrent.GetVector()DATA$? enorm=Ocurrent.GetEdgeNormal()gDATA0? o180=Over180(evect,prevVect,enorm,prevNorm)DATAh?%8DATA,? #distance is less than current winner?DATA? d=DotVecs(vect,vect)DATAP? #print "Distance: ",dDATA? if d0 or DotVecs(vect,prevNorm))) or ((not o180) and (DotVecs(vect,enorm)>0 and DotVecs(vect,prevNorm))):ssDATA(H? #And not intersect with anything?DATAH? if not self.TestEdgeIntersect(Icurrent.GetCo(),Ocurrent.GetCo()):DATA(? #And not with any other loops:DATA p? ok=1DATA ? for lp in self.enclosed:DATAD? if lp.TestEdgeIntersect(Icurrent.GetCo(),Ocurrent.GetCo()):DATAx? ok=0DATA? breakDATA? if ok: DATA8? #print "Winner: ",dDATA? dist=dDATA$? pair=[Icurrent,Ocurrent]REEDATA ? DATAX? ierDATA? if Icurrent==Istop:DATA ? breakDATA? DATAP? prevVect=evect*(-1)DATA? prevNorm=enormDATA ? Ocurrent=Ocurrent.GetNext()DATA0? if Ocurrent==Ostop:DATA x? breakDATA? DATA ? #success?DATA 0? if pair:DATA4p? #keep the edges going in the right direction...DATA? Icurrent=pair[0]DATA ? Ocurrent=pair[1]DATA4h? #print "I/O",Icurrent.GetCo(),Ocurrent.GetCo()DATA? other.Reverse()DATA? #Connect the two loopsDATAh? Icopy=Icurrent.copy()DATA? Ocopy=Ocurrent.copy()#DATA? Ocurrent.SetNext(Icopy)DATAX? Icurrent.SetNext(Ocopy)DATA? return TrueDATA? if showdbg:DATA,(? print "ERROR: Could not connect loops."DATA? return FalseDATA? DATA? DATA8? #Recursive filling!DATA? def Fill(self):DATA? global showdbgDATA ? facets=[]DATA(P? #print "----Fill Loops: ",self,facetsDATAH? #If there are loops encompased by this loop, they must be done firstDATA ? if (self.enclosed):DATA@h? #If there are any loops inside this loop, fill then firstdDATA,? for eeloop in self.enclosed[0].enclosed:DATA8? #print "Fill enc"DATA$? facets.extend(eeloop.Fill())DATA? FrDATA$? #Get on with the connecting...DATA$h? self.JoinLoop(self.enclosed[0])DATAL? #print "Fill(): Connect:",self.loopBase.co,self.enclosed[0].loopBase.coDATA,@? self.enclosed.remove(self.enclosed[0])4>DATA ? facets.extend(self.Fill())DATA? return facets&DATA8? #self.Display()DATA? res=self.loopBase.Fill()DATA ? if res:DATA? facets.extend(res)DATAX? return facetsDATA?DATA@?#Figure out loop directions and such, building up loop objectsDATAH@?#Input: loops - an array of arrays of objects with a ".co" attributeMDATA?# norm - Face normalDATAL?#Ouput: array of arrays or arrays [EdgeNormal,Coordinate,LinkToOriginal]DATA?def BuildLoops(loops,norm):DATA? global showdbgDATA@? #Re-orient points so we can safely use just X&Y coordinatesm=DATAH? # (note: if Normal *dot* <0,0,1> is >>0, this isn't really necissary)DATA<? #Basis=BuildBasis(norm,loops[0][1].tco-loops[0][0].tco)DATA p? normix=0DATA? dirscale=abs(norm[0])DATA? if abs(norm[1])>dirscale:DATA H? normix=1DATA? dirscale=abs(norm[1])DATA? if abs(norm[2])>dirscale:=DATA ? normix=2DATA`? if norm[normix]>0:DATA? normscale=1.0DATA? else:DATA ? normscale=-1.0GDATAh?聻DATA? NewLoops=[]ܽDATA? for loop in loops:DATA(? EDATA`? #Build Loop ContentDATA? NL=VertexLoop()_pDATA? for pt in loop:DATA,8? #NL.AddPoint(Make2D(Basis,pt.tco),pt)DATA8? NL.AddPoint(Make2DwIX(normix,normscale,pt.tco),pt)EEDATA? NL.DonePoints()DATAH? DATA? #NL.Reverse()DATA? DATA? #Fix direction if need beDATAH? if NL.IsWrongDirection():DATA? if showdbg:DATA4? print "loop at ",NL.loopBase.co," is backwards"DATA@? NL.Reverse()DATA?DATA? NewLoops.append(NL)DATA? DATA8? return NewLoopsDATA?DATA(?#Make loops into a heirarchy of loopsDATA?def BuildHierarchy(loops):DATA`? global showdbgDATA? for loopA in loops:DATA? for loopB in loops: DATA0? if loopA!=loopB:DATA$x? if loopA.TestLoopInLoop(loopB):DATA$? loopA.enclosed.append(loopB)DATA4(? loopA.enclosed=BuildHierarchy(loopA.enclosed)DATA? loops.remove(loopB)7DATA$? return BuildHierarchy(loops)DATA8? return loops DATAx? DATA?DATA ?def BuildFacets(loops,normal):DATA8? global showdbgDATA<x? #Build up loops in the structure we need, and make sureDATA(? #they are going the right directionDATA$@? newloops=BuildLoops(loops,normal)DATA? DATA8? #if their are multiple loops, make a loop heirarchyREEDATA8? if len(newloops)>1:HBDATA$? newloops=BuildHierarchy(newloops)DATA? DATA ? facets=[]DATAP? for loop in newloops:?DATA? r=loop.Fill()DATA? if showdbg:DATA ? print rDATAX? if r:DATA? facets.extend(r)DATA? return facetsDATA? -DATA@ newFace=NMesh.Face(vxl)3DATA@@ if oldFace:<=DATA@ if oldFace.counterPart:DATA0@ newFace.smooth=oldFace.counterPart.smooth$DATA 0@ newMesh.faces.append(newFace)DATA@DATAD@###################################################################DATAD0@# Boolean Op objects #DATAD@###################################################################DATA @=DATAX@# 0 -> UnknownDATA@# 1 -> OutsideDATA@# 2 -> InsideDATA0@# 3 -> Coplanar -> normals in same directionaDATA$x@# 4 -> Coplanar -> opposing normalsDATA@# 5 -> cut faceDATA$ @# 6 -> All done processing; ignoreDATAh @ DATA @class bVert:DATA$ @ def __init__(self,coord,normal=0):DATA8 @ global showdbg憽DATA @ global traversalCookieDATA$ @ self.travCookie=traversalCookieDATA( @ coord.resize3D()DATAp @ self.tco=coordDATA @ self.sharedvert=0DATA @ if normal:XDATA@ @ self.normal=normalDATA @ else:DATA, @ self.normal=Vector([0.0,0.0,0.0,1.0])DATA @ self.e=[]DATA ` @ self.f=[]DATA @ self.newCounterpart=0DATA @ self.redirect_to=0aDATA0@ self.redirect_from=0DATAx@L?DATA$@ def findSide(self,otherObject):DATA@ global showdbg;?DATAP@ if showdbg:DATA@@ print "v.fS(): \t\t\tlame vert side look up -",self,self.tcoDATAP@ #Note: Maybe it would be faster to find the closeest face, and use its normalDATAH@ # rather than doing an intersection test (_slightly_) less mathDATA@ ray=Vector([1,0,0])DATA @@ ifaces=0DATA @ for f in otherObject.faces:DATA0@ if TestIntersectRayFace(self.tco,ray,f,1):DATA0@ ifaces+=1DATAp@ if (ifaces%2)==1:DATA @ return 2DATA@ else:DATA 0@ return 1DATAp@DATA@ def GetRedirectTo(vA):DATA@ global showdbgDATA8@ if vA.redirect_to==0:DATA@ return vADATA(@ return vA.redirect_to.GetRedirectTo()DATA@ def GetRedirectFrom(vA):DATAh@ global showdbg6DATA@ if vA.redirect_from==0:DATA@ return vADATA,@@ return vA.redirect_from.GetRedirectFrom()DATA@ DATA@ def real(self):DATA @ global showdbgDATAh@ return selfDATA@ DATA@class bEdge:XDDATA( @ def __init__(self,bv0,bv1,infinite=0):DATAx@ global showdbgDATA@ global traversalCookieDATA$@ self.travCookie=traversalCookie?DATAh@ i=0DATA@ self.children=[]DATA@ self.cutpoint=0:DATA 0@ self.f=[]DATAp@ self.v=[bv0,bv1]DATA(@ self.bb=BuildBounds(bv0.tco,bv1.tco)=DATA@ self.vect=bv1.tco-bv0.tcoDATA`@ self.len=self.vect.lengthDATA(@ self.dot=DotVecs(self.vect,self.vect)DATA@ self.infinite=0i?DATAP@ self.state=0DATA@ self.sidescomputed=0DATA@ self.broken=0DATA@ self.linkto=0DATAX@ bv0.e.append(self)DATA@ bv1.e.append(self)DATA@ if showdbg:DATA4(@ print "@@@@Adding Edge... ",self,bv0.tco,bv1.tcoDATA@%DATA@ def setSides(self,state):DATA@ global showdbgKDATAD`@ #Maybe this should make sure it only operates on original edgesDATA@ if state==0:DATA @ if showdbg:DATA8X @ print "e.sS(): BUG: Tried to set side state to 0"EEDATA @ returnDATA!@ if self.sidescomputed:DATA P!@ returnDATA!@ if showdbg:DATA!@ print "e.sS()",stateDATA"@ for f in self.f:DATA`"@ f[0]=stateDATA"@ self.sidescomputed=1DATA"@7DATA #@ def calcSides(self,force=0):DATAp#@ global showdbguDATA@#@ #Maybe this should only be called onces per SuperMakeLoop?XDATA($@ if showdbg:DATAh$@ print "e.cS()",selfDATA$@ if self.sidescomputed:sDATA %@ returnDATA@%@ if showdbg:DATA(%@ print "e.cS(): Compute Side: ",selfDATA%@ if len(self.f)==2:KDATA$ &@ if self.f[0][2]==self.f[1][2]:DATAx&@ if self.f[0][0]:DATA &@ self.f[1][0]=self.f[0][0]DATA'@ self.sidescomputed=1DATA `'@ returnDATA'@ elif self.f[1][0]:DATA '@ self.f[0][0]=self.f[1][0]DATA8(@ self.sidescomputed=1hclosest:DATA +@ closest=dȆ=DATAh+@ cf=fBDATA+@ if closest>-1.0:DATA+@ #print "e.cS(): ..."DATA@,@ if closest>0.9999:DATA,@ if showdbg:DATA,,@ print "e.cS(): COPLANAR FACES!!!!!"DATA00-@ if DotVecs(fA[2].normal,cf[2].normal)>0:DATA-@ fA[0]=cf[0]=3-0.0001 and d < 0.0001):tDATA/@ if showdbg:DATA80@ print "e.cS(): Eeh??? BUG? Coplanar, but not?"EDATAh0@ elif d>0:DATA0@ fA[0]=1DATA 0@ else:DATA(1@ fA[0]=2DATAh1@ #Can't judge other face's in/out automatically (probablems with "T" type setup, where one side has two coplanar faces)REEDATA(2@ #d=DotVecs(cf[1],fA[2].normal)DATA(p2@ #if (d>-0.0001 and d < 0.0001):DATA02@ # print "Eeh??? BUG? Coplanar, but not?"DATA(3@ #elif d>0:;DATAp3@ # cf[0]=1DATA3@ #else:DATA3@ # cf[0]=2DATA 84@ else:DATAx4@ if showdbg:DATA<4@ print "e.cS(): Need to determine side recursively..."DATA05@ if not force:DATAx5@ return 0DATA5@ if showdbg:DATA,5@ print "e.cS(): Computed Sides!",self.f DATAX6@ self.sidescomputed=1DATA6@KDATA6@ DATA$7@ def testState(self,state,face):DATAh7@ global showdbgDATA7@ for f in self.f:DATA87@ #print "\tState: ",self,f[0],self.state,f[1],faceREEDATA$`8@ if f[0]==state and f[1]==face:DATA8@ return 1DATA 8@ return 0DATA89@ DATAp9@ DATA9@class bFace:DATA09@ def __init__(self,nmFace,parent,virtual=0):DATAH:@ global showdbgDATA:@ global traversalCookieDATA$:@ self.travCookie=traversalCookieDATA8;@ DATAp;@ self.parent=parent DATA;@ self.state=0DATA ;@ self.e=[]DATA 8<@ self.v=[]DATAx<@ self.extraVerts=[]c DATA<@ self.allVerts=[]@ DATAh>@ if showdbg:DATA>@ print "\tAdding Face..."DATA>@ self.counterPart=nmFaceDATAH?@DATA?@DATA?@ if virtual:DATA?@ self.normal=0W*DATA@@@ else:DATAx@@ if parent.matrix:DATA @@ # added/changed by hoehrerDATAHA@ #self.normal=VecMultMat(Vector(list(nmFace.no)+[1]),parent.norm)DATA<A@ self.normal = Vector(list(nmFace.no)+[1]) * parent.normDATAA@ DATA0B@ self.normal.resize3D()DATA B@ else:DATA$B@ self.normal=Vector(nmFace.no)DATAC@ self.normal.normalize()DATAhC@ DATAC@ #First the vertsDATAC@ for v in nmFace.v:DATA 0D@ bv=parent.verts[v.index]DATA,D@ bv.f.append(self) #maybe not needed...?DATAD@ self.v.append(bv)4DATA (E@ self.allVerts.append(bv)DATAxE@ self.center+=bv.tcoDATAE@R(DATA E@ # added/changed by hoehrerDATA HF@ #self.center/=len(self.v)|=DATAhF@ #self.center = [self.center[0]/len(self.v), self.center[1]/len(self.v), self.center[2]/len(self.v)]DATAl0G@ self.center = Vector(self.center[0]/len(self.v), self.center[1]/len(self.v), self.center[2]/len(self.v))DATAG@DATA4H@ self.bb=BuildBounds(self.v[0].tco,self.v[1].tco)DATA0pH@ self.bb=ExpandBounds(self.bb,self.v[2].tco)DATAH@ DATA8I@ self.e.append(MakeEdge(self.v[0],self.v[1],self))REEDATA8pI@ self.e.append(MakeEdge(self.v[1],self.v[2],self))REEDATAI@ DATAJ@ if len(self.v)==3:DATA8XJ@ self.e.append(MakeEdge(self.v[2],self.v[0],self))EEDATA J@ else:!DATA0K@ self.bb=ExpandBounds(self.bb,self.v[3].tco)DATA8`K@ self.e.append(MakeEdge(self.v[2],self.v[3],self))EEDATA8K@ self.e.append(MakeEdge(self.v[3],self.v[0],self))EEDATA0L@ DATAhL@DATAL@ def buildEdges(self):DATAL@ global showdbgDATA@0M@ #print "f.bE():\tBuilding new edges for ",self,self.alteredDATAM@ if self.altered:=DATAM@ c=len(self.allVerts)DATA0N@ if showdbg:DATA@pN@ print "f.bE():\tBuilding new edges for ",self," Verts:",cDATAN@ for A in range(c):DATA(O@ for B in range(A+1,c):DATAxO@ vA=self.allVerts[A] --0.9999 and d<0.9999):?DATA S@ mo=0DATA`S@ go=1DATA S@ if go:DATAS@ if showdbg:DATA8(T@ print "f.bE():\t\tNew Edge: ",A,vA.tco,B,vB.tcoEDATA$T@ ne=MakeEdge(vA,vB,self,1,mo)DATAT@ #if ne:DATA(U@ # ne.calcSides()DATApU@ DATAU@ DATAU@ QDATAXV@ def constructFace(self,otherObject,destMesh,inside,outside,cosame,coopposing,flip=1):DATAV@ global showdbg&DATA8V@ #Should detect unaltered/simple quad/tri faces fasterDATAPW@ global enormDATAW@ if showdbg:~DATA,W@ print "f.cf():\tConstructing face ",selfDATA0X@ if self.built:DATA xX@ return DATAX@ #for v in self.allVerts:DATA Y@ # print "f.cf():\t\t",v.tco(DATAXY@ loops=[[],[],[],[],[]]?DATAY@ for e in self.allEdges:DATAY@ e.calcSides()DATA@Z@ for e in self.allEdges:DATA Z@ sides=[]DATAZ@ for f in e.f:DATA[@ if f[2]==self:DATA `[@ sides.append([f[0],f[1]])DATA[@ if showdbg:DATA<[@ print "f.cf():\t\tE: ",e,e.v[0].tco,e.v[1].tco,sideseDATA`\@ for e in self.allEdges:DATA\@ if showdbg:DATA8\@ print "f.cf():\t\tEdge: ",e,e.v[0].tco,e.v[1].tcoEEDATAdX]@ if (abs(e.v[0].tco[0]-0.75)<0.1 and abs(e.v[1].tco[0]-1.0)<0.1 and abs(e.v[0].tco[1]+1.00)<0.1):DATA]@ if showdbg:DATA<0^@ print "#############################################"DATA^@ if showdbg:DATA^@ print e.fDATAd _@ if (abs(e.v[1].tco[0]-0.75)<0.1 and abs(e.v[0].tco[0]-1.0)<0.1 and abs(e.v[0].tco[1]+1.00)<0.1):DATA_@ if showdbg:DATA<_@ print "#############################################"DATAh`@ if showdbg:DATA`@ print e.fDATA`@ #e.calcSides()DATA0a@ if enorm==1:DATA$pa@ AddFace(self,destMesh,e.v,0)PXDATAa@ DATAb@ for f in e.f:DATA Hb@ #if 0:DATAb@ #draw edge normalDATA(b@ pA=MidPoint(e.v[0].tco,e.v[1].tco)DATA(c@ pB=pA+f[1]*0.05DATApc@ if enorm==1:DATA4c@ AddFace(self,destMesh,[NewVx(pA),NewVx(pB)],0)DATA4 d@ if len(e.children)>0 or e.linkto or e .broken:DATA\d@ AddFace(self,destMesh,[NewVx(e.v[0].tco+f[1]*0.02),NewVx(e.v[1].tco+f[1]*0.02)],0)DATAe@cDATA8Pe@ if f[2]==self and f[3]==0 and (f[0]>0 or f[0]<5):EEDATALe@ #NOTE: Maybe by using the edge normal to determine to use v[0] or v[1]DATA,8f@ #could be used to automatic normalsDATA0f@ l = SuperMakeLoop(e,e.v[0],e.f.index(f),e)DATAf@ if len(l):DATA8g@ if l[0]>4:DATAg@ l[0]=4DATAg@ if showdbg:DATA4h@ print "f.cf(",self,"):loop of type ",l[0]DATAph@ if l[0]==0:DATA$h@ #Manually figure out side...DATA,i@ l[0]=e.v[0].findSide(otherObject)DATApi@ if showdbg:DATA8i@ print "f.cf(",self,"): Lame Lookup side: ",l[0]DATAd j@ #There should problably be a better way of negotiating the side while traversing the edges...DATAj@ for le in l[1]:DATAk@ if le[0].broken==0:DATA Pk@ le[0].setSides(l[0])9*DATA k@ loops[l[0]].append(l[1])DATAk@ for q in l[1]:DATAm@ if ff[2]==self: DATA4 n@ pA=MidPoint(q[0].v[0].tco,q[0].v[1].tco)DATAn@ pB=pA+ff[1]*0.05DATA<n@ AddFace(self,destMesh,[NewVx(pA),NewVx(pB)],0)DATA Ho@ else:DATAo@ if showdbg:2:DATA(X@ self.faces.append(bFace(f,self))8DATA @ else:}DATAp@ DATA@ for e in v0.e:DATA @ if e.v[0]==v1 or e.v[1]==v1:DATA8@ for f in e.f: DATA 0@ e.f.append([0,ENorm,face,0])DATA @ if inout:DATA(@ e.f.append([0,ENorm*(-1),face,0])DATA @ face.parent.edges.append(e)DATAh@ face.allEdges.append(e)DATA @ return eDATA @ return []DATA8@ DATAp@DATAD@###################################################################DATAD @# Merging Tools to keep things clean #DATAD@###################################################################DATA@0DATAH@def MergeVert(vA,vB): =DATA@ global showdbgDATA Н@ if vA==vB:DATA @ return vADATAP@ v=vA.tco-vB.tcoԑDATAP@ #print "###################################################################"qDATA4@ #print "MERGEVERTICIES: ",v.lenth,vA.tco,vB.tcoDATA@ for f in vB.f:DATA@ if not vA in f.allVerts:DATA@ f.allVerts.remove(vB)oDATA`@ f.allVerts.append(vA)/>DATA@ vA.f.append(f)DATA@ if vB in f.v:DATA8@ f.v[f.v.index(vB)]=vA5&DATA@ if vB in f.parent.verts:>DATA0ء@ f.parent.verts[f.parent.verts.index(vB)]=vADATA8@ for e in vB.e:DATAx@ if vB in e.v:DATA@ e.v[e.v.index(vB)]=vADATA@ vA.e.append(e)?DATAP@ for f in vA.f:DATA@ f.altered=1?DATAУ@ #test for merging edges~DATA @ for eA in vA.e:q0?DATAh@ for eB in vA.e:DATA@ if eA!=eB:DATA@ if eA.v[0]==vA:DATA8@ rA=eA.v[1]DATA x@ else:DATA@ rA=eA.v[0]DATA@ if eB.v[0]==vA:DATA@@ rB=eB.v[1]DATA @ else:/=DATA@ rB=eB.v[0]DATA@ if rA==rB:?DATA@@ MergeEdge(eA,eB)DATA@ dv=rA.tco-rB.tco%MDATAЧ@ if dv.length<0.0001:DATA @ MergeVert(rA,rB)DATA\h@ #if (eA.v[0]==eB.v[0] and eA.v[1]==eB.v[1]) or (eA.v[0]==eB.v[1] and eA.v[1]==eB.v[0]):DATA$@ # #print "EDGE OVERLAP",eA,eBDATA P@ return vADATA@DATAȩ@F~=DATA@def MergeEdge(eA,eB):DATAH@ global showdbgDATA @ if eA==eB:DATA Ȫ@ return eADATA@ for v in eB.v:DATAH@ v.e.remove(eB)DATA@ for f in eB.f:DATA Ы@ while eB in f[2].allEdges:DATA @ f[2].allEdges.remove(eB)DATA p@ if not eA in f[2].allEdges:DATA@ f[2].allEdges.append(eA)DATA@ if eB in f[2].e:DATA X@ f[2].e[f[2].e.index(eB)]=eADATA$@ while eB in f[2].parent.edges:DATA8@ f[2].parent.edges[f[2].parent.edges.index(eB)]=eAsDATA h@ eA.f.append([0,f[1],f[2],0])DATA$@ #eA.broken=1 #mark edge as alteredDATA@ eB.broken=1 >DATAP@ eB.linkto=eADATAL@ eB.f=[] # this shouldn't be necissary, but is for one of the test caseswDATA@@ # it is probably indicative of a bug somewhere else ?DATA @ return eA?DATA@ ?DATA@DATAD0@###################################################################DATAD@# Functions for Applying Intersection #DATAD @###################################################################DATA@E?DATAв@def xptdraw(nm):91DATA@ global showdbgDATAX@ global xpt,drawxptDATA@ if drawxpt:?DATA@ for pt in xpt:?DATA(@ if pt[0]==0:DATA h@ p=pt[1]DATAX@ AddFace(0,nm,[NewVx(p+Vector([0.0,0.01,0.0])),NewVx(p-Vector([0.0,0.01,0.0]))],0) DATAX0@ AddFace(0,nm,[NewVx(p+Vector([0.01,0.0,0.0])),NewVx(p-Vector([0.01,0.0,0.0]))],0)>DATAdP@ # Problems only arise when edges overlap, which happens with vx in edge / vx in vx situationsDATA@ if e.linkto:4?DATA@(@ print "CutEdge(): BUGBUGBUG!!!! Tried to cut inactive edge"DATA @ return CutEdge(e.linkto,co)=DATA@ cv=co-e.v[0].tcoDATA<0@ #note: must scale by length so fuzzy matching is kept saneDATAH@ #note: maybe scaled point could be passed along, so there is no need=DATA0@ # to do the dot product over & over againDATAx@ cutat=cv.lengthB>DATA,@ if (cutat<-0.0001 or cutat>e.len+0.0001):DATA<(@ print "CutEdge(): BUG! Tried to cut edge out of bounds"þDATA@ DATA@ if e.children:DATA@ cd=cutat-e.cutPoint=DATA X@ if cd<0.0001 and cd>-0.0001:DATA@ #same pointDATA @ return e.children[0].v[1]=DATA8@ elif cd>0:>DATA$x@ return CutEdge(e.children[1],co)DATA@ else:DATA$@ return CutEdge(e.children[0],co)DATA`@ yDATA8@ #test for cut point being at one of the two endpoints DATA@ if cutat<0.0001:DATAH@ return e.v[0]DATA@ elif cutat>(e.len-0.0001):DATA@ return e.v[1]DATA@ UDATA P@ e.broken=1DATA(@ #Edge actually needs to be partitionedDATA@ if showdbg:DATAL(@ print "CutEdge(): Partitioning Edge",e,"at",co,"(",cutat,"/",e.len,")"lfDATA@ nv=NewVx(co) >DATA@ e.v[0].e.remove(e)DATA0@ e.v[1].e.remove(e)DATAx@ e.cutPoint=cutatuDATA@ A=bEdge(e.v[0],nv)DATA@ B=bEdge(nv,e.v[1])DATAP@ e.children.append(A)DATA@#sfxf=0DATA@sexf=0DATA8@svxf=0=DATAp@sexe=0?DATA@svxe=0DATA@svxv=0>DATA@9RDATAP@fexf=0DATA@ffxf=0DATA@fexe=0:DATA@{DATA$0@def IntersectVertexVertex(vA,vB):DATA@ global showdbgDATA@ global vxv,svxvR(DATA@ vxv+=1DATAH@ #d0=vA.tco[0]-vB.tco[0]eDATA@ #d1=vA.tco[1]-vB.tco[1]DATA@ #d2=vA.tco[2]-vB.tco[2]R(DATA8@ #d=d0*d0+d1*d1+d2*d2DATA@ d=vA.tco-vB.tco_7DATA@ if d.length<0.0001:DATA(@ #Verticies are effectively the same1DATAh@ if showdbg:DATA4@ print "-VxV() Vertex overlap at ",vA.tco,vA,vBDATA @ svxv+=1leDATAP@ LinkVx(vA,vB)DATA@ for f in vA.f:me.DATA@ f.altered=1nDATA @ return 1sDATA X@ return 0.bDATA@rseDATA @def IntersectVertexEdge(v,e):(VDATA @ global showdbgDATA`@ global vxe,svxe#DiDATA@ vxe+=1DATA@ i=0txtDATA,@ #print "VxE",v.tco,e.v[0].tco,e.v[1].tco-gDATA@x@ #Actually, maybe this loop should be _after_ TestVertInEdge3D=DATA@ for v2 in e.v:DATA$(@ i+=IntersectVertexVertex(v,v2)DATA(@ if (i==0) and (TestVertInEdge3D(v,e)):DATA@ if showdbg:ɳDATA,@ print "-VxE() Vertex in edge at ",v.tcoDATA x@ svxe+=1VDATA@ nv=CutEdge(e,v.tco)DATA@ LinkVx(nv,v)=DATA@@ i=1DATA x@ return iDATA@ DATA @def IntersectEdgeEdge(eA,eB):DATA@@ global showdbgDATA@ global exe,fexe,sexe,xpt-DATA@ exe+=1DATA@ if showdbg:=DATAPH@ print "ExE() ",eA.v[0].tco,"-",eA.v[1].tco," vs ",eB.v[0].tco,"-",eB.v[1].tcoDATA @ if TestBounds(eA.bb,eB.bb):DATA @ fexe+=1DATAX@ i=0DATA@ A=eA.v[1].tco-eA.v[0].tcoDATA@ B=eB.v[1].tco-eB.v[0].tcoDATAD0@ #used to be ,0,0 at end - edit if intersecting edges don't workDATA(@ #Note: Tolerance should be smallerDATA\@ r=FindIntersectLineLine3D(eA.v[0].tco,eA.v[1].tco,eB.v[0].tco,eB.v[1].tco,1,1,1,0.000001)DATA@ if len(r)==1:DATA@ if showdbg:DATA,@ print "ExE(): Edges already intersect"DATA p@ return 1DATA@ elif len(r)>2:u)DATA@ p=eA.v[0].tco+r[0]*ADATA@@ #test for vertex in edgeDATA@ for v in eA.v:DATA$@ i+=IntersectVertexEdge(v,eB)DATA0@ for v in eB.v:TDATA$x@ i+=IntersectVertexEdge(v,eA)DATA@ if (i==0):DATA@ if showdbg:DATA0P@ print "-ExE(): Edge intersects edge at ",pDATA$@ print "\tQualification: ",r>DATAH@ print "\nEdges: ",eA.v[0].tco,eA.v[1].tco,eB.v[0].tco,eB.v[1].tcoDATA@ xpt.append([1,p])DATA @ sexe+=1DATA@ nvA=CutEdge(eA,p)DATAP@ nvB=CutEdge(eB,p)ټDATA@ LinkVx(nvA,nvB)DATA@ i=1DATA@ else:DATAP@ A.normalize()ԑDATA@ B.normalize() DATA@ dv=DotVecs(A,B)DATA,(@ if (dv>0.999 or dv <-0.999): #parallel?DATA@ if showdbg:DATA(@ print "ExE(): Edges parallel",A,B>DATA @ for v in eA.v:DATA$h@ i+=IntersectVertexEdge(v,eB)DATA@ for v in eB.v:DATA$@ i+=IntersectVertexEdge(v,eA)DATA `@ return iDATA @ return 0DATA@DATA @def IntersectVertexFace(v,f):DATAh@ global showdbgDATA0@ #Note vertex may have already been added toDATA0@ #the face due to an intersection with an edgeDATAh@ global vxf,svxf,xpt4DATA@ vxf+=1DATA0@ #print "VxF",v.tco,TestPointInFace(v.tco,f)=DATAPH@ if TestPointInFace(v.tco,f) and TestPointInPlane(v.tco,f.normal,f.v[0].tco):DATA@ i=0DATA@ for v2 in f.allVerts:DATA$H@ i+=IntersectVertexVertex(v,v2)ADATA@ if (i==0):DATA@ #Add point to face=DATA(@ if showdbg:DATA0h@ print "-VxF(): Point in face at ",v.tco,f,DATA @ svxf+=1DATA@ VxInFace(f,v)abDATAP@ xpt.append([1,v.tco])7DATA @ return 1DATA @ return 0DATA @DATAX@def IntersectEdgeFace(e,f):DATA@ global showdbgDATA@ global exf,fexf,sexf,xpt^?DATA8@ exf+=1DATAp@ if TestBounds(e.bb,f.bb):DATA @ fexf+=18?DATA@ #Intersect?>DATA@@ r_pt=e.v[0].tcobDATA @ r_dir=e.v[1].tco-e.v[0].tcoG>DATA@@ d=FindIntersectRayPlane(r_pt,r_dir,f.e[0].v[0].tco,f.normal)DATA,H@ if d!=0 and d>-0.000001 and d<1.000001:DATA@ p=r_pt+d*r_dirDATA@ #print "FxE",pDATA8@ i=0=DATAp@ for eB in f.e:SDATA @ i+=IntersectEdgeEdge(e,eB)=DATA@ if showdbg:=DATAH@ print "FxEi",i>DATAH@ #iff vert doesn't lie in the object's face, we need to cut the edge=DATA(@ if (i==0 and TestPointInFace(p,f)):DATA`@ for v in e.v:DATA$@ i+=IntersectVertexFace(v,f)DATA@ if showdbg:DATA@@ print "FxEni",i=DATA@ if (i==0):DATA@ #cut edge=DATAX@ #note: at this point we know inside vs outside iff there isn's something screwyڰDATA$@ # further down the edgeXDATA@ if showdbg:Sz?DATA,0@ print "-ExF(): Face cuts Edge at ",pDATA@ sexf+=1rDATA@ nv = CutEdge(e,p)DATAA VxInFace(f,nv)DATA`A xpt.append([0,nv.tco])DATA A i=1DATA A return iDATA0A .DATAhA else:DATAA #Parallel?DATAA i=0DATA0A dv=DotVecs(e.v[0].tco-e.v[1].tco,f.normal)DATA$xA if (dv<0.00001 and dv>-0.00001):DATA$A #print "Edge Parllel to face"DATA(A for eB in f.e:DATA pA i+=IntersectEdgeEdge(e,eB)DATAA for v in e.v:DATA$A i+=IntersectVertexFace(v,f)DATA `A return iDATA A return 0DATAADATA Adef FullIntersect(meshA,meshB):DATAhA global showdbgDATALA #is this FacexFace method faster, or all edges vs all edges in two passes?DATA$(A global traversalCookie,fxf,ffxfDATAA traversalCookie+=1DATAA travBase = traversalCookieDATAADATAPA if showdbg:DATAA print meshA,meshBDATAA XDATAA #Iterate Face vs FaceDATAXA for fA in meshA.faces:DATAA traversalCookie+=1DATAA fATrav = traversalCookie>DATA8 A for fB in meshB.faces:KDATA A traversalCookie+=1 can eliminate wth travcookie, test ExF, E.vxF, ExE, ExV, VxVDATA A if showdbg:DATA A print "eA vs fB"DATA` A for eA in fA.e:DATA A for eB in fB.e:.?DATA A if showdbg:SDATAX8 A print "EXE -- ",eA.v[0].tco,"-",eA.v[1].tco," vs ",eB.v[0].tco,"-",eB.v[1].tco?DATA A for eA in fA.e:DATATA if 1 or eA.travCookie must test all, only ExF?DATAA if showdbg:DATAA print "eB vs fA"DATA(A for eB in fB.e:DATA$pA if 1 or eB.travCookieDATA((A #IntersectMeshes(bCutter,bCookie,0)oDATA A FullIntersect(bCookie,bCutter)DATAA DATAA if makenewobj:DATAHA nm=NMesh.New(newobjname)DATAA else::DATAA nm=NMesh.New()cfDATAA DATA PA if x==1:DATA0A bCookie.constructFaces(nm,bCutter,1,1,1,1)Y=DATA A elif x==2:DATA00A bCookie.constructFaces(nm,bCutter,1,0,1,0)kDATA A elif x==3:DATA0A bCookie.constructFaces(nm,bCutter,0,1,0,1)DATA`B2mDATAB xptdraw(nm)X=DATAؠB nm.mode=bCookie.nmesh.modeDATA(B if makenewobj:DATA0hB newobj=Blender.Object.New('Mesh',newobjname)DATAȡB newobj.link(nm)DATA$B scene=Blender.Scene.GetCurrent()DATAhB scene.link(newobj)=DATAB cookie.select(0)DATAB cutter.select(0)DATA@B newobj.select(1)DATAB else:DATA B NMesh.PutRaw(nm,newobjname)DATAB returnDATAHBDATA8Bdef Difference(cookie,cutter,newobjname="BoolResult"):DATAB global showdbgDATA(B global makenewobjDATA,pB MatA=Matrix(*map(list,cookie.getMatrix()))DATA,ХB MatB=Matrix(*map(list,cutter.getMatrix()))DATA0B #MatB.invert()DATApB #MatA=MatA*MatBDATAB #MatB.identity()DATABZDATA8B bCookie=bMesh(cookie,MatA)DATAB bCutter=bMesh(cutter,MatB)DATAاBɽDATA(B #IntersectMeshes(bCookie,bCutter,1) ?DATA(hB #IntersectMeshes(bCutter,bCookie,0))#DATA B FullIntersect(bCookie,bCutter)DATAB bDATAHB if makenewobj:DATAB nm=NMesh.New(newobjname)DATAةB else:5DATAB nm=NMesh.New()DATA0XB bCutter.constructFaces(nm,bCookie,1,0,0,1,-1)>DATA0B bCookie.constructFaces(nm,bCutter,0,1,0,0,1)DATABD?DATAPB xptdraw(nm)DATAB nm.mode=bCookie.nmesh.modeDATAB if makenewobj:DATA0 B newobj=Blender.Object.New('Mesh',newobjname)=DATAB newobj.link(nm)DATA$ȬB scene=Blender.Scene.GetCurrent()DATA B scene.link(newobj)"?DATAhB cookie.select(0)DATAB cutter.select(0)DATAB newobj.select(1)DATA@B else:DATA xB NMesh.PutRaw(nm,newobjname)DATAȮB returnDATAB-DATA<8Bdef Intersection(cookie,cutter,newobjname="BoolResult"):-DATAB global showdbgDATAB global makenewobjDATA,0B MatA=Matrix(*map(list,cookie.getMatrix()))DATA,B MatB=Matrix(*map(list,cutter.getMatrix()))DATAB #MatB.invert()DATA0B #MatA=MatA*MatBoDATAxB #MatB.identity()DATABDATAB bCookie=bMesh(cookie,MatA)DATAHB bCutter=bMesh(cutter,MatB)DATABs.>DATA(вB #IntersectMeshes(bCookie,bCutter,1)μDATA((B #IntersectMeshes(bCutter,bCookie,0)=DATA B FullIntersect(bCookie,bCutter)DATAгB ͽDATAB if makenewobj:DATAHB nm=NMesh.New(newobjname)DATAB else:>DATAдB nm=NMesh.New()a|DATA,B bCutter.constructFaces(nm,bCookie,1,0,1,0)DATA,xB bCookie.constructFaces(nm,bCutter,1,0,0,0)DATA0صB #bCookie.constructFaces(nm,bCutter,0,1,0,0)DATA8BwjDATApB xptdraw(nm){=DATAB nm.mode=bCookie.nmesh.modeDATAB if makenewobj:DATA0@B newobj=Blender.Object.New('Mesh',newobjname) nm=NMesh.New()DATA,D> bCutter.constructFaces(nm,bCookie,0,1,1,0)DATA,XE> bCookie.constructFaces(nm,bCutter,0,1,0,0)DATAE>DATAE> xptdraw(nm)DATA0F> nm.mode=bCookie.nmesh.modeDATAF> if makenewobj:DATA0F> newobj=Blender.Object.New('Mesh',newobjname) newobj.link(nm)!DATA$hG> scene=Blender.Scene.GetCurrent()>DATAG> scene.link(newobj)DATAH> cookie.select(0)>DATAPH> cutter.select(0)>DATAH> newobj.select(1)DATAH> else:DATA I> NMesh.PutRaw(nm,newobjname) 0DATAI> returnDATAI>aDATAJ>def DoBool():F=DATAPJ> global showdbgDATA$J> #Check the sanity of the selectionDATA J> objsel=Object.GetSelected()*DATA 8K> meshes=0DATAxK> for ob in objsel:DATA K> if ob.getType() == 'Mesh':DATAL> meshes += 1DATAPL> if meshes!=2 :DATADL> Draw.PupMenu("ERROR: Exactly two mesh objects must be selected")DATA M> returnDATATHM> x=Draw.PupMenu("MegaBool%t|1: Intersect|2: Union|3: Difference|4: Cookie Cutter")DATA M> #print xDATAN> ts=time.time()DATA PN> if x==1:DATA$N> Intersection(objsel[1],objsel[0])DATA N> elif x==2:DATA (O> Union(objsel[1],objsel[0])DATA xO> elif x==3:DATA$O> Difference(objsel[1],objsel[0])DATA P> elif x==4:DATA$PP> CookieCutter(objsel[1],objsel[0])DATA0P> print "Script Execution Time: ",time.time()-tsDATAQ>DATA@Q>#Try speed boost w/ psychoDATAQ>if usepsyco:DATAQ> if fullpsyco:DATAR> psyco.full()DATAPR> else:DATAR> psyco.bind(TestBounds)DATAR> psyco.bind(ExpandBounds)DATA(S> psyco.bind(BuildBounds)DATAxS> psyco.bind(TestBounds2D)DATA S> psyco.bind(ExpandBounds2D)DATAT> psyco.bind(BuildBounds2D)DATAhT> psyco.bind(CrossVec2D)DATA(T> psyco.bind(TestEdgeIntersectEdge2D)DATAU> psyco.bind(Over180)DATA(XU> psyco.bind(FindIntersectLineLine3D)DATA$U> psyco.bind(FindDistPointToLine3D)DATA V> psyco.bind(TestVertInEdge3D)DATA(XV> psyco.bind(TestEdgeIntersectLoop3D)DATA$V> psyco.bind(TestPointSideOfLine3D)DATA$W> psyco.bind(TestPointInConvexLoop)DATA$`W> psyco.bind(FindIntersectRayPlane)DATAW> psyco.bind(SuperMakeLoop)DATA X> psyco.bind(LoopElement.nFill)DATA,XX> psyco.bind(VertexLoop.IsWrongDirection)DATA(X> psyco.bind(VertexLoop.TestLoopInLoop)DATA,Y> psyco.bind(LoopElement.TestEdgeIntersect)DATA$pY> psyco.bind(VertexLoop.JoinLoop)DATA(Y> psyco.bind(BSPElement2D.TestPoint)DATA$ Z> psyco.bind(BSPElement2D.AddEdge)DATA0xZ> psyco.bind(BSPElement2D.TestPointRecursive)DATAZ> psyco.bind(BuildLoops)DATA([> psyco.bind(BuildBasis) DATAx[> psyco.bind(Make2D)5DATA[> psyco.bind(Make2DwIX)DATA\> print "\tPsyco init OK."DATAX\>DATA\>DATA \>DoBool()DATA]>#oA=Object.Get("Cookie")4DATAX]>#oB=Object.Get("Cutter")ߤDATA]>#oB=Object.GetSelected()[0]DATA ]>#print oAͽDATA 8^>#print oBDATA<x^>#Intersection(Object.Get("Cookie"),Object.Get("Cutter"))EսDATA^>#Difference(oA,oB)DATA0_>#Union(oA,oB)DATA<p_>#CookieCutter(Object.Get("Cookie"),Object.Get("Cutter"))EսDATA_>#CookieCutter(oB,oA),ܽDATAL``>print "Done. Tests:\n\tFxF",fxf,"\t",ffxf,"\n\tExF",exf,"\t",fexf,"\t",sexfDATA|`>print "\tVxF",vxf,"\t--\t",svxf,"\n\tExE",exe,"\t",fexe,"\t",sexe,"\n\tVxE",vxe,"\t--\t",svxe,"\n\tVxV",vxv,"\t--\t",svxvDATAa> DATAa>if len(messages)>0 and 0:0DATA,b> txt=Blender.Text.New("Boolean Messages")ͽDATAxb> txt.clear()A4=DATAb> txt.write(messages)F=DATAc>ͽDATA8c>Q:DATApc>#Note to self:DATA0c># Re-orient the messhes when doing a 2D cut so=DATA(d>#two-axis bounding box test can be doneDATA\hd>#difference op should maybe just flip the normals of the B object and do an intersection~DATAd>#ܽDATA,0e>#For f-gons, don't cut with internal edgesDATAHe>#when making face do whole f-gon at once (so outer edge & inner loops)=TXhP2lx;TXText.001NUNUNUNUjtDATANU(NUMUDATA(NUJeffery L. McGregorOBP8j>hpn>OBBodyircle.013;xj4Rm>m>m>dk/BFѼ???????i!3?i!\'??i!i!3dk/BFѼ??????B? B ?/?V?zT =u?37C@NA?DOBdLB? #=?>=???@???=0elDATAm>DATADm>JSubsurfOBPpn>h8r>8j>OBCockpitircle.010;P\q>:t]P=???????i!3?i!\'??i!i!3:t]P=??????B? B ?9ol0l?V?## =u?;1?::@nA?DOBdLB? #=?>=???@??? p>(d(DATAq>OBP8r>h`v>pn>OBExhaustircle.008;Pl Zu>u>u>X}?w<A% @A% @A% @P?s0??A% @A%b+ñ @ X}?w<??????gC@Y%^T?>_ѯZr$2_/?߳^3ٳ0?E="D><˼>vq>5<<.@u?_??DOBdLB? #=?>=???@???%g=jVDATAu>DATA<u>P EdgeSplitNBOBP`v>h{>8r>OBGunsircle.007(;.f-I z>z>y>dk!FѼ???????i!3?i!\'??i!i!3dk!FѼ??????B? B ? `//?V?zT =u?h$ͽ7C@NA?DOBdLB? #=?>=???@??? =p5SsjDATAy>DATA@ z>Oz>Mirror!o:DATA<z>P z> EdgeSplitBOBP{>h0>`v>OBIntakesircle.003;>~>~>~>󪿨@ȕ???????i!3?i!\'??i!i!3󪿨@ȕ??????@Z0?@M.$@&?l AD2<?V?}U =u?;8B@>-A?DOBdLB? #=?>=???@???̩=S8jDATA~>DATAD~>JSubsurfOBP0>hp>{>OBLPropropsircle0;j(d>>>? M???m6B???i!3?(p?Qgg,2(p? M??????v" &fH3? \(YZ3?@GR$"4<2?V?%= <2O?̌N?/?@,?DOBdLB? #=?>=???@???۟b=`e@4SDATA>DATAD>JSubsurfOBPp>h>0>OBRPropircle.005x;|UE8>8>>0Ѭ M???m6B???i!3?(p?Qgg,2(p0Ѭ M??????j!3+p3fH3?\+Z?G333?V?= <3O@̌N?/?h~A=???@???7c=klDATA>DATAD8>JSubsurfOBP>hh>p>OBRuddersircle.002;(j8>0>@;b@Lt>??????i!3?i!3?@;b@Lt>??????4??G-`Wt?V?m Mv?@̌u>m3 -@?DOBdLB? #=?>=???@???C>jdVDATA0>OBPh>h >>OBTailircle.001p;UC> ];b@_!>????3???i!3?Q3??g!Q4 ];b@_!>??????';L.ޡ3?i!'& &?02f?V?:M =u?mI7@ 2A?DOBdLB? #=?>=???@???x1>blxlDATA>OBP >hP>h>OBTurboircle.004;SpFؒ>ؒ>>Ƅ6?%>???y????11J=?J=Ƅ6?%>??????/1 (?WKc?C*d2?N =i)=Fn~V,u?;H|=u?H>=u-Az1@`??DOBdLB? #=?>=???@???LJ=`khDATA>DATADؒ>JSubsurfOBPP>h >OBTurboFanircle.006;`gJЖ>j'N?{=3d?3d?3d????(33d?3d(33d?j'N?{=??????236,`%&?3d&?"3`-*~ñ?`?Fv}ٍ< u>aX?mwIX u>f`$@?DOBdLB? #=?>=???@???dWh=XVheDATAЖ>MAD>'Й>MABlack5L>L>L>??????????L?_=??B??? ף; ף;?II ???????? F?*@?=?=>q%2???>????L?L?L?L==ff????DATA >MADЙ>'H>>MAbuttonG6L>L?L>??????????L????B?2?? ף; ף;?AA ????????VI?BA?=?=>q%2???????L?L?L?L==ff????MADH>'>Й>MAbuttonR7L?L>L>??????????L????B?2?? ף; ף;?AA ????????VI?BA?=?=>q%2???????L?L?L?L==ff????MAD>'>H>MAglass8????????????O?Zɲ=L??????a?? ף; ף;?KK ?????????@?=?==???8>????L?L?L?L==ff????????DATA8>>????ff>>?????L>MAD>'p>>MAInterior9?ff>(>??????????L???B?p?? ף; ף;?AA ????????H@BA?=?=>q%2???h> >????L?L?L?L==ff????DATAh> >???L>L>L>?????L>DATA >MADp>'>>MAInterior.001:ff>>>??????????L???B?p?? ף; ף;?II ????????H@BA?=?=>q%2???????L?L?L?L==ff????MAD>'h>p>MAMain;L?L?L???????????L???B?3?? ף; ף;? ????????4a?BA?=?=>v???`>>????L?L?L?L==ff????DATA`>>UVTex????????>?L>DATA >MADh>'0>>MAMain.001<L?L?L???????????L???B?2?? ף; ף;?AA ????????{N?BA?=?=>u???>????L?L?L?L==ff????DATA >MAD0>'h>MAskim=????????????L????B?p?? ף; ף;?AA ???????? =?BA?=?=>q%2???>`>????L?L?L?L==ff????DATA> >???L>L>L>??{>??L>DATA `>TE>#>TETex.001>N =@???????@@????? @??<dTE># >>TETex.003?>@?????=?@@????? @??<dTE >#X>>TETex.004@"sS?@???????@@????? @??<dTEX># >TETexA>@?????{]A?@@????? @??<dME (d3CMECircle>0C(B0.Cض>,C КC (-">-lsm>L-">X?m>?DATA>>0>>>>DATA,ض>(BDATAxl(B9]>zR?ejBp8`>pR?-j6%_>R?ik(^>Q? eTb"̵\>d^Q?I$Z>\^Q?ٽnDmMZ>Q?e>F*c[>R?1J\>jR?9 Q }]>hR?hfԠ S_>S?*^$Mzpd>P?"{| He>P?'|sd>P?“d|ac>ZO?:4|/b>R$O?|]y]ja>\N?V6>u#)_>CN?p> 9^>~M?#l\>M?*of Z>dMM?hXSZ)%X> M?hU>TMM??l)vU>dM?U>BN?4a}V>:N?6 8mW>>"O?P$HX>O?4O)A"9Z>P?`/*-\>kP?h0-N^>P?u0,_>8!Q? K4.Ba>FeQ?[B8c>Q?H%5bZ=-e>2Q?R y("q>4=?Ҿ0 p>>?Ѿyup>]>?оVCBC>m>"}>?nϾPaEk>U>?'оh>=?pѾ."?mxe>k=?RӾ';73b>;?Vؾ+ %'4Z>&;?1۾mu$ 3B:?E޾M8*qcT>V9?v~f =`R>|k8?p価P>7?0P>6?WkWO>6?CurP>ȗ5?hpQ><5?< U>L 5?P ǀQQX><5?_Ip `[>5?o,]Nػէ^>*6?XQh̽eb>6?Vbn&`e>,7?羈r Yh>k8?vk>Z9?gzl>pR:?޾}MG n>JH;?ھ} vp>p%\&?ɺ}t>L'?~qr>%?(Z}(2p>8$?\P¾}in>|#?XMƾz0 |k>"?(ʾvg>y!?;r5c>P ?оmn! _>\?TӾ]hv[>#? վQ^a$}$X>X?L׾J-T>~? ؾĬq3R>~? ؾHM P>@? M׾EݥN>#?վ25-N>(? Ӿ%,%_N> ?оoXO>y!?;Ӂ/ Q>T"?()ʾvS>l#?^ƾo!AV>@$? ¾+9[>4%?t羾T!4a_>`&?`E"5c>P'? Iڐ"55g>u(?T|$+9ek>)?8J͚*Afn>)?|8T!q>)?Cab}s>`)?尾2|E^qsu>:)?ݲ{ayu>((?Nx>((?혾 x>d?{}1{u>p?X{x4>bX^?RQ>pe Rp>H+?(lh4FVl>0? šp(Ci>?u"+:d>?Ԑ l6م`>?h 6a.[>?УN 5V>?fԧg,R> ?dlH"55P>t ?#aSN>T ? ЁF :AM>0P ?vm9 M>$s ?,"}M>x?缾>Q.O>M??ۃ sQ>??YO)W>M?J̔[>?(缾S^bյU7`>\s ?`_hۂid>tP ?pn7h>lT ? rJ m>Du ?`"vvp> ?,꫾zr>?|}Kt>@0?86~nw>R?Л~ 9v>P?O}q 9v>I>䵅}nw>N>,7~AKt>P >~ r>P>򍾼}Rvp>>Pz~ m>`>Ĉvh>Q>\qr1id>I>pnjU7`>>_h[> 4>MS^&)W>D>줾JaiT>>O sQ>>:חQ.O>D>x줾>}M>3>$N)9 M> >!0AM>0I>m aSN>Q>trЁy 55P>>򉖾#R>>ck"V>^>:S$-a.[>>L7N6م`>>~ +7d>>|ԐZ7i>X>u!8;l>8>{š&uD Rp>h>wg0Xe>pCv8h1{u>p>uy46f x>K>z{Nx>(>d~S= v>R>dO7!u>>,K{P 5Zs>>G31\j=q>0>hH<5jn> :>.fIt-Zk>P>(LɚP$kEg>0>-Qy;]c>X>Vؐ8ݡ_>m>{]U8-Z>ph>D|dR_37=V>@:> lT-R>>smd#GP>>̬{ N>0>ʃс -MM>>ӄn MM>>v# MM>HǸ>ىwPO>0>X_A sQ>s>&[s>%D^őW>h>_JͦQ[>Ǹ>؉R^ӽW_>>^hvy|c>>҄onޘg>>Ăr[H~k>P>{v n> >йszp>Pa>k},_p>,Yc}0u>>nU~ t>>\}Jp>%>-Iq>͜>H'mKo>L>3WRn>>>~;~9%l>`->9By|~%ii>->T&IHxf>S>XO8sInb>>,VUmz}^>8>>?ZReAځ1O[> !>^XY X>\>`Ctñ!U>>bI@-P>\>p`ĹO> >^/ՆEO>=>L@Z!CO>>WU#P> S>$OQ>->D(I܀f \ S>H$>8YB>QV>>;pݯZ>>X4 %}*_>ƚ>D.<(.eb>8r> )=)2f>ߝ>Z$,;i>x > Y0HAl> ՟>PϹ&6R\eln>(>T.p9;q_q>(>tC-be]r>A>Oxn9;r>+>#| p>@6c>KM^<*Kk>d>ܽEa2^f>Ke>4ڽ$9?l}Ga>e>P%ٽ=0p[>Ke>4ڽz>^lV>d>ܽ= b1Q>@6c>K1 9,SM>ya>O罶3!DJ> \_>ȣ,g5u{G>@\>DO%'E>SZ>l }U[E>W> NE>@T>x p6q{G>BR> D!J>O>`08M>@M>tE|-Q>K>T?54V>J>d 9[>I>x4yryGa>`I>vf>I>x k>J>d6(Ğp>K>TM#u>@M>ta^ ݳ~x>O>`0vk9{>BR> uI|>@T>x {&3}>W>"4pI|>SZ>n H x{>@\>H|u>ya>O罝m"*8~x> \_>ȣ.w%p>=P>G65*\k> /=60 ;hff>=0>l}Ga>@O=(.?n[>=0>lV> /=6 ;hf1Q>=H>65*\M>!=K@-aNJ>=Y#=u{G>=gj}k*E>=8|w| U[E> c=E>=$w`q{G>=7J>߾=rkM>=,詽ҟ-Q>+=믽֣V>= dĘ[>@=$w='f>@=$= d0Ęp>+=믽G֣u>=,詽Zҟ~x>߾=ljrk{>=7@vI|>=$}`3}> c=I|>=@|}| {>=gj@v}k*u>!=KZ@-aN~x>=Ylj#=p>P=)>[G65*\k>*>♽0 ;hff>S+>d">l}Ga>+>4?n[>S+>d">lV>*>♽ ;hf1Q>P=)>[65*\M>Ѐ'>^@-aNJ>@c%>#=u{G>P">t}k*E>Z >"w| U[E>>pƽE>P>нwaq{G>I>pٽJ>>oὔrkM>P>ҟ-Q>>֣V>>?Ę[>0>>l'f>0>>?0Ęp>>G֣u>P>轁Zҟ~x>>oljrk{>I>pٽ@vI|>P>н}`3}>>tƽI|>Z > "}| {>P">x@v}k*~x>@c%>lj#=u>Ѐ'>^Z@-aNu>@Q0(轁Z@-~x>n2Nlj#k{>4|ؽ@v}I|>0w7Ͻ}| `3}>0:pƽI|><}{>0?@vk*~x> Aljrܕ=u>D=ZaNp>0E:G*\k>G0hff>Gp&Hn[>GpGhf-Q>0E:*\M>D=aNJ> Arܕ=q{G>0?k*E><wU[E>0:pƽE>0w7Ͻw| `u{G>4ؽ}J>n2Nὔ#kM>0Q00@-1Q>.65֣V>pJ- ;[>,>I}Ga>`:,p?'f>,>Ik>pJ-0 ;p>.ܦG65֣~x>slj#ku>`@ǩZ@-{>@v}I|>0}| `3}>pI|>y`J|}{>0 0%j@vk*~x> 0lYljrܕ=u> JZaNp>0\`>G*\k> 50hff>qK08o.n[>qK0 5hf-Q>0\`>*\M> JaNJ> 0lYrܕ=q{G>0 0%jk*E>y`J|wU[E>pE>0w| `u{G>}J>s#kM>`Hǩ@-1Q>Iʯ65֣V>C ;[> 콨>I}Ga>뽈?'f> 콨>Ik>C0 ;p>IʯG65֣~x>gl.wIu> Jjm:{>n |I|> pqZh H3}>`)t4I|>v{>{> yPu߼(~x>{ЂvkE9u>~.b^ҊIp> *M!Yk>Ȳܽ67 gf>`퀾<ٽS|@qyGa>Tٽit[>`퀾<ٽy]oV>Ȳܽ Ma-Q> *?مOM>~.Ef;J>{Ђe6'q{G> yPwE>vpzU[E>`)taE> pq\h 9u{G>n OJ>gl[M> Jj6!D1Q>h1+V>`Cgf6"[>xf.h>}Ga>P3f cBf>xf.h$@k>`CgE8p>hM^M,r>`dL|nKe]r>NPoL%_q> RL;eln>`gܩSXEAl> Rι4i>І2O4&f>ԾKڻeb>F= T_>ɣA}ݯZ>:;QV>xsR4o S>l~->;Q>(c&܀hs#P> =F !CO>箾pEO>hRb#O>homR=-P>3;d0\R>4 4s!U>j ûq X>3PCЗa1O[> oXQ}^>R,ReBInb>8箾m7f>bر&Hx!%l>b-y|n>hQ4~hmKo>pC;q>x¡ Hp>PjMB t>cξ}̾Fh~:(оhr}p>HҾj} n>x<վ„bz~k>@׾Zv)g>Цپ 9Sr 2y|c>۾`Lon8W_>0ݾ"F^h@Q[>w޾BR^ՔKőW>0X߾?JdͽZ߾=Otl sQ> ߾=;JiPO>hX߾?A?AMM>Pw޾BMM>0ݾF#RMM>۾Ln=N>pپ7Sс GP>׾ȑZ R>Fվ`bmK=V>`Ӿ4jl-Z>0оPqR!ݡ_>ξx!]c>̾dؐ!-g>pC˾\y $k>ɾׄɚ)ؽn>ɾ4lt66=q>pȾџA5Zs>ȾNA 3Fet>@Ⱦ j*!u>ɾ4G }b v> ʾF Nx>J x>PH!}Bv>8󾨟p!1{u>bp+y?ԙp0 >d Rp>gU4l> ҠšG(ؼi>P]u"d>ZԐr م`>ӗ ,a.[><0NKV>(nR>zkh55P> ȇJ6aSN>Ё AM>[mY(9 M>ػz!N}M>\vNZQ.O>0r>@ sQ>$%q:)haiT>%qO~k)W>rJ Z[>h\ vS^JU7`>hz_h#C@id>\pn+8h> ჾr1 m>Ȭɇv_)vp>tz%r>d_}!Kt>ൔ~nw>pP~ 9v>}M; 9v>06}Mnw>괵~Kt>dxO~r>]4}-7vp>zyg m>`Pcv(h>8zr 1id>0.pnߴ7U7`>HN_ha?[>S^ԎJ)W>JHˇYaiT><,Oj sQ><r,:ԭxgQ.O>?P@}M>(𝔾v9 M>"AM>x:maSN>yЁ& 55P>"bjR>Ll_V>rJ&a.[> JȴNb`م`>7Hm ?d>2Ԑi>S(u l>tkš%s Rp>\"hp0ZP^ʼб8P1{u>V +]8v>0B9p x>@|$⺾ }] Nx>|%䗸)yu>(dϾ^qsu>j'Ѿ|1Yt>'XӾjR}s>p&TӾe 35!q>P&ӾѦ3fn>'\Ҿ|,aek>P'nѾ͚#.5g>/(0Ͼ|8c>(o̾ڐPa_>p)7ɾc9[>*pžTAV>+&¾ vS>d -YoPbQ>|#.w )XO>P+/Ӂ< %_N>0Ldzo05-N>0 %N>L1P殾H- P>1kEi?q3R>8&2𪬾>hf-T>4&2Nji}$X>p1(lJX[>$1殾Q^I_>t0 ]hwJ?5c>0,ȳmn.-7g>+/r0|k>,#.Аv)(n>T-kz9p>+h¾}Xqr>к*^ƾ}gt>(X ;~j s>t) ɾ}-lYo>@D/}Gvp>l@⾑~.  n>A,1ݾ}al>Bپ}k> C(־z<Yh>@DGӾvh&`e>mEHоrO/eb>@5F:;bn05է^>FI˾Qha > `[>dG |ɾC^ЂHQQX>G$>ȾJ$WU>GǾ'κth TS>GǾJiaQ>G=Ⱦh2=urP>4dG{ɾcxO>F$I˾71P>p5F;~P>nE.Gо9r=`R>DFӾp qcT>PChu־~"&BXپiZ>Aܾm ^>A(߾+3b>@;@NI`mxe>`?(B(->h>4?@{澾sEk>>ձ%>m>~>L辮C,p>>ZeZp>>&{p&"q>l?t徙4-e>h6Yܧ@{mee>XxV.-b>@X,_>GYkڗXN^>hY&J󾶒 վ-\>Y!b9Z>@dZdp X>|Zテ[ mW>F[|s}V>Թ[0U>(&\{꾯%)vU>\*ĂaU>\ _U>]$)^.V>H]澤i7)%X>p_]>,I\>x\ caL99^>\`*m",)_> &\,|eqy&ja>[뾿u0؊b>D[y/ec>Z+#| d>SZls| He>tY|a4d>TY Cd|Zo 1`>L%]am_>\tz!}]>(L]6r7\>]`f򾝜8 c[>]:8񾺖AMZ>F^d,jZ> ^0Z>^\쉁a]>,l^テPK/_>^eI`>P]fJlm!`>`i] l]>+^S]>~;y?pK}!`>9kly?,̛A`> M;kly?~y /_>$;kly?g%K@a]>2%-0;kly?jB[>S;kly?kЅ?]]>7:kly?uEM _>jly?q_`>x8jly?*Тnd>230v?t| He>30v?N|3cd>030v?|c>:30v?|Bb>4;20v?cy#ja><30v?YuQ/N)_>BL<20v?p8-9^>}<20v?l9@\>><30v?f$I Z><20v?VW:!MyY><30v?[.m4..V>î<20v?]'aU>C<30v?ʄC j )vU>}<20v?U>RL<20v?V}V>&<30v?DmW>H;20v?RX> ;20v?p89Z>020v?]-\>p30v? N^>&30v?Ś_>"20v?UBa>D20v?wu-b>&\20v?K̚@,ee>]20v?T49-e>+30v?|"q>G '[?p>([?#} p>@'([?VA>m>+'[?Ek>&([?ձ@->h>@9'[?mxe>([?F3b>'[? ^>([?+EZ>C([?m'[?I"qcT>ƺ([?~s=`R>;'[? P>K<'[?P><'[?~'O><([?M=urP>M<'[?{!Q>=<'[?M_VU>='[?VQQX>8<'[?D=lJ `[>E<'[?D^vVէ^><&[?Qh J'eb><'[?bn@`e>iK<([?r8Yh>@;'[?vz/sk>׺([?z#"l>'[?} n>ӈ([?}lvp>([?~Yo>'[?}s>\B?}t>|\B?~qr>&\B?}qp>e\B?}n>\B?z#I|k>o;\B?v/g>?<\B?r95c>E<\B?nn@_><\B?]hJ[>o<\B?Q^V}$X>a=\B?JgB-T>Y=\B?}6q3R>Z=\B?ͫu P>d=\B?DJN>y<\B?B5-N><\B?%%_N>V<\B?oXO>?<\B?ӁQ>$p;\B?vS>\B?oAV>n\\B?@I9[>󱼍\B?Ta_>\B?7c>@\B?ڐ5g>/\B?|3ek>@CD\B?͚fn>nR\B?}!!q>CX\B?CԀ 1Yt>zS\B?4Yؤ qsu>+H\B?|3yu>@4\B?Nx>KK(?} x>r`(? }(`v>l(?qYr(?Io Rp>k(?h`l>,\(?š}i>@~E(?u.!d>)(?Ԑم`> (? 3a.[>qͼ(?NV>J(?>R>ٻ(?l׺55P>1;(?aSN><<(?ЁAM>i<(?m9 M><(?"}M> =(?Q.O>@=(??J, sQ>=(?:Ex_aiT>=(?O|,)W>=(?Jg[>=(?S^VU7`><(?_hJid>W<(?pn@h><<(?r9 m>1;(?v/vp>F߻(?z#r>{(?}Kt>ؼ(?~rnw>0(?~! 9v>W(?} 9v>WY)?}'nw>0X)?~ Kt>ؼX)?~r(r>{X)?}+vp>F߻X)?z#] m>1;X)?v/h><W=X)?S^V)W>=X)?JgaiT>=W)?P| sQ>=X)?9FxQ.O>=X)?>J}M> =W)?9 M>i<1;X)?R>ٻX)?k׉V>JX)?>]a.[>rͼX)?N+م`> X)? 3(d>)X)?Ԑ'i>@~EX)?u. l>,\Y)?š Rp>kX)?grY)?Jlzv>lY)?rYz x>r`X)?!}(Nx>KKX)? v>S6}>!u>:J~> }.et>U>LYc=q>@Z~>Gcn>@T>tk>4F>ɚg>0~>y1]c>}>ؐݡ_>~>5-Z>d~>R=V>=S~>?7R>4~>m׃GP>L;}>N>U<}>сMM><}>nMM><}>#MM>`=}>vPO>q=}>@J sQ>=}>ͧu=}>}őW>@n=|>JgvQ[>[=}>R^VW_><}>^hJy|c>ק<}>on@g>bU<}>r9~k>;}>v/ n>l~>z#7p>]}>}幼~>}q0u><~>~ t>~>}p>ѼJ>q>{J>mKo>֖I>n>0*J>~_f%l>@I>y|ii><;I>Hx+f>P8s]7qInb>mB}^>Qe2N1O[>X:\ X>=I>C|l!U> =J>I~~-P>=I>NpO>d?)EO> C$ !CO>#P>PfQ>;I>܀20S>(I>>QV>!J> ݯZ>J> _>ƼI>Ff eb>K>= f>J> i>5'K>rAl>3I>ιeln>@,9K>kK_q>4J>b7Xe]r>*J>or>\K>|p>>M^xk> >EAf>p&>!2}Ga>@(>1&[>p&>@V> >ȕ1Q>>1sM>>5 J>>E> u{G>EǼ>O E>]>yJ U[E>c> E>j >pP q{G>lb>F<J>:>.M>;>EC-Q><>?WGV>.9<> j[>R<>5{zyGa>0[<>(f>R<> }k>.9<>6s2p><>M0fu>;>a^kV~x>:>wkOE{>lb>uS3mI|>j >{3}>c>4  I|>]>H{>EǼ>|iu>>m~x>>.wp>r>Gk> r>0f>p&r>w}Ga>@(q>[>p&r>wV> r>1Q>r>且M>r>~J>r>u{G>EǼr>E>^q>wU[E>cq>E>j p>wq{G>lbq>0J>:p>GM>;p>Z-Q>ljV>.9@v[>R}yGa>0[f>R}k>.90@vp>Glju>;p>ZZ~x>:p>ljG{>lbq>@v0I|>j q>}3}>cq>I|>^q>}{>EǼq>@vu>r>Z~x>r>ljp>]F>Gk> ^F>0f>p&]F>w}Ga>@(]F>[>p&]F>wV> ^F>1Q>^F>且M>^F>J>]F>u{G>EǼ]F>E>]\F>wU[E>c]F>E>j \F>wq{G>lb]F>0J>:]F>GM>;\F>Z-Q><\F>ljV>.9<]F>@v[>R<\F>}yGa>0[<]F>f>R<\F>}k>.9<]F>0@vp><\F>Glju>;\F>ZZ~x>:]F>ljG{>lb]F>@v0I|>j ]F>}3}>c^F>I|>]]F>}{>EǼ^F>@v~x>]F>lju>]F>Z:->@=)s=Q:-> V:->Ȥ':->='':-> >V:->7$>:->1>J޼8:->@g)>s=:->=R>Z:->@L=o>C:->@I=,>`:->*>:->84^>PA=Da@$^>h,|= E:^>L;$D^> JCڽ^> U|#C'^>0>j#CD^>&!>ICVڽ^> ;>z&Dc^>L>@e=ڣE>E(g^>M>ENk^>pc>1EѴM^>8JM`D͓^>@<DHה>=Gg?>!>͍|j>%E=<+>JΝ Yq>!2>bu>6>ӭAT>7 lԊ>8.;B>`b=q=;B> ` =ٽƏHm;B>0>0p ;B>>`<Ňq- ;B>.=B>Pţ:wa;B>@&=@>9rDm;B>@`%5>:ŅAm;B>@@n=( +ѕ|>⽠9|>Ͻ:|>U=hl|>=9==e*|> =r=JPI|>@q=?=Ѽ*8Z]|>@6н5ژ|>6=ܟн)ژ[=,}K$=ͧ-9[=clX=[=`$=& `I[= =[;hO [==8x<`([=@9S=X= MF[=e>=j)c?;B>==2` >|>ú=z$q=\;[=@x=j=>Ys9<@=h<\R 5^>Ц(>S=EZi::->u>=J E<C;*4;0 j(j0 j%J<6ݨ#heV8|>==˳N|>^p2=ѼZ]|>c=h|>b=l|><$=h|>`=:e|>=mqeF |> v= Ws|>ඕmq |>` s|> 2ֽ=ス$|>@B:y={8f;B>@m(ѕ;B> νK=mňvQ;B>@՜B>P]wa;B>g>1q;B>U=>L=TL;B> >U=i5,;B>> gluh;B> =.ƺZK;B>@Zýٽqm;B> e4FK;B>s`glƋ;B>@@0: ;B> ZU=ŦF&>l=7 ɔ+>Dmf> Cd>rD/+>J\Vq>`=wf> ν,=`>VXO>P&>hu=-l->0/>PG<8|t~ >pz.>)ͼUs>, >ؽ<\'>`\=h0ʛI,>`轢h/e-> ؽţ(> ΍˅>M.)ͼˬ>P/hG<6̅~ >p%u=̆i'^>`=޽<D(^>Oٽ.>sE"\^>8eɣE>EK'g^>=.>tEj7!\^>P>.>EHO]H^>PA>ǀ=}Ec)^>K>,nDj^>`UKX-lD,:->5=%c:->ᏽ%#c:->`f>pC:->]H,>:->3>:->(3> C<|:-> $$ᓽu:->1@K޼8:->2HC< |:->Y_=:->=a >|> ‹=Y=;FCV<<@ =;uL<,<-b'> e=k > ΟH\^>_=d(!>DkBT;B>@B==-FY[=9=l=:@RDATA,,C0.CDATAll0.C6 " """"""""" """""""" " " @" " >" "=""<"";"":""9""8""7"5"3"1""0""/"".""-"",""+""*"")  " ("!&""#" "" ? #?"#$"#_"$%"$^"&'"&\"'("'["()"(Z")* )Y *+ *X"+, +W",- ,V"-. -U"./ .T"/0 /S"01 0R"12"1Q"23 2P"34"3O"4N"56"5L"67"6K"78 7J"89 8I"9: 9H":; :G";< ;F"<= <E"=> =D">@ >C"?B ?@ @A"AB A~"AC C|"CD D{"DE Ez"EF Fy"FG Gx"GH Hw"HI Iv"IJ Ju"JK Kt"KL Ls"LM"Mr"MN Nq"NO Op"OP Po"PQ Qn"QR Rm"RS Sl"ST Tk"TU Uj"UV Vi"VW Wh"WX Xg"XY Yf YZ Ze"Z[ [d"[\ \c"\] ]b"^a"^_ _`"B_ B} `} `a `"a"bc"b"cd"c"de d"ef e"fg f gh g"hi h"ij i"jk j"kl k"lm l"mn m"no n"op o"pq p"qr q"rs r"st s"tu t"uv u"vw v"wx w"xy x"yz y"z{ z"{| {"|~ |"} }~ ~" " " " " " " " " " " " " " " " " " " " " " " " " " """" " "" " " " " " " " " " " " " " "" " " " " " " " " " " """"""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""" """" ""!"""""#""$""%""&""'""("")""*""+"",""-"".""/""0""1""2""3""4""5""6""7""8":""9"""""""""""" ""!"""""#""$""%""&""'""(" " )"  " *"  " +"  " ,"  " -" ".""/""0""1""2""3""4""5""6""7""8""9"":":       ! !" "# #$ $% %& &' '( () )* *+ +, ,- -. ./ /0 01 12 23 34 45 56 67 78 89 9: ;< <= => >? ?@ @A AB BC CD DE EF FG GH HI IJ JK KL LM MN NO OP PQ QR RS ST TU UV VW WX XY YZ ;Z ;\"[\"<["[]"=]"]^">^"^_"?_"_`"@`"`a"Aa"ab"Bb"bc"Cc"cd"Dd"de"Ee"ef"Ff"fg"Gg"gh"Hh"hi"Ii"ij"Jj"jk"Kk"kl"Ll"lm"Mm"mn"Nn"no"Oo"op"Pp"pq"Qq"qr"Rr"rs"Ss"st"Tt"tu"Uu"uv"Vv"vw"Ww"wx"Xx"xy"Yy"yz"Zz"\z"<{"{|";|"=}"{}">~"}~"?"~"@""A""B""C""D""E""F""G""H""I""J""K""L""M""N""O""P""Q""R""S""T""U""V""W" X""Y""Z""|"|""""""""""""""""" """""""""""""""""""""""""""""""""""""~""}""{"""  " " " " " " " " " " " " " " " " " " " " " "   " " "  """ "    " " """"" " "   " " " " " " " " " " " " " " " " " " " " " " " "  " " " " " " " " " " " " "  "   "    "    "    "   "  " " "   " " """""""""  8 8 " " """ " "   " ! ! !" """# #"#$ $"$% %"%& &"&' '"'( ("() )")* *"*+ +"+, ,",- -"-. ."./ /"/0 0"01 1"12 2"23 3"34 4"45 5"56 6"67 7"79 9"89 9:":; 8; 7<":< 6="<= 5>"=> 4?">? 3@"?@ 2A"@A 1B"AB 0C"BC /D"CD .E"DE"-F"EF",G"FG"+H"GH"*I"HI )J"IJ (K"JK 'L"KL &M"LM %N"MN $O"NO #P"OP "Q"PQ !R QR S"RS"T"ST"U"TU"V"W"VW"X"WX";X";p Yp"XY"VZ"T["R\"\]"Q]"]^"P^"^_"O_"_`"N`"`a"Ma"ab"Lb"bc"Kc"cd"Jd"de"Ie"ef"Hf"fg"Gg"Eh"Bi"ij"Aj"jk"@k"kl"?l"lm">m"mn"=n"no"<o"oq":q"pq"Yr"[s"]t"_u"av"cw"ex"gy"jz"l{"n|"q}"}~ |~"{~"z~"y~"x~"w~"v~"u~"t~"s~"r~"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""" """"""""""""   " " " " " " " """""""" " " " " " " " " "  " " " " " " " " " " " """ " " " " " " " " " " "   " " "" " "     """""" " "   " " " " " " " " " " " "  "  "  "  "  " " " " " "  " ?" =" <" ;" :" 9"  8"   7"   6"   5"   4"  3" 2" 1" 0" /" ." -" ," +" *" )" (" '  &" %" $"#" ""  !"  > !> !" !]""# "\"#["$% $Z"%& %Y"&' &X"'( 'W () (V")* )U"*+ *T"+, +S",- ,R"-. -Q"./ .P"/0 /O"01 0N"12 1M"23 2L"34"45 4K"56 5J"67 6I"78 7H"89 8G"9: 9F":; :E";< ;D"<= <C"=? =B">A >? ?@"@A"@}"@B"B{"BC"Cz"CD"Dy"DE"Ex"EF"Fw"FG"Gv"GH"Hu"HI"It"IJ"Js"JK"Kr"Lp"LM"Mo"MN"Nn"NO"Om"OP"Pl"PQ"Qk"QR"Rj"RS"Si"ST"Th"TU"Ug UV"Vf"VW"We"WX"Xd"XY"Yc"YZ"Zb"[`"[\"\_"\]"]^"A]"A|"^|"^_"^"_`"_"`a"`"ab"a"bc"b"cd"c"de"d"ef"e"fg"f"gh"g"hi"h"ij"i"jk"j"kl"k"lm"l"mn"m"no"n"op"o"pq"p"qr"q"rs"r"st"s"tu"t"uv"u"vw"v"wx"w"xy"x"yz"y"z{"z"{}"{"|"|}"}"~"~"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""                                [a Z["Lq KL"3L"#$ """"""""""""""""""""""""""""""""""""""""r}"o}"|}"m|"{|"k{"z{"iz"hz"yz"hy"xy"fx"wx"dw"vw"bv"uv"`u"tu"^t"st"\s"Zs"rs"pr Ci"hi"Dh"gh"Fg"[\"S["U["Z["WZ"YZ"UV"U"""""" """" ab"]^"4M"45"&]"%]"%&"!""!$"!%" !" '""2"4""6"" " "" !" " " "   """"""""""" """"" " """""" "" " " "  " " " """""" "$" """"" " """ """"""""""""""""" " "  " "  " "  " "" """"""" "" " """""   """"     !" "+ "* ") "( "' "& "% "$ "# ", `a `p"#)"$-"%,"%."&'"(/")0"*+"*3"-1"0:"12"1;"23"3<"45"4>"5?"6D":G"9:"9H";I"<="=>">?"?K"@M"AL AB AO"BC BP"CD DE DQ"FH"FT"GH"HU"IJ"IV"JW"KL KZ"NV MN OP"P\"R_"S`"TU"Uc"VW"Ve"WX"Wf"XY"Xg"Yh"Zj"[d [k"\] \l"]m"^n"_o"ab bq"cd ef fg gh hi hr"ij ks lm"lu mv rz uv"vw"yz"z{"|"{"y"x"x"w"u"|"t"t"s"s"| { r"y r"q q"x q"p p"o n n"w m"l"t k"k"j"j i"g"f"e"c"d"c b a"^ ] \ e [ Z"i"Z"Y"U"d"T"b"T"a"^"Q"Q"]"Q"P"O"O"M"N"["M L"K Y"X"J"G"F"S"R"E"E C"@"N"I"@"G"?"L">"="<"J"<";"F"9"8"8"8"7"E"7"6"C"6"B"A"@";":"5"="4"3"2"9"0"/"/"8"/"7" 6"." ."." -"-"0"5",","4"+"+"1")"()"(" '"'" &"&"%"$"$"#"#"*"2"S"" " " " " " " " " " " ` _ S"R"!"!"p"o" " "  ! }"}"~ ~ """"^ _ n"o""R""7""   ~ ~   } DATA,КC0CDATAZ0C5~~}|z{tustrspqopnolmjkijghefcdbc`a_`^|A]a`[ba[ZdcYXedXWfeWVgfVUkjRQlkQPnmONqpLrqLKutIHvuHGzyDC{zCB}{B@A@?>@B=?BC<=CD;<EF9:GH78HI67IJ56JK45LM12MN01NO/0OP./PQ-.UV()WX&'YZ$%]A>!!> #"$#%$'&+*,+-,0/102165  76  :9?=>?               ! !" " ?@ @> >= =<<;;::99887766554433221100//..--,,++**))( (' '&! &%!%$!$#"!#? "_B?#^_#$]^$%]%&\]&[\&'Z['(YZ()XY)*WX*+VW+,UV,-TU-.ST./RS/0QR01PQ12OP23NO34MN4LM45KL56JK67IJ78HI89GH9:FG:;EF;<DE<=CD=>AC>@BA@?}~AB~|CA|{DC{zEDzyFEyxGFxwHGwvIHvuJIutKJtsLKsrMLrqNMqpONpoPOonQPnmRQmlSRlkTSkjUTjiVUihWVhgXWgfYXfeZYed[Zdc\[cb]\ba^]a`_^`}B_}``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||~~}: ! "!#"$#%$&%'&(')(*)+*,+-,.-/.0/102132435465768798:9:  !!""##$$%%&&''(() )*  *+  +,  ,-  -. .//00112233445566778899:<;\[=<[]>=]^?>^_@?_`A@`aBAabCBbcDCcdEDdeFEefGFfgHGghIHhiJIijKJjkLKklMLlmNMmnONnoPOopQPpqRQqrSRrsTSstUTtuVUuvWVvwXWwxYXxyZYyz;Zz\;<{|<=}{=>~}>?~?@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ;||~}~{}|{          8  !!""##$$% %&  &'  '(  ()  )* *++,,--..//001122334455667799889:;97<:76=<65>=54?>43@?32A@21BA10CB0/DC/.ED.-FE-,GF,+HG+*IH*)JI)(KJ('LK'&ML&%NM%$ON$#PO#"QP"!RQ! SR TSUTUVUWVXW8;XX;pYWXYZVWZUVZ[TU[ST[RS[\QR\]PQ]^OP^_NO_`MN`aLMabKLbcJKcdIJdeHIefGHfgFGgEFghDEhCDhiBCiABij@Ajk?@kl>?lm=>mn<=no:<oq;:qpYprZYrs[Zs\[s]\st^]t_^tu`_ua`uvbavcbvwdcwedwxfexgfxyhgyhyzihzjizkjz{lk{ml{|nm|on|}qo}pq}rsr~ts~ut~vu~wv~xw~yx~zy~{z~|{~}|~r}~         =<<;;:98 87  54  43 32/..-*))(('&%"! \]!"[\"#Z[#$XY%&VW'(TU)*ST*+RS+,QR,-L23KL34FG89DE:;|}@AyxEDxwFEwvGFtsJIsrKJpoMLonNMmlPOjiSRihTShgUTcbZY`_\[_^]\|^^_abdefghiklmnqruvvwwxxyyz{}{rzqxxpwwmvvmlutjjiihrrhggfcqban^l\ejZiiYhfWVedUcTbaS`^Q]P\ONMeVNLKZYYXGHUTFEEDQN@MGL?K7ED6CCBBAAL:G5?<3221;:099//887   66     .-  ,5+*33*2210))(/  '&  & -$ 1$- #""++"*(""&""%%",*"p  op`!!"!!"RSR_`S_o"#")"#"$$"'"&"'")"(,"#)0.%, %. ' /(4+540:;1-.=3<>4=?54>@I;@E6D8F8H9FG:9HJ;I<J=<>=K?>M@VINOALPBAOCBPQDCSUHFTWJIVXJWZK[dM[\POQ]bacUTgXWfhYXgZjk[d[km]\l]ma`pbqdcfeskkst|ulnqyzry{|""7~7~~R~R_^_o^no}n}ME C3E(dMECircle.001@C(ECȈDxChD E  Ƚ/ x>c>E?DATA@C>DATA,xCCDATA`C9C)0><;*Zi4><54C)0><4><;*%><|pC)0>6<:*T$ki4>6<=4=v1C)0>6<[*66<[*<0\ەX>6<&4É>6<:*0\k%>6<{pV}=>2*HFK=>PI4[1YV}=>c*<HFFOuf=>p<I;=>c*43ϦI;=>2*uf=>sp'=>h<(bZXZ'=rS>]< '==h O'=>h(bZ'= >-4yϲ;rS>]<~Ѳ;>h<YYͲ;=h<cYͲ;}= 4Dβ;=hccв;rS>DҲ;>hYcҲ; >-4~Z!><)̎ZZ!>4Zu>8<جDDrS>ןA<جLaɉ=7<ج3Ds=<˲4ج͉=^ج33rS>Aج>]جD3Zm>Z04جLaVQ >Ts;VQrS>L;)VQ6>Ts;nVQ>΍4.VQ7>HIsnnVQsS>.VQ >FIsnVQϳ >H4)VQsS>V4=><YY=Z >O<QY=t=4ց= *>=Z >ROG w=>Ya=PY>4~7="z>;eXX7=Z >*1!;eKX7==|4e7=:>eKK7=Z >k.!e7=#z>eXK7=m>4es}b>Z >j;<# {c>jz >1G;<#WWb>:>0G;<#Wb>J>ӎ4<#b>:>G<#b>Z >d<#c>kz >G<#Wc> >EV4<# {>!f >sم:i22>Z >E:iH>N>rم:i 2>>ı4i>N>-Åi >Z >/i>"f >,Åi2 > >豱4iH>Z >߱4>Q -24> 4i>D] Åi >Q Y0i> F Åi2 >1 /4iH> F ؅:i22>Q sE:iH>E] ؅:i 2b>4b4<#b>qJG<#b>Q d<#b>1 HG<#Wb>m'(4<# {b>1 G;<#WWb>qG;<#Wb>Q i;<# {7=dD4e7=Eq#eKK7=Q }.!e7= 2"eXK7=>M4es}7= 2;eXX7=Q 1!ż~p>ż=*0$k>żӲ4É1>żX*<0$X%>żp<C)0>żX*ż#4=vC)0>ż=*T\k%>8I}p>8I=*>8I'4> 8IY*<Z%> 8Ip<C)0> 8IY*8Ig4C)0>8I=*Z0M> <)& qzz>T;Ƣ7>ɱ;ƢK>h;Ƣ'}N>9ƢK>Ƣ7>˻Ƣzz>ѻƢ~HY>J ƢG X(>QƢW m.=FƢ W=Ƣ wۼƢ" U}ƢtS`+Ƣz9 ƢAOi%ӼƢňTƢ,썁XȸƢQ fƢiƢ,;ƢbVX<Ƣڇzňm<Ƣ}Kiu<Ƣ=9-<ƢO`+=ƢX5|<ƢTQ<Ƣ W=<ƢP M2=eC<Ƣ R5>D0M> <ף< zz>Q;ף<&7>ɱ;ף<K>e;ף<'}N>M9ף<K>ף<7>˻ף<zz>ѻף<~HY>L ףQףD<ף< 90M> <ף zz>W;ף&7>ɱ;ףK>k;ף'}N>9ףK>}ף7>˻ףzz>ѻף~HY>H ףG X(>QףW m.=Fף W=ף wۼף" U}ףtS`+ףz9 ףAOi$ӼףňSף,썁XƸףQ fףiף/;ףbVX<ףڇzňn<ף}Kiv<ף=9.<ףO`+=ףX6|<ףTQ<ף W=<ףP M2=fC<ףm J5>D<ף 9zz>; ~HY> < 7>ɱ; K>0; '}N>9 K> 7>,˻ zz>ѻ ~HY> G X(>UQ W m.=E W=¹ wZۼ " U} tS`* z9ڿ AOi Ӽ ň! ,썁Xc Q e ni ; bVX< ڇzň< }Ki< =9`< O`++= Xh|< SHQ<  W=< P M2=C< 7(>D< u czz>;~HY> <67>ɱ;K>1;'}N>$9K>7>+˻zz>ѻ~HY> G X(>TQW m.=E W=¹ wZۼ" U}tS`*z9ڿ켞AOi Ӽň!,썁XbQ eli;bV X<ڇzň<}Ki<=9`<O`++=Xh|D< mzz>;ɠ~HY> <ɠ67>ɱ;ɠK>2;ɠ'}N><9ɠK>ɠ7>*˻ɠzz>ѻɠ~HY> ɠG X(>SQɠW m.=Eɠ W=¹ɠ wZۼɠ" U}ɠtS`*ɠz9ڿɠAOi Ӽɠň!ɠ,썁XaɠQ eɠiiɠ;ɠbV!X<ɠڇzň<ɠ}Ki<ɠ=9`<ɠO`++=ɠXh|<ɠSHQ<ɠ W=<ɠP M2=C<ɠv-(>D<ɠ mzz> ;~HY> <67>ɱ;K>4;'}N>W9K>7>(˻zz>ѻ~HY> G X(>RQW m.=E W=¹ wZۼ" U}tS`*z9ڿ켮AOi Ӽň!,썁X`Q efi;bV"X<ڇzň<}Ki<=9`<O`++=Xh|<THQ< W=<P M2=C<v-(>D< mzz>$; <ɱ;8;9ѻ PQD< +;I7>ɱ;IK>?;I'}N>9IK>I7>˻Izz>ѻI~HY> IG X(>MQIW m.=EI W=I wXۼI" U}ItS`*Iz9ؿIAOi ӼIňI,썁X[IQ eIQiI;IbV'XDD< m2=C<v- W=<P MLQ<l|<TO`-+=X9d<Ki<=ň<}V*X<ڇz;bEi eXXQň,썁Oi Ӽ9ֿ켤AS`*z}tVۼ" UW= w.=E (>JQW m~HY> G Xzz>ѻ7>˻K>N>`9K>D;'}7>ɱ;~HY> <6zz>0;(>D<2y m2=C<2yv- W=<2yP MMQ<2ym|<2ySO`-+=2yX9e<2yKi<2y=ň<2y}V,X<2yڇz ;2yb;i2y e2yXV2yQň2y,썁Oi Ӽ2y9տ2yAS`*2yz}2ytUۼ2y" UW=2y w.=E2y (>HQ2yW m~HY> 2yG Xzz>ѻ2y7>˻2yK>2yN>92yK>H;2y'}7>ɱ;2y~HY> <2y6zz>4;2y(>D<ɳ m2=C<ɳv- W=<ɳP MNQ<ɳn|<ɳSO`.+=ɳX9f<ɳKi<ɳ=ň<ɳ}V-X<ɳڇz;ɳb9iɳ eɳXTɳQňɳ,썁Oi Ӽɳ9ԿɳAS`*ɳz}ɳtTۼɳ" UW=ɳ w.=Eɳ (>GQɳW m~HY> ɳG Xzz>ѻɳ7>˻ɳK>ɳN>9ɳK>J;ɳ'}7>ɱ;ɳ~HY> <ɳ6zz>6;ɳ(>DFQBW m~HY> BG Xzz>ѻB7>˻BK>BN>9BK>L;B'}7>ɱ;B~HY> 8;B(>D<յ m2=C<յv- W=<յP MOQ<յo|<յSO`.+=յX9g<յKi<յ=ň<յ}V.X<յڇz;յb3iյ eյXTյQňյ,썁Oi Ӽյ9ӿյAS`*յz}յtSۼյ" UW=յ w.=Eյ (>FQյW m~HY> յG Xzz>ѻյ7>˻յK>յN>9յK>M;յ'}7>ɱ;յ~HY> <յ6zz>8;յ~HY> D8QYȿ s~HY> Yȿz ]zz>ѻYȿ$R7>˻Yȿ+K>Yȿ3 N>9YȿK}K>h;YȿQ}7>ʱ;Yȿ!zz>S;YȿlF> <пLC>D<п, G]=C<п~a2C=<п)vrYQ<п=y|<пs(z3+=пQ*q<пR'W<п4P{<п|IAX<пE؞xۜ5;пn\Qkliп0ܜ}eпyIAпۅT{пp'W Ӽп#*ɿ켐пRQz*п&3}п%ErIۼп e2C=п ]=Eп C>3QпK ClF> п" rj>ѻпn>˻п%U>wп  ><9п\uU>r;п|R>ʱ;п5j>];пZ[ >D<(o׿0:3> <(o׿ P׺=C<(o׿~yM.=<(o׿)~7.[Q<(o׿dp{|<(o׿@۽4+=(o׿ds<(o׿W%D<(o׿6~nc0e<(o׿A{&5}FX<(o׿uon>;(o׿ѮdVi(o׿Βnxe(o׿L7}<(o׿Jg0e(o׿,ۂ%D Ӽ(o׿Ehǿ(o׿Wj۽*(o׿dp}(o׿.nr.Gۼ(o׿ }jM.=(o׿) 5L׺=E(o׿,Հ[ >.Q(o׿ :3> (o׿D 7T>~ѻ(o׿ Y8m>˻(o׿%4e"W|>n(o׿\#i\>9(o׿ m"W|>{;(o׿z{UY8m>ʱ;(o׿XTT>f;(o׿t2> <ݿ & 44=D<ݿm~C=C<ݿ}y5=<ݿe)~6/]Q<ݿS}|<ݿe65+=ݿ,u<ݿ~Ƭ)<ݿ|VF<ݿx\*[JX<ݿL&q;L(hF;ݿvNkPliݿ}N(hteݿ j^*[8ݿdZF ݿIȬ) ӼݿMKſ켁ݿ~6*ݿe耓S}ݿ(DbEۼݿ 3l5=ݿ.UKB=EݿFuR44=*Qݿ @p2> ݿ) :^5>vѻݿTFbJ>˻ݿj<RW>fݿ$@`>M9ݿ`\RW>;ݿy$bJ>ʱ;ݿt^5>n;ݿ=5<ῑ}O>;U ~t=flp<`}<,<N}[<% !;ږ<gU<Zf<~Xب<O{;-4<uf?e-<῀mkJ;fFFĮN#;῱UJ{A)?ALῂ_;-ǘwZרῚ(f܁AU9Ѽ&ÿ;мῌݯῠ X<Ǘt=[ǁ%='=r> m9>駻῜a."/><Sm:>5'$K7.B>X9BRSm:>;uw2."/>;;Ὲ9>0; Mjt=W;M }6aJ=<F| O=o<\u{ͳ忍M}>;/z"͔)">998@H>;Vsg >A;忪a =;~=}R;sn /{Nai=;sNx=uQ4Ĺ|~%৽V;Y+تPYg৽dYo'⠆Y鿓̐/Ym'{ SYxNPLwlY"*YG!FĹ}Y5nO[Yg d;_=Y ñdnK/1?p)dxq`=Q/1?a(:=n/1? f( =ބѻ/1? fn%x̐"Ĺ{~?;:?K>;:?Vs0">ٚ9:?8@n>1:?z"͔< >:?M` =娻:?Ҁ t=Z:? ȂaJ=(:?huO= \:?a5ͳ<:?)҂?:? 4tѼ:?61l/Ҽ:? :?J$-:?ch$ ׌:?&幍3o+M:?bFAa"(:?_q^f%=:?Ծvm@a";:?8bo ,<:?5z_I <:?Bjnl8*<:?[w+('<:?J{iן<:?}A,tW<:?b~'˛<:? },ͳ<<:?V|O=|o<:?\u{*aJ=<:?F|t=;:?M }9>;^`? M ."/>M9;^`?Sm:>j;^`?uw#.B>P49^`?BRbSm:>7^`?'$K+."/>y^`?> 9>맻^`?a>^`? m=!'^`?=t=ɣ[^`?ǁ <=ȗ^`? Qޯ^`?  ÿ;м^`?] UѼ^`?&C콷f^`?܁Zdب^`?E;-V^`?w="?`L^`?_ 2J ^`?AKN;^`?`Jl;^`?fFF;^`?U ~ =4<^`?}^5>;;`?bJ>DZ;`?tYRW>P~;`?y@`> 9`?`SRW>`?$h bJ> ˻`?j^5>ѻ`?TF[2> `?) 44=DQ`? @ B=JF`?Fu l5=:`?.U bۼ`?  S~`?( 64+`?emR`?~vȬ)jӼ`?MKZF`?I+^*[R`?dL%N(hf`? j<Pl+i`?}hRL(h;`?vNA\*[0X<`?L&q'VF(<`?xƬ)0<`?|<`?~v6*=`?,S{<`?e? /P<`?| y5=p<`?e)~ C= C<`?}x 44=D<`?m~= 2> <`? & T>C;iF?Y8m>DZ;iF?X"W|>X~;iF?z{\>9iF? mC"W|>iF?\#憗Y8m>˻iF?%4T>ѻiF? b:3> iF?D [ >@QiF? VL׺=HFiF?,Հ,jM.=8iF?) r.ۼiF? }dp~iF?.۽4+iF?FhPiF?WjU%DhӼiF?Eg0eiF?,ۂc 7}NiF?JnfiF?L_*iiF?ΒyAn;iF?ѮdV@05}4X DL;?Z=>DZ;?5lU>a~;?|  >29?\u3U>? .>˻?%Fj>ѻ?nlF> ?" rC>D W;?7>ȱ;?!1K>l~;?Q}UN>9?K}(K>}?3 y7>˻?+zz>ѻ?$~HY> ?z ]^(>7Q? s=.=CF? W=3? }ۼ?T Y}?!S`1+?f]9K켚?DOicӼ?qň?뫁XE?vަ f? i?f /;?``V=X D k;յ?~HY> <յ?67>ȱ;յ?K>~;յ?'}N>9յ?K>iյ?7>˻յ?zz>yѻյ?~HY> յ?G X(>,Qյ?W m.=>Fյ? W=.յ? wۼյ?" U}յ?tS`/+յ?z9Fյ?AOi^Ӽյ?ňյ?,썁X:յ?Q vfյ?iյ?C;յ?bVHX<յ?ڇzň4<յ?}Ki<<յ?=9<յ?O`*=յ?X{<յ?SP<յ? W=|<յ?P M2=,C<յ?v-(>D<յ? mzz>n;j?~HY> ȱ;j?K>~;j?'}N>.9j?K>fj?7>˻j?zz>vѻj?~HY> j?G X(>+Qj?W m.=>Fj? W=.j? wۼj?" U}j?tS`/+j?z9Fj?AOi^Ӽj?ňj?,썁X9j?Q ufj?ij?F;j?bVIXDo;ʳ?~HY> <ʳ?67>ȱ;ʳ?K>~;ʳ?'}N>D9ʳ?K>eʳ?7>˻ʳ?zz>wѻʳ?~HY> ʳ?G X(>+Qʳ?W m.=>Fʳ? W=.ʳ? wۼʳ?" U}ʳ?tS`/+ʳ?z9Fʳ?AOi^Ӽʳ?ňʳ?,썁X8ʳ?Q ufʳ?iʳ?G;ʳ?bVIX<ʳ?ڇzň4<ʳ?}Ki<<ʳ?=9<ʳ?O`*=ʳ?X{<ʳ?SP<ʳ? W=|<ʳ?P M2=,C<ʳ?v-(>D<ʳ? mzz>p;Zy?~HY> ȱ;Zy?K>~;Zy?'}N>b9Zy?K>dZy?7>˻Zy?zz>vѻZy?~HY> Zy?G X(>*QZy?W m.=>FZy? W=.Zy? wۼZy?" U}Zy?tS`/+Zy?z9FZy?AOi^ӼZy?ňZy?,썁X8Zy?Q tfZy?iZy?H;Zy?bVJXDt;?~HY> <?67>$ȱ;?K>~;?'}N>9?K>`?7>˻?zz>rѻ?~HY> ?G X(>(Q?W m.==F? W=-? wۼ?" U}?tS`-+?z9E?AOi]Ӽ?ň?,썁X6?Q rf?i?L;?bVLX<?ڇzň5<?}Ki=<?=9<?O`*=?X{<?TP<? W=}<?P M2=-C<?v-(>D<? m(>D<J? m2=.C<J?v- W=~<J?P MP<J?{<J?TO`*=J?X9<J?Ki><J?=ň6<J?}VOX<J?ڇzT;J?biJ? ofJ?X3J?QňJ?,썁Oi\ӼJ?9DJ?AS`-+J?z}J?tۼJ?" UW=,J? w.=%QJ?W m~HY> J?G Xzz>jѻJ?7>˻J?K>XJ?N>9J?K>~;J?'}7>,ȱ;J?zz>|;J?~HY> <J?6(>"D"Qdw?W m~HY> dw?G Xzz>eѻdw?7>˻dw?K>Sdw?N>j9dw?K>~;dw?'}7>1ȱ;dw?~HY> ;dw?(>%D<? m2=1C<?v- W=<?P MP<?|<?TO`*=?X9<?KiA<?=ň9<?}VUX<?ڇz];?bi? if?X-?Qň?,썁OiYӼ?9A?AS`,+?z}?tۼ?" UW=)? w.=9F? (>Q?W m~HY> ?G Xzz>aѻ?7>˻?K>O?N>9?K>~;?'}7>5ȱ;?~HY> <?6zz>;?(>%D<ʠ? m2=2C<ʠ?v- W=<ʠ?P MP<ʠ?|<ʠ?SO`*=ʠ?X9<ʠ?KiB<ʠ?=ň:<ʠ?}VUX<ʠ?ڇz_;ʠ?biʠ? ifʠ?X-ʠ?Qňʠ?,썁OiXӼʠ?9@ʠ?AS`,+ʠ?z}ʠ?tۼʠ?" UW=(ʠ? w.=8Fʠ? (>Qʠ?W m~HY> ʠ?G Xzz>_ѻʠ?7>˻ʠ?K>Mʠ?N>9ʠ?K>~;ʠ?'}7>7ȱ;ʠ?~HY> <ʠ?6zz>;ʠ?(>&D<ƞ? m2=3C<ƞ?v- W=<ƞ?P MP<ƞ?|<ƞ?SO`*=ƞ?X9<ƞ?KiC<ƞ?=ň;<ƞ?}VVX<ƞ?ڇza;ƞ?biƞ? hfƞ?X,ƞ?Qňƞ?,썁OiWӼƞ?9?ƞ?AS`,+ƞ?z}ƞ?tۼƞ?" UW='ƞ? w.=7Fƞ? (>Qƞ?W m~HY> ƞ?G Xzz>]ѻƞ?7>˻ƞ?K>Kƞ?N>9ƞ?K>~;ƞ?'}7>9ȱ;ƞ?~HY> <ƞ?6zz>;ƞ?(>&D:ȱ;H?~HY> ;H?DATA,hDȈDDATAЌȈD6 ######### # # # # # # # # # # ####### ## ## ## ## ##############!# !# # "#"#"#####$#$#$%#%#%&#&#&'#'#!'#!(#()# )#)*#"*#*+##+#+,#$,#,-#%-#-.#&.#./#'/#(/#(0#01#)1#12#*2#23#+3#34#,4#45#-5#56#.6#67#/7#07#08#89#19#9:#2:#:;#3;#;<#4<#<=#5=#=>#6>#>?#7?#8?#8@!?@!>@!=@!<@!;@!:@!9@!B#AB!A#C#BC!D#CD!E#DE!F#EF!G#FG!H#GH#AH#BJ#IJ#AI#CK#JK#DL#KL#EM#LM#FN#MN#GO#NO#HP#OP#IP#JQ#QR#IR#KS#QS#LT#ST#MU#TU#NV#UV#OW#VW#PX#WX#RX#QZ#YZ#RY#S[#Z[#T\#[\#U]#\]#V^#]^#W_#^_#X`#_`#Y`#Ya!`a!_a!^a!]a!\a![a!Za!bi!bh!bg!bf!be!bd!bc!bj!cj#cd#ck#de#dl#ef#em#fg#fn#gh#go#hi#hp#jq#ij#ir#kq#kl#ks#lm#lt#mn#mu#no#nv#op#ow#pr#px#qz#qr#ry#sz#st#s{#tu#t|#uv#u}#vw#v~#wx#w#xy#x#z#yz#y#{#{|#{#|}!|#}~!}#~!~#!#!##!#!!!!!!!!################################################################################################################!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!##!!##!#!#! # ! #  ! #  ! !  ! !  !! !#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!! # !!! !!"!!"!##"#!##$!$%!%#&#$&!'#&'!(#'(! )#()! *#)*! +#*+! ,!+,! -!,-!.!-.!/#./!0!/0!1#01!2#12!3!23!4!34!5#45!6#56!7#67!8#78!9#89!:#9:!;#:;!<#;<!=!<=!>#=>!?!>?! @#?@!!A!@A!"B!AB!#C!BC!%C!$D!DE!%E!&F#DF!'G#FG!(H#GH!)I#HI!*J#IJ!+K#JK!,L!KL!-M!LM!.N!MN!/O#NO!0P!OP!1Q#PQ!2R#QR!3S!RS!4T!ST!5U#TU!6V#UV!7W#VW!8X#WX!9Y#XY!:Z#YZ!;[#Z[!<\#[\!=]!\]!>^#]^!?_!^_!@`#_`!Aa!`a!Bb!ab!Cc#bc!Ec!Dd!de!Ee!Ff#df!Gg#fg!Hh#gh!Ii#hi!Jj#ij!Kk#jk!Ll!kl!Mm!lm!Nn!mn!Oo#no!Pp!op!Qq#pq!Rr#qr!Ss!rs!Tt!st!Uu#tu!Vv#uv!Ww#vw!Xx#wx!Yy#xy!Zz#yz![{#z{!\|#{|!]}!|}!^~#}~!_!~!`#!a!!b!!c#!e!d!!e!f#!g#!h#!i#!j#!k#!l!!m!!n!!o#!p!!q#!r#!s!!t!!u#!v#!w#!x#!y#!z#!{#!|#!}!!~#!!!#!!!!!#!!!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!#!!!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!#!!!!#!!!!!#!!! #! !! #! #! #!#!#!#!#!#!!!!!#!#!!!#!!!!!!!#!#!#!#! #!!#"!!#!"!!$#!%!!&!!'# !(!  ! )#  ! *!  ! +#  ! ,# ! -#!.#!/#!0#!1#!2#!3!!4!!5#!6#!7!!8#!9!!:!!;!!<#!=#!># !?# !! @#!#!!A#"B!"#!#C!$B!$%!$D#%&!%E!&'!&F!'(!'G#()!(H!)*!)I#*+!*J!+,!+K#,-!,L#-.!-M#./!.N#/0!/O#01!0P#12!1Q#23!2R#34!3S!45!4T!56!5U#67!6V#78!7W!89!8X#9:!9Y!:;!:Z!;<!;[!<=!<\#=>!=]#>?!>^#?@!?_#@A!@`#AC!Aa#Bb!BC!Cc!Db!DE!Dd#EF!Ee!FG!Ff!GH!Gg#HI!Hh!IJ!Ii#JK!Jj!KL!Kk#LM!Ll#MN!Mm#NO!Nn#OP!Oo#PQ!Pp#QR!Qq#RS!Rr#ST!Ss!TU!Tt!UV!Uu#VW!Vv#WX!Ww!XY!Xx#YZ!Yy!Z[!Zz![\![{!\]!\|#]^!]}#^_!^~#_`!_#`a!`#ac!a#b!bc!c!d!de!ef!fg!gh!hi!ij!jk!kl!lm!mn!no!op!pq!qr!rs!st!tu!uv!vw!wx!xy!yz!z{!{|!|}!}~!~!!!!!!!######!!!#!##!!########!#!#!!#!!d#e!!f!!g#!h!!i#!j!!k#!l##m##n##o##p##q##r##s!!t!!u#!v#!w!!x#!y!!z!!{!!|#!}#!~#!#####!!!!!!#!!!!#!!!#!!!#!#!#!#!#####!#!#!!!#!#!!!#!!!!!!!#!#!#!#####!!!!!!#!!!!#!!!#!!!#!###############!!!#!#!!!#!!!!!!!#!#!#!#####!!!!!##!#!###!###!###################!#####!#####!#!####!#######!!##!!#!#!### ! # #  # !  # #  # #  ## ##########!##!#####!#####!##!#!#!#! # #!# !#"#!"##!"#!#!$!$%#%#&#%&#'#&'#(#'(# )!()# *#)*# +!*+# ,#+,# -#,-#.#-.#/#./#0#/0#1#01#2#12#3#23#4#34#5!45#6#56#7#67#8!78#9#89#:#9:#;#:;#<#;<#=#<=#>#=>#?#>?# @#?@#!A#@A#"B#AB!#C!BC#$C#$D!DE!%E#&F!EF!'G!FG!(H#GH#)I!HI#*J#IJ#+K!JK#,L#KL!-M#LM#.N#MN#/O#NO#0P#OP#1Q#PQ#2R#QR#3S#RS#4T#ST!5U!TU!6V#UV#7W#VW#8X!WX#9Y#XY#:Z#YZ!;[!Z[!<\#[\#=]#\]!>^#]^!?_#^_#@`#_`#Aa#`a#Bb#ab#Cc#bc!Dc!Dd!de#Ee#Ff#ef#Gg#fg#Hh#gh#Ii!hi#Jj#ij#Kk#jk#Ll#kl#Mm#lm#Nn#mn#Oo#no#Pp#op#Qq#pq#Rr#qr#Ss#rs#Tt#st#Uu#tu#Vv#uv#Ww#vw#Xx#wx#Yy#xy#Zz#yz#[{#z{#\|#{|#]}#|}#^~#}~#_#~#`##a##b##c##d#######################################################!########!!!#########!#!###!!!####!####!!!###############!##!###!##!!!!#!!##!!####################!#####!###################!###!########!!!!######!#! #! #! ## !# ####!#####!##!################!###!### !#!!"#!#!###$!!%##&##'# #(#  ! )#  # *#  # +!  # ,! # -##.##/!#0##1##2!#3##4##5##6##7##8##9##:##;##<!#=##>! #?# !# @!!"#!A!"C#"###B!$B!$%!$D!%&!%E#&'#&F#'(#'G#()!(H#)*!)I#*+!*J#+,!+K!,-!,L!-.!-M!./!.N#/0!/O!01!0P#12!1Q#23!2R!34!3S#45#4T#56#5U#67#6V#78#7W#89#8X#9:#9Y#:;#:Z#;<!;[#<=!<\!=>!=]#>?!>^!?@!?_#@A!@`!AC!Aa!Cb#BC!Bc!Dc!DE!Dd!EF!Ee#FG#Ff#GH#Gg#HI!Hh#IJ!Ii#JK!Jj#KL!Kk!LM!Ll!MN!Mm!NO!Nn#OP!Oo!PQ!Pp#QR!Qq#RS!Rr!ST!Ss#TU!Tt#UV!Uu#VW#Vv#WX#Ww#XY!Xx#YZ!Yy#Z[!Zz#[\![{#\]!\|!]^!]}#^_!^~!_`!_#`a!`!ab!a!b#bc!c!d!de!d!ef!e#fg#f#gh#g#hi!h#ij!i#jk!j#kl!k!lm!l!mn!m!no!n#op!o!pq!p#qr!q#rs!r!st!s!tu#t#uv#u#vw#v#wx#w#xy#x#yz#y#z{#z#{|!{#|}!|!}~!}#~!~!!#!!!!#!!#$#"%!!&! '#(!)#*!+#,#-#.#/#0#1#2#3!4!5#6#7!8#9! :! ;! <# =# >#?#@#A#C!B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!#!!!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!#!!!!!#!#!#!#!#!#!!!!!!!#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!!#!!!!!#!!!!!#!#!#! # ! #  ! #  ! !  ! !  !! !#!!!#!#!!!!!#!#!#!#!#!#!#!#!!!#!!! # !!! !!"!!"!##"#!#!$C!$%!$D#%&!%E!&'!&F!'(!'G#()!(H!)*!)I#*+!*J!+,!+K#,-!,L#-.!-M#./!.N#/0!/O#01!0P#12!1Q#23!2R#34!3S!45!4T!56!5U#67!6V#78!7W!89!8X#9:!9Y!:;!:Z!;<!;[!<=!<\#=>!=]#>?!>^#?@!?_#@A!@`#AB!Aa#Cb!BC!Bc!Db!DE!Dd#EF!Ee!FG!Ff!GH!Gg#HI!Hh!IJ!Ii#JK!Jj!KL!Kk#LM!Ll#MN!Mm#NO!Nn#OP!Oo#PQ!Pp#QR!Qq#RS!Rr#ST!Ss!TU!Tt!UV!Uu#VW!Vv#WX!Ww!XY!Xx#YZ!Yy!Z[!Zz![\![{!\]!\|#]^!]}#^_!^~#_`!_#`a!`#ac!a#b!bc!c!d!de!d#ef!e!fg!f!gh!g#hi!h!ij!i#jk!j!kl!k#lm!l#mn!m#no!n#op!o#pq!p#qr!q#rs!r#st!s!tu!t!uv!u#vw!v#wx!w!xy!x#yz!y!z{!z!{|!{!|}!|#}~!}#~!~#!#!#!#!!!!!#!!!!!#!!!#!!!#!#!#!#!#!#!#!#!!!!!#!#!!!#!!!!!!!#!#!#!#!#!#!!!!!#!!!!!#!!!#!!!#!#!#!#!#!#!#!#!!!!!#!#!!!#!!!!!!!#!#!#!#!#!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#######!!!#!##!!########!#!#!!!!!!!!!!!!!!!!!!~!d}!e|!f{!gz!hy!ix!jw!kv!lu!mt!ns!or!DATA,E(EDATAXu(E5            !  ""##$$%%&&''! !()" )*#"*+$#+,%$,-&%-.'&./!'/()(01*)12+*23,+34-,45.-56/.67(/701089219:32:;43;<54<=65=>76>?07?898@:9@;:@<;@=<@>=@?>@8?@BACBDCEDFEGFHGAHABJIBCKJCDLKDEMLEFNMFGONGHPOHAIPIJQRJKSQKLTSLMUTMNVUNOWVOPXWPIRXRQZYQS[ZST\[TU]\UV^]VW_^WX`_XRY`YZaZ[a[\a\]a]^a^_a_`a`Yacbjdbcebdfbegbfhbgibhjbikcjqldckmedlnfemogfnphgorihpqjirskqztlksumltvnmuwonvxpowyrpxzqry{sz|ts{}ut|~vu}wv~xwyxzy{|{}|~}~           ! "!#"#$%&$'&(' )(  *)  +*  ,+  -, .-/.0/102132435465768798:9;:<;=<>=?> @? !A@!"BA"#CB%C#%$DE$&FD&'GF'(HG()IH)*JI*+KJ+,LK,-ML-.NM./ON/0PO01QP12RQ23SR34TS45UT56VU67WV78XW89YX9:ZY:;[Z;<\[<=]\=>^]>?_^?@`_@Aa`ABbaBCcb%EcCEDdeDFfdFGgfGHhgHIihIJjiJKkjKLlkLMmlMNnmNOonOPpoPQqpQRrqRSsrSTtsTUutUVvuVWwvWXxwXYyxYZzyZ[{z[\|{\]}|]^~}^_~_``aabbcEeceddffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~e"           ! #!"#B$"%$&%'&(') (*  )+  *,  +-  ,. -/.0/102132435465768798:9;:<;=<>=?>@ ?A! @C#!AB"#CbD$BE%$DF&%EG'&FH('GI)(HJ*)IK+*JL,+KM-,LN.-MO/.NP0/OQ10PR21QS32RT43SU54TV65UW76VX87WY98XZ:9Y[;:Z\<;[]=<\^>=]_?>^`@?_aA@`cCAabBCcdDbeEDdfFEegGFfhHGgiIHhjJIikKJjlLKkmMLlnNMmoONnpPOoqQPprRQqsSRrtTSsuUTtvVUuwWVvxXWwyYXxzZYy{[Zz|\[{}]\|~^]}_^~`_a`cabcddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$%%&&''(()  )*  *+  +,  ,-  -..//00112233445566778899::;;<<==>>??@  @A!!AB""BC##C$%$DE%EF&&FG''GH((HI))IJ**JK++KL,,LM--MN..NO//OP00PQ11QR22RS33ST44TU55UV66VW77WX88XY99YZ::Z[;;[\<<\]==]^>>^_??_`@@`aAAabBBbcCCcD$EDdeEefFFfgGGghHHhiIIijJJjkKKklLLlmMMmnNNnoOOopPPpqQQqrRRrsSSstTTtuUUuvVVvwWWwxXXxyYYyzZZz{[[{|\\|}]]}~^^~__``aabbccdD#           ! "!"#$B#%$&%'&(')( *)  +*  ,+  -,  .- /.0/102132435465768798:9;:<;=<>=?>@? A@ !CA!"C"#BDcB$ED$%FE%&GF&'HG'(IH()JI)*KJ*+LK+,ML,-NM-.ON./PO/0QP01RQ12SR23TS34UT45VU56WV67XW78YX89ZY9:[Z:;\[;<]\<=^]=>_^>?`_?@a`@AbaACbCBcdcDedDEfeEFgfFGhgGHihHIjiIJkjJKlkKLmlLMnmMNonNOpoOPqpPQrqQRsrRStsSTutTUvuUVwvVWxwWXyxXYzyYZ{zZ[|{[\}|\]~}]^~^__``aabbcddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~           ! "!#"#BCAB@A?@ >?  =>  <=  ;<  :; 9:897867564534231201/0./-.,-+,*+)*() '( !&'!"%&"#$%C$#bD$CE%$DF&%EG'&FH('GI)(HJ*)IK+*JL,+KM-,LN.-MO/.NP0/OQ10PR21QS32RT43SU54TV65UW76VX87WY98XZ:9Y[;:Z\<;[]=<\^>=]_?>^`@?_aA@`cBAabCBcdDbeEDdfFEegGFfhHGgiIHhjJIikKJjlLKkmMLlnNMmoONnpPOoqQPprRQqsSRrtTSsuUTtvVUuwWVvxXWwyYXxzZYy{[Zz|\[{}]\|~^]}_^~`_a`cabcdedfegfhgihjikjlkmlnmonpoqprqsrtsutvuwvxwyxzy{z|{}|~}~~d~}d}|ee|{ff{zggzyhhyxiixwjjwvkkvullutmmtsnnsroorqpME E3pFCMECircle.002EkFEE8E@E @jF (-">lsm>L-">X?m>?DATAE>0>>>>DATA,8EEDATAxlE9:->>=)>Rs=:-> >V:->ٝ=֤'':->¤':-> V:->7$ᓽu:->1J޼8:->Bg)s=j:->G>QZ:->ELd>pC:->(I,>:->=>y:->^4^>NA>=De@$^>h,>^= EoZ:^>ƾL>`;>$Dc^> >JCVڽ^>U>#CD^>4v#C'^>&!JCڽ^>;&D^>Lp(eΣE>EQ(g^>3M>ENk^>vc>>1E/KM^>`VM`D͓^>8=<D(>>=G͙b?>!΍˄>$E/+>JcYq>32>bu>=(>-RAT>=7 ɔ+>߳.;B>k=b=ŏ_=;B>%><Ňq- ;B>ýٽqm;B>+0: ;B>.B>P]wa;B>*&3>9ŎDm;B>V`%=(>:{Am;B>.@n(ѕ|>=9 =0l|>=:e|>UȀ|>9ֽ=*|>[=JHI|>*q'=ѼZ]|>R6=н)ژ|>6н5ژ[=,}=dK$=3X-9[=cl=X=oS[=W$&I[= Z;\O [=րw<([=,9SX= LF[=VeAڐ=d[=)<4ڐ=d[=x==,6Z[=ԅR=>X=cI=jל?;B>=Ο >|>úL$q=};[=,x8=>s9<,< 5^>Ҧ(}S=Esi::->ur= E`A;SՇ34k» jj; j(L%]|>="=5LN|>^p==Ѽ*8Z]|>+c<="h|>3H= l|>U =h|>WϽ:|>mq |>v̵ s|>鶕=nqeF |>i=ҵ Ws|>*2==Cg$|>J= :y={[y;;B>޳f;B>Pm=( +ѕ;B>+=K=mxOvQ;B>K՜=B>Pţ:wa;B>3[>1q;B>UϽ(L=᫼L;B> hU=5,;B>LglƋ;B>DFK;B>IZ=ٽƏHm;B>)e=NƺZK;B>s>gluh;B>E>0p ;B> > U=ZkF&>l7 lԉ>D=_f> νrD="+>JΥ Vq>Ulf> Cd>+T>XO>J&:u=ӓ->+/F<8̄~ >kz.X)ͼ˫>{, ؽģ'>X\轠h0e,>h=h/ʛI-> >ؽ;\(> >0΍{j>M.> *ͼTs>U/>F<6{t~ >v%>ސu=zni'^>h줽<DHה^>O=.>sEj7"\^>8e=E>E'g^>tٽ.>tE!\^>J#>E]H^>RA=}E)^>{K,nD-^>eUK>-lDj:->5%#c:->=%c:->[=Y>C:->\H=,>`:->33>:->(3B< |:-> $>@ᓽ:->1>K޼8:->2>B<|:->>=_=,:->ܽU >|>‹A=;V<ؼ =3uL3 ,<-2b'>%eؽ` > a\^>_Y(!>DT;B>5B=ӹY[=9Tl=:"R]>Xej8`>XX-jX%_>zaXik:ו^> X eTb@̵\>1WIZ>+WٽmKZ> Xe>/*c[>`X1l\>X9 ~]>7YhfԠ_>~QY*^$pd>V"{|He>i0W'|d>acV“d|Qac>(U:4|b> rU|]yE]ja>)TV6>u $(_>ϐTp 9^>L/T"l \>]S*ofZ>3ShXS*%X>lWShU>#S?]l)vU>1/T8U>T4|V>T68lW> pUHX>^U4O)B":Z>RV`*,\>ŹVh-N^>zWu ύ,_>oW .Ba>W[18c>WH%5@Z=-e>nWR y9ע"q>CҾ p>^DѾy!up>ΪDоVC>m>DnϾeaEk>ȣD'о(ON,>h>DDpѾ)"?nxe>kCRӾ6;73b>CȢվ3^>FBVؾ+'4Z>sA1۾m 3P@E޾8*qcT>|?v~(f >`R>I>p価zP>=P>Z=WkO>j;hp Q>։;<' U>[;P z8RQX>;_Ia/p `[>;o,]'ӧ^>j=Vbn`e>=羉rYh>>vk>?gzV l>=@޾}Gn>Aھ}vp>_9Cվ~,Xo>?sBҼ׾}(s>*?-ɺ} t>+.~9pr>7,(Z}2p>+\P¾} n>K)XMƾz |k>s((ʾvg>';r7c>&оmn _>*&TӾ]h#[>yq% վQ^)$|$X>(%L׾J1+T>i$ ؾ;r3R>a$ ؾ͸7M P>% M׾D"N>Rq%վ 5-N>& Ӿ%0,%_N>&оoVXO>N';ӁQ>#(()ʾ}vS>:)^ƾoP!BV>+ ¾%+8[>,t羾Te޿4`_>. -`5c>- Iڐ݉55g>.T|k+9gk>Pi/8J͚TջAfn>/|T!q>N 0bb}s>,0尾2^rsu>/ݲ{ayu>.Nx>u혾B x>3{1}1{u>Y{x4b$RѯpeRp>y'lhsFVl> šCi>Gu+:d>hԐjl6م`>\di <6a.[>fQУNߠ5V>(fԧdg,R>Yel^H"55P>#pbSN> Ё:AM>vmA9 M>,".M>H缾>R.O>?s$ sQ>^^YO=(W>ǛJ,3[>s(缾S^*S7`>+`_hv$jd>Bpnh>9 rJ m>`"vvp>,꫾zr>={} Kt> ~76~Z nw>Л~ 9v>[O}  9v>r䵅}+ nw>u+7~ Kt>xR~ r>#򍾽} vp>PzZ~ m>.Ĉv(h>G]qrjd>Ypn S7`>,+_h9%[>MS^b+&(W>d줾J4aiT>Wf𾂿O> sQ>Df𾣿9#<חR.O>/w줾>~%M>e$N9 M>*!0AM>m bSN>trЁ55P>J.򉖾P#R>ckg"V>g:$-a.[>%L7Ny6م`>8~ 7d>@=}ԐZ7i>u8;l>i{šuDRp>MwgWχXnCvLJh1{u>~uy4f x>z{^Nx>aJd~= v>ؾdO_7 u>,ھ,K{5Zs>X۾G3V\j=q>5۾hHʂjn>ھ.fItZk>4پ(LɚkEg>ɖؾ-Qy:;\c>־Vؐ08ݡ_>w վ{]U8/Z> ӾD|dR37=V>о l-R>PξsmKd#GP>NR̬̾{'N>2ʾʃс_-LM>IȾ҄n MM>ƾv#OM>bžىwPO>сľX_A-' sQ>ľ &<[,ľ%@^ǑW>ľ_JG5ͦQ[>7cž؉R^e,W_> ƾ^h&vz|c>-JȾ҄onm!g>b3ʾĂrH~k>R̾{v n>ξҹszXp>оk} _XӾ,Yc} 0u>\׾nU~  t>vվ\}T Jp>-q>kiH'unKo>q襾3Rn>zڣ~;~%l>ȡ9By|%ii>FɟT&IHxf>CXO8sHnb>D,VUm$z{^>ٚ?ZRe%1O[>^X90Y X>^`C<!U>:bIJ/P>3p`GFO>z^*GO>vٚL@Z"CO>3DWUQ #P>$O[Q>ȟD(I܀\ S>㿡8YB>\QV>h;kp߯Z>*X4}*_>bbD..fb> )=2f>Z{Z$i;i> 䡧H@l>pPιR\dln>ĬT.q ;q_q>tCrҤbf]r>7ݫOxn9;r>~Ǫ#|/p>nm|KM^ՉKk>}ܽE^f>~4ڽ$g?l}Ga>~P%ٽu0p[>~4ڽ^lV>}ܽ b1Q>pm|K1,SM>zO罶l!DJ>Zxȣg5u{G>r)vDOTڽ'E>sl }U[E>p ]NE>pnx pq{G>yk ゼ!J> i`0(8M>sftEa#|-Q>5eT?14V>cd >9[>M cx5݇HrzGa>bJvf>M cx fHk>cd6>Ğp>5eTM04#u>sfta^(ݳ~x> i`0vk9{>yk u;I|>onx {s&3}>p"4I|>sn HGx{>q)vH|Yu>zO罝m-*8~x>Zxȣ.wj%p> T>G*\k>N 60hff>/0^(.n[>/0N 6hf1Q> H>*\M> H KaNJ>o*Yrܕ=u{G>gjk*E>"8|wU[E>hE> _$w| aq{G>"7}J>FN#kM>,詽@--Q>믽65֣V> d ;[>n彔$>IzGa>j佀?'f>n彔$>Ik> d0 ;p>믽G65֣u>,詽Z@-~x>FNlj#k{>"7@v}I|> _$}| `3}>hI|> "@|}{>gj@vk*u> H KZaN~x>o*Yljrܕ=p>tB[G*\k>;C♽0hff>1Dd"D4n[>1Dd"ϾC♽hf1Q>tB[*\M> @^aNJ>q>rܕ=u{G>09"wU[E>6pƽE>4нw| aq{G>1pٽ}J>%/oὔ#kM>,@--Q>=+65֣V>)? ;[>e')>IzGa>(l?'f>e')>Ik>)?0 ;p>=+G65֣u>,轁Z@-~x>%/olj#k{>1pٽ@v}I|>4н}| `3}>6tƽI|>9 "}{>0q>ljrܕ=u> @^ZaNu>>(轁Zҟ~x>7>Nljrk{>>|ؽ@vI|>?>Ͻ}`3}>> >pƽI|>#>}| {>P&>@v}k*~x>(>lj#=u>|*>=Z@-aNp>,>:G65*\k>A->0 ;iff>.>r>lzGa>Q.>?n[>.>r>lV>A-> ;if-Q>,>:65*\M>|*>=@-aNJ>(>#=q{G>P&>}k*E>#>w| U[E>< >pƽE>?>Ͻw`u{G>>ؽJ>7>NὔrkM>>0ҟ1Q>]>֣V>:>Ę[>G>+>p'f>G>;>0Ęp>]>ܦG֣~x>'=sljrku>S=>ǩZҟ{>b=@vI|>=}`3}>s=I|>=`J|}| {>=4%j@v}k*~x>=0lYlj#=u>=JZ@-aNp>I=d>G65*\k>{= 50 ;iff>=u=K0>lzGa>=8o.?n[>=u=K0>lV>{= 5 ;if-Q>I=d>65*\M>=J@-aNJ>=0lY#=q{G>=4%j}k*E>=`J|w| U[E>q=E>=w`u{G>b=J>'=srkM>S=Fǩҟ1Q>ڽ=ʯ֣V>kF=CĘ[>=N&='f>=nF=C0Ęp>ڽ=ʯG֣~x>0S>.w1Iu>Q>m{>kU> |0I|>8X>Zh H}3}>'Z>4U I|>j]>{\>{>I`>Pu (~x>ͳb>Ђvkl'