gH]kDwP|trueSpace7.6[VS_O93Y*I Clinton Reese, RUR`d8pM*#ͺOmMPNG  IHDR`ZIDATxQ AQEQd$bNeY2O^#8;]` +VX` +VX` +VX` +VX` +VX` -&tz1mOIO hS T ( 4W}@O{4W}@O{$ Owner4Owner of the Encapsulator$-1OSM n-1OSM n"LayoutLayout 럆L<_ї"(XFҦV(XFҦV"LE2Data$LE2 Data for node >g'JNjn*p"H| NffMCONffMCODMyFileName\} u z@Hoz@Ho Control InTransitionInXr } [jdOA#}[jdOA#}DstatusLine\MQ [jdOA#}BMD5AnimImport - frame # 26 of 27(XFҦV>g'JNjn*p^@FD~@@\@tveDCE`"IWJ}?pAA?NffMCOC:\Documents and Settings\Clinton\My Documents\doom3Tests\lostsoul\pain1.md5anim-1OSM n 럆L<_їA  Default Asp4  GFʠN=F G5 }}AnNffMCOZ`Ez]UO1釥GP>aHG,NffMCOZ`Ez]UO GFʠN=XPw ? }}An MyFileNameNffMCOZ`Ez]UO1釥GP>aXPw ,NffMCOZ`Ez]UO#nKSM2P@Pw $\VVNffMCOZ`Ez]UOOˁ CRih[P@Pw ^Activity.Run('%THIS_NAME%' + '/MD5AnimImport')ImportZ`Ez]UO GFʠN=@Pw a}}An<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO GFʠN=@`PPw 5 }}An[jdOA#}Z`Ez]UO1釥GP>a`@PPw ,[jdOA#}Z`Ez]UOz@Hot t Hͤ*EgbĬQG doomShape2AEHM'2AEHM'LE2Data$LE2 Data for node >g'JNjn*pceZU@䑧rceZU@䑧r$_scriptData*Internal Script data [җJs@ %3u 4W}@O{$(XFҦV#.;]kI 忞@"-1OSM n#tveDCE`"IWJtveDCE`"IWJB Mesh"Ouput Shape Mesh >W5f@(䐈B2AEHM'>g'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { // TODO: put your computation here // Mesh = System.CreateDO('Space 3D Package/Mesh Data'); // params.conValue("Mesh") = Mesh } NScript Object Package/jScript language6Space 3D Package/Mesh Data Mesh"Ouput Shape MeshdJ4``w uNY4W}@O{(XFҦV>g'JNjn*pFB Bb@@@?.;]kI 忞@tveDCE`"IWJ>W5f@(䐈-1OSM n 럆L<_ї, 48@J g'JNjn*pLE2Data, 3MT^RwL~YYTMT^RwL~YYTޢLE2Data$LE2 Data for node >g'JNjn*p} NffMCOD2|=Bynj2|=Bynj Control OutTransitionOutXr z@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ :NewCommandL~// Doom3 md5anim import // April 2006 // clinton reese // // // // file format // header 2 lines and an empty line // numFrames // numJoints // frameRate // numAnimatedComponents // hierarchy one line for each joint // name, parent index, 6bit anim flag and start index of animation then comment with parent name and human readable anim flag // bounds section // baseframe // all other frames - same format as baseframe except only animated elements listed // each line corresponds to non zero anim flag of joints // // plan modify this code to read the md5anim format // // first build hierarchy then position and rotate joints into position // 25 April 2006 IT WORKS! // had to use quat to euler for NASA Standard Airplane euler rotations // 2 problems // can't move origin // left and right are reversed on resulting skeleton // // April 30 animation read looks good // problem: can only read limited num of frames if try read too many get little or no animation // long animations - getting a key at the start and at the end but not any in between // solved: place a key at the end of the animation first // // // 10 Feb 2007 // use pure quat rotation to matrix and now everything works perfectly // // 27 May 2007 - ts75 release not beta version // // 26 Feb 2008 - remove fake skeleton now that real skeleton is working, works with pre existing doomActor object // one major problem is import speed is extremely slow and can't get status info out of the single command node // only output console works for feedback // animation looks like 15 fps // // July 30 2008 - modify so not have "Joint" in the joint name, make more compatible // // // assumes a "doomActor" is in the scene to receive the animation frames // // Execute // Called to execute the command function Execute(params) { MyFileName = params.conValue('MyFileName'); scene = Space.CurrentScene(); owner = System.ThisOwner(); firstSel = Node.FirstSelected();//full path to selection if(!Node.Exists(firstSel + "/Skeleton")) { System.Alert("select skinned object before export"); return; } if(Node.Exists(scene + "/Skeleton")) { if(System.Question("Delete current skeleton in the scene?")) { Node.Delete(scene + "/Skeleton"); } else { System.Alert("Animation import aborted"); return; } } System.Trace("start of import"); Node.Value(owner,"statusLine") = "MD5AnimImport - start of import"; var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read file into array while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file var msg = ""; var jointCnt = -1; var baseframeCnt = -1; var hierarchyCnt = -1;//flag for hiarchy section var frameLine = -1;// flag read frame data jointMesh = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); boneName = new Array(); pBoneIndex = new Array(); animFlags = new Array(); animStart = new Array(); myMatrix = System.CreateDO("Math Package/Matrix Float Data"); rad2deg = 180/Math.PI; scene = Space.CurrentScene(); //myCube = Space.Cube(1, 1, 1, 2, 2, 2);aug2008 //process file for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); //read number of frames if (msgtag[0] == "numFrames") { var numFrames = msgtag[1]; System.Trace("numFrames = " + numFrames); //set key at last frame solves "long" animation problem //RsAnim.SetAttrKeyFrame(myCube,'tx',0); aug2008 } //read number of joints if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; System.Trace("numJoints = " + numJoints); } //read frame rate - no way to set in script at this time if (msgtag[0] == "frameRate") { var frameRate = msgtag[1]; System.Trace("frameRate = " + frameRate); } //number of animated components x, y, z, qx, qy, qz each count as one if (msgtag[0] == "numAnimatedComponents") { var numAnimatedComponents = msgtag[1]; System.Trace("numAnimatedComponents = " + numAnimatedComponents); } // read hierarchy data and create a skeleton - start hierarchy mode if(hierarchyCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); boneName[hierarchyCnt] = jointName; pBoneIndex[hierarchyCnt] = msgtagSub[2];// parent index animFlags[hierarchyCnt] = msgtag[1];// msgtagSub = msgtag[2].split("\t"); animStart[hierarchyCnt] = msgtagSub[0];// //first bone if(hierarchyCnt == 0) { Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); temp = Node.Rename(scene + "/Skeleton/Joint", jointName ); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); // note: order of arguments matters in ConnectTo, order of connections may matter //ts76 base bone //Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); //Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName ,"Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName ,"Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); } else { //process the rest parentIndex = pBoneIndex[hierarchyCnt]; //copy a joint and bone into the skeleton parentName = boneName[parentIndex]; Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in //temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); temp = Node.Rename(scene + "/Skeleton/Joint", jointName ); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //order of ConnectTo args is important, order of connections may be important test now // connect bone Bone to joint Bone //Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); //Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName ,"Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName ,"Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); } //test for end of hierarchy hierarchyCnt = hierarchyCnt + 1; if (hierarchyCnt == numJoints) { hierarchyCnt = -1;//done with hierarchy, get out of hiearchy mode } } // read baseframe loc rot data if(baseframeCnt != -1) { //baseframe position of joint jx[baseframeCnt] = parseFloat(msgtag[1]); jy[baseframeCnt] = parseFloat(msgtag[2]); jz[baseframeCnt] = parseFloat(msgtag[3]); //base frame rotation of joint in quaternion form xq[baseframeCnt] = msgtag[6]; yq[baseframeCnt] = msgtag[7]; zq[baseframeCnt] = msgtag[8]; curX = parseFloat(msgtag[1]); curY = parseFloat(msgtag[2]); curZ = parseFloat(msgtag[3]); myMatrix.LoadIdentity(); myMatrix.SetTransX(curX*myScale); myMatrix.SetTransY(curY*myScale); myMatrix.SetTransZ(curZ*myScale); // rotate the joint here before encapsulation qx = xq[baseframeCnt]; qy = yq[baseframeCnt]; qz = zq[baseframeCnt]; wq[baseframeCnt] = 1 - xq[baseframeCnt]*xq[baseframeCnt] - yq[baseframeCnt]*yq[baseframeCnt] - zq[baseframeCnt]*zq[baseframeCnt]; if (wq[baseframeCnt] < 0) { wq[baseframeCnt] = 0; } else { wq[baseframeCnt] = Math.sqrt(wq[baseframeCnt]) } qw = wq[baseframeCnt]; sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; sqw=qw*qw; myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,curX*myScale);//x myMatrix.SetAt(3,1,curY*myScale);//y myMatrix.SetAt(3,2,curZ*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); //Node.Value(scene + "/Skeleton/" + boneName[baseframeCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts75 joint Node.Value(scene + "/Skeleton/" + boneName[baseframeCnt] ,"Matrix") = myMatrix;//set matrix of ts75 joint //ts76 preexisting skeleton assume "doomActor" for now //Node.Value(scene + "/doomActor/Skeleton/" + boneName[baseframeCnt] + "Joint","Matrix") = myMatrix; //Node.Value(scene + "/doomActor/Skeleton/" + boneName[baseframeCnt] ,"Matrix") = myMatrix; Node.Value(firstSel + "/Skeleton/" + boneName[baseframeCnt] ,"Matrix") = myMatrix; baseframeCnt = baseframeCnt + 1; //test for end of base frame if (baseframeCnt == numJoints) { baseframeCnt = -1; //leaf joints jointCnt = -1; myMatrix.LoadIdentity(); //add leaf joints for(cj=0;cj<numJoints;cj++) { //check if exist in parent list - if it's the parent of someone then not a leaf leafBone = 1; for(ci=0;ci<numJoints;ci++) { if(pBoneIndex[ci]==cj) { leafBone = 0; } } //if not then needs a leaf joint if(leafBone==1) { //copy leaf joint in to skeleton Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", boneName[cj] + "Leaf"); Node.ConnectTo(scene + "/Skeleton/" + boneName[cj] + "Bone","Bone",scene + "/Skeleton/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone myMatrix.LoadIdentity(); myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); Node.Value(scene + "/Skeleton/" + boneName[cj] + "Leaf","Matrix") = myMatrix; } } //return;//*************test return before animation frames******************** } } if (msgtag[0] == "hierarchy") { hierarchyCnt = 0; scene = Space.CurrentScene(); owner = System.ThisOwner(); Node.Value(owner,"statusLine") = "MD5AnimImport - read skeleton hierarchy"; } //enter base frame processing mode if (msgtag[0] == "baseframe") { baseframeCnt = 0; Node.Value(owner,"statusLine") = "MD5AnimImport - read base frame"; } // end of frame data if (frameLine != -1 && msgtag[0] == "}") { frameLine = -1; RsAnim.SetKeyFrame(firstSel + "/Skeleton", curFrame); RsAnim.SetKeyFrame(scene + "/Skeleton", curFrame); } // process animation line if (frameLine != -1) { while (animFlags[jointAnimCnt] == 0) { jointAnimCnt++; } //flags are stored in order x,y,z,qx,qy,qz in a single byte // these will translate to the frame line with tabs between each animated value // tab delimited lines but without any empty fields compIndex = 1;// 0 corresponds to the first tab in the line so skip it quatFlag = -1;//assume no quat anim myMatrix.LoadIdentity(); //myMatrix = Node.Value(scene + "/doomActor/Skeleton/" + boneName[jointAnimCnt] + "Joint","Matrix");//feb 26 2008 //myMatrix = Node.Value(scene + "/doomActor/Skeleton/" + boneName[jointAnimCnt] ,"Matrix"); myMatrix = Node.Value(firstSel + "/Skeleton/" + boneName[jointAnimCnt] ,"Matrix"); //read base frame position of the joint curX = jx[jointAnimCnt]; curY = jy[jointAnimCnt]; curZ = jz[jointAnimCnt]; //read animation flag for the joint, 0 is no animation theFlag = animFlags[jointAnimCnt]; if((theFlag & 1) == 1) { curX = msgtag[compIndex]; compIndex++; } if((theFlag & 2) == 2) { curY = msgtag[compIndex]; compIndex++; } if((theFlag & 4) == 4) { curZ = msgtag[compIndex]; compIndex++; } //read base frame quaternion rotations qx = xq[jointAnimCnt]; qy = yq[jointAnimCnt]; qz = zq[jointAnimCnt]; //process flags for rotation if((theFlag & 8) == 8) { qx = msgtag[compIndex]; quatFlag = 0; compIndex++; } if((theFlag & 16) == 16) { qy = msgtag[compIndex]; quatFlag = 0; compIndex++; } if((theFlag & 32) == 32) { qz = msgtag[compIndex]; quatFlag = 0; } //rotation animation for this joint was found if (quatFlag == 0) { sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; qw = 1 - sqx - sqy - sqz; if (qw < 0) { qw = 0; } else { qw = Math.sqrt(qw) } sqw=qw*qw; myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,curX*myScale);//x myMatrix.SetAt(3,1,curY*myScale);//y myMatrix.SetAt(3,2,curZ*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); } //feb 26 2008 - doesn't save much almost all animated components use rotation else { myMatrix.SetAt(3,0,curX*myScale);//x myMatrix.SetAt(3,1,curY*myScale);//y myMatrix.SetAt(3,2,curZ*myScale);//z } //set keyframe for the joint //RsAnim.SetKeyFrame(scene + "/Skeleton", curFrame);//set anim for full skel encapsulator Node.Value(scene + "/Skeleton/" + boneName[jointAnimCnt] ,"Matrix") = myMatrix;//set matrix of ts75 joint //RsAnim.SetKeyFrame(scene + "/Skeleton/" + boneName[jointAnimCnt], curFrame); //RsAnim.SetKeyFrame(firstSel + "/Skeleton", curFrame); Node.Value(firstSel + "/Skeleton/" + boneName[jointAnimCnt] ,"Matrix") = myMatrix; //RsAnim.SetKeyFrame(firstSel + "/Skeleton/" + boneName[jointAnimCnt], curFrame); jointAnimCnt++; } // set frame flag - next line read will have animation data if (msgtag[0] == "frame") { curFrame = msgtag[1]; //System.Trace("reading frame # " + curFrame); Node.Value(owner,"statusLine") = "MD5AnimImport - frame # " + curFrame + " of " + numFrames; System.Trace("MD5AnimImport - frame # " + curFrame + " of " + numFrames); frameLine = 0; jointAnimCnt = 0; //Node.Value(myCube, "tx") = curFrame;aug2008 //RsAnim.SetKeyFrame(myCube, curFrame);aug2008 myMatrix.LoadIdentity(); scene = Space.CurrentScene(); } } System.Trace("end of import"); }NScript Object Package/jScript language~൱D*#^cstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnC Cz@@V@2|=Bynj|?z@Hoۙ>?NffMCOC:\Documents and Settings\Clinton\My Documents\doom3Tests\lostsoul\pain1.md5animJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}An<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho܂dKu=VG (doomBlankDXMaterial[k .;]kI 忞@"s t J s  |I [k 4W}@O{$0k .F_P#.F_P#Material Output material __W8E#(U@Ra.U@Ra.LE2Data, 7$LE2 Data for node >g'JNjn*p՞'fA5-_՞'fA5-_D3DEYED3DEYE =xNT{-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pFBrCb@@P@B?՞'fA5-_.F_P#J@#QL>g'JNjn*pF4CtCd@@@?.;]kI 忞@-1OSM n 럆L<_їˣ   Main GFʠN=GF5 }}An.F_P#Z`Ez]UOU@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]2L< Material j .F_P#T.F_P#Material Output material __W8E#(0k iP S^M~b tS^M~b Alpha_shaderAlpha shader RnчINN j xk 5OD.GWf5t5OD.GWf5Color_shaderColor shader zdU@AUʂ* j b\ qΤIGGItqΤIGGIModel_shaderModel shader @SrE8㲻t j c\ ,S@vTVt,S@vTVNormal_shaderNormal shader Xb"ٲN+4 j d\ зVJiltзVJil Texcoord_shader Texcoord shader lrMH;e j s 4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"xt kF_dkF_Vertex_shaderVertex shader k|eKwj9CqVertexShader j  t@*Ntt@*N Constant_shader Constant shader QVO Pk@ j s <;vHwt<;vHwAlphaTest Alpha Test type :KrbSx j P  0S̤@+Rt 0S̤@+RAlphaTestValue"Alpha Test Value j ,S@vTV 0S̤@+R5OD.GWf54W}@O{зVJil(XFҦV>g'JNjn*pFDnCb@v@?<;vHw:KrbSxbDisabledEnabledAs OpaqueDisabledS^M~b .F_P#t@*NkF_-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI܂dKu=k ,DefaultTexCoordShader  (gD9f<(gD9f<TCMoveYTCMoveY_: R:>a[EH*M\R:>a[EH*M\LE2Data, 2$LE2 Data for node >g'JNjn*p7wCH7wCHLE2Data$LE2 Data for node >g'JNjn*pt wkd@Xywkd@XyTCScaleXTCScaleXG t 4W}@O{$ + y݀J}Ny݀J}N FloatInput floatTCMoveXW 9 ĦBZĦBZTCScaleYTCScaleYp'I )rޙG )rޙG ˣLE2Data, 2$LE2 Data for node >g'JNjn*pLE2Data, 4(XFҦVLE2Data, 3"%%u5E b%%u5E bLE2Data, 14$LE2 Data for node >g'JNjn*pLE2Data, 6QA@y:l1QA@y:l1LE2Data, 5$LE2 Data for node >g'JNjn*p$Q/G|]8$Q/G|]8LE2Data, 1$LE2 Data for node >g'JNjn*p-1OSM n#5N .;]kI 忞@" [ )<  S \ Z 9 x8; X5H I 3H зVJild\ R:>a[EH*M\>g'JNjn*pFBC`@d@?(gD9f<wkd@Xy?7wCH>g'JNjn*pFCC`@0@?%%u5E b>g'JNjn*pF`CCb@\@KAC?4W}@O{зVJilĦBZ?y݀J}N(XFҦV>g'JNjn*pFBCb@ `@KAC?)rޙG >g'JNjn*pFBC`@d@?$Q/G|]8>g'JNjn*pFCCC`@d@?QA@y:l1>g'JNjn*pF:i^ ShaderTexcoord : зVJilP3H [ )#,OrRt)#,OrRTexcoord*Input texcoord brick F 1+5?N>/ : [ 4W}@O{$%%u5E b%%u5E bLE2Data, 10$LE2 Data for node >g'JNjn*p-1OSM n"(XFҦVLE2Data, 1кX r!"I = 8tr!"I = 8Texcoord2,Input texcoord2 brick F 1+5?N>/ : %%u5E b>g'JNjn*pFEDA`@P@?4W}@O{зVJil(XFҦV>g'JNjn*pFEDA`@P@?)#,OrRr!"I = 8-1OSM n 럆L<_ї, L{0nBg)`! Eu AddP)\Fvq3P)\Fvq3$PrivateShaderData$PrivateShaderData wk0.DX?_BW :JF>*Ut:JF>*UInputXInputX : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/`V V #2 |L?¢Fht#2 |L?¢FhInputYInputY : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/`V `V ,8A fKھT,8A fKھResultResult : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/[ )< 4W}@O{%%%u5E b%%u5E bLE2Data$LE2 Data for node >g'JNjn*p-1OSM n"(XFҦVLE2Data, 1,8A fKھ:JF>*U%%u5E b>g'JNjn*pFD`B`@P@?4W}@O{(XFҦV>g'JNjn*pFD`B`@P@?#2 |L?¢FhP)\Fvq3wk0.DX?_Gp.HOV-1OSM n 럆L<_ї, L{0nBg)`! \u ModulateP)\Fvq3L< 2x2֣K!dE5t2x2֣K!dE5InputXInputX : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/k ؒ< TXGy5֣ tTXGy5֣ FullLightColorInputY : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/k k  dE9@T dE9@ AttenuatedColorResult : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/BW 4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFC`@P@?4W}@O{(XFҦV>g'JNjn*pFC`@P@?P)\Fvq3wk0.DX?_M0(rHH dE9@TXGy5֣ 2x2֣K!dE5-1OSM n 럆L<_ї, L{0nBg)`! Ku *VectorFromComponents P)\Fvq3hT Gx:G<l5tGx:G<l5XTX : RtFloat - Scalar floating point value F 1+5?N>/N  LDs(et LDs(eYTY : RtFloat - Scalar floating point value F 1+5?N>/N ?8[GVTIt?8[GVTIZTZ : RtFloat - Scalar floating point value F 1+5?N>/N S "PZKLьt"PZKLьWTW : RtFloat - Scalar floating point value F 1+5?N>/N N JN۪BP TJN۪BP ResultnResult : RtFloat4 - The four component vector or color F 1+5?N>/L<  S 4W}@O{%%%u5E b(XFҦVLE2Data, 1-1OSM n" "PZKLь%%u5E b>g'JNjn*pFC`@\@??8[GVTI LDs(e4W}@O{(XFҦV>g'JNjn*pFC`@\@?Gx:G<l5JN۪BP P)\Fvq3wk0.DX?_JEG0-1OSM n 럆L<_ї, L{0nBg)`! 4u 0VectorFromComponents, 1 P)\Fvq3@O Gx:G<l5tGx:G<l5XTX : RtFloat - Scalar floating point value F 1+5?N>/I N  LDs(et LDs(eYTY : RtFloat - Scalar floating point value F 1+5?N>/I @G ?8[GVTIt?8[GVTIZTZ : RtFloat - Scalar floating point value F 1+5?N>/I B: "PZKLьt"PZKLьWTW : RtFloat - Scalar floating point value F 1+5?N>/I I JN۪BP TJN۪BP ResultnResult : RtFloat4 - The four component vector or color F 1+5?N>/V \ 4W}@O{%%%u5E b(XFҦVLE2Data, 1-1OSM n" "PZKLь%%u5E b>g'JNjn*pFCB`@\@??8[GVTI LDs(e4W}@O{(XFҦV>g'JNjn*pFCB`@\@?Gx:G<l5JN۪BP P)\Fvq3wk0.DX?_JEG0-1OSM n 럆L<_ї, /|V FK|;u ShaderInput?ڵfA'7(?ڵfA'7(EyePos8Eye position in world space F 1+5?N>/%dLrQn0%dLrQn0EyeDirNormalized eye vector in world space. Note that this is vector pointing from surface to the eye F 1+5?N>/piDM7piDM7EyeDistNDistance from current point to the eye F 1+5?N>/^@A툷^@A툷PositionNShading point position in world space. F 1+5?N>/G p1M@o=p1M@o=TexCoords3D texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated vertex texture coords. Replaced by output of TextCoord shader. F 1+5?N>/ؒ< }E[2CV)}E[2CV) ColornColor specified by color shader. RGB portion is used to specify color (and is not limited to range 0-1). Initialized to interpolated vertex color. Replaced by output of Color shader. F 1+5?N>/`MOWIB"ѥ`MOWIB"ѥNormalNormalized normal of the surface for given pixel. Normal vector is expected to be in world space. Initialized with denormalized interpolated vertex normal. Replaced by output of Normal shader. F 1+5?N>/HtO{/(HtO{/(TangentNormalized tangent of the surface for given pixel. Tangent vector is expected to be in world space. Initialized with denormalized interpolated vertex tangent. Replaced by output of Normal shader. F 1+5?N>/ qQ@Rj qQ@Rj AlphaZTransparency specified for given pixel. Value should be specified in range 0...1 (full transparency ... fully opaque). Initialized to 1. Replaced by output of Alpha shader. F 1+5?N>/ҥY@e&ҥY@e&LightDirNormalized light direction vector for given pixel. Light vector is expected to be in world space. Note that this is vector pointing from surface to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/B_;OKFJ*rB_;OKFJ*rLightDistDistance of the current point to the light. Initialized in the Vertex light shader. Replaced by output of Light shader. F 1+5?N>/HRSEpFCHRSEpFCLightColorLight color for given pixel. Replaced by output of Light shader. F 1+5?N>/~__um1CR¬5~__um1CR¬5TangentToWorldTransformation matrix from tangent space to world space for vectors. F 1+5?N>/ٻzEuSٻzEuSWorldToObjectnTransformation matrix from world space to object space F 1+5?N>/SaI7֏bSaI7֏bObjectToWorldTransformation matrix from object space to world space. Note that this is inverse matrix to WorldToObject. F 1+5?N>/Z 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1y"WMB]y"WMB]*ObjectToWorld_NormalA 3x3 Transformation matrix for normal and tangent vectors from object space to world space. F 1+5?N>/)5FYP)5FYPObjectToClipPerspective transformation matrix from object space to screen space. F 1+5?N>/x*yIx*yIWorldToClipPerspective transformation matrix from world space to screen space. F 1+5?N>/#h"mO('#h"mO('TexCoords2`A secondary set of texture coordinates for given surface point. Any undefined channel (u, v or w) is replaced with 0. Initialized to interpolated second vertex texture coords. F 1+5?N>/B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYP%%u5E b>g'JNjn*pF CA`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yI(XFҦV>g'JNjn*pF CA`@0@?#h"mO('ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& $#u InputFloatW +kCY5]BtOt+kCY5]BtO FloatInput floatp X X uM@n;LATuM@n;LAFloatBrickFloat brick F 1+5?N>/@O p \/3Kf͈,t\/3Kf͈,oFloatOutput float0ȗ GqiFE0IN tGqiFE0IN Input usageVThe usage specification for this parameter X 9 4W}@O{$%%u5E b(XFҦVLE2Data, 1-1OSM n"GqiFE0IN C_TCMOVEX%%u5E b>g'JNjn*pFtBb@X@?4W}@O{+kCY5]BtO(XFҦV>g'JNjn*pFtBb@X@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, z€ L& *u InputFloat, 1_: +kCY5]BtOp(: 0: 0: uM@n;LAPN (: \/3Kf͈,p&; GqiFE0IN p0: x8; 4W}@O{$%%u5E b(XFҦVLE2Data, 1-1OSM n"GqiFE0IN C_TCMOVEY%%u5E b>g'JNjn*pF8Cb@X@?4W}@O{+kCY5]BtO(XFҦV>g'JNjn*pF8Cb@X@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, z€ L&  u InputFloat, 2G +kCY5]BtOp8 H !H !H uM@n;LAPhT 8 H \/3Kf͈,p H GqiFE0IN p!H X5H 4W}@O{$%%u5E b(XFҦVLE2Data, 1-1OSM n"GqiFE0IN C_TCSCALEX%%u5E b>g'JNjn*pF'b@X@?4W}@O{+kCY5]BtO?(XFҦV>g'JNjn*pF'b@X@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, z€ L& u InputFloat, 3p'I +kCY5]BtOp:I (4I (4I uM@n;LAP :I \/3Kf͈,p>I GqiFE0IN p(4I I 4W}@O{$%%u5E b(XFҦVLE2Data, 1-1OSM n"GqiFE0IN C_TCSCALEY%%u5E b>g'JNjn*pFXb@X@?4W}@O{+kCY5]BtO?(XFҦV>g'JNjn*pFXb@X@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, ܂dKu=\t &DefaultModelShader R:>a[EH*M\R:>a[EH*M\LE2Data$LE2 Data for node >g'JNjn*p7wCH0J .;]kI 忞@" HL P Q I > < s Hv ~| J 4W}@O{$)rޙG )rޙG ˢLE2Data$LE2 Data for node >g'JNjn*p(XFҦVLE2Data, 3"%%u5E bLE2Data, 6QA@y:l1J qΤIGGIb\ $Q/G|]8-1OSM n#J L QNIM5G&L QNIM5G&BitmapInput bitmap eSBgc~S  L QNIM5G&eSBgcm J/Project/Space 3D/doomSkeleton/LkneeY*Da!;jmx}l[םMw,j;f-`LiSOْe˲iӦiQhQDѢDĉ5n8ZQ± cmz@+T[l3;8,;KK9W<0>8E^wgGlXe2rHOJWA?+{oՑJK i <3_R_NM;|oO}?y '>)p?9̏ή&3?%LOM;d'gWa[dv;|O299yD&VoJ q)7B؈r85%y1*}<0::08Rpz5k8V+qVX9rlxexf RzK}8 8,aa!)+{vh;w8lÑgM}ލc} h1!Cw@{f8yf `@fT|@C*(=EK[{u*vG66 ; pІuza(1sC x6 wylGSW=Xcvcq_b#8v|nՌͥ?~'ށO˔#oW@$-kwo%DyP9Pq8 6hJ!Lڽߌ:࿍hp܍|1 u³{m߫^C/Q42\pý1P^6P5lU=}磭94EmH3~)\b ~/$D" `?"~{zlv҅k΅áQDy1oF撝96*8\9i܌wącɟT>|*~䙁f.#`Tswwr\em"ΤM[\>]Ty?B k,c؇*>6EzׂpO//`y| ;$^pG]?۴Ăk?>~=(@@] |1o/5-T1Pyϸ;#eݻ ~WrRa__y6x]4{1ghp;Gb( EG`}8ox U;E>7* 'yQS1p?tzXض?tXLK-g"ݣ1%7{ XgC];gxsc{՝'tO ;7Y,po8ϛyný6y}>P r'Ν 3@}k<{C\ӭ1Pu@=_I-1W,2_k {Eӿ忙11@'%@ccQ0Y[M_7K_F_ 8NងY%?ǿb?w^OOw|뽂 ^kz:G',\Icٯ?{ޭ ޴\mȥĿOxko(Z&0e_wꁻu:|K/O_ee/?Ϻmz?["oY/Ϳ,KQyl{6gߞ:JWR@=x'8s&6yodq:s佫q\?*܏X!yo (·z=eY"f~u}OPpc hshx  V*+|dk8fW }|z/Ϲt"ϼQeqWWR:a;ꄪ BMuA_wdyY7 !oeڲSӏ| 1?|lx +?=|zL%f׆(-}_(X 7<GUnxp_Ma^8BXDp|*>\z8`{Y_Z >^#,4p},"x_IItDyOJ\sZ/[ X;;e׼wiU 4/߻ĿUSUFb`ee#;ޗ KWF>ۑpߌBtO$P1R@-F>G/?J/[t{?}GKxu{@t/y=m30*t>\DOWu9ϡ@^'  {bd?YS3/-owsz ǿ0Jp972oq'3{v -zFWBv8}(Y+ ctO=pWPz@R:K 8ps=n/ot 9s}Y r)1e/ה6g߇Ye9Ż})o)RzYIWf&([] DOlɑO;:ymuЈ ?RR˭ZދxXϓI%ҹ헫AN}rkv^kk.[pS7ɞ-g ց-+ة?A"&_9jS ת~vγbT!X?X7_q&ׁ, (f'd^˶2h&h;(8 q7oۤ{́LyY\=: J;<ߗ7@<-x_T1@w=Gdw>m{,Ch( F߷*|bvoW [>l[O1 ''491cs@(*?=IKόOhG(ѕ,/[<NfŀnU7#-/ ҟ3eq@3ׂȒt'1#M D?ݣ\{S8{0GuK 1L*0@r.x_'8ə=y}f]s =n@+܈aPyw\EgӽFb9,`8yFsVtWqj [ޣ Q=1:rb*Qp[罺qp U {NE>ݏo^}w~"WſrgdQg:cޜr#Hѵ9%ʿQǁϧVy<; <ǒ:wXo~:G8no-HxgDF' iX8a g*Vynn>3Єrw7^K VE5֚e| ϟ ~WΟL`{_빩B:^|E\W/ajK^[l._ޚޚyԷ1W}by{Pν:$D3!LH7< dRmG \` }O c?(Kk,n'ڽPbu8XZ" :0?f18ipܛ(WwkfMprY\c >9/붶2^ gk3&3m{ù\lW~/8U/ЯOE?3` 0 K poo?\8ym ]3}?A_; /(]tǒ߁t=T <}$ZTi+J<:~~//Q~880H~8]Dp&t}+ `ΑdgWN_$ȇ E.Kt{xߥp}q1z oIJۅ|qJ8yxC}prJ=_+7b@K%q-{>puΡ >.s'8\>Cfϣ1@ %{#O}?o?ԡ??ľ'_Hkϧ`o/X5=ýOϱWF7 #>+&eo|uGٖ9mz&5'<kAk~RI/ƴOwݟ| `uOL-43{k׌>&pL1㣯NH厩n=خ=4㵕'uVLMtyz(IK8>ڊեRVbڊȹ0+{A< wGU|8Xm(K@ qO(;kߢwJ! : t?S홳ۻ'u=컃'&{3?:Xh6G k1=ƁES3ywwvj(qߜX!:nY*PV"L{ wNudxd/Gvc >*X$= k.]C vvU C ۋsd9rz/``7ƀ"z)FVpu:5}ε$kQw?s>yPL6ཫYo> '3w8$}wWO}C? vE~(v< ($#z~tXxw ?r!"]W!WF$;)DR .B  Pe8E]K̳.Ālwyݛ'ٟ.~۹EgKJM͸f፠.pM}L}Es/+$2! 1t]<>3 V> ]hO ɕ{z]o&p}ia$596=>nO`4kYB{W =7bttt3f?s{38?±Fi6= ک^O(@=y1ݡa?iMw½kp=֎kfs;A9(O7Eowq*Phrb2+QaƂ~ⵉpqcU+~継ޥ7#w/ā=3cQG lhQ[>3;?ݧ%v8f >W8ovzG=Pr?GWXx߈2 Joӹ#!x߄܎Y $up3+}- BǾJt=?2ցOVgA T@~cT;D8Mw#ZAt@=PwwN,l@ 8lF6mxdz*ޯFT_xw7|.R o=l{ov;X$;[6 ? xOm ׸ .T#Mk(qxwy5mA[mE#W48]ScDB$ 9k\G:x4r BJS?Ξ=6I'9;#vxn+Wx[DPq3XM> znqo,+e xxz)U3~>̞K=Q^K' |qOPl_w/&H^}w\ygnl3bʿo 6`kuƶwXZ_a`M5.zw?~ 1ݣrZ_ϴ,ؿ]Vպ59R_oxto׽ 1pO~wvrIUEo׬Y_A;RBܼZJ / {6We[ uJi?{?k|)lD!x8HO̞%"(  xϫv98wPc0G+ _Gn~=Q?s+?tn<՟=xO&c_˪ eg&~+3K[<v |>`?p_`+iϿ3=#aC3@YxB{ob1dD3r}r@;3ynyhM^S~ml-漞gk紷m{dӬA]U} mKO!(rIZ8b1$3zθghkYΛ{.#? ;':޿+>X3h}gϿ>׿?K| 9z@g̋G/>p|gBswgs~1xiWo/6` ڿw{=9MQ:$:'i: s\8p. F^p#=lzwx o>O^ߢzOz>1>oH P/F_?^cZU;IOI'?_r^鞠 >X!^เqy(ߎO9]Y(K5;ym濌1Q1{ƀ+9&/ 5ʿ$|:XlYD@:Z=&?[0ٱu.=>x<q ݫ~W` q.KuGd<"s .x{eS/{l-/sBs9]k\FHp]}t#PHc ڊGG"ODT*.6^7`O$<xqS$] YЮνwv 5*wסL9UbGl][nҹΝ*k6eo+;|L9M.ps|b1_OVRҝs asܖض+\7˹_l7p|#Dw8.,mg9X m܆z~3g/#]WaO5uO(^M㞗 R_RrU1E=l.^1˶?yrW,z{t;h{ʸNù|wB<@> rx3±(o/&jF眽R5Blw&sK:x{]j$ -nR0oA^#稈x;<+f (z-sh;:I/gCF˿3ϼ_91C{.497VL_ֿv|XT-=^ONu<3-?y;u ѵwg<ݳ`Y/(f__K%cn͹|Pu9ýΧ{Bts |9&kcc |`<#bQyוw oW+uD989sl;gĩ]WqU#}\uoZ fߜ̔gد!NԁGⱻkK#>E_փv_'O>n&g~lOe:;b[x526z5r'Ze)]4#rG~E'gOIOB D7ĩ3m0,ȱm@(:Vh|E'xk&Uo?5mo=:l_Wѵg{bAw#zWyhNmg?$ס|DW ?R^ۧ^!2/?sA<;Jx/t#.- Vq! i+"9WoiN$@]HJ]/)=[j[86{缪 RIv7( ڿ=OLĿ89hϱD¹u MəSN{Mp/eܷb@͹fǣY7x?柅( JG^P1}߃ct .w$v}]`[E5K":RztoϽڹ\QG7P73X_1?fsڿm.Fǧosy>R'&&?=؎rXmyռ_DQ $Yj:{elg9rY7~u"kXyHro, (9-6y}e::#W_ϯ`s+Tk-s1HLlA[0\˼P~>}>y?~ߕL$"socɏO5~vUyrUxE)LNNA3wwl򾦞**v1s?$w&]~|;ʏV&CvLOM4ۿĖ_wʽW??W=˺8\H<8?9*5:eG)K9Mt_o}&`[rFFN^V W;7EYn8vCr[D\Ӌ\yMYgV?J^Sq?r_@}G_9н^_(A>^?znou ey{Yߎ:Qxyppz{99߬+|eÿGt+Y!ӵcQĵb]g_߀%{39{^C_{m sCXRϳz:mZjKW=8?Z$^{9fQT 8sMKtڿ>ODZZ{@λݫ[g{L;}N:<2'yܳg'K k ?%y eF/BuٮĜ8YOʾ S}c:9S;BSߝYF3y^sݛJۀwي`hey59urcvR4ryŊ\QnGRqgu#^?V^#낅H8Bu;ڹ/vP̼Pznnd15ߞ;Qh;rykqwvy??dq=Yߧ%z $f oc ;ϵ?k||L_>s )%P~ |J?V]_5$s^3/ߦ7s}ZsSv{zKrA^G8;3Ei)XxwJ.χY޻k}x:_R;ޛ8ߍRvǙ%BA*?{?ǿ:DO8).?'o*A_sPR\U_K}?u\تc>|.~D9\ >/A n[w߯;<9x,N z,CVu8k\9~Ǟ:>1Kj<n27>sNaa_/κu=/NLNDFGG#(Weq4aj<}TqvELf>L;:6κ ?7I7ʇ&ߚ^V6n,3M(w`[52n%Tk꘠M[ [_- ym AsT֕"ܞzkj OG6u`+ v:fl zp{@/կ 1}1v es}Mˌ^EqN7 {A`QKk0㼇 ?={^_+Ռ ?5ʿb)/j eiG3Ab`h=;&Ow)%}svlJHgNkȋ[`/ܷ0v2Y5jW1 t?KR}RR1`8>/8>_@DlV1HKpޛcXxYпrO}3?wa8(A9O 8Ok:k.8fJ|ʼW)` 41}+vλcuR E}ƀ7T?m9g;?I˩`vz~@Pt+I ;Ž`^|)m3}{D~69>l{@Ƌs=/uuϥsNAz@Ec1㓂=>[r^#fz5ĄlkυF7  .+1K/|iN#kN=-Bw%^Rc6[z}hc{},޸7cc☮qcY_=vb|{ۼ="8:dfkS6{Ą?{u5}`)?cziäJw,˜kƒbE%>7w~?ώK)u;5dz=(acWʹlR)#JǞ_P3WFkAˣ݊$h.dH<&z~sSo?cYzO(_Lc/1:ARҥD|> 1mB8H};RGSG_.`{:|8򬓨y:QW6|Kw@0`"auWљ1?ܣ|.EljDJ)>O s }pP?R~hf8#3ho%u2K~y H#qAmPpJ;1Ozr[8 Oێs^ۉx(//$z#7M?mK#c8Ŷ$^±yP2dup.}7 Q)v{>,ҙPQ/{;WȮm1- _yߝvs'bB)(% jbBI7)`- 1 k=n bx>k?AMH<1@`nض= gA @4{s|fCA>qx}7\S6sw/;*љcĀ^y?˶wûc?ܳڽKu }% "S+qΪMϺ/8@{g?+ <g 4uk.88 zg.=sqޱrAWo)PjFy?sgv ;ɶv:uҜzG 8?DSSS+=^5e\k\o jH)c@b- OnƫR݃C2ѡF2A,HX[|u[TK>_얹=9GFҝoòVꖨ֣EX$g-M/0cw%?6g< C}gv%b@ӿRiqDž<*P-{A1}:Ȝ{:$ĀkĮAhyO1rp5*,c;J{BӿRmNݞb;,`[GByX/_sY3O^NK{YqW׻r @5}MJw5瘰lQ׆E7ly4xOW+5q?wWXq_m{W3[@m_~#c_R!wD@*/}V"b;kͱy HsFuokJ]<{fIn,`N?ݳ/+{8 \-|,Ẋ#s<9_E\C]pONXv;W]/c@忥K3U?SqF,4V΃C+Կ~W:U\{΁N&?rJZ{u9'/?bc81r5ꠕ3=rKϱ@z[[p.D{qņE¢̓hh-%}Qڽ`gy1ҩWuu@'3^30fkʽ3/xU|80?z~_^\s:g*W NϔpcYk[;7ʜ;[-M1_uj\>x Μ:HS@?6L~ <D9'2}I'jnZ9_~Qϣef뜷rMX!Bә0B2utˌFGǪG~ձ+yŁ KRc6Y(迈x߈g5*;X1P[5?׽NxLcεB}_ZỦڿlMKCf{O( kyѾ 9-baݿ׿_1&R9muߒ5}~Gp^1ݫh8#q:~Vp%j; p/A=?m?lĿCrܗ>gN %Kj?:[_ǀR<1pa,p&I8?"Zs \.r-B~~mU?WN}wfxv܁k=\2# &aMsf3 ލ?*;arrkߟuىl:6^:&!d4in<[McJ{o|bONnuxx |j7hs@[q1##/q|e;їGa1`~+tm *cFG^-a{mCx6G~opyι(˕{=?I韈sb>Aݏgm*^c@}opzD{J(VÌ{u,L{8hUc[9I\ʿ9_3rAp'޴992(Ɠc23{~S .g'hAYrne33zZEׄf'7axtJ7_[S':a299١@7Q})58Ts \T d`8r(՘nfa9CJhñ X3c>P|,xp9yn#+:Yr+。NWٮpݣJC?o_QKѦApk6D 7#'Y?ze/ʝt|UŀWvQ忍~4xG^c lF=@ >f h/RF^Ns"7:Cplo,?ܯGAi3&牿ľ=^Qn{Р.؊kGu#pWl9} ʻfw5;{1Nc=x?2?u%^ChR[E Ilr }o&zZj(lwUm~7ߩƜe#/D Q>xc=[m v\ǀ1[1ي ybi/ݏ.NT ࿢t%Y21s239}oMs,|+ʿwlW||s&_s5tTyވEnϦ&\=eB]WlNH" qC{< qWԼFcr\=Q^Eϩs:_yqD3tPFo- xUpcU^p _}>D[gךmث($@~yuo]?Ĺ.rNcpZ쪚SLv/H8'\{ϵ޿_B_)xe_ZXvY-=sʹV./?# U._a'OB0.H4* j ayۑ+Wj}μa~.J^ϕ̿v;0x1Rl\zS@7;9YS835x_[=n޳< kR}lwNڿ/&o(3odm7ro ʿ hmc84zGkY?`Ϋڿ׀5s"hKH1 EψE+dڽk-8t?Zg~pfK7,/_ {lCEnڀ_->?BX˿_ru J;?#XW˿R4X?ߛwP65_Η}mqW@}/K"၅رgQk^2K/WUK9 m7=}(c\?jٙ8v]EzBiUo!y/PN)"! sbpΓplR5rGt οb\Wn ԇ(ϵ,E!P4=3Y"FFd?.Xw>W̡;3nJ=}E9b]x~|Dvޭ~kX?3Т\ӿ_o5&'b jC@Ye4-.))T$Xq%@`h&DY”YŘ93  EډۉY$ssy{_Z~9ylZ=pvNeZ/{8q_cOhҼj!_~4[<=I Ͽx JZJ{Kw'?gZ@ c2-g]1ɟZS~.܇p'{+j0?#_"sG%cT쇗.-5 @I|ß,ɞ= `DoÓ3Py%{ĿX}~|lXGr@1 }nA{附d2w|$5_;rŗϺϖ^rX~? )@yn.rǟ_d/zOu /c j>H%z˶1#w<=_t_0w;/vbI+k-9?+1P E3kW췴1F ;yNr>w &O`McM/|bHڠXC _DjgOFgGY~+33f i9(Fg d}2Y؛PPPk 6#YV)kݬw(GV {oqq ߰1`{cLwB>}A[W9 ;ɟϖmeϥ9@eXrwzlKgO}{zʽ㯍Q/17޹T)U?0|;?³(Gi+#%ޅ=soI~Bu6dv1Bx /??}E-5Kv(mǖRc^襽8pkOpυ<'y@j_3/9 p*V[߭9+5 9D7QRܟf{ +k#{ xE3C~=`[ǀ"yse {?s@  oʿ`O٫s?2!?v_;Hw;^'F7Y{# [~&U21@o8^^+7&5/^Z6{狇("|WEfQk?Wuڍǿ1u?fC@1F>~g_n:,N_9vfL\`Ezv#y$\+SO5Ps?/OM?WE7>{e6͹Q?%ȱd2c$} {h%T.o|cC~D@ߧJzW"&q^w {/#!ދYszEs`O}|y9>ǿ@+]cLvWG`oMb7"z?E?3w_46u+þ?=>5"Y'~&u ah /߭*(qG_N^s>^{|H?{aܓᏯdhیC6[&OcϸWgn]uƿ}v`A)<~#>p?F!]ARNµimkWٓ /ƿĿb놿g:'wʗi3Gs?_۰-do,}`&{f3 .-՜?w6H&EkW{S:;j ~yU1!>btσP. m~yP[~1{( n}tUW_ڈ|q9GmވF-g3z\K8I{= N 0ߘ몳ӎǬx\Hڱ֠-1γqB-`]-ǻ:Wuށ;{`=aO{vl 6dݢ!B$)_:3A0w꟬sA2DSϞw[^//xVfmhz {m*>@t6b/.t`O)pgdO}"Źc؛.9~?{r>ioH{w` H(vhw; ͻ2__(g?RɟkO9>|=3Js;>=s9Of=-α [uQ ྡBޯ  xWM﫧M7ku@~ 1>;??'{ß}`߄Mi 9d/^3:K~#G׀"6qʾ _Qrv<+Gd{gn]dO?'{5s"/vDdpQ=mX_o#[bp~P3|6ݭEڋM܇Q; q^˿_,5@_7k —b<@ {hp%4ys*:|Dz*aL}pŽlo_acFKɞ72ͰUE#6O9cΎӓi~'0f z\Zɲk~a\p:[s>P_[s,H`,hӂyQ}v1F -jlaWmr]9|2 ~z ]/0uHuף{gCUѱjѧ^b=C;0^ّΦ'ߘOubzv Mբ&&'G_o}uerj%{&27?c~~d?e>.ewN΋`^=RfvC m])7nGx̙-欿 tAt6[F~ωkT _7ծ6ͽ=0l6ւ|-daf|Ͼ}t+tj`Gvz=3g2O&Z_caub`O|eї_/ ܥ?:ө'.k]TY=Ԕð?|aŋ , X-녆(UٳywX>33sRI"?858߇I4*}#3ԐgWH=]E:DɞgA-:d}5r&'&A{<\@>QpgM(w/G_)@5>O5 U6]EP]5ػzeL`Er=er[?LmQ{Zxo>Pc,b=66#VjʵPM}{N.mQ""ZfؒLMg25ү]M c-NgLoKaľVPDx[ b3of]ëZ/OE9R:>a[EH*M\>g'JNjn*pFCA`@T@?7wCH>g'JNjn*pF[C)C`@T@?%%u5E b>g'JNjn*p^CCb@T@y݀J}N Ԡ>KC~B?4W}@O{(XFҦV>g'JNjn*p^Cb@@\@y݀J}N Ԡ>C8C?)rޙG >g'JNjn*pFCA`@T@?$Q/G|]8>g'JNjn*pFC`B`@T@?QA@y:l1>g'JNjn*pFAC`@@@?.;]kI 忞@-1OSM n 럆L<_ї, qΤIGGIL{0nBg)`! Dr Phong Lighting P)\Fvq3^K :6~KAMt:6~KAMDiffuseColorzDiffuseColor : RtFloat4 - The four component vector or color F 1+5?N>/L ТK R]JĀ7tR]JĀ7SpecularColor|SpecularColor : RtFloat4 - The four component vector or color F 1+5?N>/L K vJ ~~tvJ ~~ShininessdShininess : RtFloat - Scalar floating point value F 1+5?N>/L K $&*2HӁdńt$&*2HӁdńNormalVectorjNormalVector : RtFloat3 - The three component vector F 1+5?N>/L P.L Z[G {/,tZ[G {/,EyeDirectionjEyeDirection : RtFloat3 - The three component vector F 1+5?N>/L L  zE%Sft zE%SfLightDirectionnLightDirection : RtFloat3 - The three component vector F 1+5?N>/L L w!XCLtw!XCLLightColorvLightColor : RtFloat4 - The four component vector or color F 1+5?N>/L L  B#A)[(dT B#A)[(dResultColorxResultColor : RtFloat4 - The four component vector or color F 1+5?N>/Q HL 4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1 %%u5E b>g'JNjn*pFCLb@d@?4W}@O{(XFҦV>g'JNjn*pFDPb@ b@?Z[G {/,:6~KAM B#A)[(dP)\Fvq3wk0.DX?_|X?dK;,w!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї,  zE%SfR]JĀ7/|V FK|V ShaderInput?ڵfA'7(`;M %dLrQn0P.L piDM7^@A툷M p1M@o=R ]> M }E[2CV)^K aN `MOWIB"ѥK HtO{/( qQ@Rj0N ҥY@e&L B_;OKFJ*rO HRSEpFCL ~__um1CR¬5ٻzEuSSaI7֏bP 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4%%u5E b>g'JNjn*pFC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4(XFҦV>g'JNjn*pFC<b@t@?#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatfC{o4}k ShaderModel0Q qΤIGGIPJ Q C/-~CxrEtC/-~CxrE Color$Input color brick F 1+5?N>/0Q Q 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1%%u5E b>g'JNjn*pF DA`@P@?4W}@O{(XFҦV>g'JNjn*pF0Db@@T@?C/-~CxrE-1OSM n 럆L<_ї, qΤIGGIL{0nBg)`! 4k Color textureP)\Fvq3PR  1frHsOP5t 1frHsOP5ColorSamplerrColorSampler : RtSampler2D - The two dimensional sampler (TpFޚ@'S R PR3HBPtPR3HBP&TextureCoordinatesvTextureCoordinates : RtFloat3 - The three component vector F 1+5?N>/S S z(J.ĎTz(J.Ď ColorlColor : RtFloat4 - The four component vector or color F 1+5?N>/"? I 4W}@O{$(XFҦVz(J.Ď(XFҦV>g'JNjn*pF5CnCb@@P@?P)\Fvq3wk0.DX?_К~k,J6 PR3HBP 1frHsOP5nEk InputBitmap, 1~S L QNIM5G&p"T xEM xEM 5%Kլy|T5%Kլy|SamplerBrickBitmap brick (TpFޚ@'R> PR "T Q])JNЈtQ])JNЈoBitmapOutput bitmap eSBgc0kT GqiFE0IN pxEM hT A ?gŘrtA ?gŘrMinFilterbMinification filter (Point, Linear, Anisotropic)xEM T 5 B%OKt5 B%OKMagFilterdMagnification filter (Point, Linear, Anisotropic)xEM T Muf2BޠQTtMuf2BޠQTMipFilter^Mipmapping filter (Point, Linear, Anisotropic)xEM 6I  T?cCx%Kt T?cCx%KU_AddressModexU Addressing mode (Wrap, Mirror, Clamp, Border, MirrorOnce)xEM  QnfM9M$ tQnfM9M$ V_AddressModexV Addressing mode (Wrap, Mirror, Clamp, Border, MirrorOnce)xEM t: 9QbJF}~b{t9QbJF}~b{Border colorBorder color -n,NjlpgxEM P= TKAIzc(tTKAIzc(MaxAnisotropy2Maximum anisotropy levelxEM .=  b/IG t b/IG MipMapLODBias"Mip map LOD BiasxEM H,= ЎeJf6KtЎeJf6KMaxMipLevel*Maximum mipmap levelxEM @= hdzCqIjAthdzCqIjA$EnableCompressionEnable the DirectX texture compression to save memory and increase speed (details of the texture might be decreased) xEM (= oC~Oܝ3 toC~Oܝ3  GenerateMipMapsPGenerate mip-maps to increase the speed xEM > 4W}@O{$(XFҦV9QbJF}~b{-n,Njlpg===?GqiFE0IN 5%Kլy|L QNIM5G&QnfM9M$  WrapQ])JNЈhdzCqIjA  b/IG ЎeJf6K(XFҦV>g'JNjn*pFb@t@?oC~Oܝ3 Muf2BޠQTLinear5 B%OKAnisotropicA ?gŘrAnisotropicTKAIzc( T?cCx%K WrapL{0nBg)`! Dt "Color texture, 1P)\Fvq3R>  1frHsOP5t 1frHsOP5ColorSamplerrColorSampler : RtSampler2D - The two dimensional sampler (TpFޚ@'> ]> PR3HBPtPR3HBP&TextureCoordinatesvTextureCoordinates : RtFloat3 - The three component vector F 1+5?N>/> > z(J.ĎTz(J.Ď ColorlColor : RtFloat4 - The four component vector or color F 1+5?N>/ТK < 4W}@O{$(XFҦVz(J.Ď(XFҦV>g'JNjn*pFCb@@P@?P)\Fvq3wk0.DX?_К~k,J6 PR3HBP 1frHsOP5L{0nBg)`! }s NegateP)\Fvq3"? thE@ d0gtthE@ d0g InputInput : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/oz oz Ai\tDw TAi\tDw ResultResult : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/(@ s 4W}@O{$(XFҦVthE@ d0gAi\tDw (XFҦV>g'JNjn*pFC{Cb@H@?P)\Fvq3wk0.DX?_%[ipAO9]&L{0nBg)`! b< Negate, 1P)\Fvq3(@ thE@ d0gtthE@ d0g InputInput : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/hv hv Ai\tDw tAi\tDw ResultResult : RtNumeric - Any numerical value (scalar, vector or matrix) F 1+5?N>/Hv 4W}@O{$(XFҦVthE@ d0gAi\tDw (XFҦV>g'JNjn*pFD}Cb@H@?P)\Fvq3wk0.DX?_%[ipAO9]&z€ L& fB InputFloatk +kCY5]BtOp(S | | uM@n;LAPK (S \/3Kf͈,p| GqiFE0IN p| ~| 4W}@O{$(XFҦVGqiFE0IN +kCY5]BtO@(XFҦV>g'JNjn*pFCpBb@@T@?uM@n;LA\/3Kf͈,@܂dKu=s "SolidColorShaderh| .;]kI 忞@"(W< 8Yq s 4W}@O{$%%u5E b-1OSM n"; "uI̎4)]"uI̎4)] ColorInput color -n,Njlpg8; 5OD.GWf5(XFҦVLE2Data, 1""uI̎4)]-n,Njlpg>>>?%%u5E b>g'JNjn*pFDC`@0@?5OD.GWf54W}@O{(XFҦV>g'JNjn*pFBxBb@@T@?.;]kI 忞@-1OSM n 럆L<_ї, "YMڿ$Zߦr ShaderColor; 5OD.GWf5P; i< C/-~CxrEp; (W< 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFChB`@P@?5OD.GWf54W}@O{(XFҦV>g'JNjn*pFChB`@P@?C/-~CxrE-1OSM n 럆L<_ї, ]IDjdc|r InputColor8"uI̎4)]pPt Mt Mt \PtIL;I1T\PtIL;I1ColorBrickColor brick F 1+5?N>/i< Pt q\W D ɭtq\W D ɭoColorOutput color -n,Njlpg0 GqiFE0IN pMt 8Yq 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1GqiFE0IN DIFFUSECOLOR\PtIL;I1"uI̎4)]%%u5E b>g'JNjn*pFBdBb@X@?4W}@O{(XFҦV>g'JNjn*pFBdBb@X@?q\W D ɭ-1OSM n 럆L<_ї, ܂dKu=4[  NormalMapShader0 .;]kI 忞@"@R Xt X 5R  4W}@O{$HBP L QNIM5G&NormalMap'G %%u5E b%%u5E bLE2Data$LE2 Data for node >g'JNjn*p-1OSM n"S ,S@vTVc\ (XFҦVLE2Data, 1",S@vTVL QNIM5G&eSBgc C:\Development\Caligari\cvs\tS7\Runtime\Common\Scripts\D3D\DefaultNormalMap.ddsY*Da!;?xDwx[ו/ JKItKʻWg2'U؛#[vbYvlK;;%N)ɪrM2/_$Soƶ "s[н4~~+D [H,]1 w*?VD]rѝ"ZQXDY U"Z@Js$Tl%z+PjMw^`kGq惝#.򃼣0rF;z|`i_s闪Mo؊LuXQ2" q2aCb*l3i8~3QeF$!P?SB"Ukư߆yz+P$\a&OZ 2i3hIqVS`H" {{~v,`;%Av Ή˕HU"~c4b>aK<|.q*QU GiiC~ dY#([ *`3N{ Ga.fo T EY(% +,Y+qZ{b% syb`׀Pi˗eU ڑA9ӵ3gΕNm!gz{ĵHF;7'=UuGỲr^]Io֓K'Zϖyӹ np_k~qbIo]>=醈K8Ơ=t͂-OD,faђ>Rm2JPjE 41ΥFΝ]JgCm鷩MJeWIOcp=c`荔Um靬S%ZƑe]VDK X/!ܙ:66uԖ{*\XVxq.=K;$Wf{ؙ[K94RLCԑi9E6ѓɸVѡ6mj EikgA,W8":[io(M[m=Vk9Z}ughu6%vGm7zstVCp.z^Zg T/=J֤w[cL HZPg޲_=xƠSm]ڞ-;#[iyޝiV%O.\t`&sVH'ٶCoI8 Ԩ_c.zq;w3v!to,YQ~_bV]ZcХNQ?\Z= []Z+0sj- (ڳ{yu]C8v֡ڞ#{ ll];\Zx x}+V$Ӗ徳O||wwd[Xxf:֥ .VҦ5ZkȩJRyLdCVڕ%ٳZ$ܟf]\B/9Ҥd˭J=שՆmZ]p941.zyLku34{#Gӏ$Khf{pvdavjKݳyW%[i5GZ/`Qx2Wb]s1W==kmɏnn>[ wn~>=B!~ro|aRʎYp}m?Ol]ND ~΢S)=XNW}wҫb^V@.1U!Ooy138>:60CZ=5 96Z05Kx68^v?s.N7#_osVܦO8x0 3 Q[Kj|oz3R뿘n \j3؜LfPsjpQm&պ ~l}?f-J3N$?Cxɚ㧬*١pW^Fh0J hG[L!ox!xtPg[Σ-4 Yn|>m3sm,U߳~86%A!# W d8I!㔌>T ".2nx*A>|Gן}tB%6gNKeZdޥE )[&0Yb`$tu/eIuY.e C1R)'F%X9zoP Ƀ:o-וvޅ-9oݜ\@q- $X@`{:`,B`m'`? 5a@G%;?[^KN'# L`Ɠ%U)agLrwۙA O`_ c[?"y: S A`Sȝ U[ ߀e)534]_fdgrX~ nGq.e S<n8 `sFDB(ֆIq׀/&K%2dW6O>0]*By"^Ѕ1KLd@acca X V_}T+őyM?{W=:4E_h´CSiq<¼6r`sCLAv/2 }p~!C%DKVO1AZ;ԟUU++˝H3I8Pl w;p31">!\1>9txf^kTrC tm5GBG<0ԽKx7`>[wP2"`g  WF;3Rʋ8?u)8U0'0g.oU]=`) כ:[/Nn ^)a 'Jxa9etslҠJ17/Fl;ڻmJt% YT[;5avsFϗ=?2h<ؓp[;^`Ǽ&"[6ev*_*%6aשiJy&*z +O@bcIl X @e,puP;arkIx j*^x/G(i ̡K.Yo3hutp8*`^Tq6x/#pɬ%ʌ{dJ >bLØŹ8GD7y0BBiflj֍Dނ ,8uaBM@~@& -I}.: <+b  @up@҄h[yNs 6$*DU. .=2P9{GqbHże*!]4؜ a)GSfKJܟü0\DYJ#jśAދq bz C,?,r8ͻRCD,# n |(}j@m|[96E/OY2t2] ++{{2?p C] 9 pEm1/FK8Սef58/-ZkU ;r񸦇& "[G#pF_ͮү"0_yi)1mvS,p.eWA0 Eނs~k>;<oA\1*C*Î"ՏnJ@U6@TO)Dʭvwɭ~[`{Q*wbƊ Cl1{1d4 x~kLP&\=+ҁ*M*P?M۵]8n"͛ .a]p'anX\醚 R͇s cE|M @ PkZtvґl\bכ#Śߑ-9|t v8 +_?5 _zdӈB}# f;'$V5x Ћ*q|3׉#A,bdj4fo2T"8_J%67lƸQ!"%`[¾ɤ GAc>]~0RY#Yɪunp!CYtjʑ%Yrnu/~jK:Yc~ ip\`>0WA_^!?ӇV)1\df5TF"a֣2+Lz$5 K| WR_ԈŸ1" ) #:l[avWi]FZƒfE~jE>Q&pƘQ|'a b$wF}]Ti2}<~߶ʒ M8coh `SjabE>zw@A^vb _go Z=~),ݾ9˶JQ|ɣOGp˕ķT>t47>”x:'Q4΃e=ת v:T6^^S sy D)q2˥JQs`bK/wsSYnfX$F@bB0 Xa|732`dfPf7J[ ?6߯VZU~v!0ñ]w'}016pMH.;>5H!1זmw_J].G.Z1X ?l ]?yb`%AI Gj<̓%SA($Q!~!cM65\GBUH58 =Y_.qrJ^6O!#!C:~pL P30/Ρb'ggnp] W-6!3nUZ&0 `qޯ)O P&qo* tч@(wa`} ̇q^Y"Ҿr-˩Ě=(RK-: wx_ 4[{+}x }~sp|Vnٴ,쯂Z؉h VDU68kgm{1 ` { >8ێPjTd0prpR/ȗ)~F204ѩIm.,h,-_q =:q/!c؇w\V2=A2z1J@3 A @ |\.hH%YroN-9'V (Ԍ[1C?щR q|O"$[ 5o02 ~t?2bPn?d jNrV7 e W}ߦKu}́i)xޗ,"b6ĵ>AhKsF(FjmZJ38]X"#:Ubƥ*c`AG#ZFRW&M/~)e5Oj-<"ZH/n#Pw[H] R[9{.vfB Qa8p G}`C?>{?^h?hȀ A?Ak$V_89RM~(䣥H$$cxWڱn6=D` r|^া6e&:j_C?J(r6w"Q|=1H2u#J?pj/6/5-x醘=tq|,#9`@DWߏ/DFNj0ҙhg>ͫG5j%k:<7?͕8nq 9! U8ǏyB1dǝ(2> (ry9j.FOْ\NSU+Eit|{ ڏXqMG̗x qTcH hts2nZY ٕSv+;޶1ԗ 9`;^nt *q>ZRkǁ?7m C1y:?-2?CˑJ- ոE$mQ9wvMO^Ȍ1M~Am1b1TXA> c|yїZ( 8?82zֱOw^ ;_Nv/uq/A%B]ϋa.+ր|O'SyП3wJ )Dn4m=Nm zЂPWdz+CノK6$|S? ȉؘX} }ҵ^4<(sQ[˳.[:݉3Dpޖ&YfҪ.`|/$`8;Qme4.Bpٯ^y&U[hu/'.p7#61C7dcPǚdS5J-EJ|:N|=b?X o\ ;@~NgGOL9͞&_s^kFtfIwd:f / |sd}op.y}WD;?_gkdzuhL< EQ1dG4<6Ejp). E/9WȷTE F,F r`U19V @GE߁n#*t CC_{AMr-\TC݅SC?Nvd5 y9<`GDpQ< S | ϛs3H ZQ FDX@#ll]w2Dr-[~߼Q> [% x#ЋAQ 5)3wx ~·s)8xȴ~l_z٭vWjM\U칎k%uSRP|_G;'ٓe?7oP>Q/)s:Ō)W`|$|~o@[xo#5mǭ77|/co\y7>|B=jGo_~~d.Q =KC3O,,M&T:U =zu濽uΩ'/Ӏ४S{e5Ŏ*amSSãaL`ƕ >㙷F##KT,sc$w.H%a,{էz2G~+'>?[_1 G2_Y>:SokBy{KPo--t~ٛM"zTOg.r39erp>s{GC'G|v@&3geiMoִ^[*FÔ%;AU޼B;iRLľ4g7]ne˪OF*K:WbkÄsk9EU-']V΋`6KΚDC=eKw;QĺkKy2\{ܹsT+g}wg:GWy߽7\f/uoZ>W6LS~v&yov2Z鰪\Wf'r}(Oϟ+S~g>] 6?TޏԅC]MR:\o˝9j;c/UZu_!2 5`Ѷ}nYnߧ?s_K+эڴQԳQ?7;o̞Kܭ_6eύ/ݳ۠-3/2R*w>XII3EtD|m kNHZ4ѥT ףx])oa]ʬ}Wzpuf&Y|{O~ƟO˵ <_A״[, q)Wž̇sZZ_,&~>xPM:7ݗ#;g' 21T Wf&&j*L_꨾Q}Kkv>RҥC&etiSn|/௾zaחc6P]pǥR+w]ɓyӲK@9Kgf.YpԚeڕYTofa@f.QoKzWk;?ѧbsֳ4\VgՋ-{{%0c 4앎`K_)Ӵd:?sըs~_t&e:t)S!Of!Qդ ܘ~-Zp-ٺ8bé\ !Ҧ9U}̤er=%ƙg3Ӭ'}\aī\ 5Lzi:ѓ {ߣ.~n]zޚ{9ɭ̃?̳ՙ+Gyϣv{)FĹ2Nm/{>}?뿦\JlQY~+eiݢE@;3zY\`^{/c+Ӕg2]s_y@;.mz5KG!2 Š8}Bef0$,xAM jd=_(g0R [~qcfhx#{۰JE4P3nc*)m@|ɒEe^NePXf:252  .n`ːw0 6[=.m Asa=yǣ /7}]e/J]y{y9' -غR~')3#{֯ ov>oI>,fAjh [P'uh[Tɞ\(K^P{7#z@_ 8QND-e @?`s}-Ԇɯ?{-*թ{o'b_r#طnM( `0` ;6{ ~a=аl1kgA}dY DضpO2tb[\X2֛poJ-htȚgn#]dK~O>8v 4sw"e_< z:C"˷`z!<[/$@vzg!{ݹ2 2}y'L♧!=}xYnwiV/ձ[ t-[SnrKmܙ=Gm=zcܙi }}CO}3v5K-SibܙPu4ՙFf݉G·܈#!pk/\zp6_^OiJ]ؓ~ے ,>޳u'mw+M W+-^q/Q[mj} Gn1ȸ#mKۙ-J-V36,+/Ao8;L4 ˾S[ݣ#\bmhvr+ՙf֣Kt-`pChK1R.(Gm5zjϭ3j#\Jwk_4SX&oYzXrb,~w`kz+CCeGkt>x!׿}Cׯmxpi[l^T@5^ԊhK;$==nR>(:+#V8Ȃ_KCl6Tioݬav P6}}[|X@s=UJӐK \qĪAmg]nYp*4y7bc+]^v'Bwgszڡ`+\a\ev7~o/϶ s{nbeWbSw/c .^z9eܘUay&sPU++ulrir^^~vi-cLb}owdZ;o6w'kVھTRo =Tw_h %˭}޾So'F'+֕z5]Q oE]z=TZviu3ϭ1V Öe͞%9 :7,E^VށUkpZ%r;e[ǃɪ?٤MسϼV9blUJgvW* qc6{ώ"%#~ϓ!PCSN?xw{K{{|W-윲S<ɞN+ ң}S6bFOuR pmBm=B|L]Қ9xOeg՝ˋ{&? g>}gVȷYsz'Gt xu W|C#7,xkkSu+ TwnN2MCҋћS݋w{R?{Vfv`%C_֙?ުL-Tz;uh1񤺷ܾ3_}"xL/5wOeCJxHM?<=ts{LCmSw@ ˚Q2D,K_Ԥ+ ۧϜVRUm`ZGJg ]V!PmQoem8#o'Sk)}Vt˵?;TIMΥX E«>zU-;phO.  DH$*x)-@=Rq)0\ip Aˡ[XKa7ˌ#U/=:CzQ"G2/!HFpH+ZïJ O˨ _2{"pzzrA!^ITTF1ol^;NvdEǂYxޑ.unI~!;3HA??b##A|A|Q_RG4{ #?=urfr٦:Q4!sѥ Nqi@(  [[ҥ]@'( ǃ{ *tndGgvmģ[~f]̱շs5D7%EpBD7coJa@ b_ #|C * >/C4ή,nS&WF?4aQAYCga³6E0q؈6æ;la 6aawa@F(DȠ(v"~ 6wC;97Oٗ=.eaX!.*5jʖ OtnbMw^S)T3ȥwIz)T"P!1Yk_@6D8oНdiz4h_zmKɻi|2{֩^CZS2I7IFH7)7y7yq ؖ 1 uyNQ~X o"-6MhttXC zwe {+8MO `/|6`{_Ɂ}eؚ 3-6FFwؠa? )0 KG4@UkkcN:.Xf䟰 ʦ qLqf}<}xΟ()|cwbA?<1? =a4Q;RGz'JHW*<9[:9Czt0Oŵ_=n?ٍ wїҫ旃G g^s㵨 ނ⼑w\Єrm`S6^\ =5'Ҧ3e!X??]`zG(131$.3F5uDC#*FEc],{x!<[sAJ@w6`[`F4)k 'H``"pZrCeI~o&]pU'qcITӉL?v]|| 2BhzX"c|q`nʁv$TYNO83oRU/F^SccP2 g}4B2((IYLbkd}EijHkgdfm Y0Ux˭*-dp7CA_MB !~c>FFy38#;üAxC: >W?++흺2vǽ3.wd R7O~:t,RSvkĿ\RG < 0]\Ns rp!0qm.à C0 4~p!t#x8'#vj1Ͷ,'e~wBL6=""Ȑ11~.!#[oi/\ANjc V $KyXCy_=+O{Gy]yA e=N۶$&Q,٢}`'%"U/JȤd=cw;J"QHU$%ٞ3>NR y;HDU{)M޻7R^#G-]j7a0x͊,쵄2s9ވB"⹒(|X#σ ^UH9Og2W%M,Dq/ŇS#c/>\׼+K]'VLj,XVjܣ ߴ2G .z$VjIi?3 xqt/d/`H;G L4<&E;Tc"qCKω _l=&A xYgЗuЋ`ڕJzY[?^{ C$ow9>G_llA΀ݛy#` #<87Nk= 409#ykrI C]1b:or: JDj &Rx | W5KlLOZ1*mtۯ4x k .d/M% UܟܟJ l0F?{ň?z:}~)h-*^a`8 q+q_ Bk2퇑2Wȇ3)AalSOHЦdV^;~o|$ :nK>[\~ XOu,)oI#:'KbNąn~zR5 pGyxxp&bMVl7jnvm3n#6a1jHIظR=X^HR,cv ^{>c<xzq@ѥLY"BUJH,![+/ 6F!'R`ry`dKzab.}s 6bSKXle'yoiO~uSOV[o"^S_h̟A݇/&P4b`Sx.Ԅ[+HD + WW /H,1RǷj#4 ׹vCYB1pVA߭ XdW#^( =sgp}tZ"oʍQ/rtvګʀǽSntk!յ`啵ar=6fџ+T(wt`lzdkEJ Ȁr\s*`_KU/ha ! '*]: gtJCI ! H`* ܟl& `=ܟ xOH\+t';Z/utZf|ؔUa=H+ Ge1\=)~Gi,Xn_f@.9J'}:!8} gb16 BєvCZQWܑ~9qy+Zv֠`o 'N>f)75 )$x W{`B^^d_q{5 ir7K@/xo'^ւⷤE+$>3w?!M}7~]Wh0 Ẏp\c2~z^< #ropdr=5C5<`쿉?ޕ5ek J9/#]о!B>2md" ( /$}(N̾ ד@8N0GE_ LKcVo{bZZ:N}T<䬀e<yܕu#]@/b)?*-˃˃ ;#]So!ֿUgW_I3;A{pY_m:C}[5@ ,6Ґ`|ywwzN^dSLio3vkfi6#=]3$gkpm&!?Ma]J 0.NSbȿSג ]nc3q)CˣhԐxxE_ײS'f G-?v&>5.<Ў|ql!RJ=:5x/#tŽvN ^/'j/>`WA2]1{5YONטj'W2.ςEWݞ(챾?u/iWGz.ĄQM:/}\NQj俆?̵X'nͽH?z"Sq_b&ݛWA){LS 1%;I@>[ -;ɷox^CDNjϧi|\(@T *ܟ /#XWu!YF'G,BZO75JK%]~WzxW!䕺4;^> >\n >OiZ&`)O,`CtH)Lw.lRd[9k݉%;e2]i|!o;6GYiw!7@ \ZQ:⼯&Lfկ4@L5BH9? >y`}䭽<v"@x/IfSvxLp3S ט=Uag$|зVp't|Ox2vgPV܈Ƚ?O K]˹\wなb`/4EY02[EʡN~;gB0P{!(qڏ14X )~f~F%DɎMt0)V+qMڌAL1A OeGST/y'G"%}놨G*FyTafd϶7s*n00ҥ˸V=$kh&X4dUwϧs#p|]$ WԢ|N~Kܿء3o=찋|vN~[}1o a; 7'О^NH;LuBjȧ|#{29i+EO-uˇ<:Csꜻo蠓2ŧ0C)D)>cQsXnjeb}kz.`Jg.8[';M5&V3jCߏ=O(Ԟ,HtA.uk⅘/"LdSvLj臚Wv 7{[r)djIFTގ9%Mo!_`\ Bk0 Aqc`+&sr-d/=FVŒhw Ussso/r9yqBN#{IyYx-k sSX6ʩs+biEc]^VMc)RYo[eTެoZEn^Q[YW[B6Ze}(17EoKonfC͜jos/#\:3VEb"j!s-;lneGΛK;1׹s16a49b-<7d/CF1aF޽#\}'sZ?7U#$-rxW O Q}zg=N9yX/[˕--Yek-}~=]60ϘkMYcSlK̳[bOkK7=l9OsKiނ4m(meM~(qo[cޒjTʉ7?ToP-**geoyU+M_8#g}NNrdxFpgf~oPז w>;{-i2VIjvهβx8bgm=\]`۪<>X[t׆Ij9z"%J8u{yɤ[n}sS{#r6%O ,i\W=Ί9YG663ڊc>;Kc+7b' J+ڋ/z;;%ڠO!s=o2gN8AZvQ Ԋ#@UҾݹ6{C쬮$}%׳׸b 1fN LUvtg70 ypS"]8szCP:zjr<-*A;Bv#vrVSAg TW]d>Z^{/h%|.P*.t?-Mx\Q&|]z2`nAsS 9k$z ":js<nago.NvD‡b4,*5>`Ι:K#p*'Bf96'Cƺ6`7%~0GN߭k-ot|khm!s~k^a`.]xj` 7d'XS>si<ׇo|$&E[yM-7>U Hlfb!Owb. Ƕcwo%wE`f .675XE%d-!{I=XYNM˼}6na&F> P|rÕ[B7_-;A˙]NLvr6f;䰵%5>k'.l[ÿqw?lltݛd>ڌʇr>;ec %l/A{AZ0r1=:4J{Tx?S[N?s{쨵:l7&e.UYBR>;bYE1hY7ӊr%; a{EƜbxtlv±Ve.\` ~1TPc\nCdgH~BRȤ[HV}I_a񌻎 3)ׄ$"uc0N$p/|v$L[pJ"Ix_ ŞIxsV# STZWžX4$ȣߋ5!h3ZWv#Zk#7yp![ݳH";O '38f0IZK5Xˏs${QdK3cN}wº}Gh/O2MLt.c?1Enw>y1; ?cNRYcoCuEHky(#g3ҴW(+ 3wwyIRg==Hv-m~mLJF@g8[/ω5"Ĵ\>ŽQ=Z s3o>0w)l+?VyDVwsܡ⇚/F5} i>ȓp 2oeh14nt@I-؛sF๤Fu{ɁcfL=Db ; &LD\blqqhϨO[u}8=5Sqapv!9;sZ8Z9%to&wq q:e]g?-Hwo*n|р2'i>\9~ɧc;ţrwm+֣_ȿ~)Ω_J;d?8k{+OvuWFetB|Z>j`ˁ '`OI!\9=alLI|:1hw^bܾ`H|UBi5Oam _Ae1oG9zرlx&Ͻ.$y< ʙ1s`}ntoOl#C{OjVNfO>T=yLбI՟ T?T?iwsm 6vF;0'0nW=b/vF;Hl& @WZ-ֽώۜ B}V8lIYvC^HPTϧpSmvoq2aRڬ3v+ugF=:joUg}>M51K&5{kֹ';Ag,wQN縗l8]9TN3;Ԭ}6_>1'6{Oz&ibaG^F߹l>#0H;ǙVXXh pS|rvsdfobf>"Qh/-zk͉_k7ٙRsH.AR_"#lט^ 866)^d`9./s[l.{^9Ҫl!@z#%uhk87 s"&a :o&N9lOw-5s5O%YjFa@~O0G -S&R_!:e/.o: %VM:Y5SFa:[`H!ui| B`4)Z{sRg_%dq@1W={tdO}QK"K!BYV\6Iy))tF^;9'p/rco>B9jiʏg= h9?wo07{TWS{kxƗL3rqvU XL^vRGPy,Hd s+h%ׂ5 dB,!m#qѱbs|񌜸$cHY)W&Q$MiRlӻ¥97`R ܍,myA֑GdУd_ ʱ/<|@.fwgYi]\%!ЛH*^S i]99{/B:ȴT%qGQcUx&:u}-rYrOzoGaކ$R^$Jȅ;? ;?Qqm*Ѻx#~_1Ro][onP=rCkL.$y' Tqd~S{(8uzwc~b*WvfL/o;#߽>#On_?Dw\:ԫ?h)B"<ٳmUo\Gc:)l-u%P<9Kvԁ,3RFa4I9t'Y\ߐ/A l'&{ "Zln5\8l- 爮BS{C[%ɿ}l<k^TĀʗjvcIRˍ Cm\fb>3< JȔ26Ts J U,R5G:>Q@,/عb) G,u\n<5oy 㴯r%srC^ۘ8(. Fly `z[H*b7WrЊo^#rb}*RÔTxƊogSR,EaI?_ WgfLQMO`bk]luA)O!"I,îV糒 ѭ3yi쿢B-y 4 Uٵ~u\2:$G{A /qkh.D{D4~(Q><3dGkVpU˞NRHtVSu ,{*$rSO6.[ C0hh?7 l-{HxteZVӋmVjs`] ֛`M+ϿawkTZx6OW]ra5 ZL:֡3SY~Q8E\ )myk()KesccƘ!(El%iؘ1W`\MJsr\|xmuL_(4=C{>0)~(F*ՃJ'Xr";fw/wFN d'~ϞFGU\T[3x? Fvc|Wޑ!{./v 1W\,YkU&]Z_G+m_Zr?*km ^A%Ax(ing IB*ZCf?={7^t%,v3h2[/#Wx1q(ksk2yyxy z_vF儃<ɩt7b_Whݶ X_ls-/:\Dk3AOz+B@]Z <̀+"ۉK߶ߎv˛bǕL|3kS--}=6xҗWT3k`^>_r]NDV4EHɨ x^Þ:rz\ /\䯶ZzK3u'rغxGyn/S|~M~.ErnS2"@А8ŐA>fD}曐%< #sP M8)Z'@/уܯ)|r V_Gx=IvK\ ?0ePv-#%~&KPqpI*{?qGROl!UK^+}v9b _U_봳 QTSǞv"布(O["Vc#5[a}eW8w* x-AA[-b9FuƍC~!,]/ʠ! Wn/Dm1/G~g(5L*%Yl3[DroyZϢqX q1^8WZF&J&fhB8@޷YTe35p5 kcGS ܌Tk)(4#ǯ 2˜ ]b?;J}Ǽ%L>  H.?C smS .v~Hk5*q&3~{qQ!bZٹjpUfG5~WKaIk3DIܵ[u}11 ey/rn4^dfƌ$' \ـ>Dʹ.;bmnp$9vέ3jGk]8} 7f. b U rPb?l12]tr?jǡoSǓN|}&Ks{S C.ܵbͣ-iGk%Q~DXzr.co]1>^[d1ևa0 kqߨ0N쩳 {O>O W'acIs=:lak$ҥF |?b\%KyQ:U ۸yew}q-Q9㸊Ͽ\/yLk1.G]JdQv^\91$K#K]?h&}1P2Z:I N!{boN g#dV|m ) PDk` =1Z#Zl {[yte3Dy_$6r%3i{ WǺ/o YBo5Z!uqHcxڴWsN,@>l8I0$ܵ3bK_x* M;ySSoiDoMh\O@!i`-^ ]q|F6N41r=VD=s?3GCooUi˖{+ Vݍ)!]{ڞN׾uތGTHB̬Ѿ@%~=IX_vW#% yb}uON{;G UZ3&=c;߿vtTN'^Eo2kSd-C~SGu= \ny4'b}6I0*9s**?$3 W RlM>ہ?L7}nVCԕ#5wD:u]'}1.G`έwkQcDB:,_0SN %dܝq8mqWƘ^sG{2@9Xbl`_qw i)2b'A_7ai-j1䁏Qa]Z]z /3 x s3TǟZgdJ ~`7B_o&A.ؗQ`ӀDq@< >$q ׊%k} ^h%\ޙ]zo_ TᗏJiHה+ 4~ I<g\?sW#D!zb:mSm1Va-`g,Q')vF:(sq=>0sWFq_p$w0/%[Vy,L !7[iqp7-OgG龮'2Cȑd dgiḦϼY/vVK+?wwUuzc KKji?( 7&`.t\B[gz<БUx>Bqb#3Sl0Lde1, r-5fbtE氟ZלJ96?)bseu+f{"jwsq0oX2T̿a࿍mtܕTjjR5i 9-Lp<ߑӽO`8?_p{&LK_ox3\tCoLxiԱ7) >0OrgjU?RӰK#S2 GY,`X44E(Aix(H4oܙH2` 0bO.`@MYN-.`uĂL[L Zw×]v[x"Pw 뮰h] cyFq/9뎷}2H"`BĀxft 4b~&n:I$nq +Rio ^<㚐Nmc^>ĒY#k= \pn4alϏڅl\|S;?QUoM05ŽR+[H>e.eRS/g dS3$u|L$m[xj"|;:ǩ[jf[:߸|Q3}IjFr{<Io$1wp%\ȋu,tю;l ga5ԅ.;[!#+M 9Pɽ0ZLIjoHc%Q%"fJDa2 9k$CNK3?ӯV# @1E8k_+ W+-"$lpAnIǔyka.^@0363p7btVN_ F_.,ƍ[+[܌yKf^{wAWoV*?a ڵ\f❷Gx\I]3Ŏkurb) li7  o)n?kr3Yf;~63n3sVb(kֺl &he,72`׭M_27sKƝQ4o;ooRWnT6RP l7XIfZL̿3o1nlI3z⚵vr򝿕;LƼLԬ&^3n-+)\OMҔ)LX5L'tmyv'_n7'|OWung~ݷWﮥ9_3J܊\6 떸 kKX5Jy{ۀ9^4UT+oK7bzLi/f6͕ro<.w ~G8Ӂ=vovz \Ί[k uDލR|cxS^(ѹ}}GĎRcw^xAʗ﷘ BAsm:aܑ;gSos6Xta=G3ګ#zHg%u6'*1mfYi7 m{ä0}-;jiwC}{s{#ouvq,m֊,MS<\3/i:%MF[[=7*u5';}:h'"p-yӇ=X]H?XKTl7{먮Gj+‘ݹM!cͩû\Ίt*FR)m7?q[- ulUފw; -`n !(%هu*= Doj]J2P}[?9_cYP.F*d3k5Ye!׾YnsJw_W~ks&h W(]z!U!dux~{g9 37報J񐽕 ŇM%X-A91mYN> Qr]YqOo,^yA{y' 7_Qfn1٠`^R77?' 5+@49Wmis^l}KMww6o_{~w)} XCxCx#7duA"}5f?hͱ^ԫΆ=DثP^ܟ@<Ġ[OmJ .z0PҭA&D'-ٛ=4dAl.bָI < זs:Х0Ak˸W+yAL{=G!5Go\#4ĝ'zQ{քSkKCKoZ VB^0^eWěl7wo$ Ʃ{^sg'o8Q9 >0O5彸Avxkg?|ci!o"si/ѣ^ڣ7sn%VN!n5эw Al0`S~oGg;FuuJ> dYC|{3נ2^ߣyr{dwM\SAw7c$`>waF:dr.þoԿ!Րo8{K6.Ϸ Dg[]G7ky}giTv-"m+$脳DR:+D.~|x;}ԕ?v[(ߠK9-(Em=8qB/]ou'jy?7Ih#b0ܸ];.}kW[A֥f .{ a.?`Q8v /{fa,~HyWd(VU=6u[vh~0VюkQgb30?C,;CIw$vOKsܥs ցEpM6R?z*}6nh́mZ YoIo->{`mrXpK5-Boͷ ژ{CAȵK5ж;?Xnњ}[o[Q_*lPz+Aj)tQ%eۛf}p-}B|&'Ks۳w:]҄V7&^2JlsGijJخs-3J3ݮ T;3JԞön)8OhWvG!mvV-jk⨶W|[ǚ]:=i٤Xqn]tx[HNew` MKz4~n4#_)ڈ |HIG&cWs1Й9cj)4'숈dn_|]>6gFh0B#Bx-!!!4G4HqT Z|x^V&@0vnE<85d$y Kc7'Tۋy`ްx\ܹHsMq]qqڵSkq,>h )x]V$^'}Fb50*BkoP8*GxGGS)u3niyA? ehSLg{P˧h|6ėGuG햀Gwy#yp[< lcp:!Or]}Zɩy/x(UQD ;*\_Gu~$;*i|1{{W^3H;"QJWN=X;ҙ'\fo8R6*uw!6c:s_#uuH׼5~. <| "AԏJ?`dv!Ej֤ڼpĮ +zH&mWr񅺬49VX* D̚2|-ì}ޜJg % 0/ʠQ}x-~[ڳ%G.[kGfd#b'_ _yDsRɽNQ;REjWbGQ, yX|~4<cޔ| :0?wHbOl(&؊ԓvlUрן mJrtFFg%l=&(*I]֞HZ{C#xT}A>JxF)mvߍ⺿"9V*{\p j7ޏ[{q=.{Y,Z=ӍI^Qe~}:FV9`6hg=&?\WcN*G }/nYB`,/> D[ x]1@dƜZbk9}aw`C=?='~v$t4Dyb4Fkx_BRC6ݯA,Q<3nϑs%:q=bsg7F#އk0 Я3 だpa %O؏^kOoYNu=ͮ ^x_ޘ?^}L/dC8뜏)3AA: W`{-,w.n &<JJ9_A1MRBƎ$qvD&oy@>s`c NR럱7D,aȁW(H%(t.ԲBI60)EG.[+c`?3CFUSuX k> i0cr0wßj'w<~ϕ#AS[%)2q.@,DUK-n)+zxy&pO_ qI e&P)G7˺G[oY ),?Q.y?KH16n{C1F._;+# 3|{/}<-Y %o`N8f+HLAl@%5}_!Fv@ϛUk?90x:[X)?0&FDqs`>d–H]%(sC@-O.sO6)&i U E}[Vğ~g^B%eitwse4x \!rb1`REyi5gſj! 1]fzϸC_S˪1 vP鄈Kq̘O9f ZPp=34Y*/Rn+ﱗ3MMyqҙțW!Url_{u/s@ px12o/`w6d 11m}y^Z& Vcc<;jsNnG" ~0س0N:3 wewS%v,:O$kq牎K8f`lbl[}Q:dKBA@G,wjw?IWq<_{b&c?`|&̾OJQ*u~ >/%Q90}AVy6' R:0.$&k!h*sV^ߦͽ(IYd@ς7Y^5Х \tT a${sa f: |}0!,䭘1d@aS n D#|‰Ltզ ]j-=/Wg710ƌV] sg$ *>XDs Z,8llbwGaw9U2b6v{᧶~-<U$e_Fݘ7:q1Y1̗WI)kd}Y3#1/ >/%;Lߐ%m˓-jץnq FO ]g1юX%˯״y#= ę3G({5YX0pxtT ~>gVyO3WkUiqC{a cu>k/`{y a]2o >v*[>(b̞ij {0BD_/*;m)q"q?%_ p?* vrtEkd)TJ> R0@RF?ğ8 PV?9E CS"Z%pQ1_H;ǩ{Nܭb'ZW;ҷZE j:eT}޿>mC e~~Yl{F.ɝ G/W@GMN7\ 1@D3fX9 ?ܞEHȋ券Q.z̜ _ub;N?9ÖL9a0s>=(At`~hS!͇:iqh? |lQ .mɦ?Xܺ1gDf_r,c1ar72_O{A ATfLj;UIџQ[_ O}}*A]NN?͚{;1 yWtP嫀]u&Nؖv?lMoww”HN/1r>ȏyI`xDsG\q HOJ S/x%Ɍ=' ‘o=߅q.^rsl? o?ci`cqb̏sAJR朏|\G/^WfވDI,vG>vȡEM^S3<-^ٜyc|cЏ Yp?Χ!_==}ެ0!T_=52.& ~\l7V7W7Si"OVQ}ɸV,:UZ%>w !`<h>xRDe0* q\x>G#|ob@OAz9t|SX=7бROLك۔n"/7B13s(= ^w c``>sq;/ q1'g 4^n`"eQ}yA5mEs?NriaMnqȎb؏+ 0羔^yVXHo%)}[iY2/QA=CH$k+h5!^ykc{h1Z}ycHS?Zds/j0̆`ZI{?5~F[􅾯^:'+A+7["UN0pςq-}|С%8`tBR}>Uis0{Y&Zbq+=$:ygvG00m<sr1 q|,xabU*Y^SrG(I~r O{x%TZRlY&8*׉a.E_vp*?7;[V{] (F|+v|7{n$xNf9kƑyYEr4ֺӱ~-ʗO[Y{"kWuNgGMxt!W̔GQ~5z|6_Y%Y!~}l0m!AIq{4ɥZP֥)W5gP49_ 8oJe֚@'˟Y'\9f p?Dttgf{Q9Ob_>0G4 v P CLy>^ݜ\a\CFJOG 6\rRG:=F}w)B][Gjg|:ד#ۇu!&z?T t;+]%pO^g>qAwԩǛ]/?pg[:zx1X:KLg<'dD 9x1Kx 1!9b#.|H%-[ j٣xo\WyiQ'0ss82xdːb[~lCc`\4cd:ۑ' pX,g:5(Fk4A]cf߇$vއ%╕}||/'A4 r{/ڋ=c . -[ܣ Y'wE|z{JG%mz]0+4S1.]rWjuf-sA>)A3"Z:p ZQ9߉c` f :9Mc&+x|| ;J)R;C_]|~__~PzYsO|BgJ)7 7~2o:667oÐes&2?O;4?=A$38̀NH~C"jEFEq&rA/"Cxݺ0,6U34<9ʚAh0Ȝvmt 1!BY?X0"CIJbՖ[jbǬHUzOf̆5uQ;} OJDkdZ U5gFk'O]JV/a!+ko3ݒ)-6:hC]BTqh)ئ1r{E30ۭQQyc ;S^/F" .|7oHf5 9Y]?#WYnZ|6p dDA {,KR?<2^{C4` z_@bx}ā pҁ0I2h!]O9ݍ( 䬧@O/JT >BN5؃VyC\` 'qsNs7Z!߆xA١7 SuvAGuƜ^~T: , xIc@ |ȷ=X>n˅^_mG9HWktz]FC+`xO/2}9f@Vngx^{֚?bD^ 7 mp=BQٌ 7 x`Yd!c&9SvfO9{8{|`Р3m~nO*?sȑ[5rxJ9*[7B~TKU8Z<ph&_ zyA6'@&/ї?YAD+KيO"mukP,VӶ=2`2?nгhOBr:D = ctN>=^:FE#I?MW[nOW3]ӛwm5qơD>,e&dWաA$щlA @+#2 `@9Jܣ<r$?5.6"z lvυN/E= c"x y4 |0^yZ+oޣr<;M#>Xo=A~g ?G.A"{#q?daQ aΑZD55eBG~΅}>:fbcxtVLNܸ>Wfyb~>rMVn.hfU1uѮ Ya&%8^ _P/vg3gx>j[@i y_|t^jQ&1ާOz>CMnO& }ԭ. ?D:|6EI/8c?j/ 4rj ;n'G?t$=E]QgYhnm}+t{~|Z*4GUvuiWG{G92ϵ+ 3m)cOx^e9ןc?mbӮUiȨ:uxnӿo_/t^]~w~-{htbz=!| 9rx]c~sp-S7D+yYSrZiIU_Dpr.D-_"*+l)Vxz`Bx)u"{Cŷ-o/ [N=w.1UD|q{ UZ[%wx׈'<{~ћrkշîP_Mڊwj7R[iDݗ#/dƖpaGa:mOɎl/NPjɩϱ%W~w.1"ω~ۉ+LppIV)^#qҹ|I*^bvlGBڬ *;A YP:us'm{j>8b=v+ >n)̤5ƅͅiiKqoPw kV}ƮN?6F;sIϕsO6xm  ͷ{D@½Q^e<:Q{ ǭ]g\`c.u:V>b=KJKۗu3;lPf{sdܡOa{ʭ.m.~6>w>2ytu1}h 1WapsS鳼[?Y74!>wiK\1xtsAiȺYkcO?G-d3οM_z=D&oɏʇ]hƮsp a Z~_bk |Ǽ2|qWҠޡ S7rVRkZ8_λ7 8Mfs| s3lj{Sup& L2N.eAƝs-߳HO96o_!crWt_v󟄆[Ix1#Kyʮvm+EPfgv^߈rCֆn*j`eA3|2}¡W_gO|#鑥Et0U&BNe,P'y~O.f]Eҹ(s7XW^O9YɦNtm@Tf+ߨDµ(X ,@>9a8^$Id-bj gwtN:CLb"~`ۗ?^{|&i7F/m\ ;+i_jY!zk(!9 6cGq/e;uk/˯ڍ>ZIGm/\I:4 !}-2d]HWL=Hԡd$5{  kc&x5fTc ab0$Q8 ^ >yDz?i<:Dsʋmh=K>3Ψ`m(աQ@FA]3+Βp r`k-UzDٚJ$FZ %%u5E b>g'JNjn*pF:CCb@X@?4W}@O{(XFҦV>g'JNjn*pFCCb@@\@?.;]kI 忞@-1OSM n 럆L<_ї, `# JS5̿=|a: ShaderNormalxM ,S@vTVPS (O  T"\E t T"\E Normal&Input Normal brick F 1+5?N>/xM sT =0G-|00rt=0G-|00rTangent(Input Tangent brick F 1+5?N>/xM @R 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1=0G-|00r,S@vTV%%u5E b>g'JNjn*pF@DC`@T@?4W}@O{ T"\E (XFҦV>g'JNjn*pF@DC`@T@?-1OSM n 럆L<_ї, /|V FK|; ShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷HTv p1M@o=Z }E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFCl ~__um1CR¬5X ٻzEuSSaI7֏bXt 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYP%%u5E b>g'JNjn*pFBC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yI(XFҦV>g'JNjn*pFBC`@0@?#h"mO('ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatL{0nBg)`! d6H Normal-Map, 1 P)\Fvq3PZ {O:rt{O:rNormalMaplNormalMap : RtSampler2D - The two dimensional sampler (TpFޚ@'8X Z f F?tf F?TextureCoordslTextureCoords : RtFloat3 - The three component vector F 1+5?N>/8X X jn.Fd7atjn.Fd7aTangentToWorldZTangentToWorld : RtFloat3x3 - The 3x3 matrix F 1+5?N>/8X 8X 5p˚FudTQ9T5p˚FudTQ9NormalVectorjNormalVector : RtFloat3 - The three component vector F 1+5?N>/(O X 4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1 %%u5E b>g'JNjn*pFCB`@T@?jn.Fd7a4W}@O{(XFҦV>g'JNjn*pFCB`@T@?P)\Fvq3wk0.DX?_^CCU {O:r-1OSM n 럆L<_ї, 5p˚FudTQ9f F?nE$ I InputBitmap'G L QNIM5G&p(G 'G 'G 5%Kլy|PPZ (G Q])JNЈtQ])JNЈoBitmapoBitmap eSBgchB GqiFE0IN p'G B A ?gŘrp'G hB 5 B%OKp'G 8C Muf2BޠQTp'G C  T?cCx%Kp'G 8C QnfM9M$ p'G `+C 9QbJF}~b{p'G +C TKAIzc(p'G `,C  b/IG p'G i> ЎeJf6Kp'G 8j> hdzCqIjAp'G j> oC~Oܝ3 p'G 5R 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 19QbJF}~b{-n,Njlpg????GqiFE0IN NORMALMAP5%Kլy|L QNIM5G&%%u5E b>g'JNjn*pFBHBb@u@?QnfM9M$  WrapQ])JNЈhdzCqIjA  b/IG 4W}@O{ЎeJf6K(XFҦV>g'JNjn*pFBHBb@u@?oC~Oܝ3 Muf2BޠQTAnisotropic5 B%OKAnisotropicA ?gŘrAnisotropicTKAIzc(-1OSM n 럆L<_ї,  T?cCx%K Wrap܂dKu=ܭI TextureShader|I .;]kI 忞@"P ,M xxJ "Z |I 4W}@O{$}I L QNIM5G&`!N %%u5E b-1OSM n#CM 5OD.GWf5xk (XFҦVLE2Data, 1#L QNIM5G&eSBgcp rC:\Development\Caligari\IconImages\mid-res_leaf_logo.jpgY*Da!;UoJFIFXXC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"K!1AQa"2Bq#6RtTbr$3CSUc45*1!"AQ2B3Raq# ?PjK=0 뀎SEi.M$ 4$hI4Bh@$&Bh@$&M$ I4i B Є@I4$BIhI4@$& !4hBHM=T<2M&3K=z+.m oc{i $Z _־TN"Ps1.jx_56n}}g6|SA.hI& !&hB!4 BB0OԀI)nG6z)gMB6z\ۻ`JEH: !4@ВhBI hBB@ nzA7YEU) V=s[n9FJ#vn-5}P9)jewHt=Dv =hpt+;pf/ut|۩ ,caj-?{"!T:.l<)a@G–0x@G–p- &&0<"8GDewgvyR^B 9Fݝ&ВHE+C_BNE0xe8mW}-R!B*4W{t/]ʮMe.WD6ZqýZkQ}^@*&o{@> = c~q2BHْ7zQ*Ny[˼٠cw6Q(`Ҹ7R4w'P6v7s{uױp\0A .TnjSe|':;ryPh!$ В~ 'tH>7|@/;3C/ګfrk)~^?7[zS!4)!$9z_u_X,wQhG+rs g`y/Dߢ+KKR!7'GߍkH扲7湧 W+aZj7maAhY-ө2\iX뭎]0}gz/rFɢ|r49i;*|WyN:ĕktEޜ SFyWeg1!4/LA$&HM M4 tI]<ίVԿjŬUxlV-oOIHВ !BcF܎=!ccwlȾ1#K\H{Z+fnF!+6OqQODSяC8tc $n 'O5!a6=9<(#aIRB8F$ #aI@G’0 #aI{lFިO;$ tA+ȅ?>FM%{Cܴۧǹf9-H]k3ܷ; f)X{:z›gÐ/Mlۄٚ[\(j%+ȷrKGMZ.p^m4 ss;t㐵T4Җqˎ83>Ps53X.eC7l{Ǵ9 !aiI|# ?.Ӻ8ݼw,ܞ*Mm0Ӥp7tF=OF! S6v<DZyՉ6M+_[I8dt.i W%۪oVҧu]dǶF59kA!bש3gԙ0ٜٛ۴OVW4~U[h**$'1`KjJ5MsRG*y'68Mf=`8wZ71Km<=['+&6Iv昌AkhjKlO[^h;رL shBTM@oܐ}o.\ۦOu_urUxlV-e5/ګfrK|J4IHM$B 64% 2p758wx(!BqqW HUghz =c\0B̯E8Ku_h|Y;?=ݪB e`:{QOLƑM'`wVC㱚$-&8Fhp aVY|MiWSbWPhte5=no|A\斸G+F:\*n6QN2A qK>$ogZ6w .h]nDۍ]Fz%VlX^O;2湮iuGZuU)el!3H+zkUn|d<NoJ+厎 vYS~szGq]Ɋ4p3uMfִskǢbMY(hzx%CO -B} 'tH>7|@/;3C/ګfrk)~^?7[zSI4BI4 $sF>TH n©78F.#aKClxX :5̬aS%5|*v<Raa8CSv0*0!8S gCۃXI )Z 7=)$#tm%^-7mԢ*(>g ɕAV\<{:SO{-~kW᧮W[!gs29{K^摂*?:~QF9>daSRnp,V-jѮ2+[Dp)# DRF0a,aS\#hwX!:rxJ8t2 V g"K}Wwzy,U[4̴|9cwpWdĔ4e*=>:"fj3,XG0yQD͚Z8 oq YΚFkK XFY# XF4ƆCpoK;% K## :pA 9ku pń;୽3WbQS8 yihu=N=MsN|CVL"FHVUwkFԱдW} >tzy'Z:s?(?G뻼@ar28*/cSlb^GֲkSI =0B߹ tI]M4 3mK鿜R_Wb(hBHB֗84 p^l;sސoHC&t<)aT$a# H@G–$a(6 SNyvNDr:7cRM xVl^4hn#_l, : :v[-[ b{[FKh,# R7&5~Q$蓮;{yACB].d<|5^'Q5{  ˪TS2X;F;de/D ;A/PΩIi{]a9t.?wOɂOP{~m )%wX'.H?dyFt`tQٰC+̟F_ySNkBH^i!rA鿆s#ni> ~g!ڗU9XԿj-=)P& &r.j>vvGv[",# (R0 ",#K(R0UR#hWjk=W^ y3%eμԯRg3k0MΏcwkJ墇y4jOpai"uO9=wU[L WD#ArK]jʺblۗg"M6=t^}ɪ\]ox͟>!\cl=sNA,u/x0\*9h$G,n-s\0A VGYc-cI>O&1{_]hw*Ǘ=fJÚA+Y$Ҝk f(*&{q,o?.x`d"{NAsI4W8q'Cjg c֫:^ rmH6Jk(&[OoQSc{ C B5>nCFgo__œ^s]zh&,# 6٭+i݉ax{{{=mn9;:ǴR&vܡngў>>$Y߹ٖ e=7F14 oxx&ZA /_j(yܱ Z{[=IK 펞ǽCWO[Cd*WK3MYݞ ~Y-vWIxh GQb*jn)3 ޵^]hXFB!at%ˬYɒ~7s⹹9%dv̩μlԯJf];`WAǷЩҜ~0 & ٰ wJ.+xe4wњY6;C>]T ue==nLѽџ+gSP>64|6Ur[hy= {sEJ+=FhI\\oܐ}o.\ۦOu_urUxlV)eu7ګfrk|JI GFh@l6lGr|W L͚X/gC,#p,# XK XF0at>]ffwz@UZ4ZF#v9F#dcr4yAl7Gpwcjϖ"#wҎ/wR_{ 8 -gTh=@O=xs:}W#.Q YS\uRo_zBh6'8F.$#r\(M;q_dac HvkLIk7~UGҷX'RK&7z'dkpZҤXҤm8[GUO8G?|{GTʸvIEz0i\*]\k^mޕLMl|}k頵:>yҸCޯrqуՊm0uK|~6zt- TҥnT@ '|i\x~{.J&l`R8zhx2>/L6H-Cg?xvu~UH{Ǵ9 =t&wNܥ&, Ѩa,)aWHR0\UӻfX^jvS@|ɘzGq\arg|%2\O#o*ӵ7;^s[V_.ˎ8?Xwq \ֽxSd6+aǜpQ_v 2 y ؾ!L_W877 iw/͆Wb<Sާ{4wOn zP>߬0<4v?\tU_]Ewh*X˩ ȅv`[\ɚ=5]ԭ.xmPv2Cfofˁ>\FۅލD/Grk=pÚpA*#CKDPKY߹ tI]M4 3mK鿜Zj_Wb(i!5#6ַ ',qaOaOaOaOaOlުYKWQA79tح[#*lع +cX*I<yڪIF|Uy\=C|4ձmQszUҕzlp7{QVRmwlN8Օa|3"xØBm(aoz@C[ik8?gXZ.Kh6m xFI)d:9Z|WJIz iRQS)5Cf3uʘDV<0GP:l1jOr,ߔl9A ^)kk>޿zc{ea}Zi 9igZ2kLibd>)XZdz9t;\|Ǜ?tDZfBWD>?CY:{Q!.i|ViXL)G#ᕲ2F湧ҳZNTi뉅}<0ˏHuаZMmMm.lknop}[M45SF!.kYU,9v\צu%nSg=c1F<ػ_r^N06G)&O]s]%fR;Bo*Եi|Rf<%r->LV+KŅ*,Oi!| /E+FVdrX=\Z&wÞwdy+sgue@O9 =mmn7`;50}Tdxzu-x6'˽U"5ئR>e[Fs|nG1-{I*8[(? ,{ݎzK[6w-a{u^C}sٝ Ä.'_-*jIsIezjnˮ2F1g޴+ܓs$pjG WO}Ƒ\wG$#]ArPT͵*gru"IN+!ZT$ {FI_4.F9s$2d#v架//|R\%ĒI'y'$]&nڒvXxY p)a@G–p)a@G–p)a@G–Җz*TSJa^ӂ];l {?# 5 !xկ'D3TX.u+8)גlQ]i2~.gxU TBɡF񖽧 cjQϵ4>'E3 8WMP }۱;G7;EzWXjܭ^;hXaK™i㮡md8 \#|2:9CpBܰ+xi 7d^2ȭxf&p4srq`Fxaiic\ 6E4>GbϺ;s_SkBɣ9u666V,c]EQY+%qe]1D+6HF\]{M-%Srok;Il6;uM7BWJkž:WF-= &` 0ˍ?#ҩrز8z|fucviؾU5i*,37xhlk幕w= ߬tkg/ w_*N4O_ Mw=1Ю{Ut HjrrC[Erk士f̱; :jCA첲 L2=SURTIOEa<# XF0XBxF O# @,# @$a<#ӺOeqqoQX,# 'i5^TQ=fa!})nT-w:m*M[j188uu%1p'sZz}V{156TTPǝvv[ ;+AI[f`kp?SY>Q[ oѽ{K^ӂ Tp4T47xa͠q{GOj/ٖE{1.\ i9-qr&hC.5 yFצuz L c+ XiC#v?m:?TU..Ï6~#~Q6.+yպ^;9kkVCRH&|Ȓp.c$mcZrZb ,⡏&29ueS-O%2g?x^ ABXW5TZgA4uh^4Vt.Ԏf+nH֎oWkPO\D.hQq?VQxkUPߩ`6@pNJajOkf,)+Dqp*8FAݵ4NJHÄ$;>嬝'xFK*|!# ]$$'a'qW9nu7>ل 2^6@zf2+b7#4O` bYQ8%HiX} F)k EA$ziGT6 Ph;|zljXQ+E8E=,gz{uUG[#k#||np M$O 9~KpfDWD=bl&}3K}3BeҜr}hwTno_Tڕ Fʎeo֊vp6Fz:ݥRF6Zvm-p qC9Ÿw:ZXG  -4y.cfD#|׶5{THs/MpzBh]M 6==&,Y|-sO˱ZU֨Q# HP GG救F'Nh%M㑧k@|)!# H@G 4 #aIЀ$ ":7qkrӂ 4ƼlQ^ ?[!Ax!s4ֲTOCg>tة^ϓɻM#I}a ҁݎ>**Un `xWS\iYSI3e4 nsX*1φW+K =teb-#;Fa+&kT5ů&{=^bG#ᑲF4Ҽ.;?%|^2fj\3HMׅTK;eã: szAPג7:7FZdqϪk-7 >nWH}Բtb͋G\i=roQGcUB,Nfrv KL N MkWK%e;^q79“x0K'R۟Q tIc`r4*aR0H,#R0a# XF0a_+lu\,iw>*ױj*+>؝!qMIPtRi  bW41BF5 [m %e{:NJk b[ _d-PC3'XQ{# F=*Ժ* ]l5\ {UiSK=CਉJÇ5-j5Ek-i08 l5FoiK '8` 윺'z{ViZfbvZpGk:l;&9]m{ec^5 ]k+fe6qF@p;z=Nv|2|# YEa.F},|֎'hW+eެLdyBa]S)3# XF0 #altZ.]nuc"k2;.x]=<Գ:|R4x ER~yM=LS7ldu+fZZ**"{Hzr%i GBBH5|FՒzQQhpT<8 jӫ$VWԲ9r7sHNw\_inW|QJrCzOfT1mm2=rVe5vKKa9s!8`q=*Bewh:c^#٬k Ucgw;>/=N?x-Ϭm]&?wR3V:(ԯj[{cܵ'Y#Ǵ+cnuᘫi~7J볕~E(^4uԴ.F1 -Q7=ikW*OLҮ!K(RX]BPa)a\V禵[wG:Z~ +N0? J_D-$okrX枢݉>f91ثKMv/wuiڮwQ=$CazfKbTUL+}ϒTEUiЯ*{3骢l?]X=Qh.ڞqGVM_6>JJ ku4f9Ǐ?%Q[Nb{ִIh xz[&3lҵoMkK6[IP0cGglTԹz*rE XFHBEfjz6Fa}igu-\5 {^=q\!SDaxp'8qoԭ+Ks>pa/c}̌lLK\25h.IяYMao׵51Gkk)xV9ʩ<|țiɶ{",# K(R0 Fj]Ec-u f׻iJO~.$Э,hB!@B $ЀhIiz>|[՚(*EYҷcl9kA!f:{(:{ # HU0p)a V\1yq8hˮfO'?JqxSa  ^)X˭xaqctޫFڶc<)ahՖ˶A S\T3:(njZ#phwOwjc X^|%Y㿧Nr)# j{Ԕta7Gj4M*h]$G–AWzye1O⑼Zh?S#s.sT|{p]!)('qo ȓMSZ)# v 6Iϳ4ǰ> O itSn׌> &p|pT eSji%1ޮu.K_Oj[2b 7Nvxx{Zr8 -w^<7n1tHT?-<: e=[[Go>+T[S߹{ҽėI$䔰wC+pwCi*Ѹ݇dv0`Ჷ-2hw5hКXX-V0A3;Fm6KK78+#szEzy#hVުyFno#5 ,g1V,AlkƸmݧ}mnJY S>QS)'1ykioV_=[4ˤ{i`z֖=9W*OLڮ M(ES#|qI#H=%sI=i#\ <0.#aK8Fp)!>r}fU8= Z||¡Gcٕv-ݴ]ݵ%8>|p3V*(׮ j[lQi=ZhZ;# / Cub`n7Wg+%_^ۥ=5-΢ I$v2qLJjIHM EZqilk ɡiij0v7w;=1Ńh_;͝ȀmCFQZrMGR/+4wD`8 XKYM@9cdxAT-eD1TA!{OX[%R^Yk7:Ū0V WWU[{=̌<&bIp^KHHM DЀHMЀHMC7wk]ᏂĴcKOvFI&BI$&HBh$!!@MmuXdw=aoQJl9*fW!xPY#~Q^Hߔn(R rHFc9)a@ER0 #aK)0-:mَWyTՐv;畽Z-b&wu*!B24^+uv۸.nc,{޴N۶cTv̇|V]l3lLx&wu*(qQ.6nڒT֌yv啮y=LnH=}SI-.6ݩ#o=x;[Ҷ/, 3;[ܵޕbI>ĝxջ-Sv*#O7 {fWJ^zyWuawـBGR0A 'po- eEզI\2!n8t, |Ӱ˃r9[>V[s38J n9UmvIvz bGϽSZJ n<n¶]mumW=5l#V&dڒ`ma#:U6jz ,yd8-==`_˜K}+ji@sG>kYV$9:ȶ74-K_:<.OQ^,Pa)a@E XFF ")a@G -\7{ynPyE,d=B4+Ԑ4!4 $BH@ NܙkMld~ ɖ %l>7[}dzڬ/S1f`V=wmekNU&KD0zK]*ZrR̋CI^;vXǸ^ɖd)}jgcz筟̖;}^ضŕ#mFu20|)4>7!2h%CW*yxp騠8/a υф000HxF pGHObk+uʠ>xר-f&rp%8BBeuhW:xaG^Z jZξf:P|޷kevhy1?swOrFzRyu];n8YUnkS~H;0Eqva]h=,# LXF0i[vd+Low>a 8piT*ڸY TѰk$ {oeWUGa0#588UH|8%q%I$䔰3J!HbVqœӗZW˔ʭ|MQ];gLpذUҷFz`Y-u\||Gjȶ-iZp(C4uX  aO ЀXF0XFlM]<8@gr,֨殼`wx Kٲ^Ƅ!HBHhBHVƪPH3H:7{X Rk<gZXoSQ۩j42cq$x+QqXߓ5OɪUh: 2i&<|TKY0M ;'w u u9Nf223z8*:ҏ< X7h{ǐAWbTۨXes>%gE9+.E'ɍߑ9Xj3rikX%YenU:ZKh#GLD;oXaK7M4Oa<#tXF –  GRxF xF O NdZc,2vˢdɍ҇sӖj2*$3ܾ.PǹsÛ5M[ʺ5RA|O-$tTkDcypC/.Ҹ,# C0XZχVR7x1vղa<)M9{GfAlbLo=ao1Hɢl9t~6}o=nڱV;3d8,=a[IZJr7a sdcG XBxF RX@,# @,# XK wVmP߃?ՑrmDsϴo*Zp΍qh! M$r>)Y$n-{s\88 :oE}UahT8xTftx> ;;w: rrvllU&n 0\/@r uwʿ8ts{ol~ E5'=޵-KҾ-Kw9췿-ɪ% ٢{GW4Jb{4&oR֋қZa8`af)3*hPuLs_%]0@ ,OMo \Ҧ֊1=ydѽiiTv2*x.5 avlK$oSU6S`yW:+Cx6`UQ4'c\4VTk=VIln=1at.ɥ{:#CFNXZ*0+'F|FV^f)q+ڝv&6G8~q[)YspFՑY߹Ka ٩[*QBIݓ S4О*K",YWFJk"ҙ4;h7F? {j{[Dp)a]:G ΍{Ii#alqoV 8{G :;2f A<҉`89V> k |=P(z*[c2lp.Xl)ėOIK k-KKDp)a]:G–p)a@G [j[[vӗvi4[=A&Ǿ3[\װ9kAq _)n&ǯ;5]ox$ӓO[RwImJ&a6 :S¤,# XF0a*Kwjv;ՑL:ոhhIj4I&i&B I/m lv }M1&[ݭj *`j"Ÿ+krnVwcTu)rr.HgV2[E%}||\ <$3KO 15O)Vuҋd,{0ZW5[BVbQvO-ܶ\bn6iKy~Jq䢺L%qZ^=> Zf˭*g F۹`UxmWQ;i[eRY.$>e_;${c)#.qvTs[jVHIu5R%Qv%͙LH=(ݹ{:=g/!cXk}W=~ԑjU {KOb*tڛ%opU&M\sZr t7Z)at料)1Vˁ=etxC0ix-gȸ7mmoxhxoYzkնl$ .>UxF^4VϱT]Pr9{,~)h,# G TLba|;-h+f൞OP7f}4Ez׷"&0[]5\*i|XĎ*~ rdiS0qin7,cxZj*5H8_$zNVVT:j)Ml_q0aL,#R0,#R0°:T `[&٧/hӗhy%Yw1ݚZ58׵46 〓V}/V38o+]kJt5{C摐GII# XF0a,}m537OOgSR&/!a;lܱr{[6I B@4! !MBI4 hIВhI2U~`Q]hproQqV={ہ(V8Q .w-vۅ։VK ӱ՜X\̒X|x(בXi*K(uS;K?"w*zլ`jc>*kٔWGKgCMO Cvf9U:ZQӏLN#Âmܷpm}4wmT~H[27<Ӑ/=UE#'u*lmvʏ9xk~zN:ﯻV\*泲p{ R#)aR$G–p)a@ER0,# XFߴ.l3*8?{ꦞM=DTBn{dc^1!w Whۈ<n6P18-/2PiOrZ8FCpr=ltw:*j?w8p;U2P<q!hZ*\/L2\JٍR)uX내MH;& iBQj{kǏy9KHCXcY_q\ܭGuE40Mlr:C-1q~Gn쎼ƻ6ǸFVmAz%<Ji]OQ܌GN4nWV긯QCT4nqvt)4̩P<6F գQ۬~}$Z $@doRR3΀Puc+.$$It%H#,6`G[)h^v&|S0*ibuSk;\nGUP)eMrǓ!= xϻaS+MyQ㘭pivGU e*[b(gx>b\ɁQO4'p[Hm_Ux櫢y>+ pzBMrAa4. ЀXHAd !^t̴#f.d;F&q/}RrV [~\I"#py=JR6 # SYg6;-oT*\$*\DF 軴4b'5ն/nf8r*x &ľ'f>77W4Yk[)k9&ayN5 kCZZb'8siZ&:+8KOviwx4>s\װ=kA R7y55&tҺ)qů>:; z_GQ'|}ouwuNJ>:>NN.B}z_GQ'|}ouwuNJ>:>NN.B}z_GQ'|}ouwuNJ>:;䏣SKPv޿rW $}[G]j>SNN#?T'ݿ}ouwGQ'|Z>^jOEm{p^X.zz=1ixF89tkqQhdd>*f r笾4j<]AZǶgi1=-\uu@ )<@q;t-]loq!4+UZ:Wz3NϰCج2Dʇ6A%GyĪ>wEQA]AK=YiHQEYی:sS^MxQ\lc+$ KpFzrrhAANx$d6 w+æm:bXd;R=.s$Ar{iO ÃxNW1[ᷓ3hB 4BH4kOYUJsOQ,GB& 6:fL++/MFUCtOғPxxe6` D#d,=]5P=DRx?- G˧©ZLsU`t=CrA0ix* \x+ذp-Z]IQM4'p,6Uc!>*En)r1͑psOBH0a)/lNݙ%oߘZ5*Grc'%|ji`TD#p)iY7!"psJ7-6{eKT:TP!vo-yANH&jTN Qڍ$mn!ϋz;!Z΍/UՊՊI%a`-ŭ`N?mZO8R,ը@uǯg5/VB9?V?Mz g~jB}c,^B9?A?V'>?5-Ók[?'$8Y_ArZ?Mz gZG 'ը?POGP~l֫d'>?5-Ój[?'48Y?ArZ?Mz gZG 'ר?POGP~l֫TCdh5j-Ól8Xͩ%:{t$ď{ZeuN&KR5ƍø,jPBjd$@5jΙζU{A &46)FI;vlmwvej)2BfejP&$!MIM$!!@ !4i!zwmA4;#YjmYy+GDⰉOq|6T176́/=dxeVɨ<0<0~m1[v>{U&4*OhS^@*OOˍk]1Q<8n?%Sk;9Tr7 kV;y')iԜAu+-F]L{1W|WU;{C{ܥ{mo+󠩍 tw)G޴Jg'JNjn*pFC\Bb@X@?5OD.GWf54W}@O{(XFҦV>g'JNjn*pFCtBb@ `@?.;]kI 忞@-1OSM n 럆L<_ї, /|V FK|$J ShaderInput?ڵfA'7(%dLrQn0piDM7^@A툷 p1M@o=xwJ }E[2CV)`MOWIB"ѥHtO{/( qQ@RjҥY@e&B_;OKFJ*rHRSEpFC~__um1CR¬5ٻzEuSSaI7֏bP 4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 1y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYP%%u5E b>g'JNjn*pFCC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yI(XFҦV>g'JNjn*pF:DLCb@t@?#h"mO('ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloat"YMڿ$ZߦDJ ShaderColorG 5OD.GWf5PCM (G C/-~CxrEpG ,M 4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFDB`@P@?5OD.GWf54W}@O{(XFҦV>g'JNjn*pFDBb@@T@?C/-~CxrE-1OSM n 럆L<_ї, L{0nBg)`! t8L "Color texture, 1P)\Fvq3J  1frHsOP5pwJ xwJ PR3HBPpwJ wJ z(J.ĎP(G xxJ 4W}@O{%%%u5E b-1OSM n#(XFҦVLE2Data, 1%%u5E b>g'JNjn*pFCB`@T@?z(J.Ď4W}@O{(XFҦV>g'JNjn*pFCBb@@T@?P)\Fvq3wk0.DX?_К~k,J6 PR3HBP 1frHsOP5-1OSM n 럆L<_ї, nEL InputBitmap`!N L QNIM5G&p`"N !N !N 5%Kլy|PJ `"N Q])JNЈpq GqiFE0IN p!N Hq A ?gŘrp!N q 5 B%OKp!N hk Muf2BޠQTp!N k  T?cCx%Kp!N hk QnfM9M$ p!N +r 9QbJF}~b{p!N ,r TKAIzc(p!N ,r  b/IG p!N r ЎeJf6Kp!N `r hdzCqIjAp!N r oC~Oܝ3 p!N "Z 4W}@O{$%%u5E b-1OSM n#(XFҦVLE2Data, 19QbJF}~b{-n,Njlpg????GqiFE0IN DIFFUSEMAP5%Kլy|L QNIM5G&%%u5E b>g'JNjn*pFB`Bb@u@?QnfM9M$  WrapQ])JNЈhdzCqIjA  b/IG 4W}@O{ЎeJf6K(XFҦV>g'JNjn*pFB`Bb@t@?oC~Oܝ3 Muf2BޠQTAnisotropic5 B%OKAnisotropicA ?gŘrAnisotropicTKAIzc(-1OSM n 럆L<_ї,  T?cCx%K Wrap܂dKu=M doom3jointgeo [ .;]kI 忞@"9 l G VN 4W}@O{$ G?ŋ G?ŋ tSObjLtrueSpace object synchronization data x X^] 7N 偢jD%~`8偢jD%~`8BObjMatrix Object's matrix `^02eE{|@Z8N WAGWAGOwnerMatrixOwner's matrix `^02eE{|@q (G <ĠF姁J]<ĠF姁J]DMatrix,Object's input matrix `^02eE{|@\H G -V?XM%-V?XM%Material ListMaterial List +N⩊Q (XFҦV"-V?XM%偢jD%~`8(XFҦV>g'JNjn*pFBCb@ b@?׊;Jf|ڢWAG`^02eE{|@B???? G?ŋl罸[Hq2>$?>^?>$"?>#!??UnitObRQOLayOLayeMat1Z)pa ?fff?ShBxZZplaincolourW5f@(䐈9 9 4W}@O{$VIQGіF͡T>W5f@(䐈ɬٸ*ćIC7lq2l=>l=[H=q2> h* 6H?BJ8{EE%D7[LjUb)R ʽt Aqry'HNű_,lLo '89Ig"$?&?^?{?$"??#!??ZpߘHXO YW?Yx>YW?Yx>YW?Yx>B[x?cnB[x>B[x?cnB[x>B[x?cnB[x>YWYx>YWYx>YWYx>qwB  Solid XJ; .F_P#T.F_P#Material Output material __W8E#(8: J; n%⟀A}aJtn%⟀A}aJDiffuseColorDiffuseColor -n,NjlpgXJ; XK; >]zJ4 t>]zJ4 (VertexColorStrength(VertexColorStrengthXJ; WQ J.HE /*gtJ.HE /*gShininessShininessXJ; 0XQ 8VnZN:W pt8VnZN:W p DiffuseStrength DiffuseStrengthXJ; XQ ll-#Ez k^tll-#Ez k^"SpecularStrength"SpecularStrengthXJ; [J 4W}@O{$x\J K#uiL$tK#uiL$AlphaTestAlphaTest :KrbSxXJ; \J ,L?D}t,L?D}AlphaTestValueAlphaTestValueXJ; J.HE /*g@@>]zJ4 n%⟀A}aJ-n,NjlpgLt'޽lL]>L NameShader name2} 3} 4W}@O{$X !agNc +At!agNc +Acolour0colour : Shader - Color -n,Njlpg2} {[f(@-L*;'޽lL]>L plain!agNc +A-n,NjlpgLpPZ QZ 4W}@O{$`^N oF5SO/toF5SO/ambient factor@ambient factor : Shader - ModelPZ ^N {a>% AGJXs>{t{a>% AGJXs>{diffuse factor@diffuse factor : Shader - ModelPZ `_N f`e'O@tf`e'O@ specular factorBspecular factor : Shader - ModelPZ h J A퉠C i 8tA퉠C i 8exponent4exponent : Shader - ModelPZ J Kj=N1RtKj=N1R specular colourBspecular colour : Shader - Model -n,NjlpgPZ oF5SO/f`e'O@='޽lL]>L phongA퉠C i 8@@Kj=N1R-n,Njlpg????r鷅wOq=0{a>% AGJXs>{fff? 7G5f%: 2PureLWDisplacementShader&: I˕XMӍJS9TI˕XMӍJS9,LWDisplacement_shader2Pure Displacement shader yᮍGM޴"0G h: '޽lL]>Lp&: : 4W}@O{$'޽lL]>LI˕XMӍJS9 EvmE|Kc\9 2PureLWTransparencyShader9 fO*EI,STfO*EI,S,LWTransparency_shader2Pure Transparency shader yᮍGM޴"sQ X9 '޽lL]>Lp9 P9 4W}@O{$fO*EI,S'޽lL]>L47m2O <9 doomTransform0| <ĠF姁J]pDk pk | WAGppk k 偢jD%~`8pBpk ׊;Jf|ڢpBk 4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pF D Bb@@T@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї, HFh-F׵Ԃ(Z  Joint%.;]kI 忞@"8uV 4W}@O{$uV ݫK^BUtݫK^BU Joint"Joint parameters jh/L/VVXG rcAۏOtrcAۏOTag(Joint semantics taguV YG d'kJ^U*td'kJ^U*Symmetry2Joint semantics symmetry :KrbSxuV O ,LJO ,LJ Bone4Parent bone for the joint DZ5 O*\-1OSM n"0> -5bACuۚt-5bACuۚ Size$Joint size factoruV > WAGp${N 9 Y `CG%S;>tY `CG%S;>AngSprZ*Z angle limit spreaduV 9 .*ÿ@;ft.*ÿ@;fAngCntX*X angle limit centeruV 9 ׾JBoͰwt׾JBoͰwAngCntY*Y angle limit centeruV 3L gIR"q3tgIR"q3AngCntZ*Z angle limit centeruV 3L xf?Iq -txf?Iq -AngSprX*X angle limit spreaduV 4L @:WvZD,t@:WvZD,AngSprY*Y angle limit spreaduV G }ITBKt}ITBKAngStiX$X angle stiffnessuV `G r<|ݔK .ǻKtr<|ݔK .ǻKAngStiY$Y angle stiffnessuV G te6N'tte6N'AngStiZ$Z angle stiffnessuV M BI zztBI zzAngDamX X angle dampinguV M '7=B;;t'7=B;;AngDamY Y angle dampinguV M /6zsMf6 t/6zsMf6 AngDamZ Z angle dampinguV p 6[v!Dt6[v!DMovMinX2X movement limit minimumuV  @N1vxt @N1vxMovMinY2Y movement limit minimumuV v ﶌWMS'tﶌWMS'MovMinZ2Z movement limit minimumuV v avE/b+ tavE/b+ MovMaxX2X movement limit maximumuV v u'eDgutu'eDguMovMaxY2Y movement limit maximumuV v R<&d@ d|tR<&d@ d|MovMaxZ2Z movement limit maximumuV xv !lMp[msdt!lMp[msdMovStiX*X movement stiffnessuV v ~Nc>I=ܯt~Nc>I=ܯMovStiY*Y movement stiffnessuV mu гh@jtгh@jMovStiZ*Z movement stiffnessuV Xnu bb Bu4Ǫ/tbb Bu4Ǫ/MovDamX&X movement dampinguV nu g^0A p Ytg^0A p YMovDamY&Y movement dampinguV `OR (roACp"G,1t(roACp"G,1MovDamZ&Z movement dampinguV 0_BEP1@0_BEP1@"SklMatrix@Skeleton space transform matrix `^02eE{|@"<ĠF姁J]D{N ׊;Jf|ڢPBX^] (XFҦV"#bb Bu4Ǫ/? @N1vxg^0A p Y?6[v!DrcAۏO'7=B;;?gIR"q3.*ÿ@;fO ,LJavE/b+ (XFҦV>g'JNjn*pFMD9Cb@@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?xf?Iq -4CWAG`^02eE{|@B????-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B????~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_ї  . GFʠN=00@(}} ?MinZ`Ez]UO GFʠN=@0P(}} ?MaxZ`Ez]UO GFʠN=`0p.}} ? StiffnessZ`Ez]UO GFʠN= 00-}} ?PositionZ`Ez]UO GFʠN=P0`,}} ?DampingZ`Ez]UO GFʠN=@= }} ?Limb tagrcAۏOZ`Ez]UO1釥GP>a@,rcAۏOZ`Ez]UO GFʠN=@ 5 }} ?d'kJ^U*Z`Ez]UO GFʠN= 5 }} ?-5bACuۚZ`Ez]UO1釥GP>a ,-5bACuۚZ`Ez]UO GFʠN=p0-}} ?RotationZ`Ez]UO GFʠN=0 h0&}} ?XZ`Ez]UO GFʠN=h 0&}} ?YZ`Ez]UO GFʠN= 0&}} ?ZZ`Ez]UO GFʠN=0ph&}} ?XZ`Ez]UO GFʠN=hp&}} ?YZ`Ez]UO GFʠN=p&}} ?ZZ`Ez]UO GFʠN=0+}} ?CenterZ`Ez]UO GFʠN=0+}} ?SpreadZ`Ez]UO GFʠN=0,}} ?DampingZ`Ez]UO GFʠN=0.}} ? StiffnessZ`Ez]UO1釥GP>a00h@,6[v!DZ`Ez]UO1釥GP>ah0@, @N1vxZ`Ez]UO1釥GP>a0@,ﶌWMS'Z`Ez]UO1釥GP>a0@hP,avE/b+ Z`Ez]UO1釥GP>ah@P,u'eDguZ`Ez]UO1釥GP>a@P,R<&d@ d|Z`Ez]UO1釥GP>a0Ph`,bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`,g^0A p YZ`Ez]UO1釥GP>aP`,(roACp"G,1Z`Ez]UO1釥GP>a0`hp,!lMp[msdZ`Ez]UO1釥GP>ah`p,~Nc>I=ܯZ`Ez]UO1釥GP>a`p,гh@jZ`Ez]UO1釥GP>a0h,.*ÿ@;fZ`Ez]UO1釥GP>ah,׾JBoͰwZ`Ez]UO1釥GP>a,gIR"q3Z`Ez]UO1釥GP>a0h,xf?Iq -Z`Ez]UO1釥GP>ah,@:WvZD,Z`Ez]UO1釥GP>a,Y `CG%S;>Z`Ez]UO1釥GP>a0h,BI zzZ`Ez]UO1釥GP>ah,'7=B;;Z`Ez]UO1釥GP>a,/6zsMf6 Z`Ez]UO1釥GP>a0h,}ITBKZ`Ez]UO1釥GP>ah,r<|ݔK .ǻKZ`Ez]UO1釥GP>a,te6N'Z`Ez]UOnevG4'@ P H+d'kJ^U*right leftZ`Ez]UOR<&d@ d|i@ﶌWMS'i@/6zsMf6 ?ݫK^BUгh@j?u'eDgur<|ݔK .ǻK? ZoUF_KACGUܩHOR  Bone .;]kI 忞@"&z 4W}@O{$.(ѻD3Ϳ.(ѻD3Ϳ RootHRoot joint. Attach to parent joint. jh/L/VV'z g!Jtg!J Bone Bone parameters DZ5 O*\@u IbEM K1gtIbEM K1g MassBone mass'z u }\L 5t}\L 5Virtual$Make bone virtual 'z @u =}(siHa^t=}(siHa^Envelope skinNEnable envelope skinning for this bone 'z XCv "Ydg'JNjn*pF@D CX@1@?IbEM K1g?׊;Jf|ڢ`^02eE{|@B??o:?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?ۻJfHkG/.(ѻD3Ϳ"Yd Skeleton8P> .;]kI 忞@"oQ s (J 3v z 9 `H P> 4W}@O{$(XFҦV"-1OSM n"x6> ׊;Jf|ڢZc> R X^] hH< 偢jD%~`8ZH< <ĠF姁J]\(9 hI< WAGMR  G?ŋJ9 tveDCE`"IWJZE hJ X^] 8K9 S $hKnPSVmS $hKnPSVm"RenderAttributes"RenderAttributes HEoq5vȨJ M d_@ cB8Ed_@ cB8ESkeleton*Skeleton data object [}Nj2M  2"IM6 Ex>"IM6 ExRot color(Rotation lock color -n,NjlpgH ƒsF2ƒsF2Dynamic LocksLSet of active locks for dynamic tools u|H '$Xk (IДl/(IДl/Show locksShow IK locks PP @Yk 'a#G @=^V("'a#G @=^V("Show handlesShow handles P Yk w`ZL. 5w`ZL. 5Show structure>Show skeleton joints and bones PP >"IM6 Ex-n,Njlpg%?>h>? 6Jѳ( S $hKnPSVmw`ZL. 5 'a#G @=^V(" 偢jD%~`8m6EfH-n,Njlpg???~?JmCb4IP}K^:KrbSxSolid defaultSolid diamondWire diamondWire thinSolid defaultd_@ cB8E(XFҦV>g'JNjn*pFDCk@ a@5CC?n1LH_r-n,Njlpg!? ?>~? 2>'??WAG`^02eE{|@B????(IДl/  G?ŋfdN*5Ւh , H7v[IL'KIZ`Ez]UOͽ>fdN*5Ւh 0, H7(IДl/Z`Ez]UO GFʠN= p05 }}?(IДl/Z`Ez]UOͽ>fdN*5Ւhp 0, H7'a#G @=^V("Z`Ez]UO GFʠN= 05 }}?'a#G @=^V("Z`Ez]UO GFʠN= 2}}? Show SkeletonZ`Ez]UOͽ>fdN*5Ւhp , H7w`ZL. 5Z`Ez]UOͽ>fdN*5Ւh8H, H7 6Jѳ(Z`Ez]UO GFʠN=8HX }}?#Use Character Editor color settings 6Jѳ(Z`Ez]UO B>IHHpX%\VVn1LH_rZ`Ez]UO GFʠN=HHX5 }}?n1LH_rZ`Ez]UO B>IHX%\VVm6EfHZ`Ez]UO GFʠN=pHX5 }}?m6EfHZ`Ez]UO B>IHXph%\VVq\7LO#Z`Ez]UO GFʠN=XHhB }}? Position lockq\7LO#Z`Ez]UO GFʠN=hHxB }}? Rotation lock>"IM6 ExZ`Ez]UO B>IHhpx%\VV>"IM6 ExZ`Ez]UO GFʠN=pXh> }}? Full lock졉E/~ݾZ`Ez]UO B>IXh%\VV졉E/~ݾñZ`Ez]UO GFʠN=phx%}}?Z`Ez]UO GFʠN=08%}}?Z`Ez]UOv[IL'KI q\7LO#-n,Njlpg>"?I??dQ R 47m2O 49 Transform(9 <ĠF姁J]pDMR NR MR WAGpNR MR 偢jD%~`8PBhH< NR ׊;Jf|ڢPBx6> XN oQ 4W}@O{$(XFҦV"-1OSM n"偢jD%~`8(XFҦV>g'JNjn*pFX@1@?׊;Jf|ڢWAG<ĠF姁J]-1OSM n 럆L<_ї, qU F3fkk 2Object Render Attributes0lk S $hKnPSVmP8K9 lk 8Ns2]t8Ns2] Surface Opacity Surface Opacity0lk pt ^mګA~Ksi[t^mګA~Ksi[Points opacityPoints opacity0lk t (lrsGrt(lrsGrPoints Size>Point Size in Point rendering.0lk pt \Eh{5t\Eh{5Points ColorLColor of points during the rendering. -n,Njlpg0lk Wr "PbEGDߗrt"PbEGDߗr0Ignore mesh point color0Ignore mesh point color 0lk 0Xr F?N dtF?N d.Ignore mesh point size.Ignore mesh point size 0lk Xr ]*qBCxt]*qBCxEdges opacityEdges opacity0lk PL: \J:I%7ut\J:I%7uEdges ColorEdges Color -n,Njlpg0lk L: iA޲1rIK>XtiA޲1rIK>X0Ignore mesh edges color0Ignore mesh edges color 0lk PM: ,ot"AaYt,ot"AaY$Show hidden lines`Do not use ZBuffer in point and wireframe modes 0lk s ^RI8ÿRt^RI8ÿRShow backfaceslEnable two-sided rendering when Color mode is enabled 0lk hs çwH5#VtçwH5#V0Ignore layer attributesvDo not combine render attributes with layer defined values 0lk s 4W}@O{%J@#QL-1OSM n#(XFҦV"W0@zdW0@zd%VersionVersion%ot ȅ8vDCxZtȅ8vDCxZInvisibleInvisible flag 0lk Xpt F+2MGtF+2MGCast shadows$Cast shadows flag 0lk t I2GWM:).$tI2GWM:).$ Receive shadows Receive shadows 0lk 0t mBޖw ptmBޖw pLayer index(Modeler layer index0lk t o[nfFto[nfF Overlay opacity Overlay opacity0lk #t zgGFohN)tzgGFohN)Overlay ColorOverlay Color. -n,Njlpg0lk #t vhD zʔtvhD zʔ4Ignore mesh overlay color6Ignore mesh overlay color. 0lk $t fB #^tfB #^$Transparency Mode@Quality of transparency solving :KrbSx0lk n |$}mK;)t|$}mK;) OverlayEnable*Enable color overlay  0lk 0n rg@*oHtrg@*oH OverlayColor*Color of the overlay -n,Njlpg 0lk n !eLZE^Nt!eLZE^N OverlayStrengthJStrength (visibility) of the overlay 0lk zgGFohN)I2GWM:).$ vhD zʔ]*qBCx?S $hKnPSVmrg@*oHçwH5#V 4W}@O{fB #^:KrbSxv No Hidden FacesNo SortTriangle SortNo Sort\J:I%7u-n,Njlpg?\Eh{5-n,Njlpg?(XFҦV>g'JNjn*pF X@>@?F?N d ȅ8vDCxZ 8Ns2]?F+2MG "PbEGDߗr J@#QL>g'JNjn*pFCBb@ h@?(lrsGr?^mګA~Ksi[o[nfFW0@zdmBޖw p-1OSM n 럆L<_ї   DefaultAdvanced GFʠN=0(@: }}?Color\J:I%7uZ`Ez]UO B>I(0h@%\VV\J:I%7uZ`Ez]UO GFʠN=@(P< }}?Opacity]*qBCxZ`Ez]UON\q+nN-K^(@hPA}}?]*qBCxZ`Ez]UOY@ GFʠN=h@PD }}?Enable Obj ModeçwH5#VZ`Ez]UOͽ>fdN*5Ւh@P( çwH5#VZ`Ez]UO GFʠN=h : }}?Color\Eh{5Z`Ez]UO B>I %\VV\Eh{5Z`Ez]UO GFʠN=h 0< }}?Opacity^mګA~Ksi[Z`Ez]UON\q+nN-K^ 0A}}?^mګA~Ksi[Z`Ez]UOY@ GFʠN=h0@9 }}?Size(lrsGrZ`Ez]UON\q+nN-K^0@A}}?$@(lrsGrZ`Ez]UOY@ GFʠN=( < }}?Opacity8Ns2]Z`Ez]UON\q+nN-K^(h A}}?8Ns2]Z`Ez]UOY@ GFʠN=h,}}?SurfaceZ`Ez]UO GFʠN= h0*}}?EdgesZ`Ez]UO GFʠN=h+}}?PointsZ`Ez]UO GFʠN=Ph`5 }}?fB #^Z`Ez]UOnevG4'hP`̎ `$ fB #^VNo hidden faces No solving Triangle sortZ`Ez]UO GFʠN=5 }}?^RI8ÿRZ`Ez]UOͽ>fdN*5Ւh, in^RI8ÿRϱZ`Ez]UO GFʠN= 5 }}?,ot"AaYZ`Ez]UOͽ>fdN*5Ւh , in,ot"AaYZ`Ez]UO GFʠN= 05 }}?ȅ8vDCxZZ`Ez]UOͽ>fdN*5Ւh 0, inȅ8vDCxZZ`Ez]UO GFʠN=0@5 }}?F+2MGZ`Ez]UOͽ>fdN*5Ւh0@, inF+2MGZ`Ez]UO GFʠN=@P5 }}?I2GWM:).$Z`Ez]UOͽ>fdN*5Ւh@P, inI2GWM:).$Z`Ez]UO GFʠN=P`5 }}?mBޖw pZ`Ez]UO1釥GP>aP`,mBޖw pZ`Ez]UO,ot"AaY !eLZE^N|$}mK;)^RI8ÿR iA޲1rIK>X qNoJi:dQ Skeleton root xO BL=ew!4tBL=ew!4TagSkeleton tagXN ؎N O .0F $1LӤt.0F $1LӤSymmetry$Skeleton symmetry XN ؎N 0_BEP1@"XN WAGpG ׊;Jf|ڢBXN ݫK^BUPH ؎N d_@ cB8EPM J <ĠF姁J]D(J 4W}@O{$(XFҦV"-1OSM n"G BUJztBUJz"SkelParSpc,Skeleton parent space `^02eE{|@" d_@ cB8E(XFҦV>g'JNjn*pFX@1@?BL=ew!4׊;Jf|ڢ`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=@?0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?WAG.0F $1LӤ <ĠF姁J]`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?-1OSM n 럆L<_ї    GFʠN=C }}Root transform<ĠF姁J]Z`Ez]UO GFʠN= G }}Skeleton transformWAGZ`Ez]UO GFʠN= 05 }}.0F $1LӤZ`Ez]UOͽ>fdN*5Ւh 0, in.0F $1LӤZ`Ez]UO GFʠN=0F@5 }}BL=ew!4Z`Ez]UO1釥GP>aF0@,BL=ew!4Z`Ez]UO GFʠN=@P> }} Root boneݫK^BUZ`Ez]UO GFʠN=P`5 }}d_@ cB8EZ`Ez]UO GFʠN=`p5 }}׊;Jf|ڢZ`Ez]UOBUJzݫK^BU܂dKu=ܛv $Skeleton materialX3v .;]kI 忞@"hn V K BI u s R 3v 4W}@O{$X4v .F_P#.F_P#Material Output material __W8E#(H U@Ra.՞'fA5-_՞'fA5-_D3DEYED3DEYE =xNT{-1OSM n"(XFҦVLE2Data, 1"J@#QLLE2Data, 24W}@O{(XFҦV>g'JNjn*pF@X@>@BA?՞'fA5-_.F_P#J@#QL>g'JNjn*pF4CtCd@@@?.;]kI 忞@-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFjCCd@T@?Pc|B;]2$o Materialo .F_P#T.F_P#Material Output material __W8E#(X4v o S^M~b po h n 5OD.GWf5po n qΤIGGIpo hn ,S@vTVpo n зVJilpo hn 4W}@O{$U@Ra.-1OSM n"(XFҦVLE2Data, 1"ح kF_`VertexShadero X t@*Ntt@*N Constant_shader Constant shader QVO Pk@o خ <;vHwpo X  0S̤@+Rpo ,S@vTV 0S̤@+R #<5OD.GWf54W}@O{зVJil(XFҦV>g'JNjn*pFDCX@@@?<;vHw:KrbSxdDisabledEnabledAs OpaqueAs OpaqueS^M~b .F_P#t@*NkF_-1OSM n 럆L<_ї, U@Ra.>g'JNjn*pFDnC`@\@?qΤIGGI/|V FK|"I ShaderInput?ڵfA'7(; %dLrQn0Pq piDM7^@A툷p1M@o=U\ }E[2CV): 8V\ `MOWIB"ѥq HtO{/(8W\  qQ@RjR XgZ ҥY@e&q B_;OKFJ*rXhZ HRSEpFCu ~__um1CR¬5ٻzEuSSaI7֏bV 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"y"WMB])5FYPx*yI#h"mO('B_;OKFJ*rڳVܯ]FՃ尲+%tsxi_GetInputLightDistRtFloat qQ@RjڳVܯ]FՃ尲'!tsxi_GetInputAlphaRtFloatp1M@o=ڳVܯ]FՃ尲,&tsxi_GetInputTexCoordsRtFloat3^@A툷ڳVܯ]FՃ尲+%tsxi_GetInputPositionRtFloat4)5FYPڳVܯ]FՃ尲1+tsxi_GetInputObjectToClip RtFloat4x4%%u5E b>g'JNjn*pFC`@0@?HRSEpFCڳVܯ]FՃ尲-'tsxi_GetInputLightColorRtFloat4ٻzEuSڳVܯ]FՃ尲2,tsxi_GetInputWorldToObject RtFloat4x44W}@O{SaI7֏bڳVܯ]FՃ尲2,tsxi_GetInputObjectToWorld RtFloat4x4~__um1CR¬5ڳVܯ]FՃ尲3-tsxi_GetInputTangentToWorld RtFloat3x3x*yIڳVܯ]FՃ尲0*tsxi_GetInputWorldToClip RtFloat4x4(XFҦV>g'JNjn*pFCAX@1@?#h"mO('ڳVܯ]FՃ尲-'tsxi_GetInputTexCoords2RtFloat3ҥY@e&ڳVܯ]FՃ尲+%tsxi_GetInputLightDirRtFloat3`MOWIB"ѥڳVܯ]FՃ尲)#tsxi_GetInputNormalRtFloat3?ڵfA'7(ڳVܯ]FՃ尲)#tsxi_GetInputEyePosRtFloat4%dLrQn0ڳVܯ]FՃ尲)#tsxi_GetInputEyeDirRtFloat3y"WMB]ڳVܯ]FՃ尲93!tsxi_GetInputObjectToWorld_Normal RtFloat3x3}E[2CV)ڳVܯ]FՃ尲("tsxi_GetInputColorRtFloat4-1OSM n 럆L<_ї, HtO{/(ڳVܯ]FՃ尲*$tsxi_GetInputTangentRtFloat3piDM7ڳVܯ]FՃ尲)#tsxi_GetInputEyeDistRtFloatz€ L& D=Z InputFloatЖL +kCY5]BtOpЗL PL PL uM@n;LAPPq ЗL \/3Kf͈,p(K GqiFE0IN pPL K 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SHININESS%%u5E b>g'JNjn*pFPb@X@?4W}@O{+kCY5]BtOA(XFҦV>g'JNjn*pFCCX@1@?uM@n;LA\/3Kf͈,?-1OSM n 럆L<_ї, ]IDjdcI InputColorI "uI̎4)]pAI HAI HAI \PtIL;I1P: AI q\W D ɭpHBI GqiFE0IN pHAI BI 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"GqiFE0IN SPECULARCOLOR\PtIL;I1"uI̎4)]-n,Njlpg>>>?%%u5E b>g'JNjn*pFX@@b@X@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?q\W D ɭ-1OSM n 럆L<_ї, L{0nBg)`! |: Phong Lighting P)\Fvq3: :6~KAMpXu : R]JĀ7pXu Pq vJ ~~pXu q $&*2HӁdńpXu Pq Z[G {/,pXu q  zE%SfpXu u w!XCLpXu Xu  B#A)[(dP0k u 4W}@O{%%%u5E b-1OSM n"(XFҦVLE2Data, 1" %%u5E b>g'JNjn*pFCLb@d@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?Z[G {/,:6~KAM B#A)[(dP)\Fvq3wk0.DX?_|X?dK;,w!XCL$&*2HӁdńvJ ~~-1OSM n 럆L<_ї,  zE%SfR]JĀ7fC{ok ShaderModelk qΤIGGIP n 0k C/-~CxrEpk s 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pF DA`@P@?4W}@O{(XFҦV>g'JNjn*pFCCX@1@?C/-~CxrE-1OSM n 럆L<_ї, qΤIGGIWG.3;WxT ShaderAlphaR S^M~b Po R ;MF~Bt;MF~B Alpha$Input alpha brick F 1+5?N>/R R 4W}@O{$%%u5E b-1OSM n"(XFҦVLE2Data, 1"%%u5E b>g'JNjn*pFLD`B`@P@?4W}@O{(XFҦV>g'JNjn*pFCAX@1@?S^M~b ;MF~B-1OSM n 럆L<_ї, MYMJJ>zV$ L "Skeleton displayJ :D x&t:D x&SkeletonSkeleton [}Nj2z hJ v[IL'KIpz J  6Jѳ(pz z hJ JmCb4IP}K^pz z H n1LH_rpz z H m6EfHpz z H q\7LO#pz z H >"IM6 Expz z P 졉E/~ݾpz z PP (IДl/pz P 'a#G @=^V("pz PP w`ZL. 5pz z tveDCE`"IWJPBJ9 z  2"IM6 Ex 6Jѳ( w`ZL. 5 'a#G @=^V(" m6EfHJmCb4IP}K^(XFҦV>g'JNjn*pFX@>@? 2p`9 К] .*ÿ@;fp`9 P] ׾JBoͰwp`9 Л] gIR"q3p`9 xK xf?Iq -p`9 K @:WvZD,p`9 xK }ITBKp`9 K r<|ݔK .ǻKp`9 Z te6N'p`9 (Z BI zzp`9 Z '7=B;;p`9 (Z /6zsMf6 p`9 n 6[v!Dp`9 8n  @N1vxp`9 n ﶌWMS'p`9 0V avE/b+ p`9 V u'eDgup`9 0V R<&d@ d|p`9 V !lMp[msdp`9 0X< ~Nc>I=ܯp`9 X< гh@jp`9 0Y< bb Bu4Ǫ/p`9 Y< g^0A p Yp`9 Pw< (roACp"G,1p`9 0_BEP1@"<ĠF姁J]DHg ׊;Jf|ڢpB(XFҦV"#bb Bu4Ǫ/? @N1vxg^0A p Y?6[v!DrcAۏO'7=B;;?gIR"q3.*ÿ@;fO ,LJavE/b+ (XFҦV>g'JNjn*pF Db@@?@:WvZD,4C׾JBoͰwd'kJ^U*:KrbSx8 right left right׊;Jf|ڢ(roACp"G,1?BI zz?Y `CG%S;>4C0_BEP1@`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=4d?xf?Iq -4CWAG`^02eE{|@Bt?'݉3<?/9p뒼J/p6t?-=@?-5bACuۚ>te6N'?}ITBK?<ĠF姁J]`^02eE{|@B????~Nc>I=ܯ?!lMp[msd?-1OSM n 럆L<_ї  . GFʠN=00@(}}1j?MinZ`Ez]UO GFʠN=@0P(}}1j?MaxZ`Ez]UO GFʠN=`0p.}}1j? StiffnessZ`Ez]UO GFʠN= 00-}}1j?PositionZ`Ez]UO GFʠN=P0`,}}1j?DampingZ`Ez]UO GFʠN=@= }}1j?Limb tagrcAۏOZ`Ez]UO1釥GP>a@,rcAۏOZ`Ez]UO GFʠN=@ 5 }}1j?d'kJ^U*Z`Ez]UO GFʠN= 5 }}1j?-5bACuۚZ`Ez]UO1釥GP>a ,-5bACuۚZ`Ez]UO GFʠN=p0-}}1j?RotationZ`Ez]UO GFʠN=0 h0&}}1j?XZ`Ez]UO GFʠN=h 0&}}1j?YZ`Ez]UO GFʠN= 0&}}1j?ZZ`Ez]UO GFʠN=0ph&}}1j?XZ`Ez]UO GFʠN=hp&}}1j?YZ`Ez]UO GFʠN=p&}}1j?ZZ`Ez]UO GFʠN=0+}}1j?CenterZ`Ez]UO GFʠN=0+}}1j?SpreadZ`Ez]UO GFʠN=0,}}1j?DampingZ`Ez]UO GFʠN=0.}}1j? StiffnessZ`Ez]UO1釥GP>a00h@,6[v!DZ`Ez]UO1釥GP>ah0@, @N1vxZ`Ez]UO1釥GP>a0@,ﶌWMS'Z`Ez]UO1釥GP>a0@hP,avE/b+ Z`Ez]UO1釥GP>ah@P,u'eDguZ`Ez]UO1釥GP>a@P,R<&d@ d|Z`Ez]UO1釥GP>a0Ph`,bb Bu4Ǫ/Z`Ez]UO1釥GP>ahP`,g^0A p YZ`Ez]UO1釥GP>aP`,(roACp"G,1Z`Ez]UO1釥GP>a0`hp,!lMp[msdZ`Ez]UO1釥GP>ah`p,~Nc>I=ܯZ`Ez]UO1釥GP>a`p,гh@jZ`Ez]UO1釥GP>a0h,.*ÿ@;fZ`Ez]UO1釥GP>ah,׾JBoͰwZ`Ez]UO1釥GP>a,gIR"q3Z`Ez]UO1釥GP>a0h,xf?Iq -Z`Ez]UO1釥GP>ah,@:WvZD,Z`Ez]UO1釥GP>a,Y `CG%S;>Z`Ez]UO1釥GP>a0h,BI zzZ`Ez]UO1釥GP>ah,'7=B;;Z`Ez]UO1釥GP>a,/6zsMf6 Z`Ez]UO1釥GP>a0h,}ITBKZ`Ez]UO1釥GP>ah,r<|ݔK .ǻKZ`Ez]UO1釥GP>a,te6N'Z`Ez]UOnevG4'@ P H+d'kJ^U*right leftZ`Ez]UOR<&d@ d|i@ﶌWMS'i@/6zsMf6 ?ݫK^BUгh@j?u'eDgur<|ݔK .ǻK? ZoUF_KACGUܩHw< MyBone .;]kI 忞@"`H 4W}@O{$H .(ѻD3Ϳ}t g!JPU }t IbEM K1gp}t ~t }\L 5p}t ~t =}(siHa^p}t PN "Ydg'JNjn*pFyCg'JNjn*pFBC`@0@?ceZU@䑧r[җJs@ |NewObject// OnComputeOutputs // Called to compute values of all output connectors function OnComputeOutputs(params) { var statusLine = params.ConValue('statusLine'); // TODO: put your computation here } NScript Object Package/jScript languagestringstatusLine[jdOA#}4W}@O{[jdOA#}BMD5AnimImport - frame # 26 of 27(XFҦV>g'JNjn*pFCCb@@@?.;]kI 忞@-1OSM n 럆L<_ї, 48@J "MD5AnimImport, 1 -1OSM n#2AEHM'ceZU@䑧r%T 4W}@O{$(XFҦVLE2Data, 1#J@#QLLE2Data, 3MT^RwL~YYTNffMCOD2|=Bynjz@Ho 2|=Bynj2AEHM'>g'JNjn*pnBC`@0@2|=Bynj|?z@Hoۙ>?ceZU@䑧r[җJs@ yNewCommandx// Doom3 md5anim import // April 2006 // clinton reese // // file format // header 2 lines and an empty line // numFrames // numJoints // frameRate // numAnimatedComponents // hierarchy one line for each joint // name, parent index, 6bit anim flag and start index of animation then comment with parent name and human readable anim flag // bounds section // baseframe // all other frames - same format as baseframe except only animated elements listed // each line corresponds to non zero anim flag of joints // // plan modify this code to read the md5anim format // // first build hierarchy then position and rotate joints into position // 25 April 2006 IT WORKS! // had to use quat to euler for NASA Standard Airplane euler rotations // 2 problems // can't move origin // left and right are reversed on resulting skeleton // // April 30 animation read looks good // problem: can only read limited num of frames if try read too many get little or no animation // long animations - getting a key at the start and at the end but not any in between // solved: place a key at the end of the animation first // // // 10 Feb 2007 // use pure quat rotation to matrix and now everything works perfectly // // 27 May 2007 - ts75 release not beta version // // 26 Feb 2008 - remove fake skeleton now that real skeleton is working, works with pre existing doomActor object // one major problem is import speed is extremely slow and can't get status info out of the single command node // only output console works for feedback // animation looks like 15 fps // // assumes a "doomActor" is in the scene to receive the animation frames // // Execute // Called to execute the command function Execute(params) { MyFileName = params.conValue('MyFileName'); scene = Space.CurrentScene(); owner = System.ThisOwner(); System.Trace("start of import"); Node.Value(owner,"statusLine") = "MD5AnimImport - start of import"; var forReading = 1, forWriting = 2, forAppending = 8; rline = new Array(); fs = new ActiveXObject("Scripting.FileSystemObject"); f = fs.GetFile(MyFileName); connToFile = f.OpenAsTextStream( forReading, 0); var count = 0; var myScale = 0.1; // 1 inch in doom3 = 0.1 meter in truespace // read file into array while( !connToFile.AtEndOfStream ) { rline[count] = connToFile.ReadLine(); count++; } connToFile.Close(); // finished reading file var msg = ""; var jointCnt = -1; var baseframeCnt = -1; var hierarchyCnt = -1;//flag for hiarchy section var frameLine = -1;// flag read frame data jointMesh = new Array(); // joint position arrays jx = new Array(); jy = new Array(); jz = new Array(); // quaternion arrays for joints xq = new Array(); yq = new Array(); zq = new Array(); wq = new Array(); boneName = new Array(); //boneFullName = new Array(); pBoneIndex = new Array(); animFlags = new Array(); animStart = new Array(); myMatrix = System.CreateDO("Math Package/Matrix Float Data"); rad2deg = 180/Math.PI; scene = Space.CurrentScene(); myCube = Space.Cube(1, 1, 1, 2, 2, 2); //process file for(i = 0; i < rline.length; i++) { msg = rline[i]; // scoop one line from msg array. msgtag = msg.split(" "); //read number of frames if (msgtag[0] == "numFrames") { var numFrames = msgtag[1]; System.Trace("numFrames = " + numFrames); //set key at last frame solves "long" animation problem RsAnim.SetAttrKeyFrame(myCube,'tx',0); } //read number of joints if (msgtag[0] == "numJoints") { var numJoints = msgtag[1]; System.Trace("numJoints = " + numJoints); } //read frame rate - no way to set in script at this time if (msgtag[0] == "frameRate") { var frameRate = msgtag[1]; System.Trace("frameRate = " + frameRate); } //number of animated components x, y, z, qx, qy, qz each count as one if (msgtag[0] == "numAnimatedComponents") { var numAnimatedComponents = msgtag[1]; System.Trace("numAnimatedComponents = " + numAnimatedComponents); } // read hierarchy data and create a skeleton - start hierarchy mode if(hierarchyCnt != -1) { msgtagSub = msgtag[0].split("\t"); jointName = msgtagSub[1].substr(1,msgtagSub[1].length-2); boneName[hierarchyCnt] = jointName; //boneFullName[hierarchyCnt] = "error"; pBoneIndex[hierarchyCnt] = msgtagSub[2];// parent index animFlags[hierarchyCnt] = msgtag[1];// msgtagSub = msgtag[2].split("\t"); animStart[hierarchyCnt] = msgtagSub[0];// //first bone if(hierarchyCnt == 0) { Node.Copy(owner + "/Skeleton", scene);//copy ts75 character to scene Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); // note: order of arguments matters in ConnectTo, order of connections may matter //ts76 base bone Node.ConnectTo(scene + "/Skeleton/MyBone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); } else { //process the rest parentIndex = pBoneIndex[hierarchyCnt]; //copy a joint and bone into the skeleton parentName = boneName[parentIndex]; Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", jointName + "Joint"); Node.Copy(owner + "/Bone", scene + "/Skeleton");//copy bone in temp = Node.Rename(scene + "/Skeleton/Bone", jointName + "Bone"); //order of ConnectTo args is important, order of connections may be important test now // connect bone Bone to joint Bone Node.ConnectTo(scene + "/Skeleton/" + parentName + "Bone","Bone",scene + "/Skeleton/" + jointName + "Joint","Bone"); Node.ConnectTo(scene + "/Skeleton/" + jointName + "Joint","Joint",scene + "/Skeleton/" + jointName + "Bone","Root"); } //test for end of hierarchy hierarchyCnt = hierarchyCnt + 1; if (hierarchyCnt == numJoints) { hierarchyCnt = -1;//done with hierarchy, get out of hiearchy mode } } // read baseframe loc rot data if(baseframeCnt != -1) { //baseframe position of joint jx[baseframeCnt] = parseFloat(msgtag[1]); jy[baseframeCnt] = parseFloat(msgtag[2]); jz[baseframeCnt] = parseFloat(msgtag[3]); //base frame rotation of joint in quaternion form xq[baseframeCnt] = msgtag[6]; yq[baseframeCnt] = msgtag[7]; zq[baseframeCnt] = msgtag[8]; curX = parseFloat(msgtag[1]); curY = parseFloat(msgtag[2]); curZ = parseFloat(msgtag[3]); myMatrix.LoadIdentity(); myMatrix.SetTransX(curX*myScale); myMatrix.SetTransY(curY*myScale); myMatrix.SetTransZ(curZ*myScale); // rotate the joint here before encapsulation qx = xq[baseframeCnt]; qy = yq[baseframeCnt]; qz = zq[baseframeCnt]; wq[baseframeCnt] = 1 - xq[baseframeCnt]*xq[baseframeCnt] - yq[baseframeCnt]*yq[baseframeCnt] - zq[baseframeCnt]*zq[baseframeCnt]; if (wq[baseframeCnt] < 0) { wq[baseframeCnt] = 0; } else { wq[baseframeCnt] = Math.sqrt(wq[baseframeCnt]) } qw = wq[baseframeCnt]; sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; sqw=qw*qw; //try pure transform myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,curX*myScale);//x myMatrix.SetAt(3,1,curY*myScale);//y myMatrix.SetAt(3,2,curZ*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); //Node.Value(boneFullName[baseframeCnt],"Matrix") = myMatrix; //true bone Node.Value(scene + "/Skeleton/" + boneName[baseframeCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts75 joint //end true bone //ts76 preexisting skeleton assume doomActor for now Node.Value(scene + "/doomActor/Skeleton/" + boneName[baseframeCnt] + "Joint","Matrix") = myMatrix; baseframeCnt = baseframeCnt + 1; //test for end of base frame if (baseframeCnt == numJoints) { baseframeCnt = -1; //leaf joints jointCnt = -1; myMatrix.LoadIdentity(); //Node.Value(encaps, "Matrix") = myMatrix; //add leaf joints for(cj=0;cj<numJoints;cj++) { //check if exist in parent list - if it's the parent of someone then not a leaf leafBone = 1; for(ci=0;ci<numJoints;ci++) { if(pBoneIndex[ci]==cj) { leafBone = 0; } } //if not then needs a leaf joint if(leafBone==1) { //copy leaf joint in to skeleton Node.Copy(owner + "/Joint", scene + "/Skeleton");//copy joint in temp = Node.Rename(scene + "/Skeleton/Joint", boneName[cj] + "Leaf"); Node.ConnectTo(scene + "/Skeleton/" + boneName[cj] + "Bone","Bone",scene + "/Skeleton/" + boneName[cj] + "Leaf","Bone");//connect leaf joint to bone myMatrix.LoadIdentity(); myMatrix.SetTransX((jx[cj]-jx[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransY((jy[cj]-jy[pBoneIndex[cj]])*myScale/4); myMatrix.SetTransZ((jz[cj]-jz[pBoneIndex[cj]])*myScale/4); Node.Value(scene + "/Skeleton/" + boneName[cj] + "Leaf","Matrix") = myMatrix; } } //return;//*************test return before animation frames******************** } } if (msgtag[0] == "hierarchy") { hierarchyCnt = 0; scene = Space.CurrentScene(); //encapsO = Node.Create('Kernel Package/Object', scene);//create empty node in scene //encaps = Node.Rename(encapsO, "doomSkeleton"); //transform node owner = System.ThisOwner(); //Node.Copy(owner + "/doomTransform", encaps);//copy transform to new node //Node.Rename(encaps + "/doomTransform", "Transform"); //Node.ExportConnector(encaps + "/Transform","Matrix","",1,1); //Node.ExportConnector(encaps + "/Transform","WldMatrix","",1,1); //Node.ExportConnector(encaps + "/Transform","ObjMatrix","",1,1); //Node.ExportConnector(encaps + "/Transform","OwnerMatrix","",1,1); Node.Value(owner,"statusLine") = "MD5AnimImport - read skeleton hierarchy"; } //enter base frame processing mode if (msgtag[0] == "baseframe") { baseframeCnt = 0; Node.Value(owner,"statusLine") = "MD5AnimImport - read base frame"; } // end of frame data if (frameLine != -1 && msgtag[0] == "}") frameLine = -1; // process animation line if (frameLine != -1) { while (animFlags[jointAnimCnt] == 0) { jointAnimCnt++; } //flags are stored in order x,y,z,qx,qy,qz in a single byte // these will translate to the frame line with tabs between each animated value // tab delimited lines but without any empty fields compIndex = 1;// 0 corresponds to the first tab in the line so skip it quatFlag = -1;//assume no quat anim myMatrix.LoadIdentity(); //read base frame position of the joint curX = jx[jointAnimCnt]; curY = jy[jointAnimCnt]; curZ = jz[jointAnimCnt]; //read animation flag for the joint, 0 is no animation theFlag = animFlags[jointAnimCnt]; if((theFlag & 1) == 1) { curX = msgtag[compIndex]; compIndex++; } if((theFlag & 2) == 2) { curY = msgtag[compIndex]; compIndex++; } if((theFlag & 4) == 4) { curZ = msgtag[compIndex]; compIndex++; } //read base frame quaternion rotations qx = xq[jointAnimCnt]; qy = yq[jointAnimCnt]; qz = zq[jointAnimCnt]; if((theFlag & 8) == 8) { qx = msgtag[compIndex]; quatFlag = 0; compIndex++; } if((theFlag & 16) == 16) { qy = msgtag[compIndex]; quatFlag = 0; compIndex++; } if((theFlag & 32) == 32) { qz = msgtag[compIndex]; quatFlag = 0; } //test quatFlag = 0; if (jointAnimCnt == 0) { System.Trace(curX + " ? " + curY + " ? " + curZ); } //System.Trace(qx + "?" + qy + "?" + qz); if (quatFlag == 0) { //System.Trace(qx + "?" + qy + "?" + qz + "?" + qw); sqx = qx*qx; sqy = qy*qy; sqz = qz*qz; qw = 1 - sqx - sqy - sqz; if (qw < 0) { qw = 0; } else { qw = Math.sqrt(qw) } sqw=qw*qw; //try pure transform myMatrix.LoadIdentity(); myMatrix.SetAt(3,0,curX*myScale);//x myMatrix.SetAt(3,1,curY*myScale);//y myMatrix.SetAt(3,2,curZ*myScale);//z rm11=1-2*qy*qy-2*qz*qz; rm12=2*qx*qy-2*qw*qz; rm13=2*qx*qz+2*qw*qy; rm21=2*qx*qy+2*qw*qz; rm22=1-2*qx*qx-2*qz*qz; rm23=2*qy*qz-2*qw*qx; rm31=2*qx*qz-2*qw*qy; rm32=2*qy*qz+2*qw*qx; rm33=1-2*qx*qx-2*qy*qy; myMatrix.SetAt(0,0,rm11); myMatrix.SetAt(1,0,rm21); myMatrix.SetAt(2,0,rm31); myMatrix.SetAt(0,1,rm12); myMatrix.SetAt(1,1,rm22); myMatrix.SetAt(2,1,rm32); myMatrix.SetAt(0,2,rm13); myMatrix.SetAt(1,2,rm23); myMatrix.SetAt(2,2,rm33); // end pure trasnform test } //Node.Value(boneFullName[jointAnimCnt],"Matrix") = myMatrix; //RsAnim.SetKeyFrame(boneFullName[jointAnimCnt], curFrame); //true bone RsAnim.SetKeyFrame(scene + "/Skeleton", curFrame);//set anim for full skel encapsulator Node.Value(scene + "/Skeleton/" + boneName[jointAnimCnt] + "Joint","Matrix") = myMatrix;//set matrix of ts75 joint RsAnim.SetKeyFrame(scene + "/Skeleton/" + boneName[jointAnimCnt], curFrame); //end true bone //ts76 preexisting skeleton assume doomActor for now RsAnim.SetKeyFrame(scene + "/doomActor/Skeleton", curFrame); Node.Value(scene + "/doomActor/Skeleton/" + boneName[jointAnimCnt] + "Joint","Matrix") = myMatrix; RsAnim.SetKeyFrame(scene + "/doomActor/Skeleton/" + boneName[jointAnimCnt], curFrame); jointAnimCnt++; } // set frame flag if (msgtag[0] == "frame") { curFrame = msgtag[1]; System.Trace("reading frame # " + curFrame); Node.Value(owner,"statusLine") = "MD5AnimImport - frame # " + curFrame + " of " + numFrames; frameLine = 0; jointAnimCnt = 0; Node.Value(myCube, "tx") = curFrame; RsAnim.SetKeyFrame(myCube, curFrame); //try set matrix of doomSkeleton myMatrix.LoadIdentity(); scene = Space.CurrentScene(); //Node.Value(scene + "/doomSkeleton","Matrix") = myMatrix; //RsAnim.SetAttrKeyFrame("doomSkeleton",'Matrix',curFrame); } // vertex position is weighted sum of weights relative to the bone // need to use quat rotation of bone on point, weight it and add them together // weights add to a value of 1.0 // } System.Trace("end of import"); }NScript Object Package/jScript languageLKstringMyFileNameNffMCO4W}@O{(XFҦV>g'JNjn*pnCDz@@V@2|=Bynj|?z@Hoۙ>?NffMCOC:\Documents and Settings\Clinton\My Documents\doom3\zfat\walk1.md5animJ@#QL>g'JNjn*pnBB`@T@2|=Bynj|?z@Hoۙ>?-1OSM n 럆L<_ї˱  ControlOˁ CRih[  nKg8Activity.Run('%THIS_NAME%')ImportZ`Ez]UOOˁ CRih[0HnKe:Activity.Stop('%THIS_NAME%') StopZ`Ez]UO GFʠN=`  nKa}}An<Click "..." to choose a file and then "Import" to read it inZ`Ez]UO1釥GP>a 0nK,NffMCOZ`Ez]UO#nKSM2` nK$\VVNffMCOZ`Ez]UOMT^RwL~YYT>g'JNjn*pnCB`@0@2|=Bynj|?z@Hoۙ>?z@Ho8ʯȥJH|o7 gH]kDwPXj|`d8pM*#ͺOY|m/tfѭ8Lwb"q