BLENDER_V242REND 21SRt 㓐x @SRscreen 0 p 㖰 0 p p ?@DATA 0y pDATA py 㔰 0DATA 㔰y p@DATA y 0 㔰@DATA 0y p $DATA py 㕰 0@$DATA 㕰y pDATA y 0 㕰@DATA 0y p $DATA py 0DATA 㖰z p 㔰DATA z 0 㖰 0 DATA 0z p 0 0DATA pz 㗰 0 pDATA 㗰z p 0 pDATA z 0 㗰 p 㕰DATA 0z p 㔰 DATA pz 㘰 0 㕰 DATA 㘰z p 0 0DATA z 0 㘰 p 0DATA 0z p 㕰 pDATA pz 㙰 0 pDATA 㙰z p 0 pDATA z 0 㙰 p DATA 0z 0 㕰DATA p| 0 0 p d p pDATA ph p?333DCdzIDՅGDATA 㯰{ 㰀 MeshEditingF>DATA 㰀{ P 㯰CameraEditingF>DATA P{ 㰀OutputRender>DATA { PRenderRenderF>DATA { AnimRender>DATA { 㴐 FormatRender>DATA 㴐{ ` ScriptlinksScript>DATA `{ 0 㴐Anim settingsObject>DATA 0{ `DrawObject@>DATA { 0ConstraintsObject>DATA { 㸠 PreviewLamp>DATA 㸠{ p LampLampF>DATA p{ @ 㸠SpotLamp>DATA @{  pTexture and InputLamp>DATA { @Map ToLamp> @DATA { 㼰 PreviewMaterial>DATA 㼰{ 㽀 MaterialMaterialF>DATA 㽀{ P 㼰ShadersMaterial>DATA P{ 㽀TextureMaterial> @DATA { PPreviewWorld>DATA { WorldWorldF>DATA { Mist Stars PhysicsWorld>DATA { ` Texture and InputWorld>DATA `{ 0 Map ToWorld> DATA 0{ `PreviewTexture>DATA { 0TextureTextureF>DATA { Š ColorsTextureF> DATA Š{ p CloudsTexture>DATA p{ @ ŠMap InputMaterial> @DATA @{  pMap ToMaterial>DATA { @StucciTexture>DATA { ɰ Mirror TranspMaterial> 㽀DATA ɰ{ ʀ EffectsObject DATA ʀ{ P ɰShadow and SpotLamp>DATA P{ ʀMesh ToolsEditing>DATA { PMesh Tools 1Editing>DATA { Render LayersRender> PDATA h ?333 DChBo/D"ChCB(DC?? AL5DATAT j ?333 Save JPEG/Users/ton/Desktop/work/test233a/tex/cornelius.jpgball.jpgaoi.tgaoi.tgairl6.tga XDATA @| @ ` ` 㧠   L.L.DATA @| ְ @ 㨠 ?<>I?Vo?}}}  l @ 0I@I@DATAx @n ?333 @ p =DATA c @?333 @?3?3=-`_{?*??3?3-`?*?_|??<>I2;n?VԮ=0'??3/Q?C-a?*?_{??<>I?Vo??3?3=-`_{?*??55? B ?=C=-`*_{n =l DATA( g 0 ?333 @Cz A Cz A <# <# Fj`Dz OBDATA 0h 0 ?333 @DCdDvC@CB(DC??DATAT 0j 0?333 @{SAVE FILERY PICTURESE:\BJ\ighting_monkey.blend\rk-t4-packed.blend\01.blendked\night@3.blend\Object\TON_LIGHT_MONKEYON_LI~3.BLEmonkey.blendblend_obj2.blendend+drtd02DATA ְ| P @ ` ` = P=" o?{{{ | L`L` װ װDATA װ{Transform PropertiesView3d 4>DATA c ؀?333 ְ???>)nE¿ g????)n>E? g?= P=" o;1;'?A+$A7y)n>E? g?= P=" o????>)nE¿ g??A+$? B ??==C>)nE¿ g?z?/p ????DATA( ؀g  ?333 ְCz A Cz A <# <# Fj`Dz OBDATA h ؀?333 ְDCdDvC@CB(DC??DATAT j ?333 ְSave JPEGRY PICTURES/Users/ton/Desktop/ked.blend\01.blendked\night@3.blend\Object\shadow2onkey_cornelius_shadbuf.blend.BLEmonkey.blendblend_ DATA P| ְ 㨠 ` 㧠 ?<>I?o?}}} l($ P IIDATA Pl ?333 PCCX??l( ?DATA c P P?333 P?3?3=-`_{?*??3?3-`?*?_|??<>I3 hA;n?=0-u'??3?jC-a?*?_}??<>I?o??3?3=-`_{?*??55? B ?=C=-`*_{n =l DATA( Pg ߠ ?333 PCz A Cz A <# <# Fj`Dz OBDATA ߠh P?333 PDCdDvC@CB(DC??DATAT j ߠ?333 POpen ImageY PICTURES/Users/ton/Desktop/work/test233a/tex/acked.blend\01.blendked\night@3.blend\Object\cornelius.jpgEYON_LI~3.BLEmonkey.blendblend_obj2.blendend+drtd02 XSRt x @SRscreen.002 @  C DATA y DATA y @ DATA @y  DATA y @ DATA y DATA y @  DATA @y DATA y @ DATA y DATA y @  DATA @y DATA y @DATA z @DATA z @ DATA @z DATA z @ DATA z DATA z @ @DATA @z @ DATA z @ @ DATA z DATA z @ @ DATA @z DATA z @ DATA z DATA z @ @DATA @z @DATA z @ @ DATA z DATA z @ DATA @|   m l!m @ DATA @{ OutputRender>DATA { @RenderRender@>DATA { AnimRender>DATA { FormatRender>DATA h ?333DCdAͼDtA~CFcCB(DC??!mDATAT j ?3333SAVE TARGAD:\Projects\girl7.tga tDATA | @ @ @    !DATA | ` =8>iιo?   !`h DATA i ?333,BLApCj4d@sb`!!`A @FB=A DATA c ?333,????????=8>iιo?Afff@&D??Afff B ?<# CDATAT j ?333,SELECT PLUGINd:\library\seq_plugins\ANIMGLOW.DLL DATA `| @ =8>Ho?    D  ` @DATA `i ?333CzACzA1||1A @FB=A DATA c @ `?333????????=8>Ho?Afff@*??Afff B ?<# CDATAT @j ?333AVE TARGA/t1.blend9DATA | ` @ @=8>o?  DATA( g ?333,B?B?<# <# Fj`Dz SQB?DATA c  ?333,????????=8>o?Afff@ϒ??Afff B ?<# CDATAT j ?333,OAD FILE/9SC\ aSC1 X 8 f@U @8vf@U @8vf@U @8v= p12dd??< d@63_@=?fff=?fff 0 0@?????L?fff?@A //d:/quicktimeKot//#D IDATA V > DATA V 0 :/ DATA 0V F DATA V 0? DATA V " DATA V O DATA< p`Z ?:o ??<# DATA  DATA4 0[1 RenderLayerIM8 IMcornelius.jpg//tex/cornelius.jpgE.@pCAt CACamera.001>L=BA(Aq??LA ! LALamp.001>礊?)?n??cjAB>???B B4?@@???LA !  LALamp.003??swJ?b"??ABu>???mAB4?@@???LA ! LALamp??GU?,}D??ABR>???B B4?@@???IPP   IPAction.backbone   ABw?CACDATAT .   ABp>#UAC>DATAT  .   ABp#V<ACDATAT .    ABpz1AC1bDATAT  .  ABp?|?AC?}1DATA 'A=mAAuAzA UAuƊBuB FB;wBXB UB&;B-ĩ<B4=0LB::=BA>#BH>JBN;>)BUN=kB\#B>JB>B=@B#QnB>JB>B=SBB~1B1B1/B~1N.B0(Bm B~r|Br|B߰r|DATA 'A=g?A?Av?A?FA?~Av?~B?|bB ?|LB;?|6B?~JB ?~B&;? B-?B4?eB:;?BBA?|.BH?}BN;?}%BU?B\?OBb;?Bi?}JFBp?|LBv;?|RB}?~B?~B?B~?B?eB? B~?|B?}B?}&B}?B?OB?B}?}JFB?|LB?|RB~?~B?~B?B~?B?eB? B~?|sB?}B?}&B}?B?OB?B~?|LB?|LB߰?|LIPP   IPAction.backfin1  ABU7J?.zACDATAT  .  AB^FE61oAC 0+DATAT .   AB^FN0AC KDATAT .  AB^F<ٻAC -*DATAT .  AB^F?}=?:GAC ?DATA0 ' AzAAAE6B B00>B$K1oB/Q1mB;G1kyIBIVɬWHBT5B`,WHBn1mBzA1mB1mBHB~B(B:1mBlp1mB;1mBC,BbB%B1mBǸT1mB͇1mBԏB^FB?DATA0 ' AzAAA0B Bg$B$KNB/QB;GhBIV,,8BT5B`,8BnYBzAB±BH)JB~BMB:BlpB;BC,%BbBᘥBBǸTB͇BԏB^FB?DATA0 ' AzAAA<ٻB B'+B$% "B/QvB;G佹UBIVGBT5B`;EvBnQBzAP#4B˽NBE<:-B~BҼ:BBlpB;Ž;5BC BbB; BYBǸTvB͇oBԏB^FB?DATA0 ' Az?A?A?A?:GB ?B?B$K?}=B/Q?}UB;G?}ԩBIV??BT5?B`?Bn?}IBzA?}UB?}aBH?B~?B?B:?}UBlp?}UB;?}UBC,?Bb?B?B?}UBǸT?}UB͇?}UBԏ?B^F?B??IPP  IPAction.backfin2 ABU7J?.zACDATAT .  ABڨ.AC -U4DATAT .  ABڨ 0K[AC 03DATAT .  ABڨ<܋AC ^DATAT .  ABڨ?F?AC ?DATA0 ' AzAAAB BZ,sB".SB-=. B8>.BG6(cBRFB^㨢mBlP.;Bx. B8.BT%,B5JB,B1.B. Bk.&B"BB>Bt.B. Bͬ.!BGBڨBpDATA0 ' AzAAA B BZ/B"0B-=0B8>0K[BG6+6BRFB^㫉6BlP0סBx0B80BT( B5JB B10B0Bk0B%WBB>\Bt0B0Bͬ0BGBڨBpDATA0 ' AzAAA<܋B B[B"➽3B-=2<B8I2*dBG6;MnBRFB^MBl?FBG6?BRF?B^?BlP?Bx?B8?BT?B5J?B?B1?B?Bk?B?B?B>?Bt?B?Bͬ?BG?Bڨ?Bp?IPP  IPAction.bodyAB?t?ACIPP   IPAction.bodyfin1.left  ABw?CACDATAT .   ABi9:AC z9DATAT .    ABl=AC =gyDDATAT  .  AB?~^?AC ?\BDATAh ' AzAAA:B BJLB#}v}B.-^B:Ἣ1BHRaBT&YvmB^̌Bk:VBvTAB~8\BPy(BtB^鼵NB*IBqkYvmB@B5E:gBB¸ByBҢB㼵jtB$!8BeYvmBъͼ 5BDBBDATAh ' AzAAAlB BPDATAT  .   AC =RDATAT .   AC ?~dDATAh ' AzAAA|B Bg=B =B=B#=tB.-^=JB:2=XBHRsBT&819BgƽgCWB}p='Bt=JB_=B-Bqk819B\nB[=?BҢ=JB=>B9Be819Bъ7BD=B=B=DATA ' AzAAAeB ,B *B#\B.-^@JB: BHRR;އBT&<[BgBeż Bъݼ+BD=ujB=ujB=ujDATA ' AzAA AؽwDB 'BMaB#ɾRB.-^mB:b0BHQ=/BT&=DBg=B}K&BtmB_5B=7SBqk=DBo=XB[BҢmB3B=BoBe=DBы=FBD'B'Bݽ'DATA ' AzAAAۘB #BQ=B#3B.-^B:[BHRK;o(BT&;BgJAC:dDATAT  .   AB{Y1JHAC1@'DATAT .   ABe>vACVƅDATAT  .  pAB?x?_AC?.aDATA 'AzAAAVB B+'BP챨KBpByxl0̥Bv2>~B331B51B1gB33B5.gB11'B331B51B10;B33B;BBBoxDATA 'AzAAA0]8B 0%$B+'1BP1OBpByxlҿBv{B33CB5B1.m B33B5m B1B33CB5B1nB33B;1JHB0%$B0%$Box0%$DATA 'AzAAANB (B(ӹBDdeBpByb9~|BS>yB33>]WBD>JTNB1B33BJ:B>Y6B33>]WB.>aVIB=&YmB33Bww|5BMǹRTB(BmjmDATA p'Az?A?A?A?WB ?xB+'?)BP?!sBp?Byxp?~]Bv?xB33?yB8?z{B.?B33?B8?MB.?zB33?yB7?yhB/?~ B33?BH?_B?xB?xBox?xIPP !` +  IPAction.lowerjaw2 ! #`A\C-lۼ=D ACDATAT !. "` #AB?1a/AC pDATAT "`. " ! %AB3.AC.IDATAT ". #` "` 'AB;=P7ACJhDATAT #`. " )AB?'?[AC?$DATA #'AzAAAB B+ NxBP 5BoBy:l0*8PBh1l\B331G B13B̮BBaB.:.B~1BѮB331G B1LoB0$BaB>-B:BB^DATA %'AzAAA-hB -B+ .ЖBP.3BoBy:l߭dBhOB33BrEB+BaBϫB~$B33BTB̭BaB.B:-B-B^-DATA ''AzAAA|6B _B() BD(;BoBy:B=UwB33=6kB=# nB»BaB:YB=<B33=6kB=2nBŹ xBaB3BF˺D[sB_B_ DATA )'Az?A?A?A? B ?B+ ?BP?B$Bo?By:l?-Bh?FB33?@B?SjB?vBa?B?6B~?EB33?@B?;B?ۄBa?B?[7B:?B?B^?IPP + 4 !`IPAction.lowerteeth , / Bb!B"?ACDATAT , . , /AA=ACDATAT ,. - , 0AA=ACDATAT - . - , 0`AA=ACDATAT -. . - 0AA??AC?DATAT . . . - 1 BpB(=&ACDATAT .. / . 2`BpB 7IkACDATAT / . . 3BpB-Q/ACDATA8 /'A=gAABDATA8 0'A=gAABDATA8 0`'A=gAABDATA8 0'A=g?A?AB?DATA 1 'BbEBpB{7Bdy=&B=WdB=QBy(BB9(Bx=qB=WdB==B~BBDATA 2`'BbCBpB{7Bd| BBB~7IkBBIkB~3BBfB~BBDATA 3'BbCBpB{7Bd|B\BCB~-Q/BBQ/B~ԃiB\B69B~BBIPP 4 7` +IPAction.tail 5` 6ACDATAT 5`. 5 ACmDATAT 5. 6` 5`" AC:`DATAT 6`. 6 5( ACʽODATAT 6. 6`. AC?JDATA 'A=AAuAF>)44A>VAt>B>B >hΐB;>Mc"B|=|B =W_B&;-~:B-Þ9=B4(B:;U;BA{݇BHKBN;l<BU8=<B\>+.Bb:|>\OBi>|.Bp>hΐBv;>U^B}{=!B=W_B/BϾJRB(B:B⾽݄BKB<B=<:B>+.B>>\P"Bz>|:B>hΐB>UQB=_B=W_B,BϾFBB(B:B⾽BKB<B=B>+.B=>ZzBt>hΐB>hΐB߰>hΐDATA" 'A=gAAvAry#A҅AvhwBoB B;&TB1TB B&;9waB-;W?6B4;qUB:;;BA;BH:BN;SʖBU0nB\vBb;5BicBpBv;B}2[BB9B~;WWB;qUB;}B~;uB:BS B~0nBvBQB~lBBB~2[dBB9+B~;WQB;qUB;gB~;B:BWB~3BvBB~BB߰DATA( 'A=gAAvA1˥mA2~Av2FB2"1B 2 B;1gB1j1B /_B&;3B- 3B4B:;*"[BA5BHBN;WBU1B\1'Bb;2TBi2iBp2 Bv;1+B}1kB/_B4$B~ ]BB*1B~BB\4B~1B1'B2TB~2iB2 B1B~1kB/_B4#B~ BB*B~6BB"B~1κB1'B2B~2 B2 B߰2 DATA. 'A=g?A?Av?A?{kA?zNAv?xB?x;B ?yJB;?zZB?%]B ? B&;?\B-?|B4?|B:;?|tBA?BH?XBN;?BU?}LB\?|_NBb;?{PBi?xBp?yJBv; ?yaB}?B? B?B}?|B?|B?|sB}?B?XB?B~?}NB?|_NB?{NB~?xB?yJB?ybB|?B? B?B}?|B?|B?|sB}?KB?XB?eB~?}ZB?|_NB?{/BB~?yJB?yJB߰?yJIPP 7` 9 4IPAction.tailfin1 7 9`ACDATAT 7. 8`4 ACDATAT 8`. 8 7: AC=DATAT 8. 9` 8`@ AC;jDATAT 9`. 8F AC?}DATA4 'A=dAAvA=A=fAv =ojB=B =hB;s=5IB-B4>4TB:;j>;*BAl=BBH=$BN;O<?BU B\Bb:%Bi&Bp;Bv;vkB}!B-B>4TB>;A@B=~B=$B<BnBB]%B⓾B;B[B␼{^B-LB>4TB>;GB=RB=$B< 2B)CBB_#xBv;B;B߰;DATA@ 'A=gAAvA]͗AnAvBB CB;FBjB 1B&;:jB-;B4;ÇB:;;}BA;};BH;@]TBN;;~BU9s4B\2)Bb;q BiPBpCBv;B}jkB1B:j+B~;B;ÇB;~B~;};B;@]TB;~B~9s4B2)Bq B~*BCB.B~jB1B:j^B~;B;ÇB;:B~;}6B;@]TB;B~9ZB2)BXB~CBCB߰CDATAF 'A=g?A?Av?A?i&A?~^Av ?~B?|KgB ?|B;?|GB?&B ?@B&;?pB-?zbB4?z?fB:;?yjBA?}=BH?~8BN;?~ޮBU?}gB\?}cBb;?|ABi?|<Bp?|Bv;?}#rB}?)B?@B?kB|?zB?z?fB?yB}?}JB?~8B?~ޢB~?}eB?}cB?|CB~?|<B?|B?}#rB~?)B?@B?kB|?zB?z?fB?y B}?}zB?~8B?~qB~?}B?}cB?}B~?|B?|B߰?|IPP 9 <` 7`IPAction.tailfin2 :` ;ACDATAT :`. :L ACկKDATAT :. ;` :`P ACxDATAT ;`. ; :T AC%DATAT ;. ;`X AC?}DATAHL 'A=gAAvA=+A={Au=B=qEB =Η,B;M=*B=B B&:B-սbB4B::ӱBAŧBHFeBTvz6BcY=O<Bp=Η,Bv;S=л$B}= BBsBj&TBB{~B⊽BFeB;Iz)BĬ=NqB=Η,B=лBy= BBsBj!BB{ӃMB⊽BFeB;[yB=Η,B=Η,BaE=Η,DATAHP 'A=gAAvA=$^A=pmAu=AB=B = B;G=(B=B B&;B-Ī'yB4B:;BA?BHzUBTv@㱽Bc=X;Bp= Bv;M=ÅKB}=BB~BUMBB_B⋽<BzUB; dB=WB= B=ÅB=[BB~BUQBBB⋽BzUB;+B= B= BaK= DATAHT 'A=gAAvAWzA OAvKBB B;u(BB B&;:3B- 6B4:B:;&YBAF [BHh[ZBTv |Bc7Bp Bv;tJB} BB:B} >B:B&yyB~F IBh[ZB;B6B BtB|VBB:V>B} tB:B&B~RaBh[ZB;'B B BaL DATAHX 'A=g?A?Av?A?gA?Av?~?B?};B ?}sB;?}rB?vB ?B&;?B-?}B4?}~B:;?}"BA?~ PBH?~BTv?~,QBc?|TBp?}sBv;?}lB}?B?B?~B~?}qB?}~B?}"B~?~ ZB?~B;?~,>B?|WB?}sB?}kB~?B?B?B~?}XB?}~B?}"B~?}B?~B;?~?B?}sB?}sBaM?}sIPP <` > 9IPAction.tailfin3 < >`ACDATAT <. =`\ ACpDATAT =`. = <b ACse:DATAT =. >` =`h ACiDATAT >`. =n AC?~DATA\ 'A=fAAvA=5A=Au=B=3B =B;t=^wB<,B }_B&:t!uB-ĆwB4B:;*EBA/XBHBN;-VBUIJ= qB\=!Bb:=0Bi=hBp=Bv;q=);B}XBi=Bp=bBv;6=wB} XB=B=bB=wBBz=bB=bB߰=bDATAh 'A=gAAvA9¼A9}lAv98B8f<B 8pB;9"v=B:cB %=B&;B-(B4DB:;^BABHBN;q>BUTB\1Bb;:T!Bi8fvBp8pBv;9R5B}:SB%=BB~ BDB}B~BBq=B~TpB1B:T B~8fDB8pB9RNB~:jB%=BB~EBDBAB~zBBqBB~UB1B:UIB~8pB8pB߰8pDATAn 'A=g?A?Av?A?qA?~Av?~wB?}9_B ?}}B;?}B?8)B ?@B&;?N-B-?z1B4?zuB:;?zfBA?~BH?UBN;?0BU?}B\?}cBb;?|Bi?|Bp?}}Bv;?~ OB}?;B?@B?GTB|?zB?zuB?zg\B|?~B?UB?!B~?}B?}cB?|B~?|B?}}B?~ OB~?;B?@B?GQB|?zqB?zuB?zgyB|?~B?UB?B~?}ȢB?}cB?|B~?}}B?}}B߰?}}IPP > A` <`IPAction.tailfin4 ?` @ACDATAT ?`. ?t AC5DATAT ?. @` ?`x AC>YDATAT @`. @ ?| AC`DATAT @. @` AC?}RDATAHt 'A=kAAvA=5UA=] Au=_DB=jAB =CB;=wB B} B|&BH> BTw_>FBc_BpHiBv;mB}ij BBd= ,B=+ B=CWB=Bk>&B> B;>BRQBHiBnlBY BBd= B=*B=CWB=!Bk>'B> B;=B HiBHiBa3HiDATAH| 'A=gAAvAB:;?~BA?}YBH?|2BTv?|DfBc?|/Bp?}kBv;?~ B}?B?B?(B~?˿B?>B?~]B~?}YB?|2B;?|DoB?|4B?}kB?~ B~?B?B?(B~?B?>B?~<B~?}MxB?|2B;?|\B?}kB?}kBaL?}kIPP A` E` >IPAction.upperjaw1 A C`ACDATAT A. B` CACDATAT B`. B A D@ACDATAT B. C` B` DACDATAT C`. B EAC?DATA8 C'A=gAABDATA8 D@'A=gAABDATA8 D'A=gAABDATA8 E'A=g?A?AB?IPP E` O A`IPAction.upperjaw2 E G`B>Bg?uACDATAT E. F` GAB=15gAC1+FDATAT F`. F E IAB06qACDATAT F. G` F` KAB;AC DATAT G`. F MAB?~ ?5AC?TDATA G'AzAAA0F\B 0a}B(s0$BD$1yBoBy>FlBЯ>BI˱Bб{B.zBaBXB<̱HBeBiB%"BB#15jBs0B0a}B_:0?wDATA I'AzAAA]B B+ /BPBoBx/_BD06߶BI0!|B0kDB5BaB-*iB<0_Be0!|Bi0&[UB%.BB#ɰBs B Bc DATA K'AzAAA0y|B HB(}BD%[BoBy:nCBЈBI˽B؈B;BaB[BDATA 䌀 @ @DATA  䌀 pvDATA  @ 5DATA @ 䍀 p6DATA 䍀 @ @DATA  䍀 'DATA  @ pfDATA @ 䎀 JCDATA 䎀 @ 啀1DATA  䎀 DATA  @ 0DATA @ 䏀 喀Q@DATA 䏀 @ JDATA  䏀 嗀14DATA  @ CDATA @ 䐀 DATA 䐀 @ P`DATA  䐀 嘠?DATA  @ 7DATA @ 䑀 p<DATA 䑀 @ DATA  䑀 DATA  @ `DATA @ 䒀 嚰QDATA 䒀 @ 0<DATA  䒀 因DATA  @  DATA @ 䓀 DATA 䓀 @ pVDATA  䓀 ;DATA  @ `DATA @ 䔀 坠DATA 䔀 @ DATA  䔀 0*DATA  @ 垐;`DATA @ 䕀 DATA 䕀 @ @ DATA  䕀 埀DATA  @ EDATA @ 䖀 @5DATA 䖀 @ 堠 `DATA  䖀 !QDATA  @ 0DATA @ 䗀 p!DATA 䗀 @ !DATA  䗀 DATA  @ @!DATA @ 䘀 墐 ZDATA 䘀 @ !DATA  䘀 !DATA  @ pEERFDATA @ 䙀 声!DATA 䙀 @ DATA  䙀 @DATA  @ p!DATA @ 䚀 &DATA 䚀 @ (DATA  䚀 pDATA  @ 奰`DATA @ 䛀 DATA 䛀 @ DATA  䛀 `#`DATA  @ 妰7DATA @ 䜀 'DATA 䜀 @ `DATA  䜀 姰.DATA  @ \DATA @ 䝀 P DATA 䝀 @ 娐DATA  䝀  DATA  @ DATA @ 䞀 PdDATA 䞀 @ 婐DATA  䞀 !>pDATA  @ &DATA @ 䟀 `(DATA 䟀 @ 0DATA  䟀 DATA  @ @ DATA @ 䠀 p DATA 䠀 @ 嫰#DATA  䠀 DATA  @ @ݔDATA @ 䡀 嬀DATA 䡀 @ ?%LDATA  䡀 7ADATA  @ `%DATA @ 䢀 孰.#DATA 䢀 @ ?&DATA  䢀 P@DATA  @ 宐DATA @ 䣀 ,ZDATA 䣀 @ ADATA  䣀 @!DATA  @ 寐(ADATA @ 䤀 (DATA 䤀 @ P:vDATA  䤀 尐ADATA  @ ]DATA @ 䥀 ADATA 䥀 @ @ DATA  䥀 屐4DATA  @ $ADATA @ 䦀 @%\DATA 䦀 @ 岀!DATA  䦀 @DATA  @ MCDATA @ 䧀 ` ADATA 䧀 @ 峠DATA  䧀 ˪DATA  @ DATA @ 䨀 `DATA 䨀 @ 崐ADATA  䨀 $>DATA  @ 0DATA @ 䩀 嵀MDATA 䩀 @ >DATA  䩀 DATA  @ @DATA @ 䪀 嶀DATA 䪀 @ vdDATA  䪀 DATA  @ @ ɂDATA @ 䫀 巀DATA 䫀 @ PDATA  䫀 DATA  @ @+DATA @ 䬀 帀DATA 䬀 @ ) DATA  䬀 ADATA  @ 02DATA @ 䭀 pADATA 䭀 @ 幰>U;DATA  䭀 @DATA  @ 0;DATA @ 䮀 庀ADATA 䮀 @ DATA  䮀 #DATA  @ 0"DATA @ 䯀 廀%ADATA 䯀 @ "ԛDATA  䯀 '@DATA  @ p,ѭDATA @ 䰀 DATA 䰀 @ +DATA  䰀 `DATA  @ 彰'+DATA @ 䱀 cDATA 䱀 @ 0(DATA  䱀 徐!>?DATA  @ DATA @ 䲀 0~DATA 䲀 @ 忀!DATA  䲀 ADATA  @ (DATA @ 䳀 `!ADATA 䳀 @  uDATA  䳀 DATA  @ P4DATA @ 䴀 (DATA 䴀 @ DATA  䴀 0'DATA  @ €DATA @ 䵀 %?SDATA 䵀 @ %DATA  䵀 p%ADATA  @  DATA @ 䶀 DATA 䶀 @ `*DATA  䶀 7?BӆDATA  @ /?@[DATA @ ䷀ ŀEDATA ䷀ @ &?2OeDATA  ䷀ @DATA  @ ƀ8 #DATA @ 一 '8DATA 一 @ @B>͑DATA  一 ǰ%DATA  @ ̡DATA @ 乀 @.ZfDATA 乀 @ Ƞ*=.DATA  乀 EDATA  @ p'<#DATA @ 亀 DATA 亀 @ .>)qSDATA  亀 P*DATA  @ ʰEDATA @ 什 7aDATA  @ Ҡ9@DATA @ 'ODATA  @ P(DATA  Ӱ4HDATA  @ moDATA @ € @@DATA € @ ԐK>M/DATA  €  HDATA  @ `>EDATA @ À ՐNDATA À @ !DATA  À 0$DATA  @ ր$JDATA @ Ā DATA Ā @ ,>l'DATA  Ā `%?DATA  @ װ6DATA @ ŀ 8DATA ŀ @ ؀DATA  ŀ *.DATA  @ zDATA @ ǀ ڰ&DATA ǀ @ DATA  ǀ P.:DATA  @ ۰6DATA @ Ȁ %DATA Ȁ @ `4@DATA  Ȁ 0ADATA  @ ZADATA @ ɀ ݰ6yDATA ɀ @ 4GDATA  ɀ p*DATA  @ .DATA @ ʀ 0.ADATA ʀ @ ߐ.ÞDATA  ʀ 4 DATA  @ P2 DATA @ ˀ *RDATA ˀ @ .DATA  ˀ p.ADATA  @ .MDATA @ ̀ 05)SDATA ̀ @ 2DATA  ̀ *DATA  @ P.@DATA @ ̀ .>6#|DATA ̀ @ .>$DATA  ̀ pDATA  @ CDATA @ ΀ />L3DATA ΀ @ p*DATA  ΀ 5DATA  @ 0+DATA @ π +@DATA π @ +>HDATA  π P/>M/DATA  @ /DATA @ Ѐ /ADATA Ѐ @ p<>HDATA  Ѐ />7ZDATA  @ @?-[DATA @ р $DATA р @ >DATA  р *@DATA  @ p>؉DATA @ Ҁ = DATA Ҁ @ ,ADATA  Ҁ P=DATA  @ DATA @ Ӏ H=6uDATA Ӏ @ pDATA  Ӏ 1DATA  @ #DATA @ Ԁ `DATA Ԁ @ >1DATA  Ԁ @DATA  @ BDATA @ Հ @&>DATA Հ @ DATA  Հ ADATA  @  DATA @ ր PzDATA ׀ @ >;xDATA  ׀ DATA  @ 03hDATA @ ؀ *ADATA ؀ @ DATA  ؀ DATA  @ ` >NJDATA @ ـ ?bqDATA ـ @ >9mDATA  ـ 0 DATA  @ pA%DATA @ ڀ >&DATA ڀ @ DATA  ڀ 7=>DATA  @ =DATA @ ۀ @DATA ۀ @ 4;hDATA  ۀ @DATA  @ !>DATA @ ܀ dDATA ܀ @ 0ADATA  ܀ `DATA  @ %=^DATA @ ݀ ?bDATA ݀ @ 0ADATA  ݀ `(DATA  @ DATA @ ހ )BDATA ހ @ `DATA  ހ )IADATA  @ DATA @ ߀ `TDATA ߀ @ ADATA  ߀ >(1PDATA  @ 0lADATA @ ,DATA  @ 0,=DATA  DATA  @ QDATA @ $DATA  @ `c="DATA  %>1cDATA  @ @&DATA @ $ADATA  @ $='DATA  0$?#6DATA  @ DATA @ >8DATA  @ @DATA  0((DATA  @ /DATA @ ADATA  @ "DATA  pADATA  @ ,DATA @ ADATA  @ @!>gDATA  DATA  @ ) aBDATA @ 09#YGDATA  @ &;xDATA  "DATA  @ @(ADATA @ %DATA  @ 10DATA  P3biDATA  @ 3\EDATA @ &}DATA  @ `DATA  ?bqDATA  @ ADATA @ 7DATA  @ p;DATA  5DATA  @ @DATA @ p|DATA  @ 3? aADATA  ?4?hDATA  @ 0*>DATA @ 2DATA  @ *ݔDATA  PDATA  @ >ƍDATA @ > TDATA  @ DATA  P>rDATA  @ >SDATA @ $DATA  @ DATA  `?DATA  @ ADATA @ :tDATA  @ ADATA  PDATA  @ >_DATA @ 'DATA  @ 0ADATA  pDATA  @ >ŖDATA @ *@DATA  @ @'>DATA  *DATA  @ >DATA @  DATA  @ ` DATA  EDATA  @ ADATA @ 0)RDATA  @ pDATA  DATA  @ $>mDATA @ 0߁DATA  @ @DATA  ?"UEDATA  @ @DATA @ @?gDATA  @ p>`@DATA  *DATA  @ ADATA @ P>&MDATA  @ >DATA  DATA  @ !>qDATA @ @ DATA  @ !ADATA  >DATA  @  >DATA @ `DATA  @ >DATA  DATA  @  >#ADATA @ PADATA  @ ={DATA  '@DATA  @  U? DATA @ DATA  @  ?)9RDATA   DATA  @ `.>PDATA @ DATA  @ @DATA  0DATA  @ >@DATA @ .DATA  @  6ADATA  #ADATA  @ >qDATA @  DATA  @ p >ȝDATA  ? DATA  @ 1DATA @ PDATA  @ cDATA  ADATA  @  EDATA @ p(DATA  @ >ODATA  HADATA  @ 2DATA @ DATA  @ 91DDATA  ADATA  @ G>jxDATA @ `DATA  @ DATA   >}MDATA  @ !3ADATA @   !p< @DATA   @ !MADATA    "`DATA  @  "Hi DATA @   #J>$ DATA   @ #KDATA    $MpDATA  @  $>ODATA @   $=@DATA   @ %@ADATA    %p<DATA  @  %8DATA @   &P=DATA   @ &DATA    '>DATA  @  'PDATA @   '* kDATA   @ '*DATA    (@ADATA  @  (pDATA @   (>"DATA   @ )DATA    )P+>\"DATA  @  ) nDATA @   *DATA   @ *@0DATA    *DATA  @  *YDATA @   +ADATA   @ +`-DATA   + DATA  @  +>~hDATA @ ,@-DATA  @ ,ADATA  ,DATA  @ - !>IDATA @ -p1?DATA  @ -$DATA  . >1MDATA  @ .@ADATA @ .}DATA  @ .>4 DATA  /DATA  @ /P>H,DATA @ /IDATA  @ 0  DATA  0P>>@DATA  @ 0*DATA @ 12 DATA  @ 1`.ADATA   19>UCiDATA  @ 20'>M^:DATA @   22TDATA   @ 2uKDATA    30ADATA  @  3`0M5DATA @   3=!0DATA   @ 40̩DATA    4`!>DATA  @  41?vDATA @   5!)DATA   @ 5`DATA    5>DATA  @  5DATA @   6 7}DATA   @ 6"FDATA    61DATA  @  70 ADATA @   7>DATA   @ 7;ADATA    8 +DATA  @  8k>&DATA @   9 >8DATA   @ 9P>$DATA    9DATA  @  9DDATA @   :DATA   @ :PRiDATA    :$>DATA  @  : DATA @   ; ADATA   @ ;p~yDATA    ;ADATA  @  ;"DATA @   <@ADATA   @ <?[DATA    <1ADATA  @  =0DATA @   =p'kDATA   @ =2DATA    > &DATA  @  >p&@DATA @   >>DATA   @ ?0DATA    ?pDATA  @  ?7pDATA @   ? DATA   @ @@P>kDATA    @JDATA  @  A@VDATA @   A-@DATA   @ B >ɎDATA    B`>&MDATA  @  B>DATA @   C@> DATA   @ C-DATA    DDATA  @  D@?GmDATA @   DADATA   @ DDATA    D?.QDATA  @  E0DATA @   E`.TDATA   @ EEDATA    F0.?pDATA  @  FDATA @   F>yDATA   @ G DATA    GP5?sDATA  @  G),DATA @   HDATA   @ H@DATA   HADATA  @  HC DATA @ IDATA  @ I`(RDATA  ! I<DATA ! !@ J DATA !@ ! ! JP6nDATA ! ! !@ J ADATA ! " ! JDATA " "@ ! K >ZfDATA "@ " " K`/DATA " " "@ K0DATA " # " L #ADATA # #@ " Lp;>8DATA #@ # # L> $DATA # # #@ M 6DATA # $ # M#DATA $ $@ # M @DATA $@ $ $ N6DATA $ $ $@ NpDATA $ % $ N?LݚDATA % %@ $ NADATA %@ % % O@&?6mDATA % % %@ O%DATA % & % O)DATA & &@ % P@1>jwDATA &@ & & P.?DATA & & &@ Q2 (DATA & ' & Q`5DATA ' '@ & Q*?EDATA '@ ' ' Q(DATA ' ' '@ RP!ADATA ' ( ' R.?$8DATA ( (@ ' S%?hDATA ) ) )@ T2>?DATA ) * ) U@DATA * *@ ) U*ADATA *@ * * U2>+DATA * * *@ VP>wJDATA * + * V'ADATA + +@ * V3> {DATA +@ + + W05?,DATA + + +@ W>so!DATA + , + WDATA , ,@ + X?Q_DATA ,@ , , X` ADATA , , ,@ X0>M{;DATA , - , Y*EDATA - -@ , Yp)DATA -@ - - Y4DATA - - -@ Z0K@DATA - . - Z-DATA . .@ - [@DATA .@ . . [ DATA . . .@ [@DATA . / . \DATA / /@ . \P=DATA /@ / / \DATA / / /@ \M>)JDATA / 0 / ]P=o]DATA 0 0@ / ]IDATA 0@ 0 0 ^DATA 0 0 0@ ^0<@ɂDATA 0 1 0 ^H>WDATA 1 1@ 0 _ =DATA 1@ 1 1 _DATA 1 1 1@ _DATA 1 2 1 ` DATA 2 2@ 1 `P4DATA 2@ 2 2 `*DATA 2 2 2@ a?~DATA 2 3 2 a@)DATA 6 6@ 5 e0DATA 6@ 6 6 e`<LDATA 6 6 6@ e!DATA 6 7 6 f1qGDATA : :@ 9 j0DATA :@ : : jp9DATA : : :@ j4DATA : ; : k@?DATA ; ;@ : k-DATA ;@ ; ; l8ADATA ; ; ;@ l DATA ; < ; l = o` DATA > >@ = o ?ADATA >@ > > o  > >@ p >}9DATA > ? > p`ADATA ? ?@ > pDATA ?@ ? ? p=R^DATA ? ? ?@ qDATA ? @ ? qP=DATA @ @@ ? qDATA @@ @ @ q=Q+DATA @ @ @@ rDATA @ A @ rP<7DATA A A@ @ rDATA A@ A A r>DATA A A A@ sADATA A B A s@DATA B B@ A sADATA B@ B B s?6nDATA B B B@ tDATA B C B t@>TDATA C C@ B t@DATA C@ C C t-FDATA F F F@ wxDATA F G F x DATA G G@ F x`&UbDATA G@ G G x&>wiDATA G G G@ y&DATA G H G yPDATA H H@ G y/A_DATA H@ H H y K1DATA H H H@ z DATA H I H zP DATA I I@ H z?DATA I@ I I z DATA I I I@ {%;QwDATA I J I {`%DATA J J@ I {% DATA J@ J J |#<~{DATA J J J@ |P>-FDATA J K J |?=\$DATA K K@ J |<=OzDATA K@ K K }`DATA K K K@ }DATA K L K }DATA L L@ K ~'DATA L@ L L ~PATA L L L@ ~'DATA L M L ~ ADATA M M@ L 0 DATA M@ M M p1bDATA M M M@ |DATA M N M DATA N N@ M 0QDATA N@ N N 怀DATA N N N@ 怰?6nDATA N O N @DATA O O@ N 0DATA O@ O O pDATA O O O@ 恠!DATA O P O DATA P P@ O @4MDATA P@ P P 悠>*DATA P P P@ Q+DATA P Q P DATA Q Q@ P PDATA Q@ Q Q 惐DATA Q Q@ >zDATAL Q#=========================================================================DATA( R@# Wavefront OBJ Importer/Exporter v1.0DATA8 R# This is a complete OBJ importer and exporter scriptDATA R# All Rights ReservedDATA S0# chris@artdreamdesigns.com DATAL S#=========================================================================DATAH T# DESCRIPTION: This script allows for full importing and exporting ofDATAL Tp# .obj files. uv texture coordinates and normals can be exported andDATAH T# imported. .obj groups and materials can also be converted to andDATA, U`# from material indexes in Blender.DATAGр#DATA U# INSTALLATION:DATAL V# You need the FULL python installation to run this script. You canDATAL V# down load the latest version of PYTHON from http://www.python.org.DATAK0#DATA8 W# INSTRUCTIONS (You definitely want to read this!): DATAL W`# Once the script is loaded in Blender, hit alt-p. This will bring upEDATAH W# the main interface panel. You will have a choise of exporting orDATAP XP# importing an .obj module. If you are exporting you must have at leastDATAD X# one mesh selected in Blender, or you will get an error. DATAL Y@# You can change the export filename by entering the path and filenameDATAL Y# in the dialog. If you do not enter a path, the path will default toDATAX Z@# your blender directory. You can change the default path in the script <==== NOTEDATAP Z# itself by modifying the variable 'Filename' at the top of the script. DATAJ #DATA [@# EXPORTING:DATAP [# There are 4 different export options: Default, Groups, Material Layers, DATAL \# and Standard. "Default" will export your mesh using object groups ifDATAL \# the mesh has material indexes. "Groups" and "Material Layers" areDATAL ]# logically equivalent, but are a different .obj format. If you are DATAX ]# exporting a Poser morph target, you must select "Material Layers". <===== NOTEDATAL ^# "Standard" will ignore grouping information, even if your mesh has DATA ^# material indexes.DATAK#EEDATAL ^# There is also a choice between export using "mesh coordinates" or DATAP _P# "object coordinates". "Object coordinates" are any location, rotation, DATAT _# or scaling values created outside of mesh edit. They belong to the objectDATAP `P# rather than the mesh. If you export using mesh coordinates (the default)DATAP `# the center of the object will always be at 0, 0, 0. Export using "meshDATAP aP# coordinates is definintely what you want to use if you are working withDATAP a# a Poser morph target. If you are exporting a group of objects, you willDATA@ bP# automatically be placed in "object coordinate" mode. DATA b#DATA b# IMPORTING:DATAX c0# If your OBJ model has mapping coordinates, and you want to use them <===== NOTE DATAL c# in Blender, you MUST make sure to click the "STICK" mapping buttonCDATAP d0# in your material editor (by default it is set to "ORCO"). It should beDATAP d# noted that the UV option in the material edit window has nothing to doDATAT e0# with native uv texture mapping. UV is a specialized Blender function thatDATAP e# does not in any way alter the mesh information. Traditional uv texture ?DATAL f0# in Blender is invoked by the "STICKY" button in the material editor.DATAT f# In line with this, if you import an object with uv texture coordinates, theDATAT g0# "Make Sticky" button in the mesh editor window will be automatically set.DATA g# DATAT g# If your OBJ contains groups, once it has been imported, it will still appearDATAd h`# to lack any material indexes. This is a longstanding bug which can be remedied <=== NOTEDATAX h# by going to the mesh editor window, clicking on the mesh selection button, andDATAP ip# reselecting the mesh you have just imported. You will now have as many DATAT i# materials attached to your object as there are groups. You can then select DATAP jp# different groups by doing a material select when you are in edit mode. DATAX j# (Material indexing in Python just does not interact well with the main screen.)6DATA kp#DATAX k# Finally, you may have problems with certain parts of the object not displayingDATAX l # after you go in and out of edit mode the first time. To fix this, simply go intoDATA@ l# edit mode again, and select the "remove doubles" option.DATA m# DATA m@#DATAX mp# WARNINGS: To repeat, if you are importing using material groups you MUST immediatelyDATAX m# go to the mesh edit window, and reselect the mesh you have just imported. YouDATA\ np# must also have a number of materials available whose first six letter are "objmat". DATA o# See above.DATA o@#DATA op# HISTORY:DATA$ o# Nov 13, 2001: Initial ReleaseDATAP p# Nov 16, 2001: Version 1.1 - no longer need to pre-define dummy materialsDATA p#DATA$ p#================================@DATA qDATA q0KDATA$ q`# ===============================DDATA q# Setup our runtime constantsDATA$ r# ===============================EEDATA rPDATA8 rDEBUG=1 # Set this to "1" to see extra messagesDATA4 rMESHVERSION=3 # If the export file doesn't work,EPDATA, s@FILEVERSION=3 # try changing these to "2"DATA s DATA sEVENT_PATHCHANGE= 1DATA tEVENT_IMPORT= 2DATA tPEVENT_IMPORT_CONT= 3DATA tEVENT_OPTIONS= 4DATA tEVENT_EXPORT= 7DATA uEVENT_EXPORT_CHK= 5DATA uPEVENT_EXPORT_CANCEL= 6DATA uEVENT_QUIT= 8DATA uEVENT_EXPORT_ERR= 9DATA vEVENT_TYPE= 10DATA v`EVENT_DONE= 11DATA vDATA$ v# ===============================DATA w0# Import our librariesNDATA$ wp# ===============================DATA wDATA wimport stringDATA x0import osDATA xpimport structDATA ximport mathDATA ximport Blender210DATA y0from Blender import *DATA ypfrom Blender import NMesh@DATA yfrom Blender.Draw import *DATA zfrom Blender.BGL import *DATA z` DATA$ z# ===============================DATA z# Input VariablesDATA$ { # ===============================DATA {pDATA< {Filename = "C:\\My Documents\\Data\Objects\\VickiHead.obj"DATA0 |#Filename = "C:\\Data\Objects\\campanula.obj"ZCDATA |pgFilename=Create(Filename)DATA |gAlert = 0DATA }type = 1DATA }@exporttype = 1DATA }returncode = 0DATA }operation = "Export"DATA ~center = [0,0,0]DATA ~@rotation = [0,0,0]DATA ~Transform = []DATA ~multiflag = 0cDATA DATA$ 0#================================DATA def ExitGUI ():DATA$ #================================DATA  Exit()DATA @DATA$ p#================================DATA def EventGUI (event):DATA$ #================================CDATA P global gFilename DATA 偐 global ExportOptionsDATA  global ExportTypeDATA  global typeDATA ` global exporttypeDATA 傠 global operationDATA  global gAlertDATA |BoDATA P if (event==EVENT_IMPORT):DATA0 僠 ImportFunction(gFilename.val, type)DATA  operation = "Import"DATA( P if (event==EVENT_IMPORT_CONT):DATA 儠 gAlert = 0DATA  operation = "Import"DATA 0 Draw ()DATA p if (event==EVENT_EXPORT):DATA0  ExportFunction(gFilename.val, type)DATA  operation = "Export"DATA$ p if (event==EVENT_EXPORT_CHK):DATA0  ExportFunctionOK(gFilename.val, type) DATA  Draw ()DATA( ` if (event==EVENT_EXPORT_CANCEL):DATA 凰 gAlert = 0DATA  Draw ()DATA$ 0 if (event==EVENT_OPTIONS):DATA$ 刀 type = ExportOptions.val DATA  Draw ()`DATA  if (event==EVENT_TYPE):BDATA( ` exporttype = ExportType.val DATA 剰 Draw ()DATA(  if (event==EVENT_EXPORT_ERR): DATA @ gAlert = 0 DATA 劐 Draw ()DATA  if (event==EVENT_DONE): DATA  gAlert = 0DATA ` Draw ()DATA 勠 if (event==EVENT_QUIT):DATA  ExitGUI()EDATA 0DATA$ `#================================DATA 匰def DrawGUI():DATA$ #================================DATA @ global typeDATA 區 global exporttypeDATA  global operation DATA DATA$ 0 glClearColor (0.6,0.6,0.6,0)DATA$ 厀 glClear (GL_COLOR_BUFFER_BIT)DATA  DATA  global gFilenameDATA @ global gAlertDATA 叀 global ExportOptionsDATA  global ExportTypeDATA DATA @ if (gAlert==0):DATA4 吀 # Add in the copyright notice and titleDATA  glRasterPos2d(32, 380)DATA4 0 Text("Wavefront OBJ Importer/Exporter")DATA 呐 glRasterPos2d(32, 350)DATA0  Text("Copyright (C) Chris Lynch 2001")DATA @DATAx p gFilename=String ("Filename: ",EVENT_PATHCHANGE,32,250,320,32,gFilename.val,255,"Full pathname and filename")DATA8  Button ("Export",EVENT_EXPORT,32,200,100,32)DATA8 p Button ("Import",EVENT_IMPORT,252,200,100,32)DATA  glRasterPos2d(32, 165)DATA(  Text("Select Export Options:")DATAh p options = "Export Options %t| Default %x1| Obj Groups %x2| Material Layers %x3| Standard %x4"DATAL  ExportOptions = Menu (options,EVENT_OPTIONS,200,150,150,32, type)DATA4 啀 Button ("Done",EVENT_QUIT,142,50,100,32)DATA  glRasterPos2d(32, 115)DATA 0 Text("Export using ")DATAT 喀 options = "Export Type %t| Mesh Coordinates %x1| Object Coordinates %x2"DATAL  ExportType = Menu (options,EVENT_TYPE,170,100,180,32, exporttype)DATA4 嗀 Button ("Done",EVENT_QUIT,142,50,100,32)EEDATA DATA  elif (gAlert==1):DATA P glRasterPos2i (32,250)DATA@ 嘠 Text (gFilename.val+ " already exists. Save anyway?") DATA8  Button ("Save",EVENT_EXPORT_CHK,150,200,50,32)DATA@ p Button ("Cancel",EVENT_EXPORT_CANCEL,250,200,50,32)DATA  gAlert = 0DATA  elif (gAlert==2):DATA ` glRasterPos2i (32,250)DATAT 嚰 Text (gFilename.val+ " cannot be found. Check directory and filename.") DATA@ 0 Button ("Continue",EVENT_IMPORT_CONT,32,190,70,32) DATA 因 gAlert = 0DATA  elif gAlert == 3:DATA  glRasterPos2i (32,250)DATAX p Text ("No objects selected to export. You must select one or more objects.") DATA<  Button ("Continue",EVENT_EXPORT_ERR,192,200,70,32)DATA ` gAlert = 0DATA 坠 elif gAlert == 5:DATA  glRasterPos2i (32,250)DATA, 0 Text ("Invalid directory path.") DATA< 垐 Button ("Continue",EVENT_EXPORT_ERR,192,200,70,32)DATA  gAlert = 0DATA @ else:DATA 埀 glRasterPos2i (32,250)DATAH  Text (str(operation)+ " of " +str(gFilename.val)+ " done.") DATA8 @ Button ("Continue",EVENT_DONE,192,200,70,32)DATA 堠 DATA$ #================================unDATA 0def RegisterGUI ():DATA$ p#================================DATA$  Register (DrawGUI,None,EventGUI)DATA DATA$ @#================================DATA 墐# MAIN SCRIPTDATA$ #================================DATA$ # Opens a file, writes data in itDATA p# and closes it up.DATA$ 声#================================DATA RegisterGUI()EEDATA @CDATA$ p#================================DATA( def ImportFunction (importName, type):DATA, #================================ DATA p global gFilename DATA 奰 global gAlertDATA DATA  try:DATA$ ` FILE=open (importName,"r")DATA8 妰 directory, Name = os.path.split(gFilename.val)DATA(  words = string.split(Name,".")DATA ` Name = words[0]DATA0 姰 ObjImport(FILE, Name, gFilename.val) DATA  FILE.close()ϾDATA P gAlert = 4DATA 娐 Draw ()?DATA  except IOError:DATA  gAlert=2 ?DATA P Draw ()DATA 婐DATA$ #================================DATA( def ExportFunction (exportName, type):DATA, `#================================ DATA  global gFilename DATA  global gAlertDATA @DATA p try:>DATA$ 嫰 FILE=open (exportName,"r")DATA  FILE.close()DATA @ gAlert = 1DATA 嬀 Draw ()DATA  except IOError:DATA8  directory, Name = os.path.split(gFilename.val)DATA( ` if os.path.isdir(directory):DATA0 孰 ExportFunctionOK(exportName, type)EDATA  Draw ()DATA P else:DATA 宐 gAlert = 5>DATA  Draw ()DATA  DATA$ @#================================DATA, 寐def ExportFunctionOK (exportName, type):DATA, #================================ ,DATA P global gFilename DATA 尐 global gAlertDATA  global returncodeDATA DATA$ @ FILE=open (exportName,"w")9)?DATA8 屐 directory, Name = os.path.split(gFilename.val)DATA(  words = string.split(Name,".")DATA @ Name = words[0]DATA$ 岀 ObjExport(FILE, Name, type)=DATA  if returncode > 0:DATA  gAlert = 3DATA ` else:DATA 峠 gAlert = 4DATA  FILE.flush()DATA  FILE.close()?DATA `DATA 崐#=========================DATA( def ObjImport(file, Name, filename):DATA 0#========================= DATA 嵀 vcount = 0DATA  vncount = 0DATA  vtcount = 0>DATA @ fcount = 0DATA 嶀 gcount = 0?DATA  setcount = 0DATA  groupflag = 0?DATA @ objectflag = 0DATA 巀 mtlflag = 0?DATA  baseindex = 0DATA  basevtcount = 0DATA @ basevncount = 0DATA 帀 matindex = 0 1DATA DATA  pointList = []DATA 0 uvList = []DATA p normalList = []DATA 幰 faceList = []DATA  materialList = [] DATA 0 lines = file.readlines()?DATA 庀 linenumber = 1DATA ƾDATA  for line in lines:DATA$ 0 words = string.split(line)DATA( 廀 if words and words[0] == "#":DATA$  pass # ignore comments=DATA(  elif words and words[0] == "v":DATA p vcount = vcount + 1DATA  x = float(words[1])DATA  y = float(words[2])DATA ` z = float(words[3])DATA( 彰 pointList.append([x, y, z])DATA @DATA, 0 elif words and words[0] == "vt":+DATA$ 徐 vtcount = vtcount + 1DATA  u = float(words[1])DATA 0 v = float(words[2])DATA$ 忀 uvList.append([u, v])s?DATA DATA,  elif words and words[0] == "vn":DATA$ ` vncount = vncount + 1DATA  i = float(words[1])DATA  j = float(words[2])DATA P k = float(words[3])DATA,  normalList.append([i, j, k])DATA DATA( 0 elif words and words[0] == "f":DATA € fcount = fcount + 1DATA(  vi = [] # vertex indices˿DATA(  ti = [] # texture indices)?DATA( p ni = [] # normal indicesDATA  words = words[1:]DATA  lcount = len(words)DATA, ` for index in (xrange(lcount)):DATA8  if string.find(words[index], "/") == -1:DATA0  vindex = int(words[index])DATAH ŀ if vindex < 0: vindex = baseindex + vindex + 1 a>DATA(  vi.append(vindex)DATA @ else:;?DATA< ƀ vtn = string.split(words[index], "/")cDATA(  vindex = int(vtn[0])DATAD @ if vindex < 0: vindex = baseindex + vindex + 1 DATA( ǰ vi.append(vindex) DATA  e%DATA0 @ if len(vtn) > 1 and vtn[1]:DATA, Ƞ tindex = int(vtn[1])DATAH  if tindex < 0: tindex = basevtcount +tindex + 1;?DATA( p ti.append(tindex)DATA A>DATA0  if len(vtn) > 2 and vtn[2]:DATA, P nindex = int(vtn[2])DATAH ʰ if nindex < 0: nindex = basevncount +nindex + 1DATA8  ni.append(nindex) DATA4 ˀ faceList.append([vi, ti, ni, matindex])DATA DATA(  elif words and words[0] == "o":DATA$ ` ObjectName = words[1]DATA ̰ objectflag = 1DATA0  #print "Name is %s" % ObjectName?>DATA `߾DATA( ͐ elif words and words[0] == "g":DATA  groupflag = 1DATA 0 index = len(words)DATA ΀ if objectflag == 0:DATA  objectflag = 1DATA  if index > 1:eDATA< p ObjectName = string.join(words[1:],"_") ?DATA<  GroupName = string.join(words[1:],"_") DATA P else:DATA, А ObjectName = "Default" QDATA,  GroupName = "Default" DATA8 P #print "Object name is %s" % ObjectNameDATA8 Ѱ #print "Group name is %s" % GroupNameDATA  else:DATA P if index > 1:RDATA< Ҡ GroupName = string.join(words[1:],"_") EEDATA  else:TDATA, P GroupName = "Default" r=DATA8 Ӱ #print "Group name is %s" % GroupName,DATA  DATA @ if mtlflag == 0:DATAL Ԑ matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$  gcount = gcount + 1 DATA `HDATA Ր if fcount > 0: DATA$  baseindex = vcountDATA( 0 basevncount = vncountDATA( ր basevtcount = vtcountDATA FDATA8  line = file.readline() # Kd,DATA4 P words = string.split(line)DATA,  if words[0] == "Kd":DATA0  Kd = [float(words[1]),DATA0 p float(words[2]),DATA0  float(words[3])]DATA8 0 line = file.readline() # Ks ԾDATA4  words = string.split(line)>DATA,  if words[0] == "Ks":DATA0 P Ks = [float(words[1]),DATA0  float(words[2]),DATA0  float(words[3])]?DATA pbDATAD  matindex = AddGlobalMaterial(name, matindex) DATA0  matlist = Material.Get() DATA, p if len(matlist) > 0:DATA8  material = matlist[matindex]DATA, 0 material.R = Kd[0]DATA,  material.G = Kd[1]DATA,  material.B = Kd[2]DATA0 P material.SpecR = Ks[0]DATA0  material.SpecG = Ks[1]DATA0  material.SpecB = Ks[2]DATA@ p alpha = 1 - ((Ka[0]+Ka[1]+Ka[2])/3)x2?DATA0  material.Alpha = alphaDATA @ else:DATA(  mtlflag = 0DATA DATA,  line = file.readline()?DATA p file.close()DATA DATA0  elif words and words[0] == "usemtl":DATA P if mtlflag == 1:DATA  name = words[1]DATAL  matindex = AddMeshMaterial(name, materialList, matindex) cDATA p # elif words: DATA4  # print "%s: %s" % (linenumber, words)>DATA$  linenumber = linenumber + 1DATA ` file.close()UDATA DATA  # import in BlenderDATA  >DATA( @ print "import into Blender ..." DATA  mesh = NMesh.GetRaw ()7?DATA DATA  i = 0DATA P while i < vcount: DATA  x, y, z = pointList[i] DATA  vert=NMesh.Vert(x, y, z)?DATA 0 mesh.verts.append(vert)DATA  i=i+1DATA DATA  if vtcount > 0:DATA 0 mesh.has_uvco = 1DATA,  print ("Object has uv coordinates")DATA  DATA  if len(materialList) > 0:DATA$ ` mesh.mats = materialList DATA tE>DATA  total = len(faceList)cDATA 0 i = 0DATA p >DATA  for f in faceList:DATA  if i%1000 == 0:DATA8  print ("Progress = "+ str(i)+"/"+ str(total))DATA DATA  i = i + 1DATA$  vi, ti, ni, matindex = f>DATA @ face=NMesh.Face()DATA$  if len(materialList) > 0:DATA  face.mat = matindex?DATA 0DATA ` limit = len(vi)DATA(  setcount = setcount + len(vi)DATA  c = 0 =DATA 0 DATA, ` while c < limit: DATA  m = vi[c]-1DATA,  if vtcount > 0 and len(ti) > c:DATA ` n = ti[c]-1DATA,  if vncount > 0 and len(ni) > c:DATA  p = ni[c]-1DATA `DATA  if vtcount > 0:DATA  u, v = uvList[n] >DATAp 0 # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0  mesh.verts[m].uvco[0] = (u*2)+1ɭ>DATA0 0 mesh.verts[m].uvco[1] = (v*2)+1u>DATA 1DATA  if vncount > 0:վDATA(  if p > len(normalList):DATAd ` print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA(  print("p = " +str(p))$DATA( @ x, y, z = normalList[p] DATA(  mesh.verts[m].no[0] = xDATA(  mesh.verts[m].no[1] = yDATA( 0 mesh.verts[m].no[2] = z,DATA  c = c+1 DATA  DATA  if len(vi) < 5:DATA, 0 for index in vi: \>DATA0  face.v.append (mesh.verts[index-1])DATA  DATA$  mesh.faces.append(face) DATA pDATA0  print "all other (general) polygons ..."DATA  for f in faceList:DATA$ @ vi, ti, ni, matindex = f DATA  if len(vi) > 4:DATA,  # export the polygon as edgescDATA< 0 print ("Odd face, vertices = "+ str(len(vi)))DATA(  for i in range(len(vi)-2):DATA$  face = NMesh.Face()DATA, @ if len(materialList) > 0:DATA(  face.mat = matindexDATA4  face.v.append(mesh.verts[vi[0]-1])DATA4 P face.v.append(mesh.verts[vi[i+1]-1])DATA4  face.v.append(mesh.verts[vi[i+2]-1])DATA(  mesh.faces.append(face)DATA ` >DATA  NMesh.PutRaw(mesh, Name,1)DATA  DATA8  print ("Total number of vertices is "+ str(vcount))DATA< p print ("Total number of faces is "+ str(len(faceList)))DATA8  print ("Total number of sets is "+ str(setcount)) DATA @ DATA pJDATA4  print("Finished importing " +str(Name)+ ".obj")DATA >DATA, 0#=========================================DATA4 def AddMeshMaterial(name, materialList, matindex):>DATA, #=========================================DATA P +?DATA  index = 0DATA  found = 0 DATA  limit = len(materialList)DATA P>DATA  while index < limit:DATA(  if materialList[index] == name:DATA  matindex = index DATA ` found = 1?DATA  index = limitDATA  index = index + 1DATA  DATA P if found == 0: DATA  materialList.append(name)DATA(  matindex = len(materialList)-1 DATA 0 ~lDATA p return matindex?DATA DATA, #=========================================DATA( @def AddGlobalMaterial (name, matindex):DATA, #==========================================DATA  DATA   index = 0DATA ` found = 0DATA  matindex = 0s>DATA  MatList = Material.Get()DATA 0 limit = len(MatList)DATA pDATA  while index < limit:DATA(  if MatList[index].name == name:DATA 0 matindex = index qDATA  found = 1DATA  index = limitпDATA  index = index + 1DATA @>DATA p if found == 0:DATA,  material = Blender210.Material(name)DATA  matindex = indexDATA P DATA  return matindexDATA >DATA$ #================================>DATA$ @def ObjExport(FILE, Name, type):?DATA$ #================================DATA  global returncodeDATA   global vertexcountDATA ` global TransformDATA  global multiflagDATA  global exporttypeDATA  DATA P vertexcount = 0DATA  returncode = 0>DATA(  print("Writing %s..." % Name) DATAX   FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATA =DATA$  Objects = Object.GetSelected()¹>DATA   if Objects == []:DATA0 ` print("You have not selected an object!")?DATA  returncode = 4DATA  else:DATA 0 for object in Objects:DATA  MtlList = []-DATA0  if len(Objects) > 1 or exporttype > 1:DATA8   Transform = CreateMatrix(object, Transform)DATA$  multiflag = 1 DATA  mesh = object.dataDATA   ObjName = mesh.nameDATA$ p has_uvco = mesh.has_uvcoDATA һ>DATA4  FILE.write("# Meshname:\t%s\n" % ObjName)jDATA PDATA  faces = mesh.facesDATA  materials = mesh.matsDATA   Vertices = mesh.verts DATA, p GlobalMaterials = Material.Get()l=DATA DATAL  if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA4  CreateMtlFile(Name, materials, MtlList)>DATA =DATA<  # Total Vertices and faces; comment if not usefulDATAD  FILE.write("# Total number of Faces:\t%s\n" % len(faces))>DATAH  FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA `DATA  FILE.write("\n")DATA  DATA4 ! # print first image map for uvcoords to useDATA@ !p # to be updated when we get access to other texturesDATAP ! if mesh.has_uvco: FILE.write("# UV Texture:\t%s\n\n" % mesh.has_uvco)DATA "`'DATAL " if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:&DATAL # UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATAL # elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATAP $ UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)W?DATA $ else: DATA@ $ Standard(faces, Vertices, has_uvco, FILE, ObjName)DATA %@ DATA@ %p#===========================================================DATA< %def Standard(faces, Vertices, has_uvco, FILE, ObjName): DATA@ &P#=========================================================== DATA & global vertexcountDATA ' global multiflagDATA 'PgDATA, ' FILE.write("o %s\n\n" % (ObjName)) =DATA, ' FILE.write("g %s\n\n" % (ObjName)) DATA (@ DATA (p for v in Vertices: DATA ( vert = v.co DATA ) if multiflag == 1:DATA, )P vert = Alter(vert, Transform) DATA ) x, y, z = vertDATA * DATA4 *@ FILE.write("v %s %s %s\n" % (x, y, z))}>DATA *9&>DATA * if has_uvco:DATA + for v in Vertices: DATA +` u, v, z = v.uvco ?DATA + u = (u-1)/2DATA + v = (v-1)/2 DATA0 ,@ FILE.write("vt %s %s\n" % (u, v))DATA ,DATA , for v in Vertices: DATA$ -  x, y, z = v.no DATA4 -p FILE.write("vn %s %s %s\n" % (x, y, z))>DATA - >DATA . p = 0DATA .@ total = len(faces)V?DATA .=|>DATA . for face in faces:cDATA / p = p+1!DATA /P if (p%1000) == 0:DATAL / print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA 0 v'>DATA 0P FILE.write("f ")DATA, 0 for index in range(len(face.v)):DATA4 1 v = face.v[index].index + vertexcountDATA0 1` if has_uvco: DATA< 1 FILE.write("%s/%s/%s " % (v+1, v+1, v+1))cDATA( 20 else: DATA4 2 FILE.write("%s//%s " % (v+1, v+1))>DATA 2 FILE.write("\n")DATA 30DATA4 3` vertexcount = vertexcount + len(Vertices){>DATA@ 3 print("Export of " +str(ObjName)+ ".obj finished.\n") DATA 40 DATA$ 4`#================================DATA4 4def CreateMtlFile (name, MeshMaterials, MtlList):>DATA$ 5#================================>DATA 5` global gFilename DATA 5DATA 5 # try to export materialsDATA8 6  directory, mtlname = os.path.split(gFilename.val)DATA 6 mtlname = name + ".mtl"xDATA4 6 filename = os.path.join(directory, mtlname)DATA$ 70 file = open(filename, "w")DATA 7DATA< 7 file.write("# Materials for %s.\n" % (name + ".obj"))DATA, 8  file.write("# Created by Blender.\n")DATAl 8 file.write("# These files must be in the same directory for the materials to be read correctly.\n\n")DATA 9 e?DATA 9P MatList = Material.Get()DATA 9WADATA 9 counter = 1>DATA : found = 0 DATA :PƖ>DATA( : for material in MeshMaterials:DATA : for mtl in MtlList:/?DATA ;  if material == mtl:DATA ;p found = 1-DATA ;DATA$ ; MtlList.append(material) >DATA <@ DATA < if found == 0: IDATA4 < file.write("newmtl %s \n" % material)DATA =0 index = 0DATA( =p while index < len(MatList):DATA4 = if material == MatList[index].name:?DATA( >  mtl = MatList[index]DATA( >p index = len(MatList)DATA > found = 1DATA4 ? index = index + 1 Y*DATA ?p_h?DATA ? if found == 1:DATA$ ? alpha = mtl.AlphaDATAT @@ file.write(" Ka %s %s %s \n" % (1-alpha, 1-alpha, 1-alpha))DATAL @ file.write(" Kd %s %s %s \n" % (mtl.R, mtl.G, mtl.B))DATAX A@ file.write(" Ks %s %s %s \n" % (mtl.SpecR, mtl.SpecG, mtl.SpecB))DATA0 A file.write(" illum 1\n")DATA B  else:DATA@ B` file.write(" Ka %s %s %s \n" % (0, 0, 0))?DATA@ B file.write(" Kd %s %s %s \n" % (1, 1, 1))>DATA@ C@ file.write(" Ks %s %s %s \n" % (1, 1, 1))>DATA0 C file.write(" illum 1\n")u>DATA DDATA D@ found = 0?DATA DDATA D file.flush()DATA D file.close()DATA E0I?DATA0 E`#=============================================>DATAH Edef UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): >DATA0 F0#=============================================>DATA F global vertexcount DATA F global multiflagDATA G DATA8 GP FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA, G FILE.write("o %s\n\n" % (ObjName))lDATA H DATA H@ index = 0Α>DATA H VertexList = []DATA H for vertex in Vertices:DATA I VertexList.append(-1)DATA I` index = index + 1DATA@ I print("number of vertices is " +str(len(VertexList)))DATA J DATA JP Totalindex = 0ֿDATA J ix = 0DATA J NewVertexList = []DATA K  NewVertexCo = []DATA0 K` for m in range(len(MtlList)): DATA4 K # Group name is the name of the mesh DATA$ L  if MtlList[m]: DATA< Lp FILE.write("g %s\n" % (MtlList[m]+str(m+1))) DATA L else:DATA8 M  FILE.write("g %s\n" % ("Null"+str(m+1)))>DATA$ M FILE.write("s off\n\n") DATA M DATA8 N FILE.write("usemtl %s\n\n" % (MtlList[m])) >DATA Np L?DATA N for face in faces:.>DATA N if face.mat == m:DATA( O@ for vertex in face.v:DATA( O v = vertex.index "?DATA, O if VertexList[v] < 0:>DATA4 P@ VertexList[v] = TotalindexDATA0 P NewVertexList.append(v)DATA4 Q Totalindex = Totalindex + 1?DATA Q` D?DATA, Q for v_old in NewVertexList: DATA, Q vert = Vertices[v_old].co DATA$ RP if multiflag == 1:DATA0 R vert = Alter(vert, Transform) DATA( S x, y, z = vert ڿDATA8 SP FILE.write("v %s %s %s\n" % (x, y, z)))?DATA, S NewVertexCo.append([x,y,z])DATA TDATA T@ if has_uvco:DATA, T for v_old in NewVertexList:DATA4 T u, v, z = Vertices[v_old].uvco >DATA U@ u = (u-1)/2=DATA, U v = (v-1)/2 DATA4 U FILE.write("vt %s %s\n" % (u, v))DATA VPDATA( V for v_old in NewVertexList: DATA4 V x, y, z = Vertices[v_old].no DATA8 W0 FILE.write("vn %s %s %s\n" % (x, y, z))DATA W DATA W for face in faces:DATA X if face.mat == m:?DATA$ X` FILE.write("f ")DATA4 X for index in range(len(face.v)):DATA, Y v = face.v[index].indexDATA, Yp v_new = VertexList[v] DATA8 Y if has_uvco: DATAL Z0 FILE.write("%s/%s/%s " % (v_new+1, v_new+1, v_new+1))DATA0 Z else: DATAD [ FILE.write("%s//%s " % (v_new+1, v_new+1))DATA$ [ FILE.write("\n")Q>DATA [DATA \ FILE.write("\n")DATA \PDATA \ NewVertexList = []DATAP \ print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")/>DATA ]P DATAL ] print("Export of " +str(ObjName)+ ".obj using groups finished.\n")DATA ^uDATA@ ^0#===========================================================DATAL ^def UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): ,#DATA@ _ #=========================================================== >DATA _ global vertexcountDATA _ global multiflagDATA ` DATA8 `P FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA, ` FILE.write("g %s\n\n" % (ObjName)) >DATA a /DATA0 b  vert = Alter(vert, Transform) DATA b x, y, z = vertDATA4 b FILE.write("v %s %s %s\n" % (x, y, z))DATA$ e x, y, z = v.no DATA4 f FILE.write("vn %s %s %s\n" % (x, y, z))DATA f`DATA f total = len(faces)C>DATA f p = 0~?DATA0 g  for m in range(len(MtlList)): cDATA4 g FILE.write("usemtl %s\n" % (MtlList[m])) DATA g for face in faces:~?DATA h0 if face.mat == m:DATA h p = p+1DATA$ h if (p%1000) == 0:DATAP i print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA iٓDATA$ i FILE.write("f ")=DATA4 j for index in range(len(face.v)):O\DATA< jp v = face.v[index].index + vertexcount DATA8 j if has_uvco: DATA@ k@ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA0 k else: DATA< l FILE.write("%s//%s " % (v+1, v+1))DATA$ l FILE.write("\n")DATA lDATA4 m vertexcount = vertexcount + len(Vertices) DATAT m` print("Export of " +str(ObjName)+ ".obj using material layers finished.\n") DATA m7=DATA, n#========================================cDATA( npdef CreateMatrix(object, Transform):7?DATA, n#========================================DATA o  Mx = []>DATA o` My = []DATA o Mz = []DATA o T1 = []DATA p  Transform = []=DATA p`DATA p angle = object.RotXDATA p Mx.append([1, 0, 0])DATA q y = math.cos(angle)?DATA qP z = -math.sin(angle)DATA q Mx.append([0, y, z])DATA q y = math.sin(angle)DATA r z = math.cos(angle)DATA rP Mx.append([0, y, z])DATA rEDATA r angle = object.RotY?DATA s x = math.cos(angle)DATA s@ z = math.sin(angle)?DATA s My.append([x, 0, z])DATA s My.append([0, 1, 0])DATA t x = -math.sin(angle)DATA t@ z = math.cos(angle)?DATA t My.append([x, 0, z])DATA tM=DATA t angle = object.RotZDATA u0 x = math.cos(angle)?DATA up y = -math.sin(angle)DATA u Mz.append([x, y, 0])DATA u x = math.sin(angle)DATA v0 y = math.cos(angle)DATA vp Mz.append([x, y, 0])DATA v Mz.append([0, 0, 1])DATA vDATA w  m0 = Mx[0]DATA w` m1 = Mx[1]DATA w m2 = Mx[2]8?DATA w for row in My:DATA x  x, y, z = rowDATA( x` nx = x*m0[0] + y*m1[0] + z*m2[0]DATA( x ny = x*m0[1] + y*m1[1] + z*m2[1]?DATA( y nz = x*m0[2] + y*m1[2] + z*m2[2]DATA yP T1.append([nx, ny, nz])DATA yDATA y m0 = T1[0]DATA z m1 = T1[1]DATA zP m2 = T1[2]DATA z for row in Mz:DATA  return nvTXd  p Z0TXOBJIO_wings_fix.py 愐, 珐  DATA 愐d:\OBJIO_wings_fix.pyDATA   JDATA  P P&DATA P 慐  琠5DATA 慐 P 'DATA   慐 @?DATA  P 瑐JDATA P 憐  EDATA 憐 P 璀IDATA   憐 G@DATA  P p(DATA P 懐  i@DATA 懐 P DATA   懐 @HDATA  P I`DATA P 成  @DATA 成 P p4DATA   成 JDATA  P PGDATA P 扐  LDATA 扐 P @@DATA   扐 痰KEERFDATA  P 0KdaehDATA P 抐  瘰W@DATA 抐 P 0NDATA   抐 癰H0DATA  P DATA P 拐  ODATA 拐 P 皠M~DATA   拐 HDATA  P 盠IbDATA P 挐  WDATA 挐 P 眠JBDATA   挐 DATA  P p.xifDATA P 捐  睠IDATA 捐 P N^HDATA   捐 瞠PDATA  P ODATA P 掐  矠MDATA 掐 P NDATA   掐 砠NDATA  P <@DATA P 提  硐DATA 提 P DATA   提 WDATA  P 碀UDATA P 搐  TDATA 搐 P 磀WDATA   搐 UDATA  P 礀XDATA P 摐  XDATA 摐 P 祠DATA   摐 P\DATA  P R@@DATA P 撐  禐WDATA 撐 P UDATA   撐 秐N|pDATA  P RDATA P 擐  稐NDATA 擐 P DKDATA   擐 @WDATA  P W@DATA P 攐  @?DATA 攐 P 窰CDATA   攐 DATA  P  t0/DATA  P >DATA P   >DATA   P ?DATA    ?`%DATA  P  ?$DATA P   @DATA   P @0"DATA    @DATA  P  @,DATA P   ADATA   P AP!DATA    ADATA  P  A)DATA P   B@9DATA   P B&DATA    C"DATA  P  CP(DATA P   C%DATA   P D1DATA    D`3DATA  P  D3DATA P   E DATA   P EPDATA    E#DATA  P  E+DATA P   FP*DATA   P F-DATA    G*DATA  P  Gp-DATA P   G*DATA   P H0DATA    H`&DATA  P  HDATA P   HDATA   P I0DATA    I`7DATA  P  I;DATA P   J05DATA   P JDATA    JDATA  P  J3DATA P   KPDATA   P K*DATA    K2DATA  P  L@*DATA P   LDATA   P L DATA    M DATA  P  MPDATA P   MDATA   P MDATA    N$DATA  P  N`DATA P   NDATA   P NDATA    O0DATA  P  OpDATA P   ODATA   P ODATA    P0'DATA  P  PDATA P   PDATA   P QDATA    Q0*DATA  P  Q'DATA P   Q*DATA   P R@DATA    Rp DATA  P  R DATA P   RDATA   P S0DATA    SDATA  P  SDATA P  SDATA  P T0$DATA  ! TDATA ! !P TDATA !P ! ! UDATA ! ! !P UPDATA ! " ! UDATA " "P ! UDATA "P " " V*DATA " " "P V`DATA " # " VDATA # #P " VDATA #P # # WDATA # # #P W@!DATA # $ # W DATA $ $P # W!DATA $P $ $ X0DATA $ $ $P XpDATA $ % $ XDATA % %P $ XDATA %P % % Y0DATA % % %P YpDATA % & % YDATA & &P % YDATA &P & & Z DATA & & &P Z`DATA & ' & Z'DATA ' 'P & ZUDATA 'P ' ' [pDATA ' ' 'P [ DATA ' ( ' [DATA ( (P ' \0.DATA (P ( ( \DATA ( ( (P \DATA ( ) ( ]DATA ) )P ( ]PDATA )P ) ) ].DATA ) ) )P ]6DATA ) * ) ^P#DATA * *P ) ^DATA *P * * ^DATA * * *P _@ DATA * + * _DATA + +P * _1DATA +P + + ` DATA + + +P `PDATA + , + `DATA , ,P + `DATA ,P , , a@(DATA , , ,P aDATA , - , aHDATA - -P , bP2DATA -P - - bDATA - - -P b9DATA - . - cPADATA . .P - cGDATA .P . . d0DATA . . .P d`DATA . / . dDATA / /P . d3DATA /P / / e@<DATA / / /P eMDATA / 0 / f0DATA 0 0P / f`HDATA 0P 0 0 fMDATA 0 0 0P g`KDATA 0 1 0 gJDATA 1 1P 0 h`DATA 1P 1 1 h=DATA 1 1 1P iDATA 1 2 1 i@1DATA 2 2P 1 i1DATA 2P 2 2 j1DATA 2 2 2P j`DATA 2 3 2 jDATA 3 3P 2 jDATA 3P 3 3 k 7DATA 3 3 3P kDATA 3 4 3 k1DATA 4 4P 3 l0 DATA 4P 4 4 lDATA 4 4 4P l;DATA 4 5 4 m +DATA 5 5P 4 mkDATA 5P 5 5 n DATA 5 5 5P nPDATA 5 6 5 nDATA 6 6P 5 nDATA 6P 6 6 oDATA 6 6 6P oPDATA 6 7 6 o$DATA 7 7P 6 oDATA 7P 7 7 p DATA 7 7 7P ppDATA 7 8 7 pDATA 8 8P 7 p"DATA 8P 8 8 q@DATA 8 8 8P qDATA 8 9 8 q1DATA 9 9P 8 r0DATA 9P 9 9 rp'DATA 9 9 9P r2DATA 9 : 9 s &DATA : :P 9 sp&DATA :P : : sDATA : : :P t0DATA : ; : tpDATA ; ;P : tDATA ;P ; ; t DATA ; ; ;P u@PDATA ; < ; uJDATA <

DATA = =P < w>DATA =P = = x@>DATA = = =P x-DATA = > = yDATA > >P = y@DATA >P > > yDATA > > >P yDATA > ? > yDATA ? ?P > z0DATA ?P ? ? z`<DATA ? ? ?P z8DATA ? @ ? {@=DATA @ @P ? {DATA @P @ @ |DATA @ @ @P |@DATA @ A @ |DATA A AP @ |DATA AP A A |DATA A A AP }0DATA A B A }`*DATA B BP A }*DATA BP B B ~ DATA B B BP ~PDATA B C B ~DATA C CP B ~DATA CP C C 0+DATA C C CP DATA C D C DATA D DP C 0DATA DP D D 耀DATA D D DP 耰DATA D E D DATA E EP D @'DATA EP E E 聐DATA E E EP DATA E F E DATA F FP E `#DATA FP F F 肰&DATA F F FP /DATA F G F `)DATA G GP F @DATA GP G G 0.DATA G G GP 脐DATA G H G DATA H HP G 0DATA HP H H 腀 DATA H H HP "DATA H I H +DATA I IP H 膀DATA IP I I 0DATA I I IP 0DATA I J I 臀DATA J JP I 臰$DATA JP J J DATA J J JP PDATA J K J 舠DATA K KP J DATA KP K K 0-DATA K K KP 艐DATA K L K DATA L LP K !DATA LP L L `1DATA L L LP DATA L M L DATA M MP L 0DATA MP M M pDATA M M MP DATA M N M DATA N NP M @DATA NP N N 茀DATA N N NP IDATA N O N PDATA O OP N 荀DATA OP O O *DATA O O OP 02DATA O P O 莐!DATA P PP O EDATA PP P P P#DATA P P PP 菠DATA P Q P 9DATA Q QP P `'DATA QP Q Q 萰2DATA Q Q QP DATA Q R Q `DATA R RP Q 葐0DATA RP R R &DATA R R RP @DATA R S R p<DATA S SP R DATA SP S S FDATA S S SP 蓀HDATA S T S GDATA T TP S pDATA TP T T DATA T T TP DATA T U T @DATA U UP T pDATA UP U U 蕰DATA U U UP DATA U V U 4DATA V VP U 薀*DATA VP V V DATA V V VP DATA V W V `DATA W WP V 藠DATA WP W W -DATA W W WP PDATA W X W 蘠0DATA X XP W DATA XP X X 0DATA X X XP p-DATA X Y X DATA Y YP X DATA YP Y Y p#DATA Y Y YP DATA Y Z Y 'DATA Z ZP Y `DATA ZP Z Z 蛰+DATA Z Z ZP .DATA Z [ Z p7DATA [ [P Z 1DATA [P [ [ 0HDATA [ [ [P 蝰6DATA [ \ [ #DATA \ \P [ `(DATA \P \ \ "DATA \ \ \P (DATA \ ] \ p*DATA ] ]P \ 3DATA ]P ] ] 0 DATA ] ] ]P 蠀8DATA ] ^ ] $DATA ^ ^P ] @DATA ^P ^ ^ p$DATA ^ ^ ^P DATA ^ _ ^ DATA _ _P ^ `DATA _P _ _ 袠&DATA _ _ _P -DATA _ ` _ PDATA ` `P _ 裀DATA `P ` ` !DATA ` ` `P 1DATA ` a ` 褀DATA a aP ` 褰DATA aP a a DATA a a aP @DATA a b a 襀-DATA b bP a 3DATA bP b b @DATA b b bP 覐DATA b c b DATA c cP b !DATA cP c c pNDATA c c cP DATA c d c DATA d dP c p0DATA dP d d 9DATA d d dP @'DATA d e d 詐KDATA e eP d )DATA eP e e p!DATA e e eP ?DATA e f e 0-DATA f fP e 諐8DATA fP f f DATA f f fP PDATA f g f 謀1DATA g gP f SDATA gP g g `DATA g g gP 譐CDATA g h g EDATA h hP g pCDATA hP h h DATA h h hP 0DATA h i h pDATA i iP h 诠5DATA iP i i )DATA i i iP `DATA i j i 谐DATA j jP i DATA jP j j DATA j j jP `DATA j k j 豰DATA k kP j <DATA kP k k pDATA k k kP 負DATA k l k DATA l lP k DATA lP l l pDATA l l lP 賰/DATA l m l 0DATA m mP l p#DATA mP m m ;DATA m m mP 0DATA m n m p6DATA n nP m #DATA nP n n DATA n n nP `6DATA n o n DATA o oP n DATA oP o o @DATA o o oP 跐&DATA o p o %DATA p pP o 0)DATA pP p p 踐1DATA p p pP .DATA p q p P2DATA q qP p 蹰DATA qP q q *DATA q q qP @(DATA q r q 躠!DATA r rP q .DATA rP r r P%DATA r r rP 軠4DATA r s r )DATA s sP r `DATA sP s s 輐DATA s s sP )DATA s t s 02DATA t tP s 轐DATA tP t t *DATA t t tP @2DATA t u t 辠DATA u uP t 'DATA uP u u 3DATA u u uP 迀5DATA u v u DATA v vP u DATA vP v v `DATA v v vP DATA v w v 0DATA w wP v `*DATA wP w w )DATA w w wP 4DATA w x w €KDATA x xP w -DATA xP x x `@DATA x x xP DATA x y x DATA y yP x PDATA yP y y ĠDATA y y yP DATA y z y MDATA z zP y ŠDATA zP z z IDATA z z zP PDATA z { z ƀ)DATA { {P z $DATA {P { { 0)DATA { { {P ǐ DATA { | { DATA | |P {  DATA |P | | P DATA | | |P ȐDATA | } | DATA } }P | DATA }P } } @DATA } } }P ɀDATA } ~ } DATA ~ ~P } DATA ~P ~ ~ @DATA ~ ~ ~P ʀDATA ~  ~ DATA  P ~ DATA P   0DATA   P pDATA    ˰DATA  P  DATA P 瀐  0DATA 瀐 P pDATA   瀐 ̰DATA  P DATA P 灐  0DATA 灐 P `DATA   灐 ͠DATA  P DATA P 炐  DATA 炐 P `DATA   炐 ΠDATA  P DATA P 烐  DATA 烐 P `DATA   烐 ϐ DATA  P DATA P 焐   DATA 焐 P PDATA   焐 АDATA  P &DATA P 煐  &DATA 煐 P p&DATA   煐 DATA  P DATA P 熐  @ DATA 熐 P Ҁ DATA   熐 DATA  P DATA P 燐  @DATA 燐 P Ӏ%DATA   燐 %DATA  P %DATA P 爐  p#DATA 爐 P DATA   爐 ?DATA  P `<DATA P 牐  DATA 牐 P DATA   牐 @DATA  P p'DATA P 犐  DATA 犐 P 'DATA   犐 ` DATA  P נ DATA P 狐  DATA 狐 P DATA   狐 PDATA  P ؠDATA P 猐  DATA 猐 P DATA   猐 `DATA  P ٠DATA P 獐  DATA 獐 P !DATA   獐 `DATA  P ڰ4DATA P 玐  DATA 玐 P @DATA   玐 ۀDATA  P DATA P 珐  DATA 珐 P 0 DATAL #=========================================================================DATA( P# Wavefront OBJ Importer/Exporter v1.2DATA8 琠# This is a complete OBJ importer and exporter scriptDATA # All Rights ReservedDATA @# chris@artdreamdesigns.com DATAL 瑐#=========================================================================DATAH # DESCRIPTION: This script allows for full importing and exporting ofDATAL 璀# .obj files. uv texture coordinates and normals can be exported and 1DATAH # imported. .obj groups and materials can also be converted to andDATA, p# from material indexes in Blender.DATA #EEDATA # INSTALLATION:DATAL @# You need the FULL python installation to run this script. You canDATAL # down load the latest version of PYTHON from http://www.python.org.DATA @#DATA8 p# INSTRUCTIONS (You definitely want to read this!): DATAL # Once the script is loaded in Blender, hit alt-p. This will bring upDATAH P# the main interface panel. You will have a choise of exporting orDATAP # importing an .obj module. If you are exporting you must have at leastDATAD @# one mesh selected in Blender, or you will get an error. DATAL 痰# You can change the export filename by entering the path and filenameDATAL 0# in the dialog. If you do not enter a path, the path will default toDATAX 瘰# your blender directory. You can change the default path in the script <==== NOTEDATAP 0# itself by modifying the variable 'Filename' at the top of the script. DATA 癰#EEDATA # EXPORTING:DATAP # There are 4 different export options: Default, Groups, Material Layers, DATAP 皠# and Standard. "Default" will export your mesh using Material Layers ifdDATAL # the mesh has material indexes. "Groups" and "Material Layers" areDATAL 盠# logically equivalent, but are a different .obj format. If you are DATAX # exporting a Poser morph target, you must select "Material Layers". <===== NOTEDATAL 眠# "Standard" will ignore grouping information, even if your mesh has DATA # material indexes.DATA p#DATAL 睠# There is also a choice between export using "mesh coordinates" or DATAP # "object coordinates". "Object coordinates" are any location, rotation, DATAT 瞠# or scaling values created outside of mesh edit. They belong to the object:\|DATAP # rather than the mesh. If you export using mesh coordinates (the default)DATAP 矠# the center of the object will always be at 0, 0, 0. Export using "meshDATAP # coordinates is definintely what you want to use if you are working withDATAP 砠# a Poser morph target. If you are exporting a group of objects, you willDATA@ # automatically be placed in "object coordinate" mode. DATA 硐#DATA # IMPORTING:DATAX # If your OBJ model has uv mapping coordinates, and you want to use them <===== NOTE DATAX 碀# in Blender, you can access them in two ways. The best way is through Blender'sDATAX # realtime UV coordinates which you enable simply by selecting the UV option inDATAX 磀# the material edit window. This gives you an exact version of the uv coordinates.DATAX # An older method is to select the "stick" option in the material edit window. IDATA\ 礀# really don't know why anyone would want to use this option since it cannot handleDATA\ # seams and texture overlap, but I left it in just in case someone could use it forDATA 祠# something.DATA # DATAT # If your OBJ contains groups, once it has been imported, it may still appearDATAX 禐# to lack any material indexes. If this happens, it can be remedied <=== NOTEDATAX # by going to the mesh editor window, clicking on the mesh selection button, andDATAP 秐# reselecting the mesh you have just imported. You will now have as many DATAT # materials attached to your object as there are groups. You can then select DATAP 稐# different groups by doing a material select when you are in edit mode. DATA #DATAX @# Finally, you might have problems with certain parts of the object not displayingDATAX # after you go in and out of edit mode the first time. To fix this, simply go intoDATA@ @# edit mode again, and select the "remove doubles" option.DATA 窰#DATA #DATA # HISTORY:DATA$ P# Nov 13, 2001: Initial ReleaseDATAP 章# Nov 16, 2001: Version 1.1 - no longer need to pre-define dummy materialsDATAp # Dec 13, 2001: Version 1.2 - now imports into realtime UV (the UV button in the material edit window), and?DATAp # exports realtime UV. This format is more compatible with the native .OBJ uv format. Should eliminateDATAt `# texture misalignments and seams. Simply press the UV button in the material edit window after importing.DATA #DATAT 0# Aug 17, 2002: CW: Changed spec to 0 and alpha to 1 in the lines starting at 466.DATA$ 箰# (To help import from wings)DATA #D DATA$ 0#================================DATA 節pDATA 篰DATA$ # ===============================DATA 0# Setup our runtime constantsDATA$ 簀# ===============================DATA YDATA8 DEBUG=1 # Set this to "1" to see extra messagesDATA4 `MESHVERSION=3 # If the export file doesn't work,DATA, FILEVERSION=3 # try changing these to "2"DATA DATA PEVENT_PATHCHANGE= 1DATA 粐EVENT_IMPORT= 2DATA EVENT_IMPORT_CONT= 3DATA EVENT_OPTIONS= 4DATA PEVENT_EXPORT= 7DATA 糐EVENT_EXPORT_CHK= 5DATA EVENT_EXPORT_CANCEL= 6DATA EVENT_QUIT= 8DATA PEVENT_EXPORT_ERR= 9DATA 紐EVENT_TYPE= 10DATA EVENT_DONE= 11DATA 0DATA$ `# ===============================DATA 絰# Import our librariesDATA$ # ===============================DATA @DATA pimport stringDATA 綰import osDATA import structDATA 0import mathDATA pimport Blender210DATA 緰from Blender import *DATA from Blender import NMeshDATA @from Blender.Draw import *DATA 縐from Blender.BGL import *DATA DATA$ # ===============================DATA `# Input VariablesDATA$ 繠# ===============================DATA DATA< Filename = "C:\\My Documents\\Data\Objects\\armchair.obj"DATA0 纐#Filename = "C:\\Data\Objects\\VickiHead.obj"DATA gFilename=Create(Filename)DATA @gAlert = 0DATA 绀type = 1DATA exporttype = 1DATA returncode = 0DATA @operation = "Export"DATA 缀center = [0,0,0]DATA rotation = [0,0,0]DATA Transform = []DATA @multiflag = 0dDATA 罀DATA$ 罰#================================DATA def ExitGUI ():DATA$ @#================================DATA 羐 Exit()DATA DATA$ #================================DATA @def EventGUI (event):DATA$ 翀#================================DATA  global gFilename DATA  global ExportOptionsDATA ` global ExportTypeDATA  global typeDATA  global exporttypeDATA  global operationDATA ` global gAlertDATA DATA  if (event==EVENT_IMPORT):DATA0  ImportFunction(gFilename.val, type)DATA € operation = "Import"DATA(  if (event==EVENT_IMPORT_CONT):DATA  gAlert = 0DATA ` operation = "Import"DATA ð Draw ()DATA  if (event==EVENT_EXPORT):DATA0 @ ExportFunction(gFilename.val, type)DATA Ġ operation = "Export"DATA$  if (event==EVENT_EXPORT_CHK):DATA0 @ ExportFunctionOK(gFilename.val, type) DATA Š Draw ()DATA(  if (event==EVENT_EXPORT_CANCEL):DATA 0 gAlert = 0DATA p Draw ()DATA$ ư if (event==EVENT_OPTIONS):DATA$  type = ExportOptions.val DATA P Draw ()DATA ǐ if (event==EVENT_TYPE):DATA(  exporttype = ExportType.val DATA 0 Draw ()DATA( p if (event==EVENT_EXPORT_ERR): DATA  gAlert = 0 DATA  Draw ()DATA P if (event==EVENT_DONE): DATA ɠ gAlert = 0DATA  Draw ()DATA  if (event==EVENT_QUIT):DATA p ExitGUI()DATA ʰDATA$ #================================DATA 0def DrawGUI():DATA$ p#================================DATA  global typeDATA  global exporttypeDATA @ global operation DATA ̀DATA$ ̰ glClearColor (0.6,0.6,0.6,0)DATA$  glClear (GL_COLOR_BUFFER_BIT)DATA P DATA ̀ global gFilenameDATA  global gAlertDATA  global ExportOptionsDATA P global ExportTypeDATA ΐDATA  if (gAlert==0):DATA4  # Add in the copyright notice and titleDATA ` glRasterPos2d(32, 380)DATA4 ϰ Text("Wavefront OBJ Importer/Exporter")DATA  glRasterPos2d(32, 350)DATA0 ` Text("Copyright (C) Chris Lynch 2001")DATA DATAx  gFilename=String ("Filename: ",EVENT_PATHCHANGE,32,250,320,32,gFilename.val,255,"Full pathname and filename")DATA8 ѐ Button ("Export",EVENT_EXPORT,32,200,100,32)DATA8  Button ("Import",EVENT_IMPORT,252,200,100,32)DATA P glRasterPos2d(32, 165)DATA( Ҡ Text("Select Export Options:")DATAh  options = "Export Options %t| Default %x1| Material Layers %x2| Obj Groups %x3| Standard %x4"DATAL Ӏ ExportOptions = Menu (options,EVENT_OPTIONS,200,150,150,32, type)DATA4  Button ("Done",EVENT_QUIT,142,50,100,32)DATA ` glRasterPos2d(32, 115)DATA ԰ Text("Export using ")DATAT  options = "Export Type %t| Mesh Coordinates %x1| Object Coordinates %x2"DATAL Հ ExportType = Menu (options,EVENT_TYPE,170,100,180,32, exporttype)DATA4  Button ("Done",EVENT_QUIT,142,50,100,32)DATA `DATA ֐ elif (gAlert==1):DATA  glRasterPos2i (32,250)DATA@  Text (gFilename.val+ " already exists. Save anyway?") DATA8 א Button ("Save",EVENT_EXPORT_CHK,150,200,50,32)DATA@  Button ("Cancel",EVENT_EXPORT_CANCEL,250,200,50,32)DATA ` gAlert = 0DATA ؠ elif (gAlert==2):DATA  glRasterPos2i (32,250)DATAT 0 Text (gFilename.val+ " cannot be found. Check directory and filename.") DATA@ ٰ Button ("Continue",EVENT_IMPORT_CONT,32,190,70,32) DATA  gAlert = 0DATA ` elif gAlert == 3:DATA ڠ glRasterPos2i (32,250)DATAX  Text ("No objects selected to export. You must select one or more objects.") DATA< p Button ("Continue",EVENT_EXPORT_ERR,192,200,70,32)DATA  gAlert = 0DATA  elif gAlert == 5:DATA ` glRasterPos2i (32,250)DATA, ܰ Text ("Invalid directory path.") DATA<  Button ("Continue",EVENT_EXPORT_ERR,192,200,70,32)DATA ݀ gAlert = 0DATA  else:DATA  glRasterPos2i (32,250)DATAH P Text (str(operation)+ " of " +str(gFilename.val)+ " done.") DATA8  Button ("Continue",EVENT_DONE,192,200,70,32)DATA  DATA$ `#================================DATA ߰def RegisterGUI ():DATA$ #================================DATA$ @ Register (DrawGUI,None,EventGUI)DATA DATA$ #================================DATA # MAIN SCRIPTDATA$ P#================================DATA$ # Opens a file, writes data in itDATA # and closes it up.DATA$ 0#================================DATA RegisterGUI()DATA DATA$ #================================DATA( @def ImportFunction (importName, type):DATA, #================================ DATA  global gFilename DATA 0 global gAlertDATA pDATA  try:DATA$  FILE=open (importName,"r")DATA8 0 directory, Name = os.path.split(gFilename.val)DATA(  words = string.split(Name,".")DATA  Name = words[0]DATA0 0 ObjImport(FILE, Name, gFilename.val) DATA  FILE.close()DATA  gAlert = 4DATA  Draw ()DATA P except IOError:DATA  gAlert=2DATA  Draw ()DATA DATA$ @#================================DATA( def ExportFunction (exportName, type):DATA, #================================ DATA @ global gFilename DATA  global gAlertDATA DATA  try:DATA$ 0 FILE=open (exportName,"r")DATA  FILE.close()DATA  gAlert = 1DATA  Draw ()DATA @ except IOError:DATA8  directory, Name = os.path.split(gFilename.val)DATA(  if os.path.isdir(directory):DATA0 0 ExportFunctionOK(exportName, type)DATA  Draw ()DATA  else:DATA  gAlert = 5DATA P Draw ()DATA  DATA$ #================================DATA, def ExportFunctionOK (exportName, type):DATA, p#================================ DATA  global gFilename DATA  global gAlertDATA P global returncodeDATA DATA$  FILE=open (exportName,"w")DATA8  directory, Name = os.path.split(gFilename.val)DATA( p words = string.split(Name,".")DATA  Name = words[0]DATA$  ObjExport(FILE, Name, type)DATA P if returncode > 0:DATA  gAlert = 3DATA  else:DATA  gAlert = 4DATA ` FILE.flush()DATA  FILE.close()DATA DATA #=========================DATA( `def ObjImport(file, Name, filename):DATA #========================= DATA  vcount = 0DATA @ vncount = 0DATA  vtcount = 0DATA  fcount = 0DATA  gcount = 0DATA @ setcount = 0DATA  groupflag = 0DATA  objectflag = 0DATA  mtlflag = 0DATA @ baseindex = 0DATA  basevtcount = 0DATA  basevncount = 0DATA  matindex = 0 DATA @DATA p pointList = []DATA  uvList = []DATA  normalList = []DATA 0 faceList = []DATA p materialList = []DATA  uv = [] DATA  lines = file.readlines()DATA @ linenumber = 1DATA DATA  for line in lines:DATA$  words = string.split(line)DATA( @ if words and words[0] == "#":DATA$  pass # ignore commentsDATA(  elif words and words[0] == "v":DATA 0 vcount = vcount + 1DATA  x = float(words[1])DATA  y = float(words[2])DATA  z = float(words[3])DATA( p pointList.append([x, y, z])DATA DATA,  elif words and words[0] == "vt":DATA$ P vtcount = vtcount + 1DATA  u = float(words[1])DATA  v = float(words[2])DATA$ @ uvList.append([u, v])DATA DATA,  elif words and words[0] == "vn":DATA$  vncount = vncount + 1DATA p i = float(words[1])DATA  j = float(words[2])DATA  k = float(words[3])DATA, ` normalList.append([i, j, k])DATA DATA(  elif words and words[0] == "f":DATA @ fcount = fcount + 1DATA(  vi = [] # vertex indicesDATA(  ti = [] # texture indicesDATA( 0 ni = [] # normal indicesDATA  words = words[1:]DATA  lcount = len(words)DATA,   for index in (xrange(lcount)):DATA8  if string.find(words[index], "/") == -1:DATA0  vindex = int(words[index])DATAH @ if vindex < 0: vindex = baseindex + vindex + 1 DATA(  vi.append(vindex)DATA  else:DATA< @ vtn = string.split(words[index], "/")DATA(  vindex = int(vtn[0])DATAD  if vindex < 0: vindex = baseindex + vindex + 1 DATA( p vi.append(vindex) DATA  DATA0  if len(vtn) > 1 and vtn[1]:DATA, ` tindex = int(vtn[1])DATAH  if tindex < 0: tindex = basevtcount +tindex + 1DATA( 0 ti.append(tindex)DATA DATA0  if len(vtn) > 2 and vtn[2]:DATA,  nindex = int(vtn[2])DATAH p if nindex < 0: nindex = basevncount +nindex + 1DATA8  ni.append(nindex) DATA4 @ faceList.append([vi, ti, ni, matindex])DATA DATA(  elif words and words[0] == "o":DATA$  ObjectName = words[1]DATA p objectflag = 1DATA0  #print "Name is %s" % ObjectNameDATA DATA( P elif words and words[0] == "g":DATA  groupflag = 1DATA  index = len(words)DATA @ if objectflag == 0:DATA  objectflag = 1DATA  if index > 1:DATA< 0 ObjectName = string.join(words[1:],"_")DATA<  GroupName = string.join(words[1:],"_") DATA  else:DATA, P ObjectName = "Default" DATA,  GroupName = "Default" DATA8  #print "Object name is %s" % ObjectNameDATA8 p #print "Group name is %s" % GroupNameDATA  else:DATA  if index > 1:DATA< ` GroupName = string.join(words[1:],"_") DATA  else:DATA,  GroupName = "Default" DATA8 p #print "Group name is %s" % GroupNameDATA  DATA  if mtlflag == 0:DATAL P matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$  gcount = gcount + 1 DATA  DATA P if fcount > 0: DATA$  baseindex = vcountDATA(  basevncount = vncountDATA( @ basevtcount = vtcountDATA DATA0  elif words and words[0] == "mtllib":DATA(   # try to export materialsDATA8 p directory, dummy = os.path.split(filename)DATA<  filename = os.path.join(directory, words[1])DATA @ try:DATA,  file = open(filename, "r")DATA  except:DATA8   print "no material file %s" % filenameDATA  else:DATA  mtlflag = 1DATA,  file = open(filename, "r")DATA( p line = file.readline()DATA  while line:DATA0  words = string.split(line)DATA8 p if words and words[0] == "newmtl":DATA(  name = words[1]DATA8   line = file.readline() # Ns ?DATA4  words = string.split(line)DATA\  while (words[0] != "Ka" and words[0] != "Kd" and words[0] != "Ks"): DATA8 p line = file.readline() # KaDATA8  words = string.split(line)DATA, 0 if words[0] == "Ka":DATA0  Ka = [float(words[1]),DATA0  float(words[2]),DATA0 P float(words[3])]DATA8  line = file.readline() # KdDATA4  words = string.split(line)DATA, p if words[0] == "Kd":DATA0  Kd = [float(words[1]),DATA0 0 float(words[2]),DATA0  float(words[3])]DATA8  line = file.readline() # Ks DATA4 !P words = string.split(line)DATA, ! if words[0] == "Ks":DATA0 " Ks = [float(words[1]),DATA0 "p float(words[2]),DATA0 " float(words[3])]DATA #0DATAD #` matindex = AddGlobalMaterial(name, matindex) DATA0 # matlist = Material.Get() DATA, $0 if len(matlist) > 0:DATA8 $ material = matlist[matindex]DATA, $ material.R = Kd[0]DATA, %P material.G = Kd[1]DATA, % material.B = Kd[2]DATA, & material.SpecR = 0DATA, &p material.SpecG = 0DATA, & material.SpecB = 0DATA$ '0 alpha = 1DATA0 ' material.Alpha = alphaDATA ' else:DATA( (0 mtlflag = 0DATA (DATA, ( line = file.readline()DATA ) file.close()DATA )`DATA0 ) elif words and words[0] == "usemtl":DATA ) #if mtlflag == 1:DATA *@ name = words[1]DATAL * matindex = AddMeshMaterial(name, materialList, matindex) DATA + # elif words: DATA4 +P # print "%s: %s" % (linenumber, words)DATA$ + linenumber = linenumber + 1DATA , file.close()DATA ,@DATA ,p # import in BlenderDATA , DATA( , print "import into Blender ..." DATA -0 mesh = NMesh.GetRaw ()DATA -DATA - i = 0DATA - while i < vcount: DATA .0 x, y, z = pointList[i] DATA . vert=NMesh.Vert(x, y, z)DATA . mesh.verts.append(vert)DATA /  i=i+1DATA /`DATA / if vtcount > 0:DATA / mesh.has_uvco = 1DATA, 0  print ("Object has uv coordinates")DATA 0 DATA 0 if len(materialList) > 0:DATA$ 1 mesh.mats = materialList DATA 1PDATA 1 total = len(faceList)DATA 1 i = 0DATA 2DATA 2@ for f in faceList:DATA 2 if i%1000 == 0:DATA8 2 print ("Progress = "+ str(i)+"/"+ str(total))DATA 3 DATA 3P i = i + 1DATA$ 3 vi, ti, ni, matindex = fDATA 3 face=NMesh.Face()DATA$ 40 if len(materialList) > 0:DATA 4 face.mat = matindexDATA 4DATA 5 limit = len(vi)DATA( 5@ setcount = setcount + len(vi)DATA 5 c = 0 DATA 5 DATA, 6 while c < limit: DATA 6` m = vi[c]-1DATA, 6 if vtcount > 0 and len(ti) > c:DATA 7 n = ti[c]-1DATA, 7P if vncount > 0 and len(ni) > c:DATA 7 p = ni[c]-1DATA 8DATA 80 if vtcount > 0:DATA 8 u, v = uvList[n] DATAp 8 # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0 9p mesh.verts[m].uvco[0] = (u*2)+1DATA0 9 mesh.verts[m].uvco[1] = (v*2)+1DATA :0DATA :` if vncount > 0:DATA( : if p > len(normalList):DATAd ; print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA( ; print("p = " +str(p))DATA( ; x, y, z = normalList[p] DATA( <0 mesh.verts[m].no[0] = xDATA( < mesh.verts[m].no[1] = yDATA( < mesh.verts[m].no[2] = zDATA =  c = c+1 DATA =` DATA = if len(vi) < 5:DATA, = for index in vi: DATA0 >0 face.v.append (mesh.verts[index-1])DATA > DATA > if vtcount > 0: DATA ? for index in ti:DATA( ?` u, v = uvList[index-1]DATA( ? face.uv.append((u,v))DATA @ DATA$ @0 mesh.faces.append(face) DATA @DATA0 @ print "all other (general) polygons ..."DATA A for f in faceList:DATA$ AP vi, ti, ni, matindex = f DATA A if len(vi) > 4:DATA, A # export the polygon as edgesDATA< B@ print ("Odd face, vertices = "+ str(len(vi)))DATA( B for i in range(len(vi)-2):DATA$ C face = NMesh.Face()DATA, CP if len(materialList) > 0:DATA( C face.mat = matindexDATA4 D face.v.append(mesh.verts[vi[0]-1])DATA4 D` face.v.append(mesh.verts[vi[i+1]-1])DATA4 D face.v.append(mesh.verts[vi[i+2]-1])DATA E DATA EP if vtcount > 0: DATA$ E if len(ti) > i+2:DATA, E u, v = uvList[ti[0]-1]DATA, FP face.uv.append((u,v))DATA0 F u, v = uvList[ti[i+1]-1]DATA, G face.uv.append((u,v))DATA0 Gp u, v = uvList[ti[i+2]-1]DATA, G face.uv.append((u,v))DATA H0DATA( H` mesh.faces.append(face)DATA H DATA H NMesh.PutRaw(mesh, Name,1)DATA I0DATA8 I` print ("Total number of vertices is "+ str(vcount))DATA< I print ("Total number of faces is "+ str(len(faceList)))DATA8 J0 print ("Total number of sets is "+ str(setcount))DATA JDATA JDATA4 J print("Finished importing " +str(Name)+ ".obj")DATA KPDATA, K#=========================================DATA4 Kdef AddMeshMaterial(name, materialList, matindex):DATA, L@#=========================================DATA L DATA L index = 0DATA M found = 0 DATA MP limit = len(materialList)DATA MDATA M while index < limit:DATA( N if materialList[index] == name:DATA N` matindex = index DATA N found = 1DATA N index = limitDATA O0 index = index + 1DATA Op DATA O if found == 0: DATA O materialList.append(name)DATA( P0 matindex = len(materialList)-1 DATA P DATA P return matindexDATA QDATA, Q0#=========================================DATA( Qdef AddGlobalMaterial (name, matindex):DATA, Q#=========================================DATA R@ DATA Rp index = 0DATA R found = 0DATA R matindex = 0DATA S0 MatList = Material.Get()DATA S limit = len(MatList)DATA SDATA S while index < limit:DATA( T0 if MatList[index].name == name:DATA T matindex = index DATA T found = 1DATA U index = limitDATA UP index = index + 1DATA UDATA U if found == 0:DATA, V material = Blender210.Material(name)DATA V` matindex = indexDATA V DATA V return matindexDATA WDATA$ W@#================================DATA$ Wdef ObjExport(FILE, Name, type):DATA$ W#================================DATA X0 global returncodeDATA Xp global vertexcountDATA X global uvcountDATA X global TransformDATA Y0 global multiflagDATA Yp global exporttypeDATA YDATA Y vertexcount = 0DATA Z  uvcount = 0DATA Z` returncode = 0DATA( Z print("Writing %s..." % Name) DATAX Z FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATA [pDATA$ [ Objects = Object.GetSelected()DATA [ if Objects == []:DATA0 \0 print("You have not selected an object!")DATA \ returncode = 4DATA \ else:DATA ] for object in Objects:DATA ]P MtlList = []DATA0 ] if len(Objects) > 1 or exporttype > 1:DATA8 ] Transform = CreateMatrix(object, Transform)DATA$ ^P multiflag = 1 DATA ^ mesh = object.dataDATA ^ ObjName = mesh.nameDATA$ _@ has_uvco = mesh.has_uvcoDATA _DATA4 _ FILE.write("# Meshname:\t%s\n" % ObjName)DATA ` DATA `P faces = mesh.facesDATA ` materials = mesh.matsDATA ` Vertices = mesh.vertsDATA, a@ GlobalMaterials = Material.Get()DATA aDATAL a if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA4 bP CreateMtlFile(Name, materials, MtlList)DATA bDATA< b # Total Vertices and faces; comment if not usefulDATAD cP FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAH c FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA d0DATA d` FILE.write("\n")DATA dDATA4 d # print first image map for uvcoords to useDATA@ e@ # to be updated when we get access to other texturesDATAP e if mesh.has_uvco: FILE.write("# UV Texture:\t%s\n\n" % mesh.has_uvco)DATA f0DATAL f` if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAP f UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATAL g` elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATAL g UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATA h` else: DATA@ h Standard(faces, Vertices, has_uvco, FILE, ObjName)DATA i DATA4 i@#================================================DATA4 idef CreateMtlFile (name, MeshMaterials, MtlList):DATA4 j#================================================DATA j` global gFilename DATA jDATA j # try to export materialsDATA8 k  directory, mtlname = os.path.split(gFilename.val)DATA k mtlname = name + ".mtl"DATA4 k filename = os.path.join(directory, mtlname)DATA$ l0 file = open(filename, "w")DATA lDATA< l file.write("# Materials for %s.\n" % (name + ".obj"))DATA, m  file.write("# Created by Blender.\n")DATAl m file.write("# These files must be in the same directory for the materials to be read correctly.\n\n")DATA n DATA nP MatList = Material.Get()DATA nDATA n counter = 1DATA o found = 0 DATA oPDATA( o for material in MeshMaterials:DATA o for mtl in MtlList:DATA p  if material == mtl:DATA pp found = 1DATA pDATA$ p MtlList.append(material) DATA q@ DATA q if found == 0: DATA4 q file.write("newmtl %s \n" % material)DATA r0 index = 0DATA( rp while index < len(MatList):DATA4 r if material == MatList[index].name:DATA( s  mtl = MatList[index]DATA( sp index = len(MatList)DATA s found = 1DATA4 t index = index + 1 DATA tpDATA t if found == 1:DATA$ t alpha = mtl.AlphaDATAT u@ file.write(" Ka %s %s %s \n" % (1-alpha, 1-alpha, 1-alpha))DATAL u file.write(" Kd %s %s %s \n" % (mtl.R, mtl.G, mtl.B))DATAX v@ file.write(" Ks %s %s %s \n" % (mtl.SpecR, mtl.SpecG, mtl.SpecB))DATA0 v file.write(" illum 1\n")DATA w  else:DATA@ w` file.write(" Ka %s %s %s \n" % (0, 0, 0))DATA@ w file.write(" Kd %s %s %s \n" % (1, 1, 1))DATA@ x@ file.write(" Ks %s %s %s \n" % (1, 1, 1))DATA0 x file.write(" illum 1\n")DATA yDATA y@ found = 0DATA yDATA y file.flush()DATA y file.close()DATA z0 DATA@ z`#===========================================================DATA< zdef Standard(faces, Vertices, has_uvco, FILE, ObjName): DATA@ {@#=========================================================== DATA { global vertexcountDATA | global uvcountDATA |@ global multiflagDATA |DATA | uvPtrs = []DATA | uvList = []DATA }0DATA, }` FILE.write("o %s\n\n" % (ObjName)) DATA, } FILE.write("g %s\n\n" % (ObjName)) DATA ~  DATA ~P for v in Vertices: DATA ~ vert = v.co DATA ~ if multiflag == 1:DATA, 0 vert = Alter(vert, Transform) DATA  x, y, z = vertDATA  DATA4  FILE.write("v %s %s %s\n" % (x, y, z))DATA 耀DATA 耰 uv_flag = 0DATA  for face in faces:DATA( @ for uv in face.uv: DATA 聐 found = 0DATA  index = len(uvList)DATA  limit = 0DATA$ ` if len(uvList)-200 > 0:DATA( 肰 limit = len(uvList)-200DATA0  while index > limit and found == 0:DATA, ` uv_value = uvList[index-1]DATAD  if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA0 0 uvPtrs.append(index+uvcount)DATA 脐 found = 1DATA$  index = index - 1DATA 0 if found == 0:DATA$ 腀 uvList.append(uv)DATA$  index = len(uvList)DATA,  uvPtrs.append(index+uvcount)DATA 膀 u, v = uvDATA4  FILE.write("vt %s %s\n" % (u, v))DATA 0 uv_flag = 1 DATA 臀DATA( 臰 if has_uvco and uv_flag == 0:DATA  for v in Vertices: DATA P u, v, z = v.uvco DATA 舠 u = (u-1)/2DATA  v = (v-1)/2 DATA0 0 FILE.write("vt %s %s\n" % (u, v))DATA 艐DATA  for v in Vertices: DATA$  x, y, z = v.no DATA4 ` FILE.write("vn %s %s %s\n" % (x, y, z))DATA  DATA  p = 0DATA 0 uvindex = 0DATA p total = len(faces)DATA DATA  for face in faces:DATA @ p = p+1DATA 茀 if (p%1000) == 0:DATAL  print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA PDATA 荀 FILE.write("f ")DATA,  for index in range(len(face.v)):DATA4 0 v = face.v[index].index + vertexcountDATA$ 莐 if len(face.uv) > 0:DATAH  FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$ P uvindex = uvindex+1DATA 菠 elif has_uvco:DATA<  FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA( ` else: DATA4 萰 FILE.write("%s//%s " % (v+1, v+1))DATA  FILE.write("\n")DATA `DATA4 葐 vertexcount = vertexcount + len(Vertices)DATA(  uvcount = uvcount + len(uvList)DATA @DATA@ p print("Export of " +str(ObjName)+ ".obj finished.\n")DATA DATAH #=====================================================================DATAL 蓀def UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAH #===================================================================== DATA p global vertexcountDATA  global uvcountDATA  global multiflagDATA @DATA p uvPtrs = []DATA 蕰 uvList = []DATA DATA8  FILE.write("mtllib %s\n\n" % (Name + ".mtl"))DATA, 薀 FILE.write("g %s\n\n" % (ObjName)) DATA  DATA  for v in Vertices: DATA ` vert = v.co DATA 藠 if multiflag == 1:DATA0  vert = Alter(vert, Transform) DATA P x, y, z = vertDATA4 蘠 FILE.write("v %s %s %s\n" % (x, y, z))DATA DATA 0 uv_flag = 0DATA0 p for m in range(len(MtlList)): DATA  for face in faces:DATA  if face.mat == m:DATA$ p for uv in face.uv:DATA  found = 0DATA(  index = len(uvList)DATA ` limit = 0DATA, 蛰 if len(uvList)-200 > 0:DATA0  limit = len(uvList)-200DATA8 p while index > limit and found == 0:DATA4  uv_value = uvList[index-1]DATAL 0 if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8 蝰 uvPtrs.append(index+uvcount)DATA$  found = 1DATA, ` index = index - 1DATA$  if found == 0:DATA,  uvList.append(uv)DATA, p index = len(uvList)DATA4  uvPtrs.append(index+uvcount)DATA$ 0 u, v = uvDATA< 蠀 FILE.write("vt %s %s\n" % (u, v))DATA(  uv_flag = 1 DATA @DATA( p if has_uvco and uv_flag == 0:DATA  for v in Vertices: DATA  u, v, z = v.uvco DATA ` u = (u-1)/2DATA( 袠 v = (v-1)/2 DATA0  FILE.write("vt %s %s\n" % (u, v))DATA PDATA 裀 for v in Vertices: DATA$  x, y, z = v.no DATA4  FILE.write("vn %s %s %s\n" % (x, y, z))DATA 褀DATA 褰 total = len(faces)DATA  p = 0DATA @ uvindex = 0DATA0 襀 for m in range(len(MtlList)): DATA4  FILE.write("usemtl %s\n" % (MtlList[m])) DATA @ for face in faces:DATA 覐 if face.mat == m:DATA  p = p+1DATA$  if (p%1000) == 0:DATAP p print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA DATA$  FILE.write("f ")DATA4 p for index in range(len(face.v)):DATA<  v = face.v[index].index + vertexcount DATA( @ if len(face.uv) > 0:DATAL 詐 FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA,  uvindex = uvindex+1DATA$ p elif has_uvco:DATA@  FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA0 0 else: DATA< 諐 FILE.write("%s//%s " % (v+1, v+1))DATA$  FILE.write("\n")DATA PDATA4 謀 vertexcount = vertexcount + len(Vertices) DATAT  print("Export of " +str(ObjName)+ ".obj using material layers finished.\n") DATA ` DATAD 譐#==================================================================DATAH def UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAD p#==================================================================DATA  global vertexcount DATA 0 global multiflagDATA pDATA8 诠 FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,  FILE.write("o %s\n\n" % (ObjName))DATA ` DATA 谐 index = 0DATA  VertexList = []DATA  for vertex in Vertices:DATA ` VertexList.append(-1)DATA 豰 index = index + 1DATA@  print("number of vertices is " +str(len(VertexList)))DATA pDATA 負 Totalindex = 0DATA  ix = 0DATA  NewVertexList = []DATA p NewVertexCo = []DATA0 賰 for m in range(len(MtlList)): DATA4  # Group name is the name of the mesh DATA$ p if MtlList[m]: DATA<  FILE.write("g %s\n" % (MtlList[m]+str(m+1))) DATA 0 else:DATA8 p FILE.write("g %s\n" % ("Null"+str(m+1)))DATA$  FILE.write("s off\n\n") DATA  DATA8 ` FILE.write("usemtl %s\n\n" % (MtlList[m])) DATA  DATA  for face in faces:DATA @ if face.mat == m:DATA( 跐 for vertex in face.v:DATA(  v = vertex.index DATA, 0 if VertexList[v] < 0:DATA4 踐 VertexList[v] = TotalindexDATA0  NewVertexList.append(v)DATA4 P Totalindex = Totalindex + 1DATA 蹰 DATA,  for v_old in NewVertexList: DATA, @ vert = Vertices[v_old].co DATA$ 躠 if multiflag == 1:DATA0  vert = Alter(vert, Transform) DATA( P x, y, z = vert DATA8 軠 FILE.write("v %s %s %s\n" % (x, y, z))DATA,  NewVertexCo.append([x,y,z])DATA `DATA 輐 if has_uvco:DATA,  for v_old in NewVertexList:DATA4 0 u, v, z = Vertices[v_old].uvco DATA 轐 u = (u-1)/2DATA,  v = (v-1)/2 DATA4 @ FILE.write("vt %s %s\n" % (u, v))DATA 辠DATA(  for v_old in NewVertexList: DATA4  x, y, z = Vertices[v_old].no DATA8 迀 FILE.write("vn %s %s %s\n" % (x, y, z))DATA  DATA  for face in faces:DATA ` if face.mat == m:DATA$  FILE.write("f ")DATA4  for index in range(len(face.v)):DATA, ` v = face.v[index].indexDATA,  v_new = VertexList[v] DATA8  if has_uvco: DATAL € FILE.write("%s/%s/%s " % (v_new+1, v_new+1, v_new+1))DATA0  else: DATAD ` FILE.write("%s//%s " % (v_new+1, v_new+1))DATA$  FILE.write("\n")DATA DATA P FILE.write("\n")DATA ĠDATA  NewVertexList = []DATAP  print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")DATA Š DATAL  print("Export of " +str(ObjName)+ ".obj using groups finished.\n")DATA PDATA, ƀ#========================================DATA( def CreateMatrix(object, Transform):DATA, 0#========================================DATA ǐ Mx = []DATA  My = []DATA  Mz = []DATA P T1 = []DATA Ȑ Transform = []DATA DATA  angle = object.RotXDATA @ Mx.append([1, 0, 0])DATA ɀ y = math.cos(angle)DATA  z = -math.sin(angle)DATA  Mx.append([0, y, z])DATA @ y = math.sin(angle)DATA ʀ z = math.cos(angle)DATA  Mx.append([0, y, z])DATA DATA 0 angle = object.RotYDATA p x = math.cos(angle)DATA ˰ z = math.sin(angle)DATA  My.append([x, 0, z])DATA 0 My.append([0, 1, 0])DATA p x = -math.sin(angle)DATA ̰ z = math.cos(angle)DATA  My.append([x, 0, z])DATA 0DATA ` angle = object.RotZDATA ͠ x = math.cos(angle)DATA  y = -math.sin(angle)DATA  Mz.append([x, y, 0])DATA ` x = math.sin(angle)DATA Π y = math.cos(angle)DATA  Mz.append([x, y, 0])DATA  Mz.append([0, 0, 1])DATA `DATA ϐ m0 = Mx[0]DATA  m1 = Mx[1]DATA  m2 = Mx[2]DATA P for row in My:DATA А x, y, z = rowDATA(  nx = x*m0[0] + y*m1[0] + z*m2[0]DATA(  ny = x*m0[1] + y*m1[1] + z*m2[1]DATA( p nz = x*m0[2] + y*m1[2] + z*m2[2]DATA  T1.append([nx, ny, nz])DATA DATA @ m0 = T1[0]DATA Ҁ m1 = T1[1]DATA  m2 = T1[2]DATA  for row in Mz:DATA @ x, y, z = rowDATA( Ӏ nx = x*m0[0] + y*m1[0] + z*m2[0]DATA(  ny = x*m0[1] + y*m1[1] + z*m2[1]DATA(  nz = x*m0[2] + y*m1[2] + z*m2[2]DATA$ p Transform.append([nx, ny, nz])DATA DATA@  Transform.append([object.SizeX, object.SizeY, object.SizeZ])DATA@ ` Transform.append([object.LocX, object.LocY, object.LocZ])DATA  DATA  return Transform DATA @DATA( p#======================================DATA def Alter(vect, Transform):DATA( #======================================DATA ` v2 = []DATA נ nv = []DATA DATA  x, y, z = vectDATA P sx, sy, sz = Transform[3]DATA ؠ lx, ly, lz = Transform[4]DATA DATA  v2.append(x*sx)DATA ` v2.append(y*sy)DATA ٠ v2.append(z*sz)DATA DATA$  for index in range(len(vect)):DATA ` t = Transform[index]DATA8 ڰ nv.append(v2[0]*t[0] + v2[1]*t[1] +v2[2]*t[2])DATA  DATA @ nv[0] = nv[0]+lxDATA ۀ nv[1] = nv[1]+lyDATA  nv[2] = nv[2]+lzDATA DATA 0 return nvTXd p TXText  DATA  @ DATA @Render (F12)ScAC8 ݀ACAction 0DATA<  P backfin1DATA< P backfin2DATA<  0 P 7`tailfin1DATA< 0 ߠ 9tailfin2DATA< ߠ  0 <`tailfin3DATA<  ߠ >tailfin4DATA<   bodyDATA<  `  backboneDATA< ` 4tailDATA<  @ `headDATA< @ bodyfin1.leftDATA<  @  bodyfin2.leftDATA<  bodyfin1.rightDATA<  bodyfin2.rightDATA<  p  lowerjaw1DATA< p !`lowerjaw2DATA<  P p A`upperjaw1DATA< P E`upperjaw2DATA<  0 P +lowerteethDATA< 0 OupperteethOB N OBCamera ?[ ?,????奼GŬ>???p>lj?w>h>~?[ ?,??????11?20?(5?DOBdɖ8?=# ?>=?@???OB N  OBCorneliusesh @ 9 ?l>J@@@??@@@9 ?l>J?????>p=q;GCǻ=j>w=h„=~>>??DOBdɖ8?=# ?>=?@???IIPDATA DATAD :SubsurfOB N  OBLamp.001 ,lo?u????cP"3-P???Ga ?=")>??FD?!5`,lo?u??????Wq`?DOBdɖ8?=# ?>=?@???OB N  OBLamp.002 f@U @8v???.87S???k+>Ǻwt?gm->"E)>'M?|B^f@U @8v??????6N< =?U/~j=Q)3z*[?DOBdɖ8?=# ?>=??@???OB N  OBLamp ?*x@)<8????:-T>ˈ???l>5;, H?/d?*>?>O?*x@)<8??????L=V;n?T?A -s?Tw(>a?DOBdɖ8?=# ?>=??@???OB N OBPlane p'@?迂 #@{X@{X@{X??@{X@{X@{X'@?迂 #?????>t={K;K#ˣ,=oP>|=OmOj=>KB??DOBdɖ8?=# ?>=??@???IPIpMA @# MA1aterial??XYP?CϦ??p?Y????>EI(???+ >cr??? ???????@?===L=????MA # @MAwireaterial?L?L?L??????????L????2 ???????@?===L=????MA # MAMaterial?L?49X???????????333>J???  ????????@?=?==??? `?DATAX  ???????????DATAX ` ????????>?TE  TEClouds=@???????@@?????@ ??<TE  TEStucci<# @???????@@?????@ ??<>ME @0 pMEprimitivemonkeyI` @ EP D D  ҀҀn>ݨ>g>DATA @ DATA D 5ھrU7>a. 9sk>\橃d>"^uX gx>[m8?vr>GR ,##5 U> =?# &=~:m˰=yQ 0kl=燬7v{z=__Ck=៽ؘdlq<Ӱ2x}\;bĥaR Xejc>^P$SlcM>z@UbBf>~>lq_|>{գks*Q?[>\_M(ٕo6jZ>-8tc>=t_(W`=Ñ)3R=Ԅm.a~y="juQ]<8-ΏcI;{@HO]d\<s`H5>,{o]5>}?5>s%0ھ$-\>y{\D_W g6>ٸ<1H#׽9Nj_*4wD:P_]=P9ɠ=ܙVQ@%> I~ֶ>$)C >y%3о.>Bo1INj-^>QX=ҍp̚Wl=pF| Jپ>YsʯRd,\>\hk>`YF>`h%KM^lo>S1<D.ܾC%>HVbƆzAȓ{kξk$>/g5Hv$2> qj5# %4>'vQ.Z%.>Aˬ2}x2˾>i>CYt~Ad>xa \T>|yؠco;h2>ru"mǰ9.yT )R ؾNE=5UP'X}G< pT1bQ?><^_a> d> #~YI~ =5ՠ 7R  >Gх|%R ީ=yσ);=A䇃sl=^ň9^@!S,@Lr8j >:ݽ(/j>X::6r>t^_>@q p>l4ۼK\2XR X=ܖ=v"K*0=Gi: lPL~=;輽*h!h<ԺmeDT:K<qNe P>a{h5>wѽ7X0>P>K$}Җg>y?8@;dB>08@>Z%7 +/#q=UЋ$=R\hKg`Ѿ >`hkYcYtS >RΞH4)lP(I>GPFp{>AP=l[>.v%v}\g7>JP @>7 @2Qulel>i>C[eڵT%<>|y棳$;!}b>r#w\>^K\zRsv:>^KGHh >xa<S־>,ͭK Qپ^>-N R `>#g{KY>j >{WV0^%j~r>Q彂$,*:Fe@hh8 C:9"W:Xѥ9IgjHdeA8*Crr ؾ+i[bĤe!fsܵtR `46>nsrdC<:r>;yg;E>'Dm:q>Cne e 9>xUi=|7>[cH> :I76w>5o[H]þ8t>cs¹;?+= =tU-J=VI,~<Xk۾$#<s$ 8($ AȾ;p8X#w (>LJU<f>6X*cx>|&PS]>}}߶Zվ&f>@@ƍǐ <'O=ʭ %T =ؤRP =+fP>{|ΓTlRB/[>8iaP^$Ѵ>!eGkѰ >xeܨJ 9>A 9\( `==t2<.P=K=TTAК=Cw@>|-O>e򼨭K!7H!>x|Sr,>v"7>gzl 7>Cǔru'> MtM{XJ>wRޥ> Det<=X->N.LA2HVs>Z1Lw#0fF;B>[ПF~,Eya>Qޢ}a>? 7|"w>1~ibpM>&V?~MDp\>#]gɽ<>G>y=o^>NDb'gϼt>_W p< J%!0= pR 8m>U#zR t>| X\R >`n?R L= qc /4 2bR~cj>N?L#d7>'ˀs6>|PS(>ɜ ~)v#h>E /W+%)0 %> [`*ډ@P>9hy38 > =|('DQ 0d=Z~4R 0:=*n >3״)}#+R phO>38} Ƽ>bZrm>:bO>oApIIy1Ξ= -[1`۽1=R`廽=O5fC@??ڼ=h;bL<Qs779P![f9bOБ/(@o <`TuHQepF`pE=w ׾A5qͼVܽϘXnd9Փx@רo$E2 tK}2VQ/9IH`R(S|r '&igj>}?ۑ9UITl:F{T.DFJN?:ɲ@D{P"Mb)C8N9|?༙BctK Rؔ:.8ڇ`Nm5Wds6Kx P9r ^ko=<ҳL}{=#sĖk=}?O3s=ܦQ ->WNIԛq>Dn7Ux>5w0uO=L^nI:\I=BJCcFVU>:w L%WƖ> k:@mo]fƁ=H y`Zd>NL]:s'=,|}B=͓p9a`=%)cj=UGw%q4='tҀ?xP=ˆNZqc=qߤ,S^<\eo=gc('oW־>r (s2cg^q* ξ`TsCmb8E>B̾ L"Rʾ!w,~|CԾOzxWھvڹa~M:ؽ~zV4`{Vv Gʾa,V|1HT9*/"<[syվjf[Z)^+H]JCQNdsW;YV (/9Ҿm:M Hh1< Ɯs2>Z־zyq|DŽ\GijVݜ O*%dhJLH3xoѿsý􅢾 qO~iZ49 >_taw@E4wXa">:$I| ڽl2| yTR;7^b[HcMH,ֽ.Գve@8jr^ܾ772N~e 1ݾ mnND@6"þ:jvS/ j쾗լMw-n +}wvh #}2Mt?g{  G :o$2zsv*~Q:F!-Yl%4Ĩ9K#BᨲG; @}Dn32|kƾENs||ƛEҩ]wxJ2ҥh +6@T xV @ž&ξQ@ ͍)̀˝Q 򾡱q艾#-3kLu*q&Edb-=[ f|(kﭝ,OGET8 ŊC, EY ԰8o@6 ^'oL{޾5x7!K` b1iwoЊgA#@9@+,T۾49¾ÙͯvΧk1<&F.f`J:7əj)57a: dľ>׍7*5%޾QB>梌Wھ9dVb7y:Y~ 쾃0$TN薅kj^i澇WV#夾:'ԾBL{=f)t׾A(u%=]*΅1־Y/hsKONپ5& xG$j)i_cJZ0&ھ1[/I.zC4K1*1ĺȝO&굽Ο6d)1R c&`Ɏ?5ٽ龓fen>Xbhba>S6 Wkbp>#뜠=9jwN#>St[|=>BLg/@ꛊH>}Mef7>_" h>$hb>9ϱ3V־c>iϦsrr=B&LfK>Klܱܯ= w>G}*.ſTs(>E ָ ,Jow>'Byy}>DH)QZv&9>9Y5oC>"ZMi@>x鎃yit9>Ꮞoj>4dT*pL>Kվz;`> h9#q>>B8R XTk>f@8ۻ.k_>y/)iWp[@>}۞Yx*.SF>yBpQGP>g2g+\9H/>U[[Қ884ٕR7>*(N.^:RھzעԾY=6H $@Xq=F?%K=Fs;oWxe8R͏!O=4՞DG a=4?3F=#›BE>*7e=> *|6*]7Pu>Jby)-L$Ὤ>j:|$DC5{Ô>~#|Zl6NC> m3 X>C~h 9:y>FŢ\ǾJ}e>7cZTUn;NG>#_NҰ>( J[R XH>u/*̤YE>}"ɜNR/!=>sz=>9BޟG0RQw>8k'$,v">);~EN|>7O&վ~r >2]ĂZUDѥ>'; ê~> tՃ1x=>sI鵾v>0!ʔ4OѾv6>$dɑ{>" Âw!;>5*^)|>56$ @zω>4pAZ3ĕ|y>*lM0v~z>4r͉/,y>03=AB3>(@>#$#W{h>"xƣޚWyh>.`z >&rs?}w>!QX_z5>2$?X}c>1؃Uk-|>1Y<{9>+~>0fjz Y >.4XL>* (F[>'R9 ;|>&Z @Ny{>-H̛6 ZԾ|3V>(uq IӾ~1>%\֗Sƾ|7%>0uԈjk֪k&zBľB+{ !|ƽ!H/}Js-ܾ1}нvzpY1~JnUH4==29pə\os{a”[œ C-e'Ȉx?F9DgvTQx <ʽ頔w4rY|5i+Tc&C"哐 9zVFTʽLZ|Wf6z"@޽rr(| Irӽ.lwpk\j }Siid D|Ur_Jj<Ľ-@ \TRe '~4P4`~j'@("엕ADWGKgn Sν!l̎r*J~{x] فmv7D4Xvΐ^԰;읐޽K SOZf轳. nsiȽv䅜ڋqz4)_0fBKru_XӈP4~4:rl(MXW3 Խƛł@q}{O~*GxAӣxe`#] FE(ߌ` _"R(vdּJẍ́(ܤHHBܽi^TꔼAP`u؀6g6&jrSaEkxƦ'Bΐ҉7ɼμ`ݓsӽύ˭ؼ8h)PLfpK^XѢĄ  |0_Qֽü@y z+gBD{\3}uRcIҽ \}%j{.ќ&aBs_–⽢jd ׽s$]sB(o[]$qXM=(vɽӘ0~8PñXdԚ)ԇHa@٪4w,n.Ęw5ŽiV@R̟QԒ}jH1qq|JԒֽʆF+<Gdؽp*qӤ@>fom0֝\̠D!'\\ԛ3M~Xzdz2 FT9\t2ݽ½yV3# k/Wc ֘!c t{ *k"DPqXh~A7c<M"VtdrfFҽ<`yNHwнľv {:½kܰ7J{ǽ(c&ۘ&ڽkްTVust_c]Po Wp;ҽiI{$e nD^&p 4zP}6so%BxXν9Ocaq2xc ;vύyxxޕ4D?A72x)'[̅ܺ xkT-fh|̽6ʽ._q|n, of.PqI`JTOf!ƽ}p Òu|U|kPzvDwM.׹⽠jϟR&Lt|l]`SeM8pEѽ-P K{~{n~N.Խl Uug<2Ƚ~n$D_[RK~ ZGA̭K }DHJiG0o߽ցbܱsLʙ>t7ٓqޠʒё yW bk?(ю^PPIy:viͽĽIةj^9BJ^/D#Rj껣d)'6A>ĬWYHV@̒_~_%zrG-IԀl僉(,5`XmイdýČ4p<ype[aAf};xׅ&<܇ԯ"#Vf=er]>a.`=)k>\d>{d>"^ vX=~x>[n(n<~{^v>GRՉ#(3["= Ⱦ9=~}]=mߗ={+*j>0¾kl=+;#=-{=b+·>k=B+c=qC<,X %<Ǿ}`;b-= #hlf>z@U߳b=Bf>~@ !%lx=_|>{*`kt>'Q?]>\_N'p >3j*Z>-8k>渾c?=t $>%4`=Ñ>&ھR={pm>.a~y="pHu=Q]<@"ʏ<{=n5> }=?R5>4s>"0~$-\>y{6D_>T A9>G> <1BfH$=s9RDV=4%߆>6F=f!VQ>=>I>{6ָ>$ הC>e >y%M2>T.>Bo>Y-`>K>|Z=.p̚>T7l=pI >G贾>YsPu>Od^>\i8>>]َYI>`hڵM^>^>SY<D>˾C&>HXGƇ>w< @>A7m|>hk$>/gMj5H>s$3>-j5>%6>'TvQ.Z><_%.>A˯}x>>i>E>{@f>xaM\>Q6>|y(co>82>ruvmǰ> bQ@><^ b?>߾d> #9=Y~=5*z =澈!=A-ux=,l=b:<%>a{hLo`<|->wѽ7XG.x<>K$d҃;<P>y?8@r9O<ѳ>08Z%7o)'.O>і>\iKg>] >`hYbY>% >Ra9H5)l>I>G[PFp>x¾>ARP=>i`[>.yz#%v>z\ 7 >!B[JP > B>9gI>$9k>@ͯul>YRl>i>Eڵ>Q<>|y]#>8!$b>r#>tʗ\>^N !\{Rs>s:>^NHh>|Ҿ >xaO<>P >,ͮD >N_>-Nn >'Y>j @LWV0=j~s>QC=;8*CrR.=D+i[bH<Ҿ!fs#よ;go=i;E>' Dm=:t>D/5ne>d9>xKvUi>:W7>[cJ_ :>F6y>5om [>E]k8t>cuj>>8;?+=e>:s-L=kyV>H޾,<Fj=̾$#<s $<^8($ d> w] (>LK>9ɾf>6Z cx>~>$|&> S_>}}Sn[$>iG&0r>@Or4. >b'O=Rް>ϾT=بeR>M =:>( P>{|1mTlR>?վ[>8aP>"ѹ>eGk>Q >xeVJI9>޾l>Aq:=_>`=={^= >%aT=K=T>QAЛ=CzA!@>|>*O>eWSK!7>Eƾ>x |S>oួ0>v">($ >g"zp >$>C8Jr>u,>2t F>xWJ>w>Oޥ> GHUet>9=ܽX/>N.YJLA2>EUs>Z1w#0>c ;D>[У~,E>va >Qޤ Q}>>? |">t߽>1h~i>_pR>&Y~>JDI^>#UT]G>4kyn<~po^>N$a= fv>_W'p<=>$ @2b=Q̽cm>NL#d=78>'4s=> |>MS6(>ɟs~>&v#m>E UW+%>&ؽ *> S`*=ԈP >9hXy=8 > |('=8P 0h=Z~3=mʼ >3״}!(= >b[m>>bS>oArJzIIy>.F= _ -[>.`1=ZR`>d=O5l>@@=?,= * h;=t8L<<6?YѶ>+rY,>hU= 308=VБ/(c=4o <p?pT;H=?ZV=e/`ּRpHD%PS=t پA5u&S=xۼVϘ@m=ƶLo&E2h =lsK}.7;Vvz?=׏'0@dI/>Խ)C4<0:08&*amZS=&V=t=0&>KIY=xvQ$h=ƲS<@ېy=rjU< ܱ(mt2=C߾=ӹ=F{l=2rN=_= M*>eF|=r^Z= ӾF<лhSy!=EI<|p=7bC=Mxe=vGFw =!ִ_=$?=s]=mD$=}`N4=^$@Q=RVE5v=S|t$J=!Y\<=1DĠ$G=F =>2e<,{=:AjԀi^=۝Ѿj>Y3녠7> hd)>#˝ = ?xd>Y$EJ>p=,L=q=G233=䤾nV=. bK> _k>;Z >1ؾd)> %K6=?~n=8$A=^`j>OЇ=hC>\ޏ=a+_>Wr.t3> Z>$HcA=*nX>WY7כֿ<0lc>E%(q<.|ٵ>ux%=#Y~~U=I e=zJd^>/}op>þY T>;;K_Nτ>Z>:C=ft8]=Hf~?=B^+>Nn 掣=cSc{>\78=)\>Wg$ʆ> ݙV,>"0u }=*lO>WN.8DD샑 7<y>6s=$3ux=L9nB=:_\]"=Dc>!VU>:- M>̾WƗ> ҔE-@\=of=H y=˪Zd>NLH:=$s1=Q{= |},=l9P=Ӧ` =%Rf =4cF=sG=vqV?='+҅=39xm=ˈ=Zcد=q a,M]=0ze6=g(="o;r0=؛cg^[U=sо`XNCܵX=mb8E1=3̾ ~'=SRʾ! =*,~|>=`OzM ==۾vFa=7h~zVˑ`Y =~2G̾at&W=*qVI=F¾9+/"js'=?վBO=^WZ)?"^x=FlJCQdk=ĽYf%=-~Ҿmb=KνHh1==sho'=Ľ׾zy|=BG#\i)=+Xc! P =(%dI=FRx!ѩs=f_􅤾 , 򾡱J5=2?#-3k<=pO&>=2dbY=DپE f=yɾ(k !O=˾U8~]' s=,E~\S =RVoAT=g'q ĨT~=O5x7L-`=s1ixo:Оgh=׾9A+(= l49ľf\9"E=Z5'd Wi=1J>PΩ=,a1<(f=_:7f)}=¾7Ϟ =c>rr7{=) 5%ྡྷQ[=VjC9dVba7R—=W*[ 쾃0惍=lVN]p=\羇W紅=夾Ѕ=IԾBL!{?=)t=9cؾA(4rt=ؘ$Ztoٕu=&nlLf=>g;.0 j}= c<3R`="Ns;c=ݦ$q{n=PH"0 2|=3k=20$ykt=B%X H'h=u$|>l=緾1OV٤0i=/p:l7=EE#'RPۍ `z=]%J=)Y1־Yqs2=N5&dx=FOb$jp_{Jk=Y>5&ھI1s\=.. zJ =IU1ĺȝ[P'I=Ο6dx(=GT M:c=!Zɏ?nN5|= B龓IPfh3=n>Xob=hb>S816/X>k3bp>#c|=18wa>S䅪[<|>B/Q<ҙ{>}z{=+7~>_ =h>$Bˮ=9`AL`= d >iYH?Ԉ=9rT=BK=贚fK>KlN4.==w>GJ/(=s:>E!)|J,>=o&>'BzCO#=v6}>DHj )=Nv6s>9ڂ2=M4>"ZրLB=tќe>x`=h־t^>6b=߇8oxq>4dB{=*2p>L>="zi[> )A,=`q>>7kyqiZ=V[@>}۞Yx=)SF>yB+pQ>"P>g4H g>(\H0>U[iҚ88>1;R9>*(yO>+]Rm{ע>Y=8} >!@Xq=|?>"9K=Io;>nWx>:=ta>GN*=мs{G>Jh)>e9lq>Oi!O=8re՞E>DQ b=8h3>C=jz#›>?">+qd7e>:W> *}r6+]>4PQ>Jbzp.)-L>!>j:}fa$DC>5WÔ>~SY#|Zl>5ND>B m3>| Z>CG#~g> :y>GBZŢ\=~J}e>7d'TUn=;NG># m_($Z>NE>}#6dN>O/V!=i==z\>9B!f0=x >8k, J,O=v@!>)Cb=Dؾ}>7xc'=_~:>2^;d=TϾg>'m=8=7 O> t6.9=Px>s7#=jv"j>0!Co]=Ow G>$d?xJ=S{>*&=ھw5*^: $=N|>5"56O= z:>4p-}4"=Ⱦy>*lJܘ5Y=v.~>4r K/[=x>03yq=AV>(@ =*>#$ o=V{>"y9=y >. J=8z<>&rD=r}j>!R'Ќ:=^ɾzT >2>29$g=XY}>1'k=-J|6>1Z(+T&=K{>+3Q=O~>0g=y~>.肺=Wؾ2>* !0=Fi>'RC=}#K>&Z-#P~=/{ >-J3P ==Z|W;>(v,È=I~X{>%])={|X/>0v*]=j-&z=thDľBw-,=q:d!|Ƚ!H6ͧJ=IB1Ua=ѓ vzKxQ=kȀJ{}_g=4V<̽r轙>54sYx 5=ڽf&(> 哒5>]z~~r>'&T̽LaZWA>3ͽ@S0 w-D>9*2w\⟤E&>A<*%ͮΚ^'>L~n|~>o'p۽Pp %>f>a Ț$ޗ>W$ K ]8>O/ 0X[>`d̊x{6>*'L8qt>!=B Z> ~a>yѽ@6oWv)>'нhv >:顽̽G]m%{>3} v.=i׽ҽ Ix@,m>fĽ a > ?Nɲd)n>*C&XJ>E-4T׽`d>^(U>$8 }`>lٽar0>z쮽V r|Ef>`ٽwxV*>"9.a|Z>M-{!k>^p罽SPUh>#ɇn齙cl>uؽx$K *J>mʽ @Nw>!%$>"@$ςM>?_u;;3>?ѽIiމz=)ǔ{=;սq_d=}޽ҽQah4Ϟg?=Bnѻ/L=޽Ȃoc=/Rvoμ%>a1j婐aQ>r罺m~~ X>m+轷w(>dJTg3>bfb.'B>jhvUrm5>_.b+Rls ʋ>hR\fWF>g6Nb;6>b fX~>aM\6)n"Ŷ>lpX*ԼL0K>ʾ ?Qq>zlSs>p܎ڢ%5ՓB>l~|&xsiE>ν/nDI h>^e@p>-R#JK>?fX#rG>ڽ9k ?> >0A}y>h:=߂>}DнƟE>1ӻ̽l$;G/>X˽1dbJ`>|켽R롆>tDi<+v(G]>ʽNW>}LL0 | 4HF>ŽbcXň!>K[n@; ?>½h7Me_>x 1k>oͽ{Z5/>i<%Խ!/>fս&,d/?>xXkW$ z">[ѽ@rr;| >9.l(4w/>m޽`j s}Rk>f Dt^>g<Ƚ-@\sR|>c۽'4H']~>g@ﻔHC0>ڽGNgf>7 >Ԣ!b:= > ׄK>y4½] s>s7녆+>tyΐ`ԨĀ자Y>)KSSX>i2x n">qwʽvڔ>n)_BJ>rJ_Zӈ8L3>oXlUW3>ʽƛ:@8q>~O~Bx/>~qZӣ xe@ܗF4>~⽶ߐ`ڠ_R%> dټJ`2>0"ܤ8 gH>fiu>a꘼A R`>uPe6:>:njrp.zaEA> Ʀ,Bv@>oԽ7μμP5Tk1>^ϑ˭Ch>e=POfXfL)>}ʽѢ 鬰  O>_| >}礽Ƽ0$y 2>x潠g@{>ォ_3 L}z>4ٽIֽ}(>hݽnYש>r۰֥對>y,Xs`g9>lɖC>ʽ1Tcm3?@>BՂK%Ïm>4GLՀ5mپ>O+m\Q *pHd>x DR@I>ƽD3Fz~>Խ_2=0pG=7W>Ѩ|N, k)>=ͽu(VBU>ƽrk.>Yƽ08i\ɡ>m;~~'Ɣ9>,hj\:Ax>v%<8ߋ>#F@iD>by倆Rg>0r}I(->aŽREV># `8ec?9>RֽB͋m9+>nơoe>kSKK 67>^V Ľ8o;>FcH>E*K7Kz>1+8ntO_:>Ѣж_mCy> Tm[F>M+H+pب> v İh0> v\ &q>Ԓ8|{ELP>\,۽^M9S F>z9,21vG>PՀ P?,ɿ>PĐTքA>T~ DҏG>x@>]o|B>߽ܦ=A>ɽB;̪D>N˩%sj> k,˼4G> Z02&G>yigv>M!~ܽέ(OaxP>_=Lc\>CӽgTU\>`B~Sg[s >9(6# {>,Ljx >V]ÄeM >>lm S]L*>oܽ~)ul>r$$ze>9>I(a&d>&mwFFi$>$? y%D>M"}>ZI4.>`|a-SA>뽹sn,o+>?K 9Kr<> Ena,>Ͻ:-iOa9>ȽTF @{ >½2(`}>ЂtJNC>u+EdO- >$،P9l>ᗽp(xDr:>|ýCSt s>ؽC3w_Z]W>彴˽m>d j_d>xr8<>lK ؅>h \ڃ=M>τX>8ڄ >>[˽ >}$ꣽ"2>AQb)>ѽ p=>eW&y>6oֽyj}C>X z+>JK JTGjػ>v齵@}6|V>uѽĸ?2>yraĽB> i3Dj>Aһh.>߽ќ*9BB>๽–潢J2e>RϽ ڽs48su>5d[b|>[ MG>cӘ4c9S>:ñ\rԆ>_(ԇJa@&14J>.n.gv5>Ǥ>oiH>!rsmeG>MȽ(e,ͤ<>I潦SlVT=>ꦽ p!O2>{ />As.W!>ÁX> [VBBM>XԒ}3PHp>޽q|>6Ԓڽʆ<>>Iܽp|իQ>Q@Aer>3֝^̠@)8>v\V+2CN>~\tz> HTڥ1>Ľy"q>ӽWf ֈމ p{><.$c&Dq>1Xd;5>ؽ7cx 1<>%Vho>1Fֽ,脝oN3>ؽľy .{(>kܠ罚J>?l,c >)&ݽkޜ0>dTuҟ> Ƚ]Tn p;>+sj{>Iٽ sD^ >-a4~P}Ni6>Q *BVX~>ҽ9OPcG>q2lPFc>#!81o`3Dq>Hr޽$-_7H$>Yн %;^M>UI>:ƽvbpB> GǪ lC>\mUlp>?ݽf`8~>|Qr:XaL;B>O.9ab9>cAEy(0RT>$ƽsn_ >5>~xdD> 0-;>}̃4$<C>$:bfG>y5ʽ%9q>_佸盽$=3oL2>Pq`NTK>Eֽ˽} ^pì>1yz eX>|kO>czvsM>׹潠be>M&Ot|`s`S>̽eR8 GpO>+Խ-L2 M>h~~nl~I>dֽdϙ{Y> I2̽~n0D8>[WKt Z=> >̭xᇅ>}>1 <iG>oLzDrbٱ>Wʘ_ٚ>޽ޝ}#2>୽h)"F!> \NPc>$0Gio s>载޽"$V]q>߽BJG^/>hvDsc)>4;0WH>/̑~~>l^潭 dF>/5Tm>dǽĈp<>Y|hh>DFf:}>>ӽׅ*0-Ԣ> &񾢘VWDATA< D 2 """%""v"&""<"="'"""("" )""?"*">"@"A "+"""=>"," " """ >" A" " " B" " " " B" " " ;" " " ?" "  """""u"""<"u""""""""""""B"""""";""""t"""""""""$"+"8"""*"2"r""" "#""" !" " " "!""!"!"""""""#"#"#"#"$%"$7"$"%&"%6"%"&'"&5"&"'("'4"'"()"(3"(")*")2")"*"*"+,"+s"+",-",8",c",r"-1-d"-p"./".e".p"/0"/f"01"0g"0p"12"1h"1r"23"2i"34"3j"45"4k"56"5l"67"6q"78"7m"8n"9z"9}"9"9":@":A":": ":":M";";"<v"<-"="=.">/"?@"?"@ "@"@N"A"A "B"CD"Ca"C"C"DE"D_"D"EF"E]"E"FG"F["F"GH"GY"G"HI"HW"H"IJ"IU"I"JKJS"J"KL"KT"K"LM"LV"L"MN"MX"M"NO"NZ"N"OP"O\"O"PQ"P^"P"QR"Q`"Q"Rb"R"R"ST"SU"TV"UV"UW"VX"WX"WY"XZ"YZ"Y["Z\"[\[]"\^"]^]_"^`"_`"_a"`b"ab"a"b"cd"cn"dm"do"ef"el"eo"fg"fk"gh"gj"hi"ij"jk"kl"lq"mn"mq"op"oq"rs"s"s"t~"t"t"uv"u"v0"wx"w"w."wa"x"x/"xb"yz"y{"y"y"z|"z"{|"{"{"{/"|}"|"|`"}"}_"~"~"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "" """ """"""""""""""""""""""""""""""""""""""""""""."""""""!""."7"""2""#""""""""""%""]""""a"""'"""^""b"")"""3"*"/"4"","""-"("""""""""""""""3""2""""""""I""""""""Q""":"R9""J"""""""K"""""""S"""A"L"""""""""""""S"X"Z"""H""Y"G""""K"  "  "    "  " " " " " " """""""""""""X""""Y""""" ""Z"/""[""!"\" """]" "#" $"!""!#"!^""$""_"#$"%&"%("%1"&0"&2"'-"'."'3"()"(4")*")5"*+"*6"+/"+7",.",/",8"-0"-9".:"/;"0<"12"14"1="2<"2>"39"3:"3?"45"4@"56"5A"67"6B"7;"7C"8:"8;"8D"9<"9E":F";G"<H"=>"=@"=">H">"?E"?F"?"@A"@"AB"A"BC"B"CG"C"DF"DG"D"EH"E"F"G"H"IJ"IK"IM"JL"JN"KL"KO"LP"MN"MO"NP"OP"QR"QS"Q["R\"R"SZ"TU"TV"T["UW"U\"U"VW"VX"VZ"WY"W"XY"Y"Z["[\"\"]`"]a"]c"^_"^b"^d"_`"_e"`f"ab"ag"bh"cf"cgci"de"dh"dj"ef"ek"e"fl"f"gh"gm"hn"il"im"io"jk"jn"jp"kl"kq"k"lr"l"mn"ms"nt"or"os"ou"o"pq"pt"pv"qr"qw"rx"st"sy"s"tz"ux"uy"u{"u"u"vw"vz"v|"v"wx"w"x"yz"y}"y"z~"{}"{"{"|~"|"|"}~"}"~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "" "" "" " """"""""""""""""""""""""""""""'"""""""""""""""""""8" " "" " " " " "  " "  " " " """"""""""""" ""!"""""#""$""%""&"""'"()"*"+" !" #" *!'"!+""("")"#$"#&"$%"%&"&*"')"'*"(+")+",1",7",8",f"-0"-d"-h"-i"./".6"/5"0e"0f"0g"12"1P"1i"23"27"34"3i"45"4d"56"5e"67"6f"8:"8P"8c"9:"9R"9_"9g":^":f";K";P";R";i"<="<_"<`"<a"=^"=b"=c">L">N">P">c"?A"?C"?N"?c"@A"@E"@T"@a"AF"Ab"BH"BI"BN"BT"CF"CG"Cj"DE"DH"DT"Dk"EF"El"Fm"GH"GN"Gn"Ho"IM"IS"IV"JQ"JS"JW"J`"KO"KQ"KX"LM"LO"LY"MN"MZ"OPO["QR"Q\"R`"Rh"ST"S]"T`"UV"UW"UX"UY"VZ"V]"W\"W]"X["X\"YZ"Y["^_"^c"_`"`a"ab"bc"de"di"ef"fg"gh"hi"jm"jn"jp"kl"ko"kq"lm"lr"ms"no"nt"o"ps"pt"p"qr"q"q"q"rs"r"r"s"t"t"ux"uy"u"u"vw"v{"v"v"w|"w"w"w"x}"x"x"x"x"y~"y"y"y"z}"z~"z"z"{|"{"{"|"|"|"}"}"}"}"~"~"~"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""H"K""""""C"L""""I""J"""H""A""C""""""""P"X"""""U"Y"""R""""P""S"""U"""""""""""h"l"t"""g"q""""k""j""s"""l"""q"B""Q"T"r"""A""J"":"I""9""B"M"""\""]""T"Z""S""R"Q"["""s""j"k"t""i"t""e""d"f"r"""m""p"""m""p""n"o""n"o"""O""V"""O""V""N"W""N"W"""G""D"""G""D""F"E""F"E"8""4"?"K"7">"L""+"X"^"("Y"_""."h"u"1"g"v" "3"4"5"  " &" *" +" '" (" )"  " -" ." /" ," 0" 1" 2" 6" 7"""?"""">"""""^""%"_"""u""%"v""@"";""!"=""" "c""#"b"$"`"!"a""w""y""#"z"$"x" "<" !"!""#$"$%"&'"&+"&\"'("']"()"(Z"(`")*")b"*+"*c"+["+a",-",1",d"-."-e"./".i".w"/0"/y"01"0z"1f"1x"23"27"28"34"39"45"4:"4@"56"5;"67"6<"7="7M"89"8M"9:":K";<";@"<="=>">?"?@"AB"AJ"BC"CDDE"EF"FG"GH"HI"IJ"KL"LM"NO"NW"OP"PQ"QR"RS"ST"TU"UV"VW"XY"X["YZ"Z]"[\"\]"^_"^a"_`"`b"ac"bc"de"df"ei"fg"gh"hi"jk"js"kl"kt"lm"lt"mn"no"op"pq"qr"rs"uv"uw"vx"wy"xz"yz"{|"{~"{"{`"|"|"|a"}"}"}"}b"~"~"~c""d""e"""L"f""""g""""."""/"""0""""1""2"""""""""""" """"""#""$"""%""&"'"""""""""4"""""4""""":"""""""" """"")",""""""""""""""""""""+"""""""""""""""""""""""""""""""""""h""i"j"3"O"4""""""""""""""""""""","-""""""""""""""""""""""""""k""$"["b""&""("""8""7"5"6"""5"""" ""!"(""#"(")""$""%""&"'"""3"""""""""""""","""2""""""""""""""-"""1""""""""""""""."""0"""""""""/" ""  "  " " " " " "  " " " 2" " ""3"*""""0"""/""""""""1"""-""."""!"!" "a" !" ""!#""#""a""j"#*"#e"$%"$&"$+"%'"%*"%-"&'"&"')"',"'"()"(")"*+"*f"+b"+g",-"./".0".5"/3"/6"04"07"12"14"18"29"3:"4;"56"57"5<"6:"6="6"7;"7>"89"8;"8?"9@"9":A":";B"<="<>"<C"=A"=D"=">B">E"?@"?B"?F"@G"@"AHA"BI"CD"CE"DH"DJ"EI"EJ"FG"FI"FJ"GK"G"G"G"HK"JK"LN"LO"LPMN"MO"MQ"NR"OS"PR"PS"PT"QR"QS"QU"RV"SW"TV"TW"UV"UW"XY"XZ"X\"Y["Y]"Z[Zb"\]"\^"]_"^_"`a"`c"`l"ak"am"bh"bi"bn"cd"co"de"dp"ef"eq"fj"fr"gi"gj"gs"hk"ht"iu"jv"kw"lm"lo"lx"mw"my"nt"nu"nz"op"o{"pq"p|"qr"q}"rv"r~"su"sv"s"tw"t"u"v"w"xy"x{"x"y"y"z"z"z"{|"{"|}"|"}~"}"~"~ """ "" " " """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " """""" ""  " "  "  " " " " " """";""<""="">""?"@""A"""B"CD"E"F""8""7""6""9" " !"!"""#""("#$"$%"%&"&'"(*")*")+"*:"+,"+:",-"-.".//0"01"12"2334"45"59"67"69"78";<";>";G"<F"<H"=C"=D"=I">?">J"?@"?K"@A"@L"AE"AM"BD"BE"BN"CF"CO"DP"EQ"FR"GH"GJ"GS"HR"HTIO"IP"IU"JK"JV"KL"KW"LM"LX"MQ"MY"NP"NQ"NZOR"O[P\"Q]"R^"ST"SV"S]TZ"T^"U["U\"VW"VY"WX"XY"Y]"Z\"Z]"[^"\^"_d"_j"_k"_"`c"`"`"`"ab"ai"bh"c"c"c"de"d"d"ef"ej"fg"f"gh"g"hi"h"ij"i"km"k"k"lm"l"l"l"m"m"n~"n"n"n"op"o"o"o"p"p"p"q"q"q"q"rt"rv"r"r"st"sx"s"s"ty"t"u{"u|"u"u"vy"vz"v"wx"w{"w"w"xy"x"y"z{"z"z"{"|"|"|"}"}"}"}"~"~"~"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""G"""N""O""H""A"""""""""""""J"R""""""""""""""""B"C""""""""K"P"""""""""E"""""""""""""""""""""""""""""""""""""""""D"F"" " """ ","{"~" ""4""-"v"""""|""}""."{""t""/v"""""""$""""""%""""""""&"" "" "'"""""""""""""""""""" """" """"" """u" "" " "  " " t"  " }" " m" |"4"l"4"u""""""""""""""""""""""""""""""""" ""!""""""#"" !" "!""#"""#"$%"$("$"%)"%"&'"&*"&"'+"'"()"(")"*+"*"+",-",0",z"-1"-w"./".2".z"/3"/w"01"0y"1x"23"2y"3x"4k"56"5g"5r"5~"6j"6q"6"78"7^"7"7"8["8"8"9:"9a"9"9":d":":";@";f";g";h"<="<Y"<]"<^"=Z"=["=\">?">`">a">b"?_"?c"?d"@e"@i"@j"AB"AG"Ar"BI"BU"Bq"CD"CM"CU"C"DL"DX"D"EF"EN"E"FQ"FX"F"GH"Gs"HR"Hn"IR"IT"Ip"JK"JM"JS"J"KL"KV"K"LW"L"MT"M"NO"N"OP"O"PQ"PV"P"QW"Q"RS"Ro"ST"TU"VW"WX"YZ"Y^"Y"Z["Z"[\"["["\]"\"]^"]"^"^"_`"_d"_"`a"`"ab"a"a"bc"b"cd"c"d"d"ef"ej"ek"fg"fl"gh"gm"gs"hi"hn"ij"io"jp"j"kl"k"lm"m~"no"ns"op"pq"qr"rs"tu"t}"uv"vwwx"xy"yz"z{"{|"|}"~""""""""""""""""""""""""""""""""""""""""""""""DATA EP 1STKJ JKUVTS WXVU YZXW [\ZY  ]^\[  _`^] ab`_ VLKTKLXMLVLMZNMXMNGYWH HGHWUI IHUSJIIJYGF[FG[FE]EF]ED_DE_DCaCDNZ\O ONO\^P POP^`Q QPQ`bR RQcd-,ef/.fg0/gh10hi21ij32jk43kl54mn87nc,8lq65qm76oe.p  p-domqod  hgjigfkjelkfqleonmdc$78  %67$  6%&55&'44'(323()  2)*  r12  p./0-p018,+  ,-1r+,rs  <}u<v  uv | {| ~{   ~  ?? ?@@?  B B     ;  ;~tt~   +  +s  #   !  !" "$ %$&%'&(')(*)     tt         sr  s                       =} =   > A># w./xxbawz|}99zy{|z zy"! " .w wa !  !  !  !# "#! ').a" {|&$*%  #* $%*+ /{ $+b &'%$aC C, ,'ba ,- ',-% %-RbR-9}(9 )( .0 12:A:3  B 04 A 3/ /.B 41 ;2; 0.57 2189 3:  407; :6/365./;81492 75<> 98?@ :A  ;7>B  =<56 B?8; ><CE @?FGAH B>EI HD=ADC<=IF?B JECD FIEJ KJDH GFJK GKKH  A LO@  NL@ A:  OM::@  MN@:   OLPS     RPLN   SQMO  QRNM  SPTW  VTPR WUQSUVRQUWTVXZx/ bxZ/{[bZXY[Z{y y[Y[ X\  \]YX ]Y#! \!^  $#^_]\ "$_"]!#$""_^!%({~c`()~dc)*ed*+fe.'= }bi/,> gj0&v |akv<-0kh<'-hb}=,.ig>+/jf&%`a|{14(% `col45)(cdpo56*)deqp67+*efrq:3'. ibnu;8,/ jgsv<2&0 kamw0-9<wthk-'39tnbh.,8:usgi/+7;vrfj%&21lma`=@41 lo{x@A54op|{AB65pq}|BC76qr~}F?3: unzGD8; vsH>2< wmy<9EHtw93?Eznt:8DFsu;7CG~rv12>=xymlKI =6LK A= IJ 6: JL:AOMIK POKL  NMOP  JIMNLJNPRQ R9 QS 9@ TUWVWU VWYXYW S@GXY GYZVX G ZSGZSQ[  Z[TV[QR\ \R[\UTU\_^} (]`|&`_}|a] '& ^b()ba)'ed^_ cf`] gc]adhb^abhg_`fekjde ilfc micg  jnhdghnmqpjk orli soim  ptnjmntsklrqwvpq uxro vztpstzy  qrxw}{uy|~zv yz~}vw xu  u{  |v  wx      {} ~| |      }~  {                 fl lk    efke                      os sy  uoyu@= x{A@{|BA|}CB}~ ?F z DG   >H yHE E? zFD  GC  ~=>yx                u  u     ! ! $#$# %$ %$ &% &% &' &' '' "! "# "#( !"(#) *( )*(* ,+ #,+) -, #-, -. -././. 0/ 0/ 01 01 1 2 122 323 34 34 45 45 67 67 78 78~ 8~8 569 5996)+:**:*+:  >;  ?>  @? A@  =D BE   <F DBEA ;<FC C=  ;>JG  >?KJ  ?@LK @AML  D=IP EBNQ  F<HRPNBDQMAE GH<;ROCF OI=C # GJVS#$JKWV$%KLXW%&LMYX)" PIU\*' QNZ] +! RHT^ ')\ZNP&*]YMQ! STHG(+^[OR"([UIO$#&%XYVW# *&Y]SV !'*]ZTS!+)'Z\^T+(")\U[^21,7j_de27 #"je 3i12 edf32*#ef43*fg+54/ b+gh 5/.6 iabh 6.7j"aif67, _ji 8:f, _mkP8,1 d_k >c8P kqN?c> qrEDT@swxCFA?rtyvFE@AtsxyGC?N rvz NBHGz{uBTDH{wuMIBN u|>LMNq1i;PndP;KO~nPOL>qQK;R n~ QR`J} SJ`T } ISTBu|\XKQ ~W\QJ } ]VUWX\WU[XUY  ZYUV  OKX[~SIV] | IMZV|MLYZLO[YJS]W}c=^pc^:8km^=<_op ^_9:ml_<`o_`R9la@T` s a`<obA@a st ba<=pob=cp?Abctrd-i`4di3fge0-d `c5ed4ghe56fih0efcg0fc:9gflmg9Rh l gh-0c`i-h`ihR;nlkDE xwjmFC vymlEFyxnjCG zv HDko w{ GHon{zrqkl psmj srlmtpjn  okq  not|{vw{| }zz~  x}|w }}xx rs  y~~y ux yu  pt  sp|  w  {    xu uy  y~  }x             ~zz}|  t  wv  qr  wrv{  qvq                    ! "# $%'&  %$()+*&' ,-/. -,0132./  4 4NOOP EF NE DC  BA KJRHHGAG JSR !TIRS  !JMTS" CBU !" UBIT !"MCUT#PVK#$WLKV #$PQWV% FDX $% XDLW $%QFXW& +^<Y'  & Y<=Z( 'Z=[) ([=\)*  =<]\*+ <^], 1d?_-  , _?>`. -`>a/ .a>b/0  >?cb1 0c?d7 2e@j2 3f;@e 34g;f54;gh65 @;hi 6 7j@i8239 lfek 89 4lk M728 kej M84k934: mgfl 9: ml;@ sGHn 5;@4gsnh<; nHRo 6<;5hnoi=< oRIp =<67jiop=7>q6jp =>IBqp>?r56q >?BArq?4@ sg5r ?@AGsrJA t} JA t} BA t u BAtuCB uvCBuvDCv-wDCvw/ED w-1x ED/wx3EF y23x EF10yxGF y0,z GF2yz.HG z,{ HG.z{HI |{ HI |{IJ}|IJ  }|K: m ~ K:45gm~LK ~ LK65~MLML7j6WN *+ WN )( ON ($ ON*&PO $ PO&QP QPQR  QRRS  RSTS  TS TU   TUVU % VU'WV%)WV'+YX  YX87 [+X 7^[XY(Z[8 YZZ('] Z[ Z]\&+[ ^Y \[]'&\YZ]\_^ 78 _^ DC a^ CM a^+^7_` LD _`(8[`b KL `b)([\ca MJ *ca+^]bcJK)bc*]\e-,d _` ed  fd  fd,1d_i.-e `a ief1g:d fghg  hg 9: ih  ih.a9jk  kl  ml  mlnm   nm"on  ! on"#po ! po#qp  qprq  rq rs   rssjsjuv :9 uv EF w.u 9a wuNExv FQ xv1d:wy ON wy/.abx10z cd xzQPyzPO/yz0cbjkktttkltltME p0 @MEPlaneI p  4<;? ? <;DATA p5 ??I?IIIII?II?=;&is=;&&s?=;i&s??=;iis? ? =;? =; =; ? =;DATA 2"""""""""" " "  " " " "DATA 1     GLOB} @ @@ DNA1r\ ֠ SDNANAMEt*next*prev*first*lastxyzwxminxmaxyminymax*newid*libname[24]usflagicon_idid*idblock*filedataname[240]filename[240]totpadcurvecurblocktypeshowkeyposcurvaltypeadrcodetotelem*data*weightsname[32]vgroup[32]sliderminslidermax*refkeyelemstr[32]elemsizeblock*ipo*fromtotkeyslurph**scripts*flagactscripttotscript*line*formatlenblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledsizeseekpassepartalphapad1clipstaclipendlensortho_scaledrawsizeYF_dofdistYF_apertureYF_bkhtypeYF_bkhbiasYF_bkhrotscriptlinkh*rectname[160]*anim*ibuf*mipmap[10]oklastframetpageflagtotbindxrepyreptwstatwendbindcode*repbind*packedfile*previewlastupdatelastusedanimspeedreserved1reserved2*vnodetexcomaptomaptonegblendtype*object*texprojxprojyprojzmappingofs[3]size[3]texflagcolormodelrgbkdef_varcolfacnorfacvarfacdispfacwarpfac*handle*pname*stnamesstypesvars*varstr*result*cfradata[32](*doit)()(*callback)()versionaipotype*ima*cube[6]imat[4][4]obimat[3][3]stypeviewscalenotlaycuberesdepthrecalclastsizenoisesizeturbulbrightcontrastrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagcropxmincropymincropxmaxcropymaxxrepeatyrepeatextendfie_imacheckerdistnablaframesoffsetsfra*plugin*coba*envfradur[4][2]loc[3]rot[3]mat[4][4]min[3]max[3]*obmodetotexenergydistspotsizespotblendhaintatt1att2shadspotsizebiassoftbufsizesampbuffersfiltertypebufflagbuftyperay_sampray_sampyray_sampzray_samp_typearea_shapearea_sizearea_sizeyarea_sizeztexactshadhalostepYF_numphotonsYF_numsearchYF_phdepthYF_useqmcYF_bufsizeYF_padYF_causticblurYF_ltradiusYF_glowintYF_glowofsYF_glowtypeYF_pad2*mtex[10]specrspecgspecbmirrmirgmirbambrambbambgambemitangspectraray_mirroralpharefspeczoffsaddtranslucencyfresnel_mirfresnel_mir_ifresnel_trafresnel_tra_ifiltertx_limittx_falloffray_depthray_depth_traharseed1seed2mode_lflarecstarclinecringchasizeflaresizesubsizeflarebooststrand_stastrand_endstrand_easesbiasshad_alphapadfrgbselpr_typeuse_nodespr_backpr_lampseptexml_flagdiff_shaderspec_shaderroughnessrefracparam[4]rmsdarkness*ramp_col*ramp_specrampin_colrampin_specrampblend_colrampblend_specramp_showpad3rampfac_colrampfac_spec*nodetree*groupfrictionfhreflectfhdistxyfrictdynamodepad2YF_arYF_agYF_abYF_dscaleYF_dpwrYF_dsmpYF_presetYF_djitname[256]scale*bbi1j1k1i2j2k2selcol1selcol2quat[4]expxexpyexpzradrad2s*mat*imatelemsdisp**mattotcolwiresizerendersizethreshvec[3][3]alfaweightradiush1h2f1f2f3hidevec[4]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsv*bp*beztcharidxkernnurb*bevobj*taperobj*textoncurve*path*keybevpathlenbevresolwidthext1ext2resolu_renresolv_renspacemodespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidth*strfamily[24]*vfont*vfontb*vfonti*vfontbisepchartotboxactbox*tbselstartselend*strinfocurinfoname[128]maxrcttotrctvartypetotvertipoextraprtbitmask*driver*tpageuv[4][2]col[4]transptileunwrapeffect*mface*tface*dface*mvert*medge*dvert*mcol*msticky*texcomesh*mselect*oc*sumohandletotedgetotfacetotselectcubemapsizesmoothreshsubdivsubdivrsubsurftypev1v2v3v4edcodecreasedef_nr*dwtotweightco[3]no[3]co[2]index*errormodifiersubdivTypelevelsrenderLevels*emCache*mCachestartlengthrandomizeseed*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountaxistolerancesplit_angle*texturestrengthdirectiondefgrp_name[32]midleveltexmapping*map_object*projectors[10]*imagenum_projectorspercentfaceCountstartxstartyheightnarrowspeeddamptimeoffslifetimedeformflagparentinv[4][4]cent[3]falloff*indexartotindexforceoperationpntswopntsuopntsvopntswtypeutypevtypewfufvfwdudvdw*defvec[8][3]dvec[3]max**obpartypepar1par2par3parsubstr[32]*pardata*parent*track*action*poseconstraintChannelsnetworkdefbasemodifiersdloc[3]orig[3]dsize[3]drot[3]dquat[4]obmat[4][4]laycolbitstransflagipoflagtrackflagupflagnlaflagprotectflagipowinscaflagscavisflagboundtypedupondupoffdupstadupendsfctimemassdampinginertiaformfactorsofttimerdampingsizefacdtdtxactcolempty_drawtypepad1[3]empty_drawsizepropsensorscontrollersactuatorsbbsize[3]dfrasactdefgameflaggameflag2softflaganisotropicFriction[3]constraintsnlastripshooks*pd*soft*dup_groupfluidsimFlagshapenrshapeflagpad4*fluidsimSettings*derivedDeform*derivedFinalcurindexactivedeflectforcefieldpdef_damppdef_rdamppdef_permf_strengthf_powermaxdistpdef_sbdamppdef_sbiftpdef_sbofttotpointtotspring*bpoint*bspringnodemassgravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupinspringinfrictefraintervallocal**keystotpointkeyshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgravxgravygravzanimStartanimEndgstarmaxRefineiniVelxiniVelyiniVelz*orgMesh*meshSurface*meshBBsurfdataPath[240]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingparticleInfSizeparticleInfAlphafarFieldSize*meshSurfNormalsmistypehorrhorghorbhorkzenrzengzenbzenkambkfastcolexposureexprangelinfaclogfacgravityactivityBoxRadiusskytypephysicsEnginemisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxaodistaodistfacaoenergyaobiasaomodeaosampaomixaocolor*aospherehemiresmaxiterdrawtypesubshootpsubshootenodelimmaxsublamppamapamielmaelmimaxnodeconvergenceradfacgammaselcolsxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*cdParms*padcdSizeqtcodecname[128]codecaudio_codecvideo_bitrateaudio_bitrategop_sizerc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainpad[3]*scenelayflagpassflag*avicodecdata*qtcodecdataffcodecdatacfraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplayattribrt1rt2stereomodedimensionspresetmaximsizexschyschxaspyaspxpartsypartswinposplanesimtypesubimtypequalityscemoderendererocresrpad[2]alphamodedogammaosafrs_secedgeintsame_mat_reduxsafetyborderdisprectlayersactlaygausspostmulpostgammapostaddpostigammaposthuepostsatdither_intensityzminfocuszgammazsigmazblurGIqualityGIcacheGImethodGIphotonsGIdirectYF_AAYFexportxmlYF_nobumpYF_clamprgbyfpad1GIdepthGIcausdepthGIpixelspersampleGIphotoncountGImixphotonsGIphotonradiusYF_numprocsYF_raydepthYF_AApassesYF_AAsamplesGIshadowqualityGIrefinementGIpowerGIindirpowerYF_gammaYF_exposureYF_raybiasYF_AApixelsizeYF_AAthresholdbackbuf[160]pic[160]ftype[160]col[3]framename[64]*brushtoolcornertypeeditbutflagdegrstepturnextr_offsdoublimitsegmentsringsverticesunwrapperuvcalc_radiusuvcalc_cubesizeuvcalc_mapdiruvcalc_mapalignuvcalc_flagselect_threshimapaint*camera*world*setbase*basactcursor[3]twcent[3]twmin[3]twmax[3]editbutsizeselectmodeproportionalprop_mode*ed*radioframing*toolsettingsaudiomarkersjumpframe*theDagdagisvaliddagflagszoomblendximyimspacetypeblockscale*areablockhandler[8]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]winmat1[4][4]viewmat1[4][4]viewquat[4]zfacpad0perspview*bgpic*localvd*rilocalviewlayactscenelockaroundcamzoomgridgridviewpixsizenearfarcamdxcamdygridlinesviewbutgridflagmodeselectmenunrtexnrtwtypetwmodetwflagtwdrawflagtwmat[4][4]clip[4][4]*clipbbafterdrawzbufxrayflag2pad2[3]verthormaskmin[2]max[2]minzoommaxzoomscrollkeeptotkeepaspectkeepzoomoldwinxoldwinyrowbutv2d*editipoipokeyactname[32]constname[32]totipopinbutofschannellockmedian[3]cursenscuractaligntabomainbmainbo*lockpointexfromshowgroupmodeltypescriptblockre_alignoldkeypresstab[7]chanshown*filelisttotfiletitle[24]dir[160]file[80]ofssortmaxnamelencollums*libfiledataretvalmenuact(*returnfunc)()*menupoopsvisiflagtree*treestoreoutlinevisstoreflagdeps_flags*cumapimanrcurtilecentxcenty*info_str*texttopviewlinesfont_idlheightleftshowlinenrstabnumbercurrtab_setshowsyntaxunused_paddpix_per_linetxtscrolltxtbar*scriptredraws*idaspect*curfont*edittreetreetypetitle[28]fasesubfasemouse_move_redrawimafasemxmydirslidirsli_linesdirsli_sxdirsli_eydirsli_exdirsli_himaslifileselmenuitemimasli_sximasli_eyimasli_eximasli_hdssxdssydsexdseydesxdesydeexdeeyfssxfssyfsexfseydsdhfsdhfesxfesyfeexfeeyinfsxinfsyinfexinfeydnsxdnsydnwdnhfnsxfnsyfnwfnhfole[128]dor[128]file[128]dir[128]*firstdir*firstfiletopdirtotaldirshilitetopfiletotalfilesimage_sliderslider_heightslider_spacetopimatotalimacurimaxcurimay*first_sel_ima*hilite_imatotal_selectedima_redraw*cmap*arg1outline[4]neutral[4]action[4]setting[4]setting1[4]setting2[4]num[4]textfield[4]textfield_hi[4]popup[4]text[4]text_hi[4]menu_back[4]menu_item[4]menu_hilite[4]menu_text[4]menu_text_hi[4]but_drawtypeback[4]header[4]panel[4]shade1[4]shade2[4]hilite[4]grid[4]wire[4]select[4]lamp[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]edge[4]edge_select[4]edge_seam[4]edge_facesel[4]face[4]face_select[4]face_dot[4]normal[4]bone_solid[4]bone_pose[4]strip[4]strip_select[4]vertex_sizefacedot_sizebpad[2]syntaxl[4]syntaxn[4]syntaxb[4]syntaxv[4]syntaxc[4]movie[4]image[4]scene[4]audio[4]effect[4]plugin[4]transition[4]meta[4]tuitbutstv3dtfiletipotinfotsndtacttnlatseqtimatimaseltexttoopsttimetnodebpad[4]bpad1[4]spec[4]dupflagsavetimetempdir[160]fontdir[160]renderdir[160]textudir[160]plugtexdir[160]plugseqdir[160]pythondir[160]sounddir[160]yfexportdir[160]versionsvrmlflaggameflagswheellinescrolluiflaglanguageuserprefviewzoomconsole_bufferconsole_outmixbufsizefontsizeencodingtransoptsmenuthreshold1menuthreshold2fontname[256]themesundostepscurssizetb_leftmousetb_rightmouselight[3]tw_hotspottw_flagtw_handlesizetw_sizetextimeouttexcollectratememcachelimitframeserverportobcenter_diarvisizervibrightvertbaseedgebaseareabaseendxendysizexsizeyscenenrscreennrfullmainwinwinakthandler[8]*newvvec*v1*v2panelname[64]tabname[64]ofsxofsycontrolsnapold_ofsxold_ofsysortcounter*paneltab*v3*v4*fullwinmat[4][4]headrctwinrctheadwinwinheadertypebutspacetypewinxwinyhead_swaphead_equalwin_swapwin_equalheadbutlenheadbutofscursorspacedatauiblockspanels*curscreen*curscenedisplaymodefileflagsglobalfname[80]*se1*se2*se3isneedednrdone*stripdataorxory*instance_private_data**current_private_data*newseqstartofsendofsstartstillendstillmachinestartdispenddispmulhandsize*strip*curelemfacf0facf1*seq1*seq2*seq3seqbase*sound*hdaudiolevelpancurposstrobe*effectdataanim_preseek*oldbasep*parseq*seqbasepmetastackedgeWidthangleforwardwipetypefMinifClampfBoostdDistdQualitybNoCompbuttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizedefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[32]vgroupname_v[32]*keysminfacusedusedelemdxdylinkotypedataold*poin*oldpoinresetdistlastval*makeyqualqual2targetName[32]toggleName[32]value[32]maxvalue[32]materialName[32]damptimerdelaypropname[32]matname[32]axisflag*fromObjectsubject[32]body[32]pulsefreqtotlinks**linksinvertfreq2axisfbuttonbuttonfhathatfprecisionstr[128]*mynewinputstotslinks**slinksvalvalopad5time*actblendinprioritystrideaxisstridelengthsndnrpad1[2]makecopycopymadepad2[1]trackvolume*melinVelocity[3]localflagforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]addedlinearvelocity[3]anotherpad[4]butstabutendminfacvisifacslowminloc[3]maxloc[3]minrot[3]maxrot[3]distributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[32]*toObjectbodyTypefilename[64]loadaniname[64]goaccellerationmaxspeedmaxrotspeedmaxtiltspeedrotdamptiltdampspeeddamp*sample*stream*newpackedfile*snd_soundpanningattenuationpitchmin_gainmax_gaindistancestreamlenloopstartloopendchannelshighpriopad[10]gaindopplerfactordopplervelocitynumsoundsblendernumsoundsgameengine*lamprengobjectchildbaserollhead[3]tail[3]bone_mat[3][3]arm_head[3]arm_tail[3]arm_mat[4][4]xwidthzwidthease1ease2rad_headrad_taillayerbonebasechainbaseghostepghostsizeconstflagikflag*bone*childiktree*b_bone_matschan_mat[4][4]pose_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretch*customchanbasestride_offset[3]actnrtimeslidename[30]enforce*tariterationsrootbonesubtarget[32]orientweightgrabtarget[3]minmaxflagstickystuckcache[3]lockflagfollowflagzmaxvolmodeplaneorglengthbulgestride_axisactstartactendactoffsstridelenrepeatblendoutstridechannel[32]hasinputhasoutputdatatypenslimitstack_indexinternstack_index_extlocxlocyown_indexto_index*tosock*link*new_nodelastyoutputs*storageminiwidthcustom1custom2need_execexectotrbutrprvr*typeinfo*fromnode*tonode*fromsocknodeslinks*stack*stack1initstacksizecur_index**alltypes*owntype(*timecursor)()(*stats_draw)()(*test_break)()cyclicmoviesamplesminspeedbokehhuesatshortymintablemaxtable*curve*table*premultablecurrcliprcm[4]black[3]white[3]bwmul[3]offset[2]innerradiusratergb[3]cloneTYPEcharucharshortushortintlongulongfloatdoublevoidLinkListBasevec2svec2ivec2fvec2dvec3ivec3fvec3dvec4ivec4fvec4drctirctfIDLibraryFileDataIpoKeyBlockKeyScriptLinkTextLineTextPackedFileCameraPreviewImageImageanimImBufMTexObjectTexPluginTexCBDataColorBandEnvMapTexMappingLampWaveMaterialbNodeTreeGroupVFontVFontDataMetaElemBoundBoxMetaBallBezTripleBPointNurbCharInfoTextBoxCurvePathIpoDriverIpoCurveTFaceMeshMFaceMVertMEdgeMDeformVertMColMStickyMSelectOcInfoMDeformWeightModifierDataSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataArrayModifierDataMirrorModifierDataEdgeSplitModifierDataDisplaceModifierDataUVProjectModifierDataDecimateModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataBooleanModifierDataLatticebDeformGroupLBufbActionbPosePartDeflectSoftBodyFluidsimSettingsDerivedMeshObHookSBVertexBodyPointBodySpringWorldRadioBaseAviCodecDataQuicktimeCodecDataFFMpegCodecDataAudioDataSceneRenderLayerSceneRenderDataGameFramingTimeMarkerImagePaintSettingsBrushToolSettingsDagForestBGpicView3DSpaceLinkScrAreaRenderInfoView2DSpaceInfoSpaceIpoSpaceButsSpaceSeqSpaceFiledirentryBlendHandleSpaceOopsTreeStoreSpaceImageCurveMappingSpaceNlaSpaceTextSpaceScriptScriptSpaceTimeSpaceNodeSpaceImaSelImaDirOneSelectableImaThemeUIThemeSpacebThemeSolidLightUserDefbScreenScrVertScrEdgePanelFileGlobalStripElemStripPluginSeqSequencebSoundhdaudioMetaStackEditingWipeVarsGlowVarsEffectBuildEffPartEffParticleWaveEffTreeStoreElemOopsbPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbMessageSensorbSensorbControllerbJoystickSensorbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorbSoundActuatorbCDActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorFreeCamerabSamplebSoundListenerSpaceSoundGroupObjectBonebArmaturebPoseChannelbActionChannelSpaceActionbConstraintChannelbConstraintbKinematicConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbMinMaxConstraintbSizeLikeConstraintbActionConstraintbLockTrackConstraintbFollowPathConstraintbDistanceLimitConstraintbRotationConstraintbStretchToConstraintbLocLimitConstraintbRotLimitConstraintbSizeLimitConstraintbActionStripbNodeStackbNodeSocketbNodeLinkbNodebNodePreviewbNodeTypeNodeImageAnimNodeBlurDataNodeHueSatNodeImageFileCurveMapPointCurveMapBrushCloneTLEN  0 Phtdt 8XP4l8@l`8$84T< 4DXXDl<<lh<\`4@p( 8,d| (04\pP <($x$(T x H 8th  08 ,@0,HhH,(lDLP@< <@Lx48<8l(@PH<,4L,,,D,@,<4d$t  STRC                   ! "#$%&' ()* +,-./01234567 89: ;<=>?@AB C!DE9 ""FGHIJKLMNOPQ,R#ST$U%V&W&XYZ[\]^_`ab!c#defghi j'klmn(o)pqrstuvwxyz{|}~*U   +yz{,+-(o$$HIYZ)46,$*,-.v(/4xyz{|HI',R0,1exyz{      !"#$%&'()*+,-./0123kl,4,56789:;<='2>,3?@ABCDEFGHIJKLMNR4OP5"!c6667QRSTUVWXYZ[\]^_`6ab87Q c d,1efwvghi9 jklmnopqrs:tklpsm;;;usvwxyz{|}~:9<uF=S>97Q  d(((,?1e vwfxyF6;4444=<<@( AAA:9   @B C$7Q ,1eDB EFGHICJK Fwvf jDuFLlGLEuHyz{IJMMM$NM9  OM(o$PM(o$QMR M((9SMTM9UM)(VM($9WMX MYMGF(oZ M(o     $[M\M(o]vwF:,G^^^$7Kv_( (c!"#$% &('((,?7Q`)a* " +  , d - .1e/0v12Z3456789:;<=>?@ABCDEFGHIJKLMNOfPQRSR T U V W XYZ[\]^ _ ` abbcc3de;fghdiejek jfff('  $  lm b nopqrstuvwxgtcyzh{i|F}~GFg.d&CCC,Ej8x,'Rklll5(om  n  Fo 9   p  qqq$r5sjmno;GF !"#$%D&'()*+,-./0123456789:;<=> ?@FABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmtnGF;uuuopvwqr;xstuvwGxyz{|}~Fvr$(jr$ l5(2> k txsypR GF;yhz $&W)pDT{<||}(z{~5GJu7 |||}||}||}F  ,-||}~ >||}F||} ||}        ||}$GF ||}||} 9 ! ||}"F9||}#||}$-% &2>2'(Q||})*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoF&p  qrstuvwxyz{|}~R.|}$t0 G   r =m  }}}   R     ! "#-$% &&W'()Y*+ 6,-./ O   0 1 )2 63456789:;<=,r%V>?@AB CDEFGHI JK LM N C OPQRSTUVWXYZZ6+Z[\]^._`abcdefghijklmnopqdrstu3?Zv+w$!x" Nsyz$ { $|}~  $GF$1$$F$Q$$G(|GF$ "( $ |F;$ "( `\]$ \]D\] (C$r($( /2 \]$G( \]$3?(GF\] |$ "( GU !c! ,9||}DF( 3 ' $lvz    _$G<F'   vZ    (a , +$h` ||}`), "h (lF(hi(h(h ( !GF"(h (]`(9#($9:(GF   I%(&'()   I%   I%G   I%G*,`(o]+,-%./01t "234$56789G:;<=>?@$,FA7+  B$ C:;DEFGHIJKdLMNO>2 P QRSTUVWX Y Z[+\] ^_G`FabO/01cydefgh ijklmn%$ow Dpqr'sENDB