rgl/0000755000176000001440000000000012262033476011073 5ustar ripleyusersrgl/COPYING0000644000176000001440000004311211064454451012126 0ustar ripleyusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. rgl/inst/0000755000176000001440000000000012262021452012037 5ustar ripleyusersrgl/inst/WebGL/0000755000176000001440000000000012100313500012764 5ustar ripleyusersrgl/inst/WebGL/template.html0000644000176000001440000000050212140063333015474 0ustar ripleyusers RGL model
%WebGL%

Drag mouse to rotate model. Use mouse wheel or middle button to zoom it.

Object written from rgl %rglVersion% by writeWebGL. rgl/inst/WebGL/CanvasMatrix.js0000644000176000001440000002555011737412323015753 0ustar ripleyusersCanvasMatrix4=function(m){if(typeof m=='object'){if("length"in m&&m.length>=16){this.load(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]);return}else if(m instanceof CanvasMatrix4){this.load(m);return}}this.makeIdentity()};CanvasMatrix4.prototype.load=function(){if(arguments.length==1&&typeof arguments[0]=='object'){var matrix=arguments[0];if("length"in matrix&&matrix.length==16){this.m11=matrix[0];this.m12=matrix[1];this.m13=matrix[2];this.m14=matrix[3];this.m21=matrix[4];this.m22=matrix[5];this.m23=matrix[6];this.m24=matrix[7];this.m31=matrix[8];this.m32=matrix[9];this.m33=matrix[10];this.m34=matrix[11];this.m41=matrix[12];this.m42=matrix[13];this.m43=matrix[14];this.m44=matrix[15];return}if(arguments[0]instanceof CanvasMatrix4){this.m11=matrix.m11;this.m12=matrix.m12;this.m13=matrix.m13;this.m14=matrix.m14;this.m21=matrix.m21;this.m22=matrix.m22;this.m23=matrix.m23;this.m24=matrix.m24;this.m31=matrix.m31;this.m32=matrix.m32;this.m33=matrix.m33;this.m34=matrix.m34;this.m41=matrix.m41;this.m42=matrix.m42;this.m43=matrix.m43;this.m44=matrix.m44;return}}this.makeIdentity()};CanvasMatrix4.prototype.getAsArray=function(){return[this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44]};CanvasMatrix4.prototype.getAsWebGLFloatArray=function(){return new WebGLFloatArray(this.getAsArray())};CanvasMatrix4.prototype.makeIdentity=function(){this.m11=1;this.m12=0;this.m13=0;this.m14=0;this.m21=0;this.m22=1;this.m23=0;this.m24=0;this.m31=0;this.m32=0;this.m33=1;this.m34=0;this.m41=0;this.m42=0;this.m43=0;this.m44=1};CanvasMatrix4.prototype.transpose=function(){var tmp=this.m12;this.m12=this.m21;this.m21=tmp;tmp=this.m13;this.m13=this.m31;this.m31=tmp;tmp=this.m14;this.m14=this.m41;this.m41=tmp;tmp=this.m23;this.m23=this.m32;this.m32=tmp;tmp=this.m24;this.m24=this.m42;this.m42=tmp;tmp=this.m34;this.m34=this.m43;this.m43=tmp};CanvasMatrix4.prototype.invert=function(){var det=this._determinant4x4();if(Math.abs(det)<1e-8)return null;this._makeAdjoint();this.m11/=det;this.m12/=det;this.m13/=det;this.m14/=det;this.m21/=det;this.m22/=det;this.m23/=det;this.m24/=det;this.m31/=det;this.m32/=det;this.m33/=det;this.m34/=det;this.m41/=det;this.m42/=det;this.m43/=det;this.m44/=det};CanvasMatrix4.prototype.translate=function(x,y,z){if(x==undefined)x=0;if(y==undefined)y=0;if(z==undefined)z=0;var matrix=new CanvasMatrix4();matrix.m41=x;matrix.m42=y;matrix.m43=z;this.multRight(matrix)};CanvasMatrix4.prototype.scale=function(x,y,z){if(x==undefined)x=1;if(z==undefined){if(y==undefined){y=x;z=x}else z=1}else if(y==undefined)y=x;var matrix=new CanvasMatrix4();matrix.m11=x;matrix.m22=y;matrix.m33=z;this.multRight(matrix)};CanvasMatrix4.prototype.rotate=function(angle,x,y,z){angle=angle/180*Math.PI;angle/=2;var sinA=Math.sin(angle);var cosA=Math.cos(angle);var sinA2=sinA*sinA;var length=Math.sqrt(x*x+y*y+z*z);if(length==0){x=0;y=0;z=1}else if(length!=1){x/=length;y/=length;z/=length}var mat=new CanvasMatrix4();if(x==1&&y==0&&z==0){mat.m11=1;mat.m12=0;mat.m13=0;mat.m21=0;mat.m22=1-2*sinA2;mat.m23=2*sinA*cosA;mat.m31=0;mat.m32=-2*sinA*cosA;mat.m33=1-2*sinA2;mat.m14=mat.m24=mat.m34=0;mat.m41=mat.m42=mat.m43=0;mat.m44=1}else if(x==0&&y==1&&z==0){mat.m11=1-2*sinA2;mat.m12=0;mat.m13=-2*sinA*cosA;mat.m21=0;mat.m22=1;mat.m23=0;mat.m31=2*sinA*cosA;mat.m32=0;mat.m33=1-2*sinA2;mat.m14=mat.m24=mat.m34=0;mat.m41=mat.m42=mat.m43=0;mat.m44=1}else if(x==0&&y==0&&z==1){mat.m11=1-2*sinA2;mat.m12=2*sinA*cosA;mat.m13=0;mat.m21=-2*sinA*cosA;mat.m22=1-2*sinA2;mat.m23=0;mat.m31=0;mat.m32=0;mat.m33=1;mat.m14=mat.m24=mat.m34=0;mat.m41=mat.m42=mat.m43=0;mat.m44=1}else{var x2=x*x;var y2=y*y;var z2=z*z;mat.m11=1-2*(y2+z2)*sinA2;mat.m12=2*(x*y*sinA2+z*sinA*cosA);mat.m13=2*(x*z*sinA2-y*sinA*cosA);mat.m21=2*(y*x*sinA2-z*sinA*cosA);mat.m22=1-2*(z2+x2)*sinA2;mat.m23=2*(y*z*sinA2+x*sinA*cosA);mat.m31=2*(z*x*sinA2+y*sinA*cosA);mat.m32=2*(z*y*sinA2-x*sinA*cosA);mat.m33=1-2*(x2+y2)*sinA2;mat.m14=mat.m24=mat.m34=0;mat.m41=mat.m42=mat.m43=0;mat.m44=1}this.multRight(mat)};CanvasMatrix4.prototype.multRight=function(mat){var m11=(this.m11*mat.m11+this.m12*mat.m21+this.m13*mat.m31+this.m14*mat.m41);var m12=(this.m11*mat.m12+this.m12*mat.m22+this.m13*mat.m32+this.m14*mat.m42);var m13=(this.m11*mat.m13+this.m12*mat.m23+this.m13*mat.m33+this.m14*mat.m43);var m14=(this.m11*mat.m14+this.m12*mat.m24+this.m13*mat.m34+this.m14*mat.m44);var m21=(this.m21*mat.m11+this.m22*mat.m21+this.m23*mat.m31+this.m24*mat.m41);var m22=(this.m21*mat.m12+this.m22*mat.m22+this.m23*mat.m32+this.m24*mat.m42);var m23=(this.m21*mat.m13+this.m22*mat.m23+this.m23*mat.m33+this.m24*mat.m43);var m24=(this.m21*mat.m14+this.m22*mat.m24+this.m23*mat.m34+this.m24*mat.m44);var m31=(this.m31*mat.m11+this.m32*mat.m21+this.m33*mat.m31+this.m34*mat.m41);var m32=(this.m31*mat.m12+this.m32*mat.m22+this.m33*mat.m32+this.m34*mat.m42);var m33=(this.m31*mat.m13+this.m32*mat.m23+this.m33*mat.m33+this.m34*mat.m43);var m34=(this.m31*mat.m14+this.m32*mat.m24+this.m33*mat.m34+this.m34*mat.m44);var m41=(this.m41*mat.m11+this.m42*mat.m21+this.m43*mat.m31+this.m44*mat.m41);var m42=(this.m41*mat.m12+this.m42*mat.m22+this.m43*mat.m32+this.m44*mat.m42);var m43=(this.m41*mat.m13+this.m42*mat.m23+this.m43*mat.m33+this.m44*mat.m43);var m44=(this.m41*mat.m14+this.m42*mat.m24+this.m43*mat.m34+this.m44*mat.m44);this.m11=m11;this.m12=m12;this.m13=m13;this.m14=m14;this.m21=m21;this.m22=m22;this.m23=m23;this.m24=m24;this.m31=m31;this.m32=m32;this.m33=m33;this.m34=m34;this.m41=m41;this.m42=m42;this.m43=m43;this.m44=m44};CanvasMatrix4.prototype.multLeft=function(mat){var m11=(mat.m11*this.m11+mat.m12*this.m21+mat.m13*this.m31+mat.m14*this.m41);var m12=(mat.m11*this.m12+mat.m12*this.m22+mat.m13*this.m32+mat.m14*this.m42);var m13=(mat.m11*this.m13+mat.m12*this.m23+mat.m13*this.m33+mat.m14*this.m43);var m14=(mat.m11*this.m14+mat.m12*this.m24+mat.m13*this.m34+mat.m14*this.m44);var m21=(mat.m21*this.m11+mat.m22*this.m21+mat.m23*this.m31+mat.m24*this.m41);var m22=(mat.m21*this.m12+mat.m22*this.m22+mat.m23*this.m32+mat.m24*this.m42);var m23=(mat.m21*this.m13+mat.m22*this.m23+mat.m23*this.m33+mat.m24*this.m43);var m24=(mat.m21*this.m14+mat.m22*this.m24+mat.m23*this.m34+mat.m24*this.m44);var m31=(mat.m31*this.m11+mat.m32*this.m21+mat.m33*this.m31+mat.m34*this.m41);var m32=(mat.m31*this.m12+mat.m32*this.m22+mat.m33*this.m32+mat.m34*this.m42);var m33=(mat.m31*this.m13+mat.m32*this.m23+mat.m33*this.m33+mat.m34*this.m43);var m34=(mat.m31*this.m14+mat.m32*this.m24+mat.m33*this.m34+mat.m34*this.m44);var m41=(mat.m41*this.m11+mat.m42*this.m21+mat.m43*this.m31+mat.m44*this.m41);var m42=(mat.m41*this.m12+mat.m42*this.m22+mat.m43*this.m32+mat.m44*this.m42);var m43=(mat.m41*this.m13+mat.m42*this.m23+mat.m43*this.m33+mat.m44*this.m43);var m44=(mat.m41*this.m14+mat.m42*this.m24+mat.m43*this.m34+mat.m44*this.m44);this.m11=m11;this.m12=m12;this.m13=m13;this.m14=m14;this.m21=m21;this.m22=m22;this.m23=m23;this.m24=m24;this.m31=m31;this.m32=m32;this.m33=m33;this.m34=m34;this.m41=m41;this.m42=m42;this.m43=m43;this.m44=m44};CanvasMatrix4.prototype.ortho=function(left,right,bottom,top,near,far){var tx=(left+right)/(left-right);var ty=(top+bottom)/(top-bottom);var tz=(far+near)/(far-near);var matrix=new CanvasMatrix4();matrix.m11=2/(left-right);matrix.m12=0;matrix.m13=0;matrix.m14=0;matrix.m21=0;matrix.m22=2/(top-bottom);matrix.m23=0;matrix.m24=0;matrix.m31=0;matrix.m32=0;matrix.m33=-2/(far-near);matrix.m34=0;matrix.m41=tx;matrix.m42=ty;matrix.m43=tz;matrix.m44=1;this.multRight(matrix)};CanvasMatrix4.prototype.frustum=function(left,right,bottom,top,near,far){var matrix=new CanvasMatrix4();var A=(right+left)/(right-left);var B=(top+bottom)/(top-bottom);var C=-(far+near)/(far-near);var D=-(2*far*near)/(far-near);matrix.m11=(2*near)/(right-left);matrix.m12=0;matrix.m13=0;matrix.m14=0;matrix.m21=0;matrix.m22=2*near/(top-bottom);matrix.m23=0;matrix.m24=0;matrix.m31=A;matrix.m32=B;matrix.m33=C;matrix.m34=-1;matrix.m41=0;matrix.m42=0;matrix.m43=D;matrix.m44=0;this.multRight(matrix)};CanvasMatrix4.prototype.perspective=function(fovy,aspect,zNear,zFar){var top=Math.tan(fovy*Math.PI/360)*zNear;var bottom=-top;var left=aspect*bottom;var right=aspect*top;this.frustum(left,right,bottom,top,zNear,zFar)};CanvasMatrix4.prototype.lookat=function(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz){var matrix=new CanvasMatrix4();var zx=eyex-centerx;var zy=eyey-centery;var zz=eyez-centerz;var mag=Math.sqrt(zx*zx+zy*zy+zz*zz);if(mag){zx/=mag;zy/=mag;zz/=mag}var yx=upx;var yy=upy;var yz=upz;xx=yy*zz-yz*zy;xy=-yx*zz+yz*zx;xz=yx*zy-yy*zx;yx=zy*xz-zz*xy;yy=-zx*xz+zz*xx;yx=zx*xy-zy*xx;mag=Math.sqrt(xx*xx+xy*xy+xz*xz);if(mag){xx/=mag;xy/=mag;xz/=mag}mag=Math.sqrt(yx*yx+yy*yy+yz*yz);if(mag){yx/=mag;yy/=mag;yz/=mag}matrix.m11=xx;matrix.m12=xy;matrix.m13=xz;matrix.m14=0;matrix.m21=yx;matrix.m22=yy;matrix.m23=yz;matrix.m24=0;matrix.m31=zx;matrix.m32=zy;matrix.m33=zz;matrix.m34=0;matrix.m41=0;matrix.m42=0;matrix.m43=0;matrix.m44=1;matrix.translate(-eyex,-eyey,-eyez);this.multRight(matrix)};CanvasMatrix4.prototype._determinant2x2=function(a,b,c,d){return a*d-b*c};CanvasMatrix4.prototype._determinant3x3=function(a1,a2,a3,b1,b2,b3,c1,c2,c3){return a1*this._determinant2x2(b2,b3,c2,c3)-b1*this._determinant2x2(a2,a3,c2,c3)+c1*this._determinant2x2(a2,a3,b2,b3)};CanvasMatrix4.prototype._determinant4x4=function(){var a1=this.m11;var b1=this.m12;var c1=this.m13;var d1=this.m14;var a2=this.m21;var b2=this.m22;var c2=this.m23;var d2=this.m24;var a3=this.m31;var b3=this.m32;var c3=this.m33;var d3=this.m34;var a4=this.m41;var b4=this.m42;var c4=this.m43;var d4=this.m44;return a1*this._determinant3x3(b2,b3,b4,c2,c3,c4,d2,d3,d4)-b1*this._determinant3x3(a2,a3,a4,c2,c3,c4,d2,d3,d4)+c1*this._determinant3x3(a2,a3,a4,b2,b3,b4,d2,d3,d4)-d1*this._determinant3x3(a2,a3,a4,b2,b3,b4,c2,c3,c4)};CanvasMatrix4.prototype._makeAdjoint=function(){var a1=this.m11;var b1=this.m12;var c1=this.m13;var d1=this.m14;var a2=this.m21;var b2=this.m22;var c2=this.m23;var d2=this.m24;var a3=this.m31;var b3=this.m32;var c3=this.m33;var d3=this.m34;var a4=this.m41;var b4=this.m42;var c4=this.m43;var d4=this.m44;this.m11=this._determinant3x3(b2,b3,b4,c2,c3,c4,d2,d3,d4);this.m21=-this._determinant3x3(a2,a3,a4,c2,c3,c4,d2,d3,d4);this.m31=this._determinant3x3(a2,a3,a4,b2,b3,b4,d2,d3,d4);this.m41=-this._determinant3x3(a2,a3,a4,b2,b3,b4,c2,c3,c4);this.m12=-this._determinant3x3(b1,b3,b4,c1,c3,c4,d1,d3,d4);this.m22=this._determinant3x3(a1,a3,a4,c1,c3,c4,d1,d3,d4);this.m32=-this._determinant3x3(a1,a3,a4,b1,b3,b4,d1,d3,d4);this.m42=this._determinant3x3(a1,a3,a4,b1,b3,b4,c1,c3,c4);this.m13=this._determinant3x3(b1,b2,b4,c1,c2,c4,d1,d2,d4);this.m23=-this._determinant3x3(a1,a2,a4,c1,c2,c4,d1,d2,d4);this.m33=this._determinant3x3(a1,a2,a4,b1,b2,b4,d1,d2,d4);this.m43=-this._determinant3x3(a1,a2,a4,b1,b2,b4,c1,c2,c4);this.m14=-this._determinant3x3(b1,b2,b3,c1,c2,c3,d1,d2,d3);this.m24=this._determinant3x3(a1,a2,a3,c1,c2,c3,d1,d2,d3);this.m34=-this._determinant3x3(a1,a2,a3,b1,b2,b3,d1,d2,d3);this.m44=this._determinant3x3(a1,a2,a3,b1,b2,b3,c1,c2,c3)} rgl/inst/NEWS0000644000176000001440000005561612262021543012554 0ustar ripleyusersv0.60 - (mini-thesis release) v0.61 (workshop release) - added: rgl.sprites - added: fps counter - added: autoUpdate, modified win32 mainloop, on hide, autoUpdate disabled, on show enabled - modified material: added alpha vector v0.62 - modified sphere set - support R color strings - use system.file( , package="rgl" ) in examples to retrieve texture files - rewrote R code : * clear enum types * vertex vector datatype (internal representation matrix) v0.63 - api: added rgl_init, rgl_quit: explicit client initialization - added setup.bat: build setup for windows - win32 setup: mingw compiler - win32 setup: visual c++ compiler through gui environment v0.64 - autoconf build system - moved textures to inst/ directory - x11 port - win32/vc: fixed fpu control word precision to remain on 64 bit links with fp10.obj - changed texture mapping t coordinate for Surface node v0.64-2 - rgl.quads: enum id was broken, fixed ("quads" -> "quadrangles") v0.64-3 - configure.ac: X11 library path broken, fixed - x11gui: glXChooseVisual part fixed - code cleanup: rglview.h - added: man/maintainer.Rd maintainer information v0.64-4 - manual update - aquired valid CRAN package status, rcmd check runs through with 2 WARNINGS (acording to latex, and codoc) - uploaded to cvs v0.64-5 - MacOS X/X11 port v0.64-6 - updated build system: added setversion.sh - with MinGW version 3.0.1 pixmap loading does work - project.mk , win32.mk and x11.mk in src/build changed now a single variable MODS will extend. - MinGW build system changed. rgl.dll now contains an R compilant Resource information generated by R perl script - bug fix: R 1.8.0/win32 does not detach packages when quit it is safe now to call rgl_quit and lib_quit multiple times win32lib.cpp: added dllmain that calls rgl_quit on process exit - added core support for devcpp IDE v0.64-7 - added mouse capturing - rgl.sprites 'radius' bug fixed - memory leak bugfix: texture objects are now AutoDestroy and used through Ref's - resource management improvment: pixmaps gets free'd when they become unused e.g. texture objects are created. - no limitations on pixmap sizes - mipmap support - support for different texture minification and magnification filters v0.64-8 - build bugfix : removed rgl/src/Makefile - updated configure to check and setup LDFLAGS for OpenGLU library v0.64-9 - MacOS X 'Panther' G5 fix for OpenGL library loading in .first.lib - removed lpng and zlib from source tree - support for automatic downloading of zlib and lpng on win32 - added demo directory with several examples using demo(rgl) v0.64-10 - updated .C() calls using PACKAGE="rgl" - updated Maintainer.mk using correct zlib version - improved dynamic unload using library.dynam.unload() - conditional macos x darwin code in .First.lib() v0.64-11 - removed several redundant semicolons, required by gcc 3.4 ansi-pedantic mode. - win32: uses R's zlib and libpng sources - win32: added virtual destructor in Win32GUIFactory (removes warning) v0.64-12 - cran bugfix: permissions of cleanup fixed. v0.64-13 - DESCRIPTION fix: moved R 1.41 -> R 1.4.1 dependency v0.65 - simplified build system: uses 'R' build system - added generic visualization/rendering interface (R3D) - text justification from 0 to 1 - added primitive type: linestrips - fixed rgl.bringtotop, added stay option (win32) - added 4x4 matrix functions from djmrgl - added rgl.user2window and rgl.window2user functions - added user-selectable mouse handlers - added selection mouse handler - added trackball mouse handler - added z-distance sorted rendering of alpha-blended faces - added gl2ps patch ( contributed by Albrecht Gebhard ) - added port: native Mac OS X Carbon - bugfix: rgl.close() , rgl.quit() crashed on X11 occasionally. - generalized rgl.surface() to allow surface over any coordinate plane. - added r3dDefaults variable to allow user to set defaults - added environment texture-mapping v0.66 - added "all" and "viewpoint" to rgl.clear and clear3d - added static libpng build support and user customizable prefix (unix) - used xyz.coords in all functions taking x, y, z coordinates, allowing matrix or dataframe arguments (among others) - added par3d(skipRedraw=TRUE) to allow drawing to be done without being rendered - fixed display list memory leak when drawing shapes (e.g. spheres) - Changes for compatibility with strict enforcement of file naming rules in R 2.3.0. v0.67 - added support for png files with palettes, and grayscale pngs with 1, 2 or 4 bits per pixel - added "ignoreExtent" option to par3d: objects plotted when this is true are ignored when calculating the bounding box - added axis3d, axes3d, box3d, mtext3d, title3d functions from djmrgl for annotating plots. - added plot3d high level plot function - added material3d, which can both set and query material properties; changed most *3d functions so they leave material invariant across calls. - changed open3d() to set background and material defaults - added aspect3d to control the aspect ratio of the bounding box. - added xAxis, yAxis and zAxis mouse modes, set zAxis as r3d default. - added persp3d function - changed error messages to go through REprintf in X11 and OSX - fixed segfault if rgl_init failed - converted type of viewport arg in user2window and window2user calls - if the rgl_init call fails, the package will still load with a warning (but most function calls will result in errors). - added par3d("scale") to handle aspect3d operations internally. - added ellipse3d() generic and methods for drawing confidence ellipsoids - added decorate3d() to draw all the decorations, plot3d.qmesh3d() method. - changed zoom to use ratio scale over larger range - fixed bug causing jump after resize in Mac OSX (and maybe other platforms) - rgl.primitive now does sanity checks on inputs v0.67-2 - minor correction v0.68 - fixed sphere drawing so spheres are spheres regardless of par3d("scale") - added type="s" to plot3d to draw spheres - fixed handling of "..." in axis related functions - added full MDI support - removed use of List and ListIterator internally - fixed handling of axes and boxes when a coordinate had zero extent - changed rgl.viewpoint default to be compatible with r3dDefaults - added id return values to primitives and higher level functions, and to rgl.pop(); added rgl.ids() to report on them. - updated gl2ps to version 1.3.1, adding support for svg and pgf output formats. - added grid3d(), added nticks argument to bbox3d, axis3d and axes3d. v0.69 - persp3d partially ignored add=TRUE - plot3d.qmesh3d did not return result - allow selection to use any button - allow NA in primitives, surfaces, texts, and sprites - report error in OSX if the wrong configure options were used. - display was not being updated properly in OSX v0.70 - OSX now builds two libraries, one for AGL, one for X11 - resolve entry points at load time, not call time - updated gl2ps to version 1.3.2 - fixed bug in rgl.postscript in Linux, added text support to it - tweaked positioning of labels in bounding box decoration - snapshot3d wasn't being exported, and snapshots were from the back buffer - fixed bug that could cause crash on shutdown - moved this file (ChangeLog) to inst directory, so it will be installed, and added code to display it to the rgl help topic. v0.71 - changes to configure script from Laszlo Kajan and Brian Ripley: should now be much more portable - removed deprecated OSX font setting calls - texture properties are now returned by material3d() - allowed normals and texture coordinates to be specified in triangles, quads and surfaces - normals may be specified in qmesh objects, but (at present) subdivide removes them - material3d() now preserves the values of unspecified parameters (as documented, but not previously functioning) - clear3d() can now reset material properties to the defaults, and open3d() does this. - minor fix for gcc 4.3 compatibility - minor fix for R 2.5+ compatibility - allowed more general surfaces to be plotted by rgl.surface, surface3d and persp3d, by specifying matrices for x and y coordinates - added world map texture, used in example(persp3d) v0.72 - declaration changes for compatibility with R 2.6.0 (from Brian Ripley) v0.73 - partial changes to avoid crash on MacOSX with Xvfb - change to rgl_init for R 2.6.0 compatibility v0.74 - clean up #includes - clean up some calls for SunStudio 12 compiler - add rgl.setMouseCallbacks to allow user actions v0.75 - add play3d, movie3d, par3dinterp, and spin3d functions, with flag demo - rounding error could cause par3d(userMatrix) to generate NaNs and fail - workaround for Xvfb on MacOSX problems v0.76 - put our own assert() macro in place to avoid crashing R. - rename ChangeLog file to NEWS, as per discussion on R-devel - add "windowRect" to par3d parameters to allow window size to be controlled from R. v0.77 - par3d("windowRect") returned garbage if there was no window open. - persp3d() and plot3d() sometimes miscalculated ranges involving NAs. - select3d() and rgl.select() produced a very inefficient test function. v0.78 - fix miscalculation of mouseMatrix that caused disappearing views. - rgl.texts() and text3d() can now handle font and size specifications using the FreeType library on any platform, or GDI on Windows. - adj is supported both horizontally and vertically in drawing text. - rgl.pop was very slow when given a long list of ids. - a workaround for OSX 10.5 OpenGL problems has been incorporated (thanks to mkv22@cam.ac.uk). v0.79 - rgl.pop() could cause corruption when multiple windows were open. - added mouseCallbacks demo, to show R implementations of standard mouse handlers, multiple connected windows, stereo view, etc. - added "silent" argument to rgl.set(), to allow temporary changes to focus without changing window labels. - added natural spline extrapolation to par3dinterp. v0.80 - worked around bug(?) in Mac OSX FTGL rendering - updated FTGL to 2.1.3rc5 v0.81 - converted Freetype font error into warning - rglFonts was being set at install time, but it should be set at load time. - fixed configuration problems in OS X - fixed executable marker on a number of files v0.82 - rewrote internal rendering of transparent and anti-aliased shapes, so they will be rendered better when there are several in the same scene - added material properties "point_antialias", which causes points to be drawn as smooth circles, and "line_antialias", which causes lines to be antialiased. - fixed a bug in the bounding box decoration which caused axis labels to be plotted in the wrong place. - fixed a bug in the Windows driver which caused the standard system font to disappear when justified. - added material parameter lwd for line width; size now applies only to points. - increased default point size to 3 pixels across. - fixed bug in open3d: "..." was being ignored. - fixed bug in qmesh3d: homogeneous=FALSE coordinates were not handled properly. - movie3d gains a "type" argument to set the output type, and the "convert" argument is more flexible. - rgl.snapshot() gives more informative error messages when libpng is not available. - axis3d() now uses format() rather than as.character() to give nicer looking labels. - the clipping volume calculation was incorrect when scaling was used. - use R warning() to report messages, rather than popups or REprintf. - added rgl.pixels() to read the generated image, and demo("stereo") to illustrate its use. - corrected the ?rgl example to display this file. v0.83-1 - Don't try to build Carbon driver in 64 bit Mac OS (contributed by Brian Ripley). - Fixed rgl.pixels example for weird displays. - Did not assume OpenGL 1.2 was available in material properties. - Added numerous error checks. - Fixed demo(stereo) to add sync in X11: X windows seemed to grab images before they were redrawn. - Rearranged headers for Win64 compatibility (contributed by Alex Chen). v0.83-3 - Quick fix for R 2.9.x compatibility, and to remove accidental change introduced in v0.83 which caused errors on plotting without open3d(). v0.84 - Added triangle meshes, shape lists, the Platonic solids and a cuboctahedron. - Added classes mesh3d and shapelist3d; qmesh3d is only kept for back compatibility. - Bug fix to stop crashes when material is set before the first window is opened. v0.85 - Added some namespace declarations to the C++, and renamed math.h, for compatibility with Sun compilers (contributed by Brian Ripley). - Fixed visibility of some shade3d, wire3d and points3d methods. - Added addNormals generic, to add normals for smooth surface rendering. - Added cylinder3d function, to make cylindrical or "tube" plots. - Fixed material3d("color") bug introduced in 0.82. v0.87 - Allowed FOV to be set to 0, for an orthogonal projection. - Fixed crash when zero-length color vector was used. - Fixed crash in X11 after closing a window - Changed seq(along=...) to seq_along(...). - Fixed typo in cylinder3d. - Cleaned up bad links in Rd files. v0.88 - Add keepVars argument to cylinder3d(), for debugging or special effects. - Add BugReports field to DESCRIPTION. v0.89 - Fixed rounding errors and Xvfb errors in rgl.pixels examples and demo. v0.90 - Added startTime argument to play3d() and movie3d(). - Fixed configure.ac as suggested by Jens Elkner. - Updated declarations for libpng 1.4.0 compatibility. - An off-by-one error caused the "alpha" component of the material properties to be messed up. (Bug #809) v0.91 - Fixed bug in rgl.texts: zero-length texts argument caused crash. (Reported by Michael Friendly.) - Added R_ARCH* macros to configure.win for Win64 compatibility - Fixed bad declaration in rglmath.h v0.92 - Added detection of 64 bit MacPorts compiler to configure script. (Bug #861) - Allowed texture coordinates to be specified in mesh objects. - Updated gl2ps to version 1.3.5 - Should now install using --merge-multiarch on Windows v0.92.858 - Added declarations for Solaris compatibility (from Brian Ripley) - Fixed configure.win for bi-arch compatibility. Windows installers can set HAVE_PNG to a non-empty value, and rgl will look for the libpng files in the default LOCAL_SOFT location when installing. - Added depth_mask and depth_test material properties, to allow control over how objects are obscured by each other. - Added Sweave support through the rgl.Sweave driver and the Sweave.snapshot function. - Added iterative computation of the bounding box to handle objects like spheres, which need to maintain their apparent shape as the scaling changes. - Improved the bounding box decoration in two ways: it can now draw the front faces (to surround the whole graph), and can label edges with pretty labels. plot3d() was modified to use this instead of manually setting axis locations and using box3d() to draw a box, allowing resizeable labelled axes. - Removed some unnecessary declarations from rglmath.h that were causing problems in an old version of gcc on Solaris. - Added rgl.abclines(), rgl.planes(), abclines3d() and planes3d() to draw lines and planes intersecting with the bounding box. - rgl.postscript() now adjusts the size of text following the cex setting. The font and family settings are still ignored. - Transparency in material textures was not always rendered properly. - In OSX, the Carbon system has been replaced by a Cocoa system. (Code contributed by Adam Strzelecki). For compatibility with the Windows build system, the new files have been put into src/osx. - Hardware antialiasing is now used if the OpenGL driver supports it. Set options(rgl.antialias=0) to disable it. - Bug fix for divide.mesh3d() in handling normals. - Functions rgl.attrib.count() and rgl.attrib() (and internal function rgl.getmaterial()) added to allow objects in the scene to be examined. - rgl.ids() did not return all object ids as documented. - Updated gl2ps to version 1.3.6 v0.92.861 - Fixed segfault on startup on Windows in MDI mode. - Added rgl.save.texture() to get texture from an object. v0.92.879 - Removed rgl.save.texture(): textures are not saveable! - Added writeWebGL() function, to allow scenes to be viewed in a web browser. - Added "centers" to the attributes that can be queried, for depth sorted transparent rendering. v0.92.880 - Rearranged declarations for compatibility with gcc 4.7. v0.92.881 - Fixed degenerate (e.g. straight line) cases in cylinder3d v0.92.883 - Added 3d "sprites" -- shapes that maintain their initial orientation. v0.92.887 - Added "caps" to the end of cylinder3d() objects. v0.92.891 - Added support for 3d sprites to writeWebGL. v0.92.892 - Added declaration needed by Solaris. v0.92.893 - rgl.light() and light3d() did not return the light ID value. v0.92.894 - remove debugging code from configure.win that was causing problems on the CRAN WinBuilder system v0.93 - Added readSTL and writeSTL functions - Added expand argument to decorate3d and axes3d - Added base argument to spin3d result - Added writePLY and writeOBJ functions - Added scene3d function - Added section argument to cylinder3d() - Added res_name="rgl" and res_class="R_x11" to the WM_CLASS property of X11 windows. (Contributed by Philip Johnson.) - Added code to work with R 3.0.0 setHook changes - Added selectpoints3d function to select points from the scene. - The rgl window now handles ESC key presses. During selection and play3d they abort the process; otherwise they are ignored. - writeWebGL did not render semi-transparent surfaces properly. (Reported by Robert Esswein.) - Copied the R_pretty0 function from R sources to avoid warning. v0.93.928 - Updated the configure file using autoconf 2.69 - Forced OSX installs to put /usr/X11/bin at the head of the path when looking for freetype-config v0.93.930 - writeWebGL did not handle snapshot=FALSE properly. (Reported by Yihui Xie.) - Now handles local (not just directional) lighting. Based on code contributed by Alexander Senger.) - writeWebGL handles lighting properly. Based on code contributed by Alexander Senger. v0.93.932 - calling rgl.material() before any rendering caused a crash on OSX. (Reported by Dan Tenenbaum.) v0.93.935 - in certain circumstances since 0.93.930, text would fail to appear. (Reported by Karline Soetaert.) v0.93.944 - write the rgl version into the webGL file - cleaned up use of CHECKGLERROR, so that setting USE_GLGETERROR to 1 in R.h will enable detailed checking - added identify3d() function - fixed bbox bug in writeOBJ (reported by Matthias Zeeman), writePLY and writeSTL. - aspect3d() (called by plot3d()) caused the scene to be redrawn, even if par3d("skipRedraw") was TRUE. - addNormals.mesh3d() failed on objects when the matrices of triangles or quadrilaterals had zero columns. - rotate3d.mesh3d() did not transform normals properly - the writeWebGL() function produced fragment shaders that would not work in some browsers (e.g. Firefox and Chrome with the ANGLE WebGL engine). v0.93.952 - added triangulate(), polygon3d() , extrude3d() and turn3d() for display of shapes based on two-dimensional polygons or curves. - fixed formatting of vertex reference numbers in writeOBJ() (issue 4732, reported by Alejandro Baranek). - added support for "headless" operation: see help for new function rgl.useNULL(). - added name of device to result returned from rgl.cur(); added function rgl.dev.list() to list all open devices. - examples and demos now check rgl.useNULL(), and don't run invisible animations. v0.93.960 - writeWebGL now forces the position attribute to location 0, a recommended optimization strategy. The colour attribute is forced to location 1. - we now check for invalid characters when drawing text using bitmapped fonts (bug 4787) - gl2ps has been updated to version 1.3.8 and support for point and line sizes has been added (bug 4792) - internal functions .check3d() and rgl.select() have been exported, as they were used by the car package. - writePLY had errors writing points and lines. - rgl now prints a warning when a requested font is unavailable and the default font is substituted. v0.93.963 - font selection assumed rgl was on the search path; now it may be imported but not attached. Similarly, r3dDefaults need not be on the search path. v0.93.975 - rgl.texts without a window failed because it queried the window before opening it. - the scene3d() function now records complete information about the bounding box and the background. - rgl declares most of its C++ objects in the global namespace. Recently this has caused clashes with the igraph package, which does the same, and which also has a Shape class. As a temporary workaround the rgl class has been renamed to rglShape. A full rgl namespace will eventually be added, with only the API functions left in the global namespace. v0.93.984 - most rgl C++ functions and classes are now in namespace "rgl". Others have prefix rgl_, with the exception of gl2ps functions, which all have that prefix, and FTGL functions, which generally have an FT prefix. - entry points to the rgl DLL are now registered within the DLL, and on systems that support it, all entry points other than the registration function are hidden. - writeWebGL() and the other write methods did not handle material information properly after 0.93.975. v0.93.986 - The FTGL functions were mistakenly added to the rgl namespace on some OSX compiles. - Changes have been made to satisfy the stringent requirements of the Solaris compiler. v0.93.987 - Added clipplanes3d function to implement clip planes. (Still only partially implemented.) v0.93.991 - Some cleanup of the declarations (submitted by Karl Millar). v0.93.995 - Improved the approximation to the surface normal for degenerate grids in surface3d and persp3d. (Problem found by Graham Griffiths using polar coordinates; all r=0 points were at the same location.) - The new surface normals are now saved in memory, so rgl.attrib will return them even if they were calculated by rgl. - Bounding box calculations for surfaces with user normals were incorrect. - An array-overrun bug in rgl.attrib() showed up in writeWebGL. (Reported by Brian Ripley.) - scene3d() now records light settings. rgl/inst/demodata/0000755000176000001440000000000012100313500013602 5ustar ripleyusersrgl/inst/demodata/population.dat0000644000176000001440000001400011257014121016472 0ustar ripleyusersstructure(c(1.42180393552915, 86.5899178491882, 58.4279463385297, 72.5782084880812, 94.7650395805866, 90.716798083558, 4.69523086857405, 66.0275494756707, 99.5966041105792, 28.8464020557810, 32.5199596913345, 32.8230902358943, 76.092718318592, 90.9491131042477, 67.7715461039384, 92.797656673891, 62.8763250044725, 37.8377486848826, 94.8318271447979, 16.9384257460335, 66.7528590475565, 72.7664750532169, 86.8409342723528, 42.6672130775794, 99.405982755219, 9.87878796385573, 74.0013561791278, 73.1367197183745, 95.3562400020557, 69.6064585052911, 74.8777135121351, 78.0631738216763, 93.8781220125682, 56.9874829819862, 61.3674564946833, 63.7014637339631, 72.5482760946146, 88.150868900621, 59.5874643583287, 36.0187577356162, 75.6129656479724, 58.5589693499633, 61.5365704196823, 45.4041207738696, 13.9846302678307, 68.6129614502687, 81.1038195579554, 54.9328748464894, 56.0090012748281, 63.7824110302102, 71.9080963099627, 76.2898655697447, 68.1971407037222, 1.79949925742100, 34.2445376879174, 67.752421253536, 70.0160933011249, 59.9881388477488, 62.1375791537896, 67.5026055163477, 55.4749773697637, 67.6559503769167, 99.8921368552586, 99.7317640238283, 59.5870514252659, 61.1156890017716, 67.7897419835883, 93.7373116639762, 64.8624836653151, 66.1630357404153, 70.3541452797023, 50.3392945568402, 60.5756891936938, 65.6381806437015, 70.7699265549355, 84.263331400059, 36.1455168687146, 63.4268691110022, 50.8403640938551, 84.6038580009723, 99.253448377888, 44.5136280754846, 18.3862017952805, 35.7157337732417, 84.9943843632923, 96.2500336638768, 51.939143733573, 73.937482003108, 20.8390646918768, 13.3791143487625, 2.59180364981103, 16.35253761228, 78.7863353881487, 77.0761412272873, 12.7493216227156, 97.408350521328, 2.360943911914, 49.5031567931881, 40.9086587196003, 89.0041084624836, 0.153641843226189, 0.7205303565414, 2.12973220584209, 1.95184155151989, 2.36672693229437, 3.97881615724853, 4.6945903958973, 4.97023833854362, 5.02848534249433, 5.93632710737556, 6.5305134302309, 7.18124749660055, 7.59205544134417, 8.11782658102872, 9.7053179911583, 9.69966472967054, 10.7491681958896, 11.7805969476189, 11.8846419362548, 13.2638113615252, 13.6102190943924, 13.3331649454155, 13.3510625511294, 14.2866348278910, 14.9188862315656, 17.1073522001289, 17.3771351386274, 17.4970376938342, 17.6769213814467, 18.2937976371715, 18.1794471174431, 18.4072881564515, 20.2907827372874, 20.7863900870053, 20.8977102997940, 20.7898134065768, 21.4861476674877, 21.7151264355786, 22.4866743996941, 22.9652880267625, 23.4036320422319, 24.3239211351899, 24.5629717030476, 24.9067464934910, 25.3250969786023, 25.569835321831, 25.214928868463, 26.3005548932358, 26.5032754860593, 27.9258713661520, 28.3114428871105, 29.1348144906887, 29.5927445701307, 30.4762347883257, 30.0503599176301, 30.0058225611238, 30.1513380348103, 30.9686341509616, 31.2913000003182, 31.5440713840872, 32.7657602884727, 32.5231659352135, 32.5262426292818, 33.3124010171537, 33.8478211625125, 33.8467915869427, 33.7026977228706, 34.0596679268078, 34.7846046615822, 38.1673741083982, 37.9665159877312, 38.8029702374719, 39.0682120522177, 39.5640346008735, 39.4240171975978, 40.0765304172124, 41.6115850103115, 43.1095386110501, 43.3832096504008, 45.4365823266182, 45.5690791790302, 46.1239852830125, 46.6768080701299, 46.7602784573008, 47.285367886742, 48.2420712810108, 50.5906685558592, 50.5316655747899, 51.3195670861564, 52.8660801235275, 54.8554989863782, 54.8768757654533, 55.6908773693933, 57.0974418796826, 57.7205567191636, 57.7134194371089, 58.3266436293085, 58.6607370311536, 59.3980795544102, 59.9830194632018, 4, 3, 2, 3, 4, 2, 4, 4, 3, 3, 8, 2, 2, 6, 8, 2, 4, 6, 5, 4, 8, 6, 3, 4, 4, 2, 1, 4, 3, 4, 4, 4, 3, 7, 4, 4, 2, 6, 3, 8, 3, 2, 5, 3, 5, 8, 3, 8, 5, 1, 3, 8, 5, 7, 4, 3, 5, 4, 6, 3, 5, 3, 6, 3, 5, 1, 2, 3, 3, 2, 5, 7, 3, 7, 1, 7, 3, 6, 5, 5, 5, 2, 5, 6, 3, 2, 4, 6, 3, 2, 3, 2, 3, 2, 7, 3, 6, 4, 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 7.57114372433513, 6.85515173418126, 7.52609590470221, 3.5563844241623, 7.14112545928597, 5.12301007753458, 3.87663849439702, 5.79586417334239, 4.70184865517279, 6.21920562188609, 5.44360907485348, 4.51873716824026, 6.33491917603443, 5.20292601299676, 6.59676653073395, 5.81501493098883, 7.54559052637168, 5.6635169145202, 5.88625186391175, 6.18255547931158, 3.9011827688165, 7.92338945754762, 7.08656410296135, 7.25722570643227, 6.23413330258138, 5.88738222841769, 6.80735796658865, 5.28594790472374, 4.39548032693523, 6.12184517302476, 6.74384685192469, 7.60827115628042, 5.07457171988406, 8.50778221649775, 4.38150950099637, 7.52973226807595, 6.5506735931328, 3.87367222602665, 6.3649749543402, 5.84328626826638, 4.12479223028613, 5.88500632343836, 6.93493363615338, 6.66363247928469, 4.65955611058411, 8.15391551804086, 6.76397691227767, 5.36981173805678, 5.98744841170566, 7.11136219546026, 5.78287045204801, 6.14081537593665, 3.82726802701466, 3.20879873107543, 6.17821147407116, 7.37261655390293, 6.52738206698354, 7.04683222470034, 4.8916109987783, 6.56523496429719, 6.83082908120187, 7.87149902967823, 5.62770948691443, 3.2651491532768, 3.59665266985329, 6.54074671207657, 5.77568350127988, 5.96246550437346, 7.05488722838375, 6.38605274449675, 4.96442316344611, 6.48378363921246, 3.84255493400238, 4.38857837779543, 6.19366965736775, 4.84260035340659, 5.07260834973452, 2.88965797522147, 7.15143574153486, 7.12539568924814, 7.40644952344348, 6.59220641889174, 4.81483959103117, 5.32577121795078, 4.23104750753301, 8.90629459075072, 7.92242700824242, 6.06571137725015, 6.31187612654388, 6.60321800321983, 5.8189575929551, 7.40216872384802, 5.58163040684314, 4.68926346360419, 4.50539905884038, 6.21368299483713, 3.96679382670128, 5.61336655902108, 3.52559103095651, 6.69183050760578), .Dim = c(100, 5), .Dimnames = list(NULL, c("x1", "x2", "x3", "x4", "x5"))) rgl/inst/demodata/region.dat0000644000176000001440000052544411257014121015606 0ustar ripleyusersstructure(c(3.71114253706474, 4.01779675877195, 4.28656904179763, 4.50076660092056, 4.64619071647352, 4.71349254349867, 4.70016541088465, 4.6115552355105, 4.46032928164021, 4.26421093830594, 4.04246933185776, 3.81237141855995, 3.58704556714176, 3.3755855810663, 3.18495554003389, 3.02218397671240, 2.89530357041327, 2.81254466310459, 2.78056540241673, 2.80300294351220, 2.88011139818937, 3.00931780934633, 3.18596283700096, 0, 0, 0, 0, 4.4710591748498, 4.70948819878899, 4.89872181207017, 5.02051921157744, 5.06013125543746, 5.00806359728137, 4.86128360217772, 4.62371056612909, 4.3059981576005, 3.92478071983061, 3.50164515839338, 3.06203621718930, 2.63406742028284, 2.24685725266602, 1.92776393521573, 1.69808969649104, 1.56769252810029, 1.53026304325852, 1.56198954045970, 1.62591227445305, 1.68203461740870, 1.70009636765875, 1.66977099576159, 1.60362803966042, 1.53152411467252, 1.48923433055194, 1.50658148407650, 1.59976708640559, 1.76980341966483, 2.00588212663519, 2.29087619783296, 2.60634981646881, 2.93570324219523, 3.26537586715308, 3.58475345647643, 3.88553154486786, 4.16105219094723, 4.40584254917525, 4.61538792773383, 4.78608624645687, 4.9153144358217, 5.00154838089022, 5.04449334533078, 5.04519407167202, 5.00610295131046, 4.93109270334441, 4.82540890084237, 4.69556887426935, 4.54922639597066, 4.39503116727252, 4.24250812929838, 4.10195127908395, 3.98426397117676, 3.90059628895129, 3.86157237320898, 3.875930868916, 3.94857501129059, 4.07834266816769, 4.25616177675292, 4.46446713258873, 4.67862714035609, 4.87058793953534, 5.01412481357765, 5.09033389715201, 5.09168693783603, 5.02332625411098, 4.90119624927908, 4.74770066164599, 4.58635961145821, 4.43710111451504, 4.3133594571693, 4.22135156130706, 4.16114656990489, 3.89700585253865, 4.22886109942203, 4.51989598517139, 4.75159744128911, 4.90823191543841, 4.97952661958404, 4.96293748642882, 4.86476859750004, 4.6994670657364, 4.48686171586016, 4.24795638915308, 4.00078219162283, 3.75810141673599, 3.52794979776719, 3.31638022180937, 3.13041853986297, 2.97924097477999, 2.87297940538678, 2.82023105721542, 2.82600130300695, 2.89112371800521, 3.01296791072630, 3.18648583748062, 0, 0, 0, 0, 4.50221868296492, 4.7516899946142, 4.9516531839248, 5.082955652852, 5.1300650773303, 5.08292656463883, 4.93823727132185, 4.69997410774362, 4.37919223567675, 3.99328528742998, 3.56498907339343, 3.1213377615046, 2.69250181926538, 2.31002585322016, 2.00370441153561, 1.79658133865914, 1.69859792364187, 1.70098738444312, 1.77466075574443, 1.87532702065300, 1.95543750057437, 1.97928918103662, 1.93507581107475, 1.83836096274211, 1.72538731886278, 1.63955718677841, 1.61732045387912, 1.67905006815417, 1.82715792126502, 2.05006946864233, 2.32873107131955, 2.64253414898331, 2.97302597060795, 3.30531446627761, 3.62793280033241, 3.93205639715069, 4.21068787819006, 4.4580836524531, 4.66946367582298, 4.84094343206792, 4.96960661004997, 5.05364903135097, 5.09254206573137, 5.08717842625571, 5.03997454196596, 4.95491342105982, 4.83752207099119, 4.69478986941448, 4.53504840526328, 4.36784376135249, 4.20382689937575, 4.05465166788792, 3.93279588797054, 3.85112544719211, 3.82195505112571, 3.85539873784604, 3.95701349573957, 4.12511594726059, 4.34857545942243, 4.60613454167730, 4.86814875657774, 5.10098478490398, 5.27333376568751, 5.36279239738902, 5.36069847492058, 5.27363958658383, 5.1211611847113, 4.93051219370601, 4.73020510080281, 4.54435513247573, 4.38920343104757, 4.27226439017113, 4.19362928795208, 4.07491302868166, 4.43137640497536, 4.74406166052454, 4.9926297010233, 5.15982359856952, 5.23448867730731, 5.21412680149075, 5.10612385396442, 4.92684837773999, 4.69834717863986, 4.44338253639325, 4.18064029313238, 3.92227731972436, 3.67496540712135, 3.44357440615526, 3.23497684833404, 3.05949095243323, 2.92925673262058, 2.85494715648567, 2.84303490375728, 2.89496815677644, 3.00804511559018, 3.17680092865961, 0, 0, 0, 0, 4.51256600745384, 4.77118198839211, 4.98039115601543, 5.12027121224973, 5.17461961486849, 5.1328918519855, 4.99153538658068, 4.75455222836937, 4.43331664565167, 4.04585702517308, 3.61590167934052, 3.17189678677550, 2.74588183039085, 2.37164001810793, 2.08122868154864, 1.89929185486929, 1.83576647020625, 1.87941363534475, 1.99593213579537, 2.13383002199728, 2.23816559651834, 2.26793236038767, 2.20992248050721, 2.08269328009899, 1.92880792169203, 1.79920002605776, 1.73685986555595, 1.76628213628716, 1.89127491418130, 2.09953411782598, 2.37014302001071, 2.68039813788614, 3.01007734098488, 3.34304116504317, 3.66705045981566, 3.97283202531075, 4.25310580572896, 4.50189387402052, 4.71416321029967, 4.88573462611568, 5.01336445036647, 5.09491781913378, 5.12957205259379, 5.11800578767904, 5.06254334590535, 4.96723546090745, 4.83786880428998, 4.68190988310029, 4.50840402964777, 4.32786160512497, 4.15215729250468, 3.99442669625632, 3.86885892017108, 3.79017369120736, 3.77249647693588, 3.82739440219987, 3.96108511064196, 4.17127365178147, 4.4445675267108, 4.75570559773734, 5.06964350463872, 5.34676455354722, 5.55032940147435, 5.65421722586217, 5.64858771723579, 5.54160930140493, 5.35670754719982, 5.12633272245133, 4.88434721757477, 4.65934894211133, 4.47058257016638, 4.32695132260256, 4.2285720486294, 4.24122540292336, 4.62116113538191, 4.95438657223701, 5.21876415677214, 5.39555008410446, 5.47275846063356, 5.44800604047671, 5.32984611012871, 5.13665838969873, 4.89277650468045, 4.62273732336765, 4.34582023497493, 4.07343636722213, 3.810702008461, 3.56110913684306, 3.33122436372728, 3.13241919836277, 2.97880859607307, 2.88313687697481, 2.85334285313893, 2.89148043165617, 2.99476492550612, 3.15731440882888, 0, 0, 0, 0, 4.50171657383887, 4.76725753659364, 4.98391420212611, 5.13116282900903, 5.1922661357174, 5.15627751914707, 5.01942414072968, 4.78570024311716, 4.46670539018071, 4.08095251099637, 3.65296076842997, 3.21233916861373, 2.79270466101750, 2.42975911543662, 2.15750800485746, 2.00194697805369, 1.97290760545717, 2.05680079909251, 2.21448505094414, 2.38783204204583, 2.51511906195553, 2.55050705299750, 2.47956187763093, 2.32366368567253, 2.13125434717041, 1.96024829618887, 1.85969010927111, 1.85789019005685, 1.95995656723782, 2.15292894462235, 2.41419938144864, 2.71917457572363, 3.04605980854715, 3.37763903739759, 3.70104207993791, 4.0066596719188, 4.28701275012887, 4.53594203423922, 4.74818224238988, 4.91924859716058, 5.0455312332008, 5.1245042206177, 5.15497690116675, 5.13733511295875, 5.07373669524447, 4.96823945877397, 4.82685190757809, 4.65751022716956, 4.47000078714063, 4.27586004803647, 4.08827750731205, 3.92198115254226, 3.79298841716358, 3.71798094621164, 3.7129773306653, 3.79103740160411, 3.95902096501416, 4.21393440130147, 4.53996622440893, 4.90763596210863, 5.2762508723412, 5.59996715677052, 5.83641800129229, 5.95565099187045, 5.94663664988127, 5.81921394310418, 5.60085503437514, 5.32941642729954, 5.04431237182853, 4.77878912630848, 4.55520577161284, 4.38390793508276, 4.26504410647743, 4.39225106037538, 4.79396804520538, 5.14611996984028, 5.42483326807406, 5.60993793463673, 5.68867132093289, 5.65880980205548, 5.53010717831344, 5.32297639746498, 5.06405217388541, 4.77965665147626, 4.48967031795952, 4.2047542989952, 3.92843467196028, 3.66273953019106, 3.41378301857579, 3.19379583799207, 3.01865975830088, 2.90300820605021, 2.85611884970752, 2.88058823266243, 2.9735423438331, 0, 0, 0, 0, 0, 4.46990199737718, 4.73987574167139, 4.96190456482528, 5.11505470389628, 5.18220991309226, 5.1521245533833, 5.02084405362733, 4.79232338272826, 4.47828509589732, 4.09755449206992, 3.67519853986911, 3.24167134108731, 2.83177400292007, 2.48267477890587, 2.22987001970025, 2.10034909124184, 2.10372263900162, 2.22431142235542, 2.41881776360557, 2.62348424628304, 2.77088172818290, 2.81114872275059, 2.72890006867141, 2.54799419315954, 2.32192590149148, 2.11457523794484, 1.98014614227148, 1.95019548051183, 2.03093866001168, 2.20886850617957, 2.45996734876978, 2.75808668983349, 3.08017203900379, 3.40819131657945, 3.72884861202347, 4.0323551632616, 4.31114613407575, 4.55895262928926, 4.77030771005267, 4.94041222908187, 5.06524654553613, 5.14182247384686, 5.1684913753007, 5.14524718176656, 5.07398365091871, 4.95868121045947, 4.80551075245565, 4.62285369501289, 4.42125318798466, 4.21332585330744, 4.01365902931349, 3.83866990671195, 3.70629693370025, 3.63525496763948, 3.64349213032120, 3.74555519446323, 3.94889875892279, 4.2497504163714, 4.62978257035287, 5.05520033820381, 5.47958685929801, 5.85082565729932, 6.12090902055605, 6.2560655785137, 6.24410445923309, 6.0965665384933, 5.84499696590647, 5.53267619305043, 5.20458022402375, 4.89860926258534, 4.64024189155383, 4.4412730926733, 4.30189217947355, 4.52437843842459, 4.94563928171095, 5.31461493278886, 5.60579355197354, 5.79766253426646, 5.87673715030005, 5.84096762741382, 5.70128032214276, 5.48006656370948, 5.20621525860416, 4.90783916928748, 4.60550604955838, 4.30927790978361, 4.02123569485505, 3.74198478298928, 3.47705295448595, 3.23922363790154, 3.04574632229705, 2.91276616126612, 2.8506343693205, 2.86236864768995, 2.94500619894028, 0, 0, 0, 0, 4.12222479140656, 4.41797158524696, 4.68967588389628, 4.91477578678273, 5.07213798082884, 5.14444018331966, 5.1202545958934, 4.99549272909628, 4.77404215624414, 4.46764166314082, 4.09524084058210, 3.68217814680073, 3.25937678434531, 2.86233933325241, 2.52912956051951, 2.29614783229777, 2.19091846344185, 2.22269982825905, 2.37410529101064, 2.59864656642528, 2.82834566045499, 2.99156227602585, 3.03553236305217, 2.94428795541026, 2.74366537143984, 2.49103886233603, 2.25481679152423, 2.09309511383225, 2.03986703294317, 2.10217310107382, 2.26609933197402, 2.50659806475214, 2.79641767544558, 3.11166318452061, 3.43383089199968, 3.74946598763345, 4.04880064228538, 4.32432820259532, 4.56976229176694, 4.77947640978951, 4.94835162817009, 5.0719107669163, 5.14662085877274, 5.17026705559572, 5.14232768936262, 5.06430542447896, 4.93998767039331, 4.77561956268827, 4.57998103510349, 4.36437362187791, 4.14254024951007, 3.93054203452818, 3.74656882028543, 3.61054702563459, 3.54325576201809, 3.56455833759209, 3.69043278348098, 3.9288500657618, 4.27518835558542, 4.70857618845026, 5.19094717819963, 5.67028165339388, 6.08837049564086, 6.39176004025996, 6.54301567131396, 6.52885584921441, 6.3624875003779, 6.07939557972459, 5.72808957229962, 5.35889914276413, 5.01420232528685, 4.7224820692474, 4.4969364326753, 4.33780790914313, 4.63421938830739, 5.07227150071444, 5.45551299468007, 5.7569257384984, 5.95375956164311, 6.03186111487858, 5.98933751524211, 5.83819900578265, 5.60268443709929, 5.31382887495504, 5.00153336867663, 4.68721254691924, 4.3806286030896, 4.08273662556706, 3.79288595030719, 3.51590031888879, 3.2647051722316, 3.05733804039149, 2.91089328509889, 2.83639988339644, 2.83712101701803, 2.91001356693944, 0, 0, 0, 0, 4.0543607583253, 4.34736224864797, 4.61795771556188, 4.8436641730507, 5.00337316297953, 5.07974246107731, 5.06129049907384, 4.94385172790372, 4.73122381735371, 4.43505553174343, 4.07422493220536, 3.67404450441306, 3.26548937511235, 2.88421419523044, 2.56851599557929, 2.35501014538399, 2.27121533388073, 2.32588941918418, 2.50041178801474, 2.74628426000971, 2.99302708185691, 3.16661181858213, 3.21273515564775, 3.11529049044952, 2.901474139069, 2.63109859583607, 2.37533608091850, 2.19461689755169, 2.12437094604672, 2.17210895143643, 2.32367111983467, 2.55343394154111, 2.83358575614840, 3.13989495230659, 3.45379970060349, 3.76200642296972, 4.05500907683318, 4.32553334507004, 4.56738891660688, 4.7748450398943, 4.94246285798426, 5.06525723075913, 5.13905691870026, 5.16095262730448, 5.12975404584442, 5.04640853204392, 4.91435404130698, 4.73978391717514, 4.53180134197104, 4.30245183870978, 4.06664520380553, 3.8419899662917, 3.64852363251879, 3.50820520953431, 3.44387022921621, 3.47723195202623, 3.625593168207, 3.89733066737768, 4.28691161216511, 4.77096401128823, 5.30733666655624, 5.83873597184363, 6.30127921832531, 6.63648269389814, 6.80355558332298, 6.78824153148795, 6.60530669563235, 6.29387482578498, 5.90726611599113, 5.50072664962259, 5.12074485150309, 4.79856590173797, 4.54868793977738, 4.37142159085302, 4.7187537334399, 5.17038151825482, 5.56492718242987, 5.87402972368622, 6.07382604157255, 6.14954753947655, 6.09941609168555, 5.93638765885159, 5.68635505133456, 5.38233892247458, 5.05601431996438, 4.72985390975367, 4.41373154731433, 4.10793127797224, 3.81081313222161, 3.52639439536079, 3.26725180149393, 3.05149037241562, 2.89644672123608, 2.81333110434166, 2.80543617425376, 2.86965475010813, 0, 0, 0, 0, 3.97276990451914, 4.26003827386985, 4.52662843436359, 4.75038429011679, 4.91045465809386, 4.98967195069152, 4.97663788054682, 4.86717522795664, 4.66497712374533, 4.38150211772178, 4.03536286842535, 3.65154249683142, 3.26063219669426, 2.89785357656792, 2.60102157708710, 2.40621480555622, 2.34035190548911, 2.41152425671554, 2.60039579848306, 2.85775890850993, 3.11252956113543, 3.29030690300051, 3.33675835840157, 3.23613351553983, 3.01630841857296, 2.737940830149, 2.47301318314949, 2.28256188320369, 2.20233976406911, 2.2399254990554, 2.38108202905808, 2.60010443649768, 2.86921683847191, 3.16440717976567, 3.46751559778716, 3.76576988490860, 4.05020054491997, 4.3139677763999, 4.5511127295829, 4.75587093369906, 4.92249161473922, 5.0454315521492, 5.1197785152016, 5.14177936138252, 5.10938726619937, 5.02278285546114, 4.88484459005568, 4.70153796336422, 4.48217798052837, 4.23952307863794, 3.98969096073363, 3.75191916753923, 3.54817065938062, 3.40246917042756, 3.33966775355409, 3.38321937126527, 3.55159762097857, 3.85344158868433, 4.28224854432901, 4.81225009743090, 5.39753065171361, 5.97605304705234, 6.47891727676002, 6.84324649908228, 7.02535203845866, 7.01016403787899, 6.81383246277487, 6.4786560782124, 6.06213079339533, 5.62375927405432, 5.21358637646652, 4.86525276239859, 4.5943970849878, 4.40141421275043, 4.77546662845339, 5.23706235859208, 5.6396119297589, 5.95360135952351, 6.15419628043112, 6.2260694989708, 6.16750298426093, 5.99223302771255, 5.7275764863723, 5.40834472437697, 5.06795586800001, 4.73016670230584, 4.40542273210376, 4.09385713114715, 3.79315858297812, 3.50644401879233, 3.24540859071695, 3.02742952271926, 2.86930348489247, 2.78187582184568, 2.76823579037145, 2.82523519053189, 0, 0, 0, 0, 3.87978717178604, 4.15840456595246, 4.41811953779152, 4.63735115314415, 4.79573949470505, 4.87648947745451, 4.86842849995224, 4.76744071693814, 4.57711001969853, 4.30861626343306, 3.98012512985339, 3.61599788647548, 3.24601284159768, 2.90437370106838, 2.62768987153482, 2.45073550259769, 2.39921458462532, 2.48036807259369, 2.67465472685892, 2.93346486607224, 3.18703015316856, 3.36262512130317, 3.40742927317881, 3.3065633091387, 3.08790545990051, 2.81135161723768, 2.54771570179163, 2.35688407219232, 2.27379476309823, 2.30567581129097, 2.43837355966422, 2.64659616284687, 2.90320645446021, 3.18498162837201, 3.474642893516, 3.76032259671493, 4.03388750059585, 4.28915894929571, 4.52056679695071, 4.72240115387749, 4.888619823768, 5.0130766434524, 5.09001008090792, 5.11465230098389, 5.08387080641865, 4.99680776886555, 4.8555012931597, 4.6654467300428, 4.43601388338495, 4.18062732793338, 3.91666534239503, 3.6651017464766, 3.4499250982844, 3.2972618002663, 3.23392854340511, 3.28497616207010, 3.46985570012423, 3.79728930839534, 4.25973082572584, 4.82915138004083, 5.45629424288163, 6.07508712789851, 6.61249218490676, 7.00208872258732, 7.19789390827433, 7.18423025782933, 6.97839584318949, 6.62525644206309, 6.18565703788797, 5.72249974146896, 5.28866546469499, 4.91971103171681, 4.63220334211714, 4.42663627985062, 4.80247001974546, 5.27011984986897, 5.67710917415651, 5.99297990875967, 6.1920811930721, 6.25859178170409, 6.19080433947539, 6.0030744433197, 5.72391457799209, 5.38972528172021, 5.03561747695123, 4.68682724142573, 4.35479710821947, 4.04000121045724, 3.73975859791, 3.45618724819807, 3.19957112216633, 2.98577352569701, 2.83028377649005, 2.74305417182548, 2.72675266739475, 2.77821840223208, 0, 0, 0, 0, 3.77799821273446, 4.0451988389428, 4.29527887839908, 4.50747407829273, 4.66214473016431, 4.74306393537978, 4.73942888709712, 4.64726453978517, 4.47005239376277, 4.21862203745574, 3.91053285711592, 3.5692593131588, 3.22337051905335, 2.90550429476842, 2.65037921316086, 2.49072978166204, 2.45044578003383, 2.53571639760076, 2.72724328731843, 2.97821386434215, 3.22195787365123, 3.38934015348133, 3.43050612202610, 3.33195066185616, 3.12094566484782, 2.85514474475821, 2.60235786695393, 2.41968393932387, 2.34017744180246, 2.37031303278676, 2.49615784678524, 2.69328648233986, 2.93576354761783, 3.20169818691637, 3.47516141836105, 3.74557766914899, 4.00596416322597, 4.25104989168577, 4.47583230700778, 4.67476556528333, 4.84155526598606, 4.96942026972381, 5.05164194277751, 5.08224630517719, 5.05673694463811, 4.97286837074075, 4.83146355008879, 4.63721748976397, 4.39934022568186, 4.13186305316887, 3.85350688050387, 3.58714199106592, 3.35893523856651, 3.19718841270064, 3.13063968044945, 3.18578743988191, 3.38284051465872, 3.73038101535741, 4.21969441824634, 4.82060119165937, 5.48097166753056, 6.13154589915124, 6.69623301907905, 7.10612256961282, 7.31368087262304, 7.30287233450894, 7.09185969716232, 6.72735312017427, 6.2725696847365, 5.79279915422354, 5.3429061428228, 4.95979278259604, 4.66069645025358, 4.44621974538603, 4.79860028523471, 5.26818118744296, 5.67586205647178, 5.99045848687793, 6.18566518356959, 6.24524371809209, 6.16747362750522, 5.9672101989973, 5.67398017565461, 5.32560026115805, 4.95880616361247, 4.60043058473645, 4.26321394554523, 3.94833086278696, 3.65293865547108, 3.37803332202554, 3.13200584711355, 2.92851767527852, 2.78109765660189, 2.69837299276269, 2.68242570116859, 2.73011443197831, 0, 0, 0, 0, 3.67012243594377, 3.92336961540529, 4.16124489744943, 4.36402907112446, 4.51302016005368, 4.59274747878707, 4.59291996744294, 4.50978748110112, 4.34674844919528, 4.11423170043855, 3.82906175490214, 3.51360340906885, 3.19487578232719, 2.9034725414926, 2.67161600734074, 2.52934242352246, 2.49817540779703, 2.58303543420119, 2.76520599139444, 3.0006606739691, 3.22732978128740, 3.38130321466654, 3.41695207805157, 3.32260734787202, 3.12445336790189, 2.87667284560786, 2.6425295108776, 2.47494704538026, 2.40417987802154, 2.43559163585020, 2.55557107065122, 2.74093494065728, 2.96743054869448, 3.21497767734516, 3.4694279090718, 3.72187123433537, 3.96679308934991, 4.20009137352893, 4.41753157285494, 4.61386708248057, 4.78261784834966, 4.91635929340923, 5.00731746407215, 5.04810232990364, 5.03251676161986, 4.95647863238416, 4.8190966484354, 4.62381882883875, 4.37940811596318, 4.10043587619462, 3.80710271694531, 3.52442723654263, 3.28100292878479, 3.10745670064492, 3.03445813751898, 3.08983017901495, 3.29431218824815, 3.65606030142776, 4.16494679171776, 4.78862365602126, 5.47250834207583, 6.14509006302842, 6.7285090651162, 7.15263446380243, 7.36926941872251, 7.36231427498401, 7.15047829911452, 6.78151390553348, 6.3199354818303, 5.83230999794829, 5.37454732821478, 4.9842607055508, 4.6790643453964, 4.45966912577065, 4.7634856335994, 5.23076900575989, 5.63529075412713, 5.94535452443002, 6.13416198359387, 6.18514947255902, 6.09660462278803, 5.88384180215846, 5.57731514373678, 5.21615202759857, 4.83863476552199, 4.47319293099221, 4.13395930843905, 3.82293806528228, 3.53716203774516, 3.27633243203328, 3.04654801236977, 2.85875886266293, 2.7240914258893, 2.6495936061982, 2.63669325733159, 2.68230312557212, 0, 0, 0, 0, 3.55889181126306, 3.79594771068907, 4.01931107143418, 4.21051792131906, 4.35200445658842, 4.42923138352605, 4.43255526596698, 4.35853750062431, 4.21052526831992, 3.99851988778449, 3.73851929427134, 3.45160874590754, 3.16298948564507, 2.90082773675253, 2.69435640992194, 2.5703659877223, 2.54753586126203, 2.62928854357335, 2.79768573910094, 3.01219107666590, 3.21645166373023, 3.35302627013252, 3.38149648473676, 3.29242683457909, 3.11060265631865, 2.88585172770531, 2.67575439064467, 2.52801921172838, 2.46939931592673, 2.50385738417156, 2.61815868255717, 2.79063294160187, 2.99907671408684, 3.22560597861603, 3.45822286881537, 3.69002612717348, 3.91728021029953, 4.13732273336216, 4.34690939191277, 4.54125968138225, 4.71381302806997, 4.85653078244177, 4.96050740798815, 5.01671212005329, 5.01684043272585, 4.95439695021873, 4.82611405788608, 4.63359335579182, 4.38477145477466, 4.09469359599033, 3.78526629606398, 3.48405142062912, 3.22247076890368, 3.03376104727827, 2.95064289135499, 3.00222025713222, 3.20955346363039, 3.57998755983265, 4.10150103756086, 4.73926847566972, 5.43648881936621, 6.12037394678793, 6.71280568240996, 7.14396878714872, 7.36606453278633, 7.36327269215247, 7.15450409877892, 6.78770415429329, 6.32756779313453, 5.8407931148302, 5.38336348402251, 4.99293816218283, 4.68718950595144, 4.46691971061376, 4.69757891029593, 5.15833718320386, 5.55582856579325, 5.85804226439464, 6.03783803563582, 6.07843403802448, 5.9782073782275, 5.75300153549868, 5.4342476440385, 5.0623829469143, 4.67716123492882, 4.30846801165701, 3.97165680185852, 3.66938359593077, 3.39835858017991, 3.1567365882599, 2.94802503287358, 2.78019128707897, 2.66181278484295, 2.59836226726451, 2.59068853468894, 2.63579375395151, 0, 0, 0, 0, 3.44693260499254, 3.66591909353684, 3.87278899234073, 4.05052278041977, 4.18287369302662, 4.25639153578144, 4.2622064772513, 4.19727810136438, 4.06494567962549, 3.87478083678907, 3.64190313848658, 3.38600753643480, 3.1302926568833, 2.90022415967459, 2.72168450510276, 2.61780382286102, 2.60403081730423, 2.68205361867667, 2.83475031096862, 3.02545346316872, 3.20419874371826, 3.32080452789023, 3.34072612333029, 3.25707944082382, 3.09313046323638, 2.89386250328332, 2.71050184252012, 2.58490456492980, 2.53987223674973, 2.57775810509896, 2.68570866826787, 2.84371768025971, 3.03186441761490, 3.2347352122373, 3.44277607762599, 3.65139453604868, 3.85892854314071, 4.06443074725669, 4.26589154423311, 4.45920230865071, 4.63787942450616, 4.79335499867336, 4.91555325333559, 4.99356849345013, 5.01649976832395, 4.97470124064199, 4.86165776558416, 4.67632840308658, 4.42532897311606, 4.12412219381925, 3.79667769381832, 3.47370220716348, 3.1900731270557, 2.98213144353705, 2.88495564266196, 2.92903863614969, 3.13560230704533, 3.51063656133243, 4.03933253218333, 4.68354556016222, 5.38411550899288, 6.06794065661645, 6.65846353627748, 7.0881032627675, 7.31076184568369, 7.31130239155569, 7.10846201214203, 6.74950276616621, 6.2981912279164, 5.82023721715296, 5.37074647706468, 4.98676170346079, 4.68568020452808, 4.46835448130839, 4.60215383659388, 5.05226742776673, 5.43891969104848, 5.72995327304418, 5.89801692942429, 5.92622972127119, 5.81320742197126, 5.57552300620124, 5.24579898853505, 4.86591441281175, 4.47703875130912, 4.11022672391526, 3.78158811108863, 3.49390500928120, 3.24308915916836, 3.02538968250961, 2.84152048657846, 2.69646476542108, 2.59646435043476, 2.54575487559735, 2.54487406447010, 2.59094677305295, 0, 0, 0, 0, 3.33665719647678, 3.53610669512673, 3.72487822429742, 3.88756488980770, 4.00939130688132, 4.07813280841131, 4.08580568729736, 4.02985149668746, 3.91365442663768, 3.74637764030111, 3.54225028317313, 3.31952628563305, 3.09930249040823, 2.90418533796918, 2.75648424196924, 2.67539528529486, 2.67285012869733, 2.74856602238639, 2.88612093755650, 3.05276886421297, 3.20515479320831, 3.30068473203858, 3.31101972959487, 3.23205880337121, 3.08561788191272, 2.91174422699507, 2.75511253171016, 2.65149904924011, 2.61956085029432, 2.65991867187630, 2.76005604427085, 2.90166058375622, 3.06719064523968, 3.2438592740398, 3.42476481264968, 3.6078714589543, 3.79386080942959, 3.98377555355549, 4.17710831013604, 4.3706750550028, 4.55829441326756, 4.7310296683252, 4.87765208755995, 4.9851447288948, 5.03942606726333, 5.0267668491283, 4.93627330280364, 4.76322009932108, 4.51226584406615, 4.19925375346751, 3.85075130384167, 3.50149033381804, 3.1907404033999, 2.95874060952439, 2.84351757830052, 2.87730400737198, 3.08141353219187, 3.45969318691837, 3.99299890232162, 4.6381704789745, 5.33293446850391, 6.00479717775991, 6.58103895596515, 6.99880610184325, 7.215358359247, 7.21672436277878, 7.02104281064125, 6.67398971985216, 6.23733798050489, 5.77477054362346, 5.33963458646905, 4.9677268484968, 4.67583093682652, 4.46477635134101, 4.47926509606809, 4.91482817825166, 5.28698242329011, 5.56355255431041, 5.71707883282257, 5.73070678084673, 5.6035057911057, 5.35311112710058, 5.01372233718404, 4.62893586750874, 4.24131480388836, 3.88266603637585, 3.56911035028463, 3.30268521238054, 3.07773961839196, 2.88812668375766, 2.73163941325851, 2.61054677043347, 2.52936888944549, 2.49184180398565, 2.49870155329940, 0, 0, 0, 0, 0, 3.23017308556017, 3.40906799032475, 3.57855020799175, 3.72497534993697, 3.83516794636285, 3.89824116634359, 3.90719331057992, 3.86002572242012, 3.7602268320787, 3.61659294495419, 3.44248712307173, 3.25472765361836, 3.07229114563930, 2.91487484108862, 2.8011248718597, 2.74616591476099, 2.75822653530803, 2.83482562398059, 2.95999120091270, 3.10465835665471, 3.23189208047814, 3.30658960326434, 3.30664250881027, 3.230879776214, 3.0999036661104, 2.94909257748605, 2.81680175405271, 2.73287461221186, 2.71186749418326, 2.75262609604792, 2.84288421813823, 2.96594285597348, 3.10660817077224, 3.25476307583297, 3.40628074223116, 3.56187250678000, 3.72480266294644, 3.89837378190258, 4.08387148675017, 4.27934362658137, 4.47921957278528, 4.67445046343636, 4.85274751112202, 4.9987535163439, 5.09451770022406, 5.12106641091667, 5.0616877091622, 4.90663578065608, 4.65780570637303, 4.33141124723265, 3.95737499831703, 3.57568492909152, 3.23133501077393, 2.96965110914430, 2.83258760726373, 2.85481264661715, 3.05779381541624, 3.44210288909926, 3.98177775273799, 4.62572292632957, 5.3069194193525, 5.95434525584665, 6.50205366900407, 6.89523167870392, 7.09665432697269, 7.09409918614135, 6.90460025584298, 6.57130051258724, 6.15297636131757, 5.71036744799306, 5.29429220278684, 4.93873052332892, 4.65951484307744, 4.45733782852156, 4.33167479118716, 4.74909910063414, 5.10334209735486, 5.36229619107485, 5.49846336248573, 5.49514087676297, 5.35211964347078, 5.08854273463045, 4.74072171474158, 4.35437588265863, 3.97347988957932, 3.63007770987852, 3.33932666269526, 3.10135509648407, 2.90792391225931, 2.74986011270857, 2.62194916591391, 2.52426041983072, 2.4606168066579, 2.43543542182541, 2.45043950744652, 0, 0, 0, 0, 2.97344218018593, 3.12921608661597, 3.28701407566672, 3.43645213099226, 3.56578448860047, 3.66353842806582, 3.72025128160923, 3.72997992123203, 3.69135414653498, 3.60802865711773, 3.48849020909223, 3.3452904882166, 3.19386559091311, 3.05112343314247, 2.93389702996387, 2.85719566616386, 2.8320574429166, 2.86291610088224, 2.94488459695206, 3.06209302955571, 3.18868524901235, 3.29362421082383, 3.3488525175471, 3.33825944936905, 3.26367282051659, 3.144845635162, 3.01304121369429, 2.90087499419422, 2.83270996951723, 2.81924091573587, 2.85756488811465, 2.93554698813950, 3.03793126398214, 3.15173279579461, 3.26944748333081, 3.38976442452100, 3.51627269359202, 3.65502131737835, 3.81183198170264, 3.99009599803087, 4.18946013319694, 4.40536874700664, 4.62903177529908, 4.84728759143595, 5.04222914967591, 5.19124105222819, 5.26869587263126, 5.25028022328335, 5.11955915865457, 4.87466338821773, 4.532196732451, 4.12644981139801, 3.70430667601366, 3.31828736850245, 3.02047149832711, 2.8582030784654, 2.86971551759795, 3.07686048023836, 3.47536510633018, 4.02877907539078, 4.67359920474169, 5.33531818784261, 5.9451845723945, 6.44780557744068, 6.80077245255206, 6.97517023185617, 6.96123207716454, 6.77426781787476, 6.45387392807673, 6.05489912357131, 5.63437453429027, 5.23996024422837, 4.90332532684795, 4.6390188912505, 4.4474352959063, 4.16274941799028, 4.5588652692192, 4.89213696675141, 5.13057148024099, 5.24667313206902, 5.22400969537815, 5.06339116608385, 4.78598361581786, 4.43084091263388, 4.04629681549938, 3.67778778827195, 3.35702517790374, 3.09708589854954, 2.89482980120673, 2.73821417840603, 2.61428656725282, 2.51474547462886, 2.43816872232292, 2.38908506680046, 2.37421532265966, 2.39734769007181, 0, 0, 0, 0, 2.89906013805462, 3.03511400935256, 3.1717544869414, 3.30083496397157, 3.41263464558465, 3.49746135667763, 3.54733586830952, 3.55742872391485, 3.52705455336936, 3.4600947411168, 3.36479364371859, 3.2529686886872, 3.13876446201234, 3.03712710631874, 2.96214658363033, 2.92531688215127, 2.93367673474855, 2.98785817960997, 3.08039281875047, 3.19511050554772, 3.30873662905555, 3.39537648745556, 3.43331946153897, 3.41202661423296, 3.33632538510119, 3.22556274347878, 3.10763523632784, 3.01024030310296, 2.95292957427452, 2.94291719943478, 2.97563134333662, 3.03893004687893, 3.11876653402510, 3.20414471831733, 3.29003502221851, 3.37791023170032, 3.47430721859514, 3.58821901818592, 3.72822827945377, 3.90016215909498, 4.10569332493038, 4.34178683219985, 4.60040757521324, 4.86781711600791, 5.12338335705618, 5.3389354454232, 5.48053766940134, 5.51414148822056, 5.41460771601759, 5.1750937798981, 4.81263613422296, 4.36716562102616, 3.89453348147839, 3.45709893535271, 3.11588615819973, 2.92561491280031, 2.92968434741858, 3.15074107459817, 3.57762081538562, 4.15842101728362, 4.81106543872888, 5.44960003977639, 6.00826012272442, 6.4468939322818, 6.74098990483432, 6.8734235267304, 6.83772395108897, 6.6467401631873, 6.33544635349738, 5.95392167572155, 5.55489864212975, 5.18241046913411, 4.86541006287187, 4.61683879663252, 4.43657905487276, 3.97633259201855, 4.34848512451084, 4.65819775208086, 4.87361353771054, 4.96726076030818, 4.92308577938877, 4.74321299247322, 4.45135170375098, 4.08993872162705, 3.71042586201945, 3.3597686858072, 3.06876935823662, 2.84727868731623, 2.68747467674014, 2.57222191178495, 2.48396558326460, 2.41122662993522, 2.35192102756040, 2.31297262152434, 2.30539076496224, 2.33634987114765, 0, 0, 0, 0, 2.83153026896765, 2.94878488244903, 3.06466998087394, 3.17350788351283, 3.26771921308467, 3.33944499779784, 3.38222103841321, 3.39236358276451, 3.36991325690597, 3.31903238764742, 3.24779338526998, 3.16736990205453, 3.09073063373577, 3.03100590072448, 2.99971929373339, 3.00504262922821, 3.05018334841783, 3.13203943916300, 3.24043080331649, 3.35847691968396, 3.46478465934995, 3.53771783049348, 3.56106401030619, 3.52930556952157, 3.4502126350067, 3.34319565997406, 3.23362916200651, 3.14524437108951, 3.09357270341429, 3.08281321835009, 3.10684158178854, 3.15336458952563, 3.20927529066909, 3.2652936140982, 3.31866473920329, 3.37354897164441, 3.43944047556447, 3.52838664756657, 3.65194664902691, 3.81872193526978, 4.03289005429385, 4.29353837760983, 4.59400687818541, 4.92039148599671, 5.24921202705784, 5.54578683653053, 5.76601271095609, 5.86366217923944, 5.8025601719825, 5.56948755595432, 5.18196008025102, 4.68701325790465, 4.15191648255108, 3.65170100020195, 3.25904020663015, 3.03847890775467, 3.0405808209992, 3.28934656549153, 3.76426258224486, 4.39190420179898, 5.06400119187248, 5.67812054147124, 6.17206159783088, 6.52628725261033, 6.74056390123656, 6.8135830525179, 6.74312919372171, 6.538795727515, 6.22986822826848, 5.86095679581458, 5.48011106056629, 5.12744539060914, 4.82888674493855, 4.59545438141169, 4.42625258002827, 3.77659940928052, 4.12273595443875, 4.40689908580827, 4.5973858157634, 4.66676902570298, 4.5994699087366, 4.3991830661453, 4.09260605457652, 3.72610103033774, 3.35465454598279, 3.02676345251464, 2.77178315881945, 2.59529297988016, 2.48349371245741, 2.41295368647685, 2.36072226387708, 2.31205086645285, 2.26505559285676, 2.23085989105553, 2.22691575509856, 2.26522236485806, 0, 0, 0, 0, 2.77096329340621, 2.87076905384715, 2.96671280368765, 3.05581916732458, 3.1327487301397, 3.19150094160704, 3.22712991738684, 3.23710548292177, 3.22221769137659, 3.18695348610930, 3.13928043610568, 3.08982300732643, 3.05050216558398, 3.03280126763361, 3.04588978114086, 3.09485981998592, 3.17931655856058, 3.29255697105795, 3.42161669023175, 3.54853086542541, 3.65309173939183, 3.71700770541613, 3.72866123079236, 3.68694405722511, 3.60246319274612, 3.49513881623100, 3.38867281422055, 3.30380730404465, 3.25287863497306, 3.23756772058768, 3.25033528110471, 3.27859957309134, 3.30991488733271, 3.33641828128333, 3.35738773057208, 3.37951989929339, 3.41521494618795, 3.47962907801373, 3.58747556079393, 3.75046152131317, 3.97578150974308, 4.26532167502292, 4.61452265342356, 5.0098351342609, 5.42488000707292, 5.81750101564328, 6.13145390118676, 6.30568538487825, 6.29043926040268, 6.06460491662167, 5.6461932569541, 5.09073589868851, 4.47954053853865, 3.90372457763539, 3.45080963091094, 3.19784911138688, 3.20471708495402, 3.49737243496062, 4.04330357228846, 4.74099960258526, 5.44769800618729, 6.03887265613734, 6.45620580197203, 6.706205424001, 6.81947284160728, 6.81466776571767, 6.69485543088777, 6.46567350305626, 6.14983739322152, 5.78604328356676, 5.41752870346985, 5.08038918193803, 4.79731631512887, 4.57710713573164, 4.41777495437382, 3.56789876672984, 3.88664062177226, 4.14398003768039, 4.30840904718231, 4.35258781294774, 4.26149868888499, 4.04058486472658, 3.71981627568066, 3.34980626466824, 2.98929498807042, 2.68825444087012, 2.47413356152744, 2.3474250529762, 2.28736050506937, 2.26328331975812, 2.24622513712234, 2.21811870423259, 2.17807247564713, 2.14307410392058, 2.13902119491254, 2.18407511680987, 0, 0, 0, 0, 2.71730993084346, 2.80128737521429, 2.87843071720471, 2.94866151700838, 3.00894289854844, 3.05512512882298, 3.08375472724777, 3.09343821893772, 3.08571881116011, 3.06543719139277, 3.04051362361533, 3.02111340581506, 3.01823908125481, 3.0419044316063, 3.09915538899459, 3.19227752459288, 3.31754749791225, 3.46485282263715, 3.61844149110566, 3.75896375335697, 3.86676902657477, 3.92604734095404, 3.92889620479501, 3.87799457556051, 3.78663799794285, 3.67563754095677, 3.56780013384325, 3.48179446817262, 3.42754818228495, 3.40470853466195, 3.40446729683216, 3.4138343020348, 3.42075892617112, 3.41849242211591, 3.40807720839415, 3.39854743891005, 3.40509635223444, 3.44597969383978, 3.53918995543674, 3.69984195666981, 3.93866109348705, 4.26104422598751, 4.66532438829371, 5.13891499620287, 5.65257992397829, 6.1557998494768, 6.57825048650009, 6.8413953398006, 6.87936295823035, 6.66177773471189, 6.20707552070228, 5.57980045616913, 4.87751834342646, 4.2118569150382, 3.68906500555838, 3.40114539303782, 3.41905462172027, 3.7711600857035, 4.41049646717339, 5.20147620586737, 5.95922889999484, 6.5318081425021, 6.86465366467221, 6.99473666945029, 6.98901049209942, 6.88966361922856, 6.7060372843336, 6.43945842049027, 6.10566065906394, 5.73741203369638, 5.3733344602206, 5.04561444356019, 4.77360406758822, 4.56360041958991, 4.41217936291879, 3.35459043807896, 3.64528018227744, 3.87533272162249, 4.01352653174248, 4.03269736232261, 3.91846917867983, 3.67810178899181, 3.3448831692826, 2.97367821866426, 2.62689753658539, 2.35577975751455, 2.18551410500624, 2.11103579562234, 2.10409253235635, 2.12634363401394, 2.14252027658199, 2.1313027644062, 2.09340902136285, 2.05289978831835, 2.04555121784742, 2.09663254047198, 0, 0, 0, 0, 2.67048956741527, 2.7403101211381, 2.80000791770546, 2.85249790205626, 2.897045736795, 2.93130408863033, 2.95325570572498, 2.96260215469286, 2.96162257507743, 2.95552279786498, 2.95221844823384, 2.96149366688900, 2.99355346330721, 3.05711630368322, 3.15734007875519, 3.29399366065968, 3.4603319535582, 3.64307859473147, 3.82376878676735, 3.98146838364582, 4.09657047290969, 4.15499346058377, 4.1517496628285, 4.09270922164694, 3.99366908179732, 3.87661632903924, 3.76411314559936, 3.67354609522914, 3.61312891117978, 3.58091542042977, 3.56697352847246, 3.55780953480374, 3.5415295746332, 3.51220786974913, 3.47236791686811, 3.43313995978013, 3.41233447772712, 3.43122560623353, 3.51114100479252, 3.67084734284009, 3.92507291045114, 4.28341510257027, 4.7478964843256, 5.30754978786203, 5.93043527381376, 6.55696650273776, 7.10104395721, 7.46427310426379, 7.56255284606779, 7.35557738013864, 6.86196038307621, 6.15304848396789, 5.34327441137094, 4.57152433930050, 3.96810557914353, 3.64138288183969, 3.67392464937056, 4.09648924847856, 4.84588750848624, 5.74842726648532, 6.57196816801213, 7.13324412294515, 7.38066468123711, 7.38371069389517, 7.248609170289, 7.04312311469008, 6.78370353949187, 6.46766489515861, 6.10416658622602, 5.72067473273998, 5.35179661123596, 5.02614602315886, 4.75974206394064, 4.55613964643839, 4.41011822849517, 3.14088432885009, 3.40359917705138, 3.60676320845211, 3.71960444213394, 3.71528688548001, 3.58015524186393, 3.32322138250247, 2.98084383715788, 2.61173596445998, 2.28151755556621, 2.04230118498996, 1.91678609161437, 1.89430358438933, 1.93921235769805, 2.00566091536894, 2.05229383899859, 2.05480224872650, 2.01586296148607, 1.96704779427740, 1.95444225699088, 2.01067486525502, 0, 0, 0, 0, 2.63046977257235, 2.68761707105262, 2.73131412714189, 2.76740277983112, 2.7973598705751, 2.82054288285505, 2.83628371181846, 2.84531322049920, 2.85060794524701, 2.85773040371859, 2.87461539336677, 2.91072618821718, 2.97557550025195, 3.07674910182225, 3.21774786156653, 3.39612110497025, 3.60243417321788, 3.82054361311801, 4.02943047659954, 4.20649467786359, 4.33180243812622, 4.39239221904954, 4.38550405034041, 4.3196508557569, 4.21290698684653, 4.08860583105834, 3.96955400571817, 3.87248498440708, 3.80447002321572, 3.76234600704290, 3.73519490467666, 3.70895278079344, 3.67168053857061, 3.61800484306997, 3.55163866472917, 3.48552765015361, 3.43985953795976, 3.43876635667718, 3.50688042295492, 3.66677424239622, 3.93755705020269, 4.33362279088033, 4.86140760298578, 5.51221376158566, 6.25167628668956, 7.0107485466791, 7.68636582716565, 8.15857467932695, 8.32392641277419, 8.13303033492234, 7.60407266339695, 6.80754237417285, 5.87203188539307, 4.97482452146988, 4.27840895676929, 3.90697327036445, 3.95290597301953, 4.44847755811869, 5.31366579762761, 6.33599514655835, 7.23512075028946, 7.79514546332882, 7.96582382924355, 7.8475177025166, 7.58454513129263, 7.26987077385593, 6.92758545030435, 6.5522189626106, 6.14789388996675, 5.73821695174993, 5.35484165202111, 5.02337714302335, 4.75663052458874, 4.55522559502561, 4.41180256215167, 2.93069002877573, 3.16621342559867, 3.34373683134264, 3.43318235805533, 3.40826793780982, 3.25614003066633, 2.98735867467201, 2.64079346962257, 2.27817174168776, 1.96745478985646, 1.76103502094789, 1.67901820699985, 1.70554033378606, 1.79833547838306, 1.90493548549391, 1.97870949522303, 1.99288123623077, 1.95210968295862, 1.89492051108615, 1.87682083260713, 1.93713255340154, 0, 0, 0, 0, 2.59725770492085, 2.64283211169289, 2.67195370394137, 2.69311324055598, 2.70979527898147, 2.7229103368618, 2.73302225583074, 2.74180300920132, 2.75286732365775, 2.77210521750345, 2.80747323165808, 2.86815266091363, 2.96304881818309, 3.09876039539758, 3.27735207895690, 3.49445256099218, 3.73829065635408, 3.99020139693295, 4.22685534517716, 4.4240289292659, 4.56124482128938, 4.62621212607346, 4.61783819639964, 4.54678699385445, 4.43315084203131, 4.30165808334177, 4.17567513369992, 4.07173431754297, 3.99619950990590, 3.94499474860153, 3.90634288389397, 3.86557113813202, 3.81053130875373, 3.73615530029516, 3.64704836127708, 3.55765348101761, 3.49023127474187, 3.47152649555714, 3.52934390076991, 3.69009392396166, 3.9774965673251, 4.41116734591979, 5.00251940851281, 5.74570237870044, 6.60433425266361, 7.49995654330209, 8.3121489408904, 8.89881773227751, 9.13752183331333, 8.97237491897058, 8.41976971319293, 7.53518171888935, 6.454696568358, 5.40988158394625, 4.60666567155930, 4.18227345899916, 4.23424138050449, 4.79430784416509, 5.76646354257127, 6.9030624058498, 7.88006861955056, 8.45106418152925, 8.56465289259888, 8.3459930578016, 7.97126675834142, 7.5552694545348, 7.1298401338749, 6.68900870762301, 6.23466480775634, 5.7888669128835, 5.38182586208392, 5.03692528806415, 4.76399385430463, 4.56060925389635, 4.41697980425133, 2.7274852158865, 2.93723317171141, 3.09112835111875, 3.16010727726025, 3.11873537454509, 2.95504413748439, 2.68080988036966, 2.33656658682861, 1.98582366888244, 1.69764167467021, 1.52391323912367, 1.48216566262718, 1.55217416248747, 1.68644742194713, 1.82749402365235, 1.92481678573146, 1.94996454042724, 1.90927102081138, 1.84661977158542, 1.82466243205682, 1.88777976283807, 0, 0, 0, 0, 2.57079596354694, 2.60542685674782, 2.62130990575043, 2.62908531742244, 2.63392769034692, 2.6380966866048, 2.64324402593544, 2.65187496842788, 2.66816427320271, 2.69828003694764, 2.75018124605378, 2.8327831760547, 2.95444614757391, 3.12090783078064, 3.3330046128452, 3.58474228595963, 3.86238389659017, 4.14513395455165, 4.40767755069159, 4.62433020106473, 4.77400441484487, 4.84478630137484, 4.83681507476603, 4.76247083719335, 4.64357134456754, 4.50617095284446, 4.37434210545033, 4.26469479606899, 4.18318634587034, 4.12505917859546, 4.0777899217226, 4.02608222955441, 3.95744882348718, 3.86690012877755, 3.7596302502574, 3.65122542430324, 3.56565198718497, 3.53193606886032, 3.58081098936982, 3.74241011524621, 4.04509898673008, 4.51389868426603, 5.16551898675086, 5.99739382448138, 6.97165568619586, 8.00103986376478, 8.94847456448094, 9.65067976917799, 9.96796533248832, 9.84062154842272, 9.2803304190552, 8.31181349570841, 7.07101984454836, 5.85893378113683, 4.93595881691178, 4.44879194102041, 4.49363473115277, 5.09852130023022, 6.15372499197171, 7.38442652038774, 8.43301714227922, 9.02827613119029, 9.11448023249484, 8.83120347999217, 8.37531980897472, 7.87710817838605, 7.37578403470041, 6.86809642489001, 6.35761803332862, 5.86789173145916, 5.42953762962525, 5.06464548146878, 4.78039980384675, 4.57131161987348, 4.42495114215577, 2.53421118462931, 2.72011615943038, 2.85300341923453, 2.90519804947298, 2.8524547816582, 2.68377248987657, 2.41171291156281, 2.07740899897806, 1.74461953702026, 1.48198082103023, 1.33997150105553, 1.33365527620950, 1.43961853732567, 1.60704419943099, 1.77556464509530, 1.89270276793779, 1.92934165105760, 1.89291040921661, 1.83020216873038, 1.80759494298872, 0, 0, 0, 0, 2.48918136174444, 2.55079919421979, 2.57470342535592, 2.57858429936695, 2.57455206695902, 2.56906215395669, 2.56547874957470, 2.56637675969028, 2.57497128364860, 2.59590277891122, 2.63554962511253, 2.70183323108199, 2.80339648661491, 2.94809482168631, 3.14091118526168, 3.3816478618729, 3.66298268315183, 3.96959827886201, 4.2789995449002, 4.56428374981886, 4.79857591982774, 4.96024688746697, 5.03760665174635, 5.03170389169992, 4.95625205328373, 4.83447318828757, 4.69357418024436, 4.55832856531413, 4.44554736441134, 4.36096044652253, 4.29929176407554, 4.24736788616121, 4.18927021115577, 4.11206710204873, 4.01063409281969, 3.89044146387618, 3.76782996428519, 3.66804596066751, 3.6219832629581, 3.66294698093175, 3.82451931745257, 4.13952255864519, 4.63827836505577, 5.34280626769745, 6.25406131366127, 7.33332550333899, 8.48576890707182, 9.55971539433808, 10.3735166357038, 10.7727078610951, 10.6930690611438, 10.1359405665549, 9.08837608148785, 7.68402161160696, 6.29697388798957, 5.24619361042816, 4.68669985211064, 4.70767134447054, 5.32949185407167, 6.43197890030913, 7.72458186520583, 8.8306989938654, 9.46301834708647, 9.55807082573969, 9.25644248629193, 8.76092011991896, 8.20868547774631, 7.64550075596836, 7.07458069482475, 6.50572447270615, 5.9673439641739, 5.49244409481865, 5.10280631156478, 4.80338220757185, 4.58570674242587, 4.43462614717222, 2.35320236345218, 2.51756446465764, 2.63245862005482, 2.67199107681924, 2.6134641760817, 2.44691916067040, 2.18521635023211, 1.86890700388932, 1.56031273704002, 1.32598412550823, 1.21401696490579, 1.23720035374202, 1.37030516615607, 1.56137197042896, 1.74960621534692, 1.88268618061421, 1.93193945491839, 1.90515253793803, 1.84912172238643, 1.82993107971309, 0, 0, 0, 0, 2.48511060022732, 2.53660229848625, 2.54977908093329, 2.54283544688290, 2.52858142972784, 2.51429791687079, 2.50418805830229, 2.50157348631018, 2.51024509075478, 2.53520221405369, 2.58295047358448, 2.66131575046851, 2.77864240189102, 2.94230097594528, 3.15660784748144, 3.42051220827332, 3.72565471631403, 4.05553328572906, 4.38641567853637, 4.69026813550976, 4.93938466365049, 5.11177545164295, 5.19593925838841, 5.1936078157627, 5.11949095930829, 4.99787278873228, 4.85685464321291, 4.72178203206265, 4.6096612140301, 4.52607066440634, 4.46531820701356, 4.4136560485275, 4.35454962492979, 4.27452919571564, 4.16812485273032, 4.04075638948042, 3.90909746152691, 3.79919734737178, 3.74333162683068, 3.77691784557464, 3.93656105113424, 4.25912804204893, 4.77983570282564, 5.52569400911278, 6.50117789215991, 7.66742310927255, 8.92392172117137, 10.1079147264498, 11.0243124716946, 11.5067932349023, 11.4805228065412, 10.9270898506646, 9.8026615257441, 8.24438222099197, 6.69454395836211, 5.51505869528966, 4.87617964673346, 4.8567904808988, 5.46503337889872, 6.57373944723597, 7.88970766312196, 9.03413483060018, 9.71401195893566, 9.85508545376471, 9.58471511334539, 9.095581327482, 8.52230175444343, 7.91599694728247, 7.28999439373371, 6.66475011300998, 6.07674461112536, 5.56317218323831, 5.14641925580262, 4.82965873133224, 4.60166105903879, 4.44460963105653, 2.18615401155911, 2.33147512138044, 2.43154169420566, 2.46260933011599, 2.40386425436048, 2.24644935215608, 2.00303107914507, 1.71240547069632, 1.43379099086349, 1.23002367769882, 1.14588922189432, 1.19213653011999, 1.34313498009064, 1.54798979332901, 1.7479225041859, 1.89286390467722, 1.95564749913148, 1.94366212853676, 1.90084817663536, 1.88906900726808, 0, 0, 0, 0, 2.48784666611036, 2.52709547937699, 2.52959749029701, 2.5130221393433, 2.49013269286312, 2.46859140817617, 2.45317798024781, 2.44778267523289, 2.45663309830342, 2.48497255862730, 2.53933978121376, 2.62739344549079, 2.75713763181817, 2.93546176168889, 3.16608852341744, 3.44728292377754, 3.76993327084702, 4.11675286557328, 4.46325507310223, 4.78077355799657, 5.04119650418263, 5.22244018213885, 5.31324921244186, 5.31588952319771, 5.24577094087536, 5.12788693888328, 4.99091535134283, 4.86055247755703, 4.75389549975115, 4.67636572861515, 4.62190407330455, 4.57623836045583, 4.52221561879092, 4.44572973846253, 4.34074487938065, 4.21228372201708, 4.07690037292331, 3.96092807781107, 3.8974825291285, 3.9235550622725, 4.07822609015741, 4.40180742155019, 4.93374146089095, 5.70540039138742, 6.72453365070441, 7.95285430415555, 9.28661820836957, 10.5568841213412, 11.5622193707845, 12.1287247044626, 12.1620530366758, 11.6107725539074, 10.4051631085523, 8.68345432942746, 7.02347246399391, 5.71910527234693, 4.99828576767851, 4.92698237870272, 5.49535618688456, 6.57205202076107, 7.87377466771425, 9.03575846498451, 9.76971586172651, 9.98861363845765, 9.79407144274035, 9.35420404553007, 8.79232330782743, 8.16350998948944, 7.49405676064897, 6.81857485423036, 6.1840483350735, 5.63318717116485, 5.18969520104399, 4.85542545838042, 4.61671685907145, 4.4533129466213, 2.03412859237132, 2.16294815403227, 2.25126199369108, 2.27777633894250, 2.22383731952961, 2.08172463790495, 1.86346259351669, 1.60504663477616, 1.3611192420883, 1.18937478351013, 1.13049903436992, 1.19345322961877, 1.35350309745098, 1.56279533783913, 1.76670514269714, 1.91919806484991, 1.99548194827741, 2.00190943286615, 1.97723168393029, 1.97591662420701, 0, 0, 0, 0, 2.4951692111281, 2.52078918319345, 2.51298060946788, 2.48805384989154, 2.4581103363518, 2.43081474911840, 2.41128659175990, 2.40381458353105, 2.41292446225033, 2.44398520997621, 2.50346834119990, 2.59878518700403, 2.73754761734534, 2.92615644164646, 3.16780200575315, 3.46022317599021, 3.79383220271446, 4.15095459311913, 4.50683847266356, 4.83270470944862, 5.10050075183307, 5.28837297808136, 5.3854353022629, 5.39439940106919, 5.33111632098913, 5.22093931807658, 5.09277219945559, 4.9723828477099, 4.87678807554634, 4.81118552065404, 4.76915189863359, 4.73590799516898, 4.69365554232599, 4.62753128801385, 4.53068864516324, 4.40737955411096, 4.27355705274528, 4.15528862515246, 4.08595428320877, 4.10353683033133, 4.24897731368991, 4.56532043656676, 5.09538785409189, 5.87405558847084, 6.91188969707187, 8.17185752617379, 9.54974948636217, 10.8762681763014, 11.952408152049, 12.6034921614212, 12.7095963821235, 12.1709315848717, 10.8994407405519, 9.0529224721195, 7.25905811148125, 5.83390609751141, 5.03549854409491, 4.910162793399, 5.42276893061381, 6.4394150709056, 7.6968941820341, 8.85767141569128, 9.64708352957119, 9.9648884403333, 9.87839682169243, 9.52071714981243, 8.99726862434646, 8.36564109858221, 7.66657675861329, 6.9507327013967, 6.27679803310619, 5.6936048765709, 5.22658544932844, 4.87670088373727, 4.62830297322504, 4.45907971083568, 1.89759724653608, 2.01234788772209, 2.09168647630904, 2.1169698760942, 2.07188901234193, 1.94986508460679, 1.76191744456867, 1.54042360994558, 1.33431244279957, 1.19505003456062, 1.15864831803422, 1.23252920949391, 1.39391012833550, 1.59952608185143, 1.80051068839159, 1.95613042611781, 2.04454263877208, 2.07063442719238, 2.06648430457382, 2.07718441480537, 0, 0, 0, 0, 2.50427129385027, 2.51599757566291, 2.49871661128628, 2.46684615136025, 2.43141344257659, 2.39980775719830, 2.37729289934151, 2.36840100778523, 2.37782274467254, 2.41093582902773, 2.47404331798631, 2.57422643791626, 2.71864887251054, 2.9132097939168, 3.16062113666318, 3.45824396799634, 3.79627896411591, 4.15704839362882, 4.51601528462398, 4.84480709970159, 5.11590911136409, 5.30805138857643, 5.41088291447177, 5.42751865397792, 5.37402953698831, 5.27579753473932, 5.16159731615537, 5.05696452285448, 4.9786273648358, 4.93145180898637, 4.90861148197413, 4.8947964189187, 4.87149484878442, 4.82292418801489, 4.7411427656167, 4.62922325384856, 4.50200793757161, 4.38472891306743, 4.3104448794834, 4.31754895489206, 4.44823537740554, 4.74756632186432, 5.26085547990002, 6.02552527065688, 7.05435734275163, 8.31212574174283, 9.69689217458477, 11.0448780986016, 12.1684832062527, 12.9008728510732, 13.0965274769561, 12.5938710758196, 11.2815905491785, 9.35431859210125, 7.37201844220321, 5.83387479738699, 4.97294605927871, 4.80407978508779, 5.25901936966817, 6.20213152039266, 7.39712114048219, 8.54227831408041, 9.38293115161734, 9.80698897256262, 9.8441012175374, 9.58739812309495, 9.12083798221783, 8.5031409344399, 7.78931966290077, 7.04601078133739, 6.34334502642348, 5.73605107402748, 5.25135079591565, 4.88968450624849, 4.63395222526803, 4.46031439738531, 1.77650917173984, 1.87940622365401, 1.95210248770907, 1.97868398474010, 1.9452620837687, 1.84637084165127, 1.69177444875207, 1.50970681080349, 1.34267041193203, 1.23524378036628, 1.21845484513846, 1.29841503575975, 1.45502888006276, 1.65062233126866, 1.84304345324694, 1.99752284218379, 2.09541473278899, 2.13995483008131, 2.15601676271013, 2.17866130479253, 0, 0, 0, 0, 2.51230805597391, 2.51108016294049, 2.48566250854132, 2.44837440418327, 2.40897833276683, 2.37442197046277, 2.34996485106885, 2.34024662480189, 2.34999889640925, 2.38449695752686, 2.44977846208635, 2.55251516446994, 2.69936890734359, 2.89572455721868, 3.14386634819420, 3.4409171826444, 3.77711515175976, 4.13514205947947, 4.49113115491975, 4.81761398595632, 5.08808044272563, 5.28220198302789, 5.39034991925628, 5.41603481382573, 5.37536570352238, 5.29345684077655, 5.19862084004685, 5.11586346778194, 5.06140605659799, 5.03964985944301, 5.04328784731348, 5.0564051824568, 5.05965000662126, 5.03609814005259, 4.976374031422, 4.88191947395619, 4.76592778054468, 4.6522150609483, 4.57294664463384, 4.56639448258106, 4.67549288587896, 4.94673647535492, 5.42717392763591, 6.15588864796632, 7.14723478051295, 8.3681433705429, 9.72120493476256, 11.0529201745332, 12.1940138300532, 12.9928987730693, 13.2830122579865, 12.8349631100172, 11.48647895911, 9.44698520435983, 7.32275055170774, 5.69512775242125, 4.80167390963627, 4.61296075849017, 5.02209237398498, 5.89283992961107, 7.0193265999462, 8.13934318241592, 9.02172831443447, 9.54553941684167, 9.7046600652096, 9.56098050078914, 9.15220994888641, 8.56131597664301, 7.84767438489529, 7.09193258388646, 6.3739938793188, 5.75346890696851, 5.25909473767731, 4.89109147719361, 4.6315036494888, 4.4556017803458, 1.67037933889657, 1.76335171712258, 1.83121894670606, 1.86074999079595, 1.84044031119523, 1.76587639243934, 1.64543967509192, 1.50300672075006, 1.37439262076982, 1.29708057588848, 1.29707878527945, 1.37938898312202, 1.52699589373580, 1.70825513084903, 1.88803890907202, 2.0376320344437, 2.14153615651960, 2.20137147136424, 2.23511398950068, 2.26829523651567, 0, 0, 0, 0, 2.5169054403656, 2.504661847782, 2.47283370903927, 2.43171755865972, 2.38981224674195, 2.35355585813413, 2.32809840592153, 2.31807106528536, 2.32813432302842, 2.36335948402351, 2.42943097788537, 2.53254077121636, 2.67880359336745, 2.87308331135043, 3.11728789859888, 3.40843385445842, 3.73702651369883, 4.08643905923348, 4.43389059565212, 4.75327260604256, 5.01951209907872, 5.21356177769464, 5.32670686181397, 5.36287238125814, 5.33806678391916, 5.27689013265322, 5.20690621227528, 5.15232618555997, 5.12865890796121, 5.13969603481176, 5.17753483094664, 5.22552141953563, 5.26326277410553, 5.27239389772408, 5.24169920645492, 5.17048801685093, 5.06973677566776, 4.96125947892874, 4.87578781582479, 4.8510352275608, 4.93034528706804, 5.16133280976874, 5.59234181901631, 6.26349468222401, 7.19015459990983, 8.3415023781885, 9.62602893758016, 10.9030887851826, 12.0244562609207, 12.856603110322, 13.2178525330765, 12.8174074428160, 11.4372897007839, 9.2975347896573, 7.0724873994259, 5.40441527285881, 4.52439853836277, 4.34941711383963, 4.73401929730131, 5.5441480960504, 6.60529831695207, 7.69427598658427, 8.60442861133145, 9.2100947240149, 9.4756677771742, 11.0070105074411, 9.0863562861471, 8.531079385428, 7.83197710039442, 7.07995549421753, 6.36193219115038, 5.74077617616276, 5.24619822643, 4.87842616133017, 4.6192686790549, 4.44380610638197, 1.57838429201714, 1.66304686434006, 1.72737466217328, 1.76066170032533, 1.75365120256807, 1.70289559915564, 1.61538229498841, 1.51070727893428, 1.41815532578149, 1.36832181038292, 1.38240821927248, 1.46447594315356, 1.60066726045558, 1.76530397761755, 1.93004421022512, 2.07186175603605, 2.17813668369441, 2.24907205732595, 2.29664088583873, 2.33814399763739, 0, 0, 0, 0, 2.51647733084520, 2.49576878804313, 2.45945900534221, 2.41608610775369, 2.37301684845839, 2.33618110069259, 2.31054767871754, 2.30064172969243, 2.31095412142299, 2.34626329032706, 2.41182583708335, 2.51329757626183, 2.65621452178116, 2.84492373204992, 3.08101253096381, 3.36151561361129, 3.67741302027234, 4.01306232081835, 4.34713174188077, 4.65527031222434, 4.91422177476704, 5.10652439135911, 5.22455982376708, 5.27270720664495, 5.26678253831666, 5.23068827755951, 5.19101842242827, 5.17097920478782, 5.18519195265323, 5.2366918022505, 5.31682747475204, 5.40800261141339, 5.48849348490946, 5.53810509157051, 5.54330048223133, 5.50070259940333, 5.4184736963565, 5.31583532546797, 5.22158545177214, 5.17256700636295, 5.21245897178684, 5.3900884301228, 5.75515205323046, 6.34863961568705, 7.1865670699185, 8.2401899649041, 9.42416182084014, 10.6105759207556, 11.6699498219255, 12.4837340515773, 12.8608484137322, 12.4696535813820, 11.0571372616460, 8.85943104739656, 6.60606167202327, 4.97223906717111, 4.16182448696471, 4.03658677007398, 4.41994529255244, 5.18496561967392, 6.18782536680549, 7.24105247248146, 8.16169149683667, 8.82391262182217, 9.17060437912843, 9.79474366912428, 8.92270736532926, 8.40963317250536, 7.73835843434309, 7.00623724458038, 6.30382848665447, 5.69529138908518, 5.21060478320733, 4.85016458847983, 4.5961447130041, 4.42414122563700, 1.49945678734891, 1.57711804384436, 1.63872653839866, 1.67585748650205, 1.68128907447904, 1.65243613979010, 1.59497792160065, 1.52454297795299, 1.46437982506593, 1.43873498963183, 1.4644103412092, 1.54466405066029, 1.66861862290093, 1.81611233409004, 1.96495790604231, 2.09715888788684, 2.20258176331726, 2.28030159375940, 2.33747517157711, 2.3848496722315, 0, 0, 0, 0, 2.51029596657563, 2.48385775494629, 2.44499383857533, 2.40083270476060, 2.35780176757706, 2.32136052123693, 2.29624680082857, 2.28679806365053, 2.29725142244545, 2.33201844985901, 2.39586964009487, 2.49388603828370, 2.63101113778332, 2.81109411142833, 3.03546413208480, 3.30129213799474, 3.60021558509235, 3.91782465058201, 4.23453804551324, 4.52808929764088, 4.77735180050369, 4.96670510263903, 5.08979104988904, 5.15149914153371, 5.16741071782829, 5.16061982677224, 5.15660978206894, 5.17744139734991, 5.23671655737288, 5.33657118992896, 5.4674131324302, 5.61042236348722, 5.74215586709215, 5.84010316003595, 5.88785151598753, 5.87873948436238, 5.81749459396392, 5.72014943851274, 5.61310253981775, 5.53214760483436, 5.52152777135892, 5.63187815819184, 5.91494836058505, 6.41303116586691, 7.14276172598473, 8.07707261126662, 9.13598034426014, 10.2018577139994, 11.1577113811886, 11.8926176312343, 12.2118249254316, 11.7739993739031, 10.3295921089896, 8.139582042131, 5.95619572057033, 4.44267829180161, 3.75534050456659, 3.70815152318242, 4.10727852212514, 4.83925528109783, 5.78917659094294, 6.80059597089343, 7.71242226625984, 8.40287439532384, 8.80217113155368, 8.8860650242433, 8.66768650706328, 8.2006960587575, 7.56900450703507, 6.87187353861381, 6.20002465857028, 5.61687894288707, 5.15192516505756, 4.80582795158565, 4.56166629048139, 4.39620651601538, 1.43237228746685, 1.50406714194092, 1.56339949615569, 1.60392888646832, 1.62020928745191, 1.61040816286244, 1.57905290487032, 1.53828082260547, 1.50602619452782, 1.50094527864752, 1.53596934680369, 1.61365765620337, 1.72575844791200, 1.85692899576568, 1.99028246989441, 2.11206116292724, 2.21419403668266, 2.29494547643291, 2.35787986817062, 0, 0, 0, 0, 0, 2.4983583645165, 2.46875753031928, 2.42909910731742, 2.38544837088782, 2.34348968987344, 2.30825879815419, 2.28422458712786, 2.27546851686572, 2.28590437705771, 2.3195190756803, 2.38055702438073, 2.47350608663771, 2.60272391919892, 2.77159798891926, 2.98127052179582, 3.22916070650597, 3.50772003197963, 3.80397117013846, 4.10031699510367, 4.37682420628588, 4.61473345151534, 4.80046437964433, 4.92905744897372, 5.00598212426463, 5.04659339539922, 5.07314368131692, 5.10995272546462, 5.17787407257413, 5.2894083193513, 5.44565616776305, 5.63584922602454, 5.83957699482984, 6.03118323053453, 6.18526422475194, 6.28192307165544, 6.31059952492682, 6.27196244591415, 6.17825010898878, 6.05300647185257, 5.93090549080871, 5.85728683592661, 5.88573889448707, 6.07149429633454, 6.45929274337035, 7.06676292486413, 7.8679818870619, 8.78675350972279, 9.711981706078, 10.5315463908670, 11.1340851389619, 11.3275108041878, 10.7943680316534, 9.32967282898245, 7.2240996664462, 5.21022145325165, 3.89116674798176, 3.36195431154378, 3.40402025868286, 3.82333245673302, 4.52573028499586, 5.42248851594828, 6.38316700839612, 7.26632336240472, 7.95751136448811, 8.38198559939036, 8.50488664458807, 8.33272288758558, 7.91415882224313, 7.3317748635362, 6.68257812343122, 6.0543074146674, 5.50780472562043, 5.07135677498206, 4.74594458488367, 4.51599249457905, 4.35998777388975, 1.37582314148465, 1.44235951176019, 1.49959095977461, 1.54274578942494, 1.56787965105252, 1.57380769075585, 1.56410354311551, 1.54797433053553, 1.53887400582627, 1.55072761017196, 1.59316965081921, 1.66812988874313, 1.76952804602821, 1.88602882597932, 2.0051223290515, 2.11650113132646, 2.21377140551706, 2.29469136189550, 2.36032433055767, 0, 0, 0, 0, 2.49859643589447, 2.48114729666650, 2.45056413467425, 2.41160097827543, 2.36954969740515, 2.32951523024998, 2.2961473924465, 2.27361335353661, 2.26568169136098, 2.27588764120952, 2.30775226786186, 2.36497301027632, 2.45144735654128, 2.5709754131927, 2.72653742885273, 2.91916939736611, 3.14664509556696, 3.40236033472388, 3.67492085418472, 3.9488778639063, 4.20679894767227, 4.43245087521633, 4.61443142793509, 4.74928898343998, 4.84315279725952, 4.91120848993955, 4.97491096218256, 5.05745267877949, 5.17849851856086, 5.34941698254553, 5.57014225216724, 5.82844510732893, 6.10186384317467, 6.36192825266677, 6.57968992847393, 6.73115046602325, 6.80127922754853, 6.7861026225879, 6.69345147517189, 6.54352654186786, 6.36985342326598, 6.21964714982411, 6.15111637802044, 6.22514012934982, 6.49078024918842, 6.96747933955074, 7.62989283514535, 8.40364352013914, 9.18037379998823, 9.8466744135374, 10.2855391435888, 10.3143949476916, 9.6664009030031, 8.20967378558434, 6.26018608041607, 4.49037510358825, 3.40668317787488, 3.04075612553028, 3.16159226030582, 3.5909276173844, 4.25718501274439, 5.09403058715656, 5.99232890791816, 6.82807859725506, 7.4962056864029, 7.92255880908457, 8.06796574818454, 7.9340145580762, 7.56509909590137, 7.03920511911996, 6.44785715134165, 5.87330536157647, 5.37233597506213, 4.97143968716634, 4.67191339561957, 4.45983767361976, 4.3158265813969, 1.32847894222033, 1.39048803496155, 1.44563259035269, 1.49050633393587, 1.52240587355204, 1.54070393209805, 1.54823429323292, 1.55184898664591, 1.56136199381108, 1.58681801106845, 1.63510224338895, 1.70754522931699, 1.7997493324903, 1.90357132606927, 2.0100042090987, 2.11149919284358, 2.20303886458939, 2.28214974862465, 2.34827536096727, 0, 0, 0, 0, 2.47772947694326, 2.45938712743726, 2.42953236309223, 2.39244736370943, 2.35286249881562, 2.31541985095754, 2.28440516832705, 2.26365329027946, 2.25657324257794, 2.26628024131742, 2.29580457169627, 2.34829453516536, 2.42708085338430, 2.53545549488122, 2.67606383001568, 2.84992558371957, 3.05526994847046, 3.28654179727896, 3.53403264657306, 3.78453864861364, 4.02321699607095, 4.23644206636322, 4.41506709485808, 4.55722688830908, 4.66979703721869, 4.76789446423048, 4.87229223448571, 5.00517528264662, 5.18511366227674, 5.42235877829222, 5.71554468771339, 6.0506371784326, 6.4025586053153, 6.7393207887896, 7.02774258394759, 7.23917817084513, 7.35370077484042, 7.36222891192322, 7.26757535542422, 7.08601100363595, 6.84981490642998, 6.60897852613645, 6.42840251502251, 6.37740753868595, 6.51191051733564, 6.85441508931346, 7.3796439948058, 8.01300317201422, 8.64589264030354, 9.1605840078726, 9.433882504481, 9.29926255494085, 8.55423382026633, 7.1477690928431, 5.40678197834047, 3.91428501754484, 3.06418631125657, 2.8354573679138, 3.00551652486643, 3.42326100555404, 4.03931676532813, 4.80502987441205, 5.6284689535018, 6.40103545275006, 7.0278073037093, 7.43854000572773, 7.59354967041763, 7.49153373762878, 7.17220769081254, 6.70702076771977, 6.1798050577098, 5.66561204515428, 5.21615488446086, 4.85569325464417, 4.58579452480237, 4.39435952263885, 4.26436522310411, 1.28903354024552, 1.3470165869893, 1.40001838442632, 1.44573110124208, 1.48246723269283, 1.51008979067056, 1.53090224729185, 1.54993512484811, 1.57412613455558, 1.61039603365406, 1.66334409265717, 1.73368655148299, 1.81823154321226, 1.91128706121808, 2.00660349393934, 2.09885118695899, 2.18419709251151, 2.26018243064254, 2.32529584589393, 0, 0, 0, 0, 2.45134425318502, 2.43385932185581, 2.40599123998748, 2.37167144121148, 2.33520574762311, 2.3008446279568, 2.27251603231286, 2.25369369122068, 2.24738995329613, 2.25627146321668, 2.28286796220143, 2.32979379976205, 2.39985562556477, 2.49590585299694, 2.62034327882711, 2.77426925425175, 2.95646356772239, 3.16250091893084, 3.38441696217958, 3.6112870033271, 3.83087353738269, 4.03216804285098, 4.2082991009094, 4.35903551598269, 4.49208820962468, 4.62264155726228, 4.77096296437984, 4.9584207711161, 5.20264735977708, 5.51282651811249, 5.88614381601368, 6.30634112303107, 6.7450432804349, 7.1659454347636, 7.53096745720493, 7.80646286291578, 7.96748325037485, 7.99961175217142, 7.90005944464966, 7.68040185187624, 7.37135072483379, 7.0265064044373, 6.71972388819803, 6.53197184899673, 6.52903048490644, 6.73805998522611, 7.13346618617274, 7.63853618090317, 8.14245770509429, 8.52321985625904, 8.65492275691076, 8.39214884305961, 7.59671039143536, 6.28664635544501, 4.77954066854441, 3.55520669943093, 2.90032685420737, 2.76097901635789, 2.94061183024626, 3.32057330461252, 3.87002543860800, 4.5528798731979, 5.29098056738028, 5.98927304035438, 6.5627404891082, 6.94645536258757, 7.10223285197093, 7.02706258934952, 6.75581501032446, 6.35237107099348, 5.89170157513582, 5.44076935257165, 5.04567725145219, 4.72819060528927, 4.49006071813468, 4.32102276863074, 4.20647640443917, 1.25624030360506, 1.31060775691633, 1.36141056070413, 1.40722473778967, 1.44720408162005, 1.48166286768850, 1.51256619909665, 1.54357829427647, 1.57939199426391, 1.62440750670214, 1.68127694174955, 1.75003464276783, 1.82825638122995, 1.91208077489821, 1.99744130408185, 2.08086455219464, 2.15962762594591, 2.23151802404519, 2.29455355700041, 0, 0, 0, 0, 2.42073372771172, 2.40529758182597, 2.38029222323388, 2.34936590433156, 2.31647754649424, 2.28552204454185, 2.26006465369887, 2.24319211234791, 2.23749209767720, 2.24516595771293, 2.26824669306665, 2.30884504486796, 2.36930256899639, 2.45211665790091, 2.55954065869373, 2.69286108369783, 2.85149733861128, 3.03221282029364, 3.22880637185471, 3.43261190252393, 3.63394888374743, 3.82437185143262, 3.99925283763219, 4.16001209004611, 4.31528210933897, 4.48047517213112, 4.67557390783204, 4.92137418223268, 5.23477339858561, 5.62395510151678, 6.08447633757187, 6.59734256535088, 7.13006868330411, 7.64115444326442, 8.08705489029211, 8.42912050499299, 8.63775560273426, 8.69337461058996, 8.58707021348233, 8.3246915401444, 7.93466230797674, 7.47471378265132, 7.0298044543094, 6.6958273182291, 6.55161694907472, 6.63080340841573, 6.90729218174897, 7.3006110364242, 7.69648913570317, 7.97036705789654, 7.99881326199578, 7.66012948834808, 6.87041571020083, 5.69367369168079, 4.41847378519406, 3.42237820331211, 2.90465984299650, 2.80072908219947, 2.95157304312457, 3.27069835831637, 3.74034924914542, 4.3322448455849, 4.97921371159353, 5.59800629854559, 6.11258249573004, 6.46343666439151, 6.61462478405522, 6.56203368477586, 6.33580039479886, 5.99203231790645, 5.59660702481531, 5.2082541080984, 4.8673720245234, 4.59313094505726, 4.3873443940084, 4.241457568315, 4.14318753565034, 1.22893752346215, 1.28003950319424, 1.32863344628759, 1.37402502528539, 1.41609264980611, 1.45559383478089, 1.49432297712145, 1.53493603152758, 1.58035135876304, 1.63286807787271, 1.69338266751314, 1.76112086956132, 1.83403646950529, 1.90961625493292, 1.98558754652073, 2.06014982511333, 2.131733641375, 2.19860680168126, 2.25866989477328, 0, 0, 0, 0, 2.38696514967807, 2.37434974724438, 2.3527852161458, 2.32566669228692, 2.29664331452775, 2.26926745734447, 2.24673103621401, 2.23171223106684, 2.22635480760866, 2.23238867388055, 2.25136550175786, 2.28493515352429, 2.33504574540716, 2.40393594169488, 2.49382343249508, 2.60628594035165, 2.74146441246969, 2.89735018604688, 3.06949097858768, 3.25141319218737, 3.43589192565623, 3.61693763521817, 3.79208924728295, 3.96440707120976, 4.14352259350775, 4.34524717222693, 4.58952479568825, 4.89685375544058, 5.28362265198176, 5.75708032898116, 6.31092564941276, 6.92280465550127, 7.55517039857036, 8.16039270915537, 8.68908874512601, 9.0981289340105, 9.3543589434394, 9.43375234944676, 9.3208832533337, 9.01450450360187, 8.53946500541417, 7.95758407672075, 7.36659702754773, 6.88022841194575, 6.59335524097765, 6.54793781702217, 6.71749519509717, 7.01657626809259, 7.32657188195435, 7.52218282825858, 7.48675694897398, 7.12206598466895, 6.38414806537986, 5.3585102382366, 4.2913022242345, 3.46941113999732, 3.02982512733957, 2.91562247074262, 3.00970677890596, 3.25365441502007, 3.63731721118023, 4.1364808410929, 4.69271842014371, 5.23289777597018, 5.68867528106453, 6.00536056710982, 6.1492544315125, 6.11543283433204, 5.92968687297854, 5.64081808195374, 5.30613408532858, 4.97659413101387, 4.68716579359682, 4.45446210394022, 4.28021107405351, 4.15732945633887, 4.07560828637782, 1.20606565288663, 1.25421421282435, 1.30066231864060, 1.34535251309758, 1.38882993234567, 1.43231836345282, 1.47758328423813, 1.52652944811658, 1.58060424229874, 1.64023439342099, 1.70459891933358, 1.77192509955108, 1.8402014178506, 1.90791570764917, 1.97437800581131, 2.03944576924146, 2.10285736712601, 2.16361281530643, 2.21976679180033, 0, 0, 0, 0, 2.35089953806267, 2.34158013771217, 2.32381174154831, 2.30074283653064, 2.27572561380628, 2.25197053668352, 2.23228443464743, 2.21892085022508, 2.21356871104365, 2.21748961046812, 2.23177878097753, 2.25767722249045, 2.29681983761623, 2.35128978590875, 2.42338271637842, 2.51507236637938, 2.62729468303392, 2.75929072256875, 2.90831563086255, 3.06998649255612, 3.23939155869329, 3.41284833973909, 3.58994922458977, 3.77535578958465, 3.97976033218111, 4.21954013050206, 4.51485020612870, 4.88617199026598, 5.34961100892964, 5.91152601072113, 6.56346617897762, 7.27898070336888, 8.01437975586553, 8.71495390934437, 9.32539546847843, 9.79929235162343, 10.1019024448376, 10.2061711103796, 10.0899111547744, 9.74303765319415, 9.18487488359958, 8.48052053919352, 7.74132397195514, 7.10089653754508, 6.67250267780056, 6.50814278068918, 6.58147626452975, 6.80152477879146, 7.04474217052064, 7.18600354384817, 7.11736935015841, 6.76125805258769, 6.09966551369841, 5.22085069484382, 4.32396685645033, 3.62237259265737, 3.21377150759756, 3.05982791041228, 3.08341420779945, 3.24833467153915, 3.54780709997840, 3.95925910220801, 4.43120625347217, 4.8989601736221, 5.30048362169184, 5.58501598367906, 5.72075471200924, 5.70211842826168, 5.55117512325328, 5.31037936020038, 5.02952733685511, 4.75270509050335, 4.50999262598091, 4.31559099792489, 4.17098131264011, 4.070233138594, 4.00486791374166, 1.18667765607189, 1.23216214884194, 1.27661051373452, 1.32056633404268, 1.36523790816362, 1.41236683981667, 1.46380718883518, 1.52087558405586, 1.58369648671110, 1.65087449337239, 1.71976439227842, 1.78734262843177, 1.85132701122618, 1.91097857589350, 1.96713623572600, 2.02144815241893, 2.07521429963710, 2.12844640652063, 2.17957951246521, 0, 0, 0, 0, 2.31324207856646, 2.30748785729263, 2.29370531132109, 2.27478919657539, 2.25379495815632, 2.23358680751080, 2.21657687292294, 2.20458418104395, 2.19883969949914, 2.20014781391917, 2.20917954954549, 2.22682516430250, 2.25449085839079, 2.29420933499682, 2.34846644565757, 2.41973135880834, 2.50979826870736, 2.61916409970780, 2.74672883058054, 2.89007241399503, 3.04642446235736, 3.21423027364242, 3.39499314771191, 3.59491104751698, 3.82577636917009, 4.10467933250215, 4.45221694772085, 4.88911504609991, 5.43139867398959, 6.08454690739054, 6.8376091837589, 7.65921130548991, 8.4983595747814, 9.29237007209738, 9.980286477217, 10.5143519806139, 10.8611227963603, 10.9926120596909, 10.8797848056906, 10.5016430286641, 9.86942035294467, 9.04985689949563, 8.16764927243616, 7.37705601593919, 6.8110000934521, 6.53287417714597, 6.51750501069021, 6.6688107450653, 6.85824294007336, 6.96084437223142, 6.87685238678253, 6.54477455362544, 5.96143099255248, 5.20718335766344, 4.43752018517431, 3.81064072823252, 3.40213644491087, 3.19561964416985, 3.14770871759873, 3.23846103773240, 3.46189523958871, 3.79587514915668, 4.19438933636943, 4.59955122424253, 4.9542911073487, 5.21085818354018, 5.33878909373255, 5.33187390739138, 5.20930159003085, 5.00850376081484, 4.77312172833259, 4.54149607019016, 4.33952063165366, 4.17920162293066, 4.06161281762631, 3.98161683761619, 3.93206613057439, 1.16994340640654, 1.21304013272826, 1.25571536077983, 1.29912620821700, 1.34518620837775, 1.39622976605656, 1.45429568531838, 1.52019536440507, 1.59274634247182, 1.66862973792080, 1.74314548434927, 1.811711737981, 1.87149903335033, 1.92241015845596, 1.96688650142564, 2.00861885406513, 2.05080416285709, 2.09477459438702, 2.13955077449285, 0, 0, 0, 0, 2.27459154764584, 2.27252541347698, 2.2627926206159, 2.24802002505989, 2.23096117859329, 2.21412933714842, 2.19953633101943, 2.18856328709272, 2.18198736214093, 2.18017363960115, 2.18340651110356, 2.19228666322309, 2.20807621331569, 2.23285924845593, 2.26941750540511, 2.32080536720233, 2.38972630858839, 2.47792502121998, 2.58586789007695, 2.7129527809588, 2.85836047380605, 3.02246490576831, 3.2085158258222, 3.4241578106264, 3.68229350588584, 4.00083864226083, 4.40102351501945, 4.90403705169121, 5.52598522397428, 6.27144185821721, 7.12657695257184, 8.05424874053263, 8.99502746225112, 9.8775227192836, 10.6358138279517, 11.2234006648209, 11.6117439932324, 11.7744851501521, 11.6757203242273, 11.2812578305583, 10.5913226927977, 9.67201520802684, 8.65993623766617, 7.72828900961081, 7.03014321645144, 6.64436846750306, 6.54345830329711, 6.62980824988952, 6.77074556319454, 6.84118151339995, 6.74745013141078, 6.43892775702012, 5.91943722367799, 5.25763088590064, 4.57347346232937, 3.98663528137074, 3.56152535364551, 3.30166001895060, 3.18933100471787, 3.21571242674804, 3.37453703849588, 3.64378395842255, 3.98171835729106, 4.33574981220292, 4.65269825076043, 4.88701365862487, 5.00845290003945, 5.00969548552707, 4.90842240523296, 4.73896653520659, 4.54019380417687, 4.34574966799579, 4.17805859407902, 4.04718276214137, 3.95364436507638, 3.89273848881779, 3.858238621134, 1.15514894949594, 1.19612582682779, 1.23732228394382, 1.28055809539945, 1.32852773954161, 1.38424932980366, 1.4500241190378, 1.52617845412254, 1.61013812545242, 1.69644543108620, 1.77802324030755, 1.8483847386571, 1.90389952474165, 1.94505210152343, 1.97605169190590, 2.00296720518222, 2.03128406534258, 2.06398501069747, 2.10087184818367, 0, 0, 0, 0, 2.23547517908129, 2.23711097794002, 2.23139286236143, 2.22066250721248, 2.20736518225758, 2.19366057296698, 2.18115953579781, 2.17080841064772, 2.16294144945914, 2.15750810562381, 2.15444727959763, 2.15413155233648, 2.15775987052441, 2.16756169666548, 2.18670893977409, 2.2189173091196, 2.26783630113496, 2.33643693155641, 2.42666213474849, 2.5395731596979, 2.67610278593241, 2.83834371878788, 3.03111212238366, 3.26338566918785, 3.54915266909298, 3.90721994028471, 4.35958490337302, 4.92805705479792, 5.62893287717366, 6.46583278631527, 7.42169860200956, 8.4528859194901, 9.49060498789824, 10.4543464289842, 11.2743219962568, 11.9083018112911, 12.3364970385716, 12.5366995420882, 12.4659534111347, 12.0746015911347, 11.3491105561784, 10.3524984363824, 9.2308463936093, 8.12890161367402, 7.25108809323415, 6.86230806980814, 6.6745294834076, 6.69281459774883, 6.78263801853232, 6.81895414276739, 6.7117918733413, 6.41648541847007, 5.93873711041304, 5.33572921501037, 4.70138952716579, 4.13016316849818, 3.68127226730480, 3.37345522824251, 3.20677370682689, 3.17962250709848, 3.28536704668414, 3.50230842383782, 3.79208352025031, 4.1063092731464, 4.39550439562052, 4.61587298756253, 4.73391844634879, 4.73856003960357, 4.64946365420038, 4.50198552076855, 4.331177846978, 4.16624879148418, 4.02662348856374, 3.92065362711973, 3.84819504680122, 3.80465076849706, 3.78433618785478, 1.14169155629438, 1.18080815893123, 1.22086669278678, 1.26442139705819, 1.31504246459453, 1.37652876568757, 1.45150518815679, 1.53978949179532, 1.63726609395243, 1.73605475974759, 1.8263295841792, 1.89933788387611, 1.95041761514602, 1.98062230399381, 1.99614662999498, 2.00581406620747, 2.01781214628319, 2.03710818862552, 0, 0, 0, 0, 2.18261118504317, 2.19636750074306, 2.20163353684381, 2.19981486049210, 2.19295019676112, 2.18317110148287, 2.17228430392275, 2.16150422597762, 2.1513518588606, 2.14173573875310, 2.13221825915690, 2.12243604623615, 2.11259299274029, 2.10389881586543, 2.09881051426766, 2.10096889423559, 2.11480990748984, 2.14494960346525, 2.19555106635462, 2.26993589189022, 2.37067062203381, 2.50023949031142, 2.66224085196883, 2.86286699940368, 3.11229271936026, 3.42552869144426, 3.82228208721348, 4.32538073648985, 4.95733844825089, 5.73469799153308, 6.66008382285581, 7.71298024585169, 8.84278798375668, 9.9708802197353, 11.0077301376417, 11.8811586252550, 12.5562249200948, 13.0252371694272, 13.2718501220904, 13.2453324038565, 12.8785602037281, 12.1423912900149, 11.0949293671124, 9.88883882995543, 8.5467218774983, 7.38690239704012, 7.20028586517441, 6.92043014430779, 6.86143897644225, 6.89059907129659, 6.88405298591553, 6.75375272735434, 6.45704940593019, 5.99827023740558, 5.42489406846863, 4.81312363509525, 4.24164599830188, 3.76717516319476, 3.41849141084796, 3.20687868985864, 3.13531160799788, 3.19726936232059, 3.37187355001604, 3.62363677543904, 3.90835991174716, 4.18271251920784, 4.40525039755585, 4.52804728137545, 4.52660271870405, 4.43310912163146, 4.29534519965863, 4.14419234461087, 4.00209980777877, 3.88513476360589, 3.80006647929475, 3.74600714192558, 3.71820914728559, 3.71121514895179, 1.12907174741704, 1.16657503920103, 1.20585455515754, 1.25027802286868, 1.30438875168590, 1.37285790802295, 1.45867934271824, 1.56111418076886, 1.67432970685413, 1.78772224047499, 1.88834590715381, 1.96484058717613, 2.01131146996977, 2.02939422600685, 2.02749713054915, 2.017566957081, 2.01088694359659, 2.01472049875274, 0, 0, 0, 0, 2.14106436937397, 2.15769709688887, 2.16645279746909, 2.16835275671587, 2.16511658361561, 2.15855887975471, 2.15013770888115, 2.14068077509741, 2.13029921693778, 2.11849889035789, 2.10448787534990, 2.08764460278591, 2.06805976147979, 2.04701820758887, 2.02727166803889, 2.01298976888780, 2.00936771450538, 2.02199095204544, 2.05616791944931, 2.11649542949621, 2.20688808432580, 2.33118528688089, 2.49428034835324, 2.70354544055190, 2.97019564338028, 3.31016017147592, 3.74399425930201, 4.29534153748999, 4.98742454365918, 5.83703986372478, 6.84581573225755, 7.9897683612796, 9.21136267386093, 10.4223586065191, 11.5250256568069, 12.4465668740278, 13.1619399067332, 13.6774765121676, 13.9827265434522, 14.0174649685661, 13.6956202838429, 12.972263545503, 11.9002302195401, 10.6362347126091, 9.34161440054387, 8.2488564383788, 7.66401998970449, 7.28287742927576, 7.13308039718399, 7.08700701496978, 7.0241709780143, 6.85774670783103, 6.54442480070732, 6.0851708912103, 5.5195858110821, 4.91214095201913, 4.33161677927973, 3.83278821984338, 3.44986296786115, 3.20049046074421, 3.09064101768301, 3.11467707821387, 3.25325229041775, 3.47387581742023, 3.73870854457766, 4.01901163307043, 4.27864379610441, 4.42603391976134, 4.39727270511581, 4.26429950241995, 4.11597565992685, 3.97577724902600, 3.85118814414364, 3.75269361262722, 3.68536079333201, 3.64751843520065, 3.63409589415079, 3.63963599884458, 1.11688373731934, 1.15300022096017, 1.19184407594847, 1.23766659626951, 1.29606689322007, 1.37266166545810, 1.47084267985751, 1.58926037216047, 1.72020225812903, 1.85007694348328, 1.96250284019761, 2.04322996587519, 2.08497157275856, 2.0899661002218, 2.06903191016032, 2.03754764277234, 2.01021774039954, 1.99685779115398, 0, 0, 0, 0, 2.10052554036014, 2.11984620894457, 2.13189612790536, 2.13728110665595, 2.13738903470545, 2.13371732847486, 2.12738347627678, 2.11884315624598, 2.10781888823772, 2.09344232101834, 2.07460353686438, 2.05046674091682, 2.02105950660020, 1.98779468185492, 1.95376872129204, 1.92371904727234, 1.90361759239201, 1.90000364560147, 1.91927230689419, 1.96718838753431, 2.04886113090591, 2.16929682817279, 2.33447938215127, 2.55276197050079, 2.83622444353239, 3.20157080027028, 3.67008977667765, 4.26614716749673, 5.013600320537, 5.92946873971242, 7.01446010012979, 8.2414125807649, 9.54649567372274, 10.8329766324908, 11.9965841671648, 12.9613224645721, 13.7274244183203, 14.3015555286402, 14.6811613493057, 14.7935647529786, 14.5329897428001, 13.8407001792527, 12.7659258918045, 11.4677283177979, 10.1621040379609, 9.0483827073821, 8.24549741800722, 7.75411718136203, 7.49807943177817, 7.35969717590859, 7.22477095174145, 7.00803658123804, 6.66409980910448, 6.18955101284335, 5.61755260720478, 5.00451339516068, 4.41217241250260, 3.89250573714906, 3.48126355315427, 3.19903741029168, 3.05398784809124, 3.04231150818417, 3.14714937391073, 3.33993058860954, 3.59453190784398, 3.91419386929792, 4.27455190741087, 4.48400173261203, 4.3886753952194, 4.15270259423548, 3.96081669218834, 3.82163577293503, 3.71069325406455, 3.62790352015387, 3.57614276736261, 3.55294955067899, 3.55285289535755, 3.57026733138316, 1.10480588951478, 1.13973162005644, 1.17843198443470, 1.2260872133063, 1.28940317363614, 1.37498417524279, 1.48663118671564, 1.62234087119777, 1.77240892207476, 1.92008131109204, 2.04533581806943, 2.13085143587836, 2.16784817585825, 2.1591805155286, 2.11820167367268, 2.06391821677194, 2.01466346755079, 1.98297010969913, 0, 0, 0, 0, 2.06135881741654, 2.08314695574494, 2.09825417536246, 2.10684992459736, 2.10998321025265, 2.10883765811510, 2.10420204500342, 2.09617942249999, 2.08413034146384, 2.06684578792876, 2.04293721230291, 2.01139763444192, 1.9722350149735, 1.92703007919652, 1.87925540372025, 1.83423323987825, 1.79870787627895, 1.78013891287312, 1.78593848109967, 1.82292987154011, 1.89726915130456, 2.01495126868194, 2.18285495801099, 2.41011538483469, 2.70948566853317, 3.09826405257952, 3.59829975373812, 4.23451290313271, 5.03124981506028, 6.00569320793327, 7.15779911939937, 8.45785116316068, 9.83703725607356, 11.1922022626508, 12.4150425494835, 13.429023634366, 14.2584506108118, 14.9094824933427, 15.382049538181, 15.5868770037456, 15.3986609694871, 14.7487072048178, 13.6857805326760, 12.3708418675633, 11.0208794507340, 9.83358911217194, 8.9267386569962, 8.3168854357185, 7.93984863736648, 7.69228884269417, 7.4694352068031, 7.18864091443858, 6.80205916532897, 6.30176804201687, 5.71571489134189, 5.09419634748297, 4.49255684214331, 3.95800974971464, 3.52438396348523, 3.21271543602515, 3.03306250979564, 2.98458543785135, 3.05416906913482, 3.21877790913008, 3.47143818277871, 3.87017025185080, 4.4110412396696, 4.73015199042386, 4.51870743560812, 4.10015754496742, 3.82506291242926, 3.67709851184234, 3.57758799314518, 3.50919055327683, 3.47186580712054, 3.46239311652179, 3.47491689112451, 3.50369239351861, 1.09259269147293, 1.12648339577914, 1.16524806343820, 1.21500253681346, 1.28356356219863, 1.37852245442349, 1.50408149356672, 1.65756594079698, 1.82725089434319, 1.99318083806216, 2.13164880624121, 2.22222201355131, 2.25460013174145, 2.23224829147454, 2.17107291958425, 2.09374520194346, 2.02227160734264, 1.97194195927519, 0, 0, 0, 0, 2.02385469450301, 2.04787621287714, 2.06577585061504, 2.07727974459240, 2.08309786312332, 2.08410746087856, 2.08078412841083, 2.07290215729709, 2.05949197482675, 2.03904228088324, 2.00992787943252, 1.97101190133932, 1.92231837591571, 1.86562144672995, 1.80478164335074, 1.74570116043695, 1.69587162858016, 1.66362349825449, 1.65730755902768, 1.68469548948433, 1.75284901504695, 1.86858419878932, 2.03948826027335, 2.2752808678303, 2.58918415954514, 2.99887867182532, 3.52655048868287, 4.1974420706442, 5.03618119754002, 6.06003094517858, 7.26844923641765, 8.63008352683753, 10.0730401286278, 11.490609498157, 12.7735953381492, 13.859570732391, 14.7582444727795, 15.5082139254609, 16.0933365680617, 16.403500205769, 16.2953983287967, 15.6944155728285, 14.6507378870934, 13.3276769786089, 11.9417718903158, 10.6869744463448, 9.68007697911116, 8.94571807706118, 8.43589070391587, 8.06494045040962, 7.74038200218037, 7.38356170095187, 6.94461424064093, 6.4118111914697, 5.8092350770206, 5.18202740304209, 4.57827642745096, 4.03754234763704, 3.5883017366014, 3.24998128814764, 3.03455908826655, 2.94550183256647, 2.97501293051948, 3.10727837905074, 3.35925100133783, 3.85699179802917, 4.62207194042947, 5.07742364844644, 4.72240672794806, 4.07745934275981, 3.69818066439022, 3.5372794716143, 3.44906817798646, 3.39508750413308, 3.37199116091975, 3.37589375486047, 3.4006519255279, 3.44041619577327, 1.08006941171753, 1.11303351990491, 1.15196055072232, 1.20385925895660, 1.27760313584406, 1.38171852944129, 1.52078082950781, 1.6914625903671, 1.88009741953985, 2.06366082483967, 2.21491584050317, 2.31044780039043, 2.33849642650003, 2.30310586541981, 2.22262209449609, 2.12322295416734, 2.03043406280274, 1.96219133030469, 0, 0, 0, 0, 1.98822513480713, 2.01424941184788, 2.03466233903327, 2.04875622803230, 2.05690969807065, 2.05970509849795, 2.05732383739838, 2.04923971406282, 2.03419017985666, 2.01040495418473, 1.97606651803535, 1.92994662703966, 1.87211138967514, 1.80453746605977, 1.73146436715107, 1.65934812215865, 1.59638497251012, 1.55171516746302, 1.53454527461601, 1.55348748741996, 1.61637556392836, 1.73068938353014, 1.90454718696872, 2.14805801548179, 2.47469950028785, 2.90229819262905, 3.45311387834772, 4.15242914554776, 5.02489680007215, 6.08775452521722, 7.34026435846657, 8.75054013360485, 10.2458641616154, 11.7192773124281, 13.0640222316845, 14.2248586067824, 15.2200764777282, 16.0902680999717, 16.8052834716266, 17.2329313614732, 17.2157969596821, 16.6738148072042, 15.652824301889, 14.3189478582656, 12.8957048652500, 11.5756912917554, 10.4705437171529, 9.60911487249641, 8.9593041871031, 8.45516520067462, 8.01872120775808, 7.5767285976454, 7.07833864314502, 6.50949506182001, 5.89209572424734, 5.26660327920551, 4.67201804160830, 4.13660293493871, 3.67985213986765, 3.31766935872385, 3.06417573767813, 2.92873110016263, 2.91071774297832, 3.00249836411837, 3.24126650706821, 3.8065945528039, 4.73998983425282, 5.29924711404113, 4.83471715932010, 4.01829740614448, 3.56322341568362, 3.39745293558043, 3.32289991287684, 3.28445457161840, 3.27611273462255, 3.29351067730285, 3.3303752413731, 3.38087173527404, 1.06713002335740, 1.09922749153532, 1.13829306041276, 1.19213039961673, 1.27055123700846, 1.38290919050791, 1.53410399776426, 1.72021668235851, 1.92583964625228, 2.12520203281832, 2.28791045343511, 2.38788469246961, 2.41205938506642, 2.36499607544323, 2.26722168779241, 2.14805012207708, 2.03615596930510, 1.95184537704106, 0, 0, 0, 0, 1.95459748064579, 1.98241176742155, 2.00505871223768, 2.0214232339632, 2.03156768928051, 2.03579441987043, 2.03401290541399, 2.02542949632247, 2.00853196825542, 1.98134013289368, 1.94189083024759, 1.88889856749748, 1.82248446930261, 1.74481620732901, 1.6604797095875, 1.57643821492466, 1.50153701323129, 1.44566114759945, 1.41879317146479, 1.43028514825263, 1.48861824734302, 1.60178789861258, 1.77827291839082, 2.02837869529967, 2.36561880680999, 2.80771321005069, 3.37670570693602, 4.09760315226874, 4.9947922372049, 6.08535313334075, 7.36864872697784, 8.81338684659615, 10.3483193389227, 11.8694830388866, 13.2755167451802, 14.5188886570903, 15.6240161744333, 16.6279181930830, 17.4839414521584, 18.0430092103202, 18.1420802389593, 17.6863773225027, 16.6925310275615, 15.3295980154114, 13.8512616554676, 12.4605649283117, 11.2589700457949, 10.2719300141831, 9.48031532413198, 8.83838744821754, 8.28418213055386, 7.75129254868271, 7.189454422257, 6.5843832704453, 5.95771108233163, 5.3453706760025, 4.77480329209743, 4.258811065195, 3.8040825604423, 3.42113261463858, 3.12661209595853, 2.93761053594246, 2.86279814919386, 2.90280003875365, 3.10247055966783, 3.65148959664572, 4.59463912741762, 5.16456011917996, 4.68797264296615, 3.85669885566685, 3.40469996560978, 3.25417010726751, 3.19768589086478, 3.17661919791165, 3.18403606951675, 3.21535790931586, 3.26437442727869, 3.32542452905029, 1.05373826206938, 1.08498750668122, 1.12405115101024, 1.17937436795693, 1.26152462447726, 1.38052009457523, 1.54151654111819, 1.74010774056429, 1.95946602784159, 2.17158529555505, 2.34350552182260, 2.44698094094939, 2.46788870926009, 2.41121638280840, 2.29927054024881, 2.16392142663445, 2.03640976401455, 1.93897380325536, 0, 0, 0, 0, 1.92300341189822, 1.95242368059682, 1.97704055614641, 1.99537258319747, 2.00718593941892, 2.01251970427202, 2.01103672537121, 2.00171498124666, 1.98284430746182, 1.95229170163348, 1.90799800852569, 1.84864756140624, 1.77440997945218, 1.68760354421847, 1.59309813272143, 1.49829673939532, 1.41263250243384, 1.34667873815119, 1.31113017384015, 1.31599419230321, 1.37028674365481, 1.48237787144252, 1.66094017154617, 1.91628269879467, 2.26173177423158, 2.71463974300915, 3.29653188143405, 4.03180738357422, 4.94427625174843, 6.05069938841322, 7.35077555435101, 8.81479446015053, 10.3749771964701, 11.933047648378, 13.3950862941261, 14.7208014855859, 15.9372886349607, 17.0746191726552, 18.0728327922758, 18.7819689109905, 19.0498215546726, 18.7413749319490, 17.7851491559766, 16.3529971717198, 14.7784924757846, 13.3011177454035, 12.0045899517902, 10.8975281102768, 9.96758708178804, 9.18823880386408, 8.51451087277347, 7.88851115379281, 7.26274118402454, 6.62517372760472, 5.99894341616321, 5.41508807658444, 4.88653615271766, 4.40625227493652, 3.96431661130635, 3.56410940312005, 3.22536472505094, 2.974961224473, 2.83320110592435, 2.80905957708161, 2.94110106049522, 3.38107326319098, 4.1585850375097, 4.63589378141589, 4.25474719101611, 3.58154148214524, 3.21965569624523, 3.10653197426286, 3.07300734355814, 3.07142764969769, 3.09580823819109, 3.14162071114107, 3.20291526187436, 3.2743752788748, 1.03993096743807, 1.07032506278931, 1.10915422040637, 1.16530236003887, 1.24985351040254, 1.37327921592104, 1.54090578269681, 1.74798197608328, 1.97668728999166, 2.19745668079912, 2.37554255859186, 2.4811943005693, 2.49956039740852, 2.43593723946017, 2.3138853166153, 2.16706883744929, 2.02852574841233, 1.92184611431169, 0, 0, 0, 0, 1.89335692834254, 1.92423545781155, 1.95059195453422, 1.97062812081397, 1.98383390417540, 1.99000074286832, 1.98857312252786, 1.97834856081856, 1.95748385704106, 1.92376298043183, 1.87508502212178, 1.81011977154413, 1.72904799651139, 1.63425395678879, 1.53078650933030, 1.42639734853349, 1.33105062474711, 1.25597923457848, 1.21256311962543, 1.211411446722, 1.26197998777612, 1.37287780156612, 1.55280284612479, 1.81187155803477, 2.16299676879371, 2.6229005437734, 3.21228713952599, 3.95461727220578, 4.87281016789061, 5.98311729788887, 7.2857057106199, 8.7531697265089, 10.3226590640286, 11.9033762536789, 13.4096698359776, 14.8068372803984, 16.1210409587582, 17.3744911103895, 18.5038525980048, 19.3847990086172, 19.9041130512343, 19.8464802537508, 18.9532559612267, 17.3896685486017, 15.6493351107782, 14.0569217638778, 12.6670247632186, 11.4495894290264, 10.3894065779757, 9.4770002289530, 8.6852423654237, 7.96709030326162, 7.28076695178615, 6.61908452410128, 6.00774301348632, 5.47163844031236, 5.00582514077527, 4.57919786790578, 4.16177142964374, 3.74830792210543, 3.36234228104793, 3.04275693243495, 2.82403385935268, 2.72463338607132, 2.77043376386471, 3.05127103059847, 3.57237838895841, 3.90393146915024, 3.67272405948706, 3.24593091793093, 3.01946034615338, 2.95629916357576, 2.94937582021758, 2.96921223283823, 3.01170241753335, 3.07255030832972, 3.14624127435675, 3.22796105396074, 1.02582227735342, 1.05535398010028, 1.09366666455625, 1.14984267233729, 1.23520043808051, 1.36041691508426, 1.53089004583244, 1.74169333963475, 1.97451871926256, 2.19904037891091, 2.3796420139239, 2.48584769501000, 2.50246639841505, 2.43496755809966, 2.30754814471535, 2.15476873636519, 2.01055731316446, 0, 0, 0, 0, 0, 1.86541400026264, 1.89764559278251, 1.92557064266269, 1.94712147246933, 1.96152283961485, 1.96832814962070, 1.96679499632654, 1.95560239003385, 1.93286068677209, 1.89636171443199, 1.84402491466019, 1.77450279970846, 1.68790028616861, 1.58651274585118, 1.47539821025578, 1.36253540125810, 1.25838046817508, 1.17485391772142, 1.12406298478324, 1.11721975882330, 1.16415227772011, 1.27357620378512, 1.45403703985966, 1.71525169820105, 2.06948817308672, 2.53257843880859, 3.12411413435815, 3.86630317586712, 4.7808723243819, 5.88335331639968, 7.17439714024284, 8.6293046100876, 10.1909711212168, 11.7768733985851, 13.3092807134415, 14.7565594420184, 16.1405702081968, 17.4768492530923, 18.7118810468321, 19.7776776555536, 20.6336883419751, 20.9567254733387, 20.1905312905105, 18.4368799194418, 16.4358974300351, 14.6880865090464, 13.2078603818306, 11.8937715287394, 10.7151077223166, 9.67680551964508, 8.7707404423834, 7.96405347528263, 7.22451050750371, 6.55214557735801, 5.97508532814266, 5.50966420860472, 5.12941704385461, 4.77545403140032, 4.39492809181753, 3.97286574558289, 3.53742652035223, 3.14175059845003, 2.83714487530986, 2.65388962117223, 2.60835772508618, 2.73527565521623, 3.0181145572862, 3.21518880476227, 3.12034977198468, 2.91958396012209, 2.81995730616512, 2.80662444296583, 2.82800835642973, 2.87069122287679, 2.93216716840114, 3.00844211571620, 3.09456735506986, 3.1863558190438, 1.01160692005338, 1.04030039310963, 1.07782166782766, 1.13318975351891, 1.21765094975431, 1.34181858340324, 1.51105468975107, 1.72044037845002, 1.95172517475660, 2.17468391714116, 2.35382349043897, 2.4587847402046, 2.47445847719687, 2.40634217928974, 2.2786037271608, 2.12573034201601, 1.98155804488291, 0, 0, 0, 0, 1.80571245523669, 1.83870729719839, 1.87223773454329, 1.90165705271267, 1.92465775213268, 1.94018807590714, 1.94755953591264, 1.94587816313595, 1.93378904125657, 1.90947818779140, 1.87087092489650, 1.81598263814625, 1.74341723463298, 1.65303825066996, 1.54678659087214, 1.42945912233753, 1.3090961678708, 1.19664226746488, 1.10483148670934, 1.04665642590097, 1.03402305912932, 1.07710666674731, 1.18459803298698, 1.36469201085675, 1.62647743890647, 1.98133527911457, 2.44395176251166, 3.03253294660888, 3.76774852598455, 4.66985828454912, 5.75345862370587, 7.01959745320356, 8.44638212353566, 9.9826787329912, 11.5541925777933, 13.089971779318, 14.5586816027459, 15.9751365178099, 17.3501886522649, 18.6507911295221, 19.8825028983498, 21.1011581492899, 21.9076135585424, 21.3991627093274, 19.4573344121182, 17.1016779487026, 15.1550901622987, 13.5923416173947, 12.1995553630542, 10.9170582732069, 9.76201466768818, 8.74701461383123, 7.85772770074768, 7.0759989785008, 6.41101138509752, 5.89178733369965, 5.52255782341881, 5.25170513338048, 4.98970874147798, 4.65891959304474, 4.23385970992346, 3.74809644009125, 3.27115150847581, 2.87371813795380, 2.60068769548145, 2.46676036581926, 2.47372129758928, 2.59176441179691, 2.69808088644139, 2.69127447932974, 2.64064813640115, 2.63139328360380, 2.66067468964316, 2.71053522530999, 2.77682909505654, 2.85775480882934, 2.94960469240545, 3.0480705784283, 3.14967137491526, 0.997560833168382, 1.02550650870025, 1.06203178454735, 1.11582761818357, 1.19775845870028, 1.31810176223002, 1.48207287757926, 1.68494000934542, 1.90905194218795, 2.12514213213168, 2.29882976606676, 2.40071305212298, 2.41618607260544, 2.35063044824133, 2.22752001009542, 2.08029734653683, 1.94172058476645, 0, 0, 0, 0, 1.77844961285460, 1.81245387349484, 1.84729560355688, 1.87828754911457, 1.9028723207533, 1.91966875185731, 1.92771836301546, 1.92601592787383, 1.91329259713944, 1.88798811774479, 1.84834189971688, 1.79256304977836, 1.71913294370706, 1.62738893422765, 1.51848345492207, 1.39652960430952, 1.2693994152888, 1.14857967646170, 1.04789722601920, 0.981568187364813, 0.962421739139982, 1.00101935893633, 1.10589406182318, 1.28465681062745, 1.54550250291555, 1.8986620078655, 2.35742179991282, 2.93835197471374, 3.66033604349328, 4.54193169491662, 5.59659737110635, 6.82562257656828, 8.20979359859746, 9.70373901076467, 11.2408219115957, 12.7554843511631, 14.2143872003541, 15.6234904712394, 16.990295021882, 18.3046725687164, 19.6358834173618, 21.1306534213728, 22.4193711475810, 22.3317915446646, 20.3087811164344, 17.5741399424383, 15.4169231902559, 13.7915701342804, 12.3424419361091, 10.9732112904132, 9.71257058497935, 8.5959430797656, 7.63238090969573, 6.8225536703692, 6.18608786672666, 5.75024942052392, 5.50305044944623, 5.36462829290447, 5.21315129344, 4.94511203633521, 4.52394758664736, 3.98914260286382, 3.42837028305348, 2.93396977353382, 2.56785806383231, 2.34997571673175, 2.26918428036199, 2.29002893094672, 2.34526432339046, 2.3814311638208, 2.41038952347654, 2.4569403207109, 2.52113916551417, 2.59873921282632, 2.68868722828663, 2.78904477181651, 2.89632728488181, 3.00688157151414, 3.11795975784644, 0.984037617612806, 1.01142577913925, 1.04688246331256, 1.09852127422955, 1.17653306272647, 1.29060180722814, 1.44568764038464, 1.63740576875896, 1.84919936749818, 2.05354893195050, 2.21809699771135, 2.31517460981324, 2.33106855504908, 2.27091151955522, 2.15686636572407, 2.02042677837346, 1.89235158995455, 0, 0, 0, 0, 1.75046567422901, 1.78544347752892, 1.82170404672001, 1.85457966148879, 1.88118542316903, 1.89969050580836, 1.90879934625308, 1.90744212002496, 1.89460870245747, 1.8692541895626, 1.83019492870750, 1.77596590734405, 1.70479202840582, 1.61502809557940, 1.50636097477801, 1.38157747456271, 1.24805851934897, 1.11797049930290, 1.00673427444189, 0.930388249777948, 0.903113906686615, 0.935989418225768, 1.03725336190731, 1.21364634387706, 1.4721459822684, 1.82153491212993, 2.27344110884513, 2.84257092452241, 3.54581550106296, 4.39984306342527, 5.41680175869754, 6.59804067283221, 7.92676641837584, 9.36292478732141, 10.8467825920663, 12.317049538971, 13.7370919754603, 15.1033319566973, 16.4199189104114, 17.6933213203939, 19.0237410563955, 20.6095439135118, 22.2188626310053, 22.6063942969818, 20.6879126499616, 17.7190356512176, 15.4310682503249, 13.7853663323208, 12.3063087472732, 10.8697740238746, 9.51748017916185, 8.30960819619003, 7.2829633190412, 6.46116886212965, 5.87487364340106, 5.54652397299636, 5.4442169056116, 5.45799949366485, 5.43344230965492, 5.24090197752489, 4.8320995086088, 4.25239832010788, 3.60876548925047, 3.01689490316301, 2.55734624787037, 2.25913678351461, 2.10939421956693, 2.07127145460335, 2.09703828474162, 2.14898225717742, 2.21566338306058, 2.29684069169086, 2.39036364004672, 2.49435124963134, 2.60729066599064, 2.72657623840116, 2.84885288638491, 2.97107923724482, 3.09121785707345, 0.971459825966679, 0.998608387801888, 1.03310739535480, 1.08227516275883, 1.15537359751239, 1.26126590969737, 1.40455577620029, 1.58133197252920, 1.77654366860293, 1.96508015610592, 2.11737513845789, 2.20814765403943, 2.22490652083426, 2.17242098419243, 2.07101385167732, 1.94944995496044, 1.83568867163124, 0, 0, 0, 0, 1.72013756557919, 1.75593099331962, 1.79385886230853, 1.82926913088081, 1.85877049157812, 1.87986245279258, 1.89078723474865, 1.89046453866286, 1.8783891512508, 1.85441023343660, 1.81829942659656, 1.76909963657125, 1.70456629821716, 1.62138418292203, 1.51676866200750, 1.39123951801067, 1.25123677804825, 1.10985515997004, 0.984909542681677, 0.895210507253769, 0.856990131620135, 0.882096804517931, 0.978332001473723, 1.15120605394432, 1.40607555683809, 1.74992462178705, 2.19244991741391, 2.74628547671905, 3.42616592921611, 4.24673419917158, 5.21869864711565, 6.34329575596431, 7.60585055526862, 8.97111210415583, 10.3855659085724, 11.7916028342807, 13.1492077446017, 14.4457194156585, 15.6810222003548, 16.8677818483120, 18.1010066263597, 19.5734998698562, 21.2063283183735, 21.8932605275869, 20.2567827517088, 17.3918329834376, 15.1670487856400, 13.5658197212973, 12.0854091878812, 10.6032646693369, 9.17723319793398, 7.89306432177594, 6.81798063906048, 6.00112326851375, 5.48402595584097, 5.28177355884121, 5.34043238069579, 5.52007898796947, 5.63495465499833, 5.52966047127258, 5.14333444614876, 4.52639616282374, 3.80530853151601, 3.11996347561404, 2.57024913967037, 2.19554051486398, 1.98546433293506, 1.90347862236651, 1.90702297218895, 1.96153189552628, 2.04660978120843, 2.15167149821511, 2.27045950715575, 2.39889469376168, 2.53352868353043, 2.67080017165063, 2.80736152759876, 2.94069055277642, 3.06939451619883, 0.960304672553514, 0.987677299121674, 1.02154740039932, 1.06826304251503, 1.13595183804885, 1.23247101413344, 1.36197799310928, 1.52111886785725, 1.69665042694228, 1.86636462022055, 2.00406363665093, 2.08734910026752, 2.10520025245428, 2.0619317077013, 1.97561219993721, 1.87166102921054, 1.77459698802378, 0, 0, 0, 0, 1.68527264287413, 1.72157695304012, 1.76162662482731, 1.80069387835730, 1.83456306635897, 1.85970677738001, 1.87369910893414, 1.87551085349473, 1.86548337196194, 1.84489140260310, 1.81499122388366, 1.77558308756392, 1.72364403229993, 1.65321331791367, 1.55761724599420, 1.43379341370010, 1.28663014722083, 1.13053587657899, 0.986890539118945, 0.878663861761312, 0.82517221100699, 0.839441049516308, 0.928684413003913, 1.09673007501431, 1.34680764216297, 1.68368345913019, 2.11482577465671, 2.65060143279348, 3.30346349199873, 4.08594462150438, 5.00723262382784, 6.06831290531273, 7.25634340697171, 8.54039808108924, 9.87267756652758, 11.1992210893923, 12.4775644811400, 13.6873659481387, 14.8233752228127, 15.8956791010380, 16.9716607077361, 18.1909248319357, 19.5496972662868, 20.2207474975313, 18.9591158259112, 16.572309222692, 14.6320193187002, 13.1402849439639, 11.6854023349000, 10.1813034950558, 8.70423833413912, 7.36432636824328, 6.25912159862487, 5.46350230607213, 5.0290873101669, 4.96239808572317, 5.18786565697386, 5.53818949960021, 5.79921302317837, 5.79082766217718, 5.43850076788906, 4.79598841851855, 4.00818186708345, 3.23874264422896, 2.60650405166979, 2.1609912627801, 1.89527366584608, 1.77378330784233, 1.75537409197107, 1.80557447497989, 1.90006431843874, 2.02283956497768, 2.16320722078109, 2.31358228336464, 2.46809783519404, 2.62205527429776, 2.77196559636319, 2.91569578505082, 3.05239980169906, 0.95108431862122, 0.979296291134575, 1.01309687174522, 1.05773805474051, 1.12006525818608, 1.20679335420813, 1.32155811949481, 1.46159975713152, 1.6156611535216, 1.7647417172567, 1.88637429982743, 1.96135587235192, 1.98029209092176, 1.94697638701850, 1.87693656735675, 1.79180994307366, 1.71220806897508, 0, 0, 0, 0, 1.64313780895901, 1.67950006823137, 1.72241378354199, 1.76687450374331, 1.80734742429013, 1.83874514594204, 1.85766267787651, 1.86318868704515, 1.85696672644755, 1.84241223274065, 1.82297720053463, 1.79955286195461, 1.7679242287051, 1.71818378613949, 1.63788293426548, 1.51863469676055, 1.36297933160555, 1.18717661192765, 1.01776123889828, 0.883743431564935, 0.808937460543945, 0.808126858991371, 0.887779735982757, 1.04948459952473, 1.29372161134567, 1.62253971874503, 2.04084954081546, 2.55656402380479, 3.17976387245663, 3.92083331079112, 4.78740695862813, 5.78012414830259, 6.88773443428403, 8.08323190163563, 9.32420037641722, 10.5606676796553, 11.7492516880401, 12.8639236355331, 13.8941630674096, 14.8431696557821, 15.7459705448660, 16.6729213615750, 17.6154514033032, 18.0500693150149, 17.1520604402034, 15.4217580767356, 13.8783653683135, 12.5310254397431, 11.1230212238664, 9.62188792597147, 8.12109991371683, 6.75148798548525, 5.63761875990788, 4.87763738861606, 4.53185936986394, 4.59877947886043, 4.98445002216841, 5.49937412237967, 5.90565188495454, 6.00040288398029, 5.69441361842045, 5.04222512395637, 4.20451983294783, 3.36656361762337, 2.66443738885096, 2.15674249219377, 1.83994160584543, 1.68008881535013, 1.63756973029919, 1.67839321125631, 1.77638327608945, 1.91185591043523, 2.06991836427751, 2.23927423955255, 2.41148672357498, 2.58056674055624, 2.74271608348126, 2.89603813126163, 3.04011558962406, 0.944321349231223, 0.97413216462925, 1.00864314347021, 1.05193401519828, 1.10947861334332, 1.18676344310755, 1.28684332786640, 1.40754381463176, 1.53964993106133, 1.66748411922763, 1.77245602370390, 1.83868758872101, 1.85847301947430, 1.83504086330994, 1.78121552444379, 1.71459162057188, 1.65157546381819, 0, 0, 0, 0, 1.59066540136799, 1.6265162393636, 1.67341322380626, 1.72574728140143, 1.77596143762750, 1.81666697296651, 1.84304217216708, 1.85436023334117, 1.85414512378412, 1.84886751201615, 1.84508388963736, 1.84520621633481, 1.84331604339017, 1.82393503158163, 1.7664861778473, 1.65508736015079, 1.48894656788663, 1.28686141641603, 1.08252593839058, 0.91336341077317, 0.809477951249996, 0.788166530985535, 0.854986314439343, 1.00862756370898, 1.24608383898218, 1.56610736518297, 1.97068886507764, 2.46510587815061, 3.05700531631018, 3.75462542712121, 4.56405793658297, 5.4855433235809, 6.50922894777293, 7.61169038632372, 8.75565883442602, 9.89561594094782, 10.9889300900854, 12.0060563680472, 12.9318772742126, 13.7624067607966, 14.5073926251239, 15.1830224441504, 15.7536867068034, 15.9347596638694, 15.3176922803559, 14.1616865657102, 12.9769006224760, 11.7707795854786, 10.4244574754927, 8.95139450492716, 7.45736349516749, 6.08803266404915, 4.9886916550443, 4.27580596401902, 4.01648451833252, 4.20330973257952, 4.72969740190946, 5.39136964768243, 5.93305041105437, 6.13233062231567, 5.88492361990525, 5.24301829243355, 4.37868390070267, 3.49447306420965, 2.74043206381528, 2.18251099439081, 1.82047048549797, 1.62307473198842, 1.55371786424714, 1.58038465460896, 1.67651266359201, 1.81974534784172, 1.99138408158093, 2.17649225264571, 2.36399380578766, 2.54646223877838, 2.71961641540144, 2.88163580103803, 3.03240626237118, 0.940520392826103, 0.972813640618701, 1.00900436813902, 1.05196900200722, 1.10577428392406, 1.17463950837842, 1.26099578674977, 1.36320596725615, 1.47404390910284, 1.58110007216261, 1.66961137203939, 1.72698791228199, 1.74718853113531, 1.73285216638162, 1.69404702753879, 1.64421882698868, 1.59541751656278, 0, 0, 0, 0, 1.52490024895367, 1.55962774542444, 1.61208515856043, 1.67559440691135, 1.73964973418194, 1.79359552085616, 1.83061657529745, 1.85022844834583, 1.85852800423004, 1.86614411384209, 1.88383365622318, 1.91605687159231, 1.95461277726707, 1.97657209774334, 1.95049907378614, 1.85049900161375, 1.67130934836900, 1.43506886513072, 1.18496673358818, 0.96960564997879, 0.827476146612508, 0.779286287713264, 0.829515407999217, 0.973218459144729, 1.20307745135217, 1.51390885409132, 1.90439867220483, 2.37701508957244, 2.93693583458744, 3.59028980438135, 4.34167150068762, 5.190904694509, 6.12937868503407, 7.13695184995947, 8.1812797710307, 9.22168143450828, 10.2177330283435, 11.1383812060573, 11.9650592230322, 12.6882945965448, 13.3030426732305, 13.7976665799820, 14.1261695848349, 14.1499407790244, 13.7122720225944, 12.9247537182098, 11.9857068901775, 10.8975519295202, 9.62293084625415, 8.20186265486921, 6.74578945161239, 5.40796298625173, 4.34605635211064, 3.68814073987062, 3.50577693763167, 3.78869060652350, 4.42490758274026, 5.20426466826687, 5.86204719724194, 6.16129629004797, 5.98349048239127, 5.37512166132239, 4.51347830628261, 3.61173227650245, 2.82888864940137, 2.23593771907048, 1.83610214877894, 1.60252940303681, 1.50375661143898, 1.51166476345846, 1.60074379941130, 1.74685331232132, 1.92791289939314, 2.12547072498189, 2.32576502208277, 2.51979714497249, 2.70263936429807, 2.87239409212799, 3.02912819319809, 0.940137068732055, 0.975889392626321, 1.01487076475651, 1.05876035020866, 1.11022734736570, 1.17222542804948, 1.24653527418860, 1.33197959112864, 1.42318074121202, 1.51080437555082, 1.58370599640577, 1.63241103046983, 1.65244818468030, 1.64585658752975, 1.61998352854213, 1.58414362717846, 1.54599696937540, 0, 0, 0, 0, 1.44371219856101, 1.47678383050616, 1.53688786050227, 1.61567928262773, 1.69856483431866, 1.7704449494099, 1.82179996350593, 1.85242568123711, 1.87176717880221, 1.89585460621644, 1.94088038579939, 2.01396453507321, 2.10403531722876, 2.17872407094179, 2.19283540370433, 2.10778475397795, 1.91262732692944, 1.63369508909225, 1.32615447957068, 1.05273034101848, 0.862535190925361, 0.780654754585628, 0.81033019850482, 0.94221818904408, 1.16383536907563, 1.46540847182790, 1.84193693851122, 2.29292302944723, 2.82106569533526, 3.43044967863505, 4.12424553199568, 4.90186856467112, 5.75581987459988, 6.66895748061567, 7.61359535989933, 8.55407723726236, 9.45325548844007, 10.2802197381240, 11.0142092677115, 11.6422054105729, 12.1525880542070, 12.5255697225560, 12.7216429219752, 12.6753583411735, 12.3348472040677, 11.7383740124419, 10.9446852039132, 9.95151747934865, 8.75591687676917, 7.4081264134003, 6.01910050400593, 4.74211475321368, 3.73812106318327, 3.1393066725737, 3.01900719997446, 3.36723467703441, 4.07410761766882, 4.93296374264173, 5.67880276340669, 6.06702697031743, 5.96739433944242, 5.41757558500513, 4.592450504489, 3.70698982387233, 2.9225673607012, 2.31242542198641, 1.88372574324765, 1.61619752025296, 1.48604497533583, 1.47113203530700, 1.54843495700823, 1.69287680709756, 1.87941417065286, 2.08622333930752, 2.29683744401105, 2.50058081155786, 2.69174250301902, 2.86821510562679, 3.03013683520428, 0.94354564375181, 0.983787386357153, 1.02675280552026, 1.07295699757722, 1.12371510950438, 1.18074845445232, 1.24517546475670, 1.31618367801439, 1.39004416549649, 1.46020800792066, 1.51882724818684, 1.55927229317398, 1.57849612815685, 1.57793900104003, 1.56232788310408, 1.53695717193831, 0, 0, 0, 0, 1.35271072387667, 1.34672504611843, 1.37785678824035, 1.44819982498715, 1.54703011471877, 1.65436466257631, 1.74932452688019, 1.81887070844607, 1.86308633196447, 1.89556572055070, 1.9390322954291, 2.01639759254752, 2.13810363653531, 2.28969692155518, 2.427504372846, 2.48982672335683, 2.42285040369026, 2.20879317432130, 1.87897606141514, 1.50288071153121, 1.16013063439487, 0.912573335938535, 0.790591133594649, 0.796045458530972, 0.914487103973513, 1.12747697504965, 1.42005384450062, 1.78319316238872, 2.21331005740126, 2.71064434367517, 3.27732646536599, 3.91519716760642, 4.62329005734311, 5.39510456168936, 6.21621757327717, 7.06327301242258, 7.9056052297844, 8.70999107284356, 9.4469034688277, 10.0945462295239, 10.6377911612855, 11.0628781323255, 11.3507040461026, 11.4727456489421, 11.3958976497151, 11.1004131347047, 10.5939821656954, 9.88658154300633, 8.97332299910585, 7.86228671352143, 6.60515880166245, 5.30766424451044, 4.11621685142323, 3.18646404006103, 2.64746228968406, 2.57146590101964, 2.95124046979819, 3.68553460661292, 4.58003896186162, 5.37921139998847, 5.83940340887789, 5.8229104324573, 5.35607422557408, 4.60293024962532, 3.76997450626262, 3.01328345100888, 2.40527823300771, 1.9577693963065, 1.65955376513281, 1.49713048904909, 1.45637228309705, 1.51806507254699, 1.65697080329399, 1.84549145126302, 2.05860725754754, 2.27717769870547, 2.48879719654197, 2.68687859175995, 2.86900330070003, 3.03529057594503, 0.95100699763883, 0.996777418088754, 1.04493853403867, 1.09489171735182, 1.14666407008325, 1.20080029597647, 1.25775824488018, 1.31698976653930, 1.37618399211406, 1.43123344170487, 1.47719934470206, 1.50996994964733, 1.52774809125958, 1.53138611245173, 1.52313790116606, 1.50445774682786, 0, 0, 0, 0, 1.25717033989132, 1.23631649997316, 1.26567685675133, 1.34927921487272, 1.47323274442430, 1.61079077120577, 1.73390142958542, 1.82514919323654, 1.88487390658289, 1.93156622510922, 1.99585310968938, 2.10856640545299, 2.28413007258993, 2.50438077278172, 2.71289653815108, 2.82930920342713, 2.78256120706929, 2.54710393882458, 2.15985337690282, 1.70642682024983, 1.28551561074783, 0.97335542336343, 0.806345766466208, 0.784860642541372, 0.888796920438674, 1.09315143126948, 1.37732370797529, 1.72802632558869, 2.13852609768343, 2.60665928553805, 3.13271442675496, 3.71731220065095, 4.35914436375287, 5.05260755479131, 5.78571780613993, 6.53906689754941, 7.28675649935905, 7.9997713338195, 8.65082460150697, 9.21808220509489, 9.68525907585324, 10.0381560450378, 10.2604089776522, 10.3321653603728, 10.2343516080589, 9.95575171538123, 9.49350282273242, 8.8439393319599, 8.00210252152164, 6.97951179241517, 5.82576825235773, 4.63806265082522, 3.55043386770376, 2.70615779064204, 2.22498257869636, 2.17526501123687, 2.55386996610945, 3.27295854630929, 4.15800711278785, 4.97239170287795, 5.48289914436722, 5.5499692083799, 5.18702264977242, 4.53896565214011, 3.79326171665902, 3.09279857136931, 2.50610459938342, 2.05040417954058, 1.72595044009793, 1.53189208252267, 1.46381202181983, 1.50738416128486, 1.63787149840531, 1.82552799994552, 2.04237436114477, 2.26670819978793, 2.48441575204783, 2.6879987672148, 2.87466592179464, 3.04445098675135, 0.962638766407284, 1.01493860768696, 1.0694611551687, 1.12455298837906, 1.17903163013805, 1.23233516045771, 1.28427466268385, 1.33447119597981, 1.38179651568390, 1.42422544856909, 1.45931987873487, 1.48513962227921, 1.50095527745115, 1.50705398216142, 1.50339897192472, 1.48784167048130, 0, 0, 0, 0, 1.15582885129295, 1.11845060027401, 1.14687235533435, 1.24701547383466, 1.40101680322886, 1.574053465753, 1.72959445735005, 1.84504100250775, 1.92092301293643, 1.98122831494475, 2.06546046634203, 2.21333398343283, 2.44384371760246, 2.73507944527938, 3.01716561082883, 3.1899368554317, 3.16401988849397, 2.90558224317328, 2.45740739780048, 1.92214812768634, 1.41864848471555, 1.03836076112613, 0.824060586871835, 0.774576625384017, 0.863875564125216, 1.06009187759571, 1.33678016028384, 1.67630866118825, 2.06882214094618, 2.50985322138440, 2.9979826054215, 3.53273226158439, 4.11250145569231, 4.73249455572551, 5.38289428164228, 6.04782807996747, 6.70580904613466, 7.3320351253735, 7.90199073879248, 8.3946253993592, 8.79320211278241, 9.08352898775428, 9.25152754880851, 9.2827756499107, 9.16487693270687, 8.88988780971758, 8.4528090167962, 7.84811864990748, 7.0730449039241, 6.14113140479597, 5.09867483929346, 4.03223862561108, 3.05970217261452, 2.30697453157639, 1.87990324937794, 1.84043047804881, 2.18969061962957, 2.8559619426594, 3.68989268434652, 4.48195280417731, 5.01857471122153, 5.16452133132806, 4.91978395647558, 4.40311269282096, 3.77353370012533, 3.15367626124512, 2.60543954053048, 2.1520488739111, 1.8070468380001, 1.58389552573572, 1.48899451597961, 1.51361062547930, 1.63402370037281, 1.81875932438784, 2.03720584533219, 2.26531873101537, 2.48739127399064, 2.69504803998947, 2.88510824513838, 3.05747959769399, 0.978389826513545, 1.03813366409216, 1.10007752811983, 1.16157462697492, 1.22031632545043, 1.27471197345863, 1.32395084031110, 1.36774223687365, 1.40592127165896, 1.43820233855814, 1.46425397202840, 1.48397280984886, 1.49752542336446, 1.50467194900804, 1.50329881247949, 1.48794868948076, 0, 0, 0, 0, 1.05709619079297, 1.00305150595891, 1.03220828539262, 1.15217992513101, 1.34038110092724, 1.55282393715889, 1.74345625430759, 1.88385599320229, 1.97465376049709, 2.04569999655414, 2.14595535941778, 2.32458327286331, 2.60559224037445, 2.96366597768010, 3.31578864106576, 3.54230933990802, 3.5357812336089, 3.25414662311207, 2.74587039503826, 2.1302653105808, 1.54590855345934, 1.09915102497817, 0.838997519291495, 0.76273694887476, 0.83850002303247, 1.02768326158842, 1.29812302143778, 1.62797108260356, 2.00438808882176, 2.42075480076785, 2.87409929395491, 3.36297456965993, 3.88554367635094, 4.43774166523155, 5.01166154797571, 5.59455071851085, 6.16890329556817, 6.71394387367587, 7.20819344433113, 7.63201776894453, 7.96882915560246, 8.20456069716965, 8.32655819498416, 8.32351701974324, 8.18669176875442, 7.91056465626032, 7.49141734951126, 6.92599733293301, 6.21523289241848, 5.37472215879375, 4.44700857293932, 3.5069433059011, 2.65422556307159, 1.99458964805460, 1.61716226714645, 1.57550060664533, 1.87426515142982, 2.45859358391074, 3.20733255644979, 3.94401805812457, 4.48238796568358, 4.69733798684732, 4.57603232131514, 4.20631227259223, 3.71189458582795, 3.18990842922118, 2.69353254025187, 2.25217334812197, 1.89351647770082, 1.64594462224690, 1.52696437239695, 1.53367160366248, 1.64371328895448, 1.82433426272097, 2.04273146507718, 2.27286457470668, 2.49765381101943, 2.70795405608894, 2.90022442043484, 3.07423178856951, 0.998021522634223, 1.06599193535286, 1.13625821691098, 1.20524093898920, 1.26958929611484, 1.32676579415690, 1.37537343261551, 1.41514899165220, 1.44670231100576, 1.47118287959050, 1.49001119269525, 1.50461881104138, 1.51591961397429, 1.52320460244987, 1.52253001599029, 0, 0, 0, 0, 0, 0.972530748310331, 0.903652747420896, 0.936146147682005, 1.07891424140846, 1.3040367114461, 1.55766448773798, 1.78362889201175, 1.94733442562736, 2.04942578295794, 2.12567843298615, 2.23457370640998, 2.43476691847413, 2.75550769134523, 3.16883327409701, 3.58008607076567, 3.85213060874572, 3.86123366657837, 3.55785080230452, 2.99540733027766, 2.30800631595915, 1.65177413137852, 1.14629653275103, 0.846065077276777, 0.746906208714226, 0.811640146078131, 0.995542024076472, 1.26124249505557, 1.58304567249008, 1.94539200193690, 2.33971780030030, 2.76167349935783, 3.20897824116357, 3.67961965035758, 4.17019935526695, 4.67448772742593, 5.18245530312672, 5.68012075060947, 6.15042970961559, 6.57499702276399, 6.93603977479963, 7.21763948728686, 7.40599676237211, 7.48926813769046, 7.45787634505296, 7.30529734448447, 7.02822804455271, 6.62554792895963, 6.09779696280771, 5.4502614749264, 4.70058043875242, 3.88733193833194, 3.07339783517054, 2.33983097283263, 1.77134631066104, 1.43921123844401, 1.38734951416898, 1.62270673564244, 2.10646236722098, 2.74633362867571, 3.40207518672835, 3.91981417491746, 4.18918162452068, 4.18612518308838, 3.96577393150584, 3.61317407285830, 3.19725774590358, 2.76125180718354, 2.34035575503723, 1.97599371421654, 1.71079927613797, 1.57274383841660, 1.56448005581144, 1.66520486009922, 1.84136756699013, 2.05853715091498, 2.28915460822616, 2.51509137194218, 2.72661114233193, 2.91988532118113, 3.09454875014395, 1.02109811365829, 1.09790342533427, 1.17719009048300, 1.25450575084211, 1.32554067992114, 1.38689493588371, 1.43663133811434, 1.47447683105750, 1.50166585111370, 1.52052859982120, 1.53393542575763, 1.54459492985968, 1.55404924406943, 1.56119995998691, 0, 0, 0, 0, 0, 0, 0.915847593483214, 0.836178187324251, 0.875480130812127, 1.04332674785114, 1.30606534444417, 1.59982787176808, 1.85833499845374, 2.04086468873261, 2.14802588501659, 2.22124836777596, 2.32801635511758, 2.53592940752266, 2.87944091474338, 3.32909590659129, 3.78127729870511, 4.08506749972566, 4.10379415256363, 3.78185336753706, 3.17637374494268, 2.43287500555873, 1.72107155818744, 1.17076414429705, 0.840588188079475, 0.72505655214225, 0.782638398039884, 0.963599267521557, 1.22626441339956, 1.54170030578401, 1.89201579739259, 2.26696334976238, 2.66100738159669, 3.07117041737781, 3.49532733412199, 3.93069437616132, 4.37251379082112, 4.81311646953738, 5.24159839168944, 5.64425894952087, 6.00571113154896, 6.31026924221787, 6.54309629105133, 6.69087657669489, 6.74229376488013, 6.6887408728011, 6.52514406252388, 6.25019178285313, 5.86570934984937, 5.37637703463917, 4.79176790447123, 4.13124097277968, 3.42930154841628, 2.73724520476704, 2.11821535980161, 1.63660232929412, 1.34607659103837, 1.28045981934670, 1.44764883334241, 1.82300341445903, 2.34171244382718, 2.89992350191968, 3.3781526383509, 3.68364261009139, 3.78353529376821, 3.70155861445238, 3.48457317695637, 3.17341483169433, 2.80105752002886, 2.40749067506522, 2.04615779488076, 1.77198432394136, 1.62185467835522, 1.60322642431847, 1.69687763630723, 1.86898490450481, 2.08416487647675, 2.31393362349772, 2.53952899506404, 2.75086226826116, 2.94392521474323, 3.11824870798495, 1.04698870124727, 1.13302591180298, 1.22179279190668, 1.30802470296969, 1.38653678222321, 1.45315414868666, 1.50545649829038, 1.54314808464400, 1.56797825694887, 1.58325629897395, 1.59305535739375, 1.60114856913319, 1.60961659810622, 0, 0, 0, 0, 0, 0, 0, 0, 0.81691646749394, 0.867125300745832, 1.06128177128617, 1.35988257768077, 1.68951397339454, 1.97448497955243, 2.16845745132994, 2.27202631803578, 2.33168781075535, 2.42284394184180, 2.62091209999590, 2.96522795905121, 3.42629756241166, 3.89521364154706, 4.2124161656575, 4.23296354613966, 3.89720643703607, 3.26426960091667, 2.48644635383678, 1.74157674767460, 1.16551106082893, 0.819179027180778, 0.695990753155584, 0.75139246948324, 0.932172577397676, 1.19358073071636, 1.50426052920568, 1.84448284332969, 2.20262009069874, 2.57215357606824, 2.94954499328021, 3.33261809474438, 3.71916167562529, 4.10571197600133, 4.48663879076049, 4.85369981623029, 5.19616183053425, 5.50143883339176, 5.75602686729301, 5.9464551535049, 6.0601320482048, 6.08622711336624, 6.01675634857708, 5.84766706022691, 5.5793693166554, 5.21648480606116, 4.76753249734669, 4.24580282314573, 3.67182507608913, 3.07601097925181, 2.49889834633584, 1.98726553989541, 1.5869197986809, 1.33521914606134, 1.25612577941662, 1.35734387230074, 1.62599999458328, 2.02177020221556, 2.4747138105083, 2.89875488006732, 3.21978978640451, 3.39908688355389, 3.43302494959382, 3.33424684601163, 3.11813968400205, 2.80797251378519, 2.44698704747002, 2.09779480929386, 1.82456958601457, 1.67081156251671, 1.64764684741713, 1.73734479132087, 1.90635779973579, 2.11910753107059, 2.34686295539809, 2.57070788873595, 2.78048174931621, 2.97212921515105, 3.14511870004991, 1.07488233402268, 1.17030687045977, 1.26875038845306, 1.36420104678364, 1.45068622401101, 1.52334886742425, 1.5793545116302, 1.61839580979482, 1.64266533324465, 1.65629750065933, 1.66436886814943, 1.67154218303007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.859988926328235, 0.925387645432164, 1.14571378157589, 1.47581342112195, 1.83384838008954, 2.1361120403578, 2.33163001235434, 2.42110196592037, 2.45524539856815, 2.51582174010639, 2.68445471255491, 3.00477213172692, 3.44883593178079, 3.90673049854943, 4.21631183063711, 4.22989168356035, 3.88617155301026, 3.2442822533598, 2.45783834117892, 1.70638443567208, 1.12692378908942, 0.780509371398886, 0.659702823351634, 0.718496349117792, 0.9020081073232, 1.16385755570947, 1.47121450837058, 1.80307376959759, 2.14675786597573, 2.49497171626316, 2.84374669331355, 3.19091299455228, 3.53479653522567, 3.87307431254636, 4.2018756273931, 4.51524726296719, 4.80504711380782, 5.06123645568000, 5.2724558151044, 5.42676050042888, 5.51249437202479, 5.51940221771552, 5.44002264525108, 5.27109890601879, 5.0144804236469, 4.67718291527662, 4.27091814387309, 3.8118625830857, 3.3210717114422, 2.82492775611449, 2.35430162974645, 1.94159241695243, 1.61634970510073, 1.4015304432725, 1.31202473176993, 1.35451811405628, 1.52532890180802, 1.80463870786004, 2.15197834004424, 2.51133629491611, 2.8267262644497, 3.05668703867201, 3.17624594293406, 3.17035656642909, 3.03349663987821, 2.78042638937409, 2.45575336694569, 2.12764802490539, 1.86578134979490, 1.71749999905522, 1.69622209978043, 1.78553685769358, 1.95272359282419, 2.16280027422348, 2.38750286356452, 2.60826803791570, 2.81516136192555, 3.00422340300394, 3.17490815514169, 1.10381703385098, 1.20852101478370, 1.31655895366297, 1.42124541840417, 1.51591497159556, 1.59512964508367, 1.65572359371210, 1.69741251796481, 1.72279361400564, 1.73670819100034, 1.74506637690714, 0, 0, 0, 0, 0, 0, 1.58913223619438, 1.41598580635647, 0, 0, 0, 1.05925270670365, 1.30399724473805, 1.65876206107144, 2.03498685710559, 2.34294928940853, 2.5284247028218, 2.59243961947721, 2.58892076466361, 2.60411397348901, 2.7239117871326, 2.9954225156128, 3.39380705770754, 3.81254480068033, 4.09319738622028, 4.09107973534012, 3.74575018104702, 3.11429412472072, 2.34599761313982, 1.61545190923992, 1.05573713201989, 0.725783429075148, 0.617577325805072, 0.685296595311754, 0.874276045471402, 1.13801459150929, 1.44319834524063, 1.76812814386961, 2.09941166780816, 2.42917935805868, 2.75315378304392, 3.06922240301793, 3.37621589099452, 3.67281862841475, 3.95667819631171, 4.22380357634307, 4.46829496713612, 4.68238567601624, 4.85674315443798, 4.98100425324561, 5.04460155967666, 5.03798725563302, 4.9542488933575, 4.79081835849201, 4.55071524650956, 4.24284502913428, 3.88133186127395, 3.48433190076046, 3.07279612182018, 2.66921594808487, 2.29599474279330, 1.9732859808457, 1.71691514719209, 1.53762662129107, 1.44235879801677, 1.43627176974171, 1.52240752253846, 1.69706257147505, 1.94371483086022, 2.23161503426386, 2.52125760340776, 2.77150663783849, 2.94297735906016, 3.00081056505363, 2.92413923044157, 2.72079671722104, 2.43476422239831, 2.13588014014083, 1.89531933285732, 1.76136131097607, 1.74826635091782, 1.84073166298714, 2.00738559330348, 2.21460928602487, 2.43529942720185, 2.65173708957056, 2.85450211587011, 3.03986921048686, 3.20732533533317, 1.13272223312905, 1.24632293455985, 1.36358966899601, 1.47724946083230, 1.58005075000077, 1.66608872427905, 1.73196718078598, 1.77748593064693, 1.80563656441920, 1.82186428430149, 0, 0, 0, 0, 0, 0, 1.82818274792173, 1.72016401595309, 1.55700193551130, 1.36868976861155, 0, 0, 0, 1.53597772554033, 1.90652038010271, 2.28879729360916, 2.58949630434193, 2.75280829160933, 2.78039345977335, 2.72830941004451, 2.68528190015393, 2.73940138154712, 2.94029224481665, 3.26751165421069, 3.62194296080942, 3.85464596586699, 3.82925217272897, 3.48850329820454, 2.88556260501965, 2.16019138272887, 1.47590045361875, 0.95717773124494, 0.65877166581228, 0.572360077705241, 0.653835610052532, 0.85050967163483, 1.11717347627125, 1.42096130239861, 1.74003134534842, 2.06059400838958, 2.37439379202220, 2.67695382320466, 2.96626084636526, 3.24161781556638, 3.50259770530758, 3.74815701729101, 3.97598286572712, 4.18210424208891, 4.36075396658593, 4.50446462788384, 4.60443402299454, 4.65127275375803, 4.63626288703977, 4.5531137158434, 4.39989760941735, 4.18056056977183, 3.9053845573589, 3.59012602149661, 3.25406002823669, 2.91747866220481, 2.5991759676545, 2.31428090153480, 2.07277699111193, 1.87924141228758, 1.73440438482568, 1.63850419670026, 1.5949200855714, 1.61121794429414, 1.69551117374148, 1.84946241051312, 2.06225374677320, 2.30865166050146, 2.55055388604577, 2.74106308917444, 2.83352556384665, 2.79745406797097, 2.63546264693904, 2.38905259253247, 2.12603127237674, 1.91530178534082, 1.80333911765207, 1.80388271163292, 1.90252165188919, 2.06969163634698, 2.27381927211465, 2.48957817820306, 2.70052759208614, 2.89801328975798, 3.07866320134031, 3.24203739251773, 1.16047268182674, 1.28231270322883, 1.4081653948512, 1.53027180036267, 1.64091679830306, 1.73386207323319, 1.80561094102969, 1.8561470204207, 1.88887360650809, 0, 0, 0, 0, 0, 0, 2.01418402420495, 1.97624829064800, 1.88429332146759, 1.74071683852030, 1.57565607668087, 0, 0, 0, 1.83317610261374, 2.20917224394844, 2.58449486166266, 2.86486217669856, 2.99465770613541, 2.97652371644275, 2.86759278060010, 2.75711638453790, 2.73336636045576, 2.84744219422562, 3.08419094421777, 3.35507215725952, 3.52530950966963, 3.47115320328226, 3.14042553627108, 2.58087208424029, 1.91855345224886, 1.30097184626700, 0.840271230334566, 0.585374590846591, 0.527887622155729, 0.626679012147843, 0.832489312112698, 1.10257752089357, 1.40531312469854, 1.71918780033912, 2.03029545585425, 2.33016276382057, 2.61420843496804, 2.88055056744862, 3.12892949038351, 3.35969784384671, 3.57293671785234, 3.76776421208188, 3.94186102690868, 4.09120402558669, 4.21001221043862, 4.29097605444281, 4.32591917657511, 4.30704428959211, 4.22875710043187, 4.08974523390393, 3.89466620166816, 3.65470572080841, 3.38654492531177, 3.10982300742053, 2.84371874449599, 2.60355302706262, 2.39829274084098, 2.22964599656710, 2.09320019655252, 1.98170753505404, 1.88993629468463, 1.81939886972948, 1.78033608030089, 1.78883517476457, 1.85940534877062, 1.99605318128625, 2.18547832946248, 2.39478422166905, 2.57564192534864, 2.6767961741364, 2.66332683367458, 2.53425155373529, 2.32707536404968, 2.10445345286167, 1.92983436474716, 1.84558890843558, 1.86378911776330, 1.97072235947375, 2.13899429322787, 2.33962223127864, 2.54954626345937, 2.75394380164527, 2.9451195256032, 3.12014276090564, 3.27867437111918, 1.18595047135674, 1.31511065825414, 1.44864681779150, 1.57843303827926, 1.69643347083971, 1.79624008561057, 1.87443825326451, 1.93136601543285, 0, 0, 0, 0, 0, 0, 2.15144608160418, 2.16785899957252, 2.14820253853788, 2.07882004428627, 1.96271667087556, 1.82926638892322, 1.73348908286837, 0, 0, 0, 2.54982295880739, 2.90541488482461, 3.15352329687586, 3.24043237613358, 3.17009607183148, 2.99974886426401, 2.81740345559856, 2.70969959801621, 2.72816397847552, 2.86332985971484, 3.03927896800437, 3.13851951428038, 3.05282821077945, 2.73641011421366, 2.23061882110381, 1.64504013412787, 1.10788737008959, 0.716468790280311, 0.512806000269353, 0.488623369603515, 0.60665191459664, 0.82208438674549, 1.09549046658595, 1.39705821044548, 1.70598346089853, 2.00847460191902, 2.29598371206182, 2.56390483545322, 2.8105093472821, 3.03593638340988, 3.2412156599455, 3.42738749676315, 3.59478404302079, 3.74249423233591, 3.8680071662102, 3.96705070318566, 4.03371567002569, 4.06103561038481, 4.04219082045169, 3.97234165321069, 3.85077014853933, 3.68265790155845, 3.47968141934326, 3.25883838660123, 3.03950057885107, 2.83937676540556, 2.67054750625636, 2.53680934213301, 2.43325180583861, 2.34844118940113, 2.26893998786809, 2.18516611111501, 2.09678572660448, 2.01524643982469, 1.96142924738289, 1.95818318054281, 2.01993211659863, 2.14312681804187, 2.30160260188047, 2.4503770832384, 2.53935243399608, 2.53338289364685, 2.42929154999747, 2.25953243925632, 2.07931202733739, 1.94427691908829, 1.89100205875764, 1.92904601158496, 2.04523934393604, 2.21460125997096, 2.41111114475552, 2.61430439073402, 2.8111982755683, 2.99517584889536, 3.1637975036378, 3.31683700654693, 1.20811063964749, 1.34343611054927, 1.48352257051535, 1.62001447179709, 1.74472404169159, 1.85128780450055, 0, 0, 0, 0, 0, 0, 0, 2.25610851203507, 2.30456781263028, 2.33881140971639, 2.34122637984402, 2.29910136927369, 2.21573094371425, 2.11890438431439, 2.05945474842546, 2.09494824937105, 0, 0, 0, 3.23085001614218, 3.43693271846854, 3.47448795653554, 3.34902735700967, 3.11702236962071, 2.86375195333720, 2.67270206297544, 2.59482500609754, 2.62622289095952, 2.70442325756072, 2.73064634307501, 2.61357143475623, 2.31443496760008, 1.86779887676710, 1.36554349466498, 0.915126777142455, 0.597915673658236, 0.448577993970889, 0.459094835268186, 0.596530133416168, 0.821075779667278, 1.09708573932872, 1.39692330789751, 1.70074174564101, 1.99504000482028, 2.27131258069640, 2.52499367503291, 2.75452039344010, 2.9603882619978, 3.14420568951296, 3.30782125493992, 3.45258834864133, 3.57878975055936, 3.68522007563787, 3.76894981696584, 3.82537057286111, 3.84870060595031, 3.83312820316907, 3.77460717037644, 3.67299051428576, 3.53382069757677, 3.36891350158564, 3.19507503161619, 3.03089436455697, 2.89233678433220, 2.78846749367076, 2.71877045640911, 2.67312552894624, 2.6347446672627, 2.58552063267218, 2.51249767926561, 2.41358853397694, 2.30035601024567, 2.19602761519184, 2.12827746375067, 2.11843893406658, 2.17081927974661, 2.26683709461991, 2.36814661873962, 2.42988927325365, 2.41973767887059, 2.3334382677585, 2.1978440966363, 2.05933648360871, 1.96434499586503, 1.94263432220751, 2.00073852574286, 2.12592085823554, 2.29572799126509, 2.48728263585603, 2.68286896858281, 2.87143736413667, 3.04748950901527, 3.20908548219699, 3.35610768063108, 1.22604506057333, 1.36618376375796, 1.51149646899304, 1.65355354641900, 1.78421819221163, 0, 0, 0, 0, 0, 0, 0, 2.34789685662057, 2.40845413416048, 2.47159455942912, 2.52496139211373, 2.55155656496459, 2.53909369520177, 2.49059728757422, 2.43155284246791, 2.40768225020221, 2.46948798159920, 0, 0, 0, 3.53862790656612, 3.69571964862813, 3.68083836417071, 3.50116054516308, 3.21163213829372, 2.89359183302795, 2.62616721611798, 2.45881418270592, 2.39262949090085, 2.3782798814911, 2.33554799706293, 2.18996274470457, 1.90983237280123, 1.52306842303713, 1.10406243944429, 0.739750171634011, 0.495749881858436, 0.399506344069225, 0.443344558959055, 0.598740635461294, 0.830984311298498, 1.10833924712990, 1.40548630030094, 1.70367792390586, 1.98982753210891, 2.25556440451787, 2.49641424251601, 2.71098419981336, 2.90008058148339, 3.06579545108281, 3.21064608412376, 3.3368336581044, 3.44564476698143, 3.53699626747860, 3.60915052859866, 3.65870287991286, 3.68102082351696, 3.67131340106537, 3.62635058298124, 3.54652923252766, 3.43761047028734, 3.31125367573521, 3.18365479363746, 3.07220547462993, 2.99092102908619, 2.94605959441686, 2.93352069821074, 2.93915247915308, 2.94220024476678, 2.92115701161484, 2.86053175900124, 2.75663524714938, 2.62040230265254, 2.47565919754716, 2.35235539647253, 2.27611572902241, 2.25751268133508, 2.28576694832718, 2.33102843506127, 2.35613328098747, 2.33347911679211, 2.25856455726405, 2.15256798552461, 2.05255193639809, 1.9952128903169, 2.00314599753532, 2.07967446787523, 2.21242684136470, 2.38146506925647, 2.56705178813062, 2.75420362719664, 2.93377357033393, 3.10134663493129, 3.2554526412217, 3.39606347133714, 1.23903912121117, 1.38249131269775, 1.53156446701519, 1.67792781627440, 0, 0, 0, 0, 0, 0, 2.37558064060418, 2.44436689354214, 2.50873926007134, 2.57734105000107, 2.65242379262148, 2.72396788656705, 2.77483241507891, 2.79202633007052, 2.77741333966449, 2.75353108568906, 2.7605234457676, 2.8416420119923, 3.0208696560738, 0, 0, 0, 3.91207927758807, 3.84506437763035, 3.61566723194194, 3.27662405486756, 2.90438724617906, 2.57281359890838, 2.3290360976616, 2.17822678137015, 2.08299063422304, 1.98026459945442, 1.81123195549146, 1.55082885982748, 1.2208956190649, 0.879716887738974, 0.595306331979489, 0.418769654631335, 0.370927418846663, 0.444493544282463, 0.615119260895567, 0.852928467641754, 1.12993777245864, 1.42311336620650, 1.71485702721190, 1.99257692882189, 2.24810859326581, 2.47710924276053, 2.67835397636956, 2.85291227474585, 3.00326826667825, 3.1324781816075, 3.24343354064689, 3.33825490148798, 3.41781844730609, 3.48144313316361, 3.52683737457090, 3.55047851625861, 3.54859769363507, 3.51879161662979, 3.46197123667605, 3.38399295111442, 3.29611356696794, 3.21357847103744, 3.15225316105981, 3.12405164835344, 3.13261532252379, 3.17087221251100, 3.22161501778013, 3.26126807530427, 3.26597905445538, 3.21844207421044, 3.11357039717430, 2.96123026587739, 2.78470152775824, 2.61448594389697, 2.47864116439284, 2.39267284379267, 2.35328674026335, 2.33977229945632, 2.32373005447298, 2.28321268344814, 2.21404157464721, 2.13204274449874, 2.06521527069588, 2.0407754002183, 2.07435270493022, 2.16615325656306, 2.30414046780150, 2.47076976958298, 2.64928019857049, 2.82725783486654, 2.99732172966528, 3.15604101124509, 3.30235350404580, 3.43628994501087, 1.24661611499534, 1.39179213671918, 1.54307424172695, 0, 0, 0, 0, 0, 0, 2.43060842126561, 2.54237249483591, 2.63024833964687, 2.69890941290796, 2.76714144462936, 2.84740751009105, 2.9333628480457, 3.00643340627799, 3.05105829361992, 3.06663280466995, 3.07211920444284, 3.10200531795, 3.19271331889607, 3.362816040078, 3.59646762917577, 0, 0, 0, 3.95602813629378, 3.68433378704683, 3.30672322120981, 2.89402542326643, 2.51415333603156, 2.21119166855654, 1.99326343734887, 1.83312934868986, 1.68264151616750, 1.49668531171301, 1.25606097455875, 0.977410936433074, 0.705073415315327, 0.490652503607115, 0.3726733705991, 0.366242537884173, 0.464478173035092, 0.646756393582717, 0.887527138594408, 1.16221195493624, 1.44991052148943, 1.73415985423387, 2.00291134841989, 2.24826211170257, 2.46603201507261, 2.65515739643772, 2.81692277379015, 2.95411690466575, 3.0702144739631, 3.16865379173592, 3.25223637194869, 3.32265162033971, 3.38015282538813, 3.42347679573661, 3.45016881417882, 3.45747430365819, 3.4438171971261, 3.41059109544556, 3.36364217678308, 3.31362398699383, 3.27456159269035, 3.2605425831304, 3.28127816805857, 3.33797006692024, 3.42109133616192, 3.51118546648375, 3.58279748225431, 3.61060329287770, 3.57610505423249, 3.47306754052286, 3.31009256323332, 3.10924546864765, 2.90050156805307, 2.71307869610434, 2.56628393903703, 2.46358562581604, 2.39313401835895, 2.33530717421169, 2.27399040375227, 2.20568721950417, 2.14148044362069, 2.10112150936363, 2.10318092279693, 2.15695554667143, 2.25984236239613, 2.40013789612733, 2.56248563412111, 2.73281547739397, 2.90100891705192, 3.06123527352589, 3.21090193438083, 3.34927089972272, 3.47639424058882, 1.24856530173493, 1.39384819316798, 0, 0, 0, 0, 0, 0, 2.41819411523256, 2.59777130642435, 2.7567185519997, 2.86513147984249, 2.92852500415571, 2.98265142049340, 3.05686560052103, 3.1504889786602, 3.2417121396971, 3.30979107320048, 3.34990577481436, 3.37677519958257, 3.41942873702670, 3.5083315627451, 3.65797351069995, 3.85271982266417, 0, 0, 0, 4.007093672664, 3.7025015391757, 3.29901939373993, 2.86127284730575, 2.45074073164693, 2.10783817275225, 1.84245188969289, 1.63545452101794, 1.45098207452119, 1.25530784147137, 1.03417868531941, 0.800053756191255, 0.585859332504032, 0.42974064283669, 0.359908028759545, 0.386812262300497, 0.503974411126009, 0.693939455739319, 0.934853627055834, 1.20509874496898, 1.48569362645017, 1.76126063304262, 2.02032306415148, 2.25528359349319, 2.46214924893792, 2.64000798219648, 2.79031214266137, 2.91607281156416, 3.02107191851490, 3.10916366862723, 3.18369185760342, 3.24702644914452, 3.30024234475556, 3.34302307732855, 3.37393548274495, 3.39122131776857, 3.39412192162006, 3.38448067878475, 3.36804591506348, 3.35471139344925, 3.35707968699715, 3.38728238679617, 3.45277645656877, 3.55249620645451, 3.67489914944607, 3.79894447591149, 3.89806790394557, 3.94619400389797, 3.9241712628075, 3.82489394376102, 3.6556847256857, 3.43707534556907, 3.19790021684427, 2.96768524257795, 2.76856019292168, 2.60977070252456, 2.4874308694533, 2.38999328011322, 2.30683392472665, 2.23533581345614, 2.18261792169177, 2.16135563743933, 2.18268329549423, 2.25047675977652, 2.3597724406411, 2.49921817826900, 2.65538723697543, 2.81653760622159, 2.97450283377708, 3.12473866714307, 3.26531820069744, 3.39573267870688, 3.51601611227033, 1.2449510949895, 0, 0, 0, 0, 0, 0, 2.31877747181360, 2.55084585109469, 2.80833448869359, 3.02929729686779, 3.15896040672430, 3.20428289247598, 3.22641672531111, 3.27986866984907, 3.37214302074471, 3.47605982429608, 3.56256010020446, 3.62054739521273, 3.65977952285755, 3.7041803454781, 3.77939621530557, 3.89740574913533, 4.04435529505723, 4.17905109559009, 0, 0, 0, 3.66949889339742, 3.25334363040277, 2.80615975372559, 2.38264213361332, 2.01902487876089, 1.72583035069756, 1.49001085173346, 1.28533599837908, 1.08712593126027, 0.885141371675876, 0.688678137370672, 0.521807461035736, 0.412193878879833, 0.380018890060422, 0.432142670980614, 0.562482154738458, 0.756181810512439, 0.994438459794531, 1.25813413037513, 1.52997879692287, 1.79561860253198, 2.04416773214968, 2.26837091071543, 2.46444202821530, 2.63160950406052, 2.77144855090943, 2.88711640423451, 2.98260065428365, 3.06205251915758, 3.12923194458304, 3.18706739104822, 3.23734864047664, 3.28062353217357, 3.31642609256387, 3.34396355340408, 3.36327289038583, 3.37661251973715, 3.38956346404198, 3.41114763423052, 3.45241031205621, 3.52342286889907, 3.62938988315687, 3.76715524019138, 3.92354079582932, 4.07646899151008, 4.19888987740432, 4.26456325590382, 4.25414232936117, 4.15993644465779, 3.98809303836819, 3.75752527912844, 3.49562352749531, 3.2316566977389, 2.98972379035988, 2.78373564014786, 2.61652823940039, 2.48351228821768, 2.37890062550632, 2.30103503282786, 2.25391263461343, 2.2444692072627, 2.27779224768849, 2.35338367218992, 2.46443725431281, 2.59998236025051, 2.74824163246063, 2.89940567576053, 3.04688890518693, 3.18715256019502, 3.31875582467781, 3.44132381917822, 3.55483591674010, 0, 0, 0, 0, 0, 0, 2.15489970590758, 2.39081310549088, 2.70536239050772, 3.06090377551620, 3.35795956294746, 3.50897440518838, 3.52297505081532, 3.49485470341704, 3.51245175323197, 3.59397755823822, 3.70480841404044, 3.80449022030639, 3.873613293625, 3.9162838016825, 3.95173549867233, 4.00202500133583, 4.07825614238096, 4.16989339296694, 4.24318720787045, 4.25135957634614, 0, 0, 0, 3.17225638684078, 2.73017172866809, 2.30993363850969, 1.94320406748616, 1.64016164728746, 1.39201138625677, 1.17975080823682, 0.985614424206795, 0.8025231631086, 0.637532847885169, 0.508182716659592, 0.434364441369483, 0.430310037901873, 0.500258716036647, 0.63851807622943, 0.832315555040257, 1.06531253191588, 1.32047370033431, 1.58199314447030, 1.83648436200484, 2.0736685340943, 2.28666395635014, 2.47190749946052, 2.62875642069685, 2.7588671134083, 2.86547380412696, 2.95267819454637, 3.02482133384418, 3.0859645345613, 3.13948119527874, 3.18777236391576, 3.23216367810119, 3.27309063424794, 3.31067927201531, 3.34572652678189, 3.38086839897939, 3.42146738918477, 3.47560620802839, 3.55270554116043, 3.66074686442612, 3.80274081265035, 3.97363091380934, 4.15893836037867, 4.33599842838345, 4.47777238419762, 4.55832138912471, 4.55848161148757, 4.47024800846079, 4.29875988683818, 4.06136748756696, 3.78390747897819, 3.49501707425565, 3.22002482595880, 2.97638274496369, 2.77228129909174, 2.60880042454835, 2.48419006422399, 2.39774760134698, 2.35116558412482, 2.34698391725088, 2.38564914090003, 2.46335043303097, 2.57196584870496, 2.70094187243720, 2.83987470665108, 2.98049811821300, 3.11744443498035, 3.24790922524557, 3.37076801120264, 3.48569302136469, 3.59257900027179, 0, 0, 0, 0, 0, 1.96510614229525, 2.16942873207622, 2.46280470152225, 2.87093302981427, 3.33763845491763, 3.71985841195565, 3.89201955996671, 3.8656092079168, 3.77475026536904, 3.74600362628862, 3.80993827792461, 3.92305779597308, 4.03135851021596, 4.10563873491944, 4.14385710300896, 4.16098935517456, 4.17668454579957, 4.20272383323769, 4.23329174013053, 4.2429180806114, 4.19454052733131, 0, 0, 0, 3.06065031214002, 2.63618381206430, 2.23306592381181, 1.8781284990826, 1.58042843272462, 1.33390934270248, 1.12478018673622, 0.940394008315007, 0.776105981994396, 0.637496821658005, 0.537514653805246, 0.490544793255309, 0.506612515848655, 0.588151344607697, 0.729859942842646, 0.920622062654355, 1.14607947867995, 1.39093655089365, 1.64070410028482, 1.88292047271246, 2.10793042001900, 2.30925350613365, 2.48356273726449, 2.63033277275432, 2.75126354577641, 2.84960477071336, 2.92949108748288, 2.99535775748613, 3.05146331679129, 3.10151975726206, 3.14843711414796, 3.1942261370379, 3.2401446022253, 3.28717307000321, 3.33681757410609, 3.39205077497573, 3.4579829735831, 3.54173388500537, 3.6510979911925, 3.79201022130004, 3.96540309783438, 4.16452844429218, 4.37390824581615, 4.57065809261371, 4.72813692459467, 4.82106392634924, 4.83075555117925, 4.74912859131509, 4.58050067337631, 4.34078528062473, 4.05426525912366, 3.74869638275875, 3.45000764026545, 3.17814193689904, 2.94530956246004, 2.75697134059101, 2.61458888613107, 2.51835699848749, 2.46839430296415, 2.46408142618946, 2.50252613540869, 2.57759000024291, 2.68032584311639, 2.80063312452758, 2.92923049119615, 3.05904075064743, 3.18558675791509, 3.30655731470082, 3.42099705265026, 3.52855370291116, 3.62901647669827, 0, 0, 0, 0, 1.77244922681495, 1.94359970066235, 2.17435363713948, 2.52460626678491, 3.02565009375498, 3.60282356621945, 4.06970043177021, 4.26286776359110, 4.1961567218787, 4.04254961855753, 3.9669779498333, 4.01216789613556, 4.12557411215034, 4.23934601800604, 4.31414771842082, 4.34169391885483, 4.33314815465628, 4.30679707310553, 4.27645971817758, 4.24222999890118, 4.18753563607219, 4.0849828395871, 3.90876804178728, 0, 0, 0, 2.52814598084648, 2.15301131862877, 1.82153524313441, 1.54109509184299, 1.3072045346518, 1.10969925072650, 0.939628180391214, 0.79419349647664, 0.678082935892959, 0.601160465165412, 0.574071901603192, 0.603997806084035, 0.69220674997142, 0.833795014777213, 1.01897728925256, 1.23500633057837, 1.46806706349688, 1.70486432452605, 1.93383459535406, 2.14596362264024, 2.33519612783253, 2.49845159166775, 2.63531120363672, 2.74748531143051, 2.83818568113983, 2.91150929674246, 2.97190150957415, 3.02372425215154, 3.07092847630907, 3.11683170539890, 3.16403046986294, 3.21451190805152, 3.27002915913330, 3.33273130182279, 3.40588278105038, 3.49432389992020, 3.60422769509665, 3.74182144749493, 3.91110453897710, 4.11110144082727, 4.33360127366316, 4.56240286010961, 4.77470094026124, 4.94454327889799, 5.04756569962799, 5.06578333141435, 4.99122424271838, 4.82755965237284, 4.5894149877291, 4.29957267669513, 3.98473974877174, 3.67092494635606, 3.37963969114084, 3.1259121379487, 2.91840608806161, 2.76102165324091, 2.65475827376112, 2.59876869971583, 2.59033354202060, 2.62434512058174, 2.69318929233023, 2.78751851551428, 2.89771772549129, 3.01541416037564, 3.13441940329611, 3.25087229609419, 3.36275656333311, 3.46916897940182, 3.56968009734216, 3.66396289281138, 0, 0, 0, 1.58470883618565, 1.73502766441058, 1.91293748271447, 2.16544683257109, 2.56279486334244, 3.14071030794898, 3.80962124506377, 4.34822143472737, 4.5625616679788, 4.46801453198972, 4.26831134239462, 4.15880707713804, 4.19171357318822, 4.30688595677406, 4.42476880035141, 4.49705839511362, 4.50967433307981, 4.47044307900645, 4.3971506361736, 4.30675574453578, 4.20618317953089, 4.08813920853112, 3.93466889864969, 3.72704295875385, 3.45666894480143, 0, 0, 0, 2.07119345927457, 1.77153447615679, 1.51696945227641, 1.30373832209976, 1.12412172397465, 0.971788558414307, 0.84532620851451, 0.748933935238174, 0.690484264697459, 0.678174931411305, 0.717341715064971, 0.808562478853373, 0.947342251813863, 1.12499555121899, 1.33012327782522, 1.55020887240436, 1.77306835145094, 1.98802249249218, 2.18671472401152, 2.36353430355025, 2.51565455685885, 2.64275303480229, 2.74652211509233, 2.83009040977700, 2.89745726584049, 2.95300543293126, 3.00111668580166, 3.04588818196336, 3.0909447941045, 3.13936399280101, 3.19375729885602, 3.25655272678010, 3.33046259982005, 3.41899429843264, 3.52671360829156, 3.6588974593937, 3.82031683572445, 4.01320455905818, 4.23489384431806, 4.47595838785879, 4.71972970936481, 4.94372373201054, 5.12288798436222, 5.23394880968571, 5.25976584826393, 5.19261651848062, 5.03567216853659, 4.80241207716812, 4.51419053256754, 4.19655349565783, 3.87517187638026, 3.57235651203448, 3.30493488999421, 3.08376397042768, 2.91450441882712, 2.79884787394118, 2.73545344532717, 2.72035274358822, 2.74713253033366, 2.80739463046763, 2.89173615357247, 2.99105436225786, 3.09771388920992, 3.20617693777928, 3.31298428740456, 3.41626448554906, 3.51508274826301, 3.60889977955296, 3.69727166427682, 0, 0, 1.40762850517197, 1.54356551208450, 1.69184062105183, 1.8731953670748, 2.13897022493002, 2.56499922078711, 3.18930796011415, 3.91429815709294, 4.50000495051887, 4.7359189632402, 4.63751260733886, 4.42391051723218, 4.30583069472527, 4.33998243423948, 4.46159729941088, 4.58386050158338, 4.65211122168397, 4.64746249937767, 4.57491313819493, 4.45241172893453, 4.30086310124321, 4.13463683569654, 3.95583914784051, 3.75554805686767, 3.52141052758602, 3.24706978452943, 0, 0, 0, 1.98926544665286, 1.72672626326508, 1.50364941129365, 1.31643121693145, 1.15895130047359, 1.02670983981757, 0.919318892883576, 0.840740438080126, 0.797596361491718, 0.796524857007629, 0.841709965392032, 0.933371164639679, 1.06743530404756, 1.23616251375303, 1.42932555000198, 1.63558552166351, 1.84381662366256, 2.04421756417642, 2.22910289706122, 2.39332030253168, 2.53430107868726, 2.65180966256681, 2.74749683820238, 2.82437102693737, 2.88628442542472, 2.93749580103737, 2.98233361193315, 3.02495599808626, 3.06919786732236, 3.11850971285308, 3.17601367169845, 3.24470271999271, 3.32776162479576, 3.42888834359992, 3.55237961749726, 3.70269327697016, 3.88329507548647, 4.09486493876461, 4.33329713894825, 4.58821014935076, 4.84270664801166, 5.07481954142049, 5.26054212545999, 5.37779567929201, 5.41036819680875, 5.35087569738822, 5.20210074949845, 4.97649669847743, 4.69406139213703, 4.3791044158219, 4.05663461616103, 3.74914895739608, 3.47445266574726, 3.24477267635244, 3.06696422013101, 2.94328978443445, 2.87225556851223, 2.84928663597351, 2.86735808637113, 2.91781627508257, 2.99146594492362, 3.07973671498197, 3.17560163018607, 3.27399728079993, 3.37171249340596, 3.46691809257337, 3.55859634057817, 3.6460842941179, 3.72882937020616, 1.13862439837727, 1.24886650514417, 1.36948426978059, 1.49964412963501, 1.64438996768607, 1.82517052719911, 2.09350010878334, 2.5247872389276, 3.15666083030701, 3.89225552970043, 4.49355225877902, 4.7512440155177, 4.67912065116954, 4.49227214427259, 4.39772056850018, 4.4504005229523, 4.58479882844077, 4.7126502454617, 4.77643622746442, 4.75380896887505, 4.64746264417377, 4.47597619611878, 4.26469412878976, 4.0357064359194, 3.80035946397417, 3.55818295357547, 3.30244306870974, 3.02840488196622, 2.73916485990489, 0, 0, 0, 1.68613205732468, 1.49764140040155, 1.33955628661032, 1.20676675017779, 1.09603487279523, 1.00771312839694, 0.94565792284478, 0.915708967998724, 0.92352189044543, 0.972584307882505, 1.06297865845425, 1.19106585655980, 1.34995342006370, 1.53047221973131, 1.72238265750590, 1.91558238798266, 2.10114324511268, 2.27205856250902, 2.42364193695782, 2.55358327388246, 2.66172502758510, 2.74965738377641, 2.82023944527764, 2.87713688734118, 2.92443420540394, 2.96634394541410, 3.00700845039080, 3.05038017292837, 3.10017489650203, 3.15990716064601, 3.23301746388505, 3.32306490053411, 3.43388304152265, 3.56951146775960, 3.73368342299261, 3.92873710150251, 4.15404228724653, 4.40432849588217, 4.66852444425504, 4.92972589817951, 5.16664160640235, 5.3564066501984, 5.4781884719715, 5.5167386353996, 5.4650598735507, 5.32562276022907, 5.10994847528762, 4.8367403357636, 4.5290212736803, 4.21089402139157, 3.90457121621668, 3.62819985390263, 3.39473276272095, 3.21176472159953, 3.08200647099949, 3.00403636300597, 2.97312711434449, 2.98213939266291, 3.02254327649321, 3.0855383628711, 3.1630995098901, 3.24871690625825, 3.33768106160447, 3.42692907913671, 3.51461402193046, 3.59961227680278, 3.68113959991685, 3.75854999474245, 1.11490596258492, 1.21746500400875, 1.33068383281863, 1.45450530104452, 1.59435789685668, 1.77064528031373, 2.03102038182961, 2.44464496781032, 3.04615125821035, 3.74786587113109, 4.33361166215026, 4.6124521682447, 4.59482299030328, 4.47309368174986, 4.43226194717193, 4.51950275586099, 4.67239466126442, 4.80696185054038, 4.86635970273613, 4.82619117443242, 4.68734542981815, 4.46931732357689, 4.2020657613266, 3.91531380231444, 3.62918653984859, 3.35090920151279, 3.07857027120059, 2.80850865145037, 2.54130773842145, 2.28330441604469, 0, 0, 0, 1.49627862836685, 1.3687038680505, 1.26181845743125, 1.17323545602336, 1.10381984026965, 1.05737032628166, 1.03921924669722, 1.05439418625223, 1.10597119191249, 1.19403621593253, 1.31539332251495, 1.46393547665058, 1.63147790773773, 1.80882702315909, 1.98687704209767, 2.15756457675672, 2.31456160881382, 2.4536481696328, 2.57276978944406, 2.67183856559807, 2.75236943549468, 2.81705053303882, 2.86933128311166, 2.91308235090138, 2.95234843607927, 2.99118869513595, 3.03358762271483, 3.08342231653485, 3.14448183374219, 3.22053442124954, 3.31541223226893, 3.43302813442487, 3.57717939961188, 3.75097766648094, 3.9558239429871, 4.19003354662125, 4.44745280482681, 4.71658261542471, 4.98071670219097, 5.21936939559485, 5.41087735489576, 5.53566808379867, 5.57945757748482, 5.53565264610614, 5.40646021084725, 5.20253818515901, 4.94134473227312, 4.64458285894915, 4.33527065787538, 4.03498744117652, 3.76174652067782, 3.52873937263188, 3.34394498578749, 3.21040388575408, 3.12689774071283, 3.08884439527264, 3.08932215177195, 3.12017781666368, 3.17312847740902, 3.24070023644204, 3.31684010147145, 3.39711819912598, 3.47856486557535, 3.55929020988994, 3.63806475112512, 3.71399778931041, 3.78637001794014, 1.09188406585655, 1.1867702646611, 1.29248502285010, 1.40960799480358, 1.54351256621766, 1.71224839828413, 1.95665150208050, 2.33539928410403, 2.87823049050663, 3.51277441276375, 4.05909081491502, 4.35706205085785, 4.41262912877952, 4.38202306676106, 4.41506387530762, 4.54694250801797, 4.72122996233016, 4.86256092159563, 4.91752384880367, 4.86088023275456, 4.69216262974548, 4.43190627704159, 4.11454351739848, 3.77696500236929, 3.44729903186153, 3.13954011472925, 2.85578267679157, 2.59297731198958, 2.34920209157961, 2.12615141084551, 0, 0, 0, 1.49755876290754, 1.40059186639343, 1.31981750612936, 1.25340045363647, 1.20253355948688, 1.17095424720170, 1.16363583998975, 1.18518519957772, 1.23843776633043, 1.32356824330926, 1.43782813687044, 1.57585420666493, 1.73039404158674, 1.89325804686860, 2.05630992345363, 2.21233555811269, 2.35567650262400, 2.48257261001142, 2.59121848286486, 2.68158788063999, 2.75510984330572, 2.81428678899658, 2.86233114190169, 2.90287038404625, 2.93974003022505, 2.97685883170384, 3.01816680517532, 3.06760554537202, 3.12912569610113, 3.20670623982507, 3.30435215808875, 3.42599942789833, 3.5752179017429, 3.75460085695245, 3.96480234437206, 4.20333669498829, 4.46344220671707, 4.7334415696771, 4.99701285825899, 5.2345827483786, 5.42572474939115, 5.55211703978422, 5.60041989595217, 5.56444165565444, 5.44615335437923, 5.25539853989353, 5.00842806379239, 4.72560355894371, 4.42873133488814, 4.13850587877219, 3.87246163913000, 3.64367013681048, 3.46022305632848, 3.32538005642876, 3.23818658337317, 3.1943814793407, 3.18746330208466, 3.20980903123879, 3.25372439221187, 3.31228648502577, 3.37986222514606, 3.45226233985309, 3.52658938352087, 3.60091146253159, 3.67390994985792, 3.74461106900567, 3.81224493941861, 1.07026372592183, 1.15767372570678, 1.25596290001564, 1.36623166122068, 1.49354227807448, 1.65295242759273, 1.87713148341531, 2.21237822158047, 2.68267893268369, 3.23360660254866, 3.72772623666776, 4.04120458491798, 4.17510098685708, 4.24382238112272, 4.35645092704759, 4.53452146745413, 4.72906247793486, 4.8754793372483, 4.92534616398045, 4.85345392640295, 4.65837899491003, 4.36168923319156, 4.00184922242105, 3.62207651767243, 3.25741739369703, 2.92755470080684, 2.63777515042005, 2.38528066070761, 2.16578277520868, 1.97686880789185, 1.81778416012911, 0, 0, 0, 1.43283751776409, 1.3776574045039, 1.33294131738330, 1.30006155026154, 1.28266535875656, 1.28544065420169, 1.31269079214767, 1.36711047025258, 1.44901241761836, 1.55609417206325, 1.68370340475189, 1.82547681178858, 1.97418850148329, 2.12263919522315, 2.26443942996105, 2.39458202732166, 2.50975319985863, 2.60838672753998, 2.69051037117643, 2.75746020998052, 2.81154441660302, 2.85572583512572, 2.89336891448340, 2.92806894752807, 2.96355770285526, 3.00366475391114, 3.05230939433117, 3.11349988367112, 3.19131620122957, 3.28984079623043, 3.41297828528225, 3.56408388323718, 3.74532934735591, 3.95680116655056, 4.1954512070155, 4.45416664332298, 4.72132138718432, 4.98114392550232, 5.21506143432146, 5.40390405984195, 5.53057917658037, 5.58266121171737, 5.5543471500008, 5.44738719195837, 5.27084540303876, 5.03979450009628, 4.77324209110322, 4.49169477508484, 4.21478572154111, 3.95932616506175, 3.73800960507951, 3.55883626972672, 3.42518456319499, 3.33637499933483, 3.28855506352506, 3.27575104890068, 3.29094978738854, 3.32707814990448, 3.37775851987497, 3.43775702151722, 3.50311069402926, 3.57099686599909, 3.63946020349719, 3.70712029912735, 3.7729484145144, 3.83614744096230, 1.05059323138323, 1.13087615675246, 1.22197194862392, 1.32541294291459, 1.44587712931296, 1.59544710315555, 1.79883585635717, 2.09034255719478, 2.48834934379523, 2.95565331388578, 3.39571873548935, 3.71969112487733, 3.92407593324908, 4.08323790930754, 4.26728812773101, 4.48487708465108, 4.69454378572426, 4.84252456992379, 4.8857745234712, 4.79968566091026, 4.58226556324352, 4.2560094943269, 3.86270598960471, 3.45071520924541, 3.06063788586858, 2.71663980272575, 2.4264126234485, 2.18715980685862, 1.99248488111799, 1.83648697312294, 1.71447039876835, 1.62186020976991, 0, 0, 0, 1.43315322641093, 1.40930783497610, 1.39365712881330, 1.38972313711766, 1.40194330000757, 1.43438413650957, 1.48965793663878, 1.56824224821917, 1.66827322116090, 1.78577794962549, 1.91523955296635, 2.05035159590123, 2.18481135739359, 2.31301979123288, 2.43059396593474, 2.53464680133075, 2.62383840278582, 2.69824315324739, 2.75910024129735, 2.80852051411542, 2.84921190239315, 2.88426460526933, 2.91701241017701, 2.95096424534415, 2.98978482442097, 3.03729644191089, 3.09747304258166, 3.17439673711927, 3.27214015030528, 3.39452535726587, 3.54470236477056, 3.72450713125474, 3.93361927040213, 4.1686421514235, 4.42234140006735, 4.68334514347253, 4.93657611682778, 5.16453420500296, 5.34931661981225, 5.47503418827409, 5.53014333930387, 5.50921381420093, 5.41378391913419, 5.25216481698338, 5.03827513751599, 4.78976323370399, 4.52577784684331, 4.26477057386836, 4.02266063635552, 3.81158143786094, 3.63929021490754, 3.50919552224571, 3.42087317162883, 3.37090727092116, 3.35389377212846, 3.36345767262729, 3.39315213198819, 3.43713443567222, 3.49055921210406, 3.54969101241148, 3.61179884275513, 3.67493254270021, 3.73768256547729, 3.79899474962318, 3.85806703563638, 1.03325387607961, 1.10687464537406, 1.19112843878319, 1.28790968793202, 1.40156533395809, 1.54167127229001, 1.72626878057395, 1.97960205263942, 2.31529352933870, 2.71033873780678, 3.10208487827513, 3.43069359999023, 3.68892415037654, 3.91799136017974, 4.15580723134169, 4.40055926803801, 4.617364837776, 4.761921955517, 4.7962097365191, 4.69664270489517, 4.46107879851684, 4.11277370652571, 3.69591942877376, 3.26255888644113, 2.85727044937054, 2.50742086337273, 2.22236948890332, 1.99918118831456, 1.82970826033451, 1.70522967938628, 1.61787728654501, 1.56022685912558, 0, 0, 0, 1.48483415696717, 1.48075581838127, 1.48139823889911, 1.49012918915727, 1.51115481018967, 1.54834594319383, 1.60426802117389, 1.67957638294644, 1.77283249562845, 1.88070870109337, 1.99848808897871, 2.12073290583915, 2.24198791538204, 2.35740130019072, 2.46317971917133, 2.55683789874721, 2.63724696623977, 2.70452082302163, 2.75980050194440, 2.8050010787368, 2.84257647646803, 2.87533905124877, 2.90634876356742, 2.93886623280203, 2.97634880644253, 3.02246038491342, 3.08106272256651, 3.15615458925371, 3.25172196751327, 3.37145794096708, 3.51831301921288, 3.69385928252499, 3.89750659422779, 4.1256931092233, 4.3712591805505, 4.62325941245907, 4.86743077891069, 5.0874033445071, 5.26654582738454, 5.39014698227567, 5.44751581797809, 5.43358064469267, 5.34967549440945, 5.20338162621793, 5.00748598189253, 4.77827966838813, 4.53351859066436, 4.29039448893895, 4.0638215384846, 3.86524741905452, 3.70207545761200, 3.57766838960735, 3.4918205483228, 3.44154346827729, 3.42200260213301, 3.42745595229838, 3.4520698398114, 3.49052212974591, 3.53835029975639, 3.59205566148708, 3.64902266776875, 3.70733884248895, 3.76559905886319, 3.82275205697845, 3.87801077488972, 1.01846245416217, 1.08596522231222, 1.16381248583751, 1.25419754674637, 1.36124003210115, 1.49266035111562, 1.66154860969250, 1.88467476778556, 2.17203327508198, 2.51086928716400, 2.86321941941278, 3.19041952939142, 3.4824721337435, 3.7563694313197, 4.02657666236156, 4.28386604965095, 4.49858415629745, 4.63396194058052, 4.65639639560549, 4.54375292320476, 4.29421527669551, 3.9316014103196, 3.50145035698493, 3.05785732260728, 2.64768642865787, 2.30021115575356, 2.0257936816726, 1.82131800644783, 1.67730883421136, 1.58290445186134, 1.52779889669951, 1.502352376644, 1.49741853310843, 0, 0, 0, 1.54617351681349, 1.56201919569497, 1.58252643284234, 1.61168624875025, 1.65320372197589, 1.70962099791543, 1.78177549000019, 1.86863522675990, 1.96747919031069, 2.07433860155178, 2.18458668021080, 2.29355877779082, 2.39709958854758, 2.49196454494462, 2.57604114984397, 2.64839437858394, 2.70917084321743, 2.75941435387429, 2.80084957162299, 2.83568250710539, 2.86645059554793, 2.89593561591211, 2.92713409675187, 2.96326518301462, 3.00778663548733, 3.06438515160104, 3.13690550363198, 3.22918224913165, 3.34473898025788, 3.48632907306034, 3.65531802881571, 3.85095750287805, 4.06967021184535, 4.3045312942045, 4.54516109536225, 4.77820586802213, 4.98846872528999, 5.16058942093507, 5.28101092454485, 5.33987000619984, 5.33244332687322, 5.2598698631536, 5.12902386399512, 4.95158436521112, 4.74249505279488, 4.51810302132087, 4.2942938334519, 4.08490497321481, 3.90061472432456, 3.74839308402287, 3.63149391202176, 3.54988638616927, 3.50097956319621, 3.48048348697432, 3.48326383195433, 3.50407551075807, 3.5380993159726, 3.5812513256948, 3.63028136242496, 3.68271435522076, 3.73670730937121, 3.79089076093828, 3.84424155941835, 3.89600443054483, 1.00628450053785, 1.06825865148231, 1.14018676351800, 1.22449483517342, 1.32516748811905, 1.44868247823096, 1.60480818602342, 1.80528950962512, 2.05757388542862, 2.35542634965344, 2.67687346563795, 2.99700110650081, 3.30398627309056, 3.5990315277161, 3.88140372352312, 4.13730045076750, 4.34099988058508, 4.46147455888737, 4.4690569874273, 4.34357869198301, 4.08406587048391, 3.71469055258403, 3.28123798308875, 2.83818698333673, 2.43300278861692, 2.09563385729956, 1.83687165924124, 1.65345353278183, 1.53502820183057, 1.46924561667954, 1.44403316447306, 1.44809904623695, 1.47104611969705, 1.50381369589417, 0, 0, 0, 1.63478623209085, 1.66609180875735, 1.70266706244031, 1.74807695669765, 1.80485743188951, 1.87402634875251, 1.95493465655361, 2.04542469077374, 2.14221869209131, 2.24143715793677, 2.33914293089052, 2.43182083095639, 2.51672975443408, 2.59209801750564, 2.65716601138003, 2.71210658593476, 2.75786901082306, 2.79599587643666, 2.82845551482373, 2.85751872134787, 2.88569156780901, 2.91569939648281, 2.95050323441458, 2.99332020555260, 3.04761410124275, 3.11702027317715, 3.20516985569721, 3.31538332339215, 3.45021683045662, 3.61087265356914, 3.79653054311968, 4.00371405095934, 4.22585669459168, 4.45325044777678, 4.67352049583792, 4.87267077966629, 5.03660614712572, 5.1529013130225, 5.21250025893569, 5.21102205537556, 5.14942275344968, 5.03389464444246, 4.87503641814197, 4.68646290701431, 4.48311307836235, 4.27954539912761, 4.08848056159983, 3.91977556439039, 3.77991253393513, 3.67198616007347, 3.59609659303435, 3.55001102511492, 3.52994637662036, 3.53133973092166, 3.54950337848745, 3.58010055222968, 3.61942061876687, 3.6644723613827, 3.71294363399539, 3.76308887384712, 3.81360105817135, 3.86350604353301, 3.91209354538042, 0.996655591760163, 1.05370603367693, 1.12022717078657, 1.19880518452999, 1.29333869910162, 1.40951813781563, 1.55504160932863, 1.73852716919131, 1.96572042201598, 2.23402009374511, 2.53069906303622, 2.83884580552865, 3.14555961857880, 3.44282014443302, 3.72109729032250, 3.96420436485056, 4.14935747902563, 4.24996585389531, 4.24008381783721, 4.10208774651978, 3.83635042886715, 3.46719090748236, 3.03959109257189, 2.60684843471031, 2.21548120520981, 1.89501860542648, 1.65621291542219, 1.49573783798510, 1.40280427343256, 1.36416340103234, 1.36656089973262, 1.39753509727659, 1.44577223949901, 1.50164149353872, 0, 0, 0, 1.69940219038339, 1.74045076831376, 1.78367494537268, 1.83252342060699, 1.88953878419951, 1.95591315812570, 2.03135254734056, 2.11421529080554, 2.20185335078485, 2.29106648824451, 2.37857776565024, 2.46145209784892, 2.53740374672383, 2.60496813430901, 2.66354198166961, 2.7133182876486, 2.75515579481555, 2.790425581881, 2.82087166210826, 2.84851067773448, 2.87558108508614, 2.90453742903638, 2.93807249482535, 2.97914053403599, 3.03094884344276, 3.09688274474900, 3.18033076747626, 3.28438409974449, 3.41140031192302, 3.56244958618097, 3.73670291857426, 3.93086962743357, 4.13883060572379, 4.35162318277508, 4.55789605529798, 4.74486601706752, 4.89969012057047, 5.01105170345668, 5.07068392321108, 5.07454557358913, 5.02342494185975, 4.92286080789125, 4.78240454584048, 4.614370362514, 4.43230521222256, 4.24944082318072, 4.07736605110765, 3.92508959768323, 3.79857134489516, 3.70070876640221, 3.63169293953141, 3.58960740414762, 3.57113310107799, 3.57223732322918, 3.58875504330334, 3.61680901372792, 3.65305401990703, 3.69476462429895, 3.73980914588502, 3.78656171495677, 3.83379887443283, 3.88061150569851, 3.92634383747083, 0.989407728698556, 1.04213052576847, 1.10376034408225, 1.17696688075729, 1.26556474609777, 1.37473199680037, 1.51090990359831, 1.68084688469862, 1.88915561297960, 2.13496057993436, 2.41031039821192, 2.70250120504745, 2.99809930788061, 3.28427924783234, 3.54699840399249, 3.76914675151517, 3.9302376277605, 4.00732973160839, 3.97820402500549, 3.82832655604089, 3.55983521573081, 3.19699389919866, 2.78306891704274, 2.36884365130202, 1.99859309867743, 1.70053382984475, 1.48502213047514, 1.34877078337863, 1.28093975424263, 1.26787973984197, 1.29563923771478, 1.35098376483591, 1.42196159329102, 1.49853501916205, 1.57324087574687, 0, 0, 0, 1.80560319499509, 1.85467028327924, 1.90648308643058, 1.96359997542579, 2.02737717919741, 2.09784437279557, 2.17382553264225, 2.25323839000422, 2.33349158066208, 2.41189905363817, 2.48604413014339, 2.55404717218354, 2.61471636915147, 2.66758559629159, 2.71286234827063, 2.75131980770798, 2.78416960957234, 2.81294699353731, 2.83943003899967, 2.8656020788393, 2.89365342823949, 2.92600692687918, 2.96534258856354, 3.01459057483643, 3.07685932248257, 3.15526783463227, 3.25265952718128, 3.37119198466342, 3.51182450310044, 3.67376250228009, 3.85395824962838, 4.04679776858659, 4.24410776079991, 4.43558100081747, 4.60964294561013, 4.75468128549187, 4.86046177807934, 4.9194888290629, 4.92805980257479, 4.88681278320138, 4.8006653181217, 4.67816096010097, 4.53035180776468, 4.36942361811347, 4.20730035515056, 4.0544447612906, 3.91901041669511, 3.80641734175127, 3.71933918077137, 3.65802377540445, 3.62083087191931, 3.60486195556032, 3.60657199078188, 3.62228240622752, 3.6485504640882, 3.68238520641597, 3.72132898766727, 3.76344210428365, 3.80723415188373, 3.85158030231255, 3.89564753572349, 3.93884061408813, 0.98429787646103, 1.03326159955897, 1.09050345666027, 1.1587009728831, 1.24155260481659, 1.34385388195948, 1.47124219558739, 1.62932247570893, 1.82191435815329, 2.04877499839305, 2.3041516128958, 2.57738153752452, 2.85488098937414, 3.12166317231885, 3.36171658247996, 3.55787751785972, 3.69159670941005, 3.74316411276498, 3.69416507256708, 3.53355004138851, 3.26548786938717, 2.91399038194909, 2.51989680138182, 2.13047003590497, 1.78677878922676, 1.51507530275764, 1.32507322294075, 1.21362104225962, 1.17013513994537, 1.18095524036117, 1.23181212222478, 1.30901375964012, 1.40019842897687, 1.49506382632774, 1.58602211400506, 1.66855789820847, 0, 0, 0, 1.91593119273262, 1.97021830948827, 2.02729475213662, 2.08866700178163, 2.15465422702087, 2.22449386526868, 2.29660445356706, 2.36893267133387, 2.43931395042686, 2.50578848741466, 2.56683376591396, 2.62149676240963, 2.66942974094464, 2.71084952258249, 2.74644932077416, 2.77729428030962, 2.80472775562618, 2.83030694517231, 2.85577578789859, 2.88307179711184, 2.91435310066615, 2.95202335657251, 2.99872623432513, 3.05727868949966, 3.13051453411475, 3.22101848822217, 3.3307478129108, 3.46056468380693, 3.60973583212125, 3.77549026505748, 3.95274989430216, 4.134148404891, 4.310420962064, 4.47118130159226, 4.60601605699508, 4.70574181628952, 4.76361399626521, 4.77626702454272, 4.74420774369438, 4.67176844664525, 4.56653116140943, 4.4383348382603, 4.29804884102675, 4.15632499922834, 4.02252339695444, 3.90395250507901, 3.80548900346554, 3.72956647211429, 3.67646194807557, 3.64477487520872, 3.63198556538711, 3.63499473849683, 3.65057365005089, 3.67568729899854, 3.70768435709699, 3.74437185871179, 3.78400734350301, 3.82524514110234, 3.86706823592148, 3.90872614967556, 3.94968705695471, 0.981036071702848, 1.02676872825389, 1.08010272623824, 1.14365412906355, 1.22095655141006, 1.31646116195585, 1.43521582582284, 1.58205197982836, 1.76018281647741, 1.96945865787537, 2.20503343437007, 2.45722560941292, 2.71257940388393, 2.9553992238202, 3.16908661654145, 3.33690594419035, 3.44205843645630, 3.46782711644265, 3.39960824302985, 3.22999542184572, 2.96526149277495, 2.62897480103630, 2.25906921047412, 1.89865225923299, 1.58499175659681, 1.34197732615628, 1.17853384399147, 1.09171741080109, 1.07141391264593, 1.10422847657316, 1.17585349463411, 1.27238186323125, 1.3812269060421, 1.49194644144224, 1.59690328744549, 1.69157590400225, 0, 0, 0, 1.96798807420075, 2.02425101958404, 2.08113605459916, 2.14028257041227, 2.20226301117679, 2.26667549503418, 2.3323749489044, 2.39777657097369, 2.46116954781212, 2.52099113709973, 2.57602848683248, 2.62553457249673, 2.66926211157664, 2.70743260523844, 2.74066523282422, 2.76989195770565, 2.79628175417964, 2.82118981981359, 2.84613860395416, 2.87282784717024, 2.90316165223405, 2.93927274628812, 2.98351839911336, 3.03841999871947, 3.10652044778438, 3.19014197561672, 3.29104309626787, 3.40999753215762, 3.54634763504836, 3.69761411754045, 3.85926316037331, 4.02473044808846, 4.18577194633775, 4.33315374539383, 4.45761878309764, 4.5509957735821, 4.60726662691539, 4.62339930864516, 4.5997887043824, 4.54022101725935, 4.45136960544761, 4.34191925879745, 4.22148073690825, 4.0994842164245, 3.98422584361197, 3.88219318035069, 3.79772803230727, 3.73301682463156, 3.68834467431102, 3.6625185328149, 3.65335860719038, 3.65817100830655, 3.67414040524932, 3.69861133520263, 3.72925422973035, 3.76413283697369, 3.80170136213877, 3.84076216108501, 3.88040992021412, 3.91997907834917, 3.95900143987746, 0.979311034029364, 1.02229205775147, 1.0721680678856, 1.13143485886290, 1.20341076835116, 1.29219580857105, 1.40233175382803, 1.53804545194894, 1.70204388366240, 1.89405163606996, 2.10958020972056, 2.33950805204987, 2.57072578573078, 2.78759998542917, 2.97367000485966, 3.11289599287481, 3.19012468016824, 3.19142974571062, 3.10586681109293, 2.92956528473920, 2.6707781930074, 2.35244652773382, 2.00935304903594, 1.68017947925733, 1.39815266260958, 1.18463689477061, 1.04770624142637, 0.984661949470643, 0.98597820315383, 1.03869732096663, 1.12866570663423, 1.24194385528637, 1.36587140622321, 1.48997731017580, 1.60664915183881, 1.71140712328495, 1.80272077296229, 0, 0, 0, 2.06929903150842, 2.12583437037089, 2.18291647623716, 2.24133357567293, 2.30099220621183, 2.36112118327016, 2.42053748055964, 2.47791942225485, 2.53204449077602, 2.58196455067183, 2.62710764351679, 2.66731016601749, 2.7027942038143, 2.73411095327446, 2.76207242665669, 2.78769073790838, 2.81213840371748, 2.83673553122336, 2.86296157274309, 2.89248134216544, 2.92716793399159, 2.96909989925006, 3.02050763379118, 3.08364586813093, 3.16057698217558, 3.25286476453081, 3.36120005789846, 3.48500597472935, 3.62209544511033, 3.76846952381531, 3.91834233539642, 4.06445195652672, 4.19866669197048, 4.31283219163133, 4.39974257567581, 4.45407618486782, 4.47312776998936, 4.45719891115245, 4.40957132718672, 4.33606838609358, 4.24428875081898, 4.14265391153049, 4.03943577364762, 3.94191821561482, 3.85580392676124, 3.78491825368888, 3.73120117151686, 3.69493058650575, 3.6750930293345, 3.66981271150737, 3.67676266588647, 3.69350511816347, 3.71773488893094, 3.74742353704180, 3.78087934827008, 3.81674756277165, 3.85397673728144, 3.89177268076191, 3.9295537614436, 3.96691349968626, 0.978811843109271, 1.01946837906650, 1.06630223286624, 1.12164285354922, 1.1885505831545, 1.27075370299581, 1.37231321674407, 1.49692438927756, 1.64684692717403, 1.82162151526949, 2.01693897554637, 2.22413318643129, 2.43062455487792, 2.62126966687782, 2.78014676099454, 2.8920773804575, 2.94347406883842, 2.92296048642173, 2.82292454011760, 2.64268418250945, 2.39218161467503, 2.09355814720675, 1.77840296234867, 1.48101409742367, 1.23063663191078, 1.04614054584052, 0.934750456596723, 0.894015125933936, 0.91503421466933, 0.985373241680259, 1.09115695617991, 1.21855130716731, 1.35494897618424, 1.48995086990437, 1.61604138997588, 1.72883111972684, 1.82683959265194, 1.91091058144659, 0, 0, 2.10621418936578, 2.16223725410227, 2.21739593564350, 2.27265625171364, 2.32818241411175, 2.38351766946127, 2.43781797107382, 2.49009037723629, 2.53939968804596, 2.58502078281235, 2.62652818101244, 2.66382658629306, 2.69713513763487, 2.72694303654151, 2.75395515748654, 2.77904381137935, 2.80321797676516, 2.82761502434076, 2.85351305742739, 2.88235511952733, 2.9157702913391, 2.95557189481672, 3.00371074194998, 3.06216301976961, 3.13273945040791, 3.21681576815996, 3.3150039789277, 3.42680683954659, 3.55031947369334, 3.68205494739546, 3.81696768237766, 3.94872517779301, 4.07023552496618, 4.17438335134649, 4.25487343613724, 4.3070444723829, 4.32850735839572, 4.31948764853555, 4.28280575995636, 4.22349846125699, 4.14815388816216, 4.06408325652751, 3.97847426209068, 3.89766076357059, 3.82660618233877, 3.76864585513503, 3.72548040648186, 3.69737020207634, 3.68345726015809, 3.68213681708541, 3.69141231260132, 3.70918844571650, 3.73348041622297, 3.76253814718622, 3.79489892332317, 3.82938932733947, 3.86509819439984, 3.90133833873526, 3.93760845985712, 3.97356028292907, 0.979244880162183, 1.01795147529461, 1.06212356346342, 1.11389150802058, 1.17602722529847, 1.2518697372102, 1.34500694025926, 1.45863855938017, 1.59461955421556, 1.75231766960331, 1.92758300810687, 2.11223058217109, 2.29436658110745, 2.45960443192772, 2.59281621847570, 2.67980439949160, 2.70846674460336, 2.66968257027097, 2.55870547052601, 2.37752105626718, 2.13735494166486, 1.85939315401696, 1.57214381566834, 1.30579481432334, 1.08588638419100, 0.928962829448148, 0.841442264914652, 0.821094282804529, 0.859620791347573, 0.945135456532062, 1.06411881368398, 1.20295004925268, 1.34918519305629, 1.49259043743587, 1.62581605746341, 1.74460974968725, 1.84757140950584, 1.93555914829633, 0, 0, 2.13592503119266, 2.19127291609556, 2.24462843709787, 2.29709769004391, 2.34905418649294, 2.40030007142141, 2.4502722836937, 2.49825120252474, 2.54354062067395, 2.58560047246548, 2.62412583588802, 2.65907590544851, 2.69066390647160, 2.71932283670051, 2.74566257969313, 2.77043187975579, 2.7944946633991, 2.81882499487175, 2.84451918228573, 2.87281769996791, 2.90512416949716, 2.94300435378202, 2.98814599792895, 3.0422617162897, 3.10692330668493, 3.18332768137331, 3.27201162379451, 3.37255249873985, 3.48331039523361, 3.60127790932314, 3.72210082377877, 3.84031260540725, 3.94978880962711, 4.04438068691073, 4.11864169976094, 4.16852907054392, 4.19195520162539, 4.1890850445569, 4.16232157451352, 4.11598168746814, 4.05572430352232, 3.98783677107463, 3.91850484407253, 3.8531827101939, 3.79614743736494, 3.75027696936118, 3.71704468214806, 3.69668709894072, 3.68848091498736, 3.69106205181875, 3.70272975325042, 3.72169706773265, 3.74626945930657, 3.77495102287576, 3.80649006462926, 3.83988180699983, 3.87434639700080, 3.9092969332162, 3.94430697036087, 3.9790818290311 ), .Dim = c(100, 100)) rgl/inst/textures/0000755000176000001440000000000012100313500013707 5ustar ripleyusersrgl/inst/textures/bump_dust.png0000644000176000001440000062541411257014117016451 0ustar ripleyusers‰PNG  IHDR,æà/D IDATxÚ9‚Æ}LLLúúúíííÿÿÿÿÿÿûûûÿÿÿûûûÿÿÿÿÿÿÿÿÿûûûüüüýýýüüüûûûòòò÷÷÷öööøøøÿÿÿþþþýýý÷÷÷þþþÿÿÿþþþÿÿÿ÷÷÷ýýýûûûúúú òòòüüüÿÿÿýýýûûûøøø###ÝÝÝÎÎÎ:::>>>ððð'''ÔÔÔáááþþþååå(((ÞÞÞ ìììõõõ***ÒÒÒ'''æææ þþþùùùýýý÷÷÷ÿÿÿýýýþþþÿÿÿüüüðððêêêëëëãããôôô'''øøø444ÜÜÜ åååþþþöööïïïûûûóóó÷÷÷æææççç÷÷÷þþþØØØýýýñññóóóððð÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿ ñññóóó ýýýúúúöööðððýýýôôôûûûþþþééé###öööõõõÿÿÿþþþÿÿÿýýýûûûýýýÿÿÿúúúúúúüüüùùùþþþýýýýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ððð ëëëîîîþþþüüüüüüúúú üüüñññúúúùùù øøø666ýýýëëëîîîùùùþþþüüüÿÿÿþþþþþþþþþþþþÿÿÿúúúøøøüüüÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýúúúÿÿÿÿÿÿþþþüüü ýýýùùùýýýþþþÿÿÿüüü ×××ììì444)))ÓÓÓÝÝÝúúúæææóóóòòòêêêõõõ íííóóó)))úúúðððýýýþþþýýýþþþÿÿÿþþþúúúþþþýýýùùùúúúþþþþþþùùùóóóøøø  ÷÷÷ìììüüüëëëôôôúúúÿÿÿ òòò ýýýüüü÷÷÷ïïïúúú þþþþþþ úúúïïïöööôôôüüüüüüõõõüüüûûûòòòûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüþþþýýýûûûüüüþþþþþþþþþüüüþþþýýýþþþÿÿÿüüüûûûÿÿÿÿÿÿÿÿÿùùùüüüõõõþþþüüüýýýýýýùùùüüüýýý***ùùùüüüÿÿÿþþþ ùùùÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûùùùþþþÿÿÿ ôôôþþþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþüüüûûûûûûÿÿÿÿÿÿüüüúúúèèè'''ÝÝÝÌÌÌ'''ÚÚÚðððííí÷÷÷ïïïòòò%%%%%%ãããøøøýýýøøøÿÿÿÿÿÿüüüÿÿÿýýýöööüüüøøøþþþðððþþþùùùýýýÿÿÿóóó ôôôåååùùùüüüýýýûûû÷÷÷þþþÿÿÿÿÿÿÿÿÿùùùüüüýýýöööüüü ááá ýýýêêêööö úúúúúúûûûÿÿÿüüü ÿÿÿüüüûûûýýýþþþþþþüüüÿÿÿÿÿÿþþþÿÿÿúúúþþþüüüüüüÿÿÿúúúúúúýýýüüüþþþÿÿÿÿÿÿÿÿÿþþþûûûúúúúúúýýýüüü"""ëëëöööÿÿÿñññààà222þþþýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùù úúú÷÷÷ýýýþþþüüüþþþÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþûûû÷÷÷ýýýþþþÿÿÿùùù***×××ÿÿÿüüüåååììììììüüü!!!îîîïïï÷÷÷ üüüÿÿÿüüüþþþþþþþþþúúúÿÿÿüüü óóóôôô ýýýøøøíííþþþ ÷÷÷þþþøøøÿÿÿöööèèèýýý ÿÿÿããã÷÷÷úúúûûûûûûýýýõõõöööÿÿÿþþþþþþÿÿÿÿÿÿûûûÿÿÿþþþüüü÷÷÷ýýýûûûúúúòòòõõõööö îîîüüüñññûûû úúúùùùÿÿÿÿÿÿüüüúúúþþþúúúÿÿÿýýýüüüþþþÿÿÿÿÿÿÿÿÿþþþûûû ÿÿÿûûûüüüüüüþþþûûûþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿýýýûûûîîîöööüüüøøøööö222ÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþþ÷÷÷ýýýéééýýýÿÿÿõõõ×××''' îîîýýý÷÷÷öööîîî þþþþþþÿÿÿÿÿÿûûûøøøûûû  èèèøøøúúúþþþýýýûûûýýýøøøêêê ûûû âââáááþþþ ýýýüüüþþþþþþüüüüüü  úúúüüüóóóççç ððð úúúôôôùùùõõõíííóóó÷÷÷ÿÿÿÿÿÿÿÿÿþþþýýýýýýýýýüüüÿÿÿÿÿÿôôôõõõúúúùùùüüüÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýüüüýýýþþþÿÿÿþþþôôôøøøýýýÿÿÿÿÿÿýýý=== üüüüüüùùù÷÷÷üüüýýýÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýþþþöööúúúýýý üüüÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýîîîûûûööö÷÷÷ùùùûûûôôô öööúúúüüüýýýÿÿÿþþþúúúòòòøøøÿÿÿüüüýýýþþþÿÿÿÿÿÿþþþÿÿÿþþþþþþûûûþþþûûûééé øøøýýýÿÿÿýýýûûû üüüõõõíííîîîüüüûûûæææúúúòòòúúúõõõþþþ ùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ûûû÷÷÷úúúýýýøøø ôôôààà ùùùÜÜÜ ûûûóóóÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüüüüþþþúúúóóóûûû þþþõõõþþþÿÿÿþþþÿÿÿþþþýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿøøøòòòõõõûûû÷÷÷üüüþþþûûûþþþÿÿÿþþþÿÿÿþþþýýýÿÿÿÿÿÿ"""ûûûøøøÿÿÿ þþþþþþÿÿÿûûûýýýÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûûûû÷÷÷ôôô  ýýýùùù ÿÿÿÿÿÿþþþþþþþþþÿÿÿüüüÿÿÿÿÿÿþþþûûû  üüüçççýýýçççäääììì///ðððþþþúúúÿÿÿ ëëëýýýþþþýýýþþþþþþýýýûûûüüüüüüÿÿÿöööþþþüüüõõõÿÿÿþþþÿÿÿ ýýýýýý ìììéééúúúñññ ðððÿÿÿúúúøøøýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿüüüüüüþþþôôôÿÿÿúúú)))÷÷÷ßßßòòòùùù)))õõõõõõééé÷÷÷ ÿÿÿþþþþþþ üüüþþþúúúúúú  þþþûûûüüü ýýýÿÿÿþþþÿÿÿÿÿÿýýýýýýþþþþþþÿÿÿüüüùùùþþþöööéééýýý ÿÿÿþþþþþþþþþúúúúúúûûûüüüÿÿÿ úúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóó÷÷÷ùùùùùùûûûüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿùùùúúúýýýööö÷÷÷óóóôôôÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýýýýúúú ììì þþþøøøüüüèèè ñññ%%% ÙÙÙûûû ÞÞÞõõõ000óóóúúúûûûÿÿÿþþþÿÿÿÿÿÿÿÿÿúúúøøøþþþÿÿÿîîîðððýýýÿÿÿÿÿÿÿÿÿÿÿÿôôôüüü úúúðððúúúòòò ÎÎÎ þþþþþþþþþÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿøøø ñññíííúúúûûûüüüÖÖÖ"""FFFìììàààôôô ØØØøøø%%%ôôôþþþþþþþþþÿÿÿÿÿÿÿÿÿüüüøøøúúú ýýý÷÷÷ýýýùùùüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿýýýÿÿÿýýýûûû###òòòíííñññúúúøøø÷÷÷÷÷÷ýýýÿÿÿþþþ---üüüýýýýýýþþþÿÿÿúúú ÿÿÿùùùÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýüüüüüüôôô ùùùøøø çççÞÞÞýýý!!!ûûûúúúþþþþþþúúúûûûñññþþþÿÿÿ ýýýúúúýýýüüüùùùÿÿÿùùùþþþüüüÿÿÿòòòïïï üüü ôôôÿÿÿ$$$ ùùù÷÷÷ûûûÿÿÿüüüóóó ÷÷÷øøøòòò÷÷÷øøøÿÿÿøøøûûûìììùùùþþþþþþüüüþþþúúúøøøëëëøøøïïïðððñññèèè&&&ñññîîîòòòùùùýýýûûûÿÿÿþþþûûûîîîúúú((( ÚÚÚýýýÓÓÓðððèèèÖÖÖ æææ þþþýýýÿÿÿýýýøøøûûûþþþüüüþþþóóóùùù ùùùùùùÿÿÿúúúøøøÿÿÿýýýýýýøøøýýý ÷÷÷úúúûûû þþþòòòþþþüüüùùù ðððíííèèèéééìììþþþþþþûûûóóó)))ùùùùùùÿÿÿýýýýýýþþþ222þþþüüüýýýýýýýýý÷÷÷üüüKºp IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþôôô ôôôýýý÷÷÷éééôôôüüüùùùÿÿÿûûûøøøüüüþþþþþþÿÿÿóóó÷÷÷ûûûöööþþþÿÿÿüüüÿÿÿÿÿÿýýýöööøøøíííÿÿÿâââñññ òòòñññ÷÷÷ õõõýýýþþþ þþþüüüùùùþþþóóóþþþ üüüüüüÿÿÿýýýþþþÿÿÿùùùõõõùùùôôôëëë þþþ üüüüüü@@@×××ùùùúúúÿÿÿÿÿÿþþþþþþããã óóóâââ ííí ñññâââTTTöööëëë %%%õõõúúúþþþþþþÿÿÿþþþÿÿÿþþþýýýýýýþþþüüüíííîîîúúúÿÿÿ úúúýýý þþþÿÿÿúúúúúú ûûûúúú òòòïïïûûûôôôÞÞÞñññ ûûûüüüûûû  öööìììÿÿÿÿÿÿÿÿÿ333ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóúúúùùù ôôôùùùùùùþþþùùùýýýüüüþþþþþþúúúøøø ÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüÿÿÿÿÿÿýýýýýýýýýììì%%%ìììêêê%%%õõõøøøôôô ***çççýýýùùùüüüûûûþþþÿÿÿ÷÷÷ýýýýýýýýý ÷÷÷ÿÿÿþþþ ÝÝÝööö@@@òòòúúúãããìììCCCøøøõõõ åååæææ çççúúúÿÿÿÿÿÿþþþüüüûûûúúúýýý%%%ñññüüüêêê%%%çççõõõ:::óóóæææ ùùùùùùøøøàààôôôîîîþþþÿÿÿüüüÿÿÿýýýþþþüüü óóóððð þþþûûûÿÿÿ÷÷÷ýýýûûûþþþÿÿÿþþþýýýÿÿÿýýýììì&&&))) èèèîîîþþþ ýýýýýýÿÿÿÿÿÿüüü÷÷÷úúúþþþýýýÿÿÿþþþ555ÿÿÿÿÿÿþþþýýýþþþÿÿÿ øøøþþþþþþúúúþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  óóóôôôýýýñññóóó ûûûëëë óóóõõõýýýÿÿÿýýýüüü ÿÿÿþþþýýýöööúúúôôôýýý ÿÿÿýýýýýýüüüûûûýýýúúú ÜÜÜæææ888ûûûúúúóóóýýý óóóôôôÿÿÿÿÿÿüüüúúú üüüýýýþþþÿÿÿúúúøøøúúúùùùÿÿÿþþþþþþøøø òòòÚÚÚ222÷÷÷üüüßßß þþþûûûäää÷÷÷...ðððÿÿÿÿÿÿÿÿÿþþþýýýýýýüüüüüüôôôÞÞÞ ùùùüüüÿÿÿ óóóûûûççç ÷÷÷òòò þþþþþþùùùýýýÿÿÿÿÿÿ÷÷÷ôôôûûûúúúÿÿÿÿÿÿþþþøøøüüüûûûûûûûûûþþþûûû þþþóóóÿÿÿ õõõíííñññ&&&ýýýØØØþþþùùùûûû üüüúúúûûûûûûùùùÿÿÿüüüüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿõõõ ÿÿÿúúúýýýþþþþþþÿÿÿÿÿÿûûûþþþ çççíííÞÞÞøøø ûûûøøøúúúþþþ þþþÿÿÿÿÿÿüüüýýýüüüþþþýýýüüüüüüùùùúúúÿÿÿþþþþþþôôôäääúúúóóóýýýúúúíííõõõúúúýýýööö ÿÿÿÿÿÿýýýýýýýýýÿÿÿ ÿÿÿÿÿÿþþþýýýýýýÿÿÿûûûùùù öööëëëþþþ---ÉÉÉÞÞÞéééÑÑÑÛÛÛýýý÷÷÷ëëëÿÿÿÿÿÿþþþþþþÿÿÿààà ðððêêê ýýýûûûðððýýý ôôôùùù ÷÷÷îîî ÿÿÿÿÿÿþþþüüüÿÿÿÿÿÿ öööøøøüüü÷÷÷÷÷÷ ÿÿÿþþþÿÿÿÿÿÿûûûþþþþþþûûûùùùûûûüüüýýýóóóððð¿¿¿ûûûûûûþþþÿÿÿ÷÷÷ÿÿÿÿÿÿùùùýýýþþþÿÿÿÿÿÿÿÿÿ666ÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿííí ýýýýýý ûûûùùù ÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿöööõõõúúúïïï555àààüüüÿÿÿüüüüüüþþþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿõõõ óóóûûûÿÿÿýýýýýýüüüøøøþþþþþþÿÿÿ òòòöööúúúüüüÿÿÿýýýêêêûûûìììüüüüüüüüü ÿÿÿüüüýýýûûûûûûúúúóóóýýýûûû îîîÏÏÏçççÅÅÅ ìììîîîîîîîîîûûûýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿ÷÷÷îîîúúú ìììêêêõõõäääþþþýýýùùùëëëúúúþþþÿÿÿþþþþþþþþþÿÿÿøøøûûûùùùþþþ üüüüüüþþþüüü úúúûûûýýýÿÿÿöööôôô üüüùùùÿÿÿ òòò÷÷÷ùùùûûûÿÿÿþþþüüüþþþþþþÿÿÿÿÿÿÿÿÿþþþ555þþþÿÿÿÿÿÿþþþüüüðððôôô÷÷÷úúúÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿýýý úúú÷÷÷ñññüüüôôô!!!%%%ÛÛÛ ýýýþþþøøø÷÷÷ûûûÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿùùù öööòòòÿÿÿþþþþþþÿÿÿþþþåååóóó÷÷÷õõõééé+++äääûûûèèèóóóûûûôôôûûûÿÿÿ÷÷÷öööÿÿÿþþþûûûøøøýýýÿÿÿ æææ ãããííí666þþþððð ýýýöööÿÿÿþþþøøø÷÷÷ ôôôòòòìììâââäää  ìììòòò ùùùþþþýýýþþþýýýùùùÿÿÿþþþ üüüûûûüüüþþþüüü øøøýýýþþþÿÿÿþþþÿÿÿüüüþþþ ÿÿÿüüüøøø  ÿÿÿàààÿÿÿþþþýýýýýýýýýÿÿÿýýýüüüûûûþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿ555ÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿèèè///êêêýýýýýýúúúüüüûûûüüüÿÿÿýýýÿÿÿüüüûûûýýýýýýûûû ððð>>>ííí þþþ ûûûûûûøøøôôô þþþþþþþþþÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿúúúþþþøøøôôôþþþþþþÿÿÿýýýÿÿÿééé!!!555ñññôôôÿÿÿøøøüüüýýýõõõôôôÿÿÿïïïþþþýýýûûû þþþøøøúúúùùùüüüÿÿÿþþþüüüøøøûûûúúú íííñññüüü###ÔÔÔ ýýýßßß ýýýúúú ýýýÿÿÿþþþýýýýýý÷÷÷ëëëõõõäääõõõüüüûûûÿÿÿ êêêòòò ÿÿÿòòòýýýÿÿÿûûûýýýþþþüüüüüüûûûÿÿÿþþþúúúøøøÿÿÿþþþÿÿÿüüüööö ýýý ÷÷÷õõõðððåååþþþüüüööö÷÷÷ýýýýýýýýýùùù ÿÿÿÿÿÿþþþþþþ555ýýýýýýÿÿÿüüüùùùéééúúúîîîýýýôôôüüüüüü èèèðððûûûååå'''ßßß$$$òòòüüüüüüäää÷÷÷ýýýìììüüüùùùýýýýýý úúúúúúõõõîîîýýýúúúýýýøøøúúúÿÿÿóóóõõõÿÿÿðððúúúþþþ ÷÷÷ôôôûûû ÿÿÿ"""áááìììüüüááá%%%ùùùéééúúúúúú úúúýýýùùùîîîøøøþþþôôô üüüüüüÿÿÿüüüýýýþþþøøøòòòþþþ ôôô÷÷÷ýýý îîîöööïïïøøøÿÿÿýýýýýýþþþýýýþþþþþþûûûÿÿÿÿÿÿÿÿÿþþþýýýþþþ üüüþþþòòòùùù ùùùûûû úúúøøøüüüýýýõõõúúúþþþþþþÿÿÿþþþûûûýýýûûûüüüüüüþþþçççñññýýýñññýýý ûûûùùùûûûûûûöööÝÝÝýýýÿÿÿ×××üüüýýýýýýÿÿÿýýýùùùüüü þþþûûûüüüÿÿÿþþþÿÿÿùùù555ÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýýýýöööúúúùùùÙÙÙööö ÿÿÿ÷÷÷óóóüüü æææÿÿÿèèèìììùùùüüüþþþ ñññüüü ñññûûûôôôþþþþþþùùùÿÿÿüüüþþþüüüõõõøøøôôôóóó õõõøøøþþþúúúüüüþþþüüü øøøìììüüüúúúýýýïïïûûûýýýÿÿÿÿÿÿùùù ûûûæææüüüýýý ÿÿÿøøøøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûýýý óóó÷÷÷ þþþÿÿÿýýýýýýüüüþþþ ûûû úúúùùùÿÿÿòòòñññÿÿÿûûûñññóóóúúúÿÿÿÿÿÿÿÿÿüüüþþþüüüþþþòòòûûûîîîüüü ýýýûûûýýýøøø ÿÿÿþþþÿÿÿ øøøööö÷÷÷ûûûæææûûûýýýûûûýýýüüüþþþÿÿÿýýýýýýÿÿÿ÷÷÷ÿÿÿýýý444ÿÿÿþþþ ûûûúúúûûûþþþøøøûûû÷÷÷õõõøøøíííýýýúúúþþþèèèîîîÿÿÿÿÿÿþþþöööõõõ úúúíííýýý èè|[ã IDATèÙÙÙ---þþþýýýøøøûûûööö÷÷÷ÿÿÿõõõùùù ÿÿÿüüüþþþýýýòòòûûûðððþþþçççøøøïïïôôô þþþöööüüüèèèààà%%%êêêßßßûûûúúúùùùûûûùùù÷÷÷ùùùõõõöööîîîêêêííí÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýý þþþôôôüüü ýýýþþþþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿüüüýýýôôôùùù òòòÿÿÿýýýþþþýýý ÿÿÿ÷÷÷óóóûûûÿÿÿþþþûûûýýýûûûüüüóóó""" êêê ùùùúúúøøø ÿÿÿþþþ÷÷÷ýýý ôôôûûûñññüüü éééçççúúúÿÿÿüüüþþþýýýùùùþþþûûûÿÿÿ 555ÿÿÿÿÿÿÿÿÿýýýüüüþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿòòòñññòòòäääÿÿÿÿÿÿüüü ýýýýýýÿÿÿÿÿÿýýýúúúûûûûûû öööùùùùùùûûû÷÷÷ÿÿÿ ùùùþþþøøøùùùõõõëëë ôôôÿÿÿøøø ÿÿÿýýýýýýþþþùùùöööûûûæææ...êêêðððüüüùùùùùùüüüøøøøøø þþþÞÞÞæææöööýýýþþþþþþýýýùùùïïïòòò CCC þþþúúúþþþÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýüüüþþþüüüûûûüüüþþþþþþýýýüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþôôô ùùùýýý úúúûûûýýý þþþøøøúúúþþþüüüþþþûûûüüüûûûöööÿÿÿûûûùùùýýýþþþýýýûûûüüüýýýççç ýýýàààñññ  òòòýýýüüüÿÿÿþþþÿÿÿÿÿÿüüüùùùúúúýýý444þþþÿÿÿ÷÷÷ùùùøøøèèèýýý!!!ÖÖÖõõõ!!!ïïïüüüþþþþþþüüü öööüüüïïïðððüüüöööòòòèèèþþþûûûõõõùùùüüü þþþýýýÿÿÿüüüþþþÿÿÿþþþÿÿÿüüüöööèèè 888åååÛÛÛ###õõõûûû ÷÷÷ûûûþþþöööøøøîîîÿÿÿùùùýýý  ììì ëëëôôô)))úúúûûû öööôôôþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿýýýúúúýýýüüüþþþÿÿÿÿÿÿþþþþþþÿÿÿýýýÿÿÿþþþûûûýýýùùùþþþ þþþúúúüüüøøøÿÿÿ øøøùùùþþþýýýýýýýýýöööþþþþþþñññúúúúúúúúúøøøÿÿÿÿÿÿÿÿÿÿÿÿòòòöööüüü ùùùæææ üüüëëëýýýûûûÿÿÿÿÿÿõõõôôôþþþýýý 444þþþÿÿÿþþþ ýýýüüüýýýððð÷÷÷%%% úúúÿÿÿööö  æææ øøøöööþþþÿÿÿÿÿÿþþþþþþýýýüüüþþþþþþ÷÷÷ñññüüü óóóëëë ùùùÿÿÿ ÿÿÿðððôôô&&&üüüùùùüüüöööþþþýýýúúúþþþóóóâââõõõ&&&òòòéééûûûúúúÿÿÿ ùùùôôôëëë ôôôùùùùùù÷÷÷÷÷÷ óóóééé öööÛÛÛñññûûûöööòòòøøøÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýýý÷÷÷ üüüúúúûûûþþþþþþÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿýýýÿÿÿûûûøøø÷÷÷öööþþþ÷÷÷÷÷÷üüü òòòðððùùùÿÿÿüüüþþþúúúúúúüüüôôôþþþ úúúÿÿÿûûûþþþþþþþþþýýýþþþõõõýýýÿÿÿ÷÷÷ñññððð---ëëëâââúúú úúúýýýÿÿÿüüüÿÿÿüüüøøøÿÿÿõõõõõõ ÿÿÿÿÿÿÿÿÿøøøúúúúúúúúúëëë úúúíííööö óóóòòòûûûþþþ÷÷÷íííüüüõõõéééæææäääüüü$$$ùùù÷÷÷óóó $$$çççîîîïïïþþþ óóóÿÿÿþþþøøøøøøþþþäääïïï###øøøóóóüüüöööÿÿÿóóóúúúõõõøøøýýýøøø òòòëëë ÿÿÿüüüþþþýýýòòòýýýýýýùùùþþþýýýþþþÿÿÿÿÿÿÿÿÿþþþþþþýýý ýýý÷÷÷ýýýÿÿÿÿÿÿùùùþþþÿÿÿýýýþþþûûûÿÿÿüüü üüüöööÿÿÿýýýÿÿÿûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿùùù úúúþþþùùùùùùþþþööö ÿÿÿÿÿÿûûûþþþÿÿÿýýýýýýÿÿÿþþþüüü ëëëûûûäääýýýýýý÷÷÷òòò èèèúúúýýýðððóóóûûû ööööööþþþ÷÷÷444ÿÿÿþþþôôôýýý ÷÷÷óóóöööæææ þþþ###éééîîîþþþððð öööÿÿÿÿÿÿ ððð ôôô øøøõõõýýý øøø óóóõõõÿÿÿéééêêê îîîýýýÿÿÿúúúþþþúúúýýý÷÷÷úúúåååìììëëëýýýøøøùùù þþþ÷÷÷ööö üüüòòòððð ÷÷÷óóóìììçççõõõûûûðððÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿôôôîîîûûû ûûûÿÿÿÿÿÿýýýýýýûûûúúúýýýÿÿÿþþþýýý÷÷÷úúú÷÷÷ýýý õõõþþþÿÿÿþþþÿÿÿýýýûûûýýýûûûþþþýýýüüüôôôÿÿÿþþþúúúôôôôôôñññÿÿÿÿÿÿþþþüüüøøøööö ýýýðððàààüüüüüüííí777ÿÿÿ îîîöööõõõõõõýýýþþþòòòòòò&&&ããã úúúýýý888ýýýüüüÿÿÿýýýüüüýýýûûûúúú ðððþþþñññ üüüìììööö óóóýýýüüüþþþýýýþþþÿÿÿþþþüüüúúúøøø ùùùýýýüüüúúúúúú øøøøøøþþþÿÿÿùùùùùùýýýýýýýýýüüüþþþûûûÿÿÿÿÿÿÿÿÿùùùüüü üüüôôôåååûûûììì ôôôúúúøøø ïïïþþþüüüÿÿÿõõõþþþúúúùùùøøø ÿÿÿõõõùùùþþþüüüþþþÿÿÿþþþýýýþþþÿÿÿüüüýýýýýýúúú ÿÿÿ þþþúúú üüüäää ûûûèèèüüüþþþÿÿÿþþþýýýüüüòòò õõõúúúþþþ÷÷÷ýýýúúú÷÷÷üüüûûûüüüþþþýýýùùùüüüûûûÿÿÿþþþýýýÿÿÿþþþÿÿÿøøøÿÿÿÿÿÿøøøÿÿÿøøøùùùýýýúúúõõõôôôøøøöööüüü õõõûûû444óóóÚÚÚöööëëëïïïùùùüüüóóó÷÷÷ùùùÔÔÔñññúúú 444ûûûþþþÿÿÿøøøôôôÿÿÿþþþýýýþþþýýýÿÿÿýýýýýýúúú üüüùùùüüüýýýþþþÿÿÿþþþþþþÿÿÿöööôôôûûû þþþùùùøøøûûûþþþÿÿÿÿÿÿÿÿÿþþþüüü õõõèèèööö÷÷÷ ÙÙÙ ñññëëëóóóþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿûûûõõõøøøýýýûûûüüü÷÷÷ùùùþþþÿÿÿüüüüüüûûûþþþúúúþþþþþþúúúúúú úúú÷÷÷ýýýüüüööö çççþþþ çççþþþûûûñññþþþþþþýýýþþþþþþýýýøøø÷÷÷üüüûûûûûûþþþýýýüüüûûûýýýýýýÿÿÿýýýüüüúúúÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþùùùùùùÿÿÿþþþûûûÿÿÿüüü!!!ÉÉÉ üüüýýýòòòáááúúúþþþýýýñññûûûðððþþþöööåååôôô ÿÿÿþþþ÷÷÷ûûûúúúúúúýýýûûûûûûûûûþþþÿÿÿÿÿÿöööüüüýýýüüüýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýýýýúúúùùùùùùøøøýýýÿÿÿþþþÿÿÿþþþþþþÿÿÿýýýþþþûûûñññøøøïïïóóó""" ííí ûûû óóóýýýýýýüüüúúúýýýûûû÷÷÷ þþþÿÿÿüüüþþþüüüÿÿÿþþþÿÿÿýýýþþþýýýüüüþþþøøøüüüöööÞÞÞòòòõõõúúúÿÿÿýýýþþþþþþþþþþþþùùùõõõøøø÷÷÷úúúúúúÿÿÿÿÿÿÿÿÿýýýüüüúúú ùùùÿÿÿúúúùùùûûûýýýÿÿÿýýýÿÿÿüüüûûûúúú þþþùùùÿÿÿþþþÿÿÿÿÿÿýýýüüü÷÷÷ôôôäää...óóóÝÝÝòòòééé ýýýðððíííóóóêêêùùùìììðððáááÿÿÿùùù÷÷÷ñññæææþþþÿÿÿüüüüüüüüüÿÿÿüüüüüüýýýÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿþþþúúúÿÿÿýýýþþþþþþøøø òòòÿÿÿöööùùùÿÿÿüüüþþþÿÿÿþݾ IDATþþÿÿÿýýý ÜÜÜ%%% þþþÞÞÞ èèèúúúôôô ÿÿÿþþþþþþÿÿÿýýýÿÿÿøøøýýýöööóóóûûûûûûýýýúúúþþþùùùþþþôôôýýýûûûöööõõõ çççõõõ èèèþþþÿÿÿþþþüüü÷÷÷ûûûôôôöööùùùððð÷÷÷öööüüüþþþÿÿÿþþþþþþùùùøøøûûû ýýýùùùÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿþþþúúúüüü ÷÷÷ùùùýýýýýýÿÿÿþþþûûûîîî÷÷÷ÿÿÿ  ýýýðððûûû þþþñññýýýûûûþþþóóóøøø××× ùùùúúúúúú âââýýýÿÿÿþþþÿÿÿüüüûûûÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþüüüüüüþþþþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿþþþþþþþþþûûû÷÷÷üüüüüüúúúüüüúúúÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿüüüÚÚÚ üüüòòòïïï ÿÿÿÿÿÿÿÿÿþþþþþþúúúúúúÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿýýýûûûùùùøøøþþþýýýóóóöööÿÿÿþþþ%%%ôôôëëëþþþúúúúúúÿÿÿÿÿÿõõõ ôôôöööüüüýýýñññ ýýýüüüöööýýýýýýÿÿÿøøøÿÿÿÿÿÿþþþüüüüüü ýýýúúúøøø ÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüþþþýýýýýýýýýþþþüüüýýýÿÿÿþþþøøøûûûýýý ÿÿÿ÷÷÷öööûûûöööþþþøøøööööööòòò îîîÚÚÚ---öööùùù333ûûûíííüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýûûûùùùúúúòòòÿÿÿÿÿÿÿÿÿûûûùùùþþþøøøöööþþþøøøûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿùùùþþþøøøóóó ÿÿÿßßßþþþ úúúõõõúúú üüüÿÿÿýýýúúúÿÿÿùùùøøøúúúüüüýýýûûûþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýûûû ÿÿÿùùùûûûÿÿÿöööïïï )))üüü000åååýýýüüüþþþÿÿÿõõõýýý þþþýýýýýýöööðððÿÿÿøøøüüüüüüÿÿÿýýýöööúúúûûûþþþøøøðððòòò ÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüÿÿÿþþþÿÿÿ ÿÿÿýýýÿÿÿýýýùùùùùùÿÿÿûûûýýý ÿÿÿýýý üüüöööüüüüüüÿÿÿùùù ÿÿÿûûûüüü÷÷÷þþþûûûëëëøøø  þþþ÷÷÷ùùùúúúûûûýýýüüüüüüûûûôôôûûûüüüúúúÿÿÿýýýýýýüüüÿÿÿþþþüüüþþþÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿþþþüüü ûûûûûûÿÿÿüüüýýý ýýýüüüÿÿÿÿÿÿÿÿÿûûûÿÿÿþþþþþþýýý øøøýýý þþþìììóóóóóó öööôôô þþþþþþöööýýýþþþ íííÿÿÿÿÿÿÿÿÿÿÿÿõõõ õõõ üüüùùùüüüÿÿÿûûû þþþòòòüüüñññ)))îîîëëëñññìììøøøúúúÿÿÿ÷÷÷õõõøøøìììøøø,,, ùùùùùùóóóÿÿÿýýýþþþÿÿÿùùùÿÿÿýýýþþþþþþýýýÿÿÿõõõôôôùùùþþþ ýýýþþþþþþÿÿÿþþþûûûÿÿÿÿÿÿÿÿÿýýýþþþùùùýýýýýýûûûüüüùùùùùùýýýýýýûûûõõõÿÿÿööö ðððÿÿÿÿÿÿñññûûû øøøþþþúúúïïïéééÿÿÿÿÿÿ(((þþþöööööö þþþÿÿÿüüüüüüûûûýýýýýýýýýýýýþþþ 444 ÿÿÿûûûûûûþþþÿÿÿþþþþþþþþþýýýüüüüüüþþþüüüûûûûûû þþþíííûûû þþþüüüüüüÿÿÿÿÿÿþþþÿÿÿüüüþþþþþþúúúøøøüüüøøøüüü óóóþþþ ÷÷÷üüüÿÿÿþþþÿÿÿ þþþøøøýýýøøøÿÿÿþþþýýýüüüþþþðððþþþõõõïïïöööøøø üüüüüüèèèööö üüü òòòØØØóóóõõõ÷÷÷üüüêêêùùùððð """ñññóóó ÿÿÿùùùüüüúúú üüüüüüýýýüüüÿÿÿ öööòòò÷÷÷ øøøÿÿÿýýýýýýþþþÿÿÿÿÿÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþûûûýýýþþþþþþþþþ ýýýüüü ÷÷÷üüüþþþ þþþöööùùù÷÷÷úúú úúúüüüøøøþþþ ýýýøøøööö### øøø ÿÿÿ???ôôô þþþååå)))þþþøøøôôôþþþúúúýýýþþþÿÿÿ üüüöööððð ôôôòòòøøøûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿúúúúúú óóóïïïüüü(((ÔÔÔ ÿÿÿýýýòòòÿÿÿ þþþúúúúúú ôôô÷÷÷þþþÿÿÿõõõùùùýýýúúúÿÿÿÿÿÿúúú÷÷÷ ÿÿÿÿÿÿþþþúúúÿÿÿÿÿÿÿÿÿýýýýýýþþþþþþèèèôôôøøøôôôüüüûûûööö òòòùùùÿÿÿüüüùùùþþþïïïøøø ôôô÷÷÷öööÿÿÿüüüüüüúúúþþþ÷÷÷ýýýõõõòòòñññùùùýýýýýýÿÿÿýýýùùùÿÿÿþþþððð ùùù ñññ òòòþþþòòòõõõ222óóó øøøýýýüüüÿÿÿþþþýýýþþþýýýÿÿÿýýýþþþÿÿÿþþþþþþ ýýýÿÿÿýýýöööñññæææúúú úúú÷÷÷÷÷÷÷÷÷ ÷÷÷ þþþççç ìììÿÿÿþþþÿÿÿüüüðððííí öööüüüÿÿÿÿÿÿûûû ÜÜÜûûûþþþýýýýýýÿÿÿÿÿÿþþþþþþóóóüüüúúúýýýýýýÿÿÿ÷÷÷ ÿÿÿ÷÷÷øøøþþþ ñññåååîîîðððüüüôôôöööôôôþþþ ÷÷÷ýýýÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþÿÿÿþþþÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûÿÿÿ÷÷÷ôôô$$$äääýýýÿÿÿñññùùù úúúûûûýýýþþþýýýûûû öööööö÷÷÷ÿÿÿÿÿÿýýýÿÿÿþþþùùùðððõõõýýýúúúþþþþþþ þþþôôôööööööýýý---êêêýýýèèè&&&÷÷÷ïïïûûû÷÷÷ ûûûÿÿÿüüüþþþÿÿÿýýýýýýþþþþþþÿÿÿüüüÿÿÿþþþóóóõõõþþþùùùÿÿÿúúúùùùüüüüüüÿÿÿ  üüüõõõÿÿÿÿÿÿõõõöööïïïþþþüüüóóóùùùóóóøøø555üüüùùùÿÿÿúúúâââøøøÿÿÿþþþÿÿÿÿÿÿýýýþþþúúúùùù óóóüüü ýýýýýýýýýþþþüüüþþþúúúûûûýýýîîîîîîùùùöööÿÿÿðððúúúÿÿÿ òòò ùùùøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿýýýÿÿÿþþþýýýþþþýýýÿÿÿþþþÿÿÿýýýÿÿÿ÷÷÷ùùùÿÿÿóóóîîîçççöööîîîöööôôôúúúÿÿÿýýýùùù÷÷÷ÿÿÿýýýÿÿÿÿÿÿ÷÷÷ÿÿÿýýýüüüþþþøøøûûûýýýóóóöööõõõòòòééé ýýýãããûûû ýýýþþþüüüüüüÿÿÿþþþþþþþþþþþþýýýþþþþþþþþþÿÿÿÿÿÿþþþýýýõõõüüü ìììöööúúúûûûýýýÿÿÿøøøÿÿÿÿÿÿþþþ ôôôøøøóóóÿÿÿ ýýýñññ:::ëëë þþþúúúþþþ,,,ÿÿÿåååãããþþþýýýþþþÿÿÿþþþýýýþþþüüüüüüýýýòòòÿÿÿýýýþþþþþþüüüùùùüüüÿÿÿ!!!ìììëëëýýýüüü???øøøøøøôôôòòòýýýüüü÷÷÷øøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿþþþûûûþþþþþþûûû ïïïøøøýýýùùùýýýýýýûûûùùùüüüüüüÿÿÿúúúûûûüüü ùùùÿÿÿÿÿÿýýýÿÿÿûûûüüü ûûûýýýúúú ùùù÷÷÷÷÷÷ùùù úúúëëëððð$$$ííí þþþ ðððþþþÿÿÿüüüýýýûûûûûûþþþüüüÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþýýýüüüýýý úúúäääöööûûûþþþýýýÿÿÿÿÿÿöööúúúûûûùùùþþþýýýúúú ÞÞÞøøøòòòòòòÿÿÿùùùÿÿÿ'''üüüùùùöööýýýýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿïïï ýýýñññÿÿÿÿÿÿþþþýýýÿÿÿúúúõõõùùù×××ìììûûû úúúüüü÷÷÷úúú ûûûÿÿÿÿÿÿþþþþþþéÝE IDATÿÿÿÿÿÿþþþÿÿÿýýýøøøÿÿÿ ôôôîîî üüüõõõúúúôôô ÿÿÿþþþÿÿÿÿÿÿþþþþþþüüüýýýþþþÿÿÿÿÿÿÿÿÿüüüûûûöööûûûúúú÷÷÷óóóïïï..."""þþþòòòõõõúúúõõõøøøøøøÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿýýýýýýÿÿÿþþþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ çççÛÛÛ*** üüüÿÿÿþþþþþþúúúøøøùùùþþþ þþþýýýþþþõõõ öööþþþ9‚Æ}þþþ ûûûùùùùùùÿÿÿÿÿÿÿÿÿ øøøùùùÿÿÿùùù ûûûúúú ÞÞÞÿÿÿóóóíííëëë ûûûÿÿÿýýýøøøûûûýýýþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýýýþþþþþþýýýÿÿÿþþþÿÿÿýýýþþþÿÿÿýýýüüüýýýþþþ÷÷÷õõõôôô000 òòòöööððð úúú þþþýýýûûûÿÿÿÿÿÿÿÿÿûûûüüüÿÿÿþþþÿÿÿþþþûûûÿÿÿÿÿÿúúúööö÷÷÷ôôôùùùûûûýýýýýýüüü÷÷÷øøø ýýýôôôÞÞÞéééÿÿÿüüüÿÿÿþþþüüüÿÿÿÿÿÿþþþÿÿÿýýýþþþýýýþþþÿÿÿýýýþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿòòòÿÿÿ÷÷÷ öööèèèþþþýýýýýýýýýýýýýýýüüüüüü÷÷÷ýýýéééÿÿÿøøøòòòòòòüüüûûû666ûûûúúúûûûíííüüüøøøÿÿÿþþþþþþÿÿÿÿÿÿ úúúóóóøøøÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿ ÛÛÛäääøøøööö üüüùùùÿÿÿõõõ÷÷÷ûûû ÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýýýýýýýþþþÿÿÿ þþþþþþÿÿÿÿÿÿÿÿÿÿÿÿùùùúúúúúúúúú ýýýýýý333øøøóóóúúúùùùýýýöööûûûþþþüüüþþþþþþÿÿÿþþþÿÿÿÿÿÿþþþþþþöööÿÿÿüüüûûûÿÿÿòòòýýýûûûüüüçççãããøøøüüüûûû ûûûýýýüüüýýýþþþþþþÿÿÿþþþÿÿÿÿÿÿþþþüüüÿÿÿÿÿÿÿÿÿþþþþþþùùùüüüÿÿÿ"""ÚÚÚççç þþþùùùþþþýýýüüüýýýûûûÿÿÿÿÿÿôôôûûû÷÷÷üüü ÷÷÷ ôôôþþþþþþþþþ111þþþùùùþþþ ùùùúúúþþþÿÿÿþþþýýýûûûöööõõõÿÿÿ÷÷÷ ûûûöööýýýþþþøøø øøøþþþîîîúúúøøøýýýýýýøøøõõõùùù ôôôûûûçççøøø÷÷÷ ýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿñññûûû úúúîîîúúú ...(((ÙÙÙõõõßßß!!!ûûûýýý õõõýýýûûûýýýþþþÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿýýý üüüøøøüüü ûûûúúúõõõûûûöööýýý ÿÿÿ äääóóóøøø(((òòòööö÷÷÷ ùùùüüü úúúõõõùùùûûûûûûüüüþþþýýýýýýþþþÿÿÿùùùüüüýýýÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿïïïêêê ýýýÿÿÿþþþÿÿÿýýýúúúøøø øøøùùù óóóììì øøøÿÿÿòòòÿÿÿÿÿÿ+++ ÿÿÿòòòüüü öööüüüóóóõõõ þþþÿÿÿþþþÿÿÿôôôýýýúúúýýý ÿÿÿýýýþþþþþþÿÿÿÿÿÿÿÿÿýýýþþþûûûþþþÿÿÿ ðððêêêþþþõõõöööûûû÷÷÷ ùùùÝÝÝððð--- þþþøøøÿÿÿûûûüüüõõõòòòúúúÿÿÿ éééþþþôôôÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿüüü þþþóóóóóó þþþ÷÷÷òòòîîî'''ÞÞÞôôôþþþûûû íííôôôöööøøø õõõÿÿÿþþþýýýþþþûûûÿÿÿþþþýýýýýýñññûûûýýýÿÿÿýýýõõõþþþ øøøûûûôôôþþþþþþýýýýýýûûûÿÿÿùùùÿÿÿúúúòòòúúúúúúþþþüüüçççðððùùùÿÿÿÿÿÿÿÿÿìììëëëðððþþþýýýûûûýýýýýýþþþÿÿÿþþþûûû ÿÿÿôôôëëë óóó þþþþþþþþþ777ùùùúúúóóóììì þþþúúúÿÿÿüüüÿÿÿüüüþþþúúúýýýüüüýýýþþþÿÿÿÿÿÿýýýýýýÿÿÿþþþÿÿÿÿÿÿýýýþþþýýýúúú õõõûûûøøø÷÷÷ ÷÷÷òòòúúúÝÝÝ888@@@òòòûûûùùùÿÿÿþþþýýýÿÿÿþþþþþþòòòòòò ùùùóóóúúúöööþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýøøøûûûþþþøøøïïïûûûðððõõõööö ÿÿÿþþþêêêõõõ ùùùþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüùùù þþþÿÿÿþþþÿÿÿÿÿÿþþþþþþÿÿÿüüüýýýúúúùùùýýýÿÿÿ÷÷÷þþþýýýýýýþþþüüüþþþÿÿÿþþþÿÿÿÿÿÿþþþþþþïïïýýýóóóùùùðððÿÿÿÿÿÿüüüþþþþþþÿÿÿùùùøøøùùùÿÿÿúúúøøøÿÿÿÿÿÿÿÿÿþþþúúúúúúÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿþþþþþþÿÿÿþþþýýýüüüöööäääôôô%%% åååþþþüüü111$$$ýýýõõõööö÷÷÷ÿÿÿýýýýýýÿÿÿþþþüüüþþþúúúêêê úúúúúúõõõþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþþþþûûûööö"""ñññøøøûûûýýýëëëýýýîîîñññýýý÷÷÷ úúúùùùýýýýýýÿÿÿÿÿÿüüüýýýÿÿÿÿÿÿýýýýýýüüüþþþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿþþþÿÿÿÿÿÿûûûþþþùùùþþþøøøþþþÿÿÿþþþýýýúúúýýýþþþÿÿÿýýýÿÿÿþþþùùùþþþÿÿÿôôôþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýý ìììøøøüüüèèèûûû ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûþþþøøøûûû ùùùÿÿÿøøøúúúÿÿÿÿÿÿÿÿÿýýýüüüþþþýýýÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿþþþúúúýýýüüüèèèÔÔÔ>>>áááÜÜÜóóóööö åååÙÙÙ ùùùÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýþþþÿÿÿüüüîîîúúúççç  üüüûûûÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüüüúúúüüüøøøùùù ûûûîîîûûû úúúóóóöööüüüÿÿÿôôôþþþþþþÿÿÿÿÿÿýýýÿÿÿþþþýýýÿÿÿÿÿÿþþþþþþþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüöööúúúùùùúúúüüüúúúÿÿÿþþþÿÿÿüüüýýýþþþþþþüüüýýýÿÿÿÿÿÿýýýþþþûûûüüüçççûûû ñññþþþýýýÿÿÿùùùÿÿÿ000üüüýýýúúúêêê÷÷÷þþþõõõúúúÿÿÿýýýþþþúúúþþþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿùùùþþþ õõõöööûûûüüü###DDDõõõäääñññúúúãããÿÿÿÿÿÿþþþüüüýýýýýýýýýüüüÿÿÿ ïïïìììõõõüüüôôôúúúûûû úúúÿÿÿÿÿÿÿÿÿþþþÿÿÿûûûøøø öööüüü þþþÿÿÿááá"""øøøüüüøøøöööäääûûûùùù ýýýýýýþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿûûûÿÿÿÿÿÿþþþÿÿÿúúúþþþÿÿÿþþþüüüüüüþþþþþþþþþÿÿÿÿÿÿþþþÿÿÿüüüýýýþþþüüüöööüüüùùùûûûþþþÿÿÿþþþýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýýýýýýýùùùòòòóóóóóóööööööúúúþþþ666þþþõõõöööýýýýýýùùùüüüÿÿÿýýýÿÿÿÿÿÿýýýÿÿÿþþþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿüüüÿÿÿùùù ìììùùù èèè÷÷÷þþþ üüüôôôþþþüüüþþþÿÿÿþþþÿÿÿýýý ééé üüüêêê###ùùùøøøúúú ýýýÿÿÿñññÿÿÿÿÿÿþþþûûûûûûiŒ• IDAT öööÿÿÿõõõóóóÿÿÿüüüìììÿÿÿúúúïïïÚÚÚ/// ýýýÿÿÿþþþÿÿÿÿÿÿþþþýýýýýýÿÿÿüüüýýýýýýÿÿÿþþþþþþúúúÿÿÿÿÿÿÿÿÿþþþüüüüüüÿÿÿÿÿÿþþþþþþÿÿÿþþþúúúüüüûûûüüüûûûýýýüüüþþþÿÿÿýýýþþþþþþýýýþþþüüüûûû øøø ÿÿÿÿÿÿýýý üüüýýýýýýýýýýýý÷÷÷üüüôôôôôôÿÿÿûûûÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿþþþüüüÿÿÿþþþþþþÿÿÿýýýþþþúúú àààëëë!!!éééëëëììì öööýýýýýýåååüüüüüüüüüÿÿÿÿÿÿþþþýýýööööööøøø ûûûõõõêêêûûûøøø þþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýúúúüüüöööñññüüüøøøôôôýýý!!!ñññõõõÿÿÿþþþìììôôôòòòðððýýýþþþýýýýýýýýýÿÿÿýýýúúúÿÿÿþþþûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþþþþüüüüüüÿÿÿþþþþþþþþþýýýÿÿÿýýýýýýÿÿÿþþþúúúþþþÿÿÿþþþúúúÿÿÿùùùýýýùùùüüüýýýüüüþþþýýýþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿüüüýýýþþþÿÿÿÿÿÿùùùööö ùùùïïï ÿÿÿûûûÿÿÿýýýíííùùù  âââííí íííüüü÷÷÷ÿÿÿüüüþþþþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüýýýÿÿÿüüüýýý üüüööö ññññññýýýüüüõõõóóóõõõôôô þþþþþþÿÿÿûûûüüüûûûÿÿÿüüüûûû ÿÿÿúúúþþþîîîúúúúúúööö ûûûüüüþþþüüüÿÿÿûûûÿÿÿ÷÷÷òòò ýýýðððýýýëëë îîîùùùòòò  ðððêêêóóóôôôþþþÿÿÿýýýýýýÿÿÿþþþýýýúúúþþþûûûÿÿÿýýýÿÿÿþþþÿÿÿýýýýýýþþþÿÿÿÿÿÿþþþþþþýýýÿÿÿþþþÿÿÿüüüþþþüüüýýýþþþþþþþþþþþþýýýûûûþþþÿÿÿýýýüüüþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþúúúÿÿÿûûûüüüÿÿÿðððþþþüüüøøø ãããúúú ÿÿÿþþþÿÿÿÿÿÿÿÿÿ111øøø ôôôÞÞÞüüü ààà ìììÿÿÿýýýýýýòòò ýýý ÷÷÷ÿÿÿýýýüüü ÿÿÿëëëúúúùùùþþþúúúýýýýýýþþþüüüþþþüüüùùùûûûóóóúúú îîî÷÷÷ÿÿÿ ýýýýýýýýýÿÿÿýýýþþþöööýýýùùùïïïýýýííí÷÷÷ùùùùùùûûûýýýþþþûûûûûûúúúÿÿÿþþþýýýÿÿÿÿÿÿþþþ ÿÿÿ÷÷÷ûûû ýýýýýýùùùùùùûûûûûûþþþÿÿÿ÷÷÷üüüïïïöööþþþ þþþüüüÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿþþþþþþûûû ûûûùùùçççüüüýýýúúúûûûúúúòòòÿÿÿ ûûû úúúûûûþþþûûûýýýùùùùùù ûûûûûûþþþÿÿÿþþþÿÿÿþþþþþþ ÿÿÿþþþüüüüüüÿÿÿþþþúúúüüüþþþûûûøøøýýýûûûîîîèèèÝÝÝééé÷÷÷óóóüüüþþþþþþ444þþþ  ýýý øøøûûûöööþþþúúúÿÿÿüüüüüüþþþñññ óóóúúúýýý ûûûüüüþþþ ÷÷÷ñññ÷÷÷ ýýý ÿÿÿþþþÿÿÿþþþþþþÿÿÿýýýÿÿÿüüü úúúÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿ ÿÿÿøøøúúúÿÿÿ ÷÷÷þþþ÷÷÷ òòòùùùÿÿÿþþþúúúûûûüüüûûûûûûþþþÿÿÿÿÿÿýýýÿÿÿûûûüüüÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿýýýýýýþþþýýýÿÿÿÿÿÿþþþþþþÿÿÿ ÿÿÿýýýþþþþþþøøøÿÿÿ öööðððùùù øøøýýýúúúþþþýýýÿÿÿþþþýýýýýýýýýýýýÿÿÿþþþÿÿÿÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿýýýýýýþþþûûûúúúíííýýý!!!óóóùùùÿÿÿùùùõõõ õõõþþþûûûýýýûûûÿÿÿÿÿÿûûûäääùùùõõõööö þþþýýýþþþ øøøüüüôôôððð þþþÿÿÿüüüýýýûûûûûûþþþþþþ÷÷÷ûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþùùùöööúúúþþþýýýþþþ üüüøøøóóóþþþüüüûûûúúúÿÿÿüüüüüüÿÿÿüüüøøøùùùÿÿÿþþþüüüÿÿÿúúúÿÿÿÿÿÿûûûþþþÿÿÿþþþþþþýýýþþþÿÿÿÿÿÿþþþÿÿÿûûûóóóøøøôôôüüüùùùñññýýýúúúþþþýýýýýýÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþüüüýýýýýýýýýþþþþþþüüüþþþýýýÿÿÿþþþüüüýýýþþþüüüÿÿÿÿÿÿìììððð !!! øøø÷÷÷õõõñññöööýýýüüüùùùùùùþþþùùùïïïüüüþþþöööýýýüüüÿÿÿþþþûûûúúúüüüÿÿÿúúúÿÿÿüüüûûûúúúöööóóóôôôýýýóóóýýýïïï÷÷÷ÿÿÿþþþÿÿÿÿÿÿÿÿÿõõõöööþþþüüüþþþþþþÿÿÿÿÿÿÿÿÿôôôûûûþþþûûû ÿÿÿ úúúúúúýýýûûûýýýúúúÿÿÿÿÿÿÿÿÿÿÿÿûûûýýýþþþÿÿÿþþþÿÿÿÿÿÿüüüþþþÿÿÿþþþÿÿÿÿÿÿýýýýýýþþþÿÿÿüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôþþþÿÿÿüüüýýýôôôûûûýýýÿÿÿûûûøøøýýýÿÿÿþþþÿÿÿüüüþþþûûûøøøþþþÿÿÿûûûþþþþþþÿÿÿÿÿÿþþþñññâââûûûöööúúúûûûÿÿÿÿÿÿûûûÿÿÿþþþüüüýýýþþþÿÿÿÿÿÿííí÷÷÷ÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿ÷÷÷ÿÿÿýýýöööïïïÿÿÿ ûûû÷÷÷ýýýøøøììì!!! óóóüüü ýýýþþþýýýýýýûûû ÿÿÿÿÿÿÿÿÿÿÿÿüüüùùùøøøüüüÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿôôôööö ööö ûûûüüüúúúúúúþþþþþþûûûüüüýýýüüüþþþýýýýýý÷÷÷÷÷÷ ûûûÿÿÿûûûýýýýýýùùùüüüüüüûûûÿÿÿþþþýýýþþþÿÿÿþþþûûûûûûýýýþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿûûûüüüýýýÿÿÿúúúùùù ýýýûûûôôô÷÷÷þþþûûûýýý ÿÿÿýýýÿÿÿ þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþýýýÿÿÿÿÿÿ áááøøø÷÷÷ æææíííþþþúúúÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿ æææýýý ùùùòòòþþþüüüþþþûûûøøøûûûüüü þþþ ýýý"""ûûûùùùýýý ùùùÿÿÿ ûûûüüüüüüÿÿÿÿÿÿúúúüüüýýýþþþÿÿÿóóóõõõ þþþúúúõõõ ïïïÿÿÿýýýþþþþþþüüüÿÿÿÿÿÿÿÿÿþþþýýýúúúþþþÿÿÿþþþþþþÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿýýýþþþúúúÿÿÿþþþúúúüüüÿÿÿÿÿÿúúúýýýýýýÿÿÿûûûõõõ ûûûïïï õõõýýýÿÿÿ þþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿÿÿÿýýýééé íííðððÿÿÿ öööüüüöööÿÿÿþþþþþþÿÿÿûûûüüüöööùùù ÷÷÷èèèÿÿÿÿÿÿôôôøøøþþþÿÿÿñññ ÿÿÿ úúúüüüôôôúúúøøøûûûýýýþþþÿÿÿþþþûûûýýýÿÿÿÿÿÿÿÿÿùùùÿÿÿÿÿÿüüüþþþÿÿÿùùùúúú ôôôøøøúúú ûûûýýýÿÿÿþþþÿÿÿþþþûûûúúúÿÿÿûûûÿÿÿÿÿÿÿÿÿþþþûûûÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþüüüüüüŠsÀ¬ IDATþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ öööóóóíííùùù ýýýþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿýýýþþþþþþýýýõõõÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþüüüÿÿÿùùùûûûêêêøøøöööîîîîîîõõõñññýýýýýýþþþþþþÿÿÿ õõõÿÿÿóóóýýýùùùïïïùùùþþþõõõïïïöööÿÿÿûûûýýýñññõõõþþþôôôàààúúú òòòíííÿÿÿúúúýýýþþþÿÿÿÿÿÿýýý÷÷÷÷÷÷üüüÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿüüüþþþñññðððõõõøøøøøøôôôýýýøøøöööúúúÿÿÿýýýþþþþþþÿÿÿúúú ýýý÷÷÷ÿÿÿûûûÿÿÿÿÿÿýýýÿÿÿúúúøøøþþþûûûüüüÿÿÿÿÿÿýýýýýýüüüýýýÿÿÿÿÿÿýýýüüüþþþüüüþþþþþþþþþýýýýýýþþþÿÿÿýýýþþþ öööùùù üüüùùù!!!ÿÿÿÿÿÿÿÿÿ úúúýýýüüüýýýþþþÿÿÿþþþÿÿÿÿÿÿýýýüüüüüüÿÿÿüüüùùùØØØüüüûûûóóóðððøøøþþþ ///ÿÿÿüüüúúúþþþ àààùùùóóóñññûûûÿÿÿüüüüüüÿÿÿéééøøøððð ïïïúúúñññ ûûû&&&ýýýçççöööüüüùùù ÿÿÿúúúúúúÿÿÿúúú÷÷÷ ÿÿÿúúúûûûÿÿÿÿÿÿÿÿÿûûûÿÿÿýýýÿÿÿýýýûûûüüü ýýý÷÷÷úúú ùùùüüüüüüùùùþþþþþþûûûøøøýýýýýýùùùþþþûûûûûûþþþÿÿÿÿÿÿýýýûûûùùù÷÷÷ÿÿÿûûûþþþõõõîîîÿÿÿþþþ÷÷÷ÿÿÿùùùÿÿÿøøøõõõõõõ ýýýçççõõõûûûüüüþþþýýýýýýüüüûûûÿÿÿÿÿÿþþþþþþÿÿÿûûûüüüþþþþþþÿÿÿÿÿÿÿÿÿýýýùùùýýýÿÿÿÿÿÿþþþúúúôôôýýý øøøüüüìììûûû!!!ûûûððð÷÷÷êêêäää øøøæææ ììì000ýýýþþþüüüüüüÓÓÓüüüöööûûûüüüÿÿÿùùùòòò÷÷÷ ùùùñññ ðððûûûùùùïïïÿÿÿþþþööö ùùùýýýÿÿÿþþþýýýûûûþþþ þþþÿÿÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùûûûõõõóóóÿÿÿÿÿÿûûûúúúþþþýýýýýýÿÿÿþþþþþþþþþüüüýýýþþþÿÿÿþþþýýýýýýúúúöööúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòò þþþúúú ùùùùùùøøøòòòòòòÿÿÿÿÿÿÿÿÿþþþýýýýýýüüüóóóþþþüüüþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþÿÿÿýýýÿÿÿýýýýýýüüüýýýýýýüüüþþþþþþÿÿÿÿÿÿÿÿÿüüüûûûþþþüüüûûû þþþ÷÷÷ÿÿÿ üüüýýýûûûûûûûûûýýý ÷÷÷)))øøøááá÷÷÷éééñññ þþþîîî111þþþÿÿÿþþþýýýùùùéééôôôéééüüüñññøøøñññ íííøøøþþþûûûðððóóóûûû ííí øøøüüüýýýûûûþþþõõõþþþ üüüÿÿÿþþþÿÿÿÿÿÿÿÿÿûûûôôôÿÿÿòòòþþþÿÿÿþþþýýýýýýýýýþþþÿÿÿÿÿÿþþþþþþÿÿÿüüüÿÿÿýýýþþþÿÿÿþþþÿÿÿÿÿÿüüüüüüÿÿÿþþþ üüüüüüþþþþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿ÷÷÷øøøüüüñññòòòðððìììüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ øøøúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþþýýýÿÿÿþþþÿÿÿþþþýýýþþþÿÿÿÿÿÿüüüüüüþþþüüüÿÿÿÿÿÿþþþþþþûûû øøøýýý÷÷÷ÿÿÿüüüúúúÿÿÿüüüøøø þþþìììÿÿÿóóóÑÑÑôôô 333ÿÿÿþþþãããþþþûûû'''ððð÷÷÷ùùùúúú öööüüüòòòæææ èèèùùùûûûòòòÿÿÿòòòýýýýýýýýýýýýþþþûûûúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿüüüùùùýýýüüüýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýý óóóúúúÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿþþþýýýþþþóóóàààïïïúúúùùùâââþþþþþþÿÿÿþþþÿÿÿýýýýýýýýý øøøÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýýýÿÿÿÿÿÿþþþüüüÿÿÿÿÿÿýýýýýýüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿþþþýýýýýýÿÿÿýýýýýýøøøûûûüüü ýýýùùù øøøòòòÛÛÛëëëûûûþþþøøøøøøÿÿÿÿÿÿöööëëëýýýûûû õõõúúúúúúôôôúúúæææöööñññóóóûûûüüüîîîöööïïï÷÷÷ûûûþþþþþþÿÿÿþþþóóó úúúùùùîîî ýýýÿÿÿÿÿÿÿÿÿúúúôôôäääöööþþþþþþÿÿÿüüüÿÿÿþþþÿÿÿÿÿÿþþþýýýþþþþþþ þþþùùùüüüùùùóóóóóóþþþþþþýýýþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿýýý þþþ÷÷÷ïïïûûû÷÷÷ ãããþþþéééáááýýýÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿþþþþþþúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþïïïýýý ñññýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþûûû÷÷÷ûûûõõõõõõþþþùùùéééýýý÷÷÷ïïïýýýùùù þþþáááðððþþþ éééÿÿÿþþþþþþþþþýýýéééíííFFFèèèóóóìììùùùþþþÿÿÿúúúùùù÷÷÷üüü øøøéééëëëïïïÿÿÿ ôôô ïïïöööþþþüüüþþþõõõ øøøúúúøøøôôôþþþÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ííí÷÷÷ïïïþþþûûûýýýÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüþþþþþþþþþÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿôôôòòòèèè+++ùùùâââûûûþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿûûûúúúüüüõõõöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿüüüúúúÿÿÿÿÿÿûûûùùù÷÷÷ÿÿÿ ùùù ÿÿÿüüü÷÷÷ÿÿÿÚÚÚ ýýý ööö***ééé âââóóóíííÿÿÿ<<<ÝÝÝèèèÿÿÿþþþõõõ111...ÿÿÿúúúööö÷÷÷ôôôååå üüüúúúêêêúúúôôôæææ÷÷÷ùùùþþþÿÿÿÿÿÿûûûúúúÿÿÿ ÿÿÿìììèèè÷÷÷ ýýýþþþÿÿÿþþþýýýûûûþþþþþþþþþþþþþþþþþþÿÿÿýýýìììöööøøøÿÿÿÿÿÿúúúÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿøøøüüüÿÿÿüüüüüüÿÿÿüüüþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿúúúóóóôôôòòòóóó000'''àààíííÿÿÿüüüÿÿÿÿÿÿúúúûûûýýýÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþýýýþþþýýýþþþÿÿÿþþþüüüúúúùùùùùùùùùñññ ûûûöööÿÿÿüüüúúúþþþÿÿÿÿÿÿ÷÷÷úúú ôôô ôôôãããíííüüüããã þþþèèè÷÷÷úúú///ÛÛÛ$$$666888þþþúúú òòòøøøõõõíííúúúëëëøøøÿÿÿùùùòòòêêê þþþëëëÿÿÿüüüïïï ---ÎÎÎöööøøø÷÷÷ ùùùþþþÿÿÿûûûþþþ þþþïïïööö ðððùùùüüüÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿõõõûûû þþþííí"""÷÷÷ýýýüüüýýýÿÿÿùùùýýýþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿýýýøøøÿÿÿþþþüüüúúúÿÿÿÿÿÿþþþþþþþþþýýýþþþÿÿÿ÷÷÷÷÷÷úúúõõõCCCÿÿÿíííêêêÿÿÿ***ùùùõõõÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿó® IDATüüüÿÿÿøøøýýý ûûûøøøþþþþþþÿÿÿÿÿÿüüüÿÿÿþþþÿÿÿýýýüüüûûûûûûúúúúúúûûûööö öööõõõÿÿÿÿÿÿùùùüüüÿÿÿÿÿÿñññýýýûûûùùùÿÿÿóóóöööøøøïïï+++éééÿÿÿüüüûûûàààùùùæææðððúúúûûû111üüüýýýþþþûûûúúúðððüüüÿÿÿýýýùùùûûûøøøþþþ÷÷÷ùùùûûûøøøöööæææÿÿÿ???ßßßøøøúúú ðððððð öööýýýùùùïïïááá###ôôôøøøòòòõõõòòò ýýýúúú÷÷÷ûûûýýý###ìììöööûûû ùùùþþþ þþþÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿþþþÿÿÿùùùøøøöööÿÿÿþþþýýýûûûñññøøøúúú ûûûüüüâââðððöööûûûýýýýýýÿÿÿÿÿÿþþþýýýÿÿÿùùùøøøôôôÿÿÿøøøüüüÿÿÿÿÿÿÿÿÿøøøüüüèèè""" ííí ûûûüüü þþþýýýÿÿÿÿÿÿýýýÿÿÿõõõÿÿÿ  ôôôþþþÿÿÿýýý ööööööûûûûûûûûûîîî þþþ <<<ÑÑÑñññëëëøøøþþþ÷÷÷âââùùù///þþþüüüþþþÿÿÿ þþþýýýüüüÿÿÿûûûûûûÿÿÿþþþýýý ÖÖÖèèèFFF äääöööûûûöööùùùöööþþþûûû þþþøøøùùùüüüÿÿÿùùùùùùþþþþþþûûûÿÿÿÿÿÿ÷÷÷öööúúúóóóþþþùùùÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýüüüþþþÿÿÿäääéééüüü ÜÜÜõõõ ÷÷÷ööö ÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿüüüùùùüüüüüüøøøÿÿÿüüüÿÿÿýýýþþþøøøýýý222êêêñññÿÿÿýýýýýýýýýùùùûûûýýýþþþýýýýýýþþþÿÿÿÿÿÿüüüööö÷÷÷ûûûöööûûûôôôùùùåååîîîùùùóóóûûûðððÿÿÿõõõÛÛÛ...111þþþÿÿÿþþþýýýþþþüüüþþþúúúýýý ÿÿÿîîîüüü ùùùüüüôôôýýýþþþýýýùùùúúú úúúÿÿÿøøø÷÷÷óóóÿÿÿ ùùùÿÿÿÿÿÿûûûÿÿÿ ÿÿÿêêêüüü üüüùùùÿÿÿýýýÿÿÿüüüþþþüüüüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿûûûýýýþþþþþþÿÿÿÿÿÿüüüüüü÷÷÷ÿÿÿûûûúúúýýý ûûûööößßßÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿüüüÿÿÿúúú ûûûùùùÿÿÿÿÿÿþþþÿÿÿýýýüüü ÓÓÓ óóó÷÷÷úúú øøøûûûÿÿÿýýýùùùúúúýýý ÿÿÿüüüÿÿÿþþþÿÿÿþþþýýýûûûôôôþþþþþþøøøýýýåååçççííí!!!ññññññ÷÷÷000ýýýüüüþþþÿÿÿÿÿÿøøøúúúþþþøøøûûûüüüðððííí///ÙÙÙöööëëëúúúÿÿÿòòò øøøÿÿÿÿÿÿÿÿÿ þþþþþþððððððôôôööö ÷÷÷óóóÿÿÿúúúýýýùùùííí ûûûúúúþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþþþþüüüÿÿÿÿÿÿÿÿÿþþþýýý úúúõõõ õõõ üüüúúúÿÿÿÿÿÿüüüýýýÿÿÿÿÿÿÿÿÿþþþýýýþþþþþþþþþúúúýýýúúúýýý þþþüüüüüüÿÿÿûûûÿÿÿüüüôôôûûûÞÞÞñññùùùÿÿÿþþþþþþþþþýýýþþþ ÿÿÿÿÿÿûûûþþþÿÿÿÿÿÿýýýûûûúúú ôôôòòòþþþóóóßßßôôô$$$óóóéééõõõ///þþþýýýýýýüüüýýýýýýüüüýýýþþþýýý÷÷÷üüüÿÿÿýýýòòò ýýýüüü÷÷÷ôôôêêêèèè÷÷÷þþþþþþÿÿÿþþþûûû÷÷÷ûûû÷÷÷ÿÿÿûûûôôôöööüüüûûûøøøýýýüüüúúúþþþÿÿÿþþþÿÿÿÿÿÿüüüÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÝÝÝçççëëëýýýþþþöööñññ ÿÿÿÿÿÿþþþÿÿÿýýýþþþúúúúúú÷÷÷÷÷÷øøøþþþùùùÿÿÿþþþÿÿÿüüüÿÿÿýýýòòòåååóóóüüü ýýýûûûýýýþþþþþþÿÿÿüüüüüüüüüÿÿÿÿÿÿþþþýýýþþþþþþùùùôôôûûû øøøûûû ûûûôôôúúúÿÿÿúúúþþþ çççûûûþþþööö÷÷÷÷÷÷ 222ýýýÿÿÿþþþþþþþþþþþþýýýÿÿÿÿÿÿûûûúúúðððúúúëëë òòòúúúýýýùùù þþþþþþüüüþþþþþþýýýúúúööö ýýýÿÿÿõõõøøøÿÿÿþþþüüüþþþøøøùùù÷÷÷ýýýþþþüüüÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþúúúýýýþþþÿÿÿýýýúúúýýýþþþððð ÿÿÿûûûôôôøøøýýýþþþúúúüüü ÿÿÿÿÿÿýýýüüüþþþüüüùùùúúúüüü ÿÿÿÿÿÿüüüÿÿÿ ñññÿÿÿþþþüüüÿÿÿÿÿÿÿÿÿþþþçççõõõ888ÙÙÙæææÿÿÿüüüýýýþþþÿÿÿþþþÿÿÿþþþýýýüüüþþþÿÿÿÿÿÿÿÿÿôôô üüüþþþ øøøöööûûûÿÿÿõõõýýý óóóúúúñññ 000þþþþþþþþþýýýÿÿÿÿÿÿÿÿÿýýýýýý öööîîî ôôô ôôôôôôûûûüüüúúúÿÿÿþþþýýýûûû ÿÿÿþþþùùùùùùýýýþþþ÷÷÷öööøøøþþþýýýûûû÷÷÷ ûûûÿÿÿýýýÿÿÿÿÿÿýýýýýýùùùþþþÿÿÿýýýþþþýýýÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüüüûûûüüüüüüÿÿÿûûûÿÿÿýýýúúúðððþþþîîî þþþïïï òòòôôô ùùùÿÿÿþþþþþþÿÿÿþþþüüüýýýþþþÿÿÿùùùüüü ïïïúúúÿÿÿúúúøøøÿÿÿÿÿÿóóóæææüüüöööúúúýýýüüüÿÿÿþþþÿÿÿþþþûûûþþþÿÿÿüüü ùùù÷÷÷üüü ÷÷÷ÿÿÿ÷÷÷üüüüüü ùùùîîîôôô ÝÝÝ÷÷÷&&&ûûûÿÿÿÿÿÿüüüûûûÿÿÿÿÿÿþþþþþþýýýýýýþþþÿÿÿöööûûûûûûúúúüüü ûûû÷÷÷ ÷÷÷îîîúúúÿÿÿ øøøÿÿÿ ûûûÿÿÿþþþüüüõõõöööþþþþþþ ùùùþþþøøøüüüõõõõõõþþþïïï÷÷÷ýýýôôôÿÿÿÿÿÿþþþþþþýýýÿÿÿþþþþþþþþþÿÿÿýýýýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþûûûùùùøøøúúúùùùÿÿÿýýýüüü üüüÿÿÿùùùíííïïïõõõåååþþþþþþýýýþþþÿÿÿþþþýýýýýýþþþþþþûûû ïïïòòò úúúòòòþþþøøøþþþþþþþþþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿðððöööþþþÿÿÿþþþüüüüüüÿÿÿüüüýýýýýýþþþÿÿÿÿÿÿýýýüüüüüüÿÿÿÿÿÿ÷÷÷óóó ûûûüüüÿÿÿõõõùùùððð ÿÿÿ øøøþþþ ýýýüüüåååýýý÷÷÷222õõõ!!!÷÷÷îîî øøøúúúøøøÿÿÿýýýÿÿÿ îîîÿÿÿ ÿÿÿýýýøøøôôôõõõÿÿÿüüüýýý ûûûþþþþþþöööÿÿÿ úúúþþþûûûööö ýýýýýýÿÿÿÿÿÿÿÿÿ÷÷÷ýýý ýýýïïï÷÷÷ñññ òòòúúúûûûúúúÿÿÿþþþÿÿÿùùùþþþõõõ  õõõÿÿÿÿÿÿüüüóóóõõõûûû ííí÷÷÷ ùùùðððððððððóóóûûû äääóóóöööïïïýýý îîîûûû üüüÿÿÿþþþùùùýýý ÷÷÷õõõúúúöööÚÚÚ###ûûûíííÿÿÿþþþ,,,ñññýýýúúúýýý ùùùòòòXç – IDATÿÿÿþþþÿÿÿúúú ùùùóóóíííùùù õõõùùùøøøøøøÿÿÿóóóýýýüüü...ùùùþþþÿÿÿûûûüüüúúúüüüõõõÿÿÿ ÿÿÿêêê...øøø þþþíííñññÿÿÿ ÿÿÿýýýÿÿÿÿÿÿÿÿÿ ýýýûûûþþþ÷÷÷þþþ ûûûÿÿÿþþþúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûúúúüüüüüüõõõøøøûûûýýý÷÷÷üüüÿÿÿÿÿÿþþþüüüþþþÿÿÿûûûÿÿÿþþþýýýýýýþþþ üüüüüüøøøáááëëë  ýýýðððûûû÷÷÷ýýýýýýîîîöööýýýüüüóóó ùùùûûûÿÿÿÿÿÿ þþþûûûüüüóóóûûûþþþþþþþþþÿÿÿ üüüþþþÿÿÿðððýýýççç ÝÝÝÿÿÿíííðððïïïöööõõõüüüôôô ÿÿÿþþþÿÿÿÿÿÿúúúþþþÿÿÿóóóýýýöööõõõ÷÷÷ööö ÿÿÿþþþüüüÿÿÿÿÿÿþþþþþþýýýýýýñññðððýýýýýýÿÿÿÿÿÿýýýúúúüüüûûûõõõùùù9‚Æ}...ûûûííí úúúôôôûûûÿÿÿ üüüÿÿÿýýýüüüýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüùùù÷÷÷þþþñññþþþïïïþþþýýýüüüþþþûûûýýýüüüûûûøøøþþþûûûüüüùùùÿÿÿëëëöööñññýýýûûû ÿÿÿ ýýýôôôýýý$$$ììì ÷÷÷÷÷÷üüü þþþþþþýýýýýýýýýïïï """èèèýýýÿÿÿûûûøøøýýýÿÿÿÿÿÿøøøççç333ïïïããã'''òòòúúúýýýúúú  ëëëúúúÿÿÿÿÿÿÿÿÿüüüýýýÿÿÿúúúôôô üüüöööýýýþþþþþþüüüÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ýýý÷÷÷ûûû÷÷÷ûûûÿÿÿþþþþþþÿÿÿÿÿÿþþþúúúüüüýýýúúúýýýõõõöööÿÿÿ îîîùùùøøø âââþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûýýýþþþöööÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýúúúúúú÷÷÷ÿÿÿþþþõõõûûûÿÿÿõõõöööùùùúúúÿÿÿÿÿÿÿÿÿÿÿÿþþþúúúúúú øøøýýý êêê õõõÐÐÐ...ôôô÷÷÷÷÷÷ïïïôôôñññöööåååõõõúúúöööóóóñññúúú÷÷÷ûûûüüüòòòúúúýýýãããúúúÿÿÿÿÿÿøøøöööýýýýýýÿÿÿóóóùùù ÿÿÿêêêøøøçççûûûöööììì!!!þþþøøøûûû øøøÿÿÿÿÿÿþþþýýýÿÿÿþþþüüüüüüúúúÿÿÿóóóûûûççç  ùùùõõõýýýþþþáááüüüýýýíííÿÿÿüüüÿÿÿóóóùùùýýýòòòðððþþþýýýñññ ûûûúúúÿÿÿ÷÷÷ÿÿÿÿÿÿþþþÿÿÿÿÿÿüüüÿÿÿýýýüüüÿÿÿÿÿÿþþþûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþûûûýýý÷÷÷ïïï óóóúúúÿÿÿùùùþþþûûûýýýþþþýýýýýýýýýýýýýýýðððÜÜÜêêê999)))óóóðððõõõ üüüæææòòòþþþûûûûûûúúúþþþèèè ìììâââÿÿÿûûûüüüþþþ÷÷÷üüüûûûíííúúúÿÿÿããã÷÷÷æææåååÿÿÿÝÝÝÖÖÖ###ÝÝÝÿÿÿþþþþþþýýýþþþýýýÿÿÿûûûøøøîîîùùù þþþüüüþþþþþþÿÿÿÿÿÿííí üüüõõõþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ éééõõõ íííîîîõõõ ëëë þþþýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿþþþÿÿÿ  øøø øøøÿÿÿÿÿÿÿÿÿþþþýýýþþþüüüýýýýýýóóóùùùûûû'''333çççþþþ ýýý÷÷÷ýýý öööñññüüüðððøøøýýýÿÿÿýýýûûûöööéééýýýûûûûûûÿÿÿüüüþþþöööûûû ÿÿÿ óóóçççõõõëëëïïï444ïïïæææîîî///äääÿÿÿ õõõñññÿÿÿÿÿÿÿÿÿþþþþþþûûûýýýÿÿÿÿÿÿþþþöööÿÿÿöööñññýýýýýýÿÿÿöööùùùþþþþþþþþþýýýþþþûûûçççøøøÿÿÿúúúÿÿÿÿÿÿþþþþþþÿÿÿüüüþþþÿÿÿýýý333øøø  øøøþþþùùùüüüÿÿÿÿÿÿýýýüüüýýýþþþüüüþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþùùù ùùùùùùýýýüüüÿÿÿþþþýýý÷÷÷ÿÿÿÿÿÿþþþÿÿÿüüüùùùþþþøøøþþþðððýýýõõõçççúúúúúúùùùòòòîîîóóóøøøúúúÿÿÿÿÿÿûûûþþþôôôúúúüüüøøøþþþýýýüüüÿÿÿüüü÷÷÷ùùùëëëþþþþþþýýýÿÿÿÿÿÿþþþôôôôôôûûûôôô"""ûûûïïïäääôôôþþþ777ñññóóóíííîîîëëëïïïÿÿÿÿÿÿÿÿÿÿÿÿüüüûûûþþþúúúýýýúúúóóóþþþ ýýý÷÷÷üüüýýýúúúýýýüüüýýý ìììúúúûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿúúúüüüøøø"""ÿÿÿöööúúúùùùþþþþþþÿÿÿÿÿÿýýýýýýúúúþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþ÷÷÷ûûûöööûûûÿÿÿúúúÿÿÿýýýÿÿÿùùùøøø ùùùûûûûûûüüüþþþýýýúúúùùùþþþùùùüüüýýý òòòýýýóóó÷÷÷úúúòòòîîîûûûþþþýýý÷÷÷ùùù *** øøøûûûþþþðððÿÿÿýýýúúúþþþûûûéééûûûõõõþþþÿÿÿ ðððûûûüüüôôôãããööö ððð)))òòòöööüüüúúúøøøÿÿÿúúúýýýÿÿÿþþþüüüûûûüüüùùùùùùëëë+++ôôôìììýýýõõõ þþþÿÿÿûûûÿÿÿøøøþþþþþþÿÿÿîîîááá(((øøøûûûþþþþþþÿÿÿÿÿÿÿÿÿûûûúúúþþþüüü333ööö öööóóóÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüýýýÿÿÿüüüýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷üüüüüüþþþÿÿÿÿÿÿûûûüüüôôôúúúþþþÿÿÿÿÿÿþþþøøø ýýýùùùþþþûûû÷÷÷îîîîîî ùùùúúúùùùüüüúúúüüüúúú øøøúúúûûûîîîëëë úúú ûûûúúú"""ùùùúúú###èèèÖÖÖþþþöööøøøþþþ ÿÿÿÿÿÿöööüüü þþþûûûûûûÿÿÿþþþüüüþþþùùù ÿÿÿýýýíííþþþýýýýýýüüüûûûþþþ óóóÿÿÿúúú ùùùùùùöööþþþýýýþþþýýýøøø ###éééððððððâââñññüüüûûû÷÷÷ôôôøøø÷÷÷ÿÿÿúúúûûûÿÿÿþþþÿÿÿùùùÿÿÿïïïûûûðððúúúñññ(((000õõõïïï ÿÿÿüüüêêêùùùãããýýýÿÿÿïïïúúú þþþüüüüüüüüüþþþüüüüüüûûûûûûþþþýýýýýý@@@ùùùúúúþþþÿÿÿûûûÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýÿÿÿþþþþþþýýýÿÿÿþþþþþþÿÿÿÿÿÿûûûýýýÿÿÿýýýÿÿÿÿÿÿüüüôôôýýýÿÿÿ òòòàààÿÿÿýýýþþþþþþûûûüüüúúúÿÿÿýýýúúú)))ýýýôôôòòòùùùôôôüüüýýýüüüòòòöööýýýøøøüüüüüüþþþññññññùùù ÿÿÿþþþþþþúúúþþþýýý üüüþþþþþþûûûùùùûûû ööö þþþ øøøúúú éééÿÿÿüüüùùùÿÿÿÿÿÿýýýÿÿÿþþþýýý ÷÷÷ûûûççç,,,ûYŒM IDATòòò)))ÌÌÌááá âââ íííëëë ÿÿÿëëëôôô ééé@@@ÏÏÏïïï ýýýöööûûûýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿ999øøøþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûúúúÿÿÿúúúûûûþþþööö&&&ðððèèè÷÷÷èèè üüüúúúþþþÿÿÿýýýýýýýýýûûûþþþþþþûûû ÷÷÷!!!éééïïïùùùðððþþþåååþþþúúú üüüþþþþþþþþþÿÿÿÿÿÿþþþþþþüüüýýýÿÿÿýýýûûûíííÿÿÿþþþùùùÿÿÿþþþÿÿÿûûûùùùþþþýýýòòòÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýýýýäää üüüéééðððÿÿÿñññüüüòòòöööýýýúúúüüüÿÿÿþþþÿÿÿÿÿÿþþþþþþýýýûûûõõõ çççéééÿÿÿæææ...áááõõõüüüñññÿÿÿöööøøø þþþðððóóóüüüìììÿÿÿýýý÷÷÷úúúþþþÿÿÿþþþÿÿÿþþþýýýþþþ'''ÿÿÿ ýýýõõõÿÿÿ ÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿ÷÷÷ÿÿÿúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿöööþþþþþþýýýçççóóó---ÓÓÓúúúüüüþþþÿÿÿ úúúüüüþþþýýýþþþùùù úúúóóóëëëùùùõõõ$$$æææûûû þþþúúúùùùÿÿÿýýýþþþýýýûûûÿÿÿþþþýýýøøøôôôïïï"""ùùùþþþþþþüüüýýýúúúûûûÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿûûûôôôÛÛÛõõõüüüôôô ýýýùùùýýýùùù úúúþþþÿÿÿþþþþþþýýýþþþüüüýýý ãããççç***þþþõõõöööÿÿÿÑÑÑïïïüüü ÷÷÷ûûû õõõùùù çççùùùûûûOOOíííüüüøøøôôôýýýûûûûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ+++ÿÿÿúúú ûûûýýýýýýÿÿÿþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿðððþþþúúúúúúûûûþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿþþþþþþþþþÿÿÿþþþ úúúüüüññññññûûûßßßÿÿÿþþþüüüÿÿÿùùùþþþÿÿÿùùùýýýþþþ ðððúúú÷÷÷ááá  çççúúú ðððöööíííùùù ýýýþþþûûûûûûòòòîîî÷÷÷þþþ÷÷÷ÿÿÿþþþÿÿÿîîî øøøÿÿÿ÷÷÷ýýýþþþýýýýýý ôôôìììûûûööö### ûûû÷÷÷îîîÿÿÿ ýýýÿÿÿûûûÿÿÿÿÿÿøøøööö(((óóóòòòùùùûûûîîîõõõïïïÿÿÿÿÿÿóóóççç###îîîJJJÙÙÙëëëýýýüüüÿÿÿýýýÿÿÿþþþÿÿÿÿÿÿ þþþóóóøøø ûûûûûûúúúýýýþþþÿÿÿþþþýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿÿÿÿûûûýýýþþþ ÷÷÷þþþÿÿÿýýýÿÿÿÿÿÿÿÿÿþþþüüüþþþýýý üüüýýý ÿÿÿØØØ*** úúúûûûóóóúúúûûûÿÿÿøøøôôôêêê ÷÷÷úúú###èèèñññ òòòäääþþþìììÿÿÿûûûþþþÿÿÿýýýþþþþþþÿÿÿÿÿÿ  ÿÿÿöööùùùûûûÿÿÿÿÿÿÿÿÿýýýõõõóóóýýýÿÿÿùùùüüüÿÿÿõõõ+++ÝÝÝùùù111óóóúúúöööñññôôô óóóöööùùùÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþ÷÷÷ûûû ØØØüüüõõõ444çççúúú÷÷÷ôôôûûûùùùûûûüüüááá íííØØØãããÿÿÿôôô÷÷÷òòòÿÿÿ þþþýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿúúú222üüüþþþüüüûûûþþþýýýüüüÿÿÿÿÿÿÿÿÿþþþüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿôôôÿÿÿ ýýýýýýûûûþþþþþþþþþÿÿÿÿÿÿÿÿÿþþþüüüüüüþþþþþþüüüþþþ øøøõõõ:::âââééé(((üüüþþþùùùýýýþþþÿÿÿ õõõüüüùùùÚÚÚûûûþþþ ÷÷÷üüüïïï öööüüüþþþþþþýýýýýýþþþÿÿÿÿÿÿþþþðððþþþìììüüüþþþþþþÿÿÿÿÿÿþþþûûûúúúûûûüüü÷÷÷ÿÿÿ üüüüüü ýýýùùùðððþþþ ìììùùù!!!êêêþþþöööÿÿÿÿÿÿÿÿÿüüüûûûþþþþþþÿÿÿþþþýýýüüüÿÿÿôôô þþþ úúúðððÿÿÿîîîæææ)))âââçççòòòüüüüüüøøø øøøððð!!!âââ$$$ýýýôôôöööùùùÿÿÿÿÿÿýýýÿÿÿþþþþþþüüüÿÿÿÿÿÿúúú%%% ûûûøøøþþþýýýýýýÿÿÿÿÿÿÿÿÿýýýüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿ÷÷÷íííýýý ùùùúúúýýýþþþþþþÿÿÿÿÿÿÿÿÿþþþýýýüüüùùùýýýÿÿÿýýýþþþ îîîóóóñññûûûóóóýýý ýýýôôôöööùùùÿÿÿýýýýýýýýýùùùûûû ûûûíííäää ÿÿÿõõõéééÜÜÜ éééáááýýýöööüüüþþþýýýÿÿÿýýýùùùóóó÷÷÷üüüÿÿÿþþþÿÿÿÿÿÿüüüúúúúúúþþþóóó ùùùûûû öööòòò ûûûäääüüüÙÙÙþþþþþþììì÷÷÷öööòòòûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþ  ñññþþþóóó ///èèèÐÐÐÿÿÿýýýîîîøøø ééé ýýýüüüóóóíííüüüýýýóóó555ÙÙÙôôôúúú ýýýýýýýýýÿÿÿþþþùùùûûûÿÿÿþþþ999ýýýýýýûûûýýýýýýýýýþþþüüüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüûûûûûûüüüþþþþþþÿÿÿýýýþþþþþþóóóêêêõõõ///;;;øøøáááüüüøøøüüüøøø ôôôûûû ÿÿÿþþþÿÿÿÿÿÿúúúóóó óóóýýýÿÿÿüüüþþþìììóóó ûûûÿÿÿùùùêêê üüüúúúóóóûûûúúúîîîðððîîîììì ...×××%%%÷÷÷ûûûàààññññññ ÿÿÿùùùüüüýýýþþþÿÿÿþþþþþþþþþ øøøøøøöööøøøûûûúúúîîîþþþ þþþôôôúúúñññôôôúúúýýý555üüüôôôðððþþþýýýþþþöööôôôøøøùùùúúúïïïÞÞÞWWW%%% ÷÷÷ùùùóóóÿÿÿ þþþôôô ÷÷÷ùùùúúú ÿÿÿøøøýýýííí þþþûûûïïï ûûûüüüÿÿÿûûûøøø äääòòòüüüïïïüüüûûû úúúúúúöööüüüÿÿÿ÷÷÷ôôô!!!óóóÿÿÿöööÿÿÿÿÿÿ666ÿÿÿýýýüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþùùù÷÷÷ ùùùÿÿÿÿÿÿþþþÿÿÿÿÿÿøøøûûûþþþÿÿÿ÷÷÷ úúú èèèþþþýýýÿÿÿþþþ þþþûûûÿÿÿýýýýýýÿÿÿýýýýýýþþþâââ ùùùúúú ûûûøøøûûûõõõöööÿÿÿúúúüüüúúú ýýýóóóÿÿÿ ÷÷÷ìììíííøøø???ûûûéééäääðððúúúòòòôôô üüüúúúýýý÷÷÷ÿÿÿóóóñññüüüþþþþþþüüüþþþÿÿÿúúúôôô øøøèèèûûûúúúèèèóóó ýýýôôôúúúðððûûû ïïï öööùùùÿÿÿûûûøøøûûûÿÿÿ ùùùùùùõõõÿÿÿ óóóþþþôôôþþþ÷÷÷ ûûûúúúýýýýýýûûûÿÿÿöööõõõúúú ûûûþþþùùùþþþüüüöööýýý÷÷÷ýýýùùùüüü áááùùù***ÿÿÿþþþüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýûûûõõõüüüüüüøøøúúúÿÿÿþþþ üüüöööÛÛÛÿÿÿ$$$üüüþþþÿÿÿüüüÿÿÿüüüÿÿÿüüüÿÿÿýýýþþþþþþýýýÿÿÿüüü÷÷÷ ðððùùù ýýýþþþÿÿÿèèèüüüêêêöööééé999ÉÉÉ;;;ÍÍÍþþþððð ÿÿÿ ßßßüüüëëëøøøòòòÿÿÿÿÿÿýýýøøøûûûûûûüüüûûûüüüÿÿÿðððúúúâââôôôùùùþþþùùùþþþýýýúúú÷÷÷èèè÷÷÷ ÷÷÷ÿÿÿîîîÿÿÿ íííýýýûûûýýýþþþüüü÷÷÷ûûû þþþøøøûûûÿÿÿûûûúúúúúúþþþúúúùùùûûûÿÿÿôô0R0 IDATôïïïüüüõõõøøøüüüùùùòòòöööôôôïïïôôô ýýýûûûÿÿÿÿÿÿüüüõõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýùùùÿÿÿøøøúúúûûûùùùûûûýýýÿÿÿýýýùùùôôôþþþûûûýýýéééúúúüüüóóóÿÿÿ÷÷÷úúúþþþùùùÿÿÿþþþùùùÿÿÿöööÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýûûûüüüÿÿÿüüüþþþÿÿÿüüüþþþ ÿÿÿîîîüüü õõõ ÿÿÿóóó )))ããã ¹¹¹ êêêìììüüüñññ÷÷÷ÿÿÿóóóÿÿÿøøøÿÿÿÿÿÿÿÿÿüüüûûûûûû÷÷÷þþþÿÿÿéééæææ ûûûôôôùùùõõõõõõ úúúÿÿÿöööøøøïïïþþþðððøøøøøø÷÷÷êêêôôôýýýýýýùùùüüüþþþ úúúöööÿÿÿñññÿÿÿýýýùùùþþþ üüüôôôùùùñññ ùùùöööþþþþþþþþþñññüüü üüüûûûúúúöööúúúûûûððð øøøõõõ÷÷÷ôôôýýýþþþñññùùùþþþúúú555ÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþ÷÷÷õõõþþþþþþýýýúúúûûûýýýûûûûûû êêêôôô ÿÿÿðððýýýõõõþþþúúúýýýüüüýýýüüüÿÿÿþþþþþþÿÿÿüüüýýýúúúÿÿÿôôôøøø òòòúúúöööÿÿÿÿÿÿ÷÷÷üüüÿÿÿþþþþþþøøøùùù ëëëùùùåååÿÿÿÉÉÉüüüÂÂÂßßßGGGâââþþþûûû ûûûöööìììóóó úúúüüüÿÿÿÿÿÿüüüûûûüüüïïïðððþþþããã ÿÿÿýýýøøøùùùþþþÿÿÿýýýõõõýýýüüüöööÿÿÿùùù ÿÿÿóóó úúúüüüõõõòòòþþþ ÿÿÿüüü÷÷÷ üüüÿÿÿûûû÷÷÷üüüùùùþþþüüüÿÿÿþþþûûûüüü úúúóóóóóóóóóîîîõõõüüüðððûûûúúú ýýýðððÛÛÛýýýýýý+++þþþüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ øøøëëë÷÷÷÷÷÷üüüúúúýýýÿÿÿöööööö ÿÿÿûûûüüüîîîùùùûûûýýýüüüþþþ ýýýÿÿÿ÷÷÷þþþþþþþþþûûûýýýûûûýýýÿÿÿüüüýýýÿÿÿøøø÷÷÷üüü úúú÷÷÷ýýýýýýþþþ÷÷÷ ýýýþþþþþþ÷÷÷ùùùéééìììHHH­­­###óóóóóóûûûþþþøøø îîî(((üüüûûûþþþþþþýýýÿÿÿùùùúúúöööüüüýýýôôôýýýûûûýýýêêêÿÿÿøøøèèèööö ùùù÷÷÷úúúÿÿÿÿÿÿÿÿÿýýýÿÿÿüüüøøøüüü ùùùýýýýýýüüü üüüòòò ûûûúúúûûûùùùüüüõõõûûûúúúÿÿÿøøø ýýýùùùïïïûûûþþþþþþþþþýýý ýýýùùùýýýüüü ðððûûû öööôôôýýýúúúÿÿÿ ùùùùùùûûû úúúþþþÙÙÙ'''222þþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþþþþÿÿÿçççüüüìììõõõîîîòòòìììùùùúúúþþþÿÿÿûûû ûûûùùùùùùüüüýýýÿÿÿ ùùùøøøüüüõõõþþþüüüÿÿÿüüü úúúýýýþþþøøøýýý êêêøøø&&&ìììþþþúúúíííëëëçççñññíííùùùûûûîîîýýýýýý÷÷÷þþþþþþÿÿÿþþþÿÿÿÿÿÿþþþýýýóóóôôôúúú þþþúúúüüüÿÿÿÿÿÿÿÿÿÿÿÿõõõüüüùùùþþþþþþÿÿÿýýýúúúÿÿÿ ýýýùùùþþþõõõüüüÿÿÿüüüýýýÿÿÿûûûÿÿÿüüüüüüÿÿÿÿÿÿþþþþþþòòòòòò öööÿÿÿúúúùùù÷÷÷ÿÿÿþþþþþþ÷÷÷øøøõõõ þþþûûûûûû  ÷÷÷ðððøøøýýýÿÿÿüüüøøøúúúûûûüüüãããþþþ(((ÿÿÿûûûüüüJJJýýýûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿûûûøøøôôôùùùúúúþþþÿÿÿùùùöööúúú ---óóóýýý îîîõõõòòòõõõùùùüüüöööùùùþþþÿÿÿÿÿÿÿÿÿóóóÿÿÿþþþûûûýýýüüüüüüþþþýýý ôôôûûûüüüúúúñññ ööö÷÷÷÷÷÷ñññ///àààôôôöööàààëëëüüüìììûûûóóóððð÷÷÷ÿÿÿúúúùùùÿÿÿ þþþùùù÷÷÷þþþûûû ñññôôôûûûýýýûûûúúúûûûûûûÿÿÿüüüïïïøøøõõõ ñññ ÷÷÷óóó ñññ üüüóóó÷÷÷ÿÿÿôôôííí)))ÿÿÿòòòûûûûûûöööüüüùùùþþþøøø øøøúúúÿÿÿýýýþþþÿÿÿýýý þþþüüüöööúúúõõõ ôôôðððøøøüüü÷÷÷ûûûùùù!!!áááúúúæææ%%%ïïïóóóôôôôôôLLLæææûûûúúúýýýþþþýýýýýýýýýûûûþþþÿÿÿÿÿÿýýýþþþûûûýýý÷÷÷óóó ðððÿÿÿððð'''ÒÒÒ ÷÷÷üüüýýýÿÿÿøøø ïïïüüü þþþþþþÿÿÿüüüÿÿÿýýýÿÿÿþþþÿÿÿüüüÿÿÿýýýÿÿÿþþþôôô úúúþþþÿÿÿðððüüüùùùþþþþþþíííýýýùùùõõõìììòòòùùùòòòøøøìììHHHöööÚÚÚ!!!òòòïïï ûûû üüüþþþÿÿÿïïï íííÙÙÙ>>>îîîæææøøø úúúøøøþþþ ïïïòòòúúúþþþüüüöööýýýþþþýýý÷÷÷þþþúúú òòòöööûûû ÿÿÿùùùüüü ûûûúúúþþþ üüüýýý ÿÿÿüüüýýýýýýøøøýýýùùù öööôôôýýý ðððýýýúúúüüüøøøýýýõõõÿÿÿ òòòüüüùùùõõõúúú ýýýããã÷÷÷úúú???þþþööö úúúþþþþþþüüüÿÿÿþþþüüüÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúüüü ûûû÷÷÷þþþøøøðððûûûõõõïïïûûû üüüùùùýýýþþþýýýøøøõõõõõõïïï úúúüüüýýýþþþýýýüüüýýýýýýýýýÿÿÿÿÿÿÿÿÿþþþüüüüüüüüüÿÿÿ ýýýúúúÿÿÿÿÿÿööö õõõçççøøø  ûûûùùùôôôôôôßßßøøø èèèÿÿÿüüüýýýþþþùùùÿÿÿþþþüüüÿÿÿööö÷÷÷üüüôôôûûûÿÿÿüüüÿÿÿþþþÿÿÿüüüüüüýýýÿÿÿûûûýýý úúúúúúúúúûûûÿÿÿøøøÿÿÿ öööõõõþþþþþþÿÿÿþþþøøøòòòÿÿÿýýýþþþïïï úúúúúúÿÿÿööö õõõþþþÿÿÿþþþýýýþþþþþþøøøþþþþþþõõõÿÿÿþþþüüüþþþÿÿÿþþþ ÿÿÿêêêÿÿÿûûûûûûþþþýýýÿÿÿÿÿÿüüüÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿ èèèøøøñññÿÿÿ òòòóóóÿÿÿ ùùùüüüùùùýýýýýýþþþ þþþþþþþþþþþþüüüðððúúúùùùïïïýýýþþþûûûþþþûûûýýý ÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿþþþÿÿÿÿÿÿþþþ÷÷÷ýýýûûû!!!éééøøøíííöööïïïýýý îîîëëëììì ÿÿÿüüüüüüûûûýýýþþþúúúúúú ìììïïïýýýýýýüüüÿÿÿüüüþþþÿÿÿþþþÿÿÿýýýÿÿÿýýýþþþùùùþþþþþþþþþóóó øøøýýýñññÿÿÿþþþûûûÿÿÿÿÿÿþþþýýýüüüÿÿÿûûûÿÿÿþþþûûûüüüùùùõõõ üüüøøøüüüÿÿÿþþþüüüýýýûûûýýýþþþûûû ûûûûûûøøøýýýýýýüüüÿÿÿüüü÷÷÷üüüûûûÿÿÿìììýýýýýýúúúýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿûûûþþþÿÿÿÿÿÿýýý÷÷÷þþþðððþþþÛÛÛèèè ÿÿÿûûûÿÿÿýýýÿÿÿ ÿÿÿúúú÷÷÷ ÿÿÿøøø ýýýúúúüüüþþþþþþþþþÿÿÿþþþÿÿÿýýýÿÿÿýýýüüüúúúüüüÿÿÿþþþþþþÿÿÿúúúööö ùùùóóóûûû ÿÿÿ þþþííí÷÷÷åååçççúúúûûûýýýüüüþþþþþþþþþþþþþþþýýýëëëÿÿÿÿÿÿÿÿÿùùùýýýÿÿÿÿÿÿÿÿÿúúúûûûþþþýýý÷÷÷ýýýúúúÿÿÿÿÿÿ êêê öööþþþöööñññÿÿÿõõõþþþüüüÿÿÿÿÿÿûûûüüü ÷÷÷úúúöööúúú óóóûûûððð ìììþþþýýýÿÿÿÿÿÿûûûÿÿÿþþþýýýÿÿÿúúúõõõöV\ IDATÿÿÿýýýüüüþþþÿÿÿÿÿÿÿÿÿýýýþþþþþþÿÿÿþþþýýýÿÿÿÿÿÿøøøôôô÷÷÷üüüêêêõõõûûû ÿÿÿøøøûûû÷÷÷þþþûûûÿÿÿúúúöööÿÿÿ÷÷÷ ööö øøøïïïüüüüüüÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿûûûÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿûûû ëëëåååúúúûûûÿÿÿüüüÿÿÿíííüüüýýýðððúúúûûûýýýþþþýýýååå öööøøøÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿöööÿÿÿÿÿÿÿÿÿÿÿÿ ûûûûûûûûûýýýýýýýýý þþþÿÿÿ øøøøøøÿÿÿûûûúúúýýýùùùýýýõõõ ÿÿÿÿÿÿýýý÷÷÷üüü÷÷÷ ÷÷÷òòò ôôôþþþþþþþþþûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþýýýþþþùùùûûûùùùüüüÿÿÿÿÿÿþþþþþþüüüûûûýýýýýýööö555 üüüþþþùùùÿÿÿÿÿÿÿÿÿÿÿÿüüüûûûþþþþþþþþþÿÿÿüüüýýýùùùÿÿÿüüüÿÿÿüüüøøø %%%òòòêêê òòòðððÿÿÿýýýþþþüüüýýýüüüôôôþþþúúúþþþþþþüüüøøøøøø÷÷÷üüüüüüüüüÿÿÿýýýûûûýýýÿÿÿÿÿÿüüüýýýÿÿÿþþþÿÿÿÿÿÿøøøúúú ùùùùùùøøøøøøûûûûûû óóóóóóüüüÿÿÿýýýûûûöööüüü ûûûúúúøøøÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüûûûüüüøøøúúúúúúúúúýýýúúúóóóöööþþþøøøõõõøøøýýýúúúúúúþþþûûûþþþýýýûûûõõõÿÿÿ ûûûüüüøøøððð ñññõõõ ÿÿÿýýýþþþýýýøøøýýýúúúþþþÿÿÿþþþþþþýýýúúúöööúúúÿÿÿþþþÿÿÿþþþûûûÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿöööþþþ÷÷÷ööö÷÷÷øøøûûû öööúúúþþþÿÿÿþþþýýýûûûýýýÿÿÿöööýýýõõõòòòýýýûûûûûûüüüýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿýýýþþþúúúÿÿÿÿÿÿÿÿÿøøøúúúöööøøø÷÷÷üüüûûûûûûìììþþþôôôíííúúúþþþÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿüüüüüüûûûÿÿÿæææÿÿÿýýýÿÿÿþþþþþþÿÿÿýýýþþþùùù ùùùþþþÿÿÿÿÿÿúúúþþþÿÿÿîîîôôôøøøûûûýýýýýýþþþúúúûûûøøøÿÿÿ üüüóóóúúú ïïïêêêÿÿÿÿÿÿøøøýýýýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿ ÿÿÿúúúüüüÿÿÿþþþüüüþþþ÷÷÷ÿÿÿûûûùùùÿÿÿ ïïï ûûûúúúÚÚÚäääüüüåååÿÿÿûûûüüüúúúüüüûûûüüüþþþùùùúúúüüüøøø üüüýýýüüü÷÷÷ ýýýþþþÿÿÿýýýþþþýýý üüüüüüÿÿÿÿÿÿúúúþþþþþþýýýýýý éééðððöööòòòûûûõõõûûûÿÿÿÿÿÿ÷÷÷ýýýþþþ ýýýøøøúúúøøøüüüþþþýýýÿÿÿ ëëëüüü øøø ûûûûûûÿÿÿýýýýýýþþþþþþþþþûûûüüüøøøïïïÿÿÿøøøõõõýýýâââ ùùùøøø õõõ øøøüüüúúúýýýûûûûûûöööúúú÷÷÷ûûû ìììððð þþþüüüÿÿÿþþþýýýÿÿÿýýýÿÿÿÿÿÿùùùÿÿÿÿÿÿüüüþþþþþþôôôÿÿÿÿÿÿÿÿÿ:::ýýýýýýÿÿÿúúúûûûüüüûûûûûûùùùòòòõõõõõõ"""ûûû÷÷÷ýýý÷÷÷ÿÿÿýýýýýýÿÿÿÿÿÿþþþýýýýýýýýýþþþýýýüüüýýýððð úúúøøøööö ÿÿÿÿÿÿÿÿÿþþþ üüü óóó úúúùùùùùùæææïïï÷÷÷ööö üüüþþþýýýþþþýýýùùùýýýÿÿÿ ÿÿÿýýýþþþ æææöööõõõøøø ÿÿÿñññøøøýýýÿÿÿüüüÿÿÿüüüþþþ ýýýÿÿÿÿÿÿýýýþþþÿÿÿþþþýýýùùùýýýýýýùùùùùùûûûÿÿÿúúúöööøøøñññ ñññ öööêêê'''ôôô êêê ýýýßßß+++òòòöööÿÿÿüüüûûû ÿÿÿñññúúú ðððëëë ôôôûûûöööìììéééîîîôôôùùùðððüüüüüü ÿÿÿýýý þþþÿÿÿÿÿÿýýýÿÿÿüüüúúúÿÿÿÿÿÿþþþÿÿÿ222ÿÿÿþþþÿÿÿøøøýýý üüüüüüûûûééé öööþþþýýýüüüþþþýýýýýýÿÿÿþþþÿÿÿýýýþþþþþþôôôúúú ýýýýýýþþþýýýÿÿÿÿÿÿùùùÿÿÿüüüÿÿÿ õõõøøøìììøøøééé333îîîõõõêêêñññùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûû ôôôøøø úúúÿÿÿûûûþþþÿÿÿþþþÿÿÿýýýÿÿÿþþþÿÿÿþþþþþþÿÿÿøøøýýýþþþôôôôôôØØØöööäää ñññöööîîî÷÷÷ïïïàààôôôûûûûûûÿÿÿüüüÿÿÿÿÿÿõõõöööþþþþþþ ñññþþþõõõííí((( ãããäääøøøúúúùùù ûûûûûûÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýýÿÿÿÿÿÿ÷÷÷ýýý ÛÛÛùùù$$$ ááá÷÷÷ûûûÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþýýýýýýþþþúúúùùù ÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿýýýûûûûûûüüüõõõøøøÿÿÿòòòÞÞÞÝÝÝ"""íííÿÿÿþþþüüüþþþýýýÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿûûûûûûùùùþþþ ûûûõõõüüüÿÿÿúúú úúúýýýþþþÿÿÿþþþúúúÿÿÿýýýÿÿÿýýýüüüùùù888ïïïøøøûûû ÿÿÿýýýöööïïïøøøøøøñññ èèèöööüüüýýýõõõýýýþþþüüüÿÿÿüüüööö÷÷÷þþþ èèèøøøýýý÷÷÷ úúúùùùüüü 555æææøøøýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿþþþþþþÿÿÿþþþýýýüüüþþþþþþþþþÿÿÿüüüùùùúúúóóóçççééé÷÷÷ÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿþþþþþþÿÿÿýýýüüü úúúùùùþþþÿÿÿüüüþþþûûûÿÿÿ÷÷÷üüüøøøüüü üüü÷÷÷áááøøøÞÞÞÛÛÛ ùùùæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýøøøûûû ñññÿÿÿþþþÿÿÿüüüûûû ÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿüüüÿÿÿÿÿÿûûûýýýýýýþþþþþþýýý $$$õõõÙÙÙóóóùùùòòòùùùúúúøøøÿÿÿöööÿÿÿçççÿÿÿóóóùùùýýýüüüýýýúúúüüüýýýþþþùùùþþþÿÿÿíííòòòùùùüüü  åååýýýÝÝÝúúúôôôûûû÷÷÷ûûûõõõüüü÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþþþþþþÿÿÿþþþýýýþþþ666ÿÿÿüüüûûûüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü÷÷÷þþþÿÿÿãããÝÝÝÚÚÚôôôüüüúúúþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýüüüöööÿÿÿÿÿÿÿÿÿúúúÿÿÿûûûýýýýýýÿÿÿüüüÿÿÿ ðððìììöööíííëëëYYY ýýý÷÷÷òòòÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿõõõÿÿÿúúú ùùùùùù üüüÿÿÿÿÿÿÿÿÿûûûùùùþþþýýýýýýûûû ýýýÿÿÿúúúûûûüüüöööýýý ììì÷÷÷êêêöööÖÖÖúúú...ÚÚÚÿÿÿûûûýýýðððüüüüüüýýýòòòþþþþþþûûûÿÿÿüüüõõõýýý êêê ÷÷÷÷÷÷ùùùìììïïïøøøûûûôôôöööÿÿÿûûûøøøûûûøøøÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿ555ÿÿÿþþþüüüýýýþþþÿÿÿÿÿÿõõõûûû÷÷÷úúúëëë÷‘d IDAT ÿÿÿýýýùùùùùùþþþõõõÿÿÿÿÿÿüüüÿÿÿ÷÷÷þþþýýýÿÿÿýýýýýýüüüþþþýýý ûûûþþþþþþööööööììì,,,VVVÆÆÆááá øøøþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûúúúüüüûûûùùùýýýÿÿÿÿÿÿÿÿÿúúúüüüýýýÿÿÿþþþýýý ýýýýýýûûûúúú æææííí ùùùììì555øøø÷÷÷ñññòòò þþþúúúþþþúúú ÿÿÿÿÿÿýýýþþþÿÿÿþþþööö÷÷÷ ýýýôôôùùù÷÷÷ÿÿÿ"""øøøûûûòòòäääûûûÿÿÿúúúùùùüüüÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ000ÿÿÿÿÿÿÿÿÿÿÿÿþþþùùù ÷÷÷÷÷÷ïïïÿÿÿ&&&úúúëëëïïïúúúþþþþþþûûûüüüÿÿÿûûû ÿÿÿýýýþþþþþþÿÿÿÿÿÿüüüÿÿÿûûûüüüúúúþþþýýýøøøöööôôôùùùÿÿÿÖÖÖúúú óóóñññýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüùùùÿÿÿþþþøøøûûûúúúýýýÿÿÿüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüüüúúúÿÿÿûûû ýýýïïïøøø ùùùäääõõõ÷÷÷ôôôëëë õõõúúúýýýóóó÷÷÷ÿÿÿþþþÿÿÿþþþýýýþþþþþþýýýöööîîîñññ÷÷÷þþþòòòôôô ýýýùùùüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿþþþ9‚Æ}---ýýýþþþÿÿÿÿÿÿêêê'''îîî''',,,þþþíííÿÿÿÿÿÿúúúòòòððð ÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿùùùøøøþþþûûûøøøýýýþþþÿÿÿþþþÿÿÿøøøýýý ûûûýýýõõõñññÿÿÿ íííÿÿÿ///ßßßôôô ÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þþþýýýÿÿÿýýýúúúõõõ ôôôöööÿÿÿùùùÿÿÿ þþþÿÿÿþþþÿÿÿþþþÿÿÿüüüüüüýýýþþþüüü äääõõõëëë áááÿÿÿ ÿÿÿöööîîî ßßß ìììóóóûûûþþþüüüøøøýýýÿÿÿûûûüüüÿÿÿÿÿÿüüüþþþúúúýýýþþþþþþ&&&ìììûûûëëë êêêééé ûûûÿÿÿöööòòòóóóûûûúúúúúúþþþýýý ÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿþþþýýýÿÿÿýýý777÷÷÷ÿÿÿþþþþþþýýýûûûøøøòòò ùùùúúúÿÿÿÛÛÛçççâââ üüüúúúöööùùù óóóùùù$$$ôôôôôôüüüÿÿÿýýýøøøóóóñññüüü øøøûûûùùùøøøüüüûûûôôô óóóýýý ïïïÿÿÿÿÿÿüüüúúúþþþ÷÷÷þþþ þþþûûûôôôøøøîîîúúúþþþ÷÷÷üüüÿÿÿýýýýýýÿÿÿûûûýýýþþþýýýýýýýýýüüüýýýüüüøøøûûûþþþüüüûûûûûûòòòýýýÿÿÿþþþûûûÿÿÿÿÿÿþþþÿÿÿþþþþþþúúúõõõ ïïïìììèèèøøøÿÿÿæææ 888ããã üüüúúúüüüóóóûûû ÷÷÷ûûûþþþûûûûûûæææ èèèèèèñññøøø öööööö óóóþþþ þþþóóó ÷÷÷úúúýýýÿÿÿþþþüüüýýýþþþúúú÷÷÷ öööÿÿÿþþþüüüøøøüüüöööùùùýýý111ýýýÿÿÿôôôúúúûûûþþþþþþÿÿÿÿÿÿÿÿÿõõõ÷÷÷ ôôôäää üüüïïïêêêõõõÿÿÿñññùùùúúú üüüøøøýýý ÷÷÷ÿÿÿêêêóóóöööóóó ÿÿÿÿÿÿõõõýýýøøøþþþüüüûûûÿÿÿ ûûû ÿÿÿòòòöööòòòøøøôôôüüüúúú ôôôééé÷÷÷ýýýÿÿÿþþþþþþüüüüüüÿÿÿüüüÿÿÿþþþüüüýýýÿÿÿþþþþþþÿÿÿþþþÿÿÿúúúýýýúúúþþþþþþþþþÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿþþþþþþþþþûûûÿÿÿ÷÷÷üüü ###úúúþþþüüüþþþþþþüüüûûûÿÿÿÿÿÿÿÿÿýýýüüüýýýûûûùùùððð  þþþýýýõõõúúú üüüúúúýýýþþþýýýÿÿÿþþþÿÿÿôôôÿÿÿÿÿÿÿÿÿýýýööö÷÷÷ÿÿÿüüüõõõúúúýýýþþþüüüþþþ óóóýýýþþþÿÿÿÿÿÿÿÿÿýýýøøøþþþ)))ûûûóóóöööîîîñññççç ðððìììüüüùùùýýýÿÿÿþþþþþþüüüñññðððÿÿÿ ýýýöööþþþþþþöööÿÿÿÿÿÿÿÿÿüüüüüüÿÿÿñññýýýñññêêê ûûûþþþúúúûûûêêêòòòööö ôôôöööúúúÿÿÿþþþþþþõõõÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýüüüûûûþþþêêêùùùüüü ùùùîîîòòò üüüüüüÿÿÿÿÿÿþþþýýýüüüþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþþþþÿÿÿûûûýýýöööüüüþþþþþþÿÿÿùùùéééôôôíííÿÿÿúúúÿÿÿ ûûûûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþûûû éééììì ýýýüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ øøø÷÷÷òòòøøøûûûôôôÿÿÿ÷÷÷ÿÿÿþþþùùùþþþ üüüûûûýýýÿÿÿÿÿÿþþþÿÿÿüüüøøøíííÿÿÿ ñññóóóöööþþþöööøøøþþþ öööõõõöööûûûüüüýýýüüüþþþÿÿÿâââúúúþþþ ñññþþþüüüýýýþþþüüü úúú÷÷÷÷÷÷ýýýúúúÿÿÿ ììì øøøôôô ýýýÿÿÿ íííýýýîîîôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüüüýýýýýýÿÿÿÿÿÿöööþþþùùùþþþþþþþþþüüüýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿüüüÿÿÿúúúúúú ûûûóóóééé ÷÷÷þþþëëëýýýôôôûûû üüüþþþûûûööö üüüÿÿÿêêêâââéééúúúóóó ááá ÿÿÿ ïïïûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿòòòþþþ÷÷÷þþþôôô øøøûûûþþþ öööóóóÿÿÿ ýýýøøøýýýÿÿÿûûûÿÿÿÿÿÿôôôôôô üüüüüüýýýþþþþþþþþþøøøÿÿÿúúúíííþþþûûûøøøöööîîî  úúúçççòòò÷÷÷ýýýÿÿÿíííøøøúúú øøøÿÿÿ÷÷÷úúú÷÷÷þþþÿÿÿÿÿÿýýýüüüÿÿÿóóó÷÷÷ ÷÷÷úúúýýýúúúûûûöööèèèñññîîî ÿÿÿÿÿÿÿÿÿþþþýýýúúúþþþÿÿÿþþþÿÿÿûûûçççùùùùùùôôôÿÿÿùùùÿÿÿúúú þþþþþþüüüûûûýýýýýýÿÿÿÿÿÿÿÿÿ÷÷÷úúúõõõ þþþûûûýýýñññ  ûûûüüüÿÿÿþþþùùùýýýþþþÿÿÿüüüÿÿÿðððÿÿÿÿÿÿþþþüüüÿÿÿ ßßßóóóëëëýýýëëëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññüüü ûûûùùù âââôôôýýý÷÷÷ûûûøøøøøø ÿÿÿøøøùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿøøøþþþþþþüüüüüüûûûûûûüüüõõõöööÿÿÿøøøÿÿÿñññññññññøøøüüüïïï ìììöööüüüÿÿÿþþþýýýíííõõõ úúúíííýýýùùùÿÿÿøøøûûûýýýÿÿÿþþþùùùþþþþþþüüüÕÕÕïïïðððûûûþþþþþþýýýûûûûûûèèèþþþûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿüüüÿÿÿüüü!!!òòòüüüùùùýýýþþþÿÿÿ úúúûûûþþþÿÿÿýýýùùùüüü èèèöööúúúúúúðððøøøøøøööö ñññÿÿÿýýýýýýþþþýýýùùùõõõóóó õõõÝÝÝòòòôôôêêêúúú ÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ñññ÷÷÷'''øøøôôôúúúòòòíííóóóúúúóóó úúúÿÿÿþþþýýýþþþþþþýýýÿÿÿÿÿÿýýýÿÿÿ÷÷÷ ûûûúúú÷÷÷ úúúýýýýýýùùùöööööö ×××üüüòòòóóóíííùùùþþþÊ´UE IDATúúúÿÿÿ ýýýñññüüüúúú þþþüüüÿÿÿýýýýýýúúúÿÿÿüüüùùùÿÿÿûûûÖÖÖ ûûûëëë!!!ùùùýýýüüüüüüýýý@@@àààþþþíííëëëÿÿÿÿÿÿþþþýýýþþþÿÿÿþþþÿÿÿþþþÿÿÿüüüþþþúúúòòò÷÷÷þþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþùùùÿÿÿøøøûûû÷÷÷öööÿÿÿ òòòûûûûûûþþþþþþþþþõõõþþþÿÿÿ íííõõõÿÿÿñññóóó111ëëëêêêúúúÿÿÿüüüüüüÿÿÿþþþÿÿÿÿÿÿÿÿÿ üüüùùù  õõõéééøøøóóó÷÷÷ òòòñññýýýúúúúúúûûûÿÿÿýýýþþþþþþýýýùùùúúúøøø òòòùùùúúú ùùù óóó ###ÅÅÅ"""üüü üüüüüüþþþüüüöööÛÛÛôôôùùùüüüÿÿÿøøøÿÿÿùùùýýýöööúúúûûûÒÒÒþþþ ÚÚÚÿÿÿûûûþþþýýýüüüééé áááïïï ÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýüüüüüüÿÿÿþþþÿÿÿþþþÿÿÿûûûÿÿÿììì ôôôùùùÿÿÿþþþÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿýýýÿÿÿýýýÿÿÿÿÿÿÿÿÿ üüüÿÿÿýýýÿÿÿ ëëëüüüððð ùùùÿÿÿõõõûûûþþþøøø÷÷÷ ñññöööõõõ %%%×××ùùùõõõúúúùùùûûûþþþÿÿÿÿÿÿÿÿÿôôôûûûëëëíííííí ØØØõõõ***ØØØ ñññÿÿÿ üüüòòòýýý///ÿÿÿýýýÿÿÿýýýÿÿÿþþþþþþüüüýýýúúúÿÿÿ ÷÷÷ÿÿÿïïï þþþþþþÿÿÿúúúÿÿÿùùù ìììûûû÷÷÷îîîúúúùùù üüüýýýýýýûûûÿÿÿûûûùùùÿÿÿËËËóóóüüü ûûûñññûûû ùùùûûûöööüüüþþþ ðððÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþûûûþþþþþþ üüüõõõùùù ûûûòòòýýýýýýÿÿÿýýýüüüýýýþþþøøøþþþûûûþþþýýýÿÿÿÿÿÿÿÿÿþþþýýýûûûþþþõõõ ÷÷÷ üüüúúúëëëíííüüüÿÿÿýýýöööúúúþþþóóó õõõòòòþþþýýý úúúúúúüüüûûûúúúùùùúúúÿÿÿëëëÞÞÞôôô,,,ÿÿÿ÷÷÷þþþðððøøø ÿÿÿüüüûûûùùùþþþ ýýýöööêêêííí---õõõóóóÜÜÜïïï òòòðððùùù666ÿÿÿÿÿÿýýýÿÿÿþþþþþþúúú ííí÷÷÷ýýýççç òòò æææþþþýýýúúúýýýþþþöööýýýóóó éééòòòÿÿÿþþþþþþþþþ ýýýûûûúúúÿÿÿþþþüüüýýýþþþÿÿÿýýýòòòôôôñññßßß øøøöööÿÿÿüüüûûûøøøûûûøøøÿÿÿÿÿÿþþþýýýüüüüüüýýýüüüâââñññþþþÿÿÿýýýÿÿÿÿÿÿùùù÷÷÷ÿÿÿþþþüüüÿÿÿþþþÿÿÿþþþ þþþýýýýýýøøø úúúþþþûûûúúúþþþûûûúúúþþþûûûûûûûûûûûûúúúÿÿÿýýýûûûÿÿÿÿÿÿ øøøÿÿÿþþþ þþþÿÿÿ ÷÷÷þþþüüüþþþõõõÿÿÿûûûüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûüüüùùùôôôýýýèèèøøøøøøüüü ðððêêêôôôUUUòòòøøøÿÿÿþþþþþþýýýÿÿÿñññ ûûûüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýæææýýýòòòùùùïïïþþþõõõ þþþùùùÿÿÿûûûýýýùùù %%%÷÷÷äää ÷÷÷ ööööööùùùÿÿÿþþþþþþüüüùùùëëë ùùùÿÿÿõõõûûû þþþýýý÷÷÷úúúüüüüüüÿÿÿÿÿÿþþþþþþýýýþþþççç þþþøøø çççþþþüüüþþþÿÿÿúúúøøøúúú þþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿõõõûûûýýýùùùóóóóóó÷÷÷÷÷÷üüüúúúÿÿÿÿÿÿûûû ýýýôôô ÿÿÿþþþÿÿÿþþþÿÿÿþþþ âââ øøøáááààà222ìììëëë úúú øøøúúúüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýøøøþþþ þþþûûûüüüúúúÿÿÿ÷÷÷ñññùùù úúúöööýýýÿÿÿþþþüüüüüüþþþÿÿÿùùùýýýþþþÿÿÿÿÿÿþþþÿÿÿíííõõõ ØØØúúú ÇÇÇïïïúúú÷÷÷ÿÿÿäääýýýûûûýýýûûûþþþúúúþþþÿÿÿððð ççç ììì ãããóóóööö ÞÞÞôôô úúúþþþþþþúúú÷÷÷ùùùÿÿÿÿÿÿÿÿÿþþþýýýþþþþþþüüüþþþýýýÿÿÿ ðððüüüìììýýýÿÿÿÿÿÿôôôûûûýýýüüüÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿúúú÷÷÷øøøÿÿÿüüü ÿÿÿõõõïïïüüüÿÿÿñññøøøþþþþþþùùùüüüûûûúúúÿÿÿÿÿÿúúúÿÿÿõõõýýýüüüûûûøøøýýý÷÷÷  ôôôûûûüüüÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿõõõýýýóóóðððýýýÿÿÿüüüóóóþþþÿÿÿÁÁÁÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿùùùþþþýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿóóó úúúïïïæææîîîöööÿÿÿýýýùùù ùùùîîîüüüððð÷÷÷üüüùùù÷÷÷ þþþ÷÷÷øøøõõõþþþöööêêê ìììýýýèèèøøø þþþþþþûûûûûûþþþúúúýýýûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ÷÷÷úúúüüüúúúÿÿÿùùùõõõÿÿÿÿÿÿýýýüüüÿÿÿúúúýýýóóóùùùÿÿÿÿÿÿÿÿÿÿÿÿøøøüüüÌÌÌ!!!ùùùëëëùùù ÿÿÿÿÿÿÿÿÿõõõ÷÷÷öööøøøÿÿÿþþþûûûúúúÿÿÿÿÿÿòòò ÷÷÷üüüòòò èèèôôôÿÿÿ öööýýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿøøøííí øøøøøøùùùûûûùùùýýýûûûñññûûû õõõÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýý öööûûûöööñññ óóóæææéééþþþ æææþþþýýýÿÿÿùùùðððòòòüüüêêê ÿÿÿùùùÿÿÿúúúÿÿÿþþþþþþÿÿÿùùù ùùùééé(((öööáááííí ýýýÿÿÿþþþýýýùùùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿúúúýýýýýýûûûïïïïïïóóóÿÿÿÿÿÿþþþÿÿÿýýýýýýüüü"""÷÷÷õõõÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿëëëìììûûûýýýñññúúúüüüþþþþþþþþþýýýûûûúúúþþþÿÿÿþþþýýýÿÿÿþþþùùùûûûþþþòòòêêêùùù ùùù÷÷÷ ýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿýýýÿÿÿýýý÷÷÷ õõõüüüõõõüüüùùùììì555ûûûùùùùùùÿÿÿÿÿÿþþþÿÿÿ÷÷÷ûûûýýý ñññþþþóóó úúúúúúðððÿÿÿÿÿÿÿÿÿüüüþþþùùù ùùùöööèèè ïïïøøøúúúÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýóóóðððòòòàààùùùùùùøøøûûû÷÷÷ÿÿÿûûûþþþÿÿÿûûûüüüûûûþþþýýýÿÿÿøøø ùùùùùù øøøóóóñññûûûÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýþþþÿÿÿýýýþþþ öööòòòýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ õõõõõõüüüûûûüüüäää<<<éééñññ÷÷÷ÿÿÿýýýþþþûûûüüüÿÿÿþþþþþþôôô õõõþþþþþþ ÿÿÿþþþþþþýýýüüüûûûýýýùùùöööþþþõõõ÷÷÷ûûûþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüüüü÷÷÷ ûûûøøø üüüýýýþþþ÷÷÷ñññýýýùùù444ÿÿÿýýýþþþýýýÿÿÿþþþþþþþþþ ÛÛÛüüü+++ÿÿÿúúúÿÿÿþþþììì÷÷÷þþþùùùþþþÿÿÿüüüìììøøøííí þþþÿÿÿ~6× IDATÞÞÞûûûôôôýýýüüü ÿÿÿóóó"""ÿÿÿïïïþþþÿÿÿ üüüøøøÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþÿÿÿóóóóóóèèèîîîôôôòòòöööÿÿÿÿÿÿüüüýýýÿÿÿÿÿÿýýýüüü üüüïïïòòòþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿçççõõõììì...çççáááÿÿÿóóóÿÿÿýýýüüü õõõýýýóóóëëëóóóóóóþþþýýýüüüýýýýýýýýýüüüþþþûûû óóóýýýýýýöööóóóþþþøøøÿÿÿüüüþþþþþþÿÿÿÿÿÿÿÿÿüüüüüüúúúÿÿÿÿÿÿúúúþþþûûûüüüüüüþþþýýý úúú444ÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþþÿÿÿÿÿÿÿÿÿüüüûûûüüü ôôôûûûÿÿÿýýýÿÿÿþþþÿÿÿþþþúúúõõõýýýÿÿÿöööøøøþþþ÷÷÷ýýýýýýþþþùùùûûûÿÿÿ÷÷÷øøøÿÿÿ õõõüüüéééüüüûûû ððð ûûûôôôüüüÿÿÿþþþÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿûûûóóóèèèüüü ýýýûûûÿÿÿâââøøøüüüýýýýýý ýýýüüüþþþþþþþþþþþþúúúöööúúúööö÷÷÷úúúúúúóóó÷÷÷òòòüüüäääôôôýýý333úúúîîî ìììõõõýýýÿÿÿúúúîîîòòòþþþõõõööö///óóóþþþùùùÿÿÿýýý üüüÿÿÿ ÿÿÿñññþþþÿÿÿüüü üüüÿÿÿýýýúúúùùùóóóýýýöööíííûûû ÿÿÿýýýüüüûûûúúúþþþûûûÿÿÿüüü444ÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿþþþýýýýýýüüüÿÿÿþþþÿÿÿòòòýýýýýýÿÿÿíííýýýøøøÿÿÿüüüþþþÿÿÿÿÿÿýýýÿÿÿùùùúúúïïïôôôÿÿÿøøøýýýøøøúúú úúúÿÿÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûüüüýýýæææððð úúúäääêêêõõõùùùþþþççç ùùùùùùüüüûûûûûûþþþüüüýýýÿÿÿþþþûûûùùùýýý ÿÿÿþþþêêê ÿÿÿýýýýýýùùù óóóÿÿÿ þþþ111)))***þþþçççÿÿÿÿÿÿþþþ úúú ðððÿÿÿûûûúúúöööüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþúúúþþþýýýÿÿÿÿÿÿúúúÿÿÿ þþþýýýÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþõõõ 000ëëëßßß úúúþþþûûûùùù úúúþþþÿÿÿûûûýýýþþþÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿÿÿÿþþþüüüüüüúúúûûûýýýÿÿÿþþþ ööö þþþÿÿÿþþþûûûÿÿÿþþþÿÿÿýýýÿÿÿûûûñññúúúííí ùùùùùùðððüüüýýý÷÷÷ÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿýýýõõõñññãããÿÿÿ ÊÊÊ///åååááá øøøþþþ ýýýöööþþþþþþþþþþþþýýýþþþþþþÿÿÿõõõþþþùùù ÷÷÷þþþúúúÿÿÿööö ðððôôô ùùùÈÈÈÚÚÚööö ÷÷÷þþþþþþÿÿÿþþþòòòýýý îîîøøøêêêþþþøøøùùù÷÷÷ÿÿÿ þþþÿÿÿüüüÿÿÿúúúúúú üüü÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿûûûøøø×××üüüøøøÿÿÿúúúøøøÿÿÿþþþÿÿÿþþþ444þþþþþþÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿþþþÿÿÿþþþûûûûûûþþþüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúøøøÿÿÿþþþúúúøøøúúúýýýÿÿÿõõõýýýýýýúúúþþþ÷÷÷ ûûûøøøøøøÿÿÿýýýûûûÿÿÿÿÿÿÿÿÿýýýùùùýýýøøøñññõõõòòò!!! ììì222èèèìììøøø÷÷÷ úúúÿÿÿÿÿÿýýýþþþþþþòòòþþþûûû÷÷÷ ùùùöööååå!!!îîîùùùüüüñññòòò ÷÷÷ ¿¿¿÷÷÷ñññûûû÷÷÷ÿÿÿýýýúúúùùùöööüüüðððøøøÿÿÿþþþüüüÿÿÿ ÿÿÿûûûüüüùùùÿÿÿöööÿÿÿþþþÿÿÿÿÿÿýýýýýýûûûÿÿÿÿÿÿÿÿÿùùù øøøêêêÿÿÿÿÿÿòòòúúúüüüöööÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýþþþùùùþþþÿÿÿþþþÿÿÿþþþûûûýýýÿÿÿþþþþþþþþþÿÿÿûûûùùùÿÿÿýýýþþþùùùüüüüüüÿÿÿöööýýýÿÿÿþþþþþþüüüóóóýýý òòòýýýüüüôôôôôô ÿÿÿøøøùùùüüüýýýþþþôôôÿÿÿÿÿÿÿÿÿùùùÿÿÿþþþ;;;ÍÍÍ÷÷÷ÜÜÜ ÔÔÔôôôùùù ýýýùùùòòò ÷÷÷ýýýÿÿÿþþþþþþþþþýýýþþþýýý÷÷÷÷÷÷ûûûøøøûûûýýý óóóþþþýýýÝÝÝöööìììôôô000ïïïúúúüüüüüüÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿýýýñññôôôþþþ---ööö øøøýýýûûûÿÿÿþþþýýýüüüÿÿÿÿÿÿüüüþþþþþþþþþøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿêêêùùù îîîîîî???ëëëúúúüüüÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿÿÿÿ333þþþÿÿÿýýýýýýúúúþþþýýýüüüþþþÿÿÿÿÿÿóóóþþþýýýþþþÿÿÿþþþýýýþþþÿÿÿýýý ûûûþþþúúúüüüþþþüüüþþþþþþýýýüüü ýýýðððôôôùùù üüü÷÷÷úúúÿÿÿÿÿÿÿÿÿóóó üüüæææ÷÷÷õõõ éééóóó'''÷÷÷ûûûÑÑÑöööÿÿÿíííöööùùùÿÿÿüüüûûûüüüúúúýýýþþþÿÿÿýýýøøøþþþþþþïïïíííùùùúúúððð òòòûûû õõõááá%%%ÍÍÍüüüóóó üüüûûûÿÿÿ öööóóóûûûæææüüü$$$'''øøøõõõöööòòòúúúÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüþþþüüüÿÿÿýýýúúúþþþùùùûûûõõõ ))) ðððúúúûûûøøøþþþþþþþþþÿÿÿþþþÿÿÿþþþþþþþþþüüüûûûþþþþþþýýýýýýÿÿÿþþþÿÿÿýýýùùùÿÿÿýýýþþþøøøøøøûûûùùùüüüþþþøøøûûûûûûþþþÿÿÿüüü ÿÿÿýýýôôôüüü ûûûøøøÿÿÿ ðððûûûþþþûûûùùùþþþýýýÿÿÿÿÿÿþþþþþþýýýëëëùùùõõõþþþçççâââ÷÷÷ ûûûóóóøøø þþþøøøüüüþþþýýýþþþúúúóóó üüüùùùýýýöööÿÿÿóóóÿÿÿ õõõòòòïïïÿÿÿûûûüüüûûûÜÜÜûûûþþþÿÿÿþþþ ýýýÿÿÿ'''ýýýüüüþþþýýýþþþÿÿÿüüüüüüüüüúúúÿÿÿûûûûûûýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿííí÷÷÷###âââóóóààà üüüýýýûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþ333ÿÿÿþþþþþþþþþùùùþþþ ýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿþþþüüüþþþÿÿÿþþþüüüþþþ÷÷÷ þþþÿÿÿíííþþþøøøþþþùùùÿÿÿÿÿÿ ûûûùùùüüüöööýýýñññíííþþþåååóóóüüü úúúõõõýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿöööûûû ùùùíííýýýðððïïï+++öööÛÛÛûûû øøøÿÿÿúúúóóóúúúþþþ ýýýúúúûûûþþþÿÿÿþþþþþþÿÿÿþþþ÷÷÷ øøøõõõøøøóóó ûûûÿÿÿööö ýýýëëëîîîïïï+++ÞÞÞäää+++úúúçççðððþþþþþþýýýýýýðððùùùòòò îîîòòòþþþóóó÷÷÷ûûûüüüúúúýýýÿÿÿþþþþþþ ûûûùùùúúúüüüÿÿÿþþþúúúüüüÿÿÿÿÿÿÿÿÿ öööüüü ßßß,,,àààôôôûûûÿÿÿúúúþþþýýýþþþ444÷÷÷öööõõõýýýþþþ ðððõõõüüü üüüûûûÿÿÿúúúòòò ìììíííõõõþþþ÷÷÷õõõÿÿÿüüüýýýýýýþþþÿÿÿúúúÿÿÿ ÿÿÿúúúùùù üüüþþþÿÿÿïïï üüüýýýþþþõõõÿÿÿääääää <<< ñññýýýûûûÿÿÿ$gý› IDATüüüýýýýýýÿÿÿúúúüüüþþþ õõõôôô üüüÿÿÿ èèèäääïïïðððÍÍÍÿÿÿýýýýýýüüüííí ïïïïïïýýýîîî üüüùùùöööøøøñññóóóûûûõõõóóóùùùûûûîîîùùùãããîîî ööö$$$÷÷÷ýýýîîî÷÷÷óóóÿÿÿùùù÷÷÷ óóó ÿÿÿÿÿÿÝÝÝðððøøøýýýôôôûûûýýýþþþýýýýýýúúúÿÿÿÿÿÿýýýûûûÿÿÿþþþýýýüüü üüüýýýþþþüüüúúúþþþéééýýýþþþÿÿÿþþþÿÿÿÿÿÿûûûøøø444þþþüüü õõõýýýýýýóóó òòòýýýÿÿÿìììûûûüüüñññ ÷÷÷øøøôôôóóóïïïùùùýýýùùù üüüþþþüüüþþþþþþÿÿÿýýýýýýþþþÿÿÿüüüýýýÿÿÿøøøýýýþþþÿÿÿýýýöööùùùøøøøøøòòòúúú***éééðððþþþ ùùùÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿûûûôôôþþþõõõñññ þþþöööúúúþþþìììÿÿÿòòò(((áááîîîþþþïïï þþþûûûùùùúúúþþþüüüþþþÿÿÿÿÿÿ÷÷÷ööööööÝÝÝýýý))) áááééé÷÷÷æææñññ>>>íííéééñññûûû÷÷÷üüüýýýýýýüüüüüüÿÿÿþþþÿÿÿÿÿÿûûûÿÿÿñññöööòòò"""óóó ÷÷÷îîî üüüõõõüüüýýýÿÿÿýýýúúúüüüþþþÿÿÿþþþýýýþþþøøøþþþ þþþÿÿÿþþþþþþûûûÿÿÿÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿúúúñññ÷÷÷ÿÿÿûûû þþþùùùöööþþþ ýýýùùùúúúÿÿÿãããììì999úúúùùùûûû ÿÿÿüüüûûûùùùüüüüüüÿÿÿúúúûûûþþþýýýúúúþþþÿÿÿ  &&&...àààÿÿÿôôôñññ òòòÿÿÿÿÿÿþþþÿÿÿþþþõõõ÷÷÷óóóúúú ÿÿÿêêêìììøøøýýýûûûöööÿÿÿìììýýýøøø ñññúúúúúúñññøøøþþþýýýîîîùùùþþþùùùûûûòòòøøøæææûûûóóóñññ÷÷÷øøøøøø úúúôôôÿÿÿøøøýýýùùùúúúþþþÿÿÿÿÿÿÿÿÿþþþ ôôôûûûýýýöööøøø óóó þþþÿÿÿÿÿÿÿÿÿýýýûûûýýýÿÿÿþþþþþþÿÿÿûûûûûûþþþÿÿÿüüüýýýûûûÿÿÿþþþþþþÿÿÿÿÿÿüüüÿÿÿ444ûûûúúúøøø ÷÷÷þþþýýýøøøùùù öööùùùüüüúúúÝÝÝ ôôô ÛÛÛþþþûûûýýýþþþþþþÿÿÿþþþþþþÿÿÿÿÿÿüüüûûûþþþûûûþþþþþþÿÿÿáááôôôçççùùùÿÿÿþþþÿÿÿþþþýýýöööþþþÞÞÞüüüþþþýýýöööþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôÿÿÿÿÿÿ úúú öööùùùûûû÷÷÷ïïï âââ ûûû÷÷÷ýýýýýý øøøøøøúúúþþþýýýÿÿÿþþþýýýþþþþþþùùù###ìììãããûûû×××ýýý%%%íííñññøøøôôô þþþýýýýýýþþþÿÿÿûûûÿÿÿþþþ ðððôôôôôôûûûôôô÷÷÷ýýýþþþþþþþþþþþþýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿýýýúúúüüüþþþÿÿÿÿÿÿüüüüüüüüüÿÿÿþþþþþþÿÿÿÿÿÿûûû222ÿÿÿÿÿÿýýýÿÿÿûûûøøøüüüôôôþþþûûûþþþööö ÿÿÿòòòñññêêê ìììåååüüüõõõüüüøøø÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿøøøüüüýýýýýýûûûþþþÿÿÿÿÿÿøøøóóó###üüüúúúýýýþþþýýýúúúþþþõõõùùùúúúÿÿÿíííõõõ òòòöööùùùýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ôôôøøø ÷÷÷ðððøøø ûûûõõõ úúúüüüûûûõõõîîî øøøíííùùùøøøþþþþþþüüüüüüøøøõõõôôôûûûééé ùùùùùùüüüòòòððð úúúùùùþþþþþþÿÿÿýýýÿÿÿýýýýýýüüüöööÿÿÿûûûïïïüüüüüüõõõ öööððð ûûûýýýÿÿÿþþþþþþÿÿÿýýýÿÿÿþþþþþþüüüþþþÿÿÿþþþþþþýýýþþþþþþýýýüüüþþþþþþúúúýýýúúúþþþþþþÿÿÿýýýÿÿÿþþþþþþýýýÿÿÿ111ÿÿÿÿÿÿÿÿÿýýýûûûÿÿÿþþþúúúþþþþþþ þþþüüüîîîýýý ýýýúúúþþþÏÏÏ***þþþèèèìììùùùýýýüüüûûû þþþûûûÿÿÿ ùùùýýýÿÿÿÿÿÿÿÿÿ ðððÿÿÿ÷÷÷ÜÜÜüüüûûûÿÿÿýýý þþþ ûûûùùù ôôôõõõ ÿÿÿþþþùùùýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþ úúúôôôýýýùùù÷÷÷ôôô÷÷÷øøøûûûÿÿÿþþþýýý öööòòòÿÿÿûûûòòòöööööö üüüöööôôôóóóýýýúúúõõõæææðððþþþ&&&###÷÷÷øøøììì%%%üüüâââóóó ýýýþþþ þþþøøøýýýÿÿÿþþþúúúýýýöööÿÿÿùùùìììýýýúúúðððõõõ üüüþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýùùù ýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿúúúýýýûûûüüü ûûû ûûû ýýýøøøöööþþþôôô×××ôôôñññ###éééöööþþþ üüüúúúüüü ÿÿÿÿÿÿÿÿÿ þþþÿÿÿüüüõõõÑÑÑòòòõõõÿÿÿþþþöööúúúöööõõõ òòò÷÷÷ ýýýõõõüüüöööÿÿÿþþþÿÿÿþþþÿÿÿûûûüüü÷÷÷÷÷÷ÿÿÿ úúúôôôÿÿÿóóóüüüûûûþþþõõõúúúüüüìììööö ÿÿÿöööñññÿÿÿøøøüüü øøøýýýüüü &&&òòòÜÜÜøøøøøøüüüøøøöööîîî þþþýýý õõõ ýýýýýýýýýÿÿÿþþþýýý÷÷÷þþþììì úúú ÿÿÿûûûýýýöööÿÿÿýýýþþþÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿþþþþþþÿÿÿþþþÿÿÿýýýûûûýýýýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþþþþúúú000ÿÿÿÿÿÿþþþ ßßßÿÿÿýýý õõõýýýõõõûûûñññîîî 333000ÿÿÿøøøíííõõõùùùòòòøøøþþþþþþýýýÿÿÿÿÿÿþþþÿÿÿùùùÿÿÿúúúöööüüüüüüïïïîîîîîîùùùÿÿÿþþþþþþ øøø÷÷÷ úúúêêêúúú øøøõõõ÷÷÷ùùùÿÿÿþþþÿÿÿÿÿÿýýýýýýÿÿÿ úúúþþþñññ ôôôüüü ððð þþþóóóöööþþþ ÝÝÝøøøëëë ðððÿÿÿ þþþñññûûûøøøùùùÿÿÿííí üüüóóóÈÈÈÿÿÿîîîõõõêêêõõõæææ***ööö÷÷÷ûûûãããôôôþþþÿÿÿùùùÿÿÿþþþüüüüüüúúúóóó÷÷÷þþþûûû ûûû!!!ýýýÿÿÿÿÿÿüüüüüüþþþÿÿÿÿÿÿþþþÿÿÿýýýúúúúúúûûûüüüþþþþþþþþþûûûýýýÿÿÿúúúúúúÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿöööþþþ***ùùù ÷÷÷óóóýýýêêêççç îîî ûûû÷÷÷ýýýýýýóóó)))óóóòòòÓÓÓâââëëëþþþÿÿÿøøøÿÿÿûûûÿÿÿþþþÿÿÿüüüüüüÿÿÿþþþùùùýýýûûûþþþþþþûûû ðððùùùþþþýýýýýýûûûùùù÷÷÷üüüïïïááágggýýýìììûûûöööþþþÿÿÿûûûýýýûûû  ôôô øøøýýýûûûúúú ýýýïïïóóóíííúúúÜÜÜôôôâââ óóóùùùýýý öööôôôûûûÿÿÿûûûûûûöööþþþõõõûûû÷÷÷ëëë"""ïïïùùùúúúÝÝÝããã000ööö öööõõõøøø ñññÿÿÿýýýþþþÿÿÿÿÿÿüüüûûûøøøøøøüüü þþþûûûúúúêêêøøø ÿÿÿÕÕÕýýýúúúúúúýýýýýýýýýûûûüüüýýýüüüÿÿÿýýýûûûûûûþþþûûûþþþüüüúúúøøø÷÷÷ÿÿÿûûûüüüþþþýýýÿÿÿþþþÿÿÿýýýýýýÿÿÿþþþýýýüüüþþþóóó222þþþþþþþþþþþþýýýþþþöööþþþ ýýýùùùöööýýý üüüïïïüüüúúúÿÿÿ ôôôíííòòò þþþöööýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýþþþýýýþþþûûûüüüÿÿÿúúúýýýýýýñññôôôùùùþþþÿÿÿÿÿÿÿÿÿþþþ ýýýîîîõõõôôôþþþýýý ùùùõõõÿÿÿùùùõõ`‡{o IDATõ÷÷÷ ããã000 çççÞÞÞ111õõõ þþþòòòùùù ÿÿÿôôôÿÿÿüüüøøøñññøøøÿÿÿýýýøøø÷÷÷þþþÝÝÝ ÷÷÷ ýýýùùùöööøøøÿÿÿøøøÿÿÿþþþþþþøøøýýýþþþÿÿÿüüüþþþþþþÿÿÿÿÿÿÿÿÿúúúúúúîîîüüü÷÷÷üüüüüüüüüþþþþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿúúúýýýúúúÿÿÿýýýÿÿÿÿÿÿúúúýýýÿÿÿÿÿÿýýýýýýúúúüüü000ÿÿÿûûûÿÿÿùùù÷÷÷ôôôþþþ ûûû òòòüüüÿÿÿúúúüüüÿÿÿ öööøøøüüüúúúüüüÿÿÿþþþÿÿÿþþþÿÿÿþþþÿÿÿüüüþþþýýýÿÿÿüüüýýýýýýüüüÿÿÿýýýüüüÿÿÿüüüûûû îîîöööûûûþþþþþþþþþÿÿÿýýýýýýýýýÿÿÿùùùýýý üüüôôô þþþûûûýýýóóóøøøòòòôôô ôôôììì )))öööòòòúúúôôôííí ýýý÷÷÷ýýýøøø þþþùùùôôôÿÿÿûûû$$$ùùùÞÞÞööö  æææððð;;; òòòîîîîîîóóóýýý÷÷÷ÿÿÿþþþþþþüüüûûûÿÿÿûûûþþþúúú ûûûõõõüüü  üüüÿÿÿþþþþþþþþþûûûüüüÿÿÿÿÿÿýýýýýýÿÿÿ ýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýûûûøøøûûû)))ûûûþþþ ÿÿÿùùùûûûïïïýýýÿÿÿúúúùùùùùùøøøððð### æææ èèèøøøùùùýýýüüüÿÿÿÿÿÿýýýÿÿÿýýýýýýþþþþþþüüüÿÿÿûûûþþþÿÿÿüüüûûûÿÿÿýýýÿÿÿóóó ÷÷÷ùùùóóóÿÿÿÿÿÿþþþýýýüüüÿÿÿÿÿÿûûûùùùûûûþþþûûûýýýÿÿÿúúú ÿÿÿððð ÝÝÝ áááCCC444ÛÛÛîîîûûûýýýçççúúúûûûôôôþþþøøøûûûûûûüüüþþþþþþøøøøøø÷÷÷$$$øøøÝÝÝíííñññ õõõèèèÿÿÿýýýüüüÿÿÿþþþùùùÿÿÿþþþüüüûûû ùùùøøøÿÿÿúúúúúúÿÿÿþþþþþþþþþþþþÿÿÿúúúÿÿÿþþþüüüÿÿÿÿÿÿýýýúúúþþþúúúûûûþþþ÷÷÷ÿÿÿúúúûûûÿÿÿýýýþþþÿÿÿþþþûûû9‚Æ}---ûûûûûûþþþóóó ûûûööö öööííí ûûûááá ùùùüüüììì öööååå ÿÿÿýýýþþþúúúÿÿÿýýýÿÿÿÿÿÿþþþþþþÿÿÿýýýþþþûûûÿÿÿýýýýýýÿÿÿüüüþþþÿÿÿüüüýýýÿÿÿ÷÷÷þþþýýýþþþÿÿÿÿÿÿùùùüüüìììúúúùùùþþþûûûÿÿÿþþþùùùõõõÿÿÿìììóóó$$$õõõæææ àààõõõúúúñññúúúøøø ÿÿÿ þþþþþþúúú óóóèèè ùùùþþþøøøóóó ëëëúúúúúúõõõ öööüüüóóóùùù÷÷÷ÿÿÿÿÿÿûûûüüüýýýüüüúúúÿÿÿÿÿÿþþþÿÿÿ ýýýüüüöööüüü÷÷÷ùùùÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿ üüüüüüÿÿÿþþþþþþûûû þþþÿÿÿþþþüüüûûûÿÿÿþþþûûûÿÿÿþþþþþþÿÿÿþþþüüü444üüüùùùùùùüüüýýý úúúøøøöööäääûûû þþþ÷÷÷ ÷÷÷üüüñññ ýýýûûûûûûööö õõõÿÿÿÿÿÿýýýþþþþþþþþþÿÿÿþþþýýýÿÿÿýýýýýýÿÿÿýýýýýýÿÿÿ"""ùùùúúú úúúûûûÿÿÿÿÿÿþþþþþþÿÿÿþþþüüüúúúùùù ïïï'''úúúûûûþþþþþþûûûûûûúúúþþþýýýÞÞÞøøø;;;èèèôôôüüüóóóööö ÿÿÿ÷÷÷ýýýðððìììûûûúúúöööùùù ûûûéééùùùýýýøøøýýýúúúööö ÿÿÿúúúýýýÿÿÿþþþýýýýýýüüüþþþüüüþþþþþþûûûýýýÿÿÿüüüüüüþþþ ýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿþþþúúúÿÿÿùùùûûûùùùÿÿÿüüüùùùÿÿÿÿÿÿùùùüüüÿÿÿýýýýýýøøøûûûúúúüüü ÷÷÷úúúþþþøøøõõõ !!!òòòúúúòòòöööüüüþþþüüüÿÿÿ ñññ æææýýýþþþÿÿÿýýýÿÿÿýýýýýýúúúÿÿÿþþþÿÿÿýýýýýýýýýþþþÿÿÿþþþÿÿÿûûûÿÿÿþþþþþþþþþûûûýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿ çççìììþþþþþþþþþñññûûûíííòòòÝÝÝ;;;úúúåååßßß888ííí ñññïïïñññýýýþþþýýýÿÿÿùùùüüüíííòòò ôôôíííþþþöööòòò ôôôþþþôôôôôôùùùùùùýýý õõõðððÿÿÿþþþÿÿÿþþþüüüüüüýýýùùùÿÿÿþþþûûûÿÿÿúúúýýýþþþÿÿÿööööööþþþùùùýýýùùùýýýÿÿÿûûûûûûþþþÿÿÿÿÿÿüüüýýýûûûÿÿÿýýýÿÿÿþþþýýýÿÿÿþþþüüüÿÿÿþþþÿÿÿüüüûûû111öööôôôûûû þþþòòòýýýþþþ úúúõõõ÷÷÷(((þþþ"""þþþööö÷÷÷øøøýýýÿÿÿ ÷÷÷ñññ ôôôöööþþþûûûûûûýýýüüü÷÷÷üüüýýýþþþýýýýýýÿÿÿýýýúúúùùùüüüþþþþþþýýýýýýýýýþþþÿÿÿ åååûûûøøøÿÿÿÿÿÿþþþýýýôôôÿÿÿðððäää÷÷÷ûûûúúúýýýÿÿÿùùùööö ðððñññ ///ÿÿÿëëëæææîîîìììêêê  òòòøøø þþþüüüýýýßßßôôô000ôôôöööýýýüüü ûûûñññëëë õõõüüü÷÷÷íííôôôûûûüüü÷÷÷ úúúýýýüüüýýýÿÿÿÿÿÿþþþÿÿÿòòò üüüüüüÿÿÿ÷÷÷úúúýýýýýýÿÿÿÿÿÿýýýúúúýýýõõõÿÿÿûûû ýýýöööûûû ùùùùùù õõõõõõ ýýýýýýþþþûûûúúú÷÷÷"""÷÷÷÷÷÷úúúþþþüüüöööûûû ÔÔÔòòòýýýÿÿÿýýýøøøõõõ÷÷÷ ùùùðððþþþûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿøøøååå### ôôô þþþüüüÿÿÿüüüúúúþþþþþþÿÿÿöööøøø ýýýûûûþþþÿÿÿýýýüüüüüüÿÿÿýýýúúúúúúûûûûûûýýýäää  ùùùûûûûûûýýýýýý åååïïïýýý"""èèè555úúúäääôôô ýýýýýýýýýþþþüüüüüüþþþ îîî!!! ûûûäää ÙÙÙ ëëëôôô ýýýúúúñññôôôýýý ÿÿÿþþþüüüýýýÿÿÿûûûùùùÿÿÿ èèè ñññýýý ûûû ýýýûûûþþþþþþýýýýýýþþþþþþÿÿÿùùùýýýþþþÿÿÿúúúþþþÿÿÿÿÿÿýýýÿÿÿýýýúúúþþþøøøüüüÿÿÿþþþþþþúúú÷÷÷þþþúúúÿÿÿÿÿÿÿÿÿþþþüüüÿÿÿþþþÿÿÿÿÿÿÿÿÿ222ÿÿÿ ###òòòðððûûûÿÿÿýýýüüüýýýáááþþþùùùýýýüüüþþþýýýýýýÿÿÿþþþÿÿÿþþþýýý÷÷÷ùùùþþþ÷÷÷ ÷÷÷ûûûýýýþþþúúúôôôøøøüüü;;; ÿÿÿÿÿÿÿÿÿøøøûûûüüüôôôþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþ ýýý üüüÿÿÿûûûÿÿÿ÷÷÷ÿÿÿÿÿÿýýýýýýðððçççùùùéééïïïååå ÿÿÿýýýýýýûûûûûûýýýþþþýýýþþþÿÿÿÿÿÿÿÿÿøøøõõõñññûûûòòò ìììõõõöööøøøòòòøøøýýý ðððÿÿÿýýýüüüüüüýýýþþþþþþþþþþþþþþþþþþÿÿÿùùùÿÿÿÿÿÿùùù÷÷÷ÿÿÿ ûûûþþþúúúþþþýýýþþþÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþúúúøøøýýýþþþýýýûûûÿÿÿùùùøøøþþþþþþþþþÿÿÿÿÿÿþþþÿÿÿýýýýýýþþþþþþýýýýýýýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçççñññììì%%% òòò ììì÷÷÷þþþúúúýýý èèèêêêëëëÿÿÿÿÿÿýýýþþþþþþþþþÿÿÿþþþÿÿÿøøøÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþþþ ôôôþþþýýýþþþûûûýýýûûûÿÿÿýýýþþþ ÷÷÷øøøëëëþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿúúúùùùõõõ úúúúúúþþþúúúýýý øøøúúúúúúþþþ÷÷÷ÍÍÍûûûôôôùùùååå ýýýÿÿÿüüüÿÿÿýýýýýýÿÿÿüüüööLï9l IDATöÿÿÿ üüüèèèááá ôôôýýý øøøþþþ ýýýþþþÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿüüüüüüýýý üüüùùùÿÿÿýýýÿÿÿýýýþþþþþþþþþÿÿÿüüüûûûõõõùùùüüüþþþýýýúúú úúúüüüýýýýýýþþþþþþýýýþþþýýýþþþÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿüüüÿÿÿÿÿÿ öööÕÕÕïïïýýýûûûýýý óóóõõõôôôýýý þþþüüüûûûýýýûûûýýýÿÿÿúúúÿÿÿÿÿÿÿÿÿýýýñññõõõüüüøøøßßßôôôóóóþþþÿÿÿþþþÿÿÿúúúîîîüüüöööüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýóóóÿÿÿÿÿÿ÷÷÷ óóóüüüûûûÿÿÿûûûÿÿÿüüü ôôôêêêîîîïïïùùùúúú"""íííúúúþþþøøøþþþÿÿÿÿÿÿøøøùùùññññññôôôøøøùùù$$$ÑÑÑååå ÿÿÿóóóûûûûûûýýýþþþýýýþþþÿÿÿ üüüýýýÿÿÿþþþþþþ÷÷÷ýýýÿÿÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûþþþúúúÿÿÿûûûýýýÿÿÿóóóüüüõõõÿÿÿýýýýýýþþþþþþþþþÿÿÿþþþýýýýýýýýýþþþÿÿÿÿÿÿýýýÿÿÿñññ"""óóóæææ ïïïÿÿÿùùùûûûòòòóóó éééÿÿÿþþþÿÿÿþþþûûûüüüýýýÿÿÿÿÿÿÿÿÿþþþþþþýýý ÷÷÷÷÷÷ýýýûûûýýýÿÿÿþþþÿÿÿëëëýýýÿÿÿÿÿÿÿÿÿýýýôôôìììèèèüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþýýýýýýüüü÷÷÷ùùù÷÷÷ÿÿÿúúúÿÿÿìììúúúííí ÿÿÿèèè"""õõõüüüîîîýýýýýýýýýýýýüüüþþþÿÿÿíííêêêûûûýýýöööþþþ óóóûûûüüüøøøüüüÿÿÿþþþþþþÿÿÿýýýûûûüüüÿÿÿÿÿÿþþþýýýýýýùùùøøøÿÿÿÿÿÿÿÿÿþþþúúúüüüøøø ûûûüüüûûûþþþÿÿÿ÷÷÷÷÷÷ýýýüüüûûûúúúûûûýýýõõõûûûùùùþþþúúúÿÿÿüüüûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ÷÷÷üüüôôôíííáááûûûúúúÿÿÿþþþýýýôôôÿÿÿííí ÷÷÷ôôôÿÿÿýýýþþþýýýþþþþþþ÷÷÷ûûûþþþýýýÿÿÿýýýþþþýýýüüüýýýþþþÿÿÿöööùùùÿÿÿýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿüüüóóóúúúõõõûûûúúúýýýÿÿÿùùù÷÷÷ÿÿÿìììùùùúúúþþþééé úúúþþþþþþüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿüüüüüü þþþóóó!!!ùùùèèèëëëùùù ôôôñññúúú÷÷÷þþþýýýþþþþþþÿÿÿøøøþþþüüüþþþÿÿÿüüüþþþþþþÿÿÿÿÿÿÿÿÿüüüøøøÿÿÿþþþýýýúúú÷÷÷÷÷÷ÿÿÿðððøøø êêêýýýüüüýýýýýýûûûýýýýýýüüüþþþüüüÿÿÿþþþúúúþþþþþþÿÿÿÿÿÿþþþ888ÿÿÿùùùïïïûûû ùùùýýýúúúýýý úúúõõõüüüûûûÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿýýýÿÿÿüüüýýýúúúÿÿÿüüüþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿ ùùùÿÿÿýýýûûûþþþÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿþþþþþþøøøøøøýýýýýýúúúúúú þþþþþþùùùúúúýýýýýýüüüþþþöööõõõõõõüüüþþþûûûþþþÿÿÿúúúÿÿÿûûûõõõ÷÷÷ïïï ùùùùùù÷÷÷þþþóóó ôôôþþþþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþûûûþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøòòòîîîýýý êêêÿÿÿôôôþþþ ýýýùùùùùùûûûüüüÿÿÿÿÿÿÿÿÿþþþþþþ þþþþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ444ùùùýýýäää÷÷÷ùùùÿÿÿ÷÷÷êêê ýýýÞÞÞþþþþþþýýýÿÿÿþþþýýýþþþýýýþþþÿÿÿþþþþþþ ôôôüüüüüüøøøüüüýýýúúúûûûûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿñññþþþýýýüüüÿÿÿÿÿÿþþþÿÿÿþþþüüü÷÷÷ëëëõõõ ÷÷÷ùùùúúúûûû ýýýýýýúúúøøøùùùòòòõõõúúúêêêýýýüüüúúúÿÿÿþþþÿÿÿþþþÿÿÿþþþþþþýýýúúúõõõëëëïïïàààïïïþþþùùùýýýüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿýýýÿÿÿúúúÿÿÿüüüþþþÿÿÿüüüýýýüüüîîîêêêûûûøøøùùùúúú ùùùõõõ øøøãããóóóúúú úúúþþþ öööÿÿÿôôôÿÿÿüüüþþþþþþÿÿÿýýýþþþþþþÿÿÿÿÿÿÿÿÿ555øøøúúú úúúùùùýýýøøøþþþþþþûûûçççýýýÿÿÿÿÿÿþþþýýýÿÿÿüüüþþþþþþÿÿÿýýýúúúýýýööö÷÷÷ÿÿÿïïïþþþýýýüüüþþþÿÿÿÿÿÿýýýÿÿÿþþþýýýøøøýýýóóóûûûýýýýýýþþþùùùîîîëëëøøøúúúèèèýýýçççôôôûûû÷÷÷ÿÿÿíííûûûñññøøøôôô õõõ þþþüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýüüüýýýñññôôô øøøþþþÿÿÿýýýüüüûûûÿÿÿþþþööö öööýýý ýýýûûûüüüþþþýýýþþþýýýþþþüüüýýýÿÿÿþþþýýýÿÿÿýýýýýýýýýýýý ðððûûûõõõééé555ììì ööö÷÷÷ôôôôôô èèè îîîýýýìììêêêþþþòòò  þþþùùùüüüøøø÷÷÷úúúýýýûûûÿÿÿÿÿÿÿÿÿ...þþþþþþþþþýýýóóóèèèýýýýýýøøøûûûûûûüüüýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿõõõýýý ûûûòòòüüü öööýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿúúú ûûûüüüýýýúúúþþþÿÿÿýýýþþþýýýþþþùùùíííóóóÿÿÿøøøâââýýýþþþñññáááûûûóóó%%%ÜÜÜøøøôôôüüüöööüüüÿÿÿÿÿÿõõõûûûÿÿÿÿÿÿÿÿÿþþþüüüþþþüüüÿÿÿþþþ ÿÿÿýýý ÷÷÷ôôôÿÿÿôôôøøøùùùûûû öööýýýÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ üüüÿÿÿõõõïïï=== äääýýýòòò îîîóóóäääýýý777òòòðððæææüüüÿÿÿþþþÿÿÿüüüüüüýýýþþþÿÿÿÿÿÿÿÿÿþþþýýýþþþùùù---ÿÿÿÿÿÿþþþüüüÿÿÿþþþÿÿÿþþþ ýýýÕÕÕ þþþÿÿÿÿÿÿÿÿÿûûûýýýûûûöööÿÿÿ õõõïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýõõõúúúýýýþþþýýýÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿýýýüüü÷÷÷úúúÏÏÏííí&&&ýýýãããöööðððþþþþþþùùùþþþúúúþþþþþþÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿþþþýýýÿÿÿþþþýýýþþþþþþþþþúúúýýýÿÿÿóóóÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýúúúùùùýýýÕÕÕ ôôô ÷÷÷ííí ùùùñññààà ÝÝÝýýýôôô###ôôôþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿüüüýýýýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ///úúúüüüÿÿÿûûûÿÿÿþþþþþþòòòþþþúúúîîîããã<<<888ûûûÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ûûûÿÿÿüüü÷÷÷íííúúúÿÿÿÿÿÿþþþþþþòòòõõõûûûÿÿÿþþþÿÿÿûûûÿÿÿÿÿÿ ÙÙÙÿÿÿ222###ôôôîîîôôôüüüõõõ ÞÞÞöööùùùýýýøøøõõõùùùýýý ÷÷÷ÿÿÿÿÿÿûûûÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿûûûûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþüäöà° IDATüüöööúúú øøø÷÷÷ ùùùÿÿÿ ÿÿÿýýýþþþÿÿÿüüüûûûüüüØØØþþþüüüûûûôôôÕÕÕÍÍÍòòòþþþýýýþþþÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿõõõûûûýýý ûûûýýýþþþþþþþþþÿÿÿýýýýýýÿÿÿÿÿÿýýýþþþþþþþþþ÷÷÷ööö ñññÿÿÿþþþüüüüüüþþþÿÿÿýýýùùùöööôôôûûû÷÷÷ûûû ÿÿÿüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþÿÿÿúúúùùùüüüÿÿÿüüü þþþèèèààà...üüüòòò%%% øøøþþþ%%%ûûû íííýýýýýýüüüþþþþþþþþþýýýþþþþþþýýýþþþþþþýýýýýýýýýþþþýýýüüüþþþþþþÿÿÿýýýÿÿÿÿÿÿýýýýýýÿÿÿúúúÿÿÿûûûùùùüüü ÿÿÿ÷÷÷ùùùüüüóóóôôôûûûÿÿÿüüüûûûÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûýýýùùù ììììììøøøòòòûûûøøøèèèööö)))ÿÿÿìììþþþÜÜÜýýý ÿÿÿûûûýýýÿÿÿýýýþþþþþþÿÿÿüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿ222þþþþþþýýýþþþþþþýýý  ýýýÝÝÝÿÿÿ÷÷÷úúúüüüýýýýýýýýýþþþýýýÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿûûûôôô÷÷÷ øøøøøøÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿòòòþþþíííåååûûû ÿÿÿÿÿÿþþþýýýüüüýýý ùùùòòò### ëëëöööåååéééóóóèèèûûû### ôôôéééððð þþþùùùýýýÿÿÿþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿüüüýýýþþþýýýþþþüüüùùù úúúýýý ÿÿÿüüüÿÿÿóóóþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿúúúþþþ  ìììèèè öööùùùóóóîîî(((ÚÚÚøøøççç)))%%%ëëëåååüüü÷÷÷úúúýýýþþþÿÿÿüüüÿÿÿüüüùùùôôôÿÿÿÿÿÿÿÿÿüüüýýýÿÿÿýýýýýýÿÿÿþþþùùùøøøòòòçççþþþýýýþþþþþþÿÿÿýýýþþþýýýúúú%%%ýýýòòòôôôþþþöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòïïïùùù öööýýýÿÿÿÿÿÿüüüüüüûûûþþþ ÷÷÷þþþÞÞÞøøøïïïéééùùù ùùùûûûÖÖÖëëëóóóûûûëëëÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿýýýþþþþþþÿÿÿÿÿÿøøø ÷÷÷õõõ òòòþþþþþþïïï÷÷÷ÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþùùù úúúøøø øøøñññýýýþþþúúúüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþùùùûûûûûûþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ222úúú ûûûøøøúúúýýýþþþþþþüüüþþþ ðððÿÿÿüüüþþþüüüýýýþþþýýýüüüþþþÿÿÿÿÿÿÿÿÿ ýýýüüüôôô  øøøýýýÿÿÿüüüòòòüüüþþþþþþ÷÷÷úúú%%%666 üüüúúúþþþÿÿÿûûûÿÿÿÿÿÿÿÿÿñññøøø óóó÷÷÷ !!!ûûûãããêêê×××ÔÔÔ$$$ øøøûûûóóó ùùùûûûùùùüüüþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿúúúüüüüüüÿÿÿÿÿÿ üüüùùùÿÿÿüüüúúúðððüüüúúúóóó øøøûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿôôôööö íííúúúîîîööö øøø ÛÛÛ'''þþþøøøåååôôôùùùýýýþþþþþþüüüÿÿÿûûûûûûþþþýýýóóóôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿ,,, íííúúúùùù éééþþþõõõòòòîîîúúúõõõùùùööö÷÷÷úúúøøøøøø õõõüüüìììöööüüüýýýýýýüüüõõõóóó÷÷÷ùùùüüüùùùüüü ÿÿÿ÷÷÷ùùùþþþþþþþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿîîîììì!!!çççøøøðððûûûúúúÿÿÿ÷÷÷øøøýýý ýýýÿÿÿýýý÷÷÷óóóððð÷÷÷÷÷÷ýýýØØØãããLLLÞÞÞóóó ÷÷÷ ùùùüüüüüüùùùúúú ùùùþþþÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿþþþþþþöööþþþøøøðððøøøñññ üüüùùù øøøþþþúúúóóóíííôôô ûûûüüüùùùþþþþþþÿÿÿûûûõõõ÷÷÷ýýýüüüùùùûûûþþþþþþþþþûûûùùù ûûûùùù øøøñññÿÿÿ )))õõõôôôðððòòòåååøøøúúúÿÿÿúúúúúúþþþüüüüüüüüü õõõüüüýýýúúúþþþüüüþþþ???üüü ðððòòòðððüüü...úúúñññóóóþþþõõõøøøüüüýýýùùùøøøýýýóóóïïïöööþþþÿÿÿüüüþþþÿÿÿýýý øøøøøøùùù þþþûûû óóó  øøøïïïýýýÿÿÿóóóüüüüüü òòòäääòòòúúúþþþÿÿÿûûûóóóüüüþþþüüü þþþôôôöööùùù çççòòò ýýýÿÿÿúúúÿÿÿýýýýýýþþþýýýüüüüüüýýýüüüþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿþþþìììíííýýýÿÿÿõõõýýýôôôýýý ÿÿÿ÷÷÷ÿÿÿþþþùùùýýýýýýÚÚÚBBB ÓÓÓ ÿÿÿýýýýýýõõõóóóÿÿÿ üüüúúúúúúúúú ûûûóóóÿÿÿþþþÿÿÿýýýûûûþþþÿÿÿëëëðððÚÚÚ úúúíííôôôùùùúúúûûûÿÿÿýýýýýýüüüÿÿÿ÷÷÷ýýýýýýþþþþþþþþþÿÿÿ///÷÷÷ÿÿÿóóóííí÷÷÷000ìììòòòíííôôô õõõòòòÿÿÿþþþþþþúúúýýýùùùÿÿÿ ÿÿÿôôôëëëýýýþþþüüüýýý þþþõõõùùù ûûûþþþþþþùùùðððéééüüüýýý ÿÿÿùùù èèèõõõ!!!ñññûûûüüüþþþúúúþþþýýýûûûÿÿÿ úúúüüüÿÿÿüüüþþþúúúÝÝÝþþþýýýøøøþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿüüüùùùÿÿÿýýýÿÿÿþþþüüüüüüþþþóóóæææüüü÷÷÷óóó ùùùëëëÿÿÿ ûûûÿÿÿÿÿÿ÷÷÷ßßßþþþþþþýýýþþþùùùøøø  ôôôùùùôôôýýýûûûÿÿÿÿÿÿÿÿÿþþþüüüúúúúúúãããûûûòòòèèè þþþøøøùùùúúúþþþúúúûûûüüüÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþýýýþþþÿÿÿÿÿÿþþþþþþ(((ïïïôôô îîîÙÙÙïïïòòò óóóïïïúúúüüüþþþ ýýýúúúúúúýýýûûûððð  ÿÿÿùùùôôô ÿÿÿýýýúúúúúúýýýôôôùùùöööíííÿÿÿ ÷÷÷ þþþÿÿÿþþþÿÿÿÿÿÿÿÿÿýýý õõõîîî øøøüüüüüüüüüþþþþþþúúú üüüùùùüüüúúúýýýûûû÷÷÷õõõùùùùùùþþþýýýõõõøøøþþþþþþþþþýýýþþþþþþÿÿÿþþþþþþ öööéééëëëíííúúúüüüùùù ýýýñññ þþþ÷÷÷ ìììÝÝÝàààòòòûûûÿÿÿþþþ ÿÿÿñññùùùøøøüüüùùùýýý øøøÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþýýý þþþôôôÿÿÿúúú###(((þþþñññúúúöööùùùöööÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ666ÿÿÿ÷÷÷ ùùùçççððð***ììì óóóìììîîî ÿÿÿ úúúúúúþþþùùùððð üüüéééûûûýýýþþþþþþþþþýýýüüüüüü ùùùöööýýýøøø÷÷÷ ôôôÿÿÿ þþþóóó üüüÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿúúú òòòüüüýýýùùùøøøùùùüüüþþþþþþþþþÿÿÿÿÿÿûûûýýýùùùüüüÿÿÿþþþþþþýýýöööñññüüüýýýýýýýýýûûûüüüùùùþþþÿÿÿþþþýýýþþþùùùýýýÿÿÿþþþõõõïïïùùùûûûððð!!!ôôôýýý øøøüüü ýýýûûûýýýÿÿÿööö ììì þþþûûûýýýýýý¥Æ²{ IDATúúúôôô÷÷÷ üüü÷÷÷ýýý ùùùÿÿÿÿÿÿÿÿÿùùùôôô öööúúúþþþòòòþþþþþþ ÷÷÷ÿÿÿþþþÿÿÿþþþÿÿÿýýýÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþþþþÿÿÿ111ðððÿÿÿ õõõ ÞÞÞïïïùùùèèèíííååå õõõøøø÷÷÷ýýý $$$éééþþþúúú"""öööýýýþþþþþþÿÿÿþþþûûûÿÿÿ ñññýýýýýýýýý úúúààà ûûûõõõûûûÿÿÿÿÿÿûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûóóó þþþ÷÷÷÷÷÷ûûû ûûûüüüûûûüüüýýýúúúÿÿÿøøøÿÿÿ ùùùÿÿÿüüüçççûûûööö üüüþþþÿÿÿþþþ ÿÿÿÿÿÿþþþýýýþþþúúú ýýýööö ÞÞÞ(((000 úúúôôôúúúÿÿÿúúúôôôúúú úúúççç555èèèõõõùùùìììóóó ÿÿÿþþþþþþûûûÿÿÿøøøùùùþþþýýýýýýÿÿÿÿÿÿþþþúúúûûûÒÒÒÝÝÝùùùùùùÿÿÿûûûÿÿÿýýýøøøýýýýýýÿÿÿûûûþþþÿÿÿÿÿÿýýýþþþòòòþþþ ÷÷÷úúú×××åååkkkÎÎÎÖÖÖ  þþþùùùøøøþþþþþþ üüüþþþôôôûûûþþþÿÿÿýýýþþþþþþÿÿÿÿÿÿûûûþþþüüüþþþäääûûû((( üüüôôôÿÿÿÿÿÿüüüûûûüüüÿÿÿùùù ÷÷÷ûûûýýýþþþüüüþþþüüüýýýýýýûûûýýýûûûüüüþþþøøøûûûùùùõõõéééõõõüüüøøøþþþÿÿÿüüüÿÿÿýýýÿÿÿÿÿÿþþþ üüüúúú/// ÷÷÷þþþ ÷÷÷ìììöööþþþ îîîñññ óóóùùù!!!æææÿÿÿÿÿÿþþþÿÿÿþþþöööûûûöööþþþ üüüþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýüüü ïïï---æææîîîóóóööö úúúÿÿÿÿÿÿþþþýýýùùùüüüýýýþþþþþþÿÿÿþþþÿÿÿ(((üüüøøøðððøøøìììãããgggùùùäääîîîììì üüüüüüýýý øøøùùùþþþýýýîîîòòòããã òòòþþþüüüüüü üüüüüü þþþüüüÿÿÿûûûøøø333åååúúú÷÷÷üüü ûûûöööõõõüüü þþþÿÿÿÿÿÿÿÿÿùùùúúú üüüùùùþþþøøøúúúýýýùùùûûûÿÿÿüüü úúúýýýùùùÿÿÿøøøøøø ïïïýýý÷÷÷DDDõõõëëë ôôôÿÿÿûûûþþþûûûÿÿÿþþþýýýÿÿÿýýýÿÿÿýýýüüüüüü úúúáááëëëþþþNNNùùùËËËëëë ûûûèèèíííùùù êêê'''ÿÿÿÐÐÐòòò'''æææçççíííëëë ùùùüüüÿÿÿüüüÿÿÿüüüùùùûûû÷÷÷ïïïôôôýýýýýýÿÿÿÿÿÿþþþýýýýýý ÷÷÷ñññýýýóóóððð òòòõõõùùùýýýþþþûûûûûûüüüýýýýýýÿÿÿÿÿÿýýýûûûýýýþþþýýý444 ûûû÷÷÷õõõ ùùù---)))ÿÿÿáááþþþöööõõõþþþ ÷÷÷ ùùùðððöööùùùñññýýý þþþðððúúúÿÿÿýýýÿÿÿýýýýýýüüüúúú ûûûøøøóóóøøøûûûôôôöööÛÛÛQQQïïï÷÷÷ùùùûûûûûû ôôôüüüùùùýýýìììûûû ÿÿÿýýýùùùûûûùùùùùùÿÿÿÿÿÿþþþúúúõõõ555ôôôþþþóóóúúúúúúüüüýýýüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüôôôïïïîîîëëë+++æææìììüüü&&&íííãããûûû+++üüüûûûõõõûûûþþþüüüûûû÷÷÷ûûûüüüøøøúúúøøøûûûúúúþþþäääëëë ôôô ûûûýýýÿÿÿûûûÿÿÿÿÿÿÿÿÿþþþþþþþþþ þþþÿÿÿòòòýýýõõõýýýúúúúúúþþþþþþýýýýýýÿÿÿÿÿÿþþþþþþæææ"""öööþþþýýýýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿ+++þþþýýýýýýÿÿÿ ùùùßßßÎÎÎþþþ:::þþþõõõõõõùùùîîîðððùùùûûû üüüööö üüüùùù òòòýýýýýýþþþÿÿÿÿÿÿ ÿÿÿøøøúúúûûûüüü öööôôôúúú###***êêêôôôÿÿÿÿÿÿÿÿÿ úúúüüüþþþüüüýýýûûûýýý þþþ þþþûûûûûûÿÿÿÿÿÿÿÿÿøøøèèèôôôüüüööö þþþþþþÿÿÿþþþÿÿÿþþþþþþþþþÿÿÿþþþ ýýýüüüòòò ïïïêêêÿÿÿååååååüüüððð éééòòòÿÿÿøøøòòò ÿÿÿýýýúúúýýýÿÿÿþþþûûûýýý öööýýýüüüýýýùùùëëëøøø÷÷÷222###ëëëüüüÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ úúúùùùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:::ÿÿÿþþþûûûúúúúúúøøøööö üüüúúúúúúíííôôôóóóîîîôôô'''üüüìììüüüøøøüüüõõõýýýþþþüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿôôôõõõýýýþþþûûûùùùÚÚÚñññýýýþþþÿÿÿýýýûûûøøøúúúþþþýýýÿÿÿüüüÿÿÿ úúúýýýûûûúúúþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿóóóüüüùùùúúú üüüüüüþþþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýýýýýýðððààà öööàààßßß%%%õõõüüü'''îîîóóóýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿøøøýýýýýýýýýùùùööö üüüýýýüüüøøø øøøíííüüüõõõÿÿÿÿÿÿÿÿÿþþþûûûþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿ ûûûúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùüüüþþþúúúúúúÿÿÿóóóèèèôôô÷÷÷þþþÿÿÿ üüüÿÿÿ)))ÝÝÝêêêëëëùùùþþþìììõõõþþþùùùùùù óóóÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿòòòøøøõõõÿÿÿ þþþûûûþþþ ûûûîîîúúúööö ûûûúúúûûûÿÿÿüüüüüüøøøüüüüüüøøøýýýýýýÿÿÿÿÿÿþþþþþþÿÿÿúúú ëëëéééÿÿÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿööö ûûûúúú ûûûàààøøø$$$ÄÄÄ ÛÛÛüüüììì ýýý÷÷÷ïïïþþþýýýîîîûûû÷÷÷ûûûúúúýýýþþþèèèÿÿÿõõõõõõ  áááûûûÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿýýýÿÿÿÿÿÿÿÿÿúúúüüüþþþýýýþþþÿÿÿÿÿÿÿÿÿ---üüüÿÿÿÿÿÿþþþúúúîîîìììøøøëëë ùùùüüüúúúõõõþþþôôôþþþ ñññùùùõõõùùùüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûýýýÿÿÿùùùüüüýýýýýý ôôô ñññøøøýýý ÿÿÿÿÿÿúúúýýýþþþþþþýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúþþþüüü æææüüüÿÿÿúúúÿÿÿÿÿÿÿÿÿþþþûûûúúú ééé÷÷÷ÛÛÛçççúúúæææóóóòòòíííÿÿÿ÷÷÷ùùùûûûÿÿÿþþþþþþüüüýýýîîîóóó üüüþþþÿÿÿ÷÷÷þþþýýýÿÿÿôôôîîî÷÷÷ÿÿÿûûûþþþÿÿÿüüüûûûýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿûûûüüüþþþÿÿÿÿÿÿ,,,ýýýÛÛÛ õõõ úúúüüüååå óóóðððùùùþþþøøøüüüûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüøøøþþþøøøûûûçççðððööö ûûûùùùþþþúúúùùùñññúúúÿÿÿÿÿÿýýýÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþûûûúúúÿÿÿòòòêêêþþþýýýþþþÿÿÿÿÿÿÿÿÿþþþõõõýýýûûûñññööößßßÙÙÙ/// ëëë!!!çççúúúèèèõõõþþþÿÿÿûûûþþþÿÿÿÿÿÿúúúùùùûûûõõõ!!!öööððð ûûûùùùþþþþþþøøøþþþ÷÷÷ýýýÿÿÿüüüÿÿßÿ­’ IDATÿþþþÿÿÿÿÿÿþþþýýýûûûüüüÿÿÿüüüúúúÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ222ÿÿÿúúú ÷÷÷111êêêôôô ëëëééé###  ÷÷÷ñññùùùîîî üüüóóó öööúúúþþþþþþÿÿÿÿÿÿýýýþþþÿÿÿúúúýýýúúúúúúþþþüüüüüüÿÿÿðððäää"""'''ûûûýýýùùùûûûüüüìììýýý÷÷÷ûûûÿÿÿÿÿÿÿÿÿýýýþþþøøøýýýòòòøøø þþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþúúúþþþ ûûûúúúààà///ëëëûûûMMMþþþààà&&&ûûûêêê ÙÙÙôôôþþþúúúüüüþþþýýýÿÿÿÿÿÿýýýÿÿÿ!!!øøøûûûüüüÿÿÿÿÿÿúúú÷÷÷ùùùúúúûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿûûûÿÿÿýýýüüüþþþýýýýýýüüüÿÿÿ...üüüúúú÷÷÷üüüûûûñññøøøéééðððõõõùùùöööúúúúúú êêê ùùùööö öööôôô øøøþþþþþþþþþþþþÿÿÿûûûÿÿÿÿÿÿñññüüüúúúòòò÷÷÷õõõþþþ 444!!!íííóóóúúúðððþþþ÷÷÷ýýýøøøççç###!!!þþþõõõ ÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýúúú øøøþþþûûûüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþ ýýýóóó üüüúúú666ÌÌÌøøøðððçççööö ÷÷÷õõõýýýþþþ ûûûüüüÿÿÿõõõ öööùùùôôô þþþþþþûûûýýýþþþúúú úúúöööùùùþþþ÷÷÷úúúüüüþþþûûûûûûþþþûûûùùùúúúÿÿÿÿÿÿÿÿÿ333ööööööùùùðððüüüõõõ üüüððð ùùùûûû ýýýðððüüü øøøýýý ÿÿÿùùùÿÿÿþþþýýýÿÿÿþþþýýý÷÷÷ÿÿÿÿÿÿýýýþþþýýýüüüüüüûûûööö úúúñññ ûûûÿÿÿ öööãããùùùûûûúúúþþþþþþýýýúúú<<<çççððð õõõÿÿÿûûûüüüÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿ ûûûüüüñññþþþÿÿÿþþþ ÿÿÿÿÿÿÿÿÿþþþüüüÿÿÿüüüÿÿÿýýýçççøøøúúúöööøøøÿÿÿçççþþþñññããã444ÑÑÑÖÖÖ###ôôôÿÿÿ ýýýóóóóóóüüü úúúþþþøøøþþþûûûÿÿÿÿÿÿýýýþþþúúúùùùúúúùùùýýýûûûûûûþþþþþþÿÿÿÿÿÿýýýýýýÿÿÿøøø ÷÷÷ùùù÷÷÷ÿÿÿüüü öööûûûþþþýýýýýýþþþÿÿÿÿÿÿþþþ9‚Æ}222ÿÿÿÿÿÿÿÿÿþþþ ÷÷÷üüüúúúýýýÿÿÿÿÿÿùùùöööýýý úúúÿÿÿÿÿÿÿÿÿýýýýýýÿÿÿûûû÷÷÷ÿÿÿýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿòòò  þþþþþþýýý üüüÿÿÿÿÿÿÿÿÿþþþýýýðððñññøøøýýýÿÿÿýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿùùùõõõÿÿÿûûûÿÿÿõõõùùùýýýûûûùùùûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþõõõ þþþþþþîîîïïï üüüùùùÿÿÿøøøïïïñññüüüýýý óóóýýýýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþøøøÿÿÿ þþþ ûûûøøøùùùûûûÿÿÿþþþ ÿÿÿûûûýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýûûûÿÿÿ÷÷÷ûûûþþþûûûýýýúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþðððúúúþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿüüü òòò÷÷÷ÿÿÿÿÿÿÿÿÿýýýýýýþþþÿÿÿþþþÿÿÿÿÿÿóóóóóó÷÷÷ úúúýýýüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿüüüÿÿÿùùùöööýýýþþþþþþúúúÿÿÿÿÿÿÿÿÿýýýüüüýýýþþþÿÿÿ ûûûûûû üüüøøøìììÿÿÿÿÿÿõõõ!!!ØØØøøøõõõøøø üüüðððõõõ÷÷÷þþþýýýÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿòòòúúúöööøøøÿÿÿþþþÿÿÿÿÿÿûûûøøøþþþúúúýýýûûûÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿûûûüüüýýýøøøýýýÿÿÿÿÿÿÿÿÿÿÿÿúúúýýýúúúþþþþþþÿÿÿÿÿÿûûûùùùôôôýýýôôôüüüøøøþþþ ùùùüüü÷÷÷ûûûýýýùùùûûûþþþþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿþþþÿÿÿþþþþþþþþþýýýþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿùùùöööóóóöööüüüþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýý íííìììýýýõõõ÷÷÷óóóöööÿÿÿ÷÷÷ûûûùùù ùùù ÿÿÿøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú úúúýýýÿÿÿÿÿÿÿÿÿÿÿÿööö úúúþþþúúúþþþúúúüüüþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüüüüûûû þþþüüüýýýúúúÿÿÿúúúùùùýýýÿÿÿþþþýýýüüüööö êêêóóóÿÿÿöööÿÿÿÿÿÿÿÿÿñññýýýþþþýýý üüüþþþÿÿÿüüüýýýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿúúúþþþõõõýýýüüüþþþÿÿÿüüüþþþÿÿÿÿÿÿüüüÿÿÿýýýþþþ õõõûûûÿÿÿÿÿÿüüüûûûÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýþþþýýýÿÿÿúúú òòòñññùùù ÿÿÿôôô êêê ùùùúúúüüüóóóþþþþþþýýýþþþÿÿÿòòò üüüÿÿÿÿÿÿÿÿÿÿÿÿóóó ôôôëëë øøøÿÿÿÿÿÿÿÿÿúúú÷÷÷øøøÿÿÿþþþþþþûûûüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûýýýþþþþþþÿÿÿÿÿÿýýýüüüýýýúúúýýýÿÿÿÿÿÿÿÿÿÿÿÿññññññþþþÿÿÿõõõ ÿÿÿÿÿÿÿÿÿýýýýýýüüüùùù ÿÿÿûûûÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþýýýÿÿÿøøøþþþùùùýýýþþþÿÿÿÿÿÿÿÿÿùùùïïïõõõ ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýýýýýýýýýýúúúþþþýýýøøøúúú æææúúúþþþêêêîîîüüü ùùùþþþÿÿÿùùùþþþûûûùùùÿÿÿÿÿÿ ýýýúúúþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööóóó ÿÿÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿýýýúúúÿÿÿ üüüüüüüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿþþþÿÿÿþþþüüüøøøþþþÿÿÿûûûüüüÿÿÿÿÿÿþþþþþþüüüýýýûûûåååøøøþþþýýýÿÿÿÿÿÿþþþÿÿÿüüüýýýþþþüüüÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿûûûýýýýýýýýýýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿûûûþþþÿÿÿÿÿÿõõõööö ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýõõõþþþõõõüüüûûû  êêêýýýÿÿÿÿÿÿÿÿÿýýý õõõùùùýýýÿÿÿÿÿÿÿÿÿÿÿÿ ùùùõõõüüü÷÷÷õõõ ÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøüüüþþþ þþþýýýÿÿÿ`k¿È IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþùùùøøøÿÿÿýýýÿÿÿþþþüüüÿÿÿüüüÿÿÿÿÿÿÿÿÿüüüþþþûûû ÷÷÷ñññþþþøøøüüüÿÿÿÿÿÿýýýÿÿÿúúúüüüúúúÿÿÿýýýýýýÿÿÿýýýýýýýýýüüüùùùüüüÿÿÿþþþýýýþþþùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññ öööøøøýýýûûûüüüûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿýýýþþþúúúüüüüüüþþþûûûòòòñññåååïïïøøøøøø÷÷÷ûûûýýýüüüþþþñññ ÿÿÿÿÿÿýýýÿÿÿòòò ÿÿÿýýýìììöööÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ üüüþþþûûûüüüÿÿÿýýýüüüþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---ÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþþûûûÿÿÿýýýþþþÿÿÿþþþúúúýýýþþþþþþ ôôôÿÿÿþþþþþþüüüþþþ ùùùûûûýýýýýýÿÿÿúúúôôôúúú úúúþþþÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýýýýÿÿÿúúúÿÿÿþþþÿÿÿþþþûûûþþþþþþüüü úúúèèè üüüúúúýýýýýý÷÷÷ üüüòòòõõõ÷÷÷þþþûûûüüü øøøþþþûûûüüüÿÿÿýýýýýýïïïõõõììì üüüÿÿÿüüüþþþþþþýýýùùùùùùûûûøøø÷÷÷ûûûýýýüüüüüüüüü ûûûöööüüüúúúÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþüüüýýýÿÿÿÿÿÿÿÿÿìììñññúúúÿÿÿýýýüüüþþþþþþþþþÿÿÿÿÿÿþþþûûûÿÿÿýýýÿÿÿþþþýýýûûûþþþ444þþþûûûùùùþþþýýýýýýýýý øøøÿÿÿÿÿÿÿÿÿÿÿÿúúúøøøûûûÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþùùùûûû ÿÿÿÿÿÿýýýþþþþþþþþþþþþûûûþþþûûûýýýûûûÿÿÿüüüýýýýýýÿÿÿûûûõõõ ôôôüüüýýýýýýÿÿÿþþþýýýþþþùùùüüüýýý÷÷÷þþþÿÿÿüüüþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýüüüþþþÿÿÿþþþüüüþþþýýýþþþýýýÿÿÿ þþþÿÿÿýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýùùùûûûþþþþþþýýýöööùùùÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿùùùôôôôôôùùùüüüúúú÷÷÷þþþÿÿÿÿÿÿýýýüüüÿÿÿþþþ ýýýþþþýýýþþþÿÿÿÿÿÿþþþþþþÿÿÿþþþýýýýýýþþþþþþÿÿÿ  öööüüüüüüüüüÿÿÿýýýüüüþþþûûûýýýþþþüüüýýýÿÿÿüüüÿÿÿýýý ôôô ûûûúúúýýýÿÿÿÿÿÿÿÿÿýýýùùùöööúúúþþþýýýÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýûûûüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øøøöööûûûÿÿÿþþþÿÿÿþþþþþþÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿûûûûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿ ÿÿÿüüüýýý íííþþþ ÷÷÷ûûû ÿÿÿÿÿÿþþþþþþôôôùùùöööüüüÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿõõõ ÿÿÿÿÿÿüüüýýýýýýûûûõõõþþþýýýüüüÿÿÿýýýýýýôôôÿÿÿéééúúúúúúýýýüüüþþþÿÿÿþþþüüüûûû÷÷÷÷÷÷ýýýúúúþþþýýýÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýüüüþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüùùùþþþþþþûûûýýýþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþýýýüüüþþþ üüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿþþþþþþþþþûûûÿÿÿýýýÿÿÿþþþÿÿÿúúúÿÿÿýýýúúúýýýþþþÿÿÿÿÿÿÿÿÿ üüüòòòûûûÿÿÿÿÿÿÿÿÿýýýþþþüüüýýýýýýýýýÿÿÿüüüÿÿÿþþþþþþýýýÿÿÿþþþÿÿÿÿÿÿüüüøøøüüüÿÿÿÿÿÿþþþúúúýýýþþþÿÿÿýýýüüüøøøþþþýýýûûûüüüÿÿÿöööùùùûûû ïïïÿÿÿþþþÿÿÿÿÿÿýýýþþþýýýþþþýýýÿÿÿþþþÿÿÿüüüÿÿÿÿÿÿüüüýýýþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿüüüûûûüüüÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿúúúýýý÷÷÷ÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿþþþúúúÿÿÿûûûüüüéééýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþøøøÿÿÿüüüûûûñññïïï÷÷÷ÿÿÿÿÿÿýýýùùùúúúÿÿÿúúúÿÿÿÿÿÿúúúþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýþþþÿÿÿüüüýýýþþþýýýýýýýýýòòòûûûþþþøøøúúúüüüüüüúúúûûûùùù÷÷÷èèèÚÚÚýýýÿÿÿÿÿÿþþþÿÿÿýýýýýýÿÿÿþþþøøøïïïþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþýýýÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþþþþÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿþþþÿÿÿûûûýýýúúúüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿûûûøøøÿÿÿÿÿÿþþþÿÿÿÿÿÿüüüÿÿÿþþþþþþÿÿÿÿÿÿûûûÿÿÿþþþþþþÿÿÿýýýüüüÿÿÿÿÿÿþþþøøøôôôýýýüüüøøøüüüÿÿÿüüüýýýýýýûûûõõõüüüÿÿÿþþþÿÿÿÿÿÿüüüûûûüüüÿÿÿøøøîîîûûûõõõèèèîîîÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüüüüþþþÿÿÿóóóùùùÿÿÿÿÿÿýýýÿÿÿþþþþþþýýýÿÿÿþþþþþþýýýþþþÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿþþþÿÿÿÿÿÿöööùùùþþþûûûÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿüüüüüüþþþýýý øøøÿÿÿÿÿÿþþþþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüûûûýýýïïïùùùóóó ÷÷÷ÿÿÿÿÿÿüüüûûûýýýþþþøøø þþþÿÿÿýýýþþþÿÿÿÿÿÿþþþÿÿÿüüüýýýüüüýýýþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿùùùôôô ÿÿÿ ùùùúúúþþþÿÿÿûûûûûûüüüýýýÿÿÿûûûþþþÿÿÿúúúúúúþþþûûûüüüûûûóóóÿÿÿÞÞÞ ùùùýýýýýýüüüÿÿÿ÷÷÷þþþþþþýýýöööûûûþþþûûûýýýýýýþþþþþþÿÿÿÿÿÿþþþþþþýýýüüüÿÿÿýýýÿÿÿüüüùùùûûûÿÿÿþþþüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿùùùþþþùùùùùùÿÿÿþþþÿÿÿýýýÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÝÌo• IDATððüüü000ûûûüüüÿÿÿüüüÿÿÿýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿøøøüüüùùù ìììáááòòòûûûûûûúúú öööúúú þþþêêê óóó úúúûûûüüüÿÿÿýýýûûûùùù÷÷÷øøø þþþÿÿÿýýýûûûûûûúúúôôô ôôôûûû õõõõõõþþþþþþôôô ýýýþþþýýýþþþüüüýýý óóó ýýýûûûüüü êêêððð$$$ÝÝÝèèèøøøÿÿÿýýýÿÿÿùùùöööþþþøøøþþþúúúþþþøøøÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþþþþþþþÿÿÿõõõýýýþþþÿÿÿýýýýýýüüüûûûûûûøøøþþþþþþÿÿÿ ÿÿÿúúúýýýõõõþþþýýýüüüýýýÿÿÿþþþÿÿÿþþþýýýÿÿÿööö ùùùýýýöööüüüøøøÿÿÿôôôÿÿÿüüüììì222ÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþþþþñññööööööççç þþþýýý÷÷÷ÿÿÿüüüþþþüüüýýýúúúÿÿÿõõõòòòÿÿÿýýýûûûÿÿÿüüüÿÿÿüüüþþþÿÿÿÿÿÿ÷÷÷æææ 000÷÷÷þþþÿÿÿÿÿÿÿÿÿ úúú÷÷÷þþþüüüóóó÷÷÷ýýý ëëëÿÿÿþþþýýý þþþÿÿÿýýýÿÿÿøøøûûûþþþ òòòååå ÝÝÝêêêæææùùùÿÿÿþþþúúúþþþ ÿÿÿüüüüüüýýýüüüýýýÿÿÿÿÿÿøøøøøø ýýýýýýûûûÿÿÿþþþÿÿÿÿÿÿþþþýýýýýýöööþþþüüüùùùþþþþþþÿÿÿúúúûûûýýýûûûþþþ þþþúúúþþþýýýÿÿÿýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüùùùÿÿÿÿÿÿ÷÷÷øøøÿÿÿüüüòòòúúúþþþýýýÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýýïïï  õõõîîîùùùõõõ øøø øøøÿÿÿüüüþþþÿÿÿÿÿÿþþþÿÿÿ ûûûûûûÿÿÿýýýýýýþþþÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿüüüÿÿÿ ÿÿÿÿÿÿïïïþþþ þþþîîîêêêññññññ  ÿÿÿüüüÿÿÿþþþýýýùùùþþþÿÿÿþþþõõõööö ***$$$GGG êêêýýý ÿÿÿýýýÿÿÿüüüûûûþþþþþþþþþþþþüüüýýýÿÿÿþþþþþþþþþÿÿÿþþþüüüýýýþþþ üüüýýý ýýýþþþÿÿÿþþþýýýýýýþþþþþþýýýþþþþþþýýýþþþýýýýýýýýýþþþÿÿÿÿÿÿÿÿÿýýýûûûþþþÿÿÿþþþ÷÷÷òòò ÿÿÿÿÿÿþþþþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþ ýýýûûûîîîñññ ûûûõõõùùù ÿÿÿÿÿÿüüüýýýÿÿÿþþþüüüýýýþþþúúúÿÿÿýýýüüü÷÷÷üüü ûûûøøøÿÿÿþþþþþþþþþþþþúúú  ããã÷÷÷ÿÿÿîîîûûûãããùùùûûûðððýýýúúú÷÷÷ýýýÿÿÿþþþûûûþþþ÷÷÷øøø üüüùùù þþþÿÿÿøøøúúúîîîöööõõõçççøøøþþþÿÿÿÿÿÿþþþüüüüüüÿÿÿþþþþþþÿÿÿúúúþþþþþþüüüÿÿÿÿÿÿþþþýýýþþþþþþÿÿÿþþþÿÿÿêêêöööôôô÷÷÷ ÿÿÿÿÿÿþþþþþþÿÿÿþþþüüüþþþÿÿÿúúúýýýüüüÿÿÿùùùùùùýýýÿÿÿþþþýýýýýýþþþýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþÿÿÿøøø úúúõõõüüüúúúþþþ///ÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿüüüóóóôôô,,,ôôôùùù  øøøÿÿÿúúúþþþÿÿÿûûûöööûûûþþþ äääüüü üüüÿÿÿüüüþþþûûûüüüýýýÿÿÿúúú ÿÿÿññññññÿÿÿþþþþþþÿÿÿÿÿÿóóóóóóòòòôôôëëë òòòýýýñññ ëëëýýýüüüúúúöööûûû ÿÿÿööö úúúüüüûûûÿÿÿøøøìììèèè ÑÑÑùùùüüü õõõóóóüüü üüüþþþÿÿÿùùùûûûþþþÿÿÿùùùþþþûûûÿÿÿüüüÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿôôôùùùööö îîîþþþþþþÿÿÿþþþþþþÿÿÿùùùÿÿÿýýýþþþøøøÿÿÿþþþþþþýýýþþþÿÿÿýýýýýýþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿüüüýýý úúúùùùþþþüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúðððêêêæææüüüîîîýýýöööùùùûûûúúúüüü÷÷÷ùùùüüüôôôûûûýýýùùùøøø úúú÷÷÷þþþþþþþþþôôôþþþûûûÿÿÿÿÿÿþþþþþþêêê ððð÷÷÷ ûûûçççþþþöööööö444ÿÿÿãããüüüüüüûûûÿÿÿÿÿÿúúúüüüøøøýýýýýýúúúþþþýýýûûûýýýùùù÷÷÷÷÷÷øøøúúúúúúúúúüüüüüüÿÿÿýýýýýýýýýþþþûûûùùùúúúÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòüüüíííðððøøøñññýýýþþþÿÿÿ÷÷÷øøøÿÿÿùùùúúúúúúûûû ýýýýýýýýýøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüúúúøøøöööÿÿÿ õõõüüü///þþþþþþÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿúúúíííøøø ùùùïïï333 ûûûÿÿÿýýýÿÿÿøøøúúúþþþþþþõõõùùùððð*** óóóõõõÿÿÿ÷÷÷ÿÿÿþþþøøøùùùÿÿÿýýýÿÿÿùùù ÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýëëëñññòòòááá555///ùùùíííàààøøøþþþûûûþþþþþþ÷÷÷ööö ÿÿÿùùùõõõýýýùùùýýý ÓÓÓôôô÷÷÷ôôôýýýþþþôôôúúú þþþÿÿÿüüüÿÿÿüüüüüü÷÷÷ ôôô ùùùúúúþþþþþþþþþüüüýýýííí666###ðððúúúþþþýýýÿÿÿÿÿÿýýýþþþþþþþþþôôô õõõ ÷÷÷ùùùûûûÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþ÷÷÷öööûûûüüüþþþþþþüüüþþþþþþüüüþþþÿÿÿþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿâââ ûûû ÿÿÿÈÈÈëëëôôôýýýüüüþþþþþþøøøøøøúúúýýýóóóòòòîîîÿÿÿòòò ÿÿÿýýýõõõóóóýýýñññòòòýýýþþþýýýÿÿÿÿÿÿþþþ þþþöööøøø ýýýÿÿÿÿÿÿÿÿÿîîî&&&ÇÇÇøøø;;; ßßßâââüüüþþþûûûýýýùùù ýýýððð öööõõõ öööüüü÷÷÷ôôôûûûØØØ âââüüüéééððð ÷÷÷÷÷÷ùùùûûûüüüúúúöööÿÿÿýýýýýýÿÿÿúúúûûûüüüýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿ ùùùþþþêêêããã ÷÷÷õõõýýýüüüúúúÿÿÿþþþÿÿÿûûûúúú ïïïùùùòòòüüüýýýûûûöööÿÿÿþþþÿÿÿüüüÿÿÿ ùùùüüüüüüúúúÿÿÿÿÿÿÿÿÿÿÿÿýýýüüüüüüúúúùùùããã ðððÿÿÿ èèè÷÷÷555ÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿþþþýýýþþþÿÿÿþþþþþþøøøûûûüüüõõõþþþþþþÿÿÿÿÿÿýýýûûûùùùýýýÿÿÿüüü ùùùøøøüüüæææþþþ þþþüüüííí÷÷÷þþþßßßööö ÜÜÜ ###êêêúúú îîîììì ôôôýýýòòòúúúüüüôôôÿÿÿøøøóóóúúúüüüùùùôôô ØØØõõõ 000úúúöööâââûûûÿÿÿõõõûûûüüüöööÿÿÿñññûûûòòòççç'''ûûûêêêààà !!!øøø êêêüüüÿÿÿýýýÿÿÿéééñññøøøþþþöööõõõþþþûûû ýýýõõõäää ÷÷÷ÿÿÿèèèÿÿÿôôôýýýñññ òòòÿÿÿ ñññüüüúúúüüüÿÿÿýýýøøø ûûû×××;;;õõõëëëàààòòò üüü÷÷÷øøøññññññíííýýýããã õõõýýýüüüúúúþþþñññôôô ûûûûûûÿÿÿþþþøøøÿÿÿùùùýýýüüüêêêøøøñññ öööþþþúúúðððñññýýý111ÿÿÿÿÿÿÿÿÿüüüÿÿÿýýý þþøã IDATþÿÿÿýýýûûûôôôþþþþþþÿÿÿûûûýýýùùù---ñññõõõÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿýýýýýýþþþ üüüýýýûûûîîîìììëëëìììùùù òòòõõõ þþþûûûúúúüüüúúúûûû÷÷÷úúú ðððùùùõõõñññâââéééCCCëëëèèèûûûýýýøøøÿÿÿóóóòòòåååððð"""888 """ùùùîîî õõõûûûñññòòò ùùùûûûÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿúúúüüüûûûïïïùùùÿÿÿþþþ øøøïïïøøø ÿÿÿúúúÿÿÿÙÙÙÿÿÿìììôôô  úúúÿÿÿþþþùùùõõõ÷÷÷ ýýýøøøüüüþþþýýýóóóòòòõõõþþþþþþÿÿÿêêê ùùùûûûúúúÿÿÿîîîüüüöööúúú***ééé÷÷÷øøøòòòüüü÷÷÷ÿÿÿÿÿÿüüü÷÷÷ôôôõõõøøøûûûûûûúúúùùùûûûüüüþþþúúú ýýýÿÿÿ ùùùüüüòòòòòòùùùùùùÿÿÿÿÿÿÿÿÿ òòòìììîîî***ùùùúúúöööáááüüüóóóùùùìììèèèüüüÿÿÿÿÿÿ  ùùù ÿÿÿÿÿÿûûû((( $$$õõõúúú ôôôüüüþþþýýýëëë ÷÷÷ 111 òòòôôôììì ÷÷÷òòòõõõÿÿÿ ÿÿÿýýý÷÷÷òòòõõõÿÿÿ ÿÿÿõõõõõõþþþÿÿÿþþþþþþþþþÿÿÿþþþ÷÷÷ùùùýýýúúúþþþéééõõõ***úúúóóóüüüõõõÿÿÿýýýüüüûûûüüüïïï ,,,ñññöööûûûúúúþþþÿÿÿÿÿÿüüüûûûÿÿÿ äää $$$ýýýýýýÿÿÿýýýúúúúúúþþþ"""ðððûûû ýýýûûûûûûýýýþþþÿÿÿøøøøøøùùùúúúùùù÷÷÷øøøúúú   õõõûûû  ÿÿÿüüüýýý111ÿÿÿÿÿÿþþþÿÿÿûûûÿÿÿýýýýýýþþþûûû þþþüüüþþþøøø üüüýýýäääøøø ýýýÿÿÿòòòøøøýýý666ÓÓÓèèèþþþððð÷÷÷ ýýýüüüûûû'''õõõ ùùùúúúññññññöööþþþýýýüüüþþþüüüÝÝÝýýý$$$ûûûýýý÷÷÷ñññõõõÿÿÿñññöööüüüþþþýýýùùùæææáááøøøôôôêêêøøøþþþùùùûûûýýýûûû ÿÿÿüüüýýýÿÿÿÿÿÿþþþþþþÿÿÿðððóóóëëëòòòôôôýýýÿÿÿÿÿÿèèè;;;ïïïõõõ÷÷÷ÿÿÿúúú þþþýýýüüüüüüþþþÿÿÿûûû ÞÞÞþþþÿÿÿüüüþþþóóóýýý îîîþþþþþþÜÜÜ===æææõõõõõõýýýùùùüüüçççíííþþþóóóÿÿÿÿÿÿþþþþþþùùùýýýõõõøøøããã÷÷÷óóó ùùùýýýúúúúúúýýý222ÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿüüüûûûúúúýýýíííÿÿÿþþþúúúùùùûûûûûûýýý üüüùùùüüüûûû úúúùùùþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþøøøøøøëëëäääþþþ úúúöööðððõõõ!!! ðððöööóóóýýýøøø ïïï ööö÷÷÷ÿÿÿÿÿÿýýýÿÿÿþþþííí'''ííí ìììøøøüüüüüü ÿÿÿýýýôôô èèèóóóëëë!!!úúú÷÷÷ùùùõõõøøøôôôûûûýýýÿÿÿþþþþþþÿÿÿ õõõççç ýýý üüü ùùùííí óóóÿÿÿûûûýýýüüüýýýùùùÿÿÿììì øøøýýýøøøûûû óóóûûû ûûûÿÿÿýýýûûûõõõûûûþþþþþþþþþýýýúúúúúú'''ãããèèèùùù!!!ðððÿÿÿþþþÿÿÿøøøååå úúúôôôýýýøøø ÿÿÿÿÿÿüüüþþþÿÿÿþþþþþþÿÿÿþþþþþþûûûùùùúúúîîîóóóûûûöööõõõ 222ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþøøøýýýööööööüüüðððûûûüüüûûûýýýÿÿÿööö ÿÿÿüüüýýýõõõýýýúúú ôôôþþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿ ÿÿÿùùùöööêêêãããòòòêêê úúúøøøúúúüüüäääóóóÿÿÿýýýþþþúúúüüüøøøýýýýýýõõõôôôÿÿÿýýýýýýõõõüüüæææüüüüüüöööúúú éééèèè÷÷÷ððð óóóüüüôôôåååþþþ üüüýýýõõõ ÿÿÿúúúüüüüüüýýýÿÿÿþþþõõõôôô)))555ãããôôôùùùýýýùùùúúúñññ ñññ óóóüüüþþþÿÿÿéééééé üüüùùùõõõøøøùùùþþþýýýüüüúúúÿÿÿþþþýýýþþþ÷÷÷ùùùäääòòòñññÿÿÿþþþõõõððð"""êêêöööùùùýýýûûûþþþýýýøøøýýýþþþýýýýýýüüüüüüþþþûûû ôôôùùù öööüüüííí÷÷÷úúúøøøÿÿÿþþþÿÿÿÿÿÿòòòÿÿÿüüüöööÿÿÿÿÿÿþþþûûûúúú ñññ üüüöööÿÿÿùùùýýýÿÿÿÿÿÿóóóúúúóóóêêêóóó ÿÿÿúúúêêêúúúøøøþþþ  üüü øøøúúúïïïöööþþþíííûûûùùù ÿÿÿÿÿÿüüüýýý ýýýúúú ùùùîîîÿÿÿûûû øøøýýý íííëëë )))ûûûãããüüüüüüýýýóóóÿÿÿððð úúúøøø ùùù÷÷÷ üüüÿÿÿÿÿÿÿÿÿÛÛÛøøø÷÷÷ÜÜÜõõõ÷÷÷ööööööñññýýýðððúúúøøø÷÷÷ùùùÿÿÿüüüøøøþþþ÷÷÷îîî ÝÝÝýýýùùùõõõúúúúúúþþþþþþÿÿÿÿÿÿ õõõëëë  àààÿÿÿýýýþþþ áááòòò ÷÷÷þþþüüüÿÿÿþþþ ÿÿÿýýýýýýôôôÿÿÿùùùûûûÿÿÿýýýðððûûûøøø ööö  000ýýýÿÿÿÿÿÿúúúùùùðððóóó÷÷÷))) þþþüüüüüüþþþþþþûûûÿÿÿÿÿÿþþþþþþööö íííÿÿÿüüüôôôÿÿÿ þþþøøøéééòòòúúúâââõõõöööðððôôô ûûû úúúúúúöööööö ûûûùùù---ëëëüüüûûûÿÿÿýýý ôôôíííþþþûûûïïïþþþüüü÷÷÷ïïï éééòòòþþþõõõ þþþþþþïïïþþþõõõ ÷÷÷ûûûûûû ôôôþþþÿÿÿòòò ÿÿÿýýýÿÿÿ ùùùóóóùùùùùùñññþþþüüüùùù ïïï øøøõõõ øøøÿÿÿüüü÷÷÷óóóòòòëëë@@@%%%'''ôôôùùùþþþ÷÷÷÷÷÷ ýýýýýýüüü÷÷÷ûûûüüüþþþéééíííôôôúúúýýý óóóöööååå...úúúííí üüüûûûüüüÿÿÿÿÿÿþþþýýýÿÿÿüüüôôôþþþ ðððóóó ÿÿÿééé ÝÝÝ999ñññ444ÿÿÿÿÿÿþþþþþþïïïæææ###EEEööö øøøõõõüüüÿÿÿÿÿÿþþþüüüüüüôôôýýýüüü÷÷÷ÿÿÿúúúýýýüüüýýýÿÿÿýýýÿÿÿúúúñññûûûùùù îîîöööüüüååå ôôôôôôììì èèèïïï îîî÷÷÷ééé üüü### ðððìììÿÿÿùùùúúúþþþþþþööö÷÷÷ýýýöööüüüæææùùù ñññ$$$çççêêêììì###...äää÷÷÷êêêùùùúúúüüü üüüùùùøøøêêêúúúùùùöööüüüÿÿÿÿÿÿþþþÿÿÿ÷÷÷õõõúúúòòò øøøùùùúúúÿÿÿùùùüüü üüüÿÿÿüüüòòòüüüôôôòòòÞÞÞèèèýýýÿÿÿÿÿÿýýýùùùÿÿÿþþþÿÿÿþþþ ÿÿÿõõõòòò÷÷÷úúú ððð üüüÿÿÿóóó ýýýöööÝÝÝúúú÷÷÷ ÜÜÜüüüÿÿÿþþþÿÿÿüüüõõõæææ äää óóó ööö÷÷÷úúúñññòòòüüü444þþþÿÿÿÿÿÿÿÿÿöööûûûÿÿÿûûûôôôñññûûûÿÿÿÿÿÿÿÿÿþþþûûûðððùùùèèèüüüúúúûûûþþþþþþ ììì ðððüüüëëëøøøôôô åååÿÿÿûûûìììÿÿÿùùùÿÿÿ÷÷÷þþþýýýèèèõõõÿÿÿ÷÷÷þþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿ óóó÷÷÷éééèèè---$$$ýýýæææêêêõõõ +++ öööðððîîî õõõöööúúúüüü úúúîîîòòòííí îîîööö ûûûÿÿÿÿÿÿ ÷÷÷ÿÿÿùùù üüü òòò÷÷÷ÿÿÿþþþÿÿÿùùùùùùÿÿÿûûûóóó+++æææüüüêêêôôôþþþþþþþþþÿÿÿÿÿÿÿÿÿ ûûûùùùøøøüüüîîîðððÚÚÚ%%%÷÷÷öööÛÛÛøøøñññüüü ÿÿÿ üüüúúú ÿÿÿýýýþþþÿÿÿýýýýýýîîîýýýøøø ûûû öööýýýøøøýýýÿÿÿþþþÿÿÿÿÿÿøøøòòò æææìììùùùÿÿÿöööÿÿÿþþþÿÿÿþþþÿÿÿûûûÿÿÿÿÿÿÿÿÿ ÿÿÿýýýý×aæ… IDATýýÿÿÿúúúþþþþþþÿÿÿýýýÿÿÿ÷÷÷õõõþþþ óóóóóó(((ÝÝÝïïïîîîýýýýýý øøøõõõåååçççòòòýýýþþþÿÿÿ÷÷÷þþþ þþþûûûééé###ëëëøøøøøø öööâââñññôôôêêêÿÿÿþþþ÷÷÷ðððùùù---ÿÿÿ øøøôôôþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿöööýýýÿÿÿöööóóó÷÷÷âââ úúú þþþýýýýýýþþþÿÿÿüüü úúúúúúúúúÐÐÐøøø''' øøøúúúþþþþþþúúúÿÿÿþþþüüüþþþ÷÷÷ýýýþþþ öööïïïõõõöööõõõúúúýýýííí øøøÿÿÿøøøûûûøøøòòò333ÿÿÿÿÿÿÿÿÿýýý ûûûþþþ ñññõõõøøø ôôôùùùýýýÿÿÿýýýúúú ùùùýýýÿÿÿùùùúúúýýýþþþþþþþþþùùùÿÿÿ ýýýüüüûûûçççòòòõõõûûû ÐÐÐ üüüóóóÿÿÿÿÿÿùùùùùùûûûýýýþþþÿÿÿ òòòøøøéééîîîÿÿÿööö ûûûûûûúúú"""ßßß úúúßßß!!!èèèîîîöööúúúúúúîîî  ôôôççç---!!!àààÿÿÿþþþÿÿÿûûûùùù(((777ìììôôôûûûÿÿÿÿÿÿüüüðððõõõççç ÝÝÝöööÿÿÿÿÿÿóóóïïïõõõùùùôôô//////&&&ôôô ôôôÿÿÿÿÿÿÿÿÿýýýüüüüüüýýýÿÿÿþþþþþþÿÿÿÿÿÿ÷÷÷ÿÿÿöööòòòøøø ýýýèèè ãããïïïòòò ëëëÿÿÿÿÿÿýýý """ûûûûûûþþþõõõõõõþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøúúúôôô þþþýýý ûûûøøø üüüøøøúúúûûûýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿüüüöööþþþ ýýýôôôúúú÷÷÷òòòõõõûûû ïïïûûûöööúúúõõõ ÿÿÿãããýýýþþþÿÿÿöööøøøöööóóóõõõ þþþôôôÿÿÿÿÿÿ øøøûûû þþþúúúûûûýýýüüüþþþ÷÷÷ûûû þþþÿÿÿÿÿÿýýýüüüüüüüüüõõõÿÿÿ þþþùùùþþþÿÿÿÿÿÿýýýüüüûûû ëëëøøøöööþþþßßß þþþýýýüüüÿÿÿÿÿÿþþþÿÿÿþþþúúúüüüþþþûûûþþþ ÷÷÷ ðððúúú ýýýíííüüüúúúùùùôôô ëëëôôôøøøíííÿÿÿÿÿÿúúúúúúýýýúúú ýýýúúúúúúÿÿÿýýýüüüúúúûûû111ÿÿÿýýýöööùùùøøøòòòõõõþþþÿÿÿýýýÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿùùù óóó÷÷÷ÿÿÿøøøúúúýýýûûûýýýÿÿÿýýýÿÿÿþþþÿÿÿþþþÿÿÿðððõõõóóóóóóôôôðððÚÚÚèèèûûû ûûûþþþøøø üüüëëëüüüÿÿÿÿÿÿÿÿÿÿÿÿûûûûûûæææüüüððð÷÷÷ øøøùùùæææìììøøø õõõûûûÿÿÿýýýöööüüüúúúøøøùùù éééôôôùùùÿÿÿúúúýýýþþþùùùýýýïïïþþþ===/// ûûûùùùÿÿÿûûûüüüÿÿÿûûûüüü þþþÐÐÐûûûüüüûûûÿÿÿþþþûûûÿÿÿýýýüüüýýý ýýýüüüûûûÿÿÿúúú øøø÷÷÷ óóóøøøôôô"""ííí""" øøøêêêîîî üüüüüüÿÿÿÿÿÿøøøøøøýýýÿÿÿþþþýýýÿÿÿ(×ãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûøøøûûûôôôÿÿÿùùùüüüýýýÿÿÿýýýÿÿÿöööõõõöööÿÿÿûûûøøøþþþÿÿÿÿÿÿþþþþþþûûûÿÿÿüüüüüüùùùüüüöööíííòòòõõõ'''éééòòòôôôþþþþþþðððýýý þþþüüü÷÷÷ûûûÿÿÿþþþúúúöööÿÿÿôôôéééùùù%%%"""ßßßîîîðððíííöööòòòÿÿÿÿÿÿçççôôôøøøïïï ðððöööûûûþþþýýýÿÿÿàààûûûúúú óóóþþþþþþÿÿÿÿÿÿ ýýýÿÿÿ   ôôôçççýýýøøø ÿÿÿýýýøøø óóó $$$ ãããååå øøøûûûÿÿÿþþþýýýþþþÿÿÿûûûþþþÿÿÿýýýûûûûûûûûû øøøöööëëëøøø õõõýýýÿÿÿûûûììì ýýýþþþÿÿÿóóóÿÿÿþþþôôô þþþüüüÿÿÿþþþ333ÿÿÿùùùûûûþþþôôô ûûûóóó ýýý þþþõõõ÷÷÷ ôôôþþþýýýôôôöööüüüÿÿÿÿÿÿþþþüüüÿÿÿþþþýýýüüüôôôîîî ðððììì õõõ(((øøøùùùòòò ôôô ùùù üüüÿÿÿÿÿÿÿÿÿþþþööö øøøúúúüüü éééöööüüüüüüðððóóó þþþôôôóóóòòò÷÷÷ýýýùùùÿÿÿ """úúúäää îîîúúú þþþÿÿÿþþþýýýûûûÿÿÿýýýûûûõõõþþþôôôûûûøøøîîîÿÿÿ ýýýÿÿÿûûûùùù ÿÿÿõõõéééüüüýýýæææìììþþþÿÿÿÿÿÿÿÿÿþþþþþþúúúûûûûûûöööúúúñññ øøø÷÷÷þþþùùù'''ááá÷÷÷ ñññùùùúúúîîîííí èèè ðððÿÿÿÿÿÿýýýõõõûûûøøø üüüþþþýýýþþþþþþ666ûûûûûûýýýüüüççç ûûûùùùýýýûûûúúúöööõõõþþþþþþÿÿÿÿÿÿýýýõõõ úúúÿÿÿÿÿÿÿÿÿüüüþþþ ýýýòòò!!!üüüçççüüüààà ýýýõõõ÷÷÷ôôô ðððýýý úúúÿÿÿÿÿÿÿÿÿþþþýýýþþþþþþÿÿÿýýý÷÷÷öööûûûüüüûûûþþþôôôöööÿÿÿøøøûûûúúúííí ÷÷÷þþþñññÿÿÿøøøÿÿÿüüüüüüòòòúúúóóóøøøþþþÿÿÿÿÿÿýýýýýýûûûüüüÿÿÿ ñññðððüüü øøøÿÿÿþþþþþþþþþüüüûûûúúúûûûñññùùù ûûû ôôô÷÷÷ÿÿÿþþþÿÿÿýýýÿÿÿþþþüüüÿÿÿüüüÿÿÿþþþýýýþþþúúú÷÷÷þþþøøøúúú÷÷÷õõõæææòòòìììûûûöööùùù èèèÿÿÿôôôÿÿÿûûûÿÿÿüüüúúúþþþþþþþþþüüüÿÿÿÿÿÿÿÿÿ÷÷÷ùùùûûû÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýýÿÿÿþþþÿÿÿÿÿÿüüüþþþùùùþþþÿÿÿÞÞÞñññ>>> ¡¡¡***ÊÊÊööö øøøüüüþþþþþþþþþýýýÿÿÿþþþÿÿÿÿÿÿýýýÿÿÿýýýþþþúúúìììüüüüüüÿÿÿýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýýýýþþþâââ ýýýüüüÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿýýýýýýýýýþþþýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿýýýûûûþþþÿÿÿþþþòòò úúú êêê ííí×××îîîüüüõõõýýýþþþÿÿÿøøøûûûûûû ýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþþþùùùûûûüüüûûûÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿüüüûûûúúúýýýûûûÿÿÿ þþþúúú ÿÿÿüüüÝÝÝìììõõõ ïïï òòòýýýýýýþþþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþüüüýýýÿÿÿÿÿÿýýýìììúúú÷÷÷ üüüûûûýýýýýýþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿýýýþþþþþþÿÿÿòòòóóó÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿþþþÿÿÿ üüüÿÿÿúúúûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøÿÿÿúúúûûû þþþüüüõõõþþþùùù íííøøøøøøøøø&&& ëëëõõõððð÷÷÷þþþüüüüüüÿÿÿþþþÿÿÿýýýþþþÿÿÿÿÿÿ ùùùùùùúúúùùùöööüüüûûûÿÿÿûûûÿÿÿþþþÿÿÿþþþþþþþþþþþþüüüÿÿÿøøøÿÿÿüüüôôôöööì'¤Î« §IDATìì ÚÚÚååå%%% ÝÝÝ ùùùþþþýýýÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿþþþÿÿÿþþþüüüüüüòòòþþþ ôôôúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýýýüüüýýýþþþýýýûûûùùùøøøÿÿÿÿÿÿÿÿÿþþþÿÿÿûûûþþþÿÿÿüüüþþþüüüúúúûûûÿÿÿÿÿÿþþþÿÿÿÿÿÿûûûÿÿÿÿÿÿüüüÿÿÿüüüóóóþþþþþþúúúþþþôôôõõõ +++ÿÿÿûûû çççôôôöööýýýûûûõõõÿÿÿ üüüÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿþþþúúú üüüþþþúúúÿÿÿÿÿÿüüüýýýþþþÿÿÿþþþÿÿÿüüüþþþþþþþþþüüüÿÿÿøøø÷÷÷êêê$$$þþþðððöööùùùóóó ÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿöööüüüýýýýýýÿÿÿ úúúùùùôôôýýýþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþýýý ôôôûûûüüüþþþ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿþþþþþþûûûüüüúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûúúúÿÿÿÿÿÿûûû üüüøøø  ûûûúúúøøø øøøçççóóóííí éééüüüóóóÿÿÿþþþóóó ïïïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøþþþ õõõðððÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿÿÿþþþþþþÿÿÿúúúüüüüüüíííûûûùùùðððýýýøøøÿÿÿòòòðððþþþÿÿÿýýýÿÿÿÿÿÿüüüþþþÿÿÿÿÿÿþþþÿÿÿþþþ úúúõõõþþþÿÿÿûûûÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  úúúíííñññúúúÿÿÿþþþýýýýýýýýýþþþþþþýýý þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþüüüûûûüüüûûûýýýüüüþþþ  õõõûûû÷÷÷ áááùùù þþþ  þþþ  ýýýþþþþþþ|G§æëç&…IEND®B`‚rgl/inst/textures/rgl2.png0000644000176000001440000060122211257014117015304 0ustar ripleyusers‰PNG  IHDRÓ?1 pHYs  šœ IDATxÚ+Ô~ÿÿÿëË-÷ IDATÜ½Ž IDATÿðüÅ IDATÿþÿÿÿÿþþÿÿýýþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿüÿþþýýüüÿúúýúúûþþÿÿþþþÿÿÿÿþÿÿÿÿÿþÿþþþþÿþþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿþþþÿÿÿþÿÿÿüÿûþüþüýùûÿ÷÷ü÷÷úýýþþýþþþýþþþÿÿýþÿþÿýýÿüüÿýýþþþÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýþþþþýýþÿþþÿýÿÿþÿÿøùûóöùó÷úüýúüúüûûÿýüÿþÿýýþýþþþýÿþþÿþþÿÿþþÿýýþþÿÿþÿþÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿþÿÿÿÿþÿÿÿÿÿþøùúðòôìîôûûûûøùÿûúüûûüýýþþþþþþÿÿÿþþÿÿþþÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýÿþÿþýÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿþþþþýþþýÿÿÿýÿý  ÿþøúûóóöììð  ÿûýüþüýúûÿøøüþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüýüýýüÿÿþÿÿÿÿþþþþþþþþþýüüüüüýþüÿÿþþüýûýüü  øùþûüþÿ ýýþøøùôôöýüýÿÿÿþûüþüüüýýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþþþÿþÿÿÿÿÿÿÿÿýÿÿýÿÿýýýþÿüÿøýúüøûûþôöùïñ   ýýýùùúõõöüûúýÿÿÿþ  ûûö÷øööýúúúÿÿÿÿÿÿÿþÿÿþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿþÿþþÿþÿÿÿÿÿÿÿþþÿþþÿþþþþýÿýüÿûüüüôöù ûú ýý  þþþûûüùùúýýÿÿþýýúûûÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿþÿÿÿÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿþþþÿýýþþÿÿÿÿþÿþÿÿÿÿÿÿÿÿüüüÿüüÿÿÿÿþýýÿüýþüýþýýþýþþÿÿÿÿÿÿÿþþÿþþþÿÿÿÿýþþþþþÿþÿÿþþÿþþþýþþýþÿýþýýÿýýüÿ ÿÿÿÿÿÿþÿýüþûúüùùúûÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýþþþÿÿÿÿþÿÿýýüüÿûüÿüüþüüÿüüÿýüýýýýüýýüýþÿüÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿö÷ûìîó÷øøõ÷óöõ d“ÿ² IDATÿÿÿÿÿÿ+Ô~ÿÿÿÿÿÿþþÿÿÿþúúüÿú üúûþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüýüüûüÿûúÿúúÿúúþúúûúúúúûÿÿûÿÿÿýÿþÿþþþþþþþþþþÿÿÿÿÿÿÿÿÿõ÷ûõ÷÷ðñôöñô ýþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿþúùûüüÿþÿýüýüýþúûýúûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿýýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþýýýüüüüûûÿûûüýýýþþþÿþþþýýüüüüýþýþÿþþÿÿÿÿÿûûüûûøÿüùûøóõôøø÷þÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþýûÿþÿþûùúýÿüýÿ úúúöùøøøùþÿýþþþþþýþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿÿÿÿÿÿÿþþþùùùúúúûúûüüÿþûþþÿþÿýþýûûüúúüýüùùú÷òòý÷õöüûýúùûÿÿÿÿÿÿþÿÿþþÿÿÿþýÿýýþûûýûûþ÷úýýÿúúþøøõôõõôõôýÿýÿÿüûûüüüüþþþÿÿÿÿÿÿÿþÿýÿÿþþÿÿÿÿþþÿþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüüýýþþþþþÿþþÿüÿÿýþþýþþûüýúúûúúùüûøûû÷òòùúûøøúúûü þþþÿÿþþþþýýþþýýþúúüýûÿõõ÷òôóòòòþþüþÿüþþüþþþÿÿÿþþÿÿÿþÿÿþþÿýþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþýþþþýþÿüûüÿþÿÿþýýþþÿÿÿÿÿÿûûþôô÷   ÿÿÿÿÿþþýþýÿÿüüýÿýùùú÷÷øõõõýýûüýûþþüÿÿÿÿÿÿÿÿÿÿÿþÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþþÿÿÿÿþÿþþþþÿþÿÿÿÿÿÿÿÿþþýÿþÿþÿþùùúïýüþÿþþúúùû ÿÿÿÿÿÿÿÿÿÿþþþþýþüÿÿÿÿýýþýþüùøú÷ö÷õõõûûúûüúýýüÿþÿÿÿþÿÿÿÿþÿÿþþÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþþþÿÿýÿÿþþÿÿÿþÿÿÿÿþýýýÿýýýüýýýýüýþþÿÿÿþþþ ýýÿÿÿýýúøøøûûùûûùûúú÷÷õ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþûûûùùùýýþþüüúúýüüýþþþþþÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþýþýýüýýþýþýþýýþþþþÿÿþÿüþþýýþüýýýýýüüüýýýüýýüýüýýýÿÿÿýýýÿÿÿÿÿÿÿþÿýüýûÿûÿþÿÿÿÿÿýÿÿÿþþþþþþýýýùùùööÿííî    ÿÿÿÿÿÿÿþþýýþúûüùùùýýýýýýüüÿüüþýýþþþþþÿÿþþÿÿ  üþþýÿýþÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþüýüüüýýýüýüþýþþýþþÿþÿþþùûúûûûùúúýýýýýýüýýüüüüýüýýýþþþýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿÿþýþüÿüÿýÿþÿþÿüüýþþüýýÿÿÿþþÿþþþýýýýýýûúÿ÷÷öüîîÿý ÿÿÿÿÿÿÿÿÿýýþýýüûûûýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿ      ûüÿûûýûüþýýýûûýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþÿüüüýýüüüýýüþýþþýþþÿÿþþÿøùøøùùøøýþýýýþüýýüüüüýüüüüýýýýýýþþþþþþþþþþþÿþÿþþþÿÿÿÿÿÿÿýüýþÿþþýýþüüüýüüüüÿÿÿýýþþýþþþýûûýøýþýúÿþüüú ÿÿÿÿþþþþÿ    $KÙz IDATÿÿýýüôôõùùûúúûùúüúúûúúúüüüþþþþþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþýþýþþýþþüüüüýüûûûýýýüüüýýýþþþýýýþþÿþÿþþþÿþþÿþþÿÿÿÿÿÿÿÿÿýýþûûü÷÷øþþþÿýýýûúþþþýýýýýýþýþÿýÿýýÿöööþþüüùùùþþÿþÿÿÿü     øøû÷÷ùõõù÷÷ùøøù÷øøøøùø÷÷úúûþþýüýþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþýþÿüüüüýüûûûüüüûûûüüüýýýüüüþþÿþÿþþþÿþþÿþþþþþþþÿÿþÿÿÿþþýúûþþþüüûÿýýùþþþýüýþýþþýþÿÿýüüÿõõöøöö÷÷ôùùûþÿÿÿÿÿÿÿÿ   ÿÿþÿýþÿþþùù÷ññóííòöö÷÷÷÷÷ö÷÷ø÷öööùùùýýýýýþþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþýÿÿÿýþþûûûüüüþþÿÿÿþþÿýýþÿÿÿýýÿþþÿþýÿþþÿÿÿûûûüüûÿÿÿÿÿÿþÿþÿþüþúýûÿþûø÷ñðòòòôöö÷ÿÿÿÿÿÿÿþþÿýýþüüüýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþÿýýÿüþÿÿÿ  ÿüüýúûýûûùøö÷ùø÷ííïêêíëêìöö÷÷÷öö÷÷ø÷÷÷÷÷ùúúþýþýþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿ  ÿÿÿÿÿÿÿþþÿþþþþÿþýþþþÿÿÿÿÿÿýýýýüüþýýýýýýýýýýýÿüûùýüúÿÿÿþþýÿÿÿýüþÿþüÿþûþýññòéèé   ÿÿÿþÿÿÿÿþÿþþþýýþýýýýýÿþþÿÿþÿÿÿÿÿÿþþÿÿÿÿÿþÿÿþþÿþÿÿþþþýýþþÿ  ÿûûýùùúõôöòñðñðñéééçæçççæööö÷÷öö÷÷ø÷÷øøøúúúÿÿÿþþþÿÿÿÿÿÿÿÿþýþýþþÿÿÿ ÿÿÿÿþþþþÿþýþýýÿþþýþþÿúúúÿþþûúûýýýüüüüüÿûúúùÿÿÿýýýýüýÿÿüÿýÿüþýñññèéêÿþ þþýÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýýýööøóóõîíïìëéìëëééçèçèééç÷÷÷øøöøø÷úùúùùùûüûÿÿÿÿÿÿÿÿÿÿÿÿþþÿþýýþÿ øúúúÿÿÿÿÿÿþÿÿÿþþþþÿÿÿÿÿÿÿûüüýüüüüùþþÿòòôêéê  ÿÿþþþÿÿÿþþþþþþþþþÿÿÿÿþýúúüòñôìììèèèæåäååãíììîîíïîíùùøúùøúúùýüûüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿõ÷    õõ õ  þþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýüýüüýþþÿÿÿþþÿüüýÿûûüüþøøùôõõêëìüüüÿÿÿÿÿÿÿþþþþþþþþþþýýùùýòñôêêìääåàßÞààÝððïôóóõõòûúúüûùüüûþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿ   ô öõö÷ö øúûû ý ÿÿÿÿÿÿÿÿÿÿþþÿþþýýÿüüüûûüÿÿÿÿÿÿþÿÿÿþþÿüüýÿüüúýýýùùúþôôõúúøÿ !ûûûÿÿþþþÿÿÿÿÿÿüýúûÿþýýþþþóóöïïñììíìììðððòòòôôôööô÷÷öýüûýýûþýüÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþýýþþþýÿÿÿþÿþþþýÿÿþûÿþÿþþþýýýÿÿÿýþþûüüûüýüýþúûüúúúûüûþÿþýýþþþÿÿÿÿþþÿþÿþÿþýþÿþÿÿÿþþÿüüüþøøù÷÷ù÷÷ùùøúþþþþþÿÿÿÿÿþþþþþÿÿÿüýúúþÿÿüûûüüúññôîïñììîïïðõõõûûûýüûüüûüûúÿÿýÿþÿýÿÿþÿÿþÿþþþÿÿÿÿþÿþûúüÿûþþþÿýþÿýÿüÿÿýýûûÿþÿþûüüüþþûþþúûûúúùùúúÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿÿÿþþÿúùû÷ö÷ö÷øÿÿÿþþÿþþÿÿýýþÿÿýýùúûüþûúûúú÷ñòôïïñììíïïïõõõûûúüüûüüúüûúÿÿÿÿÿþÿÿÿþýýÿýýýþþþÿÿýûüþþÿÿÿÿÿÿÿÿÿýþþýýÿÿÿýýþþþþúûüøùúüýþûýþûûûúúúùúû ÿ þþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿþÿþþÿþþÿÿþþýþúùûöö÷÷ö÷ƒzü IDATÿÿÿÿÿþÿÿýþþýýþýýýÿÿÿþûûýûûýüüüüüýýýýþýþþþþ  ÿÿÿÿþþþþÿÿþÿûûüûûûÿÿüüýüüüýüýÿþÿÿþþÿþþþýýýüüüüüýüýýýýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýýýÿúúúøøùõö÷ööøþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýþýýýüüýÿÿÿÿÿÿüüýüüýüüýýýþþþÿþÿÿÿ ÿþþþþþþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿýüýüýþüüüöö÷÷ö÷øùùýûýýüýþÿþÿÿþÿþþýýýýýýýýþþýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿþþþþÿÿÿÿÿÿÿÿÿþÿÿÿþýýÿÿÿýúúúøøøöö÷÷÷ø þýÿÿÿÿÿÿÿþÿÿþþþýþþýýþÿÿÿÿÿÿüüüüüüýýþþþþþþþÿþÿÿÿÿ ýüüüýýýýýþþþûûûüûûÿÿùùúúùúøùùòòòóñôõööûúûûúûÿþüýüüÿýÿÿþþþýþþýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþùùúøøøõõööö÷ þþÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿþþýýýýýýüüüþþýÿÿþÿ  +*(þýýþþýþþþÿÿÿýýýýýýüüüüüýûûü÷÷÷ø÷ùøùùúúûûúúø÷ùö÷ùööùôô÷óô÷ôóøþþþþþþþþþýýýýýýüüýÿÿÿÿÿþþþþÿÿÿÿþÿÿýýþÿýýþýúúû÷÷÷õôõõõöúùúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýþÿÿÿþüüüüüüýýýýýþÿÿþÿÿÿ  ,,,##"ÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþÿÿþÿþþÿýýýüüþûüüúùûúúúññòêêìêêíæèëþæêññôÿÿþÿþþýýýþþþýýþýýþýÿÿÿÿÿÿÿÿÿþþþÿÿÿýÿÿÿÿÿÿþþÿÿÿÿþýýýüüþýûûû÷÷øôóõõõõùùûýýÿÿÿÿÿÿÿÿÿÿþþþþþüýüüýýþþýÿÿþÿÿÿÿ %##ÿÿÿÿÿÿÿþÿÿÿÿþþÿúúûûûûîîñææçèÿûúüýþþÿÿÿÿÿÿÿþþþýýýýýýÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþÿýýþûûüþþûûüøøøõõõöõöûûúÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿ ý!!$ííñíîñïñóüýüÿÿÿÿþþþýýýÿÿÿÿÿþÿÿþÿþþþÿÿÿÿÿþÿÿÿþüüüüüûÿÿþûûüøøøùùùüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýþÿýÿÿþÿÿÿÿÿýÿÿÿþÿÿÿþÿÿÿþÿÿ õõûôôúÝÝáÛÜßýáäùúýøûýýþÿÿÿþþþýýýþþþÿÿÿþþþþþÿþþÿÿÿÿÿÿÿþÿÿþÿÿÿþþþýýýûûûþþÿûûûøøøùùøýýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ùú÷÷ûñòôñóõôõù÷ùúûþÿÿÿþþþÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿþþÿýýýýýýÿÿÿýýýúúúúúúýýýÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿ ôÿõøûÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþýÿþÿÿÿÿÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿþþþýýýýþþþÿþÿÿÿþÿþþþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿùûþÿ÷ÿÿÿÿÿÿÿÿÿþþþþÿþþþÿþþþþÿþþÿÿò§?2 IDATÿÿÿÿþþÿþþþþþþþþýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øûúúþöøûûüÿÿþÿüÿÿÿÿþþþþþÿÿÿÿÿÿÿþýþýþþýþþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿþÿ  ùûþööûòõøùúýÿÿÿÿÿýýþÿþþþþþþþÿÿÿÿþþþýýþþþþþþþþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýþÿýýÿþÿ  üþôóø ñô÷÷úþÿþÿÿÿÿÿÿÿÿüüýÿÿÿÿþþþýýÿþþþþýýýþþþþþþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþüÿÿÿþÿÿþþþþÿÿÿÿÿþÿÿÿÿÿþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþþþþþþþÿùùúÿÿÿþÿÿþþþýÿÿþþÿÿÿþÿþÿÿþþÿþþÿÿÿýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýþþÿÿÿþÿÿþþþþÿÿÿÿÿþÿÿÿÿÿþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüþþÿýüûüþþþÿÿýýýÿÿÿÿþþþþþþÿÿþÿÿþÿÿÿÿÿþþþþýþýýþýýýýþþýþþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþýÿýûüüüþýþÿÿÿÿÿÿüþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿýÿýþþþþýþþþþýýþþþþÿÿýÿÿÿÿÿÿÿÿÿÿþýþþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿþþÿÿÿÿÿÿýþýýýüüýüýþüýþýÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýüûûûÿÿÿÿÿÿþÿüûþûûþý ñòþþüøøøüüüÿÿþþýüþüÿüþþÿþÿýüÿþÿýþüûûúøø÷ùúøûüûþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþü›2«† IDATþþþþÿÿÿÿÿÿÿþþÿýüþüûþþþþþþþÿ  þþýøø÷ÿþÿýýýýýþýýÿýÿÿÿþýÿþýýüûûùøù÷ùùùüüûþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Ô~ÿÿÿÿÿÿÿÿÿþþÿÿýýýúúüùùúýýÿüüÿÿÿÿÿþûûúûûûýýûþýýÿÿÿÿÿÿÿýýüÿþÿýûýûùùùúúùûûûüüûüüüüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿýýýùùùö÷ùûûüÿÿÿÿÿÿÿÿ÷öø÷÷öóóóüûûÿÿþÿþÿÿÿÿýÿüûÿÿÿýýýüûûúúúùúúùúùùûúùûûúüüûÿÿ ÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿþÿÿÿþþþÿüýýøùúöö÷üüÿÿÿÿÿøúøõõöôõôóòóûûûýþþþþÿþÿþþÿúÿÿÿþýýûûûúûûúúúùúúùûûúûûûüûûÿþÿ þþþÿÿþþÿÿÿÿþÿÿþýÿþþÿÿÿÿÿþ  óúôóûööõøø÷ûûúýýüüýýýýÿÿÿþþþüúúùùøöø÷ö÷÷õ÷÷öùùøúúùüüûÿþýÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýüýúüýÿÿúþýýÿ  ýüîýúùøúùøûúùûûùüüýýýÿ üüþüûù÷÷õõõôõõôõôó÷õõøøöûúùþýûÿÿý  ÿþÿþþÿÿÿÿÿÿÿýþûûùûþþûÿþ  øøüûúøûúùûûùûûúüüýýýþÿÿÿ üûýûûúø÷öõôóõôóõôóööôùø÷ûûùÿþýÿþ ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿ  ÿÿþþÿÿÿÿÿÿþÿþþÿýþÿúúÿùúøúÿúúýûûýþýýÿüûýòòüðñõóóõõõôúúúÿÿÿÿÿÿþ  ýüýüüýúùø÷öôóóñóóñõõô÷÷öúúøüûûþþýþ ÿÿÿþþþÿþþÿÿÿþÿÿþÿÿÿþÿÿÿÿÿÿÿû    ÿýþÿÿÿÿÿÿÿþÿÿýýÿüüÿûûÿùûþùúþùúÿúúýûúüüüýþþýùùù÷òùîîôññôôõõýþÿÿýÿÿýÿ  øöýûùúúøö÷õôóòñòòñõôóø÷õúúøüýûþþý ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿüüü     ýýüüþÿÿÿÿþÿþÿÿþýþûýÿûúþúúþùúýùúÿúûþûûýüüüþýÿøøþòòûîîôíîóòòôööõþý  ÿú÷ýýüùùøööõôóòñóòñõõóøø÷úúùýüûÿÿþ  ÿÿþþÿþþþÿÿÿÿþþþÿþþÿÿÿþþþþÿÿ üüûþúûóôýìîøöÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþÿþþÿþþþýýþüþÿüûþýýÿüýÿýýÿýýÿûûÿööúððòêêëïïîöööýýýÿ      ÿþÿûúúõôóññïòñïóñðõôóúø÷ýüúþþüþþüÿÿüÿþþÿÿ !2@ IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿþþÿÿÿÿþþþÿÿÿ ÿÿÿÿÿùúòôýìíøõþþÿýþþþþÿýþÿþþþþÿÿÿÿþþýýýýýýÿþþþÿþþþýýýýýþýþþýüþýþÿþþþþÿÿÿüýûûÿõöûïïóêëêïððõõõýýýÿ      ÿþÿûýÿúùùõôóòñïòñðòòñöôòùù÷üýûþþüÿþüÿýÿÿþÿþ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿÿýýþþþþ üýý þÿøúñóûù ü þþÿýýþüýþýÿÿþýþýþÿÿÿþþýýýýýýýþÿþÿÿÿÿÿþþþþþýþüýýþþþþþÿþýþÿÿ þþÿÿÿûûýúúýööüòòõñðñîîïôõóûûü       ûûþüúþûùúöôôññïïíìððíòñïôôòø÷õüûùþýûþþüÿÿý ÿÿÿþþþÿþþÿýÿþþýÿÿþÿÿýÿÿþÿþÿ ÿÿùûÿÿÿþþýÿýÿÿÿþþýþþÿÿÿþÿÿÿÿÿÿþÿÿÿþÿþüýûþýýüûúþþÿÿÿþýþþþÿÿÿÿÿÿúúüùúûööúñòõññöííîðððúùøþÿ   ûúúôó÷ñðóêêèçæåææäëêèïîìóòðö÷õúùøýþûÿþýþ   ÿÿÿþþþÿþÿþþÿþýÿÿþÿþÿÿþþþþÿþÿùûÿýþþüüÿÿþÿÿÿþþÿþÿÿÿÿÿþÿþÿþÿýýýþþþþþþþýþþþþ ÿÿýýÿùúüôôùññôìíîëëïðððòòòúùùÿÿ    ûúùóóòíìíêéèçæäææäëêêîíìóóñùûøúûøÿý  ÿÿÿÿÿÿÿþÿþÿþþþþþÿÿýÿýþÿþþÿÿÿýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùúúùøüøùûóóùôô÷ððôëìíììíóóóúúùýýü       þýþûûüüüýððòìëìççèççæççæéèæðððóòðö÷õüýúýýú ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿýþÿþÿÿþþÿþþÿÿÿÿþùùÿýüýüûûüûûóóôòòôóóõøùüùøúööøïððñññøùøÿÿþ     ÿÿýüøøûõõöõõöææèääæäãåäääçèæëëêõõôööôúú÷þÿüþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüÿþüýÿÿÿÿÿþÿÿÿÿÿýþþþÿýþýýÿþþÿüýúøÿùùÿùøü÷öøø÷øëëíëëìîîïþþÿþþþûûûôôôööõýþý    þýþþ÷öûðïôîïïææéãâäáááääãççæììêúúùûùøýýûÿþÿý""  ÿÿÿÿÿÿÿþþþþýýÿÿüþþýýýÿÿ ÿþþþýþÿþþþþÿþþÿýýýüýýúýþýÿÿþÿÿÿþÿûûÿø÷þø÷ýø÷ú÷÷÷÷ö÷ïïðïîðññóÿÿÿÿÿþýýýý      þýþüüýûúû÷÷úøøúïîðììíìëìäããåääçææììëòòñ÷÷öþþüÿÿýÿþÿþ "!  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿýýýþþüÿÿþ  ÿþþÿÿÿÿÿÿÿþÿÿÿüýÿýüþúüþúúøúúùúúùüüúüüûýüüþþþýýþüûýùøýùøýùùúùøùøøú÷÷øø÷÷úúüþÿÿÿÿ        ÿýüüùùüôóöïïðïïðíìîìëììëìæçææææééèñðïøööþýûþÿÿþþþ !" ÿþþÿÿþþþüýüþýüÿÿþþÿýÿÿþþ  ÿÿÿÿÿÿÿÿþþýýýýøüûüýúûüôô÷óôôõõôøøø÷÷÷ûúúýüþüüüüûüúúüúùûúùüúúûúúüÿÿÿþÿÿþ    ýüüýøøúññóééêææçêéêìëìììíëêééêéìëë÷÷õø÷õýüüÿÿÿþ "!!ÿÿþþþþÿÿÿÿÿýþþýýþþÿýÿÿÿþþþüûûÿþýþüüþúüýøøùõõôñðÿÿÿÿÿþþÿÿÿÿþþÿþþþþúúüøøüøøü÷÷÷ööö÷÷÷úúúúùúûûüþýýüüýýýýüûþüüüþüÿþþþýýþþ  þþþûûüøøüüûøûýùùÌÜê IDATø÷óòöóóõíìïêêêééêìììíìíîìíññðòñðø÷öüûúÿÿþÿÿÿþýýü ""!"" #""ÿÿþýþýþþÿÿÿþþýýüüýüýüüýÿþþüûüýýÿûûûúû÷ùÿÿÿþþÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿüüýúúüûûüúúûûûûúúûýýýýüþýýýþýþþþýþýÿþþÿþþÿ   úüüùøø÷÷öòññòóðòñðòñóññòïîðïïïîîîîíîîîîïîïøøö÷÷÷úúøþýýÿÿÿþþýþý  **)/.-ÿÿþþþþÿÿÿÿþþüüÿþýþýÿÿþþþþüýÿÿúøÿÿÿÿþÿÿþÿÿÿþþþþþþþþþþþþýýýÿÿÿþþþüüüýýýþþÿþþþþþÿÿÿÿÿÿÿþþþþþÿÿ   ýýÿþýþúùúõõõòòòéèéêêèìëëðïðððïñðñôôôòòòððððïïñññþþýþþþÿÿþÿþÿþÿÿý *)(443  ÿÿÿÿÿÿÿÿýýþýýýÿÿþþÿþÿÿþÿÿÿÿÿÿÿÿÿÿþþýþþþþþýÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿ   ÿ÷øûùøùôôõõôõðððñññððïìëìììëïîíõôõõõóôóôõõõõôôõõõø÷öýüûÿÿþþÿÿÿþÿÿ#$"$$!))( ÿÿÿÿÿÿÿÿþÿÿÿÿÿÿýÿþþýþüþþÿÿýÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿýþüüýÿÿýÿÿÿÿÿÿþþÿÿÿÿÿ     ýüý÷÷ûðîòëìëìëêíííîííîîíïïîïïîòññùùøùø÷÷öø÷÷ö÷ööûúûûûúýýüÿÿÿÿÿÿÿ $$#11.!!! ÿÿÿýþÿþýýüþýþþüþþÿþýýÿÿÿýÿþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿþÿþþþþýýüýýüüüýýýþýÿýþþÿÿþÿÿÿÿÿÿÿÿÿþþýýÿÿÿÿÿÿÿ     ÷÷ùôô÷ëëïäåæåäãììëíëëìíëòòñòòñöõõýüûüüûûúûùùøúøùþþþÿþþ!!!&&%*** ÿÿÿþþþþþþþÿÿÿÿÿÿÿþþþÿÿüüüýüýüüûüÿýüÿþýþüþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþÿýþþüûüûýüþýþþÿþÿþÿýýýûüýýüýþýþþþÿþþÿÿÿÿÿ    úûúùøììñíìíæååääãããâðïíðïîðïïööôõõôùøøþÿýþýüýýþÿÿÿþþþþ "" "" ""!"#  ÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿûûúûûûúúùúÿûûÿýüýüüýýþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýýøùùøøùüüüþþþþþþýüýûüýûûüþüþýýþýýýÿþÿÿþÿ  ûüôôúííðåäçããääãââââòòïôòñóòòúúøúù÷ûûûÿÿÿþÿÿþþÿ 00/00/  ÿÿÿÿÿÿÿÿÿÿ ÿÿþþýþþþýÿÿÿÿþýÿüþýþþÿýþüþÿÿÿþýþýýýþþþÿÿÿüüýûûþüüüüüýüüýýüýÿÿþþÿþÿýÿÿ ûüþúûþòó÷îîòêëìëëìììîîîîõôòõôôöõõûûúüúøýýüÿ ))((('ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  øùü÷öùööøùùýùùüøøýøøüøøüùùüüûýûüýýþÿÿÿÿýýþüüþüüýüüýüüýýüýÿÿþþþþýþþýýÿüýþûüþúûþþÿûûúýüùðñòñòóòòôõõ÷ùùúýýÿþÿüÿÿÿÿÿÿþþþ ÿÿ  üüüõõöïïóøøûø÷ú÷øûø÷ù÷öùøùûüûýûüýþÿþýÿüýþýýýüüýüüýüûþþþÿýýþýýÿüýýüüüÿÿýþÿüüþùúþüýÿøøøùùõññóññóñóóõööùùûýþÿÿÿÿÿÿÿÿÿÿÿÿÿ$$$''% ,/w½ IDATÿÿûüýýüüüûûûûúííðëëîêêîøøùùøùø÷ú÷øùø÷ùùùûýýþüýþÿÿ ÿÿýþþÿþÿÿÿÿÿÿýþþüüþýþþùùûøøúöøù÷øø÷÷ù÷øúøúúùúúûüüüýýþÿÿ  !! ""!!!ÿÿÿÿûúüûûûöööôóóóôóêééçæèææèùúùúøùùøúøùùúùúúûûþþýþ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýþþþþûýýúûýúûüùúüùûûøúú÷ùúøùùûùúûûûýüý   ÿþÿúúýõöúðïôìëìëìêæåãããâãââúúùûùùúúùùúúûúûüüüÿþÿ    ÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþþÿýýþýüüýûüýúûýùûüùúüøúûøùú÷øùüûúýüüÿýý %$#%$#ÿÿÿÿÿÿÿÿÿÿÿýýúúþýýññõïðñëêêèæææçåéèæééçëëêúúùûùùûûùüûûüüüýýýÿÿÿöûûú÷øö  ÿÿÿÿþÿÿÿÿþþþþþýÿýüþýÿÿýÿþþÿýúúüúûüüüýþÿÿÿ   ÿýÿÿÿüüÿùùýïïôêêìæåçãâáããàíìëððíðïîúûùûúùüûúýýüþýýþþýÿÿùùøùùøôôò   ú ú ÿÿÿÿÿÿÿÿÿþÿþÿýüýýýüÿþÿþüýþþüúúûûûüüýÿÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüõõýðïõêéíæåçââãßÞÞòñïö÷ô÷öóûûùûúùüüúÿþýÿþþÿÿþõô õ ö÷ ÷øùùúüüü úüýýÿþÿþÿÿÿÿÿÿÿþþþþýýýüýýýþÿÿýýüúûüûûýýýþÿ  ! !  ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýûûÿýýýýüüóóõóóõóóôóóôôôõööö÷÷÷ùøøúùùýüúþüüÿþýÿÿþÿþýýüûüÿÿþýÿþþ÷ÿÿþúûþüüÿýüþýÿÿÿÿÿÿÿÿÿýýþýÿüþÿÿÿÿÿýþÿÿÿþÿùùúóôôïðð ëù÷ú  ÿÿÿÿÿÿÿÿÿþþþüüúúûúùùôóöóòôòòôóóôõõõöö÷øøøøøøúøùþÿüþüÿþÿþþþüýûÿþÿþÿÿþÿÿÿþþýüÿúüÿýýÿýý üÿÿÿÿÿÿÿÿþÿÿüþþþÿþþÿýþþþÿþÿÿøùúôôõïïðüúûÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýÿÿÿþøøû÷÷øôôöôôöôóöõõö÷÷øúúúúúúüûûüüüþÿÿþÿýþÿÿÿÿÿþþþýýýÿÿÿÿüûùùÿÿÿýþýüÿýýþþþþÿÿÿÿÿþÿþÿÿþþÿýÿþÿþÿÿýþþþýþÿÿúúû þþÿøúúõõöððó ÿÿÿýþÿýþÿýýþýþþüüÿÿö÷øöõöôõõ÷÷øùúúýüýÿþüÿýûüýýúûûüüüüýþüüýüýÿýþýûúùÿþÿÿÿÿþþþýýþýýýýýýýüþþýÿÿ þüüÿÿÿ   úüþö÷úòô÷ôúûüÿÿÿÿÿÿÿþþÿþþÿþþÿþýþûÿÿþþýÿÿþ÷öøõõöõõõö÷øùùùüüþþþûþý úûûøøøøùøøùúøùúùùüþþÿýþÿÿÿÿþýüüþÿÿûûüÿÿÿÿþþÿþþýþþýþýüþüüþýýÿ ÿþþ  úûþö÷úóô÷üüýû üýþ ÿÿÿF“”‡ IDATÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþýþþþýùúûúûûúûûúûúúúûüýüÿÿÿü  úúúøø÷øøøö÷ù÷øø÷÷úúûûúùûúûüûûþüýþüüÿýýýþýþþýÿÿÿûúùúùø÷öÿÿÿþþþýüüþýýüþýýÿÿý  ÿÿüýøùýôõùúûü÷øùö  þ+Ô~ÿÿÿÿÿÿþÿÿþþþþþþþþþÿÿþþþÿÿþþþÿþþÿýýþýÿþþüüüÿþþýÿÿþÿÿþûüûüüüÿÿÿþ ++*üüüûûûûûüøùùøùù÷øùõõõôôöóòôîïñîïñôô÷ùùüøúûþýýúùù÷õõþÿþÿÿÿþýüüÿþþþýÿÿýÿþþÿ þÿÿúüÿõ÷üþøööù   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýýþþÿÿÿÿüüüÿþÿÿþÿÿÿÿÿÿûüûüýüÿÿÿ 443(('þþÿþþþþþÿúûùøùûøùøïïððïðêêìáâäÿþþÿÿþùûþÿþþþûúúöÿþÿÿÿÿÿÿÿþýýÿþþÿþÿ ýþýýÿÿþÿþúüþ÷üúûýÿýüüüùýûû õ÷øøùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþþþþÿþÿ ÿÿÿÿÿÿÿÿûüüûûüúûù  íîñîïðüýÿÿÿþýýüûùúùúùùÿþþýþþþÿþÿÿÿÿþÿÿÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿýþýýýþüüüÿùýýûûüûùüûùþþüýýúüû ÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ êêëççêæçéóôõööù÷øúÿÿþÿþüþýûüûúúúøÿÿÿþÿþþüÿþÿÿÿþÿÿþþþþýýýþþþýþÿÿþþÿþÿþÿýüüûýûûýüúúûýûûøþýûþýýÿþÿôöøýýü÷ùù  ÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿ øùüëëëßã èéììíïüýðþÿÿÿýþþýþûüüúûùùüþýÿÿÿþýþýüûûýýþÿþýýüüüûûûýýþÿÿÿþÿÿþþýþüÿþýúûùúý÷÷øþþüþûöûöõ÷òóô   ÿÿÿþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿþþýÿþÿþüøøùþÿþÿùùùùûþüüÿüýýÿþþüúúøøùþþýúúúÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþÿüüüÿÿÿÿÿÿþÿþýþÿþþýþüûùúþíïñ è ÿÿÿþÿþþþýýýýýýýþþýþþþþþÿþþÿÿÿÿÿ ÿøùúòóóõùöþúþúüþþüúûøøÿÿýýýüüüþþþþþÿÿÿþþþþÿÿÿýýýþþþÿÿÿÿÿÿÿþþþýþýýüüþüüüÿÿüïïñýüûüüýÿÿÿþþþýýüþþýþþþþþþþþýýÿÿÿ üüýòòóëëìýüÿøøúþþüþþþüýýþúúûûúüûûûþþþþþþþþþÿÿÿÿÿÿþýýþýþþþÿüüþúúüýýùîïòúúùúùù þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüüüüüüüÿÿÿÿÿÿýýýÿÿüýüþÿÿÿýÿÿÿÿÿ öøù êîíòþþÿÿÿþþýüüûúúúøúüüýýüýýüþýüþþýÿÿÿÿþþÿþÿýýýýýýþþþþþþüüýùúúÿûûýýýùùùüüüþþÿÿÿýýÿøùüïðóæçëûûûÿþÿÿÿÿÿÿÿÿÿþþþÿÿýüýýüüüüüÿþþþÿÿÿÿÿÿÿÿþþýýýûúþüþÿÿþÿÿþÿÿÿýþþûüþÿÿÿÿþÿÿÿÿþþþýüüûûùøûüûûýýüþþýþþýþþý.´#Ç IDATþþÿýþýýýþþþûûûûüüúÿÿýýþùùùÿÿýÿÿÿþþýýøùûïðóûûûýÿÿÿÿÿÿÿÿÿÿÿþÿþýýþýýýýýýýýýþþþÿÿÿÿÿÿÿÿþþýþýüýüúþþýÿ ûýþûûþ÷÷ùööøûûüúúþúûýÿÿÿÿþþýüüüûüûûüüûûûúýýþþþýÿÿÿÿÿÿÿýýýþÿÿÿÿýþþþþÿÿÿþÿÿüüþÿÿÿüýþøùüðòôúúùýýü  ÿÿÿýþýÿþÿÿÿÿÿþþýýþþþþþþþþÿÿÿ ýÿñóôôöòòõúúõüüûÿÿúúùôôôÿþþÿþþÿÿÿÿÿþÿÿýýþÿÿÿÿýýþûûüû û úþýüþþüýÿÿüüþùýüúùøÿ  þ ÿÿÿþþþÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ñóóôúúüóóôüüüÿÿúúùýþý ýýÿþþþþþþÿþÿÿÿÿÿÿÿüýþýýýýþÿÿÿÿýýýüü ûýþýûúøüüúýüúÿÿýüüýüüüÿýýÿÿþ   ÿÿÿÿÿÿÿÿÿÿÿ  òôôöÿþýýýþþþûüüÿÿýþþÿþþþÿþÿþþþýþüýýýýþÿÿÿÿÿþþÿýüýý ÿÿùùùùÿþýýþþüþþþûýýüýýú îñ ûüÿÿÿÿÿÿÿÿÿÿÿþÿÿýþþýýþÿÿÿÿÿÿ  óò ñ øùúþÿÿÿÿÿþüüúþÿÿÿþþÿÿÿÿÿÿÿÿÿþþÿþþþÿÿÿÿÿÿÿüýýüýýýþÿÿÿÿþÿÿ ÿÿýýûþþüþÿüýÿþþÿþþÿúúüñòô  ÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿýÿþýýþýýýþþÿÿÿÿ  ñ ö÷øûüþúûþþýýûþþÿûüÿþþÿþþÿÿÿþþþþþþþþþÿÿÿÿþÿýýýýýþÿÿÿýýýÿÿÿÿþÿþÿþüüûûú÷ûûþÿüüÿþÿþÿþÿùúûñòôùûû òóöÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ úóôôóôõûûüôöùþÿ÷ùýüüüÿüüþþþþüüûûúùùùýýÿýýþÿÿÿÿÿÿÿÿÿÿþþýþûûûÿÿþýýþøùûûüýîïòêëî ü ÿÿþÿÿÿÿþþþÿÿÿýýýýýýþþþÿÿÿÿÿýýýúúþþþÿÿÿÿÿÿÿÿÿÿ öö÷÷øúüýþñúúúùøùýüüúùûÿÿÿþüüúøø÷ÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿüüýûüûýýþûûþýüýþÿÿÿýýýþýýüñòôççêÿþþýü ÿþþþþýÿÿþþþþþþþýþþþÿÿÿþýþþþþýýüÿÿÿÿ÷øùùúüúûüùúûóóóÿþýýúùùùÿþþýûûúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüüüûûúþþþýýýÿþýÿýþýüüüñòôÿööõ ÿÿÿÿþþýýþýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþÿÿÿÿÿ  õ òñòýþþþÿüûúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿüýüûúúûûýýþþþÿüüþôôõúúøìíîîïñðñôþþÿýýýüûüüýüýýýØ¢ù IDATýýþÿÿÿÿÿÿÿÿÿÿÿþÿþýþüþþûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿýþÿÿÿÿ õ þÿÿûûúþþüþþþÿÿÿÿÿÿÿÿÿýþþþþÿÿÿÿúûûùøøùÿüýýÿþþýþüôõøþòûééëæçê ÿÿÿýýýûüûüüüýüýýýýÿÿÿÿÿÿÿÿÿþÿÿþüýýýÿþþýÿÿÿÿÿþþþýÿÿÿ ÷ø ÿþúúüøùüùùùüþþÿÿþþþÿÿÿÿÿþþþýþþÿÿÿ÷÷÷ýýþüûüþÿýûøüöõõ÷öòèé ýü ý ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüúúúÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþÿþþþÿþþýýþþþÿÿÿ   öûûýÿûþÿÿÿþþþýýüüüûûûúûûÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþÿÿþÿÿýýþüüýþþþùøþüýùþþûúþüüúÿÿùùùìïëæøþþüÿÿÿÿþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿþþþþþþÿÿÿýýüûûùÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþþþýþÿþþÿÿÿþþþýýýþþþÿÿÿÿÿ    ÿýýþÿÿþþþýýýýüüüüüûûüûÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿþýýþÿþÿÿþÿÿÿÿÿþþÿÿýýþýýÿ$    ÿÿÿÿþÿÿÿúèþäçÿãþþþþýýþ ÿ  ÿÿÿÿþþþýýýýýýýýýýýýýýýýýýýýýþþþÿÿÿÿÿÿÿÿÿýýýúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿýýýþþþþþþÿ    ýýþùÿÿÿÿþþþýýüûûûûûýÿþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿüÿýÿÿÿýþüÿþýþýýþÿüüû# '# &% ÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþùùøøòÿòêþêÿÿÿý û   ÿÿÿþþþýýýüüüèèïïùûùüûüúùúúøúúöúùøùúøú..ÿÿÿüüüûþþÿþÿýþþþýþþýýýþþþÿÿÿÿÿýÿÿÿþÿþýýýþþþýýþýýýýýýÿ  öö÷ùùûýüúýþüÿÿþþýýýüûûùüüÿþþþýýýÿÿÿÿÿüþÿÿþÿüüþÿþþ þ4* ÿÿÿþþþþþþþýþÿÿÿþþþÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûïïîþîàüàù  ÿÿÿÿþþþýýýüüüüüþþþþûþûûûúú÷þ÷öùöøöøõÿõûûûÿÿÿÿÿÿÿÿüüüþþÿÿÿþÿþþÿÿþþþþþþýýýÿÿÿÿÿÿÿÿÿþÿþþþþýýýüýýüýýýþþ  ôóõñðóüüûýýüÿÿÿþýýüÿÿûûûýÿÿÿþþÿÿþþþþþÿÿÿÿþþþÿÿþþþýüýü ÿ9(þÿþÿÿþÿþþþþýþþýþýüýüüüþýþþþþÿýÿþÿþÿþÿÿÿÿÿÿÿÿööÞûÞÜ÷Üÿ ýýýÿÿÿÿÿþþýýýýüüüÿÿÿÿÿûûÿþÿýýýýüýûúûùùúúúÿÿÿýýýÿÿüþþþýýýÿÿÿÿÿÿÿÿÿÿÿþþþ ôôöîïðýþÿÿþÿþÿþþÿýþüþþúúúûûùþþþýýþÿþýýþþþýþþÿþÿþÿýþþüü"<6þÿÿÿüþüûøûùùùýûýüûüýüýýüýýüýþþþÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþëûëæôæÓíÓ" "$$  þþþþþþýýýüüüþÿþ ûûøøþþþþüþüúüûùûûûúúúþþþÿÿÿÿÿÿþþþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øùüóó÷óôøóó÷ùùüùúýüýÿþÿÿÿþýÿüüûüúùûúÿÿÿÿþýþüÿÿÿþÿþýüýþÿýÿþÿÿü ü)H÷ü÷òóò÷ö÷ûùûûùûúùúüùüüûüüûüýýýþýþÿþÿÿÿÿÿÿÿþýþþýþþþþýýýþüþóúóÍòÍÑåÑ&&// ÿÿÿÿÿÿýýýüüüûþû ñþñþþþýüýüûüûùûùùúúúýýýþþþÿÿÿÿþþþþýüýüþÿÿÿÿýÿÿÿþþþþÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿ üüÿôô÷ôõøòòóöýý÷ÿþþÿþþýÿýÿþÿýúüúúùÿþþþÿþýÿþÿþþþþþÿÿýþýüüûýþüý 7!:úúàóàòðòù÷ùùöùùöùù÷ùúøúûùûüûüüûüþýþþþþÿþÿÿÿÿþþþýüýýûýüûüüûüûúûøüøÍáÍ ##ÿÿÿÿÿþþþþþþüüüúÿúûû%%××þýþüûüûúûûùûúúúúúüüüýýýÿÿÿÿÿÿÿÿÿÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øúûùùûþúýýþýþÿÿÿÿÿÿýýýûüúûûúüüûýýüÿÿÿþÿþÿþÿþþþýÿÿýýûüþüú.M%×רéØöóö÷ô÷÷ô÷÷ô÷øõøù÷ùúøúûúûýûýýüýþþþÿÿÿÿþýÿþüÿÿÿÿþýþüûüüúüûùûûúûýüýÿþÿúúúûûûýýýÿÿÿþþþýýýüüüüýüòòÿþÿþxMÀä IDATýþýüýüúüûúûúúûûûûûûþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿûûýñóôüþÿüýþÿÿÿÿþüüûûûùûûùúûùÿÿÿþþÿþþýüüüüúü/P  22ÍÍÝâÝöóöõòõõñõöóö÷ó÷øöøúøúûùûú÷ýøñ÷ðýøöûøôúýúýÿüÿ   þúùøøÿÿÿýüýüûüüúüüúüýüýþþþúùúúúúüüüþþþÿÿÿþþþýýýüüüûûûýÿýýüýýüýüûüûúûûúûúúúúúüüüýýýÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿ ýþññôéìúûýûýÿÿþþýýûûûúúúúúúùþÿýÿÿýýýÿÿþÿÿÿÿû2T //ÅÅâßâõñõóïóôïôõñõöóö÷õ÷ú÷úûòþöþùüûúÿúúúùýýÿýÿÿþÿþýûõýüñ óûóì÷ìîöîööþýþýüýüûüýûýýýýÿþÿúùúûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿùùùÖÖüüüýüýüûüüûüüúüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýüÿÿÿÿÿÿÿ ñûüòö÷þýýýüûúúúùùùÿÿÿþÿÿýüûýþþþ-J //ÃþÃãßãóïóòíòòîòôïôõòõøõøøðö ÿ þýûúþýúýüýþýûÿýýþ÷÷øùøû ýýüíöíãòãïøïÿÿÿÿÿÿþüþýüýýýýþýþÿÿÿúúúúúúüüüýýýþþþÿþýþýüýçúçîîþüþýüýýüýýûýýüýýþýÿÿÿÿÿÿÿþþþûûüþÿÿþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿ üþÿöõ÷ðþÿÿÿþþýÿûüúøþÿþýüüüüû!7-11ÊÊâÞâóîóñìññìñòîòõñõ÷òùúïþÿþÿþùüúùûúúýüýýÿööø÷÷øÿ  þþýýýüó÷óÝíÝæöæþþþÿÿÿþýþþýþþýþþþþýýýüüüüüüýýýþþþÿÿÿÿÿÿÿÿþÿþýþø÷ø÷ý÷ýýýýüýýüýýüýýüýÿþÿÿÿÿýýýÿþÿþÿÿÿÿÿÿ ûýôõöíìîÿþÿüýÿþýþüûúùÿþýû ý)B33ÞÞÜÞÜóïóðëððëðòíòôðôöðýõ  ÿúúúú÷÷ûüüüüüööö þþ ÿÿýþÿýüüüûûû #ö#×è×äñäÿþÿþýþþþþÿþÿÿÿÿþþþýýýýýýÿÿÿÿÿÿÿþÿþþþüûüÿþÿþþþþýþþýþþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýüþüüüþþþ þÿìì ÿÿÿÿÿÿÿÿþþþýýüüüûüüûýýüþþýþýþÿÿÿþÿý0O ÿËáËôïôñìñðëðñìñóïóøðü' ÿÿþÿÿþýþÿþþÿþýÿýüÿùøûôôöýýýüüüûûû7 7îÎáÎóúóÿþÿÿÿÿÿÿÿÿÿÿþþþÿþÿþýþþþþþýþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþþþþþþÿþþþþþþÿÿÿÿýýþÿÿüþÿüüûüþþþÿÿ  ýþýýüþþÿÿþÿÿþýüüüüûûüûûýûúÿýÿÿý%< ((®ç®õñõòîòòìòòíòóïó÷ñÿ , ÿþÿÿüüüýýüþýÿþýþþ÷÷ùòòô ýýýüüüûûûûûûúúúúúúÌÞÌÝéÝÿþÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþýýýýýûüüüþþþÿÿ   øùýùúýÿþýÿÿÿÿÿþÿÿüüüûüûûüüüÿÿ ÿ!8 ÿÿ½÷½ôñôóïóóîóòîòôðô÷óû2 úþþþýúüýúüÿþÿþÿüþýõö÷ïïñ  ýþýýýýûûûûûûA.AäÈÚÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýüüûûûüýüÿþÿ ýüýýýüüþýÿÿÿÿþþþþþÿÿýýþüüýþþþÿÿÿ ðñôðñôúûüÿÿÿÿÿüüûúúù÷÷õÿ#A ÿ##èèêèêõòõôðôóïóõñõ÷ô÷(  ÿÿÿÿüúùûüÿþþþÿÿÿøøùðñó úúýÿýûûûúúúúúúÿÿÿ7)7¸Í¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüýýúúûýüýÿÿÿÿÿÿ     ÿÿûûûüüýûûÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþþÿýýýýýýÿÿÿ ÷úÿööøÿÿÿÿÿÿýýýùúùÿ -ÿþÿ  ÈéÈ÷ô÷õñõôðôõñõöôöû   ÿÿÿÿþþýýüúþýûþüýÿÿþÿþÿÿö÷÷íîî õøýüÿÿÿ( (%%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýþüüýþþþÿÿÿÿÿÿÿÿÿÿÿ     ÿÿúùÿúûýúûÿÿÿÿÿÿýýþüüýþþÿÿv†Qð IDAT úûþõ÷÷ííðÿÿÿÿÿýýüúùøýýû)0 ÿËËõóõöóöõñõõòõ÷ô÷û÷þ0  þþÿýþÿÿýÿþÿýýýþþþýýþþýüüúûùþþýüþÿÿþÿÿøøùýýýðñòòóõõõ÷ þþþÿÿÿÿÿÿÿþþÿÿÿýÿÿÿþýþûÿþÿ     ÿÿþÿÿúûüúúÿÿÿÿÿþþþýÿÿþÿÿÿÿ ýíííÿÿÿÿÿýüûýýùúÿ / ÿþÿüüãçãøöø÷ó÷öòö÷ó÷øöø )   üúÿúüþûûýüûûüýüÿÿþû ýüúýûú÷þýýûýýþÿüýþÿûöö÷ððòëëíÿ þþþÿÿ+Ô~ÿþÿþþÿýýÿÿÿþüþýýýÿÿþÿýþÿ    ÿÿÿýÿþÿúúùÿÿÿþþþþþýþýþþÿþÿÿÿÿ æå þÿÿÿÿÿýþüýûýûüû$6þþþäþäøöøøõøöóö÷õ÷øöøÿú*     ùùÿ÷øýùøûúúúûûúÿÿÿþûùþüúþüúýýúúúúûÿÿþþýþÿþýÿööøðññëëì ÿÿÿÿÿþþÿüüýúúüýýýþýÿÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿþÿÿýÿÿýþþüýüüýýûÿÿþÿÿÿÿÿÿÿÿÿþþþþþþþþþþ ó÷øû÷øûüýýÿþþþüûýüüüúú0ÿþÿÿíìíù÷ùøõøøõøùöùúøú ! þýýüþþþýþýü úú÷øùúÿÿÿþþÿÿþÿþþöøøðñòéëë ýþÿÿÿÿÿþþþúúüøøùùùþûûÿþþÿÿÿÿÿÿþÿÿüÿÿ ÿþüûúüüûÿÿýûûÿÿþùøûøùûø÷úööõööôø÷öûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿ ùùýëìïøùïûüûÿÿþÿýýþýüü&þÿþþ÷ù÷ù÷ùúøúøöøùöùù÷ùüúý#ÿÿþÿýüûùøÿýþýþÿúùýýüüþýûþýûþýüþþüþýüÿýýøøûúþþüþýÿþþþþÿþþþöøøïñòöûüÿýýþúúû÷÷ùüüÿûûýýÿÿÿýÿÿÿþûúùÿüûÿùùúùøù÷øù÷÷õööõ÷÷öüüúÿþþþþÿþþÿÿÿþÿþþþþþÿÿþÿ ûûùùüìíïüûûÿþÿþýþþüü .ÿþÿÿþÿùøùûùûù÷ùùöùùøùûúûÿÿÿÿýÿüüúúÿþüþûüÿüüýýüýþýüþýüþýûþýüþþüþþýÿúûûÿÿÿÿÿþþÿüþþ÷ùùïòòùüûôöùúüÿÿÿÿÿÿÿÿÿþÿÿÿþþþýûùùýþûþþþþþþþþþþþýÿþþøøÿúúúúûúúùùòóòóóñññðôóòøø÷ûûúþýüÿÿÿÿÿþþýüüüûúúýüýþþþÿÿööûííî ÷÷øþýþüÿþÿÿüþþü+ÿÿÿþþþÿýÿø÷øûùûúøúúøúûùûýûýüðïðúúüø÷÷õ ôöó ýýýþþþüýüûúúûüúûúûúûùúúúþýûýýüüüûööôùú÷ûüûüýûýýýþþýÿþûûûö÷ñóóìíîéêë  ÿÿÿÿüüüüþýüûýúúøÿÿýýüûûûûüûþþþþþþÿþþÿÿÿýüüüüüûüû÷öõö÷öõõôóóòõôóúùøüýûÿÿÿþüýûûùúùøûûûþýþÿÿÿÿÿ öú øøøúúúþüýÿþÿþû ÿþÿÿþÿýüýýüýûúûûùûûùûüúüýüýóïúü÷è   ÿÿþþþþþþÿýýýýüýüýýüüüüüüûþþüþþþþþüùùùùùøûûúýüýþþýÿÿþÿÿûûûòóóêêë ÿÿþÿÿþþüÿÿýûûùúúúúúúùùøøøúúúøþþþþþþÿÿÿúúùúúúýþýþþýþþýþþýúúúúúúùùøøø÷÷øöùùøýüûÿÿÿÿÿýýüûúúùøùûûûýýþÿþøúü öõöÿÿþúúúýþ þþþþýþýüýüûüûúûûùûüûüýüýúöþïëíóÿþÿÿÿþÿþÿÿþþÿþÿÿþþÿþþþýÿÿþÿÿÿþþþÿÿýÿÿþþþÿþþýÿÿÿþÿþýûþòóóéêê ÿ ÿÿÿÿÿþýþþüþýýþÿüüþûûøùù÷÷÷÷ööö÷÷÷÷ööö÷÷÷÷öýýýþþþÿþÿüüûüüüþþýÿÿÿÿÿÿþþþþýýüüüüýýüûûúûüúüüûþýûÿÿþÿÿÿÿýÿÿ ûûúîþüõóûþýû ÿÿÿÿþÿüüüýüýüûüüûüüûüýýýõðúòñøÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿþþþÿ÷÷öðñðøúûþÿÿÿÿÿÿÿÿÿþþÿýþýûýýýýþüüýûú÷ùùöööôôóôóóóôôôõõôõõôüüýýþýÿþÿþÿýþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿýÿÿþÿÿþÿÿÿþþÿÿÿÿÿÿÿ  ùùù÷ôôýýûýþü ÿþÿÿÿÿþþþþýþýüýýûýýûýþüþþýþðëõððøÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿ÷÷öñðþóùúûýþÿÀb]ñ IDATÿÿÿÿÿþþþþûýýÿüüýûúüùù÷ø÷õöõóóóñðððóóòóóóóóóüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ ú÷øöíëéþÿü ÿÿÿÿÿÿÿþÿþýþýüýýüýýýýþþþÿÿÿëçïóñøþÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ýýüüþûòòó÷÷øúûüþþþüýýüúúú÷÷úö÷øôóôóôóòòòòòòôôòõôó÷÷õùùõýýýþþþþþÿÿÿþÿÿÿÿÿþÿþÿüþþþþÿþÿÿÿ ÿÿþ÷÷öë ÿý  ÿÿÿÿþÿþþþÿþÿþþþþýþþýþþþþÿöó÷ûûûþþÿÿÿÿÿþÿÿüýûÿýýýûÿÿûûðððæåæ ÿÿÿÿýþþûùù÷öööóóõóóóòòòóóóòóòóóóõõõ÷÷öøø÷þþþÿÿþÿÿþýÿþÿÿþÿÿÿÿÿÿþÿÿÿýýýýÿÿÿÿÿÿÿÿÿ øù÷  ûûù  ÿÿÿÿÿÿÿÿÿþþþÿýÿþþþÿþÿÿÿÿÿÿøõöûúýýþþÿÿÿÿÿÿÿÿÿÿÿÿþüýýþûûûúÿÿúúðððæææ  ÿÿÿÿÿÿþþþüýüûúú÷ööóôôóóóòóóòóóóõôô÷öõùø÷úúøüüùÿÿÿÿþÿýýüÿþþÿÿþÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿ   öõô ÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþÿûúúýýþýýýÿÿÿÿÿþÿÿÿÿÿÿÿÿþþýýüýýþüýýûûûúüüÿÿýÿþþïïïÿ þ ÿÿÿþþÿýþÿýûüüûûüüúúù÷øøõööóööóööó÷÷ôúú÷üüúÿÿüþýüüþýýþýÿÿÿÿÿÿÿÿ ðïîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüùüÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿýýüÿþÿÿÿüþüûýýüîíþýúüÿÿÿÿþþÿýýýýüýüüûüûùúù÷÷÷õööóööóööó÷÷öúúùýýúÿÿüÿûûüýüÿÿÿþÿÿÿÿÿ  ÿÿÿÿÿÿÿýüýÿÿÿÿÿþÿÿÿÿÿÿÿþþýþþýýýþÿþýüúüüúþüû÷÷öýýüïññ ÿÿÿÿÿ  øúùüüûÿ üýýüüüýýýÿÿþþþüüüûûüûýüüÿÿþþÿÿÿÿÿ  ÿ  ÿÿþÿÿÿÿÿþÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿ þûðøðó  ÿÿÿÿÿÿÿ  ÷÷ö÷ö÷ùúúÿÿþþþÿþþýþþýýþýüüýýýûýýýÿþþÿÿÿÿÿÿÿ   ÿ %$#ÿÿÿÿÿþþþýÿÿþÿÿR|N$þþûûûÿûüüüÿþÿþýþþþþÿþÿþþþÿþÿþþþþýþýýýýûýüûüûùûâúÜÝí×ûùûüûüýüý''88ÿÿÿÿÿÿÿÿ üüý öøöøøúùùúúúüüýþþþýýüýþýýýýþþüýþýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþ üþüóïÿÿÿÿ %% ÿÿÿÿÿÿÿÿþÿÿýýýýþþþþþùù ýýÞÞéé÷ù÷ÿÿÿÿÿÿÿÿþþþýüýüûüûúûüúüüûüúøúúúúÿÿÿÿÿÿÿÿÿÿ þþÿ û ûúûúûûûûûýýýýýýþþþþýýýþýþýþþÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ õñÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿýþþüüüûüüüûýùøùûûüü %%%%ÓÓìûìøøøüþüÿÿÿÿÿÿÿÿþÿÿþÿýüýüûüüúüúøúüûüùùùúúúþþþÿÿÿÿÿÿÿÿ þþþþþýþþþýþýþþÿÿÿþþÿÿþýþýþýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿþý  ÿÿÿþÿÿÿÿÿÿÿþÿüýýúúúùúúûúüóþòúøúøöøÒÒÔÔÿøøúùúÿþÿÿþÿÿÿÿþþþýýýýüýüúüûùûúùúüúüúøúúúúfF5õ IDATþþþÿÿÿÿÿÿ ÿÿÿÿþþÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿýÿÿÿ ÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿüýýø÷÷÷øøøøúòþòøöøÿÿþÿÿÿÿþþþÿÿÿÿÿÿÿþþþþýþþüþþýþþüþýûýüûüûúûûùûüúüùùùúúúýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùú÷ø÷þýþþýþþþþþýþÿþÿÿþÿÿÿÿÿÿýýýýüýýüýýüýüúüûúûûùûüúüúùúúúúýýýþþþÿýÿÿÿ÷ù÷ÿÿÿÿÿÿÿÿÿÿûüÿÿÿûøû÷ú÷ýüýýüýýüýýüýþýþÿÿÿÿþÿýûýüüüüüüýüýüúüüûüûúûúùúúúúüüüþþþþþþÿÿÿýÿþÿÿÿÿíôíÿþþþÿÿÿÿÿÿþþþþþþúøúø÷øüûüüúüüûüýüýýýýÿþÿÿÿýüýþüþþýþýüýþýþýûýýûýüûüûûûûûûýýýýýýÿÿÿÿÿÿÿüÿÿÿÿî÷îþþþÿÿÿþþþþþþÿÿÿÿÿÿ88ùùùøøøùùùøøøùùùùùùþþþýþôþüüüüýüûûû÷÷þþþýþþþþÿþÿþþþþýþýýýýýýþþþýÿþÿñùñþþþþþþÿÿÿþþþþþþþþþþÿÿþþþýýýûûûúúúøøþýþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿüþþöùöõùõ ýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿüüüúúúüüÿÿÿÿÿÿú÷÷ÿÿÿíôíþþþþþþýýýþþþþþþÿÿÿüüüþþþüüüÿûööÿÿçòç""ýýýýýýýýýýýýþþþýýýýýýýýýÿÿÿûûûúúÿÿÿÿýÿ ú ìýìùé÷é÷ú÷ ý üüüýýýüüüþþþþþþþþþýýýþþþþþþúúúÿÿÿÿÿÿÿþÿ{§^Å IDAT üþþýüýßíß ýýýüüüýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþÿ ú òòúýûýãóã+ü+ûûûüüüûûûüüüþþþÿÿÿþþþýýýÿþýþÿþÿüþýþþýþþýþÿÿÿûûæñæüüüûûûüüüüüüýýýþþþÿÿÿúþýþþýþþþþÛðÛúúúûûûûûûûûûüüüýýýÿÿÿüýüýýüýþýþÿÿÿ÷÷ÞïÞúúúúúúúúúûûûüüüýýýþþþÿèüèþþþþÿþÿÞôÞ þÿÿÿÿÿÿÿÿÿÿÿ  üýüýýüýýüýþýþÿÑîÑö÷öøøøùùùúúúûûûüüüýýýÿÿÿÿÿÿÿþÿÿÿÿþþþÿÿÿÿúúúêøêýýÿÿúûúÐíÐ55ÿÿÿÿýÿÿþÿþþþþýþþüþþþþþþþÿÿÿÿÿúÿ û øßüßñüñÑìÑ11ÿÿÿÿÿÿÿÿÿÿÿÿ øõøýýýýûýüûüüüüýüýþüþÿÿÿÿÿÿÿüûûû ëñëòòþýþîþîÍíÍ1ÿ1ÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿ  úúùøùüúüûùûûùûüúüýûýýüýÿþÿÿÿÿÿþÿÿÿÿþþþÿÿÿþþþþþþþþþýýýüüüüüü$ $ÎòÎüüýþþÿþÿôÿôËñË*ý*þýýýüüüÿÿÿÿÿÿþþþÿÿÿúúúúúúûûûúúúþÚôÚûùûú÷úù÷ùúøúúøúûúûüüüþþþÿþÿþþþÿÿÿÿûûûûùùùúúúZ•H IDATüüüü%ù%ÖöÖþþýÿÿÿûûÓøÓü" "  ûûûÿÿÿþþþÿÿÿÿÿÿþþþøøøööö÷÷÷øøøøþøñïñøöø÷õ÷÷õ÷øõøúøúûùûýûýþþþþþþþýþÿÿÿÿþÿÿþÿúúúÿÿÿýýýýýýýýý ôûôÞ÷ÞþþýþþêêíøíûÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþùùùøøøÿÿÚùÚ÷õ÷öóööòööóö÷õ÷ù÷ùûùûüûüÿþÿþýþýûýÿÿÿþþþýýýþþþüüñûñøûøõõÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿ  ){Ö„þþþýýýýýýýýý##øûøãøãüýüýêêìþì ù û  ÿÿÿÿÿüüýý ÎÎÞãÞ÷ô÷ôñôôïôôðôöòöøõøù÷ùûúûýüýÿþÿýüýûûÿþþþÿþÿýüýüûüýüýþþþøøööÿûÿÿÿÿÿÿÿÿþÿþýþýýýýüýüûüûúûûùûûøûúùúûùûüúü P0Pÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿ))ìÞõÞüýüýööøøééÿÿþþþþ++ ÛÛÖêÖõôõøôøõòõôðôóïóóïóõòõ÷ô÷ú÷úûúûÿþÿÿÿÿýüýûýûÿþÿþþþþýþýüýýûýüüüýüýÿþÿÿÿÿÿÿÿýýüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýþýüýüûüüúüúøúúùúúøúûøûúùúüúüùùúúúÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿ''ÙòÙýüýÿÿÿþþûûüüýÿýÿëúë¼ú¼ø÷øûúûúøúøõøöôöõñõõñõôðôõòõ÷ó÷ùöùûùûýüýÿÿüûüûþûýýýþýþýüýüûüýüýýüýþýþþþþýüýüþüþüýüýÿÿÿÿÿÿÿþýþþýþýüýüûüûùûûùûúøúúøúúøúûúûüûüøøúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ##ÑêÑõûõþþÿþÿþÿþþüþýüýûúûúøúùöù÷õ÷÷ô÷öòööóööóöøõøùöùúøúüüüÿþÿ(!(üûüùûùýüýýûýüûüüûüüûüýüýþýþÿþÿÿÿÿÿþÿþþþþýþýüýüûüûúûûùûûøûúùúûùûüûüýüýùùúúúþþþÿÿÿÿÿÿÿÿÿ99ØëØâóâüüÿÿÿÿÿÿþýþýýýýûýûúûûùûúøúùöùøöøøõø÷õ÷øõøùöùúøúúùúÿýÿ$$4+4$$ üûüúøúüúüüûüûúûüúüüúüüûüþýþþþþÿÿÿÿþÿÿþÿýýýþýþýüýüúüûûûüúüûúûýûýýüýþýþùùúúúýýýþþþÿÿÿ-- ÖêÖêöêÿÿÿÿÿÿÿþýþþýþüüüüúüüúüûùûúùúú÷úùøùú÷úùøùúøúûùû  +++"+ þüþúøúüúüûùûûùûûúûûúûüûüýüýÿýÿÿÿÿÿÿÿÿÿÿÿþÿþþþþýþýýýýüýýûýýüýýüýýüýþþþÿÿÿüúü8 8îóîÞíÞåôåûÿûÿÿÿÿÿÿþýþþþþþüþüüüýûýüûüûúûüúüûùûûúûûùû  ##"" þýþûùûûùûûùûúùúûùûûùûüûüýüýþýþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþýþÿþÿýýýþýþþýþþýþþþþýüý )ø)æïæçóçìõìúÿúÿÿÿÿþÿþÿýÿþþþýüýýýýýüýýüýýûýþÿþÿýûýüûüûúûûùûûùûûúûüúüýüýþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýüüüüüüûûûûûûúúúùùùúúúùùùúúúûûûûûûüüüúûúíóííõíïöïóøó÷ü÷ýÿýÿÿÿÿÿÿÿÿÿÿþÿþþþÿþÿþýþ   æ®Ó IDATüüüøøøùùùùùùøøøùùùøøøùùùùùùøøøùùùþþþúúúûûûûûûûûûü ýýýýþþþþþþøúøõùõúüúüþüýþýþþþ  ÿÿÿÿÿÿþþþûûûûûûüüüüüüüüüýýýþþþýýýþþþ ÿÿÿÿÿÿÿÿÿÿþþþûûûüüüüüüüüüüüüýýýýýýþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿüüüÿÿÿþþþþþþýýýýýýüüüüüüýýýýýýýýýýýýþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýýýýýýýýýýýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþýýýÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê<ó IDATAxÂ[ IDAT¦”)´$IDAT¢Ö ‰Ú¿WIEND®B`‚rgl/inst/textures/sunsleep.png0000644000176000001440000024216611257014117016304 0ustar ripleyusers‰PNG  IHDRÓ?1 pHYsaa¨?§i IDATxœL½[’$I’#€Å<û±³{É=Ã|g¦»3LذzvUQEf¸¹™¨ ^ÌÆÿ÷þO$H‚`„$BÐpA#" pÿŠ ЈJ ƒŠMh@I_6ýe¢#ŒèX˜TH;#0‰xú¯ÄÃd8 ‘9z 8`‚v$ b¨s pÌ0A1! $€ Iã’8#eB@€ €€Hr.)C°ŸŽã ‡L|5‡ÀG®3Š˜’Óx$Á81As À0€€¹ À“K2û€ˆ‰‡t à‰»6_`Â$@L‚—“„¤AÛJŒqWšH’pˆÇÐqp‰€ºïÆãRr_Íä1uq B. › AGÁ )×¹ \ZædüÍuî'ÙÜ­| öS]¸2=À•aÅw,Ð>@IBI7vIw‡ €kˆû#¹‡$„: (…H,1Éî£4¨$=o!ÄsDÄ B1¹Ì94AÀ!/Á`Ð8p0Jˆô…%ªg¢‘Ií§y”D=QÓ_"-ò&"$ Hr»ßB®x@¢Çæ&â!â@ØÝ/:``‘Ágè\ŒlÊ€Z®GLLf4 8éYL2û.À°ˆ}Ȉ„¸… Ù2•VÜîøD!„‚øPû¾NvÛ÷àŒs© €$ÁQìz ÌH"ØÐqÒ' "f =ÁºÎ ñôß̹ IäZN®p¢¯ ¾³C% Dp¿CÚ[}L‹*‰¶‡²b‚KÂ-S0£Á!p2’ºàÂØ‡'þ.)€Ñ% ’P­é‚æ"IÙ'dR$ˆÝôîsÁÖF0¡„€qϰõLÌ•{ü»ˆdbD"/Ã=œ—ŠB&…È´>ó½­zj ¼Ûˆû ©Ir%"¦†$ì"&s'CeÀôô„@¯ÌÚ½ Çp„ɾlZaŒt­âJ†ì:ïÕÛbÏþB¨=ú± 'ƒ?{j{êIÂŒ…®7D$"9ìÈìŸ$hñ"ÐãJ2dxÜýE¶Ó›´›Ÿp@ò#3ÁÓuÝß[åŠ3ˆÿÄ„h†ÁàXÀ!<<°}½wl0!`Ò«¸à8Íl}6ç!(ÄÄœK!ñƒÜ½*lyà¡‚l‰0£ÿ†’´œ’¼A€xm Âpøí‰Byˆ+ŠPH‘4G¦@+Ét-)ñ †÷Šˆ:ê¹° À€ð¤"­(€©½rDHÓâ!HÄÚM€E]$Ø…œ¾P.[z‹d$ÂÔ ;DŠp 4ö~“öBà"¢^Í&ÈÙ£DÉÔk“t  v¯b¨VÛ«¥\ˆA·.I% (÷þ"€âÃ+¨Ë•$ãh€|ö¤È q^ðˆ—ýkÉöh šDî„&âˆ}®Œ3Ôí#ÜäIW—!‹ô¢F=3 ”+ÒáÙC‹$Q_Æ’r¯?‘q»¹…ÿåhà¢naÐúb‚¾Ä‹Ö ÌÌu’Ht I‰#±o~@"W|À0Wt‹ŽG"ÄÝØw¦EŸö33¤˜,’Å0!(ʸ3Bb\E9$œX3A¯‹Åã‰qË?à$é¶@a}»#’Ê¡âbà3LÂì"‚Š-q†Àà½hûÄÀAÑ #¬ø×Áæ¨xaï·2ß>Ç_ô¸VÀÍ펎­IfÄ[°¡ˆrÊ1˜ÄÁ€æÞ]Aá[’˜4‰z {ÚãK~Ìï„A~€£/BÚ­¬àAQ¹©€š®Pø¡Bï`ŸHïÕBÂÂetÓðÝ·-d&CÙÆ!êøÏ•jY}!Àƒ<4â¹ÌôäS€Ãð=LzKü -¡€]#Bî–ýï5ˆDêUÀ6)Ç {‹¢Hp÷œ„aüÃÞ}Bo.†"¨€“â,kŽ Áté’^/C2#!̟€iÙv–K³´•}¼b¶¢¤¨Þw}$$ž@³$¤žêg2ˆSæ!F¤ÜÝæ¹4†ÒàI&Â0Ù …,û^–0ú$Ž«~6îõ©®Ud£0Œ3[C•.dEw4‚RS‰ß×ëú‡&‡Eß¡H3d7bD+Vdb¢þ# Nü‡¼Ø'Ñ ™¢/®8-õ€'8ó±3)§ìeôSnM)QȽ™°w )Úzªsî·¡è|D‡€ 1ŸÛKºè7}^˜§x™{È!®Ýû¤ç "óö ¼Â‚„'¦–MIÝ-™Ì½)Í^A€#ôF#‚E`’qv-%óÐpéš®o˜2ö@©tZÞ¶P£?7Düƒùc{8$i‰y€#½H=ïåÛÿ ¤x~ËÂJ¨¥I.RàË«5Úâº+(2œî ” 8SðëÅ61bQQÐk}“z’Ïb_yû£+!àÙÑnp0ŒqÉO7‘Kò•`Ã\Õ&{¬„Ø{õ~f¢”9F/Ϫ[4 ²²X’û.Äs ¹z˜§X‰P7Ú4¼Õ!4JDEæÄ!+ÿôï8 É”Št$³8MÑB ˆp 'ŒóA,–ªŽh˜Ã¼=ä ¼b dÀeÏ–™À(1À%‰ä«ù%wÄ€º t–'y™B:˜‹;¤ÛÉ \hdBÌ&¹ð!A{yŒ<Ð~8 Mº¿áÑ*J# \Â~FÏ á-š.Ö%’Þ˜¿\°=ÝÀa|]¶îDŠâ½¯ù‚"„pf·öÜL)W,%¶$HÉUu8Àˆè)¼f¯Ê­˜„ÈçB¢ÈEä ¢‚L‰eÀp8–BrFÌ#Í“wØÿCrH;²)É„v‹Â•â@ÞG·Z¥RNoxKéO†žRä]Ÿ¿m5\ÆãR>¼Ìº"±Þ—¶ö·ä'"ÈÈr•Bu´²s¸[:3ñí…—Ù» hÍ&!ʈ£Œad(„aE þ@®´×ݦýsŠ=|à_½'x;ѽž) ' pC²Eß7ž¶ªpÂçæå’9Z-¨ä€T(åšÔ6nºZ¾U9-V%1äI€ÜÐÄ™ù|«„¥½!’éŸì¨Ìa…‰ÁQmà AN•቟G9SÕN¢Êj=_̨eo8S¤.ø½t†€}g&¯Æš 4¥è¬ç§ÚM—úS•}DDì‘0è;.*&ß«…UbxsËoø^!´^_Õ.<3elå|ŽUÓ¡4]3qHà!„ÇkãF?ê‹û©iT_¡| p@û®JÍ8]È%Ø#Ö BU±«Åƒ±SPl«¤5©&‘H²M˜$¢$©fÏP¿dVŸ ÉëТ|&‡ÌceÕ´òP©ùf©ÛÔ¿»I+$AAL¨ÜûN¬qDUçò) vøéà×½cZ±Œ*¸o/¥Š_fNËDð9x€˜9/ѨұFÉ+ÅPÝ­'·…¤ÅC¯K+ñæ«U¢+kÏ!/"ªS¥›UkMúþŒ¦2ÂŒ‚ˆê¥˜P‘ÃI%„Vßþ²%ßÂhâH(MO2ìî!èšs fo½Úw! h$nUq4 ‡FèÝph<#&â’²b,*ƒU+J7W-¨,§áBTç§pÁ¡s ÍÐN’Ñܬ㻪#^_ªpµ§=kÚ à{j'„oú¨YeÍ|Ù‹c¾îÇ˸‰µƒˆðf·îh™îŒ˜»‘“VȺ°ÊBüâx*¹pùVUqjUˆº¸q…¥Wb_Ùêë!Ì€s@à$J…Àä•´Ë›X×…ðø™Q\-4Y.Ó0B/Á¹a΀­;VbR­(­º ¼QàW%ƒÃD”T?´GÅ Ç®†7{}¬Ì’UpÖézUcijpü°·zQAYª,VpDÌUé"UOÿ–Q¼µªV[Šdkëzã:-Í ŠÑTKà y™ÓšXm•¬ÂÓ=C,E^• {jëüãFKÏ™@_µš9Ý×¢«" kßz—[p}$`[¯hf`‡û2ÅS fqÞ‡à8Ê«Õ`º½‡È ¨e„x5u”„öâ³é5ü&‡ÇðI$þh*Óa+ÒÏúÿlÅÍðÒÀô<Íåý¸¦5熂гÏ3¡MÓXcõðâ¡ÐñÌil¤,[äiV„‰-&÷é®-b£«â«’í·”-Î ½dë=¯š m^ á!‘ªÉ«ä“B­“Ô?vÍ@ z*˜—Ähz³¨¿KéKäA²pò!ã«¡1Œ)õ¼HòdQhZmÒk×vØ™T%—Nà„ò–ã-µ„+¿HÉòïS;ƒyr+Wm¡(Ü tõÖǬd޽;”S¦‡à f”\úè ]šƒaëá]´FvA<!ÅIn†Ë>¬›Ò›ê©îl bF¯r@ø¢î‹Ç ÆÄ$AþDë/ði˜¤ÎM3’ °FS˜´Š8ø)¡GîKÐëpêÎÔö&5 GÏõP­±Êu͵ ZoY_ÖÊ:MÀc«jb–”"¶ÚÝ:Ý!$°nrÝKW]øj¯Â°É‡{¤À•й&Šf~+Ë#Ž—º”ÝY”ß#áäój~Ä%0Ø"””Á&ˆ z º½þ¼&nS–ãÚ7x"ʧ¶k«½Š>•záJ¬ŸDöÕ„ž¢Í4ˆÖPƒT|Ú*¼”›nQ ÀÇ©–²44FÀ 9LÑX³DX'ëWô,ÕZ@Ê,»h¡IpQ!w‹Š©?¢z~ήz jõÐ?P—‹ÑQW|ð*챩Æ+PÒõS—s†ÎCu ³Y‰Uð hB(ÃTƒZG’[rQLF2”a„¡zP)$@Îhn"dzX—ùWoì/£º ÖBCÕ”Bá€øPøÆ3’Ç ”ŒΛÜÂËåº!´îhI3«Æ~‘¹Æeë÷Ë«Öö Ð1K'ä gÞ-! #!ó0“j•ÓÅ*Ímí&øTºn­Ž'xC^à„_ÂñÃ&{À†Êôß,R5fV ‰8Xq%í`à8âY¬Ù\C”…tÏ"ȈÃôH•ßt™jåf÷4QÂò‹#ÅÅ‘´k×ÂÒÅ_áÅ5»²¼¿FVœÍ?À*pÅôp£m€…XïÁÃÂ)Ñê*y›èR3Ö~¹‰Óó,ñ±ÉÞÖM¬¢:O•s¶¥qïÃ>¦½-]ìÏAÕ©eaÌi=àäÞ‡ƒ‹Ëfî7?†MUò}ƒñK6+JC¸Éô6©iÔ™é¶ÎÆîÎ4/÷½Üš‚!iÍ ÒÃH¯R]Ö¯Ǹ›NýÆ0ó¹ÉŽ™MXPþ¢Þ®µ×2v4·*%þ³‡B}Û8à†ˆÉÒ…E¨5|‹ ~µ®½Ý„àhÒ,ga‰FoäãUl’È|NÃv¸ý9 Ó' <ÈPë›P§‰¹p8„_D<^í¢{\‚³Ñ7Šò½Ô&L[bÞóÄÍ?‰È@‘*Bsî`zBœ‡9¼Ç-DBN%`Û®‰æ‰›ÿ¾½­À¢ÒÄoæh¤kóÍà¶Ü 'xÀ¹ºÍœŠ%ÝTcLèîÐÜØG¬¼ ®Ù)=;‡ÎƒˆÂXe)X忢šlZ›§ÂÌ#®–ŸáµpAˆzl*Æ(}3º“’ßZHƒ¤T_ɬ¦l\`±b­‹„©‘¿Ñ09<<^x - .UØ&Áª…êëøGW½èºqËn[n·i¥¤}Ý4,¦„á"xâái^X ï+¹«›î`Jjùðµ)SåŽÇ¹µ} jV#C|«ðôZ¤ƒÒÊ^‡Íø.Š`ˆ ÏlÎrh×àaeZ¿ˆ®ÊRã)ÇN²­&ØÔç­ PD ±ÀiÇÄÞ¬›-ˆÀ-3( 0Ô¯BÍP5ŽÜÍÛ"RɸÁ{s4jeЧb9¯t˜øCµ×…$®‡|˜Øl¨fy\õV¸éˆâ•ЛÓuÖM‚æ¿¡M¾¢g³¨ïÛ8m˜ÙsL“7÷GÕþ.RA ‘øø7¼ýôŒjfƒ¹o—‚I¨P!„ –"6Ða§‘­Ss.i->,bR¥Êj ï>éj>ÅWl†«\–ÚÇÍ?ë·b—ïj•÷…NaÝH”Éorºr¹—“(YkWÊ6ŸŒ^:u°ÒEßs÷.Û†Ú$ Ïß`¤‡â\²,t÷šK(¤vT¹Éæ’ê…Õÿ‚ÅÆ€7‹ØV™î ¬År˜¼¶©È_Œ¶-v,yEÃh¥…n),U~SCé’ýËàÿï©ö‰ß›“Ré¶zzßh˜ÓƹØɳ¿7ã+\ ¦´aÁru'‰˜röÿ~º€ÊÀ“C­Æµ~ ²é²Qðì6Cȯ©Æ–ìÒW¶â ŒnˈëjµÍpÉ墊ý-9»$'ñeNDÂÄgôøVˆð뢴ˆ7skëX „;VLnˆ$aøû“Ac Z¿£èj›‹ *®/Z€°¢>®õ»ÏްúaJcÂÛ¹“àâ~(vo¤H'Ûз‚˜ê¦Qól¯Òj$î›ÏkÞ´¯‹DhxÞƒ}SiŸSùåªï^k¼’Gl˜£ï1>ÉpÛ¯9@5’ZÐWBE¶D§'ÿŸ´ò(|)Äyµ~ °&`¡]<ZÅrIµ+Kzsx,i)ò&J‚Çš_­ï-ˆ±½í±n.—m–*‡©õ™%g{2WP£-¹lP7wr$i2¹"˜+ƇdT!ˆÏu…öu¶Gç†ü½/ùâò‹|"O’¥dmâÈ!1Ò¾9qi® –ö½ÃNx{ Q>èâ´n•¯µ’V{HÚ+“¤Ò ’£ ´µ(Ö11¾£Yœ>Í&[Tq°­5ñ¥Ô'_E•UñÙ,KE?ønc“‘*EÞD°ñw0ëºõG*£É%ÕhûÅáÅH¿Úuµv¤NÞû³ÿŸ°¥>”mˆd\…æ6€!±ÊÐ|¥ ÈúÙk©ôÒnCßê‹x–§§t ¯A[Uñ#º­†Ëï i'J>Ð¥(p´¦¸WE¹e7Ü'n€?˜~ÖuG_0€ñá ýt”Å Ïö ð~Ø„?$æ:¼{¸ûDÖÝc¼Ä`D$ߎÏî¾ë˸WXƒµÀƒ‚!ɵø«â­X'’ÞLÍo"µÀÕ_`Žì»êò?G¿î2Þk]Y› 55ÒÛß<Ìå[Û¶N€h诮Ýà[À³œ¸Y—pà ª’ö:lM<(°ßèKÕÞ&‹«áénî±î~˯‹±êÚJÄ ›ZC²ŒÅÃi¿ ª÷ä¯îþæØŽ•5Þnìa+¼X(oÒ¿|@ ¥vf\P)Ì0Z¸ÆÅˆNY IÝ| G ó𑺀ÚN¯k¬”LÂæ@7ês€zЬœPU¶éW¨ä ZÐÚõC|Ró8™süú&—¦ó¸P0BޝC\‡Ã{ Kpß.ßãÙöòŸ¶©°*”óäq)Ù™ƒ·„‰Þ^‚S{¢¹b„FÓ€73Tà”˜1^÷­ÕQ(ÛX—ÖljZð—Ÿb7éàomV>TKÑ%.¢é`&«¸4¡––ÎEN(á,š>a3 t½R¬;ÔT© ½}xi¥Yd³+ÕØÓž‘¬ôĉê†8ÁUAÛ?7€ˆ“Ë /=Ë‘`äÃiÛð€äF‡ÔÈa4Ô|4à$1/É\iG›OQn´äۂ϶ôO5ñ´¢6™°¡ÿ”“Ä øí}~1Êõ h¡Æ2öÙˆÕoÛö^6à hä¨L8#üÔäd#U:a õzvžÁ…¿óý\b®×$5r)ø:.­Ú«oËoÿ¢êáů §MiüÔ/I³ýO³5­µ”]NÓUÿ«MÿôSGXc"1çT“™päöh.Öœàºeô#¨Ù¦ ®'n<3ñ?<ªvLí¹ä’Æn©[âù¼0¬~aˆYo^-S·ÿÖi5½PÛa¢ö¡â .ò3jZ3¯¯D0û—V︯ò7Ïá÷ÊPU×Q’©É.D²Ý'íqi‚ö’½Â\<3êé9oć€Î×yXÇfW!ax`.·¯%Æõ›·’Qò{ÁIºØV)'lþNÀê&‰¸¸Õh+A Q'à¤}p¨EBLçÁ0¹q¯KÄ+·¬»P¨èⱨ«*þlË ˜!4—À à¾Y?geåÞ‰—ÉEdFgPõÜgzò1ŸÚ61)]CÒà&|Ï,‹Ä¦Êz’s°à»’@U4ÉU½€ 0³ƒŒe|9¿Ž\\JŸøi§“I»<.à°ÊÏ$W 1•JM7gFXÁݳ•‰šö!" iκD'ë¼}ýô¾lâ†Ê¯> F77–¹:DRh{£\.Öåy‹ËЕqY¯·ˆP.ÀÄ3H *±]ÞEF©ÒZdšf ûfŸŒ”hħ ®yß`ŠA»ñ“w¯bUq¬ן)Ì‹+u)¹¹…†vÀK´©âÂÑô¢È½UójÉ÷Ú\/Ü–¹®Ýõãya&xbÔ nîe¼–Kíú¹Œs®o½"£±ïO¨{ýEŽôvÚ”ãC¸‘î \ aA=×£ û£Ùö›H,4D…Þ¤ÓJ*€ÚžMN¶YÉ/2¿xÍ| ¼íßÇ5µ¹”ŒŽvªàF\“oØËš7ý'.ð¸í*ð»¬bÄÀ ¼Ø¨ÿ ›ŒgnV>mÖ·jÓ'¹Éá|ëiô¬—8 &ùåYµò[@»œ©­åíçÀ™ Ì«0áE±Ú7ÙrK쀗nå¥! œ3‹Ë’ö‚4]›öF4¡±2Ù‹¾´ÊrÛ?Üð`1š±Á¶û&*Õ¥œ°n-Ö14vªO‡·HdøôÞp¼úÌ<|”!Ú”}Û:ëܪÜN0µE’Ÿ6]%ã°†äÍ)·ÎÂǹjïP´ÌG²3Ñ“gò•0ä÷ù^RäÎí²g8NNÆŽÎ>º&@Ù dó"Þ¹ —gßX¡ECZ[+·xÞöíso0ºÿ%èX„ægU±iÍ^îÊÃyËÌoݵRG6itü˜0n×eñôqät§nß½Bb½Á2òXP'–›ÈCOþÑ„²%üÝ­MAo±¬ò3dÝÖ@hxž$·w§w]”ç‚ãÜPp,æh’|Àà*ƒ4¦pGÇ’ÚTTnv¥d’U3w·Q§ Ü\³:NâÂÓY.â¥e¿/Ýõ~%à7›§B¼]9ÛmØòµîЛéL'GU6]4ká#¸nÅä}ÓlºÖ†¦S®¸Ó•=º]ð?™©àïëæË/èÉM.ä2ðvÊìûýÚSÛêÀmÞã6âÄÌ&*N øÑÄ~m—KÖ«ìg?#y{}ì.¯» 6»`«Íbrü„›F Ÿ ØõN#¼Î¼¡štÄæÍØôÖY¥à¦ÊQ­Ò×ý¶½%aÛÔÂ?ÍÓà“¤´ÿËN¯c×å{_£Ç ü Ó€',¨ŸL£ö¸ž3¬wÜrâíKàzb·_lù.dX~ÚG'‰´Cç7ÙOÞ¹Éo:Z;èÕ ¿ðÔzÛFv€CÙx¯ûòœ7– †Õ‚-—-=Àï|º9ÑØ‡bpÐrc Èõ/úRÚÇá¾ ñÄéT¤dÞ 73¸›`i/iÔyM«+8üì~]ý‹4u)êN»ö,9rÉwvDݨÅîÕLŠZS~·;òö!i§:ÒÁÖ IDAT}eáïFš—sL—‹ÜØÂ}ïó\ßÛ¹Tû+X±›à\©¬˜¶ºÈ¡ ߯ û$e?/ˆfÌb,b®o…âÚO«A–·§­€¬<¥±øË¼ž_ƒîIâ¦e0±7ôާ.¹ã‰ïiޝrÒT]Éó.HÔª8M ÛbËnë d ¸³ºWÞ,g‹×?ù··Æ×_ªäaU“z ùÕ\ex´y™Át~øÒ½„èŽYw¤d›«n7ïëNU«%¡ûÎ ë•ÿv/ÊÆÜÍ­„å%¨4Žl#â+0½ên2jÁŒm a¾î±Ñ¬Š¨®n—‡OóíÃKνñ›:Ø·¿“ÑÙN¾Ë¯J•%Þ´À\Ù`õr‚è7VˆvÕìGDùq\Ÿïn&íy²4µêy7ÒqÖhk¿žJó†Ô9Ì3,?\Ø·±ÒÜñ?"™üÀ´‹êu¯“Go[ùâscL?v3ʰªÁpšGà˜é€b≆sšÉiˆÃeŽ™éŸ^QUuˆåŽ‹÷¦¸·ÃCõ4¾›dWå @i…°}’{kˆ¥»/1VÃŽ`ëÍÐ$^LŠ‚I®1ÃUŽê”áâÅoÈ6pù†ÕÙ[zù?÷©™AgCì‘lSd;¾{iM묚»WÛv:j"¤Îƒ-Ã|»º0­qÛƒF⊶7 rküV­¸Ø÷@Mðnë5´áFŽ;b9ê ŒÖî'~¨§Ñ_ç:<Øtݧs–™?äd<Ð7Ö îfÎÏÑ×W‡Ï¢»ÆGð)Žß¿‡a¯Övxß™ùÞdÚº¾ÉÅ“l% eÜæ¿ÏºOí6ÚÈÆ[B ׿ ÓLÆðæNò§ú6(AòBÛæqp:ƒNÍeMÑð« £Âén/,¬SÍ'Œ3È—)l0±ipiNám=R,žN©ÁQ„Ù½ö½¢Ð„(š¸ÛÊAôqßߣ ´­ÂÄ¢6ŠKj/ƒì¶n?îGí©èp$ÒzoƒÆ~–P$L{ßt³é ^qµ)©]”~:I4îh^äUåtÖ O%N”;ÀjÑ%÷ÔVW$˜^¶qǯ3·¸MF-ÐqEolAËaû(E¹^1ÛýËA¸->„é±!D~ù¦AzÍõFW|fÿÍíyÉc9h‹ls_#¶6Pãþ¯‘:ˆ@OE÷L¼ƒÉPC— ˜áú\Ú;! xyo2í ©‹‘9rC»©[7ÄÎæŽWþê}Š“¦1CU„2sðÊÕÀ6Së­xì,*II7hg¼|Å:pÆw#¢ìð÷šåÈ6°}‰Ù²îdG¸´M¤ÚÝ@A«é}³íUê2{Ö @›XúÈ‚.m±p´¦¼ÛtD€å9Išæ%Á¡ø‚ÄZžô*¡Bo»a ‡â¥ž#•¥t¬|!7}vC¯.Eƒè¬J(Và£RAž×·xküˆcãÿð|z§Mþ Gô\žÙ© ÉaB|X~˜.âOÓfAäU À'Dî2y†²Ÿà2ú¦mUˆódȈf|}}š›Sã1CÜ#8:Æ÷†hUF^íb3ž¯¦àwãC?I.òÉ<ñ!ÓApƒv ®Lðįæ$çcJ”.»ß§1o¢mÝsLj'(‡ÿèÞŠ …;’9 pܱêýÖ‹Nº`Žeâ @…©\Ý ^èØ(JÞÁ€§heGdQªW I8èè©F-”ïê=œaÜ1qm\Ö¢±ÛÏB0“~»dfl‹&Ç`ãßý½b¥+̶ÿ#ȼ“ïáväóÚ£ôµÓèʉß+;¬…o24é¼ÞÎb èvA¥¾Iß]Gþ‚®Žå&šèj;H"l2bv6©àÃÊO÷Ì“÷Q‘R7Ä@÷qñÀïðüæ^{n,~/î¯ñ°cåñ\ª)fw@g½ÌŸ²Y«[7×Åq»[_Ü4…ßêkê‡ï…Z³# üš¿×ìë•p§ã“›ÎM§xä¹!pNy"…´£ˆUÆÕLN¼æ:£7êFi}M¢ŸÑ#½*ÌŽÚ óU{t·¢øáI¡)0t›,6çwtªXˆ•¦Ë"1c¥[á¨üF‡†™ÿ‰Îï®13¯™Ï:ZÝœJš¥=›Y8.i¢æJ¹¼5Aë évË»È32MD­¤Ñ”Nà÷ø¾J`Ûv¶VVØiNf“ôm2yuWòÓˬCy.ÈY)H$ÂAÕ†©P1hÜgÂÙL@ǃH¸ŸZLï`…~­ƒ;L±ù4zvȪ/îœÎFŸØÒLüóÛ÷˜·ØØAóOîtäw%Š L"Ú®ïáûÒÉvü_âq:•£ÍÓ+¤‚`nÖ–©*W\Év¢D76hœà¾âJó‹8‘è›U•…ÛÙ$˨ú¼í̼Šî’ÌF")öHó<žN։⠄S”[elsXÕõº7:[5‘ø¼ÇNG¨bÅV4âßþˆ† r¸ TQXÊW¬iÎl2ºÔ³3ß×BàëG¹³HÖû¸” ¼ ñÜ¢^H½µ‚A‰\ ^` ÒÌ'¹’„ÛcÉ-Q¦µ0šÄ*þçk^¬1\;ªüÁ!žœÖ@°ƒsgN„H„’ÐŽá$ài¯$£Œ _êœå˜ÞÆ«»f +\Az•sÃ`|ÃàðÜp¨øÞævp®ü#µõvÌžæy½ÒàuÁu0u/ïÕ–%&‰WpÚ@@9ó½`"® 4 ¿›|[oku™Í{ÄѹxŽ&¸š6CáêíÛ³/9RCsÓѸ5ÍšAè(Õ»_(„eyLQÜ‘s ‰ë+HJ‚Ék„wæ÷Ë’.¸ùêî] fžíð{ár£nï.íM5³LÛà'œŒ ò¶nVžöá1@oMqÊN!DÛ… ¾í1&ЦD”eqš÷ÊúŠy«F¼›c/"¿ýÞû‹´N³$&vIëZ7´ƒÚ]FŠ$è“%‚xµ*w™N­_¡ÆÙé:¨ðw†-W\… óQŽà»Lí+?Aþ‹ðŸß|Ûifj¤“?÷~/¿†î}¨Ã¤¨È–€çÆÞ9Æ;oYËçi䋸^dgqá Û¾!ÎmEw2áes§w=ºU‡.V àûls`à« H£%6‚œÓñ½‹wÄNÏêÕhç'L¿·ÀËú•ïµfÔ‘Mø¯öŽÑfŒ ƒÏtBmá vJKhq¿£¡ªˆnÇÕüSð;wT®ô­õî+¸šB%aSRS‚˜_)¤<‹@@!÷Vçíîi.Ÿ¨þÑæ:Ó%m¤;¡íõÑLãmìM¾¤HMã,¹ÝÒ:ûa«áe{mSLID¼ëj¬ NÙýÔñ™4ãm>ôΊAb\ÿyß¿<ºŽøNg7Ÿ@¤y™ _Õ㪭!î|RásÙînƒÌιPgÍO»º0Û4ýzô齫ËÌQVßÖ—T%eïñ"K¾ Rg¡Óo—àÞ ë’m‘©¬÷ëGj.:¿áíØ[ Ù@XGçT´Qà¦7_Žœ€w4yÍãÍ¾ÏæÅömWf¯×QÝ ˆUPP{{˜ÛþVXjµÅ)ùHϽTE†fƒ,m0Ù‘¹ñ}ÔÄ™øttÔLWn{ìN'òå@+5Â#âsŒä°£Yq½ÓÀGðÊ,a2X%¾9”nçÖhç×—·@gêÖÌù³‘Üçþ5ø·GGù“Gßëê@ßu©äÿÏ¿Á—×ù>úk ã|þþÛzœ???ÿñ\òù¿ÿÒþþÞ?‡œ?;pæ?nþˆL‚Ϧz–ì0lå™á“Ìèûú2À_ ÓOð·qSüö^u›î1ÒopjsŒsãæ¹8@tr-·’@¤c_±¹—Ø1;ª2»kg‚¼)”ÐíÄNò&Ë–¸í1`ÆLÐTwÆ qýÝÎÀ½\ªŸzû÷›°4À¥„¡.;î‹ ænIývÝtp$Iz¿ië LMs_ N[ù.D\ª_»Ôƒw•S6}–ŽxïÔ~"uôR*xéØ*]¢aÞé¬ú¼ö¶ºØzMGç£ü(?„H!Ïöäñqœpbœ‚¥ ›oG+™iMîLÁÿrï~ggžÜ:?«ÖÍ÷““ç£û#â¡aEyЬzìï }ág1ñ¯W­¡y}tnà¿þþ·ÏÏÿþþQòMñuuÇøëäÿúðïYÈ\àÚ1Âë«¿ã¿'ü0‰Ã|&ÿü'.ÿ:úòó}îùûâÒÏí÷ÃBàí8§$ôMø\TLžàÁÑõe¿)Š}:¬Š2E>Î6HŒá¸Ë"[å…‹M›nƒt~€þR.èÐp/“<Ó¯bìð„|1©òc‰“ÉÎÔûå;g±TÚüàFá ô;ê¾VQìËЇMÈ(÷Bð3Î_¢£¸SȵíD‡‡çÁ%¸ŸQ<ôŸðìW‚6Äßq]ûÀ7ûU„;]Ùy»±ˆµZTÉHƒ#~¿¯¨Ç$|oâ·ËÌN²~sÂ[½K­MlÊeeŸoKÜ DÇ€°m[Í—ðªj}‡ Ø›3Ê¥“‡¹9í~Ó6cgrB¶93xÑr¯ºš$XîÊmÜj€·!´cœú€õõ´!ÿ:¡ìÉ_ò!o<Ò_3çïçAþÊýCBâ!%þëË{{+â…Ø0#ñ+k\'pyáÖ¿æˆôÔOÎ{ÐÿÊ=ÃÚæŸïý÷ø8 r¾yoÃÈ9JUîš¾y!È |q¯{n?£9âÍ÷Þ|’‡'nü¹¹gø3ûÖÿ<æß‹‡8Ä‘ ?ý%߬< >_?ßÀÔ'ø¯þ¿ÈsŸ˜O0Ä^ßû#iž\ß?ÎN y $$o­˜Õ2ð5sr{õï^å{;“V‹Ê|¸ÉoSÓÎ¥Ùï0jêny8Ô³±Ù2¾}ßLQnN›·w×%ˆd·—Ñzµÿ$Ù¯'Z9uøñ¦^³~–ÁÑNÏ´'Ã~á߬{ÐÈLJKó‹åV½!@KÏ)v{SÏ”ù2Ìa¯™žÙIDã=úœsûOŒ eω=Ò/%„¿ÖW,ÁòE§..3ÓcÏÒù&Ûf9b§8DŽô÷ â#ý—æ~ŸL . kWgÞIûÆýǸ¸'ôÍìÈš?åJ‡ÑÐß×ß{?Ãðçsû:ÿ€øä>£?ü¿¬ Ü€Xò ˜‹ÜÿŸ¨w[“#Ir45÷`fuÍ|»ûþo8ÓÓ]ÅwS`/D“WL&33=€#­Ü®!œ'ü7ðÅ*ˆ¨vŽuh¬©ë+¥b¶ëO2wS³‰zHZ´ñÌÑî €á!ûáÃ;œ“‚®Ñ÷ã¼'¤—qF>8ó”O›Ãšà{ž´'§”Ëg&ì"{ô®áÚñd9àPèòçš{®âš•\iÙîõùth0rä…83O¯œT0ü©ÏDÖ‚¦òóâbL qžæftäÀ†ÎžvðÁã7X5Ð~”m8{vÝnÑ+¢ n!kØ¥5—µÞëz–Û@Yj DÌÁ|†ó0c&¹¬'2¹{X&Ç/t%±DMrAÜd¨mõš¯vÂó©ð$gqePÉÕcóDÎ}Ö€ŒcàÂìœ\ïÿE¤½ x*Œæ#ÌਕÇ>!‚9SvöÁ Œ.<‡,àƒ E}lä¦<&ŠàÉXÅÇ~I` Nê<ÜyÁ %2Ñ \+h]`› ¦}¤fâLlFÎÌùJô¤ý,ÇéÂIr¡3¢Z;Ï ¥Å®Œn­ RW?ðü篖¾_{<Ò,.ŠñÅSéÀßþõëñûÝûå¤Öba– ¬u§È¥nŒt˜¡®F*Øh:õ¥sbŸíàÿ#ÈÈJLª“kBµBÌT÷Ú‘¹Ãñº7#÷êõ²W„‰+ô^Bws'rÛ+5/`e¢¡ýø§9÷¹X°°HÀɽÛ±¦tÃ.õÆj•eúÊCM(ßA¦ÝrT«Ñw÷]1vÌ®3 EÈ–\²8ë¡VÄLÇãò‡)ë ÃëФܓî³kܽ3öü8–ü™(3ïu¬£A™§vI;c´úP_g—á4¯\kÁ¸æì”&ø˜´]9âùçl>t¹Ós:#Ó#Œö•DÐÓN•ÁgfY¥"âs¯N§m×Å ªtåõÌp·â€]aF W™I”ì^{Ü̽`õ`Ñ®ˆÀ™ª’™@¥Ë3`î€s‘fFª)_è_?þ㟿ê§ûÝÎØ­ï½™¡.o8Wò?®x|õ¯>÷í×~‹T!R¹ƒ\usÜFþl¾ú¸sR«Û$‰ìMÔ;| 0öŽŒ °­®…†Þï«YWW ©k.!é-TE vÃö#ÑjYá‹v›ß…O_Ím½2Á|KÏðÓ¡òõî3ÓoÁÝsjÀŠ@Dtì.y£‘¯úyí¸·O|­ Ü:§ˆ¶Õlà®±ò‹`ŽÂA&P#x„Ÿs*:¡¾äÒÔÓŽÿ'AˆÕ}‹ãWÏå8à'iÔ|k,xáÆ”FR AMcMøJ$Â,ʼf0A £C _’É\¦ÜO†ìÀªì|Ò^-B¾r'CR,z¨WZákÁÀ<¤8‡‚×Â#:3èØ¨ wQP ƒñïmOÀô§IªG^W¸kºZN@oNž?½ûëýúÇ_Ïk=.°½¿®õµ²Þ…Õyåw¹Ë¥²_â—¯‹nüû[ïˆL«¢ÔÝ3dê0úô.¦ÙèNäÄOÍqbPòÝwL¤»mDÃgjba#¬ãÞØšs•ữˆ9Õ¤£ŒRµ–w·É‹fÃëDþÔœ0¹ 4b‹Vï…«±8úpôÙÄwõ¹† xm­Ô#üˆZ‹]«zoé]¼ëú}Ÿnp©õ\Spê÷mQnÜòØJóFcMhú gÆmJ.†Æþ·ÎÔÐ@ îÓ,1þÄàTh$§y8ÍФ÷âbÃÕØ»öÊ8£wö¸¡c…Hó1Ÿ·@7Ñ\fÏr<ÇÀ\X$³-RXÿâ½’,` Xí G)ZRÆVÒ1Ë;× ;ègŒ£Om p÷¾‹Û¤ô¼®ÅŠv"ø€‘ºâÔªœÒÊ¥RÁl©ÿȦ(ŽG.Ï.æä˜·®$b¿ÌÇ+® 7vÝÁøú"3ÜøŸW´ˆ¿†\XxWþƒÎ׬ƒõÖ»9ɨ†m¾Õ‚éɉÁ¡n–)`«o‡á4Ðh,¸_f(eßÃÖTBó°zlár·ÅL ÕÄ2:ìFÉ—€vó2Wú1>Qô¸Åñf/9?€Ž J¸­èvP>t–ñ›@HÖ ”¹·~ØÿñD—v­²6~ßýÓh¦€Œ%3­½wïÒÝl“rIRÔ@kΈjGL$rcTË‘à?7¤s‚:«ä<Ä^l "—=üÎ)ñ%ƒ˜þ쑜§ 09JªAe^r¯äB'i´2H.ÀÉÅñ “½8Zew43Ç5¶¦zÓ@® ƒÇ˜{òòã,õu1€¤#€Çµ»ÔeVA\É}÷J<2ܯVkÍ%yQ! ÊÈ  Ìé!FCæ´ dNƒÎ¨•W€¨Ú©zïn'Q+3 ×JId’­Ž{œ"5ÓXb1žý¼r´®Þ‡°5¡¥‰öÈÙ¶‡»[-ó¥ó‰Í¨ÍÖ b ¬šq‚X‚[ï éG#jº>Çs°ì«Û1̆nˆC 0ÑævÖ”@N$0ÜÈ6%rFÚ“|&ý+ûÕ§Bq~˜÷î·ñýÒwçžiØÆ˜çà%©œ¯-Ái¯u…õ`mjº´ÀB­XÍ:»'8i”OBgÆÍäÞóÇ“3€,‚yè¤ ÈkJÓÑ™/RñÀ¨m{žD'y%7hã:ÉQ&™ÁÆôö0J²ÅU䎫4IôgCíYÂã‘A[B{“ ¬`PjûJ­‹jÖîŒ^=V«>Œ$®\ÏÕN„ŠGÌH\´ƒo5ÈÇЖ¼<¤Î ~ƒŽ´ÊŒÝÓîj7ݽ¤V\BÍÆçlçsɂĆº³ÄÖ• õ]wD¼wíF Ç8hµ“Œ˜1u…Q ¸ÍJ6¶à \+ªmt›˜J$.z  °­çõ•à{ÏJ36D²ñ8Z&͈–+Xó»þ4‚†JÁ‰¿€06¦‹îp-~K„ êUl™lïpÞ¥{ûîx7 xlvÃk;0Ž­2, 0K½ÂZç ;‰øºÎ2Óæ2u°¯~ι`¤~E˜À²qŠL&ÿ3Ì=wL:$2TÚ³)Ä'Å@_<“¬°ƒ¹'®ayä"‡oiÚ° ;‰È@‡$‘%OŒb¥QjbÙ^9OG?,=bR¼Š(@» jZÞe%› Ä×À1æc…Ƴ¤ÅŒ.`±Ž!išŽÿëöÓÈ&†Þ…‹p†Œ \±V(½0Óöà²Ûz2ÓS:Q׃·îV9d%ôx¬8æqw £±®¿Â[|—&ØÀ3Öb]ÇŠgûÿüŒ•Å[VÔ}À>¬ïóòcáî9žOß’îÖ=ï |…ƒQ=vüh~Àµ†«´‹Ê|Ž/W6-ét9Û´÷Œ×…Ã-ÆPÅüÝjµ›Û«ìæ)[à|ÕÕèGzGJ1Ð1EîÖ–µÛë(Eœ N2gž9˜´fD¨Å8¬³©˜üNÇÄ>n(m`Jèr”߀¯™L'cÂ¥3T€OÀƼ©ÉŽså…L‡Ã=sž9&¯VNŠªÀ¸Xn ׯ¬FS€›i#r6ÒnÚºbjªaƳÛ+©ža˜JÊiói¹Õ ¾Øz`d6apyüR§WýÄ;V¬ö§OãÓ8×8éeì3†¯‚ì:€Ðµ¦“|FÙ –î}æ\AdÌÇᆬë"p®–2_ïêýýëé¼·_=`é Dë+‰qo´ ,8Õ¿®x.[ï@ê:±Û·¡iò«p%Ý­´¾–ÿŠðƒ[º»ž‰Ç•/¹šÿ½¥ºÿ¿¿ÿŽà¾ë÷ûøx#sàÇ-5ÔÀŸÊn·ðñ\ÕÙe†ÀFW‡%Ê” ðÈÈLv7¬Ö”õ<Óÿ‘ëÖìhNæÏÍ{å!ÔË¡#@Í7w›ó.­ädõÆéÖ#p}2£ð™´ø8¢yÌ£¹c‰ƒ‘šfæ@¶tüïë4;ÙÓŽ3zÞ4pƒøØEɦü »9Ão¯°ŒOHÀíq'¨)æ qHÐ1Ðë“÷7ƒ‹$qncˆÈA ­/¡ÔºO7Ù”…EAa¨Æù™NF ¸–'½×ÓdN©e0Á¦a‚¨ò†ìXó™ÑÃoœ„)W‰>"—Ç€qÛh…EÿÏ\ûöV?¯H"ŒwAúÛ!ܽÈ'³Ã²g'ù™d>d,ÊÂ#¹ÿuïÝ`Ý­õ¼(áUñ½Íöÿ»x·w×÷ˆ!•ÍRáu1êZ ï¿_ÏøïŒÿ|{÷І®hE CkMlØ={›æDÚ’Zј À]BI̹lÒä‚Q&£Õ¡”÷]_«\÷½òŠèg†ø(÷Ý’9¸vàÏPœÒŒ?ݵ&Ô˜‚'Q®™{ê\&ORüˆiã y–yœqÇ?—‰žª‹1ïóQat§·cz5çH$œ 8Ç&ši¨Ðe®y¾çzqÐmg¿Rã×8×T‚B&ù©~y,2”‘SçÀEØX‰Ñ™×q¢{§ IDAT¤-Ç‘âN'@2­D^t•;Ìõ+øL/zo³¡¦}!Ò’Ëü;QÌï… :œô3 àÖåGdË-”à­vôžüƹ᯹Ҫ_{^µ¹»Á(õú¬SA]Çó>„~,ö?ÉÀnþ¼ë÷«n™öO…Û¨;>ão÷Ú½Ûd™Ûh? ‘Wu•ð6“õ¦J‚\ÿ|d7ÞW»ä º€ØÓ=ŒÞ‹ÙÀ·-»f hôXt ;Ô²¤&mW¡ÛŠ` »NÒê1)>®ë­ýî"vÝ¥WiJÚJinc91žŽáFðOÇŒá‰ey<ÆäDÈ[1~˜3žÁDz X$ç?Cö,ˆj×¼%´rf0ÂA Ý`G<Ђw|¼Jã‚èa` Ê%2è3Oit63@áÓn@ r8?LºUáÈZÄJѪgðyE·À~\«muõëëïp<û]®fOÂSn$i 8v_+"…Ë\´kM’Ø«øøÇâ;üûCYy‹-³l·ý+ù ~}ÁåG`7·{ã¹ð¼ð¾¹ox¬I”sÀòrO^ÃDÔ‰k]²|ïÚõ¶33z;†þ$eÜÿÈLv j5ø¾ëê)7wÇð¯w±eÐÑÞQ0Øô[«l²>ƒ×ÂWä“q;^«Xí[~ JÅP€‹ñHÜ»5¬UÍN|d[†8%‰àêób@ÄôB¨v aLjš»%m”ÔoSõú+ó]ûß·wϼj/ mävb‰Öl5šr fZË€èœð¥‡h”\3qšÅìÈ‹ø¨É$A²Íä§ipÔYE`lòÉc² I2˜Cc°!™™š4âÙ­ãš ÌAÓÌhDðb z-Ö̬ E|-¬È‹|ËÕz?h1á^®µV¹“¤¯ƒ‘Ç}Çÿ¸òï/¼w«‰»±Ò*^Á ,º þù4¯į ×ìDCÔ~™+ðcoÇ#Hã×å·!¤ï¿ÒæW"ƒxøWó]~½ð•þº¨ ß/ì $í=6œAd«­h‚ê$œ‘É“E½´Pt¹‚ß?ú´Çïf‰Q¡Âïî[Ѻj¢q5¨…Uy"!ìIÐ{¿~‰wˆˆ> ¿n½1¹ÇGûœÚS'…Ìlz,©0•â¸ÁʳuX¦”}nÒý Ù³ŽÓgž Ør½ÕYíß??ïÂý±Þ½&1eõŠ‘%Ð3LÏÁ;€Ÿã côÁÜç Ûþ¤Føç÷ÅH‡c7jGH1ÿð£Ç«ÛC)D“Ãö'K~n™ìáœæô1ÙOÐSSð‰ÕpÓKX+±¢¾¸Vôsá?2¥i­Í>‹a«üÅaX9 u&þþÆßÂÏW` ܤòTÍ׿ùLÿµè…¾u+¾¼¦ÙƒÔ´FLWëø‹üǃêîŽÝÎàó:ˆ€ËÌð#_¨;¸t™ÿøåÿúqW¬Å|âÞrÎŒSn“VW™|\QhÓZ+HeFw¥XÖãÑ–yw;âÇHI\L<ÃeÜÒ&¼`Š?®ÄüH>7O¸ùø]þMs¯]Ž(°¦„ÇNM¹íXïǚň`ô" à¡ñù`Û!ôÐ\=V·ÕíA\ylqè][i®]ÝŠ=íTt¬6'ÛdtÆLÑ“âZŸ9ÑdUýiM ŸD‡Ç4¾i¡ ‘`ZHŒ‡8¤d j Šœ¡@ÔÝ€Väa̪a7“\11¶ŒP,„¡šÛ~«íF]Ì…ëgâV¸ÞèwÜn¦hÄk»‹xŽÁ´ÙSNuÀE¸aãëÁ]‘tÏÌ"™RB„¡–ù #yº>åe6üXÌëy¸!·ÿÏÖvÐå|$#ªºo%ð³¯ÿ¾È-—¼ ÜoUâ-Ð,«àL'/%ïî1Ó"b.D?‚‹IúÞÞŸRw‡q…#½ÌœëK²?Û¨–ƒžcŒÝ’ÏiÛ¶¼‡œUÓ´”Q[âô^Ä!·EN ÕI€\Á&Ö0ÌÏ}d˜£Ý ‘yZÉ=̰1D 4ü¬é«Â§âÜ8F<Õ +Ns¦É ›i¡¥c)=!³Q@™ƒƒ¨+’ÔVküèÎñkY€}çfp´ò1 a9Ï…`ÜÖnµ#‚?ïýXŠ‘ 8Ôë½åRp’..X¸†ä`wEN·§pÓ,`yâš{¨3û,o‡ë¬… ­ÆcdþÍ çÎÓÛ&Ý1Cñnúgájž?®ËjhÓñÿ¤×Jý»໢Y¨Xñu­c»;— ý”ö¬Iñ/D77\¦Xa>¨½¯µV ¦‚fxoowG¾ä»Ynûw¹wïe5_¶ÝI'ûŠøZþ %\ϸ+·ô–”|½ßWòI>¶pÍ(zt–Ae×–¢ÊØgR(ƒð)ËV—c\ÄÄZþK»ü¿^è¯ðîº ‹6Cy“£f;©˜þÖ0pêõ@ŽŽøœó†|êR&èÍ£ù ÄG#œçÌMããl<±ÛŽp÷§ˆ!ojpÛkªyÈ)²?ﻎÃ{RÆ–a…ý'°r|ʸ™Hf7·µâÚí5r¬Ãf±IQPGOÇÆx+©Ñ)sυeBÎ48Xe`g€ ¤(Àá‡( rkfœs.ÖXeïvØ9AF30µ„‚Â\BŽŸxñ~=é¶&> Þ ?7±Ñ{­ô[äÂc¾äZ¨=¾9n Ê€sôXÃI«“¼å½ÙnÁƶHôîwU;÷v{ýîÈÆÊÌ+Ñ©Øö#"#ÅF Ìú×ÚwñÛ~Ý`Æ =`Ì õÜM!l—êÝpÛ=pÿS/IJÎ?Ë,ò®žC+ 2 Æ_ô?±ÿÕï§ãõÓ¯÷‹"µ¹€qhpŠž&Æ ¾©>…&Ç1¡zÏ_8œ«™þŸ¬ 0lt+>Iv6Ïâ!x æ'æv¡iKÓÚ‹–#ËSh.c„€SE§D„CàowpêC‘ÄbTÌvçsI© ù¸ Î594«.8z¢$ÈÑ˪uK®#b$+N$)/@d Æeª²ý 8 (O99H¦jRà­hÂöJz£éiZhk³_5•œ„qèÐÎqQº;#|‘’Ÿ©‡EixûìöÉôÓ\t'ßE–EÖØ×í‰/hÐÐëæLä08Ž>:çnˆV¼Þ÷O£]Ú ­÷ö¿ ï½wõëþþVH_+óï¯ÈˆÌ4 ¬‹lôE/vÚÞ¼ó˜HÅRWφVªj½wW;¯Çnnñµõê¨Y 7DW vͱ§>,< ³;3×ÃÑxygÔ»Þß߯×K?Û·‡Æíj®)¢FŒYI#ÛìƒÕ‘+xŠM‰c' >Ìé1·ŸágÄ|7'.ðQ,0d/kx’I*ЩÛØÁžÿol±òò¡$Ǿ•ç®N»ÜŸ%cLID°y„ë‘Ý¡GæZ¼«q5„áþš›²ï±\ˆ­™eôÖäaú™Xœs„'4cÏ ‹¾Í!"uW¬‰éÆðD oc‚¿1üy&à±À`ÎgìË!¦ÏÀ­W1dšW€äc!ÃFxF3Å[Ø=ô"Äâ}„É`¢DÂ2ªÝ„ù³Hµ¾»¹íïÖ»(ë½ùj¿ wóî¼¥Fv;Å\™I3ãAk™‚ô¾Œ+Œ›D¿/æX­îê½ß¯0 *náÝÖëíÈRTûmËÁÚeQ©®­òнɔ¤v @ݽ÷ÏÞfIýjÕÖÖï[ïö6‡ Ðu  8-ˆ£½Шƒg–ŒÁk}œë,?…)g4= ùic4.“ «_Mº"V©ãSc{)bXøÜ¹ÇˆXF# ¨P ´ˆ:»N9¬{ /÷µ,ÐâsÍÄwZ pREÚW¦(J±Æ©C®Ç]³gÀ˜÷9T+L¿…-–|] éÆÂ%CÛ|–]Pž§{s{‡ÀÓá+y…÷PÀÚÌp  ‹[ò§kwðÀD°Œß …ÓXÅ•\kÄ‚mÃÉXð]ó}šMyrk¨†u>æäà(´-®nÞÕ·iæ»ú­,à7°y63}rªvD5A˜ 9¢Eãmy.Žå}ȵÖÙŠŽ=tŽŠ>ãð²Úã" ¡c²„É>ˆq›K “þÅ Î6‡RDDsj`¨C¨ñ¡Ñ¹´s–vŸ¥×4‚Õ(Ót üàQn`Éô`‡|˜q¶_á['ý9;êÆtfC1Ñ, bQ²ðDšǘ&Ç8Æ#-™§MÎ3÷Ñu~À™¸‡Íz„°m°F•¥lŽ®ÝÞÈ b±ã @[¢u^UÙ!;®²]Í¢ÕXä"/¢ÅÞþûgßåjW{‹:¹[ñÿã¹]û÷µò]ý~qÆP¼êùK_Àÿy÷ëÕ^yeÕ÷Û÷m‹-Ø6ò½ˆx´XÐèW»=/ŽŠ˜Z;´±Î¸sÚÜGxšŸ‚3¢Õñ©¡ýãY2¦V­Ó_mÄÔè³·È^gØ7Þá°•-°Áè&±}Tºîl4¶yÚç<,•ÎO3“ƒ¥Ùìªi3éX8äú¡gtÏ8>þ3útáFcDæEX暣"Ëê‚:Vø2=~¨k1·÷Ùe‡³Sð1¶ø‹Ó¾Í1l^p™sIƒ`⌠ÏL}·ç{vr\³ÉJóUpÏUÉ|í1<ÍK6ÇÆ0ALÖg³§×Rퟷߛ?å[ÚbI%ôI”uABƒ¹T¬L8¼5"nÄ¡çØQ@²º9ìÇ í0wã»üîØ@»Þ¥wC¶7dˆ[Ô¾eU‰†[ü©¸V¾ßýþÙ÷Ö»üÞRÄÊ\w5.½îMYà·ÑÕæ‹á…)üK——çB:ü k1O{#Æ*.“¨fÚ9'ň™ élã{”íœÍ?dv˜€g@Rªq0`NìFætä¥!`ª fY6€/7À ÈÙs Š àæš>ª‹ÇTˆqnB#¶<ÒÞ³¦z¦©˜§ÿÜ`ìÈ>æÔ$ŽÌ{òø6ÂËch¬IŽ‚n¯³ ¢«!M?Á°G@°7n°FUÁgQ {†?Ù™nàcb…MÜš†&¶Î DƒUHZ>}UWàjî¶Ä®qD[MFÂðÖ§ô€ª‚ˆbñeÕë}w^ÿ¾õ~ó­ùTV;`¨öÐK$Æ'W੊\‘Ãü2£€+i8Ên•-µ¤ ðcIí:Hµšf«vëÇ ·K„wg[Œ{[ßι­¾÷çJÜèä˜ÿ&Ýöá{Ž„¡]5;„å5:qÒyM‘Á‚“´ÑÀŠÀgIÆùÉz¦›tL ø\ÖϘsVñ9ÍÚ=‰…ãš¡7Bº§sãâ÷Ÿ¹C¸ðÐNâCð9åÊé×iüZ sýSø7fólæÄ9éü`Í¥ºèžª¹Y—à)²H÷;Öš í±´öܑ蔸 6°hù÷F"f¥…Ãüµ¼‰*f´‚ß°Ãq¥ÿÐ/VBÖ¾ `-¾¶^/^á¿#x]Y ÀDÜl.#Ï0ˆÒœ™ 4WàsÀ‡Œ‹–CF¤¼…’÷rÝõþ.!²lùçµ_ÆÝú¾-¿@¶q7%ܽyÖ¤ÑÀkŽÌû ÒbU!õȇ\¥t5÷¶ Å2Ët¬¼ÑêV©eu¹%u€íFSÞö=‡Ž 6̈PíVnO˜Å6a9±j@ãñ9˜d”}Æ V3®¹ÝúÜD?²Ô‡˜bðÈXd¸f.3çš9FÙ±I“I:\åùìÆL4鸬ûüŒôA5~ ü3í1æ^®pÓ3œ>‰²¯L@ÂÈjÇN=XÀ?oÀ†B£½Ÿ{ÉÃEŒè˜;>‚s•Ùí9HôÉö¡Œ `@…!{ƒ”‘h±‘†îˆ‡I ± |ËnЃ*=÷È*ЖÁkÍq¥¿2Þ²ï­5ûÁbæ„} ù^6na%{d߇Ċ´ŠAKf5³oâÞ÷{ÿôÿþï÷wE2·ñï]¯‰[÷Ï;·J¼ÚPû®] §Wèù¸¦Iç|§šk’ 6ã0ó~e¿[PbTÿªŸ—¯7úÝxo¿vsB°-2T㌆' hÑ-=@Láµ £ÝD`ONš!ªa[iW7!Nªß¬ÐMLQC¸<íIà¹Üúúè]'M-3“×tÛaKcµø4k„.~X£S¶4³ ³S|j9sÕ£†«<Î3s¸+‹„€C–Öaà°f´5Gå“J àäe5CÌ”#£)\Gú §o^‹ÙMƭ׆«iNÒM@m4DÁå"#¢3nïq‚ÄgcôGbd—c awÔÄb&לE©_VMRj´|73§ý{L{ÂÀ!\‹ƒ“ä\¾n¾w‡_P¸¬f’û¾_¯ú¯ï~Ýñöõ½Eé½ëm— e9ªökC¨Doíê}‡ß5¾ d^Kî®Sès©Kû)eè! ~íêÞÿøuõ¯»~ÞU·ó¾µ»î·ºA)»Ïc;ˆ=âjH4ö„ì‰ìQ¥l5q„à†,?DNeäœÚÑàÕh›kÎ*œb‰y–ÝqÜù;ΚÝÇWü¬Ë‡+JÎÀ?:ïɬhrÎÏúcƒ›}?Ž˜4®}Øa×ô(ÀäY浜†ç¹¿a>!%"@ô–êQº‡¢ÈYÎ#Rðl 4… ±6ÝSÙ¬²W&ËJS¸ÐƒœhvsOõ¤íÚQ§ÐBö§ãf’òÉÌÑ)>…ÏÊvG$êð”ætèºTxχtá"#áÝñ’¨è÷Ížéǃeìö•Pa"Þò÷Þ¿‹ZTW÷÷»¯ÈWë¿~ô¯[ßÍîØ…îÞÍw¹»J]B‚÷®-÷6׺ÝSHm^kßÊGâîñÜM˜‘+øê®ßï¸âmþ¼]öïïWµ_ÅŸ·ºuKmµ4ÉA©'ô¬Ž º -¦]s¢A 5²‹e7¶{ZZ*çDx†œ ©‘F+à0O1í‚âà†gûGÌóp¦[̉3Ñö“Áé`,Ý9ÆHßû871šÚôh lB³KNÅCäX¦vbаLD[â%ç`††ÁÐÓ‰Ñ{fÏ+$ Å0ÂtŒ½ÐvÈÇè¤s]=(L¹Nì™$îŠ÷9΃+Óp¿ +ie’φîwo‹‰Pt½ÆœD t·™ýZ½™qjx’äÍÍ .šíWóº#à½Ù„¨X\@ªPðÚà~ÃÉ__ª:çÌß7~׿ÿ÷½¾ýŸÿõSX¿¾žŠø÷ÏÛóÚΟö6»ü®®njTg«mnV‰euo U·]@Z’Ø}÷ºV•s0Êo›mqůŒ•xwø]ÛêŽ] t·ÍØí»{4\ËM¢4Ç['BÝwš%’QªdÈfU,Ë?s&Eåç< Šã ¼r±ÆïZ(±Oï¬ídŒÆ2ˆ üØ;Jºä3_<2Ày»f4wLÒ´ñ1{zsšj '˜*”`X#.$°>vðMš ã5í±ÛÄ$AE±PF„p8îšØä´nžßh+à$Û¸ §ÿl:ª&Lé 4rZ^Üí<ÛåH­ *æ(D{·I\<ÄÊdܧ”ÍoûˆóxO73 `Ÿ–`Ŭ0l!…XÈÄšKóìÍôV8‘p‹÷ ±!°Ú×è$Ä]Ƹ7d¼Êÿªzå½ôÂã{ó_û.±ªaF»«Ô.5·$ÀBil‘  ¦S5)L#©»+˜½÷ØÃª¶Ç\eÆÊ¤yvµfÌéh¸‚Ú8"Û=†ÙÕq A¸»ZíH9ˆ}zÞà>½Æãq˜­mÑÇúÙÕÉP «ûä¬XMëH>Ö™Í Žš³Å4ódL}œ3m FNûaý’PCçÁ>ÑN¢>r¡›yGsFÁ°'f|ô™›žàM@šq3ÎAa³cªËŠÿ»¿Í±ú(N¶‘#H«£Á±fo˜V4WÁnZãߣΛ»*/BÁå–rHJp×¼Þ¨ñ¶#Ü UwL‚ø\)=Yžù!O¨ºçþ\\Q‘CBNÁÏ»5…ÖÀÜ{à d:³Bª+Àn‘iw˜ÍÉ ÌŸŸ ¤©I!¤ãÎï jÂOÚë3¾$Îa(SfFŒJ€SáËöçÓP+B¼×´xxlÓ² rºœÁ&&ÜÁ3a%é*Grü AµOÓ'OC Š[­™mOm–BTs5蚢ÌI¾-Õ1’P[kÔ³€6³'÷{Ï8Œí™Ô ¨Á»­EVÁgK% Ö§^É»›&YîˆQõ¢˜|ßÛd¿¾‚´·º±qøý âk¯õæ¯ì7Üïè¨ïú×ï[ð¯_ëë+¹ tãnXÂ&u1£oÿ¼ýS}Ñ—%+sϱ-©»º4{µÈl#²äÏ]>åñdFÀ©˜i1½›ld ûz8UjVwa·ÒÅsé³OŽ ””Œì!l€±BîP2-S x ãº÷ø¼zä&Σ<ý³ãnœ!Ê`… ) ‚·<0aÌíyÐÖ1÷2F¤p¤ñ_Á´…fð kF>ýT¾L¹ÊìÓ£ê9GÏ ¶’Ió@ŸÖIãÀ|æá‘C|»r|–£œIÓÌñsNù\%¢?fÆVOx~ÂôMYŽ$Éimˆã}:WžÓ\Jt7Ä+ù!\Y='–Ï´ ÃÆtµçá™à›Ê>~Zt÷L=«‚ú.H9œÉ€K”¦(C Ôýû¯ÇZóvˆ>ûG„wù~Çìåê–Ê,.·^¿ÅŽÇ£¹5g¢0kkýý÷j¼ßí½{:ãy™»ôs·m»œ!´Õn ,õ6Þ”DY7 »Q¬Á\ñäœÉ#2¯ÄÍYSò¬õßwÿïï×û¶à[ÏùœŸw<®GÕ-i6ÀÝPoŒžhtÂn ä]óªÑFwGÌU V LýáúÐnÀPÎ26Ñv–# p #‘ÛŒO©õÙ“–¸<Ÿ1ZE$©ä€4mïà… ,~6š³'â3Ãü“%ãÁ@L¤gÔÅÈ5ãÈñV Žˆ=Å„¼,MYUÃ_«5#ª±fü¤7ùÐT³N«ÂǬà@ÖXC@š|9)Ôâ« ƒJDO‘‡Æ‡(r>+z°?&Z£ ;VŽ_s¾±-çÜüIˆjbèð»î¶»Ž´Pý{«=ùxBÉ ÿÿL½ÝŽ$I’¬'¢ªæ‘Yݳ$¾ÿ³ þìÎîtwU†»©/Ô²Ac0S]™áa¦?"ŸD©e°‚ÁE·6:¼NSn‘d®d&äuhõÓï¥]ÿü¹nYQá7ýª wïûyzc·žÝêg6Ë“ÄHï[æ·7) ÝdFF’?^Ïó–t­Xuá¾ÿ-ãúýõÿõ|u$ˆ†¼ïý0G”!GÑ>7§V~¦æö}šm2ݰ'äۧš°Hã1éFpÚ³Æ5}ü·¢Åp³Í¢Q&©Øp­™±| ‹•‚âXº†NÑ YÜýÔ™ÐO"CƒO½ç!>âÊSMÂ&asoG0’=³øNûâI9œÁŒhNƒ;/ )ű¾(f'ú÷hÇiXÚɈœÝÓ[D€ éì§Ù°3K£ PáÍP™(ŒÔáÔè”Ñ™!àÙC1´h&!8]y°ç˜ ãŠ2µ»õÖZ…•¼@‚a·ËØíˆX)&p•²àÆJ<í÷†êg?ö#Iï÷ó׃Ÿ·»)çý<Û¸Á0#2?¯×ߢ ÿü×ýŸÝ·ü5ŠQCç5™Ÿ¶ IDATýæîæð½[,Yw¬÷ó+€ÝzÿÚþñ׊|•~ûøôÜÞÂñûAØ[&Ôí0¾«uv÷ܧ9ކá¦á&ËAâÌF°)F¦¡@K:¾ÏÞJ¸“¹Ý€·]Ì9%G=O¢£U!†@5Òñ4¦èŽ˜¦Q³øŠO¼‰„›I1±{¨IŒ'ÿŽðÜ9åÀŠ˜#àÀW8WX‰¶a&ÆÂŒy.M0ûÿµî ç˜$Ÿ1[*UDÒÛVc^EÃ' F‘ÔJS MÁ9ç;îmµXc`…ˆ[~z,îqV·'œqö5 #$e(ÉžŒ7ËÁêçúF'¸X;šÈ§"£y¥ÓüýÂõ«ñÞõë&C¸Yå zû½ñãÂkRzÉŸY~x‰>?ï6ûAÐOe²£ïmí-´°Õ…øég!F³•xŠÕ:îÓ[ƒamŒBaTüÀ|î k;j(ÜoÆÑÿý¾ýàAÈ„Ÿ XŠCHU÷ŸI©Ã`Dë4˜í u·”䤡}t8sUDC2ý8²Û‘ØÝõ- ;óI5ÇhÇ(7*ŽÔLú»ät¤ILæ×ŒÛO_LèœJ„0ße£G³mab45Ó7Û™»eÎùOUÐîŠkf'S eÞÝl×l`²u€atЙy¨‡£Q¬±²å ¸Òq¢ª’™¢s·¶ÌÉ”n"0ªšM–é¡+*‰=⪨ĻÛÍ & `ï½G"cŸí1¨P1„žaž Ñ¡bôÅé5ñ^å‰=òúd ]:ÐÆ×Û‹i¬Æïíß“__‰·âÇoþ£Á??oÐx6 ® ?hë_?Ÿ[ÈÌÿ-vûóµÞïçϯüÖO5Ágãk·I6¶§pÌP‹ãg ã¡Û¨îÁÙ6ÀîȲ›Ð…ém•ÂÞ»åJbCî[gÃ}¢XbºY¡ÚT7@[=6ö´™£uÔô–*#©l`5fx?LÁÉ!G0„“jD;‘Ün>P zzAZ“Õ,9Àó×Åå‘wÅ©Õ <}úxXÏ„{ä7³çÀ|o$œ¸°$#íÌ¡“ ÆlIÇX£ órA£1Å ˆ€ÔÌ\“nÊ1ô˜ÁMzG+ƒ(º÷¾ŸWe¹‰-tß»{ 3¤äΈ„yóü Ðgè½e·ÅÛÚîÐ6µÕSKøèöæø€;ú´ïM…ƒ ™½TùðP‚ˆ‡¾ˆÜôûÅëŠ?áûö%þùnÿñLyiÈüüp7~+ü)=ŒÇ¨ aÞ~÷»·³2ãÇåß#þõó}ÿõ˜ûý{{o´Ô†ÔÝ%Aà–2¶:y¢©1 C@@ˆzú¢!…FÚÞßÚX–®ÇlHÚu:ÆÙ=RZÒ™¼l+4HxfE`‡<ÁBðDq²)+›ëIq³l–ÝeEÎóÐEôQ@Á1(–'%În_`ÔqèZnK; ;ÝsWêãú… g% YI„‡Œ¥™‚œ…«=œÃ`Ž .GX 0:HMx¬—é7šç¦ræwl·i¹Ò@W!‘•l7ZmϺWÉË$`¸Û€éhN"­Ííˆgû×㯞q=lªÙ0EÑÁ³!oÚ»­L:¢ ¦’X‹ó Àõa>¸®ésù3-ó×O#üç›×—~~û„€¯ÛOã?"—hüAþöÂ> 7²øÕØòý“Ž?þùÇüçþµ¡¬Ïªþüë?žýkãýàW÷¯·Þ;ö·QhkDc 9tÏüƒh ErHQš 'Â>)œª´áá Í>6`uFì·ƒ³=h&‘ÉÕìÑÝÓ–DŒîÓÁl;‚ÔšilZD™Lû¡ƒí NÔÜØ tÊê° A3T²sÖ&Ï”S&Ënønã˜VÒRp\,‰Hk&›Àdxþ݇N»>dÃ@x‚ZgЇSÜ ÇK6[Õ¹„ a“9Äç$Éãp×öÑiÌÃ7z6ÐSϪñÞ= ñË}‘ø¸ ß}Õd Aµ ±Ÿ¸/DTØ’ÅÞÍgûëqÃÚí¼Ûù4M¥<ŸÈ$;+Æl·¦BçI•2!?Uè3óÛýþÅÏðÞ .€Ëã¹]XXÉg»Â¿/þüãÁïÉûñ-þ׃?¾ö×Ýï¯|½"¿½ÿøõë?þëù×/¾[ð¾¥ûñ»Møiv«íG¤!í±14‘:‡«-o‚D ð`£‚j‚ÛÍdˆ†'T‰aÎ]8ÉŽ™$à{¢§gup–Wóõ0zÆú0ZPÐêÑÁ=[ä ZdÊ`’ÝÃXí“ *G¦à­Ÿ@ˆÞ#\Hû™Î¶»LA|?«8!ŒN‰ÀL^ßj9$ÉBó†è3ÍAÉ}ùg)6f(ž×.3 éî3âP"|~ê¶LEò;{„)I'ˆdµ7•sänÏ¢ƒ¹&Ûjc gGŽ%GÊ6z÷æ,,"¦0At»`ÏFEØíûAU­k5¢¾v<6£Ô£\ÍhLñzêLºÎ^”ît^A{Kð£?~~%»bS¬î_¿~öâëõöm ³œŽ’·öõ£>ÿäÿù¿š?ýÿÀmý|òãbHeêg'ËýzþùÏþzôÇ[”6šÛ¡ÇÛÑ õvo!I;© ý-&8^ª8Mì6gR©B¶îIɳÌÇŒx.mâ hÀA<Óýàb"%8;´QÓ@=úÉðàmƒ@ ¿"hXê*n°)3b«9_<Ÿ*8–Þ•¸1° õÔ7æ77 ’|€ æl«”‘“Èæ÷C“8°òï¡Ç‰“ÈÃñÏ.â€ÞIú¨pFeç8å€ca$Ïœ±Œ0Ö,€\Óa¶ÝvF˜Ä­>ò—¥‘VþˆëÉäóÇ37PDš@p芸’ת¯¯/ƒ×U»Ÿ‚°%yßþº{Ûï÷Û/ð ?Î_ïï;ÒO{? Þó^ñ_ÏëŸÿñãüçÿíõ¿ÿÿû¾ÿëý¼Û¼³2‚?ïýëݵøoŸ?2bwËÑ㬴 ݘ+°U–|5yN¨Ýnúò¸›B­9È6É1”9ÿâÈÆU?Šå‘´ŠŽq¤Çûa ·1\ñ1ZPÈÉý={™=ª¯¹Ùj_ˆmP§m+B/dÀ{4l¶ýL©ìàG<9½{.b«ÉeнQE¢8ÓíaÎÐt¢\æ±öq‡XÄÆi£MæEX%Žz52ÚvdÂ$AÎIa0ÒÀøħGí æ+Bƒ)+@·¼kõà&÷̒䈢æ“B¯ˆî‘xùhk>MÜÂð=C~&Í/!Œ=ŠÐÜŸ“[,¶½»°Þm¬G/?C1êŒI<Û”ýúÕ~»¥z1#ji_+6ï¿~ݽñûŠ«OýÕ?ÛïûÉà×}Oz®©Ø6{ÆÌ~Md‹Ú9³"ÕˆCñõµywüõ×ýý™Ïn†¹ßÝÀ_[ágÿüó_DØû•¯/CHïðøz¶Úü{+Lb01‚?R úrtª$êxsm%³ÀSæá£Š?Sœòïì5n‡Ã_›w¨"žð(œye“ ½C˜…‘Ïo—2;vª‚–ž,¦cSDYî·w™¶ïä‹gûqdí3 >k^”É9¡3˜ßd}'lö¹<ÎÄ&zäA„w²»çRÜÞ& aŒô€sS mÄ.3ä6œ£ˆBn¡KÁ7Œ²ÃtNtÓÛ¶G:d`¡÷Ȇ3âq»Ýx€b„öËi»&¼#”5+¤ì7ò?rÕ¢pâc.ò×ó½2H&/i¯ ™ÁÃÎøX‰ßúùóý*þžºV¹ßÿÏŸý¿ÿõõ¾ñ‚¯ìYŠ=3€ëmT7bPì²Eu†­€5@x;5ql÷÷q‹ŒêRÑoì%&ÒŠ¶†mÔs¬Rùì½íF›Pç@†'ÿ jÛÅ|¬lâ[›by'æÊ¸¯ ¥ÌÌÖ3bBÃÞÇHic´èÜœ3w>DîoùpÂdô´£ ò´ä6c\ˆÎ»Çñ]D›&-Õ°õšÉh‰q¼ÓpU¨ÁÈð+´…{íM¯Æµ¢"à""R†MÔ™«;<+£{ƒû`~ •sÒò&¡.Òmn ²(Èr“¤*f*Š”Ÿ‡3TEÂ1ËÏùŠI¦ΦCÛ™“;oFTÆ#=ÍÖ$ˆ©Ax‚tÍbkjÌ•5ˆ…°?W½b\Ð$0?Í{ï·þ¼>^{]A àÏUû¹¿z¥ûg?íŒ{o¯•Ïóu#ÖÂëÇoÿËo•â¿þü×ûË¿ýXE¼r=ÞíøR˜†$@œ(9v8Ò,ÞãÞŒc/žºvEÛ»gF$YöË^ô{Ÿ d´fB9CQ@î_zwwãŽ"3ž½ƒ!ò2¨èMB=3ï'BÔÈ•Ip{O÷Øsš4‡*ÎîIÌö;ÐŒ’£"…Õø0ç:$F"“IxÃÓ¿"P9µ2}º“š†ÐÉÓY#E—rÌĨ€Ý`†{;R´÷"…LI×Å¡(Žð†ü;«ˆX£%ãI„fœñÜy›MŒ´g|ˆÁ=™{ãˆ×ôÑvŒBt‚£Æiò Uã=ˆT¯Œ¢2»íEÂTc† ‘ä•ySï6»›^`&g\Dz"‘² te„]ä‡÷oi©mõ£ÞÌBýùuÿ÷_ÿ ÷g&¥µâ·×jëçÝUõ4~=™ýÞ|ï~Z„Qþ­þø¸2#¿:ÿ|ßÒýóÉ[QJXydY>Ë9™î iã+F Ddű/ø¹¸F1æ¶ß–È+œô'ã"e‰|!¶›\¶!çQ„O…lfFÌEKºd’_îQš¨;3¿*£á©e“Ç“È@­Îéófã‹&QYêŸyö2#³¢ÝZöF= ‹5°chäs„˜Ñ2Í$Û ÌÜVtÍõèésÖŒÃ%Î #ME’ŽžÑ‘à€f\•h¹Š©tyà@ø;:"¢½oÁuœ½LX`Z`ÊÚäÔT·6ˆ'xÍÈ!AWæb/*  ¼ÊaUög–²"s?¤Å`7öe}®úªøõèvv[c‡®1­3€ œ­U¹è4žç¦¥ö×»»Elû׳5˜ïª`g¼?‚Qeÿªˆ»‚¿½›è0ßËù³Í¿¶{/p¦ÚZ869á>°¥á}•DºÂœÜ*Œ[øPÍ`9¹4‡£Fù*Ãé}Ä GùHÃ9÷3èìâh#W¡ågeFëhÙ¥”:™žìÓ`R†ag&'4¯ˆ#ׂk"/yôÕÓäA (÷(Þh„4>väHbX²FN.óQ[úû8¦¥ ÏãTôl=¿ùQÎóHLƒ ãX½½íF䬺WdIìÝ·¬ÀŠÈµÏŠ,™P¡ÞWæ?^T£÷ä‹@¨öÙ9ÂtgñE¯dDb?èǼÿ‘ŠÏ|þùëùº_vï-O‹{„¦¡ÕºjðÏÕÝwÃ~°8ë†üÞïу¦:\È$sŽb7€ŒH‚Ý™9ËiZX%fšÎDÐ+¸Ðuì ÓË$¡DàÅXaQ†Ë,fát]AzÇ‹- ¿JÂBŒ¼ “ª–lqØ>–N~ˆhÜ "–:'òÐ.!Â2 X°#(#743N4MÏ |2Žf›àžn²AÑãÄ27km5ÈÌ ]Y -#À_‘…Œª L'ð@dرû^B ÑœQ æijoUiÀ €%D1kT‹l±¡zšOÜ,ŽÔú;8wü©é}u€ ƒ ;3 ½F;Á¨h2Yàk­d§6 B'*§îG°§¡18ƒUІ}˜”Yý$™™ãùô× Ílx·¹BYÑꂯËëú¨ºÿx?vârehoG®jíWø ûµòª,¦nÞ}Oãd¹e@̈Jµ`‡ŽóÝV² äPQ‡‘w„Øç4cð¢ëhQæ°¤ë ²4}Ô¦ƒ|1JÎ-Ó—¹;7}Cn¿ˆŒüÖ´Œ+Iy‹W–äN×Ën)!*ÆÀ‘“­2$’eƒ…2æÏrä=ÿ ;ç8 ȼ§Ò“'› äÆ(Œªiâc ]Ä3iYÁA÷= #  +ò mä²*pWÅ GßQJfôfE%¢ç~ônØÜb5Áy#a˜̋ѽmŸŸÚæ¬r$kÎM϶“_ïéð×ÿú™Ÿë³øüõÞmt-gžÚý´×Ý_?Êk™†VHØÏ@&F¤`_ »GØFáätpƯu(Ü•1]Ayž~¬J†Mä„5…BQ3˜!…+¼0mܳ(BÉÄb¼å­5a¢ nl÷•”¬A!"µ§„ÙÄhŽÞa8•pwFÑöœ‰sedÀž-õ H0X1Å#Ö¨`‡ËR,ç·¶‚¢]ÎiŒ2tL68=^q€g€¦Â±f £µÎZIÚ”xÇA‰k³‹òvìýì-LBÑ XuÛ3rCM-#®±P¦Æp«“ë€=Aâ>‘Öst1=0'fÌ‚wŽ'mf”N"¬"ÂÖbjjßQfCn3x!ȇI0,”¶ëA%@ôžµ;xûla÷có‘PÌ¿…7¼)Á‰®LLJôsë¯û!â#|AÿþÊE>Ö×/Ùó©‚FmueÞ›ðóêŒà¢YÂÌh>Áï©ÇŠ€ßsÓ biPÍ84˜" ²$^DLÞpŒN£•QÝœáE.ã‚)†ˆÍ“¶ÌE~›1È<`cºÌGÒTµi»C‘‘Ûêi©÷L4İ·…›NÓF¯@D££aÄöf¬G÷Пm%|»f;cI‘”¢õT°A©3Јb䬂`˜ù#WDDÓÆ½¥Ñy‚9çqÇ8svÙK µª2H÷}ïpÖmo‘ÍÑ£U´å¬<€¨èQ©íàòÓ Ñ4ÝFP5&… LJ[ ž´F>C¿õÿÌBõ; úåµÍ²åÆSgŒ›P÷†¡ÝN-Ït™…‰®ÜGŸ¡6Y0FCˬ¼ß7ÌκÝSÑ’Bd×ãYhG«Û4®Êß?ñØï[|½ƒ±…`•ðãµöÝÏÑ7É h¦Ž±{…qÑ»¥@Âs(r„¥ *TD!6ÄˆŽˆ‹Ç‰ÖÐÂ8"*©2 ô´i$çù­LP_Nq/r}ãŒOnÉö쉢‘ᡬ‹-ÅG3¹oHÎî™tš+¢ ß´£òy´ì;B ¤U†±+k ©Ï}5òl‹½±£¡, 2àÊÀÜ .+å¶“ÒT³@F¢"¼R`­Áè ÿÚÚÍÖM³2öA l¨Þ:ñGA?ŠÝÞî`$Vœ@Ã|c÷S×öv¼x|]¬¡ìÛž3LžIÿ¸?ýj)sdIq\¾‡3ôL=f}}9øN Œ¤b†¸œÛ-s7f]ãWÖ@¤¡Iüˆn¯<¨,ÄLÓÃ$%4•ޱ®1Ì D­R»»û~˜'ʯ"&]Vjo)3úëö¤uÚ›X¡ß¯HéŽ_OKÞ6"rͼZºéH> ÄC‡í­L å4Agx^¯ÛGú<w¨8bh&°ŠÙΰàÅ¢tOE ÄÉce% Ð3žyÖ,€+°€ó›\Š©LZ7XÇÃÆ0ÂÚ~»ª»å„õ`1ÞÛ{Å×>Vñ÷î§ûÞÙÉÊ©}®È ¡_o??¢aôz?|öà—_ÍÓEŒ$2Q¯‹ÙSO¼Ÿëy(¬ýô£Ý |€ÄBe,R\ÁµhÑ)=ʦW2ÀH4b%"-Ô~¼ÑÛH¢ÀX„ðhC{Êu4"²F(zVÇZ±…-•dñÛ0Bå Êy–¿1ZÓèÆ©'­AÓŽ|vR‘ô?#n§X ‰¤b¨ Ɔ‹ßÌÂ#Aedؽaëû‹H„h÷î̇ÿð¬µÆ8–6N£Ý/¬‰G&ÐneÐel±Åýõ~°y"®?>WýÈJVÞ÷Ã;1¤ >×`t Y¤{hàDÔðÀЬ,|{DdGDô^ÉŠ¹z…#•€Ç]G(ðØå0žè \Ó.Ns{l¢¨ðGð \…£ÈÜ &ò{µ¸Ó¸øû5¾i¾ågÇ#Ýhä»Á`ÁQLø•Ü ÏW5«C½ýàúH‹™Y G§î´¯Ïjù«eáM­BV-¦ì­çs•ìkç{ÆõCÊ fd¼Â–·rﶉÀK¾-Þ»YyÙ‘b‡ßïívTƨU·5}¤Gûi*4x€©&õÔ%DDQá #ª.^Œ=f‘~ lL¾3Gãy’8¡“1ËêˆaMzĬuDOXÊß‹ñ™ Ì/Bä¬~‡|6‹†p‘µ4@ »Gm>í¶Ðì%œ¾:÷ŒïìÙɨu†¶"Ãé Ø*ŽZû`œ5,V¢÷Çú¬_½¿™[º½ë#_/V^?ÿzîì½â# ʱ<æ3O¥ä J0+:C#@ 4ˆ s­ ¯ˆ¤]Gƒ#•Fs„sËMîƒç·]DNfrÀÆ«ÍÂ2^Åëò«˜Ð~c5܉«ü ‡ØÀë¿ÆOûnÿ|øõà¸o<åöÔM&€!㥓ã&‚1Q–lïñhMY?ÖcZýþê÷a“Z\Cd J@[0qï{ 5­ÁlE’af¢±÷Û²&ñ¾ŸÌlòkïuÕHrÊñh‰åû~„¨$D®“xz¼ü6™±€‡| 6¥ÁèNH£ ´âZi£"ĉ"AŒúPÌQ3÷7f1áÓ/{vº•„a4”6"p|½Óo2G”LÊú[³Ãˆl¢¥¥Ø~ÆVV‘°rrFfŽ¿cp¸]U¨pR¶\f’À8Ͼ¢`æ¿=ùõòÝã @}Ö?Ò[¡¦ÛÚ[ò½= Ij4¸]šo» 8 9]ÍdÂ2\Œ¬Šd¤Æ+‘AЬã²ö½‡¯áç±L¾”4ìVp%pÁm‘{“‰ù*~.~¾p-`ÇïF§ü}ùšáj †u9IßÖØ¬Qa-ÿõP„„Gî 98ŒùIÛîí&‚¦Ì¼7~=üR÷Þ¾ý×³Õ Ó.k?‘Ü"¨UÀ˜Ð‡'½»CÁD½+SËpq½^·ÌnÍ«¨Â¹‡s/6ùy½ì-ñi;²0Q„¬-*œ3ÿe+Ž“fDöÙ`¤ûhÁë¸cª[C¶¤èùã <Êx½øM $fGÅ==Œ„H¶€!¶Û³…»=GËÄ!§tÄ26I0d“Y-u†›»'>;„çëyc•VÐÁû1ï}UT8—¸‚º§x<—€C)“‘X‚^³ÎÅ–÷ ¯ùÜò¾¤ß:pßî†ÒjËÝ>²L‚ R´ŠÆYÝbUð*¿ŠýQx¥®âUGH“ÈÀóðÏ @kç¯^s¬ày@âr\—3tó2ä½éù&†:Ýj>½!óÞøµùÞÈÔ+Øa4·™á!Á·¨Ü]ÔÿŽ IDATlÑ-4ÜÂ~PÂNjßw{·îæV5ÍàÐÞ³G{hRÂØV"v©§™#êãìÉ#±äe¶«ž§0©¦â|V· «e‹û¨'²íî½ÛŠ)ÉȺ·% fŸÚMÉ[#Œ¼ûNâi´»¿Ô-ב§R9’Ϙ;›³ ;ÞÆéN³;z9ÎvPÄ)æ¦78‘Àm-|ÆààEï!¼ÖSÄŒ:»[PD6Vñ¸R»žu¥û뤷t›7ŸíØd® #é‘üâ‚{3sÒK™"“Óñq n ôÌ™ËÃà 2z‚àpÉ~uDüÞ¾‡0±›Yº„U\—^ÄÇâ¸3ÍÑ& èeÄ.‰ÿÝhLÖ Ïv çP0LD—Ì(Âeà1@Ð~C; ·°iÙxÛý𺌠ì¯ùtÆðÅh (O+ÚØ°ˆÍ‘oõÞ¼÷ è(F¼XZŽÁŽ·q·lw³Yãtli.BÔbddØ7Ø›=3>Fh‰&U.¹e³cù+VN¯«ê8öÖÞjè`_‰½ß÷“Ö9'dÉgË) oÆE3ÚLaj°(3f–F®—0ÐÀÐŽšXà¼÷(‚$¤Ì¼.A‚ û¦¬œXЉ+™‘…½è¥Ïõ0™ÓB5T˜ðéÕ~ ùñäó~W†®¢e ìëÉ"®0™ß›r ½ ›+‘µÃä¼FÍ·š ‘àšY{’‡DŽ¿Y‘ÀÛG™,gÆþíÂ* |$¼>çF7û¡ÂeÈr\ƒCàÌÇŹ—Ã$°ˆ‹ø4.ÀÀ/ ‰7Ѓí3$1¯'åç1E¿Ã}c&u!›j»gˆËžxÉ<¶­Þ@0 :°ædÖw''%Y‡<0¦ŽFÚ‘ÀtöcÿªìуÇiÉÄÖ£5H›¨äûÞ8ù“jcw£±õ˜h¡½ïÛH”ŒHw÷¬ ÇÓ9‰.ÒÖèŸðÕG²7Úï´›S%r†4F;ãG9­f¥¤;ëâÕiZ5Z±@ÄŒIfè 'ó:cl¿ ¸€¨ó£1³G"EU8Ü+H Á\9rkŽ ‘qFJã–xˆ?vçØ#.Öï/˲ÃÊð ÆÁG§¸‚ŒÃ‰¼{æ‘S!ψ¹v2P‰¿#ÿx<á3k¨0ÇP@„mnà@dM:CHF”‹Xé,€D"ŒD$R¸o£O|š6›Î`Z> Á/Ä6ÂH`/㸀/œIÚŒij,XÖ;Šnñ¶‡à(.à&ÞÏÆÏ±›cèõmÈhÞ»rŽÎúNÛd§¶@|Fø“¡ÖŠÃ‚2D‰{| ™²s*Û Š ß›ÅÙþÏ– +R?«®|mKê½s{hÕ4‡bh¶$a©ð62RG–5 ŠÑu«D˜1-ð<^ŒC‡Ö)r|bPae¬yÜa µbòéÎùŽÇgœ@£á0ŒtŽñ|ÁÅ0áȃ‹Nëbž.%¸÷}E)àÁ—?šHj¤“Ø3„YªÉDåÙöžÃ{8±¨¬ÎˆlOb‘–µ$l£žûë(¶æòiý¸OG0Þ¥ƒñ7,ÄXòÁ9ª±"f¢à ‹˜q‹¾ ±ñKA˜0¶¢C86Ï¿\ä™%bŠø~~P>Óæ‘±·ø°½Ð\/Õ~Þ¤¼›GÉË“ºP‡òÁqò{c;Ä(<÷ÎV 4ìà•N¦ç µ(BF¬´ÀÈî›.w+)9b.É|oµ¾›IñÞmjø!ºÏ|å FOŠ7ÁUn{²m9ßf“c>ì2b!žÑŽRƒ~˜œ’Ó5›ž¨•4çÖ i׈8kpè¶È•aXÒ,  s†kRÆn f…Aë æTÆhä°zlŠ'ޱ’O´Oü]GÑa¥émVM¹ö™ÁXÑxVmÃ+ä1)h‚± öŒ"G£B'AWÃ.vÒ­sðÏ4k2Hï³· iÑ ¢Olò÷;5ææ˜å G®ÈS5™4ÜMaŽïùiL”ÕùÀÏóSgŒÌÀ4>1¿ë…ó5~¿¿¿ XDØ ¨0PÆ¢<”–÷/î[³þ3õyåïe)îG·ðlÞâÜÉ-@~öýø‘·ív7w[­6[Þ@ãÙ,Ln¼Z‰¸ÕÞÏM#oN©Û|¾31»*²[:XˆgHäi)·Ém¡Â3Ñ`n?…hÓ½ÇÓà\#$Èq­«Ìù®ÚvVȱ­*=\ÙMäUjþÉïtmD Dd̤_Ã?›[æy"¡ý : EŒRt¿©EfÐ ãdœ²­¤/áxy0¶ä“u†÷§VKC˜÷pÎ[-ÍùñÔ÷°uÎûS•Œ5pôÈÃÃÓwÀ¶·iÌÿêï”ÆoÇÿÏ/4%ÎêCœ_Žyù9Fg Qä-Û„WÒç!›ÇÉÍæ$Kªo”—­ï\1†'­`/€ç´•AíÙàbF¶GeYMÿm¶p¢AfÑÌ1[œcø|EÆlFΈÐAŒÆ·¢lð{˜¸ÂFÓ8ë‰)F€o›ß ~OEuêxž{ÏÆH*1íÍßuþ÷oep¾‡‰¿oŒó§)¢#M’Bˆ¾ÌOàð6HšEü ~>ŒßŒ`†¡x?¦ê3úä8ó3Ör5ù¶ÿäןüõ'ïíßÛïžËʰéíÛÑöÍ%¦­é,nƒ Íò«æž@lgÇ /è:ÏF"Eû„8ZFˆîÁ|ºè Kßï U12’‘/ÎVîblnj}˜H©\k„¦ËëÖÈú>,=ù¼Ì46H³/É‘ÔïaÑO$h债=ΤSÒÌäøíÇÈÕfxJÌè‚a8¦ó,s¦AèHÓÆð•1YÁÿ±7ÛµåH²Ä–™{Dìéœ{îD2§.dU«[ ôCKOúý©þAo$H€J ¡ºK¥êÌJ&‡Ë;œaO1¸»ÙÒƒÅf5m ‚yIœÛÃÝ|H"M"Rl}3¢..8c1—§Gl¥ƒ‚ã€âÒˆ”nWš5®E„4¿ý™P£ºFÖ†ª4D™˜Z'ÒÚê­`sIñΗáñäi¦W•ìa¸‘pÞTOÂU‹p9bÝñ±Ž:·}Em ™‘¨à˜·ƒ‚èˆààñ,8S\°ˆl;ÁV°@,ÖV\C?„5«2C*qI”o·âUZŸHi¸NœŠZc#]t%B 0U¥©{诙2!Ñ\ J€¬îîj¤;˜¤™û-R“·v­>Ã)ð®ÁB “8¢C'¬r7çiĪèa,4jJpd飴1%&.Y5 ´!u"j / aÅ[X5QAA5[*zkÆ5 l^÷"ÉAµDUAD~J$Sßê›ÅUĩ̒Ž9QUÖw]eí7Tfjãº*]3åÇ£H(-×íSźnÍ…)5ǰ.ßÈá€ÐH=­Ñ¥Œ9꛹™thÀF€‹hcD¬!*pÐC®¡£Û¶×M,RŽoP±F¬S ld”±jŽÆ‚€æv( 4%bÅ >JgDXOÃZ?BP +ïê±­à-°'7&ß(ß©8€ˆ’bÚ¡ÞþR ‹ê ‡˜o/Ƙ¡èDTé›l*í*‡×™³¡9Yc“2Ëâ(.2«¹Ï*´F@<…ïµw8 Ì.R]ŒÖŒµ‰jÒH;Jêº#Þ©ª`P•ÒÊܼ9=Âà<¹»C=™›uqŒ2¸#€6ÅŽ˜T”*Â$qt"€w*YÅS’ºzɃt¹-K‘õxAÀìqÓ•xe%Q¢!8/¢ôF\TŒ {Ê׎W‚kðŠ>’-ÃU‡=QÕ©‚-$ƒˆÖÚI]µC¥ÊÅì b×6cm²T·½NÆfR[(WXI'j‘j(Ns…户qSIY ÕÐè¡y¼UŒ’²nÅ YÕRÒÒ´z$T¨Q[³æ9LÕQCæsonI¤×(ÓÑèΊ,Ñ€ŒÃ…gÊ”Ø'_BÒ¼ÎÄIÍ=ÑÞÁ]‘Ÿ’$¶º %G¢¨Ð<@gUR»¤®$@ëâ[¯xI×T*ªÉ¹*~&i±:](ªb\Ç¥Qÿ*Œeš{MC@ª7xºY=”ˆg´uU0vt@¢ ž·ß®'ñS[ š1fƉ7)Þ +ìzsæðæ’HWMPÑ*—X3râ=Y%Ლ£¹^yIšd=;4¯`MŽˆâIM+Ä#ÐD6‚Î}&¡€äzæ±™D­¢ˆ,q&”þH|QÉ`ÎJ+/Ò ”­KgµÊR5Ò¹¸¤Ä ´}‚Íàs…@ Ñ @Ò\E°¸—*nb=iê`'DZK¼h)P1WV^ƒ€Pû¼Ýbã³É-YË Q"b†æ¬nNi1„´9izó.gĆ|X(’…Ö­ÓtŒXTÑ&F(Ñ$g3OªF4*’Pã­f€B¦’£åͽ‘ªŽµ€=8‡˜Æe-þDƺÛ¶.z»5Í"tñ(‰Ui+ô™‘L"@Z[‹}¢Nbà:Äz‡É…ðŠœÊõÀ!|@T½GݶxŒé“$ßCñ5—>`âÿX£JC¨{4éMTà!ØŠ¼¬ZAœð†V­»A(²;oïIˆÉ5¨Rr½µqAÄîême+@¢ˆ‰Ž¼É™Ä ôó•` ˆŠ5º|1yQm â2)uF)dñvÔV…×s­F£ˆX­âÔØ&Ì„‰N1J¸¯ ë€©&ñ›Fô«ÚZ `¥…ˆÀÌ46ˆˆ±ºUÙ\º‹Õl^l’YTÔ‡¬JK—¶ìv›N’F.<ÅmR!®N!¬EÀ"ÕÌ‚á`’5ᕾ‚OPÕÎÀ,誀‰«7¯* ›ÅUÕ!‰!¥‹V"…£‰ç[¤nâAgКé­À7`*73Uœε‡Œ³õ»sT`*ÉAÄÒg“µM„P]]¤B»%£ŸÖM"~jʼn֫xˆBb¬“@£€•Á0DÇäÚßP¿ŠØ-J™ À€‘¤QrD°ß`2’F‹ço¢â+Zå¨ks)´”tËË[?éö7C9½ÂKÿØ'A6BW@ú!á‹#“¿ìÈ Ê“pöܤrÖ±µ HÃÚ]QckÉÐ[óm„B„…@n*4YÉ!„Wx}ããQÓ[eÜ!Qåë¾rš‚ˆ¡$‘m—«oJ™æÁÝ~×;\JaeY–÷÷;„E˜R­ô]NÑí™`]£95hgƒ1h5äÌ5  1„,HÂøñÕ\Et‹ô[jNwÉ0“8O¾ VF#X€Š‹1J©MÜOJþT>ɘ¬œ~óðEQnH©IRRò[‡b”›ÆFh-z:"ìd18A4 %¶ç¸ÀbÊ–5”H$&±µœ@yÛþƒ# Ý“!¼\BšSòm"úùk²B™—°þh˜î∈‰?8Á Ô ðhWÃJ÷®ÿVa‘êMƒ$»ý±ø5äFMgp#ÒGºÒ?ü¡Å×7à•B!¿7?ÁÎêqqå¶õxZ” W²#<âk5ÞÆâHhDmÒBiá*뎎ø65žŒFôÊmS}ëtB¬Zj" 3­–2ö‡aоy)|™æbðÖ2ÜÝ’äbm)5‰t}¯"LÌ$x'ÙUéÖD,I#mÅí”,¨­F:°¬E˜(ÑGëdF¤ÀŽ“¤ë•Žëη‘²ïbðáWÁ\°ñQâmB®¦zƒi¡Iô&@R¬4º®^X˜lL°®ì•ªi•Z¢[)WV €ˆˆ2é«] DÖ›‚¦u( ŸèÊ;¬³†¯ðÿJ¨€$ýŠ?­XhĘŧ=âÌd…p›­ÿ|MæßûKE“]½¸Í1Œ,`ÞfŸuõg 0@: ÿÌ€ÿƒ‘ä<‰Ì ƒà0UU©:0¿örl)–òÙÄ/ Adçšh¶Î”+¶ð,“M%îî㻥ìª)ú¨ĹI‘ æ«€àF)’+R¶‘u9]>Ç/—…’­‹Ÿçååz5æã8]¦ý\çM×k•ÉY‡>XÜY‘ze×·ˆï…@ÖÞ&D“”$=öû¼uÊt˵ÔÔi]JM½À©paãªÏŠßtKë= ;pQ& O/<²}‰D—èI¹1¢Q/(šÜ}Ms‡õèš:˜à.ëàŽ±à‘«)zè˜Ã–iÁ£‹Šµ°w„"V•ô8pSJ)zBÂAr„q\éa®:^ÂìÆq‡l6ÝÌ:]“o¬løJßÇ[†Ôbšº­ó¸¦ÿœó¶XX'è¸IË 5ZQ! ²`Cl…ýŠPý#G€ˆ)a +åJŒDô‚<“óÅeH=èHcÅšÔ¨£#Ðp}Àe½³‚ô2¤h  Åi«Mƒ¶^ŸÜÖ}Îp£9œÁ:®?¦GœTè}¬ÖérmµîGóç©Ë—ñõa×оœ§/Sîóù:^–z­Ëe,ªz©ç7wwØ.Kmà®ßœÆKÊÚ¥¼AÚˆt@!ÈIšW‘ ¡»WˆF1î* ݽ¹dÌuž™¶×qì%u¢®©ýšg±‘ !Œ’‰•‰ÃŒ !l”Þè¿*³ÂI$ (žœ5Áá‰juëÿ=¿Éb ¢ÚXƒ Ah&ZÐå,}XÂÁf¨e!x¾ŽK[Þvwûr4Ã]àÔðâÛ2U_3EÅ…áh“˜$ãJ@µ¸qPíç¾?HC8RC<BUÕÄÛJPá ’Ù×Ta¨¢w{]Àð¬÷àD¨` ;J'2ܤKÿØGEà EqÎNÌ€‘gA[j3Há 7±«0' úêg’p¸ù m­/eÜ”".Ö=ž¹ª*ÉÁü+“Ëõ®[É: 2q\ªÍMõ2M—«»ŒJÎ×Ù¿yßÊbSõ˦™ˆŸy Ä/aNïdRh üOûB†Ÿ€È€þ§WÿŸ>qé‘#pú >A³`“æt#«Ðâ‹SУ2,ÈX¶Uúè¤Ûú³¯HF¤Ä¸Ü`þÀ²°Jè@¬ä ¬\D#ÐŽ€f¿Ž'0—¶<Û4ùý›6Íó²ÌË«»ÝTZkVÛ|½.®öÕ›×çË\,%ñfË—§q»9<¥ëçÇãpØÖÞ–¥©úÒLrKñˆMFc57¸@¬¡™’ÍM¡9׿4z%šK#2™êTËbšÍÝrÖ*¦nE‡Ù„ŠhÏLIé® gIôC4%ž"¶G( žˆÊä1DÝïªGpv±ó‚ÈrAŠqG²æ> z¨ãIM•ñ:ˆ‰$3|~9z¹œ/Æóezu·üôr~³Ûï¶Ý6ŽƒOnœW$ª¯€Q%k'nü=V"P5@îX?7V7AÈBz®ò»›nh©DeEࡵÝ.†8a]ú)@æ¿ ý3Y Âàƒ_È…¢—/î¦û{zbk$=,výxq$H%* 1U_7|¤küswâÔu¶J3M\V]ð*ýóàŒc¾æ*/šµË&*|º\—*/e~=^·YK©’Tž^®9wI;·Z QLSa—Ʊîw›êòr¹~— õŧÒlr—i³y?Ç#Fcs -d3oªÉe–¶Ѫ«¥V•ÕM9?¯]–y¬oS[6}º.‡^º<„°T©’ÔI¨"Öœ¤&¡ iÜdÍ5ÜhBÒ9ÜÁ­•?.ò§¢ƒD•8½Éà—±.*uRרö¸{àmâ(R wn)ºzÌmZêÓy\æç“ôC«2Že*åÙÚ¯ÞßíØ?oði@øû 1aBdÆÒâƒDxœÂÍH)H®öŠd!LHé@Iq‡Fµ«Üµ¤Øf¶ØÇ63 ÝMòù/ù$DK-òQË™¤Œ#— ]@fÃí¾^WÜ´«7ºJ _™ƒÎ5¼k½9BbÎ=ð#ýÃÈÐÏ $× r ©¹ß@ˆ˜×¥V‡Y}z÷‡ûÓe:^ê¨u1.°,©ËùãËq»€Ü§a¼\NÇóáþ~\lnãóy‚æâóõÚî“\.c£ä-ùy¬Ö˜$‹ÂÂ^ì°fFôI¡+—éÞÌÁFøÅÑèy™çn¿1kª2^§ý¦7s³ªàžT-E{€Ó£_¯ó6¥ý~/fš\%;o{þ„” OŽF¬`s¨8\]<¹2Â@bRj@Š[ÊzéP1Gb½I¤~!K2°\J3“yæi,½`ȶ”Ò.×yßíÆëx¿Ûè-IsU¡A4ªðÒ( ˆ¢Été\wkŒ%ö³¡+׿•Uø|%M†¯·Ì[q[­Ã7)´"ÊSbþ ì’ÿÕÂÄVêý¿þþWG ‚™x{F9£„Úˆ:?À[@f4ƒ9±ª3†ÎÓ‰uÒ— ™â¥Ð¤fU=F'G³µñ1X2Þ¾c'€´ ÅÛr–V—:7;Ïörš¦†ì ú§§óWo¶¹ËíâšdççÓùtŸOÓÝAÏ­ív‡®ë/Ï£«V—bRm¸Ö)U¹TIYNã|Øï.… m»Pßh„Õ›ûµÔ=Ózõ½Éækk%0}¨‘ ÒÿøÞ¿÷úåxzýf{½Nu)"z·ICŸoê.ƒ´DuÚTÊñtùðÓãv3ìSrŒÁzÞöJYÄ‘²Kǧȑb%Åt}LtMpZ t «R¡¸¬i°ˆ¬1 ÈuYÆ¥/ÓãË ”fm¿ÙºâËãó»‡CbVr³é4Åïâ+ &+=²ŠµúΕs ÉBàƒAó¢šõhGÖÛëéüáÿüOýb§ï~šs©Ú'&Bºˆ =öŠ/®.ŠWaHZÿWòíÜQ:`+²ôò/y@b|þ€ö"m‚5, l2½êf³"Úm†¹X #?Ý¥QB@ô­æp.]3ß—¨9±šD º»@$ÂKÔvã ×÷µyñÏÇq®¦ù§Ï/†ò|š›üÇÏ_½¹¯eÙv›”Qj}zzi ÅpžÆëTß¿{ ót)ÅÛRM`Ðn*“¦n¾Îš;MºÛln<) žÉânî0‘Z*D¨0oæ±ß¢)^gÞïú²”^ÎjU9<ò¦KJWƒ©<‘, ãX??]Oçº>>‚r·8·C—ÄÊRû~`Ï¥µ¥9»«÷É{I5çæÌ¢I$øhgò¸’Ç• ÌÓ8 9%qs˜%Š•e±Ý0Îm·‰f>:8›ÙRÊã8~üði·í‡äïvÛí¶£®›‡‹À#|D>Þ"àJZ’%Áð¤iMØóUv_$ÁUáùOÂLq’ l²ÞJ£²nóTà9u›ež6}Vè—OŸîî?}ùúë×¥Þ¤=Ç9oú‘P"V#fjxÌb«¬ b@¾áy¯`øé»Ï?>o†]êºãhÏÇë7ß¼Ÿú©Éé’5ã~‹¨;… Úb¢gÅÜoJ!P#h@4²á6¡ý³Ë• !Á“ Áí†/g].¢½Ý+¤¹¥ïÙSžÆ¸Ç»&44*A E.Pq®±Y¬âêæ«h%³µÚ$6†n*'§µëéJm—iº¿ë§i—¥L-¥¼éRêúó¸ÀK­íãËåÕF¦ZÓ0|ùé8ì¶H8Íc?ìÎ>ô›ÍfHmš{Íšå¾C—»äléÍ›¡ëRN°b9KJJhEQÍ ‹äĜČæÞ\ëjc’Ü ïïwŸ??JÕ¾«Èé:톮Qs(ÃÜ ’Rz:ŸN"é÷ßøí×ÐN9"¶²⎬WܰHhŠàñ‚Ñ.‰”€p‹º·˜œ„‹O8L~gÑ( ¦è€VE„žÑ,ÏÌÔ&‘±3Y|ö*͹(ÜÄ]ظ† ,æäD)ZÜàƒÑ_¤‰!´>Â:Òú°¤ùõ:AÚé:IJ­Õi*ýpw>>í¯çóéXÝaž®"ý?=ï~ûÖÀË\»Ý¦KÌÑþ|MäN³êwN­€]·Ùu6ž³¤Ëq<ž¦¹IK×v—‡ý¶5{9ϯöy\Æ÷oî“öÖkž ›êÛ¦ð$„§Hmt5PŒ*‚&0å.˜Q%³ä»Ãöt:'ˆÃçeÜöï^Nç7¯öC׉“¡·$)‹5ë6éržîö‡÷¯®çë×wR¢ªnvÓÄ?WOj,[®FBH"LWŽ7¶f U‚Gz]U%^ î$´b­áDôØ aï?}¤{k^Šï¶ùé|þö‡1A_Ýï;åë»ÝÝ6…#Tï!€Õø""LL7æ_M-«Ê uÞz†Åá¡híùNc½ß / 摚ÃþùyJMDs—’--wJ.ÂôP†ÜbZVµœCŒ˜ .²¥T d¶@CPÿäðãî ¼R®‚”nbV8SXùꎗŠW¸CªÃ4ædRY½¸²RDrƦƒªã2Ë\c»at‘ŸÁUàãÆÖà.æHê¥j·ALÚ€×F¤&ðÚ¦RÏÓÛ‡Ãyñ½Ì¹“Ë\ëqÚ†aèçi~ûê?×6ÉË´ ;1oÚêÇÓÑ[ús]lò/Çc]Xß©¦ò˯ÞW«‡Ã}«Ë˵Ïî²ßm›—Ú-€ ¢<Ž7‡«Š³+ó hÆs/µv)ÍãØ%U…4¶V"øØA…Tã4nîͼÕiûþ9žX[p]B"‰HÄÐÑ<&u†þÍorÚFäx´$€d‰ ˆ…’d ¸IìÿT …kÅÌ –4W÷ŒÔŒ]¬MÚ Ëét9Ãvs}96b)Óér™«I?TCÅ~è!Æ.ÿôéóoþìµ\Gz‡BÌ(€š$!²€¬3VxUØ÷€Ø4ÂÊyþC7®¢ê r|.‡Ã—E–ÆÖÄ\y¸“Ò0ì(¾P•uçW%as‘MOo2;è4—fHkàÐÁûQ7L¨¬Í–ªfÆq;xÞñn/ÓD‘>¥ï>=BÓåºh§Ó´8“‚Çë²ßn^®Í|~¸ÛþøñãyÔ»{µ ­3féŸ~ª÷¯Ä¦v&ædEs,3òÀÚtÛ­ÂbšH· B«¼"G$œ,@…œ+p¤ÍÔ„ë"s…5ÑŒMÇsÕ×wA r  t¸ûRt\°˜eÕMZW; \{Ü\ÖËQ/áC&Í.×±˜.­ÍV“ë4/»!›ûËT~ür~<ž^O“å§Ç—Óåúîý+¥Hêï»ó2åyêzm¦håt**^-ÙØ¶YÎ'+ÖwMiÕ$†n9ÍiÓsKwCµv<ÁjM÷¯¶ÛMf7ÏËççËqRtx~*”—ý o^¿>¾œ®¥t]>ŸûnÛuÛͦßd7Ò[mÕÜsYÜu°Ù~øtí;,Íîöç©Ròë}rMH’^Îõ‡S¹Lü׿üÕØ®VýÍë]køãÇã_ÞÜ ¥á§OŸ^½J*ß¼{½h­®fÞgB’‹œ.ãÐw×ËôêÕNLÝ}^F¨l¶ý§Ï/ÇË5«.VÞ¾z+¾ýøX>àoþö»÷¿ù‹õîå:Ïåï>=>/ûý}¢x–?=n6Ýñ8>Ï~:»zúΧ¡çÐM%_Ì%PåÓóI\ÜÛn³)ÍÔÍsof}Ö¹a$$еå'©KîºVÑ ŽßþïóC×ï¦ÚŠèúyi¥¸Èîóɧ¹_&kp!sÚ\‹-èUmH áX¤G—ŒÄ:׬Ò3­½gÚžD–¶;_äû³ * k÷©âÿ}V±„¤‚ùr)•ȶë;oóóñ²ë• k–Üw#²l7›_ŽþýÍWÿÿ“½ „Õ$C]ÈEÆŠ%‚Œ½ gné¤##Óª‰˜ãnÃ߯­ÖDÌ"\D&à"2ºMÂæÓÉ%;-áºàÝV\pØ‘ «JõjjŽæ\Á¼`×lMG…ÒœAŠÐ!¤…ù°6½Œ¿S[y:Ö±´ÖÌvƒ~y¹<<<ÀÊ—çËË¥ÝoýͰ{–ÉF·þÕîùyþ³_½¹ß/‹èþ®y^2ëO/“y>Ïíqloî^ÎçoÞ¼*¥^Ú"½ö½ÌÅŸ+ï®u\ìdyWû¿þöDt–¿üwÿí/žžŽ)g‘M)ç^–ÒËÕ†Ìíáîññ9Ï¥R;6{¼œ>>îv‡ëR†Ýÿ§ÿù?Ÿ­ýðXîúK†¥­*¬jÚæûÿå¿A -t_¦úXú…Î%ÏÏåûÇÏ›œ]Ô9ªÚ‡X,͹뻣Ën’¬Ö¥=U>_M(Í}—TMŒWí ÊBëà-U˜vîžÅœ]©¹•žsEƒ ‹§+6yl¢ÒÜéÐŽæž´‹jNJ×¥T­^Ûò°¬5«u“µÒSÊÅ,±#=RƒÃ¢¢ÊÖÄ=P'›€=µ%‚®¤ £UábºÉjh&„É`ZëP-¥dL¥Œ0K¹e‘ÜqÚø<~Ô/¿yzúåÿo†·÷zØË^„‚ÅýRdi²I̱°U¹ß±ú>È`ȸÒ);²'\ØGzŠÃ€˜8¢ ¸À Ù¢ô ¯î¸ßÊaçß?j·Ç&‡*SL=âLÑÕP+Ãö9ŽìñˆÚ K²³‰5ûüრ??¿üâ7_çé岜;ÿt<½òõ2¥¡?ž8µªÝ8týûwüüÁ5}ûáÇiIJ´«K>ûÜJ‘Ç?ÿ׿þËÿôí6ï¿8GÃã„ÿí¯ž,)¼ l7õ4Î۾˗6Í>G¸âby,mœ»œd\äÿûî'Øá›w;ÁøôeYˆÝ~³,œçi“õt<íïv?üx½ój¹^Ï…×ÙþÕ7zØm>?ïî: {Õ4Ü{·\"ð© iÛÔ*ÅzÍ}iiªÊlK-ç*LR®•’´Iß!mÝlÖµIƒ‰–®Ë‹M‰îÂ\†¦ôÕ`l•|€%ɤKYNÏnÒ«÷]*‹€h½4X»”k$U›ƒ¨iÒEXI1mÆÉÚ๩š#gvî TÇ세"Gg=‰”(fØ~§IÓ¤zïÔaªÀX¬,9g•D@+ ‘¥¶œkRŒ-©U/*9§îó·×úüW¯Þ¼Úßoå0l¶Âífçf|ÀûçQ¼—ñÌíNº¶ŽD.Ä‹à@L‚ƒc/ܱ'A#.*#°+DD·hŸ4gOÔ,C–¬øî£ô;dñM£·Óè/LÙåéÄÇËt+5?½úòáû4æV{[–y.u¶jòåÒ ©“ÿüÃì¼.ežù|©N:µÔ¶´/¯ö¯ýÓóËÝþŽ\Ûát>«Ëÿñ×—çIûývxó®Z;kþî*ñ?™ö¿øê‡Ñ\æÒõ¥ñÎàÙìðf7/F·M?¼ÞË㵦œR§ i®uØl>Ÿ—ýfCðx²?üôå/ÿN†N§|o*×Zÿp\–âüî…ÒÀ«ƒíwWueê^e}ûêð‹ûíyWÝ÷.H]ó"6-e©ŽBñjC×m2¯p–yJi¨ ËL‡kJc¦¢×eZ Ò×ZE»o?Ïü¼t¼ÚЦk§RMòÐÙS±´±aøÃO/µ6Ö¥UA°º™Zµƒ±ÁÉ•÷ǧ˵ 9Mmk›,¡¥ÌMsß_ÇV›ZÏWýýËâyw6¿ë7]—›C™[?ÌFd6ŠÐÊÜæRÜ›ˆïßåaÓuýIô]Ÿ/ײÛö‹© ï7]N"ôÚ„êf&ª¥Yui•÷jæY` š#ɦKÅ-!¡Is˜d™®®­µ)å6;’±$ –»”ZÕ8™Ój†Ô$Õ“µÖ);í«ÛFÔbn2ìØ²u©¡ˆ$P™(nfî¤eÝ"‹{ ±Kƒ Y|T‘b:ÚÐkŸ¨)Sàƒ¨h¢;%çd+A²¹Ð-%UQ8QÅušÇ!÷n>×¥Ë9 ²¡¨5“RjBÉBÍ{$1Ñ„¡Ó)Q½x‘Ù·CJ= ÒÙešýO(L®¤c¿Øõ„íúCžŸXÞfh4ۆ±à{‘‰91 ›rÄËQ®î/ziBÅéê–­w|üROWÌ®ÇÅ©¨©,õ4-Åd¬2+M–ÆbRSÚR:õÔí–yöêÉJå:-&]î¬ÔV­Î³”ÆÚ"\"‰ËšÛôËK›ÍµÔŠól>ËÆÈÓñ,”ê0QñäêIà– ©¢=)­jýrI³'q¤ÙÍQ¡…XL(й^fÒÓ {¾”Ù±Ý#õÉDs“FK"Ñ÷ndÒì.Î"ðd_=ÿ¯ùù/Ó#ÍýÍÝýáœkãe,à d%{©ÖÔR•æÆ”ºÖ¬¸4¤¥U£Š3çdµIJjÊÕk©4[í¢þ§”ÞŒ½› Qp÷оÖû] * 5T“¤€.)%ƒÒjŸ;[XàTmͳ³e<5éú´ÚË©æ•æ^éÍL‘¦Ú 6p(f “–[£S1l;»§½*ÆÖmr¦'%¤7—MªI„´*]®´f-W73aesQUµ®úg°r2ï;1˜ƒƒ‹‹då´é:Ñ>”XË”û qõÊ&"S:9—†“ÉNíô=_ÎÉ›vÌXQU¦&Û6E$EP€ïÕ>“…–ÜmQ¿>ëOßËeÒ§IÎÍ=É©(Uj5§k&yiE .e™—*¥`)æ”ÖÜèt4iµyÔéL÷6ÏâBOs%ÅÇb]«ÍÕÝQ›­-DT’yfWé‹haG§¡ …š{s¦HþuL"Œ Ñ S «“’œ‚ ²ÖD«n0¡æì u:”ÕºÉ5I‹o’VËKYv›)!œˆ.­µÖjx|°þú®þߟN*ÈFAcE3È&g§´€f–EÌœÓRÍà$ˆH3£Fd'J«Y4ìëmú¡5jNZ%+E™Rî{@rpHk¾R=K‡ÄN“(ª×L•êŽFª˜{3“Äjµ4ô@«yk‰bÆ”Ã!`HJcRȲ°yÄ]!IiÆ.;ØŒ\[.#’05k)'Š‹ÈFOT¡¸û¢Ž* šÑÉÉŽyGšÜº$^Ya*Dûÿ™z›%I’$IYDÍ#*«gw ¸à ðþσóîÎtWF„»©3¢^„KSeRd”»™ªü0ìrüˆ  ,˜R"g(Š„‚(8#ºò¢žòg®zö'Žn×"ÜÏ+"Y%Úö]Ütïaµ´njgDÀaÄRu³ùÈòZ^™¹VæâµâcÅ æ  Ñ  ÔƒW0où0?h´¯ßü^ÜGýrÜ^ÿÉ?/|ü'PÄoíÿõmì⿞ø}ó«ðe|¿ðóãŸâo@›Õn©«ï~vïíª¯'ýîjÛ}ÿÔ½kk—$¶¥kÈwÚ ± $“à÷ó†ÃÎ×½«¸É»eºÛ>ÇÓärÝ‚U­Æz¼ŒjÙamš·ÕÀ"Q“]ý_ÿñiÕõX[@+둟¼V»«¼o´J+áÈØ»W„¤oÁÞ¯WÕ¾Éú„óŠ^Ð,·­mtãûGÒ2{ß÷z¬WÄ«ìÝÞŒj]A±˜á—ç"¤QÓ³ÌÌLÄ#{9#AF^cŽèd®Y,éro`¬†ÅJ˜’•±Ä xÇH?V2È?>xßò_ä¦þŠïâù„?åÿõä¿^Þæ-ü|áe¾ÌŸ—u²º÷ýì~ÞúiÔS7²ÔݯÚ° ¯[fVc·«ÙV5ÛxifdW‰Y»öV;K²£»°­ÊXUûƒYj¯ª!®—™ÃZk”+GJòµ²•ÎÛí×+?ÏW)/@ôO#ö÷Mƒ*väz=™DDIn®îÆz„ÝÙ•²s¥I/c1ì*ÄÅ9 “U/ -1©`~þ×to`]½wƒ«tÓ^1R:ŽÌÄÀ˜Hc88dfdFt7¥rÊ+‘ódY0hõf$²ww%X(Ó’ä%’sHu#Ú¦Ú[Ú¦eß*EF£1áŽG*ʉ2+B„Ž_a¢J‚`ºiÏ¥AH®=î4‡‘ÏW÷«BT°§d$pÆ¢9>1g$ÁGÄýXñÈõ‘ñëóãW¬ÏWü‘XI®ðàz{¢­Œzq’ ˆ2nTã6î#Xĵðgò |ùõ/üÏÿÄ¿žø¹ñÏÿù…=ñýÂï¾6^7~Û­”ûî×í~¶žêïW©ôêºwíý¬Íïû¾·ºõ’îB·^Ûwõ=Z¸{7B6 w³Ä½«»Ë”QÇ'ä—(Ä––f›2¶ºœf6Ð>4ŒÙaƒ¶R«š6™+×õªlPñòfD¬æª6×#°JhcŸ¿þ às h¬Ì’,íÖu­²Õºkää½·ªªZŽUµ÷ÝÚ38^W8 FyÛk³¾_¹hønßm Z €Ì<û$¨Ú‡ mXaRR¯E85ŒÞw²süMA”ø±±C ÄŠç«sÐ!ñ¨È€FªHj‘î(b5ÍÞ‘À$oÉìâ•&S/A£¥ã”ßIM㈌ÃBŒw„‡9Rn€-‡|‹¶\Çýj+lÚ¼4à× V&áþXë2þ|WàÊ b%±|q,¢Ñ'l¯lIA³¹ã'1ÑŽ&®rãÓõC^þõÄ+q_&ø×oüßü¡µñÕøÚüÙøi– @·oµ£âÕ»iÇL˜ IDAT^F7z{ßß»/·ëö6^µ··]îö}wiɨ‚€-ËRP»]V#ØìƒãìëA*‚rƒ®f†«C&x%e¹oD”³ÝC™`EŸkYæ¾ïýªÈ•¨¸=_Ï׺ ÄÇúù¹!Õ~¸®«Ú¶ï{›±ï² -^1du|µv›ãhLMþãÏá/ 1Ø æ˜Ê†‰ÀÑëÊ]£K®:çê¡£œxˆÃC¯Q| ·èãBoÑɬ቙ë8çQ2æA ZÍÆ€¡óèæM“Ûn†UeP¸!¤(Ô%Æ@\1\tã vDи@K—´r‘`Äì#Oz«Ä°©(tÇ>~qÐL7'›8¼1ÙÀƒ+Ïà¯Ä‚ÌðGä?X¬„Ÿ“sØxn\“!6¢ 5íâÞ°¡w®ÌE~&½ñÿÂÿxá÷~ ¾6ž7~„mï›e”[;ÕÏö³^UûÞñl«¨Wß·îîݪ}ãî½÷K¸íêìÆKxYUhÇ„ì¾Ë6òî.ÐÕVÉXÛ`D›íñÔ-w·€™ð`Ýô*¦ù)n™€«Æe?Ñd]ó®0Ñà]-:2 †;˜ÔD®ËÉ‹„Yµ×Zƒ£ °ºr]Ž ÃՌူԶ‘ Ð*¹y=0~%2ÿü#û4èIA¦ÃlÛ>èCã~Ð$œ˜•ˆœÌ˜?X‚¡m‹6æžÓÖ°¦¬"“vi¤½' yX!îcÒE œ@îÖÔ3 KžøÌ\!’sbš@ ªv¨æ“ÝæÝDOÒ½Dئƒ6» Ø&Ün ,è0“XçŠ+„& ÷Š ke^á+3$VÆG<þŒÏfòz„ׇ½÷®UFÐ"RjðfÛ[ìF4®É ø.üÇþ×_üëåïÍßíŸÍ»ðÓÞÍ]ªn•ª¢ýº÷ëî]Ú·«¢öÞû®Â.« í¾w;nñU¼Kw»äFXC܇ v˹e˜Ýci#ËaFí ß€0Ï+QÅÌ[nµ"Lx¦û‘Û95ãÀqZX×Å7@‚9x¨œ[Æ$3ig,‘akšõLž¸¹Ád0ƒÐ‹É@xâˆV^ÍD‹޵ŒççÇ09šÈ’ õ»rÆßYÓ'%Œ&ƒ+m&­Ò È‡—=Üܘ¬¾'Œž`›‡KiÂYOØrQ9Ðr*bÀUÕÊ!PñÍg Ð ÇŠáÆ¿Í‘Ù'¯;'yd¬5ig ƒ(1ð!¥}îöüvÄÁ®}4B“É͈Gd®úʸయ•þÈÏxüÊÏ‹k­Ç‚ƒÈ¨_¿u7nM÷D ]ˆQ·Ð=”æb8›#Oªä_ÿùÄ?¿øUø_›?æ.¶µ»ÔÏÞ …\ÏîÛÏb7÷Þ*tï*ÕŽêØwClE)v[n›Ñ]ÝhÉmÕÔ&¹dîF AÂ@¸Å=k'jü•Ë`™‚ÁI ˆÜÔ«"Âìˆ9]£»WæÜ¹XC–‹ øÆ‹`D^}€{d.NtEæµ.b–ª9¬1+CŽkr™4sZ6™Ÿ|þ¶A¦ÃV b20Ôæ ´,Øí8_<»Ü9Jý¶)qôMÖX»N2H·ñ˜»üÎ;:w‘§Ìó>¿Cc<<‡ˆp&Ycà"²Ì„n‡fOÃ0ÐÃðASàms µ£æÁ¢ãý«Nê2=xaÆDqD†Ð³ÍA2ÙDGCÙ;‚Ó;ƒ‰?âã±>ÿ¸ÖŠ+#Òèêzâ÷íÝÚðË.Yb‰óBílÁNïÐcÝõr¾nÿõ¯o~—_ò.ÜòÞeï®û¯ÞªæË{ûgûnÝÕµ±«ªëuÇ.Ïæ«­¼Õ¯êWëu÷ËíˆÞ³EôdCzøvÑB“·»’…½û¸ýæ˜au©×µw#£A#e‘!V;Œ£³î] ˜lUdÍöI®=³›È¶˜ôXÐ| ýÁhÀæ;©X±2c®œ㓪™™óÔ]kEp¸#p7Âtþã¹ÀiÍ+&¼?ûƒåɈ›êïDô7 Úÿq¯¿%»o| ƒ–"bÚšS8ÏŒþÐ|Üp7²@‹Ñ}Á9ÌKÑvµ&²GÇ‹‰ä4qsAòbLõ?¦äÙ#*¼À·F†”šH°4G ‘&×’Ó”w0ƒÁ$®µlÕºŽY“‰O#¼~­_~üñë±>®ëZ—ŽýÜWI¯îËÑ *èeï‚¿p{ å1t<c’ÔÑ…çͯ~ÿà§âgkãÞý®®[ú©~îîÍ~ùuó»÷.í[½uï{oÞ/©Wy»÷Ý};^ˆ‹¼ÛB¨`{Nú¶–¤§©¶"ö4ò`»)ˆÂöØg35Ü25ƒbäK1ñ îakЖº` eßB¢«"­q/—”Dúíí>D5wWuZ–ºªºZm¸ínß-ÛÕ¥ÚwmÙ†‡ÛK#ÿxÌë9"å^8ŒÏA“3mÃ,Í€“Aƒh9A:›:—887#Abèó:Ãuº(êœÌKÓ Ø˜ÀJ†+M¸ 9ˆtÄp†Êƒ2 ™ ‰°;‚+Á@ K|[¨I.¿¹ÖAË,õ+V~J=榯Kó"wLÆ/axè7Ès 7{TÖ׿ýúüøõq-rú¹çË÷¾U„åY®KÁë¦+Y`º;Ñê+¸ ˜ãñ}Þøyy{ßûçæ·êEmõOùî]%½¤»Ÿ/õÞRc—Ý/phnùnßÎÛüiláÞNÉê3kFƒ n²šF”‡êR×Á+’k͌Ę|ö}øñ«æKë 0“ü˜—„ƒÞ H¯$À SíPè$àfP´¥2rÈ $r¦ ‘†'Ëd*ᢽ&q"d0Õ”±ôšÏhBU@Ü𒔚–Xd`RÊЋ@©©Zù0“È,vƒ@;2Áá‰CñÃnªÑCƒÝpñ<¿–/ÐàMçI¬a5ÞˆÊÓËxäÕ†'äÁe É‚²guÑç/ºét«Éeo\zYD-N/‘%Å„SâÂÉ¡Ük­k‘a‡c´ÓÁ6/û¥ÐŠˆp¿þøx\ŸdÒåQèäJ²XDîàF‰ûöÇDwUIF4s>5 ²J›©Õ ”rÀ`XÆ+ŒÇ„£GPR©·_›_]/ù•áB \ŽžYòïúܬ­gùYx¹{»@ ¶v®uï-¸Z<Äáf ÷6N²ÕIŒ”vìwö×€“\ž£—6˜['~mÒÊ„ÄQömpí*äxÁ¥Œ«­^îè< ¢&vÌÃËFmIºÖ°DIá-{MåØUS%=]óThtG]ÂZwµ{ÆZ"œŸŸ#F ã‘yf«'ûÁWdÙ=rv¬3iì˜÷©æ’' ò µp`26"V$ ä› º™é2ÒÉèùaœ2ªmÉÛ¼¦Äæbx"‚b<‡ÈKrÒ@®I„;ýwÔ˜"uöbÓµ7pa²„¡.É $ãºÖþZüºz&±v$ÖêH“ˆT,çEÆŠ»?‚|\™c¨eÕýú©]Ú]XlKííV܃_ÅAÖÊs5‘®PWaݵ~îxÖã©ü)9>*…‡âcûñºý|éÞ{ß½›_»ŸðTüT¶¢d±»»ä»=r§ÛQ%‰2·ÔÖŒ{n*>Õ2‚1„ñw Ò,@ÇÔh1M£F1É™J„ìéd×Þ„ÓpÌŒ–#¯²9¤;âïèjäiS9\؃èˈ`€:Ï(ƒ3t #˜6le®V ®±‚&ùxdc¨vÈ©óÎèÅÖ¨? “yŠÎþʘÀ&MÇA³‘ÈqRO?™™³¥¥GùjàtýÎÎÊ«[ &0¥å@N_êsrÏÂ1yrQCoÞœ‘íÓyÑ@5ŸÍ|D…ˆuÊÓw¸¦ óÊÙgïÉëññ?ÖŸ¿´ˆ<ŸqtYŽlprAIö~úùõ <òŠëÊÐ†Ûø~Þ¯Wo_mH»£¾ÅbïÚñÈ5_²L~TPqź°–V&Vz™q ¿‹_¥¯?Š»û¹»ã!¬¯¯Ÿýü®û÷óußÛÛ~în° º\”° [цÄ{»„n,¹CÆ‚CV;Z‹ö¤çÂÌ-y¦‚&š2€n‘F”QoÀï‰È4*ξq41çlf¼<‰|gˆsné³P%31À^Ñ—Õž\èÕìÁÈ6lnès„$àÄ_Ó-¾Á˜,TMc)ÑkðwÂ¡Þæ¬Ž)…ÂÑ€b¢.fqÆ1s*bMœˆCUNfx)àv<üI­Fu€ø4Lí »ên†KX\&HF«&-¦¤hNf%àðé‹"Ä6¦¹> µÈrƒíòƒ,5ŸŸëãz||Ütr@±2WÀðŠôL»f¼´ò£ž_õz~^$úÕõíO<õz½~ýúªý¼/¹ÂêýJ|Þ™ð×Ãn/’ð׿£ñÑêÔ…j}Etĸí§ú§ýr±J¢f2Úˆä<ü'¸kj¶0Wd^'á?~ýãóòó33kæHFfBóùBì2Öè¿^õõ¯¨{‘ì;vT‹ëQÕ]õìõUõ¼¿DwDõ³ð—×°îúÎÄâãc=V^‘Ÿ•«AÙ f$½Ú̲^Ý?[ß·^Oµ£^¯×ó÷¾‹ØwýÜâ]­­]]5<ÉF5Ÿ²”b´ºZŒõ¼ww¶¨–ÍW·Éþ´%$½(ÑFPÚ“)!£fÒá`Á{È59ëÙƒtÀ ³1ÙbtP¨'!O™ŒÉ0 Ë¢gõ‹C½&ÈfD¬<ÚÅîp`^ÝÉ_ÌÄ 3Q™I´61¡˜£Š“´‰`þñ±ŠÍDèÀìä\n=¥Nòýº®kĨŠ9åÔš© ERéïýõ•z^ ˆbzY’ºúGÞ¿÷÷Ýwk 7y/Jfù'ÙqåÇdúSà³»&5#³›¬ôí}_Û_Êgûëû¯Ÿï¯gÝM<ý²r«,©» [Ø–[hßµ¥­.ãnUvì¦#îV{dpè±Á(¤nQ“5 o;òÚ½çÛ~4·U‘ˆè~{D"úlïdr6? Gï0ð£8c ¨Vdv7(Mg ž¸½)p ®\×iÃýNÚâ”ÛD[Ò•Ñ}¾\L`}™ðÉÀ^‘!˜t~~Î >a<ä†ù‡1º=NÀ;=2SäTÚ”LfGLLbNƒ@; ‡9Þ: ƒé™jØN<éØ&ØÔÅúmrý =2Rà]¶OÕ6?M3bN ˆSEº:çGrt "¯ù'u6.ƒi\WÌ\$±¤MÖÞe8 TÛ¾ïø¹÷÷_QûSJÌÛ‚)¸‹ Ù‚äbP¾ç× ÜὂA3›ëÓüüˆˆµ€‘Ú3 ÞK W ‚#oñUüýüúëùO½^Ú{«Û–1šMU«{oîòKš –ílÅ´¶·ÜFu¨arKbÞ]2˸=I1„ È1o©Z¼iç%õÆLÐL俤n®€&_¯ˆ>ÂÀ±'©œÑšè‘’†<ì_ÉpÓ}ÈÕÑÐ,Rcj.âïãÏiÇ‚Gá‚óñ¨-ešI¶iæJ.È›-&1…7EŽ KD®Ø]t-u`Íz†i‡Âá{]±›é8ú†³ºèŠY' Ö0 “ƒh§£ƒ`ÇôÃbq”=Mðä“«Ì Ò-®|uå$µ‡bÂl#4{Aíá³râ3 0=gI{²_Øä¨* ;‘*tȤtù¼™ê#6`ØÚýÚ¿_t ÁuqFÍõ¿ýÛ/¼ú5ÙiÌþùðÁ’tÓ Wª½®˜7Š€Už‹…\¶„tÄ#°«I½>®ÿÒøCjçöºªZгõÂV²Œj 3‚- ïúy¾ê~^ݯò®.d©j©ÑÜ„ÃÍ[êáýÚケ5ÓÓQ ºÕemQ #»÷‰6—Ñ ‘èhî…|ZsÒ ¾p•u‘¾¢T\Ô>%Ó·8éä4í˜n`D8¤Z Șì8{òB'¸ã}l‹“[~ÀË®RáVç$› t³ÂKëA ~Ç"€ìV®X¼åÇ—Ì5ÆeÄ['}Q{Nßç6Ò™‘DÌ6MÆpÌ%#мEÈiI<Å;§$))" çhÝ8ÿ‹Qf‚x+`$ßÉÎÈK]v0$Ì„gŠ$Ù쀼ŽrÐŒsh„àŒuÌ‚ û2!Þ¦¯@ÀÑ;º$¥¼„P? Êi§iïËHð3Hð2*°'FZt8"¼È Nu€jïzÝ®›½©}w×¾ë¹÷K÷K¯[/Ô®¾å×ûçû篻÷óÖóÞwû«¹Õ[Þ¨}—û¥ ìæ-¶<Ž·€X*4âÄ|9»YbÍk*TB˜MQ˜i¥4dS”àm#’3ÿœšÓ#s3Nhn¤Æ%D.s“²US9ۚܺÑÙž ƒÂ?î‰%Fœ0óq‹“G^òQæN"BrÅI›0ùÐÄŒ %ËÌÅ@PÚ€óq­`HŒ¤4Ò¾Y¶5¸0QŠéÀ™ÍOàÉÖ €‘´J —œÍ‹`¢C t±FüLLÒ{œ•’§Ë˜ÉXÌ,h"vé@®¿{‘ù:A{Ì@2l%˜dS#ù¡# †L¬0þH GícÀ À 5|Ì ¼fþy1-‘¾r´+bÓùH~fIJ– {E$ë#¸€±®úñ]/¡gº2:¼w½àRµøÒý lù&+ö?¯û뾫Ÿ[¯º·ýDÿ·ÿó÷÷œv6¹7^z§ý¢ÄmŒÚìÕm„ZmÑŽFìH€žÜ“µ¨‹ ¶QRæµ{ôvšì]„&KÈ“(ÏÊ®™2´H8–Ö@¾¿&ä‘Ed»3bâ%Fqv‡­ˆIdÌ$i&³CÜ_³³“•f{4N=Õ|¨9¿ß[+ƒÌÏEb2$ËŽó„묗 LšaÁG­4Ó²ðQSÌÚl À³ÐËE–,L§ÿöa錒æ¢LâÄ× ,44ñ’šŽ[Œlœ2ÓèI¾õÄé18±{1›ød@`ä ‡ŽÖ/ DçŠYÀåó ­˜S†‘"’Ì1údŠIDЌűw"ÀèÁÕ`DKMdRA-㊔ºäÉݰ…—!©¥¦#`÷‹~õä;P!Zµ}û¾ùS~ /¡ÄWå6¿¾¿Èè6¶^·ÕxýÿÒàÝT¡:¶F"T€ÞEÛÚ'ÊÓœ¡‡´Çqj4Š,k§ÐnÃfM PPÆd Ï÷€“ë<ÁÄ#ŽÊùTgž3⮆—³=2Hœm³0¾9Ùƒ°\)ÉÈKªŽ3ß±¶gÀj¹Ž}å8÷‚°±$=€À8 ;#úS•Ÿ~’Ó«Ï»H:FUv ù„ ¥8¡§³ÌH1Ày.ƒ°Õržö•g]Àùãˆô©YîŒa9ªTŒ*UPΪ!ÖèY‡vôîÚÈù»³œ6¸Š‚AÕ †€n·Èå÷KkǨžfígg¦ÍpG¾G@f|þùoª;3’£&x¸1;̈ P0¨¤ÿíñ1S)¦|A?¨M—;ÀŒ@pg—¹E‘´«2voµöË?Û?æúnGkI1³Îq¯Ø¬¦ð÷¨‘.!Ç× ”ÀîB4CÂ7LEI e¢ !ªÙ´ÌGKmË rí|.N¼#˜¨&ésxµß+ÚÑYN$Ö¤=ϰãLCĵf¬2Â(ývÐ}1ëÎHZSÌŽ“…#Ë<‰]“â±íâ2O´1 †óÏÏæÙ#à òDܲÏmª{Jù©kAÅd¤½wuï® Ž( p`EŒÔ#£f0f6Œp8zÉ'T~Ì9GfÅ‘6f Å|a*ÆQΓeŸÚèäÁÄ„Z%‘ƒX6ÇE„YLŒÍ„ãÙè‘YLÃcOÐ V®u}ö®.»ZE]‹ðŠäW®ë‘‘ÁX\ñ‘×ã#æÙÉJ>Š%H :¯+ñ÷—Y™¤?z5TÄîª{ãV¿/iK=B†o!»c—`v«;”© (on[ŒªY­x›¯I32 –äL8ËÚP1§¸¯t5D´¼)!aHV5#ä9w–ˆj‘yVî'à-çd ‚P z›ŠåLj‰&óà Ä{Fª1 Zœµð´VG=G"£èöœ}ŽPR+¢ùÞŸ ä“Õq*,‹‘Ç2(i1|Ôù3aIŽW+x&ü†¡ #ÖÙSÑÓ ˜ŽÈ™|r*ÂY”£¡†×Ìvfó7ï‹æ¾°`ã@sP8Û1ÄŒtY §dx¢×gc2/-O(ˆþ0uFXFF@¾é@ÔÔ÷DK9?e­OD0f®£§ ÞàËè.U9à6b]I^‘™ŸL®?WÒ(B¾¤{»ÁÛPã"›Pr‹/aõÚ5Uíyj'ŸmŒüîàfj2»Ë˜^4½§ ™ ôø¬ê·xS9†39 ”þçzotxê@=çk/ôƒ3y†¦„š|²³buá0¢ÁÇÄ>+g2— t®Ïä`ÀÇs^FäTj§*sÄIx›~x&³˜Ò4k„áÔ[‘6z&Gê´=Àïw#ƒD4µ"mÿ?ÿ÷ÿe×ï»ßF­5;F3 ™˜uo©væ  rOXF8­ˆ¤ÝŒ·€/W0mûH ‰àJƵ>—­^É|€\ÁŒÈ•‘$X´a\±Öç'¿âúàâçãñ,æE~ä‚áµNû:·h}D~"”¼Hêä"+e»IÔGâr&(À.>«^ÒïŽQÕ«¸•:nn»„M5USÊó¿ÿŸÿÇ_ßO·,lqËá¸e9gL9ÊñÛÝàÚãIfÎb¡$åý6 F5šj w€=)k²Oüq¼1‰çÎj¸R[3âbÌíä §S˜šW't5ŽHf<íÅu.žÙj ¢¡CÂ;•«ã<€ä©â Fˆ¢ºæ "‘‹ 3BVdø½v˜"ïÊ5MN¨¹9S—ɉ NÅæ G9ÈÈã!sGG"°pæüväA„2ÂR0þüýõÏç~Iœ˜Ïo4Ì>ë8NÕbu$à­)Í<çü[mñ¾8ç¨J$¡\¹§9²r-p¤8œ\˜Ï€¡7"rþÍÔŠãÁVuÅ% ­¼V Òñ¹õÇÇ#¯Çbò±®¸t1#¯ü…•ÁË+‘P$ó¯°whIÞ©kùÑ—[î6øê~V‹»ÙÆÀZªpOòØ ª‹­µ[m´ Ä?UKàKap Û²$m‚, 1‚"ò6v«-øä%/¡[dÃ;„ˆá4Üqô• 5Î}³N35^C°ˆˆ(þ­?ô)_ˆ%yéžSŸ|Dhwdnx>¾íe&"ä‚sÜ­žsÑ­©¬Ãd¶ní%W9Òûµ2Žñ´Lä¸ýÐî£?¹ù@r8ó'd„zGHwbÍ+œ>S^LÓ%šâÊÙ@e¶ÂT,x«ùþß²I’ÛM!™mi:!2VÌŽ©å4À¹+CÞR,FK‘ WþqýÆn8#ÙÊÙ—e Í\ aºZ€:-cß3ö¨kED‡6…;" /òi\ w$k¯µÝ;È‹ÄD<‹g ¡ˆv¹a¬[•cS²ÉÕ›E¡™ÕÕ­ÇmwDKá*†Tx¸ŸDv£f¤\-v^å­ ¹¬íwCMÈÄàL»D¹‡ögoqÅ´=á)ØÁ>í0Óì«§i4W«¢Ÿ/ª-Ô¾ho#$o³ˆg·H Û.Èé. ,ºè6M¨»SOŸQ‡{mlH“d(U3”ô"êMÈ»=U(¸¨™hÆÌaa¦ÀR!b 2SH(Œ’ã4•¥ôLÃßßà9ù‡r¨7¢s¦óš¾açx˜`7É Æøj‚c«áeâø†b®4J09× ³W¿׿ÿû¯ÿý¿ýãñùñ½ßeḌltŒyVÐ4¡ˆExEvÄ•<¶š2®õwäšyÔ¹š¬%jœmôYš‘mÇÁ%i†@8®>rå„‘>"Ô· $‘Ó3d@Îór#™a9°r_sb™V*EÙ!ŽkÆÈ0“ Tp8K[.ñ_Tsfà!²Z-´<ÓÍ›rVÉÛº‰¯­2¿_ýllòª»Ým³vÉØ2ŒFÂ|R·qƒ@4ÝfÍ—9Ža‘ÆHÇÙHÏÜœ…mîIBV2¹»™—-Çydu4ò„Ôv’³„XuNÙ6ì’"Î7¥³–<Q‚ rDæcV‰È£÷A6µ²“1Íé z ¸™ïúdvÒÆèÔÎ縜ҀzpÉ9 c‰Ê_ÿø˜¦r¤ÄgÍųÂ3Çž˜6á³ÏEÊÿýßÿñëñq?¿ÿã?oëÝøŒÜ)þV+L>õw$F“÷–;ŒÐa&Ikê±qŠéˆ‘äѤ12»ßC_ÄAriy)IoæºLX ç²(-cæoÊ £Ý‘ù½TŸÞ,ÂDÏ™€™¯`”ìèñå$ÂN-„‚¼rq6á™/»÷NøÇx‘wÆg\:kYs­‡hp ðÕ 2D•ü’žÀnߥó%ȨHiwSb$ÚñŒp£€‚_ÆÀ*{ò˜gC.#S\‚%ªYôöQá$8ëÔ[Úc‰²‚Ù>kÆÏaA’€`Gýw}Ÿ™s s”혾 ¡7ggþò›¾ÁžÜÌüæE1c¨ÆÓà5ÐV[ìÐ{ámÀ-öÙ|û)E.#ÖµùññÑpùxŒ^b´ .b@Ê5›¦ñmN¹.£ äŠûÖ¿ž?*˜¼4Ó—Ñ/OGކi] ç`žyÕû…㨡dÙìýÊ\£‘rFHzŸÞ󳿬ã”óîæ©MsÀD€+øç®‹c†˜‘¼®•q‘Éñ†¶ÈŒÌ Ë _fÇâÓö¥°¨ÖÅ Qvf\ÌIVà–_Òw÷6n3 ¤LO¤N6´Û4°gâœ`²„»y«¹íçÁ¶1âÚ[Ý D¿ Ómð‘[o­¸ÚÎÐXKha[sà…YŒo‹Iwwƒ3’í  !ÐÀíéó XR! 7ÿ?¦¾l¹’%ÇýH™=‹ÙüÿoŽMÕU8‰yCÕýÔ[)¥s"ÜI¬|:Yv)íM€Í Ø1¾ªô°:Åv+ãM•€`zfåHýo’JŒ§@MšcOfÒ³Ê #¸âÑœz/pF9~I‚1ãÌt}kØWy O^ûTêüny†IÞF}}ä;í8zÆ]˜ž[<×~ç–øü£$óAÕ<±ئƒc 4§®MëŸÑ?àÿ£/=ä9¸šiÜK£îôL5|=ÿˆ1£P‘t›­ÂL_<ÆÏ¥pîÌþ˜“x/Á6zˆÇ±…úõÏì\8  Ê#Õâ@z–$ ®ympþDùçÀp;g”zâmô˜‚°Š¹*ÏÒK+wg&C@nÈbÑb°p’ÎêÊ IØëÈoØ[“bbi.p7“Öc÷Q]d|Ž8 Ÿ„¦-ÀrGhUhäÍ÷¹¶ëïß/ÛұłÞ2$™#Ul»d1§òˆ(•HÞçŸ<"柤8–ª h„b²%“EÇ…Úþ} AUdf1QPgà«Ð%ÑÙ%çêæ;C‹fEôàÃx ø&"’r©HN÷ôü«5cÔ± wnŒÐèf}‡LŠDñ°NqÜåyfl¹}¶fìi{Jè*á§ô ž“]}7‡Å’J£:‚ªòí;üGºãGcñÇÈLF‰à³)1º—ͯŸËItI}ž†Ñœ=§bpQÕ…Œˆؘ7q•qÇm£<²> žîÐ$ª¶×îNx4’‡v]p0C'£ g0¡½KT…0zîÇrF§ÄhDå £êÃ^J´^}"Yà)Û½áÎè‰ “U„KÔ‰†¨EËAóh}~M"éjõéΜ}LçXÈ÷åLUÕsëÏŸEÓµæ²üh'ñ-6p.I¼Û‚{Qy»Ò$qIš») ÖÞïÈÓ 3‚YŒ¥ä—¾û·íÌ‚ËCg¥Gh™Øøí½=Vú´[6ôBÂ^:Ó3íëaÕx,iZK:lâSüú|T:âùú"U”DÌX{©FâL¥Š-•ª]‡GAD± á#Ó•ýó?Ã`”ºìO,ú)ü´%•ðæ*]"OãçÎÏ\¯K€xf†¸O¢& áänœÑ«)KR¼A{È6ÜÐ5ü` ö°9¢Aõð1¢”PÞøÛ„È8yÅr *Ðê©òøá‹‰RÂꊵÑ7üD런•@ÑàéAW˜aÅëh¬Í6šO°" £¡ u9¶Y5sCí‹M¿ú»è5G/zùŸ}¬ïïô"s@6×8»´âÍZqjäOÑ8ëÜ0vС8o”\ˆP\£µ“[S¬á èÙs”b”lÎZhV¨†M|&+2Âhì4â,Ê‹8A±vŠ Ñ VO(UÒ–žC@ ³Û1ÒöÌtd·Î"‘W +ò)û¦WzBGgŽ¢¤½3¸òÃéóêò Ô†¡ÐGu*Ç8ë3€ Í#UTn0~ns @·ÇøÜöwYOOÛÈ7GBRŒL»BÓŠVy€ÛL¢¿ás*ü”l´)ä³ð‹/t¥.”mŸ°d'°lf€ª£Û}sÂ×6nF…•"§yÇÙŠúó÷o}¾zÆ!Ÿ:¡5©£°Yñ¯:_q6`ÐugI49†£76„…’° ;"ˆ|e{=HL”x¨¿5Wk€™üô(ððZAÁ(¢‘ãŸW‚‰¢Æ·(š+øa)‚dª’Ÿeಯ+eH¡`4œ8U¡G’f-RI âj6CQ‰o¤{àdfÈ_çm9"€’Nô}1Yv76ieµNT35Ösàt~ÖIa”,Ž)öxØ3}­æé¹SŸ¹'¯æÚ_Ï ªJ5¨/I!M†Ç(ŒïDIß&·;œá?‘ŲÆZ^”B€ÈP&‡') Ïo´-š0ÿ…j<æúy.àΪ ¶ù n”\<…¹Á*íÞÄëU†2ªOa¨SÇF‰kÅÙho:tî¬sT_Õ3ÝïÙ¡,ò6Ç‚Ýñ;y+ïv°= žÒ8î™ä=H˜u5IÒ€Ÿ:»¥Œ¥2å™úó}ì$&Þ*ÖGæ:ÊkÔ‹ï¿+  Twš/Ä~§gE¬óŽJ´;ÃJ8D|X<éé@„ÉQ±ÅÐôÔx¯Q–yX™È¹ $ŸùKžï“‹Ið$úʤfC/gìåÿt6€EÙªI“¸=£µ¾›y‡ÜÉ8êTês.Ç®ËÕÖc&ˆyç;»/Âë}þÜöÏ59Îð¶`¦bf¦ÎO§i‚Žõ†X‘ªÙŒ'Œñ˜´ÆjŒÍzìÛïÖÀq]iŽKvôøƒ›õ.I%@o±n^-²’xL±ZdyÁŒ1;lŠÉà4pT!çÇ4±·> +8Ãs/Y3WÔÄaØÓpT<"$kÜ¡‘J@+:€ìшW„c(ýžè£%:PÑbŽÊî¢þþ×IÂñ¬ˆ›cµücƒ‰-˜6ÊNg~D¦ãUt“Èž÷xWOKj äj<ŸÚ•å²\1ÿñ©À:u°gv*’J‡÷°Yx+ÄDˆ >$©¨9“ u#É·'(áa êÀ·À„sOÙms¤FÍTc渒²T5ñ¥MçÂp6¡vp'JðÇ£é ç’ç÷Ìusf`?sGÏ]ÖŒo®$jf7(3éþrZt‡=&Šæí¡Ø·¯Ý9#Ç[M ý{ Ö ;YHPr(¢ =M½Øþ’Öe|X¹&øbJY_»&“-/²ˆ$3¸y!& ýüÜ~~ÈúúĤAkÉ;Ó˜%}L2qd ÛdA~ßTd¶‘“<,Cõýç3žsòZí“"‰hH 9”T–Já˜×l…¤,Ša§rNîò±!nÔK¥è&° éñ©h¨gßËUšÆF#ƒ¬ª˜e<KÁ6U*å"Öm9VÔu «ÁØ9 E@4Þ~È5ÚÃ*qú60%«ø-èDò#ÒÖð æ6€±KrG¿1Žº´D ¬87§PUû°=פ¸Xð3ï M5yí±žÀvT5ç€{ÜÆ$ÍUâötô,äõüÐØ}xdHJBP/ªÇ€ íw²ÍÊIÎÓhŸ|’ÊŒnâ‰b/xe¥<¸Œ=©sÛ–‡‹6ì€ÂR…s+¢”.S ^N!3–W;!ݾm'{„@¹GËZ«£Mç$T‡ƒÄ?fžÿó_ô@)cËwÅõqrzB¦PJ_† ¢,ºYÅ»I¹ø1GDÔkäŒ*Êï1¤bÉû­£–$À8ª‘–ÂfÁF´¹du‘žxÝ2¿Jã©RÛCœå=n"à~/S|DW0%“S<Ì‚5è¼?°‹jBMZÖ4 u’u¡xÜ –‹‰õÀÅHÅD*­ŠšÔ€Ãù”Ÿ]P•¾¦8ææ²žæˆWFæ8ÒáÍ!Aü+†y“¯MPTk5*ÏXâÏ`ˆGå’ö:×£LÇ ]ˆÄÒ$Úتˆ”Ï•Êø5n±JØoílp=FûîvŽïÕePEdX{§Ü’N&G¥µ+)!Sk°,GÅ@éTÈ Î‚„¯Rˆr‘–&3Ê€Ì[&<¨:I€Èr‘sZD&ŠêïŸ3s²g2êegYËÄGSœˆ­c$øU†—® «Ñ÷ŠÊ2oŒ»wzÓb¦L¨óéiÉPCè@¬|sÿd€Ð¼û¬×`êR)Í\WFäîo½]ØìyÖr!„ÙÇŸ”ÄÇ G¡kq²ÛGÖR¡™QÕ•p¸‰ëÒ ì„›g†d’¯p­ÿ¹zhÂ?V³Ê žœ¯—x¼Ó¼eJ©“6ñÀ~ºÁ33½!ÌÂugšxE7Ƹ4ÀgŠSm´ãNΪl°¹9t¶¼Lâ·º‰:3y«€îŸö¤y©„ÅIY¼¾¯.7ÃõM/£Õ)ozJ0 Ý@ŽX%믬Œá®¹N³ÚmžÑS ³„©r»lÍ.Gvˆ°ªýÓåR"¸NR¶:/ÿ¥8åkHrÿn„ >f Ñç» CÅH °æ– d{m$‰ò >è“?tc"|6¡eE‚¿xŽÄÆÚ5_/?;žMGå¥_—j»‹Ùe‹1?”F CØSSF¢F& Xù÷}@‰mœø€‚AwéãÌn Y}™¡‘I¢'ñ«éÇÜP¿•”.MÖŽ’ò«d¦À9:yÂB•ÔhºwK±þÓþQ2ž’R–¾Àõ˜Z!+È*ñ6îÀTTHÉ”Ø_?h·r{ïƒå8°Wh¬(=t^U¦¾ ÒÜüI èÎmÚW„WÆpÚÀ@XÒ'­‘‡™Ñžr“C¢ŒAbqfÃrZן?€t"œcr(Btœ Ã̃÷¥qú? Wì´Á‘ ŸBA ƒ+gu¨€¾Ð†?)fÁ3pÁÌ1³á Œ8ä8W.µ’"® ±òµÄ¯]ƬE&Œ^¬ÏÆÌÙ§l«¦‹néÇâÏ  ÙÅŸØ©MtùD.‘dHÕÀîa¥nÍÇVD˜C`½ÑéGé/VðÜÆðÔ¯”Uçßó®îYI§Õ†ÀÇ3æ  >Ä?=ŸQGI=nûšMUL޹#Šö©0¤7Æ€ƒÀȲÆNnÜàHÃH7%¡ŒîÚAŽa³à|4Q\W$#qN‰A«ÌÓ¸‘ !;ÕjE Æ™×ïÃ’”.E©Öÿ-í¬—D é“ÁŒÇ)æqãEÑ‘ »ˆ4¦X!ƒÃЬ?A»U…}š°…Xaéþc5€‚æä<¥n6•fÇuÁ»@}Á.‰¡ õÎbðaµ':‡CRÖ¤=›@–d/‰[éy«ûì05ÞM;‰KE2£h!éz„½7Yväáö­‚§ÓBYúˆM`qJj0vÈ8¥c¾Ò|)•Vûº¼¼¯8Lý$¥þ♜ƒù1NeVÈÖ~ßFÊ8â’‘zyhºÅÆÔDI<¶Zô¬YÞý?TMr^ǃ2‚äx&¼Ù«!¯gú2±Çîƒõ¼KóxfÍÙÃÊͰ±iIŸU%`Ú& ¬QLxÑ9GÊ%~Áú¦…$y^90(9¶½¼Žä¢¿pU@}€OÎî,!Ú!¦rvII±ŸF ¯\ê³ZÄËéE­¢ !2Šß—þm÷j¾Ù¼&™É‘‘¬˜S4qsù•œhòÏ`hUOÄWg]^¸)h18cí¶Âª|$Ó(Í»X¯'˰7`Û°K,ÅáC@`w… ]€ì\¶šHMlœ%µw§ß…‰x‘ŒՔ؅ÓH!IäôGÞMÓcÅõktÉîoÈœãö°Å'F'°d3ƒks’™èú8Å&8–xÚ·ô“±A5‚ ÷WâŠô±txø‰=ï`8rpÄ‚ S@JÎ!®3ñ™¾Ä•”¨~_¦@àÏøPMœMÍAG¥6fp?9â ®©òåòðj2€Ê8xø*gà~i·µ-Ô/.å˜#IU„ý“aÐPßßyšCëyÏ?žÝCINrÛžê¹ ÀÜ8 ¯‚q¢Ðz)(’Ä1ÃÆ\•ºì½Q.LX0{n@|”ÑÊí‹‘xfÿâÝtùæã0ÛµfÏUUñéú›¦“>”¥…»=Ï&WÆvÏc1. ³è’8îöºC‹Tħ*Cú=`hý¯+f; m±(«Õ`í£ÃKþí9D‘#«Hé#Œ bôƒ6'!Yíï8ÏhP¶kØõÙà—ÑÀÅNÐ-õ¤’D%s #ÄûùÔ+=¬&ÜIz¨("à­S‘Ö´!ê&éã-ÎÚAcA§þÒpútŠœ™y£ô²ÇʉÎÍ׊¥ÕϽ†¨ b ié¹Å¥ôg:mZв+Œo® -†`’R¥3”üØî×G÷­?¾H­Œ¬²Ô‹væð01Tb5MåÓû~Ù1òä¶ÊE¦rf+ìÝëÇÌŠ |öÎS9%e9aD;:ej¢mt.žU¨ °‚é#ésL„¼™¤S¦j9Ž¥$ qÅX‚t¸€f<ßÇ!âÍàLa*8…‰ìVOÔ,9@N^’3Ù¹aªªØ3Cþ ï.¡ñM=ús˜g– à„Ä£Ÿ¤.”Æ~–П°« éÏô Pæe³5Û(×øˆöáƒze_)TùH¾O”u†uÑ ÎT˜2l€MþëÅБÜ(ÉÝÑ)€±Oì‘"Áô£în•Ú n.¯*Qœ”פNIª|}ü¶ØÑ©Ë}ݹ)ÕÈõ49‰7“™ÉKuõç²ü¯è¬ÏCkmOÎÔiW”MöôG ±~­HE‚îDâénó^­ˆZ*ïl$)›JßêÏ£\Ót äŒK¬äyÎr½F(5p&é7£æëÇÔ¼ _ÏÅÚl–µ6yƒI„{8ážÎÈ­…ha O¿&þÀ Ñ¡”éø`¤?.WÕpI ^¸U?ù³BÐíIÄ#fæ›ôØ¢KÇz#AA¸ñÓ„8AY‚1“yB Ì ’²Du,2à/ú£(‰`Bĸ‹…¨ˆˆ B'NÆÚF3g%£ÐRA«ò z7³D>ãÃ"ûHôXöQåŸ@rKiÙHE€Ùœt,%é‚,tS ÑwT ~Qø½²ŸJ6N@}¾röfOú˜òˆ,9½Œëõ—§Y%p´-3Ö9R’3¨¤ÍdÄ\ŠUÄøcP:±¯‚%1axÈÜ8`«:Ç>ÌÚ”*!w4£/ T¹RR¸\®Lý’ÓF:-Åß¾k2”¢©Áƒ.qøYCùË iK²#1Œ~`qË ûËúAšë¿W>“Jü>¹µêt¢›áp m´ Î4šS$x¢ÛºžÂ¹ƒÿÔÚŠ¤ù­P†uÇ=ßÉÔÊóÕæ¸?‹ùT0å(BW2íV:CŠšLæXCl´ÞÊ"ù $ƒ;~rsÊÉ*K9ƒÂ,Ä;6öµY°²¬ ¥DœÇ „2¬p†1Ž#™{_6®k,©¸íôhdÛyø I˜1Qþ~Sc+hej5ÓÉÒ0t {qÁaý8;… ˜µçV’üùZ’ókúE0.±µÂ儤/ ±ý‘®/ˆ2;3]Žrîž5qþüAÌÔº/:ôF<°õI«=„’xrÒÏÛ’ldWîè,‘BE[;l½¢$º§K¼s*²ÀÙ|uJVĹIç·/úñ ’E.X!»0 ¼Ž3m¨z&øÌ±=7dçYY¹b¯J=ÂÂImflÒ~Ï3"Z‘i”Tµ>.ñJÕ=(Þ™y“-×6ÆO;¨¦¯fL{Q3­ë §;<“Nk€œnWìË–¶Ö¬Øb&Š?ˆN¥õÎ6 ŒáàHRr”8ðÕÒò³²£x1xl¢¥·ùë ^ÑÆØŸpøðRBX ^´(õØ¥iS.4¼Úý@‹§bµæ2“¹’鉌¹ˆÏ^-çÕ`PžýÉ“›E8žÚì“ØVF‰.Ü%!%áSBŽ&°jU®Ü±ã9<ˆjªÊÝCqH­û IDATú=¢ 'ºsGïƒ.V"$ïÊ­„xðÐðj`Š5ÝÛÃD1ßuÔtÏ%ôA-s4ÓÐ?3<yƒ±b2Š9TÀ¤IÍ5N³.©¦?0nobÓê)Þ‰%ÎS$õxKt-¶G<¹@ÌPèi¨ì‘†ú}.ÉwÍdò^÷+H7Ø{¼Qy%I0"GPoôgÒ"ŸË¢;¾•”$i`nÚÛ’7‘^l¼ˆµŒ<9Aç È f•ëó•^¢ˆsúd¨@Q«’X•g–E@HÍôïo)„3A!WÑf;þâôIÛÙÑ0::0n¦IÔ4¯í(êU•)Øi.TξXв—p!ªlï3Â1\ë©T•ÆS~•JA£×gÖŸüÌSÝJ²ºÓ@£]ì Ø'YvûÊ-Þ!Õµ‹&4%[B%ì@PBmr¯„ßùPܪfXõHòð‡#< »¥^(ÓÓ<:=œá‡c×$NpìðدÛ@EØ8î±ô•e®“Y"û,g>q̼Ë.ƒdÄ pL¼€6,Ú¼3U•_\;däAY2I±^~Q3¿çÙïV™…Šb›Z”Øb#B©fæd‘_íÒ6ãñ†€ Ã¥ÇSV$>õ€§*qí”ì©ïïzcŒ5d8ø;Ç~¢ÿ–™`?»Š‹þ¯>Û=Ím¡À7ÖEQñû„|_ÇêÉ ¦x2ô4¡·V$J0Azé „JNâMÁ)xâÛËФè”!5‘Pä¶q=ï÷ÚÑ&B ªÜqŸA“Pé“ÉżÜàîó3Ÿ:ù3n¢r¿ÑV½Ûgz;‰lI_ÑmOó@ㆡ™sÎ5žÃéSuœ‡oÊ©X>¦¹ˆÑïþ$édðúõ*SšþO£‚ðš§¹8N¥PçòÉ\ÜäÉqíë!’6×;"ÂìnîÑ›OžÝüöà‹€_7,Õè¡]…é S骳gfTŸÁvoØ…å -;â'OŽÝ¥ZO)âó©úû_éßÓ#Q‘œ¸ó­=äÚNƒÆ¾¶Æ3]KlG‘°Ïȶ]JVœ\!æÉU£ˆé÷A˜ýØà¬Z+våôá0O©ÂÕCýÞ¶Ê‚ b³Œµ$Xl*JÇÂñî9‹ÄÊtNBâi¶Ü¥NŠÄ‡Â˜åób5cKeh L£ØFâÌäݪ )âb.÷íTô8djØÊÄ7¦]"*Ý0 (æ­ôË1ˆ‹5'_ó´gKæÁŽS>c±bápÆ9äTš?бD9 ž_ä&GÆ^dï,4!P·À…¸Wã¶ïS¾5c„ ·]U¶æ—OÞµ5"¢›á5(SXßaç§ÉÎw¢ØUÊ'0n²èœ'œˆ‘o'ú„`1ÇäøõçÔ©Sß¾1¹Ðê•(Ô÷²bZÌC80¡<ëÁæ‹îà âw1bã?¬µ†IÌ»$s½€+v_„þN¤#Ú®ð`ž,ð‚fwyõœP(Ô5l× ·GJ¸cÙ(!©‡>jv5r!ª7p➡ʯ-|?Qy-yœ ‹Gþ²¸zfž`´$ñó•ŠÂÚQ¿ª„8K6ìWÑ×8óÇöŒž±Éƒœ¹ÙUŒ|7xç¹PªZâÆ°¼ ÉEõ”PæÒçŽ/ÔnâSþ\PÝ/žwÄ d>Ó 4lAÚÓ º{X£„®çTزä¬-† ;É—%þ·\ÏáMáliV¿×·Û_‹;»hfòej&~ª2ªèý+™ÛÇD»7 l or>×Ïýùyžúú*1qêË’2~Éq‹ÜŽÖ =©U6Aô]Þš‘¬HÕ~é#Tš'a$¼áÐq1†Cß§såyorK0­¢Ã.m _”ÏÌ”3ûO»DÞrHuÔ·- €Ë’p‡wË%ÔË"òs6xl!¦,'´¥È™¾« F'Æ¢táâ7ÝLBp<Ïd@™Oq²åÍ~§‹e¡ì2ËAm>¨^(|û¸Å†?Ù± 0!¶ƒ®T'' é7‰`x^ò"¡ÅvØw'º£ ô~ EíÏ&Ê®ÈT¤;äá›L<ƒJhÞˆòÒ82ÇÖÞ(@[Pa:ª,H'í^„‚vš?Å(OzÕ¦ k0ªÈµwFˆI[•‹m»JÊ ÐîŒ6xõHõý爀ž”˜aŸ…!r°ŒçÝ_¼{T­Ý2—±Ò¼6öVA <·âjÒ¯V _üaÏ4»“ÿ"õ ÂÒçš—õ8Ë5Q{ØÑ Ȥ–v^-…,̱`ñ¢õA“ÉTJ#á|årÍ‘U¢‚‰àº™u܃‘sû?•“1£Ý!¦r”»“…˜©Iþ—ú ®§©¸+ã2iRœSV»ëPƒ¥ñ\#Áü³×ÂX/žt6g±ŒÒÏfç A@ùcç aÎüju¹hO÷oG3À«I|ˆ*gÅ€&…0 Èô»ý¸œ œ}T ÁH[š„ˆþd€€Ë;†ì Wçr +‰š^5ò¥FÆørˆïÀ°;¦‚بïïG'ôšhðRÚx§Ú]ÙÉ@è<âÊ‘wˆfG ÜÅâ£$æ[Ržc‘â,¥5ežxë̂”^ds 9Ô 4ì‡0ïL,ٸ8ô ¹Œ¥ãlN±¬È—æÒšà31ïN—ï¶r@÷¦áÖæçh-„˰• J³äŒÑ&#xÈg9Ÿ´ŽøÔB"Ø„6þܾ„$rÒ–E{8£5² ÇêŒ L@×Nâ3.VFtF{œ^Íãê÷“¢ã8*ÙB½¡è1}ìaž÷Xf ¹QÏ ÕâõäÂÌ4ä¶c-x‡ŸÕÔ 0.!U-EÕÀ ª ÂC-/:Ùà¼gÙ¨„O~AåÖàNF0‡,}<ù`Áúû÷‹ï¹¸XÜËK癘¥qëYªän",xˆóè|¯ÎYhOà‰ž&PX²€9ÿ8pý‚G@Q7Ñ>&I{>¬Fúzv%è‰äM¢ÓBq59Hyy›Þ þ gü¥jö¡ÊŠ&oVÏ# ÈzÐ'ƒéÊ€ªr¿Øm³!#ø‹ÊwE2WI‡Ÿ¤Âê ñüxl_UKDXLåÏß—öŸöo}3+pu†YW3.^)5Æ?ê“mL jœT¾$W~ÛÉ*Ä%. ô“ÏŽAÔ S̃¦+·µôž…Ùÿ8Ž^e 'ÆdÓ¹Æ×ÊÈîkˆR)­ ¿ ž™?ï¹ ®‘©ðG¸JøU Kªúþ ær¥J4£måî}A´âýÏ%†2îÜZ9G6E»Gß ÁûÈÐñ'îÈȪrþç¡?âæœxET†âÌyyb%qs gZpGçŽÍXŒ·“@Ö2ƒ°˜¤R‹—ý>‘Ƕ ìyGµ•WgÒ[ð:w`¡|ˆöK`rÄÏ̘ÿãÅœxé7ÁàΕdH<ÉU•k +Àþ™éåh¬0JÖÝõYXŽ0ar« ˜žŒ ¹\£`i\/ÙÀ¦Íj•èX> Žöl´Èº^|¿Â?"›1Y¸‘VQQØ;ç( ²SÛv]Žáþ&æ&ÍŸ:kQ,Ì ]Œ!æ…AÈPA9½å±àê¹ïÙ¯ÿä¥ízú”õçïÙÉ?#•0}lÄCËo;’MÍ3oqj8ö@ê°ÃäÍ…_åjB†"ÜE´\_qü²igúMÍ›o+¢gX›ÓˆDslêúÊ›' uØ­½»d ÷p©\ôŒN*ï}o°®£É×,¼plö|þ¯æ0Þ"í;N5ü) .¨ @ñ$8q ‚']óaŸf/¦Ìž©’o þ<¶R9¿WªÚ¶}@Ûí–tåpº «¹ƒ¦¥¯žè&Íw’nhö:ßÜ+·‡ÜàÎ¥qÓþ€­Âò;vRE¢§3áÞx{I…nZL Œ·À¨~ryáeÂÆ.¹ïäi¶Ñ/< ÈÛ›´K.Ÿ¥ òUbDð¯m†2q6D$ƒ(`ÜüdÁûù`ýùþê¥Ürý#y‚—–}aё֩õ•5p|䨓”²‡þÒg LÁSØ”ê€ ys0Ipîf®UK7ÍàJ$Ó~¿»7€Œ=ÙSÀ£âL„R»· ‡ÓŽBWBƒB겤áÂ'¡m"Kºä'·Aø×Ú7:('ï‘AľCàP‰'/z/Ò¢å¿  œÃTbI’>çØƒØJYÿv$±ÞŽø×z|•%<àáÇîGÛ3'dY©q;ó<¥„,ãéú*÷Wþœ—¹,Už½ßWŽ•7.&PEŸ:‘W¶,­cüÝM ›¨¤œd'zPfX•Ž#áÎ[Td³r/XÞ¥PïÂË Øî°]¨,¹@˜Os|ι} 7gëz0ÌiÅM `MJâmœ®è¾Ie¤;³vVÏ(ø‚&¿øÈ(ü Ê.ù7&Úß²z§n/kꡚá2W#«Õ‰ì,Ð+ š²™öÇP™/æ.]2ÐÍ0k0ÄíAñF{# ŽNOOO(?´a–«ÅQò0©F‹Êo•Ìé È¢K [Ñvy1­€¦/­û µ5^Œ7# šl<íW6lSoAÚâö¹ÍŠä1èɆ™Ë{oéìëdœ¨ÙWlö;pg¬”EÞ”°œÐÊå#Jôo”Ý=L:f§™ ìÂ0îÈy‚\"¿CÀÌYõ¼v×mÝ™b6É/-6Iüf¨O’Bk÷¹±”öéŸÁËÆrùk¸YQÇDh¯6,¶H£ßL"¿w %È’† ™IMùhßé%wÙH  ´ÊW¢€fj绬bÔn ¼95U7aÄÄö:’t& E€Ä¿þÕæ—(T¯N=ÏîOÅ­†o¬ç‘˜ž®úÜççÿüÏÿ!ð_÷ç«ê6–­{ûþüÜN‹m\¥ Š€xoiDÙϽä‡d²ã¤1Fgafõ[Ol}ÙsüF¨ Ûa²šu@ó¢Ä”~¼æ¯d19Ä‘:?J+ðÉn³†ÿëïˆRUM|fz£Ø3±'fØÜ$˜,éB,M¯:Êò)j1jr—á7ÇéåÙ[ÚÀ!ïÛuD ^fÜQ¼Œ¡ÍØžÒ½‰ÞYàäÕÝXl1“ƒ?úüx8wu²ïb¶ð->žƒøÔ(ˆub§®oTÒ<&/hãûÔŸâÿ}~’VAz^ÿÞn;õ±ÛsÅã™ä¹½gÇPEcb$bs“îGuÁÙ̳ ˜8¶Ëw+«8mr*¦ÅºÀ¾CrŒ!Œ¡íѸOŽý/z@wL0^Z®mw¢&‘« “mkcè™ýÉÆâïŠk‘¤‡IÈh¸=*Ý3¿øN2ˆ3=°N¦4»/ô!܉‚ÍâÌE„ì‚&b>‰VWeÊ\ýGˆ»5a:ϳàÎÆ ?½Ýñ˲՟¿i\K&ÑvÄt½*·hkVIŒ6m']Q†$½+Jµ^盵¥g±äÎΰúç-Gït´Õ™,¡—tš‘óõØCLÏ$é$Æ»ˆÖB’À™ãE:_:ë~¾ÿ<Ï6#\Áˆ,WENq6CWբNJ­\cÌÑ` ]ê1!ïs¸ív›h¦;Q’sæyL"BÉîj™wȺ¨=¦µ'Öë$IqÕ1¦8Íʲ~³OQðiŸ¤p‰ä,ý7¸£g><5=´u ÇIàÅü:ùHü, f(Ê¥éé­„§t0&ÚNvpl—5=‡êè¸ùIæÒuôªÅO¯¶ "lL§¿„éAÑjÃÅFĺŽöášòKp5ßùÁ0–*”ÛK«2|v¹Ii¢0›ë¸ ƒž=V4×­žÿÃü9ÙRK,kPâÁþuŒ˜`<î/Ë‚øšˆÍê0Ƭª˜N$jŸÌ—Ë\Y93‡ˆ0äƒÈI®(hH»ãKȪ·âÉY±ØVHóŠ5•8ÁCjT¦UméQa óA·Ve@“ÈX2Ï©WS'ÔšY;“ PT™:Äøð$ÄñðäSHp>Cœ7ñ#êoÒDnNÆüI±„’?‹”€F•qx¬.(ýÃE¦²ÒŸ)PU >ï¤Ü‡¹RS‘—¯¨àæ€'ÚœìŠÐÁò/Ü•³Œðçµ%fè‰ò ônãhÃ1¥Ã™³jÊ(Ç&pÕÔ)¦¨ò˜‰2ŠÜ+yÉ'1rR ¤´é9éÛ¥dãþ&Œ~¹– R-~J¤†á5FÚ¸i•¤šýë¹B„ª/éiE.’ÆÒ~Ëé÷ct. lNYj€Èæ’c¸"z‡ÏMçUîbæ÷-rÏ´P=àWu·à’b gEy¼g¿òûŒMúX1daæ —)'ewXõ™ŸŸ½ÙôìxªgȰö¹6JäÀay#ˆªÝc6!PÒXèü$Q%å¿8)$ÄùØs[‰äïç0s7:Tïø:›½6¦áe¿ÉâÉ×qm¸<É+çy•¡°}s¡ 2k¦CcßÅX2høFe0sVÛ*—ÑW(žÑPÆ–9¹ÒÛ5†XÄ ‹Ý1 íµAôð,Ù· íA'Z“%\ŠnJ¿q_y2½èU¼hÓgÆlŒ!Tf”>+L¦ûõù>X>Qñö@!®‚̬Á蜵˼&Ù‹/¸¯óŠDŽS‘×Þ=¸¨ ÜMwÚyEJùGdϨԱƒ¾ÄÈË19Z1­B^£)cŠíM¢ –EÊðç|õ4J˜%W"$S¸ÝÝrš_p×^ƒèqT‡xÀ›pEñ±ÝnLbX,ƒÓtcn”XÑÙ¯Jož-Z2p“î—켘×HÒN„”%*­MOcÃrÓ÷»äÊçhp*HØO¬ª[]Ê‹{ïÀ2\ëD[ñ*"ž,êÎ=pËyòè<6ƒªäprßl™v–(ü:\ýâ {…ã}[=/ÝEfÚM_#"ùŠŒtv¼*Ã+ÕVèPü H‡ÎA²ìsšhÁHYêïߌ+µöƒ0„ÊY3«å ±‚=Js5*„Y†‰—ÚÇ%e1óöt3!sDTy É"]í#óbH‹ñãØÅŒo»¥Ñ™ùñeE`è™áa.(~_}¸g­A"PçûÞŸ7|Á¶VBGHšÈšj1Á¬Ö»»ÐŸý_$R,Ò+s$FN´ß48ìÃï„(o$«s[ЪxnßB’SŽRìƒHÄ”RÀGîv챚Áìz¿G,ÉM_¿Üú!£ø÷Ä^,{¶æ’xϤYÊçehi¡”:xïØœ' ‰žá€Mš Æ 1`w!ØS&©Íw2ÄŒW±úr¡û D^‰ÄfLã~Yè²—* ‘zÕ‹i„IÃR†\Vèµeã2Rˆ‚€«êEÀø×z•vBœÕ¦7è½e‘ ån%LZÁò^‚ÀJ-(H6¡˜w^ ÅnÂŒe€ ÙÃ¥¢A¹gÃSiˆ‘ö‰ÐöÂXöL%¶Ýå#EáMçË÷æÌ¾†:Ëz0¸‚‹ÇhcJÄ’ÂÝ¥ í†Ë6ÞshÞ¼ËZæÍ øâ?ï¿Vi’÷ 0¹IèÜLðg­À'Ú¤1äYW¼ú€Ž+Œ>öª5Ô‘œëË/CÊW9SzäŠ×*¸#QwâRŠzc¢n6öº"Ûþ¨bj I0À¡%=‰òÝ¿5K±ÊdBrœELy¯Šhjö{ôº«1½kë–­æ­s. b{Ó=™”È5Q„•󤼥v›7ëóY‘òŽ(2¥™•Ïåè[Ceìô¶z¢DÈø¸#„g5×ÓÑ;HŸñ奺ÎC›‡ä—™33p3SuÚ£”°{ÈT&×è7¯)fú8Zz*;7ÂQ¬|-*í‰]A5·÷*ŒÐgåD\-O9å¶ ñP!÷åé7¥=ˆÄ§¾GB¢Ä;.(ÝÃÛ 6ÉhÈJÊ€;€¬@ž¤U‰stätÍrBÅñh6Û`Þ¦{&îÛQ‰$þ±|"ú”ÌÞGŽ¡iŒexBVih:1'õà7–:o–šÅŽÂ~m¥t(;6mp6ôÂ⬈¿4d^^¤1׆M*þ^Û¯íüÔ!ðjÍò>—±ÌcV ©aîZtпèÊíç?9Þp;‘õçÏ^¿ULz3³UHaÁÀªÈ8qô%’n–Î{¤ÙªÀ¥dU½¾E%`k%bª½ÅÆ•èÅœ©/ö¢RÏÿ¯êË–$;rÒ#³ªÕ6fóÿÿyu•qHÌàQ=ÈÔ]™Ëñ…ÄÆêjjõ£ÛG ù²N,Ã*YLÐÕ˹³â­†}aU½^=Û´V°{UÕSøv‡¸¨z1E_ƒ< ³c. àë1Ü'@(öÁ¹´Zõê/ÕNÅ ºízEÙ®|9Òu@r–Ð:Fó@5pTÐ<&q[§‹ß*A‡Ç›ÝÁa]§ÉìLã'UUE+ÄE/>z±D«©+y‡0î‡Ä+ð0•h!t& ƒ¹®káË!PüéS²aD¼H–æð(ÂìÞH,Ð ä9y:ծͰL`‰ìcæÈõ܇tHUÏF5þ¨0M¤zf/±UÝí~µ:LŽÊ«K¾ß¾¾,Ç)qníXþéHß6³!¼œü%øf¡±ÃË93ZKV 6ÝEúPÐ{§Ù±”‚ÇüêÁ˜Ä= ‘Äãd˺)w¶F«ªªvÖ Áê)áѪà#Ç2_¯çùyàXõª›ZÒAKCË©)ÍmµEPxùº°ªIþÈ©/ßû6ä¶B‚ܸϺqƒÕ‹Z4k¤qb+-ž)…ìã׬úa.ñµo©±\¾±£q|Û¨î(Ö?Ï[°Q*eí¨ìÛJÖç¸ÖZ­f0(q?f#Øvá²lQ}(›P¬“,MÖÏÚÄgÆËs#°(gƧkÆ[•Ã_ ˆQM4Õßs¢¶hý&¯Ý@ø–0ò2„‚ܰáÀg àcŒ–ByS`Ç׃…)5£^ÀDÖv ¤c¹Itêm -¨n>HƒPÔ0aêñ›V–VjðX´Æ1·X{YðlÙÆå t{‡[ISÍ:VN ‚‚Ô彺`«k5á¤mý& ‡ð€,²mb~=Ïàu†[ð859ÜN·ôÆ.V¬` ޤOíË–F‚4ëÔôö!pQuŠÕA*ýÀz$oi{«øÆ²ªÑƒy˜vP¹'ÿ«HèÑz,Œ0ŽŠRüÞ¶]-í8,ô .{EŽ.Xv«ïD…_Íyk°óˆàÔìﯖÛXO1Ê0i`5ݾ¥_¹Â–£éÏM¬4òTg̾Ål%hwx—@ófèþâ!T?æÆªÚ[ùµHô ‡> ð”ÚS‰QüxCµÝ¾<VDwa§`;š­Ó]ÔLÕ׋ëv̸“i;Nì%V0ËòPÕ$ßσÆ@_eµÈM:ar%(°¢î4Ø-CCÝfw _<ƒ »S„ºwHð žÍÏêˆ4Xgèפä¦åJ蹫j¿/Œüa)âÓ1™«&8܈’Æßc+‹¦û$ÊÔKÓúv§aY¿ïÚ\µò£Ð@‹u¦œ?.„„•žÓ´²2ê6ÅÈöÓ–¹œEº^å¸ ^\1P*:-¢ÌêþúJÒ|Ò¤=6¥Ó…Ð' †âªlRùêW†–"Ê‘Fa4A‹ÛrØ KÖŽ!ëª{G2šI7K¢á-šoÀßÒ ou„ÿ°Ùb†\-e3ðßÝ:UÇŽ.$iI–Ó¯œH¶Ø!KêºÆGÞæi<„¹ÇžÑä!þ¬N0ð…*G~£Œ~ë˜çWò)T5¬4 - x5jÁÉ¡G÷áØA½F—+-ûþ…Ïè”>9Ù˜f¢ö¢‡+w·¾˜È0hH uÅнäì¾,B&W/¬íª2ÒÝaÃ)Š@Y@K% (4~íúÀO™”PÀ£}u;kñ‘÷a@~¨UÃ^¨<«S5ìÒÊlK÷ÏûñB£1˜²±XÒØãן'ä3Â&ÒjÐÁ+ôÖ|cê8aq[7mõ„U-ÕÇEIMÁ`<­ ²bApP R¤†ý2úÌ]B“ŽL€|†ZÚ>ž¸ˆ"Æè AÏjäñÍk¸·H»¤ƒM¢Ø!%8ùí~tc •‚¬`[ÒHf´Ä&dˆÌu[]B-Ñ&Œ{Þ” ¯cÝlÛXÛDŸו®!Í™±Øjk›¼N"ré‘B(×Õlž…¢­°¶ô3h—CEïD*%²68Ê€þsc:!Û~³¼-á©i£}ïÝaG~¡°¢vW¡Y©Šv¢és 2œ›˜b÷‡ %ox¢å%ª×93y>•´jÒ³‘}ÂS2ˆECÎ"!Y°X+Eã„Ê”JÏ ¯&pb‰cu¥#.[tiÖ.¦j]>™`2Gb±‘Dp÷Uµ&®ä3äì «Œ¿¢¸à%-}bÛѾ` TÖm /x]”ܵ!ð än‘£å·ÎneßVÿ3+Ï 7J»Úب«*Ñ«7Ë6Ž„Ü †bgbd ÅÀŽE¹ˆºˆ°cj8õ©8Ü—¦Æ«‹Í€NÊÒ³!ØoïQW•f»»Û™‰Î‡ï. 4Pêò£ä¿$ÏA2PåçѬuŒEIÒ:å¡Ê©,ßÊÃ÷ŠYGd!Cü#P ~¦º? o°årý—ŒÀQ¦¹üÕ²Ò6ȬúÈGF‹xÌaήX@Î6ºÆKÉŠ:;m²,àhXÌÉ9ë<„"9ó¦ÇÑÐ J‡Z”Y”³«ªÞs[ë:°¼Q!©ÊF¥N¬’æÆÀlÑ®®­[^ Ô4*U‹]l#+¦ªí01aÆL¦ÖH‡\˜”‚Š«9Õ £"q/(£h5Æ4MDùÒ‡Ô6²ã‘½üŒdmVÌ6{ÏúF‘;жþõG·r³„I¡ ?_§‡üóÁM‡©Õsü)2µþb|m¬†D7Òh3¨Ý¥ê³¶ÂC²j c¹ oj\ØD%³.´ð.ä!︰DVàp®òBYxÞ*ºŽWÃ,£uíî¬=ÜÅ‚Y|±·ã+Î܇uN qú™Ùµ¨Å„.U¼ð¤ä2ϦZ·òo÷ƒG²ÃNâh„‡¬:¯u®€Ý*¾=°Îh”·YàŽ¥„ÔC‡cJ‘£C,Ò«õ8½1âp”Èd„*7N‡"ñÖvÖ,ÀU/VÕöC»#q–ÏBаà1Ó¯½Í­pÎÂnµ“j^H®ÂÛi|‡{–˨|Çœ-OËÒN¤P!‘IÎôyk°Æa#ÜK/¹GQ˜½€ÈrÇà fG]uáƒØ zŽ[mw{f¶y97wýû÷ÌN‰ù l€eíB íy:éë¬æœºRîUû·®×%­õWežV]n›ôýòN|q<[åL g,—ÀTÝË„sÏûònAaUEU÷„$®‡+ö¹ï7`V_çe»¨[RÆp»+·c]§C¤1håø“gÜt5{ •~ Â)¸9 C BcJ—c#¿32*Åeu­dØ+˜YÒfb°K|b”[—:•^ׇ»€ZŒc8]zÊÉHv7Ñ!%w± ˜Í “0îfª U•»Ýñ9«¯òϲa¯˜£Ãš)ý¶!ýŠ7#)­¶"k)aººÅ€ŒÉ{ ­ÓÜvNŸÙ‡f‰eÃûÖÎÀS Y³VïÈöª€î×—ûQO€ïõ­ž}]Ì¢ÝÞÛE¡ßÚOUìÕe׸rrÂ0íjù׿ºé\¦ŠA¼´*Q:½Zñ¡¿‹Qõ.›AŽï”8[ +¼îŽŽ-mÖÆ³è³xz³š|§Á½ lœ!\/îd’ذè.ú@çû‡[€ô¼Êu¿¡ü¯ÿ|ÿõÖ߯óÛXx{V^³xŠÜñ„ÞeÕ©Ý·ÃÕ´…}¿ßhØüùù©™çç–Šüb½ßƒ‡Ä«ú±ÉÜ™¢Cplx~¬t”:Ë×'‹’#nœéqé“»s Ûè‘gBÛ±Ö:>¤võ }ŠÚu׺°ÖIMÏžsšbòÞ¥7dRXU× ë «®óžÝ„¨;ž Qr4?Ný ZÚQT(7À}á-²t~ôtÕ®§¸q4•a©¡‚©dôƒÛ¹+nÅ“ØàZšLŒXÂÈzEÝmÕŒ@¦F ¥‹-pÐúë×ËÄ“l»öo\m8`yóÌ¢©Øªcжcgt‡œª@Ÿ¶Ù?1Í6ˆZ)žu¥å«P‡éeòÞVÇÙ `9ÔÒH™¤BûçˆÛ+66]gtB_ÿù¿__ÿ5Þ_¿Q¯âKÛÐÇÔª>y*üë¿ß—±²œÂSõÌ…sñøD)ô VÜ‘ºâ9lTJƒ V¾gšüÚ›wðÀ,¬V®CísMY$†Àªëäò_›7aùâ!áPî˜Û7Œg ôqW¯¯”ÅS½Ë¯®Cýó J§Î÷÷/ȦzÏCò»ñDNIBÏÿü=³ªm•J¿ê5»Z,´z“]·6qN¡Ïv&Gæ—Åg<[:‹W¤äºØ8¦÷ý½Á?ÿÈ2D“:6‘¥]ºvWƒ*Ê»¹sƒ$™¥[àÀÏŠù}éøKi÷Øh†H¥¢1¦DYÍî¡y/wáØÃúχ/ƒç¡¶/ñÇСÛpFžà™!O4Ѭy¶*ÍφÜb{ôÒáù™çENJÊ$m:á&®}]:¨NFÜ¢j¯ÑVâðÏÎ;¡ÿù?/›·œJY}Í¢¶cHÈr<«êÒ®;Ú"…# ¹wÄ€!jCæÍ¡¬rj´7tØMd¬I‡ADûVŒÛ|DšÒ =ÖBÉVðN«*…ÁÖlÔÎ,ÑÕ»ãÅD´ðtQKÂÞ!£[ã4 ¦œÂØÊjX{ÄPœ’X5„äÕÈÁ¦£¦:¸Íå¾Çøç¦, ¹Ïv{“žnñʯ£ÕÖÃù"%ªÖ Ùé+@ ™B–ÞRI¬SÜÅâÉv;Î:Á5$ßšêî…‡ =©øN½c32ưlž¥W#æéj ¨)ö\ðD4zøÎ\L;rev·ý4¼óJApMÚ_F¨Ò³é½wƒÎTÜbS‹GÓ<ÂB¹–Wj¢ÈQâì#©_¯ºRí”ÞîS Ô8_ößó…H+$’yQ@ Ó¨®ŽfL¼b«Ô­V”SUðQ––J(:^nwºÛòÓs#iðÜ¡_¨6¼µ1‚(à¡B›öw³Õi@lŽÿ°»XUÀÓV?¹VàEŒãÔ–.ÃŒ©Å€P°:ÏÁUñï%4Ã/Û·!Ÿ]ÑÇ=é¶Ð_K¹êPtåQó¸¦V=R‡Sge°ydU*Õ´Åá£éXä4ÂË÷LW'î²Íx.¸§…;,×O£u&‘\r¥™®¬r\yCu­Wª½·=ØúP!EÚ×Zn퀋ûPnu“§n ô‡>2LîÕcm1àrs=•-5“(ì”î@m©£S&@ƒüÕ__-±, uU¶ŸÀ}ßæ…Ý2 ØËêZ)–M¢?×âRî̓ôrWÓݾטs¾G!±løYÿ¡³7OZ4&‹×,7ÐfÃõ&Ÿ…ÁРѵnJÐG“UKA¹ùAæ~åçf.Lè2ÔÚ5±Ïö&YY€Õ¹ÙƉϥ³ `®¶l‘Kaã.ˆ·þÏËMIÒ©£| (ÇÐ.!>˜N…Ï1â»wÆÈú¿PýÉ"´ûy-/À\•ê®êM5 ® 8Ä«À” G+Ñ£ÓZx¼ïÓ ¸,G÷MçHDÇewÐÉ£5JÄ]Œ3`™\gÄ2C']Ö܉ >`r‰·Ss—·è¨wÃHŽëª;1Á%Ù¿¿¿‹5Úê‚£ÞÍBj=a•ÊÛǧҵº,90Âz¡K²-§ËDǼç_±ÉJòûŒlµmtK$öõñXQ§Ž¤Ë¼»>á£$¥'k˜–¦„S¯F36.,ªÕ{¯ÅQ~ZlÃC€‹:D¤6êU5»²NÆí(ØUó\z[öç/PˆÜy‹Eq¬átYÔ½î,r÷¹4ÌFc 2›. PÛ‘ ¶$÷úNï¯æÊ:8ô¾Ìµ<} ÷sƒ´dr²Ñaì½mJxä“П}ïZ‡åqeŠß?"MOyj˜ƒ«\"ú2ó5^Õ˜U«î¶c^ÆÅd4)ÜìG3`aE¡Gï`(Â["NÑá"ã 5î¹¼ À"… ÆÝ-·lMôŠaù €KœÙÌ­´´CÖÂz—•©DJe‚Óè"°Í/\”ia?‰I´ÏÙnH`}µ_hã9æŸUc/ѹ ä‡dO°’"gÖœUÍOí ùY¥ ‹® pÝ>¡x•ÈZi0°7Kc œVÑ›GÕŠÆ"@†Á¯–Z®¶<¢vß©J¬:¸™$Ç8^wX²U6‚Õ­/•b8_áTvGÅ—dUÐÞ«\Î6Ómá^Wý²3qn_„v{R.VÁc^I‚g‡ä« º=ŽßóÝLt·µÃUòù>dÉHÔµÍÊØ¸YÊ„ëcK–„‡J²7 +”}›¥3”­4Wï¿«T`Në#6h: yLÉ ¶{•y$=-'R1øäÖEu+©à~æ²?d¢I¯Ï*ÓYÞaËå‰ÿÚªîï_-­Çñ‚Ð^WIqù‡ÆT¾Œ» }{~R+ܦ…woz«.ä#L÷º¦KUæœûpD™Q` oÜLÝ3(³vH-+ª!k3·,7rŸ+Ï-(¬ŠÄ{J-*flRÚ·B/昼ÚáÙKE[*’Õù§Ø}, u3B9ÈŸBÉÊF“®áqo¥3Iç#.›È"vȩ٢y¢”Ÿ[âÛùÞur¤1ˆÄ¼ŽÛoԺσðŠ‚M’ô//u{66ZˆPW4›ìL1#p®ò‚uEÜÀÏÿ¯ÙÅJ°Rêâ¹j|ÜZÂô”•¾¾‚…j/uÚÔ›ÄìTu† +¤jÄÔyíÔ__ö0tfš,ð*ËýáãÃt“7Ë Ùœ¸üw…²´B„;pž¦U‡)(€;nÄ4PFJ~6UuËÖ8`—ÿ9;LÈb¥À¶jPkôEÖ»"*ï©j÷袺.è‹=is®ß‘Jß“èo @r•üDsIù¨"Šò-§›ºƒFþžå LaI—@îäê°høpKŽ Ë;ÂoNw {¦»:8&hûš/Œ¶™[²èª¯ì}bÕÎ9A»ž’Óšy÷‹µ®Éiuݵ‚BÕ«Û rÏ.<ñØ1U)ÖÝëØG—PÖbŸ¸¯¬Q=ti€ï¡±¬ë {pìÓ?w‘ϘòØ?ðÞHq2!š„4vàE]“,”–+¥Uèþ²˜O ¯»%aXštûäÕ™ÅÝÙý]ÀJ[OLX¿ƒãÑô»±.<É™Qj*àÊJ}7ÃhÖföÓI Ay®¼ÄÛ©fÖ‘¥›¶ôÆ„Dϼóv«6G Ï_·Õ( P*å²òýá°„ùZX$lÞÞ>žÜèûìžgsµ€äšX4ÀG8UÏ$ «…F£rÑ‘"¸$ü} ¶ E„â±=UÅ$šM ©Aƒ¨èÅ\G‘g÷1èdºÑÑÊ‚°x¢Û€ «ŒVÝ£4s…†Püó³À¢;«rå_†Ø|µþUMl$ƒ¢¦0ÆÃ`' bkXM솉Z'Ö°¡•x]i"+€7-Np+q3Õ/ˆlâí×á*»6ÍBžàfà̵yÑ*›,¢vÉê´4òÍÝ6^6‹¸>e\ ¹ý®êí·çU꯽XÇ̦õ‘o .áÎRù­ý޽h>GuäúgeSñÚÆD@§[“T[/¦ Ñ–þˆNP]ËzG‹¸X}½|åùÙç ŒïîIe¾Ád™—a4kŽ7¤â˸à¥KlÇ%qQ¤Úì#qÈZª+ÞCi©«ûÂæ)>ºN <‚Ö‘ÜC“³¸)ÃÄÈz|û-P‡hÔ°Ì•¶°ê”w2«côJPja7+h«ó9¬ â€ã&Ò½,Ê}ꎹ&õnÚKä¸4#‚€&Œ•iá]“švñc;ÁV5d·%ú>€b÷÷·M™/F“•S–¬,ØìyÊe]÷ Ÿâ]®”6*-BuüÏðó¾IDIÁ*]ĈŽñ#°1 ÷}Tw¥yô1—l°œÉ›²ûh¶.ô"—q½hÔ¸Š{Ä“ @è-Å®ð^]‹ÝµÜÇÿvÕìx…¡3éÑ».Ë? 2ÐÝôÍ5ãWWyò9Ý:™ø¨ÿ|-àÎéò €„}\­™*4ù˜Zº(QÝÌÔ!é“PfD Á5¥«glw­`[ }xWÛþV¡PUN£%šìÚ-Tæôºƒdä¥îòð‰•É?ПCÁk¼Ü º\6çäãòd^^ù]5³Á< ¿ªƒK9}¤,檇hsüÃÛ§¿¿­B`uã«Ý/8ñÏ{À±cu½©â—rhZHÔ;†¢ª*²Ä{KÿëZà¿D_ BæÙùˆÎOû*gÐI™åF…ô¥Ñ6˹ùô7£_¶AlÕqy'9:ÂG¦wÓcYša½»¦ÜvHa¸ÀÊýZUµñÈ¡œ{dåŠ#@7}ÛtvE8p×E×fÍõ³Ç,È69Bs)þÊCNgÝ]¹÷½¥%(Sò@Æ ŽÕ‘.ªçˆÜåšôuBâ9_~Åäñ À:ØYa4h£´:ÝûÑ3FÔxý5^e0h‚Û¹ý$\I'›Õ9WÕËÛ«G…CæØL‘«>©`ÉíäEµe)d}È*NR6¥†£V\åú®òÓGþ—*Ú±T¿¶zXE¥Mtü†ÏnÑçú/ÏŠ´Ó3 àr~AŽ\G× Šü,ƒ Œ-,¦ëdÜ mŸoz¬d.H.i-…éà=Y‰HïÌ™­BÞ1°Ä ² ѬúàÏncDµ{Z¯»VÂ!Y¾œg}òŽO´2ƒ>Íf÷*Œ)‰…{eÞ0( XeYh²XCn–m~ “\Ûâºh½ÍÒ~ίÂûT±"Ý´Û'‚1Õ»—q´óé›ùYÊÎì׫Ã6û`O[H:ïÓ¶ ú¾#<èÒï—~Ð>I âVo7‰-^€­ûþóÁ¹d-™l×¶öËœ—”|ꮂO‹Q±Ñ¼ÐuŠ™¢O>+é¶óCÛ…r‹[¶@EfB>‚ëŒê† ±Ù›V&_g4<‹*ñ0!O~®u7Abt\#•Ív†Ùß„Ó Ü7·Áçë€ ’¯z¹æ6·š"×F<ºk¬‚ϵ$Œ˜·Ê0JÌ`\d}PðF:Ë¥]`y‘šAŽ5²NµÒ°B£u¹=ÈÏ[6“;®£Ý”Ïb^ ûþ÷ÆÁm罇u} ¸]€¥Wp\N>ƒ;iïîv²Pšm}ÔÍ&*<{¯ýzi÷CÖx” r?\)>›‚žlãÿ«™ÐBâ@ƒðiÉ Cóf5v·uð×Þàkº£L©”‡&…#e‘»p‘$Ï´¦N#ÙJŸBQ¦`Ú^W]& Dg‰t]+Øâc¦¸PßqT3d”²Ó݆m6Ô{ÕÑŽ¯bwæà ՙΙ7÷ÔJn)ArpHbØ€„¾Ô„¡íø–‰& T䘵-ÛîžÝ§ú̘ÎD> ‘rè¢îíÖ H·BîLÿ­¨cÄ~Š¿öJ­Ù=ºœüWÄZkNœÙ´^ùìîZvŸ2]¤ùÈ%½ÆRý§Ú5ªnXª²9#âÝA¹aáûsU5Ò£ü´Ë-0hsrî÷`œ}^†8òÍ¿Î6lâ5í»SHÝàn©8xCYàÐ1xrÆýs@òÓ^Þ€‡:ù,¼%—9‘;VÖûñÒ*Þ#ÀØ?ˆÑã @¡Q=Ö³F„uÅ$ló Ž@ÖZQ´ž ìöááb«¬Úåø ´m¼ûtIU–Ò×:•Ò~¨‚ÏZ—ÞpK]Ë¥ù˜”\åÆY÷ÿé‹üÆ`&ÑàðE÷*ÑCÑ4"S<á#ÇF «­^Ûyöþ®Óœà0åëp?Hl­<"Ã_b¡Ì¯þŒK$Ôuv'¬P\јfY<¾ª3®ì ÕãgaoÁM\¡”AiWú• ‘Èï†i-¼ÆO¡üG¼BÍE" àZñjuðÿ…èÜ=vLËIEND®B`‚rgl/inst/textures/worldsmall.png0000644000176000001440000002334611257014117016623 0ustar ripleyusers‰PNG  IHDRËäÀQÿ"gAMA± üaPLTEvÑÁ|̯|ÌË}ÈŸ}ÏÞ}ÓÝ~ÅÐÈߨ»€Éµ€ØÏÞàãà‚ÌÙ‚ÐÛ‚áäƒßÙ†ãΉÔÉŠÄåŠÈžŠÖÝ‹ÃތׯŒÚގѵө‘ÝÀ–àǙę߾šÏ©šÕï›ÙðœÏñŸÅæŸË“ŸÕóŸØ¬¢¼é¢Óž¨ËìªÄ“ªÚ¬¬Äé¬Ë’­Ò›®Èñ³Óúµ¹íµÇõ¹ÇúºÁê¼´â¼ÀŒ¾Ñü¾Þ«Áݣ¿ÂÜžÄјÅÒÅÓ¢ÆÍ“ÈÃöÉÈþËÃùËǖηìÐÄòÓ´‡Ô´’×¬ØØÇ˜ÙµŠÚÅÿÛØܷ•ÜÈ•Ýբ߯›ß·ëàÀðá¯ØãÈœå­Õå¿ôè˩ꭼ즾ì©Ôì®À챿ìÈõí­¨í¯Êí¹¬í¹áí¼ëí¾çîªÌï®Çﴼﺲð¾­ô²×ôȨô̬õ¯Ïõ¾ðõ˦ö¿©ù÷úÀÛüÅÂý¾²ÿ¾çÿÁæÿÿÿ åc‡#‘IDATx^퉻77UÇC©… E([‹ ¥P‹ *‹<¥V  T@hi‹PUï¿ïY““=™Éü~óÞ÷†>÷þ–L–óÉ÷œ“ÌÜwsWn‹Üm™ÈÝú\Tz4!ÓWÝ!HN€Æèt§ºÍL7©klp­mÏèäÇÚ—€oÖx¡}/ÕÝQîÆ96Lñ¾ßá«Æ+ê¼5ت7oa¾æJ–y n5w°ùìè“ÍÁ„9,ËÔN[¬0æÑ97øO)âjܹqÊÃjÞ2‹šk%[Úýy½À,c]ròZiš)_8¿šg¯0Ê.Mà«*KúÝ'ÙÌW›˜Ó“‡ÞyïÁ¹¼Ÿ°1µ¡Z3å¼FIsd&«û…Yì…rƒh¿!4oºK.^•£8ggSÕ¤•EÖ¹Œ-|ή§—<Ž:Ü ý9”“è{‚òaØûÔLrVÑ"O†ö³‡Î¦Ú¸äDÓõxY§Ïï-I·ðNwâµ%2äi7£œµU¾ðeM HMê`©ºZ§6úQ5†I¬Ñ%¡$ñyÿJ°ØË*6z…Pe=6h®vørç€b&¹åÕ!†eÆ¢¸Fã©5i ã…>vªcÎ22±×èÐ'«·\,qËNË•fp¨B1ªY/àÎËlÆ„"….Óaš1YIv¸q#o}Ù°t]zhgB¼Ù±¹I€äHÇ*ÇwÊ´B?n²wÏvtÔ5'[ÆûDãÓXZ¨FBÈU¶ûU£þJP— É·•¯¾ê‹ÁZŒ¶”¦¤—â\É}£Ñ]’d,œ#5`úVF=‘­''çy͖삟ìRZT!ò_)½òâ…Zdü*º3lî_™UÓäõ„šÄŸœ‘#Qbse¥TY†Õ:¯ý Ìâ«ÿ¸ªOc³xå°i•îÓã iéÎÊK¬VRf$`% þP<¿—yü¨C¹RÙ UZh1gR•eëtÉÒʈ¿dŽXÔ;†fs'âÎ3“ü…’Ÿ»êÖØ™Ü|âwjšÄÏ-ËÒå¿Ó”Õ:SÊ|M¬¯Ò„닲J*LiÊ€ò—X<Ë€k l#ѽj}PqŸ%ëÒŠ,3©âl³ô 3=%ƒž\nämkÚ¬©r4³©)»'”H“u‰¶ˆ]W‘×Ã{I]…&™s,ƒjdOx”Æ)ËÑßðÔR€_›yõ®ƒE%‰(0YZ¡ë‚/Ûkíc¯—,WSjBÙr±àd‹¸ØÕtIò™' 0/Þì$(ó±AÑñÓÒW,’ ¢ÄöLÀôëòXÃ/oÝ42-ͦ.Ì °A’z>dZ±žì7KɘTÎË"è¸Iº ­îõ—¼°‚“e?»ÜÒ‡6(“6–‰…2ÍrP“$BÅÔš#e0c/[e9€‘¸á&¤„2d²‡þ˜ÆQ•qdÒw[tiY²Ò*i®I^Ù3ãq»eæžìUI–œ¦ò–Äg?ÇûðVËwâÛ³É]WHê.„Óùñ£k nV·%ý`h³¦¤¶>³¥º¤äIúDöp³ïî ‰,Âyl‰¤ý¬Ã2Þû§ÒÌP &)2¡»”‡JÄœ“e†Rž¿Ó%-&Q$šGNUw›úÀ$·=˜LÇO×[‰kÛp)×ë§=˜$¨¤ªhcI+¡¸§A ì7 ñÖGdy–R÷•þ9r¿²á?oæ#ë=œ xGggÏ–´,™¼ßIÔ"áHîSd¶ž7+ÀÌœBjÖkÎ’Í!Në¼éƒÑˆ÷(¢ªÝD™Å赑gÑC™s&LQ+zg@ù]²Ø`œá96%Á!ò‚#”rP˜j-—OËiLÁkÑ÷#RLNßKCUü_)ì&È $‰”§'Gwälp"i€;…>Ë+ŸQ–ÃPî_ý'â[‹2ë%0 ­Ìd«Uì´ ɳ-¦¦Ì–&/£M—Iê£%]–I$åÖJ²”Ï·ÁŒIÊÈ—Ä\¾Úˆ¯<’4Å ïŽHwš .Ïßß•+O¸ácÙIÕËViòDZ®©{‰2a!ËxÜ9ÝI*1*”UõÖNm%oaéEj‡­ú‘ÀˆïUžGí½=t’Ma2K¿±°ì*ˆÔÎ@$ =zäaó³b^3ø ðÆiRT~{͹³ediÈT–zsï²Ñrèùƒj€ Ϥp^—˜¢àÆÅIàˆõyØ<«­]nñðˆLEç~ýkÒ¶Q&µùWXà÷§µ\PšC(ù†x1Àáõèc¾©k»*ޱ¬f8­µ°'jº_³.âÓ8& ,o®À’²®Øc‹—(,§"ÂãÖæøÚ>V·aùËî~gQ¿íˆ»+™M(‘&˜ñE”,L¯ËO.LÿÄB-Ýï¹a–ž“/0’ƒ+Ù,o€y³”p‡¤$Àª‡®º™¹±b¸UꙀÊò²NÖ=Kò+ä=вÝq¾7no+ælS\c1s,®ŽÜ3™²:1ù­.VÞ²6Ò¥öýì³îY(üÖûX|#ª,)³ÀR\M#âÍX¦XW†<"Î:zãÏ#öŒOO;þKÈ|ÀÃþø1(±e˜»¸ ÊL™”&EÂ솜=Ù…·r²ø‡Þ–±Ò¥Îå¹Ú=0)Ñ&’\|#Oºt)GßEŽÑ‡‘*I™v ”ÇFôº(w’]s¢iÚïñ·¸ÊûJŠžaß$ Øí¼Dn,I… ƒýÞ÷¾g—ÜJœ©¬É6K¦iÎbUöͰD—¼Ïa‰4Yw•Çä™KŸ¬ôbÄÀ #] @BùGPðý /¼°P`b¼,iÓ<¥kÙôUÙ>píÛ)xÙ1,M_?KŸûh)`wÌãâ¨k|ì»ÞºG’7H’ ?µÎT¶n‚¿õWx<]˜’>’£b»ù˜ô"]F"ô¹–h’°ÍŸK ~°ŠeéÜÃ? Ýÿîw4†€Xò‘&1Kò ö/™«·;­Ð*¹øÙ\’f£))›NoÔ7]‹¥ä7†T¶ñÒ`"I† 4¡ˆ‹eaRŸ ÎТ÷á#ž±”b—‰mWR *IsâêËÕÙ¶Ê*« FK}ðuÌ2;`¤§¼ g¦Ë‡ù¸*ÐÌÖÁ%¥òk©¦á¯B³FRNd%»Ç³û³k\‘eˆœê”Ù· Œz¨Š×7Löë…Ix˜¯¼òJÒ­ÝÔÓ¨<ËÆ&Ke(—IÄY%‰ilðI€aθ¨U–›ÓåW©ºDMó§ôCŒF+¹ï|ç;Ò…µ ¼f˜TÐÏÉŒ¥¥±lì^êž3 m‘ŒÀe®¢?ícXvÉržÅäI3K°?1€,µ˜õN1C&!’¨$€ EŽ£í=(´n0’÷4ßJYsaZ[Œq KÖÝLÁ5¹eü ¨Ð¤…é³B"CÒäLGµËo£Âø$­lÐ샬rFº4ˆŸý,f1Ofþвõ¦áÅ cäŒô_KŠ“ü©üb˜†$BüJTð³ªË$£’LQΓ™¿b=KGG{[Jó2Ã’%È,¥NÎýêW¨ xsäwF²­\¢ç]뢔3°ŸAÉ’¯iƒl4bÖÏ]n%)ljS0>Ö<j‹ë–5”ó? Hh­Ì­,ýº’)JÙ]Î]ÅöLxŒêFùÛÌàUhåÅàY¿ö.×!̲,…%Ð$Eçщî¦=eaR¿ì÷õ•w°Ùb‰ék*l†9?êtÅÐ>´-áÚ>©1QS^–`ju&J“ ¾ÒC|ÿÝï~—dÝIa_+ÍQô–¡âÖrˆKj\‘euÞ^òÎý9çÞFŸ™ySÌò¤I¡ðîàÇ_"=¥^Ñ–0Rák·ÂT÷ð#dÉáÜñ1ÁUYNž¯Û#‚ ›ªPS’ÌRlæ[ˆ\½y „âY*I©rdY>ùä“[iz%*K!¹åº3\SÛ"¦×Ξ™Zî7äE“¤Ë·.ëMpr‹( ”e–%€D’Û`ú‘PCUn3ÉJEÀ6ÐܕŶÁºß`±({,9€”C,û([Ül`iz†ïJ–´M›¥¹tp´0ʘ%Á쬕R NÖ¸Xô¯O´÷Â$|äB4ý&hæ»ášÆ%šD -ØuÝ%Àä´G’D)ÅNGÒ –*ÉÇîe©²ÜEc—áJ=»ÇCJØ'º¼ûL•1–Îý ŽOôÂv±îÛßvo»J3¦êRHKD¹ÉÉâ^ð#»HF.igKÞ³=î—Ò÷¸Ç±,:XÞ• I¡É¯û!†J(¡°§­±TQ*J€¹+dÆña ŒõÆDa*LÔh&N²—À`Ë [×È„ i:YÏ *TaùC÷CŠ„Rp†-fØ`ÊND<,©…¹!™5§‹ñ}¢ `6\Ò³d“<®n@œ™Fü—…(` <éñÓ°ôU–3$ib1›K>bŠ,%À|"ÃÙÕjp²»zºG°Îžƒ·ÊD‰2Í<Í€$뺦–h2øæ¯6LšäG]løí},zÙË’´I1Ôâ4(9íQa>ñ„ÒÔÜu¼Á X.™àbÁ ÞÍÒ ~T+Ë׳Ä#ÉôMf.Ë/1df,&â´'?^”%yYÁÉ,Ññ~¶E(§×ùô#Bн,ìܬ(>ÒI£Žû{(ÉOK˜F—À²“62z8[p°!h‚6)vr m²ld±ó2ݳ7­[g hæÕäòå„(IÐvÁÏÎ ”ɃœÁÇÆ²49ùÙÏ6`&ªŒ-1m—…ÛËŠL™¸Ùzöˆ;e˜¹nDù(8ˆf—eA˜âfiéqÉ7I•ä` ¬³L'bÞ*éó-Aä,K.ƒ¥³&ÉQ"Í‚2¡×4ý±N¶æeûãhcO<£ÔÇfAo¼_µQþž½{ÎÜL™'Sb·„'"Š„Ym•f³NšÊçKÒ„˜)Ë<—Åv€eÀ’¼¬º×Î`„e%±d˜¼ºR–7àc[0§T;[§Ì[¯¬šyºuƒdóÍl=béÜ÷¿ÿ}‚ä ¯:²$˜#š$/Â>6gÉŽXÂÿÜ«¯¾šÁ”!U5…gªò"˜´ûxP¦§=6Žl= "–&¡D˜î îe_FX"L뼦’dÓ•ßë*±ä[^u?cò«°¤ >m’O1N‹Í·}XÎý5!^–I"ʃòå— Ì|wéÐÇ‚0£¥é ‹ºdJ$Køù*3ã¦&Í [#â%=znipã¾ÈöJs½©nÁ\ÿyb¨ô ë,Kãdó< È(e8VùXXÑÅz]2Ò%Ëvú&õHWE l»ºî$hñªÿ9Né‹_ !­Û|}yLÆI±ò)lû·±,?ç&TŠ}D•ËÿBi¹A²i—%ûÚ‚õÙ‹lœî¥Xv†g÷÷?ÿ9°”Zæ·—©È•%Zê)€ùÛˆ¥ûœ°„o¿öµ˜¥G‰0‘c%ûz ²8e•u$oÉŠ|<¯F{–æüPÆ,ÅÙn\¬$ÔåŸb–‘‡”|ÿòkT"˜†¥§Ù·-<’¹J¹ v$;ŠíøÛS-|-ÝÙoú£ÜlÐî…êP%À ²d_Û½¾îeÿa*˧ ÀûľŒ²DÞL2†¡ä¨Ùt±ê5Ñ}þY2f·Â2Œ—Ué3‡îAÞ˜-Æjm7k½9',#˜@s{§’‹.3–€…éIFÂLY>ÔCb]ÎR÷œUé7¾Ñ=$(;¾lv_ú΀Xâ2a¢.å® ú‹wµ²ÆÄÖÇRÈtŸÂ0Ü2ËÃS˜î}ï‹QÌ¿†â¾Á…Ï ìÓÎGœ˜À££ÌI>ƒûèÖl…kÓäÖæ§F‡K`锥L°.«ƒKÆ>KYŽtÜ´Š4É©÷/âmŸc¬Ë‘Oñ™©lXª•I—@P¨ÂËjƒ“CGwçþ Ìe™ér¨õ–“¢…p”,L Šžw;J³¿µyÁֺɠû˜`ËÓRLb¶ ­‰$ë,¡+õ±nÄÁr졪ð†Þ(JA¢D¨×^ò½Ï§V­øÑþãA»A䴠вo¯áþ%zØ,\ÒØË.#î³76v¨¨L®ž²ÔF¨ó‰L/øVy58ÞQKõëX~Ì}†iVe‰NvÁHɧUe y,û@É}t(°™Ÿ$±LV=¬~LÓȪsîD[î[ÿÐ Lç>ÅYa‰¹¸ßÞú'¬ËÒ¹O2ÌE½±è&[œ_”Ié;üOßúÐ'ßµ''Š•VŽ~Ю€D©¥†Ó ɆFÛmÔ–˜ød™Èò“Àñ“øY.èJ›@Tìe©UQ)½Â̇ËÓÓTU/ÞÉøk;ä•ô„Eù™:KG=ØK\ Ú(¡$–\ö$"µ!±2ÙÞâKU†ü‘ðð‰Q„o(Õ üʲ<˜/ûW),e¯²‰¡õ@`¨èÈß–D³ÐÇcKi•*ë1ä0®Å»üÀ ™NŒºΞáí´(Íe%áÜÙu eÄ`²ŒLèeãª9K ¦ž&°Dš²%¥¯„~Uúm«ì5Z׿#Ѳ¸ãì¶Üª@-&|¤N„9ÚþhÅè8 HQÝ®ê•w%”!K î˜5`fñrtø+ëy–ƒ6DÎ=£p¿€RØ^–㌆«&@|YÖ S¡ôGaúê>@E><–#**ËY”ûÜ,±ü…XÖë³/ÌQÇ[µ‡Ãœ ©Ï¥ƒ=f ÊôA¶žÎ’/ÐQ.ØÑæ8bβl¢?Bf)@•%¢ÝàdçauzÒ›( _3LÍ{DÖå5e>Íå^æ`´œ£æÍ>¯fÿfˆ›îã¦v°³£†Bƒ’j[r·ŽB¦¿ñ©>ºÐpm¨1ã¨V]èƒøâj›"æ^ [az]~ŠÙdVÚ¦IV.bÇZ1¨_MI­> ½F¶äýÄÒù„ý%;ò{üéJ–Ð%o/™¥ˆsxS²Ó1H;/³ñôºä|©’éŒ2À{çøkÂtïÄ2s/Ê£KŸÑ–•VçÏXJˆ•<ó ×´íÝV™l%þaË>Ì݃NP‚Q˜ªËÆÂ±ª¢€™IÖçBâÝ+W?¦á’hgƶ¾nˆ˜,Ì.ÌÝãµ,Á‚ä[–“wî»»4™so¥"QN~×..ml<ÐK 9œ9ûa–ïlÍýX¢‰&ýø'çH—Ì’x~}‡#4…ä[Õ(Ôa˜¸îü /¶“áa Ë6Íý¦-±ô™OÌÒ¹¯Ï’½+«Xòò ­ÂLÍÈ׬›ëÈí'>¶ãgw6 —&E™ I¦•%„²»Ç¶í$ZÎUž-ðºlÍá1×išúx’è_ÁDÁÃ2ʃYÆ(Q˜è-Mè,[;eo\*„†*í¥‹0,±¬ZÁ™“õ®?ùÉOP˜HRSÂK°Tß*.VµÙe­T;vˆs‰@ŠÃȲsB–ÕHó‰O|Âïä$–6í¼çpY–P¢{µ9mMdásÞûÜÛ\°À\tšÀ¬>ɵ¡éô0¹(RBÉ,Íìg™úW+ξ2íHý¡­¤NvÊ—Ðblb÷-›û¸Ê6sÉ:3,ßKÅ ËåẬˆÒÍ0Øù[–ìeýGšã.1Û¸Š€¥‡éÞc+?Ä>Þ`£¦‡é˜¥ÀLdÉ, Ö[c™®(í%šLñœOÚ\b –îýPŠ,c+nvÊRQ¾×‘2Û,ííÞs¥Çx2‡Zþ ´pôÈ8ò¤¼¿,T¯ |Í’,™Â}K„é%(³ô¤Ï^#ÊõÓ³DaFÛ6L¤Ë•S&YÙfF‡<<§á­\MÄ’ò±Yø3¡E(o2– Lè·ú ˜h~P£š¬zY½“¥?Cã(êvèʉJÀ`¾å-o¡(^P&s^R\ÊÒ¹—^Êt™…Ë%}“†ýkt¬×é}Ø6Ã7O—PI,*Mëf’DcÊ–DSŸ—¨à¹™²6VÂàø¡7¸$yP/åÜw,?L[’Ö[Âr€þÂ*)L¹'^ËoýBk¬¸‹.ÆöN7Kc݇¡À¿³Ð‚qSÑ~ä°^úÂ4{¡ÚÎsÄ#ueXp–ŽYê½™C§™5îuïiéãÜa¨Òq³ ÝR·¹¸1ëÓ¬ýK¼#½­l¾p[wG\eav¦s°<6íYmÿåˇƒ¦Ó?ák`ÒÃJ«ç´µ½ø.Éåî>moz݆Þ,¹‘—=`›¬§±GÚmÚ/"B}Dgf90ü®ûè6qý ƒÊ”ht–)[]žeL×gÙÿƒZûÏÅn°´tw¹B•'À°fûô6$²#9Q¼4,×Xáv´‚ylc&NBeØ_^]œ¼.o…E³h£„6>=S3,¯¾°A¸@3V”§Ù“J½ãu‡rx$(O²¿ >öœ(O9ª(Vâ8Ç(M¼<Å€òAœbX‰bÓCÎsŒñ.õv¬¦bÌî°Ç¢&‡v—úL¬èRO¡Ë³¹ØaÞ`PÕéð$Wôiì)–ÖøäÎÄò<>–·$÷ÊqèÔVÖÙ-`y(æ2C<;Kû˜ÙÛkâä,Ïr#ç2ÂÚÙËYYÒÁÁιÝo—ŸÖ^0°;žs«ñ¤,ïHÎa¤Úgd©³wNvèùX’$?p¢e°-ý;Œ€Ù5í¡FF±ªýó6c_ÕåH;zOn¤®­£× þþÀp÷ T¾ï]6;öõ™äÎFV_ŽC#Sa&hzÝÜïÞÊ)à\vëj5¥n{lÔ D…h±îŸ¶fù8KÜNć‘Cf×ÌW¨P´¶Žºœ£é©ë ØW·™"AŠ7ª€‹»Ù<œ ÉI¬w$Ç0Ž.ÑS°$tÀÑ{³U1“Ú•Õ¢[Öb2D.wµ¤†‚ÞÖÜÐU0t–ä«È$ë`†HcØ k¢’D…‰+U-KôB,G’?Š”>_Ü¥ræ²È °ô0¾_¯¤F½K# rI ¥Ä÷ùÜÌKYøRýÔ–KbË,[™J솊±ª˜1îÈ~®máK 5;LÚÅ’sŽÿ¡6C³ÓÛD’/ºp*2;³eõ &ÚÇ2†8®ºöŒ6‘ÔµÌX§n¨h¢–ºî-³…3öÍn‰”g9 §¹¢©gxjéC)Tͬª˜öe¶êë'¾½Å ,S§¹½óÆ•íJ[¤÷—½ÅCæ;‚–µÍ Ë;ÞêpÒqÿÉÑžçŽ_+j v;Öb±(ëåQС;úuˆ›¸G-%?Õ(… çÞGZŽá #ɤw´pFú>u°Õ»Õc‡Î׬å{7–뱤Øãuà|77/ù( uX^Ö^ŠÌ*4æ*ã¹_)î©’Rôtyù¨kл¯¤rÉIÝ‹¾§–þ|Á €P œ©ÀçÌb£ÔP @( ÀPF €PàT@ñS[å†P @(ŠÃ €P œª(~jË¡ÜP @(@qØ€P @SÅOm9” @( (€P @(pª ø©-‡rC( ÅaP @(NU?µåPn( € 8l @( À© €â§¶Ê  €P‡ @( 8UPüÔ–C¹¡€P €â°( €§*ŠŸÚr(7€P @P6 €PàT@ñS[å†P @(ŠÃ €P œª(~jË¡ÜP @(@qØ€P @SÅOm9” @( (€P @(pª ø©-‡rC( ÅaP @(NU?µåPn( € 8l @( À© €â§¶Ê  €P‡ @( 8UPüÔ–C¹¡€P €â°( €§*ŠŸÚr(7€P @P6 €PàT@ñS[垢À§æšR$  ¨P¯ ·>[ð¡âJÿÙ*¡vP l¥(¾Us 0“ðy›Ê&Êñ÷ÜÜ;©"H @(à(ŠÃ ( H8Ùw^h3¿MÑŽ’Á¬{Ü2?ÛýµÊ<ðÅ—½uWªYuCºP @/ 8Œ€¢ãÙŸù3Ʀ{JþÒù-ÿwp90´‰©ÿ@)Aß=ÑŒ€ée<Óîðtê+:ž†P dÅai|öÙ|V‹b;ñK;9ë–i6è„ t¬<Ïs¥kî²òƒ©A(†+0m^R$8WE›+þ‹£K'">Ⱥ¡¦‰4»-”ú–ªáröÞÔ¬:ZC£â(Ê `p)kô†; ± 7äDPSn“Y§ÔŽ„å]r ;î·¼wþÔì$«ÑŸÞÐ[PG(°“uvj›Ê"˜ärÖÁÁÍ÷ĸkë ÿî ÷â½MrÇ¥vÓå¯C5KN+.9fQi ¸½FÓAèíôî•~áù©Ÿ‚‘ÑÛõˆ;Añ#š©ª¡Çp|íåÏIújòöÍ®üê—'úßڢʂ7€£Ê(p³­@hˆê¯^3ø÷]ï¿:5çx ÈƒI«ŠùSúœüÀŠ#©z@ñzÍv"AZÇ[põë(UEó`Ð*°>í‚G†MÃ7æ$Üï–tÕüØÝ¨Ž.Ÿ%¶œÚ`0‹<Ö+¬Òû³Yß6A•Õ”U… ÁÕùuwHß¡–ÁŒ4ÉÍÃÌô3×_"ƒˆF}m<=9ZîÇÜ%ò|½ ¤|\èò¿ÊßpЉ²’7ø ?DpYßèU’࢘ ø£l€4%ÌV­n¹†®R²©Ï xúŠàr×,¢î^™)‡Zéõ {™[Y)ÃoÀƒ·Ù"òWÖ¤*¯ à c•”ߌ–ܸqª‹&†ª2n-’ˆ,²èLå/ˉ‘¾`¦ lWÚN.—­Du3oú@к̲~9»äïùOâGJé¿ÖD Ü”Cÿ5ö¾ùå#¨O)óŽ÷\ï.WÝïý;–eªRàXû¬ªå#oG{°¢àWN«÷‰’Jã4ÅY^“i¹_òá› M«íî²íOWJ Ú\ Ýî/Ë$ŸƒÍ*[E#¤ªàv.©BäÕ ?¨! EÅ "my‹p”½OôÎòª¡-|F±¼:A‘9mÈ{#ÂÕ¡tÖñt[Ú–[¨xs^nvΑxðöøŽgv˳`úõF®^E"+Ü.¢Ï.ÒŸ¥:Ó,e¤wZT·¤Â\H’\ '“#¤V;¼Ï ·UžáSJeaáX´¯"¶øæ²[—"ÁËÎøõ}TÖ–Ë-L®sãëýUõwUm÷ÀöÔ½º0á–Jò_þ¶?PÐÕ|§+®@~H·sjAkéd‹Ÿ®È¹Œ8«¶OÇÑ•±ÐmäEwÆßÈG PB8(>Jé[Ò9d8¹E› 25¬(‹?V}i> ÏqºÃ²ó"í7c½®Ds‡ì [)ÞÊl‡Æ%Ãå:5ÇWd—é> ë­3Å 3È{ã!Ðh3ZaJš øYG$Ê{q£;º”SKAq™)xîøâôºšÑ}/÷ÌÉZô¼}äâÎË Ýfv§î‚^lÝ^L'e1öŽQçaºí]푽å›\:Ç7Ý«"Ã2½õK‚¼3îE¥¶ûþV©`ow¿YùË’v[KÂÝþwÑÒ¹¥j=ëÖêLúv-S¿û^c ûI"^þ€: Ík°p@uÎ*âEÏT¹åI£$ðî>â8Ö“íÏ`§–´9Ï•×7ïé/.•ÍKSI¾þ0¼€õòÛ¦uäLû•D„× 8û'4ÑÞætSû\t.¿íQnwœ´5î´SïÀ%¹Ù ëüÚbt)í*‹‰(ZÌÉ­³óZºÜð7Ùf­·Êöò—„‹^â8¨°K˺åH­b.{Öá¥ÅohuÉVÍæ\1HzÒªèäcI ·kŸÞwô)à¶ï‰’üN¼LœÛÛ ²MA,¢(n½–P~CÇC–9B†ëÖ„n{+p·®™Ò]]C£4_o`¼zµx+ÐWV/kxuÿB^Ú–É þw:pxg»Þ-³qŽjS>¶ooÇvÕ7Üfx‚ÞpÉ75ˆÃ–MU˜ýßšÁ®ª–o}&‡;ê—ÞÄœuºµF=^©­Ûwî }MÚl$îuÂçUýû¦›¯/½å†8ç75OaøÞ²TÏ+” ¡ëzÉΠ<Ú èj/Úrv®$Ó³ã 9ý×ñ°Ó@—™—Þ ÄMwñrÇ|Õ‘)Þ8Xr³ž`{ÙîÒôðmÎ>Oý°jn¦úŠâ:õŠb žà´Ô{ý3º›¸o’‡1Rª14 e{Üì¥æ€7• ·Ì8ç•“m¿^'ô[i"!:YÊõöZÌ‘×Ä>¾Í}Àó׋ï}ÅìpÃ- €î·È^—éÉÃH]M×ÞíÖNÞf »eËy§ÞŸ÷”¤¶õKö/ᛂèWg½\°Ï­äX©Óc<çÓ.ÚŽ¾òô2©ÈDI=jSßsŸÕŠÎŒxàŠ›’Ê'î)-ríR€7œÞ:~Ð]u>òat¯Áͦ†9{­™?†é‘°”3céÈáÏ ÛÎWƒÜ‚¹õ+ß·/•Xú—×»€¾ýd^i¿ä é¹ÙM‘Yñèéú¡ÍŠÿøâŒ2„Ú¼©^-[õñ"VA4ÈÀã–lÕêéUƒÝ/9ÿ…#µËŒúÖá* ûåìŽùúgö>Ö²ù9ñ] IÕ)@mòÁàþngZmŽgÝÔ^Q‚óhõ ô)Ép–n–76ì ÏwÏÉ—¹LTŸ”AðjSj©MÿÎëa>Lºiï-–HÝ[ŠhîÙNì¹àÚW†»amP$G†Ø@ˆÄÈôB·¦óQ}2*,ùæ Á]b¶š¿]Ô2ÜÚŽN{á—Yäì-#Ö+_ï†X¹—ˆÄx…ÙÎ(ÄŽiÊÆ–'‘ïX¾B™ò!u;°VõE>©¢ïh‘ú6$?qjí_Ù6Ÿ´ ù@ª)¼n#R±}:«¨Ñ£Zí×èë̸ ù…@ºwR[K'%8Ée^ÖHÓŸ?6ŒsçW:50\=ÒšMné,ä‘§ýFÝp±ÖÈB\¾™Øƒÿs{¡¶zrÓ†KßVâW›ÂËU¨~mMW×õÂiãðÖNsáà&AMÂù깪ŠÝdVÙ¬“\Ìo•3m­boi¡—\½øÌ{.Ð’6ò¬*»ó>õ)æ’Ïq‘¬ºq~ÁoLß!‡¼ƒêÝ2œmøÌ9†¶¡x.MýUå²{äV¬[[³aAUoó`íïs7s'û9ùLDåÞáHFÂÌþ‡; ÷7LÐ{=ÚѤQ¦’º3¸ëí2¥"ôü]ßM#Çæ<×Ý¿â=mÓú,(Þªœíq›óRÌ& ÅÃèìsKó]Sûoè׳¸a€L;ª2XÌl­r—w጑7†«|âw\‘¬}¯Õï{.늪¯roë‹^]Ì ^¿¬¡uÆgaˆûÚÇÏYÕΫï>åS’S¡›RqÞ¾/Ú9ޏ{|ŠUPk-œø­üê˜Wí+[P¶ŽLÍUÛ:ê5åo‡‡¯ìË õ8tn“]ÿ›ìÙ¦àWpÀ'\t½¶wh;àå-8wª3Ê—§Äì`F¢æªÊªß9ÿÜ¢c„zPUÆÒŸŠÕÛØÉ¥àv÷2°—¿”ϤÃäašùfô ‘j¬2ÙKÒ•&«m…—fþ,PÞßÉV§'ø†-ª»2ÑÁqín¬n"™Ÿ}#ò_”D÷”sh®«Gæ¡…ß11—ᔯŠS÷xy´õ±ï~ŒÔjÈpL 0®Óò"M‰’ñ»oÒúA w^JîÒó¦f<:Û,Á×¼¢ª®M¤·å«Ö=‘ JÜ×Üâ¹Ú¸ zn*ßWÃXÎM浇ƒp"¯9iEƒ3jZÆaWnûU ý›¼å€@ùÅâ.Ž?É×ïN|•Ÿã8̳A¤Ü¬€ykNa¡ÏIy®t¾ýJùŽjÓï,¬óOÊsÚ[7…åX®R³á¬Ÿ¤yà9ëãV¬Ý]v^ ÷?abGN:èííA“¬(3špÇ]/ª‰ªÛÑ9(ó0Ã}ÃÝ$³J²y¨­qÀm-³†"ŠÓ…ÝSÞ8VXIi ƒŒ¾[£š¯â5¾®(nW x—|•K«‘æá®uó¡o®‚§ÏkÕº5!€dP½²ªoÇU [‹”l°” IP ݈#r•ÆFß…àÚÓɯEŒ5À5[KGµÔ´t@ñiÒ&ÄÛÀ=Òsß®Æê–ó¿ƒ×{ûç38®6ÌëpúRÃCfµ Ä0>²«Ö–'¸ßLÊlâ†Wùݵ'%àûFÖ¿‹ÏŸôŽ Š›sØ ÆŸl ÑPgÐWœ=jéá)‹ÃThKè|ŽsÍÁ7m"à©U èNaœ9ù‹UÙ³|ʹ©Y™Áðö¤‹³°ŽÈj¥a!µü*¢Þ>õ¾É¯ÃË~8Ç{áGØ èöT%Ïß­µÀ•MµÃwÌ“—1Ÿ6¦ÜÞeàA=o"Åd¤©:ñh3DÆ ­ Mq¾BŸ§.­'v¼‡Ô‰5އ·}[+,ë2ÓS±´Q… Ï«jíóÕÏejy4¥ºðí<¤ãµ ÐðdrÍwœnH¼þ‘H¬ïïÄ& =ðø•…IÙ_‚ªob<±PniÄVGÒÓÕ_1ŠêHgîØ;÷ÑÛßO“ÿœù¡X’áƒâ$™Ü›È[·f¾ÃËá%ÚkLùì׊†zîöÈÉîø…ñÝTEy,<ßv†;eôšÌ}ï êdjjä <—î1¯I©Èͽ©oÙ[Y©éJ“1îâŒX²BôGþYžÒj]2qó7o z"ÍH &móûŒe眣u5þ¾Q'šn[«€‡pq"øvd›Ë©[4Œ¼A4K6yœ‘!–ÂØºÖâåÖ¬ø üL†qÿ8ôBu6ݯEž‰À4d¦pÁ¤Þ‚sÛ¯i‘¬÷Âp_›⌫öz©2ª3pŸIŒÍ9pÅ%Ÿ÷EL-žSÈlÛ9¾Ë ·ü…˜¯nOÅ^:R¢Z”ÿöä.vxVGÅëûiÄm™œ•EÑ .GÜv¶/«ÏÌÚ»ù;×Aƒ usäœõµÉïÌ9™¶æ¸±tDÄÞ¯£fd³ÃsÆHbÎöŒ%§ºn”[y/ûˆË×)S:ØÎïHý5óBc?£ú‹iΆPé8¯@Inô8(^Ý5WÆœvž}ñ6îoøyÒë%Ø[#/ž‘Î_ü4op.. û^Zôì·ñoˤ–Ø7¦î.Öµy *–wÈHµÇM°Ø4ظùʪ’;ϲ,ϱtüü8¯Bžß2O>Î=æÈ‹õ.0¦ó8oiMiqÒ x­àdˆ;—ß órú®I÷¾Mêáà*ñ­_ê#¾h`\õ]ÿ/ƒ‡:ZClìŒ?tˆ µËáwù Ù/“'¸dÈnò_>çñ¡³¸é/¾B°zYýE¼„Ϙ_ lŽÃ 5Z|P¼®U£Þj |¡cë ò†€ÎKºw¸ºW4öW+ä9®ák†[ÿC¥9^¾~ÈéñðªoÌݬ ·ˆÕee·¦¯Ö˜Ú#• D?F=(ŸË è°|FvË"×Ü¥l"ëúO³Ø}ÅJÔL”{.ilg¬mLcËÇ@ñªf¡8â¡®Hœ#³VpV?ÚÓÏ>ų¹[_ç§ûFø6à¾w\KØ(Ñøûû¾gg¤Û£¶9sµÊÈpóbBGp\˜Éßzî÷žÀËô~QCÏ57.4r_h®& =åm÷"ùÈ"yº%Ýyç ƒ½³ +ó¾ÜRuVGë¡xÀæLûè|$F/kæid8ž(•ã,é ¯f±–4„7Ï“½1уܳïTo𠌓›%"K‡´V jí¹¡†Þÿ‘ Ekˆ½ŽãΗiBÛ•ÖŠ6]ÄxàɇbnËo¸æ<—g}n†ŽS66ˆaL=ôƒs¿šÙ“Y-—8G"åkw[®³…˜ìy*ŸWö\Î=X®ì@ü'D9a¤9·?œ\ò¸¦ýãöš%q« }aÃrÅ sʉ²Ž™‰Þ5• ÀáP¨E¾@n†ÿ‡–êMËÚËò2ŒcŠ<®ò)©@râ=Ð5¡æ»\ ž)¥ÊÇŽ/ùo‘××$®›9ÎÔàÿŸƒÕ,`ï7ÿ¨6TáK”Ïö³éé'^,ÄBõiŠ á>t£Ù#}_seæaeQƒÃFµGž=ôlŸíã-Pì~&8÷ÂJQµ¡þ$D.#|ŸÁ }Úy·S¾ÄÐ J‰]´+ݹßßËÍ+jׇðŃw2²/¯”¿îWfßSÜ«º}C ­­ÕnÁq:e'ßy½V…ïã(>.%šÔïÚÓWC¾G™v•³ðHær…qÚÉèS7 ÏNÀXJb0EÔvkF)‚ßUF™ï«KücàXqRC®vfÓk“Ú î¥p5º.¦þMÄͳ×É ô’×ßiÌý¿ð}·é–j˜ÝYd?W )6êõ2ªãú­-Vb‡L·°l:àš°À¥£“063Ñt)Ü1ÓùWýØ5ì ½ôoX‚Ô„\~ ŒKœ{:QÓÛð>Q“!@T§Ž'±LcoG Îí«Ê«™ë5ÍÃóœìfç“·Vð]pªÖN™½¦žõ¾k½r˜Eò_þË­Å kÌ$›‹(ߎ‡ÉŒ ²|Í€7n¬Ó<ûÎ8¸Ô»Ú\ÖY«ï`ÍÍÊNýò¿µÿïF¯éâ/o]X÷ÆîÖ£oQŒÏä¸ÚYî¿Ô(cô1­­õÇ;)®°$ß$TÇ’E3¿y弸–B|>ûóËÙ%Â4ì?<`!).~ͤ¾©Ž´£0­ ×6½{¼qó’WÁ.™øXXÉÓ¯H·ÎPÀ5dÑdsmV®Zt©’§·ý×ø;΢Òjoj\¸Õ©gº3Ð¥0K6z¯(YŠF*y¤|·xA4[áÆŽÐ*´È™éYÈ=ÞxÞLUÝÇ™ÑZûïÊMûÚb¢`µ`8g¶a·üA‘¼+·¦Q¼ŠÇúø“ÜAšcXÞÙQœwc5§3<¸Ó-×ôYNºî6 ßï+xè³ä²¤6ƒ'ÔåðOoO2Ú,£-Sœo<“wi‚$¹*õfËÓuÓ˜Ö^c¡›åâ'²©âÐ8·^²í;k*•\‚Âöd§©FüðjÉnz ÂVÈF•¹‘n™Í¹i‚w<òhÍ%´TéWÜ„‡Ío*²‘‰Q WqOÆBâyG GK«$ò檄Ι^£+e èFoÕajñG§ì÷8ã2Œ® cÊà”¬·Î'n:HöJ,­Åqê#ÎüÓ`·AØcO0|ȳ–/pÅ 1§°ºtà¶‹æt(ÞYÜQF•X:'z|¸Æ ;I}ƒ|$–çc® ?ÃbâA,߈Y¢gؤ ß{0\ªA)ïÉ÷ÈJÚ¯§nÈü›ßü&»AÒÚ]âf~}¡œ>f—ço¢TË™¾gÖÙäÆå íhõ ±2`?}Üv„5íiì ¡fi³ngxA†@¸;‘ů_%ûûÕ»¯ÃP®î„†íµvöã„°xíŒt Š[û¾âìNµ3PR•’3䥨úD¸ñÌW¹áÉŒ^Áoa/ŠáòÐTQíâŒãä6¥‚)q†ùÊA‹ sÓæ­7Øøbi|دâ‰?R†e;ûd˜Açd'(:R¥¸}c(Ö2¤øÖzKÂf¤,Ùw!¸8#®rOó8^§S⃞9¥D‡®¢†жï]P^•×mq¬Z碊Yvûþ°ä¹áÐÉIÖ¦ìŽK F^†à‹8y_pÞœFÖmã´ä’6aÍ×Á-Ê9Âå¥ò¼Í¯š°U°#±‚€{ýN¢ÊàM~Å–±QÇ\y²vÚ³w”ã5Ü·»ËšÒʈ6f'‡– ¾Ń1ňÔÖë¤4ËcOn¯Eç@v¶”glÿžÅú-ÇNňZçTrÇýBR“ϘÜåè-sÆ ÇÃ7§î mŸ€û"ª`D¿ÐíüÄîÈ!\Ξ7 ÆYÛóßÉ÷FYú+óË–š >”«šžsŸÆIÿ²d¼.Ôå,±‡»CáƒØÍϸ \rƒq¢ŒMtçPvÍhžRb º­EâÓõÄ€©WöVïž ³kÜe?-ÂøŒ•ÓÔúÞ|Ÿ>–ÍÄ‘L,=q;²ž¢¹‹Òšá73XÙÃZØ÷|~×d:è^³[ÄsÆßi• Éœ©@ø"ÜôÜä›QÜÂ=›aȬŠº³×ÓÎ0®-÷Åk’BÛfÕ¾LNDFkË3ܸ1;‚„+Q|à¥ÕùvqI  Oc]Àñ®ÎÑUÙûެÉ2[Å®8-²ÞÎq8 ã kAÁ絛÷^»,â룸 @­1«érÈ…39È£nOf3Š[dsüGý3è<ì%*ž“8j_à4Þ4µ¬’êé~ùN@ ¸œp¦å %ßVúãofxø)SÍó[c¼VoÆWl´òãäWÿÚ“qˆ«ÉüÚ!÷¿^ä"Ê®eH·ƒ|_ŠG!'P”çi ŽÒ¯¢¸Æhv>;aÄ­1¾ŒqS]í„먮¤‹¤æ:ã`¸n'!¶€8‰áß,Í‹éñŽ¡8h³\ÍýKW&å ÖÉ!£“éLÜq™!¥(¶—ÎAë^FqíG_‘ñ´—ï䇥/›¿=…ñË v!LÏ].ÊëAøU†¹1ûÖ‚>î9Npyð* â$Šwµ^ÛÈA-Åö®œ<|° '’Ȳ¶}„Õ®í!ñÎ'O¤8ßYVƒàÄTvUÕK—eª»j0nV·×eqݽŒãõ:´Vi÷ç”^Añ"Æ]ç³Áõ1®9îN‰ï0àÛ{Kv(Ê𲯃ÒU³ £¹|ìžIò*”‘]×¹7šyÞŽl$Ôšðniu³ÎŽVYb ¯á—Â÷åƒÏ¨W•­¦‡Ý{½5 ¤¸?ñLêÆÖ yìs0ÔV™d]ˆwƒáD¡p[EŠË E€ªiL ˜;=ëúÇï x'AåÙæ4ô¥1ÝÃpU€ÔÙn4Þð§5˜‰•Q·×.w³8.œUÄÕBçÀtb@Ÿÿ’=ø%¶Q¦†ãf`Š«…mÔŒ‰óî½VµmR yUEÊ (QÜ=°‚äºg‰G–c|Å/çÄBp+K‰ØËúÚ]i\Aý¦w6}qÞÄÀ€(vÝ{¢ä¶4°¹ Äõj‹âÄåéê·ì"õd¯~U -£ÙpÊùªÇ5xîòRQR?Dü;¡ôݪFZí‹©®ÿ×%×{ÕmO̦¸Íîkå®\¤&ø×ÅR"øݦë"“ãe¯Åé¥@DG‰ÂëMÝ«ƒÌL¼9LtÃÙk- ‘º‹ôêÛ›I_iO³ŠX§;â%_<~˜ºå·æœi[8Ë|vòuµêÈþNe;S(fVaQ™^Âþ<ŸqØò$ss©ß´ñ¸í©y·»¤3øi€É_¶ÏMbsE2zZZÕ p¨ic¼÷â"é*/]ÍÜëß:”É1{4ÂyyÍ;zM ÆøQªÙç¿`·¸Ô™é„Çm†S—§S\ñÄ>3‹É²#c‘í‡ëy?Ñýööãدœ(Ñy 0s—ƒaUÑSƒ·T…ÝkPR?µá¸ñ©iªåŽ5Æ+­€è·ºM‚àCÌW¯vìÞ«ƒéªˆ£Î÷“I†ËvnR"|ˆ1šCÚ鳬awˆkXžƒŠn%ѾxU0ôY”DŒ9PÃï~VÈ `"Pžž¤´l»JuÅ#ÙæÖ·e`|‰qŽ~¥Š!RÙ_år¨ÿÈòʹÑÒ¤êFWdâ¡-~½úÖ®,÷€÷ÉPÓ‘%Q‘V#¨‰î(ºg³†áj¯wʧ#Óô=¢;Nèj=d®ÖZžNÿiMóukAí…qk@ÛôE ¡Àˆë%ÊötSºk‹G9ó‰½ß}_0~ÅêYsPœòª 5®VŠoÚ·›ZúתSí‰`v|ƒ7!eÿ©¸œO¯û–¡<ñ[ˆ1õé/uàm\ï‰ó3Wý€IvŸûcn›kÒÐI<@gœ  ¦Òî¹V/}«à w¼'¶¸Í?Õ&A¤”AÐeï´'»\2)W¯»ä{H]“Ÿeù”|ñu…¡–Ú!¸<¶z|º7{]bxãÖ¥O ¼]«‡­Âø Û¿b­&:N èL¥®SÍ­ÉEÞÆÝ¦Ž÷ú>ºî£éÙBñî/å)1|ÙÛ¹Äü½Èþ©:{•†qá…ƒÛ$â‹tÖo9àøÛ†ú‹)qÓ—Añ'S\ÎW;׿lÀ»G¹¶zy˜¬ûÉ2¥ð@Ž7!\˜^ÁµÖ[ó ß‘à†áåÂphžx Ã)—«yŠ´Ç^¡€wÅëî¶Æ<>Ô¸ÒÝ÷Ò}Â'S\äb‘5lÁp…½^ò¦_j)C־ٜ¥Su‘tç£e­h®xîzu?Ùǹ­ŠèSK«›ý‡õDüG|ÿ„p>#î4kaQ›i_Trœf]µw‹ûôhTóx¦›Êµ IòpˆÛµh ¿é.À(%Üe ‚gÙc½4huÅ ïò÷÷âT„¥ßÂñ¨"5ÆÝv¯"yíÛQ[fµO)M”]¨˜:™ážaÐÎV·ããÆw¤ôôX]éYNmt¸àø xðz·ûeMÂZhW5Lçùª¯ Ç.ÔXˆ5p|lhýÁšÆ¨ìz•é7Ý®ì"œ¾¦Í{I¬`¸XÝŒ¿=¨ã0Lmë휓„Að.†ƒâÑC~"Zìø.›ƒáK¬ó—»Á,—¼”F¹(ö¢Tuþøª=fu¹ûn®£¿ªæŠÛVÁ_IkÚìÅëàø°ñ ½D¹ˆ©mÐàxNåÆc¯ƒ»¾xì —lcûl.³:çÙsÖ Ž›/‹7Ú^2W¶a¼ã]õkë6Û?C8iYøfWÍp±NþøKèƒjR@8G­KÎ[? àÿŠGbÍ3æê ´e ’ÁÍÆ¡R HnæqxòÃ)Zã‹S ­]ãÌçü(ºí—|ñÈ`ÐñØ®qp}Ðpd©@ÅsC(îÎÿ&©l‚¡ã:’äu—qo¹,Ž ¤Ø’Ò¢ŠWe¬“fȉS AÿθŒÏŸ\Ðo l§­n‹HÙFñ˜/ÿü‘ôA¥šà=Õ<ÌDZñCÏb\d¼5¥|qdf-ø"/¼ÚéÕëÜÒ¶y-ˆsürÊ ÈÍÜarD½°ÒoGÊN-Sà„#Û†¹â ¿oðñà6 \.[o‘¸e§]o8Å7 ø~kÔ•ê¶K*…Ÿëƒ+ºvü—6ñŸ²½h½ÍŠœKMgeÕt¢ÌË@™‚'Îë0 û^ƒKÊ/LŒG›³Å3\ŽUˆ«÷ýxþ^$n»·aØ£¬Å îÈ ŠÇbáê•I¡L{+^íˆK[ hlM“;ñq/Î4¿·ñÅ‚ü""ÊCàøÄ7 rYûn“ÝÝW¼ ˆ@z2š^<>=ZˆzŒGG¸q̽c8r¹ÊkëS!Õệá›@|»ýâNy•Þ„ð([}ÍÚ´Üœ}Á $Èç„dÉiïç_ƒ<=f>ŒÉ•ñÁõŸ²ËÛ†P<å¥èÄ»˜¾ñOC.äבDî},ÅwaøfûŃW¨%^¸ïZH6ÚKݲ‹Š|ÔæX¼±µì_| [ 8ì¹ÞæÕžn‘ãŠ'ýÂgÌÌ-’áqo\OÛtŒ€x LWà ‰ŸÜü:]ñBÔ­wp¤–µ©åp­n hž\>rAº•ÖHN:†’W—”­´ùa<³¢P|RÖSê“Lt@%(Žx~^<Õ†5!uñø¼¡žš> #(Ш@0–YWtovÅ ãäØqtÆyEêV«ïBñûÜðŽ¸‘’¸»‘ïỊ̌ÏÊ{R•Év׉§çˆžþJ?ŕߢ×{†©ZUÒ8Ââ1(0WØ:"£ý·ú€:i$¿F½·E8‹ŠT2|“ˆº*^•InwõIm¸!ÕhÅÈ<Ê3¿–¸ñ¸þù´ˆ9Õ™—êäŸ-ËÖSAõnŠ«`ºIÇëtÔ¦}ïܱ©¿THÐ6ì 4Õ'SÝoóÁSë5ç1nVTéÛ>ò÷ÒÛ‰4Ó‰j5ÃZ‚¯uÅ­­áãÍ‹J4ƒqÞ6Ô…íPSyú}ÅK OÎŒ'´¤Ô5›­d‚9Eþ70ü¥ŒÜ½Úñ–¢ÔîŸê ^5JMÏÌÈPt³‹7¨Ø‚ö5çÝó=(.6^ËkúƒŸÁ„–•ëܪjs3m>9žù¿PÕ?ÇxÑúçÅ¿σHqë *KêãuCàî#?Ê÷ÖÏ,Øcx•WúÅn^?Œ‰¥ØAðêp¸^¡&¶Ä:¨¿Š«ÉžpÊ×Ss9¦óNhXÉp~ÒH•º“JR2LéÀIdóÿµ#ì¥gŸò÷¢ôBŸâ õü§I;(Îs7ãy_ôñ1X@ENR ÙÃ2œÎÍâÄxz·8¸ºâau òÒ›¿A’^ø+‰x`¥i#¬mφQ"Ìœì/ c ­,„„ƒžjzn½3nBóêíà ± "%²®M6—±7òŽaíÚ猧põ"0¹œ^é‹8!Ú׃nÓC‰’\ñ½N×okË‹àå(òK 9âÎ;i[÷ 5“6ùWbÜždÒ‹V×,µ³ Iò$G"õ†´æ¶+Å¿vg_æ”ÔÞ}SfºúSâßäŽ:ýõÈ šÁ÷~)·¯¶1ÔXIiHræÃgt3ÓnÂøH†K¯\Dׯ°Žõ߀օYÎl×*†§>È¢_¥hýáÝ X{5VÅcê%Š;D.RÞ½ýè¾Tïýò¢WÔpe¨97̺¶>s@ΣØ/‰7ÔøâVe•ªÄLÒ·IŽË/b¨?|ûL›!L‰{‘HÛØoUÝ-Œš†’˜KÍò{Å¥μñ‚Áä÷È´^ ,T[¬-s¯Bò^@å³9ê8"«;³4wâ5m‹£}}4ǯ<¥C¾Ð7^œÕ…™U«³uí‰ëÃíÚ Oz Ô7„CñÄÍÅ¿rÃ/ ÿÿ#±¡6éŒLi½LšN¢÷ZÔ0?ˆ9‰~Ö¼½4ÈMîý€ºPA.7.qÀòyKu³þ®2T Á ðð=å“t¬§x|Œ÷^VXa…µ|kÃË>{ÄǸ½‰µ@ñ¬¡1z ‡~#TŠãDJïS ~p,8Þþ€¼€¸°ú¸afÁøiÞa„''x*Ž‚¹ î²:©Hj>œ—AàáîxÀN°«JW\Ρ;Á'~⚨ïV„’¾ï–R”/ªHè‰;­A>î%ž87Bîƒ »¤?30Áa%CBG(0gX´­?4w9o5o”›„Ìì*ª#ãáVrYÕ)5–—¹ò±E¾H,Žu/ËN­βFÅ´ óǽ$šà3¼^g&xÉÊTü—ÙUß¡}WÜM¡‹âºe‡BW G …ÜLy$ÕãG씉´y#ÌĤ˅ŽA\>UÁ(ge%«£âËO?fFû6qüÃr&yâ-fF9©Vqî} ÜR8pÎð&mŽ)°fKÏ‹{Ä÷rW‡LªîKÉñ/ówX ÈX:ÿ?Eqæ™[W¿Vfå\r^ܲ­ØP%:˜¾@ñ·ƒôÆúÏöJÆ=䳯øò"™éíãòvÎSµ‘{ªìŠã,;‘éÃçÆg5ñhŒO¶ô²Ežu‡ ¦ rkŠ[ÿímtžìoÖ‰$q‹Ñì7_?³¸Mvîqdýj¦Â„fÛ½ý1?6µ¥Þ/‹ó rUD póEÓyƒ*w¿ÕKƒrþŸì·5qYýÑûÊËÙâÝ]ÔŒxŒâ}:r‚³‹O7©Åi o\ô"1Œ…7Ó„jªìÕAåoT ¯3Æ êÜ24¥Þô£†}êõîÈMÜéÚo‘;Ì®!Jfºxºzavj$VÑÖvݼ'§(6·å‡Õ}ƒ„¬V |ñ.…Hˆ›+±Nw"éhž¸=²ñwã(ެ߬Àd˜Ð¢L]²<ØLN>Q€ –®ï›Np1ä(Š›Ï?{Ù¢·~möŽ4šâr/ZÙdq‡§þ߈/Þ£¢X,Â]qãÜÛ.㊇«d=jâoéuïé ´‘†bÛ“K19ù¨×Ü÷¹Ë" ^0\ãöüÉqÇõô®4ã÷Y­Ënv—Ú*éÍŒ÷ˆ(lCÔíÚF0n\ñPÊÐvçàŽ¼_¡À‚ñ„fé=]²<æ4§Þ¬þàw˜³ZtV.ôˆ;ÅÕ¦qyì“Ãê~¿Úí ;˜âÌ¿wçã³Zš†°aá;1õæ>-_o™.\ñßì.1ºâɬhcÛ+H‚JÞ¦@WO ve¢¥O-ÊÔÄ#:˜¯šÅþFÔmÌm’JrTisò '¬oΪ ä ³–½ŒWjµ1Ž1¤ûR¶+ŒØ¦x—Š àãvL=pÅe4+UyâØvÛøŽŒŸ¯@³£YÓ£)†Îº ÿ¶ß¼kjâA±­/“Ϋ=e鈫¨úËòªEábÞÚw<Ź3Ž«JiÂö³ªw³°‡*~w(®½ôt{Q·çs5¼O% 'm TÓ^Uýºîæ5㦈•‹¯ˆÉÀu]çÝ-á­0®¿:þªÀzÅ‚2 ŽåmÕ¦®–.²ÿ¨¯¡ôA\­kÓub—^·‰¨“rÅïãrž÷%o¿ƒì|íd¡éÍzŠá·rýÚë{á º‡ÈÝfrß™9ÿu±;|v5¯¯³×N7Ê!v³M"¢{ù'¿´j(mãëÓÕémf†œLp†ßolG‰†+ †Íá©v&X3’õöárå[ûaUÉ&g"qU ñߕӄ~¹ÎMü,&ËïÇêò˜)Ö¼n³®‚ê“ “f;ßuÅOÄX:ìü6}â‹>¾MâÜiŽRÛð×öΡŸ 57+çZÀ”kŸè+õÑÏÜXTê}ã˜B×Á¿¾4Ç?­Ø-â’âƒ,SÃÅËé\açK¤ïP{N¿Œ·¾–M iÿxàQ´/.Þjå7Ó<ˆ—>g̶ÕÀß nSгŸ+n®¶ÍÅ)‘ÄxKÇO<3«šjœáõ´rž•[Ÿ Ò9p-AU5\—?´Öú× ’¾~ÚÓŸÿëÿºb貕dsò¦Þv½ ˆd%ƃ•EùÞØ²‹2…*Ht©2¸º4ËBf&ì+†t¶R}zÏ/W?Y)ߎIÅ/Jz5úBNDŒT:Ñõ¨ZŽgb†žmÜôn36ö4ÚtîHCÜ ¡[Í伩sKŒËzÉ÷ÛËÁ‰ÔÖ¥¾¸§qe™¦À~·7˜Ùf<±“–½â2ÐÔÑ ªØ&›‘þÄFCr¿Ío»»„Ç‹Ün'Ú5à,ÖÏ÷}ß÷Ùš_/¸^Ïã%ù·õ¥Á/Š7 Hxv¤8ç¸ýÞ9¥P„õœ.ÉŽ¦¬lÚ«`£ÓŸÞ,¼ð§ñyRÈúzaHý`¾Qì•ÇÔ¯ø¹êm²ëõÕYÊ ãäF}ñƒó6圓Ü>µ‡¾ rPÑ ¨™œÑÉŽIO‘–tÚä ëÊ‘khUþ¾DÈA™X1õõ´êÊqÒ{Gh“^•×(Ô¾Ç'£õ`u†q17Ρ}E¿å´ë·tpIqArùN.~a½š³ßÜþÁ”ÐùaÌÀŒT¶R@[ÝV…2…á›$ìàP$ˆ4h8HP|Ñ;„ªDK'Ö_¿z¬-þ¦.‡™ <ΟUà{)® н¡hRCì2z½Ýër–­e2ýî¸Eqí˜ÛÞyœàQ¬‹_"¾¾'êzJµ7Äå& ¹ªCÔ2Xž9lá[Šâ3F€dš£(®NYZøA™‰Ï|X{4×zžÞ¸,ù”¢ÞJqY-eÇ…©s'ÜçxØÚ)®‚¤Úù6¹õÝMó:þP¼‡—{>«ƒ4{–ɉsåÌ o6¢<‹â+§ÑÛ$#`¡™%¼ráNAc#¬SéwâÁÉÊsY)¢gftv*>;ºÙOKGÑ(NzQ·¦½/O<†q>]Œo ¯eÅÚse›[}p ²¸GîB‹bœÔçÆ?ÝÙé°qEº#%þél})ïVî±™AÇ‘išw‘‰ª´"¶±H¸òÃÞŸï°°yÆ(Îöœ»Õ“dU'ªËþ+<}¹2½ñï«f8BêËàº(#½œrdvš#Ã7*”n—Q—[ü©›|º»ÅT•8qÔèÌN¯3bYçÝv eb8s¢¹ð8.Ék`\š&¥Û(ž|y:ÝÎz-8Âqûí3zö‹YþÍ\}âà·Z uÃåäx­'Ž™ñ‘´»?-kîq@a4½V_ì’M$!¦éäßF%Gûâòõý1î¡»^Í®øõ9² ^²œ˜všxB.5¯£z^/Mï{>à¸C S—¿HÊÆþ««ˆo½lŸG™RÖsxC`ûùz[?L¹=0j,q)~Ohºµ.bl Ãùò°`#ÇúÍÔ¢nâÌxd>ú^AZ­õ>êÎ9œ·(ž`ø¿ì½‰]Eík(žv¿¿´øâX¦~žIET“/CΖžÅ.~7ä3(îœA;v€"óµ%[ᣠžnOÎ+(‚ÉïrPhzÓ=¦!fR\¬Æ™‘ ]¹ÇY]¥Ù £ô6›YË9Rçîx åŸÿ˜1\c¼4n¶Ã'ñî‘7©aHÝ2 W ’“ˆð=ÕoF &¶3>*Í«S“Fˆêlå÷žx{øRÎð½=r³ÏCúa[߉ñçLà´öŸpbÜj¡Ø‡Íl°û)®½qj@½eb|âDçø)&P›?Ç(Ä_+“®¸Äø˜Œ|ŒO¤ø]h,æ{ùzbä)Þß:>mð\`‡N²ÿ£cïŽ;'ÆÔÃÝf·jñdë+v€Ðçg¸Ùq’Œ/™N¸‰©O¤øŒÑxÂ$ó H†Ui=ÆyÔê¶Qƒ‰½™­Ø‰ëo „½³UqæEGUº¾ËžÓ‹î€3=O5YE€~gà¿Ñqç Œ0a톻Qrÿ»¤Ò=íT$½6 Þ°J}ìÈ?#HŒ¬€Œ&?T¸q=ÅùY0cרÛóâ ‡''«H¾â•Kî@‘#JruÌ2¼Þ•‘øØø NS.6ª\`Ä/ã3ò §¹°—Üeré|Ý qov¡Èp¥ºYÕ&V·Ñ=ñ–ÍfÀø(ìMJ§ìbËfpöˆÏˆ©[¾ø°ndY8<918!m¤Ðí}¼hXeOLèvnÑ7í}üÌÍzQ Öñå³âŽ3l¨ÈÓÅò6§ÿ]kÓ«Þ03>zøL“·'÷ù‘áÖ•’A{qÃ[ñVŠÛ0>Þ·# Ã4¦®GaθêX·J·`kŒ«AKŽ€â·¸¤DèñÏ¢?粑-¥ͰµÁÜW8G·V#™U©ÃùpœLqáÉÿGââi×|6Úö†§xKeêéFÔ•+ΗºMÕ† ñ¡ÎøpŠK.Ü×éuÎá~2%ìó±zLÜ“e¸Ú¦[Í8â*†žÓHQ<ÆqŠ/.:€d¸&9™ãs™08G'.&ºåTw¢ n¡xÄ:ã¦oŒÛàÍTÅ·¸ B*6 ’óC`öuw÷-YÕ›|]rLøâûÌ-%䎸7Š—Á@\øãöä8%¢î\:äTŠâ7¼ pƒ¸|ëÄF2ömûëg—üʺU£†âã0>žâ{0«ÛJƒ®mé“ïV¯æ=7›Hoü‡H“€âY;e'x6Åǯn„ˆºë„[Þ¸lÂ<Í×m^™$ã<¹hÍ}tÓC¯-åä72ùlTËÒwPœ¯¤3,5[HñΓ_|g£“iG”²$-kª v x7ø ¼ñ›DA|›NS2™ÅB±üùÊ6çc¬@9{3-EÔHºU'Äև¥QW Ä®Ov±ÙšrÄþ¹I¢$õˆ°¼Šáã¾mfí´4ÅïÃ_ßÓG‰m 2°NÓ²8®çÇ»aöÒ‚ƒ@E/Ï·˜|‹PºuxÓïž ±ÿ ·º}þ;Š3¢ÛùMÚÄKÈúw?Žç±ö±s´Î“<]è°:7ñL-Ça˜M.Ÿåk‹|)…;«šÎ×Þ³cj¯N4Ùúš’·ß  Ö™+þßÀ8[µ«âC!MLŒM­`®|.+O@¢[”/ÿMñø_‡Q$ ÎÞ)š:—\2Õþèè'7*Êèª MÏuÇ;³N¨½ìñ8{Å+RÚ!w'4ø}°ÙBìBlÉKØäåÅÒÃÀ:Áÿ¾ÄÔ¸³f=ò!ð:›“jêJ÷Üîs<÷ ÑÄn‹è,íî–‰R¼ã;B;•e(v‡'vÑÄx„ÛBxË…ôÞ vårå½aüñŒçÑ`‰Zš'`\n#7—ðÍûGßîáû ˆý3«Üpƒ~§µs¹·yà®_.2ëhÊ  .Sk`ësù´YX`JýF&jx¢¶œ¹F¼Ó¿~xCŒ_¯ÂêøÇýVêEš+ ¸~wÚª´³iq Íyà‘¿ñ(¼°ÆÍŸ:—mÚ1ðâQš÷0¼ÂïuÅ Ï;ì)¤8{ïiÇøV£ÏV…0|MM‚Jj¥•ìîn»,?üÃÛaü:Ô¦²òhÓiÅð,·W¯¤¸ÜEžy9ªî’œu‡pW‡Œ‘¬á* ºúÖa—“ëmRùÿæ§¶´ £é¡–ŒhÏlVZ¡ï¼Ëpœ›Ãå¶—yåHÅý5÷WÌ H3 ‘œ7¿4±Z=ެעZ_\žÎZòƹ;n¿0æ—®·Ž¸mãô;ŸÒÑê}1>âÍ÷(®ÿÙ4/·5w+Ï€&æ­ÂüHï­1.<òThÿEÕ·ˆû~Ì‹åV±¢äûPö0: !6Ù+nãí¨jÉÙzg¼@q…ïÿÖº²Av@|ö‹k‘+Ú¼ÚÅ&æ7bRÜ›"oÕ*:âè›$FŒf|©ôîW ðoÎá­*_y}ä] HáÌô¾l\R®p´ýG²®8ܸø9BqËUG@½7ôG<>nUíŠ7} Å*@q ›rRƒç¶ñt«`Ö¨j~ >6 ãâ}'š:™Rá^WœMñÃCŒ³»þ¹ëâöƒRâ×t~áN±¾Úß]½#ÇÇC~R¼=¤¾%0·,Ô⡯:;ÉnnH‡AÜåæü°ºöîão¡í•œkFç—ˆ-Ý_ݲç?ÐìËÁöŠKüÈP.þ«àYÚÆ\ñº­yñÞ×oSïåy‡Ûùãîrö1aõl˜Ý ¹û+HÚÏzÙt|ÅFÁû4Šû ŸNqçA‹ÈùyB[H†3–ËãwO¼ë°¨­‚+Ž‹`y,†îì3ë€8bêϱp/o<Ü’6Â÷(N§³¡C„ㆅm†–Ê4ÔÿaœæƒËеLƧ#í‘ãÄU蟯´ 1®Ë­¾9^™Äkn¯!×^¸d8÷ÆKKÛ²×3âI‡<>ðÒ|tnTS«ý©¬KAØ¿Ì.Âí1>šãtˆ7S|_Vî[²Üó(.ñ§"Ò2ˆ0ã.Äy†ÁÊ7뽂ÐÜö9/Ü#‡+ž­v~܇¸ŽªË0{Â+w6•…,²nI§¸mº‹ ŠgŒ¶ŠâQˆÿÂEñoû6i!j‹øçÿåWŽãˆG0®ì0‚ßËN*˜Çxäý˜¦|…w$ÝS³Eò5…ÿOLÏô-ûQÜl*ªB¸5Eñ(ÞÄÙmŸA©ÂIJ›Añ©¥xyE½#ïoƒ0n+Ù9.3“ÏdCˆµç-m‚g\*0.äwüpñâüj—W’ã4ˆû1u½—ДùëbºñøËɹ×6Ú•¿í‡ û—ÓÜö•xù àìºe3Œ—¦ªêF]žH¤5E^åŽB0`65Ýq{ÌÊ¿üuIÓ!(w_wbÀȼ®o”‰áe7Y¥‡q2Çù,ºµÇŒ­mãÀ þmÒw/›ãD⸶Ü3ëo;U«óÖçI‡I.'öí„Üj#!I>ú Ó$ÜKá¼XnZ‘V]z/Š×•½é SM­_ÆH성'5¥ÓÜqǰMöû.ŸÜ“)ýEÓUÄñÝÑ&£ Œ´fjüó µÿ¸Dz ãÊçOÿœÈp7¢îEj:òJ'ßxµB\¾[ÈÜÆ¬½ÇÄ+’ª! žÜLVüŽ“¨‡ËQ\¸Úý5u›ëÍ ÷U ©‹—Ë“'ºÀo´Jﱪ…ê»#^¸òË£quû/dOܦxd¸¬¾àijWƒ>‡’Ë*¥É=p]€Ò½42×B¼°µ,2¿ºâ¶©ÑôäÑ«5°Nt¸3Š·—ƒ¸Zcÿ´zÙ­ä¸x7‘Ì—Å[FèçPœù׿dYëWòÇzŽG×ÿ)ŸÛ ¢K'Ü\§„°ZŒfý3u!õœ3®„æ‹óÅëDŒëo“n(ܬrkO.tÒoyÿ:6gßé‘óPTMµ>íÎxm‘+}põ%³¨Šñö–AÇ_Qec8"êmCëƒ(nY´u>Ë5¨×sÒ–¹]ÓéñEñ<Œhõ—áÇuž6ãY÷ÔççèÎxlMºuè‹öBÅ$8Å!§c\|µ4ÿ ¶›õIJ W¹õbðÖ÷¦é)×]ªqì¹sÞþwNL¶³ž}ýJ:§ìÕéW°+ç¼8 ÁoTCqãŠó>a÷2 =Àf)nà]ÜÐfÛ›ã†ØwZ,gå3t„—§ÅÍËœ\ Iàx ÆSžÓ6K )à ï #öµñrMD·ª¥·u¿ì–ëX® +³í(7áÑü¤FҜ⌗õ•=˜š(NUʺï1çß“Ùw¦›RWÛ·31õŠÍóœÚ­sfÉa‡ vXxdÅ…SÊþãDާßß®óP,{¬ C+RF\}aõeÊ;—ê“}÷ Aá2–)-àÉUéZìì`"|q†ñLÌ}|Wœœ"FÏCq¶&]V?Gñk yt¡zÃÍÃá…7˜ 告—Ö¨[ㄘ!P\î@+ϧ£ŸòD3¿ª kË"Y¨ð²A<žöXÿ]ãÀ8ß+WÖ2ɳï_y¦)ŠÇÝñCqxh±)ƒØ¼{Cqö±Äõw¼ã¶xqød<] ™¶Guí1›×NïN¹ âvL=zl›«%ã”Uné(ùzWÍñX‰ÜñÊué%úMŽ®/ÄxŽâ¤ŠûQõCé:®ùî‘®­öÏ¡8ɸàË܇'I!î´¥6ß;kÓOQ¨¤¸öÆy»†w›ÝArÆÿ_{/9ãM~D‚ã!ñž€:9ßï‹Æ8û¨éÄYò=(^²§‹â&ªnÎË t«ï)ÕyÇ2ß^&ºŠ ½v¸!êŠë0»é„ë•l‘@|´F1J¦zðËïí&H(@-Å޳Û,fôö»ã= ãÊX\’k áöÖ¨ŽãÑ\È4ö*?Îä$†“q&LJ6\H7]Ñž,ŠóÙq~q¯¼ø¡ÇÝvËÑ…¿Iµç@<P×ó‘‘3SŸºü&7°Ò—Ë0WÞoÛµ×ñ¥s8î5m} ¨ÿ•¿òW.h3jó°ß™ß6S¼îC"Ñ3µ_IñŸyªÛý/óÌ¡¸\éÆ(®ƒ’ýÝîŽʵ¾£T{çùxŠ‹8¹° —â¾óLˆ§'ì‹þñ½Má¶ÒyÈ”£âb™›LÖ§:ãÙÉå?õÕù²VãÇ?TŒÛË:øÏdOºÿÆ\œUŸ½»Ìö̧®–qƒøZ¿­?÷e\®v_úO|úq÷—¨ [ÌfÎU#­lKš¢éí=ƒ+ÿ_óëòr«)nUß=‹5”(«y–F1¬.ïôÕ9þT5’SÅÓb¿Ùb‚ËýÒ’µ†¿ÏÁøŒ’V…ÔIcJœâÂciï‘w?ypÑo“î5÷e±b£7\ûó·µÓ33V7—Ó2::˜ù0éÕíÅ)­©Í³Þ¡¬ÁmŽ0Þ=þãè{ ùé~¯º1…)lœ€ñ•ޏÞ0î´áQˆ'wŸ2‚t÷¢S*:°œÏ¡¸nýhØí,m¤(O„ÛwÀºšH*Êp—è¶ž¹Ó.é°vø…÷AqšnÁÏRœ4ò$¤:ÔqŠSŸndp÷cS >an|R9s¾¸!X¿_̓»ÿéœ×ÝÅÒÃ8[/Z%ÊêÀ·ôîÅÃ/ŽÕUÆUo\%fùÄÎÿ›\!ÉËí¢Ýùà )!ÆóGÀä!>F"‰SK4¶öÇgÑq¬7¾Ð—‚°6“ëvdÛο‚»ÎGøÙ“c†€†TêP¶Ë•™UP\Ålk2(âAü·?"gÄk.ÙrËËí¢6вoyŒ‹ÉĬ;ž£x¹ÔÆ&8³F£Ûež•À,ˆ3ª«{ÿ8O§an¾ñ‘ÏÿÆsûXÜæùSì$º6ö(%ù[ï! pk ÷ËüqUHÆÓ¯ùV1Z×0\Ÿ ·_û]"RH=„¼ òbŸgßBÓÎQ·™°z_ÏP¼XŒŠv"¹ãé Io³HKw>¯Îªbº|´Ç}þ7†q"·ûÑçëýe#-°ÂXÇßú˜ŠŒ—&™b%ÌêзönÙü‘ ñ}Gα,Õ ·ÏŽYØ8ϪÞ×L7v)jÏ–»]·îxtÈPøþü9ãk|qnÃȦ;Ò;!ýñ·,f¤ñÐ <¿ƒß<ŽþagoXNÎÈ- -ã𥯓6Š€âõ ö Š;/¼üÕ¯0­zÓ¢<ÑŽq³;-›X´nݸãñ0$Ç÷çϱËåø"gœDñèÙ/bTÏß!)®öt½¯šF=óõþ·*•b8wÆ)ÝľG~UÜ~5åT¯MeßûT•e"×­š€«P¯¦Av>ÛÊÃçL—5Ê{2ú¨}â5sãî¶´¼V>Å#ǪÇcšì·œâÎYµž¢øåJC Ÿ’@œZà&7ƒïÀDnd¸§h#åw\¸áÒ¯¾$ů‘Ö¿ TçºîIÖnÓœDqöŽyÙÎ[kƒ® O€7mæ]‹õùü±?f‚ã-(/õy†qÿ–p•;q=L'Bqqkp}>ÿ©¸2EQUw•JLŒ¨G>.™­–ÚÎ%¿á— ,H~Áåû„fx ÄE«£VwíÕ]å"ô®ôùp'Æ;oò‹S%}}£•áš34€;+Å~] Ñõ2Ùâ¶`X |­TŒ•/Rœ[†dxŠâÂvô-ò¾b©‰¾t|¼“§M®t¶3IíÂðË)o\ŽÖùkVAqñŠ—èÎ~Ý“7(Þ ^'†[Á8߅ĄŷT­"iÐp(þÇj1^¤¡€Y¬¤Õê!ÅMÔÀøä¡#þ¼ð<ðuIu6EÆ&0®ÒÙ$ª¾Ã;AÜñ¸˜ ç ïvÅù`&ÿï‰×C«5·©^@qqzËkƒ5ßùàn3×¾ò©Û¯„xß(æsœR¿ nýô-GÛ€|ÜvÈ“…·<÷²G^ øWîgüžò¨‰£_õ>^‰o>ðzf­&7TÞ.$²¹è>îÿ Nû¾;Ù¦èÉ[¯ƒ8•áéÈc‘ãÎĸàö?Œ\N´Üá¼Fþ!ìË»ÂØ{ÁÏxwS¿^A¬ÉðÞYqazÖÊô«'€âôáÓÜÙ aÖU÷Gru ÁYÍbcmƒÈx$¥À…ñŠÎZïçÿüŸŸñ{ÝÓܼ%Åù*õ$Âÿá?4!ó àyz»¹ëÞ‡O–@Ÿ/Ð!õÒÓÅ}Ç @¸³Õíš qkÃøÓÆP¼¡EûÜŸB5dg?`×AñH†â'2œM2†sŒ'_!ü3Y”ÅÙžqß ·Ù«Ö«9;!è/ÞYql&@zù¼î{ô•“áÂ,"31?¼m—™~=Ó¶Õô´SîÅë[ê€øt¶^a<‘S âôn®(žÁxx˜Û•ºöůHºüI,-Òubu¤‰õlE\§n(’8à8‡·Jˆ;ž~)Ã…MuO1œnÆÁÄ‹ùJ{ûŽJO¬ÓlµAñôaH³ÍÎ@Ðl4#ûâS¤¸ðXC.4TTóâÖl8›fá7…—.¯¼•ƒÞŒëăû3üí|Tið”i5õÐVá9ãL‘H0½é¸—k_5>’(ŠßhªõÓâ×õ´/.¬1.ÖBX—[ͬm‚âVœF8å“èm6¥•Àúâ¥'&ýýÕ3á׫~n1ˆ“ç„¢]óú¢YMg¸±—WeýÄ:U Ðr30b†ÔbI ÏÔ/Q5Mrþ£4/®J¬0®êo3n•8HÝ¡¸`¶|LÒû‹{¢ËhOœÇëóЬtŸDéR9j<ׇÝ{5‚íŠsëÏpûãâO¨žX§†¡±îPܦ¸T†TgCÍwW»âA˨…\‰HŒ›SbÜÀûò«\ˆ‹XúõGóñàöRÌÏp‡•»eN|õ˶z °ÖRèrÉ·½¨'^4ÇRw‚/^Rè}Æ­ÝïŠâÝí}fÔRãkiñKã~»°Ç²ME¤¸ ªGÞ¼-⑼f»âúÌÖ”#œˆÍfÓÇzì/¦¸ÝJË7÷½ñ¾`ºŒ™yñ'ü‚±·i(°¦ûI0‚‹½ïo[ ~_·©] @œ}?%;*VQ<Àø‡Í»ç¼Äßé¾8 ªÿDW׿ˆ7^) ?–àü+j[ùÆK c·€”Áß´`GÕ‡t¶G;ãCjáÙÏÀWatvÈ ;‰îuVt[…ûgÅK/\‚â”ú¹1uÝŸÅÙ?6Ç£îúlwüóü²¼k­UÿŽ¿Ã,‡ø{)I÷çO<À€âgwJéq1Î}q|E|Š…Åí¡8ÍüØ—k5Z¶bÎ7÷N{§™³U\­p›¿¾MP\»ãœà†ê O|ýÍ^è‹«Õž±Ä^«ì :Ínóõ…ƒÔ1Yâæ{)#:Ù1í~sAÙ0XýYR³Vvò$dÜ—³î†q±¼Í2“«Ô%ÅÆµož¤8ûÊøÒë˜`"428¤þhW<þBZw÷]À¸tű:Ýôƒ¯3LòjŠ«Åld:“ûµØ'»[žô"/þ³ÌÚ¹uMH]p\]Q<µ´M”Ÿ:=3–D§q¸u÷¬g»â 8yÌòo|7ÆÅ’6õm¶î>ÖÜ›=8”A>KZé‹Ó5ÍPÜÆ8‹(Ž[I/£øÅpéšçŒu1Åy|y*5wKœ>PøÛÍ:{ÖÃ!ŠÓ-ïΗSœ» —6AœHn65›~WHzþ*}ì¬+`â2€Îá­Üqþ“)ÅäsÛÔòwË·9ž_Ú7—â±Ô_Fqª)z[Í>Ÿ¿þשFmØŠ§w¥S×AÖÝýÈJ­‘ïícµ˜_£7r‘¯ :¤N¤øèÖQf¯p×ñénÓ¨ººQ~ …¹ãê&¾rÁN3Ç·þq—/þùüE`œ-F§˜£qöÈ_g幨!F©G¢Î+ˆ±±U½Qú‘ /ïfgø¢x«€x®Eº³ÛH£&©šÞÿ¹¼rñ9 .é-®õ¹$Oøâ<ªž®í…Y]ÙüpÓ蟿ȮÆß匇;Ããa0ÎÛ3¼ãÒAqRçMÜÆÊ¸{êò O¸âí#gÔ¹¨ñÅǽ¤½5ÄsïÿÂ0®õmÒ÷ܰÉþ¸½¨ÍuËË×Óô2÷[ÉÄáŒË‰ú’QJcQ—bx+Æ_áŠÃïzÿx3Äe(}.±ºçƇiöÖDÔǵÎ' x®ôÜ0®“_¤Û~‹Ÿçúâÿi‹3Î}eáfÃZß”¹„8œqŸâÂ2†dñVg\Ý£_ê•Þ‹ÚFš×<õjŒ‹ˆ: h±±kЦÅÛ&u¸™å—S6Wã´|宑l2ÆÓÎ8[©žh2¶‚= Æ^;›ORüG¸É07»Ôá«éÑát/¦Nx;ÕVf1üW<ñuP¼ü}q@]œNèNý"#[2Å»Ú&:Ë/SÜ8ãÚH„;n=7™âgœï8‹ÚT†üæ¸Ì\8‡5g“{ û…b¸ë‹Ëi^¶×Ì8ã^½S¶êP¼f…›JÐa8(Ž‘4®À‹1®Â¤°Œµ °ŸÏŒs8æ¾jÖÇðÏ?åœáxÅ-}ìR Åø5‘zý”Z¦.u‹T!…·ÏsM~*MÃú"9ÿÉ ÜŽ¨óß‹¿½’âl©º¿•=aP.Å+0.£>/8"ê½CðË1Þ+ßSŸï‚hV½öG†Ò¢ /Ì6zÉ«ÉÉ‹kŸÏ?Ï.57Ëê„vkÓíâö* ùÒ;;~ûŸaû×︮¬c9{<Ç}ë\ö(Ç\ ŸÜ%ø51®ÿ nÙíd–{Ê“œã¸·UM‹0¡Çðçºâ 8a8ʪO]‚N©×Bp'7EµÚMÛ¬*¶8nñœâ!¼'nÅÒõDŒ—ÂèÁß#+Ñ#Áó¨; \âüµÏÇ@qbÒQ‰y=ô¶c¼Ìއ¶ùFÕâ3㥙 ÁEd}%Åͦ3épkQ?îFòs=qáWšô@@q*ùî¸áæïôÆKfû%Àx|Í¥¿vãÚ îþôXØ=¶bëÆÙ·RœÁ]×oΩ<^ˆ¢[.R¼8òú-‘a2û„ÃÉRk œO—Au•«or1Nf8›3œ9ãË#Ù÷gH°¤&Чâé˜ó Y¬û{1^”7,PÀˆxÔ,N„»„w( ©{ï' ãö{:œÎ—§G"êô¹ñJŽÛ¯`8sÅS#Æ)†Ô²¸ _0æ<0‹·bœüR7?°ño¯ÒçgÒmPÉp/¢žØ4>¦Æ”A\,w“ÙeæÄÅ&³8ÅÉkܪ8ÎæóÍJuÚª6}v[šâ¢+Ýï ¯+¥ý}_œôL*ž_|LÇ}l*oÅ8~ÙÀ¤??ó3 ŽW3ÜŸ³¾M}Ü•Š2 Ûn/P<ñQu±Yb¼Æ©'1.¹½‡ä´ö§í3SûÔ¢ç;ÏHYnСë‹ðÜšÕkÑþÄ)®ÜpP»Ù y’Cüâ¸ia8ɯ.6û¨™úL©ðªåy2ÅTØ}ÿëÿz-yk ¨Ï™W;¾ë^¢8ç8“g?|_Nåæç6âBâ„ÎTìm¸A~gû]—Äêw[¿‚¸à8»ä+éKÚì;݉ñ‘θ&9iF œ]×hŸsÆÓõ Ü”^ë‡]qéŒ ×}ÊýJÄnHgNøÃ!Š…߇qþaRÒ€c•zÕT¸sr[6ž. þµ¯}í Î8É7¾8?Á­ŽáÆ=瞺|©%˜Ý±·<ºr+[åucòJ…‘WD(ĹCÞæ‰»ûŹ'~KsˆÆ•;ó%½¸­jÙéæœ¸¸3œcü¾@÷¢œ©F%œqá-„cMÖ×av.ô>¦÷Àq„ªç«>¶Jt«Æ*ˆÔêHAœ…Õ›0n4»§‘cÆ•95QßÚW± ý‰pñÇsœ6v˜à͵:ÂÛýÏ•©{åD¸œëSSK7½‰Öwæö'îé¤íåÝ÷ÉÏ‹8‚ïa‡Iˆ¡ø^c”ã+ÜØ’ûÌHÞuÝM£ê2~½žñŸ%—e¬;/š[ Ú.‡‚OkŠïÑA•‚ 梒œŸ 7§W,q£½IŸß »× ñÆzñä¶ûùüâ_ü‹£Ï0|Æ63öiòÔËJ¿÷·™%!þgügÙ7Æ«É:¤WßDùÛjÛƒ†xCÚÕ…Ùéz)w*ýNeáÓ72óp’¿­‹ìddNYro›ß—ââ1Šg>…â-Wá^oq[šâ/˜g3ðÕì±6,H^Ë_ˆrsû·vW©ÎiÛ>/ØÓë·°9ÌR Gs\¾¬àº_,Ä›Bêsv™P*ñ眤ÞDñÄ7PRuPÃGñ·ûâõθ\¨¦6ÉÕç×¹øÓ“ÏvI xËZ~S|fTÖ2ÞZÚRç»d¯–Eê¾3¾ËKƒx°¶Âð½ñÅ¿Jïi+'É]âz囸º³œd[Ûû©wÖzr›ðwÄ'bÆ2Ùp¨É—Þ¶¼Í£8ûÖøÿüb6ã,P'2|gg<½Dý {ÍHÏ °v‰_óàjOµ÷<ï> ÌCÛÔZñ<Œï1¢m¯3+úáò·†ã!ÆGÁÚ¥´¿ËL’þŠó—Ñ[Æ"êÑ/’~~[ÆÃÑ/eg<„8 ë ºŒ ?ròlÎ=»v]CGóÃjåäÃ0†7åAzG¤8â­÷ÎncÎ8£øý®ÎçwÙ“âbÅ÷EÇøXŽ×S<ù!³×cœnô¢ Iïû:]Uþ“Ò»¾"—¦I(ܤPš>+¨C™fßuïG4G|$Æ¿]j¯]ƒë,ú3©;ˆ „³‹LñÁQõg§'W©c™z` re›Xœnö™½t9›§ çþA&9ø<ǯ͊âÄO“–ø-8žX¢þŠóÏ“V2\œ•Žýençà =uv1îqÜ[1܆ü6‡L5ºÄQ\ÍŒç|q±T=Vø¬ÿùk-é{éNàºf âb›Ùµ¤Íg89®>ŽâŸ²;Nbx’â¯øÀ¸\ÏOr©cùë©ëeçÝ 5¦¶™Gqß·}sïç]0™j U‰!>ȧQ<¾bz|…+.0þtŽ7EÓÙ›]K—lz¨%£õÏ<¸jëŌ標ÝFqŠ»\å°›¥Àòó@וJ²‰!1H®b8£x&0žøSüAä<åŠ;!uæŒÛÍØñéˆ <‹qVJÎò®kÄ9ÆÈe]u²ùº|ü%ŽÔ~ÖHqjòÞ‡1zv£õÌŒŸ×Ðæ~“·*)ù¾™m"Ôôí‡sW¼âå'š(Îqg»xžábßY ãò—*bÐ ò!ÏOŠ›X;ë±ÿ†¸ˆq½¶ # uHÜ;,?Þ53>a‰Ûç‡ùͰÜr1ç¼ë–ÃDÊm<àŽrp1ñ ß‹â,hd}Ȭ ñÅ?ŸÿP½ÀÊ–êrÈs“âäYq"Ä¿¦Î1þ\Ž—mßt0ŒF‘±¢ € ItÅÔínÅ9l¿Éxy²ÍùbŒsÓ™¯r (£ø†óiñ²k]}G…/þÅÝ>ž?ó%{àŒ3ˆ³ËÝ¡ÞSg½$¶Wœ÷òòôÔ©mþz· âOvÇ+(Tq+¥O=㈲ /Œ+¹+Ö·Y+ÜøS¡«Ïfþ¶Ó²×cŒÐiŠk-€ñVQ›EqÖª­ß-+<·Å¿(_¼4#nÉêÆÔ%ćQü'>l£7¿ËÕë2àé£WÃÏ›ÉpººéŽW!¨êæÚvìýPeEÓub\BõŠÌ——³EBTÊ‘çñòrËÁ8ld…”:ħ!\¬Q¯ö´ËÐ}ñ¿Æ0…g¹‚éú‡“á_BWœœÚq†qy º¼ªð­ž,ì1Óv\qU`X½<mÐÿ¶.Fè ÍŠêaœ+…_Ü? [§¹0žèrÌas‚•‡L°‘R’þâCyúT†ïHñ †«oýê_ý«•Å Wü?ô%mÇx ¸mÖgŽlsñîS¼“ã×$Ûº•èÅœÔ4^©Càïi0BO°ŽØÒ1…e¹K‚//«Â8¤[ä÷Ÿßm)ngA¹‚ŒoN²ñÉ Ÿ31^á‹ÛÎ89­Î0.9.#êÆ8ã ^xæKf¡B¼Ç·ÔíäÑcãX÷@‡º[Â0˜¨ ÂòOœ³•÷œóŒ7>¨I-ŒJq‚ÒÇ'™ÖýõÇ‹¦Ogø#(.då—üi¤3ÎÎŽi$xÅœ8Û.îÌŠ[Óã vÅï™ÇàÒ?ˆAÃ~ i)Œ«RÅg³’æ¼iŵª{b’¸-P Þÿ¼¥‰n4}ÃçLŒ×øâ—3Þꊇ+×Ùn3Wÿo\Ï×ÜN燾$1^Éqc[åãŰxó [ŒŠ øiI8Þ8wÈëbêþ—K#Þ¸˜öuÙ¾ø¸TG•î1éhim‰³ÿ™·P\-pFqæûVÓ‡ñ6w¼ââ Öîx¸9]-“ÛæUCVÕÍ#й #uQ¬æT]‚Ø=ãCîn‡m47=íAw+ó¿héíGÓæ%gθÀ8›5­]×–¾ß‡@ÅÙ‘ìõŽ8uŸø5GÞÀq>XÎqü€1×ðwGÖ«ü¹6—Ö£^u—czUå—U6Nñ>oÜ_á6z‘–·­2Ör’Ûj„²ªá‹ >c«YUDSœc|(ÅÙùÀ˜z Åë}g¸ñwÿh–ÁMiÄ:8ég6os­ø˜+!î3fáimþ10Î}©£¸Ä¸üŸÞ¸×J]Þ8Ý×ëìZ .Ažâ¸IYóüóŸ±Kÿ–Q>½3AüfŒ×+uw7wÇ„2KMö*³ÛÌäéì«'÷ŽfÜ”ÎqêƒÓ^¢ù ™ä¼‹ˆΗ¹­™Ÿq+ýˤòÄApÑŠ9î[rωêdŠ·ÂÛ"pÊ!·®‹’ ˆ«‹=“9]†»â¯¤øó³çÕhÏÁÛÝî}•±knÜÙ 6¼%R¿Õ”\'ËþפSWÝdgøâ•θÀ¸ºÆ¹ãA?éà8ã(ž‰¬«ož±L˜•Xg.yîˆ8ñ{1^7fÕÝé¼Ãºu€°2\…v6(‡Íq{xªõÀㇿ̘2Â*õéó{×{|ñ9÷§Æ…«ßxŒ‘âc ®¦ÈÓ³äôųW¿‘ãUƒH• Íº‘Úâø%û g¼ªC« gœ(ÔŒÛÒgÐYàïà‹/Ãx”ã¶3¢–©S?BJ<[{Ü‘irñªàAÆ· ¸…ñq!õ`¡ºšzwüq¹Î»ì¢(>âjݺ¿ÜS܇8[å{5‹Óï¦ø},½/çIÃÙã*4I§QÉê5nÎn¢vŽwy Å-Œk;á£Ûœ¼F)üˆtÒgM0›ã»Q|è¶ñ¨\¾·tU)§ùâT'»æ>YFû«¥WÄÝZDIÒÂ÷­¾xzªn~ÄPS ¨S£Öˆ{ý#Üļ\3Ç/Œ(›ŸÆS×±(=@ÌÈ i2ÿ½Ÿ_ô‹8Ç'c|§IkרëuêJ•ÞxbÔ³è'ó,8ãÄ€z œ+îU¥5Ÿ'>Bü–ˆz+0ScSÛ`Øz\…6дP„ÆP|BKZ›Í¼Ô…«‚k–9ˆsŠsŽOvÇMñÈ ·xSæ0Nc¸ø 9°-·™76]Ny~ˆWu 6y¹ O•9 ¹YbÜQ¾ÃW¨ƒÕ¤«?'»!òžŸHâ’â‚ã3ÝñM(>o[qäã7d(N ¦«µo4ÀR œÛÿý¿0“(¥qM†›µm;»âr˜Á`Sr ‹c^ÑÚ‹)àOA·Lm§8Oˆ]?üÃSÚIS/µXýŠ‹¸»º,š§(žZò¶ÀgËÛŠÎø&uFqŒGˆ9PÌŠ¤Ô̸å÷¹ãózÇx<Û©hpò­þ¬xâœã3V¹íCñIç®x‚âŸ_À®ˆu_0gñx.×x¡sñ–h<Ô^^xÖ?5®0žÉ*Bñ;n“JÝqÝ”íäª>³V“EëO^¯o³RêòÆ?î’÷þ:s?]nL¶3Tg™X°´­HñIŸ€ñ6_|â·(Å?â1Š«æ RÌVfc)…ñ~J—R0θ|»oßâúÍ«“0HâuM í¾‘²Ž×ºo|ò»­ÓÄüjÈëÚm~…+)®½Áñîø>ŸåŒþ^Œâ’á9ŠŒà.Šk†ëUn|½ºóâ·xâ¶€ÎÛÐüîõÌ€à[ÚUSÜßêÒˆqæŠOlHï]㿹²š˜é-Ír¦á.³¼/þùSì’£õhÇx£/>ÍQ\A¼çµ8ŽñÙ3ãfº¡¸\±nå»#Äù÷TÂaKÕP¹ªäu³öº}ù[)>-¢›þq)eMuAqy çøpŒ·R|Æc³³Æÿ§ÿ´Ý²ãKß&cô V¶/ܺÔÂ6¾¶SüŸÃHÛ~Ÿ_±½ì"}茗 ¾úõ ôŸÑ—^•†ß›;òYNÄ&o|e5ÂÁ f4@ÿèùé•Uÿã¦ÇÛ)î8ãc1~‘ÛbøGR¼Ýç_ËpFsãÄÅ›JäôUõÃaºâò§Ež;ºÇHØ-aG ãæÆ—¶£Oñ¥™wȽ÷£ñ ÔR|ü"·qoúŠ8†Õ¥øtŒk†w¸ã BèA¼Ý£8‡¸yŒàËR† @|Ј4ež’è  ï•ŒÙqæ«Þ¿Kq1™ˆxú£Š»âÕUç‹¿}Ä5Œâ1~M…Û®¸òÄUX½1°=x¥jª»òf—â< ÃyН ¬»ËøÀŠ80¡9HÆöd¼Õå¼suLý.Š‹#¬Ú+'/¢“âöÌÂo¡ð¯“:«Ûæì9“•ùüªDúq‡ñ(Åmˆ÷LÏ^–îSþú®ÿé¢xâ+(™…“1| ý£ 4ì×°/†ì ª1~k3ÞšyŸø=[Ÿ^„xœâCÝqNðüÁô ÍþùßY뢤øLŒ›IqÇ#o2•Åw)ÎN|Qß)-Q¼Œqn=3ç‘1®x“IÅZ1¯Èc˜ ëŠ9³µŸ ±½v7/ŠÊNyíD!u¿_F}ñ‘{Î$ÃÅe@ÎMã;ÅUÇñfŠGLkØGJY]¼nÖ¬¸Åñ¦.vÅÐGQœiô~Ão¨¹Küx¼ï/Ü)Øa)!¡VbãC%Æ›†˜\y?ŸǺD7Ìæ1¼­bžú\ýVqAóŹãà È/†×r¼•âÑi›aÿÊWä «ayœâmÛÎÌ»påwÛífË8Ë–¾*Ãêlz<²<ÝýUÎÓ– Ñ!gs0ÚqÏL¹¥Îm;µ ßWnŒ¾÷iŸÍ¹ãc›‘õ¼G ?åâÔ¥Œ»ßÞTÜýŠÕqöYÒØÄø¨Y/?\ûãÂ#ÿAå‰×úãÿ|~üÇ<œuúÊàK³œý7˜ïÛvÆúM•kŸ²(.úª@9‰â^L]hÁ¿ÎÿÏ0\pœW—zfº(>j;ü*Ò©\â6²¹®z_Ä!OôË,áÑœE&P¼Û1\ÅÖ%¿õE«·Qœ3<‚ñ¾¸ý:ÀÀó•Å[s(«¥qëý6ÅÅK·¤xÙw!.>žÀoE×~¸òÆ)gKÖók xqX Þ0rø'f‰Ûh ÔxããšÑb8?¤ÍŽ«K¶§Þ¯Eà‘ÓÚÖ¿«áÔ65=žöÅ;gÇÓ çSä.Ɖóã-ޏďgä“0ΞrÆ[zY@ðIH—Éêåmò#FìÿÉ•êÅ€ºOqö¤ oó/Š/.FÆ[mëa~j¹Œç©öt Åý(˜ž×S4O÷Ïå†D•ñˆû&Q¼Ã7kÚ®Xºõ“OqÚ:·âfÚØúAó¢.ÃðПGñ”3Þbã!Åç¸æ2Uæ}³ÿÇÿ¿„¨tÆ«)þ=ßã»à5/­¡¹z$ôGtß» Ùb˜íe&ZÚ“Ø“Ԍ鉬Ë+/Ívñ±ãa 1½:íÏ,oSß+múÎYÖøâ´un1f›ßi—›ùÜü’'¶9÷&Ç'R<Žñ6³ö1Î×1Ï=Ç}nFqŽï«‹ ŠGÏ^õÝs{ÝÚç{ÒÏ/ƒãû¿kÐ,‚{Ó»×ã3X+áÚÜŽm<=+M?üe¸°¦+š”íèz~Ñ ÞÕj-o"Å›NdÍ;â Š—ýqɆ۱‰‚?8v>ã±™ñÆ>¶†âæeHPñê½Ü-/ÇÓÅW¬œSœq<SW gYºsä"ãF•j{ î·X)º›×ÊœOks©M/>ZM¾H]”Á’Žzž¼Ô[G—ç´¬+ïLŠ×GÕKޏØ;îMŒ«æ×¹ÕP<ŽøE.ok5i/‚.X7Ú—AìÈùhÜ'RüÔŠtæNg).wŽË52b»:ƒ­UŸº®‚»# Ü&} ïn-IPº/ÿVÖÏz}FÜ2®ånÑD«–u‰ý{ëp€º>û%»º­éDÖ¢#ž¡8÷ÇÓg®MñŽ‘Òý@脈º.[XÆ _œ»ãŸø|C³ xÒçWFl6†£ã7uüAuØfg Љt¦ö㵯êE’ßú¡ÊìEë±WÿªÄÎn¢q¥Ï—nǾP0^ñ½RŠ#žöÅåüxŠãýw¶Ï‹¨ ¨Ë¨šá¸taǺ⹾_GqÆq1%^ ¸“¡Ü>®3 ¥zn–ÍŸk²θÍoÉq² ¨fþ™n¦hÌúþ§y±cwÑ(N'2<Q×çÀÄ9>˜âãÎR÷Î qn½àe(Åóý—<-.çÆ%¿Õ—¯œÒÒUT Ô;þ¨ÇÈCø¨ ½t.‹˜”ÁÉÉÖPœ ã0Í ˆpüd}÷);1|Åxòð6÷ÂbuR0=zðK°<Âñwp›åŒG(^ÑIâVÅ7|™8ô®w!.bêÁ©/r üUI>7¾OGzgIîna\ë $Y#¿ZòfÅÕÑ|åv$ÜÑŽqRDýSâ8ÙÏNŒ›uná·L³‹ÒituÆ£®xM/IpÜ"ßHŒ|ñ/äÕmlZÜqÅUpÝáx8^óˆzÙÀs·eýòw 7‹Bn/ÁÜúu¤^qbd<âŠ×u¢ãú¸ÖŽšâÑ/q¼Â§`<œá‹{ç©OÁxHñѯªC'ÆK(9¦B<ˆ¬ÇòbÎøÙý÷ðâ«™ûÛà|ghXIqJL½Ó7µtOfÇ»› Ås›ÎªqŃun(>ejÜ£¸@øØj$ÅË/á$ŒËénß÷—¹E)Þ­MwÝÝïðö°l‰‡ËÜTü%o3ÿ|õÑÎJ“^'?´ˆâ,¬«W:âDŒ»þø ŠOÀ¸ïŠ‹%\cmkÅ)#'âŸÏO²«èŒ›‰}Gtþ±ÖQŸÚ`ó¬/€xâóö(Gcñg=6ãAŠmº{[£¬ú£G7C3ÆÉóâfóxÈñjGœJqã ‹¡M}çï vtP=øJ[ÉšÁ(ŠS·×<ÇÙŸ9Ã9Æã¾¸Ù9‘‚=Ì]m´úM;¼ø£_2ÛZåóþ0“n4Æ»¨'ÛÖôwñf ×ô†vŠ×cÜ[­ÞÄðÂf3绥ŸoCðèJGzãÜfƒo‹âÇ@œÞ¿ì“KÜ.„§)Îî§±Æ ®n«1uÜ;Zñ&ÚPBNq`<"\-ÅKSãí®8í­ÿó_ŠK,dý?ÙE{ªÁb÷ȧ™âÅï¡„;Ñg¼‘á©3Xc'³ŽòÃçRÄO!|[Š×v«Æu,ݰ<Ülv}”Ô7dëk(µÅ¹’j’Ô¯^qÓ²yñ= ²ºÍ‹µ‰ñXZåïp57ljÕñV_\Lhº¥Šâß9dN|1­äsϨ«éñx “FIrq÷¹±ãµkÔõj·žpz­+>™â-ççWŽâƒ;‡±¶NŠ·+ºL=ñøn3ñdDý½¸EÒ}Š‚’¤ç=ªâêWÐlýâ?øg¿a]{êVNÞ¼¸^å6(£§&Š“½õˆÍÖÆÔ5ÂóÕ9B›íÂxk±‚ºÙ'î¬Sîa\9ã ïxô©ã@S½Z-¢)³7?Ô)t?þ¯(¨fbðbf´ÑÓªÞ¥V§«­fz}º»º[ü[?9eÊñTk§xÃò6᎟ê‹ÿøGÿ Œ‹8ºu¥ñÎ>›1ÅŠ7—*œ/Ô™RöWJgÜéÎõ=ïóŸü'bA½vÎÍ&Ñ™/¯U ’ã…IôÏçÿþ¿ÛQ?ZÚÞ]óω5îMz¹/~.Å?ŸŸ÷óšbêQˆ‡ËÔyÚ4nnô6ŠwŠ‚q>:؋ݬO ©ïDñNi› aȃG~ˆç%Òè$ÅÉÅ£­‡I¼šßÒMñÛÅÙÚ¶ŸÇ¯ÀLULÝ,Î}óÄÿ}ÿ(»R¼·gR(þ“‘©r½Äm4Æw¢øy°JÜkGWþØÂ·pÜ‚¸¤xÛâ¶Yš½ÞAqÒV3Åð´3nPýñ§ÊS÷ñ¦Øâ‹w—Ë¥¸üWt·™ïŒçª·ÄÅRõ{¯Û ÐSý£ ßSñßm¬û¾ø^M/üŸ½ŠÔc"õU9Šâ·-n“~xÔW'±Z¬fÄrÈÓ·ñEÛž(Þß9<Š×c\âVoÚ‰ŽdQ|ƒåm=½ýîgûMãî¼6ÿj‡Ü‹¨£éç™N}œ£⿨mÃx×vñ (î‡ÔÅkàW¾â±úâxâÒ—¡øy6á¦\ñþ¢9ׇ¹Õ9ãÑCÜ®šUégûâ«df>í¦Ñþä3•¼¡V•¿œq±¼m·¬nP».K¦®˜$ôjŠºÑìòщq~ŒQ@qhég!ÎnZm}µQ¾‹â²¾dgüú\©–M”^†8»i|ëçS¬£ø†kjóÉpU6ñ*g\}%*W­†[Q|uûͯVù¡™#± ÄòÜuL]žÜ¦/þ^¾‰lRŒÍR›'øŸû¡’ãMïÙh¶Å£ÿ§xÞg®xmsuß_EñAÅ3ß7§bü:‰5ñJÙ˜ƒC_ºÍH&0È>•É´(0[NëÆnT;Í>ÛÅÓ•5V-r­†ÐÉÁÛ8¾šâÕŸâ‹ÇñÀç¾x)œ¾Þ$XýõÖ'4Å=ª_Ä>mæ.S·(þ=ê3¥£ÎÊÊ#sr[oZw´ßNyB¿Z£¹,³Í ŸGqþûk¿¸50 #š =¸ML`@]ìZ•“s(^ë7P¼gm[=ÄçP<†ñ¯?%ˆ—[gÆdŠ¢Y÷úüû–iÊÝfÞβÈ?#E©*éNžøŒö]™f•ð+ †¼êwÖèØÞ¸p}~›ÅøW]¦î~§AzqurX½â]4»âö´¸:øÅ³—ÅKáô VLH’Hñ‘/ÙœâÞ‹2© ÎOd5_,•+Üü%nµ' ñ–Zí‰Éâ¶õ „Ël/würÃ?.Žbýgýkýb]G¨—šcñ(Æ3æ ïYÛV qnS¤]Š7…÷>Fñ0Èîüæ&›#Q|$ã#™â?iQ\@¼÷Ó(W<}ýPù´o2á§É¸i}4ÆísÛÌ)¬!ÂÒ§9­^jŽQŠë3Y¥WÎQȾ ½Äç©—L§}m[-ÄG\|Ôœù’8ù¥àvÇx~›½S0>»?ð‰q’+n}¢”}ílÆAñqИm&ãJŠ”PQõˆ+ñõ_~Û¸ÆCü •ÜùÒòÿÄ™3.1®ØM…tæ>û `ÅyáÒM(î›j-ÅÃøÕ:cÚâlË8â–/>†âf‰ú]~R4ZßÑ…o¬ó«îxHñ„#.A£f"ŠÇ!®0Þ.·@.o˃o‡·~²Ú/†É+nð)ÎçÆc­¢ø‹RŠ‹ÔçwÄ6ŠuÆ·XÒ:_éaCJ$¡³K?S™§¤-V½]³áj«Y0!nÿâÎáí9)øB©NŠâÂï¡8kÇÿñ š:"èø+)>ÕWau{ÍuaÜúó'9¶,¥xÊÉ¿æÅÕ–ña3ã÷·­ŸîKÊ(³oéQ2‚γÄeÐõßû÷n4‹³&ˆI¿…ÕƒV•$Ä…7ÞIç ç×@†ÿ`%ćm1‹Ô#F!:ãw¾§^&TÄ8Í€è6sã¨!ukuÛ—!¾¸Ø ÷Œï@ñ. oxÜ^Ç×À_Ü–šçü–×fqcÖ7Jãí× gï£oO¦Å#ß7£P|„Sœñ}º¼ÍÞh¦¶šõ;ãrn|A-oêÙÙv‰ÐõpE!që ¸n1ãÓášáâ÷½ ¿Ï$ÓÓÚ-×ÅpîŒÃø­®xšâ×ù/EŠoƒpJL}AWÈSÜ^Éö‹‹þOÿ“rÅGRü¾áæÎqyTÞ ìdTQ‘N‡ÎÁm¿î×±În7¿Óï¨ã¹æfÆ»>âµ_Pw¾6¾ãa«IÃ,…Ô‡ÎɄĬ©eêœØ×ÅÎ}QÿEqýY3q¤ú°ºÖÇ¿Bܨ]½Úx¢Cë õ_'.ãW4ýÞ€:q2¹CˆMc¼Áwüp93>ÈÿÔb|Áâ6V×YšâÜÜ­íWaEq7œn‡Ö¯yñÞSXŹîì„'.º ªrM>Ÿç× ¦½p¯9Ø%ñ/ãž~óõ—6k’õ_½PÞÆqq¶ªíƒg½ñÏé‹´îÇ~¬ãC}ñÅÕ7â7P¡Æ„ !õ1ó~¿‰츰?õA³ ÄGQÜÌpÈ÷,á’×h7èÞ;òTt̪0X‘w$'@®(î{âÎF³Õbò[ñ­í®ù-¾IÊ/ãÔõmòˆ—8Åéñ â æ Ž[u{ŇB¼P¿‚ê6Æ7gxÉÿÚ˜NOÅ¢8Å×—Þw4¬n"ê¾8‹¢K~ËÙpU¿¡Þ‘çàj>  ƒyMròl1v¿Ó(^IqÛNLýÏ’×·¥_àæPœs\_&¾Î}ïàªÁøjŠKoü¢øö /…ÔÇtÄÄŠ_ü'õzt'–®Ð.¿†Òý]3w·¸ˆ­©ñkÆpUQ¨ö¶wëƒ86š­·‰'¿d!œà#´D6§9#y”áâ¯ä©ñ¡/Ô…7.\;yÎêDȆÔnjΊ›õm£Ê×yã—/ÞíŒÛAt‘ÿú®÷€¡Ú±½ ¡Žiñv5ÛŸ·ã×Î 7ZH½@qn¿ü숛mýŠÝš¸áóûw¦¸ðÆ•Ží­±ôÉƇŒÎY2 ½Ô*uÉð)Áø0Šë}⪞X¢ÞhyCì¤1o2Îè-)®½ñky[¸oÜDÔ;}q¾¤M¼G¨mâ20¨ÚÍ-rÞƒPì¼6ZâÈ´ø€ˆúÕU'Åa¹Vãr}>†á¿éó·ÿöß¶=sãŒg6ž%×µE7ŽwQüoü‚xçŸÿ¡ûa|ÐàœMFÔÚ¢¸Še0ü‚·ñQ«Ûx^œâz…›üF©^ó6t˜{vbƒ åÙ"=»vÑÕm=vÁ†…Ÿþi$Úéwí¢=Ùßù›á¿IP\]b”×XÆ×Ù‹Ó_Ë4ؤwÁãÎüùSSu«A7+½³IÜÝ1þùØUkCw;ig¼¶& WpŒÿU…Ô™îäÆ]óø±/Ü€F¬n³ù3Ç·øÏM[Îvòed(ç €’·XÞi áìr(NÅxgÎ'·¥å‰;ç0—ìÕXPœÈp~ë?úG"±vŠ×íR·(ž8gx5Äï7šÆGõ†|x‚GÄĸ›7’ØòtkN¼ozX*ž¥¤ù=Çï·„ÖŒ²”ÖüñÜ p‚[‘õ>›PW¯×8LÌ:Ÿ©/§ ”Xåj‹°ºAöå‘[Îy€qš.7œý#v±è xÍÌø _Üò¿s®8gx…IÕÜ;°¡ƒ¤&S<£ˆ˜Èõ€âb†Úøí…wï4³ŠuEC Æ+šqfÓ’6Ô:¤¡¦“aœõ¤!w ]«“KÆ6e\Ýr¼¯Èºco§øG@œ»ã«(>ã$Šóp:Ù¶¸Æÿø“oØû"³K Œ*]>NPAqÿ6xŸâת¶nˆÛŠÊÔõ%cTù 7,©ñS8k˜ê/HH³4Ç›m‚§"¢éWŸü|þðx£}`ƒpùÕ·+xc8°û§ùâ,]Éð>Š3Wœ¾Jý;‡Pœ¶>Q\Çd ³ˆ‚àüj¶ô^ ô¢×_‹^CJ''Å3«ˆºâÅÝ`zÿ¡/·ÅL¸.'/У)Þk<áóC,e|±âjäÂᎷل"¸€¸y­þüaqÕÅ.ëî^-Ô¤üÄ:]æŠÁôåm70Å…7ž3_?–¿‘âÛ;‘âjWÚj…+}Óö}qŸâýÔ{‹á×Þ·t(žä‹gÇSçm#o±‰' YHv?Ä'ºUŽH¬iž¸ž g~¸¹RiFF‚úì«Ë»ãb ýØËÓ®xÄ.O— z]ÚïrÆÙ u~Uì5ë_ßFvÅżø'åa»¿â‘ˆzâËf«:BÔ]Ä ©{ ÛzŠ¡¸šWáôWðzt†°a í80¢Lt>÷犯M‘Ó“­H7çè~½Åpù÷R¹¼¢»Òõ$¸âÅý€ºjÇß./ù¯/¶+ÞR— 'S\dÝ}ð ‘â²¢1ûúËå†ßGñHïŠOŒ×vCº•]wЉ´ð÷™]±4Íq&!û4ŠuÚKWá‚ÒY4Ÿâr:GÑ/ŠÑY7)dgslR £[EqÅòšä.€Ëxºœ¿‚éê';¸kY;sþùü[¯·È2ÆÍ n\Ó?ŰàFÔ?.Åû'Bñ¶5êuç ï§x Ä ÆET=BßÀ¾¨Fñ1=¡”ŠÔ¤).»­í„_磻S£ˆ?ëÍÑÍ>KÊ(~á¼fzý½­ ñzáž&€CñgÜ…¸¦ø—ã6×m_IP_Êùù·ñ/eгc`äInßýÝß-GY÷€¶âÁ ¨ÿ£¶f⤺„x/Æë ®q¶üÜ^ÅuÄï\£î1Š/š%@Õê‘1MûfÖ6 Xѵk’âbxÒÒ¶*N´jÛú\UápsI âÈ<.=qY/•Xÿ=ñÅŪuŽŸËQŤ©Hº},«8ûñ¿.Æ#¾8óÆíÅm+(®!Î0Þ33^Iñ ã)r[¿'9µ3îÓo¬ÎÍŒ/*pÅ“¾¸ŒqšWïêQJ‹ÉqYgé‘“ÄÄMB0Èd×á“âõo¤¸t—ýW¸•hÏgšøXø¶/ãeŠw¸â¢¾øñ.ŒçŽMžÅjí#+qüSÓîæP|YGÏSÜÂøÍ¢UÓuàg'` +­ÈR=ýÆsÀ/ŒS #:+.Þ ‚™ñü/d÷Å%ëc(ù/—)Îëü|U]÷)Î'Æ]g¼‡âßÉ.ž ÿoòëÚÌÕáŒWS¼ÂßÊÚ<Œ+§t~wà®¶þ(i:7í`k< 劫/¢|¾OÈa+K~‚ ×AF¹+cêÃ(ÎgÇ+‡9XëBÑ·?Ÿ¿Ì/‚3®&ÈåD¹7/®(~ÅÔ; N[î0œO7ÇÔkê×:õ’'~ßÁmѶQ|MdJM‹gß¡%ÅëBe ´$!ÎêÖÊ¿w‚©±Ö=wü|}Í4ÆÃ^Tb‹Õj]qí¨xÛ@Ê/Œ †sŒCêVx=Añkf¼ â?F?ïŇ8(N°H㼉)&“=·HWœÔ³y)_|@iR5ò]Ró!‰ôÈ[ýl›ÂmOUœ£€Äøç×zÝúóùµ¿Öÿub›<¶Í¬Vk¦xä|˜s¤XÒñãÁÄø|ŠÓ| ÞNñú€:wÆIsã»|ÅåB‘_õ«3—„¦xá}AP|“iÁBõm+Gœa ÀÔ½ Œ3f[4ö#c¸¸ìþî-mãŸAÑ‹Î+gÅ‹GµÞ+É ¹_žxÄÏQœÅÔã!uý)”¹{ÅÝ)ñνfMç/ƒ|»‘ï¸êb,ö«`¼PQPçW–õ£>}’y¸âé|ŒÜ>þÔktÍF§÷TÝßT/MqÉlþª'nPn–Ùš³Ó­CÔ[ñ­ñÿ&¥su5áôXL}=ÅI{Åù{Ÿ½¬MïoŸo˜W§¸8¾ßÀg(nŠÆ!>ã¥5’â9Œ3W|„#ž÷­áŸ&Ýäë¤ëí¤!džG0Ì>]q«å{+†sž+\ÆqBˆë³ÛšQ>d°xDûœGñ(ÁûÎ}iôÅåi¬Y‡|ÃOaü*Ù>¿ºenÔgÄìŒ[#U”ìÿ#F„âŒãßño·LŸâëoý-ë0˜ Ä¿;XÜÆ¾NzûÒDqÇ~™4ÏðŒ@x2²~·q%ò÷ÂPŠâýÏíçý¼<3Þ0‚T=¢p±ªÍ\w·RU î¼BÝ©þÆysLó¥¢n@¿+ë•nqˆw†Ôe(žA÷"êŒâËøâ9ˆ¯ ¸çǵyëÜ*?Q: âjŠÜ ®1ìiˆ÷Sâ¾+ΦÆÅ ¬üëÒ#KÕë>5>’âÖ§ÇÅ‘ngŒz†âýÏ­5qµÒ*õŠ2.n^rP¼BàðÖ3칫Šx¸]ÞÁ¯õl2¾“<á‡Ë£_Z—¶]{Æ%Å¿ãåëܬ³Û$Ä¥3Î΃©tÅ»#êqŠË©ú®“¿«™1+~Í—;ÏÎõ.Š÷c¼0(Šß¥ ›—[Ëìxz­/~WáÛGWýd÷"ºs«Þ/R(* (.€¹n姺å(ÞqåŠÃgÒ«XÄ9Å997 8·‹*€«×,rÈñ!.Î|Q×ìaZMÏÎ&ð“w"(à„ÔkÊSso´ÅÕw}àÎAu×½Üp°r9Û¯u­¤qP|Xƒ³Î-¿†¢)Îbê<®¾˜â¡+Î"ê- ¯^ª>*¬~"ÄŬ£(^ kMǸ³øÞï ×ø²–â…0¿]Ì’€}}¾3uP¼OþW<íIÞ³¯Bê¯_¨ÎC!6ÄÕìxÝ õßÞQÔüð–gc0îžãvÿ˜G,Á@Š—¾×­V¸ Ö2êe’v"}f³¸ÜxöÖ«ªîU7¿UQÔÛU Dq~žº¼Z¦È/†c›X‡pyâzv¼âòÜ—u«k>yâzâ­ ¯Þq6$¨¾Äùªpʘ2”âÅ ÅÜ8©\Ť*cÏv¦f²Ó3ª¹—žjí®M:{ÿ]ù­[¬@ãê g-·fÅ_¿¾M6k?ÅåÆë(ÎÙ-0‹§wP¼òü—÷NTßaÈ#Bgä^³Ò¡cêÄ¢•’óÞûÿ¨œöŽ_QŠ[߯ˋxwÙ Êwx•¬}€XÒòm·e\.îØVÅo•R½râßñyû:u‰q—㕟Bá8»(n<ì—ÍÔ×Ä?Ã!^Iñoqš+nMŒÏ¦ùº2¾Àlà†3{ðúüQ~%1‹¨‹9Û€› BmÖ g‡ŽñÚµn.űß,âŽg©³ÁØÿ.©À8ãøçÃÂébÓA9ªnðˆ'þûÛ¶ÿ½f»[ÒÞ‹ñý(Në#X§øÇþHca|4$Åÿh*Ù„/~ÆP¸C)G·×uB¦+PAñk’œ_!Ž}ã;žÃx‚â ã; $±[¢Þ q¶P½Šã1õý .¢+´.úùU¹H4- â]Ü>¸¿<ÁWORÜ)¡>‹•Xl܆ l Mг5ëôÅnQŠó¥êzZ-»c¥­2g<å„Õ3›Í>_üóÛcÔH»äYˆ÷S¼rÃY—3îfœˆÏ¹6A.•öƒŠ«1þ¡—˜«†8Ÿ÷‰ Á9NVˆX†Ón««ÝݧiòNR Žâ挚õ¸3þåóWÿê_ïú¿“*¶s²öìxãQЧh­O‡ø:Œo q>á{×À›}/gW&ú]ßA Äc©Æ‹óÚWõzuÅwScqñØ Ì£¸üŠ zÛq¯Îj*…³È-¹Æ-ÀxöíÈ"·<ÄG¸â•oŸ÷!¾É ê÷Q<ïÜgÛjÅN¢ÔàÂi\ê)oϳ²QúShm\eÕcÆù#ÒZÂüE(ýºF”ÐKR­U)P`D 뛡¡à Ô”ëjJˆ{7T`&Å9Æ]ЇñtñbÜœsQÜ‘Åðl N;BŠÚ)^Ø‚¦ß5Ôk>ŒÒTÿì ñ;C Ÿ?¢®É'`Üy1¸¶SlsÃoÏ"â{¶Ëæ¥j¢8) ÎN‡ù|Õ;úÅŸÿ«â¯Ä¸˜×ËÛ"N•"9qœô1^„8;Ò-qtÛçë‰o¤(l]^æ5¯sÆEâSâεËhwß¼8÷5ÆÙƒ5ã.s»õ ]q¢Un>þmV¼îvª¨°B¬½oIñÏW¿êb<€¸Mñ÷ÕåYn’â™ã°¨=Û¡8'(¹âIŠ$¢]Ä ž*|{ÿ©Ú6Nß5._B„ÿãmâéwºâyŒ“Ø©aˆd]¼|W\>Hz|ï!p§ÒAÎZ㘲L¤øÇ§xOç›Íä´ø;çÆÅœ"£ø ¹U‰ñk®´Lñ„3®`ÍRº@ž¸ñÊ¥;ÎÉùå¢l_HÞx’àŒê[u7&㌤¸Š¸—sâÇŒtGrÑL»²âÅ:ïùÌwñÐw)Ϋï&Ï‚ò B¸R/‚ËšSÚR?DCê° Èó7ÑuþCã&ú.øyù+áƒK¿|/+¹ÓhÓ'S¼háìà˜yâbë¹å‘‹÷±Š«êæŠtŸu+TzV{.ªÍ Š;g²^¯¤8 ªÃŒG6|Æ=`óÖdÛÂã±ôØo£ÿüI÷ŠqÜÀ=Ëð­ ÎçÅï4Y2ÆÛ )Qÿ§WÅW>;µS·75Ü÷DÆ`\øWòkgÆ —¾¸53^öÅïؼ¬1òþxÄ;5!ž˜&¼qV âòOg·h‡=6®·Ó@ÇËroy’÷œñt) åé¨O™eÖÄ—úν*•J·Íß×Ë´>ÇmÄ~RAZ0~E¿âŠÞú?×2õÅ݉qö,¬j¬q•ÜñãuÄŽrÜõƹiüîÆ]Ž›X<æˆËi‹±íU›šƒq»,ĽfŸ`y»Sç¼6³µ­¶¸Ÿ¨À ÆtC–D1pYˆÿ4i½ÏŒ v ”{/øâî^3PœÜn„`j)ÎZ¼M&A´w4_I%$É qvbL+Ń8_£^j‡ùw½qS Ì‡Í…¶·•‰]f×Iq xu›‘³ê„ñÀëh„xÄg§­Æ¯Â¬6ÅÕšö×·ÊXŠç1õÿÝá2õÐÿ“çyâ7"íâµu«u«·Êb…œu áœÕ–ŠÛ5Ö§¦F¥3õ¾§ê„z5(ÐHñp‰º84=z¾‡rQÜ<KnhÉÌ#EŒlˆÿ’õ¨/_ßæo#?,œÎxŸ½^ôukÖ¸y×-"0k¥ø}êŒíEkRƒZkt~P.ŸFˆ³à;=¤î›ÔÝnfAŸdZEŠÿþ务ø×#õnŠï8ÂÝ\¦ëô•Æóuÿû©›~~wšcÇAÆ7Æ.&u°ÉÞlOk‚¤–(ÐÁð(Ńã^T€<Šq³"Z¡níPƒ%mÿ:ŠØhÆŽaeÌ¦Æ !õL@}S³¸J&ûÆ;NÇ8â øØ.jRÛÔÈ'ÕÉö*ÐupÑ“ÔÃÍâ|¹û‰q¹Àír¼%Ï`|ýù޽b<ùùÒémìl7ÛP—ß,Kñ=Ç·=LUNnççÆéú_/ãkÛœÄå—Piï/~¾´§žÜ!su£·Ò[B½mº(ÎüøXL=:5£x ÷ÈÑÑGšªs‹ó}6ëø€:Ãø—Ø2õÈr6ïxõÔ¼ø¶ÃÛW{ ]Œë‚iך¬`„â1ˆ7Ù諚 ¼ø!r#Í(×­™Ï¨ÐóÓl£¸EïØ—ÈÙ«±zÄõÅÁœÚßç¿W×ç÷˜K΃˶p]ñ1ÓâqˆV©§"êûZÄWÖâ³V²¦NA/Ø”~w¦ºâ &º‘V ¥ïy„ê˜Ükç÷æÞ£ï[Ÿ­§¸ùfÿ ŸÞf¼q?tžØœ†=ãFi÷Fñÿ> ¸<ç…7«uäˈzÔ'@<±ÑŒ:vÊÖöø>CŸ½¥[úåªlŒ³óÔ%õ)®¸µ›­ônàÄÿ*æÓÛcÛ§ˆVB¼mÛj¢`Kh¸?ymc<#WSãù0ºKtXs5D)nAü÷ØkÒ/‚ ¦÷¿Ê¿1‹§7SÆ@4†ÆU°]|<;!Ë™oB\ú"ØîÏŠ_/Eˆ;¶(¦Ó‰•yÖmÄZo{–6¨M«õ+Ô½IoÇ/9Ùb(HzÞ±?Àœ[[Ö{.Pçw<ð¡Ç¯v@<ê‹ÃJ¦X¨.¼qÅVŽv*%ÁiÿÐôÀ?_§‹–ëÌÍ=ŒâÜç/Õ牧Ušv×õAªø|~ ëaU‡®þtðÅÑ+¦^‹è2ÏaÍÕm Pÿ=¬Á~OÜ!ዳÔÃXÙAêŵmìÓ(áê6˜BÙ BC¯ù"|nVZ>wmK‹8ßÁ¯œ†á ê[¿ >zÊÈ¡ãËÕ~Þ0öçµé¬}~ »ê1p\†ÔÇ3ü–³ÔÚäÐʯkq›ü)V±[<ŠpÄCŠ¿Óq«íø†Š ß—ó“ÿON³¢M!Z›Jâ‚Ú–n²nRñ»ûÃ[!N]"·Ÿ¬5̗ܶW­7sÇy-»Ö•w£ÍÙ‚ßYú€ÝþBõñÓâqŠ'¿Lêxè¾/¾ý¶É[F&¦®\äìQ±±‰ï<Ém¿;õ4 ~õ|¢!o»sDAÞ£è;4Ãk9.úm%ŽÛn~®! ¬§x+î—f@5­T|!šZã–L¬šâA4=Æü€ââd´i¦M!Õàq_{sÛqu~•§È×\}›´½vhÜžJxÒ¥)]§>`Z< ¸˜%§¹âÅ÷7¬îi­ñÏF1®"éÉ¢vQ\íQ»¦nôO~åĬø›1^6•Øå§Æ[R\¢@sÓºW±uBp}ÅùùNpÆ­(ŒbúÓáúßÑiñþ}fÄÅäÿÂÒ6v‹ýyñl`¿¹ŸÍltZÑJŒ»®8u,’†àÏÍ7út"Ür`ÅQä@ΆŽS¼¼ÖmŹ{óêÎÞeó‘¹È8Æ×¸âzÈn x§w©xòà s9§PÊ Íà…U¦ËïlioÄ“_Bq†p‹âÄ9ËòZC®™qNqŽðßù;gà‹³a™‚q@¼¶¯û­)êèYj¹1#úùÑòI•ó}Á8;ùnWM“Ú ØAÆš1®y¥P»ÜmOf+USã¶ìñÔF ÈPTeÊñtéŒ'¼ñÉ5kã‹{ ¯¬ó{n‡1ɋԇ@œÙäïû}¿SœƒÜâ Ç:ÅgÎ8Z¸Ùf­0åHT7RLÝoõÐ别ÓbUˆ4lhoýì;J³¤T/*±ò¶×~B9‘ä– ä(®Âé9ŒÏ¥8G¸šW~·÷ƒLá'l+:*·š€8sÅà ƯI¬óö,ºãxMë:Œzq$« ,Er¥LOõié\$XýCP>ºÈ›ØǼmô"ž¦@iºœONÏ¥¸½0]÷÷DŽuÉim5&áÜú6gqÛˆ]A\9㦙”o.ÃìyŽ£iûþÒ<匧W‘0žpÅÕš6ý’ 7®‹ÕlvDÆá¸™ÄwA~ÕÀ$®`·¢<}zmö4ٰ̳8dŠGW¸-ú¢™›‹! þQ4Ø:ٸ¯ŠGÏQñ8ÅÅ<¹º î8Z–ܲ¥ㇿ(—;ªs=Åc+Ó$¸ÅÿIú&|sûäV;»h*÷%¡TqñwoYé™u7%Íö¿®NÍ)sp›qÕ3™_æŠËul_u¶œ¹8‡±“MÐÇ8SVr|¢+®fÆu+Éånã9w³%ävMÞhTO8ãÂów jŒÇ)nЦéxY/ý*¬·Í<¹ßˆÁ÷·DC ä 6¤Gž¡€¤x„åö¤¸Æ¸ˆ¼ÉKn=[Iq93žú<9{º=ºgÊý’_"ÚÔ¡øW\Ô¥É8«Û,ˆËÕ뉨ú1ëŒéòßpgãjÒ9ñNŠ'?N`“jÜÝæá¤9 Ï:´ƒú}Y”êËOŸ¯À‡œÿŸw…w]sÉñ(n¶”ÂìKVya\ \_³\ñ âb\W]ŠsŽÇ1ŽÆ,5&éIxãeŠ»-ÜŸh@z»ÊSÜt-'ÂÓ“³ä¢áŸ¤ï›Ñ!i#‘‡+Àç©|†— ®6Ÿ-§xÊgnº8¨U8ë»õÎýìǬp‹~ŒTP}Œ/.þëý¯×;ÍäÂô+šn…Õco÷ÓûþiW4Œ©‹h:ë;ã*û x-dQVŸÚÖPyk•›íO¾TÈw‘Ú‹×[<Óðlm^´ûÂÔ­înZ™p× ø®ø‡Àp‰ñÕÏBÜ>FGã`Ô Ôîxãã(ή!®'Â#ºãh¾Qã‡ábbCÁMöËÔž³ÅÕ‹Aj¾Ýq‰c=Xgj-MO–ãó?·‚|'Їí>0ª<:Ï'2|/ˆ'gÌU÷Ñ ØR¹ÅÇ@œíç çùß>̃¨:F°–¶>SÀ¸ dqž]‡ K/õЏGš ¸HJ>PjDýžàBø"¸I$Ýÿ|þgvÕ;ä×[K©œÃš¢.¡úbÕ?QW"ܽ¥V@ÊðÍ\qëp·ˆ¿³Ž¼âG–¥_Säƒê_ÿº¡ø—Œ£ÝÆ Eg\‡•­a­Ër¿‰4iK¿r±ý|w'¹ÚM¦ßòSô’âœãÕV#Ÿ¨~l\ÛdSÚµ\‹ªlˆ Ø÷¶—eþÉ–·íPO‡Úå×ÏÐ[Þx*¢>È·œñh=ï£Õˆ=¸æ¶ KZ›5fr²Êĺ½CŸÉ7Ƕ°Œõü—»]~Ùì:È5Žœ¦x ÈÃᡤFà÷nT”Κàñ‰ XÓâ´ qs˜Û1ç‹ßpy ŒÛkÔ-W|œ/®œqŠ'ξÙKÜÐfSl6Žñ¢ØÞ¦må!û;5à-_\„Ôƒä¯-êׯýh>‹ÉsÆçñ­þjQ¼äÚ7¥,ª1¥e¢‰nT”u•FN• 0 6+Ô+(ÎwšDq`<âŒsÈF·µéìëƒ.¹B6-.Ö¯[ÇøUÙ•‰·ÇwkV·©{,-ÿÄÉ­¥¸Y±Âª›šqÜnuù/Æ]ŠWO‘ï­C/¨³ÌWÞýùþ&ˆo¶¸­QQõbó–ï(&qÔ lðŒ3|Ô>3ö& )NZÛ¦¾zf8þ¶æXg;1,֪͛˜N6·0NO]' ¥0kÓËI (^9E¾-ÆéÒÍ6 m%š]ñíÓgÞwÅÆOrÅ193Å”'>jV\PœaœOWŸ9“ǘ1oðˆ@±fµ\㹦›Uêu©[W?6Q¼"²."ŠÅ æ51å:鈉â¶G)À)®1N§«å(x«[Ð!|Ûõ0.þùÇpEñˆóo‹ƒÜ¦5Ö´„Ow|œ*—/®ƒáVȼZ#+ÖžøârÍ:!Gö,§8é^Brco¡T@OsˆÿV<0¶¤Hí&$¸Ç©?Í ¿Þ$`à1ŒëÉq9K>’á‚â ʤõéÖ1nœãÓÚjZÂ7õá¶l}ŒSE¦,Ó“«Ì©d¹Ê+MÞOQœ‚f¶IÍ¢ø8%ÚZÆ{ª¢8·)ÙBÃmîŽ!~.ÃUîÃ\o¾ÓG¹àì§AËÚT2 çkܨã~C/ÂP'Es1>P›âò¤ÔOÚä).v¤¥ýqµ_\î·®DœÜª°Ü*—š7縉9úëÔvq,Œú€ •ârµÞÒku~ÑÊ-¯õR‰OϬ†âOƒ8á4·Ó›—TþÙoYÞ¶ÅÐERïô›$p‰£tE³8oÉ”*–¯VÏøâÖy¬—ûm Iœ(Gcµ’Ž~ ƒsArS\“ÖWH`\äsýgP˜›uÛÅ…/~Ï8Z¯ÝùOT¹fÅaM² /ˆZƒçç)n>=.rûÞhA72¿Bžo¤¨AN Š?Χ­þëáèþþ5jÍ[ËÄø‰õÓG[ýþ6ÈäGÈaÒˆCÕÛñž‰¨Ë?Y©èéðÔÛ";ÇmDš´$G÷›RÇCT€ŽqPüÍÏ«!¸ ú H{+ÅoEÛšù”¥mÉp®ùbøáǤ"J›\ç`¼ä‹ÏÆ{äqn‹¯xX`q!Ý |ˆ Ä11.ÉÀ —¿䌷„ÔÕ:¤“ºÓú1¨:ÎÞq·.m»9ê‘<†½šâd¾ã±&(äP‹Ab[)@Ã8(¾U£,Lãc¦Æ[1>²ŠóÓ:x°å˜vO6uW˜«³Ðçk˜È!ÜvÞ=Šuâ·QT)Ô'Rn«µÎø`ú]»7€„qPü±&±©3þX½7¬X„ãÚ×_ ÐËøBÂx9¢^TÙ.«dÊ*n/À†æŠ"E DÕŸqDÔµÛ‘Š©»Î¸XÿÔàŸ¿Ã?}d‰P.ZürÓ} ¬L2Ÿ:_¼¶¸òþÚ§FÛÁÝù®Ò›¦@Ñ$ÅqiP´ºXÈÞ‚qáÒÔî6›:xMM|Z'œpþËŸö'N†$hb9¯åˆ:1U/–]ùT¯8w½*õ–Ïß®(~{ÜYÆåMjCR•Kþ"g|ñ?Öh‚¸zðÐEÕ#à¼w”#ê•ËÎM]¹ùŽº&µ³®)&îÝ@ÆŸéŠÃ¯©;¤¯sÉ[œñ3¯3Km?áJ7‡ä£ë—H– ;7Ö÷—}ñŠ%êŽ?.v.ß@®D i±BP„ÛÅoo‚; @pÆ;(ÎS¯©Ÿ¾ÿúÎÖìÌ[…[GœÿbÐÙ02™”K&'øEqç<6}::ÏÄ{5­ˆ‚NñƒÇ«‹<ºHïò‡/>¨%7í“¥eêþánu¾¸ xåÌ8(>Èâš“‘¤²¼ûã)±åâW× uâìõÂõů3Ø?’vbv4½öéfííŒHdÇ4hïj;–|ß2½Ñ¿¡SÞ%ÉæÒ×Þ—³Ž½žâµÎ8(Nj·é7ÅYñKõ纳% Íßvvå£4ŸW@œÇÔÕ«†{6º÷I5 ð•PÆ ®)òÊÇÛ›çʲ= <ù:^èŒ/ë’ûSŠâ‰=hudzÊài3޶ÙÉhô«œvÎù¡¨>¶å/ôl®ímó¿Èß;÷hh»%6¼¤¸Îÿ¬Q}ÃÈ}Á,'´0\û@þL,äˆ&\˜Õˆâ"[x¡3ŽrY\%ƉûÆÍèŠßÚ¹f.|_7NNþÁnÎi9k.'ñû õe\ªLL׋;å6¨’;uÔ(âÅ<¢êguœb}âÓ“§ßÙW"<½±ïsÆaöÓ)þ[ÕÅG÷*om³óP!I-)Î0®c㻜ޫ°xzÔåPœ,H;‰qB)ìϱhïTÉ‹éÊWLc×FšÀ®u\\®÷9ãOî •ÆSéŠ#ê qö_é<‘AÛT¶àúÛ9+ Ä%ÒåºsÛñjðñ'³³TíÕm!Æ­?»¦E0´ÈjzÂSƒd]N~çç,LfNHFŸ¾?w=o™:ì§Ùo 8zÇÑ8g KÚ'¶—Zô>~ìvW·E´Kb\ÝK©À5)>¾©æ¦”ËŠ÷Ÿa5(å4ÞæŒWõiªo‘p­+N£¸íŠëÈ:y•Zg Ë ‚Ê´i çþ`æÝ+ºñØ5B%”S.æH ¸©:£ê²5‰“ÊÚZÇÕϽlf&t½Ã§Ö¢w­QPœ¹ãDŽ“Z‡0ò®îDÈ/©€^óv“DvÌ]ÍÕ“ŒÌ-®ž_ez E¼I߆l]¹=F¨Á×u¯.§HÞ2-~ɶƈön’Ѽ¢’“´‹%KƸçŒ[ ßžâ°™HËWRœ²H=µºMC xß »°Ó «dˆGõµ5Äãrr[èýåêúƒ&‡%öÙP.²¸ñ¡ ´QÜaøîãèÑ×·ñãŠK_<ïŒ>?„¦zÄ0³Œá=ÓÜ-…Œ=3˜íƒ»Ààäaž¬ãúUVþ—¯i³®—·ÁŽ£VÛâ‹+øzâê¡8Kú‡~àC®R¢£–Ö¯=¬?¬:äÖÇ] P1ÎV¸ôÖ ß—â-oÜ]róp%ÆÁ…ÿþIÍ‘§)þ‘«Û{ÆyÊ á ø1¶3¬ 6³âü*Aü[†½«³sÙ†™ä™ Ñ)Î9î9áêŸÛRv—4ÊJŠ_ø¤G^¦x$¤n¡8ZïÌ!¥¢ÔÒ˜ô©è±õùÄ>ßÚqn_¥€8Éú ¤ü*®X9PLuxÙŠ9âªUÅ©²î~_;Åå—NB—œBq±ÝÌž‘N¸º¼a£ÆîFÔ[¾Ïç[Ùÿã©°Ÿb@.ºâ='n±.ή·ñü& TQü,g]"mc½¿8®#ì%Š‹±ú‡ Â~Ç#êh¿MƈIÅà^¸ö¥%ÆÝ/ú¸ü™gœ†qŠKJU’5-Ü÷"ª0~’3Ž1âÿÀ‚5÷Ç?Ÿßª0^^ÝöEÍGG>z’N¸®¢ ²ÅqÕ#³EZi†+óš­Ò_¨ÀŠoy+:Dƈú]qWÑu¹j=q©S_ô*6*Å‹M\”è˜$’9ÇÅw½¹“^œ´VOSÇrAaÑepGL!ßo…:ÄdWüB¶ž$çŽyô3ãj¿x¥/εÌH^äßÒÛ ^ë¾R˜qEré–K¢'/þ'uô'Õe_£{bÉFPœà¶Ù·ÍÐf@ܨێ·™ÿúHŠg'.?âOü 4òá’öÀm†›Ÿã+Þ®?€â¾à7èûŠ?ãäû|£ÝaFÝRæfŠú‚âsMîÉ©¤øþ8:ÃØxzî{eëbn<¼Sœ¿Úç‹G+_üð!©q³™<^Qóüݽ} Ï­ÊÀô7?§ã%W\øä÷ûãw÷ë­­­ÞOÇÑÏœyì1ŠKˆ—'Ækϲs_!õ­M-[¸2Åóøºž¯±œ½õ"×dß»!ï(ÝXŠ‹ëw®t#÷…;´¾;ψ).fõ#îÚ/SœþM3±I@¿Ûœšó'¬lË÷ã}(ÎË9fÌ!§òù×È·6·I£xfjÜN€l9ó3èÔU¤îîyuGÊ[(0‰â·a| Q÷,DK@½ÇgAvkb<‹qò dQ!õ=ÍÌ.ÊùŸ:¡@œû·™í‡ÖVs²åì.–Ur„FðËwoÚå#b¼Î¿Ï_ Ø©Y¬¥¸Ü¢¦–·ñŸF8ãzNãgáuDz]@=Ï&ç= pVë ÈÔÍÊÌÉÉ‘o\!ò¸UÆAñ[i@æMoõÅÂY ]{㨀q 0„EIðÉmkÛ´0Ñϔҥxß'JˆA´ÝBNcRP$q¢ ø‰­V_æuW—ßµ]òôÔ8u CD½¾áïyB|A<6ƒ]¤xÑÂÆLMß#”ʵXë[K‡ÌwW€‚ñC\q¿š6¶5· n ­ëIЇ0k…:Ö·í>¬Xޏü\™.pi£YÑbïҦÈ50×IM©*Ý\ÆAñÍÛ°X¼6ˆ§?‚]—žXÂ6ˆâN<;Æ‹M~ç v4] \|>܇{ä£(% mDñqKËJ•¾³1‘÷ ”1ŠŸÐŽ¹2® xâ™õm¤!ÌŽ¦cyÛæö~´L®V/̬<ϽÅ¿|þiº$Î6Y ›[Š7[O–ã쯠øì&˜þñ÷=qœû2ÛdšÓN·ïd—éöýY¤Å'Öï¡ ¢ø€yùTùï©WsÓãÁ;Èqœ{i>]Füá®c_îÔpç¼[!^µH½Õ'ŒTÞ”8C8(¾¯½Ñ\îÌÆù“ªÞN—»µ ö[l«'P|„E¡pC6äšôÇyãÔbßËÚæS\o. —°™Ã_R«Ûʽ?ˆ¦ÿ‰ ö ïÕÂ;•¦¸=p5‹žžqÞâ#Bêå>°SÇß\N«Ã^Š*M ã-¿çð¶SÍh~¹gSüóù›óo6úâùÚ‹·ùûä ê:HÆQ &zžú!W‡Ìõwàþ`ƒP€+ «·`ügüÔ®0¿Ü“)Î.0yaz¦öQ€ciÛöÃU¿3ιŠ#‘öü>”P}LÆcR¹Ã0Î-ùj­È3ÁqágÄõmâ™ÅEA%'Éß?ñn$}EA\“Üœ Š'RO7ZÌ×þ8šzÅxPŸ‡h—!Oq|;Š‹ÏåÖ+å>ÑŸBo ðüsHs¼’âæ#¥ YÞÝ—žÓŽÞÑ qÒê6N·®Ø ãÉcÔ3ãè×oÐÔ{Úª<¬oÆ-\7x*éÛ ¢…†”lÏö/eCÖïí[¿'–,ÊñjWÜbþ:|ãžp¯¥4Ô)g#KqZ·ò4ÅsƒWd6ÜP-}¯AEsê‡ëùrÙÒå’/gšç÷ßù;[C\rüLy7ì%«Š.sëøÂ…n°´ÔÜ]³/^ĸð#|ŠûKÝâóåì˜õŒIç Î>Kж^5Pó‘Ÿæ†Œ³T-†ìIñkb}ÑoH€Ú.î»JšsM;~Å÷î kš.ž‹ðÅJ[`žg:ÊpŽqËOP<Û`yŠ£­ï´§¸+.ÏJŽqg™[&õM¼ (8X…íÌ2 ¸ï‚ø:_} eÁÂaþÞïýÞ&Žg0žðÃå27'¦Ù+­7óŸ¹Yq¶]u38_ù;]q/xà &ô’Ký(“ð X¾U…Íìʼn(`q¼â øöÅ.®Ž'1žƒ¸‡ñ`ÝziÄ*Ô7ÐE°|Ãpëhõì;ÂI ”Ô–šóßö¯ÀîORÀLwR|Æa_I_\C\p-Î ~†3ND±ÒO¼ìŒ{WηðÃÂÅ#ûÃÃ_E#êÔFÅϲBP¼¾½ôÔÒþsâõuÃ;) !~„3NÄNò.+K5ž%¹¿Ë0¼ã1Š“Û·-3mq¹_ý Ë>Ìæ b£¨§) (Þ;3¾`}Ûi]x±%Ôb\yÞŠâöb'µÅœóÅémŠ/¶®ìö€øa·;ƒáyòâz’®fÄÃU` Å@ü«tB<´©òÕGq13N¸@ñ·Ú&¿™â]ÚI—°˜®¤£iŽOñ-Æ~b=5ÅûœqPüþ¶¯ÄxÚo§xÍБqÆk’¹_÷ç—`ˆ'?I¾¦ h;(½²h[6ÿ­4n¸èk÷ì\@ñ³Ûï*ý8Š1øâUTšâUÉ<¥õv®Ç>¿™ãÕdLù£'U·Ø™Šw9ã |qXdÉÀê0žñÅån³âåQ¼r ÅKí¹Ëßw‚¸9å­[œ†ñ¤á]ÌÊÎÑ];$ð*Z)®Ï¸-€8¦Å‹f9â$Œ»¯â@ñbƒîqÃf·]_­OŠKÝ£ô÷ÕuE~')PMq…ï_ª.q^ÌŠÃÊËVU…ñ¬/Îvž]qïÓ¤åâù3†‰šoéñ)VWöÜöƒ8ÿ´Ú¤«pƯ”ƒ<ÌÉ03*År›¦ÖŒò"Íj)þÑø6ÿeÅ[¤þÌ@ŠS0~ùâM£[Ê>è OpxÃm›`ùhóúcTG<Ñdpe•'ZÊĤóõº-ã²Ü¸c”•ÿ„ÿ¥¿ÕéÔ`<ï‹ós`JÞ¸Eñ–r/£xKáðŒˆ¹ îœ4NƒÓ½å½7wt¦Ù T®QAŸÝHÔô+(^‚8ã}ñIŽUôÞ·7Àåkkõ _H³9KpôýdŸ*™c_(ß5‹ºâ (Ž>@3:ÆË/®pÛ„âÍ+MÒ×ݵµ n;öMû· Í9͘0‚½®#­¬pŃYqþ‹ùõÆ>Àß×Wjy^dŒ(^ªÛKÔëUN.QoHê~ÙS‚c.–ª×ÛJ±¡xâºi\*¥q k‚^¤@UH=PŸOqØ>Õ ‡R<ïoCqª6¸/®€î]'ÄÑIö)ÃÂçþÁëÐóq&3¥¬ãЇ”ÎVà¢x9¤¨OwÆÑè&FÅ8ÅÏžþâì¯o¡qÓâtmpgLí%n¼”-±@®Þê(À0þmw|L.™TÆd@©îyª5‹Ôã®8(¾‘mBñ΀º÷ÜHþS‹²órôô"÷9üûØîø¨¨}Žâ3ª1#ÍSûåÞŸâ0È3$bœæ‹§cêþñ«5Ed÷vRüËçç`•’çn?ÏW Õj`%å¹ã#2É™+Ly„¯Nã¢xñ$õ”+>ybF^e 4Œ)žZáæ ¥²z!Î^*s¬’ðe7Ÿéˆ‹íf“ZÊÅøˆ\F¤1©²É>·f¬||{ŠÃJêÌa4ÅcÇ¿D>gVÓL8C½®IgÞ}Òªô0¶^cu5*z§d“¿‡’BMq/°£Gß0—½¼Mœî]÷øâ°ÿJ{¥`üCõÅùé/Á)nĨj×>-^Ù¢o?5–®€>mp“ãu™V]±µªÓëÈ»-_Ü ©¾å[,޳œó$ºY\ürÞŽqØ`½U•0.×ü®ŠËãø'¤8Ã8ý‚+N×jâ¼kñI›Æ…èŒãŸšþ1±Í‘ô3ˆQüà Î.Íqþ/>ðg(®¾töÕÑŒ¿Áêʯ ¸¸U‡Vý÷‡Â«fÀÅuü#Ï 8!&œã£d–Ш9éì]º)U~V¢6Å•3® ®9.‘Îÿ•ƸùNéXŒÃºšŒ­€ñ*?<€ø—ˆ'þC?TCñîêM¢à!O;‹|ΧJV¦ÊSŸ6L¤“®Í²öþ5ÖjJµgñÖˆð€\ˆ Š3ËÕØ–¿þYÆø/ý ®Ã¸šLl0Å??j]lÔŒ¸â ã%í_¢^‘n+Àþˆ‹JÔØ^½9 I}H"õe/<±g©†Wóñ ºÿù´!Î9n3½è"‡‘µÙß'ñ:_üã@üG46+θ^ÓV8¸­­]‡>õ„Ï^䯝±ìd Idhû#±Ç(àAœQ܇¸ÅpRP}ƯYØÇè¼¶"#)î1œQ<R¯¨"(^!Ö¬[AñYÊÆÒ}-Å_[ñ…ÖåSüŒã.·½•ƒê}!uœ­9 õR<€xʯ魠ø€FîMïU°æùšîQ“.î…_BŠ#Oñò·ŠáƒLrXD=ñDH½j˜Šc¼*‰AJ½6™'A|öÌø#9ƶ)è€FyLÆ '¬ToÅø¼¥¦i-jEFQ<qæŒÇ–·Uõ~PœÚ’Óî{Å«Ìoš¨é„w/ß ’ Ëa ÔSœ-[ϯqk£8>¬MÙ‚œïÍ]Ô#_üumz¥zt}[Õ0Šl춤žEñÉËÔÛ$¶ŸªêýÙHáÀ"¨ö‰i4Pœo?Ër¼ãâŠõÛ³ÌC(wÄ9ÊcÎxUëE)^•žºŸSª‡AœÅÔ÷6Ÿ½KwŽÝ¢¤1‚fÙµmæYŽË5æç¿ÈCf¢#(ž†x?ţ羠ý‡µ9¡ÇQ|sŽÃ¸Ë6‰;ZðN}¡1\Ï:*®¾ù[t«²w>7€âˆƒâw¶í˜¼Hñ­×¸â9»…:}½Ú9F½¸²Íü˜°:Þ׀ѧ»)žš—S㱯¡ÔuÄXH½.… ª½*I`|isø—Êý®ÌˆÓqu®zŽãĈ:¬{†ÁõRœìbŸºêÿ~^¼¶#¯Mb†n/Jó‘ßw‘¬»²oA0º`]Ï…Õi‡#Noªš;;)^€¸ï‹·´bˆqtÛšî¾÷ÁßÑ’v,S· !=°(^8´-ᨧ¦Ç)oý÷m÷RôQœ-MÌyâ^D½­}Š·¥²{;ìZ>Δçb|GbîX¦»­š jnЧüqÅшƒ1’Lã¥ýâ†;o¦ïÇæxs*ó|tÊÏ¥8©ï8°ìX¦G›ø›*7€âqŽƒâ·šQžâ?šýªYâÆ»èk0Þ•Ê­2Ÿšùƒ)Î6ŽïHÌËtªõ¢ÜžC(ãx‘â{v¶§HÅùöþïÒW)œn-R;¾å û;ÈÕã™!õMéì*o°GÔ±UQöŽO}Y·¶é¹Æ™³m;ãÛâ ò✸µÕ¬¿ ñùRc޾I¸âßt×x_mHï1 Ì¢8[*—ç8¬z® Ñ)nèê³îù…m÷|«|è¹-81uP|¢¸ñ¤1Þ-—ü5vœùb¯Y÷óóc²AuXõ\#+PÜrÆ Óà6Ø?ÿßÿ'(Î|¹¹5@êó`o`¬¿õ¡×ކ¹c™æÙR^©€sþjÝÉm½‡YOmh2Å+!þ£ŒâŒãœâ¸ŽU@ÄSR_Ø~è. Å>8«–åbc(9­ì‹Ã¬çÚZã|^\OŒ7AœSŸÛ~“Sgžøcñ‡–Ë4ÙÄŽIþô¶™EqéÖçBê˜Ul䊛é…iðàðUîŠÃŸÜxó“p@}ËcXO'Å|‹D 4ЬðU›ÏR¼±ÈxŒ¨@™â"¬Z qP—ÇÀDlŠoc®øCgÅ÷\¤ŽÎ²c/xD™\W¼u^<¨ë„@ñ;­$qQo ¸Ø).1.'Vq«Às!_ü\«œ]ò'ŽYCêIˆç#ê³Ûëõég)^ë‚[÷sŽ þ‰=â=VódŠoh™é=¶njúÈV²ÑLn ÖǾ°U¸ûÅïí&³(Îýq@üÞ¶‘ûs1¾c”è‘üa†H£S!®¸a¶¤¹™1/ÁºcOë”s·Ç“¯ž zî—vkðºò€âuzõÝýˆÞ‚A»Ï¦<ÝùqñÄ·JåòôÒ9ê0ˆ)Mj':—â–¦·ÁÎ<ã;Ž-è.;w…“Ëf¿šCrõߊ ÿêWwìi'·e¬ì)ŒñÅ1,n. øÂ|NwyNM6ÿĬ.Š·.Oó½ä‡•A|bµ´V qP&Âx.Æ÷k_ xûµÉ#J4É'8â ø"úŽû0AqŒJ‹špb6 øDq½¤Ñ_Öiýªœæ¸âG¾ø:;û|/_sÈYn®Ç6³uM8/§§b|CdnX¤yv…”×)0…â4ˆ#¢¾¬™ù¶0›â§½xËÔ1(-kÀ‰âÅu“F‡Y&õ»228+ˆïfCro÷åˆW{âQìcPÚ­›ÊŒ7ÉÖð:Lƒhx¤¬ÀŠ!W¼Ü:£îÔ–›ù[üðÏßÿû? ?ƤQÍso: ø*ýÑcV)ý²|4ÅÇ¹â€ø†&Tí|ÛÁó‡x€q I¶sS‘ŠñÁ: 9;‰É556z Ã)ˆïh%=— ÷1ŽQhÇvn*Ó3)¾¡nX¤&ƒÁC›) (nšZ}¼‹û…RP|³–ÅiǸ¸ãc@Ú²™Û õHŒoh¡©Í`ðÔ^ §8ÛAF¹`Ðkí ™â€øÚ†º#7P|êôÖèü¶\FÔá‰ïjAÄwmÐåÅŠ™I _£óÛrLq@|[j¤øÆfÅ1mÛÌm{ Æw´Q]¦ËÖf8xjÆRœmb*DÓåßaÅ7´}'Æ­ÇÑ|74ßÔ,Añ©òêÄÑq–ÈüºL†Rüóù5¿¦Àq±]¿Ãκ(ÎÓÆ¢;šonžÏÃøŽV _|®¿5u½¸­oaºúšø¯áWãÌŽñ›Œ­ã6ÃqxúMÍ75ÛÇQ|GˆŧñkIqñÆ?€øm¶ÖJñuÜrx¼MÓ§d НhIô*¿.ÿN×OOŽ#œ~£5cÜ:È Ñ 81ë§a|K;ݲP I/Q` Å/ˆsw<W³âK*†L"  8Zï¡–õ0Šïi§{–ê¡ýžjM¢x‚ã,œ;¾Ñ¸ú)Žæ»±ùæfý,Œïi¨²T{–m®u!õ‰ HŠ9~ÕöÅåô¸¿ë ŸØ’¤¤»1Žˆ¤ó‰7âó[ Ýg¾Æ/Ìa"ÅÃenˆ¦ßma½Ç(tw ÎË(ÅÕp¿õ¶«l©å;Æk}Gžãk7S`*Å=Žâ÷7~Æ1Ýß‚ÓJ0ŠâöÚ—Û`¾©¥nZ¬i6…„—(0m^<²ë &¼¤I³™tQ xÎ+ÁЧ¯ò߯õÊ75ÕM‹5Ϩò”3>âгÑÌþᚇ/iÐB&GîЀÓÊÐÇÙâî“¥$ßÕTw-×4£BÂKR÷W·™Íãj‘,xIƒN£8Úo‡ö›W†vŠ“·.óÈwµÕ]Ë5Ϫò Æ…ÔS×G²Â‚W´ç,ˆc‹à­7µ­¯²ŒÖLêâñÛ5Ûlªe!ñÙ , 8[ä†Ï˜ÍnGZú­ñôª‘šVܵ™m€­µŒ¨;Þ–ušìÛÂrÛ‚mf‹(N+(.6ŽÃ€ëfÊÝGÛMi½mAi-ÃY#ÙŒ´ïk®û–l/[Diê÷eÒdD]ºâ0ຆ™sw ÆÑtsÚb³Të)Þda6ì0¨º€yáîGš‹¶™5¢8 hˆãÓ»J= qFñ¦þ^Q ÜJT âyˆÚ~[-Jûtàx3ûªÍ:‹ñíuç²n¾o.þŠÃx·±±ZŒ7ŽÕÛÔ¡)PÕnïÓ³S¼½\4¡ºîÚºp]5ÃÃ3 ÚË0Šg\ñ_C,Ë ¦§@ÅÁð—P­7Ücn^|p¨Í=ã‹ï=Öì]º—ØúîÕ¼Œ„j. øîm:¸|dŠñ\0$w§•¥/±*¹ç¸‰”*s?âøšÙ6þؼ Ä»?köÉ,n{¬|'VŒˆñžqúDYÞ]æ ÈÕnE¹uôùpŽÿÊBn-á>­’ S`Åña̓„ À+<µ¦ ãw#R¸ãù&»»ˆ¯0¨7UÒx÷Íô>5˜é›lu… ˆÅêz*®Ï¿{ì!8ãw±³±ðøn €â»µÊ^¦€äC(fyÌô&‚Z@{h£ø>ãŽ8û%uˆÛ>ż§q‘ë8@ñqZ"%(F*Ђñè¨(Îr)Šó‰¸Ê9²ÉÖ Ì£8¬ô†æD–PàI ˆóÜèí› ËÒçuÎpÇ1Çø¸¬žŸÑ,ŒÃHŸo;¨¡ô° Ã<è/ t^))_çänxV³¼9ž›á$ŠÃFŸk2¨X¨@„ãÜçv=ô Î_ð$¹­ë1B.´¡§g5‡â0Ñ§Û êV)à3ÛÿvéžAÜ:Î Cä*óyA>(¾k§zAk¢ŠPà‘ X —3×/öÑ]qPü‘Öy{¥ÆRÜY…y{ÝP(0_})2¿î+sð?]úEÕ7V?qP|¥Å¼'¯¾Ï’ j«â›-}O¢¦·*€Ðè2ù½(›ßâz9[bZ<ý±³ej"£ç(`aÜ™üa3ÜÁŸc¨ 8Em!e¸s ^þN1²ÊyQ\;Õd†³–mÛNe„Pà‰ Dƒéî` Š?±á望¡xÄ_{Tú]…|¡8@Ü3Y|Pü€f<¦ˆ ø1M…‚B(âoG !u¿;Æu¨]uøâ‡¶:Š NU Š¿ gö\w<(5(~ªîWn{m[Å|¸¾¦¸_“¢DPàÁ $†œ WèØ?#€ð`³ytÕú\qøâ6T l§@’âÛ•T}ÿ$ñuR8@û5Ø©%Åç¶úê\}‘: lÙÓÌ·IÃVÚ²¼0¦#Åç6úê\}‘ú+ˆLƒo23î¥y.®tç´8"ê‹Û ÙA( NQ÷eØã}ùc±z}%V¶=Ê cz€Õ¿\e Ü6yý}@;  P ÐðGž]Ö¶1ß[ÒYý¯:~§7-î¬V žââ=X²o“Õzã(úà¨+’‹Ñˆ¥?ÕþÅuád@=îìlQÞþ#…ûh¡¸,õ.o¿÷kˆ@(°Xõ=3ûƒ¥‹KËNP›•I‘[ý3^0P|ƒ{FÚ)þŒú£P ¨€ ¸{ÝEƒ¸¦yTßû‹{`³£Èq[’ñqFsÚ1ê°=€w+°#ÅÃÚÄ@™[8„‘ônzNþÒθKŠ?§UQ(ðpŒßNʼn«~{Ü^އȋª§Wˆ€â/jtT ¯ÀîwvœÅÔÅ·Á]*ðù7&1;NóÅåî2Xà. ˆr@W*°Žo‘‡Èâ ¯lVTº^ñŠyq±KûÄë¥ÆP TÀÇøÝT¬ ¨Ãh ïNJR¼bZ\}ËìîóîVCí¡øâbüö!)\Û–o£Û z†|eºŽ¨“êâȘà3,µ€Ç*à`üîø ³ËŒ2DLÿŠ?¤MQ (ð2nf¸»4½f‚>¤øÝ³û/³œÇTWZâx|LÓ£"P ô)àNˆó’òÑ”8HFn#>ÙWh<ý4,WœQ‡™=ÍP(š^5´QÞ›˜\£nfÅ3î8Þßk%¨9€– 8Ìa#ä™"žžßkˆoÔj( €·),No›ÇõÛZðQË/ÙOÍŒâjxT @Fâ¯_ÛŠ76³Ðát3/ž<¼ ‡å@(˜Ñp:;ó¥^œ†Gê3ÁV€ïgá×â¶ô ¬0·G[ÂA•ƒ%ÔXÏ,jÌoa8|ñgÚÇÚZ‰ùpwm[âÈ6 k[¹A(°­b-‘}øjÃAñm[øœ‚©5m”µm ø9Íú’’Â$_ÒлVóBy+ÃAñ]Ûöœr9KÓ‹+Ô1hžÓ²()€K¨ù˜x¤@U—´Òs3q·‰—(þ-ßÒþÂù\ Q³*0fUÉ…›·V@zÙWÄÎÇû2ÇÓOQÀ§³9òìÍÀñ§´ú=õÀuîÈuŠŸ–­e^IÐ%¦4Íë¥ù¢èŽ¿Î>Pa(bÁðê‰#¢Cš¤€ul[Á$Ç'µ’…Pàä÷'z¯iô–ÏŸ¯@-Åϯ1j ØAP|‡V8» b«¸R/|—”»âgW¥‡P ì €J1žîÐg—A}Z\Ÿ¿J€8êg·8J À> €âû´Å‘%‘g¨Ë¯‹Ë°:…âGV…†P ŒR`{Ç¥4ªnHç,ä7I­/“)›;«…QZ(vV#êέsBÙä±CÖ†ñÅar'4+Ê À! `H=¤¡v-¦™׫Ôñ]› å‚Pà‰ €âOlÕ…uò–¶•fű®maÛ +(^ (þ‚FžZEN_',mƒ¹Mm $¾›#NæÚ­N(Ïn `XÝ­EN+Ø)Îÿ? ~ZÓ¡¼³øü0>[c¤ýâ°NÄÊ6Eñœ8^;µÆã‡)ðù¹Ÿã @qAI À¸& ûždE0]ÝVø˜Ù{4AM¡W€S\pr@y À¼æiûŽ”•'.âêÙ/’âÜÕwjy) R€&P`† ß ø q_•¦YÞ–¡8ÍñWY*  À"@ñEB?7þ1þ9”LD]ž ó\ P3( À] `h½KùÇäËñ¬¾h–©ÃÎÓÞ¨€[)€Ñu«æ8°0òc(êä¶Æaf¶,Š  À `x=¡•¶.£ü­<ö%AqXÙÖ-ˆÂA(°V¡Œ_×6ÞscSÞ<¢.ÝqñC°TVöÀvG• hU`è84±Öá¹Ã0`Fvxû¢øP ì«Ø}Ûæ˜’ñèì$õÔWÍ`cÇ´$  Àq `„=®É¶+°ÚEf>1DÔ[ŒL~+m»º¢@P @½À8¹W{X}¾¤Zà.q«>€’èÿ<‡øŸÇ ÔŠ  ÀJ@ñ•j?2/Ng—ø:©ˆªËÛ*L0\lBÿóžsü‘ª¡RP @! `ˆ"ã«À•3ãf¥º»L½ÂÊ„.qþ üÕ–…ÊC(PV b|-'†;^©€ÜjfþG®SwwœU˜™ ¢#šþJ[B¥¡¨U bx­M÷¿EqJºÜ4®>Q*H.Q.÷×ÛYýo‘õ„P \ `¬„5ô+ –“«c_$À¯K£¼?¤ x¦=$îyö™j¢Vm \¾¸šwÜqØY›ªx @7(Ð3Bö<ûmQGŠjo· ¨«“XUH]ÇÖ)Éà( ¨T¯ ·ÇP‹Éõùm|’œO‹‹Íg ç @­6_ÀÆ)ŠÓòÕ)q'\®oãôfóäì¿æƒ¥ÜEµ:¨<ð@€IŒRƒë(%_žŽ<¦El×0(‡/þrÃ@õ¡˜«(>Wߥ.¼q¹X]NóˆKçßãE¶€ªB(°LP|™ÔÏÏHØÂá­ .@®eÇŸo¨!€«ÅW+þàü¬­áÂ/AvRçg²‚ãn}T @[Åo‘ý™™jŠëCT¯5êæ )ûÛ› (<³P+(¦Àþ£êÃxuÄÎÄju1EîùâG¸ã ãø ËÃÍÕƒRPcîQ¹F]­Y7³òÃÔåu@X]}Vm='”½~‚¨H ܤúóMÂ?9[¾,ý:ÄM/R¿>Vº=Çù»‡øÄ9.( @…wŒwäY! n=Q¹u\_êãfÎÇmg}ÓrŽoZ4 @=¸e̸%Ó=õG©* Žrspî,~†··õí]º…¤ 8XŒT7ÞæEWÇ®Z~·>fó‚£xP @cÅiª3 z9à¢üꀷ3ë‚RC(¶Sß®IY å—?²n¨€Pà>@ñû´WÎzù»jÚB(æ*ŠÏÕ©_ pö‹€P ŒT£êH5‘€P @• €â+ÕF^P @(F*ŠTi½Xt¥7>ªîSCÏ}Ú#g( €} €â}úái(`@g‚1@(°\ <Ë%G†P @()ŠÉ@ñeu\P @• `ÔY©6ò‚P @(0RP|¤šH @( ÀJ@ñ•j#/( €#ÅGª‰´^¯:ÔëM@µ `ÐY«7rƒP @(0NP|œ–H @( ÀZ@ñµz#·‡+€õðFõ Àn `ÐÙ­EPž³@:»ýPz(pšsNk1” @( €V‡-@( 8UPüÔ–C¹wTýiÇVA™ À“À¨óäÖEÝ €PàÙ €âÏn_ÔnèKë´FNP `^6 €Pàtà?œÞ‚(?€P ¼WPü½mšC( Àé €â§· Ê €ïUoÛ£æP @(pº øé-ˆòøÀÊ‹á(UãÛ¡ ‡b×(ðá Ìk$ýP œ¡(~F;¡”P @(B@qXÅQ 0¯ZØ, ÷¨fCa¡˜¥ÃYÊ"Ý) ¨°8ìvŠºH @ãÀhx\“¡ÀP @(” 8L @( À© €â§¶Ê  €P‡ l­_Í#ݺ‰P8(îTäê#flà`8¬ @(V‡ul©¾e³ PP ì¦(¾[‹ <8l @(@U§*…û–( ¢è°Ë%j#(ŽW£åñMø¼ À(Ÿ×¦¨€“À€9IX$Û¬@Â&ù:7,ukVB(ðL@ñg¶ë£j¥NÇ„ù£š•P`„ ø‘Æ48¹Ù/ûe‡'>Mf$  À© €â§¶Ü Ê- n퇵¾ ÕQE(ªÀ¸X%n^£€Œ3œAœ}…NøÙ‘ €ç)ŠŸ×f-±1EÍoÁpÌ…?´¹Q-(Æ(ŠÑ©ô*ðá^·ð»… ./6.YÞ›:ž‡P ÂÝeó-½¯Äxúa ¤î¾`žRíþyá²"1œgÞ„Ì' «5¼û)pÍEZQ1XÞ~ õ¸™0ìøxìµ·\3všz£Cɳ‘x^új­Ä´œœ0ÆÒÉ#ùK{«8 –1Wáó¨%8¹~ú˜X휷RMÞø÷“gÉ1˜ÎJº§€ªÃð`ÓØ‹}­¦¾ü5äðöw£1›4¡Ãiö9:áV ]¤÷ÌÌøÉ¯¾ïhªCk¹ûZÆØýjñÄ+Ý‹°·XØ¡ÝÅÞ@kŠïZæqX—Ù@E!ªÀ^.¸utIm{ ÞRõ®eÆ#ßšÛ¨ÖàqÿQ ؾ¸,8~TîZح׺Q  äöäâ(ßnȪ³¯]»0ÊuŠÁgPØa0® NÙŠqŠ<(§¥€YVRek‚×n†·CwΓ>´Å¾Ù’M.ýû^¥YZud6WÈÌw¸ef¿1W¤NVÀþâdú¡Í θR÷Z ˆÏAqWª’’ú­Rí1$òüAñù¿0=¶æÛúªn‚)¾ÐPrxvN¾Žßxó*ìû`;íaÉo/yã¥Ü¿¦½ÂÄ0Æ@’¶Á[ö•\{¤œ•:Ÿ…TÜt¦Ñ1SUÅ ñÔœ¢:mŒÏ'LžDÂoj¡Žl¯1-y\×÷@ñuZ¿&'gò[Ö:?D‰‘N|.×ëH™Š°þQûͰc^ò(õÕ_Òs3!¿°îã8G+úòôÄ;iˆñ¢ÓÄ¿ùréP}绵Áˆ+I§æ(ÝoÜÎ{R/µšlíÉÏî£À= /F(PRÀ±\ÁâÈ·Ëʇ)–„~ðß+`¦|ò¢Am1´ç_MáoÑHc qClC烇ÆUS7Â`vqìqE£ ÈcÀ’e:ÉõÉÁõ„5mbqzΜ#sÿci‚ÔîS`±KŽQsÀˆöæ$âöÚ‚q|;жhmÁÞG3¹ï‘ÛrÎãpÂÛT=詊NÑÝïAñn ‘@¨€ï-¼qXâCjÒÃŽX@–HÆa·3¤ºTwªòrÛ‚$¶OÊ §3fBæ¦E*‡ts/ö9!M$ùrÂQJŒi…±ë¢ÈË嫪¾ÿòSt¢7èð®æµ¼ï ÃÔÑ2M{j Çß§ˆxí#^ñã[·ªvo¨êÜÔ›áQ•Â}9¼1?\_\¦¸Z~ ‹¬³4W/9`dSpþª˜Ô $ÿ\5dáf­€Ü«4ô|³‰L!:ÆÌº1wû h³ ƒ¨A€±ìŒ —6I¶²Úr7VQBÝjoP§×Ÿ·ÆJ¦g‹ Q :t’û¾uc±»·$ŠgÞ¡@rÚ'âáfÆ~`’Që‰xÙÒ«‹ÄÔÓæz¯áÁð•j›W)zV¤ †Ì¢D¸!¡@Ìø’!XÊÌxŒI¯W_÷ÐÙ2´‘êÁndô^?ƇÌM¬o…3r,΃Ñ'É^?bB€>rS~$Œ—CÁ}<îi¾`Ü9¦Ì@[ií¬#³ÿ¡ ©í{Æñ˜)ƒâ÷´Å¹Ê•-CTÓC-á™ç*`à‘ë-ŠÃ=#‘!s÷(ÌJC73Ÿâ‡…å¹²òÞ!"Ǿ˜EZ™Î©S¹§·GÈ8r<×=ë,aå IDATŽl¾› Ý6~cÀ$Œ£ÛÝ’À¹ú­…õ ¦»‚Uªâ|.ÿ°é­uØ*sÄaoNd ~ñ]I4Ž|m5Ò¡0â»Ìó=qõŽ{U°Ç é–Ó^è•7¿…leJ‘y‰wi¨-x—Ã(¾ÕÀM,ŒåòŸœW77{ìÊ»ÈÚZŒÝ¦O)Ô‚þ®ñµ…„3ãÃ=ÆL*o½¯™»6?e[ó¤ÄW«*$O÷lyRîy.BÜLó7î) ‹ñ ¼PÆ•éOûžY³DF¯akðµ.v"ª/-¥üŠê¨Šƒ)–oþ^Õ-Û úv@|Û©7C(°µ(îxôã%µ ó§œK‘’ˆƒf½òÇka{6ü}ùñ ßæ–Ñ÷š9øzuÊU§ôJ@m¯sï£,ªdÅÍP l®@‰{ž=w¬¬*¹v6ð/è7Étí¬S]dDÞRϸŠ×wD„7¸Ê4ÆÞ ‚·j$NP@,Zj«DD6«ñõ^ÈDî‘j'o«bÏe«{œ?»Åê-ѽÓ¬aÆ] x¯åày(pœzð”+–š–ö'›³<ôÁ ø cO¬mmØCvª¦xÁ¼)nž/bûéDíg'MZö7¤i‘€;( üï1רtÆ”fûT„ˤåסöË$$Ô¬ùdëŸ-ÌðFkUÿ8ÃÞÞ”Üú_(-,ÒƒP`Æt xõpo5€ú³q]ý‘Ù^Æ-È…¼7ÇL*ÈxpîcÙB ’ 'ß­¡Y›ðr´U£0PàÍ \‘ÌaÃØóGM’Tœ±×£Â+“ç{Dz2„W†ë­ï®ÇÖ“9þxk,d€ð7ð¨ûó˜1ÆÍH“ÄÍÍn:ÄÆXß}¾ÊmøœýÁ3ËÀ‘op?g„²·è=O7Fñ–®äcÛu ãB! À Lå&$¹Ÿ£Å¡8W“I˜-×—KÝÔÏòÈõ¬ð ¦ÓUFîjÇÛNxSÂCPàìy³®aĸ !CK°.1 Ê76¼·*¬>¤.{Ò Ïãi¼­³59ÅüI­yc×BÖP`_GzʨôŠ{èܦ©¿lSŽ‚˜iŒF-(V¾õ=@x‡õàQ(p„SG·ÇS\oÓ†n ìoZ–bÖnÍß…ÛÖ6[Ï@(Q`*Ã{΋1„ÍMcg~ÃÖ…ê5f®lœ:ŽŽž®Àd†ŸNñ˜#wù·O7ŽÓë'[jcÆN/Ú®1¢Ó- å‡;)0{”;{5ûÃöX¸¶“ál]–óÛŸDÙºP8(F(0—³sSŸêÌ×n*p—ól…¶»Ò©1è"ÅùŒ@M‚Þª ?}'Dö †GU èU`Ù°ÇF©¶Q4Æ"’µÞ\ó^cê{^ùÐñäŒàÍ$9% A¼+(àÉ rGä½ÏÆð4x É ¼“óŠúÔõ#)`~Ÿ™óÖŠ2t¯ ¼Þ ‹7Q”µx+æp_!g(öR F²8â-™·Káм¹‚"•½ë¥‰‹>%dÔæ¿WÙÅ@ŒÃ_aÿ¨$¨S qè^µF=,RmD=R©ª»N{ÜMQ@¿‘µ\þ)õŽVÚJ{¨J\™?EaÜ À¹ ,føÔyñ£ü5ynŸ\ò~‚ǧؽ™*Åk :áÖBö“[e‡P`˜ëç©ãåD$·%];€k#$Äè¡y¹åHFYNÆi©¶P}Î6Íû, @( Xð¹kÔÛè\ó&Éïî:­4ϰHq"Ám¿¿Æ®1ẗßmzÈ 즀h7ä”R*˜¥îú;q ß­ZžVšëÏ–Y(¯²Ù—·9äæï»^Ôÿ¡-‰jA(ЭÀÚ©ñ3)O¨ÛÌæ$з6ˆ¤½zí?Ü€÷3AªPàá ð1‰6˜ ¸k]N +’€¾¿ý7»æt#™Inmf0µýM %„[*°’¬+óŠÑîTB²8×m[6 U`ÍéÜ'݉¸9L @ ,ôÆo§¸å÷på<¨cP`N÷'Ñh'wÄM°³û%€OS`É· øµ '³=ÍŽíúìçšcÅÚ“í uƒ7*°nf|'г)ï5GÖ˸Ñ5÷b=˪ŒŒ xb¸,,l~Ÿ9@ü]V>Í5OMË`kû µ…( ‡#2nœšxuy°(x£[^„nšûÔ^^d È)0ä{Q;ÉÞÜèvÄÅßl'¨;8P‰ßâ ù:²ÈI×» GÊŒ´ X«À¬Ðúž—$_«0rÛLk2Iò{³ò¡8P @Z& |cŠ×ªƒûŸ¦3NðûiŠú@(0å»Rž, €T`ØâõM)ŽÑû‘f‹JA( €¥À·|OŠâ°s( x¾ý{É·¤8 þ|ÓE ¡€¯W ~DUÝQ+ øëÍ@( ÀF Xl'}KŠc—ÙFö„¢@( ÀM øÎz„ê{R»Åo²d  €û*„à- þú=·à¤®} %ƒP @˜x´ë@ô‡óÿ;h‡2@( ¸[ø 9òo²º&©HùîùC( X®@ç¦.§5$|/ö嶃 ¡€Pàn:)îßEé`N×&‡‰õ» ùC( ÀdÆRÜ-ìtG=øŸ¬’‡P @(p·3)žuÔs‹ã©Óòw‹‡ü¡€P ܪÀBŠç¡n“ûVE9€P @S¸â§(„rB( ØUP|×–A¹ €P ”ÅK áïP @(vUßµeP.( €%@ñ’Bø;€P @]Åwm” @( @IP¼¤þ €P`W@ñ][å‚P @(PR/)„¿C( ØUP|×–A¹ €P ”ÅK áïP @(vUßµeP.( €%@ñ’Bø;€P @]Åwm” @( @IP¼¤þ €P`W@ñ][å‚P @(PR/)„¿C( ØUP|×–A¹ €P ”ÅK áïP @(vUßµeP.( €%@ñ’Bø;€P @]Åwm” @( @IP¼¤þ €P`W@ñ][å‚P @(PRàÿ%5à¡°IEND®B`‚rgl/inst/textures/refmap.png0000644000176000001440000005612311257014117015714 0ustar ripleyusers‰PNG  IHDR,bÕr•gAMAÙBÖO¡ 7iCCPsRGB IEC61966-2.1xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óûpf* pHYs  šœ$tEXtSoftwareQuickTime 6.5.2 (Mac OS X)öé”tIMEÕ Á IDATxœí½]’츒&€ŒÈ“§êÞÛ­±¶¶Y?Ëd6OZžµ$=ÊL¦èefZ‚ è±gFf’YK6êÖ½·ªN̈ ÁÝ$Ý#‰<ÁÁ“þU–Wƒ‚øqøö¿ÿŸÿÑÔÀ ÖÚ½ü- cBØöŠÛ¢÷u÷‡v›z(Vaëùë¶-^¡P(neX …b7P†¥P(veX …b7P†¥P(veX …b7P†¥P(vƒÖ9žgy_ÿ" 6îI£¤î‹[õû­ +êcBâFˆÃºÕ¸Òñ P(veX …b7P†¥P(veX …b7P†¥P(veX …b7P†¥ø±`=üÑ¥w¡fC*&ã,*óÕfËr–¯jëü>±ß÷…€AJ7£> Cà)Œ«[<÷‡ Å h(Ý€*ÃR(»2,…B±(ÃR(»2,…B±(ÃR(»2,…B±Tâ6ÄéÌ%¼Õy·=åp=ô¼B…âñ¡–B¡Ø ”a)ŠÝ@–B¡Ø ”a)ŠÝ@–B¡Ø ”a)ŠÝà} kó¬7›Q…B±c´t˜€`zcƒl8¦ ÁYkâä¬Ù„úÞçç~ð7Ë)6ì’Zå ÅŽ¡6,…B±(ÃR(»2,…B±(ÃR(»2,…B±(ÃR(»Au>,ˆ›°“dXD·Ž3ºÙyya[íý¶ç6~4ÔŽ«Ú¸¤Úrjq¯x¨GW·ªJX …b7P†¥P(vƒj•Pñ><šˆ¾ܪÝîÕþÚï·…JX …b7P ë;áVÆà†Z åVFî­UÑ~TÂR(»1¬š|R˜ðàîiZø"»Š®n¥J•nNÛ¦±Æ:ÖRšÆ p˜b h0Îâ•ÕÔÒ¯b9SÚX[UŽ7U|Ëaz­ø,ï!"k¤ÆwÁÆüœ:S•uË9)/XÀÜasj7Ë ö£P¾ÝêÛóVåܦþ­ß¥|vqºT•cÿ‡ÿŸj&¼iR¼oÅMl Ë 5Ö‰ÆóZ0ðé-¬V•¯P(–ªkÂÕèžÀ2JuI+7Á­Â;îÆ°n_£lE¡øP +A%,…b;ü°Ö{6©*[Q(>TÂJ$, ðS(¾·P4pT¡PìÕÖÍòR x®[ÖÐÔÔßš¾ïùo*ëy/Im/çÖ)®c/’~íøÙú\B…B¡¸”a)ŠÝ@îoàV^ÈGSµ­>ŠëÐþ"¨„¥P(v•°Þ€$aÝëPƒZÔ×÷bÜýhØ‹„µùa4›–®P(7„«Ê?eCmþšm1°ÛÕõ¯,?ßÿ™¿”*UÚB6(./K ¤‰èR.¬)mšƒŒ5³?S—ü¥+k>Ôߨ:NÚ!—«Ëÿ•r‡Uf »•ê)Õ§ö½‹_ß/7¤­s›ÖÿVåWS¾¿púFu1`¶º·i@êk2ƒÕÑ­û×þÿî?ÔÌ_Qzjš†ýAüuÅÚeo…[6ß*ÓÖð×¼^&µ ö£¡­4æÙ‚*?,öb䮞¿;y/ ïX.öÍ¡ Å~ÑZ²e­…UñJñðƒJX%¬Ë¥+Š aý®¹•©·a•°{ ¬µîciH*a)û¯ ÄaU²,É[-¹{…tRŠ[‡/Ü+ŒàÑ$) !¼#_[E—Ií·°•»,“jÁƒ|[ÕiC›°øa­5jV–_ëÙ^òÝtAòú…ìxØ n'¡868©–™ÉãD¨§x;ÿ…”~ÊWÆi¶uë6îEªikŸZ“¦ñZ=¦¿C¾-»š>fùÛÁçŠ=‚xEôaåÐ „Iä¥ /MÕ+Kyën"¢¾¯Šúß,kë•\~îmÊ¹Š­—î=‰3`{nÈLkçïÖºá­$#{A¬g‹÷Þà•ím¡ÍºÒŽŸ¨tÄKÅ£«½„ìíw´¸czœ ýÑœGí^Ä­p3†Å–“¤‡šG@Îã‡*åú‹GüIMýÛúwŸtUªx9ÿ{ý}Ca}}¶.s<CÙ:0ÒÞho£s‚ÍÆaÕø¹MûCû ´ÌŸÀ]txŒÞ–Ö ¡ÌŒî÷»ë¿%ÖÕc´:ßÐ;ʯkðíÊ}LÂÝ~ëu[ +¹Ö?"¼×7·²>µë/½/NÇŠGׯaÝammúö"[ïfØón \!7¬¿­ZÂä?[àVÚ—•Æ Ï gá·×çFïe匦¼ã*¹m­ ŸÌ¡ê©?.¶f=ÆÚmoZ†yl Ø.p?¬E€ŸðåÔÑÛ½]­†á«Êo±®tÄè„Z78€lÔoÓÿq¶…÷ xZ¦æšHYiÔ¯ºâ;ø_HñV’ûV–ˆk3:šÊ>»Mùrިۨšdk jó[9¡g¤ú$åê@׸ôœµ”Ÿ/M[WÎ0¹MÅ0æå¤æYݵõ¿FkêßS¼Õõ¤C(˜Îlœ†gg¦ä±!•8×ÚZþàøHB–õ[‡5ÉÃòxûºåD!v,Ó4ÕWWžî¶uïš¿·þ 0·þ'í ¥àA$©ªÌŒU¥;D­pÓÞøÐ  —«"ÅÃ;¼056–#ÕLô‚‰–©ôÒÖZKøÂ…j:¥5M!xëªQ»AæƒÄº’ÛâOX/Û}¬4Õõ—"à%´’ˆ>šHc&õpÓõV¸M€+‰˜‹d¥Mçvåo-áJ^žZ «ªžXtÕ{yã¿‚'nìõ«E¨—kø5ïNO·"SRÝšÝ:A e)!ûN} KÖ­°u$}}GÚ!ñù†¶.¿µíSk“ªeX.Š|UÍSkS»úI)×¼l,œ©ÜK»1ªëï*%n1ßl`% Ë&caɧ賀pç p,}îÉ:V( ¡w¹öÃw‹ÎÚ°rýò©4NB¡¼éuXÞ1´×奤nqëfÇھͰ¬Ém²ÚK’ZÛk]-‹]¥–¶Ô0íV‡Æšê¥Ñɧ8IåçaÇ 3¡8ñ¸ö/GãÛ$Ü ž˜«1¹6§×Jdü„—g»`ª£ßç'‹™´¬O¼ÙTµÿ`t_õ¾ÆCäã¶mD›s݃¤cA¨±(g™T È  ç:ÍZK?)%¬=…Ü¢¶üÊ[TE³¹‚:K+Ï2Rq%SÛ°ß ÎVÉçÖ¥—^‹» ÿ²€Udz*½<¢ÉÛ¶ê-1¢M„·ûÙZ/­%é›)þj!-k%5ôä0¡ð^Em‹Áð^Tvþ:ßûÐ,ŸKÞU¶>®J·õéÑaNùòA¸ (*‹÷UJqX,Gd®»\÷ø,Ô]’Íp„½JQžê9{|ïGñÈd.î@ÃÃlÈ/ñ65!O¼åÊÖ³Ôáþ«Õ²ë%˜ïH‚Z%—Ý€Z+H5:Ì–móCÙJ/¤Ç­6œ5@ò#pL/H”W ~Ù4K’ e¤Fòr²[Ê ýùêH,×Á²ú/ ¨‘°ÒXZ–VŒ®L±þ@µVDi[‡R\˜S aX\÷!åtwdº¾6¡Ä°2·ÓT9üØ ECLlë>¿-íæ\+"RÏWèð¶Òv3Ï®¦•|7íàÍÄÙò&âÛ~‹õº(ˆg”¦P×#p7ñ•lùýÛ4/ä5àW ~~IQgiÏÝ¢dË |†µl¥¹:"¿v0×ÝïBÅrdÀèFnØÍ¼ ô×)5d v˜ЌCfäbvÈáÐ9[X¡ÇOœ1ƒ¢P˜åèš k_k8R‹Œ’¹NzÀj/O1±ËÈ’f#ôú»Úl„oýÍ6,jïùucŒ RñÕ aµÂk&q eظrXF$²T"ŸÿÓ„fq ÿ F˜_Á4/ü°6Lç=a=U6z¿‰Ê’c•Í.3‚…Í‚§æŠWŽ—°jWldˆ«½`é! ï°L[â :º¤ô·¼Uo‡o?£ÎqYlhÏ,]œ_‹ëÑÁ4 }΃î|~-ùÀUê%[Á„6 9ÍËš=Zç<ëò}`mFd¤O W^µ†‡’Þ'ù* ™«(•d0 EÀPˆ$‡±šÊløð8ÎËQ =%þæpèg´Y\I×…¥x CSpóZ %µùÂhZKy#hbÛv}}ÃJ¢Ù›Ôa"ê"¶É¤½¾œ!»€è¢™P(ˆ>|§‘Â<,)¿Y]z-ä«ÌýQ²` Á_˜ B‘¸Gó†•X•lÑ© 6,{žÝ8äÿ¥ÉÅZó mvÌP9ÜÛ{‹+#y>0ƶ1.̪ ”â`Êoq^,ëzÏÖ¿mÚëQ$êrŽ™"¢Ê #ÁÊa(|@é¿u‡øp²p bW®ŽŠsÔÄ' NzáYf›È€Î°8b>$ÑáçøO3¬¤$ÐyôƒÌå¦&ü¥DFAg†‘¤ë9ûêRiyo,ÿEsdi#ÃWî%¤9r¬I©f d•ÀÈ8Z+šeçcc*ò¥2}0ÉgÆ@†`Žøø³¸[—¾€©6eÕbœþ”ö5(Ô³¯1èÀJ.I:ìD,ó… ÂQI9$/>ú9ŸšìŸ¿5²Dæ=cãÙØ¼î]±B’æ!‰ ¡'ðà‚yfñW#.`Œcš¶wã,'U˜’Šá éM¬婑ÁQâ`4>}ëB ./d2 jìœb¼"l¡ŸÓ¸ãgWR#Ú^G†;Cð¼€b„ë•OŒOyšæÞ²¢Ûi$_ÄEpy÷‚,Þ^‚ã=Ú¶–qñ¿ Ø÷Â=Zøï²ù99Ƚ­±­À­Bø¥:ÀÓ”¥0±óA•S_O“ä}ÃRÒ ÖŒ±iìŠ5¡°Nò&/Á _p¾%3Œ\™†0¡ŒF¢“ÁMl‰eÈ'ŽëðZ¬±I}ËýÒ»p ³“^q>0—sXƼ7-…k-¯R!g<D‰µMiX½I(WQ’èåv#µpJýQWPm<e[ÇŽɦŸë?o·Þ7l{¶á²ÈÔƒ4tÌõ>»$@}ë=Q’±/ág“— ÁÀÍ=Vu½28o“{Û†6K.¬·{=„8¦ø·ˆg)±ž$¡>Nô*ÊçÄ[KÇ‚Í' ßÎn Y^¶¸Õ@úóƒÊëR„p=ù—_øŽ™1½`2²„kýœõ A`d_®Z0á2åàjVÿ¡QŸã¹•RpäâjUÌßµç ãÇ%É}ÉP?[^oó@Ÿs×Ôa )Å«ÄpOT»ò˜‚SFà(–×¥•gކsÓÒò(H·`XðXÒbÉÑÆBÌq¢¤1q×ùûëªiilmþ,¦é®ðš%«šýd¸i¯ÐJxÚ°²úþj'@]¿×Ôd fúR<£Ýóœ …6÷N(/ÐJ;Û¥‰]›ºç{sªmÿJ†…;U¸ßô¼Q¿¯ÝÚÕJ+¶pB/ÚX)<Ø•"³éÔiÜ•=~vТ¬€¹˜x'×Fµ/&"’‰M‘nø,QTu¹ë¼% Ä %ÕŠq1WÃX‰LpaÐûÊ5&©tË@ÃÔ ²¢>äg­T8TI/Áš1qZ¾À0j‹MCÄÚtТk;£q,Më*(-lnéuM 5‡XïÛÕªq É6G¡ñ eYòªãˆbÆÑl…]° g9l¾©?ÒZ'¥`æÇÍ¥ª7¨‚Í^#;$™¶ô9°k©°0O°Õ;Èh±¬©WŽM¼`muPhçÝüÙ>©š ãÎY+æ´uͨ””Ý»„ýBŒfÎ!“ùˆ±3Žö×uuá…ññÜWK%a0<_ޝE.gU>¬`i3k4•dh_FPÖª¤ÃbS6‚‘4=ùªlÖRߦE Ì„J×%š¼%å%¾¼åh±’{çí*Ùðz³c0i¶ ó ½«£"1ðÚðñwVØ#œ÷áÎ÷êö\9ôÖ«·¦90 „Pa²ÌùÈ—>=ñÝÐp ·âå.eËŽ´ØÐÝàé(¿ä÷@ÉN–æž,†{¯„ò][ém¬•¼¤ƒiÙr²½Ÿ©ªÀŸ)ý s¿4adÕÀæFjŒhA— 'x äs÷øÚ°q^WʑಉŽ\#u”4Lhœ.çË©‚A$ÉE ߯gßùú;YEšÛÈÎRÎÂ)õý…-gðæÏ¨s-SÜŸ½ŸÓ°'<Íç{Iß`†ºÀ £½L;ðíÜÂVu¶A=]– èú|Å«5ª½¡I®†8Á„S«óŸÏü€Ë¶•9؉‡ ‡2ß =,æòûŠÆföz6¬¬Ïº>Ÿ¨¹^rÁ ÃO0þþ>1nY’ZN03Od›?.¨“°„ú\‘@Ùl ©ý—"â`ÄšPë1•0e½iJê;<ëÓ,)4•O}“Z7+™hè™û ë·´ïåuayÝ4Gž1É ÿt{òø¿ˆGÕ‹+› Ã‹nQA‰ç'pR/¹ÇŠØ¢¤Æ^—ûÙ2|Þs7ÛΖ¸7wÏÞPÓ'xשx´qƒï2ÉF3\Ÿ¬U’Mªï»«Ì+,(¯o’Íûã¯KõÁ{†{|íBHŠÊò=É˳£èÀ—À¥¼™a`À«‡†Ië‡mê˜ëã€XeŽ?ÞÑ |@”CÉTZé#sâÀ味‰®>Í%¾+%QöšˆËvYàÓÅ4î ìÅãmp¤8o;à%,>²?çT[BRuûþ¶¶¶ååP%aAâ>Ÿ_kž[mC3ÖÎV~!’´“Aº.dd5VXù¥¬ ´È.Ro£O=Í ÇU˜ß‰´myKÍ|ËÎÚ_¼ÅÏ3Ú´-·õÇã8¬”½ç‘½´•ÞðÖJ› 9×[Ún_#Œ ,áCIÍâJòNܹÒ]zvƒšŽ™ëÁŸYK¤•çì¸MÚ#6¿Ž‡ °×~%¬¬lÇ`Ñ=ÛeB;i%¿&‘Õ@Ê*#°o,¥~®y&H |;[Iõ– ¶;lÁ™ƒ·Q¦“P˜É}hnÒCò8V’:6޽¡—)ÓáAaoSØ:³z3v–p×þÅúÏ o'˜ ¨˜^FV‘87§¥c ×Þo&Þ̉ےbï—×Éye–Ô¤ºf4ngT0R¿7üõ,Ì!¹«åø^ý÷NZa°"5Íí²êæÚ€C)¼#ð¼æxäó:Õz{+ëO ù*$niëÌñøÄ—Óxvñg †=_ôÚ†9¶ o“7¢Yç°{ôíáV€Ö2+ƒÔFž0Ž{î5ê…ëMË_·ž]™Ñæ2¿Ò&ëmØ‘C0‘DFì²’=íMé ÌüÜùS˜G£HðîIPdLüI–š¾'£5ýj¤ÞdÆì`hOèår™•€Ô7±ËÒyÎS£¸eT6“ÖÃÅÀÑõ¶TXa<ò[²ÿ¾M/ž/ßa>¸œƒ(QÓ¶—9W¦˜tΘ)Åœ.çá½é^K!­ ñÞÕ6î6M0š6oÓØ x.XºØAiÄ,¬È“'éÁru¸ ©BM,;~‚£Á ¤¯·Ø¬jŸP|·%:žÙ+ăi‘F#m>6G¶žž ´ƒ½Ã_Ý.hÏÙ¼ Q¤E ”ív¤¸`P»òï&e(Å!Æ08i¸–zyi+é™õ7÷šÙ#È®è\ΰˆKDü˜2/˜œ€ÈË_ÆÙ";\Ëû$!åÔØ’5B“߬YŠRÁ3‘©ó(NhœØý°H—ô$$¨“$}aAmÚ#¿\±[U"ÏE^ê—û(PâcÿxØE ô^ØìDïµ HÆ“™ÝrœXJHµ‚öÉ´2CÁcåüòºý_ÿ·”Þmg‹Zd¹û¬ÈÈÈ›oª€A×éý×Ä CÈiŠ&åß&†5;€\ÄrÀêu·ý\bŠ"ëö6wBBA©•zÌ~QµñÒ&j)ŽÌØq ëê¶h\rò$ŸäÃYçŠ6> óYaêmaÒA¶ D*3¯,DöÇö髼ɒ÷™Õ``ÁnVågaѦc8í %Ì[\w–ézçy hX°Ë\¿†ò^q€‡È[DDˆFw™cHr µ[Œ'"¹‰¦ñûÙ–µƒyeÕ¦Ûz—÷š ép¯‰d 3ì:æ»1²H/ØŒ0Ng)IŽ#`„08Óqùž`@t]°)§~IÉ•n¦4X鹆§³ÃÕkL²ŠŸ} ´ƒ÷*&šéâ,…}×CA¯Ø¯ –OpÀ¸L´µÑ23§mËÊÚ†¿N&1üí„â{ÕÌa².™M:gp~ÝRJhú\PÞ( †)PRƒ‚öÙ &4€×=W”}))JS6q´uÞ¢$ôôC¡úh] SFð²ŸfL¯¤1ÚG$‰¦5Ì™KFÐ>g§X‹FÜ ,2´ÃºsßRB¸9Ä~á½ö¢°i×O¢Ò‰W¶Èào‹½g˜’]ãÃúõ((·|§Äß2eÇgèô¾*Tqµ& îGY¿ Y<ÚÎJI¹ûqSßòÁW²)°a%‚o)G²®ƒ§ ‹„ÒXiñ¸º^êþ"Õ7]ó—Ű†Ê½ZdœËϲx°`?Ÿ×Ï~“.Þv– búoMÒCglK>öŠŸòýìeñz-$ïRͦz@ÓðœìpÄÆYi£•Ó²‹ºwËûåUÖ [EIYÊGÃßOƒ'Ø%½¤”âfF1޹Ž{ñæå Ñ–_P%o¯vª8!°¦»Ø¿^Èžt ñ¥#•;ôd/a­-€GÞñOÙàhŸD~@2c‘¿ì}4—”¸|Ætçˆ|¾³ãFp;1§ÕAÚ&pÜ)Ÿ“ç=¹óûs7Îï·ÂQqA™(Зñêz~YòÂuöT›r™!Ž·B¤ŒÚVÒgkÃY$´Ç¶.¾ m”ˆ±žTõÕ))ÆÈd÷µãN-Çbç¯Pÿï¤'1®Jˆìo„•¡6[@Na¸âÂ#Ç1 ^'¶þ©í7¼é§‚ç¹9,Ûè´¦Ð/C¢h‘ÏåMï0a&~Ã7ˆî©…J½ƒŒ»ÉT3ýK‚—`{1¾/xï¹5C¶‘±—å‰'9C8Q…Û†•p%'R€…÷âÏjWˆËçEF_æº$1¥up¢Ú“M÷¼qÕwyOÒ­À—Z6>è:Åõ —b4)÷›/B “zbÍ:°ÃáÚdƒlh8㥠(r/TB#MxŒÃ`UiÀIŠ×NZíË»½ÄÝ$ÆTµ"YܤDÉ äíó&Ì’âG¨—,ÀN`h’ìòªbóç@<¸fwÁjà=Çø!CÓRÞ4J³6ï_K›º¡ŒaNÙ|º+é¸0;‘ó¦î…Liù@P]¹,˜.šºRR$V+ííâ‘Öße[ 9gT” ãtI³jÉø™)‚MãÙ° K'ËÜ/ñ¥ÖC^æ )m ðÃ0 ÙQ¢°!sÄr®ºzêòùq ¯JâènBc÷º´Û<÷`þ¯Àgº oä#ªo#pRö q« ¹ ¨¡‡´|ƒ^L#Ö†ž]Áx$#ÏÎ)nžëS²FHlÞ4q„Ä›O¯Y…O®%¬$måÍAæà ]`l=”~§°6äòŒáOd )zˆXHô‘5cP…D,{=xȦa]ïiCÏÌ}”Ó|ÍÒá\ÅÙWµãGtj!1¦¤ƒÝ*ÏGºŽ™qx'g€ppë¦%§ò…ð V×°Wv«“2Hñư;:æ«›L<èXžã¡•½$ š$ÇèöÖ.ß 7¢ò"="É!oà!ݹôlù’ײ6ñ^+¤‘)Ë’ˆbÔIc9†È«`&û`%M‹{C¹ âïz@|ho'³q°k€ÒÙ].é)T™<±'ýnI8Ãß.Vlà hë›”¿i•—=ðŽÝ»'PŒ53L$·D¥o–Â{¦~ù 8œšÇÉÈÈèCoyš|ð Ú ;a‡€áw°÷c×emž-+ï|ðê<¾o‘Çö*5°ƒç3’í¯m…“‡½ÈèDå´@¢þƒ¦†œr0ß…(òÉ /Á G'³+éB=ù×Âã†*ìâU¥9³¢Ààš n{37 C髹pÅ»VS÷åå…%z"IqU;Nù¦áé¸BœI.±IÞq–!b@×`tœŒ]—4žÙŸq[ï‘ i“[öÚ)“¯J¢Y_2É =š\¢@‰ü(x™r›O!°97¹kBl44`Å„ü´óÄV0Jé~“‡ ·‰c|‰]®mêyvËk*­à3|¢b’¼B:¢—yÉÒ\JXIn¢­&Ì€ç)‰Ð‚0ÂVG´‚ À‰Ám¬—D÷Ê ¥­ ZK^žÆÕehÄ•öÚ+Ï*Vµ©Û§mMÚwÃý6ä\™`stƒjoŠ"ŸË >˜B‡$¸€ž‘˜ÜxÄü$®-ä Õu€|ކd \ËøüV,ìæéÓmZM¶Ö=&ãjTAeNû¨Ñ švú9!Z4M<1Ù5€YâíË÷ê/+š$…­•(¥q.Õ¿•T 9“g;82©•6è¤A“d¼dijŸUÖå,ÎIFn>“„ã§'á½8=ш K>]Fª§ÐBÏåDþ ¯îlðÆi /*™â˜Ùsý¸v®ý ¡»Y½Ã½”ø¿édïĦ‡ßÆÝ õTBs%‡ç9½œ ƒÉVƒvm:Ãe*`(IdŒ×U¢)¼cmù¸eç5ˆG ; z‡ˆ‡…rM‰Àæ³3ò Ró7ÂfxJ3Å„G›÷M¬Š¼¬ÍÎÒ¢ˆÎ°!—vè Å4äu2 ºöÔÛ’–ÖÊÓP Ö‡8ÇïÄ“aÅÑÌJpƒ™o„ãæÄ@PQ‚ëÎlI+O#¤ ]þ>ˆ™®%UTÈ$¯+­â—‡$4eör>qsn¸ÙØîxø9˜+æKž%‰%ÁW ûè«ä XŸ±³¦lŠoªºßu0žKꋵ{áã?B‚—§TCƒ9H‰”rØ/¯cNw&ã¨ÇwX2âƒPp™ð:í…|dyO%ct7yœP?S—…]Œ¡1t_À³”Cáî%š5Ô^È El‹”?[„t:‹ Ö‰‡D,€ ‹s“óü6ª c"ÃUåóQ+ùþA¡Cë•I6,¶|aE…•ž•iɽëzpg…ŽCN”UÂò—`îüzyG$“Á¥èPB·’óAÚ+18\0ÖKôp胩I1\˰Bï+î7í±ùe¬Ø}×'· Âd¶³Í%væ¬?}ý‹u½C#8l#‹ßFÙ$J]=©ænF¡ ´qÍ(š±æ×Á¢l“{žâ!Ú¸+ê­]OÉHŸ½ã_qÞå„¶ã²OṂ|þ©ÑÄDNCØ”ÛwžKÇÃ!uö JÍ…ÉPŠXüèÎ0î>/Iîí Žþ|8Ö¬0aª8"x7¸)6оE´šƒLË-ë¡—Âzú” nÉSÃ"ÕÌ”îpÖNH*gÖ´I[0ºŸÿÔyw¹t§Óéåååëׯ¯/çËå’˜²žñs×lÇãÓÓÓç§ã§O‡ã¡‰\>¸ƒËBî˜^ÙúÆô¼ð+120q¬ßË™fQ-¶€ËV¸Ò}îóx‹Ìÿ¼çWŒó=k)œ‚¾³ÉV -L±OÿüçóדùÚ±;_â·`4h0€Ç×ÑçHÁÖîüó±m¢ †¬?J%Ðì-ª=°a!ñšAIÀáÜ“{/+‰Bž;.ÒÈc{…TÒC%tÚá.wšÇÀH¶´ôì²z˜$oIÊÜ‚“’Ž?œÒsÁ2§h¸¤Z§Wƒ 7‚?Œ‘©äìKýäC…,dCqj: ˜RùЃò‰q ÇÎ@aóۡݾoÀ2QEQDJ=™GZ65Ò`ši­¿t(Ôú9í_ Å\sÃ`1>ÎÛOTœŠ>íl°³¶8yt†'w(øñtü߉DSzÇ.U¦³·ÔWн9¾†Eä$qx ë †»7é-)äwAÑ)Òkf 2ïëë+.øÀ\Ⱦp9÷ç®ýË/æë«ùòåüåËï‘aÏ眷&õQ+Ty ºƒ ‡Ãåxˆ¯szгÏú¿ÿûuhí§ð¯4¼‡)áO?ýÔ„þ•LòÄãç(€HÞØNX^€'"h&$/ª5§î'ÿÁ}ÑÞ7Q‘½¼‚AùrºD}Œœ÷ÀîùÓ§ãSˆ¹iý¡00a­Æh3ã_èìü4˜½0ÀÊÈ4 ¬å©iŸBs8½v¿üúõ×ßNÿôO/]8¸õ)*|p/Õ†CC#4Ö»³!¼£Šýü—<ëÇÃñhOæomüóçJ²0—âœC†ŰXbïÂ`Î)+±ȧó.VÛ™ÎF­D`ê/æâ"sh,$SË_âZÚŽ |ç+A10¾¦}=Ÿ³ ¹I²'>÷èRN.ýeð̘l¶ƒ·ÿÇÿó?³Æ¤8(–×á—]O62.òbh®ÇsúÜhdM‹Fä.ž¶×…§Öb÷ug—àxe.Iáþ( Ä)›7¾WCQ2Ð羿\0Œò«`50jàA¯g[tÀÛF\e·¥Y×>ý”}_¦ŒéMçÄ-¼E9þ•³?Ûù•ÆñN ¯—Wf8X˜›ÏÊšîhH¢Xù&r4:úÜçôzOÇ#ÛïMsô¸.t>þ礈ëa;À0Ì™øíåÔ½tíÿõÿœÏýñ|ºœ/§’'#ödô]ÈÉqiê"C‡åއi€õ-øÑ|kû8>>jþüôóççŸ?zþt<´}c¿8{*»rzñ¸-K§Ë,dåÐQC) BCŸacuÓœã+žíë©?}í¿¾lëôÒA &¹ÞG†õtlÇþþË?ž"ÂfÒt¬ í%H“àœ:LK=Ìã’)%­(Žñö“…µíét1¿ýÖýù¯¿ýúËË×WûõõɇO¹Ç…õNÈpgFÊ>€Š ÎJ•ÄŒŠ}ä\ B6ž“É„?>9A-ÌH`& ÐêìŸ~þg“²äv…\,ml-à•p›ÄÞ %ÀwQöÀW ZÍ ˜¸-Ec’#îÇÂi› ÆH ¥âf‡Ã¡”†YÙþßÿùÌjÔBJ\ÿù Bó€g£kæ2MQ‡nÑÑ+„;*¢DðÉP ·>¸Ó)|ùýõ˯/__Nç×Åo7ó)|z:Æa‚Bo”î}v(O5`êkãšì ãú1+iüè#wéƒV` ¸‡Ñ¦È œÚtbÑéõÉØ±©xýÒu˜µ×G©‘cèÝßü1®=ÆÄØP,j@À.Y*+L<˜*”J«Å`L®Å,a°ôÉùmg¦Ь#Ê çîƒ> Ù2¹~7îÐ㛅Οº®?u§î—ó.øO‡øÆÐÚ €õöÜwqZ¿væ_þzêŒËÁœ æÂ3Ši Î.&€Ê„íÁº²ù…rfús¼é·Æþõpzþ|úùùXÖSÿ§¿‰²X‡o"’`ë #1í“ö.r{Táåh>8AŠ’±æ_¾˜(K½ü~ùò¥ûúåòõåÜl׃æDÛ¬0‹)°€ã! 2±m~ÿü~þüS”·ÇÏ(€ä;:iÙa:I“¡U÷(%±‚¦Æ±óíédÿü——ùçßþòׯçSlŽfm¹P{ŠRÀ¨ŽÂ0q‚Å™€ za]!¡Ãâ§"xnøµ9¥Š ÿ/Š]Ī®!¶ ”3'…¦FRÛ§'÷ü¹ýüÜÆz„<éçȶ<…ßå°e×Fël¾ŽClqQhõáËo_;ï/—þtTZ¸¬fÀŠWŸ?ìwĶèºý÷ÿËÿή´`{Z\·qBþ!N ûôtøô|Œh[—ä¬R Ä,`uóMöÝù¥=_^¾œ~ýíå·_^~ÿý'F5ƒÕ M8bÛÐ: 9Qk·È³a ±OqÑ=6 ¿7Ø5¡ÿÔF%ä©ÒV𦹢²Iˆã7Y7ó2õŽK×ÄÕ/¸1pè€8MϱŸ:Èü¹˜Qø‡ýóáÐÇ k’œÍ£Ä7áYNôpYõ“-x›mJÎ&~áÒøèüå.`­Q+>÷í¥·—(_.ÄjÉqëóîá)ãçУ4‡W|Nü Æ,b–bp®8T-!O0&Ј«f —¸¢–QÝÒîÿ>ÞOQæ¸Ö56™ZZX€€‰Å©K7.W®¹üÝßžžaøFŽ?¬·±1¥°.Lw\dØ “•J@ßüóÿ÷zöM÷ǧïϰÑÑù8Ù"wlsvˆŒk 3×w¯þéÙþáçŸ~ú)òԧȶžŸ¢äe¡þy úû¡ ]¤”&1ÀðÑáâýr ¿ürúËŸ¿þúkTqÍùÔ>}E»l9¥ÁðÑ÷·ðâA`rçÙq×1y‡;c‡ü±$ÝÃ<꺴P‘è—(3²C8£ÙËô‡cøÃÏOû¯>ÿûó~Š ×ÙŽl¥µÍ ,‹Ùú5޹¸àEÑ%ï_þú{ìÛØâç¨#âíVpUr²ÜÑu0%ýõ7é¼³Ëòº5—¿üù·OGóù§çŸã*ó“l tfç~ûí7š?ø–mš^Öü~‰ÂõùürŽÂljÔÛþüÔÙ'ØÆÆyãcÞMùF|÷ÚFà)íåõ5®ŽG4ÎbÂSÈt(^…[A\BL#€eXQßy²Ü5/Š3‚Ë Øz¡¤ÎÆjþËÓ18|ð„p/ÛðüÓ_Ÿž›OŸ.q°Ã~#ç¤)ț҆ѫÀÐÁÃùûkÔÙZÌØÕFVì÷ÉfÚd>òn”ûƒyË@ÿËï_Ûæ5þã“‹ú×ßÿÝß„…fè(QRÚRä²&‹b{Iäcº¸rýÚýúå|z‰ÃþØŸ;ö`ç:§³ëh"[T ÑÊsÁ”ô¥[¾ >—Â’L7Ø4CTù1: ßú‹’,÷äMʳ>ÐØãÏŸž£ŒÔ_^¢ÀÑÿáòòõ÷çç—?ýñ§¨iÆ!ÒœDv³ÂýùËKoÝk÷r¾œ"»ºÄ%<ùqj¢b˜rQ‹C×j ¸‚Mi”¢ö™¤!3ªÇQÆý„¾{7£˜*Ä{3¡ÖœÏ¨ƒÆ^Œà·¯_ˆ[Å2ýõWj¨DÉ[ôpx ë5V<6q”šŽàkšË©<]Ã6¬öø³I› °’ v<¬ÁF5Òv®ƒè"ôDÎ8ꃭ<êáj.`hÛtns²ð¡N§6ØÚ3Ç7h¶=¦HþÙŠdÝ/_~;´ýﯗ_·ÇcGÙgqX Ó,IXd Y¶ncOFOfdXi±™ ¬š„/¶þÐtÐ~G8¤ÜÞ,­‡éwÓÚAå@#\ê£öx@‡KCÏìÓ¦Ÿ8Á–1Y…'Æïà†>¦JjÉ[Bü>Ði{žŽ¢ª”(TÏq%|Ž"ú9Ê…/F™ôh{õ¡!¦Á€ÉåŠíã “¼žú1ŽP[z‹š„…“ z ±…ád¤ÇÜ-µC:÷O‡ÏñëÓżƵ7¾»»¶=¸ËåW üì°‹AÂÂyßçà)û 4TžÂ~¹œ£0r‰ïü|l?{¸œýéôЧ¾<УôÔ£á’i””¿)œ%›pq“ü$)̠ؔñ©54àí¸•pÙ_hü;ÄÆq‡ÆÄ)µæ¯Q~øãϯq4p1†ö„E´â—sÀ²üÁÃQ5¨‰Ú8BØ9ô²-GVbÇnôtž”É™«²Ñ½EGüzFÍaéæ½ưÐG=ôò“ÎX¬O[+ÊäXÃssò‡€[Ðãpê=¬]`9~׊@G'ÈRe }Ý ï7bµèÅHòâé( šŒçý…Á>‰!OÕFw[ä€N7良üdÓ–W˜hH`Ös–Ô>޿׋ _b¥N4Žž†­S «»\Æ[.%a u ‘‹ÌäˆBÀƒ. TÑТá ÚŽ#‡0[Ofç¼UË~GÉ"S¤IY!)w9äd;T-)†*ø”UtpXZ¥Cpó¼É;Cëôï4}agx¬ýñùOÞÄáFîïX´/ù ›n™eK^vêÍ‘&ÛÕÙmúžjƒ¶?äœ`kpq¼ùäOE‹5êÞ90¤0i‹O  +ôö_þ|Êܤ—‘q¬ò–âéS ,9ÐÐÏ5ɨY`óH{ ¢C$út{3}"û=:çgߘHÏÙ!µžÉÊ Id…0ÇuÇçlîyûåë×zãaµ†%Ó4—¿ža‚Ø ùvàY=æ¨S’E£ÎSƒIU1×÷1MBöèÈ鼄 QÄvAéaÐ4MŽ‹…qUtìkIMÂé »ÈMTÂв1î'Æœ7”~ùýDÓ ŒO0™#£Ûoï€Áõ˜=Ï #c1 )Oh%„ŠRzßB*g¼?Q S?ÆÉ&ÿÀ ÞÕEÜbnÌ~øLÿ ö»@ \d¹\CdÉ^‘·ƒzl¥p: »áý[ êFSÜô¨ªPnOdd@¶GÛµëIѳ˜áÎуù 30m•q´÷=ÛïC&¬´8Ó1xf°‹ Eš$ß $‘9-)»I“™Ÿ²QRZµÐ ™óÊX­"TÊGã eP)ÀôâÀ±i!?VlÛHÙ£ÕA’âUŶ}J1j}è'ê¤#Å ãÑÄŒC@EEÖ¤ȇ7 ÞŒ£Œ®¬ÛMŽQ*ü–ê°-]¾ªÍì+;Æh†‰!…«ÏêºÙ5xHz æ_{u&3—@¹¨Ê¡:Ú?$WIDAT¾ä¢œâ±“&/%‚Å·`õ¦ ŠZ.&sé²A-³ž!ÎJ+1òJtõ†Í·Éh]öB®áìJþÑl¯ÂjÆCòV;ÖvÖ“w]Uk n²ñ[m Mb»óº¢Çqnè°îܤĪˆÚôRÁ•ß‚K0¿c r,æÛ°_;™À†–àÖ·g ®šü¾Ã«­v c@ÇØGÙ€ãfó”2`2O`bŸ{m`R¦AƒcÛ¿Šw?Ø¢þÐ×±>jRFxLïÁÿ%ÊÚÑlE¯(×éIà®`Š}“3Äæ‘fŠQ=0¬¤ädX!KOxo’“><1:[ôÚš•¯½œëTÂÔ:ƒ’¼§ŽC:êèœê£š=$ÒÊ·1ŒÉÈW »À*a߯_ôPüiÐ]äŒñù˜`Æs`|þìñCþþÔ`æì HñQH@F,”HSÁ°P"î¸÷-=*³«´H®Tj»´án ˜>fÊF›ÑêúW )È5ËIГ|^#£I¡ y^ÈJ#&cwäV¤u åPíú¢eÊ9Uϰ¤_­0yA!A£?0¬‰•0ÐÞ†ÁO¼SIö´ƒ@C_!ÛòÙ»2¨óƒ#n•-·½\x KÂb9]¶×d¼¬=“¸M­o±¡Ñ½fõ`Ém ×î}‡Jå%›Ë¤ÝŠ8?³·¬xw‘/Áÿ]ɰ&+#š Fý Ô8¼ðÄËoçåÓ[LM(ãûÊ•ï)Û¡îeÙ6¼z»4›$eH<ª„¬—pVŸ€^ó0{¦®If[øÄåÚÛþ|^û²ôUw×£öhxÂZ ¥žVf}àDΛBÌHÿ®v»/¶Kßù„ä÷XôʾÓo'&—köÞ®yV/|®-Óqq æŠ—ð^¨M ³5ªÁèôü®x´vûh¨Ýl'ˆúà·0Ü- µgT /«B¿żªQ“dƒëMݯîÁ­Œ2¬{c' Ë”öå5*ؽ¨´y¾…,lU6ˆé|ƒñ½iÎ{µþWF%¬ˆ0,7¨°óy—6f߯%GDZûç×[8áÞ•û6ñh ”ó~m=Ú°~$<šJÅcY6›w<ƒ¸’/ø¶»œV:¿ÍY©î_¢˜U§êW÷a*aÝ~–Áio–ãóÊ=ÄŒKóÂ_¸°<èô!xê"a ¢ìGk·F%‰àÁèƱ?÷·µíÙö aÝ¡B·²UaÂÔ» ï7 cÝÅ­¢&iËXì[”C9ñ1·Ý„†îÂÞÏwv7:JXßÊpo5ïÄùhxAªù7ÿðoñÌw¦Ã9£ß^å Ñ{Õ XwhÏ{ÑÔæ “Nè#ÔmBÇc"×Õÿúý«éC¼ûH‘½¦ÎÉ·Vx_‰Þë}Ûà»lyù®4Ûª¾½^×͇¬.'Ùªnñv÷v ?B؇䖾5¡ªþ°¿ña..pyþOÇ¿©›·šwµ”r¥ûï¯ÞJ“DPIdÝZEÅ‘Ÿ?…<ç|ûû»Œ+‰ÂþòšúÃLî~È]ŸÃJ ÃüÞ}4R#Ú°²†ñ½ç]-ۆ{ðû[ˆÖ®µåÔ¯ä5Q·¦x«À î]·5RªC¤ ¹V(x0cv–°6›/µåÔRûoÿ›ÿÎÜ7t£°ŸÇúGÁ£õ£)NJª¿tm¼ÕãµËœk‚¾ÂñYu'$ß ·êH©¡kÐíâ˜m€n ©Ýö&ÕSŸÇ€ÞæjÖ­æ]-ZÒF·u¤Ö¿Ø ž[ù^Wï_jŽ¿ ÷#Òt€çêë{¯gHçs®½¿qî&õ¿ Ï÷ùIë»nS½ù Ï’X• _þæz¿¯aWa²DÔCšGíÖŒ ªô𘖭xt¨dp Å·À‡šyQ£û_¸§„U‡Ç’°( ®â*a)¾'*%¬~/<늄µí«e3'aÕˆWFmXŠï‹êy±“á)JX¥šJ ýæ¨äVF–âûb/êµæQëÃÆ‘î•óWâ÷aé™;ÖòTE½-ÍÈ]ß¿U9bž¿¿Ý°.7Åý$ðŠû— «þµâæ*¡­,¾62þ»`Ç•°®C%,…¢ ?¨„õ£BÛSñ=ñálX÷zðN&¶z Ç›GKX§ï7€?2>š„µç} …âƒAmXס*¡â¡ñxówc•pÓÒ? o)~d|4•P%¬ëP KñÐx¼ù«Ö®ðxHñ#C%,E •°Ç›¿ÛÖÇÏx êÂv4ÔÐØ@ÞXͤT©Òë4Η4wÌF´yúôGÜ+g„º…\oÍV4ø ØÝ¯¥ÞÃVRÌYè•*ý>týȼ-uq6a&ÔBòM¤›Íâ?þÍ¿1„&lZ¼‡@Ùúóœ E 1q`ØÖ,þp6¬«óX/«Pì"ߨx8/a]ïÞ•P(vÙ;é7Ý?Ó†ÍS¦ÖáÁ>…BÁ઄µ!Kùx–rD…â›q¯ø¯fÃR(7À½lXj› …Bq[´¦ò±ÍQ)iJœ^YíýN8¬‚æ)û˜¨?g°µó¥Ç ©„¥P(vƒ6„ÇZÉo¥˶¹}HXЉý £qXæ Q||´ì µØ½—PêàG{/…b ¶·ÛÏ•°>$”á~L¨„u»t·–÷¶9u2(?„„µ¡YܹsøA(¦¼Iyu6£ …b# \o«ùÛÚE·žÂH…³É_\Bª™Q”¤ìòZ4&W’åß;V’û¨f[k›Çãü ¨m·úvÞ:¿Ò¶¾WÃNUyþ2ó]¢ö§ÏS_¡ ±õDÚ ÃÚʰއíÖ¾!™h$ÔÎÇgtW†ujìjÛíGmç­ùp5ÃÚ`›B¡Ø [ÏS•°ÞþÅ&õ¸74~í}¸•ê÷£¶ó‡“°>Z+?jçi­-O%¬·±I=î ]Þ•°®ck KC“ ÅnP-aÝÊ+å{º•·Ėu'wò£©Òšoë}¨m7éþ[I^±µ·T%,…B±<\¶…B¡p7£ûÖŒr/é2n]xö…[õ×Gëw•° Ån°{ k/ Éö¾Sq[ܪ¿>šÀ¡–B¡Ø ÔK¨P(vƒ‡;5§{‘uÓ¸b öß_zò³B¡P ”a)ŠÝ@–B¡Ø ”a)ŠÝ@–B¡Ø ”a)ŠÝ@–B¡Ø >\ÆQÍ¥P|;œãei~I÷W?÷&¥( Åw€2,…B±(ÃR(»2,…B±(ÃR(»2,…B±(ÃR(»=´Ï÷®ƒb¸ÕÉÆš*Zñ-P K¡Pìʰ Ån  K¡Pìʰ Ån  K¡Pìʰ Ån  K¡Pì³|J¬{ÅË( …•° Ån  K¡Pìʰ Ån  K¡Pìʰ Ån  K¡Pìʰ lXK·.¿–>&>Úûnñ\B“ú>¸Õ9n·:o1M†8ÖÑP®W[~-­­ÏÖÞ·±.v˜ fFcG²ï%Ýÿhï»5lÛ|ºw>4a55ë=²jÎT•_‹wÔgkHïë¬piÆw¿Ç7}¨÷ݪ*ŠÝ@–B¡Ø ”a)ŠÝ@–B¡Ø ”a)ŠÝ@–B¡Ø Ú[¹Ã·…öË )|¡ê~1Ö P(eX …b7P†¥P(veX …b7P†¥P(veX …b7p˜þ¯§ø«jZû¥w¡¶²g]eÿÖ–_Kkëóhí¹÷÷ý´ic«Z‚Ö:j*©…„>åß‹ZÖó#ÓwL0»qù›ÖçÛóÑÞ·©ä›ÏÓCVøŽü;ÍNâdIS(XóXa©ÜJ¡P(î eX …b7P†¥P(veX …b7P†¥P(veX …b7hª8V0ÆZÞÑ)cøXNQ…B±g¨„¥P(veX …b7P†¥P(vƒÿ!¢¯üYÒ§IEND®B`‚rgl/inst/textures/nightfire.png0000644000176000001440000060122211257014117016415 0ustar ripleyusers‰PNG  IHDRÓ?1 pHYs  šœ IDATxÚ+Ô~bv«þþÿÿÿÿÿþÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüþþþþþþþþþþþþÿÿþýÿÿþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýýüþýÿÿÿþÿÿÿüüüþþÿþþýÿÿþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿþþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ¶Úu IDATþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþÿÿÿþÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿþþÿÿÿþþþÿÿÿÿþþþþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþþÿÿÿþþÿþþþÿÿýþÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþþþÿÿÿýýýþþþÿÿÿÿÿþþÿþþþýÿÿÿýþÿÿÿÿüþýÿÿÿþþÿÿÿþÿÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýþÿþÿÿýÿÿÿþÿýÿþþþþÿÿÿþÿýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿþþþþþÿþþÿÿÿüÿþÿÿþþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýþÿÿÿÿÿÿÿýüÿÿÿÿÿÿÿÿÿÿþýþþþÿþþÿÿþýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·žµˆ IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿýÿþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþþÿþÿÿÿþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿþþþþþþþþþÿþþþýÿÿÿÿÿþþþþþýÿüûÿÿýÿþýÿþþÿÿÿÿÿÿÿþþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþþÿÿýÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿÿÿþÿÿþþþÿÿþþþþþþÿÿÿÿÿþþÿÿÿþþþþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿýÿþýÿþþÿþþþþþÿþÿÿÿþþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿýþþþþÿÿýÿþÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿþþÿþÿþÿÿÿþÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜNCü IDATÿÿÿÿÿÿÿÿÿþÿÿÿþþÿþÿÿÿÿÿþÿþþÿÿþþÿþþþþþþþÿÿýþÿþþþÿþÿÿÿþþÿýÿÿÿÿþÿüüþÿÿÿÿÿÿþþþþþÿýþÿüÿÿýÿÿþýýüýýýÿÿÿýýþþýÿþþþÿþþþþÿýþÿýþþÿÿÿþþþýÿÿþÿÿýÿþÿÿþÿþÿÿýþÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþþÿþþÿÿÿÿÿÿþÿþÿÿþþÿÿüÿþÿÿþþÿýÿÿÿþÿÿþÿþÿÿÿýÿÿþþþÿþþþþÿÿÿÿÿÿÿÿþÿþÿÿÿÿþÿÿÿþÿÿÿÿýÿÿÿÿÿÿÿþþþÿÿþÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþÿÿÿÿÿþüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþþÿÿþþÿÿÿþÿÿþÿÿÿÿþýÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿýÿÿþþþýÿÿýÿþþÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿþÿþÿÿþÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿÿÿþÿþýÿþÿÿÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿþþþÿÿÿüÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿþÿÿÿÿÿþÿþÿþÿÿþÿÿÿþÿþÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþýÿþþþÿþþþþþþþþþÿÿÿÿþþþþþÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿüýÿýÿýþþýÿþþÿÿÿÿÿÿÿþþþÿÿþÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿþýýÿþÿÿÿþÿþþþÿþþÿþþÿýÿÿÿÿþÿþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿþýÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘9ïR IDATÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿþÿÿþÿþþÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Ô~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿüÿÿÿÿÿþþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿþþÿÿÿÿÿýÿþÿþýÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþþþýþþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþþÿÿþÿÿÿÿÿýÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿþÿÿþÿþÿþÿÿþþýÿÿÿÿÿþþÿûþþþþþþþýÿÿÿÿÿÿÿýÿþÿÿþýÿÿÿþýþüÿÿýÿÿÿÿýþÿÿþüþÿÿÿþþÿÿþÿÿÿÿÿþÿÿÿÿþþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿüüþþþþþþþþþþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿÿÿÿþÿþÿÿþþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿþÿÿÿÿÿýÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþþÿÿÿÿÿÿÿþÿþÿýÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ¿AZ4 IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿþýÿþÿÿÿÿÿÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿþþþÿþÿýÿþþþÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿþþþýýÿþþþÿÿÿÿþþýþÿÿÿÿÿþþþþþþþþþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþýþþÿÿÿþÿÿÿÿýÿÿÿÿþüþþþþÿÿÿÿþÿÿþÿÿÿþÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþÿþÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþýþÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿþþÿýÿýÿþÿþÿÿÿþÿýÿÿþþÿýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþþÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþþþÿÿÿÿÿYù IDATýÿÿþÿÿþÿÿýÿÿÿÿÿÿÿÿÿÿÿûýÿÿÿþýÿÿÿÿÿÿÿýÿÿþÿýÿÿÿüüÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿûþÿþþÿþÿþÿþþÿþÿþÿþÿÿÿþÿÿÿÿÿÿüþûýþþÿþÿþþÿÿÿÿþÿÿýÿýþýþþýþýÿþÿÿþÿÿþÿþþþÿþþÿÿÿÿÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþÿÿýÿÿÿþÿÿþÿÿÿÿýüÿÿÿÿÿÿÿüÿÿýþþûüýýþÿþÿýþþþþÿÿÿþþÿÿÿÿÿÿÿýþþþÿÿþÿýþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿþÿÿÿÿÿÿÿþÿþþþÿÿÿþÿÿÿÿÿþÿÿýÿýÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþÿþÿÿÿÿÿÿÿÿþÿÿþÿþþÿþÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüýÿþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿþÿÿýþþÿÿÿþÿÿÿþþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿýÿÿÿÿÿÿþÿÿÿþÿÿþÿÿþÿþÿÿþÿÿÿÿÿýÿÿÿÿþÿÿýþÿÿÿÿÿÿþýÿÿÿÿÿÿþýÿÿÿÿÿÿþÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþÿÿÿÿÿÿÿþÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýþÿþþþÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿýÿþþÿÿÿÿÿÿÿÿÿÿÿüþÿÿþÿÿÿýýþþþÿÿþÿýþÿÿÿÿÿûþÿýþÿÿþÿÿÿÿÿÿÿÿþþÿþÿþÿÿÿÿÿþÿþþÿþÿÿÿþþÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿ6™7 IDATþþþÿÿþÿÿÿÿÿÿÿÿÿþÿÿþÿÿþþÿÿÿþÿþÿÿþÿÿÿÿýÿÿþýþþÿÿÿÿÿþÿÿÿÿÿýÿÿÿÿÿÿþÿÿÿÿÿþÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿÿÿÿÿÿÿÿÿýþÿÿþþÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþþÿÿÿÿýÿÿþÿÿþÿÿÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿþþþþþÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿÿýÿþÿÿþÿÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþþþþþÿþÿÿÿÿÿÿÿþÿüÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿþþÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿþÿÿÿþÿÿÿþÿüÿÿÿÿþÿÿüþþþýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüýýýÿüþýþýýþÿÿþÿÿýýþÿýþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿýÿÿÿþÿÿþþÿÿÿÿÿÿýüÿþýýýþüþÿÿÿþÿÿÿþÿüÿÿþÿþüþþþÿýþÿÿÿþÿÿÿÿÿþþþýþýþÿÿÿþûÿþþþþÿýÿýÿ þþüþýþþûÿÿþÿÿÿþþÿÿÿýýÿüÿýÿýýÿÿþÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿþþþÿÿÿþÿÿþþþýÿýþþþÿýÿþýÿþþÿÿþÿÿþÿÿÿÿýÿÿÿýþþÿþÿþÿÿÿÿýÿþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþÿýÿýÿÿýþþÿÿÿÿÿüÿýÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿýÿÿþÿþýþÿþþÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþýþÿýþþþþÿþÿÿüþÿÿÿÿþþÿÿýÿþÿÿÿÿÿÿÿþÿÿÿÿþþÿÿÿþÿþþýÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞºõ† IDATÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿþÿýÿþÿÿÿþýÿþÿÿýýÿÿÿÿþþÿÿþÿÿÿÿÿÿÿÿûþÿÿÿÿûþþþÿþÿÿÿÿÿÿþÿÿýÿ+Ô~ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿÿþÿÿÿýüÿÿþýÿþÿÿÿÿÿþþþÿÿýþÿÿÿýýüÿÿÿÿÿþþÿþÿÿýÿÿÿÿÿþýýÿÿÿýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿýÿÿþýÿþþýýþÿÿþÿûýÿÿÿýþþÿþþýÿÿÿÿþþÿÿÿÿýþÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿþþÿÿÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿÿÿþþþÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýÿÿúûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþÿÿÿÿÿÿþÿþÿÿþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþýüþÿÿýÿÿÿþÿûûýúÿþÿ þþýÿþÿÿþÿþýþÿüüüúþúüýýýþþüþþþþþÿþþþýÿýþÿþþüýýüÿÿÿþÿýýýüþÿÿûüÿÿÿÿÿÿÿýýþþýùýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿþýýÿÿüÿÿÿýýþýÿþþþþÿþþýþþýÿþÿþûÿýþÿÿþÿÿÿÿýþüÿþÿþþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿýÿÿÿÿûýþþþÿÿþþþþþýüÿüÿÿþÿÿÿüûþÿþÿþÿÿÿýüþÿþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿýÿÿÿÿþÿÿÿÿÿÿÿþÿþþÿýþþþÿÿþûÿûüþýÿÿþÿÿþÿÿýþÿþÿþÿþÿþþÿÿýÿþþÿþÿýÿþÿÿÿÿþÿÿþÿÿþÿÿýÿÿþÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿýþÿÿýÿÿýÿÿÿþþÿÿÿÿþþÿÿÿþÿÿþýÿÿÿúùÿÿÿþþÿÿþÿÿÿÿüþþÿþÿÿÿþÿýÿÿþÿýÿýÿþýÿýÿýÿýÿÿÿÿþÿÿÿÿÿÿþÿþþþþþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿ ÿþÿÿþýÿÿÿþÿÿýþÿþÿÿÿüûÿÿ÷þþþÿýýÿüþþÿþÿÿýþþÿÿÿÿÿÿÿýÿýýÿýþýþÿÿÿÿÿÿþÿÿÿÿÿýýþÿþþþÿüýüþüüþüÿþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýþþ ÿÿÿüýüÿÿþþÿýýÿÿÿÿþÿþþÿÿÿüÿþÿÿÿÿþÿüþÿÿþþÿýþÿÿÿÿþÿÿýÿÿÿýýÿÿÿÿÿÿÿÿýþÿýþþýþýÿýÿþüþÿüüüÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþÿþýýýÿÿÿÿþÿþÿÿÿþþÿþþûþýüÿýýÿþþÿÿÿÿÿüþÿÿþþÿûþÿüþÿþ%ÿ$¯ IDATþÿÿÿÿþþþÿþþþþþÿÿÿÿþÿÿÿþýþÿýûþþÿúÿýÿúýûþÿûÿÿüþýÿþÿÿÿÿÿÿÿÿÿþýÿýÿÿÿþÿýÿþÿÿþþÿýÿÿýÿÿÿÿýÿÿÿÿÿüüþÿÿÿÿûýüýþýÿþþþþþýÿþýÿýþüÿÿþÿþÿÿþþÿÿÿÿÿÿÿþýÿÿÿÿÿþÿþÿÿÿÿÿÿÿþýÿÿþýÿÿýýþþþÿÿÿþþÿÿÿÿþüþþûüýÿþÿþÿþþþÿþúýÿýýÿüÿþþý ÿüÿûþÿüÿýüþþùÿÿÿÿÿþüûþýýþýÿýþþùüúýýÿþüýüÿÿþþÿüÿýþùùøÿþÿþÿÿÿøÿüþÿùýûþÿûÿûþùüÿûþúþþþûþÿýþýÿýýýþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþÿþþÿýÿþþþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþþÿüÿþýþÿþþÿÿþÿÿþþþþþüÿüüüûÿüÿýýüþüÿÿÿÿýÿþÿýýÿúýÿÿþüþþÿÿýûÿþûþûþûýûýÿùýüÿÿÿýÿþÿüýýþûýýÿûÿûÿüÿÿüÿùþûþúüýþýþþþÿÿÿÿþÿþþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿþÿÿÿþÿÿÿþþÿÿÿÿÿÿÿüÿÿþþÿÿþÿÿÿÿÿþþþþÿþÿÿÿýþÿÿÿýþþþÿüÿüÿûüÿýüþþÿÿÿýÿÿÿþÿÿÿýûÿÿýýþüþýþûûüþüþûùûøýøûúýÿùûþÿýÿþÿøûÿýÿÿýýÿýÿûÿþüÿüþÿúÿúûýûÿûþüþÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþÿÿÿþÿÿüýÿÿÿÿÿÿþüüÿÿÿÿÿÿþÿþþþüÿýúùþÿûÿûýúýúýøü÷üöúùüþúýþÿþÿöúýýþÿüþÿýþÿüþüþûþøûþüÿüþÿþþÿÿÿÿþÿÿÿþÿþÿÿÿÿþÿýÿÿÿÿþÿýÿÿÿÿþþÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþþÿýÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿýÿþÿÿÿÿþÿÿþÿÿþÿÿÿÿþÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿýþþÿÿÿüÿÿÿþþÿÿþÿÿÿÿþÿýýÿÿþûÿüúÿÿüÿûþ÷ûøýÿ÷ü÷ûõøøûùýÿýþÿøúÿûÿüþþþÿÿÿÿüþüùýÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþþýþÿþÿÿþýþúÿþþÿûÿþÿÿþÿÿÿÿÿýþþúÿÿÿÿþýþþüùÿþøý÷úøüöûõúþöúþ÷ýÿýþùüüûþÿþþÿþýÿüÿýÿÿþþÿÿÿÿÿÿÿþÿÿÿÿþÿþÿÿþÿþÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþýÿÿýÿÿÿÿþÿÿþÿÿþþÿÿÿÿÿÿþÿÿÿþÿÿþÿþÿÿÿþÿÿþÿÿþÿÿþÿÿýÿþþÿÿþýýüøüÿýÿÿÿþÿÿÿþÿÿýÿÿÿÿþúüûýþþþÿþþÿÿþþÿþþüüûùþþøýøþùüÿ÷ûþøûÿóýýýþýüüÿûÿÿýþÿþÿÿÿýþýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþÿþÿÿüÿÿûÿÿþþþÿÿþÿþÿÿþþÿþÿÿÿÿþýýÿþýýÿþýÿþÿþÿþþýÿþÿýþýÿüÿüÿýûÿüþÿûýúúüüÿýþûÿÿûþÿÿûÿþÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþÿÿþÿÿÿÿÿÿüÿþÿþÿüÿþÿÿÿÿýþþþþþþþÿÿÿýýýþþþþýýýýýÿÿÿÿþÿþþþþþþþÿýýÿýýýÿÿÿýÿþþÿÿþÿÿüýýüþþýÿýýýýÿþÿÿÿÿþþþþÿÿüþþþþÿÿÿÿýÿýÿþýþþûüýýýýÿþÿÿÿÿÿþýüÿþÿÿÿÿÿþÿþÿÿþüþþÿüúýýþÿÿþÿýýþÿþÿýüÿýýúøþÿþúüûÿý þýüýÿþýÿýþúÿþÿÿÿÿþÿýþþûÿÿÿþÿÿÿÿÿýÿÿþýûüùþúûû ýüúýúùüúÿÿýüÿþþÿûüüÿÿõþþþÿÿüþûþýüÿþþÿÿÿþÿÿþÿÿþÿÿÿÿþÿÿÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿþÿÿÿÿÿÿÿþýÿþþÿÿþÿÿÿÿýÿþÿÿÿÿÿÿÿþüÿûÿýÿÿýûÿûÿþþýÿþÿþÿÿÿÿÿûýÿþÿÿÿÿþþþýþþÿÿþÿþÿÿÿÿÿþþþþþþÿÿþÿþÿþÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿþÿÿÿÿÿþÿÿÿÿýÿÿÿÿþÿÿÿÿÿþÿÿÿÿþþÿÿÿÿÿÿÿÿþüÿÿÿÿýÿÿÿþÿ ‹¹ IDATÿÿÿÿÿþÿÿÿþùþÿÿÿÿÿÿÿÿÿÿÿüúþþýÿþþÿüÿþüÿÿÿÿÿøøþþÿýýÿÿÿÿþþþÿÿþýþüþþÿþÿÿÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþþþþþþÿÿÿÿÿÿÿÿÿÿþþÿÿÿþþÿþþþþþþýþþþþþÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿþþþÿÿÿÿþÿþÿÿÿýúÿþûþüÿþüÿÿÿþýþÿþÿüÿÿùÿÿýþüÿýüÿûþýÿûÿþÿþþüüýüþÿÿÿÿÿÿÿÿÿÿüÿÿÿÿþÿþÿþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþýýýÿÿÿÿÿÿÿþþþÿÿþþÿþþþýþþÿþþþÿÿÿýÿþÿÿÿýÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþýþþþýÿÿþÿÿÿÿýÿÿÿþúûüüÿÿþÿÿÿÿÿÿÿÿüÿÿýýøýþüþÿÿÿýÿþÿÿÿþüöþýùüôÿýÿýþþÿþþüüûþþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþþþþþþþÿÿÿÿÿþþþþþÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿþýþþÿÿÿþÿÿþÿÿýþÿÿûýÿÿþÿþþþÿÿþÿþÿÿÿþÿÿÿÿýþÿþÿÿýþÿûúÿÿÿ ýýþÿýüÿýþþÿÿýÿþ úÿþÿþýýýûüýþùþ÷ýúýýÿÿÿÿþþþþþþþüüüþþþÿÿÿÿÿÿþþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿþÿÿÿÿÿÿÿÿþÿÿþÿÿþþþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿýÿþÿþÿÿþÿþÿÿÿÿÿÿþþýÿþþÿþþÿÿÿÿÿÿÿþÿÿþÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿþþÿþþþÿüÿþúÿþþþÿùÿþÿÿüþþþýþÿúöýþýýÿÿýÿþÿþÿýÿÿ÷úþûÿüøýùüûý÷úûüüÿöþõûùü÷ûÿúÿÿÿÿþþÿýþþÿúûÿûþüÿþÿþÿþÿÿýþþÿÿÿÿþÿÿÿÿÿÿþþÿÿÿþÿÿÿÿþÿÿýÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿýÿþÿþÿÿþÿÿÿþÿÿþÿþþþüüÿþÿþÿÿýÿÿÿÿþÿÿÿÿÿþþþÿÿÿÿÿÿÿþþÿÿþÿþÿÿÿÿþÿýÿüÿþÿþÿýþÿüÿÿþþþÿúúÿÿþþüþþüþþÿÿÿÿÿýûüûÿüþÿûÿÿÿüÿûÿýÿýþÿÿÿÿ úûþ úýÿúüÿüýñôùûüý÷ü þÿú ùþÿüÿþóùþþÿÿÿÿÿþÿÿþÿ&:O  éìêþüÿÿþÿÿúûùüýüÿþþýýþùúøÿþþÿÿüüþúûýùøú÷ûýûòòñýþü ýû÷ÿþÿÿýüþþ ýùüÿøþúüøûúöÿýþÿÿüÿþýÿþÿù÷÷ûúû÷ö÷þÿÿÿÿýÿúüýÿþþø÷úùúúÿÿüþÿø÷ù÷õ÷ùùúÿ÷ùüþûùûûûüýÿÿþôùûÿþþþúü÷ýÿýü þýýÿúý þÿûýûÿý#"ïîì ý  ,)"ôóîþýü ýüÿþúúüûúÿýúüûûüþýûýþÿûûüýýüö÷ùùûýüþÿýøýûóùîóùëñùòôýñõûñõúñöúûÿüÿõöúüüýþø÷÷ þÿúöüøþþþÿþûþ ÿ úýú øüÿúþûû    þø  üþÿÿó þûùýÿþþüûþýü þüýþÿÿûûúý  ÿ þüýúýýúÿÿÿÿýÿúýúüýúüüûýùüÿýÿþÿÿýþùûùððîúú÷ÿýþùøöóóóòòÿþÿþúûûöûýúúøûøÿÿÿýÿÿÿ îò÷ ùúûü ùúüÿÿÿÿÿúøøûüúÿÿÿþÿÿÿýþÿþýÿþþýýùýþüûüûþüúüþþÿúüýÿÿû÷öøüÿþûûüûü øüþýúü ûýþþùýÿýøúü ýÿýúûÿÿÿøþÿÿÿþ þýùüùýýþýþ##  ÿýþÿüúúþÿýýþþþ þþþþÿüüûÿþùú÷þþÿýýûúÿüúûþùúþþþýýýýÿÿÿýýþþÿüÿûûøûõþúñïîþþ úþþÿùúÿÿûþüÿùþû üúþÿþûþýþûþúöý úøù÷ ðù÷ þÿ êûòøöÿöüúþÿöþúý÷øúýþÿþÿÿÿþýü ïíìþ !àáßþþ íñöÿÿþýþÿûûûÿÿù÷÷þþýþ þÿúúö ýýý ÿþûûûÿÿýùùøóôòâäãôôñ øöúÿÿþôòóñðî  ÿÿýýü ÿÿôøûüýúúúýýþöûý÷ýúÿÿþÿüÿÿÿýþÿþýúù÷ýÿÿÿÿûþýþùúþûüýüþÿýÿÿÿüýüþþýûûúÿÿþÿüþþúýýýüûúýúÿÿÿûúûùÿÿ üúøùüýþýûÿûþþÿüüü  ôõÿú÷ö  '"ùóñï ûýÿÿÿþÿþÿþþþûüû ôõòÿþþþýþþþýüýÿÿö÷ûÿûüúûø÷ýýüûÿüüûýýýþþþÿüöýýÿüÿøÿôüþüÿúýý þùüþüýøýûþùüôÿöúÿÿÿ÷ûþÿýüþûþüûúþþÿ ýó úÿ÷ý  òñøøú ýìîñðôòûÿøþÿ öûüÿýýýþþÿý óñîü÷ûöûøóóïëúþý èùòÿùúùøùóÿþÿö÷òúúù üôòñ ÿæææýùûý÷÷õñòîòòïêêêõöô÷÷÷÷öûþõõõòñðîîìøùù ! þ úþýþÿ üûûùÿóöû îûåîæòíðùø÷þüü  ûüýøùøôðì ýûúýüúÿüÿÿþþýüúûúûýþýþþøüüúûüûüüûýÿÿÿýÿýþùþýÿýýÿÿûýþþÿúþüÿüûüøúúìîïþÿÿþÿ øüþü ÷úùÿýþýþúüûüûýûû÷ýýûþþüõùïü ! ûþòïþ÷ëíòÿÿýýÿýýûúÿÿþþÿ ù÷öýûüüüüùùøúúùüýüÿùöùÿÿÿùù÷ø÷õþÿýüþþüÿùùøýýýüüü  ÿþ îô÷ûþüíöúþ üöýüúýþüû  ÿ þ÷üýõúþëýþö÷þöùÿþÿûûû  ýýüùýþó ðõø þüþÿ øÿýáâü Ûâîúïöüüüûýüüÿÿ ññîýü ûöðòðÝÛùêçåýÿúõóîê ÿÿþüüûüøöôõóíýÿÿ ÿ õöðüùùýûÿþþ÷ÿþôññÿ  þþÿðíçþþìôõøùùîîíîïëõõòõø÷ûþýô÷ö÷÷ùþýüûüýùóõýäãùûù     úüþûüüîôûÉÅøÁÆäçê* CA?ããâßÞÞ " #" ûöûüüåæåÞßÞ))('!þþþÿþþþüüþüÿÿ÷õóö÷÷öõöÿøúûûýõ÷ùúûû üúûûûüúûýûüýþþÿþþ ýøüþüüüþýóûðôóäçæúþý  ùÿ ðúûúÿþýøþýûþøþÿÿüþüøúøöòñï ýÿùû(# õóøúõöùýþýÿýýþþþøùõ ÿþü ÿþüÿýææåêçèùûøûöúôôôúúùþÿýÿÿýþýù÷õööõýþþüûþþýùùùýýýúúú ùþüÿþþ éðòýýïøúüúööôõ÷öôþüü    üøúýýøùýòúñüôú÷úÿþýÿÿúú ùó÷óõõû÷ÿúý ýþ  ùÿ õùû   ëòúñú÷ìíðûîóò ý ýúüüüúúûþÿûýÿý  òñíìëçøõ ù÷òòðóñíóóõÿ üÿõóíÿÿþþýýôõñóôðÿþýûøøõüúùûüþþýþúþþöôôêû/,(ùùú óóõ óóöïïíðòòíîìóóðúúøüþýø˜ÖT) IDATøù ÷þýõõõâääðõò     ùýþÚãßÉÒÙÞéðÿ ÏØÞøÿøøøÚÙØ ÝäêÚâçÿûûüüÞÞߨÚÙæðøÿ! þþüÿøûÿ÷üÿõúûóõð ðôôþÿûüýìòøññòüüþ üÿþúþÿúþþïó÷ú üüûùûúõ÷ùæíìúýþåë  ùÿîèçþÿÿúþþùøøóúúôïîýû ôøóûüùýù  ý úûûú÷öýýüøøõÿÿúýÿÿ ùüý èçå ééçôôóôôôøù÷óóóõõóýýý  þþþúøù÷úùþþþþüüùúøûûúýýþûûúúýüúýüÿúûþ%ÞÚÔûúü ïïôóòòöôõõõõýûüóüÿ ùõîþúúõùôþôýÿÿÿ÷ûüüýûý$éâäñðöùÿøûø øüÿùüþöáåïîòúíòó äðåçêêùû  þóøóúöî þ÷üúúûúþøÿùÿïùþ ðïëééæöôñýûøþýùùù÷þþÿÿùöôøóóÿþúõóòûÿýü úø÷ûùøôôúüüûþþýüûþ÷õýþýúùøïòûðòðïòîââåùüùèëéëîëïïïôôóÿÿýýþûÿþþýÿþÿÿ ù÷÷ô÷ôöúùüüû  èô ò÷ùÒÙÝÚáäôúÿÛäéßæé òùþïöòìó÷Úâç ûüüâëæèçëììïúÒGB ûýû÷üòøüóûþèðóßßßøû÷ü×ÛÝúüûÿãæìëêìýÿ%&&þÿ  êîî âêìæîöúþúþ÷üþñöùûÿ ôðñòööùÿ òúõÿÿúþýùù÷ôþüùõô÷ùèüýòüþþüðìüû íìîíééâçðÿúúöõöñ÷÷÷úû÷üýùúøõþ÷õóíïêâãßâäáêíêöö÷þÿü÷ø÷ðóðûûûüÿþ ÿÿûýüþþþýýÿýýüûûùýýüýýýþþýûûÿýýü÷÷ øýýúßÝãìðøíñùðòòòóô÷ùøûúþüüïöõ ÿþü÷ûéöùõøýÿÿÿöøùþûþ ÿóûïöÿøû ûûõüêòùüôï ý ÞìçÛÜåíòî ! àéðÙãéùù òöýüäèçùôñ  þõüüûþöþ÷ÿõûüü ýþúÙØÛéèæûÿþ ûûööóóõ÷÷øøÿÿþþþýþþýøùûþþþýûûüüüÿýüÿÿÿýþþçëéöâååÕØÕ äçãóôöóôðûûû ýÿüüúþþþÿÿÿþþþüþþþüýþÿúüûûüúþþþÿþüÿþüíððéëéæâ îòóÈËÏèêî öùúëøõ úüþíèëÿÿýûýüõ÷êîðúüûèñöôõõÚâç FAAÿû÷øûöýþòúþñùüöíïÙÜáÐÐÒéïôÎÎÎúúúïîòççèÿÿþéìíûý îóò ïóñßåê  ù÷ùùþù íñññøöý   üôüÿýøûúôþýüýöõüëëëÿýüñîöõôèäæäâãÜàæóõôòñîôôôýýýöýûþþýÿøôñðüéêèÿÜÝÙöôöûûüþÿüúúøûûûýûûýüúýýþûÿüþûþþÿþÿþýüüþÿÿÿýü þÿýûûü ;=B÷ùÁÔÔÕïððýþÿöùøüýýïðõßèí þþùýÿçíòõøü÷øù ÿüþÿ øýàèíëîóþüùÿêóñëðô% #!ÿ èõûÙäìÍØßðóî ûûàèñçíöñ îî÷ûúæêçú  ÿúýõýõðÿõöü ññößÝØòòñûûù  ÷úùý÷øùúúü ÷öøøýùùú  ôùúùÿþÿÿýÿþüüêìëÙÚÛ77ìîíÜÞßîðîòöõÿþüÿýüøÿýúÿÿÿþÿÿù÷õÿùùýýüúüþýüüûõ÷õô÷öùèúéèéîîîùùõÿ øúûÿ ýüûúúú÷÷õÿÿÿúüÿÿïóôüýüÿÝãå¼ÃÆLA; çïô¾ÈÐçïóùùôóôñ×ßáêôö  æææòòòøôõöõöÿÇÇÇ øàâ íòï,*&ìðð îØÝÜÏ×áúõö  ìÓØûý ûÿßäåøÿ öÿþúîíçööõþýøÿÿýûúôüóòðöõÓÐÒýÛÛÜÜÜÝìð÷í÷ðñîíÿüúÿõõôæ÷òþýüÿüÿÐûîñîèéåääâþþÿ øú÷ýÿýýÿüúüøìíç  ÿÿýööôüúùüüúôóò ùøøüüüøøøýýýþ ÿÿÿ üúú ôõÐïòõúþþþþüýýþûùûüîùøÕàâêðð ùýÿäëùúûþúýü÷ù Ûààïöõðêê'ôþæãçêñõÜâî*ñö, ßàáöú×áçäíòþåìóèçêïôùÿúúûðõøÚÛÜó÷ý ûúúùô÷ôï ùõ÷ÿýûþþ ïéä÷þþððééèûúôÿþøþý÷ üýùÿýýþÿûþûÿþþÿÿÿÿÿþýþüûüúÿþÿÿÿÿþÿÿÿÿþüýÿûÿÿòôôìïíÝàßéìêóöó÷ö÷öþü÷ÿýýþþÿþþþÿþþüúýýüþýÿþÿýýýýýýýýýýûÿÿÿýþýüúþóõÿýÿýýüûýýýÿÿÿÿýýüúûûûþüüÿþýÿþúýûûþüüüýÿæè÷ÏÒÔ  ûþÿÙàæÈÎÏíöûûùùøêðóúððïúùú üýúùûûùúøåäã õþùüûííë÷øõ ÛßÝïö÷åççùùøêêêüüþûþûûüþïóôüõùØàßïóôùýùøýî÷öòùø÷ùøòþþüÿüûüúù÷öúÿû ôóòÝÝÞáââðòðûüúýûüøþþþÿýúùúû÷øúøýüüÿüõõóðýûûööôúúüûûûúû úúúùú÷úúøÿúýøþúÿýööôýûùÿþþþýûüöþÿùùøøÿûþÿþüþöþûüüþûúéêé««®èæáùüýþü éêèþýÿÿÿÿöýúüùûþ÷ëîüÿûüûüýýÿÿúÿúúÿûúíàöüöõññíæìïñøúü×ÛÞÏéìç÷øþêíîûÿÿÿÿêíïÿðõúüÿüüúüùøÿùÿÿüùüñóòãççôú÷÷ óù÷áëßéèïúÿáìììøõòûüúÿþûý÷õñûùþùþùýýþÿÿþÿÿÿÿüýýýúùùöýýüÿÿþüÿÿýþýûûþýíðìúýûöö÷ðóðüûüüûûþøÿþÿûþþþûúùýýýÿÿýþÿþþþûýýþþþþþþüúú÷ôòûø÷ýùùùüüüÿüþýþýûüüüþýûûúÿûýýýýüþíüÇÉËöóðûþþÝäéÐØßûýÿüþýøøøúüüüúúýýýÿÿÿýööúùøÿÿÿÿðóò ôõöôäéêåæéäßàà áÜÝß÷ï÷úùòíýüøúúøüùùÿíìïÚòóùûßçãìîí÷ûþ÷öüóôýþïðïêüüúôóñþþüüýúõõ÷øÿðöþÒÔóùòìïíìîùþý ÿùû÷÷õüýøÿýüþüûöööøöõúúøõöðùúôúù÷úûõþûúòõðõôùò÷ ýýûùûùøýùúúúþþøùõýúùûüÿûüùþüûüúúúþÿüþÿþþüþôúÿý÷ÿþïýôøù÷øúþÿ ýûûûöõÿùûýùúö÷ýþûûúÿüüüþÿÿ þýÿÿÿíòòþþûôðôøùîôÿúÿÚÜ×þõòóñ÷øþêéñ ÿëèç ó÷üÿÿüùüöýùõþþòøúúøõ  úïóùÜâæìúüÿüùôòôó÷øøþÿ÷÷ñÿðïë üùÿüÿüýþúþúúþÿûûûûýýùÿþÿüÿÿýýúüüúÿþøÿùùùóóñýýþ÷÷óöööþõþýýÿÿÿýýÿÿùùùýýýÿýüüüÿÿÿÿýÿþþýÿùøöüøôõñþüüûýüÿÿÿüûûþüýýýþýüüøþýþþûýüþ ßàëñïé óúýòöú õõöþööõýüúþýûú÷óýúûþþþüýúøýýüÿþÿûòõóóü÷÷ôìñòëêêê íïñÿ÷ö÷ÿöñÿûðíòÿù÷ÿüýÚר ÿýóøóòòïõúüöðøíþùï÷øôÿþýõôñþýüþýûùùúÿöþþùþöðûöòêûù÷ý ùùö÷ùþýüÿüüùúøøôöùùø÷øùõôõÿÿüüûûúòòõþþþüüù üüüù÷÷ùû÷ÿþúú÷üûùüÿÿÿüýúúÿûûûþýþþþÿÿÿüÿÿûýþþüÿýýùÿþíûóô  êíêñøþÿóöòüþûüüûýûûýöùúúýýõûñþþýüýýÿÿýþþþÿ÷ûúûòû÷óðúôüûýþþùùðÛÛøüüüöøü÷÷û þõôòüôúþÿÿÿûóýùõüññòüùöûöö  úçíó÷ùó÷ú÷ýýêèñøúüüýüðïëúúõóîè üøÿýüûüýüúþþÿûúþþý üüöÿýÿÿÿþþüûýþþøüþùÿþû÷ûýüûùöøþüüýÿýþüøôþûöþþÿÿÿÿþþýÿþþüûøüüüþüüùýþÿÿÿþÿýýÿ÷ñýûöòôÿûüýÿüúùþþþþüÿÿþüþÿþÿÿüüÿýÿÿù÷òéùóéë  þøýÿþþÿýø÷ôÿÿýþûÿüûüûù÷þýþÿþþþÿþÿýûýûú ýýýùþùöñøúùøïõõõòøûûûûþþüÿ÷ìê÷úúõùüýûþäÞöýþõùö÷úú÷ýúüõïÿüþööôþýûÿþþýýýýøöòúýþüçøïÿýùÿö ýûúÿýýýýýýýüúúùúø÷þýúû÷ þýûþþýøûùûûúþýþþýþûþøýûþÿÿÿýþüûûýûþúüþüýûýþýøøüÿýþþÿÿùþùýþûüúþõùôÿûüùûöýþüüýúüüûÿþûÿûÿþÿÿöýþúÿþþüõøûÿþÿüûüüÿþÿýþýþþýóùüúüûÿüõóùþþÿöïíûùúûýþþø÷ÿýûüöôøúþÿÿüúýúüûõöüòñõýûúÿüü õûýôôóüþÿüüøûóôöþÿÿÿïïìôõøõî ûøþþýÿþÿüüþüüüþþþÿÿÿÿøúûüúûûþþýþüûüüùþÿüþýüöýùöüüüüüýÿùÿûýýøýÿþþüþþþýýÿþþÿüùÿüüÿþþþýÿÿþþÿÿüÿþÿÿÿÿüöùþúøÿüûþú÷þüûûÿÿüüþþúøÿÿÿÿþÿÿþÿþÿÿÿþú÷ñÿüúþýþùüýõõñ ýýýþüüø÷ÿúÿþÿûüýþÿýüýÿþÿþûÿýÿýøüøûúôüùýþþúþýüþúùõøòôóï  ø÷øüúûóÿüûúüþûþöóÿÿÿÿþýüøýþüÿþÿýþþøûüúþ üþøÿþøÿú÷úùÿÿÿÿþÿÿÿÿþûýûûúýþûÿýüþýüÿÿþþþýýþüúúúÿùúúùüýÿÿÿýÿþüýýüýÿþþÿÿþÿýüÿÿÿþþþüüüþþþÿýÿÿúþòôóòúöñóêüÿÿÿûüþýÿþøüõùÿúúýþûÿýûûüþÿþþÿýÿþÿÿýùúøþþÿþþûþüöþþþü÷óÿÿúùþÿýüÿÿýüüýøûý÷ûûüúýþþúþÿöññþþÿúÿýùüþúûùõÿúùöûüúþùþüþÿÿÿÿþÿøýÿþÿþþþýþýøöõýþÿþýùüÿÿþýûúþüýûÿþûùú÷òûûüÿÿýùýüøþþýþýÿøúýÿÿÿýüÿþÿþþýþýÿÿÿþÿÿþÿþþÿÿÿþûþÿÿþÿÿþþøýþûüÿýüüþÿÿÿýýýÿþÿýúÿÿÿ ÿÿýøþþýüûùüüøüûûÿÿþûûýÿùýüÿþÿýÿÿÿþÿþþüþüùõòþÿüøúúûÿùøÿúÿýûþþÿÿüûþþþõ÷óýÿýýüûþþüþýþýþýüþÿþþüþþûôþüýõ÷÷ÿÿùþþüþûûüþÿþþýÿûúüüüûÿþüüÿýþüÿþþýþýþþúüúúüúÿüÿþýþÿýÿþþüûþýþýþýþÿÿüüüüüýþüþþþþýÿðùôþ÷üüïðúøøóúöýÿúûüÿþüúþûÿÿþüýûÿüüþþÿÿýýþþøõÿþþþþûÿþøþüþÿÿüøÿÿü÷ýþþû÷ýüúþÿþþüúüý ÿúüúýÿýùýÿÿþÿÿþÿýþþÿÿüúöþþÿýüüùöþýÿþþûúþýýÿÿ÷ùøûùúÿÿÿþýûûûýþþÿþýÿÿÿþþýþþþÿÿþÿÿÿÿÿÿþýÿÿþÿÿþþ ÿýþüýúýÿÿþþþÿýýÿþÿýÿÿÿþÿÿÿ öøøýÿüþÿ øø÷þýûþû ú÷öþÿøõúÿþüøù÷ýùúûÿþþùùþùÿüþúûÿÿúùþùÿûø÷öÿþýþÿÿÿüþüýýüÿüùþÿûÿôöþÿÿýþüùúþþÿÿþüýüúùýýýÿýÿþùûúÿþþþÿÿþüýûûûþþþýüüÿÿýÿÿþþüÿýûûüýýüþþþþþûûø÷ûÿÿ ÷õö  ðïêÿüýþÿþÿþþýÿûûÿþÿþþýØÙ IDATûþÿþýÿüüþýþþýÿýþÿùúûþÿôõøÿúýüüýüüÿýùÿýÿý  úþüúüûþýüÿþ ûûüÿôõõþÿýþùùþþþýùù þùùÿûûüùùýþÿúûûûýýþøùüý ÿúöúüûü üúüþúüýúûýüýþþÿÿÿÿýþÿÿûûûþþý þýøøøþ öôõûüý  ÿ þÿ  üûÿ  þþýùùýþÿ   øùú üüû ÿý ù÷ùýûÿÿ ÿ ú÷úù÷÷ÿýûÿúúú÷ÿýýÿÿüúüøööûúú ýûý úúüúùÿýüùýøÿ ûüþûüÿÿÿüýúõö ÿþþüúýÿüü þþûýýúýÿüýÿý÷øÿýý ýÿÿþÿ   ûûÿùûþ üõù ùøøðî ü÷ûþ üýúûýúúý þüú÷üûýüÿúýýþþþýÿýüûý ýýøûûýýÿûÿý   þýýüÿùüþÿ ÿü  þ  þýÿþôôóþÿûúý úýýþýýýüÿ  ú÷ù+Ô~üûþÿÿþþÿÿþþúýûýþþýýÿþþýþýýýþýþþþÿÿÿÿþþûüþùþúûÿþÿÿûüÿþþþüüüùùøÿþ ùüüëîïÿ ÿþþøùù úúû õõö÷÷÷ýýýõöõþýþõõýüü ÿÿÿøøøýù÷ êêê ùùùûûûÿÿþýÿÿÿÿþýþüÿþþþÿûüÿÿ ÷þÿýýùûüÿÿÿÿþÿÿ þûÿûüÿþÿÿÿþÿþþþÿþÿÿýÿþþÿÿÿþÿÿ ÿüÿÿý   ý ðùü ýòüôÿþùùûÿÿÿûÿÿþÿÿÿÿþþþÿÿÿÿþýþÿþýÿûüüþýþþýþþýýûÿÿÿÿÿýþýýüþþýýÿüüÿüûýýýýýúüÿýúûøúüþÿþúüýýþþüÿÿüýþþþþýÿýüþýüþþýÿÿþÿýþüûûýùûúÿÿþüÿþùùùÿÿÿùùùùùøÿÿ ÿÿóûóÿÿóõ÷ÿôöøþýýøûý óô÷õõõüÿþ õ%ÿÿÿþúþýÿýýüþ ÷÷÷ þþþ ýøüü ìðñ  þþþþþþüüüüüüÿýÿÿýþÿÿûüüýÿ ýýÿú üüûüýúúúüþþÿ ýýÿùüùÿÿÿÿÿÿüþÿÿÿÿÿÿýþþþÿýýÿÿÿýüûÿþÿÿÿÿüÿùúûÿþÿÿÿ ÿþÿüÿ þóüýþÿÿÿÿÿÿÿÿþüýþþýüþþþüÿÿûþüÿûýþþþÿûüÿÿþÿüþÿþþýÿÿþþÿýÿþúûúÿüþÿùûüüþüûüýýýûüüþþþþþûûûøûþÿþÿþÿÿþÿþüüÿÿÿÿÿÿýýýþþþÿÿÿÿÿÿÿÿÿÿýþþúÿýþþþþþþþþþþþþýýýúúúüüüýýý üüüÿÿÿ ûûüÐÑÓüþþ øùûÿþôö÷úüýêèìøùøüûüûùüþüÿÿÿüüü þþþýýýòòòüüüüüüÿ óóó  úúúþþþ ööö üüýøúûûûü ùúúÿÿÿÿüÿÿûÿÿÿÿÿÿþÿýýýÿýýýýüúûûûþþþþþýÿûùúÿüúüüûùøø÷ þýüüûÿýü÷ù÷ÿþÿÿþÿÿýýÿÿÿÿýþýþþüÿýüùùúÿýýýûÿþÿÿÿûüúÿþûÿýÿþÿýÿþüÿÿþÿþÿþÿýýþüüýüýýüüüýýýüüýÿÿüþþýþþþûÿÿÿýüýÿþÿÿþÿÿýýþþÿÿþþýÿþÿûúýüüÿÿÿþÿýûúüýüùùùù÷öúüüþþþýþþ÷øúÿûûü òõôöøùøúüøûüýÿûýþ êèèÿüÿ  ÿþþúûûýýûýýýûûûÿÿÿùýý öêì ÿûþ ÷ö÷ýýýûûý þþþþýýÿ þþþúúúùüýÿþþÿÿÿÿÿÿþÿþþüûûÿýýùúøÿýûùúýýÿþÿþÿþÿÿÿþüÿûÿÿýûýþýþüþþþøøøýþ  þþÿþýþýþÿþýÿþüýüúýþýÿþÿÿÿþþÿÿþÿÿûþÿþÿüþþýÿÿÿÿÿÿÿÿüþÿþÿýþÿÿÿþýþÿþþþþÿþÿûüþÿþÿÿÿÿûûýýû÷øù÷÷÷þþþýýýÿÿÿÿÿÿþþþüüüþÿÿÿýýúúú üüüðþÿÿþýþþý  ûüý ôöíîíùüýö÷÷ôöøþþþúúõôò úúúûûû ôôôüûü  þþþúúúÿÿþù üÿþóôóüûû úüýýýÿ÷øÿýýýþþýýýþÿþÿÿýþÿþýÿýÿÿýþýýýþþþþÿþÿÿýÿýÿýÿÿÿþþþÿÿüûüýþõõõ  öùúÿþþ ÿþûýýüþûþüþþÿþÿþÿþúüþÿþþÿÿþ úÿýüûûüüýþþÿþÿþþÿÿÿÿþÿþþþþö÷øÿþþþþÿùüÿüÿýÿÿþþþÿÿÿþÿÿþþÿüüý  ñññùüýþüýþþþþþþþþþþüüüþýýýýýÿÿÿúúúüüýýýþýýþçèê ûûüÿþòóôìÓÔÞüýþ"%& ùûúðîî÷ûúúýýýÿþÿÿýÿÿüüüüüüõõõüüüþÿ ÿýÿüüü ù÷úüùùøùùýýýüüüÿÿÿõõõ ûûûúúûþÿ   ýþþõ÷øüøú üþòôôôöÿÿÿÿþÿÿýÿþõôöûøüÿûüüýÿúÿýýþþþýýýýýýÿýüüüüÿÿþÿÿþÿþÿþþýùùù ÿýýþÿþþÿÿÿþþýÿÿûûýúúÿþþ þÿûüüÿÿÿÿÿþýÿúüûüýûÿúúüþþþýüüüÿÿÿÿøúÿýÿüýÿý õøùþüüÿÿÿÿÿÿüýÿÿûúùøùú÷ýýýûýýýýùÿÿÿÿÿÿÿÿÿÿÿÿúûû ýùùùÿÿÿúúúððð ÿÿþþÿüüýûûüûûþÿûûû öõòòõüûþÛÜÜ ÷øøòðîööö÷÷÷ýýýÿÿÿüüþÿðððìììýýþýúûúúûüüü   ñõþøøøøüüüúúúþþþüüü ûûûÿÿ ýÿþýÿÿ üüþùúúÿÿþþþþýýÿþ ÿþöý÷üýÿýþÿÿýýÿýýýÿÿÿÿÿÿÿþüüüÿÿÿÿÿÿþþÿþþþüüü þÿøýüýýü üüø÷ÿÿþÿþýùù÷ÿýÿþÿûúÿþþÿýÿý ÷øúüýþþÿÿþÿÿÿÿÿÿþýýýûþüþýúÿþýýÿÿÿÿÿ ùùÿþÿôþþþþûþ  þþÿýýÿüÿÿøøùþþúûüþÿþÿüýþûüýÿÿþüýüüüÿýþüÿ ö÷øýþþùùúüûùÿþÿýüýüûüþýþùøùþýþÿüþþþÿ     ñòòûüü øøøðððùùù úúú     ýýýðððÿÿÿüøû  ÿÿÿþþÿþÿýýþ ôóõ üûý úúûý öö÷÷øùþýý  óóóóòô øøø üüýÿÿÿóóó øøùù÷ú  þÿýÿýýþûüýÿþýþüüýÿ÷öõþþþÿþ ýüû(%$ üûù÷öõþþý  ýüü úùùÿþÿÿþþþýüü ÿ  ýÿüÿûýÿÿÿ ÷ööþýþ óõöûüýÿÿÿÿúúûø÷øÿþþÿüüýøúúÿÿýýýýþýÿþþþþýýýõõöùûü üýÿíì÷þþþÿÿÿ     ÷ùùý(''ûüüðððåèæöööÿÿÿñïðüüû    üüüûüüþüýüóó ýýýùùù  ÿþýýíï÷÷÷ÿÿÿ ýýýùùù÷÷÷üûûýýýÿÿÿÿþþýýøøø ÿÿüüüþþþÿüýýÿ ý  ðòòþþýþÿþþþýþþøúùþÿÿýþþþýýÿÿÿÿýýýùùù üüû üý÷÷÷ þþïïïîëèûø÷  þþûÿþýþý  þÿÿþþÿüúúýüÿÿÿþÿûÿñôõîÿþÿþÿÿÿûûûÿ ýüÿýÿûýüþüüýüüûýýýþÿþýýýýýÿûûüýÿýÿÿÿþþþþÿÿþýýÿîðòøøùÿ úúúþþþýýýþþþúûøþÿüúúüýúóìîî þýõôò ìííüþýûúøññðüøý ÷÷÷ÿÿÿÿüüüþþþ ÿýþúýü þ ðððüüüüüüøøøøøøÿûûûûÂ4g IDATÿþÿúùùùùùþûü  þþþýýýþþþ þþÿüýÿø÷ú ûü óõ÷ýþÿÿÿùûùÿÿùùùøùùöøùûüüýýþþÿýÿþÿþÿýýýûùùÿÿõõÿ ù÷÷ùøöÿýþýûûùüüú ýýüûüýþþÿýüÿÿÿÿÿýþ   öùúþþþÿþüÿôôùÿûýÿýÿýÿÿþýýýüüüýýÿÿ÷÷÷ûüþþþþÿÿÿÿÿÿÿÿþü ÷÷øöööþÿþþþþÿþýÿÿÿýýýýýýöööüüüúúúÿÿÿõõõ ùùø þþøôóüûø àÝÝÖÓÓ  ïðïþýúîìùìëôýûù  ýûôôôýýý ùðððÿÿÿüüüÿþÿþÿýýÿúüúúüüü úúúüüüÿÿÿýýýüüüÿÿÿýýýøøøûûûÿÿÿ  ùùùýýýÿÿÿ  þÿûûüýýý úúúúþþþÿÿÿüþþÿýýþÿÿüüýÿÿÿÿþþþþþþþþþþÿÿûüûüüüùùùýýýüüüüüüÿýýýüüüþþÿþýÿÿø÷÷õôÿüøÿú÷  þüûùöõôþÿüýûúýÿüþýýÿþþûýÿýýûùúýÿýýþþÿÿþÿÿþýÿþÿÿþÿþþþýþüøøùþýþõö÷ÿþþö÷üÿÿýþÿýþýþþþÿÿüýÿüûýþþý þÿÿýþýÿÿýþÿÿÿÿþÿýÿÿÿ ÿÿÿüýþüüþýýüþÿýýýþýýþÿÿÿÿÿ øø÷òòñÿþþý ýüüûçåæçéèôóóëìëûüü ÿÿýú ÿþÿÿùööþûûýýþþþþÿÿÿþÿÿûûúøúøÿÿ ÿÿûûüþþÿùùúø÷øÿÿþýÿÿÿÿþùúúÿÿ ûüûûüüüüÿÿÿ ûûüúúþÿ öôöÿùùûýýýþýýø÷÷ÿÿÿÿÿÿýüýùøùùøù ýþÿúûüüýþüýþûûüþÿ ýýþþþÿþþÿ üúûüüüÿÿþÿþÿûúùÿüýþúûüýÿüýüüøööôòñýÿþþüüúúþÿÿýûüûúüüúüöööýüý ÿþþýüüþùúüúüýþÿöùú÷üþûþüÿþÿúúüôöùíðóêïóøüþûýÿöùüÿýûü  ô÷úÿýÿÿýÿÿüþÿ úüû ýûûÿýýýýýýþþþÿÿÿÿÿÿþþþÿÿþþýüþýÿÿÿýýýÿÿÿýýýþþþûûû ÿÿþ    ûþÿ,)*îôòìììþüûøõõ öôòÿ ûûûÿÿÿþüüýùùùúúúúûûüüü  ûûûýÿüÿüüûøøøÿÿÿûûûÿÿÿÿÿÿþýüÿÿÿÿÿýýüûûûþþþûûûùùüúúûüüüüüýüüüûûûýýþûúû ûýÿÿÿÿþþÿþþþþþþüüüÿüüüûûûþÿÿ ÿÿÿøøøÿÿÿúúúùùøþþþþüüü ýþûøö÷ÿÿýýûÿýþÿÿÿüüüýÿúýþ øø÷ÿúÿîðí ýüú þþýù÷ôûüüüýÿýýÿÿÿÿùÿýûüùùþþøùýúÿÿÿôöùûÿüïûÿþÿþøúýóøüöûýýûøúúøøüýüûùùþüþýýÿÿÿÿÿÿýÿÿÿþþÿÿùøøÿþþÿþþÿÿÿüüýÿÿÿþüüÿÿþÿþÿÿÿÿÿ þüþýüþýý     þúüûúÿÿþÿþñïð  áãâ÷öõ ýýûýüüÿÿþ þþÿÿÿþþþûûûûüüÿþúýúüþüýþýüþüüþþûþþþþùùùþþþ÷÷÷ýýýüüüûûûýþþþýþþüÿþüÿüúøüùúÿûúúùúúüýýýýýüüüùúþùùùþþÿúúùùùùûûÿÿ ùùùõóõúúüùúýûûúüûüþþýüúüúúùüûüÿþýþýýÿÿÿÿÿÿÿÿÿýÿÿüüýþþÿýüþþþûûúüûú ÿüþþòòñøõõûù÷üûùü  ÿüÿÿþýÿ  úùúúúùþýÿöûÿøúûúûþûþþôøùúüþýÿÿÿû÷õ÷úúõøýõøûýüþüúüùøúûûýøþþÿÿÿÿÿÿüýûüýþÿÿýûüýýÿÿÿýýþÿýýþýþýüýÿþþÿþÿÿÿÿùö÷ùùýýúúÿüýüÿ÷÷ö ýüýüþÿþÿÿÿÿõôôóúøýýþ  çèèèëì ÿÿøõõúýýúüûíïï þþÿùúúüþÿüýü ðòòõõöùúúøøùûûûÿÿûûýüýÿüúûú÷øþûüþþþþþþýüüÿýþ÷õöùúøÿÿþþþþþþÿÿûþþþÿþñóñ ùùùÿÿÿþøùÿúúúûûüúúûûûýþþþþýýÿíîïþüÿ÷÷úýýþÿþýýýÿÿþýûüûþþþù ÿüüü÷ú÷  þýøúùúþþþôõ÷üýþÿÿýÿþÿÿüÿ úûúøúÿÿùüýÿÿÿý÷îÿ ÿÿþü ÿÿþþÿüýþýÿüÿþÿúýÿÿþþùþÿùûÿýÿÿþüýýÿÿýýóøøýýúüþÿ ûúýþþýûúø þûüùøþþýûúÿÿþþøùùûÿû0Aýýýûüüûýÿÿÿÿþþýúúûÿÿÿÿþÿÿþþÿþýþýýþþþ üüüûüûýüüýþþþ ÿüý÷÷ø þþþþþýþþþ  ýÿþüþþïððêìëïóñ  óóóÿ ûúùúúûüüýøúùÿùþþþññðèèèúúú úúúúøùúüöôõùùùüüüþüüüöööüýýýýþûûûýýýýÿþûýýøø÷ÿÿÿþýÿÿÿÿùûüúþþÿýýýþþþ ÿÿþõõôÿüýúúûýýýýûýýýóñò   úøø üüûùøøýýú  ðñó÷úýòóôòòñûûøþüü þüûÿÿ þúúúúþüûýüûÿþüüûûÿþýÿùüüüûûýýüþýÿûüþýýüÿúüüøúûúûþýûüþùúüùüþùþ ýþûýüþþþþÿÿ þþþýûÿýÿþüüö ûøúøöúùúýü þÿþÿÿÿûýÿýýÿüýÿþþþþÿúûüýýýüûûÿÿýþþþþÿÿþÿþýýþþÿÿÿþÿþÿø÷õÿÿÿýýýþþýýþüþÿýÿýüÿôüú úúùÿÿÿýýýÿÿÿúùüÿÿÿ""âæç   úüùùúüþüþüÿü ÿþÿüüýûþûÿÿÿýûýþýþ÷÷÷ùõö÷ö÷÷ôõùùùüýüüüüûûûÿÿÿýýýýþÿÿÿÿþþþÿÿÿÿýþýÿÿÿÿÿÿÿþþþþþþþþþþþýýÿüýþûþþþýýÿÿÿýþüüüþþþþýüüüûþÿþûûüûûû ÿÿþþþýüýþþþÿþüþÿüÿýüüûþûûýùÿÿÿþ ÿüþýüû úúúõøøüûû ÿüüüüüÿþüýþÿÿþ ÿýÿýÿÿñöúýýÿýýþüý÷üþüüþùúüùýþÿüþÿûüÿüþúþÿÿÿÿÿÿÿÿþþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿüýÿÿýüÿþýýýÿÿÿÿþÿÿÿþýûùüþýýýýþúþýúúÿÿÿüüüÿýÿýüüýüüþýýþÿÿþþÿþÿÿÿùùùÿüýùþÿýüüüýýýûûû ûÿÿÿöööÿÿÿÿÿÿÿÿÿûûûþ üþýôôôüñýþþýûûûûý ÿþÿÿþýýþûýûúøøûúú þþüýÿýüüÿÿÿüûüÿÿýýüúøø÷÷öþôõùøøúúúþþþýýýüüüýýýùùùýýýþÿþþþþþþþÿÿÿþþÿÿÿÿÿþþÿÿÿÿþþþþýúùÿÿÿýüûøýýýýýüüþþþýÿÿüüüúûûýýýýþþþÿÿÿþ üýüýýùúùøø÷üüùÿþÿþýùûüþÿÿýþÿþÿþ ÿýûüüüþ ÿùýúþþûþòøÿüýþûýüýüûþþÿùøüþþýýÿýþÿ÷ù÷ýþþùûýüþÿÿÿþúÿÿÿÿýþûÿþþÿÿÿþþþþþÿþýþþýÿÿýþûþÿÿûÿÿÿÿûûûýÿþþþþÿþÿÿÿÿÿþüûÿüüÿúûþýýÿÿÿÿÿÿûúúýýýýýýûûûþÿýüüüþþþúúúù÷úÿÿÿõõõÿÿÿþþþýýýÿÿ÷ýþ  ÿýÿüûûûøøùõü þùþÿùûúûûþÿÿÿ üþüúûóùøýúûøøøüúûþÿø÷÷ýúû÷ø÷ÿþþþþþþ ýúúþÿÿýýýøôôÿþüþýþúúüüüùùùþþþÿþþþüýýÿÿÿÿÿþÿÿþÿþÿþþüûûþþþþüûúÿÿÿþþþýýýÿþþùþþþþþýýýÿÿÿþþþþÿÿÿÿÿüüüÿþÿúÿþÿÿþþÿþþÿÿþüüýÿýýýÿþþýÿþýÿýüýýýýýþÿÿÿôøýúùûÿÿþÿþþÿÿóøúûûúþþïüýýþýýÿþþÿýüÿÿÿþþÿÿÿûûûÿÿÿýþýþÿùþÿüøÿÿÿÿþÿþþýÿýýþþþþýþÿÿþþþþÿýýýÿÿýþüüüþÿÿÿÿýþÿÿûúÿÿÿÿøþþÿÿÿÿÿÿÿþÿÿÿþýþýýýýýýýýúúúüüüÿ  úô÷ÿþÿùúø÷÷÷úúø üûûÿûüüüüþ ôôûýýùûûùúþÿþÿÿÿÿþÿÿûýûûûüûûðìíþýüýýýÿÿÿþþþüüüüüüþüÿÿÿÿÿÿÿÿÿýÿÿþÿÿÿýÿþþÿþÿþþÿÿÿÿÿþüûûþüÿÿÿþüüþþþÿÿÿÿþþÿþÿúúûÿÿÿûûüýýÿÿþþýþÿüüüýþüûþþþÿûúùúúúóùøýýþþýÿÿÿþþÿûüþÿþÿýýÿþýþõ÷ùÿ÷úûÿÿþúûûûùùùûûû ÿÿþÿ üüûþþïûÿýÿþýÿÿÿÿÿþÿÿÿüþýþüþÿÿþýýþÿýûüüüþÿýþÿýþýýýÿþþþÿÿÿÿÿÿýýýÿÿÿÿþÿýþ*Üs IDATþûýýýüüüþþþûûûþþþúúúûûûùùùÿÿ  ùëë÷ùøúúúüýûùùùüüûþûûûûýþýýÿ üÿþþÿýþþþþÿÿýýþúûýüüôõö ÿ üüüýúýüüüüýþýýýþþþÿÿþþÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿþüûþþþþþþþþþÿÿÿþþþÿÿÿýýýýÿÿÿþþþÿÿÿÿÿÿÿÿÿüüýÿýüüûÿþýýýþþþýýýùúüúýýÿûûûúùù÷öùþþýþþþþÿÿþøûüùûýüüüþö÷þþþþþÿýþûùþÿúÿûýüûÿÿþÿüþÿÿÿÿÿþþþÿÿÿÿÿýýýýýýüýÿýþûþýÿýýýþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþþþþÿûûûÿÿûûþþþþþþúúúÿÿÿÿÿÿÿÿÿýýýþþþÿÿÿüýúýýÿÿþÿþþþåçæýüüÿöøöþþüüûüýþýüýùûúüÿþ þÿÿý þÿø÷öüüüúúúýýýùýüüÿûÿúúúúûüÿÿÿýýýþþþþþþÿÿÿþþþþýÿÿÿÿþÿÿÿþÿÿÿÿþþþþþþýüÿþþþþþþþþÿþþþþþþþþþÿÿÿþþþÿÿÿþþþÿÿÿüüüúüýÿÿÿýûúþþ÷÷÷ýüüüüûüÿÿÿÿÿþÿüÿþþþúúúÿÿýÿÿÿÿûÿÿÿüþü÷úùûýüûüþþÿþÿþÿÿÿÿýþÿÿýÿýýþüÿýÿÿÿýýýüÿÿÿÿþÿÿþÿÿýÿþýýýþþÿÿÿÿÿÿþþþþþþÿÿÿüüüÿüÿø ÿÿÿÿÿþþþþþþüüüýýýüüüþþþþþþüüüþþþýùúþúüüÿþÿÿÿ  üüüûüùýýýýÿýýýÿÿþþþÿÿÿÿ÷ûûûþÿÿþþþþÿøøøýýýÿÿÿÿÿÿûûûþþþþþþþþþÿÿÿþÿÿÿÿþþÿþþþþþþýþÿÿþýýýÿÿÿÿÿÿþþþþþþþþþýýýÿÿÿüüüþþþýýýüþûÿþþþþüýûüúúÿüÿÿÿúúúþþþþýýþþýýýýþýýÿÿûûûÿÿÿýüüüôöúÿýöÿþÿûúÿÿýýþÿÿýÿÿþûÿþÿþþýþüýýþþÿÿÿþÿÿÿÿþÿýýÿÿÿþþþÿþýÿÿÿÿþþþÿÿÿÿ$4üüüÿýþþÿþûûûýýýÿÿþþþÿþþýÿÿýúüüü÷÷÷üüüþþþþþþþþþþþþýýýýúûÿùüûúýü þýýûôóô õôôüþþùúúö÷öùùú  ýúû õõõüý  øøøûûûõõõïññ  ôôôüüüüüüúùùþÿÿÿýýýÿÿÿôôôøùúÿÿÿÿÿÿÿÿÿüüüÿÿÿýýýþþþûûúÿÿüÿþþýûýüÿÿþÿÿÿþýûÿÿþÿÿÿÿÿÿýýýþþþûûûýýýüüüýýýýýýÿÿÿÿÿÿÿÿÿÿÿýýüþýýþû ûûûúúúùûû òñóùùùÿÿýÿþÿÿþþÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿùøõýüûÿÿÿÿüûþþþÿýÿüüûþþþúûýÿý ùøø÷þûûûööøÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿþþÿþÿýÿÿÿÿÿÿýýÿÿÿýýþþÿþþþÿÿÿýýýÿÿÿÿ ÿÿýÿþþûûùóññ ùûûùùùüúüûøýÿÿøøø üüüýííñìë ÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüýýýýýýþþþþþþþþþÿÿÿþÿÿÿÿÿþþþÿÿøúùýüúÿüûþÿþýÿÿþÿþýýþþÿþÿÿÿÿÿÿÿÿÿþüþÿþþÿûüÿÿÿþÿþÿüÿÿÿÿÿÿÿÿÿþÿþúýÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿþþþýüûþýýýüÿÿÿüýÿÿýÿüûûÿÿÿÿÿüüüþÿÿÿÿþýüýýýþþþþþþÿÿÿÿûÿÿýúûøÿóøö ýýýýýýýýþùöûþÿ÷ööùúúÿÿ  þþþýýý úúúþýý÷õöÿÿþüýþýýþþÿÿÿýýýþþþÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿýÿþÿÿþÿÿþÿÿÿÿÿÿÿüýþýþÿþþþýýýþþþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿþÿÿýÿ þÿþýÿõööÿûúþûÿûýÿÿÿþýýüûþþþýþÿýýýÿÿÿÿÿÿþýþýþýÿþüÿÿÿÿþÿÿúþþþþþþÿûþýÿÿÿýÿ üüýûþÿÿÿüþÿýýÿþÿÿÿÿÿÿÿüýþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþþþþþþþÿÿÿýþýýÿÿÿÿüüúÿüûûÿÿýýüÿýýýÿÿÿþþþþþþúúúÿÿÿþþúüûÿþÿýÿþþýýÿþýþþþùüûÿ úùú ÿ÷õõýÿÿýÿú  ö÷÷ÿýýùùùÿÿÿþüüüúúþþþþþþþþþþþþþÿÿÿýýýþþþûüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿüÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿüüùýüúýýÿýþþýÿýýþúùþüÿþÿþÿýþþýýÿÿþþÿÿÿþýþÿÿÿÿÿÿÿþþÿÿüÿýþýýüýûýýýþüÿÿþþÿýÿÿüÿÿÿÿþÿþÿ þÿÿÿÿÿÿûÿýÿýýýýþÿýýþÿþþýþýüüýýþÿýÿÿþýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿþÿþüþþÿÿþþþû÷òÿÿÿÿþþÿÿþþûûýÿÿþÿÿÿúúúþþþýýýüüüÿýýÿÿÿüÿúûûÿþýýþýýýÿÿÿúúúÿÿýÿÿþýüþ÷þùüûþÿþÿÿùôøøú÷ýþý ðñòùùùöööþþþÿÿþüýþüýþþþþþþþþþþþüüüûûûýýýÿÿÿÿÿÿÿÿÿÿýÿûÿÿÿþÿÿÿÿÿÿÿÿÿÿýýýÿþÿÿüÿÿÿÿÿÿþÿþÿÿÿúûüüüþüúù÷üùùþÿþþÿÿÿÿÿþÿüÿüþÿþÿýÿýÿþýþÿþÿÿüþþýûúúÿüúþþýýþüþÿüÿþÿýÿÿþ ÿÿþþÿþþÿþþþÿÿûýüüüøûÿÿÿþÿüü÷øøýøùýýüþÿþþýüÿüÿÿÿÿÿÿüúøþþþþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿüùöÿþÿþÿÿÿÿÿÿþþþúúúÿÿþýýýüüüùüûÿþÿúýüÿþÿÿþÿÿÿýüü÷÷÷þÿÿÿøùøöùø÷ööüüü øûûûþüþþðñðýþý  ÿþþþõõóóóýýýÿüýþüûþÿþþþþþþþþþÿÿÿüüüÿÿÿÿÿÿÿÿÿýýýþýÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþÿþûÿþþþÿÿÿÿÿÿÿÿÿÿÿüýýÿÿýüüüüÿüüÿÿÿýýúûúûýýùûýûýþÿýÿþÿþÿýüûÿüýýÿýüûÿþÿÿÿÿüþ  þþÿýýÿþýþþÿýüþÿþûüþÿÿÿþýüþþþþÿÿþøøøùüüúÿÿýýþþÿÿþÿÿÿýýýÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿþÿýþþþþþþþþþÿþþýúÿþûÿÿÿÿÿÿÿÿüüüþþþÿþúúúùÿþûúúÿÿþÿÿÿÿ÷ùúÿÿþþÿþþýþÿöüú÷ùøòóóòòòðòñôöõ ýýÿÿ þþþÿÿ þÿÿýýýúþÿþþþþþþþþþÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿúúüûýýþþÿýÿÿÿþÿÿÿÿÿÿÿÿþüüþþþÿÿÿýûûûþþþÿÿþÿþÿýÿþÿÿýýüþþýøúúõ÷ùøùûúþÿúûýýüýÿÿýÿþþýÿÿÿùýýûþÿþüþüûÿþþÿýýüÿþþÿýÿÿÿÿúýüÿÿûüûþüýÿýÿÿþÿÿÿÿÿÿÿÿÿþþþþþþþþþÿÿÿþýýþÿþÿþþþþþþüüÿþÿÿþþÿÿÿþþþûûûûúùÿÿÿýýýÿÿÿÿþÿùþ÷ù÷ûüûÿ ÿÿÿ÷õô ÿÿÿüûýþýýþûüüýþþÿûúû÷÷õññÿÿòôö îóó üý ûûûüûüÿÿÿûûû ýýýþÿýÿþþþþþþþþþþÿÿÿ ÿÿÿÿÿÿÿÿøùùüþøþþþÿþþÿÿÿÿÿÿÿÿýýýüûüþÿÿÿÿÿÿÿÿÿÿÿþûÿ þûúÿûûù  ö÷øÿùûýøþüþüýþÿùùùÿÿ¸Õ(j IDATÿÿÿÿúûûý þûÿûÿÿýüþÿÿÿÿþÿÿÿýýÿûüüþýÿÿüúûÿÿÿÿÿÿÿÿÿýýÿÿþÿÿÿÿÿÿþýþüþÿþýüÿÿþüüûùûÿýÿÿÿúúøýüûýýüüúÿ úúûÿÿÿþþþúüüþþûÿüÿþþÿÿþ  çéîýþÿüýüþþþ ôôôüüü üõ÷þýý  ÿÿîçèûýþ  ÿ ïùûõþúýþÿùþùþüûýüüÿ üüüúýüüüüÿúüü üüþþúúúüýýøøùùûùûûýÿûøøúûüûûúúüüüüüýÿÿÿÿÿýüüýýÿÿÿþÿúýÿÿÿÿÿÿþþýüþÿýÿÿüýþþüúý ÿøüüûüúýøùùþüþ  øú ýýüüÿþþ÷÷ÿþþÿþþþÿÿþ þùùùøø÷þýþ   þýøÿþýÿþÿþþýüÿýýòõûþýþþüÿþþýÿþøþýôüùùùûÿÿÿýþþüþýýÿþ ÿúüýýýýýýýþþÿþþùýúþþþûûû çççþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþþþþþþþÿÿÿÿÿÿÿþÿÿÿ ûÿÿÿþþþþþüùúøÿþþþÿÿÿùùù ÿýüõ÷ô þÿÿÿÿÿÿÿÿýýýÿÿÿüýûÿýþþþþþÿÿÜÜû ÿþýúþÿüúûÿøÿÿýûü þþþüüüúùþÿÿþþþþýýþüüüÿÿýúÿýÿþÿûûûÿÿÿþþþþþþþþþþþþÿÿÿþþÿÿÿÿþÿýÿÿÿÿÿÿþÿþþÿÿþÿÿÿÿþÿÿÿüÿþ  ýþüÿýýþý ÿþûûû ÿùõøýþýþþÿÿþþþÿþþþýÿÿÿýýþýþþþþÿþúýþÿüÿüÿòöô÷üþ÷ùüúûýüýþÿûøúÿÿþþþþýýýüûûÿýÿÿþÿÿþþþýÿþÿÿþþÿÿÿþþÿýÿÿþþÿÿþÿÿÿÿÿÿÿÿÿüüôÿÿÿÿþþþÿÿÿÿþÿÿÿÿþþýúø÷ø ÷÷÷þ ÿýþÿÿÿþÿÿ ÷ûý þÿûüôÿþþüþþùùùþÿýüýþþýýóññ  ÿþþþþýþþþþÿÿýÿÿþúûüüüûþþþÿÿýþþÿõõ÷ÿÿþþýþùþþþýýýþþÿþþþþþþÿÿÿÿÿþýÿÿþþÿüþþýÿÿÿÿÿÿÿÿÿþþþÿþ ÿÿýþýýþþþûûûïðí  ÿþûûÿ ùÿúÿþþþþþþþÿÿÿýýýÿþÿ üýýþÿþüûüýþþýþüÿÿúüûýÿûþûññòúÿúüýýÿüûýý÷øúÿþþÿÿÿÿýþþþÿÿÿþþþÿüüýüüýÿÿÿÿÿÿþþþÿÿÿÿÿÿþþþÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿüþýÿÿþþþÿÿÿÿøúùÿþþþÿÿÿþúøÿþþÿÿÿÿþÿÿÿþÿÿÿÿÿùõóüúìèæ ÿÿÿþþþþþûüýýöõõÿÿÿýúüÿþýýýýþþþþþþüüüüüüþüýüüó÷öüÿÿûþýýüýýýþþþúûûÿÿÿûüü÷÷÷úûûÿÿÿÿÿÿÿþúúúþþþÿÿýþÿüÿüüûýýýÿþþüÿÿþÿýÿÿþþÿýýýÿÿÿÿÿÿÿÿþþÿýýýýÿýýÿÿÿýÿÿüþüþÿÿþÿÿôôôÿÿþùøøÿüûþÿüüÿÿüþþþýþþþÿüüýýþûüþüÿýÿûüüüýúýýþýýþþÿùýûýÿúþüÿüýþþýþþùùùÿÿÿÿÿÿþþÿÿÿÿÿÿÿüüþüüü üüüþýÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÿÿÿþÿÿÿÿýÿÿüýþýþýüüýûûúýöõÿÿÿÿ÷÷÷ÿÿÿÿýüþÿüü  ùõýþýýýþýýþþþþýÿöøûòôöâåå ÿüþ÷õõ ÿþþÿýüþýýýÿÿÿ þïóôúüþýüÿûþýÿÿÿÿÿÿþýýüýûûýýÿÿÿøø÷÷÷õùûúûüÿÿýþÿþÿÿþÿÿÿþþþÿþüÿþÿûûþûÿùÿþüÿÿÿûú÷þÿÿÿÿÿþ ýýÿø÷ýþþþÿÿÿýÿýýýüüýüþþþþÿþÿýÿüüýúüûýÿþÿÿþÿýÿÿóñò÷õúúøùúø ÿþýÿÿýý ýþþýþýÿýýýûûýøúüúýýýüüþÿúûþýýÿþþþýýþþùýýýþûÿüÿþÿþþúúüüýÿÿþÿþÿþÿþÿþýþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿüüüýûýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýþÿûýýÿÿýüûýýýùùùúûù  ûûûñïå ø÷ù ûûýþþüüûýýýüüüüþÿïõúèêëââä úýýÿþþüüúþþþþþýýÿþ ÿÿÿ÷õööúøÿüúý û üÿþÿÿÿþþþøøøúúûúüüøøøûûûúúúûûúÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿýýýúÿÿþÿûÿÿþÿÿþÿþþÿùýýÿþýÿÿþþþûüýýÿÿþÿÿÿÿÿûýýýÿýýýûüüþþÿÿþþþóóôÿÿþÿÿþÿþÿüþþüýýþûþþþûþýþùúþúýÿøûÿûýýüýþÿûýÿþþýþþþþýþüýüÿÿüÿûþþüÿÿúûûýþùúûÿýþþÿûýÿüýýýüüþýýþúþþþþþþÿÿÿþÿþþÿÿþÿþÿþüûþüûþÿÿÿÿÿÿÿÿÿÿþþþÿÿþþÿþþþþþÿÿþþþúúúýýþþþþþþÿÿýÿÿÿýþûÿÿÿÿþþþþÿýýýüûúýÿþ÷÷÷õõõôõòööó  ÿþþþÿÿÿÿÿÿþ þüÿýþùúüüÿþüüýüüýüýýôö÷ëìí÷÷øþþþýþüúúýúùÿÿýÿýÿþÿÿþÿÿýþÿÿÿýüýÿþþüþýûúýþþùøÿÿÿþÿùö÷ øø÷ùüûþþüûûûÿÿÿÿþþÿÿÿþÿýýûùùùÿÿÿÿþùúûúÿÿÿÿÿÿÿ÷øòýþûûþÿÿþÿÿÿÿÿþÿÿþÿûþÿþþýÿþÿùûúýüûÿ ÿÿÿÿÿýøöñýþþÿýýüùûýüþþÿûþþÿÿûþüþôøûüþúýÿýÿ÷üûÿÿüþÿþýþÿýþýýÿþÿþýýÿüüûýÿþÿüûüþþüþýþüþþüýÿüüýûþýúúüüüþþþÿÿþýþÿÿÿýýþÿÿûûüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþúúúþÿÿÿýýýÿÿÿþÿýþûþþÿÿýýþÿÿÿþþþþþþÿÿÿýýüôôúÿþôôôóóóýýýõõó ùúùõûù ýþýýýþþÿðõøÿô÷òòôýýýüÿÿûþþüþÿúüýõøøþÿÿóôó ÿýý÷ûúüþþüýüÿÿýþþ üüüþüýûûüýýÿÿÿùûúùÿýþúúúüüüûûûþþþýûûúÿýÿÿÿþÿþþþÿÿÿþÿüÿÿÿÿÿÿÿÿùùòýúùþ þþÿÿÿþÿÿÿýþþÿÿÿÿþÿÿúûþ þÿÿþþþþþþüñóô÷ýýú ýþúþûùýüÿþþÿûýüÿþþÿüÿûþùüüÿûþÿùýþþÿýÿþÿþÿþþÿþùûûûþÿúûýþþÿÿýý ÿþÿþÿÿþÿÿýýþÿÿþþþþþþýýýûþûÿþÿþÿþþþþþþüüüÿÿÿ $ÿ ÿÿÿýþÿüüþÿýøÿýþþþþþþþ÷÷÷ÿüÿý   üüüúúúþþþÿÿÿþþþÿÿþþúüûúúúûüü âáãØØØõöö!! þüþùûþÿÿþþÿþüÿþýÿÿöñóÿüýýýýþýýýýýþûüþþþÿÿÿÿÿÿûþýþþþýýýûüüþþþ öõöüüýúúúüýþûûûÿÿÿÿÿÿúúúÿóôìþþýýýüþÿýøõì ÿþýýÿþýþÿûÿÿûúúôÿ  óðùöö÷þ þÿýþþÿÿ ýüüüüúþþþõöóùÿÿþþþþüüÿÿüýöùþüüÿþôùòÿÿÿþÿÿÿýþÿÿýÿÿÿþÿþÿþÿõøøÿþÿýýÿÿüýþÿÿÿÿýÿþÿÿÿþþþÿÿÿÿÿÿÿþ÷úýÿþþþÿÿÿÿþýüýÿÿýþÿÿþÿÿþÿÿÿýÿÿþÿþÿÿõÿùþúÿ×ßÜÿÿÿÿÿÿÿÿ$#ýýýúúúõõõÿÿÿÿÿÿÿÿôõùþÿþííìöûùýþþýþüÿþþþþýÿÿÿÿúúúþÿÿÿÿÿþÿýûüþþþþþþþþþÿÿÿþþþþÿþþþþþþþÿÿÿþÿýûûúýþýþþýÿÿÿÿþÿÿþÿÿÿþÿÿÿÿþþÿÿÿþüüüûûýÿÿÿÿÿÿþýýÿþþüþÿÿÿþÿþÿÿÿÿòõøþýüýýûþþþøúýúýÿùüþüþÿÿþÿþþüÿÿýÿüùûÿüýþþûýÿÿÿýÿÿþÿÿÿÿýÿÿÿþýþÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþþýýýþþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþýÿÿþþüÿþÿÿüüýÿÿþýþýýÿÿýþýÿýÿÿÿÿ ýþýýýýýýý ûûûùùùúúúåéíþþþúúúþþþÿÿÿ÷ùú  ÿüùýýûüü÷òðýüü  ÿþþþüÿþþþüþýÿÿÿÿÿÿÿÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþ¬0 IDATÿÿÿþþûüüÿýýÿüýýýýþýÿÿÿûýýÿÿÿÿþþþüþýþþþùúþÿÿýýýüýýýþýþÿþÿÿÿÿ üüüþÿÿÿÿÿþÿþÿÿÿÿÿÿüÿþþÿÿÿþþþúúûþÿþÿþÿÿüÿþÿþýýÿüÿýÿÿþþÿþÿøþùÿþýýýþþüüüûûÿÿÿþÿÿÿÿýÿýÿýþüýýÿúþþþÿÿÿþýþÿÿÿþÿÿÿþüþýþÿþÿÿûþÿÿÿÿþÿÿþÿþÿþÿþÿÿþþþÿÿÿüüÿÿÿþþþþþþÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿüúþýÿÿþÿÿÿþÿþÿÿüÿþþþÿÿÿÿÿÿ ÿü  îëòþþþûûûþùûûùù÷üúø ÿÿÿÿÿÿþþýÿýýýþÿÿÿÿÿÿÿþÿþÿþþÿÿÿûûùÿÿÿþÿþþþþýýÿûüÿüþþüüüþýüüþþþþýþþþüþþþþþþÿýÿþþþýþýþÿþþþþþýýÿþþþÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿýþÿþþþýýÿÿÿÿÿÿþþýüüÿÿþÿþÿÿÿÿüÿÿýÿÿýýÿþûûüûýþþþÿûûûÿýþýûÿýÿÿþÿÿþþÿüÿþþþýÿÿþÿüýþþþÿÿþþÿÿÿÿýÿþþÿýÿýþÿÿÿþÿÿÿÿÿÿÿþþÿþÿÿÿýûþþÿÿÿÿÿþþÿÿÿÿÿÿÿýþÿÿÿÿþþþÿÿÿþÿÿÿÿÿýýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+Ô~ÿýÿÿÿÿýÿýÿÿþýþÿþþÿýþùÿýÿÿÿúüîìïÿÿÿüüüûûû ÿþþ  ÷÷õýþûÿÿþùþþþÿýÿÿÿÿÿÿýþýÿþúúüþþþþüýýþþüüüþýýýüüûþûýþýýþýýþýþþýüÿþþþþþÿÿÿÿÿÿÿÿÿþüÿÿÿÿÿþýþÿþýüþýüÿÿÿÿýÿþýýþÿüÿþÿüþÿÿÿûüþÿýýüÿÿÿÿþþÿþÿÿüûýþüûýýýýûýýýúþÿþþÿþþÿÿÿÿÿþÿýþÿþþÿüÿÿÿÿÿÿÿÿÿþÿþÿÿþÿÿúÿÿþþÿþÿÿÿÿþÿÿÿýüýþÿÿÿÿÿþÿÿþÿþÿÿþþÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýÿþþÿÿÿþÿþÿÿþÿÿÿüÿÿúýüûûù÷ÿþüýûýÿýþüýýüÿÿøøöþþüÿÿÿúþýýþþýÿþÿûþýþÿþÿþþþþÿÿÿÿÿþÿÿÿÿÿýýýýüüþþþûýúþýþýüüüþüþýüüÿýýýüþÿþüÿþþþþýþþÿÿýüÿÿÿÿÿÿþûûûüüüÿÿÿÿÿÿþþþþþÿùýûûûýýýÿûùþÿÿÿûþüÿÿþÿÿÿÿûûûþüýþþøüÿýÿýÿÿýÿÿþþÿÿþÿÿýþÿÿþÿÿúýÿþÿÿÿÿÿÿþÿÿÿüÿþÿÿÿÿüüþÿþýÿÿþÿýÿþÿÿÿÿÿÿÿþÿýÿþÿÿþþþÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿþÿþýÿþüÿÿÿþÿýÿþþþÿþÿÿþþûÿÿþþþýýûÿþøøøýþýýýý ÿýþüþø÷ûúüüýýýüüüþþýûÿýþÿûýÿÿþüýþÿÿÿÿÿÿýÿþþÿýýþüýÿÿþþÿþÿþÿþÿÿÿÿþþüþÿûýþýýþýüþüþÿýüÿþþþþýÿþýýþþþÿýûüüüüÿÿÿþþÿÿÿûýýýûÿûûüÿþÿþÿýÿÿÿÿÿÿÿÿþþûþûþÿÿþÿÿÿÿûûýýÿÿûûúÿÿÿÿþÿþþÿÿÿÿþþþýÿþýþþþýÿÿùýÿÿþÿÿþþÿþÿýþÿþÿÿÿÿÿþÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþÿÿÿÿÿÿýÿÿÿþÿÿÿýÿÿÿÿÿÿþþþÿÿÿÿÿÿþÿýÿÿÿÿÿþþÿþýÿÿÿÿÿÿÿÿÿÿþÿÿþÿþþþþþýýÿýÿÿÿô÷÷ûúüüüüüýþþþôúùüù÷÷÷ÿùýý ýþýüüüþýüýþþûÿÿÿüþþÿÿÿÿÿÿþÿÿÿûþÿýýÿûýþüüÿÿýþüüÿýýýüÿýýþüþÿÿýþýþþþþÿþÿÿÿÿþýÿþþþþÿýüÿþÿÿÿþÿÿÿÿþþûûýýýýþþþÿÿþÿÿÿþÿýþýûþþþüÿÿÿÿþÿÿÿÿÿüýÿÿþýüüýÿþþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿûýüÿýýýÿûüþÿþþÿþÿþþÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþþÿÿÿþÿÿÿÿÿþÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿþÿÿ ÿÿÿþþþþÿÿÿÿþþþþþÿþÿÿüþÿýþýÿÿþÿÿþþþþýýþÿþÿÿýþÿûþüýÿþþ÷ûõýþýþþþÿþþþþþùúùþþüýûûþýþÿýûüýûùüýýúýúÿúûûÿþÿÿÿýÿÿÿÿÿÿÿÿþýÿÿÿýþýÿÿÿÿþÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿþýýüþþþþÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿþþþÿýüÿÿþþþÿÿÿÿþþþÿÿÿÿûüüÿþÿÿÿÿÿÿÿÿþýÿýûùýýúûýýÿüþûûüúÿþÿÿÿüüþþýþÿÿýýÿÿýüýÿþÿÿýýþþþþÿþþÿþþÿÿÿÿýýþÿþþÿþÿÿýÿýÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿþÿÿþÿýþÿÿÿÿÿÿÿÿþüÿþÿþÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿþÿýÿÿÿþýÿÿÿÿÿÿÿÿþþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüüüÿþþþþùùÿ ÿúúú þÿÿûþÿÿýÿþýüüýÿÿþýýýÿÿÿýýýÿÿÿÿÿÿÿÿþýýýÿþþýýýþýýýþþþÿÿÿÿÿÿÿþüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿþÿÿþýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÿþþûýûÿûúþýúúùúÿý ýýþÿÿÿÿþþýýÿÿþýýýÿÿÿýýýÿÿÿþþþÿÿÿÿýýýÿýýýýýÿýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþüÿÿÿÿÿÿÿÿþÿþÿþýÿþÿýÿüûüüýÿÿÿÿÿÿþüüÿÿþþþÿÿÿþþþÿÿÿþþþýýýþþþÿþþþþüüþþþÿþüÿÿÿþþþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿþþÿÿÿþÿÿÿÿÿE+C… IDATÿÿþÿÿÿþþþÿþþÿÿþýûüÿÿÿÿÿþþþÿÿÿùÿýýþÿÿÿþþþþþþþþþþþýýþþþþýüÿÿÿþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿüþþýþþþþÿûüúÿÿÿýþþþýýýÿþþýýýþýýÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüüÿÿþÿÿÿþþþÿÿÿÿþþþÿÿüÿÿÿþýþÿÿýûÿÿýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþþþüüüýþÿÿÿÿÿýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿýýûþþþÿÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿþþüþúúÿýÿýüüô þùýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÿÿÿþþþþþþÿÿÿþþþÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÿýýýýýýÿÿÿÿüÿþÿÿÿÿÿÿÿÿÿÿÿþÿùûýþÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿþÿþþüûþüüúûÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýÿÿÿþÿþÿÿþÿýÿûúþýÿÿÿþþþýýýþþþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿÿÿþÿÿÿþþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿþÿþÿþüÿÿþÿÿÿÿüüþýþÿÿÿýûüüüüþþþÿÿÿÿÿÿýüÿÿÿÿÿÿþþÿÿÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿýÿþÿþþÿÿÿþÿÿÿýÿÿÿÿþÿþþþüüüÿÿÿþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþþþÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿýÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿþþþÿÿÿÿþýþÿüýýÿþ÷÷ýýýÿÿÿÿÿÿüüýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿþÿþÿÿþþþÿÿÿÿÿÿÿÿþýþÿÿÿÿþÿþÿÿþþÿÿÿÿÿþþÿÿÿÿüþÿÿüþÿûøøýýüÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿûûüÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿÿþüúÿþÿüýûþÿÿþÿÿÿÿÿÿÿàÍž IDATÿþÿÿÿÿûýþÿÿþþÿÿÿÿÿÿÿþÿþþþÿÿÿÿýÿÿÿÿþÿÿþþÿþþýþýýÿÿþþÿÿÿþþþÿÿÿÿÿÿþýýÿÿþÿÿýÿÿüÿýûùÿþþýÿÿÿÿÿþÿþûÿÿÿÿÿÿÿÿþýÿÿüÿÿÿþÿþþþÿÿÿÿþýÿÿýÿÿþÿÿÿÿÿÿþÿÿÿÿÿüû÷ÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿþþþþÿþþþþÿýþÿÿþÿÿÿÿÿÿþþÿþÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿÿÿÿýûþÿÿÿþÿÿÿþþÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿüýüþþþÿþÿÿÿüÿÿþþþÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþÿÿÿþÿÿÿþÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿþýþÿÿþþýÿÿÿÿÿÿÿÿÿþÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿþÿþÿÿÿÿÿÿþþþÿþþÿþþþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýýþþþþÿþþþþþÿÿüýýÿýÿÿÿýþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüþÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿþÿþþÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿýÿÿÿÿþÿÿÿÿÿüüüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþþÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþÿýÿÿÿýþþÿþþþÿÿÿÿÿþÿþûûÿÿÿÿÿÿÿÿÿÿþþýÿÿþÿÿþÿÿÿÿþÿÿÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþþþÿÿÿÿÿýÿþþÿÿþþÿÿÿþþÿÿÿÿþÿÿÿþþþÿÿþÿúúûüþÿÿÿÿþþÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿýþÿÿÿþÿÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿÿÿÿÿýþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿý;ä IDATÿÿÿÿÿÿÿÿÿÿþþÿÿüÿÿþþýüþÿÿÿÿÿÿÿùþÿþÿÿÿÿÿÿÿÿÿýÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿþþÿÿÿýÿüûûþÿÿÿÿþûÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿýÿýÿÿÿÿþÿÿÿÿÿÿþÿþþÿýýüýþÿÿÿýüþÿþÿÿÿÿýÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýÿÿÿþþþþÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿýÿÿÿþýûýþÿýþþþþýÿÿÿÿÿÿÿþþÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿþþÿÿÿÿÿÿÿþÿÿÿÿýþþþýüÿþþýÿÿýÿþþÿþÿÿÿþÿÿÿÿþÿþÿÿÿÿþÿ ÿÿÿþÿÿþüþÿýýýÿÿÿýÿÿÿÿÿÿÿÿÿÿÿþþüÿþþÿÿÿÿþÿýüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿýýþÿþÿüúúÿþþÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿüÿþÿÿÿÿÿÿþþÿüÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿýÿÿÿÿÿüüüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿþýÿýÿÿÿÿÿÿÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL]dÍ IDATÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ){Ö„ÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþÿþÿÿÿÿÿþÿþþþþÿþþÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿýþÿÿÿÿþÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿþÿýÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýÿÿÿÿþÿþÿÿþÿýÿþþÿÿÿÿÿþÿþ•7Ü IDATÿýÿÿþÿÿÿÿÿýýÿþÿÿÿÿÿÿÿÿÿþþÿÿÿþüÿÿÿþþÿÿÿýÿÿÿÿÿÿÿþÿþÿÿüÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿÿþþþÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƤ\h IDATÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿuUGK IDATÿÿÿÿÿÿÿÿÿþþþÿÿÿ%PC$IDAT˜ç6 ´}IEND®B`‚rgl/inst/textures/particle.png0000644000176000001440000006346211257014117016251 0ustar ripleyusers‰PNG  IHDRy÷º pHYs ˆ ˆåŽ)I tEXtComment‰* IDATxœÕ}l×W²n0®¸W¹÷‚Œ-7l¹€å†mLØ4Qˆ‰ŽM-ôB‹€ˆ@BKSD%J)(½(ÚF’²IvµÚ»«ûÞ›ï›s~ÿ?.¥Ü·÷hÁ‡e¾3}æÌÜ×ë.^½îñ_óSÞžžž½å+Osð£½{÷öôòìÍ÷ñkOO?Ïûîóðì}_oþ=½ôoòð¸ÛÿNçßw·ÿÂÎàÂ<=½¼€€—9ü†·/þ™7¾Ä×~^÷Ý×[~Гè_v·ÿîç^üå÷¹\/hSb{÷ö6ÇÇÇÇ××ϯ¯·ü™|êçëëëããçÝ»·—ü ììßsþú½7kW@¯ëíg(îãïïßtûúõ À§ò¹ "Gò†pPTþàá’Y€/ÈíÓÇÏßC@@€| ?e áÕ÷äßÙëÞàAíf¸_îTˆ ”dN/ß ”AÁòGÀÀß?088 À"+øBIô¾g*ð`µ¹•uÈ9nUè–lŽ`‚#ŸÊ'üZ>ú‡… Ê ÃÝþwºý{ïú_“çåcNîWˆóRzí  ºå÷~á |ÑÇb"8øxQÜ“sǨ¸=Å/„~¨|h¶À@2º aNdd„&'xð„ó+C„"8$а‚'•A/c­¼sÝp78À1T~ݟ¤ƒ±q»¤9,Òœ¨¨HA!* ß&æÈg‚€ü¼EHh §Â#J—ÁÓ*Åÿ;mü½zªvÑmÁ¸`!+‚Ô ÍQæD;¢åD9hŽˆ°0A!ZRþ6ÚHH/E «Ãõÿµvbç å¸|\}8=2*” }1æÄÆÆDGËïü ŸšmPˆŠq‰ y ¡ uôƒ0 ÛÂý ÎmšQj¼}½{!Ÿ„FÅ›“''>߯Øïó *&Š,CÅ ,~t<‰A¯^ÿÐîY×6ôƒí ãGFòAplL¢9II‰ ò{ll\||\ll‚9‚ü˜|7&**&&Šr#„‡€¯D7ÉNuo"ð@/h}_cð-ýÊÈ‘‘`n!'Nèêâb“ÍIIN’“œB€…ë…¸„¸è˜8Ar#Jœ‡w«p¤»`Þžw)Ü6öxúÍå‡ÀŠEмÅPºÀÝB<®›T¦gÈIw>â7 ‘‘‘™)_¦Œþp20ˆ—ß "aà#„Âw9†S'ÙãÎŒÁ¿ý_:öÇ(?c÷¬òSÎÆNfÆÍëÕƒøt!;3++Ä;ådeõÅ‘o !|VHIIJ$+¨(DX«€ønÛÿ¡ühø”|8ôðöb`ÄäîcãD»%''ö4’žžá¢´¯óQ¿“Ý7»_¿l|?3“((?¤$§ B F!$DÌ­°„;c;@èwÉ~0©—»Ç¿T^b|Bn¢n.™4gg÷ËÉé—m?šïäÊïýú ŠŽà¢¤¤ª,À2ÀA0ª ÑcP FJw-ÿÛØ GB¡ß?ÀèýPº;¢³ñoMHLN•'bŽ›tn4æäòä8ݾ!€ô•*F( ÔŠ‰F)FeÈ@Zðïã UxÛáòm !O'Ù§ÚÇ¿5 æ-%M/^Iñ†Ö¼üü<×Çü<9øJ¿Ì!‚ „‚j…4ü½p‘„ÁÈâf JÜìÏÜÑÿ8Žò#ýááJ|Rî1½ ý&ê C´w_’ú:é0ñÔïý,× A…Ê%=œò²²ÒRû (*´ê<`µ"ø –ƘE'_ ºÐÃíßyOèEéW‚:É~b¢ò>Œ®×—CM—/â]XdÉ/3ÇÒj¿®¨¨ ÊJË Åý‹D ©  ³-¤‚â ÅCŒ‚&°L¸þ­w›ò"!*ý‘Vö•ó3à‹ ãî@»Ãú¤·´Âœrsì× åŠ@©P¨Š±@¹À \š¢úÐ$O"ÂB‚MˆämbÄ{€f}|¡ÿ¬òC¬ÁOKÓ«·Œ9.($íJyi)©«4g 9n_Ê y@À]dmƒc2Ó)j ¢…È0$ˆ+gx÷`ºW‚$¸CÃòK0·Ÿ¡œŸmʬ°±ÒΛ•[à"¸Ê·¯ˆ‚ƒ¥ ¡´ Ú@°Ìƒ(6È .ÆBÈȈ&¤Ü¨ÿ½¡ûB‘¨²žŸÃý.£O»Vl®^²Ä[Âḵ_×ÖÖÖTWWW‘P«PLY€UFË„*LMÕpQLBtd8\ã`ñÝ5†Rß—¾O°‰ú¢ã\>¿å}(=œb\ŸÜ:ˆEö¦kjjëêjkjð‹Ÿ›#Ÿ U•‡T”•–À!Ÿžd¿¾Y™é°8Éô‹D "Õ-רÁ‡Ç­Zƒ[¾¿—uB¨ýåþãÕåÕʾêûþý•~!Á^U2ë ª«­Å/~n?«#ST;â ȉN M Y€Ç˜Ÿ›#R! H”™‚Ö 2<œž±¿ î*Æù÷ñÕÀ—Îx"1q¢þÒ3²4šÍVæ7J*\_U]#— Ò…ÆúúºAõ õƒêð‹ŸÛ3xpã`~³?F 4"F‚”A^<$¸F™ˆ±S© bÕ)"`/OÏ» «‡–{Pê¡ó#×Äm|bJªˆ>Û#û ŸÔ çSâ«kêH”Ð_?¸±Q(mJð‹Ÿ;§©©I3ˆÿÑ à!5‘bD±ª$@"•’žb=Cä‹( ÞÞÞ·êÜôþ}Pê  7é>q~’ñqYA¾z{`þr{ùÕ5†çkëê…ަƦf9Mø…χ˜ƒÏ›•ÆÁƒ ú_YÝ!(”Ñ=‚‡ˆ`®vB¦ŒÀáa#£çâVý[êOKrýPþt|õ§Rù€6ŒüÖˆàºZÕ劀@{Ȭ‰ðH„9dA.‘Mß1Žý ÷7*&Áù ý9Lq ÷÷/-UŸO˜µvPCcU/¨‘t^·Þ6zt[kësäË1cð ÅA~‚²F 7· €ÄÿÖþ‡‹ú‹Ž‰OŠOHtiáþþ$¿¬Ì8>5ƒÍB…?bhoérÃcÇ ÁB/)6gâ¤Ér&M &‚qã„+€Âh AÂÐ"L@?¹¶Ö(C¸†@ Ét“+ññq1ô‚… ´Š¬¾üí@ØÚÿ8¿± ɉ°þ |I?#^ûªüjëÕÙi1~D[„œ|Ï»ŸŠ'MtÎäÉS¦N2y²|’Åeeª¡­M­c |Æ ê© À-1PE š 5½dÔÁ¾èÐþ£nó?@ãkÿ#£…»âSPð€ï#¾´ŸËüÁñ­š[† Û[!ÆÕƒøqÊû&éówœ)S¦N›6uÊÅeÂø VB¨)F¦V®Þ š‰Š 5}ÌD‰ú„Âì)CÔÇOûLo€Þô½}üüEÿ û#ó-ÁOéGè#Ú¿Èý”ýë1¸¡·;L-^[Ûj¹ …ÃqÉ \®\ˆ6gŠ9Ó¦’&ã·I£``áÀ3€ ÔTUUPVÆìq.«ŒY̘Ò24Bå ]ôþmlõ &¿$HJMKMËìk²>…Öï‡ö—¿†V²/š¯b¯ôOÔ;'­näßpª&JaÜ8¨DjC¨‚!äqŒàÂ51@ž€ñ!A"‰Õ‘+…èsû€~ÿ'ûKÈ÷ŸÎ¿Ò_ZæhÿúÚ½a.êUèAþ¤N×>Ýufš#Ÿ* £'Œˆ:TGYaHS#¸ ÊèBDÉTÆ’b1´ ?õžþ_ê?2ZÚ’S32ÅÿûçÓõ/•°W…¿VÜþ¦f{ùn¬?Áoèž_Bï,{f›3K¾9â ‡ÜBë@Ih]Àª¹‰Êæ@4ÉX·˜B­ Kö‡ôðôòòÿ7”â?ñSÒ³úfõíÇt?’^`ÿª* û,FöG±¬o©3fÌé³ç¸ŽŸÊfàã@um(L@A€.ÜÀ\ºÆ€|ãf¨-H°Ú(|þ á¾G||$D·np(ü?=Eü³Åä¨óƒœWe 3 ƒEÿÑó©äQg’jy¡ táæ…Ð¹sïw¹æðSBƘIЦÂ<‚±V¨[„L£ƒ*ëXs(¡›¬j–ŒY¶~¡ËY"@°¿éYÙýÄÿQßWé¯dbÏd:Àÿmî—Oê…ü™Êì ÝønŽüñ\‚@>˜hÇÃ;j…s]H—º°¦z æIÈT…°†ÉÉÉÆ KØc»}à * ‘‘ZýC«2€Ð/ÁOäÒÓ‡P·ÕR?Ùa}Ð?{ö ¤ÏsæÈ§" 3©D+@-ƒ±Ô…£  †ƒ ¬k,b`3çpr-E«]‚q ™"óé¹¢ 6F³{°èÿ(mõŒMNIϤÿgì¹¾"ƒjë%ZkBå? .ïØñôé`Í&Oîȼ%]h³°Ó‘o ÄÇÐï(Cõ †c¾dzE¢ ËJúH\– .aRrR"ó¨ù{{x«&ì¢ ºͯ¨€…„±åÕ_ ²ÐÀcí9óýµõuõHt’ûG¶Šî3nüDqô&ªO›>s6.Òáüyóæ/\„³xñ¢.gáBbc8Ú€†Ay`ÂwLjQbÂd €\YIqaØø„¨›ˆh~@X 88À···—g·Š°[à‚Bµþ%@R²u€¬ýGÖ³²ª®aÒ˜ÍCG(ýŒvhÂå>}ƬÙs­ÎŸ?_®ñâ%KÛÛ;:w:K—.Y"‘CTæ 3„ Ó&AŠSÐj`ê°A5a%ü’" LÅÈ! ¸RDè2êãíÓƒ"ìV êO@Ž)F"€´të¹ì? =õ CZ†´Pü…~ëõL™2¢?ÇÞd«üfÌRŶξåË—zWu…`åÊ+–ã aªEÕsæ‹8E³ãÆ1‡<Ô-8X^&ªÖÐdJÁqqQ(Á!ô]u^7ˆÌÖ_0@lBë}Á&ùIû_‹,]Có°!Ãû·"ÛÃ삺iÓgÍ™=ç~Ñzóî7œß.äËͯX±gõêÕ«:5øAXAf fTÛ@FP]8ÕqŒ˜1CªHb#ÖN–—W”£p¤ÅSÆEh¤‰ Z‚P4õîÝMPä|Ã’„~_Ô興0 hõB텟ʪšdþ‹ó?‚æ_#?„ü¢üfAõAôEð—Ðè‰Ø¯ºV¬\³Öžuk„|0gýÚի׬Y á,“ïh§eX´`žúɳÆ “Gi®H­a=¢ò2‰ŽóM‚î@"šk#ÂÐa¯a!‡¸EÇð@Þï"Œ‰KHH ) ô  ò#ñOÀf?jþlrg:d_þÁó•~ÜþÒvJýŠ+W­Ygφõ¬[÷Àú ˜³aÀ±v•…ËW(Õsè2}&`#…¬¹"±tŠa ËÊŠ‹ÉN†(F›ˆlHàÑ#¶ÂÏ4ƒb5LHú™þÔÕ¡êÑÜÂàô·Ô#ÞQô í`ý•«VSð׬³ô>°yÓF9›6o4gÓúµkX·f¥‘2Â2µ7"Ài4!6, ú¸®F"Í GÈvÂp'$èÝ#6l²À!d"ÿ§P)ò?551ï-üoÌÿ¤I°~Ó§ÏÂý û/"ùÂÏrû«!ökÖ>°~½%xË–Í›6mÞ²e“9[6®_¿AØ@¤Á¨B ú, ƒh\ƒI“Ñ%Nêêëª++X5*Ò&S ‹âlUP ; {ÀÆÞ¾¨‚Y­Ÿ2ÿ¯J?¨ô£²/áÏ(kþþ3(ÿrûTü¢ö…Áúúõ„ðÍæl݂߷lµlÛ"\°iúõÂP ¢)WÑ.,ƒE0ªp.âÄ™”˜qŒ[G(ªaP q›‰Ô#LÅ;vQ!MÎ:Áà‰.ÀÀíBÿ4" 8€Ôÿ¦ô…r§ÐÏèo‚¦:§ÍTÏoÞØýöÇÞ¯Z½Vä}Ã&¼Í9[·lÙºm›dç¶-›·nÝ$²aÃzAahÉÕ4 ËÜÃyÆ1š9Cä¦`3ED î@5Õ X@ࢉ(F»GØ;rSúˆ@ òò„J+LöWèoFÅOôßhÐÏä>Œ¿ ø ÷wúå&Áú„þ-[…æíæìÚ¹cûö;wY8víØ*plÙ(‚±I0Ø>X³ZA€_´@ä¹T“*XÆÍ#;Пå²@zR¢xÄ,• Gêëó‡ô ýÇ`¸`´¿! L`¯ y‹½"p‘ù€û7›÷/ò/º_é_µJuý¦Íë7lÞº]n}‡9{öìÞµk÷ž=öëÝ;·mÛ¾}ë&Hô£pƒÀ²vãj¤<š€Õ¤qcÇŠ CÄt¹ÉÛqÐEÞzàûJP;4 ŒŒDY ##-)>6&6V` s^ÀÅæ(û Ù–Æ"¨h BT`U5*ÿC†™äïhMüM›¦Qï<ê¿¥J?D_@Ô›PÆ#dïÙóà¾ýû|Ÿîu=Ä °Ù °"}äv¸† îGˆ$ÌPE8n츱D`X3²åâ!,*eGÈÊ” ˆyòS'èœp~샌`#T@z_u‚û—¢¡[bàºÁ¢‡3ü“ðßÐ?W3Ÿ!ïbÃþ+Aÿúõ _ÌÝNs„ðÜwà¡ýû÷ïÃçûÌ9`¾[a&‚õk­.s¸tÉÂyTbáÀ%„1€? EôºZÔKÊLóòäì€!0¥¢Îy Ї• Ø@2@†–Á€’²™®Gt(ì?àxDÿӦ͘q¿Ëúw,[aT? Ÿ¿uÛvxò;Xïƒû|衇„èýÌ1_î¹ ~TIظ‘æš`9²‹åÿA˜;{¦¬¦Ž§X“Å,˜€X*@P„ )‰±¦o"À¿s^À/?†ÁÛÈÐ0ÀÀJ ‚ëêÐõƒh”XÆÿSúC¦;„zê~!žÔïØ¹Ì.×Í‹ßࡃ‡>tðàÁ‡™c6 ;wª, lX½š„¥‹¨ ç c8cšN(H—³d„¸°ÂTÎáã…nZR\Œ-”tÎ ¸ QÀ05 Dh‚`æk Œòß ÆÚèÁþÍ0iÏù /&û¯F˜#ô ëoùrûB½ÐýÐÁ#Bùá#?|ôèÑ#øüˆ9À@@^ØDP¶m4Êpí*‰–w,±" îÀtDFVP:¨Ù”‹´µ¸_6ßHXȘH¼¡Îyð‡ Ô4@" o_qÄ0V%Ap}}#ZÔœ âú¡ç/Z¢q8~Ð}ÅòoÛòåöyï‡Ê}øØ±‡qäó‡Í±€ Œ†;  é1šX†à2@‡ŠpâDÊÀÈáh2KPWK(sÅ™h£KÒ:Ippç¼€;Þ~þ¢@ò L P XEÐøƒ€Øÿ)ÌûpþÂ%íËÔó_«º³¸6Jÿƒ*߃ÆC‡bpÔ`¿†0•„›© Å?^üQ»8E&>& 06Ú†#.[ȶJ-€œœ¾™H’§ &ŠPwð†¼€ó º¡Å f¥@¶A¢ PRV61`=[Ÿ†Ù \àéÓù_Ò±|%z}›T÷íå·Ä‹š;(”óÆ?~üØñrŽãS{#‡Á °Wœè²€XúQµÖ˜†¨`ü˜Vñ‡#CÖX²é@T‹Ø^oóñâ !E"1Þv€o&BÈ ¨„¡¢u²òJ@œà–a#Z5‚ ÿÂü-wÔÿz£ývÈýÃêúèÉGOÉyŸÚsRyâ eq<°z@ÅÍy`\"3(˜Š:Ôx”N!M̓ñæB²@žÍ $%Ä¢VŠ y¿nðˆˆÔ'„ü  IDATRZ!PV1``µ¸@ƒµ:PãÿiNDÉ_¹r­šÿ-ŽöŸçoDà!ôÔc=ö¸üïôiün|ó”ü¡Å@@8tz`ïž]ð6ÃhtDc¸>1$,™Œ‡K< 1ÁFTÎ3..°yäÄxÎ" Þ½»àãƒD@x„Í¡ƒµ€A Z FÁšd< 9¢‘ÿì ÿ·jµ5ªü÷‘ý¡ùÀù'IüãBù™3§Ï8GðÈ* GŒAس[ä` uá:f —·›èx.êè¨Lw¡Í(œ×°VoÈæR’…£mÆ¥;€j8ßed2oó µ¢›´ª»ˆ¨ÿ¯Wú·ï&ýû÷?Äû?vŒ ·~š¤?)ÿ;{¿ÛC8NŸ@„ Žû¡ wB­¢´›èX<¢éSÅ"M:¶M‚¢¡C›ÑTZ[¥!AQ‘Í ¤ÒBzÉàPN@&ÈÇ PUG@ÿÈÖ1ðYÿQ¨.ð²°hþ·ïPú€íƒÝƒèãúåªAôYùß¹søÝ` (\@`Õ`| ‘4ôÀ`3QH“Íg yJ120tØ‹jm¹°Èæ$(DßPdxH €;Z ÷ñõöC.ŸDÌ6ÒRHA!ºà…~v~$AY›j= yâ´·3ó)ü¿îïŽ]ðüqû‡Bø…û!ó ]I}òÉ‹æœ7çÜY2ÄçÎ>qú1£¡ ­? ÑlÁŠe툗p&[iX<C€"§jg@[ê³²ÐNÏʰ3C‹ŒàsȤ¤,e€ (0r˜;wé_¶Ü†¿[ÄþmßÉû§ö§ã#ìÑý–à§:ó€F8óø©“0‘”‚ÃP…âîØAE¸áuk Û—·+sg¹ L Z… $O'1d!(މêšr70((8åpH@23aùxªkê €(À8ËH€ °aëVľ{àûëwì˜èþÇ úàzKðÓæÅû'ù—ÌyÁ‹ø€ Æ#R§P<¢-›‰ÀªU+ÐG°pÞ¼ûQ+ÑaVÓ5ÐP«aq©íD¹\X©1¶‘wÀ?ˆnp¬$‚ d1¨º¶a áFQ Nðœû,ZÌHÀ&@vîÿ_€!¯p?¼¾3Ož»pþÂ…‹JüsÏ¿x©ë ÈÏ>ûôÅóçžGáŒáQ…¢ ÷+Pׯc†¨££}Ñüù÷£›Š½59D¬yò2fÈûeg#/‚üpd¤æ» qŠéf ;"ži¬Lœl@íô¯Aö[<€-[w!Û/êüÿ8´ÿÙó"ÞrÿÂüÏ¿ ä¿ôòË—ÍyÙœ_|ñ•ˆgŸºD ¬O. K¸k'¢ ð‰ Àâ Àtö L7º É¡“ ¦›^ÜÁT<©Ñ̘¿¿;B¿ÄAú*†/¢Ó2‘ Î+((*\U+N€FA­mh(ôÏ@hÞB´ü€5d1¢÷ôE €à@4Ì¡x l½ù!@“¤³gLgf@œ!TÊZ Z.ï_˜§¤% ˜A†ñí¾Þ¶Hæ¡é`}Rñ&¶¯¨ÀÂþH†#$´ J&Nú€yóæK@¸vDÀ`€=ŽýÇý ÿ? ë÷Ô3ÏP÷ ÷+ù¯½þÖ[oò¼aŽaˆW^¹,Úrðu¡@ œ`\À €"Aå’å" O…;dScõ¦X\ZR\¨ž@fÚÆ l›3mqâj>¯âð*([T`Qqé› C<²uôe€™³Å ··SÖ­Û‚âîö;Ä!!/£™ 7-!5ƒš†´ tÔh´N¶½0 -íX¶jÓëQÚ…ª}GŽÑÿ.Áôý_Òóþ¼õê{Wß{R –áµW_{xéÒ‹Ï?÷ 4áY 56<"‘ñ^q„6m°irqÎ;S}!Û/0XB“*.ÊÍÎÍÎLMJd…("Œ‡Œp@û‬~yyù…ÅL ƒ-c“ YÀH`³{Aÿ‘£G>ñ¨è@x€àÿ¼xIÒÿÆo¿óλ¼z{>øàC Þy[Äà ˜D ž~êüy²€Àƒ Àæ &.^ª©!€1 @K£P9£W€œlè€ÄD”Ⱥ5A¤BП‘•˜† 0¡È…1žn2‹ÛÙÈ:ÀV£4zò±S\4 ð2éÕOÖÕö|$çÃ÷¯~ôáW¯¾+¼é ðÂsb èN<,j†`×·°¸})¸îLýô“?úðc ðÞ»ï¼E(ÂÏ>sñ"Y@lá‰cGY*¶mÙ‚ì˜XÂh¤D­pÎLä'O‹náC‡¢…X ¡æÅúçõð§ÌÔÄ8<¯ï¼C.( £qúæÊQ¨«G2-ÁcØ1ÅtCA²`ÂÀ`€ý´oe)b°ÒKçÌd鄱Ú23´©É*Ÿ“ HMäóz4Žv €¾ÉÈP‚š «kh"Ȇ+3€E,Š„¸(‚8xÈŠÀ¤_ ÀK¤ÿÍ·Þéæÿ·þÅ ç³Ï„ >ïRÀ'z™qØBa3§…;„ÔȾ€mNb¤£Ce`Î,<;ŒZ„ÄèªgZˆE2S(çXn€ŒÅhÄ4ÌFÊ-,DST xx%Fp,#¤q€eZ Þ aà.2² Ç䔸@ç/Ò’ ÿÞº‚ë™ÿøS¹ö/ÝÏ_|>ü@™ªðU¸D²À™SB :¸?e`«É‹HP æ±qj`Ç UQªD ––äææfó1•xì”è€h nP@EŒÉ@Ñ @›ÀBb€6nÞ¶Y ƒ˜8ù¸„ÂÏ9 ðš2À ÿ“O…í]ÔÿéOú\ ‚M(ˆ9|SÔx.ñy‰ ,€mÈ*íK¼±›lZ††¢T€’‚ÜüܾS "ÝðDgP סP B°$V¬/ãVÕ5 n6¢uÔ¨ÖÑã&N8sæ,>€C.hù:h€­ÛY'Hpúüù H€<€üå÷®~ äAº¿úê«?}ùå×r® à‚O?–?ÿ胫ïˆWl¡8ÅO]¼xáì™S§DJLô °[¡Mèbµ˜]3b&O°ÉáC[ø¦¬¶r£>%B}oÉ"ÂB1‘šñ Àê€ÎTÖÔã]€Àl(Ϲ¾°‚©À-à€½ÊL‚?~úÜyª€ç(À•· ¯ÿ ¹õk×¾þ曯¯}õœ¯¿¢|E1€Kdô Àc§¡Z¶ßæ í À,<-›Ô °-Ì»)á¦&Ô¸Al‹cIhâ$ä¦Ï˜}ÿü´‚+ F1p÷nÍ„˜*À^¸LÞTð¡¥ÿ«kß|ûÝ÷ß÷í·ßÉùöë¯D ¾„|ò><¢wßyGŒá«L!a~QxŒBÀ a±ÀÊåíPxb‡´H7ð1ÕM@U8>)%µ3h‹3}¦ ˜{¿M‡¯YCضÛè@š8ÿÔ³Lˆ €üÐÿù ÿ믅þë?\¿þýu9ßûõµk"Ÿ~d4á[¯8œ{µñ… »ÝèXBfi€-Xt0%±iè hAdÍZöoÛƒZ ¸ÁÇO° à…§Å¸ô|q@ÿG¡_¸_®þûä\ÿñ§Ÿ~üáúwß~CM>þ2ð–„E¢‘‡øIMOž8öð!f†\"€Ô xóçÎÕ%¨(Ó÷„w.¬ Oš$^Z°'HŒ€&C·# p xâüù‹¨¼õàS˜?¡_¨Úúég9þQ˜àÛo®ý‰ñÓÞ·ˆ \z^@n Z: Ë–ò‘%;»€Öi$…îX "À³p È UV*ý;¦Â€'™#øò+àÊU0€ÈÿŸ”þë×Úùåù~}øR[C; Zð‰Κä Rc¹ëXBñÐ;и%nfG¶ê»øÉÓð´ÿþy‹€U`  H…=¥y°€H€à‹/¾ýñÿéÏ?ÿå×ß~ûí—¿üEøéGшß@|ª–à} Œ_C‚ÈÀi€ÌÊDî´+3Ñ?Ýí—º0$¯¤SÒQÉ+Ä<ä NÆÓº¸ ÁW‘ú**:@ü ;D úQ¾pñé瞈&@‚ >ûòOßPûýøÓ/ùõwœ_ ÀÏ?ÿðã?~ÿ ÔÀgŸ \E\‡ø’øÃâ žgÑü‘ãÇŽAlŠd›P!¢\¤ÉqtŒM⬉Qð„Júi« '³ã QXÝÒãÙ#˜U¢ €Íázõ`¤ƒ{àƒ„¾øÍ¤üUÎï¿ýö+ ú¯'ÁíÜ (’û›5E=€7r•5u펟0±gTz@"àO>ûRø_@øÿÏ¿üå·¿þMÏ_ûõ׿üüÓ"×®Ý6Ú:;ùf$%25[ŠzíîŒbJ|⤞€@$Ø‹ ø“x~ß]ÿñÏ?‹øýoûûßÿþü] øý·Ÿÿ|ý[¡ÿëÛ`.ÀÔ)·u@€Ž öøú—”»0 ½A“z¡À!ĺnÄÀ_~-@ÿ¡þÿúçýýï‚ÀÿT‚á¡!æ-q€.%8R˜Ü»€ã=ðî{ï 7Pø—_Eþþÿúç?ÿû_ÿüø6 s¾ÐM¬%"¶¨#0¹gP>z¬g®~ú ÀŸþõ·_ûÛßÿë_ÿú×ÿë_Àï¿ýO)AŽãçKÚ›€!éH‹ß*;wï=pHBÁÍàû3@~Qþið?em> 8ÈßõaÆüudbL|26ÂéSYNJ0` r¢hu‰€¦/A:dÕj¼ŠOØåœ€#ôäYøA…P yóÊ»ïQ|öùç×¾½þÃ?þü—¿*üëÿþ÷?Eþúן~úá{D…@©! ŠßzI€Ó?*®ðÇÑ*±k»éXåâ´ °H>¦uİ–CÙ7^[ÉyQ~N¿lПbÛåø”ØK” ï$âÝÞ —pT*ƒÝ°È4‡Y?À €ÜPžð×¾•»þégª@pÀÿù× üþûŸ_A1Àþw˜ žàðáC›8„Õ`;FS’Ñ1ÞFƒkK›§²=°Ð àÀø$Ä€ËP~ùµèÀÿüËo¿ƒD Š„3-øõ5&†>|ÿª©¼Ò]u€`ŸÕ 4ÕëtÀ<L²°6^]Ûèk_¾ÂÀñ :H,ÈTØ7ß‹(ü¦ný€ßÅ”x2`¬€@ðr°MXÓ•Æ›ÄxóàzÔGY*̳"`ÍàÍ(5· €ã.>E.u@8@DàQ‚¿ÿÍå 2"¼Nø\•à{ï\y•âغytÑ“'Œ­×ꪫªÖ‡ÿ€Î"p3:‹€ãX.R.u¯¾Q%(¡ ÄŒ‡~ÿ ÷ÿ£*A#‚ÀÛo"%ÔZ[·¶3hÍêàтՕÕËÙ&tSè¬Ñ$‹i)·ª?Àp¼x©³üÓ×ß}ÿ½ø‚¿0– @>ú™ï!/Ф`OlQÖu倉ìÃÞÁ@M%N +|%ØÙ ÞL v6ƒŽà€œ¨ k¿¼öíwß}ÿãÏ¿ÄÂùõ×_ùóO×a4-ø1$à §LÞúž° œ¯2º­ÃÖrpS3?(!Y%bh 6»”‹` #mmÚ#<ü± G îqr‚àì&Å_zÅä„mB„aa‚ŸD"€Xø§®ÿƒøÂÿŸ}þɇ|ðþ{h™yFðùçž¹xþì“Ož>õè£'O<ÌV!M‰áÅz>#[4¦óþ'P Žb+C¨¢4Æ1üIñp…CXà€I˜šC?€ï…ÊP«`š”dSblÄà£!ð´WÞ¾jdÀæÅñ“ ˆýûþ»o¯ÿí5ï¢W‚,@Ð9êÀî¬kVX L›:u‚0¾ ý ,¨Ñê£ñRsSQtÀY‘N›¼MŠ®fZ|ËÖÝ{´CiñÇ€'Ï£5ðE›¾òÞ{&)¾ùöÛëÐ…H‹šœ0Š_~ñÙ§Ÿ} /ð·^gmè•W€§Ù:{úQ6 û÷€MZ^±¼c);Xž&fO‰ùBl‘p@—ôEEu¯å˜ês¹JM‹Ošdºdw ÀÖ­Z:ŒÊÐI$EŸ<ÂЋ—mVñ‡¶.pM"‚ï½ŽÌø÷Bÿ×(¡2òéG0ok‰\8­BÎ>qæ‰Ç4LîÕ‡tð zž”³If_Ùyx8`€M2Eù²Ù€(38ÑG¨‚ã £LaDÛæÙÂÈÚµ¦4fªÃ(ž8WèíBiðíwÄ@eX+C_óÍ7( ]¿ŽÑ7ß°.òé'òáÕ÷Þ{÷Ê›ôƒØ'óìS¨ŸáC¢cx?²/ ÅÜøz—£4¦‰uÜžÎÀøa2WQZ쌞tÇT‚Vò ‹96Ó€±œ˜3…á S³µAØA¼’BN…‘3ç.>ýô³èŽ3¥!‡ßÿðÃOÀ,^»&÷þÍ÷ß}÷­ÐÿVÆ>þèãÐ#ð–HXA¨@±çŸCžyþÒ‹ €iyÿ}ôG@8r­ £?àï*¦<~ £î 0ðžœE`.ÞÏÁ Ú U‚uµxBë@¼ê—´ Q̈$¥d˜åYùEXPYVaôÈT ˆ!\3ÐÞѱÕQÈ€ €—R¶?àÌ“"ÏÒDyì•7Ñ!˜2è Rl“Ì'¦ "à­+WÞxÕ6Hh‹ŒÐ&¡‡²?OÊ…¨lƒúe§ª`›Ø°–F `¯¶ô3ó†9^O8€“$Ü%#5%”¬û“D jëÀC- Œ·,P–­fyXÀCy>9yê±3Oœ»h_ˆ Iú í‘zÏö/ÜøMBïàqÚéA׸ð¸6 òI9º¤Ð&µaÝW‹Œ;#õ)D0H8pZt@øl<.1‰"€ÚXa ]A<™mlÆÎf@yx  ÀkaÓ&ÇâÈÉGO?q-"Ï<ÿ¼±N—ƒÏÍùˆuñ«WὩqà‹èD·,žŽðÐ=Èçäè… Ø&)TÆ8fOD`$Q€ªª´‚.ñŒ>ÔÌu€ƒÐ'˜œ–¡`|ò@žß0x°a}1Ú±lÕjô ò¹0K±M ]B§ŸÄ;‰§í;¶IÑ#$}Âóé§Ÿ˜#þßUÀ·´*¨’O£_úì?vê‘G€ýÚ&·uí Ú6¹¹.Zuúxc=úñb È<³ {ˆ:À>Á¸øø$>Àú¸bõ…á ×7 6ô;"À¡9í¦W˜Ú)Ê×r|,ð¢§Ä~Á´IÐÚNÑx´Q‡°¨?¹~íšI{e/œ?g^OáÕÄ¡Cj£äæõúd`¥m”„'ŒÇƒ´‚ÜJ3XßÓ ºÐ½„݈†ÈbZ’Çð¤’f(Íu€¶‰u,ãÌ€õ›Ä¤ ì·" ZàÉsØ*‹´À%T‰Ù*¦ÍÒïËSämËðUí’¼òÚhŒxée+¶Sö¤y6²w6K¯ç#âËm«¬˜Á©\Éa)pAW•™:®ïÆ@”nmíIpмQÍÍ×ê {…98àF0ÍÒËWªܬÍÒx1j2£âžÃk1óXê%Eà+WR/ŸÕvy7Fꪸ‚äðr0TÈwèÍ}²}üí%¼™Ò=bùè­°&ÄhÅ"0}5ˆá9sñ` }9¦¢Wr³²L?qB€˜È¾)À›×ìk!··2WðRâÊÓÈG3/¾ð{DÏÛ‚Èq„A‡$ܳ£æ6ªÐy£x/m$aL4B˜-˜'$v KŸAûÙmõºQÓÏ_GhÅa€N†Y$†®!ª- ÞÖfÀìÎÎZƉ±¢7ëØ€”×£©óçÍ›!u„Ãß W\‡/E`ü•~6Ç¡G¯¦ÎÑWSÇ€}{€ ëôÉL;^›µ ÁÚÒANÓÉÍÂ,™D³§:88¨3}Ø$¤GñlóC ‹ÍúTŽÑEŸÐ¨ÖVNÐäô˜¹°K:V¬Z­Þ°>›C³ÀÌxÄOˆGˆf!ë髸EÎáÛ9ûNàet‰;ôãÕ˜>›;vÃÖܽ{F bÌ ¾[¼ˆ‘Ð ;_Ð>šÂ”Y`Ç즥aY·x‚Zt ¿¨ôÕX¬DÉT‚9ú`ÀP_ϧÃ#GgƒŸƒñ±í—¾æ 7¡Wj·[z< Rp–™c ñpŒ¯Fßp;¯ó¨óÿÒeåó^.|à‡œ¤ÏÇ+ìT9;P*šÍò.8LÖËÇ×RŒ‹çËQÀpÀìÐÜÜ Fµ%S§ÙJx4±|Å*L€ @²Zàa>?ùè“pîœ5‡—/ãõ¬¢`YÂÊ>Ùÿé§ž²o‡OQŽ9z³wïØ±ƒ‡×ê°Ù%‹êÄé™3§˜«öél-Ÿ :Âý°ó¢¢t-í xór4ÖÀQªðÌ(mìNŵ±cUt}ÞŽ._¾lùÊ5¶ar³£®áAœ‚çsЀޏŒ7´Îá jóLê9Š?ØßÒR;„ÄÁ]Û·oÁd5ÌÖ =N70èX=×ãiLTÃËQ;X13#-9QK†tà>(ûx:6>Ñ.”Ìg8`æ´´#±BŒLÕ)ºóæ-Zº àåØŽù pŽh¡ŠàÌ“ _xáEÅ@ØÀE@+"'údôÂY¾ž?õ¨}>ø!`Ûf€8x9}#œ6®˜Í”€u±L*GÜ0ód½ýÍDqû|>«_æÈU¸ Phq `7¨Øúc" X%Û»oßaÎOÒ䘠b(< G߸»Ã'2O± ð„Ú¿Gì ÷ìݽcËäWëÈí¥:mšs%šÀ|ðð–DÕrÒxy "q‚2Ó°Œ1šky1SРà@¨€Z0yAµ:Bc°¡a¦èØ)R¶> Ç6#1À¶ÑC*'UΜ?¯pjJ7C4ðhþyÿžÅX­Ç¬#4Ð!¾g÷öÍ6 *`Á;X‘«7Æ´êêtÔzY±¾žWâ¢####‚üºÀ‘â‘‘(§rZ~~^^¡Û•§ÈpŽ&I/4ƒW!1²i3§èˆ8jÀŒEx3dž{öYí¡ít8CEx_é?sÚ™"c†¨H¸k·˜ÌRœÝªæ›ÙšS¹†ˆuñ!ØW­½1¥±œÇ©I qQœ/ìï6IÊÀ?(D+R°T'/—è΃”8Kt®+;,¬…3€˜€¡NÑ{ø¢ö†§Á>mÉt:Ï`ŒŽè~Ñþ˜%õ¸‰€Ù1:íØ¹c‹3t}9`—±/`‚æ‚Ä hjB6 ïÅÐ#Èù‰|/…íì}\Sæ°[4,<"‚{…RÓ3ÒµeºÄRªÄIJ,’bš $¥íRËt–êzÎQ¡)Ð!²G9Isô7“¤¨å<ÓÍAðãh;GÉ RÂC©íÛàéÄu› š;G‹Âx,Ä|x †©ÕUë„iÝLŒIRúj”K‡D¼=»€½ ¡H ±D˜–žšg°¨ÄŽÒ²ãôLZ`‚>Ÿ£%\h†iC àîrÍÓYšœ$÷§‰]%ße–˜Mä~NÒ¢ò×Ybv”BÄ«uжëŨ/lÓÁCtœÞÀžPdwS qq1QÜF‹@°{Â0Q©ÑÔ´´, QÈ/²ÃÔt bK‹}A:ÑyAjrcËÍ3z‰ŠØ7©zØ"`”!fÊ`XÔ…Nçüyº>‚ÑéÇÝ& ¶ÃÔð`ZbÝ;±|YÇRó!“'OÇ“Çيš 2 Ú5Œ‘8 $X$ÀÓ£+:D! ՞Ĵ€&%,æ;ê5kí0u”EpÄ T8a0@|$FîÌÙNÇ ”´¾ïÃv â>ÎOÚ±ÝTTú±€H*Μ¦#5Çrª*ÇKk_€¨ˆ)RÙ}Ó’’¸z-"¢óF·©²D€ÍR¬§ëLÍ¢")YS£JÀLÒ7ñ ¨°ÀÒ}H½F§éoݺCÝýv¤žQ†§Nq¨äi·Y¢75éO ߆ùÈÎs©‰(XGjÎÕç’¢ƺ^®¯£¨#5 @VZb¢|ã N×`efÆ‚‚ùˆœERªZh¦ª%0Ä “kê¤34(d‘DŸ’›… Ö!2c…0Kû¸NÔ}Ì̽ñð{xªôÅÌð¿*k‡ªêÆ ;RÀ©²ctp‚™À0À U퇵䩺k%½Aºn§+^f¨¦²@Kc½.Y€›u1Y{¼i§;$añ’%D`% %:X‘ÖP‡ªs´¦ÑbNz´Ëáá“'Ý Ô‘²˜¢‡€ŽÕ]¡‰ÐE7ÎÖÍ[Çr-³¾™6cus$ ÈÌHILHФAA7n¡í$|?ˆ˜8ž¦úbÅ&'K—Ûq:\®ªÏG&êj-–›Í Â(¬{`³zD»9WݰEᄎ”î €Ž=×ä¶“¥í$I;XÙîÒ–$Ât´v«Ù6ÓlæØÁÊ9}‘IN´[éuãTïž1[fcbu¸z_3\½´ÌN”j6#¥ÆØÁšÓÕ²»EVR®[çn±X@ Â!H3¦¢â;MÕíÇ1\ÜŒÙ÷ëXéíÔ~Îhm, xuípu»oÈŠ€­Ó7=5ós˜EcÄ‹˜]ËÖŒ ãhå8³_¡o.÷k”–êPµ††&3UMC‚)f¶*]bªB ÀE`‡`¿™.OIk>Þù˜•Ø¿€œ¸s‡•ÞÀñò®ÞAhþ|&ÂÙIëx‡9#´ 5ÃÕsÄHNN2[xî°®8õTHbµD$äaÁD©Î“á†u0ŠzP·kZ—ûuÚ-Єâlßk0ªÀÂÃ]Î1³eA÷m<¸ÓRtÕˆûx}̓Ο7×¼™2É0Bs¡v–¨¯ß/+•Ä)!ví^WzcÅJ¿à0‘A > ýB¦i%’ «‡õ Ø1d_‘q™úׂ%»=ÒšC®“bºŠ@<ãtïQÒ’fž#féȇèúì±ËVþ¯Õlð:œ…K³1L‰ðq:D  C¥++Ù+ál?3]?!û0F¯Ç ½<¼@P¨¦Ý2ºhYÓƒšt Ëá;©Ú3cWla·ŽcuÊüž}X°ràÀ#†ÇIò¼žÃfÑÊþªû÷ì¶îÏ,YY»j'g-µ+·0?LÇéŽã2b;MVœ@ŒŽa‡<·êîM¨ÎìqŃ~~~bÐ3—ˆ¦I,п¸ØDÅu0Íü81RaÑŒYvÉÚ2ݲa÷¬lÀ”¹;†M?ø ´áAÌZÁ}‹R8lŽnXÁ–õýví„ú7ÓbV¯^ÝyéšN”žÄ¬m¢X¯«­Á\u,›*ÁPí\dÂÌöÕ‘ëÓã’³gIB"L˜Ž“€ %%5£/öŒpºl9ƒB1Ú2d N⢡é3!ëfÏ€.Úy`½kÕ0 _Àm3¹GdëáŠhÏ^ kWnéj $@–éõÛµ{f¨º]¼h›¢LXÜsSrtªxMç(úõ¸f놽}üúè¾Ñ¨X Š““SÒ³úõã¶idȱh«¦AW­AKÀU›ˆ gÚ4ùâźi IÂu€Õ; vÝÐÞõ~ÐÍí*ºrlæmݪíÐ\Ѫû' €³xÑìÐL¸k¤v ÖP——pó¨ÄÁXÁŒIšÔ€˜'Üã¢%,اO ,GÅDÅJD”œ–™­¯lf¤¡»Æí²ÕI`,Y·«6ÕXfŒÁATç ï´ë¦°xô î‹Ævï±oM,Ÿ]¯³+iu»ÊR“椄éS±ZC<@gùªŠ@ueEyyYq!ÞˆôËÎLKãê˜h3QÚ·ÇU[4Â!xJ­¦•b¬`¿µTMMÇ«"o}b³l…Æ >!00š`ãÆ­œ8¹}ûîÝzÉ\5'ÖÁn›3Ëæt%x>fÁÒŽÓ×PüSq[®2ºs“†°ªj ¶NšEôì D9@§ÊóÁt÷ËÖ€€‰¡„„DÎÂIŽ×kB5«Å2»n×tw˜…‹«Lh°a7ŒnÙÊ{B•ÙwîÖ‚ÙGâG<õýÖ¬æÜú4 æ»­ßu­×¡8ÔŽÏ«ÈThAÖ«ôÍ@k(Ûƒuá"L÷°nOg*Q 9ˆà ‰Éɺr2·°P£Â*B€ÜÐPjBÌ•˜8qò´©ºqiNç…‹"Ü9guÁ.ÚäôM»ÒÜþVò¿»rÓ¬ß]¢ ` Qf!tŠvÅŽ=Rß5ã¦%ØWbÙýDÌŠ¡XöéXý^NWü¸q1‚!Qb’€Ù¶3@y`pÓuFé|©ISìÎ1Í.ZlWnbÛ,ü»v›VE¶šãl å†=¬gàÔÜõkì¦E³€y¡®£gȘÙ9ª›w››šê¸_3C`DwQ’É‘‘v忀*©7,!X J·í 3„ž©³o‰R [G‘mcåŒ×¸Ó5të΂¥ºuUÝ"ÑcÖ1ÂnÙÍîëvÍÁŽIÄ™Ÿô뤬©T&4öß,[P^^ÁU“ˆsX Ig66V7-Úåë·æ,……Qb“Ø9ÉÞQ€É"@•†HbûæN›Ôí{S’ è«ÿØú* ¤•gµ9«ÌÚyÚýeKé¦a$sÿvåöd¶B™½ãØV¸¢¬  -AF‰'‰/+N owÎt€³ìtŒð%QF.à-ŸÕsóÔ î3þÀ8ØÃÂ3Ìn# K–´£vBhrw=0z"2ÂøK—t,F\±à~ÓE"Jÿ®Úeí?ô_€ Ý<_d×êp´øÀ¢‘0AÐ}]èíæðýíöÝh³r#C[ ás逆ÆÖ¨Äµ…{ÚôéfóýV,…]„>XæÇNÔCê—-ƒÚGÙcé¢ùâN̳ ¦’#2ä´´öŸƒôktã4Òàyì‹ÎÊDOàQl˜ó½UØ3åçgö/GawjZ:kˆ%`-FK胲úëŒUÈ%”“‚™¶…ÄH‚H*ƒvÕŠ]Ï2ìÌ­É_´h±Ä}óùfû@§õ?qü˜Ñ(‚Yû¯ôWV–3 ZX˜‹Z(2áØ*æ¨HgÝn7äö€·/6P‡°g&µR]ÂÎgEýKŒC„šy½õÚÚÌ"bØÃÉSX6ã2ZÝG>ßê(E¢ÐùÐâ/Y²) æë¦uÞ>] æšá±èW9ÜÚÿAuÎyl[6qˆ‚“顃¤}ºSÝÐKK¥vLDé¨Õõ‡¸}«±iŸÖ5j”& S© Ä/2Œ •ˆåÌÝžÅ$^~N·ÌSóÏëåÇeëãFãÿiÄPÇþkÓƒQ ×9òéiÉêFaRi3ê†Úî`PĘÀ®ÞJÓ.z‡ àÜùºAŽ?ÀÙÛ£Å)"L°º`a®Õóé"….ÞÞ|³`^ˆŸ‹·°3t•dßøþx>kÿu©X9'ˆ£ [éOÕJHTdp0§HûÂvÕÝŠ=bOØåkØAÊB 3dÅ%å¼®L@dI"aO;guòÁlãXÃÐíoOù^ä~ÎÌ9sgOŸ:mX²?ob[[GÔC›­ý¯RúKͺqîÕçqx$ŒgòB¿¯3Á· ΔËE DÇÇ#Ä 6JBCÇ>\S$­­ŠÀĉ7" LàÂ`~·G9.†cΞ=c6æM›1EéOç§uÔ( ÿ†£Ô±ÿ•ܨ Ènˆ¾ºq¤º€· €=Þ®A“X½’¬³%ú2I*Y ºš³Ææf4˜tñøÔ†“‘6³£Ðý1îÞlwÅ'šoꌵўXû?`€–Aµ!´¯[ÀV‚86®K pSl¿mat|RrŠFEýr4Ijý*µ†ƒ›šØMMF£ŸÔ±N^豄»Í«w¨‡î›2… `¶ÁŽDþŸÍð´ÿÕbÿÑ Â¨@·é°'6ÇQ°€·€ ŠÐ? )71geõ5IÒÎþ@cccS3¶±1a.>šÄ‰“ .« Çn¿±'ùFëOÑ»Ÿ<Ù\ýèV¸¾|¬½ðõ¢ÐQ^^Æ:x! ËÔAââì®q]‚ › ïHá†c¼HB¢ÎÜå*N `ý`¿¸¡Áì$…5hµºÊXÙžÙæØ¯gâÖèM¦ácÜ?V/¹ß¡êü‰ñוŠ”–² Œµ‚9¸~8 TÚ/. j€€^tý‚BE ¢ât9ç ëT¨=¬4hYKË<Ñ(£ ÆM.0 ܈@§)Á™¦€v°¾¥¿u¤Ðb¨fÌŸy#!í_Š6…GEê*‘®‰ð[À¸Ä}ú‡FÆÄ¢‡6ÙÌ‘¸Èút ÑDV«{i[Z” ¬(@.›ðg*’OÚa¹ß‹š†¿h‚ûߟ@NŽ.XNIN690³XQè÷êÝ­pSØEižÔá%Hæ"Üø¥Š@UMMÙM>„ÃøQAÆ#x†À`<ºª æL5Ç~íâ|côÐøGͧÔååSù3øÈ& ´A±¶7) ýl‰ÖÇ‘Á†~On àÍàKß>ÁáQÑÑÜ@’̧µÀñ8¸šöðÀðañŠÀxã";Çn¿žfR½UëáÕÝ6Ò%û ¾oØëï§s ú&ÆtƒÙõº`€ÛŲÞâú1(EÑiâ„T6edºòdn$‚  lÖ(6qèPÑÂB¨QÈ ª¦XAŸ@Xèìâ‹ ãaBÇŽæí#ÂjÕÀˆA€ºz–r—\a¡>‹ýŸéÔ#ÑÈ×·7_GÞ6½éÃ!²IRñ‰€[~@ô­¨]XêaK‹" Ê&ñX‘ ¹¨ýBþtÜè1hûÅíƒýMݯ©Ùp€ÎE)/ÓErý‹œ^àôtÓÀg1h‡ ðñ¹mî3°d.î€M’&%Ñ)ÌpòЄ¥e´Ì•™×æxc ¨GBèQ† GPÇY@ð¹\úh¡½m̘6üü(ñ{FRï5­ ýuuÚZVFë§á/ŸŒ””ÌLŽQú1:ô{{yxÜ.÷iÅØ a@ —±©&LL2ï‹M~ ˆ‚ÊJÓMÖm  CŒ€R²9.ˡǷ,?¦m䨶¶Q ÿÙð&¥Í/fè/-¥üççiø›™žŽF Äø˜h}ÂURÞž=z€·€B€$)’Á6Å$apòXÍZŒ¤€` 5t€0l˜ZÅ‘æ´"ZWÈJ½„,2ºsÄ01#Ð}CI½ümvyZªß(ÿ™ð7‡ÏA2ÒS¬ÄjeQ7s€n ˃  Í0K˜”’ê–€WØß(C¸ÆHˆ"Ð>‚« Í¡‹Ô ñ¦j Ÿ ŸRàG±Ûmžä?kêõìÿÖg`Éü ÑŸ˜¢~&$  UÀü@¿‡sÿ¾'hö‘j3=SràF­Äbæ˜+? ƒ·Š© ÊËYA]0È`àˆ‚9à ?ð7!Ý‚b8~8F!ÞÒ Ùá7IO‰zô\E ©/.¶ •þqP3 ¢þH¿¿C?·Šþû±€s„>¾È’âM™<é–eˆÑCåTÖ)ÊBÈsŒq>Ô8ŒV>ÀñÂò-è÷:lH“¿§vzOé//Wò‹‹õ!DV–6%&ÆÆ²†'1L©xûØæ"ð—ˆ@l\<^˜ŠåIë×2÷´‚’ T¨0Jäü ãé-í=e!v¸ñlA6x]~C•¿™_47[£_ke_?Rßî¯0ZÀ2ÄýqLNŒ¥ù³öß[“€7¥ï–è%ôé£Q¸ƒ8<.KKKKÍ29‚ƒ@œ‚4D #‘â«QK1âÝ‚Âù]þDµy¿¶ÆÐÏîo®KAä/±Ê_Âüéé©b˜%þ±æÏÚ„ÀäÞ:ª<}}}Y7·æPUaj*UAvNŽU†4‰b`ª0‚F¼8°F"³ÉLˆà æp—Â׫իFÕ,ü¨ìÃõé‡ì_Ÿøx¸ÿÑJˆµÿž=&ÁþM4,@¦uó0æˆLh€à(-$9Fð…¸EÆ/¨BÞ´3®ëÀ B– ò„ܸùØLÚëy齚¿Ê~Ó>Lü°öÅà=`qqx¨æÃQÔþ‹xw0Ë©9jD£à ã Ùà@0ÐÖâÒ²—_P RØ€•¤´ðºM¾A-!_YÂù=ùah}\¾þþ…8\&ß7‹óDã9`‚NˆÓë7ößyWÞÂÖb,%Å€]õÙHGf«:̇gTbcv!ZD¼,l É#‡z˜·šj²† €K—/«õcM5L ”).Ÿºe‘³\5~lß'éŸøø˜(²g¸ìß] ô‰‡—¯ ¿"ޱ”XL”Ìli¦ø@àDN( BK¥ñT3ÖÖ’Ç ?ûêj½ûr€'§¬Œ^¯f}s™÷Gé/“ûR„åò£c4ÿ©{4o¤ÿ®ÐËS@áX¬aX¤„œð¥¦r =C$‹òó FÀ8B*™I'‘šF²²ŽoV:\/:æD@P¯¿¨P³þ¹¹bù2 ü‘ûJ’#̉ôŸËöós³ÿw×1ù?Ö΃ÂÂTàhå9ã¬,« òó­g˜2Œ—€éލ´T›?°`®1ÿc°¾U®¾€Ìê«ìŸž”drßQLÿ…jÐÏïfáï€ü‚Ã@¶TE ‘4rŒ*È3f–«Dã„rºHªÖ*Ê™ÔXé@}§÷_Qa½¾|’¿*'Gã~ä=0'Q鉌R÷?ôûÞ4þ¿mœü"#ÿ€€Œ!eh@¸¬3]n&‹hrrmŒPß X¹L êäC™ü¡n#Î,¤¡«IDAT”]Ūû †{eeÔ{bø0!—AÒ~™š÷×7Áä>"ä`<^ÍÿÝ4þ¿}œü€âÃ:YsúEVôSI€á" ÅVÀÛÛÍ”s| }çp>m¾ÄÚ…šóàê×Äg|œæþ£„Ñ૾ßMÃß;Àæ<D‡H”ilÀwvô‹’“˜)«¨Â „QJT"à2—ÒJ”¸ÑvÅzñE´øyy¹º" 5©,e~Ò£¹ÿˆ`9Ð~rù:î^`˜@¼B¨Â`ñ UFk²(ïL4Õ*šƒA¡ @¿I0S¬÷\RZlE”=|I!ã;¨öÄéå\xZÚtvþ©ö‹ÖÁ€arýõ²à›ÄÿwÀ}ª <½¼ð´Æ-]—¨9Ãtåƒììl.Â8 ü ÜпˆÎB‘9DG.Ý¡Í>hø–¿_ù A’\¾Pe#"JEõïFzïöOxyYsh”a”jøØE Í% 0Œ9ê# õÄ¡PCº|zÀ 0õ†zù/r˜ìGÖÓT üc)ú¢|IHHš¤GrRˆèžŒ ôö¾•Üï½€¯Ì|ý|.&@ÆÐúpa™rðä–‚ž»~)ð„W ‚˜c1ŠÁÁ®-(¥!iâ& ™27छ«AG—·Î{§Ã+./O\t¤@F¿W\_ñþ¼o5ê»°€ÞÛåI€`m‚QÔñЈš „úBgZ§Ã?‹çÏÉÁ¥ƒn(VžÈ0ù‹CƒCñX8®¶~ô¾âïÛR©Isof,Æ(Ä€ "Q³¬c&›“jŽNDyÀ*‰…ùïbÃé^##à DÑß×Ïljûy·­ï=œÞæPüô߇øâ¹àÄ›C­.w›ä:`tfVPÝæ×q1Ññ°§qQ(¼x¡ÒÇ,H¶ýtyüt»çŽð0Ç‹ed넹8²/$=I‰ÊY@Ù"±‰Q?ð$µËW,^tLt¼Áì!æ BÐϬ¯×VZ¿ŒiB%׉q?ó¸X\7>S ˜ç‰”ÿ4"4 =ž@\¾¿¿Ÿ¶ýܶç×ùÜ1öÀ/ò²6Q B±‹¡œÊå:Ñî‡5= n`4âw'"*B),$Ð\=h‡Ý‡â÷ºϯó¹khÂÌÓÓb@…(0P ¨ÅôX4˜ÔS6A„ÇŸˆ”ØBä>4,80H/å>ï퉚Çm$>z:w @';숬‚š… &Nì‰r޲ŸŠoCQKW qžÕúØíë‹l/nÞ³ûgwòï¿ã¿ Ó±~ÿÕÈÀA’jN$É 73.ÃèB†3¾¥ÅŸK¤ÇhÏ×\å¥Õ.;u|ºüûïø/èt¬_àãÙ,è2„ú 1'\ƒ8×רè‡0«@úÉ/ò14Ðû>¾dü^]8îŽÏ]û‹:Os,+˜cŒ9b* €Cþ$_°Æ§ÇÛœ{õï¼gX œVð7‡ö Í 012 øýÀ@ÏÏD{<÷êßyϰ‡¶Q1àNG k9ÂÄ´°tšã²ÇÁÎÍνû‹Í)T 8jÌ}|,‹SQ Ô~tóµÃÛœÿõxhIÑ9ˆá‘µ€PÅ ƒÀ•ÆŸÐ~¸O|ü߀)§ôvÅ jϼ̱ÂT³goHÌ=q¹ëÿÎ{ößh¯­5³,n8Ä‹¹lv¤á›÷îÆ»ü;ïùÿÀM$z™<½”fO$lc§;Ëßkøë+ƒ0’A˜IEND®B`‚rgl/inst/fonts/0000755000176000001440000000000012100313500013155 5ustar ripleyusersrgl/inst/fonts/FreeMono.ttf0000644000176000001440000107372011257014120015430 0ustar ripleyusers€`GDEF)ý3¹v´BGSUB×"ÈÛvøØOS/2eˆô¥hVcmapÚ(?Ì(cvt !y ôgaspÿÿv¬glyf:ñI$¹ÂheadÜcOì6hhea ª$$hmtx N}À locaêRÔ ø(,maxp Ë®H nameœ­è=postÊ™lü(_™FÛËc_<õè½WøÛ½WøÛýÓþÁ»" ÿ8ZXýÓÿ»| àxš@.XŠ»ŒŠ»ß1 àÿPxû€ PfEd@ ÿý ÿ8Z"?€¿ß÷°!MXXðX’X\XqXWXiXìX&X“XqXHX‡XHXâXqXqXqXTX`XiX`XˆXiXqXˆXâX‹XHX3XNX†XiX X+X?X+X+X+X?X5XqXTX+X?X XX3X+X3X+X\XHX(X XX(X3XgXXqX›XqXÿôX›XHXXTX?X?XiX?X+X\X“X?X\X X5XHXX?XTXgX+X+XXX3X3XsXÅXXÅX\XXðXqX?XgX3XXBXŒXX›X?XHXHXX›X›XHX¯XµXX+XOXâXÒX¿XšX?XXXXqX X X X X X X X?X+X+X+X+XqXqXqXqXXX3X3X3X3X3XvX(X(X(X(X(X3X+X+XHXHXHXHXHXHX XTX?X?X?X?X\X\X\X\XHX5XHXHXHXHXHXHX5X+X+X+X+X3XX3X XHX XHX XHX?XTX?XTX?XTX?XTX+X?XX?X+X?X+X?X+X?X+X?X+X?X?X?X?X?X?X?X?X?X5X+X5X+XqX\XqX\XqX\XqX\XqX\XX|XTX“X+X?XFX?X\X?X\X?X\X?X9X+X\XX5XX5XX5X5XX5X3XHX3XHX3XHX X X+XTX+XTX+XTX\XgX\XgX\XgX\XgXHX+XHX+XHX+X(X+X(X+X(X+X(X+X(X+X(X+XXX3X3X3XgXsXgXsXgXsXiXXÿæX,XX.XX?X?XTXXÿÂX:XXDX+X2X\XXWX?X0XX­XqX+X?X\X:X XX5X3X3XHXXXÿæXX<X\XgXfXQX+XX+XHX(X+XNX+XÿîX3XgXsX`XPX_XXXTXPX_X†XXXØX3XðXXXXXX|XXX X XHXqX\X3XHX(X+X(X+X(X+X(X+X(X+X?X XHX XHX X X?X?X?X?X+X?X3XHX3XHX`X_X“XXXX?X?XXXX5X XHX X X(X5XþCXþIX XHXþ1Xþ;X+X?XþCXþCXqX\XþCXþCX3XHXþSXþOX+XTXþCXþ;X(X+X\XgXHX+XoX|X5X+XgXsX XHX+X?X3XHX3XHX3XHX3XHX3X3XXXHX?XXXTXTX?X?X?X?XCXgXgX“X?X?XMX4X2X+X3X3X\X­X‡X\X\X‡X X X Xÿ½X5X6XHX XpXTXTX4XTXiXTXTX<X<XgXWXWXWXQX+X+X+XXX3XQXsXsX_X†X†X†X?XIXMXSXX?X\X?X†X†X)XXËXXûXûXûX,XÏX›X›XX›XX›XåXåX,XÏX»X»X»X»X›XúXÏXX‘X›XÖX³þCþÀþCþ9þCýßþCþ¢þ4þtþwþCþCþÀþ„þCþCþCÿ0þ§þ§þzþÀXþEþ þCýÓþ9þ4XÿñŒÿþâÿö<ÿþz +> +g53q+ E33+fH3.'Fq3?‘5­+?<=D‘z5q­F:+|HR]+++Q"+Z+H++pB%PY+++>@\qqT $323 ,+> +\33-9 533+?H2(2IÿÒ +@ HQlr7? gAAFX4AHATf3ÿø35` @ lJÿÄX??+rJg\\“"+F>3>"+l+>r>r>r \g$F$F$Fÿç 5R5Rÿó?T?THz33(3ÿîJ`J`J`ÿ¬ÿÎÿ¬ÿÎq $F5RJ` H H +?2K2K \g\g3>3>3H3H3H@J232323I` ))+"":) 4?.)k5!Z=*+@ ) \*A\G3Z 4+!,+}545IG85GBP6[G5] F5,,g5?y iHY³™™˜ÔÔÔÔÿã™dÔ1â<<…<<ª…<ª<<<<<ª…<<<<<21<3ZZZúžÑ²GGGG©©Ñ¸¸¦°çç°°¢Ë¤££‘©©©¯ä°ç°äz3°ç°Ÿ~±ü›ŸÑ´¢ç¢–n’3üÖÁiXiMŸ’3®©Víí¦v3Z H+++?T+?+?+?+?+?+?+?+?+?+?+i??5+5+5+5+5+q\q\+?+?+??\?\?\?\ 55553H3H3H3H+++T+T+T+T\g\g\g\g\gH+H+H+H+(+(+(+(+(+  (3(333gsgsgs++3Hi Hþ,þs H HþYþj H H H Hþtþt H H+?þdþk+?+?+?þkþy+?+?þtþsq\3Hþtþt3H3Hþtþt3H3H3H3Hÿ?ÿ83H3H(+þtþ[(+(+ÿ_ÿ((+(+3333þtþt33????????ÿüÿùÿ€ÿpÿ€ÿpÿ#ÿ,‘‘‘‘‘‘ÿÈÿÁÿHÿ8ÿHÿ855555555ÿèÿàÿgÿWÿgÿWÿ ÿ­­ˆˆOoÿŽÿ~ÿŽÿ~ÿ;ÿ:HHHHHHÿèÿØÿbÿPÿ‡ÿw++++++++ÿÇÿLÿ=ÿ«++++++++ÿéÿÙÿ_ÿRÿ†ÿ{ÿ<ÿJ??‘‘55­­HH++++????????ÿüÿùÿ€ÿpÿ€ÿpÿ#ÿ,55555555ÿèÿàÿgÿWÿgÿWÿ ÿ++++++++ÿéÿÙÿ_ÿRÿ†ÿ{ÿ<ÿJ??????? ÿþÿþ ÿ÷‘Œ55555ÿÆÿÆÿåÿå5ÐЀjj\Z`Zqq ÈÈ ++++++33ÿÎÿÎÿÁŒŒñ+++++ÿÜÿÚFñ÷ˆHÿô‡‡]]]]||Ê3"É]É]?%p†ÿô2Å&OÀ·µÎ·ÀͲ²±ã”ò¸º¸ÑºÃв²±ã+?< ? \!0VVu 4+3#þ÷1NN+ +^8q1!%+% (??+ )º6ººpzw€((MM(º(º)>*š*šš)E)E„iŒiŒ*)('+&;9!!»!1»)+))*J*!!888¦8¦¦ G++q++&&s&&s3qHHHqâ%&&((ˆ8n8(((\\\HHH3\333333335;5;))ÎHN‰‰3333######((((((((((((((Êf7…((((H7((ÄÇ,,,<Ü<s#ThTTºTº<< "ðÜÜÜÜÜÜÜÿïÿïÿï,,, ,,2212222222¯¯22––##¨¨TTÇÇyy##¨¨99¬­^_####Y############,–#,#,##2222Ê22222###2222####22222}}2/<xZ#222&2PP#22222222###vvv@……55mx=ll}}--lllkkkkpppppppllllkkkkppppppppê ˪¹Z<<<<<<<<H3131<<<<…<<ª…£<<<<…<<<21<3ª<<<<Œ"44 ~3B\mv‰’—™¤§¿ËÝßî"(38BDzŠŒÎÓÕÜ_djlqÄÈÌõùV†Š¹Äêôð›ùEMWY[]}´ÄÓÛïôþ   " & 7 : > F I K Ž ¤ § ª ¬!!! !!!"!'!+!2!5!o!Õ" """"0"5"7"="E"H"S"Z"a"g"l"o"w"ƒ"‡""¯"¾"Æ######*#´#·#½&& &&&&&&)&.&7&<&B&o'ë(ÿöÃûûû6û<û>ûAûDûOÿýÿÿ  $AP_oxŒ”™›¦»ÆÐßî!'35BDz„ŒŽÐÕÚdjlpŒÇËÐø1aа»Ðð   HPY[]_€¶ÆÖÝòö    % 0 9 < C H K p £ § ª ¬!!! !!!"!$!*!2!5!S!"""""'"4"7"<"A"H"P"Y"`"d"j"n"v"‚"†"•"¢"¾"Å######)#›#·#º%&&&&&&&(&.&0&9&?&i'æ(öÃûûûû8û>û@ûCûFÿýÿÿÿõÿãÿÂÿ¾ÿ±ÿ¤ÿ¢ÿ¡ÿ ÿžÿÿœÿ›ÿšÿ‡ÿÿ}ÿ|ÿnÿ]ÿTÿOÿKÿAÿ@ÿ7ÿ6ÿþøþ÷þöþõþôþðþÍþÉþÄþÃþÀþ¦þ¤þ¢þŸþþfþ\þYþ4þ3þ(þ#íxæiæeæ_æ]æ[æYæWæVæUæTæSæQæPæOæMæJæIæ8æ6æ5æ3æ*æ)æ(æ$æ#æ"åþåêåèåæååå’å‘åŒåŠåˆå…å„å‚å|åzå]å=åååååååäÿäüäúäóäîäéäçäåäääÞäÔäÒäÅäÁä³ä­ätäsäoäkäeä\ãìãêãèâ¦â¤âžâ•â”ââŒâˆâ‡â†â„â^àèàÔÕÓ½¼»º¹¸ ®)*+,-./0123456789 ;’²Ÿ À~{€utho  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾rdeix¡pkvjˆšsgwl|¨ºcnm}b‚…—¹Áy„ŒƒŠ‘Ž•–”œ›qz!yVVVVÄöš|h"B–ìp²ÞB„ô<ºl¾ : Ð  ¾ T À  d ¤ î †Bª6¼ Šî†J¨6~òP´Úh$tæ6–zÀð2`¤¾ú”ŒŽ˜^®  R ø!v!à"p"þ#f$$$–$ö%D%¢&"&†&È'R'v((v(†(ô)Š*6*þ+œ+Ô,¾- -î.‚.ú/&/60 0,0–0ê1b1ü2:2˜3(3f3º44r4ì5®6”7¢8:8Ð9h::Æ;„B>Ü?|@<@°A&A¢B>BÀCvDDœE6EòF¬GG´HVHøI JhJüKtL&LðM¼NŽO€PpQbRnS<SôT®UnVLV´WWŽXXàY¶ZNZè[ˆ\J] ]„^^¬_<_Ò`ˆaa®bhbäc’d<eeÊf¤gZhhh4hJh`iiÊjbkkk®l,lÊlâlømŽnBnìo´pRqq&q<rrêsssÚt˜t°tÈujvvv,v„vÒvêwwŠxx„x¾yVyÚyðzf{ {¶{Æ|>|ª}}„}ø~^~t~Šz€€¸Bì‚~ƒ0ƒ®„<„Ô…L…Ê…â…ø†¼‡†ˆ ˆÜ‰œŠ6Šð‹„ŒFŒâÎŽ¼ŽÔŽêêö‘æ’Ø’î““ˆ”&”••.•D•È–<–T–j—2—蘺™zš(šÈšàšö››$›ÞœTœÆ8¤žž”žüŸ” P ` æ¡€¢*¢°£l¤¤,¤Ä¤Ú¥^¥r¥ˆ¦¦Î§J§Ü¨¨©>©úªZª¶«€¬¬j­­´®0®°®À¯d°°¼±`±ú²®³f´"´Ü´ìµŽ¶,¶¬·H·¶¸\¸ú¹Âº(ºÀ»\»º¼¼¦¼¼¼Ò½¦¾@¾Æ¿j¿€¿öÀÀRÀ®À¾Á~Â:à âÄ*ĤÅ@ÅÜÆªÆÀÆÖÆìÇÇÇ.ÇDÇZÇrLjǠǸÇÐÇèÈÈȠȸÈÎÈæÈüÉÉ(ÉÜÊʦʼÊÒÊêËËË,ËBËXËnËâÌpÌþ͜ͲÍÈÎtÎðÏÏÏ4ÏLÏbÏxÏϦϼÏÒÏîÐ Ð Ð6ÐRÐnЄКжÐÒÐèÐþÑÑ6ÑLÑbÑ~ÑšÑ°ÑÆÑâÑþÒæÓÐÔLÔêÕ®ÖpÖ†Öž×ׂט׮×Ä×Ú×òØØ Ø6ØLØbØzØØ¦Ø¼Ø¼Ø¼ÙXÙÎÚBÚàÛ\ÜܰÝLÝÊÞRßß.ßôàTá á˜â0â¶ãbãääˆåF妿æ\æîçŒçâè„é&éîê„ë"ë”ììí$í8íLíÜîFîÊïï*ïÎïäðÊñ@ñÎòHòäòøójóðôôô,ôŽõõšöHöÀöÖöì÷tøøÎùfùúúúdûû®ûÄü`ýpýÜþzþ¢þÊþòÿ0ÿnÿ²ÿô,<L°æø 8džÂJ®fÔZš¬¾Ðâô*<NÊÜî`Îèþb¤ìþ2V”Ò 6 H  Ð ^ v † ž ¶ Î æ þ  , ”  d ®  ^ ÜzÀN¦¶ÆX¼8HHàDöˆJô  6Lbx޾(ðÒ\ÒL¬xê8þhÊVøˆø `!2!°"D##2#H#^#t#Š$ $Ò$Ò$Ò%`%Ö&J&¨&¾&Ô'h'Ü(l(|(Œ(¢(²)Z)þ*+F+ø,œ-- -˜-¨-ì.P.`/(/ê0l101´2.2>2N2^2À2Ð2à2ð3R444z55~66n77z8 8°9:9J9â:p:¸;;.;ú<À=>=þ>d>Ú?L?È?Ø@:@J@Z@¦@¶AhAxAÞBbBàCdCÖD|DêEtFFžF´FÊG„GüH†H–H¦H¼HÌIlJJ¼KRKþLLŠMPMòN®ONO^OàPdQ QÒRRbRÀSS®T@UUØVÞWèXpXÚYzYøZ–[[ \ \Œ] ]Œ^ ^¼_j_z_Š`Laa\a®bbzbôcpcôdxdèeXeÞffgg’hh˜iZjkll*m0n>næo~pp¦q2qºqÐqæqürr"r2rHr^räsbsxsŽt¨uÊvâwþxÀy†zz®{†|Z|p|†|ø}j}€}–}¬}Â}Ø}î~~~0~F~\~r~ˆ~ž(¦€0€¬*¼‚‚ˆƒNƒÔ„^„¤…4…´†6†ª‡Z‡ÊˆFˆÌ‰l‰ÚЂи‹’Œ,ŒÊPÂŽBŽRŽÈ‚Ò~‘‘.‘ä’p““’””ˆ••>•¸–D–À—8—r˜˜†™ ™‚š,𦛛˜›ØœJœÆ>Žž.ž¼ŸFŸ¢Ÿþ  † – Ò¡‚¡ø¢¢Ð££n¤H¤Ì¥n¥¤¦¦Ž¦Ê§§R§Ü¨¨P¨Ž¨Ê©©@©v©âªªÂ«H«ì¬B¬Þ­"­r®®Ì¯¯|°°p°ú±š±Þ²F³³œ´>µµzµâ¶p¶Ü·†¸<¸´¹*¹ž¹¾¹ðº ºbº†º¶»»L»z»¶»ä¼¼R¼„¼È¼ø½&½j½¤½Ò½ò¾¾<¾v¾¸¾ò¿®¿ÜÀ ÀFÀ†ÀÔÁÁ*Á†Á Áî Âb”¸ÂäÃÃJÃrÚöÃîÄÄFÄhľÄôÅ$ŰÅâÆÆRƤÆÜÇÇ>ÇhÇ´ÇúÈ4ÈlÈ®ÈäÉɲÊÊdÊ~ʸÊæË.ËhË€˲ËàÌfÌæÌþÍÍ,ÍDÍ\ÍtÍŒͤͺÍÐÍæÍþÎÎ.ÎFÎ^ÎtΊ΢κÎÒÎèÏÏÏ.ÏFÏ^ÏvόϢϸÏÐÏæÏüÐÐ*ÐBÐZÐpЈРиÐÐÐèÑÑÑ0ÑHÑ^ÑvÑŽѦѾÑÖÑîÒÒÒ2ÒJÒbÒzÒ’Ò¨Ò¾ÒÔÒêÓÓÓ0ÓFÓ^ÓvÓŽÓ¦Ó¾ÓÖÓîÔÔÔ6ÔNÔdÔ|Ô’Ô¨Ô¾ÔÔÔêÕÕÕ.ÕFÕ\ÕrÕŠÕ¢Õ¸ÕÎÕæÕþÖÖ.ÖFÖ^ÖtÖŠÖ Ö¶ÖÎÖæÖþ××.×F×^×v׎צ×¾×Ö×îØØØ2ØHØ^ØvØŽؤغØÐØæØüÙÙ(Ù>ÙVÙnÙ„ÙšÙ°ÙÆÙÜÙòÚÚÚ6ÚNÚfÚ~Ú–Ú¬ÚÂÚØÚîÛÛÛ6ÛNÛdÛ|Û”Û¬ÛÄÛÜÛôÜ Ü$Ü:ÜPÜhÜ€ܘܰÜÈÜàÜøÝÝ&Ý<ÝTÝl݄ݚݰÝÆÝÞÝöÞÞ&Þ>ÞVÞnކޜ޲ÞÊÞàÞøßß(ß@ßXßn߆ßžß¶ßÎßæßþàà.àDàZàràŠà¢àºàÒàêááá2áJábázá’á¨áÀáØáðââ â8âPâhâ€â˜â®âÄâÜâôã ã"ã8ãNãdãzãã¦ã¼ãÒãèãþää.äFä^äväŽä¦ä¾äÔäêååå,åBåZåråŠå¢åºåÒåèåþææ*æ@æVælæ‚æšæ²æÊæâæúçç*çBçXçnç„çšç°çÆçÜçòè è"è:èRèjè‚èšè²èÈèÞèôé é é6éNéfé~é–é®éÆéÜéòêêê4êJê`êvêŽê¦ê¾êÖêìëëë.ëDëZëpë†ëžë¶ëÎëæëþìì.ìFì\ìrìˆìžì´ìÊìàìöí í"í8íNídízíí¦í¼íÒíèíþîî*î@îVîlî‚î˜î®îÄîÚîðïïï2ïHï^ïtïŠï ï¶ïÌïâïøðð$ð:ðPðfð|ð’ð¨ð¾ðÔðêñññ,ñBñXñnñ„ñšñ°ñÆñÜñòòòò4òJò`òxòò¦ò¦òîó,ó’ôLôbôxôŽô¤ôºôÒôêõõõ0õ öö*ö@öVölö‚ö˜ö®öÄöÚöò÷ ÷z÷ìøøø0øFø\ørøˆøžø´øÊøàøøùù(ùÀúNúŽú¤úºúÐúæúüûû,ûDû\ûrû²ûðüü@ühüxüžüÌüøý$ý4ý€ýÊþþ$þjþÊÿÿÿÎ<hxâ&’Ôè¨ÂÂŒ  $ Œ Œ Œ Œ ä ` ô 2 Ö f Æ ø X ª ô ²ÄÖèú 0BT²äB”Þ\ ªr2f.¼œ¨´ÄL¨D¨ê ¨!^!Î"#*#B#ö$R$R%,&&&"&6&Ê'Ò))ð+,@-N.J/v0Š1î364>4¾55X5´6(6~6ê7d7ê8x8ˆ99°9À9Ð9à9ð:B:–:ì;@;Âx? ?ž@N@ØAdAxAŒB B B„BæCHC¬DDDÎDäEE¦FzG<G¨H H"H8HLH®IIÆJ‚K K¾LPLàMM^MžMèMþNN*N@NÚNôO O¤P@PVPlPâPøQvRR”RöSVS´TT U"U~U~VVrWWÀWèXX–YrYÎYäZ¶ZÌ[H[À[æ\6\ž\®\¾\ö]º^0^¼_Z_¨_Ì_ö`<`„abc@dBeÔg®hBhXii†jj®k:kÆlm4n nvo o¤oºp0p®qqtqÔr:rºs<sºt>töu u"u¢u¸vv^vÌvâwdwÔxVxÄy.y˜zzlzÖzú{ {D{d{ˆ{¶{ä||P|Š|È}}f}Ä~0~n~žDDŒªÈ耀,€P€r€–€¬Dd„¤Ä‚‚`‚ª‚ăƒ`ƒzƒÆƒäƒþ„„<„V„v„¦„ð… …<…r…º…ꆆ†¬‡:‡‚‡Ê‡Ê‡îˆˆ"ˆ<ˆVˆpˆŠˆ¤ˆ¾ˆì‰‰J‰z‰²‰êŠ&ŠbЂТŠÂŠâ‹‹"‹B‹b‹‚‹¢‹Â‹âŒŒ"ŒBŒbŒˆŒ®ŒØ*T~¤ÈDŽjŽ–ŽÀŽæ 6`†¬Ö$HržÄê‘‘@‘f‘–‘Æ‘ö’&’V’†’¶’ê““R“†“¶“æ””F”v”œ””압<•b•Œ•´•ä––8–l–––À–ô——H—x—¨—Ö˜˜D˜v˜¸˜è™™T™†™´™øš>š~𨛠›"›6›L›j›€›Â›Ü›öœœœ4œNœ`œrœ˜œ¾œÔœê4Nh‚œ¶Ðêžžž8žPžhž€žœŸþ¢ª§ô¨¨(¨B¨^¨z¨š¨Ê¨ê© ©(©V©v©©¸ªbª˜ªè«6¬¬N¬š­@­V­x­’­º­Ô­ú®®@®Z®‚®š®¾®Ú¯¯¯>¯X¯|¯˜¯Â¯Ú¯ü°°>°V°x°°´°Ô±±B±Ø²²p´@´ÚµšµÔ¶(¶|¶Î· ·€·Ð·ö¸¸d¸Ø¹.¹ˆ¹Äºº6ºjº´ºþ»»0»F»^»Â»è¼¼8¼`¼–¼ê½½:½ž½Ø¾¾N¾Š¿¿t¿äÀXÀ~À¦ÀÎÀöÁÁ:ÁTÁ~ÃTèÄVĄĄÄÒÅ:ÅÎÅÞÆHÆèÇÀÈÉtÊÊöËzˬËêÌ"Ìl̨ÌðÍ2ÍŠΆÏ„ÐZÒbÓRÔÔÔ´ÕÕŠÕôÖlÖÖ× ×n×¼Ø ØdØÀÙfÚÚÚJÚ‚ÚæÛÛ†ÛðÜ‚ܼÝ ݈ÞÞ€ßߪàlà¦á átââjããäVä¾åNåàæžç0çòè²é¢éÜêDê¨ë>ë¢ì<ìÊííøîŠïïÜðlñ0ñîòÞóHóÞônõ0õ¾ö„÷>ø2øÄù„úDû0ûîüÞýÊþèÿ ÿ„ÿèzÜnü¼ °@úŒFæLÜ p * ¼ v 6  ªdÀ¤Œœ$àn*èÎbÜ„jVfú ¶!v"2"ð#Ö$Â%Ò&'v(`)r*^+n,„-À-ø.\.Ä/T/º0J0à1š22”3$3Þ4p5*5æ6Ê727Â8V99¢:\;<<œ=V>>ö?²@–A~BŽBòC‚DDÎE\FFÔG¸HPI IÆJªKjLNM8NFNØO’PPQ4QðRÔS¾TÌU”VxW`XpYZZh[|\¶]]ª^<^ö_†`@aaäbtc.cèdÎe¶fœg„h”i&iàjžk„l@m$nooØp¾q¤r´sœt¬u¾vøw†x@xþyäzž{„|l}|~: €‚ƒ„*…d†"‡‡ò‰‰êŠúŒJŽ2BV‘’’¨“â•"–ˆ–À—¤˜R˜ò™¼š(š’› ›®œ<œæ<ØžpžÌŸVŸÂ x ª¡~¢P£N¤J¥"¦¦ä§”¨`¨Þ©¤ªªˆ«^«Æ¬^­ ­¤®l¯¯ò°¼±¸²H²þ³’´fµFµ°¶f·0¸2¸²¹&¹¾!nš.±/<²í2±Ü<²í2±/<²í2²ü<²í23!%!!!MþÔ þõšýf!Xðÿñhj"#"'&54763232+"'&5476R . # $  3þºF  þ !  ! ’;Æ\ 3"'73"'’€"4’€"4\ý$$ýý$$\ÿÂü‡:>32+#"'&57##"'&=7#"54;7#"54;76323763232+3† PS[WY NQ[Y„[ [d~áæáÞ~áÞáÞ~qÿ¤çR5432632#"'&'&#"#"=&'&'#"=432327654/&'&'&'4765(2 $C%@0Y 1Q%?19'-X(<1 R%-@#@44<! /5 !CR)ww&O'4:$:G*Wÿôc/?Q%2#"'&5476"327654'&2#"'&5476"327654'&#"'&547%632iB$4 &@%4 &0 */ +“B$3 '@%4 &. *- +ëþ… { ì6 (=&5 '@%&*1 *4 7'>%5 '@%&)1 (4 åzz iÿðÞ7B!'#"'&54767&'&547632632&#"6732+32#/32‰-CD,!G-4 '!! !+ ,o+ &qi?.70@<,6T+ J =$  &E±:FS+)V¥:=#ì;l\3"'ì€"4\ý$$&ÿ„Ê\2#"'&'&5476¶dd en\±œ™´ ¨˜ª “ÿ„7\2"'&547654'&'&5476¨ end]\" ¦šª ±œ–ªqúç\-54327632#"/#"'&54?'&547632……Q RQ Q… ¶‹‹+*p pp p*H #"=#"54;543232#@´´´ÊÊÉɇÿoT‘ 73#"'&547Ï…‘ ‘þ÷H+ !"543!2õþn’âÿñvt%32+"'&5476' -& +&t% *$)qÿ¯çœ #"'&547632âþ¹ G yýH ¸qÿñçj$#"'&=476323276=4'&#"çL/@_5'M.@`4þ³0"@@"00"@@"0_d“J-^Ffd•I-^):OYhJ55IiYhJ55Iqçd32#!"54;#"'&547A‹þÁ‹„  dýÅ*TÞj*7!5432!5767654'&#"#"'&547672{:þvìY7(0H. >\R9-V€O)$M<ÞW$<)6 (I?1d4;QL2'>.9S26 (>#3$B&þä8"*D)7$+G&ˆÿñþj#2#"'&547632#"'&547232767654'&/"3276Õ=iL3(B/#-=DM8h09 =++ $ + % ÷)D9;@")D "D%1C.¦" $ " % iÿÂÞp9D%5#"'&547654'&#"327632#"'&=47632#'5"32¢ L&E.=7"P,/'IF# 9,1W56J3FT. !R$2‘7'L*/G!S;S \F9 KNk£‡L4A þë/¸36  O3 $%!32+"54;#"54;32+"54;'#¬þö6O—³xÌÅ%œLGpl¼“áýö¼%þÛ+3#07#"543!2#!"543327654'&+327654'&'&+|6Z2U?-9þÎ_“X(7!)¤ÐE%6,S•)á<%0I/-dJ.!47þ2"7#?ÿð@/5432#"'&'&#"32767632#"'&=4767632Þ@0:[<2I?RYC &LbfON6 Efeûp4#I>QGaD:F #GONeSTI J+3#7#"54;2+"54;276=4'&'&+h"ÜgD;N@XÜK–L9362L)áRHc8uK>D=KIMA2+3)!5432!"54;#"543!#"=!35432#"=¥:þ>66­þÛ‘çw á‹bÑ-ƒ-+3'32+"54;#"543!#"=!35432#"=¥Šé66ÂþÆ‘çá‹bÑ-ƒ-?ÿð2@8%#"'&=47676325432#"'&'&#"327675#"54;2#Za”I1? FccC?,6T7< d7MDF‹ÂÑ­4cB_JaL A6[.68S I…8 –5'33!32+"54;#"54;2+!5#"54;2+32+"54;µþò6Œ-x66x.6çáÑÑþqç332#!"54;#"543!2#@‹þÁ‹‹? þáTÿðG3 #"'&'543232765#"543!2#ÌC5DNOKIK+Ÿ( þ›S7+@ •‚D:$.e+<37732+"54;#"54;2+%#"54;2+32+&/&'¥Kª66ªK-vÞI)"+ 8W@5*Ý´áùùÆ8/h²9?3!5432!"54;#"54;2#ãþ=``é þ Éá Q3,%##32+"54;#"54;32+32+"54;#F.ŸJ•"cšd"•J©aþáþ¤\þá23"!#32+"54;#"54;#"54;2+õ4þÏK–"6j1J•"øþ1áþÏ3ÿð%@2#"'&5476"327654'&,nIBQGakIEQGaZ>8H;MX?9I:@]Uz€WMZVx„WM)QJdsM?PJbyL=+ó3&732+"54;#"54;2#'327654'&+¥Šé66ð_8&H8Kƒ†Q09'0•ç¾á@,9O1')4"(=&3ÿ%@1A632327632#"'&#"#"'&54?&'&547632"327654'&16())*- &#!8T Z_9.QGakIERDcZ>8H;MX?9I:(   AaN^„WMZVx‡VH$QJdsM?PJbyL=+M3)4732+"54;#"54;232+&'&/327654'&+¥Kª66øT8(‹7(& 9U7'„r^57'-™ûÒá;,5a0%:"@ œ2)3$4$\ÿðü@C5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632½<#,R(R+_#=M6Kj?A,8[.-E `(3F1AVg95"E %QV0!Hp;#8 (7 $DN- H3%32+"54;##"=!#"'&=#Aiûi§È¦)áIrrI(ÿð03)#"'&5#"54;2+32765#"54;2#óI6Ha:,"•J?)6O/ J• þ¯b;,I7IQþ¯R/>+7Q O3!#"54;2+3#"54;2+ È—MºÁN–Ñ þáýöD3 3#"54;2+3#"54;2+# z<•]8p>m9`–>@ps þ$ˆþxÜýöþp(03332+"54;'32+"54;7'#"54;2+7#"54;2+E¿„>¥¤@ƒ¼³n+›™-o ÷ÖÖ÷êÉÉ3%3&%32+"54;5#"54;2+7#"54;2#Biûi³o&˜•(nþÕÕ ããgñ3)55!#"=!!5432ñþvHþó]þ¸:;ÌvŸ:þ4ÿ„½\ 32+32#AaŠŠ3ýzØqÿ¯çœ#"'&547632›G þ¹ ŠýH ¸ ›ÿ„@\ #"54;#"543aŠŠS†ý(qbçg#"/#"'&547,²  ““  gß  ¹¹  ÿôÿƒdÿµ!5dýK22›ê@"/&547632Âr r vd d Hÿð¯(7!5#"'&54763254'&#"#"'&54763232#'5&#"3276£Yf_)R6K;M<#,b]@\-6_*3g3 I0AmN +Pgr@/S=V]x [0K/?_3"H 7P;QrA0?ÿðG\*32+5#"'&5476325#"543"327654'&ö6_Go`A7J=QnH6}U5(C1?T5)D0\ýÍYiK@UeC7hìÖC2AY6(B2A\6&?ÿð¯ +%!32767632#"'&547632!&'&#"þ`T.:VE HGDnH3H:LhA§S2#@-;R2$B,NSþl:.65'aI;O`?3^6A-;S3$@.:W2"+'\16763232+"54;54'&#"32+"54;#"543¥<>Z--ƒ-&66' -„.6\þÿH >",ú÷.! ÿ \üp32#!"54;#"5437#5@ þ— v;¡þˆOÏhh“ÿFÊp#"543!+"54;2765#5¡ñB'2€B ;xþCY,6#Œhh?\)7#"54;#"54;7#"54;2+32+"54;'¹_66_­‚/Ï-ƒ´´´ þ‰“ƒÌ²\ü\32#!"54;#"543@ þ— u\ýÍ  Q¯>6763267232+4'&#"32+4'&#"32+"54;#"543p*0@!:78 "J"/0"J"27"m""¡4;GE1þæ?( Eþõ<) RþõO5¯06763232+"54;54'&'"32+"54;#"543§;2T."m"&&,7('-ƒ-"¡EB :",þ÷, ! 2ýOHÿð¯!2#"'&5476"327654'&'&,jC7LAWhD8LAWY8*E3CX8+E,9¯N>VcA9L?UdC8)C2AX6)A2A[6#ÿF¯#367632#"'32+"54;#"543"327654'&=Jj@ L1`û @.;S2%?.;V2#?ÿFG¯!3532+32+"54;5#"'&547632'"327654'&Í_66ÁbCqh@2M0[4A%/ S2%@-;V2#T«%67632"'&#"32#!"54;#"543øj:(%#)7A³þÄ`K¡f`  "*8ÝOgÿðñ¯D5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632°C"R# &'V,1J4F`=<*4]*'#I\&-D,;UE0) !9C&6 S).# 2;!+ÿðó3)32+32767632#"'&5#"54;5432ºÜÜ=SE KA;e&JJ¡þõ9!?" w+ÿð¡"!5#"'&5#"54;327#"54;32#·TbS"6_,dSJs"BR@&þÒ3 Zþˆ:¡!##"54;2+3#"54;2+PF¨)—A–“D˜)xþ±O:¡ !# ##"54;2+3#"54;2+¹2[Y3To5HV3YE2oþýxþÀÿÿ@3%¡3%32+"54;'32+"54;7'#"54;2+7#"54;2+I¸ „A›D… ¸£o.†‰0nÛ²••²‚‚3ÿF%¡%!#"54;2+#"54;2+32+"54;¼s4¤¡6nÿAéxþµKý÷sé¡!5432!5##"=ÚþÑþŠ-û¡$þ¬8a$T7`Åÿ„“\.#"'&=4'&'&47676=47632B &" 7( . /& ó­0 & ­)1­-(( ­<$ ÿ„@\"542@((Aý^¢Åÿ„“\054767&'&=4'&'&'432#"54763676&" 7( . .& ­0& ­)1­-(( ­;$ \Ôü\$2#"'&'&#"#"'&547672276è1-!*%# 2* ! 8$%J ; *  4 *4ÿÿðÿ(h¡"632"'&54#"'&5476;2 . # $ ¡Fþº  æ !  ! qÿóÕv654322632#"'&'&#"327632#"=&'&547676?):W,@'2J3 8/-Z/E!ðkj$=/?$0O**qq I.7Y7?BA732765632#!"54367654'#"54;&547632#"'&#"032+¶ü#)þ½'h^9%/6, (25cZ)'4?5>U$H+'  1.O#hg_ñé6F7#"'&54?&547'&5476326327632#"/#""327654'&Ç9  8#"7  8,:9-7  7"#7  8/677?%4 (>&6¢8  8/6;+8  7##7  8/6:,8  8#"4 (@&4 'C%3%3@%32#32+"54;5#"'4;5#"'673'#"54;2+7#"54;2+32AƒƒVÕV‚‚‚t¤n'——'n¤vî<dd<÷ãã÷ÿ„@\"542"542@((((Aþõ þNþõ BÿÂ[;S#"=#"+5432327654'&/&54767&54763'&'#"6767654'&ð¨3 /G8s$+ 9"*Ï¥: L AŽ8 5")d@T# 5}>PAI[mE&!"'>: '>!oG('2$PC2 :#þÇ$.+G#-"%1 ŒÿÍc2#"'&547632#"'&5476¾!   è!  c    ÿñTB)9I54763242#"'&'&#"327632#"'&2#"'&5476"327654'&™8%.+.$*91#1) ,8E."“|WUZW{xWVYVzoLEPIctLCQJ-H,A 3"'<#/ )9*pYWxWSXXy|WU)QJdmMFSHenLE›¿>'45#"'&54763254/"#"'&54763232#'5&#"32i65C;!)-(0 7(? ?*C' 7,8 ,"  ,«D; &  ?¡'?632#"'?632#"'?Ð   Ð   ÑÅ  ¨©  ÆÅ  ¨©  H¨¶ !"543!#"5çþ|­óÿÿH+ÿñTB"-=M32+"4;5#"4;232+&/327654'&+72#"'&5476"327654'&é$`ŠA 4 '96?8K(MC|WUZW{xWVYVzoLEPIctLCQJf$$û$/3(/$w$*% «YWxWSXXy|WU)QJdmMFSHenLE›½@#"4;2¢ìì((›Z½|!2#"'&5476"327654/&,H,:'0J+9(08 /8/|:'0H,<&1F+)/9/8 H#"=#"4;543232#!2#!"4@´´´þo’þn-¢¢(¡¡(þû((¯•d(3542#5767654'&#"#"'47632Û–$æ„5$-#77"B''+{5$ $ ,- !=µû d6#"'&5472327654'&#&5476327654/#"#"'47632f:4&5*)+0 - ,&- *> ¾$47  $*   $ . +ê½#"'&54?632±r  r Wd  d +ÿ8¡"7#"5#"4;327#"4;32+5#"¥6_1eRJs"KPe9½&(þÒ< [(þ‡(;KOÿ \)332+"'47#+"54;&'&'&=476;2#5µ>bH†aA.HT8OÈÖP&;"3ý¸Hý¸ </Q*ÿû2%3!âÙv\32+"'&5476' -& +&\% *$)ÒÿSy!3#"'&5472327654+&:-$" %./2, ¿šd32+"5432#"'&5476?G²'A  dþÃ$  šÀA"2#"'&5476"327654'&'&-K+ :(1I,:'2; 1!:!2A;!G,;'1G-%0!; 0 =! ?¡'%#"'&54?'&547632#"'&54?'&5476327Ï  ŽŽ  µÏ  ŽŽ  ÐÅ  ¨©  ÆÅ  ¨©  Dd*AE32#"5432#"'&5476#"'&547632#57332+32+"54763=#G²'A  Áþ¡  ^  •€9  U )kdþà  hþb  ž þt"ÚØ$9$ ]´´=d)P #"'&547632%32+"5432#"'&54763542#5767654'&#"#"'47632åþ¡  ^ þªG²'A  Q–$æ„5$-#77"Ýþb  ž {þÃ$  ýß'+{5$ $ ,- !#Dd6H_c#"'&5472327654'&#&5476327654'&#"#"'47632!#"'&547632#57332+32+"54763=#·:4&5*)+0 - ,&-*> þ¡  ^  •€9  U )k¾$47  $*   $ . +þb  ž þt"ÚØ$9$ ]´´qÿQÒ¡$6%5432327675432"#"'&54767#"'&5476;2‹>#-:BM8h09$k* $ + % ›)D:>@ )C "D%1C.Ä! $ " %  O $5%!32+"54;#"54;32+"54;'#"/&547632¬þö6O—³xÌÅ%œLGplr r ¼“áýö¼%þÛ'd d  O $6%!32+"54;#"54;32+"54;'##"'&54?632¬þö6O—³xÌÅ%œLGplÁr  r ¼“áýö¼%þÛd  d  O $8%!32+"54;#"54;32+"54;'##"/#"'&547¬þö6O—³xÌÅ%œLGpl_„  kk  ¼“áýö¼%þÛ0l XX  Oó $E%!32+"54;#"54;32+"54;'#2#"'&#"#"'47632327676¬þö6O—³xÌÅ%œLGplæ$!4 (#'-¼“áýö¼%þÛ  $ % Où $4D%!32+"54;#"54;32+"54;'# 2#"'&547632#"'&5476¬þö6O—³xÌÅ%œLGpl!   è!  ¼“áýö¼%þÛ     O+ $4D%!32+"54;#"54;32+"54;'#2#"'&5476"327654'&¬þö6O—³xÌÅ%œLGplc6 ,3,%" %" ¼“áýö¼%þÛF-0+1! $ $ N359%#32+"54;#"543!#"=#3542"=#35432!"54;5#))h%…?ª¿N((NÓþ§42P½”á˜oÐ`è]†½$þÜ?ÿS@O#"'&5472327654+5&'&'&=47676325432#"'&'&#"32767632#=:-$" %.>"U6 EfeH@0:[<2I?RYC &AQ 2, E:`STI JEp4#I>QGaD:F #< +):!5432!"54;#"543!#"=!35432#"="/&547632¥:þ>66­þÛ‘_r r çw á‹bÑ-ƒ-üd d +);!5432!"54;#"543!#"=!35432#"=#"'&54?632¥:þ>66­þÛ‘Or  r çw á‹bÑ-ƒ-Ýd  d +)=!5432!"54;#"543!#"=!35432#"=#"/#"'&547¥:þ>66­þÛ‘„  kk  çw á‹bÑ-ƒ-l XX +ù)9I!5432!"54;#"543!#"=!35432#"=2#"'&547632#"'&5476¥:þ>66­þÛ‘!   è!  çw á‹bÑ-ƒ-é    qç(32#!"54;#"543!2#"/&547632@‹þÁ‹‹?år r  þád d qç)32#!"54;#"543!2#'#"'&54?632@‹þÁ‹‹?r  r  þáãd  d qç+32#!"54;#"543!2##"/#"'&547@‹þÁ‹‹?Ÿ„  kk   þá l XX qçù'732#!"54;#"543!2#%2#"'&547632#"'&5476@‹þÁ‹‹?þò!   é!   þáï    31#"54;5#"54;2+"54;32+3276=4'&'&#hMM"ÜcE>LBXÜ")¢¢–J9552LÑQIc8oMBáÑçC>KJKA22ó"C!#32+"54;#"54;#"54;2+'2#"'&#"#"'47632327676õ4þÏK–"6j1J•"D$!4 (#'-øþ1áþÏç $ %3ÿð%02#"'&5476"327654'&'"/&547632,nIBQGakIEQGaZ>8H;MX?9I:™r r @]Uz€WMZVx„WM)QJdsM?PJbyL=õd d 3ÿð%12#"'&5476"327654'&7#"'&54?632,nIBQGakIEQGaZ>8H;MX?9I:r  r @]Uz€WMZVx„WM)QJdsM?PJbyL=Öd  d 3ÿð%32#"'&5476"327654'&'#"/#"'&547,nIBQGakIEQGaZ>8H;MX?9I:M„  kk  @]Uz€WMZVx„WM)QJdsM?PJbyL=þl XX 3ÿð%ó@2#"'&5476"327654'&72#"'&#"#"'47632327676,nIBQGakIEQGaZ>8H;MX?9I:@$!4 (#'-@]Uz€WMZVx„WM)QJdsM?PJbyL=Ú $ %3ÿð%ù/?2#"'&5476"327654'&'2#"'&547632#"'&5476,nIBQGakIEQGaZ>8H;MX?9I:¼!   è!  @]Uz€WMZVx„WM)QJdsM?PJbyL=â    vdâÐ#7632"/#"'&54?'&5472,Ž  ŽŽ  ŽŽ   7Ž  Ž   Ž  (ÿÕ0](17#"'4?&5476327632#"'&#" 327654A EBRFaVHB FCQGaZB ;IZ>8lþß;JZ>83R  WXr…XKBS  XSx„WM€l;QJd[þ“;QJd^(ÿð0):#"'&5#"54;2+32765#"54;2#"/&547632óI6Ha:,"•J?)6O/ J•þÎr r  þ¯b;,I7IQþ¯R/>+7Qd d (ÿð0);#"'&5#"54;2+32765#"54;2#'#"'&54?632óI6Ha:,"•J?)6O/ J•„r  r  þ¯b;,I7IQþ¯R/>+7Qãd  d (ÿð0)=#"'&5#"54;2+32765#"54;2##"/#"'&547óI6Ha:,"•J?)6O/ J•é„  kk   þ¯b;,I7IQþ¯R/>+7Q l XX (ÿð0ù)9I#"'&5#"54;2+32765#"54;2#%2#"'&547632#"'&5476óI6Ha:,"•J?)6O/ J•þ¨!   è!   þ¯b;,I7IQþ¯R/>+7Qï    3%&8%32+"54;5#"54;2+7#"54;2#'#"'&54?632Biûi³o&˜•(nar  r þÕÕ ãããd  d +ó3"-732+"54;#"54;2+32#'327654'&+¥Šé66銑_8&H8Kƒ†Q09'0•ƒZá;@,9O1')4"(=&+ÿðó\B747632#"'&5472327654'&'#"547327654'&#"32+"543|:&.J+:‘:!+:-0=9=3/ :n)³A&;&1<';‹`34$> 9#-N2((7*þMHÿð(7H!5#"'&54763254'&#"#"'&54763232#'5&#"3276"/&547632£Yf_)R6K;M<#,b]@\-6_%11$" <0  6Aþ¿] ": IˆA5TÿS¯L#"'&547632327654+5&'&'45476325432#"'&'&#"327632;:-$" %-@)RS=V]??)2g3 I0AmN 7 <2, C VcA9L?UdC8)C2AX6)A2A[6#ðd d Hÿð!32#"'&5476"327654'&'&7#"'&54?632,jC7LAWhD8LAWY8*E3CX8+E,9Yr  r ¯N>VcA9L?UdC8)C2AX6)A2A[6#Ñd  d Hÿð!52#"'&5476"327654'&'&'#"/#"'&547,jC7LAWhD8LAWY8*E3CX8+E,9 „  kk  ¯N>VcA9L?UdC8)C2AX6)A2A[6#ùl XX Hÿð]!B2#"'&5476"327654'&'&72#"'&#"#"'47632327676,jC7LAWhD8LAWY8*E3CX8+E,9„$!4 (#'-¯N>VcA9L?UdC8)C2AX6)A2A[6#Õ $ %Hÿðc!1A2#"'&5476"327654'&'&'2#"'&547632#"'&5476,jC7LAWhD8LAWY8*E3CX8+E,9x!   è!  ¯N>VcA9L?UdC8)C2AX6)A2A[6#Ý    H'!"43!22#"'&54762#"'&5476õþn’ä!   !   ((Š     5ÿÕÊ(17#"'4?&5476327632#"327654&#"šB  B9LAWR>@  @;LAWPÝþþ3BY8*þ·2AY8*#D  CBSeB81B  AAVeB8Yþø(C2ADº&C2AD+ÿð"3!5#"'&5#"54;327#"54;32#"/&547632·TbS"6_,dSJs"þÜr r BR@&þÒ3 Zþˆvd d +ÿð"4!5#"'&5#"54;327#"54;32##"'&54?632·TbS"6_,dSJs"ƒr  r BR@&þÒ3 ZþˆWd  d +ÿð"6!5#"'&5#"54;327#"54;32##"/#"'&547·TbS"6_,dSJs"Þ„  kk  BR@&þÒ3 Zþˆl XX +ÿðc"2B!5#"'&5#"54;327#"54;32#2#"'&547632#"'&5476·TbS"6_,dSJs"þ³!   è!  BR@&þÒ3 Zþˆc    3ÿF%%7!#"54;2+#"54;2+32+"54;#"'&54?632¼s4¤¡6nÿAéÞr  r xþµKý÷èd  d ÿFN#367632#"'32+"54;#"543"327654'&=Jj@ L1`û¶È@.;S2%?.;V2#3ÿF%c%5E!#"54;2+#"54;2+32+"54;2#"'&547632#"'&5476¼s4¤¡6nÿAé!   è!  xþµKý÷ô     OÖ $,%!32+"54;#"54;32+"54;'##"4;2¬þö6O—³xÌÅ%œLGplðì켓áýö¼%þÛÉ((Hÿð@(7?!5#"'&54763254'&#"#"'&54763232#'5&#"3276#"4;2£Yf_)R6K;M<#,b]@\-6_+ %A 1 tL8þö6O—³xpl3ýö ) "  /0““áþ²%þÛHÿe,¯@O%3232767632#"'&54767#5#"'&54763254'&#"#"'&5476325&#"3276Ì6 T+ %A 1 =Yf_)R6K;M<#,b]@\-)QGaD:F #GONeSTI J­d  d Tÿð+=5432#"'&'&#"327632#"'&5476327#"'&54?632Ö>*3g3 I0AmN +Pgr@/S=V]r  r x [0K/?_3"H 7P;QrA0¨d  d ÿÿ?ÿð'Gÿþ™&ÿÿTÿð€&G Fÿÿ?ÿð¿&Vþ\&ÿÿTÿð-&V ÊF?ÿð/B5432#"'&'&#"32767632#"'&=4767632/&5476327632Þ@0:[<2I?RYC &LbfON6 Efej„  kk  ûp4#I>QGaD:F #GONeSTI J@m XX Tÿð+>5432#"'&'&#"327632#"'&547632/&5476327632Ö>*3g3 I0AmN +Pgr@/S=V]M„  kk  x [0K/?_3"H 7P;QrA0;m XX +#67#"54;2+"54;276=4'&'&+7'&5476327632h"ÜgD;N@XÜK–L9362L›„  kk  )áRHc8uK>D=KIMA2vm XX ?ÿðŠh*:32+5#"'&5476325#"543"327654'&%#"'&54?632ö6_Go`A7J=QnH6}U5(C1?T5)D0)T T \ýÍYiK@UeC7hìÖC2AY6(B2A\6&½~ ~ÿÿ3’?ÿðG\(832+32+5#"'&5476325#"54;5#"54;"327654'&ö666_FobA6J=RmHŠŠ6_ÜU5(C1?S6)D0þJQaL?UeC7`+ÖC2AY6(A2A\6'+Ö)1!5432!"54;#"543!#"=!35432#"=#"4;2¥:þ>66­þÛ‘lììçw á‹bÑ-ƒ-ž((?ÿð@ +3%!32767632#"'&547632!&'&#"#"4;2þ`T.:VE HGDnH66­þÛ‘ !  çw á‹bÑ-ƒ-é  ?ÿðc +;%!32767632#"'&547632!&'&#"2#"'&5476þ`T.:VE HGDnH66­þÛ‘ „  kk  çw á‹bÑ-ƒ-pm XX ?ÿð +>%!32767632#"'&547632!&'&#"7'&5476327632þ`T.:VE HGDnH3H:LhA§S2#@-;R2$B,š1@ ;%1R*NSþl:.65'aI;O`?3^6A-;S3$@.:W2"æ' ' 7 2ÿÿ?ÿð2¿&V \*ÿÿ?ÿF2-&V ÊJ?ÿ2@8H%#"'&=47676325432#"'&'&#"327675#"54;2##"'&54?632Za”I1? FccC?,6T7< d7MDF‹Â°T T Ñ­4cB_JaL A6[.68S I…8 –þÎ~ ~?ÿF2š$4D532++"54;276=#"'&547632'"327654'&7#"'&54?632¸_6+3Grt@%Bi]>3H:LhA§S2#@-;R2$B,T T NSþl:.65'aI;O`?3^6A-;S3$@.:W2"ï~ ~ÿÿ5''G™+ÿÿ+''GÿýšK5'3?C32+32+"54;5!32+"54;#"4;5#"54;2+!5#"54;2+!!Þ.6þò6Œ-x66x)þò¥(þ¬ççT(eeeD+'\=5#"54;32+6763232+"54;54'&#"32+"54;#"43|6_<>Z--ƒ-&66' -„.6ý6_(zH >",ú÷.! ÿ¬(ÿÿqç´&YW,ÿÿ\ü"&YÅóqçÖ32#!"54;#"543!2#'#"4;2@‹þÁ‹‹?)ìì þá¤((\ü@32#!"54;#"543%#"4;2@ þ— vìì¡þˆOw((ÿÿqç'U™,ÿÿ\üK&Ußóqÿeô313232767632#"'&54767!"54;#"543!2#@‹$+ %A 1 þä‹‹? þ"  /0á\ÿep,03232767632#"'&54767!"54;#"5437#5@  I + %A 1 þ» v;¡þˆ ' "  /0OÏhhqçù'32#!"54;#"543!2#'2#"'&5476@‹þÁ‹‹?Ÿ!   þáï  \ü¡32#!"54;#"543@ þ— v¡þˆOÿð;3":#"'&'543232765#"54;2#!32+"54;#"54;2#îQ#D-]_ºþm,,, þ›ƒ& 5•‚3 t eþá|ÿFãp,0#"54;+"54;2765#532+"54;#"5437#5³QzB'2€B 0;¦@«B8l;xþCY,6#ŒhhÏþˆOÏhhÿÿTÿðGð&Gdq-“ÿFÊÕ'#"543!+"54;2765#"/#"'47¡ñB'2€B s„ lj  xþCY,6#ñl XX +ÿ<37G732+"54;#"54;2+%#"54;2+32+&/&'#"'&54?632¥Kª66ªK-vÞI)"+ 8W@5*pT T Ý´áùùÆ8/h²9þy~ ~?ÿ\)97#"54;#"54;7#"54;2+32+"54;'#"'&54?632¹_66_­‚/Ï-ƒ´WT T ´´ þ‰“ƒÌ²þÄ~ ~ÿÿF¡?+!5432!"54;#"54;2#7#"'&54?632ãþ=``ér  r  þ Éáãd  d \ü$32#!"54;#"543%#"'&54?632@ þ— ur  r \ýÍ ‘d  d ?ÿ3)!5432!"54;#"54;2##"'&54?632ãþ=``éT T  þ Éáý•~ ~\ÿü\"32#!"54;#"543#"'&54?632@ þ— uœT T \ýÍ ýC~ ~?6)!5432!"54;#"54;2#7#"'&54?632ãþ=``é²T T  þ Éá~ ~\üh"32#!"54;#"543#"'&54?632@ þ— uRT T \ýÍ ~ ~ÿÿ?3&yAý/ÿÿ9ó\&y}OÝ+3/7632!5432!"54;5#"'&54?5#"54;2#↠šþ<`j  ~`é ÔP \Þ¡ÊÍ> Jå\ü\(763232#!"54;5#"'&54?5#"543?X l¢þ–ŸW ku\þû3 >ÿï2 =ì2"4!#32+"54;#"54;#"54;2+'#"'&54?632õ4þÏK–"6j1J•"Dr  r øþ1áþÏãd  d 50B6763232+"54;54'&'"32+"54;#"543%#"'&54?632§;2T."m"&&,7('-ƒ-"Ur  r ¡EB :",þ÷, ! 2ýO¶d  d ÿ23"2!#32+"54;#"54;#"54;2+#"'&54?632õ4þÏK–"6j1J•"£T T øþ1áþÏý•~ ~5ÿ¯0@6763232+"54;54'&'"32+"54;#"543#"'&54?632§;2T."m"&&,7('-ƒ-"âT T ¡EB :",þ÷, ! 2ýOýþ~ ~2"5!#32+"54;#"54;#"54;2+/&5476327632õ4þÏK–"6j1J•"É„  kk  øþ1áþÏvm XX 50C6763232+"54;54'&'"32+"54;#"5437'&5476327632§;2T."m"&&,7('-ƒ-"Є  kk  ¡EB :",þ÷, ! 2ýOIm XX 5¯06763232+"54;54'&'"32+"54;#"543§;2T."m"&&,7('-ƒ-"¡EB :",þ÷, ! 2ýOÿ9235!#32+"54;#"54;#"54;2+#"'&547232765Ì þÏK–"6j1J•";'1+  ?øþ1áþÏýÆM, 7"5ÿ9à¯74'&'"32+"54;#"54;67632#"'&54723276·&&,7('-ƒ-"K;2T.;'1+  ?*J, ! 2ýOEB :",þ©M, 73ÿð%Ö'2#"'&5476"327654'&7#"4;2,nIBQGakIEQGaZ>8H;MX?9I:)ìì@]Uz€WMZVx„WM)QJdsM?PJbyL=—((Hÿð@!)2#"'&5476"327654'&'&7#"4;2,jC7LAWhD8LAWY8*E3CX8+E,9mìì¯N>VcA9L?UdC8)C2AX6)A2A[6#’((ÿÿ3ÿð%'U™2ÿÿHÿðm&UR3ÿð%1C2#"'&5476"327654'&'#"'&54?632#"'&54?632,nIBQGakIEQGaZ>8H;MX?9I:.a  b ‚b  b @]Uz€WMZVx„WM)QJdsM?PJbyL=Ð^  ^  ^  ^ Hÿðy!3E2#"'&5476"327654'&'&'#"'&54?632#"'&54?632,jC7LAWhD8LAWY8*E3CX8+E,9a  b ‚b  b ¯N>VcA9L?UdC8)C2AX6)A2A[6#Ë^  ^  ^  ^  N3&135432!"'&54763!#"=#35432#"='#";RÓþ¹„F3Z@[;¿Nw j7557j ç\…eIl“N8šqÑ`úFChgCF ÿðB¯07G%!32767632#"'&'#"'&547632676323&'&#"#"327654'&Aþþ8"!- <+I2 'I B.*;*4A/ &/M'þÿØ8Y®2#0#0$1Çb2&  -LfKBWhC0G5$L4!A7A4A[9#?5A^8"+M)4F732+"54;#"54;232+&'&/327654'&+%#"'&54?632¥Kª66øT8(‹7(& 9U7'„r^57'-™ r  r ûÒá;,5a0%:"@ œ2)3$4$ãd  d T%767632"'&#"32#!"54;#"543%#"'&54?632øj:(%#)7A³þÄ`K-r  r ¡f`  "*8ÝO¶d  d +ÿM3)4D732+"54;#"54;232+&'&/327654'&+#"'&54?632¥Kª66øT8(‹7(& 9U7'„r^57'-™ÁT T ûÒá;,5a0%:"@ œ2)3$4$ý•~ ~Tÿ«%567632"'&#"32#!"54;#"543#"'&54?632øj:(%#)7A³þÄ`K’T T ¡f`  "*8ÝOýþ~ ~+M)4G732+"54;#"54;232+&'&/327654'&+7'&5476327632¥Kª66øT8(‹7(& 9U7'„r^57'-™‡„  kk  ûÒá;,5a0%:"@ œ2)3$4$vm XX T%867632"'&#"32#!"54;#"5437'&5476327632øj:(%#)7A³þÄ`K¨„  kk  ¡f`  "*8ÝOIm XX \ÿðüCU5432#"'&'&#"#"'#"=432327654'&'&'&'&'476327#"'&54?632½<#,R(R+_#=M6Kj?A,8[.-E `(3F1AV0r  r g95"E %QV0!Hp;#8 (7 $DN- ­d  d gÿðñDV5432#"'&'&#"#"'#"=432327654'&'&'&'&'476327#"'&54?632°C"R# &'V,1J4F`=<*4]*'#I\&-D,;U5r  r E0) !9C&6 S).# 2;!¨d  d ÿÿ\ÿðü'G™6ÿÿgÿðñ€&GV\ÿSü@^#"'&5472327654+5&'#"=432327654'&'&'&'&'476325432#"'&'&#"8:-$" %/\1A,8\.-E `(3F1AV<<#,R(R,^#=Q02, B <p;#9(7 $DN- ;g95"E %QX/gÿSñ¯c#"'&5472327654+5&'#"=432327654'&'&'&'&'476325432#"'&'&'&#"8:-$" %.T.<*4]*'#I\&-C,;V4<T! '%V,1N%/ 2, B , S).# 2; .E,) !9G%\ÿðüCV5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632/&5476327632½<#,R(R+_#=M6Kj?A,8[.-E `(3F1AVK„  kk  g95"E %QV0!Hp;#8 (7 $DN- @m XX gÿðñDW5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632/&5476327632°C"R# &'V,1J4F`=<*4]*'#I\&-D,;UJ„  kk  E0) !9C&6 S).# 2;!;m XX ÿÿHÿS3&z7ÿÿ+ÿCó3&zêðWH0%32+"54;##"=!#"'&=#/&5476327632Aiûi§È¦„  kk  )áIrrIvm XX +ÿðüh)932+32767632#"'&5#"54;5432%#"'&54?632ºÜÜ=SE KA;e&JJ:T T ¡þõ9!?" w+~ ~H3)32+32+"54;#"4;5##"=!#"'&=#Acciûi``§È¦Q(ÿ(¹IrrI+ÿðó355#"54;543232+32+32767632#"'&=#"43‘JJÜÜÜÜ=SE KA;e&Kewwe(~9!?"€(ÿÿ(ÿð0´&YW8ÿÿ+ÿð"&YøÅX(ÿð0Ö)1#"'&5#"54;2+32765#"54;2#'#"4;2óI6Ha:,"•J?)6O/ J•sìì þ¯b;,I7IQþ¯R/>+7Q¤((+ÿð@"*!5#"'&5#"54;327#"54;32##"4;2·TbS"6_,dSJs"`ììBR@&þÒ3 Zþˆ((ÿÿ(ÿð0'U™8ÿÿ+ÿðm&UøX(ÿð0+)9I#"'&5#"54;2+32765#"54;2#2#"'&5476"327654'&óI6Ha:,"•J?)6O/ J•é6 ,3,%" %"  þ¯b;,I7IQþ¯R/>+7Q!-0+1! $ $+ÿð•"2B!5#"'&5#"54;327#"54;32#2#"'&5476"327654'&·TbS"6_,dSJs"Ö6 *3,%" %" BR@&þÒ3 Zþˆ•-/+1! $ $(ÿð0);M#"'&5#"54;2+32765#"54;2#'#"'&54?632#"'&54?632óI6Ha:,"•J?)6O/ J•Êa  b ‚b  b  þ¯b;,I7IQþ¯R/>+7QÝ^  ^  ^  ^ +ÿðy"4F!5#"'&5#"54;327#"54;32##"'&54?632#"'&54?632·TbS"6_,dSJs"Ëa  b ‚b  b BR@&þÒ3 ZþˆQ^  ^  ^  ^ (ÿe03A327632#"'&54767#"'&5#"54;2+32765#"54;2#ó/%<, %> 1'`;+"•J?)6O/ J• þ¯Q23)" , .!I7IQþ¯R/>+7Q+ÿe,¡:3232767632#"'&54767#5#"'&5#"54;327#"543à" S+ %A 1 )TbS"6_,dSJ¡þˆ 2)"  /0BR@&þÒ3 ZÿÿD'G™:ÿÿ:€&GZÿÿ3%'G™<ÿÿ3ÿF%€&G\3%ù&6F%32+"54;5#"54;2+7#"54;2#%2#"'&547632#"'&5476Biûi³o&˜•(nþË!   è!  þÕÕ ããï    gñ')55!#"=!!5432#"'&54?632ñþvHþó]þ¸:@r  r ;ÌvŸ:þ47d  d sé%!5432!5##"=%#"'&54?632ÚþÑþŠ-û5r  r ¡$þ¬8a$T7`¶d  d gñù%)55!#"=!!54322#"'&5476ñþvHþó]þ¸:Å!  ;ÌvŸ:þ4C  séc#!5432!5##"=72#"'&5476ÚþÑþŠ-û°!  ¡$þ¬8a$T7`  gñ()55!#"=!!5432'&5476327632ñþvHþó]þ¸:É„  kk  ;ÌvŸ:þ4Êm XX sé&!5432!5##"=7'&5476327632ÚþÑþŠ-û®„  kk  ¡$þ¬8a$T7`Im XX i\%%32#!"54;#"54;547632"'&#"²þÃbXX@'3FE06"J )O=E$ /ÿð\8"327654'&%5#"54;32+672#"'#"54;#"543BU5(B1?S6)C0þæ6_ŠŠHlf@3J=RnF_66†C2AW7)B2@[7'‚+T—fM=SgC8hX¶ÿæ3 B327654'&+327654'&'&+!2#!"54;#"32#"'&5476¥“X(7!)¤ÐE%6,S•_Z2U?-9þÎ66  12947þ2"7##<%0I/-dJ.!á *6 ÿÿ,3Þÿð\/"327654'&'672#"'#"54;#"543!2#BU5(B1?S6)C0ñHlf@3J=RnF_66¨†C2AW7)B2@[7'­ëfM=SgC8hX .%N 7327654'&'&#'32#!"54;""'&54?54327272­ÐE%6,S•“­, ?-9þÎ62FJç2"7#Ì£fJ.!—# 0B%3 ÿðN>7327654'&#"5672#"'#"54;""'&54?54327272B1?S6)C0?U5(Hlf@3J=RnF_6- AOÐW7)B2@[7'C2Ê“fM=SgC8hX•  -C'7 ?ÿð@/632#"'&54723276=4'&#"#"=432wHefE: OOebL& ER ^B:F9JT6!ûEJ>X SfNNG# QJATGcA41#p?ÿð›xC547632#"'&54'&##"'&'&#"32767632#"'&=4767632Þ(7  @0:[<2I?RYC &LbfON6 Efeû1/ p4#I>QGaD:F #GONeSTI JTÿð“å?547632#"'&54'&##"'&'&#"327632#"'&547632Ö(7  >*3g3 I0AmN +Pgr@/S=V]x 1/ [0K/?_3"H 7P;QrA0ÿÿ3’ÿÂ3 673276=4'&'&+'!2+"54;#"32#"'&5476‘–L9362LogD;N@XÜ"F 22)D=KIMA2)RHc8uK>á #*6 ÿÿ:,3GÞXÀ@ÿð\/"327654'&7!"543!2+32+5#"'&547632ñW5&A2?U6'B1sþ·¨66_FnbA6K=QjJ†E2BS7*D2AX6(­ýöXhL@VhA4gÿÿDÿ4ǪJ¿Àÿÿ+3G(3À@2ÿð@ -%3276=4'&#"#"'47632"'&'&=íþnF9J[<2I?RYC &LbfON6 EÌE: ý cA4I>Q4aD:F #GONeSTI JJ>X :\ÿðü@H747675&'&5476325432#"'&'&#";2+"32767632#"=#"'&\Q?F1AV<<#,R('2?0=B,,B*7Y1?jp:$—Y(=N- ;g95"1!9D$4$pHE*ÿ£53/7#"543!#"=!35432#"=#0#"'&54723276©6ÂþÆ‘‘ <+  .@Ê‹bÑ-ƒ-ç^  :Wÿ£j532+#"'&547232765#"54;547632#"'&#"A``;'1+  ?``<(3+G wþìM, 7"WO/ 9?ÿðœxL547632#"'&54'&##"'&'&#"327675#"54;2+#"'&=4767632ß(7  ?,6T7< d7MDF‹ÂZa”I1? Fcc 1/ [.68S I…8 –­4cB_JaL A0ÿå"3 5%325&/#"54;2+7#"54;2##"'&5476,.0<'+²o&˜•(n¬* 6> ;ãBO Z$9@ããþü9.'X B#AFÿïE\F%&=4'&'&'0#"32+"54;#"54;676332765#"54;0#'&T 4#-„.6_$v,>JsI 3#)2¯1; ÿ ô4 v °3 =þÓ#P ­ÿø÷3%#"'4;327676#"'&=fD7# %C E x“þEW( 4 @qç3#5#"543!2+32+32#!"54;5#"43‹?‹dd‹þÁ‹_AÉÉ(ðð(+f3L32+&/&'32+"54;#"54;2+%#"54;2#"'&547632765&'&'öÞI)"+ 8W@5*QKª66ªK-v0 /  Æ8/h²9I´áùù' 7  ?j7747632#"'&#"7#"54;2+32+"54;'#"543<(3+G ­‚/Ï-ƒ´._)¥O/ 9铃̲'´\ü\ 5#"54;32#32#!"54;5#"43užb b þ— a:ùþÞéé(:ÿþ&f<7473'""'&54?'#"54;272722+"54; 32+"'": ºNP^U HJÝn8££5n 86 87  1 4þ0 Tþ¬ ÿòQ3=!5#"'"'&5#"54;32767#"54;327#"54;2+32#ì*0@!:78"J"/0"J"27"m""4;GE1 ¬þ/( Eþ2) Rþÿ£T3+7#"'&547232765#"54;#"54;2+#Ò <+  .6jJ•"4þï)^  : ÊþÏýöøþB5ÿH¯06763232+"54;4'&'"32+"54;#"543§;2T."m"&&,7('-ƒ-"¡EB :",þJ¯, ! 2ýOÿÿ3ÿð%@‡3ÿðU 9"327654'&327654'&#"'&547632+#"'&547632,Z>8H;MX?9I:B: 21BQGakIEQGaPQJdsM?PJbyL=  #*6 Uz€WMZVx„WMHÿðN;"327654'&'&7327654'&#"'&547632+#"'&547632,Y8*E3CX8+E,9z? 214LAWhD8LAWH†C2AX6)A2A[6# #*6 =TcA9L?UdC8ÿðR~>"327654'&763232+"54;4'&#"#"'&547632Ùi,D+>c.G*)fVWF 3M R5Kr;)T5M!r=SŠF,j?V’D)IIþá=  3n#%¡M2nLj©P3ÿðTÔ:"327654'&767232+"54;4'&#"#"'&547632ÈE&8"*E&8"$7Y:.„.3 <.?@0;M3+B.;+†J1A_4G1?a5 ;2!þÁ?< ..J?TqC.ÿæó3 9327654'&+"32#"'&5476;2+32+"54;¥†Q09'0¾6 22ð_8&H8KƒŠé6 ú4"(=& #*6 @,9O1'¾ÿFjA7327654'&#"47632#"'&#"67632#"'32+"543C0?V5'D0>W5&)<(3+G =Jj@ L1`û<ÿF3 B7327654'&+53232#&'&'&'#32#"'476;#"'4732+ªaW,6!„ƒY-^ 6% 2 %q?•--•?Ý(& +4#Il‰''uv(* Œá\ÿðü@C63232767632#"=#"'&547676767654'&#"#"=432›$S O"'<$/P);?(4C%9D$4$pHE*8N( 1>!3ggÿðñ¯C6323276=472#"=#"'&547676767654'&#"#"=432¨4Ub0.#S I#)@'3Y,=`n72,VW 9 )^.4"0 $1)S 6:!)7# * 0 EÿÿfêA™Qÿ£j8"327654'&#"'&547632327632#"'&54®%" %" O*3,L-3  +J+I $ $5/+1>)5þrF  <(3”&+ÿ9ó3;%#"'&5#"54;543232+32767632#"'&547232765ÊKSe&JJÜÜ=SE ;'1+  ?!?" wwþõ9!cM, 7"3."32#"'&54763!#"'&=#32+"54;q 22Ÿ¦iûi  #*6 rIþá+ÿðój932+32767632#"'&5#"54;547632#"'&#"ºÜÜ=SE KA;e&JJ<(3+G Î-þõ9!?" -O/ 9Hÿ93&327632#"'&5##"=!#"'&=A3  +J+§È ýÌF  <(3:IrrI(ÿðuÇ=#"'&5#"54;2+32765#"54;27654'&#"'&547632#óI6Ha:,"•J?)6O/ J• 21 þ¯b;,I7IQþ¯R/>+7Q #*6 +ÿð>5:32+5#"'&5#"54;327#"54;27654'&#"'&547632à"KTbS"6_,dSJs 21xþ±BR@&þÒ3 Z #*5 Nÿþ;F"=336767454'&'&/53"=#+&'&54767675#cÏI!5 ) \632 " Ô8+8' ) ZE17]}¯$8Q@/ !;CR2 ¯ea ,;[M>% 47d†;ae+ÿô)3###"'&5#"'4;2+3276532) 4«Ÿ51K!7&&^þ†œ€xþŠQ ?£ÿî%397#"54;2#32+"54;5#"32#"'&5476;2#—˜•(n°iûi³ 22o ããþôÕÕ  #*6 3ÿFj59 32+"54;7#"54;2+#"54;27654'&#"'&547632#üÿAéG¼s4¤¡6n 21xý÷‘xþµK #*6 gñ3!!5432!57#"4;75!#"=!32#6¨:þvžMjþó]ƒQì¶;Þ(ÆvŸ:¸(sé¡%7##"=!32+!5432!57#"43(xû^}GjþŠ’Mñ‡7`$Œ( 8a$¥(`ÿñó34!2+632#"'&547632327654'&#"'&76?##"5p?&,Z3$M5JOJ. IW]-?"-?? ´·3‹ I3Fp=+1 CJ,;X)!  ­7ÿÿPÿñã3GyCÀ@ÿÿ_ÿbµ¡G0À@Xÿ#µ¡G%'3767672'&'67665&/#"0/&76?#"'47!2+32¨c%&P F+<1 <,2U//O&,†9, -  ´È† |ˆl$ ,7- .:M o;   ­~HTÞj632#!5432!57#"4;67654'&#"#"'&547672Š5 ]J:þvÖW€M 7(0H. >\R9- %-<$M<É(L$<)6 (I?1<0*,Pÿñó30!2+632#"'&547632327654'&#"#"'5#"'4hGñI;Z3$M5JOJ. IW]-?"-??-3I3Fp=+1 CJ,;X)!»_ÿ줡8"543!2+6232#"'&76762327654'&#'&'&5zé *y& B$2a1 $Cc @),! xyO$V'= ,U L ÿÿ†ÿòç3G<3@ÀÿF¼ *%654'&#"32+"54;#"54;767232I7V0MbÁ66_3In ‹Wã;G8  <þG G(9l\Fÿ„@\"542@((Aý^¢Øÿ„€\"542"542€((€((Aý^¢ý^¢3ÿ„%\#32+32+"5#"54;5#"54;542@ÊÊÊÊ(ÊÊÊÊ(wgþágÊÿÿðÿñhj1í&8G'&54727632#55##"=335432#"54;2+"54;2=4'&'&/&+¼j VV  껀лšþ\¦¦\;&x  Xm XX ý<;ÌvŸ:þ4áý8þÌIN%& 9u$6E'&5472763235432#5##"=#"54;2+"54;2=4'&'&/&+¼j VV  ¯•ö­sþð\¦¦\;&x  àm XX «$þ¬8a$T7`þˆáý8þÌIN%& ÿð)uJ'&54727632"3654'&##"=335432!5#"'&547235#"54;¬j VV  þf:" X2¤ª{Þ¯•þ¬  > Y66_àm XX ƶ{-´*þ£O7`$þ¬8a1/ p1?Ø" ÄýÍÿðO4:35432#"54;#"54;2#!#"'&'5432765#"54;2#qYÓ((‰Ys/$ 9 _º þ Éáþ›µ7•‚4;:eÿFGp/335432!"54;#"54;2##"54;+"54;2765#5»­þ¡``éüQzB'2€B 0; þ Éá’þCY,6#Œhh|ÿFãp,#"54;+"54;2765#532+"54;#"543³QzB'2€B 0;¦@«B8xþCY,6#ŒhhýÍ ÿðO3<!#32+"54;#"54;#"54;2+7765#"54;2+#"G2£+f&Z£*u" 8/z"U8ØþQáþ(¯þ3$N#eþ›•ÿFGp"8<!#32+"54;#"54;#"54;2+#"54;+"54;2765#5‘4ÍK–"6jÍJ•"†QzB'2€B 0;èþAáþ¿’þCY,6#Œhh ÿFGp5KO6763632+"54;54'&'&#"32+"54;#"543#"54;+"54;2765#5/W+"m"9  -ƒ-"ãQzB'2€B 0;¡E@ >!*þ÷' )  ýO)þCY,6#Œhhÿÿ Oð&Hq$ÿÿHÿð^&HßDÿÿqçð&Hq,ÿÿ\ül&Hÿíóÿÿ3ÿð%ð&Hq2ÿÿHÿð^&HßRÿÿ(ÿð0ð&Hq8ÿÿ+ÿð^&HøßXÿÿ(ÿð0I'q žÿÿ+ÿð¬&qøl¾ÿÿ(ÿð0¶'vÿÂ7žÿÿ+ÿð'vÿºš¾ÿÿ(ÿð0¶'H7žÿÿ+ÿð'Hÿøš¾ÿÿ(ÿð0¶'C>7žÿÿ+ÿð'C6š¾?ÿð¯"+7!&'&#"#"'&547632#"'&'&%!3276? T.:VE HGDnH3H:LhA_67B 3Grt@$z†A-;S3$@.:W2"þJ aI;O`?3^Sþl(64(ÿÿ?ÿð2ð&H q*ÿÿ?ÿF2^&H ßJÿÿ+<ð&Hq.ÿÿ?'HšNÿÿ3ÿU%@&XÖð2ÿÿHÿU¯&XÖðRÿÿ3ÿU%ƒ&qC¬ÿÿHÿUñ&q±­ÿÿ`ÿñóý&Hà~yÿÿ_ÿbµl&Häí0“ÿF^&#"543!+"54;2765'&54727632¡ñB'2€B !„  jl xþCY,6#åm XX 13'6!#55##"=335432#"54;2+"54;2=4'&'&/&+1껀лšþ\¦¦\;&x  ;ÌvŸ:þ4áý8þÌIN%& 93%435432#5##"=#"54;2+"54;2=4'&'&/&+*¯•ö­sþð\¦¦\;&x  ¡$þ¬8a$T7`þˆáý8þÌIN%& ÿð)\ 9"3654'&##"=335432!5#"'&547235#"54;|:" X2¤ª{Þ¯•þ¬  > Y66_†¶{-´*þ£O7`$þ¬8a1/ p1?Ø" ÄýÍÿÿ?ÿð2ð&vÎq*ÿÿ?ÿF2^&vÎßJÿïD5D32765#"54;0#'&'&=#32+"54;#"54;2+35#"54;2#i,>JsI 3#¾6Œ-h&¾&h þg3 =þÓ#P 2ŸçáÑÑÿF<*763232+"54;#"54;654'&#">IqpMþÃbÁ66_C4!\;Ý,3FUMþɆ›‰þ„CC5 %ÿÿ2ð&C6q1ÿÿ5^&C<ßQÿÿ Oè'vÿÂi‡ÿÿHÿðR'vÿÈÓ§ÿÿ Nð&vÂqˆÿÿ ÿðB^&v¼ß¨ÿÿ(ÿÕ0'vÿššÿÿ5ÿÕ‡&vÀºÿÿþCOê&lq$ÿÿþIÿðX&lßDÿÿ OÝgUÇ@À$ÿÿHÿð}gUg@ÀDÿÿþ1ê&lîq(ÿÿþ;ÿðX&løßHÿÿ+ÝgUÿîÇ@À(ÿÿ?ÿð}gUÿøg@ÀHÿÿþCçê&lq,ÿÿþCüX&lßóÿÿqçÝgUÇ@À,ÿÿ\ü}gUg@ÀóÿÿþCÿð%ê&lq2ÿÿþCÿðX&lßRÿÿ3ÿð%ÝgUÇ@À2ÿÿHÿð}gUg@ÀRÿÿþSMê&lq5ÿÿþOX&l ßUÿÿ+MÝgUÇ@À5ÿÿT}gU g@ÀUÿÿþCÿð0ê&lq8ÿÿþ;ÿðX&løßXÿÿ(ÿð0ÝgUÇ@À8ÿÿ+ÿð}gUÿøg@ÀX\ÿü@CS5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632#"'&54?632½<#,R(R+_#=M6Kj?A,8[.-E `(3F1AVCT T g95"E %QV0!Hp;#8 (7 $DN- ý_~ ~gÿñ¯DT5432#"'&'&#"#"'#"=432327654'&'&'&'&'47632#"'&54?632°C"R# &'V,1J4F`=<*4]*'#I\&-D,;U>T T E0) !9C&6 S).# 2;!ýð~ ~Hÿ3-%32+"54;##"=!#"'&=##"'&54?632Aiûi§È¦T T )áIrrIý•~ ~+ÿó3)932+32767632#"'&5#"54;5432#"'&54?632ºÜÜ=SE KA;e&JJ„T T ¡þõ9!?" wý‡~ ~oÿëþ@B'&'&76?67654'&#'&'&76?654'&#"#"=432632—V”"¥  £’8F '<$/P)!3g;?(4C"|ÿ‹î¯A%'&'&76?67654'&''&'&76?654'&#"#"=432632¡K@;” ”K ,‡ º 9 )^4Ub0#é$GB.%V V+!(I  f* 0 E.4",ÿÿ5'ð&Hq+ÿÿ+''HÿýšKgÿ9ñ3()55!#"=!!5432#"'&547232765ÈþŸHþó]þ¸:;'1+  ?;ÌvŸ:þ4æM, 7"sÿ9é¡&)5##"=!!5432#"'&547232765Àþ³-û^þÑ;'1+  ?$T7`$þ¬8‘M, 7"ÿÿ O¿&V\$ÿÿHÿð-&VÊDÿÿ+ÿS3&zô(ÿÿ?ÿC¯&zþðHÿÿ3ÿð%I'q ˜ÿÿHÿð¬&ql¸ÿÿ3ÿð%C'q—ÿÿHÿð¬&ql·ÿÿ3ÿð%¿&V\2ÿÿHÿð-&VÊRÿÿ3ÿð%'qÏìÿÿHÿð}&q=íÿÿ3%&qP<ÿÿ3ÿF%ÿ&q¿\Hÿò±(7632#"'327632#"'&5#"543327654'&#"ÂYf_)R6K;M<#-a]@\-6_f4-[Tÿ|¯7@%547632"'&="'&'&5476325432#"'&'&#"765&'"H6J©l9%S=V]?>*3g3 I#-J€>8DK ;gb` S7HrA07 [0K/?`3><=?ÿ9·\8"327654'&7327632#"'&=#"'&5476325#"543U5(C1?T5)D03  +J+Go`A7J=QnH6†C2AY6(B2A\6&ÖýzF  <(3‰iK@UeC7hì?ÿð»j8%4'&#"3276=47632#"'&#"32+5#"'&547632ÍD0?U5(C1?T5)<(3+G 6_Go`A7J=QnÎ\6&C2AY6(B2º‡O/ 9þ[YiK@UeC7?ÿð¯ )74767632#"'&547632327675&'&#"?(`$(lC5PE]TN1 6[l9S'.e6Ç9)\ K;PiE;&+ O)6)`%I"+?ÿð¯"+7!&'&#"#"'&547632#"'&'&%!3276? T.:VE HGDnH3H:LhAÛW2"A-;S3$@.­€O/ 9þ:.65'aI;O`?3^?ÿFá¼2"327654'&5432+"54;276=#"'&547632S2#@-;R2$B,n+3Grt@%Bi]>3H:LhA†A-;S3$@.:W2"8SþC:.65'aI;O`?3^Mÿôª6%#"'&=47676325432"'&5&'&#"3275#"'6732ßOU?"=>WT;<#+L/: &;>uªv&S.?7M90( C$ %/D6x\4ÿ7(¡&.%3#"54;2+#'&747#"54;2+274+¢2o»%)%¶o1Ÿ%Sþ{J3% 2L„þL-!!2ÿì& 3?632#"=&'&#"#"'&547&#"#"=432632632327654þ E5H*!? H4F, !V@@V"¸<# '‘S$/Z‹A#?Š[/ S99uPw5,w+ÿE'¡1#"'&=#"54;2+3276?#"54;2+32#­<>Z--ƒ-&66' -„.6»H >",ú÷.! ÿýö3'j?747632#"'&#"6763232+"54;54'&#"32+"543|<(3+G <>Z--ƒ-&66' -„)¥O/ 9sH >",ú÷.! ÿ3ÿ9ÞjF#"'&5472327654'&#"32+"54;47632#"'&#"67632Þ;'1+  ?&66' -„.<(3+G <>Z-#þ­M, 7"J.! ÿ¥O/ 9sH >"\üp$#5#"54;5#"54;32+32#!"54;>;  vŸ   þ— phhþX‡°Ÿ­ÿø÷ª%#"'4;327676#"'&=fD7# %C E x þÎW( 4 @‡Ñ¡32!"'476;#"'67!2Awþçyyxþ±O\ü\527672#"'32#!"54;5&#"#"'&5476725#"54;@.$% 1-' þ— *# 2*%už#%4 ;Æç#*  4ð\ü\+85#"54;32+32#!"54;5#"'&7&7664/"#;užŸŸ þ— 26 ,/ 2«ˆþÐÛÛ/4 e5 /" ‡ÿ9\327632#"'&5#"543@3  +J+u\ýzF  <(3c ÿòQ¡=!5#"'"'&5#"54;32767#"54;327#"54;2+32#ì*0@!:78"J"/0"J"27"m""4;GE1 þÁ( E þÄ) R þ± ÿFQ¡=5#"'"'&5#"54;32767#"54;327#"54;2+32#ì*0@!:78"J"/0"J"27"m""ºî;GE1 þÁ( E þÄ) R ý÷ ÿ9¯J#"'&5472327654'&#"32+4'&#"32+"54;#"54;67632672:'1+  ?"/0"J"27"m""J*0@!:78 CþM, 7"i( Eþõ<) RþõO4;GE1ÿ½ÿ9¯7#"'&547232765#"54;6763232+"54;54'&'"§;'1+  ?"K;2T."m"&&,7(&þªM, 7"¢EB :",þ÷, ! 5ÿ9¡¯9327632#"'&54'&'"32+"54;#"54;67632à3  +J+&&,7('-ƒ-"K;2T.'þ¯F  <(3P, ! 2ýOEB :"6¡$!#32#"'476;#"'673#"'6732#ß1þö@„-] ?ƒkþ¾Oþ•BHÿð¯!2#"'&5476&'&#"!3276,jC7LAWhD8LA H/9Y8#tþŒ G/;X8%¯N>VcA9L?UdC8ËV.C*5(S0 B* K¡&2)"'&7&763!#"=#35432#"=#35432%#;Kþ¾E+_<]5¹KKÍþá$™( l-= W7Ls4 šq‰`\óIx(pÿ6!f)532+#5#"'&=476;53#";276=4'&'#_5U%-#P"-5U%-(K"--6* #"1-6* +&1¡>(™8-ÊÊ>(™8-Åí+™++™-ÿÿTÿö¡Uq¡ÀÿÿTÿö[q¡À4ÿ9C¡3327632#"'&=#"'&5472327675#"543!2#‚3  +J+j:(%#)7 >³<xþ^F  <(3–`  "*9ÝTÿF«%67632"'&#"32#!"54;#"543øj:(%#)7A³þÄ`K¡f`  "*8þi iÿ9«.327632#"'&5#"54;67632"'&#"ø3  +J+Ktj:(%#)7AþÐF  <(3¨f`  "*8T¡)"54;5476;2+"32«þÄ`B'2€B ³ÚY,6#ÚÿÿT¡GZÀ@<¡-8732#"'476;#"'673232#&'&/3276'&'&+ª?•--ÚP0P6$2J5!qaO05!„µŒM1%)5þrF  <(3Qÿ£j627654'&#"76547632"'&#"#"'&547632®% % l;'1+  ? <(33,3cA4F  8 A2=P. ­†çA+%567654'&#"#"=76723232+"543ˆ>#-=DM8h09 =-ƒ)é9;@")D "D%1C.Îÿÿ†çAG1mÀ@ÿÿ†ÿòç3G13@À?ÿ6@/5432#"'&'&#"32767632#"'&54767632Þ@0:[<2I?RYC &LbfON6 Efeûp4#I>QþÿaD:F #GONe TI JIÿ¡%07#"'6732#!"'47637327654'&+327654'&+Ž-ãU+Kp:'0þóV]BŽ´N/$L€)O28!!K8"Ä/ 1 þ±- *MÿôuìJ547632#"'&54'&#"'&5&'&#"3275#"'6732##"'&=4767632¸(7  <#+L/: &;>uª OU?"=>WT‚ 1/ C$ %/D6x\v&S.?7M90S ¡7%#32#"'476;#"'6732#35#"'4732#32#"'476;¢è-{%j-è-j&|-Ä›O‹‹þ±ÿF"p$3#5+"'&5676;#"543!32+";2767ž;gM$% G'C!ñDm2% 0!phhý!Y+3"DOþˆ!#( .ÿÿ?\N\\À\¡35432!"'476;#"'6732ïèþsSSÍxþ±l•O?ÿF»jA%4'&#"327632+"54;5#"'&547632547632#"'&#"ÍD0?Y5B1?W5')6ÁbCqh@2M0[O/ 9†çA9%#"54;567654'&#"#"=76723232+32+"54;iiˆ>#-=DM8h09 =ii-ƒ-˜Q9;@")D "D%1C.6oÿÿ†çAG<mÀ@)ÿï9\5"7654'&3'335432!5"#&'&547635#"54;œ"(51tªÂü¯•þÌN4!3"P6_†B2Bc:H0>g6þ±O)$þ¬8a1<M>S‚>?Äÿb=\b"7654'&7!2+32#"/&7676327654'&'&#"0'&76?#32+5"'&547635#"54;Œ"(=1t† Q,7-@IK  <+ 9&1- ´Â&O[6 3"P6_†B2Be9R+9g6~P2>cA4F  8 A2=P. ­þ±1@O>S‚>?ÄËÿð3'#"54;543232+327632#"'&51JJ||3  +J+xwwëF  <(3ÿðFj973276'&7632#"'&#"#"'&=#"54;543232+§4<#9,9+B #7,7J+JJ||H 1$AG0% 1%þ¹A0&<(3ñwwûêv˜#7632KPW êŸûêv˜3#"'75&PW ˜Ÿûêv˜"/K* W˜–Ÿ,à‰•27654'#,&" 8 * $!./Ïà,•"'&54763",3/%! !*6 !!$›ê½#"/#"'&547,„  kk  l XX ›ê½'&5476327632,„  kk  êm XX ê@{ "=472@cbbÿÿ›½@qÿÿê½vÿÿ›ê@Cås¡ 32'&/&76"74?6#úd6 6 6 6 ¡p p þ_p p å s¡ 32'&/&76úd6 6¡p p ÿÿ,À‰uEþàÿÿÏÀ,uFþà» #"4;54232‚¬B(B(BB(»êo 32+"=#"4Ö¬B(Bo(BB(»êÌ54232+"=#"43(BB(BoBB(BB(»@#"4;2‚¬¬(›ê½l23276763#"'&54°1@ ;%1R*l' ' 7 2úÿ^c2#"'&5476,!  c  Ïà‰•2#"'&5476"327654'&,6 *3,%" %" •-/+1! $ $ÿe±!32767632#"'&54767”:+ %A ; !)"  /4!‘Ç] 2#"'&#"#"'47632327676³$!4 (#'-[ $ %›ê½y##"'&54?632#"'&54?632#a  b ‚b  b Q^  ^  ^  ^ Ö‚®&'&767676'&/'&'&767/  // //  //  X/  //  // //  ³ê¾˜3#"'75'3#"'75nPW fPW ˜Ÿ–ŸÿÿþCêþèCý¨ÿÿþÀêÿevý¨ÿÿþCêÿeGý¨ÿÿþ9ÿo]Yý¨ÿÿþCÿe@qý¨ýßÿÉ@!"43!2RþL´(ÿÿþCêÿelUý¨ÿÿþ¢ÿÿcVý¨ÿÿþ4ÿÿucjý¨þtàÿ1Å(#"'&=476765&'#"'&54762þè. +6/6 # + 238 /! ÿÿþwàÿ1•Wý¨ÿÿþCêÿeyZý¨ÿÿþCêÿeHý¨ÿÿþÀêþè{Iý¨þ„êÿ${ 0#"=4720#"=472Ü xcb bbbþCêÿey#&547632#"/&547632#"'þÝ  b  ï  b  Q  ^  ^  ^  ÿÿþCêÿe£'Vý¨@Uý¨ÿÿþCêÿelGUý¨V@Àÿ0xÿæ5!4'&#"'&547632+"'&5476;276B 21BB Ô#*6  þ§ÿ9ÿ‘##"'&54723276=o;'1+  ?0M, 7"*þ§ÿ9ÿ‘!327632#"'&=þÐ3  +J+*F  <(30ÿÿþzÿSÿ!zý¨ÿÿþÀÿeÿYXý¨þEÿgA#"4;2´ìì(þ ìÿ'!"43!2‹þ°Pì(þCàÿ0%""'&54?272þg ¹æ  € ýÓ¨ÿ5‹%""'&547%272ý÷ -® µ þ9ÿo] 2#"'&#"#"'47632327676¥$!4 (#'-[ $ %ÿÿþ4üÿu¶}ý¨ÿÿ9é!327632#"'&=(3  +J+*F  <(30ñÜK–62/&747+  8  ‹  ˜  ŒüͶ -62'"'&7'2#"'&547632#"'&5476C  8  M!   è!  « ˜ P    ÿÿÿýOA'|ÿ ÿ«‡ÿÿâÙv\yÿÿÿö@'IþÞÿÅ‹ÿÿ'@'IþýÿÅÿÿ<ç@'Iÿ$ÿÅÿÿÿð%@'IÿÿÅ•ÿÿÿþ%@'IþæÿÅ›ÿÿ@'IþüÿÅŸÿÿzÿø÷¶&}î¯ O3 $%!32+"54;#"54;32+"54;'#¬þö6O—³xÌÅ%œLGpl¼“áýö¼%þÛ+3#07#"543!2#!"543327654'&+327654'&'&+|6Z2U?-9þÎ_“X(7!)¤ÐE%6,S•)á<%0I/-dJ.!47þ2"7#>3732+"54;#"543!"=!¸Šê66Â(þÆ)á‹b O3)"54;#"54;32%!#4ýð³xÌÅ%þx·áýö)á+3)!5432!"54;#"543!#"=!35432#"=¥:þ>66­þÛ‘çw á‹bÑ-ƒ-gñ3)55!#"=!!5432ñþvHþó]þ¸:;ÌvŸ:þ45'33!32+"54;#"54;2+!5#"54;2+32+"54;µþò6Œ-x66x.6çáÑÑþ3ÿð%@)9%"=##"'4=67235432'2#"'&5476"327654'&Ÿ™™snIBQGakIEQGaZ>8H;MX?9I:â--†00Ø]Uz€WMZVx„WM)QJdsM?PJbyL=qç332#!"54;#"543!2#@‹þÁ‹‹? þá+<37732+"54;#"54;2+%#"54;2+32+&/&'¥Kª66ªK-vÞI)"+ 8W@5*Ý´áùùÆ8/h²9 O3 732+"54;#"54;32+"54;#lO—³xÌÅ%œL·)áýöáÿÿ Q30ÿÿ231E3 '5&'5!#"=!"=##"'4=67235432!5472!54ýþ„Ît™™þ»|þ2ˆddŽŽ¦--†00½ee3ÿð%@2#"'&5476"327654'&,nIBQGakIEQGaZ>8H;MX?9I:@]Uz€WMZVx„WM)QJdsM?PJbyL=33-%+"'&54;!32+"54;#"'&543!2#32‹5þö6  Š,Ž-Þþ" Þþ"ÿÿ+ó33fêA)57'5!#"=!!5432êþ|„þʨ¦4<÷Ô:£yâþþH3%32+"54;##"=!#"'&=#Aiûi§È¦)áIrrI3%3&%32+"54;5#"54;2+7#"54;2#Biûi³o&˜•(nþÕÕ ãã.*3 8C#";5#"'&5476;5#"543!2+32+32#!"543327654'&#"R0:'/2._8%H7K us e<)E3D.sþð2I+=,7¥5!(=&‚YA+9O2&<!,/8?&+@'1rT"'5ÿF¯+4'&'"32+"54;#"54;6763232#·&&,7('-ƒ-"K;2T."ºÚ, ! 2ýOEB :",þHqÿñçj(#"'&=47632!3276=4'&#"çL/@_5'M.@`4)þÜ0"@@"00"@@"0_d“J-^Ffd•I-^):•hJ55Ii?hJ55Ii­ÿø÷ª%#"'4;327676#"'&=fD7# %C E x þÎW( 4 @F¡(3#"54;#"54;7#"54;2+32+"54;'À_66_­‚/Ëë-ƒÐO±ˆŸ°–:ÿþ&f#32+"54; 32+"5473'#"54;2þn8££5n ºG^U 9ýîTþ¬•+ÿZª)7#"'&5#"5673327#"54;32+5#"¥4^0UQJq#JPXE¢þË&] þVcA9L?UdC8)C2AX6)A2A[6#R¡%!2+32+"54;#32+"54;#"54m~""x-è-w!"¡þ±Oþ±OÿB»0%#"'32+"54;'47676324'&'&"3276K:Qn@bÁ6M,668F )+ &”%?C.=T4%âh?1[û`cF (S"B2 &%?JV4$B/]ÿm÷©5&#6'"'&54763676'6'&''&7&762432#"5Î2:ÔT"']&#N:* 9S;9|=M;1P0³d'*I  97V–:#E+ÿòª.%4'&#"3276#"'&'&'&5476763!2¥A,;T2#@-V5&12BsP1<%<+ [A '+ÿø)¡#327676#"'&5#"567!2.D7# %C E ¾ÄwÿW( 4 @$ÿ+ÿô)¡%+#"=#"4;327676=#"54;2)5«4^ $91-1猜é(þï3!0 ãQÿFý\ K3276=4'&'+";32"+#"'&=#"'&'&=47672;547632;6* +&Y6* #"1(5=#&-!0"5=#&-!0"yþ¯+™-+™+ §&9™?&¦¦&9™?&§ÿF)¡-+32+32+"54;7#"'&54;7#"54;2)-¥’4L‘ƒ)5—˜( @œŒ1þòþ×þþñå"ÿF-\6%3276532#+#"'&=#"'&=#"4;;47632;*3 V-:()+K#)R" -(.ôM%¦¦= )ó(þå(" +ÿð(®O+#"'&'&'#"'&'&547#"4;2+3276=472327>54'#"'4;2!6 0/ #M' 7m1:"  $$:2nšS_@6N  , F9>^S(P]8-6 *ŠŠ+ ^6ZRÿÿZÿø÷;&jÎØ¯ÿÿ+ÿô);&jþØ»ÿÿHÿðt&Iúùµÿÿ+ÿô)h&Iþí»ÿÿ+ÿð(h&Ií¿pÿììf (43254'&+"32+"'&5476;2#;27654# Œ˜ET* ’¤A,9x3@2RW.ÀB#O ˜ˆDQm!P"$"MS.’N`œXF<'7ly.> DBÿñçj?32+"'&567632#"'&'#"'&5476;23276=4'&#"½‰ $ J.=`4L/@^5 !,"f@"00"@n d# …D+^):Jd“J-\,:‘5IiYhJ5¯ %ÿ6!¡&2%"+#5#"'&=#"54;;3254'&'#3276!-!0"--V&2 $\ 2b=#&-'*16)"ƒ?&ÊÊ<'öþâ*y&9™™+þ´PÿmT2'#""#"'5327654'&#&'&5476;T‚íK\^U » /  d##o ’(—[†Œ  B[a! e( )O$1Õ[7Yÿm·&#"#'#5327654/&'&54763¡—<^b!ˆO9að*732+"54;#"543!"=!7#"'&54?632¸Šê66Â(þƺr  r )á‹b¾d  d @ÿð@432767632#"'&=4767632542"5&'&#"!2#jI?R\F &MafOO6 DfdJ((@1:Z<2aD:L #GNOeSTH JEp4#I>Qÿÿ\ÿðü@6ÿÿqç3,ÿÿqç¿&jÿ\,ÿÿTÿðG3-H34?32+"54;##"'&=43232765#"54;2#327654'&#T(e=*F4Dst6$ (ø:K+=+6 ¾A,:P1$áþB5 ºçú5 '<' H37B32+"54;5#32+"54;#"54;2+35#"54;2#327654'&#K1e=*F4D‚¸\[¸[CK+=+6 ¾A,:P1$ççáÑÑçú5 '<'C69673232+"'54;54/"32+"'54;##"'5!#"'5Ø)O Š!x6k!C.6x|t â Q¥T ÐáItrL$4ð3E732+"54;#"54;2+%#"54;2+32+&'&'#"'&54?632žJª66ªJ"vþÜ~D>"8X6$:Ôr  r )áÂÂÕ"E?f³C±d  d 3%ð3D 32+"54;#"54;2+5#"54;2+32+"54;"/&547632³þò6Œ-x66x.6²r r zþóDáþ— \þ¾d d 2&Ý%=732+"54;7#"54;2+#"54;2+%23276763#"'&54ê„@jÆn*ª.pþ´1@ ;%1R*)º'þÿÓ' ' 7 23ÿ°%3-7!#"'54;2+32+#5#"'54;#"'54;2+¥6Œ-±0±.6)áþPPáÿÿ O3$,3*2#!"54;#"543!#"=!327654'&'&+9©/ <.;þÎ66¸þÐÐB&,,S•Cf!I0%á‹bÇþæ3$3%ÿÿ+3%>3732+"54;#"543!"=!·‹ê66Â(þÅ)á‹b ÿƒ63%70765#"543!2+3#"=!#"=;#ŠYcþ<–ôÕ)þ‹bb‹áþb1ÿÿ+3(P3P2+7#"54;2+32+&/&'32+"54;5#"54;6767'#"54;2+5#"543^ªV¼Q&+8%>#dP')8K2¼V«3ººÍ(7?v¦?öö%;?€ Bͺº\ÿðü@H#"'#"=432327654'&'&+"54;27654'&#"#"=432632æ< XM6Kj?A,8[.-)-=0?2'<$/P)!3g;?(3&33 32+"54;#"54;2+5#"54;2+32+"54;´þñ6Œ-x66x.6zþóDáþ— \þ3&K23276763#"'&54 32+"54;#"54;2+5#"54;2+32+"54;°1@ ;%1R*þñ6Œ-x66x.6' ' 7 2þwþóDáþ— \þ-<33732+"54;#"54;2+%#"54;2+32+&'&'¦J©66©J"vþÜ~D>"8X6$:)áÂÂÕ"E?f³C9'3.7367#"543!2+32+"54;##"'&=432b!+Q.6Í6#P !ºþáþB5ÿÿ Q30ÿÿ5'3+ÿÿ3ÿð%@23%3%!32+"54;#"543!2+32+"54;³þò6Œ-’.6 þáþÿÿ+ó33ÿÿ?ÿð@&ÿÿH372&3%732+"54;7#"54;2+#"54;2+ê„@jÆn*ª.p)º'þÿJ3 8C#";5#"'&5476;5#"543!2+32+32#!"543327654'&#BR0:'/RN_8%H7K@us@e<)E3DNsþðRI+=,7¥5!(=&‚YA+9O2&<32+"54;#"54;2#32+"54;#"54;2+327654'&#eeþ7ƒe<*F3D×e•J,=,6 þá¾@-:Q0$áçú5 '=&+ÿÿ2 &327654'&#'32#!"54;#"54;2+¥¹J,=,6ª§e<*F3Dþì66Õv"ú5 '=&)@-:Q0$á@ÿð@4!"543!54'&#""=42632#"'&547232765îþòF8JU6!((JdfD; OOfaM& GW^B:cA42#pEJ>X SeONG# TJATÿðU@+<67632#"'&'#32+"54;#"54;2+%"327654/&«P6M{8#M1@w9#JWZe.F*=a/K!9ŒI2yJi—R%uHcçáÑÞm>TF*g?V›C /3 25#"3##"54;6767&5476;2+32+"54;µ™B,B1?r„B3$79N*‹A3@ø66ªK$æ0$7#)G1e‰)0aG0%þÿÿHÿð¯DQÿïr!1&67632'&'6767635432"327654'&ä”&| 53%f@3J nBŸˆˆˆˆŸAoH> –gÿðñ¯J73277654'&#"#"=432632#"'#"=432327654'&'&'#"54è0O 9 )^4Ub0.1J4F`=<*4]*'75D÷ * 0 E.4"0  !9C&6 S).#A¡3%5#"54;2+32+"54;532+"54;#"54;2#§ -x""x-þö-w!"xxï¼3þ±ç¼+OA‡3K%5#"54;2+32+"54;532+"54;#"54;2#23276763#"'&54§ -x""x-þö-w!"x$1@ ;%1R*xï¼3þ±ç¼+O' ' 7 2F¡(3#"54;#"54;7#"54;2+32+"54;'À_66_­‚/Ëë-ƒÐO±ˆŸ°–Xÿÿ¡,725#"543!2+32+"54;##'&'5432"M""x-·"$ A7þ±OþË/ 4%¡,32+32+"54;##'#32+"54;#"54;Ÿk""m"}~(nbw¡þ±Oùùþ±OíA¡3!5#"54;2+32+"54;5!32+"54;#"54;2#§ -€**€-þö-w!"xx——þ±OÿÿHÿð¯RA¡%!2+32+"54;!32+"54;#"54\¡""x-þõ-w!"¡þ±Oþ±OÿÿÿF¯SÿÿTÿð¯Ffÿÿò¡!#"=#32+"54;##"5fŒ‡-„.ˆ¡„[þ°P[ÿÿ3ÿF%¡\ÿøÿF`=*7B5#"'&5476;5#"54;32+32+"543";3#327654'&Fg@3M2›C&1 P3%Sþ­?.;V2#ÿÿ3%¡[5ÿŠ¡')"54;#"54;2+!#"54;2+3#"5êþr"-ƒ- "m"8Oþ±Oþ±„`ú¡3367675#"54;2+32+"54;5#"'&'5#"54;2#ÆE;$"m""m"%AZ"xx¡Ÿþ±ƒ$¢ P¡3%3#"54;2+32#!"54;#"54;2+3#"54;2+Aª"m"!ýï j"«"m")Oþ±Oþ±O ÿŠL¡5)"54;#"54;2+3#"54;2#3#"54;2+3#"5#þ k#¨#k!"§!k!>Oþ±Oþ±Oþ±„@¡(32+32+"'476;##"532765&'#@æ% N Vê#p›F ]Ž¡‹B\OZõ) Q N¡5>%#"54;2+32+"543#32+"'476;#"54;232765&'#è-x""xþÙ* N VäpB›F ]Ž)Oþ±O‹B\Oþ±) Qlì¡&#32+"'476;#"54;232765&'#÷% N Vê#%q=›F ]Žx‹B\Oþ±) QJÿð¯1%!"543!&'&#"#"=432632#"'&5476323276äþð N+7V/=_tA1Q=TgO, Nld5¸`-.[ 7RPjC7LAWhD0ÜY8+E3DW9*F(¸O—b<0N>VcA9L5B3AW7)B2@[7X¡*5%#"'&5476;2+32+"54;532+"54;#"2;X^MPê"$r$À„.úšF SŽ´@ Xþ±‹‹O'Mÿÿ?ÿðl&C6íHÿÿ?ÿð'&j÷ÄH+ÿiß\H2+"54;276754/&#"32+"'54;#"'54;5#"54;32+676?Z,&3A@B % 5F4-„.666_<>†<"-ÒD3& 6!@Î,>Ö¬6_£H ræ^+#"=#32+"54;#"543!'#"'&54?632æÙ-ƒ-"Mtr  r [þ±O•d  d Jÿð¯17327632#"'&5476325432#"'&'&#"!2#t K-9lN ,Ogs@/S=V_=>*2g4¸Z+H 7Q:QrA07 [0L'2ÿÿgÿðñ¯Vÿÿ\üpLÿÿ\ü-&jÊóÿÿ“ÿFÊpM"ÿÿ6¡0;32+"54;##'&'543225#"543!2#327654'"+`\MP$”’"& "VF SJx‹@ XOþË/ 7þ±' M<¡7B32+"54;5#32+"54;#"54;2+35#"54;2#327654'"+^dMP$¢ Ä!cc!Ä ^^F SRx‹@ X››O‹‹þ±' M+'\D"32+"'54;#"'54;5#"54;32+6763232+"54;54/&:F4-„.666_<> Z,-ƒ-% ]>Ö¬6_£H <"-ÒÎ,F^(:3#"54;#"54;7#"54;2+32+"54;'#"'&54?632À_66_­‚/Ëë-ƒвr  r O±ˆŸ°–wd  d >^3D%5#"54;2+32+"54;532+"54;#"54;2#7"/&547632¤-x""x-þð-w!"x/r r xï¼3þ±ç¼+OÝd d ÿÿ3ÿF%K&Uß\>ÿ°¡-!#5#&'54;#"'54;2+!#"'54;2+32D0»""x--w!"PPOþ±Oþ±ÿð<@O547632542#"'&#"32+32767632#"'&=#32+"54;#"54;2+¤8:`p( sd,ÎÎB4D6/ &3/fD:DWZ9 jGJEpr_4EfD5.  )6 VKaçáÑP459'&763!232+&'&'32+"54;5#"54;676737#õn  &nO%#8%@ 7dP')8KT(^ä<Ú Ú'31U¦@ öö%;?€¡A,ºP37;AE332+&'&'32+"54;532+"54;#"543!2'#6767#737#dP&)8%@ 7dP'"W¡ëY-#L}¸(^ä='9>t¦@ öö%;5aá½±±µV. ºE3<%6=32#32+"'4;5&'&=#"'&54;#"'&5473+AžK#X/?iûiŒ+"Js+„0´ ²Á¬w:__ w-9—Õ„ V ÿÿ"ÿF-\¾+ó3'232+"54;#"4;5#"54;2+32#327654'&#¥ƒe<*F3Dð6666銕J,=,6“G@-:Q0$j(OO(pú5 '=&lì¡2732765&'#'5#"54;2+32+32+"'476;5#"43Ò›F ]Ž)%q%-- N Vê#-)) Q‰++(8B\ü(+õ3:674'&+327'&7676'&/+32+"54;#"54;2‹;9'0•†> fA I(4ƒŠé66ð_8&*+9=&ú =  g@  J¾á@,9OÿF¯G%654'&#"327'&7676'&/#"'32+"54;#"54;67632µ?D0>W5&C0?,$D h? D2°!32+"54;#"543!542þžŠê66š( þábræ5432!32+"54;#"543½þþ-ƒ-"¡[„þ±O>3$32+32+"54;#"4;5#"543!"=!¸Šê6556Â(þÆ‘(þÀ@(y‹bræ¡%5#"543!#"=#32+32+"54;5#"43»"MÙNN-ƒ-*!W„(ÐÐ(>ÿ£03732+"54;#"543!"=!32#"'&54723276=4'&#¸:š66Â(þƬe=*<'1+  ?=+6#úá‹b¾A,:kL- 7"e<'rÿDæ¡9732+"54;#"543!#"=#32#"'&54723276=4/"#ä-ƒ-"MÙVq*<'1+  ?J&Ä›O„[‹E&‹L- 7"…DÿnP3Q%#"=#&'&'32+"54;5#"54;6767'#"54;2+5#"54;2+7#"54;2+P*%@ 7dP')8K2¼V«d«V¼Q&+) w¦@ öö%;?€ BͺºººÍ(7?v ÿnM¡W%#"=#"54;&'&'32+"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+MU%h #o#o* e/‰¶c›#o#›c¶ˆ0) wH> ––=> nBŸˆˆˆˆŸAo\ÿSü@c#"'&5472327654+5&'#"=432327654'&'&+"54;27654'&#"#"=432632æ< XM2E:-$" %.X5A,8[.-)-=0?2'<$/P)p;#8 (7!1>!3g;?(gÿSñ¯e&'#"=432327654'&'&'#"54;277654'&#"#"=432632#"'&5472327654+M5<*4]*'75D0O 9 )^4Ub0.1K/?:-$" %./ S).# * 0 E.4"0  !9D&2, $ÿn535%3#"=#&'&'32+"54;#"54;2+%#"54;2+âSI6$:Jª66ªJ"vþÜ~D>) w³CîáÂÂÕ"E?Fÿn¡*%3#"=#"54;'#"54;#"54;7#"54;2+ÊIuÐ_66_­‚/Ë) w–¿O±ˆŸ$43A32+&'&'"=0'32+"54;#"54;2+35427#"54;2+þ{C8X7n(5Jª66ªJ8(¢v1(„)3º=IZîáÂa;œF¡4%32+"54;'"=##"54;#"54;35427#"54;2+Ã-ƒ‰(_66_(l‚/Ö­~AY¿O±bFl$43?32+%#"54;2+32+&'&'32+"54;#"4;5#"54;2+žQQ"vþÜ~D>"8X6$:Jª6;;6ªJ×(gÂÕ"E?f³Cî†(3F¡432+7#"54;2+32+"54;'#"54;#"4;5#"54;À++­‚/Ëë-ƒÐ_6@@6_U(=ˆŸ°–¿(#ÿç435!2+%#"54;2+32+&'&'32+"54;##"5J"vþÜ~D>"8X6$:Jª6c3ÂÂÕ"E?f³Cîá[ ¡*37#"54;2+32+"54;'#"54;##"5 ¶­‚/Ëë-ƒÐ_6c¡±ˆŸ°–¿O[5ÿn'35%#"=#"54;5!32+"54;#"54;2+!5#"54;2+'~6þò6Œ-x66x) wççáÑÑþRÿn¡5%#"=#"54;5#32+"54;#"54;2+35#"54;2+i-è-w!"x-è-x") wO——þ±5k35#32+"54;5!32+"54;#"54;2+!5#"54;#"5Ac.6þò6Œ-x66ì þççáÑÑ„RV¡5#32+"54;5#32+"54;#"54;2+35#"54;#"5,c"x-è-w!"x-è-ãxþ±O——„ÿóÿ£d3E32+"54;#32+"54;#"543!2+32#"'&54723276=4/&#\.6Î6Œ-R\\2<'1+  ?6#úáþá¾9#+‹L- 7"…2 ÿDI¡E%32+"54;#32+"54;#"543!2+32#"'&54723276=4/"#I"x-¨-w!">"Tq*<'1+  ?J&Ä›Oþ±O‹E&‹L- 7"…Dÿÿ?ÿð@&ÿÿTÿð¯F?ÿe@G#"'&=47676325432#"'&'&#"3276763232767632#"'&54HfON6 EfeH@0:[<2I?RYC &,8:+ %A ONeSTI JEp4#I>QGaD:F #) !)"  /0Tÿe¯D#"'&5476325432#"'&'&#"32763232767632#"'&54I r@/S=V]?>*3g3 I0AmN +*6:+ %A P;QrA07 [0K/?_3"H  !)"  /0Hÿn3%#"=#"54;##"=!#"'&=#Åìi§È¦) wáIrrIþzÿmÞ¡%#"=#"54;##"=%#"=Šv.tdt( wO[„„[þ±3%3&%32+"54;5#"54;2+7#"54;2#Biûi³o&˜•(nþÕÕ ããÿ9:¡'#"54;2+3#"54;2+32+"54;·)—A–“D˜)´2Ž3#›þ±Oþe{3%30%#"4;#"54;2+7#"54;2#32+32+"54;^^³o&˜•(n°eeiûiÖ( ããþô(­þï:¡132+"54;5#"4;#"54;2+3#"54;2+32#B2Ž3aO¥)—A–“D˜)¢P#ÅÅ(sþ±Oþ((ÿn035%#"=#"54;'32+"54;7'#"54;2+7#"54;2+0u>¥¤@ƒ¼³n+›™-o³¿) wÖÖ÷êÉÉê÷3ÿn%¡5%#"=#"54;'32+"54;7'#"54;2+7#"54;2+%uA›D… ¸£o.†‰0n£¸) w••²‚‚²ÿîÿn&3+#!#"54;2+3#"=!"54;##"=!#"5d6Ž.JþfdD þáþ wá[„„ÿŠ ¡+#3#"54;2+3#"=!"54;##"=!#"5"dè"m"8þ•"cDxþ±Oþ±„[O[„„Jÿn35%#"=#"54;5#"'&'5#"54;2+23275#"54;2+~6=h%x6eK)6x) wÈ !ñè15æþ`ÿnú¡5%#"=#"54;5#"'&'5#"54;2+367675#"54;2+ú^"%AZ"x-E;$"m") wƒ$¢¡Ÿþ±J3=%675#"54;2+32+"54;5"=&'&'5#"54;2+23542<=#6x.6>(k x6 Z(ð-æþÈ ZY0ñè.j`ú¡;%"=&'&'5#"54;2+23542675#"54;2+32+"54;5B(X "x-K(8"m""m"Ž87 ¢¡99Ÿþ±ƒJ336763232+"54;5&'"#"32+"54;#"54;2+¼=h%x6eK)6x.ÍvB !ñè15æá`ú¡3%5&'&#32+"54;#"54;2+63232+"543”E;$"m""R%AZ"x)¡ŸOƒ$¢ÿ¬ÿð@ D%54'&#"#"'&547632";5476762!32767632#"'&5[’F9J[<2)&1/ &6 EÌE: þEI?RYC &LbfON3 cA4I>Q5(7  TI JJ>X :aD:F #GONeÿÎÿð¯ A7!&'&#"67632!32767632#"'&'#"'&547632"3hvQ)1i5) R;KqC þ`T.:VE HGDnG61/ ð['N#a6(Q,6f/(N:O(7  ÿ¬ÿe@ \%54'&#"#"'&=#"'&547632";5476762!3276763232767632#"'&54[’F9J[<2ã fON&1/ &6 EÌE: þEI?RYC &*3:+ %A 3 cA4I>Qþ±ONe(7  TI JJ>X :aD:F #' !)"  /0ÿÎÿe¯ Z7!&'&#"#"'&'#"'&547632";67632!3276763232767632#"'&54hvQ)1i5ànG61/  R;KqC þ`T.:VE H:+ %A ð['N#þüN:O(7  a6(Q,6f/(  !)"  /0ÿÿqç3,PÝOg2+7#"54;2+32+&'&'32+"54;5#"54;6767'#"54;2+5#"543'23276763#"'&54^«V¼Q&+8%@ 7dP')8K2¼V«J1@ ;%1R*3ººÍ(7?v¦@ öö%;?€ Bͺºª' ' 7 2 MKUm!#"54;532+"54;67'#"54;2+5#"54;2+7#"54;2+32+"54;&'&'3223276763#"'&54do#o* e/‰¶c›#o#›c¶ˆ0e%h #Ð1@ ;%1R*–=> nBŸˆˆˆˆŸAoH> –K' ' 7 2$ÿ—3C32#"'&54723276=4'&+32+"54;#"54;2+%#"54;2+ÏKv7<'1+  ?J$0€Jª66ªJ"v@H)6kL- 7"eM!îáÂÂFÿDô¡;7#"54;#"54;7#"54;2+32#"'&54723276=4/"#Á_66_­‚/·#q*<'1+  ?J&À¿O±ˆE&‡L- 7"D5ÿ93:#"'&547232765!32+"54;#"54;2+!5#"54;2#Þ;'1+  ?þò6Œ-x66x ýÆM, 7":çáÑÑRÿ9¡:#"'&54723276=#32+"54;#"54;2+35#"54;2#É;'1+  ?è-w!"x-è-xxþXM, 7"âO——Jÿm37%275#"'&'5#"54;2+23275#"54;2+32+#"5K H=h%x6eK)6x.}(È !ñè15æþw`ÿnú¡5%5#"'&'5#"54;2+367675#"54;2+32+#"=”%AZ"x-E;$"m""^)ƒ$¢¡Ÿþ±w ÿÿ OÝ&$UqÿÿHÿðY&DUíÿÿ O¿&$jÿ\ÿÿHÿð;&DjØÿÿ N3ˆÿÿ ÿðB¯¨ÿÿ+Ý&(Uîqÿÿ?ÿðY&HUøí2ÿð@ -%3276=4'&#"#"'47632"'&'&=íþnF9J[<2I?RYC &LbfON6 EÌE: ý cA4I>Q4aD:F #GONeSTI JJ>X :Kÿð¯(%&'&#"#"'&547632#"'&=!3276í K-8mN +Pgr@/S&2tA1¢þˆ S+8g3å[,H 7P;QrA R nBŸˆˆˆˆŸAoH> –-    \ÿðüÌHXh#"'#"=432327654'&'&+"54;27654'&#"#"=432632%2#"'&547632#"'&5476æ< XM6Kj?A,8[.-)-=0?2'<$/P)!3g;?(ó    gÿðñ;JZj73277654'&#"#"=432632#"'#"=432327654'&'&'#"542#"'&547632#"'&5476è0O 9 )^4Ub0.1J4F`=<*4]*'75D!   è!   ÷ * 0 E.4"0  !9C&6 S).#D    \ÿðü@H#"'#"=432327654'&'&+"54;27654'&#"#"=432632æ< XM6Kj?A,8[.-)-=0?2'<$/P)!3g;?(gÿðñ¯J73277654'&#"#"=432632#"'#"=432327654'&'&'#"54è0O 9 )^4Ub0.1J4F`=<*4]*'75D÷ * 0 E.4"0  !9C&6 S).#3%ƒ3; 32+"54;#"54;2+5#"54;2+32+"54;#"4;2³þò6Œ-x66x.6ììzþóDáþ— \þ2((>ñ3;%5#"54;2+32+"54;532+"54;#"54;2#7#"4;2¤-x""x-þð-w!"xÑììxï¼3þ±ç¼+OQ((3%¿3CS 32+"54;#"54;2+5#"54;2+32+"54;2#"'&547632#"'&5476³þò6Œ-x66x.6ö!   è!  zþóDáþ— \þ–    >-3CS%5#"54;2+32+"54;532+"54;#"54;2#'2#"'&547632#"'&5476¤-x""x-þð-w!"x!   è!   xï¼3þ±ç¼+Oµ    ÿÿ3ÿð%Ì&2jÿiÿÿHÿð;&RjØ3ÿð%@!2#"'&5476&'&#"!3276,nIBQGakIEQG0L6EZ>2ŸþaJ8FX>4@]Uz€WMZVx„WMþìuE1QBX(qF4PBHÿð¯!2#"'&5476&'&#"!3276,jC7LAWhD8LAI/:Y8$tþ F/:X9#¯N>VcA9L?UdC8ÏX0C+8(R.B)ÿÿ3ÿð%¿&j\‡ÿÿHÿð-&jʈÿÿ@ÿð¿&j\úÿÿJÿð-&jÊÿÿ2&ƒ&qCðÿÿ3ÿF%ñ&q±ÿÿ2&¿&j\ðÿÿ3ÿF%-&jÊÿÿ2&ê&Zqðÿÿ3ÿF%X&ZßÿÿI&¿&j\ôÿÿ`ú-&jÊÿÿ Q¿&j\øÿÿ N-&jÊ)ÿnD33'&'#"'&5#"54;2+32765#"54;2+13%0p:#—K>)5S1L—":i}`1;Nþ²U/L).Nþ²X:r)7C0%#!32+"54;4763232+"54;54'&#"!27þtL˜#G6Jd9(#fT!)R-Œ«mOb<-L6I99b.B*6¹+FD!1%+32+"5473'#"'&54763272'4'&#"3276FJ6ÃfCoi@1P;PpA)JF/=Z4#E/=[4#«mÉZL:Pj>.Z:A°®Y2!C-)6T1f#I4Hn;YªmOR0 K%299f;*`1:¹"ÿð030#!3276=#"54;2+#"'&5#"54;2+!20þu>)5S1e"H5Hp:#—K‹‘ÁU/L).99e<+a1:Nd"ÿö6B!1#"'&547632!"'"=423!24'&#"3276&VF`xI;VEaxI;þŠ7+((!Av8M:Mf?0M:Nh>.HvI:TE`wI:UDþW#t8(Hg=.K9Nf>.L9:ÿ°3#"/!"54;#"54;2'#!!3 Fþ¼__»4&þÚÏQ ; Eád)þ¬Q )1C)+"54;54'&#"!2#!"54;47632321fT!)R-~þ6#G6Je9'#21b.B*6þ±Ob<-M6H1 T?8E236#'#"'&5!6'&'&'&#"32+"54;47676#3276'41dD2(+.H_5/U \7'K—#K2ûå %2/&?D2B6W(Bh$cE H D1AþÅ;^D þÞ@ +*T4ÿð<3"0+#"'&'&7676;5#"54;2+325#"3276<_H5Hp:, 29—`«"_¤˜R0 >)5S1me<+`-?I3‡‡Ç>)6S0 L);35%+"54;54'&'&#32+"54;#"54;2+67632;f<"+ E2‡ñAAŒ":c\;.#°%P0;'+Õá¨QI9J%?2)"54;#"54;2+!542þ;bbíb*àþ 5ÿôP39+#"'&=#32+"54;#"54;2+33276=#"54;2PH(8b0n#f[–)9T" $f‘Ãt5\#EÅþ¬ádëM"3R9Â.ÿò&< )!"43!2#"'&5476324'&#"3276öþŒs0VF`xI;VEaxI;(M:Mf?0M:Nh>.'(þ¯vI:TE`wI:UDag=.K9Nf>.L9)133+32+"54;5#"'&=#"54;2+3276=#"54;21##Ó‡:ap:#—K>)5S1-y‘þ­•L`1;ÌÌU/L(+Bkÿìí;)%"=4'&'&#"54;27654'&+"54;2í(8"«¨c#%#!"5432;276767654'&#"32+54767632632&#"Aþ…v5.2  4,+ P9Nc-o P.6fLM"$-“þ?#GYK!=  P4&Bo<+L+9(&#*Q'FGcVM M,V#! EC)%#'"5434'&#"32+"54;54763232E¤1T!)R-$p#J5Hd9(JOb.B*611f;*L6Iþ±!94$-)"54;#"54;676;2+"3232'54/&+%þ!:JK9ÐÐ: v[<1>z+_wU\"(ED7H»)»(Lþ«ÿïK40"54/&+'&'&5#"54;2+32765#"4;2K(D3D92 #—K8(4S/L—_¸>þ²`=.) +DNþ²M2$Y+N*Zõ]9%+"543!276'&'&+"4;27654'&#"#"=42632×0 *A¼0q \_>)<$)Y. (>OV6'A1àEC+R;(*!:!7^0.9)7>/ ÿð:3)"'&5#"54;2+3276=#"54;2+BY9+X¦%7)2O-M˜"56J9INþ²J3&O**bbP=?=ÿðd;%#"'&'&547632'4'&'&+"4;2#"'&'&#"327632QnmG: RE^bM) .ÈÉS#6+8IK; !K@SaN l ZG:6$1oG N5Hþ±+ÿÃJ#3#"'%&54327"'&5476324'&#"3276C $lÖþG´W$nB5P?VnB5)H2B^7'H2BW8-g^B ƒ/_'dO>VmB4O>V]6&F1B^6&A4?C:%+"54;4'&'&'32+"54;"32+"54;54763232?¢V*F#o#S-$o#f+Jn:#O5:'þ¦ZE(499{8N&1þ±@ÿýH4-8%#!"'"=432;2767&#!"=4;232'654'&+!2HþÕg1* '=BA A&DþÒö9 $3‘`O:K³.2&)] $.f\í2)V) S0ã6Y4&Ä NC2#32+"54;4'&#"32+"54;476763232:P#—KS!)Q.L—"D,6h8"PöOa/A+6þ±O\> S3E1)ÿð13)+#"'&5#"54;2+32765#"54;21"H5Hp:#—K>)5S1L—þ²e<+`1;Nþ²U/L).N '42%+"54;5#"'&=#"54;2+327675#"54;2+32'¶^>__:+-pS$"G2!"e.±TL:K&&i-;',Î*þÿÿ\ÿðü@6*2C++"54;54'&#"32+"54;4767632322o#S"(Q.ˆÓ"D,6c9(#21d,A+6þ±O\> M6H1AR2B%+"'&5432;27654'&+"4;&'&=47632'27654'&#"42˜FD .†* C6"+üq3K+8_-;zÙC&< 'J#9"™O-f #WH*(6Q)@$2D0 .=/$A 2"<#\ö3#32+"54;#"54;2+32âû‚òGG¶FûöáÂG3)2;32#!"54;7&'&547675#"543!2+4'&'676R6Hnþúnd>/C8Voni<+)J)4W0 ÐZ0F,h;(I8JX?5''K6IY0þµ@*oKB*6T0KE&6%!32+"5435"4;5476#"'!2&'&'&76767þdoÎ6\\S:Nj;&O6JqBœ]Z$Z3&E/9c*sJK(Þk9(H/>e8'X‡(` :*:G)A&ÿÿ3ÿð%@2Zÿïþ=+4=%#5&'#"=4325&'&54767632+%5"4'&'676þR0>)Y9I!&{ 4&A!WXNVþšZ7 (=D=U)™[/:r?#ý=#23&Û '³FÒ%þÍC ÷7 ÿðQ§4%+5#"'#"'&5#"54;327#"54;327#"54;32QL54@ 69,##L# 45#L" 28"K#)8DD&+ þ».Sþ¾/Sþ4ÿB-±5%#!32+"5473#54;67676"=4'&'&!2-þœ„â56_1!O6  59/%d•W,"9 *Rk!# ;/2À+ÿBF¶#3%+36+"54;5#"'&54763232'4'&#"3276FJ6ÃdCoi@1P;PpA)JF/=Z4#E/=[4#• ùZL:Pj>.Z:A¸·Y2!C->8 /†."K5"&Y.[•´I : þÿT*A5 E#$þÿ,ÿð0<&232+5#"'&5#"4;!2#!32754Ë#LRaS"7`lþ”/cRØ;KA&*–þø; [Œ+ÿCG¶)##"'&547632532+324'&#"3276GtCoi@1P;PnC`8KF/=Z4#E/=[4#¨!ZL:Pj>.ZK*ýðsY2!C-ME"$þþÿB¶'0%#"'32+"54;#"4;632&'&#"!3276O;PnDâ88aJgƒ<)E.:\4 `þ¢ E+3T6ài>/Zù*KZl10T0D)6(K(@#4ÿð<<++#"'&'&7676;532+325#"3276<_H5Hp:, 29—K#`¤˜R0 >)5S1mže<+`-?I3¹Çž>*6S0 L)5ÿB=-%+"54;54'&#"32+"54;#"4;63232n": 1(*Ö."KMOZ-#ûA 3þA¨*ÔME"$þþIÿB¦#!"54;#"54;!2þjXVªýÅÿB==6%+50#"'&5#32+"54;#"4;332767#"4;32=L%S"d/†."K/!!7`#3A&ýî¨*–þÎ; 1*þ‚GÿðT</7476;'&54;2+32+#"'&%4/#"3276GJBW'‰ ¿‘†´ EED\ZDG¡34WP:0F4BW9,È^C=o (n( ;p[?>?AXc)*@5AR5(?18ÿB <0+"54;5#"'&5#"54;2+32767&'&54;2 àˆIRY-#n"9 @1 - L3©ÒKD"$—þp? 2 ! ýÅ5<-%+"54;54'&#"32+"54;#"4;63232n": 1(*/†.!JMOZ-#ûA 3þÿé*ÓME"$þþGÿðOa):<%+5#"'&54767'&54;'&5432+32'4'&+"3276'#OLEwnB5R/UoB% H = FQ=R©©[7(D3C\6'F1üBÿBR¶.+"54;4/&#"32+"54;#"54;63232R©+5 =3(.….#LMKV*Uª¼= 4.þÿT=ME# þ=PÝ<'%#!"54;#"54;&76;2+"3254'&+Ýþ›BAA%(¨¥?NZ:+(U! PUN*(mL:I¯­h.þ«6ÿð)=/476;2+"32+5#"'&5#"4;3275'&3" ¨š c7`ROS"7`/PSb, P þ«5¶-%+"54;54'&#"32+"54;#"4;63232n": 1(*/†."KMOZ-#ûA 3þÿT*>ME"$þþ]ÿBÅ2#!"54;#&=42;2þw0áÅD(&âã•´DFF$ þI ÿBQ¦>+"54;5#"'#"'&5#"54;327#"54;327#"54;2+32Qª^54@ 69,##L# 35"L" 28#o##ª½8DD&+þ¼.Sþ¿/SýîFÿB¶0%32#!"54;7&+"'&5&76324'&#"326/ &ªüþwVÚ:Ñ8Q?VoC3)I1BN7!ì=#ÒO8&«Ü<,nB4P>V_6%6!3+ B/5 ¶3%+"54;7654'&#"32+"54;#"4;6763232 –P;9&//†."K6,&Y.PUü4 6þÿT*>6 ?  þþ,ÿð§ %+5#"'&5#"4;327#"4;32LSbS"7`/dSKt#ME"$þþÿÿ?ÿF2¯Jy¦%#!"54;'"54;2þœXXâSþƒ ÿBP<@"32#!"543?#"'&5#"54;327#"4;6763232+4/&ª((nþún42,##L# 35"L0)-##L#Œ,þ1¿;&+þ¼.S¥*Á4&+þáD.i e,#"'&#"32+32#!"54;#"54;547632 P,LÀÀ´þ¿dYYD&/8D#C /?þ¬T?H$ ÿÿHÿð¯RYÿBþ=4=F%32+"54;5&'&'&76325&'&54767632+'5"4'&'676þS/'"+"'&5476;67676765#"'&54763!6#"'&5&'&'&'&#Ó"!<$$*Z%/*  ' ·þË>#"  5 (GþÛ%6 ZÂà'#"'&5#"'&54763##"'&5#"'&54763ÂYPYàþ4£þ4£ZÂà'#"'&=#"'&54763!#"'&5#"'&54763ðYTYàðÇþ4£ZÛÂà'#"'&=#"'&54763##"'&=#"'&54763ÂYPYàðÇðÇú;r\3"'^<4\ý$$ž;Ê\ 3"'73"'¸^<4Î^<4\ý$$ýý$$Ñÿ™‡ #377‡šššš@¶þ{¶¶/¶v¶²ÿ˜¦#"432#36pØØØØÖ#F²ÿþP{ø/ÿxGÿ™##3+þ}gOü±{Gÿ™ ##3#3+þ}BgOü±{ü…ÃGÿ™##3#"'&547632+þ}|   gOü±{þd!    Gÿ™#32#4'&+#3+þ}1.  1gOþÂ/þJ¶#þ{©ÿ™¯ #3'¯ëÄÄNþë {°þêçþ2©ÿ™¯ #3'7"42¯ëÄÄi<<Nþë {°þêçþ2ã#FÑÿ™‡ '#3'‡šššš‹¶ýX{µ/¶wµ¸ÿ˜ '#37'7 sZZdsZZdš[Fý{ENYEAEN¸ÿ˜  ''#37 sZaRZdYEAL@ý{EN¦ÿ™² #3²ðððð&ýX{þæ/wþæ°ÿ™¨%'#'55'553'¨onnnnooo„þx¨/‚„/‚óþì‚/„…‚çÿ™q %'#3'qoooo„þx{þì‚/„…‚çÿ™q #575573qoooogˆ„/‚…„/‚°ÿ™¨#57557377¨noooonnnÂþXˆ„/‚…„/‚ó‚/„‚°ÿ™¨#5755737¨noooontý¦ˆ„/‚…„/‚ó‚¢ÿ™¶ '7'#3¶¯¥Í¯ÐñÍÄ-ðÏôü³{Ët>%'7››tåå/¶·¤ÿ™´#'#3´'Îgóó{ý¦£ÿ™µ#37µöÎþÞý¦{ôõ£ÿ™µ#"54327#37›öÎÕ !þÞý¦{ôõ‘ÿ™Ç#&547537ÇÖ'$$ Áû / ýÕ- -+ÜÛäÿ™F # # 33F úú  þõ úú þög£þ]¾½þ]£þCÿ™F$).8#"'#&54736374'&'676'&"'2/F Æ>Æ ÊjkË Æ#"Æ ËlkPA//=  !"""$!0= K gLþ´RLLTþ³Mþ¬LK k(MO#b8n99WM$ /©ÿ™¯#3'¯ëÄÄþþëþ°{þêèþ0©ÿ™¯ #'#33¯ÎÎgóþ {þ«óH©ÿ™¯ #5'#335'¯ÎÎÎgÓóþ:{ÐõÅý‡‡ôНÿ™©%'#57'537©oojinnijƒþy‡ƒ/{{.‚§þY‚.{{äÿ™t#&'&547673t% &$ '^2þq ,1dþ+°ÿ™¨ %'#'53¨onno„þx¨/‚¥þ:‚çÿ™q%'#3qoo„þx{þ:‚°ÿ™¨%'#&'&547'5673¨X $>P(Chþd*J/_ qþ +Oÿ™:#3:g{äÿ™t#&'&547673t% &$ '^2þq ,1dþ+zÿáÞƒ %'757'5<››¢Â››¹åå/¶·!å/¶·.3ÿ™% #553'#%ëëëÄÄÄNþë  °°þêçþ2Îç°ÿ™¨ #5737¨noonÂþXˆ„/‚Æþ[‚çÿ™q#573qoogˆ„/‚ưÿ™¨ '#'53¨onnoc‚ü´‚.L‚ÿ™» '#37'7»„„„„b–›{›–/–›üã›–Ÿÿ™¹ #'5537¹‘nn‘¿«ý…|‚-€ÐÒ¬~ÿ Ú %577ÚñÉþÌÛ»þå/ìlå/¶±ÿ™§#3§ÚÚg7þþGþ:á3:Åüá\é#"'&5473\# ""&% * ™þg ›ý½å'737½’oo¦©©ƒ«þS…Ÿÿ™¹ '#573¹‘nn‘<¬ü±Lƒ-…©Ñÿ™‡#573‡ššgM¶/µ´ÿ™¤#&'&54767573¤% $$ šš'2þÑ0)1y¶/µþ[ +¢ÿ™¶ %#37'7'¶øøƒ[ÐÏ…¼þÝ{þÝš›ôüáôœçÿ™q #377qoooo/‚þì{þx„/‚…„¢ÿ™¶ +%#37'7'7#"'&547632#"'&547632¶øøƒ[ÐÏ…2     ¼þÝ{þÝš›ôüáôœ¥!  !  þ³"   "  –ÿ #3Âûùþô^®þ[{þŽ|þinÿ™ê #'#373꣣££gOÁÁü±{¾¾’ÿ™Æ#'57'#373ÆjCWWCj~~gOO/gg/Oü±{””3ÿ™%#&'&5336765%MB[jF=J8OcÄsNSq=›COtoUBgb  `ÿŸ¥!þõ[°°[ þߥ=G®9Š‹¾«GþÈp¿ðŠƒd¼n’ÿ™Æ #'#3735#'5'5#'Æ~~~~j(jü~~~~j(jg””{””þ×ýýûÍ••Í•–ý~~ý3ÿ™%#4'&'##47673%K8Kd=0EFbkE:etN:þú[H[uUVUý« `RÿË:3:4Å®ÿ™ª%#'5573'7ªrnnnnrrr……-ƒƒ-……/ˆü݈©ÿ™¯#3¯ëëÄgPþÐèVÿ™%##5#53#53533#3[ZZÚ\\YYÚ[ tt £þþ¾!hh!þþíLkà#"'&547632k!(!(–-)-)ÿÿí„k'cÿ8c9¦É² '#75'37²oNooNo8ƒƒ]ƒƒvÿ™â '##73âš'¶š0¶ü³Ù§Ösµ3ÿ™%+#4'&'##4767&'&53367653%K8Kd=0EFbjF=J8OcÿÿHÿðð&C>qÿÿ3ÿð%“'vÿÂÿÿHÿðð&vÂqÿÿ+óð&v¤q3ÿÿÿF^&v¯ßSÿÿ+ó¿&Vã\3ÿÿÿF-&VîÊSÿÿ+M¿&V\5ÿÿT-&V ÊUÿÿ+ÿ{M3'Vý|5ÿÿTÿ{«'V ý|Uÿÿ+ÿ{Mƒ&qCÃÿÿTÿ{ñ&q ±Äÿÿ+ÿ½M3'qý¥5ÿÿTÿ½«'q ý¥Uÿÿ\ÿðü¿&V\6ÿÿgÿðñ-&VÊVÿÿ\ÿkü@'Výl6ÿÿgÿkñ¯'VýlVÿÿ\ÿðü¡'V>ÿÿgÿðñ 'V¨ÿÿ\ÿðü¡'V>"ÿÿgÿðñ 'V¨#ÿÿ\ÿkü¿&V\Ëÿÿgÿkñ-&VÊÌÿÿH¿&V\7ÿÿ+ÿðó¿&Vã\WÿÿHÿ{3'Vý|7ÿÿ+ÿkó3'VÿãýlWÿÿHÿ½3'qý¥7ÿÿ+ÿ­ó3'qÿãý•WÿÿHÿC3'GýY7ÿÿ+ÿ3ó3'GÿãýIWÿÿ(ÿk03'jýl8ÿÿ+ÿk¡'jÿøýlXÿÿ(ÿp03'Yýl8ÿÿ+ÿp¡'YÿøýlXÿÿ(ÿ303'GýI8ÿÿ+ÿ3¡'GÿøýIXÿÿ(ÿð0q'vÿÂò*ÿÿ+ÿðß&vº`+ÿÿ(ÿð0b'jÿ,ÿÿ+ÿð¿&jø\-ÿÿ O´&YW9ÿÿ:"&YÅYÿÿ ÿ{O3'Vý|9ÿÿÿ{:¡'Vý|YÿÿDð&C>q:ÿÿ:^&C>ßZÿÿDð&vÂq:ÿÿ:^&vÂßZÿÿD¿&j\:ÿÿ:-&jÊZÿÿD¿&V\:ÿÿ:-&VÊZÿÿÿ{D3'Vý|:ÿÿÿ{:¡'Vý|Zÿÿ(0¿&V\;ÿÿ3%-&VÊ[ÿÿ(0¿&j\;ÿÿ3%-&jÊ[ÿÿ3%¿&V\<ÿÿ3ÿF%-&VÊ\ÿÿgñð&Gq=ÿÿsé^&Gß]ÿÿgÿ{ñ3'Vý|=ÿÿsÿ{é¡'Vý|]ÿÿgÿ½ñ3'qý¥=ÿÿsÿ½é¡'qý¥]ÿÿ+ÿ½'\'qÿýý¥Kÿÿ+ÿðó¿&jâ\Wÿÿ:~&WéZÿÿ3ÿF%~&Wé\ÿÿHÿð•&EàDÿÿiè'V…Aÿÿ ÿ{O3'Vý|$ÿÿHÿk¯'VýlDÿÿþ,OM'fÿ¸ˆ$ÿÿþsÿð¼&fÿ÷Dÿÿ OÒ'vÿÂS„ÿÿHÿð<'vÿȽ¤ÿÿ OÒ'C>S„ÿÿHÿð<'CE½¤ÿÿþYO"'fÿå]„ÿÿþjÿðŒ'fÿöǤÿÿ O–'Y9„ÿÿHÿð'Y£¤ÿÿ ÿ{Oð&GqÿÿHÿk^&Gßÿÿ O¿'vÿÂ@ÄÿÿHÿð'vÿÈšÅÿÿ O¿'C>@ÄÿÿHÿð'CEšÅÿÿþtO'fJÄÿÿþtÿðy'f´Åÿÿ Oƒ'Y&ÄÿÿHÿðÝ'Y€Åÿÿ ÿ{OÝ&UqÿÿHÿkK&Ußÿÿ+ÿ{3'Vÿîý|(ÿÿ?ÿk¯'VÿøýlHÿÿþdM'fÿðˆ(ÿÿþkÿð¼&f÷÷Hÿÿ+´&YîW(ÿÿ?ÿð"&YøÅHÿÿ+Ò'vÿ¯SŒÿÿ?ÿð<'vÿ¹½¬ÿÿ+Ò'C,SŒÿÿ?ÿð<'C6½¬ÿÿþk"'fÿ÷]ŒÿÿþyÿðŒ'fǬÿÿ+–'Yÿî9Œÿÿ?ÿð'Yÿø£¬ÿÿ+ÿ{ð&Gîqÿÿ?ÿk^&GøßÿÿþtçM'fˆ,ÿÿþsü¼&fÿ÷óÿÿqÿ{ç3'Vý|,ÿÿ\ÿ{üp'Vý|Lÿÿ3ÿk%@'Výl2ÿÿHÿk¯'VýlRÿÿþtÿð%M'fˆ2ÿÿþtÿð¼&f÷Rÿÿ3ÿð%Ò'vÿÂS–ÿÿHÿð<'vÿ½¶ÿÿ3ÿð%Ò'C>S–ÿÿHÿð<'C>½¶ÿÿþtÿð%"'f]–ÿÿþtÿðŒ'fǶÿÿ3ÿð%–'Y9–ÿÿHÿð'Y£¶ÿÿ3ÿk%ð&Gq1ÿÿHÿk^&Gß2ÿÿ3ÿðU'vÿÖšbÿÿHÿðØ'vÄYcÿÿ3ÿðU'CRšbÿÿHÿðNØ'CÅYcÿÿÿ?ÿðU­'fËèbÿÿÿ8ÿðN('fÄccÿÿ3ÿðUÝ'Y€bÿÿHÿð‹œ'YÄ?cÿÿ3ÿkU 'VýlbÿÿHÿdN'Výecÿÿ(ÿk03'Výl8ÿÿ+ÿk¡'VÿøýlXÿÿþtÿð0M'fˆ8ÿÿþ[ÿð¼&fç÷Xÿÿ(ÿð¨„'vëqÿÿ+ÿðqò'v´srÿÿ(ÿðu„'Cìqÿÿ+ÿð>ò'Cµsrÿÿÿ_ÿðuÔ'fëqÿÿÿ(ÿð>B'f´}rÿÿ(ÿð²H'Yëëqÿÿ+ÿð{¶'Y´Yrÿÿ(ÿduÇ'Výeqÿÿ+ÿd>5'VÿÕýerÿÿ3%ð&C>q<ÿÿ3ÿF%^&C>ß\ÿÿ3ÿ{%3'Vý|<ÿÿ3þÁ%¡'VüÂ\ÿÿþt%M'fˆ<ÿÿþtÿF%¼&f÷\ÿÿ3%´&YW<ÿÿ3ÿF%"&YÅ\ÿÿ?ÿðGŒ&ü÷§ÿÿ?ÿðGŒ&Gò÷§ÿÿ?ÿðG&Üú§ÿÿ?ÿðG&)Üú§ÿÿ?ÿðG&Üú§ÿÿ?ÿðG&*Üú§ÿÿ?ÿðGü&ë÷§ÿÿ?ÿðGü&+ë÷§ÿÿÿüO@'ÿÿ«‡ÿÿÿùO@'Gÿÿ«‡ÿÿÿ€OA'þ°ÿ«‡ÿÿÿpOA')þ¨ÿ«‡ÿÿÿ€OA'þ°ÿ«‡ÿÿÿpOA'*þ¨ÿ«‡ÿÿÿ#OV'þ£ÿQ‡ÿÿÿ,OV'+þŒÿQ‡ÿÿ‘ÿþí˜&«ÿÿ‘ÿþí˜&G«ÿÿ‘ÿþíœ&ð«ÿÿ‘ÿþíœ&)ð«ÿÿ‘ÿþíœ&ð«ÿÿ‘ÿþíœ&*ð«ÿÿÿÈ@'þÑÿ«‹ÿÿÿÁ@'GþÊÿ«‹ÿÿÿHA'þxÿ«‹ÿÿÿ8A')þpÿ«‹ÿÿÿHA'þxÿ«‹ÿÿÿ8A'*þpÿ«‹ÿÿ5ÿFŒ&÷­ÿÿ5ÿF&G&ú­ÿÿ5ÿF“&ý­ÿÿ5ÿF“&)ý­ÿÿ5ÿF“&ý­ÿÿ5ÿF“&*ý­ÿÿ5ÿFÿ&ú­ÿÿ5ÿFÿ&+ ú­ÿÿÿè'@'þñÿ«ÿÿÿà'@'Gþéÿ«ÿÿÿg'A'þ—ÿ«ÿÿÿW'A')þÿ«ÿÿÿg'A'þ—ÿ«ÿÿÿW'A'*þÿ«ÿÿÿ 'V'þÿQÿÿÿ'V'+þrÿQÿÿ­ÿø÷Œ&Ø÷¯ÿÿ­ÿø÷Œ&GÖ÷¯ÿÿÿø÷&Àú¯ÿÿˆÿø÷&)Àú¯ÿÿÿø÷&Àú¯ÿÿˆÿø÷&*Àú¯ÿÿOÿø÷ü&Ï÷¯ÿÿoÿø÷ü&+Ï÷¯ÿÿç@'ÿÿ«ÿÿç@'Gÿÿ«ÿÿÿŽçA'þ¾ÿ«ÿÿÿ~çA')þ¶ÿ«ÿÿÿŽçA'þ¾ÿ«ÿÿÿ~çA'*þ¶ÿ«ÿÿÿ;çV'þ»ÿQÿÿÿ:çV'+þšÿQÿÿHÿð‹&þöµÿÿHÿðŒ&G÷µÿÿHÿð&ñúµÿÿHÿð&)ñúµÿÿHÿð&ñúµÿÿHÿð&*ñúµÿÿÿèÿð%@'þñÿ«•ÿÿÿØÿð%@'Gþáÿ«•ÿÿÿbÿð%A'þ’ÿ«•ÿÿÿPÿð%A')þˆÿ«•ÿÿÿ‡ÿð%A'þ·ÿ«•ÿÿÿwÿð%A'*þ¯ÿ«•ÿÿ+ÿô)Œ&ú÷»ÿÿ+ÿô)Œ&G÷»ÿÿ+ÿô)&ïú»ÿÿ+ÿô)&)ïú»ÿÿ+ÿô)&ïú»ÿÿ+ÿô)&*ïú»ÿÿ+ÿô)ü&þ÷»ÿÿ+ÿô)ü&+÷÷»ÿÿÿÇ%@'GþÐÿ«›ÿÿÿL%A')þ„ÿ«›ÿÿÿ=%A'*þuÿ«›ÿÿÿ«%Á'Yÿd¯ÿÿ+ÿð(Œ&÷¿ÿÿ+ÿð(Œ&G ÷¿ÿÿ+ÿð(&÷ú¿ÿÿ+ÿð(&)óú¿ÿÿ+ÿð(&óú¿ÿÿ+ÿð(&*óú¿ÿÿ+ÿð(ü&÷¿ÿÿ+ÿð(ü&+÷¿ÿÿÿé@'þòÿ«ŸÿÿÿÙ@'Gþâÿ«Ÿÿÿÿ_A'þÿ«ŸÿÿÿRA')þŠÿ«Ÿÿÿÿ†A'þ¶ÿ«Ÿÿÿÿ{A'*þ³ÿ«Ÿÿÿÿ<@'þ¼ÿ;ŸÿÿÿJ@'+þªÿ;Ÿÿÿ?ÿðG&;ùú§ÿÿ?ÿðG&Fùú§ÿÿ‘ÿþíœ&; «ÿÿ‘ÿþíœ&F «ÿÿ5ÿF“&;-ý­ÿÿ5ÿF“&F-ý­ÿÿ­ÿø÷&;Ýú¯ÿÿ­ÿø÷&FÝú¯ÿÿHÿð&;úµÿÿHÿð&Fúµÿÿ+ÿô)&; ú»ÿÿ+ÿô)&F ú»ÿÿ+ÿð(&;ú¿ÿÿ+ÿð(&Fú¿ÿÿ?ÿGŒ&{È_ÿÿ?ÿGŒ&{È`ÿÿ?ÿG&{Èaÿÿ?ÿG&{Èbÿÿ?ÿG&{Ècÿÿ?ÿG&{Èdÿÿ?ÿGü&{Èeÿÿ?ÿGü&{ÈfÿÿÿüÿO@&ÇgÿÿÿùÿO@&Çhÿÿÿ€ÿOA&ÇiÿÿÿpÿOA&Çjÿÿÿ€ÿOA&ÇkÿÿÿpÿOA&Çlÿÿÿ#ÿOV&Çmÿÿÿ,ÿOV&Çnÿÿ5ÿŒ&{ŠÊ{ÿÿ5ÿ&{ŠÊ|ÿÿ5ÿ“&{ŠÊ}ÿÿ5ÿ“&{ŠÊ~ÿÿ5ÿ“&{ŠÊÿÿ5ÿ“&{ŠÊ€ÿÿ5ÿÿ&{ŠÊÿÿ5ÿÿ&{ŠÊ‚ÿÿÿèÿ'@&ǃÿÿÿàÿ'@&Ç„ÿÿÿgÿ'A&Ç…ÿÿÿWÿ'A&džÿÿÿgÿ'A&LJÿÿÿWÿ'A&Ljÿÿÿ ÿ'V&ljÿÿÿÿ'V&ÇŠÿÿ+ÿ(Œ&{ȳÿÿ+ÿ(Œ&{È´ÿÿ+ÿ(&{ȵÿÿ+ÿ(&{ȶÿÿ+ÿ(&{È·ÿÿ+ÿ(&{ȸÿÿ+ÿ(ü&{ȹÿÿ+ÿ(ü&{Ⱥÿÿÿéþþ@&Å»ÿÿÿÙþþ@&żÿÿÿ_þþA&ŽÿÿÿRþþA&žÿÿÿ†þþA&Å¿ÿÿÿ{þþA&ÅÀÿÿÿ<þþ@&ÅÁÿÿÿJþþ@&ÅÂÿÿ?ÿðGY&Uëí§ÿÿ?ÿðGÿ&që¿§ÿÿ?ÿG&{ÈÃÿÿ?ÿG¯&{ȧÿÿ?ÿGh&{È¢ÿÿ?ÿðG0&Ó§ÿÿ?ÿG0&{Èÿÿ Oê&U¸~‡ÿÿ O&q¸P‡ÿÿÿýOA';ÿ ÿ«‡ÿÿÿýOA'Fÿ ÿ«‡ÿÿ ÿO3&LJÿÿ9é!327632#"'&=(3  +J+*F  <(30÷àT•27654'#÷&" 8 * $!./‘Ç] 2#"'&#"#"'47632327676³$!4 (#'-[ $ %ŒÿÍÝ 0@2#"'&#"#"'476323276762#"'&547632#"'&5476³$!4 (#'-í!   è!  Û $ %x    ÿÿ5ÿ“&{ŠÊÇÿÿ5ÿ¯&{ŠÊ­ÿÿ5ÿk&{ŠÊ¤ÿÿ5ÿF3&Ö­ÿÿ5ÿ3&{ŠÊÿÿÿÅA';þÔÿ«‹ÿÿÿÅA'FþÔÿ«‹ÿÿÿä'A';þóÿ«ÿÿÿä'A'Fþóÿ«ÿÿ5ÿ'3&ÍÐܧ–!'&/&767627654'#m8 8 ˜&" 8 *‹˜ ˜ ‘ $!./Ðܧ–#62'"'&747'27654'#‡  8  &" 8 *‹  ˜   $!./ÿÿ€à¶'ÿï¨ÿÿjÿø÷Y&UÏí¯ÿÿjÿø÷ÿ&qÏ¿¯ÿÿ\ÿø÷‘&9ÐÛ¯ÿÿZÿø÷&:ÎÚ¯ÿÿ`ÿø÷0&ÏÓ¯ÿÿZÿø÷µ&ÎØ¯ÿÿqçê&U~ÿÿqç&qPÿÿ çA';ÿÿ«ÿÿ çA'Fÿÿ«Èܯ–!'&/&7676"'&54763"u8 8 K3/%! ‹˜ ˜ ‘!*6 !!$Èܯ–#62'"'&747'"'&54763"  8  23/%! ‹  ˜  !*6 !!$ÿÿ àÖ'¨Gÿÿ+ÿô)Y&Uþí»ÿÿ+ÿô)ÿ&qþ¿»ÿÿ+ÿô)’&9þÜ»ÿÿ+ÿô)&:þÚ»ÿÿÿB˜&·ÿÿÿB˜&G·ÿÿ+ÿô)0&þÓ»ÿÿ+ÿô)µ&þØ»ÿÿ3%ê&U~›ÿÿ3%&qP›ÿÿÿÍ%A';þÜÿ«›ÿÿÿÍ%A'FþÜÿ«›ÿÿÿÁó@'GþÊÿ«—ŒüͶ 0'&/&76762#"'&547632#"'&54768 8 N!   è!  «˜˜O    ŒüͶ -62'"'&7'2#"'&547632#"'&5476C  8  M!   è!  « ˜ P    ñÜK–'&/&76768 8 ‹˜ ˜ ÿÿ+ÿ(&{ÈÏÿÿ+ÿ(®&{È¿ÿÿ+ÿ(h&{ÈÄÿÿ+ÿð(0&Ó¿ÿÿ+ÿ(0&{È?ÿÿÿÛ%P';þêÿ«•ÿÿ%Q'Fÿÿ«•ÿÿÿÙA';þèÿ«ŸÿÿA'Fÿ#ÿ«ŸÿÿFÿ 3&ÑŸñÜK–62/&747+  8  ‹  ˜  ÷àT•"'&54763"T3/%! !*6 !!$ˆÐ+ !"543!2µþîH. !"543!2õþn’W. !"543!2<ýà ÿÿW.Jÿôÿ#dÿµ!5!5dýpýK22`22WÑ\ #"/‰F ‘\áï‡:T\ 3#"'&547Ï…‘ \þ÷‡ÿoT‘ 73#"'&547Ï…‘ ‘þ÷ÿÿWÑ\M]Wû\ #"/##"/³F ‰\F ‰\áïáï]Wû\ 3#"'&547%3#"'&547¥}‰ }‰ \ïáï]ÿŒû‘ 73#"'&547%3#"'&547¥}‰ }‰ ‘ïáïÿÿ]Wû\Q|ÿÁÜ\4?3543232+#"5#"|„€€€ŒŸ þdœ|ÿÂÜ\&4?3543232+32+#"=#"54;5#"|„€€€€€€€ŒŸ ÓŸŸÓÊŽQ2#"'&5476.3.6/Q-6.63ÿñ%T/72#"'&547632#"'&547632#"'&5476d!  !  Ñ!   Ó  !  T  !     "ÿ÷4f/?O_o2#"'&5476"327654'& #"'&547%6322#"'&5476"327654'&72#"'&5476"327654'&;!0":!0", ', (LþŠ v þ¶;!0":!0", ', (ü;!0":!0", ', (f2#9!1":""'. '0 Àz  z ²2#9!1":""'. '0 "2#9!1":""'. '0 ÿ÷Rf/O`q‚2#"'&5476"327654'& #"'&547%632672#"'"'"'&547632672327654'&#"4'&#"32765'4'&#"32765;!0":!0", ', (LþŠ v y!<;!0";"%8;"%8:!0";"!<;3', (, "), ', º), ', f2#9!1":""'. '0 Àz  z æ32#9!40401":"43o, '0 '0'. '0'. 'ÉWŽ\ 3#"'&547}‰ \ïÿÿ]Wû\RWW\  3#"'&547'3#"'&547%3#"'&547}‰ ‚}‰ Ö}‰ \ïáïáïÉWŽ\ #"/FF ‰\áïÿÿ]Wû\GRXÀ@WW\  #"/!#"/!#"/GF ‰EF ‰þíF ‰\áïáïáï?8¡?632#"'?Ð   ÑÅ  ¨©  %¡%#"'&54?'&547632Ï  ŽŽ  ÐÅ  ¨©  pÿñèj"3E#"'&54763232+"'&5476 #"'&54763232+"'&5476Ò . # #  Ç . # $  3þºF  þ !  ! ÞþºF  þ !  ! †ÿñçAE%32+"'&54767&5'&54763267654'&#"#"=767232#"5+ $ + %   l >#-=DM8h09 =U" $ " % ‹Î  •4; @")D "D%1C.)ÿô{d­!5dý­222Š%Ö #"'&547632þA ¿ ®þä  ÿ„“\-3#"'&=4767&'&=47632B*/ " 6&/& 9* (.»). ­0& ­:$ Åÿ„B\054'&'&'432#"54763676=&'&#&47674" 6  &/& -- 9º).­0 & ­:$ »+(*&ÿñHj"GY#"'&54763232+"'&5476%#"=67654'&#"#"=76723232+"'&54762 . #  #  þéˆ>#-=DM8h09 =++ $ + % 3þºF  þ !  ! ¢)D9;@")D "D%1C.¦" $ " % ÿñ'j"GY#"'&54763232+"'&5476%#"=67654'&#"#"=76723232+"'&5476r . # $  Iˆ>#-=DM8h09 =++ $ + % 3þºF  þ !  ! ¢)D9;@")D "D%1C.¦" $ " % ÿÿOÿ \Gx\À@À˜!#"'&=47632276=4'&"˜7?7>´@@ã:b(D&1:c(D&53<  <3<  ·˜f37332+32#"'4735#Ojj˜…7   `'˜?³âÚ >>µú¢c+67232#"'&5472327654'"#"#"'532ø) 8 8%/* *3>A. ¤?b4$H# '5KÎþ¶t"1"'&+"632"'&=47632;2765&'"µD',3G#&[ >.? ¼=&<#Z>,97D.!b$+Z9, òK* W#·þf0'&7#"'53` ^Ù@þÎ,8Àý˜n'7#"'&547&547632'"327654'&"327654'&X@0!; @;/8g7 -* * *5¼;7/:33-4p- ' . Ÿ(.* "Íþ·t ,&#&376&'&747672#"'&76765‹G'%% )3@ #&\ >&2 7G6.ýS+ =)(4?!.!e%,[:# 8/G²A¦E#'&=#"'472;547236= SSS ·`  `VV²·¦Û "'472;6ÇÉ ·±‘§ÿ"'472;6'&7&76;2#ÈÈ  É  ÉÛ I èu¨61&'&7676c P & T+§  Œ;F ‰>CãèQ§'&576'&/6õ Y(Q &§‰ƒ¹´tþ@ÿÿºÿ>“¦uþ@ÿÿÃÿ=›®vþ@ÿÿÐÿ>º´wþ@²ÿ¦ƒ#'&=#"'472;547236= SSS  `  `VV²ÿõ¦ "'472;6ÇÉ  ±ÿϧ=7"'472;6'&7&76;2#ÈÈ  É  É I ÿ&uæ%61&'&7676c P & T+å  Œ;F ‰>Cãÿ&Qå7'&576'&/6õ Y(Q &剃ëîL*Vý  .! / & (  U {& (   5  .þòá:'B%)$B<àE%47632+4763232767676'#"'&=&'&'&'&+#"'&532ó"!?Ì£*i + ~§L()‚Iþ·@!!9þðÂ’’6 þ]Ì#'J ÿð@E!2!!2!32767632#"'&'#"'4;5#"'673676325432#"'&'&#"j þÞþýO7BYC &MafNC  T@OfG@0:`;"_<b7'F #GNCX<oA1Ep4#O-ÿù>u);cp5472"'&'&#"327632#"'&547632'#"'&5476325#"'&54763254/"#"'&54763232#'5&#"32 < QFG-3?N'=$.: þ¡  ^ þð65D;!)-(0 7(? ?*C' 7=.KX- %?&0U,µþb  ž ˜-8 ,"  ,«D; &  3í^9F #"'&5476325#"'&54763254/"#"'&54763232#'5&#"32åþ¡  ^ þä65D;!)-(0 7(? ?*C' 7Ýþb  ž ¯-8 ,"  ,«D; &  ?ÿð@+1732767632#"'&=47676325432#"'&'&#"Í7>YC &LbfON6 EfeH@0:7-)<>%F #GONeSTI JEp4#þfxAYGVÿðB•P2#"'&5476"327654'&5432#"'&'&#"32767632"'&=47632p6 *3,%" %" Œ;'3_4"D6L?, &@;iG?F=[I< •-/+1! $ $yp;!T9KGiB4(! #< UKbSqJ@3 ÿôMP!K]2#"'&5476"327654'&'&5472"'&'&#"327632#"'&547632#"'&547632ºK+:(1I,:'2; 1!:!2É < QFG-3?N'=$.:þ¡  ^ ;'2G,;'1G-%0!; 0 =! 7=.KX- %?&0U,sþb  ž  ÿôMP!K]2#"'&5476"327654'&'&5472"'&'&#"327632#"'&547632#"'&547632ºK+:(1I,:'2; 1!:!2É < QFG-3?N'=$.:þ¡  ^ ;'2G,;'1G-%0!; 0 =! 7=.KX- %?&0U,sþb  ž ÿÿ\ÿðü@R!;337#"54;2+35#"54;2+32+"54;5#32+"54;3fÈ2â6x.6â2Ü)(0 ÑÑþççáþá0ÿã/8>%'&'&76767676?67'&'&'&'&7676327676@7'L-H+'  1.VB632765632#!"54367654'&/&547632#"'&#"Æ9ü#)þ½' 9%/6, (25³WF(hG'4?5>&.j H+'  1.uÿääx=676/"67632327676#"'&'&767'&'&7676úu93<*M$O:8Q.?‹ $=- 5O 0/ ;Q‰ItR޶rT€ š[MD .O h /01 ÿï.\8"327656/&3#"54;67632#"'&'!"54;#"54;¥,/O+þà6_ 0xD&*"þó<%N…,N7#"54;32+##"'&=43232%#"4;2'2#"'&5476"327654'&q6jÀÉ 4¿<$ ɈˆT1 (0 (" " Pºþ&ÚýöÚþrC Õ((ð*- *. " "ÿñTB$4D#32+"4;5#"4;2'327654'&+72#"'&5476"327654'&E?$`ŠA + q8K(M&|WUZW{xWVYVzoLEPIctLCQJf$$û$/(*% ªYWxWSXXy|WU)QJdmMFSHenLE4ÿjÆ2>%#"'3327654'&'"#"'&547&53676324'327682Sm($\$Glh= 0=..(  Yd%(X-þ C0þyNFšU p28|# Ñ,T,""K JWeCoR ¿0X3þ£AYRC@>+ó3#(732+"54;#"54;2#&+32?654¥Šé66ð_8&H8KA•† )8ç¾á@,9O1'ú ÖÂ(8<3ÿ%@1>C632327632#"'&#"#"'&54?&'&547632'327654'&#"16())*- &#!8T Z_9.QGakIERDÂ+4X?9I:M3,)H(   AaN^„WMZVx‡VHCPJbyL=þ]Mtr#M3 48327654'&+"543!232+&'&'#32+"54;3ÓD^57'-kT8(‹7(& 9U7'V²(0$3$4$;,5a0%:"@ œ2Òáþáÿÿþ÷M3'w´ÿL5óV3F32#"'4735#"'53"'5+"'4;5#'32#"'4;5#"'4;732#326Œ5Gò‚U%R S%U ;SQ< þþIjjIþòô¸¸ôþ¸¸þ1'375#!#"=!!5432!5U8þ«!þóÉþ¸:þ H)Þþ#ávŸ:þ4¶;ÌNÿþ;M#5676767654'&'##543235&'&'&547676;235432Ô+676\05: Ï}X 70BZ%&5K¯  KK@!4 Q8!¯ea4y d73 L % fB aeNÿþ;J"=##&'&54767675##"=3;67674/&'&/5G 3+ZD27U}ÏB5 " . \662%;ea )Q!$ %K) 47d=ae¯8Q-$ !CHS2¯ÿÿ+<3.ÿÿ O+‡ÿÿ+3)33À^ÿüè¤3%32=#"4;'&/#&32+5476;'&7676HaPzLd œ!? `ˆM"C Þ[@(h\ ™ î' p™^ g ÿöOd5G_%#"'&5472327654'&#&5476327654/#"#"'47632#"'&547632%32+"5432#"'&5476:4&5*)+0 - ,&-*> ^þ¡  ^ þªG²'A  ¹$47  $*   $ .+þb  ž {þÃ$  ÿöOf&\n3542#5767654'&#"#"'47632#"'&5472327654'&#&5476327654/#"#"'47632#"'&5476324–$æ„5$-#77"b:4&5*)+0 - ,&-*> Xþ¡  ^ )'+{5$ $ ,- !#ä$47  $*   $ .+þb  ž ÿôXd+=U67232#"'&5472327654'"#"#"'532'#"'&547632%32+"5432#"'&5476®) 8 8%/* *3>A. ¤Hþ¡  ^ þªG²'A  9b4$H# '5K¤þb  ž {þÃ$  ÿôXf&Rd3542#5767654'&#"#"'4763267232#"'&5472327654'"#"#"'532'#"'&5476324–$æ„5$-#77"û) 8 8%/* *3>A. ¤Hþ¡  ^ )'+{5$ $ ,- !#db4$H# '5K¤þb  ž ÿôXd6bt#"'&5472327654'&#&5476327654'&#"#"'4763267232#"'&5472327654'"#"#"'532'#"'&547632·:4&5*)+0 - ,&-*> É) 8 8%/* *3>A. ¤Hþ¡  ^ ¾$47  $*   $ . +¤b4$H# '5K¤þb  ž Dd6H_c#"'&5472327654'&#&5476327654'&#"#"'47632!#"'&547632#57332+32+"54763=#·:4&5*)+0 - ,&-*> þ¡  ^  •€9  U )k¾$47  $*   $ . +þb  ž þt"ÚØ$9$ ]´´ÿöBd)IW #"'&547632%32+"5432#"'&5476632#"'&547632'&#"327654'&#"åþ¡  ^ þªG²'A  L)3Y "^ >/>7D(E#0 ( Ýþb  ž {þÃ$  þa6_.  i#*[:+>)5@R) N 2ÿöBd+=]k67232#"'&5472327654'"#"#"'532#"'&547632632#"'&547632'&#"327654'&#"I) 8 8%/* *3>A. ¤þ¡  ^ o)3Y "^ >/>7D(E#0 ( @b4$H# '5Kcþb  ž þ½6_.  i#*[:+>)5@R) N 2ÿöHd'7Ia%#"'&547&547632'"327654'&"327654'&#"'&547632%32+"5432#"'&5476@0!; @;/8g7 -* ) *5þ¡  ^ þªG²'A  µ;7/:33-4p- ' . Ÿ&.* "9þb  ž {þÃ$  ÿöHd'7n€%#"'&547&547632'"327654'&"327654'&#"'&5472327654'&#&5476327654'&#"#"'47632!#"'&547632@0!; @;/8g7 -* ) *5þÄ:4&5*)+0 - ,&-*> þ¡  ^ µ;7/:33-4p- ' . Ÿ&.* "$47  $*   $ . +þb  ž ÿöHd+CScu67232#"'&5472327654'"#"#"'532#"'&547&547632'"327654'&"327654'&#"'&547632I) 8 8%/* *3>A. ¤@@0!; @;/8g7 -* ) *5þ¡  ^ @b4$H# '5Kþu;7/:33-4p- ' . Ÿ&.* "9þb  ž 8ÿöHf(8HZ0'&7#"'53#"'&547&547632'"327654'&"327654'&#"'&547632` ^Ù÷@0!; @;/8g7 -* ) *5þ¡  ^ @þÎ,8þO;7/:33-4p- ' . Ÿ&.* "9þb  ž 3íd) #"'&547632%32+"5432#"'&5476åþ¡  ^ þªG²'A  Ýþb  ž {þÃ$  qç332#!"54;#"543!2#@‹þÁ‹‹? þá1'3#3!2+32#!"54;#"54w——þÕ¿kkþAkk þ þá!73!2+32#!"54;#"54#3#3#<ßKKþ!KK†gg÷gg3þá)þá%33 $76#!"54;#"54;26;2' #ós‡þ956‰" fc '$(Ïu) þ á(þE¹*þáþ+,332/&'"#&54;26í#$¬ §/," Ž‹ 3þø(þE¹*%33#"'&56;26;2+32#!"5673#e- $' cf "‰65þ9‡D)  *þG»(þá .3#'%3#32#!"56"'&56;26;2+#€™þ9s_- $' OR "±(*)áþâ *þG»(þáþG3'+73##32#!"56"'&56;263!2+3Ölq)¡ þUK(' ;> " H(()áþáþáþâ *þG»(þJ32732+7#"54;2+32+"54;'32+"54;#"5437'*ð,xx(n"„2xx4ø**pB3ÉÉðñÉÉá)þñðÿÿ(03;E32732+32+"54;'32+"54;7'#"54;2+7#"54#38ñ++ø3xx2ƒ"n(xy-¸BB3þÉÉñðÉÉ)ðñJ37;#;2#!"54;'32+"54;7'#"54;2+7#"543!2+#Š||ƒ!þô ddp"||Zdd!)1 ðñÉÉñðÉÉþáþÿÿ?3/ÿÿ?ÿð@&ÿÿ+3'ÿÿ Q30)§‹#"/7632!2#Ÿb  ÄÅ  `T6  mm 5º&ž #"/&54?1#"/#"56  ln  4–b  ÄÄ   `þ¬6§‹!"543!'&547632#"/&547§þªT` ÅÄ  5 mm  º&ž %43276320'&54?6324 nl  œVþ¬`  ÄÄ  §?‹*#"/7632!'&547632#"/&54?b  ÄÅ  `6` ÅÄ  b6  mm 55 mm  6ºž,*#"/&54?"/7632'&54?6326  mm 55 mm  6¶b  ÄÅ  `þÊ` ÅÄ  bpgÐÅ'&'&/'"/'&'¶ >Ù ið ck ×>ð  zeØÅ'&'&5'&7637'#&?'&'&767vk ×=  ñ  €  >Ùhð  wmÖÌ%'&7676'&76'&7562tò  ñ ?زò  ði Ø=€màË?67674722Åò  ðh Ù>Ïò  ñ =× (Ÿ0•/'&'&76?##"/763237632#˜- $Íb  ÄÅ `à. %hZ H6  mm 5[ I(Ÿ0•03'&547632#"/&54?#'&'&76?#"54;76ý»` ÅÄ  bÒ- $x. .5 mm  6Z H[ Mž v-/#'67676763#&'&'&#&'¢1  bà Y(  '$  6=""e  Ê  ,&8'Mž v6'&/&'&#"54767676676?"'&7676767'&7¶)"=    $"  % (Y†!b "+'!   &  ,  Ê (§0‹/#"/76323763232+#"/žb  ÄÅ  `NŸ  `Õ×b   6  mm 5X 56  Yºž/#"/&54?"/"/#"=#"/&54?6  mm 5X 56  Y§b  ÄÅ  `NŸ  `Õ×b   ÿÿ(§0‹ÛX2ÀÿÿºžÜX2À)§‹)##"/763237632#"'Yºb  ÄÅ  `ºŸ  ††  6  mm 5X JJ  ÿÿ>§/‹GßXÀ@*‡6«!!#"/7612!5432#"5 þ”b  ÄÄ   `j6  ln  4aîš¾ !%#"/&54?1#"/32+"5436  ln  4aî)mb  ÄÄ   `þ•*‡6«!#"=432!'&547630#"/&54?Tj`  ÄÄ  bcîa4 nl  6š&¾2!7632'&147632#"54;2#@6  ln  4aî þ“b  ÄÄ   `kšÿ;, 432+"54#"/&54?"/7632'&54?632µîî~6  mm 55 mm  6 Àb  ÄÅ  `þÊ` ÅÄ  b)§º.!2767&+"'&5476;2#!#"/7632¡ :A&&G *)þñb  ÄÅ  .$1036  mm ÿÿE§7ºGæ`À@)§»-:547636+#"'&=##"/7632;2767&/T0= '&9µb  ÄÅ `Ü9/!3.$? ./EE6  mm 5 &.ÿÿE§7»Gè`À@§?‹C/?27676767767'&'4763"'4?'&'&'&#'&b ÄÅ  `$# !`  ÅÄ  b/  $ 6  mm 5#( 5 mm 6ŸX•@'&'&76?##"/76323763'&547632#"/&54?7- $”b  ÄÅ `§. %”` ÅÄ  bZ H6  mm 5[ I5 mm  6„4”ì76776'&76?îdÎ TÌ}Q «"  ª4\/â2þ±I  “Ý iÌþ#"'&5##"/7632ÌÅb  ÄÅ `¡þ‘F6  mm 5ÿÿŒïþGíXÀ@ÿÿiÌþGí@ÀÿÿŒïþíXÀ* 7632'&54?632!"'4763®4 nl  6þºþ”` ÆÄ  bF) þ %!#"/7632!47632 þ•` ÅÄ  bE{5 mm  6F( ‹947676762"'4'&'&'&&7632/472„ &(8,"*  &  6 ln 4–.*' ''!1,.*$( %%!þüb  ÄÆ `' ‹;763'&56?6324'&'&'&&#&'&76767636®4 nl 6 !+   *",%& –þþ` ÆÄ  b!%%($*.,1!' ' '*+g0; ("543!2/&'&''"/'&'þ1Ïþ†  *Ù  ið ¯k “ >ð  &ÿö69>!#"/?2!5432#"'#"'5432!'&7470763#"'4? þ”b  ÄÄ   `jþDj`  ÄÄ b“6 ln 4aî¼cîa4  nl 6;!-&/#'&//"'&'4723676ÓP >Ú  iB \2FuE3I7Ff-W6k  ×>%J ’>!ZAU];.X/9-276563#&'&54767'&'&?/"56?‡J)7W<3HCa†4H i  Ú>: s6B8LiFAo7J`; >×k'0!‹7632!2#!"54)Å  `Tþ:m 5 !©/&763!2#!"')  Æþ¬` 5 &ž#"/"542,l  6( Æ `þ¬Æ»&A6#"5#"'&547-5  þ:T` ÿÿ!‹Gù1À@ÿÿ1© /GúAÀ@ÿÿ%žGû;@Àÿÿ»&AGü;@À)147#"/7632!2#'&54?632#"'&54?!"543Ÿb  ÄÅ  `T:b  ÄÅ  `þ¬u6  mm 5H6  mm 5ÿÿ+/‡FÀ@ÿÿ)1GZÀ@)47#"/7632!2##"/7632!2#Ÿb  ÄÅ  `Tþªb  ÄÅ  `Tu6  mm 5 6  mm 5*&. 5#"/&54?1#"/#"5#"/&54?1#"/#"5ˆ6  ln  4 6  ln  4–b  ÄÄ   `þ¬Vb  ÄÄ   `þ¬ÿÿJ1GZÀ@ÿÿ*&. G2@À!a Ó'%#"'&54?!"543!2%7632!2#!"54Å  `þ¬ÆþÅ  `Tþ:Óm 5 m 5 ÿÿ!a ÓGAÀ@8 H%*32+#7##/?237332+3u¦¾‚.„l&  ˆŠ  $³‘(wºÀ«,&ÝÝ"   !òòHH/437'#73'&'4763"'4?##7##/?23737#8À§g"  Šˆ &²‚.„n&  ˆŠ  $µ‘(éÂ*!  "ÝÝ"   !òþ¾&8H)37'#7"'4?##7#"54;7#"54;733'&'4763½§oˆ† &²‚.„x‘¨Á‘(i$ n‚€ "ÝÝ&òò! 8“ Ÿ!2#!#/?2!2#!ˆ|þª&  ˆŠ  $Tþ†"   !¦&²ø'#"5"'&5?"/#"5@" €‚ "¨ý™@$  ‰ˆ  &ý¾8“ Ÿ7'!"543!'&'4763"'4?!"543Ðþ†T$  Šˆ &þª!  "¦&²ø %432763/47632432@"  ‚€ "vgý¿&   ˆˆ  $?ý™“HŸ"(&'4763"'4?!#/?2!7'!¬  Šˆ &þ´&  ˆŠ  $F*þlw  ""   !P¦ÿþ²$"(#"'&5?"/763/476327'7Î ""   !Pˆ  ˆˆ  &ýÆ&  ˆˆ  $5)ýz O37#"54;2+##"54;2+#3±;N–Ñ9È—M9úêqw“ýö “)þÛGÿïF#5"'4'47632#"'&547632&'"#"327654'&'&± 3BQ$A KBXeD6Ê"4@"0+5IiYSG×L ]Jsd“J-'W gKwd•I-~þS%5IiYN+-333%!+ë,ëþ:ŠÅ3ýÍ(Ù+-3!#+ë,¯ÅÅ3ýÍ þ'Ù&-;2+"'&5476;2+"!2#QL/?òònE9MA^òòv2³l3 VG^rI>^)6&ÿ¯œFM#7;2+"'#"'&54?&'&5476;763232+32#'7#"µM }Vòò##1 0U MA^s8 0ReY¾ëY`v2l4ª¹ h g.b')rI>x g½(½^)6snÐÁ ;2+"'&5476;2+"!2#œ 8ªª^'>%5ªª]J Q'1_/^ ÿÿ&G>À@&ÿ¯œ@GK?#"'&5476;7&+"'&5476;27632+#"'&54?#"'&5476;2767#73&¬ZÌßT$òò+'? ?VKC^e, $`ŸSm5º`M§F¿´ † ‡3g oJB] LW-;̤pÿÿsnÐÁGCÀ@3ÿA-+"'&54;!32+"54;#"'&543!2#32‹5þö6  Š,Ž-kký• ký•qÿû3'!!76;2!"=47&=43!2+"'ÆþÜ®¶4þ¢µ³W ÿþ·rƒM ‚H. !2#!"54c’þn.H%32+#"=#"4;5432'"43!2#@´´´´Ý’ä(¡¡(¢c((H\%%32+#"=#"4;5432'2#"'&5476@´´´´!   ä(¡¡(¢Ö  ÿÿqÿ¯çœÿÿâÙv\yt»32+ #"=43“7È̯èTB5ÒX$ýitÀ6F#"'&5472327654'&#&5476327654'&#"#"'4763232+ #"=43·:4&5*)+0 - ,&-*> R7È̯èTB$47  $*   $ . +þüÒX$ýit¼*#57332+32+"54763=#32+ #"=43§•€9  U )kY7È̯èTBÀ"ÚØ$9$ ]´´¯ÒX$ýi%†*Ô132760'&#"32+"'&'#"'&5476326;2+"0N<74 ..K ˆ86E2 =OR-@(3P<$R g0N@D0747632!2#!&'4ôýøþ  &22!# #32-ÙÙ- éþ2&ÿë2 #32þÿ ÿ-ÙÙýÎ2þé(À!#4'&#"#47632+^0@r:$+VG^rI>Ôx1L1Eþ,ÔnE9MA^(ÿõµ3327653#"'&5(+^0@r:$+VG^rI>µþ,x1L1EÔþ,nE9MA^ˆÿ±Óé.6'&'&/'&'&'&767636765476€" @25  0+è Mý®M :  + RA"8ÿ±#éO"'&/367654766/&/'&''&'&'&76763676547636m @  07" @2/;5  0+$š Mý®  + R8- Mý®M /1:  + RA"ÿ±KéBTf636/&/'&''&''&'&'&76763676547636636&'"#767654'&'"#767654º%" @2 1%*5  0+$ % @ 0h@ 0Ô Mý®M :  + RA"  & Mý®+ R& Mý®+ R&nÿ±àé@IT547636'&'&/'&'&'&76763676=&'&547667654'&/+$" @S/C)425  0U2#E,9L)<$VJ%=$ gA" Mg G/7W7"|M :  + {F0=X7#þ±8?&.N/4þÉ @$+N08ÿ±#éJS\n~ˆ54763666/&/'&''&'&'&76763676=&'&547667654'&#"'36765547"'&/63&#"327È+$7" @)3:+2/;5  062;0+'5ê#'=9"!  0 @#2. !%þtA" - Mr !6JP6ŒM /1:  + ‰5KP7þÕ,7672#"'&/"'&54767&547&'&547632654/ EE    FF  $$#% )Š~x‰*  -ˆ{†-" z`cc`baaÿÿHÿ¯ œ&ÿÿNÿ¯œ&!‰ÿôÏ>(%632#"'#"/&54?'&547632‰&  çç  !þÛ  çç —¢   Z¢   ÿÿ‰ÿôÏ>GTXÀ@3qÄ7"'&54763!2#!"3!2#Ë^'>%54þÌZ4#4qQ'1_/X'N#3qÄ%!"543!27654'&'!"543!2‚þÌ4H GþÌ4](?%qC"bQ(1_/3Ä &7!2#!"=47"'&54763!2#!"3!2#a£þ]€^'>%54þÌZ4#4%LQ'1_/X'N#ÿÿ3ÄGXMÀ@ÿñ?!'#"'&547632&'&'#5#6765#?VOnxQKWOnvQL+|!&*¹ÐÓ©$ûÓ w$xQJUOowQKUPY”/ ÓÓ»*Ó™¿ÓŽ2ÿñ?!#"'&547632&'&#"!3276?VOnxQKWOnvQL+V!0! *9?0$ …  !3ýN$   '#' ÿ : '5!#''%7!Ëþ~>/0(þ÷D7þ»P%þA!ö„ Tþ÷–ü|*~+; ÿT8M 3!73%57 '!ÉRþ¼)0ýÑ>œþ“"À%þ°Mü{–þöTYü“;,"ÿ AN3#3º^)j,‰)³û½BÐX !5Xý¨ PPåX5!5Xý¨5PPXT!5Xý¨TPP#Xs%!5Xý¨sPPX@!!Xý¨@(XT!!Xý¨TPÿ8@ 3#(( üÿ8T 3#PP üX@ 3+53#53ôdddÈÈþÔdd@((((XT 3+53#53ôdddÈÈþÔddTPPPPÿ8@  #=3#5@(((ôþpdÈÈý¨ÈÈÿ8T  #=3#5TPPPôþpdÈÈý¨ÈÈX@ #5;#!#53#53Ñ‚‚FAAþò‚‚ÈAA(((((XT #5;#!#53#53Ñ‚‚FAAþò‚‚ÈAAPPPPPÿ8@  #5#553#5@(((((;ÏÏþ²ÏÏÌggüæggÿ8T  #5#553#5TPPPPP;ÏÏþ²ÏÏÌggüæggÿ8X@!!#@þè(@(þ ÿ8XT!!#@þè(TPþ4ÿ8X@!!#TþüP@(þ ÿ8XT!!#TþüPTPþ4ÿ8@@#!5@(þè@ýøà(ÿ8@T#!5@(þèTýäÌPÿ8T@#!5TPþü@ýøà(ÿ8TT#!5TPþüTýäÌPX 3!(þ (X 3!(þ4PX 3!Pþ (X 3!Pþ4P@ !5!3@þÀ((à@ !5!3@þÀ(PÌT !5!3Tþ¬P(àT !5!3Tþ¬PPÌÿ8X 3!!(þèÈèþ (þ ÿ8X !!#3@þè((TPþ4èÿ8X #3!!#Pþè(þ (þ ÿ8X 3!!#(þüP@àþ (þ ÿ8X #3!TPPþ èþ (ÿ8X #3!!#Pþè(þ4Pþ4ÿ8X !!#33@þüP(TPþ4Ìÿ8X 3!!PþüÈèþ4Pþ4ÿ8@ #!5!3@(þè(Èà(àÿ8@ !5!3#þè((PÌüÿ8T #!5!3@(þèPþ à(àýøÿ8T 3#!5!3@Pþü(@ýøà(àÿ8T 3#!5PPþü@àüà(ÿ8T #!5!3@(þèPþ4ÌPÌýäÿ8T 3#!5!3@Pþü(TýäÌPÌÿ8T #!5!TPþü üÌPÌÿ8X@!!#!Xþè(þè@(þ àÿ8XT !!#!5!@þè(þè@@(þ ÌPÿ8XT 5!!#!5@þè(þè@Pþ4à(ÿ8XT!5!!#þèXþè(PPþ4ÿ8X@#!5!TPþüXþ à((ÿ8XT #!5!!TPþüTþ ÌP(ÿ8XT !5!5!!#þüTþüP(Pþ4ÿ8XT!!#!XþüPþüTPþ4ÌX 5!3!((àþ (X !5!3!@þÀ(PÌþ (X !5!3!!þè(þÀ(àþ4PX !!5!3@ý¨(TPPÌX 3!!5Pý¨@àþ ((X !5!3!Tþ¬PPÌþ (X !5!3!!þüPþ¬(àþ4PX !5!3!Xý¨PPÌþ4ÿ8X !5!3!!#þè(þè((àþ (þ ÿ8X 3!!#!5(þè(þèTÌþ (þ ÌPÿ8X #!5!3!@(þè(þ4à(àþ4Pÿ8X !5!3!!#þè(þè(PÌþ4Pþ4ÿ8X 3!!#!5Pþè(þè@àþ (þ à(ÿ8X #!5!3!TPþü(þ à(àþ (ÿ8X !5!3!!#þüPþüP(àþ (þ ÿ8X ##!5!3!T(þèPþ4ÌPÌþ (ÿ8X #5!5!3!!#þüPþè((àþ4Pþ4ÿ8X 3!!#!5!3@þüPþü(T(þ ÌPÌÿ8X 533!!#!5(þüPþü@Ìþ4Pþ4à(ÿ8X !5!3!!#þèPþè(PÌþ4Pþ4ÿ8X !!#!5!3@þüPþü(TPþ4ÌPÌÿ8X #!5!3!TPþüPþ ÌPÌþ (ÿ8X 3!!#!5PþüPþü@àþ4Pþ4à(ÿ8X !5!3!!#þüPþüPPÌþ4Pþ4X@#53#53Xúúþ¢úú(((XT#53#53Xúúþ¢úúPPPÿ8@ ##@((( þ>ÂýÚþ>Âðÿ8h ##hxxx þ>ÂýÚþ>ÂÜX|!!5!!Xý¨Xý¨( (Üÿ8| 3#3#Ü((x(( üèüÿ8X| !!!!@þèþèÈD(P(þ\Üÿ8X@ !####Ü|Ü(P(@(þ àþ Üÿ8X| !#+!!TÜ(P(|þ¬(þ\D(ÿ8@| #!5!5!5@(þèþè|ý¼¤(P(ÿ8|@ ####5|(P(Ü@ýøàþ à(ÿ8|| ##5!5!(ÜTþ¬|þ4¤(þ4(ý¼ÜX %3!!!(þèÜDþ\(P(ÜX !3333Xþ„(P(Üþ àþ ÜÜX  33!!T(Üþ¬Tþ„TÌþ\(Ìýä(DÜ@ %!5!5!5!3@þÀþè(Ü(P(¤| !53333|þ„Ü(P((àþ àÜ|  !53;!5!þüÜ(P(þ„TT(¤ý¼(ÿ8X 3!!!!(þèþèÈèþ\(P(þ\Üÿ8X  33#+3T(ÜÜ(P(( þ (þ èÜÿ8X  3##33!Ü(TÜ((ÜþüÈèüÌ(þ\Ìþ\(ÿ8@ #!5!5!5!@(þèþè ü¤(P(¤ÿ8|  ###533|(P(ÜÜ( üèüà(àÿ8|  #30!##!53|((þ„(ÜþüÜÈèýäþ4¤Dþ4(¤ÿ8X| !#!=!Xþè(þèX(þ\¤(P((ÿ8X@ !#####XÜ(P(Ü@(þ àþ àÿ8X| 5!##5)##0 Xþ¬(ÜTÜ(T((ýä¤((þ\ÌÜX  %!5!%5!3!Xý¨Xý¨(Ü(P(¤þ\(X !533333Xý¨Ü(P(Ü(àþ àþ ÜX  !!0!53!133Xý¨þüÜ|þü(Ü(Dþ4(¤þ4Ìþ\ÿ8X !5!3!!!!#!5!þè(þèþè(þèT(¤þ\(P(þ\¤(ÿ8X ###533333##TP(ÜÜ(P(ÜÜ(þ à(àþ àþ (þ ÿ8X ##50!##0330)533(ÜTÜ((Üþüþ¬Ü(Ȥ(þ4Ì(þ\Ìþ\((¤þ4ÿ8X@ 3#"#476ôddv%(Y1@(=(OþÔ,–-ÿÿÿ8@@GXÀ@ÿÿ@ XXÀÿÿX GX@Àÿïÿ.i*X"ý¨¾èüÿÿÿïÿ.i*GXÀ@ÿïÿ.i*  ' 7 C&"þåþå"&þÚ"",þØþ(êêþ(Ø,@!!,þÔ@(,@ 3#(( þ ÿÿ,X@,ÿÿÿ8@,þ ,T!!,þÔTP,T 3#PP þ ÿÿ,XT,ÿÿÿ8T,þ XT!5!5!!,þÔ,,þÔ(Pÿ8T 33#(P,ôþ þ ôÿÿXTG"XÀ@ÿÿÿ8T G#X@À,X !!Xý¨ þ ÿ8Xÿµ!!Xý¨K}ÿ8X25!!Xý¨2úÿ8X¯5!!Xý¨¯þ‰ÿ8X,!!Xý¨,þ ÿ8X©!!Xý¨©ýÿ8X&!!Xý¨&ýÿ8X£!!Xý¨£ü•ÿ8X !!Xý¨ üÿ8  !! ýó üÿ8 !!Âþ> üÿ8w !!wþ‰ üÿ8, !!,þÔ üÿ8á 3#áá üÿ8– 3#–– üÿ8K 3#KK ü,ÿ8X !!,,þÔ üÿ8&î #'+/37;?CGKOSW[_cgkosw%3#'3#'3#%3#'3#'3#3#'3#'3#%3#'3#'3#3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#%3#'3#'3#22È22È22ô22È22È22,22È22È22ô22È22È22,22È22È22ô22È22È22,22È22È22ô22È22È22,22È22È22ô22È22È22222222–22222ú22222–22222^22222–22222–22222–22222–22222–22222<ÿ8Xî #'+/37;?CGKOSW[_cgkosw{ƒ‡‹“—›Ÿ£§«¯³·»¿ÃÇËÏÓ×Ûßãçëï%3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22222222222222–22222222222ú22222222222–22222222222^22222222222–22222222222–22222222222–22222222222–22222222222–22222222222xÿ8X  #'+/37;?CGKOSW[_cgkosw{ƒ‡‹“—›Ÿ£§«¯³·»¿ÃÇËÏÓ×Ûßãçëïó÷ûÿ #'+/37;?CGKOSW[_cgkosw{ƒ‡‹“—›Ÿ£§«¯³·»¿ÃÇËÏÓ×Ûß%3#'3#'3#'3#'3#%3+3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#'3#'3#'3#'3#'3#%3#22d22d22d22d22ô22222d22d22d22d22ô22d22d22d22d22d22ô22–22d22d22d22d22ô22d22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô22–22d22d22d22d22ô22222d22d22d22d22ô2222222222222222222222222222222222222d22222222222222222222222,22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222d22222222222£X !!Xý¨ } ÿ8X 3# KK üÿ ,,!!,þÔ,ýß,ÿ X,!!,,þÔ,ýß,,N%,þÔNýßÿ XM!!!,,ý¨Mýßýßÿ XN%%,,þÔþÔ,þÔ,ýßCýßÿ XM!!!XþÔþÔMýßýÞÿ XM!!!XþÔþÔMû½",,XN%,,þÔNýßÿ XN%%,þÔ,,þÔ.ýÜDýßÿ XM!!!,,ý¨,!û¾2&ô3!2ôôþ 2&ô3!%!!2ôþ4¤þ\ôþ (¤1&ô87&'076767!00!0'&73!0767650'&'&'!00R 8$! 8þü$! (  *þü" 8"# 8þü$!/ ("  )þü2&ô 753!%!!¯úþ‰ôþ4¤þ\}úú}ôþ (¤2&ô !5%!5!!5%!5!!Z¤þ\¤þ\¤þ\¤þ\(ôYKK(Kþ§KK(Kæôþ 2&ô 73##!3##!!ÍKK(KYKK(Kæþ ô(¤þ\¤þ\¤þ\¤þ\(ô2&ô #'+/37;?C%353535#35353535#35353535#35#3#35##3!@KKKKKKK¾KKKKKKK›KKKKKKKþ§KKKKKKKKsôæKKsKKKsKKsKKsKKKsKKsKKsKKKsKKsK(KYKK(Kþòôþ 2&ô !!5+5%332ôþ '¥Þªˆþ\Þªþx¥ôþ Ì¥¥þxªÞˆã¥2&ô !#75373&þ Í¥ÞÞˆþxªÞ¥¥ôþ ô(¥¥ÞªˆÆªþx¥¥ 2&ô !$'+%3'5'7'35'7'7'?#'?#'!!žE‰(D}UUUÆUUUãD‰»Dþ D¶UUUÆUUUrD‰»D`E‰Dôþ lD`D‰DUUUÆUUU9DDE‰þØE‰¶UUUÆUUUrD`D‰aD(þ ¯©ú353¯úúú¯©ú735#53תª(ú(ªÒúú2&,3!2ô,þÔ2&,3!%!5!2ôþ4¤þ\,þÔ(Ü–Âô3!–,ôþ –Âô3!%3#–,þüÜÜôþ (¤?,3!2ô2,þÔ?,3!%!7!2ô2þ:¤&þ\,þÔ(Ü#5Æ)5ýî Æ#5Æ% !öÊÊÓýî (Nþ²(ƨ°â)7°þø„⨰â%'!7mAAÅþø„(jj(âT þ5 þ÷T %þ5þ© þ÷þ÷¿þyǬ %¬å…… Ç«%'7]n¼ä…;{@…yú %úþ…… yù%'%uÏSþ€…C‹H…#5Æ 5þøþöÆþ:Æ#5Æ! öþlÊ þ÷þ÷žþ²vþ:ƨ°â%'°„„ââ⨰â%#7'm‚A„„„ºj’ââ99Ë  ýî99ËþW  ýî ȇ¬‘ ?¬å……þö­‘757ûn¼ä…@{;þú^ß 7%^……þö_ß75%ãÏþ­€…H‹Cþú#5! ,þ÷    þ÷#5%7' ,ÑÑÑÑþ÷  8ÑÑÑþ÷  þ÷#5 %'77' ,„„„„ÑÑÑÑþ÷  „………ÑÑÑÑþ÷  þ÷#5!12#"'&54767"327654'&'&'2#"'&5476.3.6/gD9L@UeC9J.=nMJSLjsNHUMl-6.6~K?UgD8K@VcD* (RMjrNITMjrNGYÿõÿ? 77+ÔÔÒÒœœ?þÜþÚ&ââââ#5!"327654'&'&'2#"'&5476/gD9L@UeC9J.=nMJSLjsNHUMêK?UgD8K@VcD* (RMjrNITMjrNG #5-9CQaq}‡“¡2#"'&54762#"'&54762#"'4762"'&5476'"'472%"'&54763247632#"'&%47632#"'&%472"'&672"'&47632#"47632#",|òX•þêþ7¨þ²òþÉþX2òj|òPþl#5$-2#"'&547667&'67654'&0nMJSLjsNHUM{'$#P'$$LRLM IRMjrNITMjrNG)þ@˜þCÀþh)h=d hCcþ˜:` bC#51A2#"'&5476"327654'&'"327654'&'&'2#"'&5476.?%4!(A%6!'1 *0 )gD9L@UeC9J.=nMJSLjsNHUM†5!'@&5!(A%()1 )/ ŒK?UgD8K@VcD* (RMjrNITMjrNG#52#"'&54760nMJSLjsNHUMRMjrNITMjrNG#527654'&'2#"'&5476-eB9KAQnMJSLjsNHUMêþ>K@VcD:(RMjrNITMjrNG#5"32#"'&5476+aCOhD5,þÔ, qKBRIc a@5L;O# 0##567673/ f?# (VG^êM+5 qK=, 9'3#5&'&'&#-sK>(O3Bê(UF] d?*#0 %#&'&'53/sK>(N:K((UF] d?/,9 %3676753#- f?/(VG^(M9J qK=# 55&'&#"#567632 L>OhD5(VLgmNF a@5L;O qKBRIc #53#"'&'5332767 (SKbvOE(N?SaC6 oKDTGc c@3KÌ_=*SKitOHSLjqOI)ôa=/M@VdC0ÅÌN5#5#2#"'&547632767#7&'&'0nMJSLjsNHUMSc<.L@UdD2ôô M5ARMjrNITMjrNG) N3"'&7476323276=47632676320/&#"0'&#"0'&#"0'&#"ð4$!üV;CpK%!!!-2$ääS[T.L%/     ÿúP& '7'7PÃTµµTÃè=;R~Ú”’Ø ààx®%%'65472#"'47jò éÖ(ñ êÖJZÿì+!5472#"'473'7!#"'&5!2ù éÖIòêþÌ‹ êÖJñêýý+#5 04763#"'&7"327654'&'&'2#"'&5476(gD9L@UeC9J.=nMJSLjsNHUM   åK?UgD8K@VcD* (RMjrNITMjrNGÿÿ2&ôG2&ô3!%!!62#'&76762ôþ4¤þ\É Ú!\ ôþ (¤þŸ4  þ´Ž 2&ô.3!%!!'&/'&'&76?'&7676762ôþ4¤þ\îˆ ˆˆ ˆˆ ˆˆ ôþ (¤Òˆ ˆˆ ˆˆ ˆˆ &&ô!+5@K3&547#"'&54763!53#5#"'&547&547!"3!35#"";5#";®PþÌ$I+ 0$  f+ $ÀþÜ$¤¤¤#„ddÌþ\¤â4 + 8(þ (+  4 Ê _7(7_23ô *4>H#37##3!2+'!27654/327654/##327654'327654/ªPPä$*f  $/ *Ià$þܤ¤„„„‰dÌþ\ 4 9 (ô(+ 9  4¬7–_7^7Pÿì`S76#"'&=/&76?5#"'&5476;5#"'&5476;54763232+32#@T hT h´´XXXX´Z†1 <§1 <TNNTPÿì`=#"'&5476;5#"'&5476;54763232+32+#"'&5´´XXXX´´ZTNNTþ¦:S%##"'&54763235#"'&54763!2+3547632#"'&=#32#!"'&5476;ÒÒ‚,‚ÒÒ‚þÔ‚ú‚,‚ÒÒ‚þÔ‚Ò#5#'2#"'&5476'67654'&'7550nMJSLjsNHUMŒSS'K8JΦc<.A8TRMjrNITMjrNGþYu·Y8GcD3Ô‹‹Ô N2D9%/H+9&/E+†¼x†2@U7*C2BV6)(…6@#"'&5&76324763266=1,þ.& - °…ò@,%#"'&56/&'#"'&5&763247632ò9J 6=13G) ¼[04 þ®.& - °'F)2#2$5ÿþ<!#"'&5&7632#"'&5&7632æ6=1R6=1þ¬.& - Rþ.& - '5ÿþ<!%#"'&5&7632#"'&5&76325%5%æ6=1R6=1þþþþŠÜ.& - Rþ.& - ¯ŒaMam| 4'&#"67663247632àf#+>U—]WþµWGp<)Â`yl! %þªA<ÂÆ$D0E¦D!hxÿYà[ #53%à+þÃ+=+þî§Ì7mÜ7þ™93þÇ=ÿV\575375377#5#5577–YY+Ö+YYYY+Ö+YY+ÖW(°ª!¶°(þÈ(¡›!§¡(>þÈ!8lÿ„ì\ 32+32+32+32+”bŠŠbÜbŠŠbSØýzØlÿ„ì\ #"54;#"543##"54;#"543ÄbŠŠzbŠŠS†ý(†ý(}ÿ‡Û[0 #&' 672Øÿ þÀ> S þ½þ¿df}ÿ‡Û[63 "'4'4767 &'&'6€ >þÀ ÿSþšþœAC -ÿ‡+[/0 #&' 6720 #&' 672(ÿ þÀ> ›ÿ þÀ> S þ½þ¿df þ½þ¿df-ÿ‡+[/63 "'4'4767 &'&'6363 "'4'4767 &'&'60 >þÀ ÿ  >þÀ ÿSþšþœAC þšþœAC l¢é2#"'&5476ª&!$ !% $lè2#"'&5476ª'$! "# ! %lÁéû2#"'&547672"'&5476ª& $ & $! =" $ $¾!#! %kšè2#"'&5476©&!$ ! % $káé× #"'&5476322#"'&5476è# $! &>&!$ ' $! ¨!% $k½èö!2#"'&547672#"'&5476©&!$! &! $ :!%! %¼"$ $káé×0#"'&547632'2#"'&547672#"'&5476è# $! &>'$! &!$ ' $! ë"! ! &½!% $p¡í2#"'&5476®& $! !$! %¡É2#"'&5476#2#"'&5476‹' $! ­&" $ "$! %" & $ÁÉú #"'&54763272#"'&5476 # $ &&! $ ÿ' $!ö" $ $ÁÉû 02#"'&547672#"'&5476'2#"'&5476Í&!$ Î&! $ ­'$! =!% $½" $ $"# ! %áÉ×#"'&5476322#"'&5476 " $! '€'$! & &"ª"! ! &áÉ× 1#"'&5476322#"'&5476#2#"'&5476 " $ &€'"$! ®&!$ ' $"´"& &!% $áÉ× 0#"'&547632'2"'&547672#"'&5476 " $! '>& $! Î'$! & &"í!#! %½"! ! &áÉ×!1B#"'&5476327#"'&54763272#"'&5476#2#"'&5476 " $ &"$! &'"$! ®&!$ ' $"¸$! &!÷"& &!% $pží2#"'&5476®&!$ ! % $ÁÉû2#"'&5476'2#"'&5476‹' $! ­'$! >"$! %½"# ! %É!2#"'&5476#2#"'&5476‹&"$ ®& $! "& $!$! %ÁÉû 02#"'&54762#"'&547672#"'&5476‹'! $! ®&!$ '$! >"$! %!% $¾"# ! %½É÷2#"'&547672#"'&5476Í' $! Î'$! :"$! %½"# ! %áÉ×!2#"'&54763272#"'&5476'2#"'&5476 " $ &€&! $ ®&!$ ' $"÷"$ $½!% $½É÷/2#"'&547672#"'&54762#"'&5476Í' $! Î'$! ®&!$ :"$! %½"# ! %! % $áÉ×!2C#"'&54763272#"'&5476#"'&547632'2#"'&5476 " $ &€&! $ o"$! &?&!$ ' $"÷"$ $?$! &!÷!% $pÁíú 2#"'&547672#"'&5476®&!$! &!$ >!%! %¼!% $ÁÉû/2#"'&547672#"'&5476'2#"'&5476‹' $! & $ ­'$! >"$! %¼" $ $"# ! %ÁÉú 02#"'&5476#"'&54763272#"'&5476‹&! $ o# $ &&! $ =" $! $>' $!ö" $ $ÁÉû 0@2#"'&54762#"'&547672#"'&5476'2#"'&5476‹'! $! ®&!$ Î&! $ ­'$! >"$! %!% $½" $ $"# ! %áÉ× 0#"'&54763272#"'&547672#"'&5476 " $! '€&"$ '$! & &"í"& $½"! ! &áÉ×!1B#"'&54763272#"'&547672#"'&5476#2#"'&5476 " $ &€&! $ '"$! ®&!$ ' $"÷"$ $½"& &!% $áÉ× 1A#"'&54763272#"'&5476#2"'&547672#"'&5476 " $! '€&"$ ®& $! Î'$! & &"í"& $!#! %½"! ! &áÉ×!2BS#"'&54763272#"'&5476#"'&54763272#"'&5476#2#"'&5476 " $ &€&! $ o"$! &'"$! ®&!$ ' $"÷"$ $?$! &!÷"& &!% $pší2#"'&5476®&!$ ! % $áÉ× #"'&5476322#"'&5476É" $ &û&! $ ' $"´" $ $½Éö2#"'&5476'2#"'&5476‹'! $! ®&!$ :"$! %¼! % $áÉ×!12#"'&5476'2#"'&547672#"'&5476‹&"$ ®&$! &! $ ]"& $½!" ! &½" $ $šÉ2#"'&5476#2#"'&5476‹&! $ ®& $ " $ $" $ $áÉ×!22#"'&5476#"'&5476322#"'&5476‹&"$ p" $ &>&!$ ]"& $>' $"´!% $½Éö/2#"'&5476#2#"'&547672#"'&5476‹'! $! ®' $! &!$ :"$! %"$! %¼! % $áÉ×!2C2#"'&5476#"'&5476327#"'&547632'2#"'&5476‹&"$ p" $ &"$! &?&!$ ]"& $>' $"¸$! &!÷!% $páí× #"'&5476322#"'&5476í# $! &?&$! & &!´!" ! &áÉ× 0#"'&547632#"'&547632'2#"'&5476É" $ &" $! 'û&! $ ' $"u& &"7" $ $áÉ× 02#"'&5476'2#"'&547672#"'&5476‹'"$! ®& $! Î'$! ]"& &½!$! %½"! ! &áÉ×!1A2#"'&5476'2#"'&547672#"'&5476#2#"'&5476‹&"$ ®&$! Î'"$! ­&! $ ]"& $½!" ! &½"& &" $ $áÉ×/2#"'&5476#"'&5476322#"'&5476‹'"$! p" $! '€'$! ]"& &?& &"ª"! ! &áÉ×!1B2#"'&5476#"'&5476322#"'&5476#2#"'&5476‹&"$ p" $ &€'"$! ®&!$ ]"& $>' $"´"& &!% $áÉ×0@2#"'&5476#"'&547632'2"'&547672#"'&5476‹'"$! p" $! '>& $! Î'$! ]"& &?& &"í!#! %½"! ! &áÉ×!2BS2#"'&5476#"'&5476327#"'&54763272#"'&5476#2#"'&5476‹&"$ p" $ &"$! &'"$! ®&!$ ]"& $>' $"¸$! &!÷"& &!% $p½í÷!2#"'&547672#"'&5476®& $! & $! :!$! %½!$! %áÉ×!1#"'&547632'2#"'&5476'2#"'&5476É" $ &>& $ ­&! $ ' $"÷"$ $½" $ $½É÷/2#"'&547672#"'&54762#"'&5476‹'$! '$! ®&!$ :"# ! %½"# ! %! % $áÉ×!2B2#"'&547672#"'&5476#2#"'&547672#"'&5476‹&"$ &! $ ®&$! &! $ ]"& $½"$ $!" ! &½" $ $½É÷/2#"'&5476#2#"'&547672#"'&5476‹'$! ®' $! Î'$! :"# ! %"$! %½"# ! %áÉ×!2C2#"'&5476#"'&54763272#"'&5476'2#"'&5476‹&"$ p" $ &€&! $ ®&!$ ]"& $>' $"÷"$ $½!% $½É÷/?2#"'&5476#2#"'&547672#"'&54762#"'&5476‹'$! ®' $! Î'$! ®&!$ :"# ! %"$! %½"# ! %! % $áÉ×!2CT2#"'&5476#"'&54763272#"'&5476#"'&547632'2#"'&5476‹&"$ p" $ &€&! $ o"$! &?&!$ ]"& $>' $"÷"$ $?$! &!÷!% $páí× 0#"'&5476325#"'&547632'2#"'&5476í# $! &#$ &?&$! & &!¹' $! ë!" ! &áÉ×!1A#"'&547632'2#"'&54767#"'&547632'2#"'&5476É" $ &>& $ N" $! 'û&! $ ' $"÷"$ $~& &"7" $ $áÉ× 1A2#"'&547672#"'&5476#2#"'&547672#"'&5476‹'"$! &"$ ®& $! Î'$! ]"& &½"& $!$! %½"! ! &áÉ×!2BR2#"'&547672#"'&5476#2#"'&547672#"'&5476#2#"'&5476‹&"$ &! $ ®&$! Î'"$! ­&! $ ]"& $½"$ $!" ! &½"& &" $ $áÉ×0@2#"'&5476#"'&54763272#"'&547672#"'&5476‹'"$! p" $! '€&"$ '$! ]"& &?& &"í"& $½"! ! &áÉ×!2BS2#"'&5476#"'&54763272#"'&547672#"'&5476#2#"'&5476‹&"$ p" $ &€&! $ '"$! ®&!$ ]"& $>' $"÷"$ $½"& &!% $áÉ×0AQ2#"'&5476#"'&54763272#"'&5476#2"'&547672#"'&5476‹'"$! p" $! '€&"$ ®& $! Î'$! ]"& &?& &"í"& $!#! %½"! ! &áÉ×!2CSd2#"'&5476#"'&54763272#"'&5476#"'&54763272#"'&5476#2#"'&5476‹&"$ p" $ &€&! $ o"$! &'"$! ®&!$ ]"& $>' $"÷"$ $?$! &!÷"& &!% $lÿ•è72#"'&5476ª'$! "# ! %lé´7#"'&5476322"'&5476è" $ &>& $! >' $" g!#! %lÿÜèÓ72#"'&54762#"'&5476ª'! $! '$! Y"$! %z"# ! %lé´ 07#"'&5476322#"'&547672"'&5476è" $ &>& $ & $! >' $" ©"$ $¾!#! %kÿ¹èó72#"'&547672#"'&5476ª&! $ & $! 5" $ $¾!$! %ké´ 072#"'&547672#"'&54762"'&5476ª&" $ &!# & $! |" & $¾!%$z!#! %kÿÜèÓ/72#"'&54767#"'&547632'2#"'&5476ª'! $! N# $! &>'$! Y"$! %~& &!ì"# ! %ké´ 1A72#"'&547672#"'&547672#"'&547672"'&5476ª&" $ &!# &! $ & $! |" & $¾!%$¼"$ $¾!#! %ɳ%#"'&5476322#"'&5476 # $! &&! $ =& &!f" $ $É´/%#"'&5476322#"'&5476'2#"'&5476 # $ &&! $ ­'$! >' $! e" $ $"# ! %ɳ/%#"'&5476322#"'&547672#"'&5476 # $! &?&!$ Î&! $ =& &!©! % $½" $ $É´/?%#"'&5476322#"'&547672#"'&5476'2#"'&5476 # $ &?&!$ Î&! $ ­'$! >' $! ¨! % $½" $ $"# ! %ɳ 0%#"'&547632'2#"'&54762#"'&5476 # $! &?& $ Î&! $ =& &!ì"$! $z" $ $É´/?%#"'&547632'2#"'&54762#"'&5476'2#"'&5476 # $ &?' $! Î&! $ ®& ">' $! ì"$! %y" $ $!$$ɳ 0@%#"'&547632'2#"'&547672#"'&547672#"'&5476 # $! &?& $ &!$ Î&! $ =& &!ì"$! $½! % $½" $ $É´/?O%#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476 # $ &?' $! &!$ Î&! $ ®& ">' $! ì"$! %¼! % $½" $ $!$$ÿÜÉÓ 72#"'&54762#"'&5476Í& $! Î&! $ Y!$! %z"$ $É´/%#"'&5476322#"'&5476'2#"'&5476 # $ &'$! ­'$! >' $! ©"# ! %½"# ! %ÿÜÉÓ 172#"'&54762#"'&5476#2#"'&5476Í& $! Î&! $ ®&$! Y!$! %z"$ $!" ! &É´/?%#"'&5476322#"'&54762#"'&547672#"'&5476 # $ &'$! ®&!$ '$! >' $! ©"# ! %! % $¾"# ! %ÿÜÉÓ072"'&54767#"'&54763272#"'&5476Í& $! N" $ &€&! $ Y!#! %' $" ì"$ $É´/?%#"'&547632'2#"'&547672#"'&5476'2#"'&5476 # $ &?' $! Î'$! ®& ">' $! ì"$! %½"# ! %½!$$ÿÜÉÓ0A72"'&54767#"'&54763272#"'&5476#"'&547632Í& $! N" $ &€&! $ o"$! &Y!#! %' $" ì"$ $?$! &!É´/?O%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476 # $ &?' $! Î'$! ®&!$ & ">' $! ì"$! %½"# ! %! % $¾!$$ɳ/%#"'&5476322#"'&547672#"'&5476 # $! &'! $! &! $ =& &!ª"$! %¼" $ $É´/?%#"'&5476322#"'&547672#"'&5476'2#"'&5476 # $ &'$! &! $ ­'$! >' $! ©"# ! %¼" $ $"# ! %ɳ/?%#"'&5476322#"'&54762#"'&547672#"'&5476 # $! &'! $! ®&!$ Î&! $ =& &!ª"$! %! % $½" $ $É´/?O%#"'&5476322#"'&54762#"'&547672#"'&5476'2#"'&5476 # $ &'$! ®&!$ Î&! $ ­'$! >' $! ©"# ! %! % $½" $ $"# ! %ɳ 0@%#"'&547632'2#"'&547672#"'&547672#"'&5476 # $! &?& $ Î'! $! &! $ =& &!ì"$! $¾"$! %¼" $ $É´/?O%#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476 # $ &?' $! Î'$! &! $ ®& ">' $! ì"$! %½"# ! %¼" $ $!$$ɳ 0@P%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476 # $! &?& $ Î'! $! ®&!$ Î&! $ =& &!ì"$! $¾"$! %! % $½" $ $É´/?O_%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476 # $ &?' $! Î'$! ®&!$ Î&! $ ®& ">' $! ì"$! %½"# ! %! % $½" $ $!$$ÿ¹Éó%2#"'&54762#"'&5476‹'$! ®&!$ ó"# ! %¾! % $É´/2#"'&5476#"'&5476322#"'&5476‹'! $! o# $ &>'$! :"$! %ü' $! f"# ! %ÿÜÉÓ02#"'&54762#"'&54762#"'&5476‹'"$! ®&!$! & $! "& &½!%! %z!$! %É´/?2#"'&5476#"'&5476322#"'&547672#"'&5476‹'! $! o# $ &?&!$ '$! :"$! %ü' $! ¨! % $¾"# ! %ÿ¹Éó/%2#"'&54762#"'&547672#"'&5476‹'$! ®&!$ ' $! ó"# ! %¾! % $¾"$! %É´/?2#"'&5476#"'&547632'2#"'&54762#"'&5476‹'! $! o# $ &?' $! & ":"$! %ü' $! ì"$! %z!$$ÿÜÉÓ/@2#"'&54762#"'&54767#"'&547632'2"'&5476‹'"$! ®&!$! N" $! '>& $! "& &½!%! %~& &"í!#! %É´/?O2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476‹'! $! o# $ &?' $! &!$ & ":"$! %ü' $! ì"$! %¼! % $¾!$$ɳ 02#"'&5476#"'&5476322#"'&5476‹&! $ o# $! &&! $ 9"$! $ü& &!f" $ $É´/?2#"'&5476#"'&5476322#"'&5476'2#"'&5476‹'! $! o# $ &&! $ ­'$! :"$! %ü' $! e" $ $"# ! %ɳ 0@2#"'&5476#"'&5476322#"'&547672#"'&5476‹&! $ o# $! &?&!$ Î&! $ 9"$! $ü& &!©! % $½" $ $É´/?O2#"'&5476#"'&5476322#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &?&!$ Î&! $ ­'$! :"$! %ü' $! ¨! % $½" $ $"# ! %ɳ 1A2#"'&5476#"'&547632'2#"'&54762#"'&5476‹&! $ o# $! &?& $ Î&! $ 9"$! $ü& &!ì"$! $z" $ $É´/?O2#"'&5476#"'&547632'2#"'&54762#"'&5476'2#"'&5476‹'! $! o# $ &?' $! Î&! $ ®& ":"$! %ü' $! ì"$! %y" $ $!$$ɳ 1AQ2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476‹&! $ o# $! &?& $ &!$ Î&! $ 9"$! $ü& &!ì"$! $½! % $½" $ $É´/?O_2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &?' $! &!$ Î&! $ ®& ":"$! %ü' $! ì"$! %¼! % $½" $ $!$$ÿÜÉÓ02#"'&54762#"'&54762#"'&5476‹&"$ ®& $! Î&! $ " & $½!$! %z"$ $É´/?2#"'&5476#"'&5476322#"'&5476'2#"'&5476‹'! $! o# $ &'$! ­'$! :"$! %ü' $! ©"# ! %½"# ! %ÿÜÉÓ0A2#"'&54762#"'&54762#"'&5476#2#"'&5476‹&"$ ®& $! Î&! $ ®&$! " & $½!$! %z"$ $!" ! &É´/?2#"'&5476#"'&5476322#"'&547672#"'&5476‹'! $! o# $ &?&!$ '$! :"$! %ü' $! ¨! % $¾"# ! %ÿÜÉÓ/@2#"'&54762"'&54767#"'&54763272#"'&5476‹&"$ ®& $! N" $ &€&! $ " & $½!#! %' $" ì"$ $É´/?O2#"'&5476#"'&547632'2#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &?' $! Î'$! ®& ":"$! %ü' $! ì"$! %½"# ! %½!$$ÿÜÉÓ/@Q2#"'&54762"'&54767#"'&54763272#"'&5476#"'&547632‹&"$ ®& $! N" $ &€&! $ o"$! &" & $½!#! %' $" ì"$ $?$! &!É´/?O_2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476‹'! $! o# $ &?' $! Î'$! ®&!$ & ":"$! %ü' $! ì"$! %½"# ! %! % $¾!$$ɳ 0@2#"'&5476#"'&5476322#"'&547672#"'&5476‹&! $ o# $! &'! $! &! $ 9"$! $ü& &!ª"$! %¼" $ $É´/?O2#"'&5476#"'&5476322#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &'$! &! $ ­'$! :"$! %ü' $! ©"# ! %¼" $ $"# ! %ɳ 0@P2#"'&5476#"'&5476322#"'&54762#"'&547672#"'&5476‹&! $ o# $! &'! $! ®&!$ Î&! $ 9"$! $ü& &!ª"$! %! % $½" $ $É´/?O_2#"'&5476#"'&5476322#"'&54762#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &'$! ®&!$ Î&! $ ­'$! :"$! %ü' $! ©"# ! %! % $½" $ $"# ! %ɳ 1AQ2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476‹&! $ o# $! &?& $ Î'! $! &! $ 9"$! $ü& &!ì"$! $¾"$! %¼" $ $É´/?O_2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &?' $! Î'$! &! $ ®& ":"$! %ü' $! ì"$! %½"# ! %¼" $ $!$$ɳ 1AQa2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476‹&! $ o# $! &?& $ Î'! $! ®&!$ Î&! $ 9"$! $ü& &!ì"$! $¾"$! %! % $½" $ $É´/?O_o2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476‹'! $! o# $ &?' $! Î'$! ®&!$ Î&! $ ®& ":"$! %ü' $! ì"$! %½"# ! %! % $½" $ $!$$pÿ•ì%2#"'&5476®'$! "# ! %É´%#"'&5476322#"'&5476É# $! &û'$! >' $! f"# ! %ÿÜÉÓ %2#"'&54762"'&5476Š&!$! ­& $! Y!%! %z!#! %É´/%#"'&5476322#"'&547672#"'&5476É# $ &ü&!$ & ">' $! ¨! % $¾!$$ÿ¹Éó %2#"'&5476'2#"'&5476Š&!$ ­' $! 5! % $¾"$! %É´/%#"'&547632'2#"'&54762#"'&5476É# $ &ü' $! & ">' $! ì"$! %z!$$ÿÜÉÓ 1%2#"'&5476'#"'&547632'2"'&5476Š&!$! o" $! '>& $! Y!%! %~& &"í!#! %É´/?%#"'&547632'2#"'&547672#"'&547672#"'&5476É# $ &ü' $! &!$ & ">' $! ì"$! %¼! % $¾!$$pí³!%#"'&5476322#"'&5476ì" $! '>&!$ =& &"g!% $É´/%#"'&5476322#"'&5476'2#"'&5476É# $ &>& $ ­'$! >' $! e" $ $"# ! %ɳ/%#"'&5476322#"'&547672#"'&5476É# $!&ü&!$ Î&! $ =& %!©! % $½" $ $É´/?%#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $! &ü&!$ Î&! $ ­'$! >' $! ¨! % $½" $ $"# ! %ɳ 0%#"'&547632'2#"'&54762#"'&5476É# $! &ü& $ Î&! $ =& &!ì"$! $z" $ $É´/?%#"'&547632'2#"'&54762#"'&5476'2#"'&5476É# $ &ü' $! Î&! $ ®& ">' $! ì"$! %y" $ $!$$ɳ 0@%#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &ü& $ &!$ Î&! $ =& &!ì"$! $½! % $½" $ $É´/?O%#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &ü' $! &!$ Î&! $ ®& ">' $! ì"$! %¼! % $½" $ $!$$pÿÜíÓ %2#"'&54762#"'&5476®' $! &!$ Y"$! %z! % $É´/%#"'&5476322#"'&5476'2#"'&5476É# $ &>' $! ­'$! >' $! ©"$! %½"# ! %ÿÜÉÓ 1%2#"'&54762#"'&5476#2#"'&5476Š& $ &! $ ®&$! Y!$! $z"$ $!" ! &É´/?%#"'&5476322#"'&54762#"'&547672#"'&5476É# $! &>'$! ®&!$ '$! >' $! ©"# ! %! % $¾"# ! %ÿÜÉÓ0%2#"'&5476'#"'&54763272#"'&5476Š& $! o" $ &€&! $ Y!$! %' $" ì"$ $É´/?%#"'&547632'2#"'&547672#"'&5476'2#"'&5476É# $ &ü' $! Î'$! ®& ">' $! ì"$! %½"# ! %½!$$ÿÜÉÓ0A%2#"'&5476'#"'&54763272#"'&5476#"'&547632Š& $! o" $ &€&! $ o"$! &Y!$! %' $" ì"$ $?$! &!É´/?O%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $ &ü' $! Î'$! ®&!$ & ">' $! ì"$! %½"# ! %! % $¾!$$pí³!3%#"'&5476322#"'&547672#"'&5476ì" $! '>&!$! &!$ =& &"«!%! %¼!% $É´/?%#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $ &>' $! & $ ­'$! >' $! ©"$! %¼" $ $"# ! %ɳ/?%#"'&5476322#"'&54762#"'&547672#"'&5476É# $!&>'! $! ®&!$ Î&! $ =& %!ª"$! %! % $½" $ $É´/?O%#"'&5476322#"'&54762#"'&547672#"'&5476'2#"'&5476É# $! &>'$! ®&!$ Î&! $ ­'$! >' $! ©"# ! %! % $½" $ $"# ! %ɳ 0@%#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &ü& $ Î'! $! &! $ =& &!ì"$! $¾"$! %¼" $ $É´/?O%#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &ü' $! Î'$! &! $ ®& ">' $! ì"$! %½"# ! %¼" $ $!$$ɳ 0@P%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $! &ü& $ Î'! $! ®&!$ Î&! $ =& &!ì"$! $¾"$! %! % $½" $ $É´/?O_%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476É# $ &ü' $! Î'$! ®&!$ Î&! $ ®& ">' $! ì"$! %½"# ! %! % $½" $ $!$$pÿ¹íó%2#"'&547672"'&5476®& $ & $! 5" $ $¾!#! %É´/%#"'&547632'2#"'&54762#"'&5476É# $ &>' $! ­'$! >' $! ì"$! %z"# ! %ÿÜÉÓ0%2#"'&547672#"'&5476'2#"'&5476Š&!$ '"$! ®& $! Y!%! $½"& &½!$! %É´/?%#"'&547632'2#"'&5476'2#"'&547672#"'&5476É# $! &>'! $! ®&!$ '$! >' $! ì"$! %¼! % $¾"# ! %ÿ¹Éó/%2#"'&547672#"'&5476#2#"'&5476Š&!$ '$! ®' $! 5! % $¾"# ! %"$! %É´/?%#"'&547632'2#"'&5476#2#"'&54762#"'&5476É# $ &>'! $! ®' $! & ">' $! ì"$! %"$! %z!$$ÿÜÉÓ/@%2#"'&547672#"'&5476#"'&547632'2"'&5476Š&!$! '"$! p" $! '>& $! Y!%! %½"& &?& &"í!#! %É´/?O%#"'&547632'2#"'&5476#2#"'&547672#"'&547672#"'&5476É# $ &>'! $! ®' $! &!$ & ">' $! ì"$! %"$! %¼! % $¾!$$pí³ 2%#"'&547632'2#"'&54762#"'&5476ì" $! '>&!$ &!$ =& &"í! %! $z!% $É´/?%#"'&547632'2#"'&54762#"'&5476'2#"'&5476É# $ &>' $! & $ ­'$! >' $! ì"$! %y" $ $"# ! %ɳ 0@%#"'&547632'2#"'&5476'2#"'&547672#"'&5476É# $!&>&! $ ®&!$ Î&! $ =& %!ì"$! $½! % $½" $ $É´/?O%#"'&547632'2#"'&5476'2#"'&547672#"'&5476'2#"'&5476É# $! &>'! $! ®&!$ Î&! $ ­'$! >' $! ì"$! %¼! % $½" $ $"# ! %ɳ 1A%#"'&547632'2#"'&5476#2#"'&54762#"'&5476É# $! &>&! $ ®& $ Î&! $ =& &!ì"$! $"$! $z" $ $É´/?O%#"'&547632'2#"'&5476#2#"'&54762#"'&5476'2#"'&5476É# $ &>'! $! ®' $! Î&! $ ®& ">' $! ì"$! %"$! %y" $ $!$$ɳ 1AQ%#"'&547632'2#"'&5476#2#"'&547672#"'&547672#"'&5476É# $! &>&! $ ®& $ &!$ Î&! $ =& &!ì"$! $"$! $½! % $½" $ $É´/?O_%#"'&547632'2#"'&5476#2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! ®' $! &!$ Î&! $ ®& ">' $! ì"$! %"$! %¼! % $½" $ $!$$pÿÜíÓ0%2#"'&54767#"'&547632'2#"'&5476®' $! O# $ &?&!$ Y"$! %' $! ë! % $É´/?%#"'&547632'2#"'&547672#"'&5476'2#"'&5476É# $ &>' $! ' $! ­'$! >' $! ì"$! %½"$! %½"# ! %ÿÜÉÓ0A%2#"'&547672#"'&547672#"'&5476#2#"'&5476Š& $ &"$ &! $ ®&$! Y!$! $½" & $½"$ $!" ! &É´/?O%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $! &>'! $! '$! ®&!$ '$! >' $! ì"$! %½"# ! %! % $¾"# ! %ÿÜÉÓ/@%2#"'&547672#"'&5476#"'&54763272#"'&5476Š& $! &"$ p" $ &€&! $ Y!$! %½" & $>' $" ì"$ $É´/?O%#"'&547632'2#"'&5476#2#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! ®' $! Î'$! ®& ">' $! ì"$! %"$! %½"# ! %½!$$ÿÜÉÓ/@Q%2#"'&547672#"'&5476#"'&54763272#"'&5476#"'&547632Š& $! &"$ p" $ &€&! $ o"$! &Y!$! %½" & $>' $" ì"$ $?$! &!É´/?O_%#"'&547632'2#"'&5476#2#"'&547672#"'&54762#"'&547672#"'&5476É# $ &>'! $! ®' $! Î'$! ®&!$ & ">' $! ì"$! %"$! %½"# ! %! % $¾!$$pí³ 2D%#"'&547632'2#"'&547672#"'&547672#"'&5476ì" $! '>&!$ &!$! &!$ =& &"í! %! $¾!%! %¼!% $É´/?O%#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &>' $! ' $! & $ ­'$! >' $! ì"$! %½"$! %¼" $ $"# ! %ɳ 0@P%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $!&>&! $ '! $! ®&!$ Î&! $ =& %!ì"$! $¾"$! %! % $½" $ $É´/?O_%#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476É# $! &>'! $! '$! ®&!$ Î&! $ ­'$! >' $! ì"$! %½"# ! %! % $½" $ $"# ! %ɳ 1AQ%#"'&547632'2#"'&5476#2#"'&547672#"'&547672#"'&5476É# $! &>&! $ ®& $ Î'! $! &! $ =& &!ì"$! $"$! $¾"$! %¼" $ $É´/?O_%#"'&547632'2#"'&5476#2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! ®' $! Î'$! &! $ ®& ">' $! ì"$! %"$! %½"# ! %¼" $ $!$$ɳ 1AQa%#"'&547632'2#"'&5476#2#"'&547672#"'&54762#"'&547672#"'&5476É# $! &>&! $ ®& $ Î'! $! ®&!$ Î&! $ =& &!ì"$! $"$! $¾"$! %! % $½" $ $É´/?O_o%#"'&547632'2#"'&5476#2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! ®' $! Î'$! ®&!$ Î&! $ ®& ">' $! ì"$! %"$! %½"# ! %! % $½" $ $!$$ÿ•É%2#"'&5476#2"'&5476Š& $! ­& $! !$! %!#! %É´/%#"'&547632#"'&5476322#"'&5476É# $ &½# $ &?& ">' $! ' $! f!$$ÿÜÉÓ0%2#"'&5476#2#"'&54762"'&5476Š&!$! ­&!$! & $! Y!%! %!%! %z!#! %É´/?%#"'&547632#"'&5476322#"'&547672#"'&5476É# $ &½# $ &?&!$ & ">' $! ' $! ¨! % $¾!$$ÿ¹Éó 0%2#"'&5476#2#"'&547672#"'&5476Š&!$ ­&!$ ' $! 5! % $! % $¾"$! %É´/?%#"'&547632#"'&547632'2#"'&54762#"'&5476É# $ &½# $ &?' $! & ">' $! ' $! ì"$! %z!$$ÿÜÉÓ 0A%2#"'&5476#2#"'&54767#"'&547632'2"'&5476Š&!$! ­&!$! N" $! '>& $! Y!%! %!%! %~& &"í!#! %É´/?O%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476É# $ &½# $ &?' $! &!$ & ">' $! ' $! ì"$! %¼! % $¾!$$ɳ/%#"'&547632#"'&5476322#"'&5476É# $!&½# $! &&! $ =& %!& &!f" $ $É´/?%#"'&547632#"'&5476322#"'&5476'2#"'&5476É# $! &½# $ &&! $ ­'$! >' $! ' $! e" $ $"# ! %ɳ/?%#"'&547632#"'&5476322#"'&547672#"'&5476É# $!&½# $! &?&!$ Î&! $ =& %!& &!©! % $½" $ $É´/?O%#"'&547632#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $! &½# $ &?&!$ Î&! $ ­'$! >' $! ' $! ¨! % $½" $ $"# ! %ɳ0@P%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &½# $! &?& $ &!$ Î&! $ =& &!& &!ì"$! $½! % $½" $ $É´/?O%#"'&547632#"'&547632'2#"'&54762#"'&5476'2#"'&5476É# $ &½# $ &?' $! Î&! $ ®& ">' $! ' $! ì"$! %y" $ $!$$ɳ0@P%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &½# $! &?& $ &!$ Î&! $ =& &!& &!ì"$! $½! % $½" $ $É´/?O_%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &½# $ &?' $! &!$ Î&! $ ®& ">' $! ' $! ì"$! %¼! % $½" $ $!$$ÿÜÉÓ0%2#"'&5476#2#"'&54762#"'&5476Š& $ ­& $! Î&! $ Y!$! $!$! %z"$ $É´/?%#"'&547632#"'&5476322#"'&5476'2#"'&5476É# $! &½# $ &'$! ­'$! >' $! ' $! ©"# ! %½"# ! %ÿÜÉÓ0A%2#"'&5476#2#"'&54762#"'&5476#2#"'&5476Š& $ ­& $! Î&! $ ®&$! Y!$! $!$! %z"$ $!" ! &É´/?O%#"'&547632#"'&5476322#"'&54762#"'&547672#"'&5476É# $! &½# $ &'$! ®&!$ '$! >' $! ' $! ©"# ! %! % $¾"# ! %ÿÜÉÓ/@%2#"'&5476#2"'&54767#"'&54763272#"'&5476Š& $! ­& $! N" $ &€&! $ Y!$! %!#! %' $" ì"$ $É´/?O%#"'&547632#"'&547632'2#"'&547672#"'&5476'2#"'&5476É# $ &½# $ &?' $! Î'$! ®& ">' $! ' $! ì"$! %½"# ! %½!$$ÿÜÉÓ/@Q%2#"'&5476#2"'&54767#"'&54763272#"'&5476#"'&547632Š& $! ­& $! N" $ &€&! $ o"$! &Y!$! %!#! %' $" ì"$ $?$! &!É´/?O_%#"'&547632#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $ &½# $ &?' $! Î'$! ®&!$ & ">' $! ' $! ì"$! %½"# ! %! % $¾!$$ɳ/?%#"'&547632#"'&5476322#"'&547672#"'&5476É# $!&½# $! &'! $! &! $ =& %!& &!ª"$! %¼" $ $É´/?O%#"'&547632#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $! &½# $ &'$! &! $ ­'$! >' $! ' $! ©"# ! %¼" $ $"# ! %ɳ/?O%#"'&547632#"'&5476322#"'&54762#"'&547672#"'&5476É# $!&½# $! &'! $! ®&!$ Î&! $ =& %!& &!ª"$! %! % $½" $ $É´/?O_%#"'&547632#"'&5476322#"'&54762#"'&547672#"'&5476'2#"'&5476É# $! &½# $ &'$! ®&!$ Î&! $ ­'$! >' $! ' $! ©"# ! %! % $½" $ $"# ! %ɳ0@P%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &½# $! &?& $ Î'! $! &! $ =& &!& &!ì"$! $¾"$! %¼" $ $É´/?O_%#"'&547632#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &½# $ &?' $! Î'$! &! $ ®& ">' $! ' $! ì"$! %½"# ! %¼" $ $!$$ɳ0@P`%#"'&547632#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $! &½# $! &?& $ Î'! $! ®&!$ Î&! $ =& &!& &!ì"$! $¾"$! %! % $½" $ $É´/?O_o%#"'&547632#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476É# $ &½# $ &?' $! Î'$! ®&!$ Î&! $ ®& ">' $! ' $! ì"$! %½"# ! %! % $½" $ $!$$ÿ¹Éó/%2#"'&547672#"'&54762#"'&5476Š&!$! '$! ®&!$ 5! % $¾"# ! %¾! % $É´/?%#"'&547632'2#"'&5476#"'&5476322#"'&5476É# $! &>'! $! o# $ &>'$! >' $! ì"$! %ü' $! f"# ! %ÿÜÉÓ/@%2#"'&547672#"'&54762#"'&54762#"'&5476Š&!$ '"$! ®&!$! & $! Y!%! $½"& &½!%! %z!$! %É´/?O%#"'&547632'2#"'&5476#"'&5476322#"'&547672#"'&5476É# $! &>'! $! o# $ &?&!$ '$! >' $! ì"$! %ü' $! ¨! % $¾"# ! %ÿ¹Éó/?%2#"'&547672#"'&54762#"'&547672#"'&5476Š&!$ '$! ®&!$ ' $! 5! % $¾"# ! %¾! % $¾"$! %É´/?O%#"'&547632'2#"'&5476#"'&547632'2#"'&54762#"'&5476É# $ &>'! $! o# $ &?' $! & ">' $! ì"$! %ü' $! ì"$! %z!$$ÿÜÉÓ/?P%2#"'&547672#"'&54762#"'&54767#"'&547632'2"'&5476Š&!$! '"$! ®&!$! N" $! '>& $! Y!%! %½"& &½!%! %~& &"í!#! %É´/?O_%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476É# $ &>'! $! o# $ &?' $! &!$ & ">' $! ì"$! %ü' $! ì"$! %¼! % $¾!$$ɳ 0@%#"'&547632'2#"'&5476#"'&5476322#"'&5476É# $!&>&! $ o# $! &&! $ =& %!ì"$! $ü& &!f" $ $É´/?O%#"'&547632'2#"'&5476#"'&5476322#"'&5476'2#"'&5476É# $! &>'! $! o# $ &&! $ ­'$! >' $! ì"$! %ü' $! e" $ $"# ! %ɳ 0@P%#"'&547632'2#"'&5476#"'&5476322#"'&547672#"'&5476É# $!&>&! $ o# $! &?&!$ Î&! $ =& %!ì"$! $ü& &!©! % $½" $ $É´/?O_%#"'&547632'2#"'&5476#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $! &>'! $! o# $ &?&!$ Î&! $ ­'$! >' $! ì"$! %ü' $! ¨! % $½" $ $"# ! %ɳ 0AQ%#"'&547632'2#"'&5476#"'&547632'2#"'&54762#"'&5476É# $! &>&! $ o# $! &?& $ Î&! $ =& &!ì"$! $ü& &!ì"$! $z" $ $É´/?O_%#"'&547632'2#"'&5476#"'&547632'2#"'&54762#"'&5476'2#"'&5476É# $ &>'! $! o# $ &?' $! Î&! $ ®& ">' $! ì"$! %ü' $! ì"$! %y" $ $!$$ɳ 0AQa%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &>&! $ o# $! &?& $ &!$ Î&! $ =& &!ì"$! $ü& &!ì"$! $½! % $½" $ $É´/?O_o%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! o# $ &?' $! &!$ Î&! $ ®& ">' $! ì"$! %ü' $! ì"$! %¼! % $½" $ $!$$ÿÜÉÓ/@%2#"'&547672#"'&54762#"'&54762#"'&5476Š& $ &"$ ®& $! Î&! $ Y!$! $½" & $½!$! %z"$ $É´/?O%#"'&547632'2#"'&5476#"'&5476322#"'&5476'2#"'&5476É# $! &>'! $! o# $ &'$! ­'$! >' $! ì"$! %ü' $! ©"# ! %½"# ! %ÿÜÉÓ/@Q%2#"'&547672#"'&54762#"'&54762#"'&5476#2#"'&5476Š& $ &"$ ®& $! Î&! $ ®&$! Y!$! $½" & $½!$! %z"$ $!" ! &É´/?O_%#"'&547632'2#"'&5476#"'&5476322#"'&54762#"'&547672#"'&5476É# $! &>'! $! o# $ &'$! ®&!$ '$! >' $! ì"$! %ü' $! ©"# ! %! % $¾"# ! %ÿÜÉÓ/?P%2#"'&547672#"'&54762"'&54767#"'&54763272#"'&5476Š& $! &"$ ®& $! N" $ &€&! $ Y!$! %½" & $½!#! %' $" ì"$ $É´/?O_%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! o# $ &?' $! Î'$! ®& ">' $! ì"$! %ü' $! ì"$! %½"# ! %½!$$ÿÜÉÓ/?Pa%2#"'&547672#"'&54762"'&54767#"'&54763272#"'&5476#"'&547632Š& $! &"$ ®& $! N" $ &€&! $ o"$! &Y!$! %½" & $½!#! %' $" ì"$ $?$! &!É´/?O_o%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $ &>'! $! o# $ &?' $! Î'$! ®&!$ & ">' $! ì"$! %ü' $! ì"$! %½"# ! %! % $¾!$$ɳ 0@P%#"'&547632'2#"'&5476#"'&5476322#"'&547672#"'&5476É# $!&>&! $ o# $! &'! $! &! $ =& %!ì"$! $ü& &!ª"$! %¼" $ $É´/?O_%#"'&547632'2#"'&5476#"'&5476322#"'&547672#"'&5476'2#"'&5476É# $! &>'! $! o# $ &'$! &! $ ­'$! >' $! ì"$! %ü' $! ©"# ! %¼" $ $"# ! %ɳ 0@P`%#"'&547632'2#"'&5476#"'&5476322#"'&54762#"'&547672#"'&5476É# $!&>&! $ o# $! &'! $! ®&!$ Î&! $ =& %!ì"$! $ü& &!ª"$! %! % $½" $ $É´/?O_o%#"'&547632'2#"'&5476#"'&5476322#"'&54762#"'&547672#"'&5476'2#"'&5476É# $! &>'! $! o# $ &'$! ®&!$ Î&! $ ­'$! >' $! ì"$! %ü' $! ©"# ! %! % $½" $ $"# ! %ɳ 0AQa%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476É# $! &>&! $ o# $! &?& $ Î'! $! &! $ =& &!ì"$! $ü& &!ì"$! $¾"$! %¼" $ $É´/?O_o%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! o# $ &?' $! Î'$! &! $ ®& ">' $! ì"$! %ü' $! ì"$! %½"# ! %¼" $ $!$$ɳ 0AQaq%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476É# $! &>&! $ o# $! &?& $ Î'! $! ®&!$ Î&! $ =& &!ì"$! $ü& &!ì"$! $¾"$! %! % $½" $ $É´/?O_o%#"'&547632'2#"'&5476#"'&547632'2#"'&547672#"'&54762#"'&547672#"'&5476'2#"'&5476É# $ &>'! $! o# $ &?' $! Î'$! ®&!$ Î&! $ ®& ">' $! ì"$! %ü' $! ì"$! %½"# ! %! % $½" $ $!$$êÿoÿÄ#"'&54?632gT T a~ ~S\-[32+"54;#"54;547632"'&#"32#!32+"54;#"54;547632"'&#"32#¶HÄSMM0 &% %(HþžHÄSMM0 &% %(Hxþ±O;E& ,;þ±O;E& ,; Ip-@D32+"54;#"54;547632"'&#"32#732+"54;#"5437#5¡HÄSMM0 %& %(HúKÁM9a;xþ±O;E& ,;)þˆOÏhh K\,?32+"54;#"54;547632"'&#"32#732+"54;#"543¡HÄSMM0 '$*& HúMÃM9xþ±O;E& );äýÍ ÿðK\'N#"54;543232+327632#"'&532+"54;#"54;547632"'&#"aJJ||3  +J+ÅHÄSMM0 &% %(xkkëF  <(3UþMO;E& ,Ëÿð3'#"54;543232+327632#"'&51JJ||3  +J+xwwëF  <(3ªsIà"%2"'&5476#"'&=#"'&54763,Y®2ðǹŸu#67676"'&'&'&76762R $8  %"O   ZqÂà%9732+"'&5476#"'&=#"'&54763!#"'&=#"'&54763ý‡‡ YTYšFðÇðÇ<ÿÿà.7#"'&5476;3676767#"'476;'"#!"'&54763ïB]€I85 "V…( ,Kþÿ)ŽþI NþÄT+<à8%676=#"'&5476;'&'32+547'&7676z`5^x | þåd5^‚| ¿%1~§a5| %7~§f4| <à!"'&54763!2##"'&5…þË·Y·þ]<á2747632#"'&#"'&5&'&'&/!"'&54763!6_½ %þÛ%/*ÿ&þÛ%7  0<ÿÿóá3!#"'&5476;6767676=&'&'&'&+"'&5476;6'"Lüü6  ) üü.*"+M ) ’7  -O’L',<i%/&76?676=!547632!ñÛ ÛþI·áÛ Û ~žu§-<á*!&'&'&'&+"'&54763!6!&76767hi ) Ÿ†%-*þE·h ì6  2JþÇ<á #"'&5&'&'&/!"'&54763!6 %þÛ%/*9þÛ%7  0ÿÿá>'"+"'&5476;67676765#"'&54763!6#"'&5&'&'&'&#Ó"!<$$*Z%/*  ' ·þË>#"  5 (GþÛ%6 H"54;543232#c´´ÉÉ3BWH2#"'&547632+3276767#"'476;!32+3#"'&5476%þæ\2Q7 "2`' 0LþÇ^5–2WwþrMþÄR*àþrŽ1:WH2#"'&547632+3276767#"'476;!32+3#"'&5476O¼\2Q7 "2`' 0LþÇ^5–2WwþrMþÄR*àþrŽ3BWHW2#"'&547632+3276767#"'476;!32+3#"'&54762"'&5476%þæ\2Q7 "2`' 0LþÇ^5–2‘WwþrMþÄR*àþrŽÒ1:WHW2#"'&547632+3276767#"'476;!32+3#"'&54762"'&5476O¼\2Q7 "2`' 0LþÇ^5–2‘WwþrMþÄR*àþrŽÒ<ÿ›àJ32+"'&54767676=#"'&5476;'&'32+547'&7676采“`5^x | þåd5^‚| <û%1~§a5| %7~§f4| <ÿ$àS#"'&5476;2##"'&5676=#"'&5476;'&'32+547'&7676.‡0c`5^x | þåd5^‚| ec‡%1~§a5| %7~§f4| <à8G%676=#"'&5476;'&'32+547'&76762"'&5476z`5^x | þåd5^‚| ¿%1~§a5| %7~§f4| þÀ<0à-<%4'&'&/#"'&5476;232#!"'&5476372"'&5476™+ËËN)+Zþ4Ü)7%+Mþðå…ÿÿÓá5C%54'&'&/#"'&5476;6#'&/'&'&74?676'2"'&5476… #!II1+$  V$.9 &*$5¹€7  *M  M  0/<à)!"'&54763!2##"'&5'2"'&5476…þË·YY·þ]ú<á2A747632#"'&#"'&5&'&'&/!"'&54763!62"'&5476_½ %þÛ%/*ßÿ&þÛ%7  0wª@à"2"'&54767#"'&5#"'&54763ÐtYÒþ4£…Óà'2"'&54767#"'4763!2##"'&5ÎM}$~©þ]ÿÿàH%2"'&54767'&'&76?3#'&'&745#"'&5476;;27676765LHs ~œ"0Lj/+5^ % j7êÍŠ ›þÇL'* (MþÇ6 ) £Û@à !2"'&54767#"'&=#"'&54763À„YfzðÇ<ÿ%óá"1"'&5&'&'&'&+"'&5476;62"'&5476ó ' üü/)Ç9þ6  'J1<ÿÿóá3B!#"'&5476;6767676=&'&'&'&+"'&5476;6'"2"'&5476Lüü6  ) üü.*"+M" ) ’7  -O’L',<i*%/&76?676=!547632!'2"'&5476ñÛ ÛþI·èáÛ Û ~žu§-2<á6E73!"'&5476;&'&'&'&+#"'&5#"'&5476;2"'&5476Š}‰?")þëì ' eh:¸ku&'JþÇ6 hþ£Ò…¯á02"'&5476!"'&54734'&'&'&+"'476;6,†þìë( $$.+þò7 +M<ÿÿàBQ;7676=&'&'&'&+"'&54763!2'#'&'&'7&7672"'&5476h ( „I ) Ÿ†%K'* PŒ-*!³·h n6 I Œ7 "0LŒO 'Nu%&^<ÿ%á6D32+5&76?#"'&54763!6#"'&5&'&'&'&#2"'&5476h¢Ë!K†%/* ' ·h:%&K 0Lþ7 }<áHV32+5&7676?#"'&54763!6!"'&547!2767676=&'&'&'&#2"'&5476h¢Ë K†%/*#0LþÜ$7 ' ·h  :K 2J’L(** ’6 u2à172"'&5476?5#"'476;!"'&547!55#"'476;Ö˜Y‚¤¤þ5¢þ·Y‚ÈM‰U“¤TR"C1ÿ%à );2"'&5476'&'&76?676=!"'&54763!%#"'&547632@¨Û Ûþ]Ìþ’,ƒ¥ ¤  µÞ8Kþ$Ü<á /#"'&5&'&'&/!"'&54763!62"'&5476 %þÛ%/*ï9þÛ%7  0w3:àH2"'&5476'32+3276767#"'476;!32+3#"'&5476–‹\2Q7 "2`' 0LþÇ^5–2ÒþrMþÄR*àþrŽÿÿáM2"'&5476''"+"'&5476;67676765#"'&54763!6#"'&5&'&'&'&#X"!<$$*Z%/*  ' ©þË>#"  5 (GþÛ%6 ª@W !2"'&5476#"'&5#"'&547632YWwþ4£<0E?32+"'&54764'&'&/#"'&5476;232#!"'&54763҇Ö+ËËN)+Zþ4Eýä7%+Mþð<ÿÿóEE32+"'&5476#"'&5476;6767676=&'&'&'&+"'&5476;6'"ɇ‡…üü6  ) üü.*"+MEý» ) ’7  -O’L',<EZ32+"'&547632+5&7676?#"'&54763!6!"'&547!2767676=&'&'&'&#采)h¢Ë K†%/*#0LþÜ$7 ' EŽh  :K 2J’L(** ’6 <i(547632676=#"'&5476;'&'&<`5^x | þỈþë%1~§a5| ·9"354767674'&#"3672#3 e##* ,9g( 2/ '**þò ]   /$?mD%á1\ þóŒüͶ 0'&/&76762#"'&547632#"'&54768 8 N!   è!  «˜˜O    Y2ZŠ ¥Vº>4n¿ ŒÚH¯X-\œ³+^¤Ñ Fh$ù,x ¥H³^ý]Ho ¹HÇH#€mïH Z Š  ¥ Vº > 4n ¿ ŒÚ H¯ X  K HY x£  H/  y H‡ \Ñ /H=‡H—@á #H 7^  áH ï 9H K •H £ íH ýj G ³H Å H  gH u$ ¿$ † Ï$H W$T ¡* ÷*H-Q-Ha  « H¹ H  [ Hi  ³ HÁCopyleft 2002, 2003 Free Software Foundation.Copyleft 2002, 2003 Free Software Foundation.FreeMonoFreeMonoMediumMediumFontForge 1.0 : Free Monospaced : 29-7-2004FontForge 1.0 : Free Monospaced : 29-7-2004Free MonospacedFree MonospacedVersion $Revision: 1.10 $ Version $Revision: 1.10 $ FreeMonoFreeMonoThe use of this font is granted subject to GNU General Public License.The use of this font is granted subject to GNU General Public License.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlThe quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.Normalhttp://www.gnu.org/copyleft/gpl.htmlZel de grum: quetxup, whisky, cafè, bon vi; ja!oby ejnéhttp://www.gnu.org/copyleft/gpl.htmlnormalhttp://www.gnu.org/copyleft/gpl.htmlStandardhttp://www.gnu.org/copyleft/gpl.htmlZwölf Boxkämpfer jagen Victor quer über den großen Sylter Deich.š±½¿½¹º¬http://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlJovencillo emponzoñado de whisky, qué mala figurota exhibes.Normaalihttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlPortez ce vieux whisky au juge blond qui fume.Normálhttp://www.gnu.org/copyleft/gpl.htmlNormalehttp://www.gnu.org/copyleft/gpl.htmlPranzo d'acqua fa volti sghembi.Standaardhttp://www.gnu.org/copyleft/gpl.htmlZweedse ex-VIP, behoorl3k gek op quantumfysica.Normalhttp://www.gnu.org/copyleft/gpl.htmlNormalnyhttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.html1KG=K9http://www.gnu.org/copyleft/gpl.html G0I0ÿÿÿÿø8Ìÿÿþ681K; F8B@CA & 4ÿÿ, =ÿÿÿÿøÀì0 àÈ,ÿÿþM:75<ÿÿÿÿ.Normálnehttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlnavadnoDovoljena je uporaba v skladu z licenco GNU General Public License.http://www.gnu.org/copyleft/gpl.html`erif bo za vajo spet kuhal doma e ~gance.th°¡nghttp://www.gnu.org/copyleft/gpl.htmlArruntahttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlNormalhttp://www.gnu.org/copyleft/gpl.htmlÿœ2   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òó—ˆÃÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîºýþ    ÿ øù !"#$%&'()*+ú×,-./0123456789:âã;<=>?@ABCDEFGHI°±JKLMNOPQRSûüäåTUVWXYZ[\]^_`abcdefghi»jklmæçnopqrstuvwxyz{|}~€¦‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrØástuvwxyz{|}~ÛÜÝàÙ߀‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙ›ÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk²³lm¶·Än´µÅo‚‡p«Æqrstuvw¾¿xyz{¼|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ÷ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸Œ¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%˜&'(¨)*+,-./š™ï0123¥456’789:;œ<=>?@ABCDEFGHIJ§KLMNOPQ”•RSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst¹uvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø ÙÀÁ Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ         softhyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccent Tcommaaccent tcommaaccentuni021Cuni021Duni021Euni021Funi0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0241uni0242uni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0294uni0295uni0296uni0297uni0299uni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A6uni02A7uni02BB afii57929 afii64937uni02BEuni02BFuni02C8uni02C9uni02CAuni02CBuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DFuni02EE gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni031Buni0321uni0322uni0327uni0328uni0333uni0335uni0336uni0337uni0338uni0342uni0344uni037Atonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhouni03A2SigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3phi1uni03DAuni03DBuni03DCuni0400 afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061uni040D afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097uni0450 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109uni045D afii10110 afii10193uni0464uni046Auni046Cuni0470uni0471uni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F8uni04F9uni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni058A afii57799 afii57801 afii57800 afii57802 afii57793 afii57794 afii57795 afii57798 afii57797 afii57806 afii57796 afii57807 afii57839 afii57645 afii57841 afii57842 afii57804 afii57803 afii57658uni05C4 afii57664 afii57665 afii57666 afii57667 afii57668 afii57669 afii57670 afii57671 afii57672 afii57673 afii57674 afii57675 afii57676 afii57677 afii57678 afii57679 afii57680 afii57681 afii57682 afii57683 afii57684 afii57685 afii57686 afii57687 afii57688 afii57689 afii57690 afii57716 afii57717 afii57718uni05F3uni05F4uni16A0uni16A1uni16A2uni16A3uni16A4uni16A5uni16A6uni16A7uni16A8uni16A9uni16AAuni16ABuni16ACuni16ADuni16AEuni16AFuni16B0uni16B1uni16B2uni16B3uni16B4uni16B5uni16B6uni16B7uni16B8uni16B9uni16BAuni16BBuni16BCuni16BDuni16BEuni16BFuni16C0uni16C1uni16C2uni16C3uni16C4uni16C5uni16C6uni16C7uni16C8uni16C9uni16CAuni16CBuni16CCuni16CDuni16CEuni16CFuni16D0uni16D1uni16D2uni16D3uni16D4uni16D5uni16D6uni16D7uni16D8uni16D9uni16DAuni16DBuni16DCuni16DDuni16DEuni16DFuni16E0uni16E1uni16E2uni16E3uni16E4uni16E5uni16E6uni16E7uni16E8uni16E9uni16EAuni16EBuni16ECuni16EDuni16EEuni16EFuni16F0uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2010 afii00208 underscoredbl quotereverseduni201Ftwodotenleaderuni2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni2043uni2045uni2046uni2048uni2049uni204B zerosuperioruni2071uni2072uni2073 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni207Auni207Buni207Cparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferioruni208Auni208Buni208Cparenleftinferiorparenrightinferiorlirapeseta afii57636Eurouni2100uni2101uni2102uni2103 afii61248uni2106uni2107uni210Duni2110Ifrakturuni2112 afii61289uni2114uni2115 afii61352uni2117 weierstrassuni2119uni211Auni211D prescriptionuni2124uni2125uni2126uni2127uni212Auni212Buni2132alephonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5 universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni2213uni2214uni2215uni2219uni221Buni221C proportional orthogonal logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222Funi2230 thereforeuni2235uni2237similaruni223Duni2241uni2242uni2243uni2244 congruentuni2250uni2251uni2252uni2253uni2259uni225A equivalenceuni2266uni2267uni226Auni226Buni226Cuni226Euni226Funi2276uni2277 propersubsetpropersuperset reflexsubsetreflexsuperset circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22BEdotmathuni22C6uni2300houseuni2303uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2315uni231Cuni231Duni231Euni231F angleleft anglerightuni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23AFuni23B0uni23B1uni23B2uni23B3uni23B4uni23B7uni23BAuni23BBuni23BCuni23BDSF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2605uni2606uni2607uni2608uni2609uni2610uni2611uni2612uni261Cuni261Euni2626uni2628uni2629uni262Euni2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2639 smileface invsmilefacesununi263Ffemaleuni2641maleuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FF commaaccentffuniFB05uniFB06uniFB1DuniFB1E afii57705uniFB20uniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29 afii57694 afii57695uniFB2CuniFB2DuniFB2EuniFB2FuniFB30uniFB31uniFB32uniFB33uniFB34 afii57723uniFB36uniFB38uniFB39uniFB3AuniFB3BuniFB3CuniFB3EuniFB40uniFB41uniFB43uniFB44uniFB46uniFB47uniFB48uniFB49uniFB4A afii57700uniFB4CuniFB4DuniFB4EuniFB4FuniFFFDuni1FEEÿÿ :óôõö Ô Õ Ù Ú      0JhebrlatnÿÿÿÿligaligahR4>Hô- ×O ÖL ÕIõM ÙW ØW,ILVA ørgl/inst/fonts/FreeSans.ttf0000644000176000001440000077527011257014120015434 0ustar ripleyusers€pGDEFU•]ŽåôrGPOSäCú‘èˆ0GSUB¹G«ŒæhOS/2N˜Ò¸xVcmapëñæ#Ì ‚cvt !y-Pgaspÿÿåìglyf×þ¢_OT@Äheadßznü6hheaÀ œ4$hmtx>ëÐ!üloca ss¤-T"maxpÞX nameÁ0-qWpost‡ák–pO{Egç*r_<õè½Wøà½Wøàüãþ5`u ÿ8Zªüãý:`Üm@.¹Š»ŒŠ»ß1 À_ŽÿP`û PfEd@ ÿý ÿ8ZuË€¿ß÷°!M|c4,, y›4¿0MIM&…(H2WM.Wÿø,+,f,", ,,#,+,.,%,&nnH-H2H2,M÷"››OÒ0ÒY›ZcZ ,ÒSdô›O,PAKÒL &›[ &Ò]›0cÒU›°›› c@ÿøÕ,,ÿêM,*,6ô,,(,,FÞBÞÿîô:ÞDAF,F,$,6,MEô",Aô ÒôôôN+dNHKMy,4,,C, d,+Máÿór%,bH(M.áÿóM^—H2__M\,A0WM'_=m(,be=e=ec_››››››è Ò0›Z›Z›Z›ZGÿÿ ÒÒL & & & & &H_ ÒUÒUÒUÒUš š[cC,*,*,*,*,*,*y"ô,(,(,(,(ÿûAÿù,$,F,$,$,$,$,$H2c,A,A,A,Aô+6ô›,*›,*›,+Ò0ôÒ0ôÒ0ôÒ0ôÒY{Ò,›Z,(›Z,(›Z,(›Z,(›Z,( ,, ,, ,, ,,ÒS,ÿàÒ',ÿöÿëÞÿðÿýÿñBÞ`^¼dvBôÞÿà›Oô:ô:,FÞ?,PÞ?,P$D,PôD,ÞÒL,FÒL,FÒL,F,FÒL,F &,$ &,$ &,$è+°(Ò]MEÒ]MAÒ]M0›0ô"›0ô"›/ô"›0ô"cc4cÒU,AÒU,AÒU,AÒU,AÒU,AÒU,A°Ò› ô› côcôcô,›O,6›,ÿ÷Ò0Ò0ôÒ›N,6›Z &›0c,  ,ô:Òÿô,F &,6›0ô"ccY¸Y  P P¼D†L°L F›,*ÿù &,$ÒU,AÒU,AÒU,AÒU,AÒU,A,(›,*›,*è y" ,,›OôÿÔ &,$ &,$Þÿß5YÆY  ,,ÒL,F›,*è y" c›þú,þ¼›ÿn,ÿ0›ÿ,þÁ›ÿs,ÿ4þ<þ1þ°þ¤ ÿ.,þ¹ ÿ¢,ÿ,Òþ®MþlÒÿ"MþàÒÿ,þºÒÿŠ,ÿ.›0ô"cÒS,F›,*›Z,( &,$ &,$ &,$ &,$› ô,*,,D,6ô,,,(,(ô"ô",,,F,F,FÞÿøÞB^ÞDAFAFAF,ÿî,F,$MEMEMEMEMETTôÿÊ,Aô Òôôô$ô:,MMM\MMMsMOM9MMÿÝþÉÿþÇþ¸þÏþÂÿ&þÑÿþþÆþþÂÆÿ6ÆÿþÚþìÇ'ÇLnž®ëKÚY˜ÿÔ©ÿ¹æÿÂÿðÆÿžöÿúÿ߬tJFR¬ ŠPt#«Aî-ìE¬J¬ @Ž8vAî2ÑP~Nt(t'¬ÍÓ$é4Ð*ìÿï¬`0'#38(T020%þ'Î&-8B0>NøÖ&"•569h"*(å.<–*ä$ÿß()"(ä$›Z›OþcZÒ0›0dô8SöSþ›OÒLŠÒS››O›OcO,"›Oÿ?›0ØOØO›O¡!LOÏO &ÏO›OÒ0cЍ@›åOˆO<OROQhO›OÒ0S¾ ,*,$ F®FZ,(E,ô"7F7FþF-FjF.F,$-F@Fôð<ô=ôBFF´FÈFÞ9²F(FôöF,(,(8®Fôô"ÞBÞÿîHFRF8ô:,Fô,F›O(F›[,6cZ®FcZ®FcZ®Fÿ?E›0ô"›Oô:›Oô:›Oô:›Oô:ÒS,F$SüFÒS,FÒ0ôÒ0ôcð<› ô › ô ›ôS`F‚SüE‚SüE‚SüE &,(°',(dÿ?E,›Oô:ÒS,F‚SüE›,*›,*è y"›O,( &,( &,(ÿ?E,›0ô"›0ô"ØO7FØO7F &,$ &,$ &,$Ò0ôŠôŠôŠôˆOFhO²FÒOÁOSòRÒOïåTÒJ?C»?¡]UB"ÇJL—3™O™/ô-o1 [(ÒJˆBÒJï*îJÒOìJ›-»Jo<¡L*~$ 0Ì'Þ5…EM+XAA,J<#EI&<L*À^,?8DF0!B-<B,+*GB$(('(+ IÞÿÒ IÈ5,E†#AAý&#P@bGwI,E! `LU+LC2²*!FZo FOIIFÈȼ¼FIFFè&ÈÔ>FnF€:O:ÒV&n?Ô>_'o?`=È:&&9X%o?m0Ô>z3_=K$?98? N3^>#%;¯#X8É4É2É3É,ôjôjôjrTrW>>…ˆ>Ä#Ä9>ÿ¸…ÿ¸…ÿ¸ýkýkªmId”±sÿ¸Îÿ¸Îÿ¸äÿ¸ªÿpXa”ÿ¸ªkkÎÿ¸ΧÎÿ¸>ÿ¸>ÿ¸~Iÿ¸ýkªÿ¸ªc§ÿÿp„)0)ˆˆË•§§0)0)0)‰n¨ØüG%÷¼àßø·+«+ŸŸ‘‘º+ÏÃ??%ºMŽú®þî¶-¬ÿû¬ÿú¬ÿ?þ}ÿ)ÿÿþµþ̬ÿɬÿ`¬ÿpÿh‚(ÿ”H”H­HH…H/HqHcHNHfH™‚(,,€ÿì ÿìÿìÿìÿì&ÿìl¤àllÐŒÿìôêÒÿìêÿìÿìvÿìNÿì¨þÿìêÿìÿìÿìÖÿìêÖÿìêÄÿì0ŠÿìàÿìLÿìàÿíÖÿìàÿìØÿìÖÿìÖÿìÿì ´ÿì´ÿì´þ @IÃ#ÿÎTÿìTÿìäÿìäÿìx´ÿˆÿìÿìÖÿìd¤êdhd̤0†à¤àÿöÖÿóÖÿìx¸¤¤è’²žTTòèTè&j²"Pì>, >äøú2"žÖÖÿþ""T¬¾¾ÿ„þaþbþ~þxþdþ8ÿ4jÿþìäúhà0ÿúàÿþÔìÿøÿü<0þòT„!þÁ!ÿHÿ'Á'ô(ï((¾(uõ'd'k'9&(f'l(^(Z'w(ï(((ÿ'f'&'X'©(Y$c''B(¬&§(ç(Fÿ¯X'.'ž('P'8'X' &(èFèEèÿN!þP!þO!þ½!þ!þuèÿfèÿK‡ß' (Ñ&Õ'òÏ'Ã'þ'Ç(è'ƒÿœ.ÿØ0„xÿývÿý)ÿý\ÿíÿÿ<ÿþ:ÿþDÿþ5Dÿþ4ÿÿ?ÿý5ÿý5 ÿþ<¼ÿýÿølŒ0ÿû5ÿý5ÿý!ÿþ €þ&¾ÿÝþßÿ,þLŒÿú3ü¨¸XÿôXXÿùXX0ÿ8ã/ßS}ú ’”ÿ±¤D ÉèèP - - - °è¤P Ø :˜ÿä1ÿé_¹¹² iÿþe [ ¹ey ( $¨ }þTþ´T Š Í  ª Mv[  qlˆèVlOXr¸>:DMÿûUÿûqÿû5F\‹ÿü˜ÿûc Kb= H #=H ` ` = øm l l ‰@&O=@7O2 -@2@7`-@-PÔ<>” $'>F%\ èÍ#\å?äF#v v &F+\\\{Í!F%”\ Í”v F%\ ÍF\v,'>F*Ív5v/Í>Í(ý°|¤üíýüíüãõ Œ!ˆ*TÿŸT0TÿT0TÿT0Tÿ¤T0¬ÿ¬¬þ!¬ÿÙ¬þ?¬¬þÓ¬ÿ¦þÿŒþ'þÿ þ'þÿ þ'ŠþvŠPŠýsŠÿCŠýsŠÿCÿ©ÿÿÿœ«þg«A«ýd«ÿ4«ýd«ÿ4«ýø«þËþï8þm8þm8þôÿÇìþkìEìýhìÿ8ìýhìÿ8ìýüìþÏ&ÿŸ&"&ÿ&"&ÿ&"îþî2îý¯îÿsîýëîÿ¦ÿŽ(ÿ (ÿ (ÿ“(¬¬ÿ¬ÿ¬þ˜äÿýä$äÿ{ä$äÿ{ä$ää$ÐþžÐ*Ðý¡ÐÿqÐýøÐÿªÐþDÐÿT0T0þ'þ'ÿüÿü&"&"((ä$ä$TÿŸT0TÿT0TÿT0Tÿ¤T0rÿrrþ!rÿÙrþ?rrþÓrÿ¦ÿ©ÿÿÿœYþgYAYýdYÿ4YýdYÿ4YýøYþËäÿýä$äÿ{ä$äÿ{ä$ää$±þž±*±ý¡±ÿq±ýø±ÿª±þD±ÿT0T0T0T0T0T0T0¬¬¬¬rÿÌÉMÿ6ÿcMŠÿCŠÿC«ÿ4«ÿ4YAFÿ6Fÿ6Mÿ6ÿÎÿÛÿßÿÖÿÇ8ÿÕìÿÞìÿëìÿ8ìÿ8FFM ((((6ÿ´69((¬¬¬ÿ¬ÿ~NM‰Mä$ä$ä$ä$ä$îÿyîÿ¸ÐÿwÐÿž«*M\MÆM.,ÿûèÿ÷ÞAÝ@Þ@Ý@M0M1M/M1,&,&^2^Fèsè P 1Õ1¨11Õ1¨1M[MUnb,|,M§ÿRXMBMB|0__ ________=___a____¥[Æ]e<,É!g):j ðLRÿþ„è?Ð*Ð*›O›Œ"o2-cÿ»cZ8e=ee=eeee=ee=eeee=d,dBd±d›±Çݱd›±Ç,PÒ0ÒYAKÞB¼BšBÒBô Ò ° Ž ÒBôÒ°ÞDô,AFÛ [-Û1[-’Û['Û-[,›,$›Z,+Ç Ç É-É,7i7i$)H(H2ô@ÉÉ[[((,dd¼d,d_£%HKHH_H2|5$ H-H-+++’7'é+7èfèPè˜èècèÏèMèXèè·è¾è¼è2è¼è2èªèÅè±è„èÎè¥èóèÍè†èPèˆèUèwèYè–èzèóèáèuèYèœèƒèŒèrèè÷è€èbè_è?èRè1è(èè~è`è¸è‡èjèèaè¹è¢è:è‡èaèMèUè{è_è_èrèUèUè@èèèLè+è+è{è_è_èXèmèNè`è‰èeè)è’è`èŠèVèzè è£èMè£è‚èMè8èkè”èLèÿèÿèÏè¢è¨èvè©èzèŒèSè„èMèˆèmè¤è‰èkèMèièKè»è¢è™è}èŠèmèRè1è_è?è‰ènèsèVèqèRèžèlèNèZè9èyèrèvècèlè2è¸èNè.è.è‡èmèmèèaèaèjèLèLèIè(è(è‹èÛè‡è®èZè™èdè¨ètèèè¾è·èèQè²è¾è·è‹è]èoèÐè¹è_è¶è›è‹è]èoèÐWèÿ÷è¸è¸,+,", ,,#,+,.,%,&ÞÿîMt,f,ô ô  , "È:1:K%z:P&h? 9R%i?%©#H2;;;;€:€:€:O:ÒV&n?_`= &&9X%m0z3_=?98?N3^>#%;¯#Ô>O:&98?€H#|` ~€‰Œ“™Ÿ¥©«®ãíõ3TY\ajmsu…‰Žœž ÇËÝ (uz~ŠŒ¡Î_ÄÈÌõùV^‡Š¹Äê ,J   3 9 C E I M Q p ƒ Œ ¨ ° ² ¹ ¼ Ä È Í × Ý ã ú  ( 0 3 6 9 < B H M \ ^ p t ‚ ‹ ¨ ° ³ ¹ Ã È Ì Ð ï        ! + 0 3 9 C G ` o ƒ Š • š œ Ÿ ¤ ª µ ¹ Á È Í × Ý á ƒ Š š œ ¨ ³ ï ƒ … ‹ ‘ ” œ ž ¢ ¥ « ± » ½ Æ Ê Ô Ö Ù ßEMWY[]}´ÄÓÛïôþ   # & 7 = D I K q y ‰ ¨ ª ¬! !!!!"!(!-!3!!•!µ!Ô""" """"" "."4"<">"C"I"`"e"—"¥#%Ê&j00000“0™0›0þöAö¾öÃöÜûû6û<û>ûAûDûOÿýÿÿ  ‚‹Ž™¥§«­Äæðø&PV[`emouy‚‡Œœž ÆÊØ &tz~„ŒŽ£ŒÇËÐø1Za‰°»Ð0     5 < E G K P f … “ ª ² ¶ ¼ ¾ Ç Ë × Ü ß æ    * 2 5 8 < > G K Y ^ f r … • ª ² µ ½ Ç Ë Ð æ         * / 2 6 > G ` f ‚ … Ž ’ ™ œ ž £ ¨ ® · ¾ Æ Ê × Ú á ƒ … Ž ’ œ ž ° æ ‚ … ‰ ‘ ” ™ ž   ¤ § ­ ³ ½ À Ê Ï Ö Ø ß HPY[]_€¶ÆÖÝòö    & 0 9 D G K p t € § ª ¬! !!!!"!&!*!0!S!!µ!Ð"""""""" "'"4"<">"A"I"`"d"•"¥#%Ê&j00000A0™0›0¡ö9ö¾öÃöÜûûû8û>û@ûCûFÿýÿÿÿõÿãÿÂÿÁÿÀÿ¿ÿºÿ·ÿ²ÿ±ÿ°ÿ¯ÿšÿ˜ÿ–ÿ”ÿ’ÿŒÿpÿoÿnÿkÿhÿfÿeÿdÿaÿ_ÿ^ÿ\ÿ[ÿPÿOÿNÿ)ÿ'ÿþùþøþ÷þõþôþãþ˜þ”þ‘þŒþ‹þŠþ‰þXþ,þ*þ(þ%þ#ýìýéýçýæýÁýÀýµü üžü›úåúãúâúàúßúÞúÜúÛúÚúÙú×úÃú³ú²ú°ú®ú­ú¬ú©ú§ú¦ú¤ú¢ú™ú•ú”ú’úˆú„ú‚úú€úú~ú|ú{úwúuújúiúbúaúUúSúJúIúHúGúDúAú?ú<ú'úúúúúú ú ú ú úúùýùüùúùöùóùÛùÖùÄùÃùÀù¿ù¼ù»ùºù·ù´ù±ù°ù¬ù¨ù§ùžùœù™øøø÷øôøóøòøñøêø¸ø&ø%ø"øøøøøøøøøøøø øøøøæàæÞæÜæÚæØæ×æÖæÕæÔæÒæÑæÐæÎæÍæËæÊæ¹æ·æ´æ²æ©æ¨æ¢æ æŸæ{æyæsæVæUæTåöåóåðåìåçåäåãåáåÂå²å“åyåNåMåLåGåDåBå@å?å9å4å-å,å*å%åå äÝäÐävá­á×x×w×v×t×I×D×C×>ˆ„l I 3 2 1 0 / .’²Ÿ À~{€utho  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾rdeix¡pkvjˆšsgwl|¨ºcnm}b‚…—¹Áy„ŒƒŠ‘Ž•–”œ›qz!yVVVV‚²Ø¬v”ÔNx¢¼ÔîJz(´êœ 0 T Œ ° Ø þ z v ¬ & Œ Ö  . ¬ Ü ö<r’Æöd¶*¨NrºÞP|ªÌè .Hb€æZθ,n º8„èT¸ö†Î>vªò ˜² |Œ¸2èrºÞ Æ ê!À"d"˜"¸"Ò#¬#Æ$*$`$Ì%P%j%Æ& &"&€&¬' 'V'¸(V))ˆ)Ì**X*È++¤+î,²,ð-,-p-¶-Þ..2.b.Â/,/¨0"0¤1L1Ð22„2Ú303Ž3î4(4x55Ì67\8N9:.;(;â$>J>x>¨?@?È@:@¬A&AÆB@BrBòCJC¢DDdDºE&E†EÊFŽFèGÆH&HúIlIàIøJJ(J>J¸K2KL"L‚LøM4M¶MÎMäNNžNöO¢OæPnPŠP QDRR(R>RØSžS¶SÎTTxTT¦TÌTòU U UjUÆUìVVV6VNVšVîW<WlW˜W¾WüX4XrXªXÂXÚYY>YzYÔZ"ZŠZÎ[0[|[Ö\B\¼],]D]Z]â^`^Ú_ `*`vaajaübPccžc¶cÌdÄe fZfþgg,gdgÌgðh8hPhfh¼ii,iBiäjˆjêkNkÆlDl\ltlŒl¢læm"m\m–mÐnnVnŽn¤n´o"o€oøp p˜qq q6qLqbqàr‚rÐs<sât*tpt¼u8uÐuæuüv.vŽvîw8wPwhw€w˜w°wÈwàwøxx(x>xVxlx„xšx²xÈxàxöyy&y>yVyny†yšy²yÈyàyözz&z>zTzlz„zœz²zÊzàzö{{&{>{V{n{†{œ{´{Ì{ä{ü||,|D|Z|r|ˆ| |¶|Î|ä|ü}}*}@}X}n}†}œ}´}Ê}â}ø~~&~>~TÄ€€l€„€œ€´€Ê€â€ø&>Tl‚š°ÈÞò‚`‚t‚úƒƒš„$„:„N„d„t…B…R…f…Ô†V†Š†Â†Ò‡ ‡‡šˆDˆº‰4‰¤‰¸‰öŠVŠ”Šð‹&‹<‹èŒTŒÀ hxŒ ´ŽŽ0ŽDŽÈŽê ,^vÜdŠœ®ÀÒäö‘‘‘,‘>‘P‘v‘Š‘ž‘Ƒܒ’’(’D’^’š’ª’Æ’Ü’ò“*“B“Z“r“Š“¢“º“Д”œ”¾••0•d•’––,–`–Ž–Ì–ø—0— —Ę˜T˜x˜®™2™€™ìšhš€š˜š®šÄšÚšð››œœ2œxœú€òžPž¾žøŸ&Ÿ¨  6 Þ¡@¡”¢¢˜££R£°¤<¤¨¤þ¥¢¥¸¥Î¥ä¥ú¦¦*¦p¦Ò¦ü§p§€§§¨§¸¨.¨’¨Ô©©P©œ©È©Øª4ªDªbª°ªÞ«,«Ö¬¬X¬Š¬Ì­­0­@­f­¸­È­Ø­þ®‚®’®À®ú¯(¯^¯°°°^°Ð±X±´±Ä²X²Þ²ü³F³V³˜´$´P´¢´Ðµµ:µdµtµ˜¶¶¶8¶H· ··D·~·¬·â¸2¸¸Þ¹P¹Æº"º8ºNºÐºü»j»z»Š» »°¼>¼¸½½Z½”½ª½Ö¾&¾|¾Œ¾œ¾¾¾à¾þ¿¿:¿X¿¦¿ìÀ–Á"ÁTÁ„Á¶ÁæÂÂHÂzªÂÚÃÃ8ÃfÌðÃÀÃÐÃàÃðÄÄ$Ä4ÄXÄhČĜĬÄÚÅÅ:ÅjÅ ÅÐÆÆ2ÆFÆVÆjÆzƊƢƺÆìÇÇLÇvǬÇÜÇôÈ È"È8ÈHÈXÈpȈȘȬÈÄÈÚÈòÉ É"É8ÉâÊnʆʜʴÊÊÊâÊøËËË0ËFË^Ëtˌˢ˺ËÐËèËþÌÌ,ÌDÌ\̺Í&ͼÎÎvÏTÏzÏÞЖÑрўÒÒÈÓ&ÓtÔdÔÀÕ6ÕšÖVÖº×P׬Ø2ؤÙÙøÚTÚ¶Û`ۼܮÜÐÝzÞÞtß4ß`ßzßÈßâàLàÄá"á áüâ`âèãã~ä&ä¦äøå冿Hæ˜æêçÆèè˜é(é`éìê~êÔënëèìæíhíÆîîºïïªïÈðjðôñ`òòZò~ò°òÐóó>óróˆóªóÖóìô ô$ôRôjô‚ôžô¶ôÐôêõõõ*õžõüöXö~öê÷÷&÷|øNøhøÄùRù®ùþúPújú²û‚ûàüfýýhýÌþ"þ~ÿ0ÿÂÎ>HR^jv€ Œ ¦ @ fÔ6žÂ2¨è–ø@t®ÞDˆ®àÆžöPª0r´ìP¤ø&ZŒú8t Ò6xÖ0t–ÚŠöŽ $ J n ê""ä##À$Œ%(%ö&†'N((f(ä)ê*Î+ì,–-H-Š.".¸//à0T11ˆ1æ2‚33š3ò4@4Ò5J5ü6>6Ž6Ú7d7â8f8²9"9n9Æ:R;;t<<‚<ò==ª>>B>˜>î?@?¢?ê@0@X@¼AATAÊAøCJCdCÈDHD¸E6EžFFœGGdGàI2IŽJ J¦K(KºLjM0MÆN„O O’P PÌQvR`RäSnSæTJTúUdUúV¤VüWäX€Y&YšZ Z|Zò[v[Ê\<\š]]²]ú^š_2_ž``’a$a†aþb€b°bÚc*cšcúdPdpd¤døeveèf„f®gg–h&h®iHj*jkRk¼llvlÞmzmònfnÈo@oºp pˆp¸q>qnqÒrNrjrÂs&s‚tt4tLtdt|t”t¬tÄufu~vvzvÞwdwöx^y yZzznzÖ{L{Þ|Z|à}j}Ì~,~€Pà€P fÄ‚,‚ðƒÞ„P„Ô….…†…ž…À††n†–†Ò‡‡^‡‡æˆˆ ‰0‰¬ŠF‹‹`‹ÜŒRŒðšêŽ–Žü<´þ~‘4’j’Â’ú“~””œ•*•Ú–†—@—Ș,˜¤™*™ÞšX››¶œxœêhž ž’ŸŸ¸  À¡>¡Ú¢H¢¸£f£Ð¤V¤¤¥J¥ê¦^¦Þ§<§ì¨P¨Æ©Šª ª$ªjª²« «h«®«È«ì¬¬D­ž®®˜¯¯ž°&°š±D±è²2²’²ö³¤´lµB¶J· ·â¸@¹¹Úº¦»T¼¼È½š¾†¿$¿ŠÀ,ÀÌÁ¾Â~Ã*ÃäÄšÅhÆÆ„Ç<ÇVǘǶÈ6ȦÉÉ’ÊŠÊîË€Ì̪ÍLÎ ÎÈÏ„ϦÏôÐZÑrÒBÓTÔÂÕBÕè× צØ0ÙvÚ¨ÛìݰÞJÞ´ß à~áZázâ´ãvãîäÎäôåXå¨åÖæxçPèèÄélêœë–ìÄììí<í²íÜîzïTð<ðøñîó:ófôô’õHõÐöVö®÷4÷ÌøˆùZúRû&ü`üæý˜þBþæÿ¶ª8úJ("Ô¤öòj  Ø ¢ , ð r þ „ ìôt|äD˜,Ò¸<ž$¬ÐüÈ”Ž¢žž!."Ê$%¸'0(Î*J,Ä.¼/Þ12„3ú6f7Ò8¨9Ö; <¨> ?*@:AîBøDÚG,HlI|J–KþM^NÐP&QzRÔS²T@TòUbVV–WDW²X8Y YúZÜZò[[[4[J[`[v[Œ[¢[¸[Ð[è\\\0\H\^\t\Š\ \¶\Ì\ä\ü]],]D]\]r]ˆ]ž]´]Ê]à]ö^ ^$^<^T^l^„^œ^´^Ì^â^ø__(_@_X_n_„_œ_´_Ì_ä_ü``,`D`Z`p`†`œ`²`È`à`øaa(a@aXana„aša°aÆaÜaòbb b8bPbhb€b˜b®bÄbÚbðcc c8cPchc€c˜c°cÈcàcødd&d<dTdjd€d–d®dÄdÜdòe e"e8eNedezee¦e¼eÒeêfff2fJfbfzf’f¨f¾fÔfêggg,gBgZgrgŠg¢gºgÒgêhhh2hJhbhzh’hªhÂhÚhòi i"i:iRiji‚i˜i®iÄiÚiðjjj4jLjbjxjj¢j´jÄjÖjîkkk0kFk^kvkŽk¦k¾kÖkîlll4lJl`lvlŒl¤l¼lÔlìmmm4mLmbmxmŽm¤mºmÒmènnn0nHn`nxnn¨n¸nÐnèooo0oHo`oxoo¨o¸oÈoâoüpp@pppžpÐqqjqºrr:rvr®rÊrøtu˜uºuðv<v^v”vàww"xxTxÒxîyy¤z>z~zÊzì{{ˆ||<|æ}n}€}’}¤}¶}È}Ú}ì}þ~~"2€2€²@‚Æ„Z…Z†Úˆ ˆžŠRŒHŒ–Œ¦ ŽžŽ®޾~’@“¢”.”X•¾•Þ•þ––6–V–v–Ž–®–Æ–æ——&—>—N—f—†—ž—®—Ɨ昘&˜6˜N˜n˜~˜Ž˜ž˜®˜¾˜Ö˜ö™™™6™V™~™–™¦™¾™Þ™î™þšššTšˆš¼šò›n›ìœœ^œ¨œò<®Äžbž’žþŸ(Ÿ>ŸŠ  6 L „ ž Ô¢¢>££Ö£ú¤¤B¤’¤ä¥<¥â¦Ô§,§¼¨¨p¨Ø© ©>©Ìª ª<ªn««”¬8¬\¬ð­&­~­¬®®Ê¯L¯ä°P°¸°ò±,±„±Ú²²6²n²¨³(³®´Æµä¶b¶æ·Š¸0¸ô¹¨ºî¼@½4¾„¿lÀ¬Á*ÁìÂŒÃjÃàÄœÅXÆ\ÆÎÇ€ÈZɆÊ^Ë„Ì"ÍÍØÎòϸÐÂÑ@ÑÄÒŽÒöÓ¤ÔÔÞÖÖ”×èÙÙÒÚÚÜ>ݦÞFß&ààòâ ã>ã¤ähå:æLç®éê&ëìJí>î&îîï°ðœñžò^ó:óâô‚õxön÷ ÷Ìø„ù¶ûFüPýýRýbýÌþHþ”þàÿ:ÿÿ¾ÿîžHಠ"ê`D®¸@  ” Z ò Ô 8 à pZÒŽþl(„&jòV|ên´°lÖŽX¦<Ü6ؒШú€Ü:¶  Z „ ® Þ!!h!¾","n" "ì#<#Š#Ì$$€%%ª&&4&J&`&v&†&˜&Þ&ô'''$'4'D'T'd't'„'º'â'ò(j(Ä))¦*,*¤+n+”+æ,,j,æ- -z. .j.¼//¬/Î0Ž1L22à3`3è4h4Ò5:5l5ä66877<7¤8>8¤99V:2:Ä;z;ê>4>ž?8?î@:@À!nš.±/<²í2±Ü<²í2±/<²í2²ü<²í23!%!!!MþÔ þõšýf!X|ÐÙ #'#5Ð'STÙþ®ßßRýhh4Ð1Å 3#'73#'4]' ]'Åo††oo††ÿì¹3#3##7##7#537#537337#3å$]jiu'L&|'L&erly$L$}#0| }¹ÄD®DÓÓÓÓD®DÄÄÄþø® ÿ‚18A3#&'&'&##5&'&73&'&54767567654'&ó;~/O9dUD 1K;š+O#G]!GŒ`¯=*/6 ]&/M" ù0jh= gg u.:J0 3_’*þÉð LZþù(<=ÿì[Å!%5F2#"'&5476"327654'&%3#2#"'&5476"327654/&ÇT3?/18Lt8!4$JF A.?2EljÙp&;Y$]]$Y;&2ÿöÚ ##5#5353ÏFÏÏF FÏÏFÏÏWÿmÀh 73#5676=#Wii+ ,R>TU(=$/L(GZ¹dT](4X6GOS;SwD4‚B$/V.?(3f%.Å #6767!5ÊB ^2]7]þÅJþôþñ/1Ú«e„W%ÿéÅ,<#"'&547&'&547632'"327654'&"327654'&‡zV?Y|C/yHQ7Mt;&- P =#P A!Y'B".['C#u:wp=.R:Pv:-0c5%L0AD)ü:F 9K þ×@!*R&A!*R&&ÿéýÅ02#"'&'332765"'&5476"327654'&îA5as7XI o" F\p>,R>WL(G&S)=%Åþ¦¹dQ](4X6GMS;SwD4M@# f%A$0W.nÖ 7#5#5Öhhhhhh¤hhnÿm× #53#5676=#×hii+ < hhþ\xƒ&'-ÿ÷Ú75% -éþvŠÆEÏO¡¤O2oa!5!5þäþaFF¬FF2ÿ÷Ú5-5þŠþv EÏO¡¤OMýå%)%#5476767674/&#"#47632#5JZ#J=RU´~83? ZÇ72%!BBF :"@ÓS$+F;:Žhh"ÿr·åFX3327654'&'"#"327#"'&'&5476767632#"'#"'&547672'"32767676'&™SZ  @53ac“q"cil¢Orpr´ƒz_#l—%%¦{tVLn`BLR/"OMeT&€B2-/:,!,õþè# HGWxY\f"qŽad C*kd“š‚'be^‡yfYMHE1AmTSWG?PC"A0T6Ù %!#3# ÚþçMcxhepxÛÛÙý')Lþ´OoÙ'3!2#32764'&+4'&+3276O(g7:ei89fì´H"(("H´fG"ããA "Ù34Rp/)PX;=ŸvþHW û#$0ÿé¥å#&'&'"32767673!"'&547632–_&6Z€=(_;Sm3 `!þõRjfR•î÷K#,sKpªO1M *GþßUm¹·o[Y›Ù 3!2#'327654'&+Y£O!tIl¼¬®% ¨¬Ù„+QlÑ_=Rµ-8ö ZeÙ !!!!!·®ýõùþdLúRÙRéRZCÙ #!!!·]éþt\Lþ´ÙRéR,ÿéÅå)#'#"'&54767632#&'&#"276=#5Å;h‘™^WfU…³Q! __*5„G5=HprB1Þþ{atrh¢°n Fv1Bb$hNs~T HP]§Ù(#!2#&574'&#'327654'&+º]Pª) H> qPðáy& Iá:þÆÙx!*b3 (%V` 0GAmRVB 0ÿémå7#&'&#"#"'&'332767654/&547632TXm (h) 6)·x: I„©L*X 3uY-,nµh@[°?o>8 1!aT? 8h9^-"=8L#0%…|8"o1QÙ##5!b]ð<‡ýy‡RRUÿé…Ù3#"'&5332765(]hHi¥I)]n"*|-Ùþ‚A-e:Qþu P",…Ù!#33ˆdþúdÖÊcÙý—i¡Ù !# #333èf¨£f»h‰¢d¦†hWý©Ùý°Pý°P‰Ù # #33‡sÇÈqòq»¼ovþŠ0þÐvcþâ •Ù#33ƒ]þçsÖÐoþâ»þcGÙ !!5!5EþL¶ýÕ¶þfÙTýÍRR5R@ÿ,úÙ#3#úggºÙHüãH­ÿøÿìÙ#/í7íÙýíÿ,ÑÙ53#53ggºÔHHüS,I©Å3# #ÅI›EzyEÅþ„,þÔÿêÿPBÿ‚!5Bý¨~22Pçä#'‡`<•ä””*ÿé->%#"'&'"'&5476767676=4'&#"#6763232'53276#G W[n+\$^I QgT!7w°- ‰ R jCH4 1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/6ÿé Ù 3632#"'#"327654'&6S9i€;%[9Pk;KåS'E!,T*H%ÙþìVlDc¡M1ZCÍT2E}4O3F5ÿéÝ #&/"3273#"'&547632×T T^#O'kT h+8>)\;Rj:\ad.?‰-~‰.iFe M1D+ÿéïÙ$#5#"'&547632"327654'&ïJ:V ‚<&Y9Ol5“U)F$/S'H!Ùý'ESpGgšK/QþôR&3z6R2Eƒ3(ÿé$%!3273#"'&547632!654'&#"þ~+Sf#Th,6ˆ?'^—X%N'Y#R þJš@ <X''1)fR @M™O6[Z0B‹/\.?–+FæÙ367632#4'&#"#FS6Bn'S" *T%SÙþëF J'þtk7M*:þßB–Ù#7#5–SST ýô Íiiÿîÿ&™Ù3"#"'532765#5FS€ 4 SS ý‡gG %ii:öÙ 73##Þk¶Ög±QSÙþUÞµþ©PÌÙD˜Ù#˜TÙý'ÙFú*36763267632#4'&#"#4'&#"#FM6JY+6?zT?=%TG >%T JL AA bþwiQ6%.þ·iW8$-þ·Fç367632#4'&#"#FM6Li*S;T%T XUF )þtkF M*:þß$ÿéþ2#"'&5476"327654'&˜9f8O X„Y$ x7+7E%'B8 %BX?&(7L! c?4J .Wš?$&*'C…é',%'#"''7&547'76327'"327654'&å:5(<5)380 687,5:(;979 /!7 0¾65391+;9-7575:7)42/É/7-: !Å#3##5#535#5333着ªX¬¬¬—ÍU¹³UÉb3M3¯¯3M3cþ¾Bþdÿ, Ù3#3#d<<<<Ùþo‹þo+ÿ+úÙBP#54'&#"#"'&'&53327654/&'&54767&547632654/ÐT76 +’Rm0G2Bd4 U7@ 7ªTO ,D2Cc0þì¦II¡>  G+ $^58!s)70U1"E!56,/2&u:Q T333O1%J+<þ½{'?=3m(* ) d(Ë#5!#5†h hËggggÿóÿêïæ 8H327673#"'&547632#&'&#"2#"'&'&547676"27654'&ú6(RG1We6'P1Dx'G2 K w—nl jg™ ‘mkgf“\\[_|‡\[\[f_0rO%FU=Uƒ@(M L)Ige“›nl fe—nl >]]†‚^^_]…ƒ^]%/Mæ+7!5%#"'4'#"'&54767676=4'"#6723232'5276@þë", 18J9 D+C/ ;szT>? 04 b33_,%+8>  + g^³G3  +#bjǶ 757757b˜jj5˜jjãYzSSSSyYzSSSS(V w!#5!(øFþNwþßÛ.ð8#5î8HHÿóÿêïæ!9I#32#&574/3674/#72#"'&'&547676"27654'&FÎ ! O.†G4a—nl jg™ ‘mkgf“\\[_|‡\[\[E¹½~3+=#*(;? ::Üge“›nl fe—nl >]]†‚^^_]…ƒ^]w.½!5.þî½FF—Æ®2#"'&5476"327654'&/J- <)4H. <(44,7,®;)3L-;)4J.9,3.42ÿõo ##5#5353!5ÏFÏÏFÏþ FÏÏFÏÏþ›FFFÅ!!676?654'&#"#67232CþÐ&;:;+3 >†W' `?1V:U* /- '+‘;R/ "BÅ-527654/"#632#"'&53327654'&'&‡U25 ?` 9GG$0q >? H( Ü3 4 #%ŽB;LR"VN 8 .\P-ä3#¼q•<ä”Aÿ$  %#"'&5#"'#332765332 !O;h6$SS:U&S-1? ISßèþF N*9)þL)0ÿO Ù####&'&'&54763 9@R@M0IM>UÙ@ü¶Jü¶´(=i pG9W.Ó«#5Ó|«}}'ÿ*;632#"'&'72765&'"'¥& FB ,?  9 & ' 87?( "=ÞÅ #5767673# c= +>D.)þW(/Dæ$!52#"'&5476"327654'&:þùƒlO#e T ;7;: b33„j%w% _"+~" 4C&]Cabjö 57'557'5üšllašll=YzSSSSyYzSSSS=ÿìQÅ #5767673#3#%#533##= c= +>ã:þ<:¼Ì.CC>D.)þW©ý'x; þð5d™ªª=ÿìLÅ 1#5767673#3#%!676?654'&#"#67232 c= +>Ë:þ<:¢þÐ&;:;+3 >†W' `?1D.)þW©ý'N:U* /- '+‘;R/ " ÿìQÅ-1<?527654/"#632#"'&53327654'&'&%3#%#533##=‡U25 ?` 9GG$0q >? H( Ó:þ<:¼Ì.CC>Ü3 4 #%ŽB;LR"VN 8 .éý'x; þð5d™ªª_ÿ' #'3327653#"'&54767676=3Z) J=&RU´71? ZE72%$ BBF:"@ÓU->F:9Žhh« %!#3# #'ÚþçMcxhepxX`<•ÛÛÙý')Lþ´‚””« %!#3# 3#ÚþçMcxhepxšq•<ÛÛÙý')Lþ´‚”¬ %!#3# 3#'#ÚþçMcxhepxH_`?QO@ÛÛÙý')Lþ´ƒ–``” %!#3# 3#"'&#"#6763232ÚþçMcxhepxÚ:J@# :;*'ÛÛÙý')Lþ´kh %] ’ %!#3# #5!#5ÚþçMcxhepxZh hÛÛÙý')Lþ´igggg¹ +%!#3# 2#"'&5476"327654'&ÚþçMcxhepxw2 +0 *   ÛÛÙý')Lþ´+ 1 */ ,   ¶Ù%!#!!!!!!#ÔþóUg+nþ`þ …þdŠÖÖÙRéRúR(_þ¡0ÿ*¥åB632#"'&'732765&'"'7&'&'&'&54767632#&'&'"32767673{ FB .D 9 & ' U- maR•î+_&7X=(`;Rm3 `!!7?( "E NŸ+/²o[îK#+sKp¬O0M +GþßZe« !!!!!#'·®ýõùþdþü`<•LúRÙRéR_””Ze« !!!!!3#·®ýõùþdÖq•<LúRÙRéR_”Ze¬ !!!!!3#'#·®ýõùþdþå_`?QO@LúRÙRéR`–``Ze’ !!!!!#5!#5·®ýõùþdþ÷h hLúRÙRéRFggggÒ«#7#'Á]`<•Ùý'ÙÒ””G«#73#Á]Cq•<Ùý'ÙÒ”ÿÿ¬ #'3#'#Á]_`?QO@Ùý'ÙÓ–`` ‹ #7#5!#5Á] h hÙý'Ù²gggg›Ù#53!2#!327654'&+3YEE£N!uIjþæ]­²"¡­«SCC„+QlÓ_;Sþÿ¿*2ï%ñCL†” ##3'3#"'&#"#6763232†iþ‡Xe}[:J@# :;*'Ùý'Oý±Ùý¬T»h %] &ÿéæ«"&2#"'&5476"327654'&#'…®a8R[‡§bWo_‘‚H8_CaH:bB~`<•å{&`ƒ”iMuh¡¸k[RfPvžS;dOu¥S8””&ÿéæ«"&2#"'&5476"327654'&3#…®a8R[‡§bWo_‘‚H8_CaH:bBCq•<å{&`ƒ”iMuh¡¸k[RfPvžS;dOu¥S8”&ÿ鿬")2#"'&5476"327654'&3#'#…®a8R[‡§bWo_‘‚H8_CaH:bBŽ_`?QO@å{&`ƒ”iMuh¡¸k[RfPvžS;dOu¥S8–``&ÿéæ”"82#"'&5476"327654'&3#"'&#"#6763232…®a8R[‡§bWo_‘‚H8_CaH:bB:J@# :;*'å{&`ƒ”iMuh¡¸k[RfPvžS;dOu¥S8h %] &ÿéæ’"&*2#"'&5476"327654'&#5!#5…®a8R[‡§bWo_‘‚H8_CaH:bB|h hå{&`ƒ”iMuh¡¸k[RfPvžS;dOu¥S8ÿgggg_"è« ''7'7¶1’“2“’2“’1’«2’“2“’1“’1‘ÿéèó'?&5476327#"'7&#" 327654QLp_‘‰]W(YTp_‘aMi€Ib„H7Ñþ}Jk„H7Yj’¸j[Q_$ajž¸j[ZTÁ£@gOuh*þ[JgOurUÿé…«3#"'&5332765#'(]hHi¥I)]n"*|-Ú`<•Ùþ‚A-e:Qþu P",Ò””Uÿé…«3#"'&53327653#(]hHi¥I)]n"*|-¥q•<Ùþ‚A-e:Qþu P",Ò”Uÿé…¬3#"'&53327653#'#(]hHi¥I)]n"*|-ê_`?QO@Ùþ‚A-e:Qþu P",Ó–``Uÿé…’3#"'&5332765#5!#5(]hHi¥I)]n"*|-Øh hÙþ‚A-e:Qþu P",¹gggg •« #33%3#ƒ]þçsÖÐoþØq•<þâ»þcÒ”[hÙ7#332#'327654'&+¸]]Ћ8N5HåÂd N"½½Ùx_1Dn:(RK[ Cÿñ;Ø1674/&#"#47632"#"'5327454'"+&”K&sX]8R“=O@"Ž1=!¤˜ « hJ V(þq4S)8_3J'$´4KŒ…*ÿéä->B%#"'&'"'&5476767676=4'&#"#6763232'53276#'#G W[n+\$^I QgT!7w°- ‰ R jCH4 Š`<•1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/f””*ÿéä->B%#"'&'"'&5476767676=4'&#"#6763232'532763##G W[n+\$^I QgT!7w°- ‰ R jCH4 Uq•<1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/f”*ÿéå->E%#"'&'"'&5476767676=4'&#"#6763232'532763#'##G W[n+\$^I QgT!7w°- ‰ R jCH4  _`?QO@1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/g–``*ÿéÍ->T%#"'&'"'&5476767676=4'&#"#6763232'532763#"'&#"#6763232#G W[n+\$^I QgT!7w°- ‰ R jCH4 :J@# :;*'1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/Oh %] *ÿéË->BF%#"'&'"'&5476767676=4'&#"#6763232'53276#5!#5#G W[n+\$^I QgT!7w°- ‰ R jCH4 h h1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/Mgggg*ÿéò->O_%#"'&'"'&5476767676=4'&#"#6763232'532762#"'&5476"327654'&#G W[n+\$^I QgT!7w°- ‰ R jCH4 q2 +0 *   1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/t+ 1 */ ,  "ÿéM;LU%3"'&'&'#"'&54767676=4#"#6763267632!32%5"32767!4'&#"ïTd32k; ][g+d6jF vgT!7u€/1^oB þ~+Seþ³![g<=21P&A"-U)Ÿv,Ca H$/i%  NM H%=RE P 7pH(Dge0=&&°],K$ÿ*Ý?632#"'&'732765&'"'7&'&'&547632#&/"3273 C B ,<  7"& ' 9$Z \;Rj:T T^#O'kT[2!2 ?) "G @Ž M1D+Fad.@‰-z5(ÿéä$(%!3273#"'&547632!654'&#"#'þ~+Sf#Th,6ˆ?'^'']&M )Z'Re-'(,/-%)DAfq Á?„>W²B# (f\0@‡1X/B‘.FçÍ-367632#4'&#"#3#"'&#"#6763232FM6Li*S;T%T4:J@# :;*' XUF )þtkF M*:þßÍh %] $ÿéþä#2#"'&5476"327654'&#'˜9f8OEJGs¯F$AA¨þó0\0@B· 4\0@DAÿéâä!#5#"'&53327653'#'âK8Jk)S;U&Sï`<•IO F )”þF N*9)Ø””Aÿéâä!#5#"'&53327653'3#âK8Jk)S;U&Sºq•B%#"'&'"'&5476767676=4'&#"#6763232'53276!5#G W[n+\$^I QgT!7w°- ‰ R jCH4 þî1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/?FF£ %!#3# 3327653#"'&ÚþçMcxhepx;TM ; V*ÛÛÙý')Lþ´zB9‡9*ÿéÜ->L%#"'&'"'&5476767676=4'&#"#6763232'532763327653#"'&#G W[n+\$^I QgT!7w°- ‰ R jCH4 þù;TM ; V*1? ?LK#-f&   @ K H%=t þÌ)v^ 6 A/^B9‡9ÿ3´Ù%!#3327#"'&54767# ÚþçMcx`H%0!$?F$epxÛÛÙý'.;7 - 9:&)Lþ´+ÿ3T8I%327#"'&'4767&'#"'&5476767676=4'"#6763232'53276HH&*+=/ 9Qan+]#]F uhT 8v°- Š R jCH4 1?#87 - <. CMK#-e'   MM G&=t þÌ)v^ 6 A/0ÿ饫##&'&'"32767673!"'&547632'3#–_&6Z€=(_;Sm3 `!þõRjfR•îÕq•<÷K#,sKpªO1M *GþßUm¹·o[Æ”ÿéÝä $#&/"3273#"'&5476323#×T T^#O'kT h+8>)\;Rj:§q•<\ad.?‰-~‰.iFe M1D+B”ÿÿ0ÿ饗'ï²&ÿÿÿéÝÊ'ïƒÿåFÿÿ0ÿé¥i'ôÚ&ÿÿÿéÝœ&ô\ÐF0ÿ饬&#&'&'"32767673!"'&547632'#'373–_&6Z€=(_;Sm3 `!þõRjfR•î¿_`?QO@÷K#,sKpªO1M *GþßUm¹·o[1–``ÿéÝå '#&/"3273#"'&547632'#'373×T T^#O'kT h+8>)\;Rj:˜_`?QO@\ad.?‰-~‰.iFe M1D+­–``Y›¬ 3!2#'327654'&+7#'373Y£O!tIl¼¬®% ¨¬Ì_`?QO@Ù„+QlÑ_=Rµ-8ö –``ÿéˆÙ$0#5#"'&547632"327654'&3+52'#ïJ:V ‚<&Y9Ol5“U)F$/S'H!ñd097Ùý'ESpGgšK/QþôR&3z6R2Eƒ3 gL &V›Ù#53!2#!327654'&+3YEE£N!uIjþæ]­²"¡­«SCC„+QlÓ_;Sþÿ¿*2ï%ñCÿé-Ù(3##5#"'&5476325#5353"327654'&î??JFbv>.Y8Oa@––SåU)D$0T'H 5ý¨;ReKo™K/N‹5LþðQ1Ev5R1B€2Ze„ !!!!!!5·®ýõùþdbþîLúRÙRéR8FF(ÿé½$(%!3273#"'&547632!654'&#"!5þ~+Sf#Th,6ˆ?'^—X%N'Y#R£;UM ; V* þJš@ <X''1)fR @M™O6[Z0B‹/\.?–+B9‡9ÿÿ,ÿéÅi'ôå*ÿÿÿ&éœ&ôXÐJ,þãÅå)4#'#"'&54767632#&'&#"276=#53#52'#Å;h‘™^WfU…³Q! __*5„G5=HprB1ÞDd;97þ{atrh¢°n Fv1Bb$hNs~T HP—X%N'Y#R%d;77 þJš@ <X''1)fR @M™O6[Z0B‹/\.?–+‚gX&TÿÿS„—'ïȲ+ÿÿÿàæ—'ïÿ̲K'°Ù!5%53!533##!##5°wþ,]w],,]þŠ^,øZZH™™™™FþLþ´úFæÙ3#67632#4'&#"##5353™––6Bn'S" *T%S??S5”F J'þtk7M*:þßX5Lÿÿÿö0i'÷ÿñœ,ÿÿÿë%œ&÷æÏó„#7#5Â^®þÙý'Ù«FFÿðç½#7#5•S¥÷ ýô ±FFÿÿÿý*ˆ'óÿî¬,ÿÿÿñ»&óâßóBÿ4êÙ327#"'&54767#Â8"  I 3 +Ùý'38(  - 14, Ùÿ4¾Ù327#"'&54767#7#5–* " F -  ST ýô&1 *  - /0+  Íii`È“#7#5Ã^chÙý'Ùºhh^² #²T ýô ÿÿdÿérÙ'-È,ÿÿBÿ&1Ù'M˜Lÿÿÿé —'ïØ²-ÿàÿ&ÿ3"#"'5327653#'#FS€ 4 _`?QO@ ý‡gG ]–``Oþã’Ù #33 #3#52'#¬]]kxþ×,nþÿd;97ÿÿÙþqþ×þPvþNgX&V:þãöÙ 73##3#52'#Þk¶Ög±QSŸd;97ÙþUÞµþ©PÌÙüëgX&V:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ F« !!73#­hþ;Vq•<ÙýyRÙÒ”?«#73#˜T[q•<Ùý'ÙÒ”PþãÙ!!3#52'#­hþ;±d;97ÙýyRÙüëgX&V?þã£Ù#3#52'#˜Td;97Ùý'ÙüëgX&VPÙ!!;+52'#­hþ;Ád097ÙýyRÙgL &VD1Ù#;+52'#˜T‰d097Ùý'ÙgL &VÿÿPÙ'y/ÿÿD±Ù'yÞO(Ù 7!!573­««{þ(PP]–yLz÷R9M8uÔÙ 7#573’BBS??S¥3@3þ›92@2`L†« ##3'3#†iþ‡Xe}©q•<Ùý'Oý±Ùý¬TÒ”Fçä367632#4'&#"#3#FM6Li*S;T%Tðq•< XUF )þtkF M*:þßä”Lþã†Ù ##33#52'#†iþ‡Xe}þüd;97Ùý'Oý±Ùý¬TüëgX&VFþãç"367632#4'&#"#3#52'#FM6Li*S;T%TŸd;97 XUF )þtkF M*:þß­þ°Hþ[;|e6336d}GõRJ\\d¸ÎeEXLRîR‘exNMLN(ÿéƒ%9B%3#"'&'#"'&54763267632!32"327654'&'&!4'&#"$Tf,7|@?ƒ›8z1B‡=6gsA þ~+Sfþ]&O(['QÝ&A"-U)Ÿx+]g…>WÀ?jXR7pH(D˜]'5 ‹/Y0A.  ],K$]§«(,#!2#&574'&#'327654'&+3#º]Pª) H> qPðáy& IáÅq•<:þÆÙx!*b3 (%V` 0GAmRVB $”EKä367632#3#EM::  H;T•q•< _]U+nþðä”]þã§Ù(3#!2#&574'&#'327654'&+3#52'#º]Pª) H> qPðáy& Iá…d;97:þÆÙx!*b3 (%V` 0GAmRVB ý=gX&VAþãA367632#3#52'#EM::  H;Td;97 _]U+nþð qPðáy& IáÚ_`?QO@:þÆÙx!*b3 (%V` 0GAmRVB –``0Oå367632##'373EM::  H;Tª_`?QO@ _]U+nþðO–``0ÿém«7;#&'&#"#"'&'332767654/&5476323#TXm (h) 6)·x: I„©L*X 3uY-,nµh@[°?êq•<o>8 1!aT? 8h9^-"=8L#0%…|8"o1f”"ÿéËä04#&#"#"'&53327654/&'&5476323#¶XfRBPvZ4JÂX!GT 6NwT1D‘# £q•<zT1-F`,¢ /#/.3+]*eI”ÿÿ0ÿém­'ï¬È6ÿÿ"ÿéËÊ&ïVåV/ÿ*måV632#"/732765&'"'7&#'&'&7332767654/&547632#&'&#"OFB -B 9 & '  ,u1X 3uY-,nµh@[°?Xm (h) 6)·xG#8 7?( "Eb7C-"=8L#0%…|8"o1Bo>8 1!a^@"ÿ*ËM632#"'&'732765&'"'7&'3327654/&'&547632#&#"ôFB -B 9 & ' ¨X!GT 6NwT1D‘# XfRBPvA& 7?( "G /#/.3+]*e!T1-FO/ 0ÿém¬7>#&'&#"#"'&'332767654/&547632'#'373TXm (h) 6)·x: I„©L*X 3uY-,nµh@[°?Ø_`?QO@o>8 1!aT? 8h9^-"=8L#0%…|8"o1Ñ–``"ÿéËå07#&#"#"'&53327654/&'&547632'#'373¶XfRBPvZ4JÂX!GT 6NwT1D‘# _`?QO@zT1-F`,¢ /#/.3+]*e´–``ÿÿÿ*QÙ'z€7ÿÿÿ%œ&zéWQ¬##5!'#'373b]ð<î_`?QO@‡ýy‡RR–``ÿéA ##327#"'&5#53533+52'#þV 'Y GGS5d097 Dþ™&FC ŒDgL &VQÙ##5!b]ð<‡ýy‡RRÿéþœ#327#"'&5#5353þV 'Y GGS Dþ™&FC ŒDÿÿUÿé…i'÷Ëœ8ÿÿAÿéâœ&÷pÏXUÿé…„3#"'&5332765!5(]hHi¥I)]n"*|-2þîÙþ‚A-e:Qþu P",«FFAÿéâ½!#5#"'&53327653'!5âK8Jk)S;U&SGþîIO F )”þF N*9)±FFÿÿUÿé…ˆ'óȬ8ÿÿAÿéâ»&ólßXUÿé…¹&63#"'&53327652#"'&5476"327654'&(]hHi¥I)]n"*|-»2 +0 *   Ùþ‚A-e:Qþu P",à+ 1 */ ,  Aÿéâò(8!#5#"'&53327653'2#"'&5476"327654'&âK8Jk)S;U&SÑ2 +0 *   IO F )”þF N*9)æ+ 1 */ ,  Uÿé…«3#"'&53327653#%3#(]hHi¥I)]n"*|-ßq•<q•<Ùþ‚A-e:Qþu P",Ò–––Aÿéä!#5#"'&53327653'3#%3#âK8Jk)S;U&Sïq•<q•,6Aÿ4  *327#"'&547#5#"'&5332765â;- 3` `8Jk)S;U& ýô"4 (  - 6=2IO F )”þF N*9)ÿÿ¡—'ï8²:ÿÿÄÊ'ïÂÿåZÿÿ •—'﮲<ÿÿÿ&ÞÊ&ïVå\ •’ #33%#5!#5ƒ]þçsÖÐoþ£h hþâ»þc¹ggggG« !!5!5%3#EþL¶ýÕ¶þf#q•<ÙTýÍRR5RÒ”Éä !!5!573#»þÉEþV9þÜâq•< Jþ‡IKxIØ”G“ !!5!5%#5EþL¶ýÕ¶þf;hÙTýÍRR5RºhhÉÌ !!5!57#5»þÉEþV9þÜûh Jþ‡IKxIÀhhG¬ !!5!5%#'373EþL¶ýÕ¶þf6_`?QO@ÙTýÍRR5R=–``Éå !!5!57#'373»þÉEþV9þÜö_`?QO@ Jþ‡IKxIC–``Ü3##53547632&#"«SFFJ :ÈDYXE5ÿÿÿé-ÙGÓGÀ@ÿÿOpÙi6ÿé Ù""327654'&!!632#"'S'E!,T*H%þï‡þÌ9i€;%[9Pk;ÍT2E}4O3F5þ4ÙIËVlDc¡M1ZCpÙ 7327654'&+532#!57537¬ÔQ)A#.Ô¥ú T=UþÆOO]¬R>#.T'ªX­rA/Ý4M4¯qqLÿ÷ÿé Ù("327654'&'632#"'#57537S'E!,T*H%¾9i€;%[9Pk;K??SBÍT2E}4O3F5†VlDc¡M1ZC2@2zN3@ÿÿ0ÿé¥å&ÕÎÀ0ÿéíå/547632&#"1#&'&'"32767673!"'&547632?I 3_&6Z€=(_;Sm3 `!þõRjfR•î÷Y\ O(RK#,sKpªO1M *GþßUm¹·o[ÿé.,(632&#"#&/"3273#"'&547632”R 3T T^#O'kT h+8>)\;RTî>E(Rad.?‰-~‰.iFe M1ÿÿ›Ù’ÿÿNpÙGC¾À@ÿÿ6ÿé ÙGDAÀ@ÿÿZeÙG(¿À@&ÿéæå'67632#"'&547!&'&#"!3276/{Rl®a8R[‡§bWa e?V‚H ùþe;MH,Ä M4{&`ƒ”iMuh¡ œI-f-<•A&d<0ÿémå7#"3276'3#"'&'&54767&547632#&'&#";œlQ3+-Yu3'X*L©„I@ m ih@[°?Xm (h) 01=XA;#$8&=.B^9h83Tr3-l|8"o1Bo>/--ÿ&CÙ 73#"'5325#!!!Z]X$ D]]éþt\àþ³OQ;˜þ´ÙRéR ÿ,â!#"'732767#53767632&#"Ó~K.:M$ENq}-3@#, G ÎFþsg/7 TaFhP,0O~F,ÿéå9547632&#"#'#"'&54767632#&'&#"276=#5dI 3 ;h‘™^WfU…³Q! __*5„G5=HprB1ÞüY\ O(R{þ{atrh¢°n Fv1Bb$hNs~T HPQI.å{&`ƒ”iMuh¡¸k[þœœI-eGfF‘E*dA6ÿ&HP"2547632&#"3632#"'"327654'&¤V 3þEM;l<&Y'4a@’S'E!,T*G#€YdE(Rý¦æO^oGhšK! Nþï§T2E}4Q2E5ÿÿ0ÿémåG6À@ÿÿ"ÿéËGVíÀ@GÙ 5!!!!5÷Ù þfÛÛ¶ýÕmTRþæþåRRÿ&þœ!&'#53533#327#"'532765ªPGGSVV r 4 CŒDDþ™&£` G ÿéÿÜ!3#327#"'&5#53547632&#"¨VV 'Y GGJ :^RDþ™&FC ŒDYXEÿ&QÙ %327#"'&5##5!bD v]]ð<àþÔ;QFM§ýy‡RRÿÿY¬'?¼'ÿÿYå'@Ä'ÿÿÿéõå'@,GÿÿPÿéÖÙ'-,/ÿÿPÿ&ÅÙ'M,/ÿÿDÿ&wÙ'MÞOÿÿLÿénÙ'-Ä1ÿÿLÿ&kÙ'MÒ1ÿÿFÿ&ÅÙ'M,Qÿÿ£'ð®¾$ÿÿ*ÿéÙ&ðpôDÿÿ"£'ðÿð¾,ÿÿÿùÙ&ðæôóÿÿ&ÿ鿣'ðâ¾2ÿÿ$ÿéþÙ&ðnôRÿÿUÿé…£'ðʾ8ÿÿAÿéâÙ&ðoôXÿÿUÿé…'qÈCžÿÿAÿéâ9&qm|¾ÿÿUÿé…N'vójžÿÿAÿéâ‡'v˜£¾ÿÿUÿé…P'ðÊkžÿÿAÿéâ‰'ðp¤¾ÿÿUÿé…N'C¤jžÿÿAÿéâ‡'CI£¾ÿÿ(ÿéH)Àÿÿ'qªC†ÿÿ*ÿé9&ql|¦ÿÿã'q¬&²ÿÿ*ÿé&qn\³ÿÿ ¶S'qÈ–ˆÿÿ"ÿéM‰'qÿ̨ÿÿ,ÿéÅ£'ðè¾*ÿÿÿ&éÙ&ðZôJÿÿO’£'ð̾.ÿÿÿÔö—'ðÿÁ²Nÿÿ&ÿ#æå'öÉÿð2ÿÿ$ÿ#þ&öTðRÿÿ&ÿ#æS'qà–‚ÿÿ$ÿ#þ‰&qk̃ÿÿÿßÿ&þÊ&ðÌåFÿÿYÙ'=Ò'ÿÿY›Ù']Ò'ÿÿÿéõÙ'],Gÿÿ,ÿéÅ¡'v½*ÿÿÿ&é×'v‚ÿóJÿÿL†¡'C ½1ÿÿFç×&CNóQÿÿu'vÕ‘‡ÿÿ*ÿé®'v™Ê§ÿÿ ¶¡'vó½ˆÿÿ"ÿéM×'v=ÿó¨ÿÿÿéè¯'v Ëšÿÿÿâ×'v—ÿóºÿÿþú£'j¿$ÿÿþ¼ÿéÙ&,õDÿÿÿn”'¬¸$ÿÿÿ0ÿéÊ&nîDÿÿÿe£'p¿(ÿÿþÁÿéÙ&1õHÿÿÿse”'±¸(ÿÿÿ4ÿéÊ&rîHÿÿþ<£'ÿ¬¿,ÿÿþ1²Ù&¡õóÿÿþ°Â”'ÿî¸,ÿÿþ¤²Ê&âîóÿÿÿ.ÿ鿣'ž¿2ÿÿþ¹ÿéþÙ&)õRÿÿÿ¢ÿéæ”'à¸2ÿÿÿ,ÿéþÊ&jîRÿÿþ®§£'¿5ÿÿþlAÙ&ÜõUÿÿÿ"§”'`¸5ÿÿþàAÊ&îUÿÿÿÿé…£'†¿8ÿÿþºÿéâÙ&*õXÿÿÿŠÿé…”'ȸ8ÿÿÿ.ÿéâÊ&lîX0þãmå7B#&'&#"#"'&'332767654/&5476323#52'#TXm (h) 6)·x: I„©L*X 3uY-,nµh@[°?þÏd;97o>8 1!aT? 8h9^-"=8L#0%…|8"o1ýgX&V"þãË0;#&#"#"'&53327654/&'&5476323#52'#¶XfRBPvZ4JÂX!GT 6NwT1D‘# ñd;97zT1-F`,¢ /#/.3+]*eþ)gX&VþãQÙ##5!3#52'#b]ð<þ³d;97‡ýy‡RRý=gX&Vþãþœ"#327#"'&5#53533#52'#þV 'Y GGS9d;97 Dþ™&FC ŒDý¸gX&VÿÿS„£'ðɾ+ÿÿFæ—'ðt²Kÿÿu'ôª©$ÿÿ*ÿé«&ôlßDÿÿZÿ1eÙ'z¨(ÿÿ(ÿ&z^ðHÿÿ&ÿéæ'qáC˜ÿÿ$ÿéþ9&ql|¸ÿÿ&ÿéæ'qçE—ÿÿ$ÿéþ;&qr~·ÿÿ&ÿéæu'ôÞ©2ÿÿ$ÿéþ«&ôißRÿÿ&ÿéæã'qà&ºÿÿ$ÿéþ&qk\»ÿÿ •S'q¬–<ÿÿÿ&Þ‰&qTÌ\ÿÿ*ÿéDAÀÿòå#4763253#5"#"'&%4'&#"3276V6PZBSS9=1U><s:&5J&7)8Q"ŸJ/PBýô96 VTko;&Y7B`<-`0ÿÿDÿòÁ) À6ÿé Ü .547632&#"#3632#"'#"327654'&6J :SS9i€;%[9Pk;KåS'E!,T*H% YXE5RGVlDc¡M1ZCÍT2E}4O3F5ÿÿÿéÝFüÀÿ&LÙ."327654'&#"'&5476323327#"5 U)F$/S'H!r:V ‚<&Y9Ol5S*  ‹ÍR&3z6R2Eƒ3þxSpGgšK/QüÛ8 GmÿéFÜ."327654'&7#5#"'&547632547632&#" U)F$/S'H!¼J:V ‚<&Y9Ol5J :ÍR&3z6R2Eƒ3‘ý¢ESpGgšK/Q›XEÿÿ(ÿéGH)À@ÿÿ(ÿéH)Àÿÿ"ÿéËGÊíÀ@ÿÿ"ÿéËÿ&@Š7G547632&#"'3#"'&'33276="'&'&547632'"327654'&œV 3MM)0m Š2U$;Q#;IS=BU9Qb>—X%N'Y#RºYdE(RRþJš@ <X''1)fR @M™O6[Z0B‹/\.?–+ÿÿÿ&éJÿÿFÿ3æ K, ÀFæÜ %547632&#"#367632#4'&#"#FJ :SS6Bn'S" *T%S YXE5RHF J'þtk7M*:þßFÿ&æÜ-4'&#"#47632&#"67632"#"'53276“" *T%SJ :6Bn'€ 4 L·7M*:þßeXE5šF J'þgG ÿøæÙ#5533##5#5–TSPPSKÙiiþ_ÔÔHððHBÿéë 327#"'&5• 'Y  þU&FC Ðÿÿ^² óDÿ&ðÙ3327#"'&DT  † mFüÛ5 G`ÿÿFÿñú P@ ÀFÿ8ú (#"'&'"'&53327653327653úM6J!Y+6?,zT?>%TG >%TÈL AA b‰þ—Q8$-Iþ—W8$-IFÿ&ú:%3#"'53276536763267632#4'&#"#4'&#"#¦Tr 4 ý M6JY+6?zT?=%TG >%Tàþ³` G XJL AA bþwiQ6%.þ·iW8$-þ·ÿîÿ&ç'73#"'532765367632#4'&#"#FTr 4 M6Li*S;T%Tàþ³` G XXUF )þtkF M*:þßFÿ&@'%327#"'&5367632#4'&#"#è  † þ²M6Li*S;T%TàþÔ5 G`M,XUF )þtkF M*:þß$ÿéþ!2#"'&5476&'&#"!3276˜9f8O‹7j B‚ˆ@ˆÿÿµ"#"=336? JLÀ/ Ocj ÿÿnÿm× ®IÿÐ#'ÿ)Ї‡ÿÿKCUK&ý{j-ßÿÿ¦Ð&ÄYȼ02#"'&5476Š    / " " ÿÿÿÔfÐ'ÿ&ÿÿÿ¹qÐ'ÿ !ÿÿÿ£Ð'ÿ#ÿÿÿðÿøÞÐ'ÿB)ÿÿÿžÿþ—Ð'þð.ÿÿÿúÿÿÀÐ'ÿL2ÿÿÿßÿø_&”B¦Ì!#'!#3&'¦jTþÔNffHh = ÚÚÌþZ%VœD&JgÌ#,%#!!2'4'&'&+32764'&+32g> <†þð ”; U%M3 #Fœ?Hm*¦²ªÔ^; 0ÌP$`0 5ÛE ØìböR6Ì!#!6þ|`äxýˆÌ ÿÿ«Ì!&"#3&'&'«Zþ8E7fš©  ˜Ìýˆ¼ &AIþ\PfÌ )!!!!!fýêþXŒþt¸ÌTÜTô#YÌ )567!5!!YýÊp+þpþDÈXÊ7TTýÜAqÌ !#!#3!3q^þŒ^^t^Rþ®ÌþÚ&-ÿóÙÉ$(#"'&'&547632327654/&#"!5!Ùj]ZKP01lZ‹`hý´V@^•BY6H¢9œþ°P]ªfY$%OM}¸fUV\¯L7‚>Y˜N!AkRE£Ì3#3£^^ÌJšÌ !##33š~þþr^^bxþÞjrøÌþžbþÞÿÿ¦¼ !#0#3¦jðš %ffsþMWh¼@ìÌ!###373ì\ÐVÎ\¨&¬€Xý¨býžÌþE%rò8lÌ !##33l`þˆ\bxZ2ýÎÌýÎ2Aÿÿd» !5!!5!!5!Sýî9þg™IýÞ"iRþƒRþpR2ÿøÞ¾#47632#"'&7327654'&'&#"2oZXNM21j^޵^C`V@^•Bf7R¡:R¶cR%&PNz§cW|ZŠI6=W K&Š@Pÿÿ€¼!#!#!€^þŒ^0iý—¼Nÿÿp¼"+#!24'&+3276pü¸^4CbR>¸ºòÎþã¼ :d[ûV(ÿþ^½!5'5!!!^ýÊìÊþp%t òÈV#óRR&Ž&þÙ'ÿþ_»###5!_î^ì8iý–jRÿþ—» #367—þè\þòpŸ>—ºþnþÖ*’ó.'gáÿþ°¿)##5"'&547635324'&'676°RR|S|RR]QsQ‡SG[\.;p5 þèo6[.XzKMGGMJ{QEPP[Mjp8þc T2‘ P#+u;$¨°!##36767673¨tϰpîm™  x fö$ðgHÓ šþ¼4ÿý¶º#+#5#"'&'&5;3327657¶((@ J^i0 FZC#<VqZdX25  9qVþ¸gÛþ%; 8H*ÿÿÀµ)476323!567654'&#"!53&'&/W[nMo ްþî\./SAa{A.sþø®_‹cg0H…)+«[ IM$JMZƒLÿÿÿJòÐ&[@ÿÿ8ÿøÐ&Bÿÿ(ÿòÞ_&3N0ÿóG"2"'&=&5#"'&5476763533274'&#"3276÷3 )'2Õ!a#*o3H +t)"Iz t ) ñ5Ch FNþ[ ECB7œ±~!2ÿ:øÜ2%#"'&'#476763227654'&+5327654'&#"øQ4IV1 V# 5V‰-`žài'/L2*^ "!0;)Èw:%( ú°p4/b'3z"þÖ\G#JL 8)jþªSÿ: #5&#"'472 ¼V§  */vþææ˜F4þÐ~%ÿðÎ*%#"'&547632'5!!'";2767654'&x5QiDA”& ÓŽþó¯8LøZ*_/6 R!ú¾5DC{¿7 —HH)M5T+7Ž"(\z)'ÿöÜ-%#"547&5476732#&'&#";#"32767Üj*<Öffw'8 ”-Lc =#..\h e$ ˆm ’_`oN(< UB;0J -&ÿ>¸Î$'654'&#"'&54767#5!¸&L" W\M‡/:àdOH.+4K*7aE!. =2qÀ’3%HXXÐrÆ <ÎÒÒÀÿö,Ü(%#"/5'&'#&'&'&#"7632327,0!2 X [ `Æ   !5  ˜ 0ì@6Wù0$E R  'Yþf Nÿ8ò"'&'#3327676=3#5 A' XX = #!!VP': * üÎÚx#= 7jÜýú>= è #367èÄRÄ\s rýúþÂ4,Y <ÿ>¹Î;'67654'&+"'&7456767&'&54767#5!#";#"32¹'J 9;"25=K 4 dt¦2"[1Rn`5M&/JE'=^Q  N+>U// ?$F. FF8%'L@D+M" P"ÿô"'&54762'27654'&#"“="DCÖCD]=Xe$I!.e$*( uAZ‡DCCD‡—I0Jd*8/g*5b135ÿüi%#"'&5##'!#32767i07ì^F(@  <Pþ>ÄFFþ²' 9ÿ8$#"'#476324'&#"3276"+Gc5XGGbŒA'Z,,BC),++BA-,b.: GþûÖŠ>>jAa`222/ed1105ÿJõ.#4'&#"'67654'&#&'&/&'&547672õ[S W+Q"ZW0ZHZ0N"L’x>)DbN(Bh.  0,n 48 5hS:uQ6"ÿôN""'&547632!#'27654'&#"“="DCkˆ@]=Xe$I!.e$*( uAZ‡DCRRf—I0Jd*8/g*5b13*ÿüî#327#"'&'&5#5!îÈ   #!P ¤ÄÂþÖ/ O .>2D(ÿòÞ%#"'&'&5332767453Þ /#Y_#/ X $=<# XÆa31c@þâb [ .ÿ8¹ $/7;32+#5#"'&'&547674'&+3276‚E0BX‰N=l7M XŽI b!*^ãE+<_.þ[6&Ã]IkM$¾¾d"4.†XD<[e2þ—L,ÿ,= +"/#&'&##5723327=B1a¸hê•  8:!ƒ™`ÃÈ YÅþîhN1 ôþšû *ÿ8l%##5"'&533327653l(1VÇ& ZD!7Vq ZÖ©% ÆÆ‘ '0þìy!¬þTN#9$ÿ÷À7%27654'7#"'#"'&5476767367676=3þZlP3$c "0`0.bu03PE H) T ?z”u)jJ@¦<ZZr;Mce0E^(0‰  $ßß$ÿÿÿßÿø¾&jÁóBÿÿ(ÿòÞ¾&j`óNÿÿ"ÿôÐ&@Hÿÿ(ÿòÞÐ&5Nÿÿ$ÿ÷ÀÐ'žRÿÿZe•'Cر(OZ’ !!!!!#5!#5¬®ýõùþdþöh hLúRÙRéRFggggÿlÎØ !+536754'###5!#32Ì& #?Qc4Bî]ÇêÅèc,G" B 8 A5þŒˆPPÂK%,ZC• 3#!!3#·]éþtq•<ÙR”0ÿé¥å$32767673!"'&547632#&'&'"!Žb8Jm3 `!þõRjfR•î+_&6Z~= lL£G'M *GþßUm¹·o[îK#,p'2Rÿÿ0ÿémå6ÿÿdÂÙ,ÿÿŒ'jÿêÁ,ÿÿÿéªÙ-SþÙ%!##527645!36#74'&+3276á‹R ²=89fzG"¿¿A "‡Ü6þº)^Í_'þÆj*?&#ÿÿOoÙ%O8Ù3#!!¬]éþtÙR"ÿy Ù%!!67645!3#5!#5KþúÇUÂ[Pý¸PR5äîk'ÔXýqч‡ÑOZÙ !!!!!¬®ýõùþdLúRÙRéR?´Ù # 333 ##ËþânEþåtî]îtþåEvþê]Dþ¼wbþÌ4þÌ4þžþ‰Dþ¼0ÿémå:5327654'&#"#67632#"'&'332767654'&#XI4!H'4Xz#.T'OÙ %#!332327654'&+#oT=UþÆ]¥ú þ=ÔQ)A#.Ôm^ârA/Ùþê­«>#.T'hý'ÙOpÙ %#!332327654'&+oT=UþÆ]¥ú þ=ÔQ)A#.ÔârA/Ùþê­«>#.T'0ÿé¥å#!5!&'&#"#632# 33276Hþ‘lf/<[2&_+î•RfjRþõ!` )f @'LRŸ;+#Kî[o·¹mU!G*R oBSÿé¾å+##3367632#"'&"327654/&'v^]yLh»W;ROX±Z=D=$f8Q‹>&m ,Lþ´ÙþÅÁT2b’”iC…ZË|IgµM*xHhÁJ oÙ #"'&'4763!##";£þën3 89fI]ãA "" Aã:þÆ:†!(X;=ý':M#$76$#ÿÿ*ÿéD$ÿéþ 0632#"'&576?67653"327654'&u,o˜9f8OE<fXo",z59SZ4JÂX!GU'#ÝL75Tw I%2G$,P`,¢ /#2%Fñ 33##FTëlSëm þcýôþcFñ» 33##3327653#"'&FTëlSëm?;TM ; V* þcýôþc»B9‡9Fä 73#'#™Ô`ûjáS ÔÔúþîââ Fÿöç !###5276”ST¬%d<  ýôÀ×a’PºIF$ 33###Fh‡‡hT‚2‚T þºFýôkþ½Cþ•Fè 3353#5##FTúTTúT ××ýôééÿÿ$ÿéþRFç !###F¡TùT ýôÀþ@Fÿ&"3632#"'"327654'&FM;l<&Y'4a@’S'E!,T*G#ÚæO^oGhšK! Nþï§T2E}4Q2E5ÿÿÿéÝF<° !###<tT Lþ@Àÿÿÿ&Þ \=ÿ&R¢"2B632#"'&'##"'&54763253"327654/%"327654'&ï-d0`%.E.S*1 ˜' h,<^1Sƒ_ T^ Wþ‘fa^ ^½^=T®D+þï> 3@ÂA^åÕt&1ž$ h*6Ÿ%~"+ªp'1«ÿÿÙ [Fÿˆ$ 33333#5FTùT=F þ@Àþ4¸xF 3;53#5#"'&5FT+šTT—N* Å)÷ýôÉ2*Fn %33!333„–TýØT–TLÀýô þ@ÀFÿˆª )333333#dýâT–T–TnA[§G'‡:?é ×™\0@‰0X/B‘. Ù 7&'&5476;#5###";Ûn )(JøTEËgw‰. &‰Ý V!>,+ýôÚÚÁ" ÿÿ(ÿéä&CtHÿÿ(ÿéÌ&j{Hÿ\Ù+"##53533#67632'5676754'&FX$STTS««5Co'kD; /4I" ÃR)5þîT@EE@ŸEJ'þíƒS6(0Ecü7FmÈ !##3#F'ÓT‹q•< Lþ@È”ÿéÝ#%#3273#"'&547632#&/"3XâR kT h+8>)\;Rj:T T^# ßè% ~‰.iFe M1D+Facÿÿ"ÿéËVÿÿB–ÙLÿÿ Ä&jåùóÿÿÿîÿ&™ÙMF0 .32+##5276=3276?4/&+çqŽ-6+7ö¬ %f< S|U)" | Ö7  H+À‹Z*“P¬P¿þ@" 7F1 )32+5##33533276?4/&+èqŽ-6+7öúTTúT|U)" |67  H+éé ××þ@" 7Ù!"##53533#67632#4'&FX$STTS««5Co'R" ÃR)5þîT@EE@ŸEJ'þƒ\7:öÈ 73 #%#73#Þkþð0gþþSÅq•< ÞÞþüþøØØ ¼”FçÈ 33###'FTëbSëcÙ`<• þcýôþcÈ””ÿÿÿ&Þ»&óSß\Fÿˆè !#5#333:F®TúTxx þ@ÀýôOoÙ %#!3364'&+3276o89fþ·]´²=VG"ããA "ÐX;=ÙþÆj*=W û#$Fè 2#!327654/&+šx ))IþùT˜. &˜ Ù L%>,, þ@*ÿÿ[iÙ3ÿÿ6ÿ& SZC93#!53!·]Œ]þtÙ`²Fmu353##FÓTÓT iµþ@ZCÙ3#!!·]éþtÙRFm !##F'ÓT Lþ@ZCÙ3#!!·]éþtÙRFm !##F'ÓT Lþ@?´Ù # 333 ##ËþânEþáxî]îxþáEnþâ]Dþ¼wbþÌ4þÌ4þžþ‰Dþ¼3 %# 35373 #%#wþþg0þðkÞSÞkþð0gþþSØØÞÞÞÞþüþøØØ0ÿémå:5327654'&#"#67632#"'&'332767654'&#XI4!H'4XzE<fXo",z59SZ4JÂX!GU'#ÝL75Tw I%2G$,P`,¢ /#2%O’Ù 3#33 #¬]]kxþdŸnþˆÙþÅ;þžþ‰D:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ O’Ù 3#33 #¬]]kxþdŸnþˆÙþÅ;þžþ‰D:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ O’Ù 3#33 #¬]]kxþdŸnþˆÙþÅ;þžþ‰D:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ O’Ù 3#33 #¬]]kxþdŸnþˆÙþÅ;þžþ‰D:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ S„Ù !#3!3#&þ‹^]v^^Lþ´ÙþÅ;ý'Fè 3353#5##FTúTTúT ××ýôééSÙ !#!#3!!!„^þ‹^]vÞþ€Lþ´ÙþÅ;RF» !#5##335!#èTúTTú'Óéé ××LS„Ù!#!#&þ‹^1^‡ýyÙý'Fç !###F¡TùT ýôÀþ@ÿÿ0ÿé¥å&ÿÿÿéÝFÿÿ0ÿé¥å&ÿÿÿéÝFÿÿQÙ7<° !###<tT Lþ@Àÿÿ •Ù< æ !#33[¸^Œ”^ þW©ÿÿ •Ù< æ !#33[¸^Œ”^ þW©ÿÿ‰Ù;ÿÿÙ [SÿyàÙ %33#5!3&^\PýÃ^R‡ýqчÙýyFÿˆ8 33333#5FTùTQF þ@Àþ4¸xS*Ù !"'&53!3#ÍþãN ]]].= Zþ§Yý'E° 3353#5#"'&5ETÃTTÃ@ ááýôß!S*Ù !"'&53!3#ÍþãN ]]].= Zþ§Yý'E° 3353#5#"'&5ETÃTTÃ@ ááýôß!S*Ù !2#!#3°N ]þã]]«= þ¦Yþ§ÙE° !#5##332°TÃTTÃ@áá ß!ÿÿ&ÿéæåý ÎÀÿÿ(ÿéHÿÿ'ÿéšFHóT³Mÿÿ(ÿéHÿÿdÂÙ,ÿÿ?´ˆ'óT¬nÿÿ,»'óûÿߎO’Ù 3#33 #¬]]kxþdŸnþˆÙþÅ;þžþ‰D:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ S„Ù !#3!3#&þ‹^]v^^Lþ´ÙþÅ;ý'Fè 3353#5##FTúTTúT ××ýôééS*Ù !"'&53!3#ÍþãN ]]].= Zþ§Yý'E° 3353#5#"'&5ETÃTTÃ@ ááýôß!ÿÿˆ'óª¬hÿÿ*ÿé»&óg߈ÿÿh'j¬hÿÿ*ÿé›&jjЈÿÿ ¶Ùˆÿÿ"ÿéM¨ÿÿOZˆ'ó±¬mÿÿ(ÿé»'óœÿßÿÿ&ÿéæåNÿÿ(ÿéH)Àÿÿ&ÿéæ™'jáÎýÿÿ(ÿé›&jvÐþÿÿ?´h'jVnÿÿ,›'jþÿÐŽÿÿ0ÿémh'j¨oÿÿ"ÿéË›&jPÐ0ÿémå:5327654'&#"#67632#"'&'332767654'&#XI4!H'4XzE<fXo",z59SZ4JÂX!GU'#ÝL75Tw I%2G$,P`,¢ /#2%ÿÿO‰G'qÄŠpÿÿFñz&qr½ÿÿO‰h'jÆpÿÿFñ›&jtÐÿÿ&ÿéæh'jãvÿÿ$ÿéþ›&jnЖÿÿ&ÿéæå2ÿÿ$ÿéþRÿÿ&ÿéæh'jã ÿÿ$ÿéþ›&jnÐÿÿ0ÿé¥h'jþ…ÿÿÿéÝ›&j1Ð¥ÿÿkG'qžŠ{ÿÿÿ&Þz&qT½›ÿÿkh'j {ÿÿÿ&Þ›&jVЛÿÿk—'ø¦³{ÿÿÿ&ÞÊ&ø\æ›ÿÿO9h'jœÿÿF›&jXПÿÿOh'jƒÿÿFl›'jÊÿУOÿ×ÙÌ%#"'&'&5327653CE<<¹= ^!+MŒ†0/D)aþºWž E#(0X)*7?ÿþØA%275#"476;54'&'#"'#"#47676;23#+"'"'"'&'&T!,—³F]4/l´,*>³ z_ 0¿B,66h5Q   YÚN ‰›1"‹1,BT‰ýþ ('p P4IKN¤x9 L)Cÿö~Î)"'&=47672;533##/"2767670…@(5“\c`h2; +'%.IH  R3H~3.dÀÀKÿr<ËWk<. =?qÜ!"#367632#54'&'&'&_‚+ ^b b&eC> ^ +æDBþâÜÖ& D9*k4 _× %4‰(3ÿt,4-)KLÿ¶7Õ2'&'"#&'&'%6ø, &&þñ€ 7þ†t,Õg.þ¸°£-"ª¸83ÿÖPØAO2&'"'&/47672676=4'&'&#"'5476762767&'&#"LG.))+(/I/I-A "R +B0"g  7&_^0†>'Ø`>X?]LJ(%: "(&&e 1*bAV,z* 8 2=BiF ý  " OŠØ!#4'&'"#547676323ŠÀ+(;D! _*l!Œ=aS ;ÌÒ2/QY /4þ@/qÔ")476767&'7672/&'"qý¾i- /<; =ˆBz@0o# X=u&/%/Ûµ("=G7?C7-B•ÈHEÒy5CKcj-ÊÙ#"'&'&53327653Êj9 @eh?@_--g|'Ç|þ¿¡E "'(@Ibžþb†0/[,^Ÿ1ÿô*ØA%#"'"'&'&'&5327654'&+5327674'&#"#4767632*eAZIC];<('<<450èç2)(u F`22Ow<5  Ëv;&4), HMF\((('95MO!!  +( ÖÙ33276=3#"'&'&'' ù"+M†0/D)aþcž E#(0X)*7BÿòGØ*%56767676=4'&'&'"547632èþnƒ 660)&)AN2_@Ks­G#&7)0—iU%87ZUC%/ 9"C@HSDK“*%tN9<# (J}Ù$%#"#54767632#4'&'‹_^9%@ei>M_,Fߥ2)a*+ E#(0X)*7þb…1þp*ÿøÇàP32674'&'&'&#'4'!#533276='&'&#'"'"'547676;2232IX0 ³dL)#,=5pSEþYZZZ4! \FgP I  0'#8 T"'{s” 2"8"1%CVGJ; ýd76º7*& 4YD#:h 560..|V#lJÉÙ%34'&'"#4767632}KO]--gl+ ^9%@ei>MúP§†0/D)aþcž E#(0X)*7Oÿô‚Ì3#"'&'&532765#_2'>i¹= ^!+k4 _Z× %4‰(3edt,4-)Küý†^-ÿôgØ7"#"'&5727654/&'&'&'47632&Hx" rt+= /j&*ï8 Y § c1TÒX%e@W¤C [ …@'--64J ¯$Ž3)G:2!9l6#`#& ‡J}Ù#54'&'"#4767632}_--gl+ ^9%@ei>M&x†0/D)aþcž E#(0X)*7<ÿô9Ø;P2#"'&'32767654'&/"'6767&'&'4767627654'&'&8ç2 1$/p #xE=]#!&"%% !$" h#j"46`a #- -!!$!ظL(  D %;;4S?7a8 !A="" 5,G$*) !þØ<. 0# L_Ó33##L_´´_ÓøPþu*äÕ#*54767675332#5&'&'&'&76767674'&'*CAF<)^"ADCBBDA$^KB 2C_Ðz9,‰2 †")j|FC77 FF~GE// !%DÁ)Ñ d1þÑg#7ž6 $VØ-"'&'!!#5#534767632'3254'&'"sA'& }þ‚]WWE5P¦5 t.ÖA)0€0-.?.ˆNyyND/@'„(#ª6Å>$ŸR+70ÿôÝÙ""'&'4767232654'&#"‡£aQ`^™a),4o?þÃEGhkŠs:FdJH wc°fdp$SnkVh.gJK–Š´I%EE'ÿ÷¡Õ A#3276=4'&%375#'"&'&547676;32#"'&'&'&533'"'&´..F+)þm"f & )`_.¦9 O3R….:7%  ] (%G-"±þ’4"A7E#8‘H’¿&%@ /Ù†)#VeC( #) p5é›Ó 53'65=^.5mfPA$"NL™Î73X)hL‚‚I.Ú"'67676;27+t,  "),0$(N$/  0-&+GãÐ#'3ãGqvG‰S,"4'&'"#56767632#"53276ÿ!$D/ $&?J?Z, %¬+'&5I 0DZ& Aÿö("'332765332767453#5#"'âžX6$%XH "!8XO!Gt= ®dþ¹E $$Q-þ¯i %k  ýùI9[[Jÿ-ï%#54'&'&#"!!#3632ïX 7G' Jþ¶XOÑ,[rþòùP <ÿõæÑ!#5#"'&'&'&'7!3276=3áO:k\. YQþ¯ "6+)WJU4*8É\ßM #$da*ÿ/B,747632533##"'&'&'&27674'&#"*M7S>"" Rc¸)U l9 äH#>(a 7õŽL76ýp:A l ##¢Y/7€2t&.i6^ÿ‡eÑ %/#33#>K”V±±JÃwÑóMþ¹?ÿ0ä #4'&'&#"!%3632äX 5B'Hþ_O-0ÿòFÓ*476;533#+'"'"'&'&'&%#"27676'&0B8UŒYbbi0C& V^z…I<# xI=ÓÔDé„>  8†Õ¾Z753&4™*Bÿ3èÌ3632#4'&#"BX>]—XX D(Í™þÿG€!"þ·Ip 4 $<þ<ÿ0÷#3÷ºW}S×ý|Bÿ.ÖÉ"##3327653#5"'&'&'&760™UUò $8))XO8mW0·ýw›ÁþÂL $"eýùJT1%<·2+ÿò æ+@"'&5476?67637&'&'473#'2767674'&'&#" B 0.AU3;)’f H9PT#x s ~AQ:(' (=64( @T!tE6FeV@ ^*$µGÿ-îÑ'"'&'&'332767653îX=_s*XnG&XÓEN)L ýô~7 %;BèÌ33632#4'&#"BX>]—XX D(ÌþÿG€!"þ·Ip 4 $<þä(ÿòØà2I#5#"'&'&547676767674'&'&'47322765474'&'&+"‘La*M" >>23  #DS*$)H8þðC*Z"%/  '&&l= e6Cþì?!">EL $ 02;*1  þ‹€1x8 \.,  67'ÿ/#4'"#3676323¹Q[%VR))DK#$dÑ,[S þÒùS3 )'2ýí+ûÛ&!&'476767'767&'&'&'&#û œ–þ='&E@1>fh$1 6(#«¦¦ä8\u\\1@2zUýkX %NfZKIÿöÕÕ0476;2'"#5"#"'&53276754'&'&'&ôd@ T( 1, T8#CT/V Gz$%€J D 1.þb8$B"†þ Tp Ë!ÿÒÿ.™27653#"'7 ,X60*…3(!ýÝ€# KIÿöÒÖ-!#5"/&/47676;"2727673ÒP (&(0 -HAf! . %(WS"  .!©A> *='  þ•9Z35ÿ/‰þ/4'&#"'672;67#"/"'&'&'&'47676?6=) 3.+;VO3'("f\ ƒF<   #m"% B4#8:I@0<@;*0&&? ;š/!8Eÿÿê#4'&'&#"#3632êX 3E( XO,) VG)=&EC W cÑ '$4à )D:*U56  ^\ Aÿ+("'332765332767453##"'âžX6$%XH "!8XO!Gt= ®dþ¹E $$Q-þ¯i %k  ý#9[[&ÿ/Ï7V6763237373#"'&'476767654/&'&574747"6?6767654'4'&'&'&-T.+!X !u7#p \“HG (%*'$ À\ N !.&‰N(.m)wg,!#?>-'(&#L HS$#:Z !49; 7Pÿþ÷)654'&'"#36323'5276Ÿ.(H'XO"7 "CþêMX, *!+%rQM a@ÿôä!5#"'&'&'&5332767653–=hF6  X 8H&XLX* )-%BþàM66 "CýùGÿ-DÌ"'&'&'3327676533–=_s*XnG&XXÒEN)LDþ¼~7 %;Úü¬KIÿó@5#4'&'&#"#5#"'&'&'&5332767653632@X 7H' T=hG6  X 8F'U<))*+;:*(ŠK7J?þ?w3QJ - OM UDo@^g.///c_010+Lù3#¡~ÓùþE>ù+ÿ2"Ó52#4'&/#"##"'&'&53327676736qM5  X 5E' U=gG6 "X :I& T<.)(*þ¿ L55 "CþX+ ,hBþàJ97 FãþæXÿ/7/%"'!!#5#5336763274/"#"27276UP25þËVddQ#">…>8-Hf\$? !8)U "A¥:UU:;At;Pc;5 í‘0/Q`1`#2ÿô!47632"'&7327654'&'"2š(1jDEP7FmCCZ,*CA+,,*BA,*Ç9GE{šC FD…e0112f_2120*ÿ/oÖ'0847672732##5#'"/&'&533"'&327654#'35"Y}r=Ž*d2=-W( -'(N ;87%_ ãHbDnß—§@ ÐÐ !;Jn#$Fþ’i&0¯–E >Fÿø!Ó7275335"'&'&53ìŒVP£%'-(4VC’þãDR/%9`ýÈUZ¾5353Zddd¢eeþ^dd ¦& %"'727&AU*Z.&!'0Ë"L ÿGÿÄ3#53#GGGG¸FÂGÿOÿÄ 3#73#3#73#53#GGGG@FFÈFFFFÿœ•¼3>Wd üà€ÆÇ3#GGÇGF€Ç3#FGGÇGÿÿnÖ ”GÛ3#GGÛG:FX##5&76767'367676753#ü0 W9 &”fä/ W: &”fE > %TPÒþ» =$––QM Ò:6X%&'&'&'&'#533!5• "j‹‘^1 () JþL'6 'L  4= þÒLL±X%#73'&'&'&'&'&'4#B¯uÏQ > RWF"2X¬¬Ë§. L*R "þ…&X#!5!ÌWþ±ù ýô LL?:X#&'&'&/&'"'#5!3:W  &9 ùS2#! þWzþ†t7 L 2Bþwþ‰>•X33>WXý¨'(X##5!ÕWW ýô LL?;X#&'&'&/&'"'##!2;W  &9 £W@? Qzþ†t7 ýôX!)=:XD"5632#"'&'&'&'336767674767475&'&'&/&'&: -*&HL$"  #MHIM!$ W  2 +#    3  R+1AœG,!++!4@zþŒ8 "18:‘X3:WWXþé#&ÿ8ÚX#&'&'&/&'"'#53ÚW  &9 ²ºS2#! zý¾<7 L 2B9X-3#536767676767075&'&'&'&'#53㪤N    "j¤ª_7 ()  "5¬L   .Ž6 'L  4= œE/E%!í%#47676767675!53!”W.þ[W¥.Ð*aEx1+$%)V 5á•™<9 $$?<X )32&'&'&'#;þÙUT'3W) 9G‚X*?5 þÕ+3' þ@0:X##532!534'&/&#Ö:X:NçM5U-þÖÓ#$8 ýô L!A-;þ‰L+&%>ÿ8•X3>WÈ üà3FX)53&'&'&/&'4Fþí¼  4 IMUL(7L+.…=9XB!"'&'&'4'!2'6767674767475&'&'&/&'"'#;IM!(@B $"  #MH+#    &9 £  2 +!:9z"1AœG,!+L "18 þØ8$ÿÉX73767676?367ÍxYs?  W %AOnþÖCþ .#Xþ¢J)*LO9ÿ8 X)32#&'&'&/&'"'#3/&'&'&'9×@? #! W  &9 yB"(G$+X!2Bý¾<7 4 L$7 ?X93#53276767675&'&'&'"+3/&'&'4'532ôµ¯87 , ,;5 XB"(G%+µLB / $ #aL<Ž9* 4 L$: Ò5?œ&= !* ÿ8åX676767670753#3.  W !"&,WÄcT *“š70"þ/ê63X67676767670753!5!3<.   W !"«þ&Fþ²dU *“š70" þóL >ÿ8&X%#5367677!5!#,>7h þoè 0þÏW!L*!2Lþ§G( IuýŽr%ïX#&'&'&/&'"'#53ïW  &9 ÈÏT2#! zþ†t7 L 2B;ÑX:72;7676767453#&'&'&'&7336767676=3'— =$/R' 6!W^ @GRG?C-$Wc' W 3Rà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3#{X.6+532767676=#5!#&'&'&'&'&/  % AT2)<›0! W  &;  þÔ?+L,)LH2@þ†t8  87ø/?O_oŸ¯¿%2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&%2"'&547632"'&54763"327654'&'2#"'&547632#"'&54763"327654'&@"! "! $! $" Ý" ! " ! $! $" „#  #  " #! Í$! $! $! %! q " " " "" #! %Ä" "" "" #! %" !" !! # $ " " " "" #! %4c£Ò72#"'&5476k" ! Ò " "2ÿ¡ÿÿ2#"'&5476i" !  " "3d¢Ä/?O_72#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&j$ ! $ ! $! %! " ! " ! $! $" Ó " " " "" #! %ñ" "" "" #! %,ÿœp/?O_2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&d" ! " ! $! $" " " " " # $"  " " " "" #! %ñ " " " " "! %jŠq/?O_%2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&R"! "! $! $" ½" ! " ! $! $" p " " " "" #! % " " " "" #! %jÿ’Šq/?O_%2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&R"! "! $! $" ½" ! " ! $! $"  " " " "" #! %p " " " "" #! %jÿ“Šp/?O_%2#"'&547632#"'&54763"327654'&2#"'&547632#"'&54763"327654'&R"! "! $! $" ½" ! " ! $! $" p " " " "" #! %n " " " "" #! %Ta5Â/?O_72#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&þ"" "" # $! $ ! $ ! $ $! Ð # " # " " %ò " " " "" "! %Wÿ9p/?O_2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&"# "# $ $" $ ! $ ! " %! ‚ " " " "" $! %ò " " " " "! % $È/?O_oŸ¯¿Ã2"'&547632"'&54763"327654'&2#"'&547632#"'&54763"327654'&2#"'&547632#"'&54763"327654'&'2#"'&547632#"'&54763"327654'&7!5y#  #  " #! ¼" ! " ! $! $" K"! "! $! $" "! "! $! $" øýöÈ" !" !! # $" "" "" #! %ý« " " " "" #! %ð" "" "" #! %ª\\õ$ /32#"'&547632#"'&54763"327654'&7!5 $! $! $! $! øýöd " " " "" #! %¨\\ˆ±àm7'77°0Œ2æM~Y-ä$Ò/?O_cgw‡—›Ÿ¯¿ÏÓ×2"'&547632"'&54763"327654'&2#"'&5476%2#"'&54762#"'&5476#3!52#"'&5476%2#"'&54762#"'&5476#3!5"327654'&%"327654'&"327654'&#!!Ç#  #  " #! " " þÁ" ! " ! çeeÏýö¯" " þÁ" ! " ! çeeÏýö¯# $! þ§$! $" $! $" Îe3ýö ±" !" !! # $þÏ" " "." "þ4îÆ\\Œ" " "." "þ4îÆ\\Œ! #" $" #! %." #! %þ4îþ(\#ÿwŸz!##67676=474'&/&'3&3ŸÜ!,S9.U3 «N;O‡A8-*K.Z2%)DC7OÊ9t‚2##6?676'&'&'&'33‚½  S!U ŒÆ#)%#@.&6/"%@# ÿ¸«)5!5!5!ýžþÜ‚ZùXÿ¸ÿa""'&547'!5!73#""'&5'73Ý( tþm¦þûM ¯ d'f #ç! Z–-þ=Z# $} ÿ¸ÿa%"'&547'!537373#""'&5'73Ý( tþmÔb(˜þûM ¯ d'f #ç! Zšš–-þ=Z# $} kÿqÙ­#537!5!754'4ñyyèþ’('(—²;=S5M;Rh>6Ù<(6$+?&5%Õf?1G>Qh=0G=Í3!&<'4&9(±ÿV\s2'6767&'&5476; 0 : $Gs×s1…^*{5-4Dÿ¸O"!#'#'!53547O$JzþÐøÃÖppssZ½Ã\rÁÿ¸ÿ_ª '!5!73#ª¯_þ´þðJô.¦Dš¡Z–,þ>Z_ÿ¸ÿ_ª '!5!73ª¯_þ´þðJôš¡Z–,þ>ÿ¸À%'!5!5Àjþie£O`Z·ÁÿpÿSõ/?AQo2#"'&54762#"'&547632#"'&5476'2#"'&5476727654'&#"%35'###"'&'&54763Þ" ! U" ! Ñ"! U" ! þŸî/& +"/†£j¸[ƒ 'K E6 B.Dd> " "²" "" "Œ" "ýO5 %E+9'$K$·Á?ObD”,EX!V<"$-v@-aÿ(%Û#654#"%632×Z\@Dt€aþþE\I[Ø•WHO]qZU´;Rnÿ¸p˜)5!7pýHfþUJ³ZûCýÍkÿv…« )##5!5#…þ‘=S½ØOŸ^ŠÝXþ¯ùùkþ§“?ksµ'þ¿<žeýÈ$7ÿ¸ÿÿ±¨0A2#'+"'!5!&'476763264'&#";76'54'&#"676/S G$@F ªþÉ'"=8- )5w%'""Ué*(M+oe-5r&UUZ+aY7 :#Æ6'2_  ’"&"*N* 0N §ÿ2±¨%7H2#'+"''7&'&'&'&5476763264'&#";76'54'&#"676/S G$@F  (dHš47% "=8- )5w%'""Ué*(M+oe-5r& ?†2´,(".Y7 :#Æ6'2_  ’"&"*N* 0N ÿ¸¤%#"'&'!5%27732767¤kFP4$þ€&8,ÜA¼*&*:KK>R D1Z)m+þÀB#Bÿ¸@)5!'#"'&'&54?'032ýœ >%C8/ Å-w< FZ‘Jc*3þó¥ $7 ÿ¸@##"'!327654'&'H?Å) 8C%>  þ)FG ‡@3*cN& ‘Z31 $ þ“‚+!5!"'&'&'&547;635'#"'&'iþ)Œ IÓ]  +D< ¢i ¬8"7¸<Iþ“ZT| +_A[ ´Â>O] !7W ' ÿ¸&«)"'&'&'#53!5#&þÍ "ÎàŽFý AdGþ¹ïïkÙ`#53!5!754'4{{¼þ’('(—²;=Rý ZxSZSÿ¸…«!#"'!5!'#5!3…Í/þ\° ÈÁ  Ã;;Z÷ZY÷cÿökë%327676&'"#"'&54767kþ¯n*1?>((46U15[GˆÀJ*K 9& OIhg^þlŒ''7'77''7' &%Y(,$"5'=öd+jA!5ý þϽ77''7'77m &$Y(+#"5(>þjƒ+jA!5þ÷Oé 3#3#,####þÔs–ò–ý®à /'ÂK7Kõ½Íý{þü¸ //šK7KÍqÍ©ø!2#"'&5476'2#"'&5476À$! ˜"" þò¤ " "\# "ýà '7''7'7Œ8!8 8K K7þR®^_`‚]_ýgþü¸ 77'7'!9 8 8K K7ÿª^_`‚]_—ÿ• 3#'3#'r##–##ÜK–––âþöš //|KiK}@Kú[Ê 535#53#3©HH²IIþ¥L"< <"ýµÿDÒ 535#53#3% HH²IIþ.¼"< <"½ÿOv2#"'&5476%>"! þÏB " "C{2#"'&5476/537ù    ‹/ƒ++þ°•    U y!;9ý=ÿÍ2"'&54767#'7%y  s.ƒŒ++þØ-     w";8µvÙ2#"'&5476>"! þÏÙ" "ý(ÿfq#53%qbbþš]>vÙ2#"'&5476>"! þÏÙ" "ý(ÿOv2#"'&5476%>"! þÏB " "Cx!2#"'&547672#"'&5476@$! "! þÍV " "ª" "ýþ±w!2#"'&547672#"'&5476%?"# "" þÎà " "ª # "7Ú/12#"'&547632#"'&5476'2#"'&5476Þ" ! Ñ"! U"! þÍt" "" "Œ" "ýþÉÚ/147632#"'&747632#"'&2#"'&5476%§ $" "Ä $"","! þÎn! &  ! &  N " "ÉØ %ªþæ¾¾N,`ýÿHÚ%'º þâ¨RHfS§7Ô!#7777''7''7''7''7'²$"$$#" ï ; ; ;> ? ? @ @ ( D C C C B @ B A ¥ #.9GQ\jt‹”–533##'#7472"'&5472"'&274&#""'4632'#"'&547632'43#""'4632'#"'&547632'43#"4'"276'4'"27654'&#"36ÕV'SR'U•    r  *› r  *± … þòÌPO%QQQ   z  cz  cd  |,ýÿý0±'7#"'&'&5432327671///:%57  .E%ƒ--.d#6 F#ÿpÿÖ‚'7*333O333)ÿþ‹ÍD23275#53#'5'&'#"'&'&54323254'&#"'676367654#"'6ÉD7+&/01‡ûG-&9>&+R[>0._"<#23,!v/&%Í('.¦((þY.Ÿ 9!d 8* Z  = ")ÿþ5ÍH23275#5!#'#'5'&'#"'&'&54323254'&#"'676367654#"'6ÉD7+&/01‡¥E--&9>&+R[>0._"<#23,!v/&%Í('.¦((þY.yþY.Ÿ 9!d 8* Z  = "ÿ²ˆÍ77"'&5476;5#5!##"7632''&5432327654'&ž0%7cõˆd% <)'Qm"v6 )) .$$¸)/A((g6 ;' al", ÿ²ˆK7"'&5476;5#53&'47632&#"3##"7632''&5432327654'&ž0%7cõõ2--( !* &nd% <)'Qm"v6 )) .$$¸)/A(A78 1$E& 12(g6 ;' al",  ËÍ14'&+5!##"'&'&5432327654'&#"'67636?4#ÊËžA)G=&+Q]=/.B <#12/-H2(()4*&G:$e  8)!4 •ÍF4'&'&+5!!632'654#"#"'&'&5432327654'&#"'67636C6 Ì•þšD*3?;$ 8?9:, >&,R]=0.B =#226.H3 ((,1)-1$': F98):$e  7*!4ÿþ…Í>!65432327#"'&54767&'&''5'75&#"'6325!5!…þåT!5 mT"%)F/7`-ÖóG]? EDL þÃ…¥­'-    /1'& * 0Ì.‰h v5*! ‹(ÿ¸Í"'654/&=#5!##/32=#®0ðF*©D+ 3K"Þ6ó7J&  }$ý((Ù$ '×ü € ÿ¸ ,3##/32=#'654/&=#5!&+'32\MD+ 3K"Þ6ó7 0ðF*6T.8%23+GÍ(Ù$ '×ü € &  }$ý(†M0P)ÿþ5p]#"'&'&54323276723275#5!#'#'5'&'#"'&'&54323254'&#"'676367654#"'6*:%57  .E%ýÂD7+&/01‡¥E--&9>&+R[>0._"<#23,!v/&%M#6 F#›('.¦((þY.yþY.Ÿ 9!d 8* Z  = ")ÿþ5 R23275#5!&+'323#'#'5'&'#"'&'&54323254'&#"'676367654#"'6ÉD7+&/01‡1Q/8%22,B2ME--&9>&+R[>0._"<#23,!v/&%Í('.¦(†M0IZ(þY.yþY.Ÿ 9!d 8* Z  = ")ÿþ5âg23275#5!&'&'&547632&'&/"54323#'#'5'&'#"'&'&54323254'&#"'676367654#"'6ÉD7+&/01‡-29$ Ac! !((LE--&9>&+R[>0._"<#23,!v/&%Í('.¦(5 *fH 542Š(þY.yþY.Ÿ 9!d 8* Z  = "ÿþ[Í-:!67632'67654'&#"'5#"'&5476325!5!5&#"32[þî1/$* # ! !>-0D<(:R-þä[þÁ4@* ) P¥°+ ;)&5+  & '%8¼.q/%: ?“(ýH"- ÿþtÍ!<#'5'&'&'&7632676=#5!5&#"325#"'&'&76325!32t=-k[T_S žtj2Dba9>.=U-?#%G.þÄ! =*)q¥þY.;YMD&  Š(ò#5?E65'5&0!yŠ7!:$ÿþ®Í#'##"/&54;5#5!®F-•63y®¥þY.yå(8 œ(ÿþÞÍ2#'5#"'&547&'&547#5!5!"&#"3276ÞF-AY/0=2, 2ÞsÿA"C:&?FJ ¥þY.ƒ8":%% (ìÄ 6 58Í4'74'&#"'&5476;5!5!##"32#"'&54323276ü-..;5Da$1œþškË&1&G87K(Šu e~D&&$´- >2A((g>$"O “ {(ÿþ Í#'5#"'&547#5!#3275!5! F-AKD1%Xf-9CUþg ¥þY.z22%,((%;8Ò(GÍ<I##"547&'&547632&#"3273#"32767&'&547675!5!"654'G“5_UX %0 :)#.:8 6 KC()aT 401?þ|G·)&*-¥Y;TA:^&%/  >(7' J %'6T(œ 17ÿþ)Í%#'5##"'&'&76323254'&'7!5!5!)D-¶T14AF 9,(9%)>þH)¥þY.öK,1 8+.%&bþû¼‡}G u "(2$25.$–((¾?àÍ&4##"'&'&5476767654'&#!5!4#"3276à–%H*5?H: df  þüàsn]0+0?]¥+.L'9/, J( 2(þÇY 6#'-A Í0%4'&#"'&5476;5!5!##"32#"'&54323276–5Dc$1žþ— sÌ%(.I88J )u f~> p- >1A((g>#!M “ {%ßÍ$2##"&547632#"'&5476;5!5!4'&#"3276ßr¾W= :E#B dGJ%K…þÂßk% Q K¥†Z<6 )J-K DA^%"_(þ£+G%*ÿþþÍ#'##"'&=#5!5#32þE-}0.0%)þþãŠ- C¥þY.yÉ, $À(ñÉÑ ÿþ½Í#'5#"#&'&'&76;5!5!½F-³@}-P@ ¨þ¶½¥þY.õ?R}X2($> ](+ÿþ$Í&0#'5#"'&'67&'&5476323275#534#"76$F->auF E92(+DO$^%#H P\`ÓþÊKI?! ¥þY.ƒ2<E2!:3  AÈ(eE<'ÿΫÍ)7476;5!5!##"723&5476'#"'&*Q!bþæ«cyT 639,# DI TLSö?U((|/-!! , ps26+ÿþÍ/=#'5#"'&547&'&76323&#"3275#534'&#"3276E-,R¥þY.™0 / 5 )$ "„¹(“E ( ÿþÕÍ#'5##"/&54;5#5!5#ÕF-Ä/ (pÕsÄ¥þY.œ// ·(ß··ÿþÉÍ$#'5#"'&5654/#5!5#3276ÉF-.F[8&…! ÉsŸ+(*+'_+¥þY.…(3$00 (ç¿%/ !  ?Í#'&54323276=#5!?pJ‹"‡8 ¡?¥“K¢ C)‰(ÿÿ?Í7'7'4323276=#5!#'&ˆ333& ¡?pJ‹"‡82333Œ)‰((“K¢ Cÿþ+Í/#'5&#"'67&'&#"#"'&5476326325!5!+F-% 9)+: ^+ ¸7C<+; þH+¥þY.ã/0!*9N  reF ?.z(0Í!/:7"'&547632675!5!#'&'%4/#"3276'&#"327¼J,H$,]&QþN ) ?O!) <"[B èTl,B0='2@86r((s1!Q' $Q–5 'c<+6i+ 3ÿþÀÍ%#'5#"'&5476325!5!5&'&#"32ÀF-.B D0$E'*`.þ³Às& -8!<D¥þY.{& 2%,7@Š(ù- !=ÿóQÍ44#"7236%!#'#''&'&5432767&'&547#3e-:.3þÍQE-¯10/Gƒ) 7(4[A"e?f 4ª(þY.y"C:86ƒ (5' 03ÿþ”Í"#'5#"'&=#5!5#54/3276”F-A 1.$)”sÀº ¢(> ¥þY.†*"!®(Ê¢œ5 ˆ¢ÿþÍ%7276=#5!#'5#"''&5432%5#32… £F-6H,0"‰9  »4CÜ) ‰((þY.• +"¢ B)»ž*ÿ×®Í8##"632#"4327654#"&'&547&'&5476;5!5!®Yß!/J-$ bG+1tqMA  :œþÙ®¥h()#& "$ -- 2!% 6.:(& $-A(þîÿsÿTÿÙ'7¬333Z333-0pÍ'#"#"'&'&54323254'&'&5476;p½-T-"$:O2  ( ]-F-+«™%E,$1"'<  P)0;'$ÿûÿþ±Í#'#53±E-D¶¥þY.y(ÿúÿþ¢b47632&'&#"3#'#53& ?!%†w0]**INF-EC 2 zB &(þY.y(ÿ?ÿþ±~#'#53&'&#"#&5476323±E-DE 3$(Q!!$:Y: O¥þY.y(A,4 75@P,5þ}ÿO#"'7327654'&#"'632ar…pm7#  .6/,(a;lY  "$!ÿ)ÿE•47632#'&#"326;'&'&×-,/²0‘#)' $ 5  "P/ '”x"     ÿÿ~ÿó&'&'&54763"327 *Q-C!0V ) 0r (/ %  ÿý0p#"'&'&5432327670:%57  .E%M#6 F#þµÍÿº  #&+'32F&T.8%23+G͆M0PþÌÍÿÂæ#&'&''&547632&'&'&#"5432>*2.$ Ac!!()Í7 *fH 543ÿÉÿþäp#"'&'&543232767#'#53ä:%57  .E%E-D¶M#6 F#ÃþY.y(ÿ`ÿþ± #'#53&+'323±E-DBQ/8%22,B2M¥þY.y(†M0IZÿpÿþ±â&#'#53&'&'&547632&'&'&#"54323±E-D>29$ Ac!!((L¥þY.y(5 *fH 542ŠÿhÿO™ÿÿ #&'&+'3™$-=;+#QKc±4,*&d(DW(iw'7#"'&'&5432327672#"'&'#"'#"'&'&5432327654'&#"'676367654#"'632332?64#"327670--—-.%89  4'p8"$ +>/ CT2@&+R\>1/E">#112!y+"&%ND8 &I)8-H+r4+$ )0%%'W!5 1%Z48< &3 L :!c7*"5  = "'.)1\1yQ2% . ÿ”Íÿõs#7 ;&>d—¦”b¯k%#"'&547632'"327654'&¯1+2W$8(-]#ŽD 7A!õ>-(=&=, <.2< /K ­ÿ²ÁÍ*#"'254/7&'&54763274'&#"67¬+.²`D(;7&iV I4  )™`1 "= 7&(9iß#67ÿ½ÄÍ$2'#"'&=47632327654'&#"'6*M,v{ˆ (  7/ G<GÍ@)5`:¶"Ì201%!!…ÿÇÏÍ*%'&'&5476327654+'3254'&+'32ÏZ N!S:$51H‹¥'-‰ž=, B²H-] f @)B'E,(1#(+*/&»#"'&54?'774/3276¬O&D !5()%5ê ö½T#:7U9‘£8++  "2© ±³þÄ,4+ qÿÆäÃ!'#"'&'&7673254'&547632äX#3^. EK- $ÖH *2<!*BSD 6cÿÅûÍ5'"'&'&547&'&5476;#";#"3254'&5432û!S;‚A 1!2"ŸŽ"'¥ 9s0"$,uD '18(G'.Q & N&øÅ!+%#"'&543232767#"'&547632#4#"32øG(8qND3=lH!?%*R$.R"FCêr4…v##vd|E# +3 H#D! 5fÕÆ7327#"'&547’P"W<""E&$T82ú ?\81*3"þü ™ÿÈúÍ)#"5254/&5476324/#"3276ú#* Ì8D+)O$(!N¯+q‚8.1À5.6$4"(¤(L7 [((DW(iw'7#"'&'&5432327672#"'&'#"'#"'&'&5432327654'&#"'676367654#"'632332?64#"327670--—-.%89  4'p8"$ +>/ CT2@&+R\>1/E">#112!y+"&%ND8 &I)8-H+r4+$ )0%%'W!5 1%Z48< &3 L :!c7*"5  = "'.)1\1yQ2% . 2 476'&'767'&'&Z#" #" F&@9.@/4> Ö'  &  @W&7†5(%phþ(327654'&#"032760'&#"0'&'3&E"3&E"2*4*44vnf("hz¤/,/,$4$4€ ‚€6•%dþ #/"'&7632'"3276'&"'&7632'"3276'&ŒQ!IQ!I2 !3 !Q!IQ!I2 !3 J4+),4+),–'$'$þ„4+),4+),–'$'$ÿì”X%#''&'7676''&'676!'l(PxLa_NQ!CyNE@ .)!-938#0þ (X<ý䥘 ‡õþáL151eRQ=.&! R´L®<ÿì X-!''#''&'7676''&5476!'!53#Ð<')vMb_NQ!AyNG@ %.'"+84V  1þ (€(d(PJ–<ý䨜 ‡öþæN33/bWV?2!1¦(.L®<<<<ÿì64/&'36!!'&'&1'7676'&''&5476Ì|>ÉZj)‚u! þ>((þ ’d+(pã)(]x!%s$2D5/ _hoa*‘hXf0[<<þ˜hG)|c<+0# L 3 #2S3#ÿì=!!'#4/&'36'&7'7676'&''&5&766767®þ>(((|>ÉZj)‚u! $4)5F(b[0F6" 1+% /21C<2MX<R^92|PeW5E* d*"((€@Ë[l+„x"þ4ðF'G…K?ufžþÄ|PWt”I/ð4FÉ(àZ…1'\Ž¢8+X<ð.D ¢…^#(&)z&+DFð<9 $7.* vX#)!3'#'#'&'&7675&'&1&P(d<<(n# *&/003Pþ蟎YE0hë) 3m+%ÿÿ6[36'&'&76'&/6&767'&'&/7676'61M@SX#!%/   ?XL'4;<5;N *!?d^„ ^þ¶(Š(þü½‘=Sr.>O>$(4þHNu6È(<<þX*6763'#&/76'&'�&Œ) \L¾†”kP(dM•ŒB=,9 -&("®S''/n6rS<þ*f; P&?;#2#,5 þX$53#'&6'6'&'&547632rd(P5+! .Y2 ¶Š+Bœ†_&*:RóBLøeDU?RG'FŠ /(? Y# :  ÿìÿX 676'&'&'&''#'!!neXj=~7 5]n/`x%(ê)þoàþkFTJ6=I ŒqM3é<<ÿìÿ°'X.6761&'&'#'!!&'&1'76'&nIR'<%ÅKœ %()þG¾, 7/JhlF(nÖ.ƒZQ Äš@!OE53 <<49:J6 fDyJ<*'IÿìÿØŠX5#767'&&576765'&/5#'!!07&'&70'&@Z(4K,FMGl ^;A@ d"Œ(v(þÞBH2H %*"+ZÜ&3œ…\ $<\ 5:þö\9$$e,0Tð<<>djŠTHP<}¯/ÿìbX!3'#'!!5&'&1P(d<þR(Jþ¢š–T<3©<þ Fš<(È>}G‚;þÅUI xXI'&766'&767'&'&#"'&5?606'&'&767616764/ %'.%6/7 39%RY+,}  *69P<6S/. Ÿ9!3{HCR:1/6:/ ‚<£I`(H GúÜL H0(awa0!^˜u\V33c330b(4<l.&<!20<ÿìÿúX"!6767'&'&576765'5#'ô(þü\# I6'R\Uy  oJVK&(Q F¾(X<ð("™‚[$):QîGSþcAT6A, Fð<ÿìX!67676''&'&7676'#'ê)þ[R[e6/" 1E" [s %(X<þ/R]K 4#+ 9…€Z( 3é<êX"&'&76763153#'&6xD#$J 9qf(P<˜L*!2#  MNOS fn<ýä@s‹@$M$U*0$ ÿìÿþ0X '!6'&765'&/760(ýä(Â-X1?- .'"2*ASNZ3)qU]N<<þžßE&?2zmQVbàþË€a/(þX)203#6'&'&/7676'&#'&5476–]*" ŒA…4d(PU’™¾-=!.!('PXD75P>QÖ<ýäG{?n&-O"-WÿìëX!'!307677&767'n})þ*((þ™Í : .; ‹• <<EX)?6'&#"'4763253#''7&'&60x 2"˜A‡e(P=þòÜ6cB  *7ð* á‹ <ýä<TÒð*4L%C  %ÿìžX-&%&1'7&'&7#'!!032'&767&'šWþá¾o&NW(Š(ý²( z¾g[8<5;N *!?d¸þH^° n%:<<4 n?:1r.>O>$(4ÿìêX0!'!#4'&/%^ú?:þ¶(Ö(P]…¤^½‘=Sš<<ýäJkIÈÿìbX.'!'&'&'7676''&7676767(N(ƒUfmRC"NˆYQE;X?*+-0  3**) 0<<þVz œ€ÌþãL170]IGz43;0 /* /"J hZ ÿíêX-&/'&7676076'&'&'&'&767#'!0!šL†N*''7MP)Õ(þö0J;/þð -Eýä{@ <, 54 +  <<œ%A+&'š!2ÿìêX !04'&'&/7&'&7#'!^þò( z¾FŠ*Q‹22ýäAzGn%:<<ÿìêX#761&'&7#'!#'&765!@'”-ER(Ö(P<.:H,3Ñ,þñYb,,p%%6<<ýä<2A &+#7 )N1$)+ #ÿj­7#sRRKK44ÿÎÿÕ 7?2tRR sRR§K44§K44ÿìhX!#6'&76761#T(ª2M6( 4ï>!jŒX!jŒX<<<ýä<–†)7 4- ý€T(ª2M6( 4ï>!jŒX<+17#N6 '@ÿˆÈ'#3'#4'&#"'&52<((P#tlŠ>#P^Yil! _Yik |X"'&763227654/&'(_ŒiØe!,= h" IohD,FeR=ÉB1.'>,,]"+/.sTZRä P,3? 0x~f#*Yv>þ†˜n4.gX$0&767632#"'&76"3276'&'276'&#"I? ;-3M41 ! < :.7H53¡e%'EK&"^b#'HJ'"+'XO6)KFI/'VO6*IFI7;..06/-5>:-.26/-5ÿþ_X !&'&7&'&77'&'&767ᘠ09$ h%F(­]"D1"¡l=“ôT’I>#,Ds?92$2 6ç;&%­ ZSY!&766767'&'&57676''à9ME9)T_Uy nJUM&AiF*ð"-<œ†_&*:RóBLøeDU?RG'F^V'&7676'&'5&!­B.;QY! /+I6"$,!X=UK!-Q,þ5 2 ‡J5:'9´W!'&764?66767´,0[ Z„&X•_þ´±6[mÇZgfN2à É% þ´E|%#  }X$'6'&'&76'276'&/&(m€5W %7)55 .$"4•: lID`_i/%~N@-/<,3(n95LPd8ÿöôX 0'&'70!'!#4'&/%Æ?>+17Žú?:þ¶(Ö(P]…¤^…N6 '@V‘=Sš<<ýäJkIÈÿóñX0!'!#4'&/%0'&'eú?:þ¶(Ö(P]…¤^æ?>+17½‘=Sš<<ýäJkIÈþ¢N6 '@h[ 6'0'&'&#­i-(5n&,T(¿SV2‰'ÿìë#)6#3676'&'&7!'!54P Œ(d%–8E6$ 2?!\7)þò@4B ²Tâ<þ£35AQ )M&E<èrE ]h¤ 77670#­i-(5n&,d(¿SV2‰']h¤776706'&76'P(¬^* ( "h'2".*%  "  <(¼TX1ˆ'R0"&- **+bh¤%7276'&''&5476327676?'&'P( && 56JD (UEEFË.,4 / 652 (;6Z# dRdPX<Xýä<‘Y07677&767'&)fLØ574'&'#53676733##5##"547674'&'#"54~/ 2U#$ =+4&˜r2@˜ "1;4 .1 V(ú@l&9'h'/ A#L 9þ#ÓQ@B9HJ -N A+%:Aÿÿt&¹Øÿÿÿõ’»&ºÓ®ÿÿÿõ»&Ó»âÿÿÿaDÛ&Ô¼0ÿÿÿ DÛ&Ô½0ÿÿÿõäÑ&Ó¾ôÿÿØ &¿ÆÿðDÚ!*33#"!##"'&'&'&'#53627654'!!!676 ¨¨`6Ú9$Q!hQ$ +û: þè>þ†$ ÚC>&9^T.Bb( `,2LŸ(9ÄýY+*!® 7H0>3ÿÿæþ&Á*"27476326765!5!##&'#"'&732767&'&#"#H+8FQ! þ@*@B&_1$c.E4"9@;4 C ÈM(( {99vf'R€g)%; .2 #,##5#"'&'654'#53!535!322@-CZ^6'' V*rrþòTbPÝþ#\*A&':][+9T]±þ™}53TÿôZ !%5#"32!5!####"'&5476;(†//+$LþØZ2@€zZ=9?!a+ //+°99þ#Ýþ}f=9LU ¢.##5#"'#"'&'654'#533654'33273¢2@7`4(]R'>*>gA(N*.2D.;9rÝþ#D*<!;`O-9Cu[= .p‰frK- 1wÿó'1!!2#&'#"'&547632654'&#!5#5!&'&#"32þN,IL"FIWO/P"(s9@6 þ° ÀFPSVÝtCb7- !=0 )G F.30 ­9þL( 85ÿóö ##"'&5#4763!5!5!!3254öd)7]9,8HþböXþú ):…Ýþõ˜2^I[E8¯9þß-+E¨ÿô@'0;#!"3!2#"'&'&547&54763!5!5!4+3276%;5#"@2þ -@) ,nh<2  7*þ2@h^-1@þª0/-: Ý•  +@E$  :/#0D \9þ]@€& (€!Ü##5##67#&543235!5!Ü2@Ò@8` Òþ–ÜÝþ#×G :\8Í9.6!3276#''&5476323276'&'&#"#"/7&'#5!#Øþ¦%‰e&!F8‚ ^9/+++0+F  "I*3: :z'3>. )CÝ‹5ëG% <& ! + +@99MA"õ %#!"3!#37#"5"'&547&'&5#5!5!õ þ¹) =è¨@GãK$?>ò`þì&Ýš0' 9k9¢3"D > 9ša,5ÿôþ!#&# 327676;#"'&'676;5!5!þ-+þðg;4,%" 86<:LKI!ZJ· þXþÝÏU^/""<.044ZZ–9ÿô&#2#"'&547635#5!327654'&#"è>GMDBllBDMG>ôþLA74<88H/5M6)Ý{9?HL0220LH?9{9þŠ+&%&%C'0%ÿòü 3%&'&#"325!##"547632654'&"##"5432765S4\@qFþåü22D7±¸ceD  4‚LG;9µ99Œ'UF% XX= ' $%#)-.M)/ÿó*%#"'&5#476335!5!#!6324'&#"3276ÝP&”< 8@öþr2þÊ.aT,?7ML8R? {B[K8™99Òh%=,#" /(ÿý.*"'&'676327&'!5!#&/&#"327GŒjE-70)6&"þà.Ö Z2(35S;F  N99zTS4t#N+3Z990<" G)f$1 @'|d3 ÿúÔ.5!##"'&'76767654'&#"5432765Ô/ ON!4vD QqP&0!‚LG;Û;;e> 7KP4K#L# 5-.L). %5!32'!5!'#5!##5#"'&'654”þìTbPêþÑ_ 2@-CZ^6'¯i(,TáŒ2299þ#\*A&':][ÿôè#!3276;#"'&'#5476;35!5!èþÌ„*24 >0:£- 8%$ôþnèÝêÆ10F0$±$*G G±9 7327!'#5!##5#"'&'64jTbP$þÑ$i 2@-CZ^6'âT?IFAÐ99þ#z*A&':šÿþ +##5027654'&'37"'&547675#5! àb)?W,7,&L1-=961c6#A%fê Ýg<)ALQ#;#@?) ;72$;5"/LA%@g973273##5#"'&'64'#53jTbP$r2@-CZ^6'' V.âT?I9þ#z*A&':š+9ReDÿõê"0#!"67632#"'&'&5476;5!5!4#"3276êþêT=N!S'K%,†]&| ÖþlêDV< DBݯF:>? 0 Dl 5@r v9þP0 & ! ""##5#"'67&'&'#5!5!5#"32"2@9=‚nS6&(,"rþÁhÀt^- 'K 9Ýþ#@„V&@ Z9јl,È/; ÿ÷ô ?&#"3276327654'#"'&547632654'!5!##"'&'&76H.D>)@*þÛ(`6#C*We" Q!)^7þ~ô2.U.:zR6  „#,#!") ;J /N 99f>!L?Y(Rÿû3##5##&5476?&'#53 r2@à '75 H€  9þ#Óz#:?EH(ŸB9E’"Ž!&'&'654'#5!##5#%535w j$'46 Ž2@¥þï-%d1åQ+8_cI99þ#ïîSZPF &êµÿõ !##"'&5476;5!5!5#"3276 2='2SUQ6äþh rÎC;76@Ýþ©L*IEVG “9þ}~888+8ÿþÆ8A"'&54767&'#5!##'5327654'&'&'&'327!676îY8+1K#Ɔ#J1?7D671&C"956 3%;*'ÞþÐD#"82';->;12j99j11;N/)9*!$34 0  50!0%9ÝPN)N<ÿþÿúÆHQ72#"'&5476"'&54767&'#5!##'5327654'&'&'&'327!676ÕY8+1K#Ɔ#J1?7D671&C"956 3%;*'ÞþÐD#"82'< >;.=;12j99j11;N/)9*!$34 0  50!0%9ÝPN)N<ò&#!"3!#37#"'&'&'&5476;5!5!ò þ° & Fèi"@2ŠD)T$8"þþnòÝš ( 9W9C(<1>a9ÿú*!32#"'&5476##5##&5476?&'#5 þðà~ö2@à '75 HÝRÐ Ú9þ#Óz#:?EH(ŸB9ÿû!3##5##&5476?&'#5 þðàr2@à '75 HÝR 9þ#Óz#:?EH(ŸB9ÿôõ7325!5!##"'&'&5476;#"a9/<~þ}õ2¬K*1*':#484ÒF4+199þ½¦=:6I!9TÂr7#5Ânrrrœ##53|@<œÝþå99*»#54'&#"3###53547632*@% )<<@225!&>&(-' ,9þ#Ý9.<%3 &ÿ„®»###5354'&#"#5476323®2@<<% )@5!&>&2Ýþ#Ý9,-' =%2 %.þaÿaÿ–ÿ¤ #"'5327j`;:``:;`—;þbÿ ÿ”ÿ®#"'53#"'53l_?=W,hž_?=W,hR88_88þ~$ÿÖÑ &#"'&5476*žs& Gmn$k sþx ÿÐ &#"5432&'&"#'&547630gmP$Fa]9On!  Q_d @%8(*8  FIþd<ÿ¼ #&+"'3;2D4š_0–J<@†F<þ7 ÿ¼þ5"'&7453372#5254'&#"3öd:9 Ž\@   R(&9I)o$ #ÿ4ÿH2ÿè &##"543532SW"H@W¸M -$ÿú.##5#"'&'654'#53!535!322#"'&54762@-CZ^6'' V*rrþòTbPþïÝþ#\*A&':][+9T]±þ™}53T4 ÿþÿôZ !1%5#"32!5!####"'&5476;2#"'&5476(†//+$LþØZ2@€zZ=9?!þ÷a+ //+°99þ#Ýþ}f=9LU û ÿúÜ)##5##67#&543235!5!2#"'&5476Ü2@Ò@8` Òþ–Üç Ýþ#×G :\8Í9þ& Ô67&54327654'&#"#"543276765!5!##'#"'#0(>;B'2*7]m)># þ„Ô 1 OIHH2!LD@Z% $0 /9  ,.99P8 0JI1L: $Tÿõê"0@#!"67632#"'&'&5476;5!5!4#"32762#"'&5476êþêT=N!S'K%,†]&| ÖþlêDV< DBþ¥ݯF:>? 0 Dl 5@r v9þP0 & !  ÿò8" 47632#"'&%4'&#"3276ZNrv¨¨v€RHøJ?SbC7J?SbC7 €QG¢vv¢YOpbC:L@SbC:L@Ú$)!#"'&=#"'&5476324'&#"3276ÚBB 4I]8(L2?]8(/…?"K" ?"K")Sl'>,=W0 >,=þù@#{E 4E 4ÿúú%%%'#"'&543267654'&#"76¬u3[C'‚LvOA>LWos„YA]Yx )R9D$5)+5 FA) _-P8C+6,N2$8PL'3HBM DK ~4!#A9@$0N2)CM,9)4C)2NY'95ý> /5'ÿø 727653#5#"'&'654'3ÓA/@@&Y}I "B3µýê $E`;HMDVFG:ÿü½=2#'"3!!"'&547&'&54767&5476'"2#"&#"3R5OÄ-3þÞO$93 ¡!',56r8@ &f(H,&; (% 298%G 0`$>-Y;F5&"$&#0é !&547632#52767654'&#"r O/=h9% &¢yŸ›rr < )N "!!^-E.?!”K99A>fF$;! ÿü !;#"'&5#4763 þ„@HÆ..æ\LPY¾9¸FP;hVËYXÿüÙ(!3#"'&5#47633&547632&#"ijþŽ!:Q«.ÞSAH"KîWf(3 I=VA 4Š6+"9bM°THIeh"92þ>ÿeÏ#654'&#"#&547632·( " 2 &:B >" 0 & 0& ÿõä!(%#"/4767&'#5!##&32763'5!ä?/:`GgC N â,C-*t,O0$Ý^T.Bb( `,2LŸ(9ÀS0D<(?%C7H0>3þ‹+*!®ÿøÔÀ3JT]m#54#"&#"!##"'&'&'&'#5367632632"'&547632#"'&=%!36764'#3276%4'&#"3276Ô@9uC+2>+—7  I!*D=@ @+3(3 Yi6$ üÃI. ?)/S+`BB &@þ¼ û# +ñ6n7 þ-0 +0 O(c:J #9SG )7W"57[%:>3E39 TS"ÿö0»?#5'74'&'47632?37&5432#"'7327654'&s‹_çA·,04'1=P2 6_p8C $4-VJ)/# 0(5Bݸ†@TBh'R,:m, ½›1 ==" 759M G)*%$$/'ÿù'Å+2&#"3!##"'73274'&#'7&76766I -4T#®Rm(2p\H -1f' éLUÅE)! 8R] FEI)8J@@'G»"53#5#'&'&=6'&+73232=3ê]]X"/Q9$( 1^9 38Z9‚þEí)"0!"3uF8…31¨V''Å%!#3%2#"'&'7327676'&'&#"56']]þŸ€.¼F4 H'H  2.!'» T"-µ0+ $D  I &Ç-%03#5#"'&547&'&767632&"#;#"76«]](Tr<&G/ ',CW$$(m>ji>p9?,± þEZ!6#17#'4$ G -6C43!(ÿôÅ;2#"'&547627656'&'&'&5&7672&#"&#"'&'7ß# $  ÓG $X)3O(<0.'7SVLnf f,8UI/L"2n   #þÎ&!  .PL2=h%.5''#µ»&%#"'&'#7327676'&+732#"'76767µ':2g2 /˜0 ¨H!&4 a+4/`M7G& " F>99"W! (ÿþ'Á3A;#"327#"'47676#"'&767"'&5476;#"27654'&#"† < :/r4 „7'a DKs¾% H+(s=3%  3J# I 2 izU+r*6_FMb7%63!E, /I(ÿüTÇ47"'&5476327'&'&547676'&#"3276'¯E($#;`W‹@¡ 8B¨2*#M˜þEÕ 't  K ~B#(ÿô³Â'72767#"'&54765&'&#"763ö97 0*a1”i+*7%@" %WW086M<L$2P*#$S C0;1(ÿôË 374767&767672&#"#"'&27656'&'&'&(=/b!'5&":HE-[ ]-<¶!Û0  "(1 #C'!S  K8?e(m<%!   2 (ÿôÎÅ+%27656'&'&'&5&7672&#"&#"'&'7ÿI $Y(3O(7> <%J#^þE'»»$%3#5#&'&=6/#7323767276^]] A E- K( +  ¹þEo1!(’F&˜%(ÿ—Å63%2#"'#'&'&'7767676'&''7&767632&Û  ª)3`)3ƒsY/#H9A$*"Ü —D[L6DQD !K&.S in 7   &( .T9D> &XûÅ"7276=33#'&747632&'"æ8 \a` /G‡-F *")/=Ÿ2‰GG6$$W-Ck) ?is(.õ×+23#'&'&76354'&'&&'&5476G0#ZY+*F1  " D*Y5×1#,1I1+M3( ,AA8'%/DA…=$(l6Ä7"'&54354'&#"56323#…@R 0jZY1l5 Q07 I `WH'ÿ¯¼6'&1"7673#'#"'&5476;27654'&#"7676U:$. &5^:^] "54WDK V( ARH1 \PU8=6? C þEU 38R  )V' !'7§Ï5&#76767'&'&547637654'&#"#&547632ZX/%(6%bc_! 3U! ,&Q*; %D&'L_"  R(H !,,$7#!'ð½%7"'&547676&#"3276753#5#5ðZ<3E4D[ T.‚]]¬ K?Sc@/C N't I ÿ²þEÄE(RÀ)&#&'&547632&#36765476;#õ-@0 1_6'=&4, W5 A)©]a ¡~,V>O‡4@YE:”&þE'Ê»%#"'&547676&3276753#mHH'S#-()%* l'*]]r3d$.^&B  4Z öþE'Ê8!#3#&'&'&+'327676'&'&7'&'&547632]]‡)- kD1'€A")%  'F T"i4 »{*._G6"6   6 0KA''â» %'3276753#5#&'&576'&+73~¿, 3( ]]%BD2% &mΘ. 5ÃþE€ /$*”F'»(53#5##0;#"/#73276'&'&+532º]]s{¿& ;Ÿ" & {¢A" -ŽþEë ^ F)…F"*F4 %&ÿÙÛÌA%4'&#"3767#"'&'&767&54&'&#"'&3576KX/,AD5BhrBD9*C#?%5V" A)*!8#Ñ/BB*) L!9:_P.FB  5LD (ÿôϼ)%#"'&'73276/&'&'&'&76232#"΂!'UI.@+73r)$d/++_I'sP+4ˆt1@#/>"75 E,,F£»3#3£]]»E.—"#476'&$R!^X-@V0 PALH )þE»Š6D'$#KÿM£Ÿ3#4'&'&#&7632£^''#  IwOFD›U:* $2nXUWþPþáÿƒÿž27654"#'?6'&'7þ×@ :/!DCDS(/R7%(ä%/B9 21.þOþÎÿëÿ 476324'&'&765'&þO[!)jO-@)7F4;8 MF%ÐM O++-5E*4 #þ½þóÿó476;#"327#"'&þ½5(‡b/ b)4&7RJ12C&CL%C$()þ»ÿÀ™#'3@Pà|»Þþu»ÿ¿¨'7#'7µaVMýC ‚í•;ÿf£™#'3#3–Pà|Á]]»Þýg»ÿK£¨ '7#'7#3!aVMýC]] ‚í•;ýu»ÿöC¢It2#"'&5476'&'&'3767#"'&'77676'&'&#"#"'"7532?6%"'6#"'&'73276/&+73276'&Ç  é 4›f; \([cúB*=H/ $6*# !#,L  % B&CC%'ý´.4 T1¤8g$,^I/ Q 9FR SR1&¢  9 ])"RMþ~}?*H % 5R%-)X0Cw6998 DlZ1_ C+/W>% H<& '!šš7476#"'&276'&'&'B5EY6(54NO67½0+  + ÜX9-E3CM7776 <<6)/A;(ÿï¦Ç,2767'&='&'&7676"7676=4'&ÂW*$ X.*"  1 #(I,% "Ç1$þù  S8z  /L4#*F,+&  M&ÿùŒÅ#2327#"'&5&5632654'&#"'6¸g>/¡,"0:+X$qG;-S6"26EÅ8+<‚##KD"$HDLC1B'ÿöÈ0%#"'7767656'&707676'&#"'6M-;ZY-C:O_)0 C+#/$R.k+  S‚M':?07 9G(  C:"$ ÿù¬Å)"'&767&'&/776'&'&#32áR-g5.,:(#€A†#:$  Y$78$0MK"^!r?o*5,H*Ž R7'ÿÿ¹»'!#'&='&'&576'&+73232753;¹Q%2&K&  B( ' ,\ ^3$pF&ƒ# çþ¤ 'ÿj‘Å72&'&327'&/2765&/&'&76767&'&5476ÚWH8 …\/ /ˆq# L:9L/'I}ÅB  DR   (B]? $-6. ^ 'ÿÿ»Å$277676'"'&767623'&'&'&76776/&36t0b· &EU&r'6%  A ö+ :!š/ A•, "E%1á3^ 8" .j-)/ (ÿù‚À"'&54?327âa6#8ä>é225>7=(8K,³B¶(/DR'ÿù£¸%#5347632&#"727#"'&£ÆÆþ„PBX&!B. 9)4'(fC7¼D$eA6 I 6&0M/"NL@ÿœOR#"'&5476324'&#"3276R+4 ,'%  #©1,4 '# ! ÿØÿöÑ#+:7#"'&54767&'&5476324'&#"64/3276Ñ="I"(! *6 (MM&.*1 * L&& &1 4wR!:%/:3,6,D&>$FM1>: .'. ?ô-4)*8$=0ÿýÊG727653#5#"'&5476767654/"#5&'&#""'&547632632áQ;/..&T%"d:)b+3$" - & A /+06 .¤-F*(1'2`ýîQ2 ;*:R2 )0GB& $ )1959(S 57 ÿý5K!#327653#5#"'&5476767654/"#5&'&#""'&5476326324+-þ¬Q;/..&T%"d:)b+3$" - & A /+06 .¤-F*þ1'2`ýîQ2 ;*:R2 )0GB& $ )1959(S 57 ÿýÿü<L\#'7654'&#"76327632'&/#"'&=7&5476324'&#"3276'4'&#"3276ö+K8K%R=RX51(<3*UOGPjOZ¨  " } !  " _;usE0*m@/84I."#M^8!$:bdB8@Iþê= <.A ,"B>> ÿýÿø(B"'&567&547632#'67654'&#"73276=4'&''7ÌY03TLXmLZ+K8L% T;RS>>B1 4$E!B€"",22@(45TbB:@K†NFtw%Hw?,56E"A2%@"2 C € %5C*,ÿýÿ¥ö<L%#'3254'&'654'&#"632#"'&547&54763227654'&#"ö2 47F O$ +::KL46 &4A(: (@( PRCY_FH þÎ+ %- '†8'v ?+%OK1177D(#7#*J&6#+&0QgC8?>_#+p+- *4 ÿíí!#3#"'&547676767í?þ?C3  *J3 5zþ²—  #" !:ÿÿÿûªE%#"'&5473327654'&#"'76327654'&'&#"&547632ªM.;»- P:"¨ g3#$#$&K $ /1";"L–V+¶5BzpNEDéDB *%9/  !8!8!'*"& $ÿþè<L%"#5#"'&=7'&547632'674'&'&#"7632632#5&27654'&#"(-" GQBXhIN+I3A N98,,5. ¹' *# é! ´5K %-'gB7FIo ^>+33A0)¾°4•4A +4ÿþÿûÑ8H!##"'&5477632#"'&547&547632232767534'&#"3276Ñ.86K6 V!$G$1!(G(USBX- '( .À,1 .> ‚B743`,:(A+9#,[kB5L 1 '?þq5*;; ÿþÿûÏ,<!#4'&#"67632#"'&547&547632534/#"3276Ï-I6HR4&,G$1!(H% PA@^;5>-Á-- (4t$1$A1=-:(A+=Kþq:)6 3ÿøÍB!#5#"'&'#"'&54?&54763253276=332?&'&#"367Í-"' 9%U_;QU]/þä0#" =Ga7%+$a$ "-!+) mt9#IBþ! QP$%%$" +@*:(#%BQ(ÿþÿÿ -='674'&#"67632#"'&5&'&5476324'&#"3276  0)2?kL>A8?C%8 '@',A[PUqMO¿', '- +$:/GG>N44DP- <6 (D%3 '<[`E;MKþû. ', 'ÿÿÿööK747632#5&#"#"'&547'&'&547632'674'&#"63'"32767&º8:%.$, H># *PCYoœ 1 I>SY8*#0 '&%'ž= åÃ" (<<%+*-fC9–l0 "\>5A1@* #.19%ÿýÿûè?CS4'#"'&=7"7632'#"'&547&547632"32764'&#"3276¼!R 6!)O$ !$C'uv#%G(U^=S',4 ®+/ ,7Å&*D A(@!) j% ,7")2.19#,\q9& (0 -þÖ6)95ÿýÿÿÏ&6253#54'&#"672#"'&547&54764'&#"3276ésE..I0>Z9)d=A&6 'L"tUD–'- &/ A?þí]I)4%4I27 (C%>' -:e]4*þk- )- (ÿø×#"'&547632327654'&#"×DCfkE9@DenE:þY?2H]8)?4K^5& jUT^OflOS\LfmC6V?QgD9W>ÿþÞ87"'&547&'&547632'7654'&#"67676732753#5ÃE!F M@TwK=- 99[H71 `':!--%;$D dB8SD_H)&T==;3A# .D* A€þñC%Ù5253#5#"'&54747&'&54763276754'&#"6&èoU-/5DT73E X>:#*=7+ D7GT71$%(" YRýîL %0,9 =h:(þƒ:"." ×%/%2.?5 "ÿýs'7T25367632#"'#5#"'&547&'&5476"327654'&3276754'&#"63&ãoU.# 2*-0;N T73 F V>!  þQ:#*=7-D7FT72$%(! YR( 2 5"*þ›LC0,9?f:*0& ,%þ³:".&×%/%2-@5 " ÿø&%A253#5#"'&547"'&5476?&54763276754'&#"6;&4kY.05DT73\($ $f:X>:#*=7+ D7GU34$%! YRýîL %0,98 ' +<Vh:(þƒ:"." ×%/%0.A5 "ÿüù+;"632#"'&=7&547632#'654'&27654'&#"ìS8- &4A(9!)@( QQDXhIUDI8LN^3j+ (- %ê?3@(#7#*G'6#+&0QfC9?I‡FWqvVE†9þ?+2 *1 ÿÿ4B#'67654'&#"7632672#5&#"#5&'&'&#"#5"'&'&54763247I9?fÜ )(83  3  0#jC\ŠL@ s /(%ZBJ¹!  ) Ÿ£ ¥§ £œ;=&`Ro'-+ÿûö@"67632672#54'&#"#5&/&#"#5&547632'654'&îf6$! '%83  3   1Y[?ZjON.?>êO6I/$ ) Ÿ£ ¥§£†;d‚C/GFi,0 2P==ÿýÿðê8H!#&#"/"3632#"'&5?&5476;47632534'&#"3276ê-Qe+ *A‚B $)8B'8!)F' dO4!,MG-À'. '. sw"&!%:3) &8#*F&7")RXK)?Vþa0 +1 -ÿýÿýÕ ,9253#5#"'&54767&547654'&#"'32732?'ãoU.. FON0!WOBG7C7_‡$&>!N=-‘s#YRýîS +4#.!$!NdC7þ¢¸%/%† /3% ~1 03ŒLÿþ²!!#%7&/4763253&#"32?²/þ–nJ@TN4//6nK437 #SÉeX`d81, !Tþ9ƒ0275 :!—ÿôÀ>"6767;2753#5'%7&'&'&=&5&'&547632'654'&ÓS.0>+,+'7Gþžx! *N:JjE>, F2ê9&3  !-#7'pê@4+&5_  :[9+F@XF4V4%A7#3@+-þ&Aÿ¹®&'&#"'67632G =PN: !LVeB`7* "B- ÿÝ€3#'7€.]£Ì>"kþßþ5†ÿ#*#"'&'#"'&547632532767&'&#"32†')<*;@ ,!3+FÑ(:3þ£%912Ki-  1ÿ,þ=Ïÿ%476353'"3276532?#"'#"'&Ô0!+*%& 4(A-;& -(#@"þ£3<"!4':<.þLÿÿ8ÿâ!3674/"?2#"'&54767"þv)J! 7MC"*%&(%#''?-#2#).ÿúÿ÷R*%#"'&547632&#"7324'&#3276R0#-l=/P4MF&'@E+/>`CD1==?1 ƒ?,!gNf’G./ &K6>@87D6'(Ú 4ÿÇôHX2##'327654'67654'&'"7654'&#"632#"'&=7&547627654'&#"îlF= !# 54X#! 93I5BL46 &4A(9!)@( QQD2+ (- %G=X**%1P„# * T4%77D(#7#*G'6#+&0QfC9þ+2 *1 ÿûµ#"'&5476324'&#"3276µ>>XU><<>UV??"56HE3421II55sPPQPrpNMMNp[AA?@^_CDDCÿìe/.47632#"'&'&'&'&'&%4'&#"3276H*7P1"<)7<1(5]"?< G  4 ? 2";"e0<)6T2#,&%4 ÿô/4!#4'&#"#&'&#"3274'7#"'&547632632.,-- ,;!0%% F%TC'6?-.CT' ·(!þD¼ "E(-v%(51 rw7 /7=-ÿ÷ú3"2#"'&5476?&'&'76767674'&'3276ú-m)8//EW/: "? 4M‚[C Ie'84!C ^S/>>L,-C+9B< U] A,hþkEG #87A 8ÿù -/;G%&/#"'&54767&'&'7'&547632'4'&#"64'3276 11! ="+N'-WS #Bd:%.H(0 &`+ Š14 >u3Cu-J¢"3.N&<",20J  U!%&H*:$,=, "# þ<.H.$ÀA44E8 @Þ89#52767654'&#"#"'&'7327654'&'&547632Þ¸Jx9+6(/8 68 $:/ '#)+ 7 !B$,c6$w­u. 1NOoE0#$ 5) %C#K20ÿøå51@476325276767654'&#"7632#"'&4/"32760F?QfC6†  27654'&#"72#"'&5476ê7 /: 4D/9+2E/#9+F0= 2Bø:!"E.#:*2E0#ÿþTÚ />O_327654'&#"327654'&#""'&5476322#"'&54647632#"'&4'&#"3276T68 *<þ÷6</ApD/#-.;=\0.ý²<,..-;<..\¯9*4D/.-;;..ý/= 2: BD1+3 þID5? 8­8*4=-/\=:..//-=;-..-;=\G/":!#;-..-þŽ< 4@ 1 ÿ`Áâ G"327654'&!32764763233#5##"'&543!654/&#"#"'&Û<# '" ÂýŸkMT®hþÍP5CmD5‡55 <‡WanoˆNm;*12 >Q{B*& ,þËG+aQ.YF^20Tý‰æn6#2=d1-:S> 5OQþôsâ d327654#"!3276"'&54;#3254/&#"#5##"'&543!654/&#"#"'&54763233632˜  &6   ýŸkMT¬f¿Æ2<ÂÍ Ãø+7ž<‡WanoˆNm;*193#G F;FmD5…7!D"3 & >$þG+]þÉ?777“1 ˜æn6#2=d1-:S> 5C"@#K-&YF^20TþR<'Âÿ°þï[ÜZdq4'&#"3276676767&547632#4'&#"67632654'&##"'&547632#"'#"'&&#"676327654327&Ž"1/ 2þ#( ?Cƒ¹üb60–Sw¨ml8RF!*(3T,_Ki??AƒT2$>[9#LX?:{}T&!9b+&+ *LAÿþ…â)2#"'&5476!2#"'&5476###!#Å  D  p=þ<uþ  #   # þö¨þXä< ÿþâ0<"5476;27654'&#"2#"'&547632+"3!"327654s940'K",6)55@ I=Td<.C=Ns66 ý`& /# T9*"'\$6=1Y+%E5GK417k# /! 0ÿþœâ-^jt676;####54'&#"632"'&547632!"5476;27654'&#"2#"'&547632+"3'27654#"3254#"6 2ò‘7%Y7;&!(.?9 5%15P\-kûÝs9:.#K",6)55@ I=U_=1Jþ²'#+7 .ÿ=ËÝ.%#7#"632#"'&54763!#4'&#"3276ŒC“ÏY;.,_]'2+3f<-UGb¿´à'3!2B ÇÓA3BAC",E/(T@SrH>=þï'#+7 . þôÝiy%4'&#"#54'&#"632#"'&547632632#!"3276=3327654/4763#"'&'#"'&54763!276%"327654'&â3)6J(7<-9C)J&>$+@("Q=R33o`;.T5Lþ¨_*<%*L9079&,A(+L5B^8 8s7!g5DRR.ý´8/1*ðN:.B)3—‘N4() >#,E%9.5m?/bbUBV„@(0 :"4+7)=(/%! 58Q0"=]D(9a)I/†0 :- 7 þïôâaq2#"'&547;#"#"'&547632#&#"32767"'&547632327654'&#"632#"5476"327654'&}úV'<(8O  12 (BB!./N|;;< \C!15-+?*) I §;LZE0(N 2 '˜{gJ0 *1"âˆ>Wc8&7:B'6,D ,UC' K4L G*-?345+1h «1E4NA">'ÇNBþÝ",& $  þïôâw727654'&#"27654'&#"2#"'&547;#"#"547632676767"'&547632327654'&#"632#"5476–;)3"r;!1ªúV'<(8O  12 (BB!./NŸ5!@ #.15-+?*) I §;LZE0(N 2 '˜{g;) *& $ þó<..¢ˆ>Wc8&7:B'6,D ,„1/4 &L G*-?345+1h «1E4NA">'ÇNB þïÈâ-7™©%676;####4'&#"632"'&5476323254#"2#"'&547;#"#"'&547632#&#"32767"'&547632327654'&#"632#"5476"327654'&b 2ò‘7%Y7;&!(.?9 5%15P\-þö' 3;2þ*úV'<(8O  12 (BB!./N|;;< \C!15-+?*) I §;LZE0(N 2 '˜{gJ0 *1"ª87þseþà D"-1 D <*+T@GA ¬( /8¦ˆ>Wc8&7:B'6,D ,UC' K4L G*-?345+1h «1E4NA">'ÇNBþÝ",& $ ÿþyâ735"32="'&5476;5!#32#"'5327654+´¢Ù<,+ww_>2&®Ÿn@&>'0 $#C`VP)¬‹‹Â&1&sBì?2E7"Á6‹='.E)=+[[W&ÿþ³â#!#63233!536765&'&#"###¢‘",G/!7°6þ5…:/,7¤6â6…5&.[*­þ7@. "\)þRÿþsâ!%"'&5476;5!#3#75#"32#3ß_>2'®ŸççP)CÙ$ <,+w¢¢?2E; Á6‹7[W&ªB+ 1&w‹ þôÝ€327654'&#"4'&#"3276"'&547632632!"32?632#"'&'47#"'&54763!27654'&#"#54'&#"632T- 2(.þ’,701P^ Q=R33o`;.h#)!þ¨_*?#)%P•PYI'9=!ÆL;U;1g5DRR.3)6J(7<-9C)J&>$ˆ7 $ -# ^3- 3(nS )m?/bbUBVœ70 >!3`49!*?" 7!"1:/?a)I/=N:.B)3—‘N4() >#,E%þï¦ÝP%327654'&#"%632#"'&54?2327654'&#"##"632#"'&54763!#2? '2!¢(8b+‘z¯ÁŽ•N &C‰‚“h|+#.&=ÍZ;.2Z]'8'2e<.LLh¿µ7 -'#*,!X/=¤XJw~¾Æam£›qk@L‰5)1Œ¢A3BAD!,K0!S@TiHG=ÿþÓâ3!!6‰ýAâþS7ÿþ"äIXdp26763!###"#"'&547&#"#"'&547&#"632#"'&547632676"3254'&327654''327654¨tA<@:œ‰J' *0R+P'T.(ka‡]LAR þ,"0_+.'!.`aø`)*!â)#6þR®R‰b8'L0<ŒRR‰b8K1+'zÿäþôgâ7;G"'&5476;5!#32+"1#4'476;27654'&'"+35##"325ß_>2'®Ÿ+`1q%.òB4:0ëš/E+P)_¢¢¢Ù$ ?'-w?2E; Á6‹O1A™<91Z a$/h [W&#‹Â+ :#sÿèþôâ)!#632#"#'&76;27654'&#"###³'!R(W=$].^ f (Q('¼®þRÿþÑç3?N#"'&547&#"632#"'&5476326763!###"327654254'&#"6d9 &L,^5>‰J' *0R+P'T.(ldˆYK2O ;Ÿ<`6\`)*!þM_+,"0šR‰b8K1+'zþö`0#;ÿþ'â3!3!6¨7ýëâþS­þÿþ…â3347632#!%4'&#"32766ÍY `D=D*þB50EC °4 âþS._cXf~/¿bID"&þåD ÿûƒâ327673!3!5#"56%7&457þ`?Uâþ„.5@þS­þ7'K ÿ1’â !#57## ˆÇ‹6â6þXÓBœþRÿýþô8â8#"#'&76;27654#"#4'&#"#47632676325ŸH7?/°n;*‘,7+# 67)D)1€-Q‰^p ÿþ4â=M"632#"'&5476321327654#52#"'&74576'&'&"327654'&F?=3JU,C)3S1/HGm^KM-#`+°æG6Pa) 9ˆ?5B (¬=TnQPHK\!O!S-;¼6òwF5A/<73.;¶1: /3! ÿþ@â/?!###"#4'&#"632#"'&5476326764'&#"3276<7C3 7wVVFJb€;­þ1Q$)Z:.¶2? 1=  ÿ1>â(m%327654+%"327654'&%"37674/&!"632#"'&54763237"'&54763232+#7!567654'&þÏ*bsýt: 1< 0.,? ),þ#N?--'Q+B%/e-OOydOQNë@K0 +*242%P<"M ÍÍ1Q$)Z:. ÿþüIY2327654'52#"547676'&#"#4'&#"632#"'&547632676327654'&#"\c&M@+ ‹`8*C3L…*'A 7P+4F?=3JU,C)3S1/HGmlC :þ"5B (?âQ)6*H‹Q<@·7\EW„L:¸F J";þÅ/J"=TnQP0. þ­: /3!1þôîâ]m"632#"'&54763234763267632#!"#'&763!27654#"#4/&#"!567654'&"327654'&'N?--'Q+B%/d-PQvdOQNä7)U$ 3€.-‘+7+ # þwSG8»: 1< 0¬8(1C)4S(U.>wVVFJb€;Q*H3Œ?R‰^p4%-^ hLgí-þ´L6 /þ´1Q$)Z:.¶2? 1=  ÿþŒâ !#### ‚Š7‹6â6þR®þRþÿþL4'&#"#&547632X#.P1!%CZ9L™1 7/7%1441! NW³$ 82(Ñìâ !!5#!35äþ÷ÛŸâþïÛ¤¤ ÿþ' %547632#4'&#"67632#"'&%"327654'& ZM|®5 7X,=w@50 F!)b A$-C, 9 : *'{Ân^‰,$*ýø ~2va€thS"V (O&•a5H,< ÿþa<L"327654'&&547632#"'&547632#"'&547"7"327654'&½-7> .|8?*4A4)^>P‘nlhh§iA1L!L+9UPOVÙ4 2B -µ+<., ý†8DN-8,2e5"uu“§pq=.B\& >'1E/le^eà1 9 2-#ÿþœå8FR"632#"'&547632632'67654'&#"#"'&547&"3254'&327654'c‚J-(1Q,P']/lb‡_GIFpJF`7GCBW'$d:'6L+`7æ? 0a-Ö). b_¬@'7A'2c! O1AVO,)YSs}H<\V9;R‰d8%K2;ŒR¼4; `21M*?)(sGQ ÿþ¬ /?!####47632#4'&#"67632#"'&%"327654'&*‚Š7‹6üâZM|®5 7X,=w@50 F!)b A$-C, 9 : *'â6þR®þR}Ân^‰,$*ýø ~2va€thS"V (O&•a5H,< ÿþ¬<LV"327654'&&547632#"'&547632#"'&547"7"327654'&%!####½-7> .|8?*4A4)^>P‘nlhh§iA1L!L+9UPOVÙ4 2B -O‚Š7‹6µ+<., ý†8DN-8,2e5"uu“§pq=.B\& >'1E/le^eà1 9 2-#Ç6þR®þR ÿþ` 0@fv!###"#4'&#"632#"'&5476326764'&#"327647632#4'&#"67632#"'&%"327654'&\7C3 72'®Ÿÿ<þÅP)¨B+ 1&w‹þÝ?2E; Á6‹Áø[W&þï4â2<%4'&/&#"567632#"'&/&7676323276####þ, C)5b.{q‘¯zz6%; ie˜ydoZ‹7Œ5/O7 KC$c8I]Vjl¬ ‚i5 >t:3¡WTDM&6þR®þRäÿþ;â)-%3#'3#"'&5476;5!#!!'32=#"%#3Ú<<È<<þÍ_>2(®Ÿ¯þQN)É:,-wÙ$  ¢¢þþþþ?2E)!#Á6‹7[V&ª1&sB+ ø‹ÿþkÝ,!###"632#"'&547627654'&#" _T<ÏY;.,_]'2+3f<-UG)A %3!2Ý=þ^¢A3BAC",E/(T@SrH>þ[.&"*8 ÿûËØ25!####&'&#"#476OC3ðnNäP')N Ø* B9þ\¤þ\V4 þq¤-ÿþ'Ç !/%#"547632'3254+"";254#2#"'&5476'I$‡F$\! ½g&&g ''g4]! ŠD)GbB dA 4½-)*,­*++*;6d)!B ÿþYÇ7"3#53&547632#"'&547632'654#"327654Ó$ñ‘6"Q#hNkQR..= Hb.=u*! *2-— :"."#9'0A)•=Bfo>7+  e',Ó +O ÿþ5Ç<J47632632#4'#"'&54763267654#"#54'&#"&'&32767&'&;$+Y/:PQ$0;U_^4+€#*+>5! T6 CO E3=* €92= r0&"c322U,8*?J 61"&UGq #8) Î# 4 ÿþãŽLU"!4'&27654#"72#654'##"'&'#534767#5!27654'73&54762765!C, 3+K!E4;Y(2V RZG4C‹1 = g684 xX8!<þÂ>#þÿBA"7) €)88HÈW#)$+L \1c9+s%/:/G 8;#7J[#@P'.Eþ}6!*S ÿþPÍM47632327654'&'7#"'&5474#"#"'&547632'654#"327654'&…`)5À pp %G7 çu+z~ Q2CrIH6#1ˆ ;H.24Ye !o'£hwR(A!::#`&%þÿZ(6&#€V)$d1OOra5#V! (;Z=@Q" ÿþšÈv%27654'47632#"'&54763"3276'&'&#"#"547654'"#"'&547632'654"3254'&5476UZl8KyD2c (` F% 6- \ 2Ec'ޏ |V  Ø]>@+&9B+4 Œ«€ 98R’$ DE$&}2WA\œ+ ?M 3" ! ž5',=&°¦(3 f9 )*®PMs\1,*! /d×n$)C,,b ? xÿý#ø,727653723654'&'&'7'&'#"54767"›2 C!&.,+4$º;!oEŠ?/D+ 4?9AJI ?Œà^"B/ŽA!@ Hÿþ&>"'&53327#"'&'#"'&547&#"327653327654'&'M D4,'k,="G,*^M&y 12 CX/ ()0 qI(5+H€14 c%$F=#.Q"G &1kH+CEÿþ#Ç>"#4'&#"&547632632#"'#"54763"32765332=4Š- 40E;C!&L<"XH'A i!1WŠJ*V2 CXC## +*3 @@<$.­c @@ŽP9 H1ftVqÿûÿþ/Ç;"'&54767654#"&5476323253327654'7#"'§_ (I(3H45 #^ (K(/XC: 4##C7$i!1L%,(<;- *,77%7%0 VI ! 98U&@@ÿûÿþ1—I"&547674'&5473253327654'7"'#"'&54767674ƒ14$N(K((E(1XC85  #5Bi!(`P&&A '  *,* 2;+A$(7(41VB$8Eb @@?"-)&4 ;ÿûÿþkp"[+53254+5!2"53254+"'&'#"'&54?654#"&54763232533254'7*»» Å›€/ 0&)zF*NŠ˜šP (`U$(L&3N/5 #^ (K(VXC8FD&%$+!1H[/p7gkýÆ& @B!+*%; ;$%,77%7%HVB9%1JD$&ÿêŸË1%4'&#"23676'4'&+5!#3##"'&54767#5323-2 BAe¬(4¤pF"+QE+'" ~š-/ 'R/ù ?<89(I0+:-)0K 9ÿþðÀ;C23254'&'#53#"'#"'&547632654/&#"&57676327&#"W-*s(ˆCO6<])7yL/\H,'-+CFE 'EE"&ˆWF13DW½K.>Z4:‡UQ1EMi„.F/"&+!JF' .%þ¥++*ÿþïÌ%#654'&#"#&547#5!ï#E#<3>>1<$E#ffDSJŒY58VrC::Cr2\2\f=[RÿqÌ M2#"'&54#73!5!#"'&'#"'#"'&54767"32765332765'573275"! TE#‰ýZ¦[2$'D 6'5V$?IM'SN22 EV,r7 BV   (þr¬=’8) 5\9(99=#.E":F(1f=i26ÿüÿþrþLZ2#6/"3276533254'7#"'#"'&54?654'&#"&54763262#"'476ÇV+ N<'$2(/O(`KK4K0>(g4AWh%-S-( W7@).W/<7 $ þ=6(()="!Q>0 ?!"?<X&77Q",/'=$)5 1 /1JJ  3ÿûÿþSÈC732533254+535#533##"'#"'&74?654#"&547632`1XCVEM=WW>]VL"/i$.W7),(L&3M 25 #^ (K(Œ1VVHW:r9$‡:,F+ @@')>0$8!;)  ',74(9 ÿþ?ÇK27653#"'3253327654'7#"'#"'&54?654#"&547632qN G=&%-%;&A!XVE4- #*8%n3V[!&F%*A><$'4, *q&4+,&7 8V> F4M#FFI'1#6#1  +,& ÿöCÓ x%2767&'&2#"'&54764'&#"#4'&'#"'&547632654/"#5&"#&5476326763247632'6 -#Ci?¹ S$8$D4E HeT2-€#*!-64+6 CPG"3EC 'g! <>) 1'*T-&*3> (,9C7,Y[*:  9"&U-UF  .*)(K< .$;+#;(*&55B<Dr^476;#&#"32'654'&#"327653327654#5327654/&+532'"'&'#"'&547&)#P 1%C : )< @+1 b"$)  H%FL C. 5MJ+PA.E+&2# ,3QL!(% +—5,;E:"+;1.9hy # 6J2A•D8ÿý±Ê&"327654'&%3'&547#47632#"åP'M#d 7#þñôuC=;\ÅM`¶))*Q")p# ]$O/K;L`j>>àTX¬' h ÿþÊ"<2"'#"'&54767#5!4'ᒆ#"325332õ <w D?*;nEg -'§g5  WDWD)@8T 9( =+4fX#;;+¥ +0_a-9  VV ÿo Ê"A%4/ᒆ'&'&#"325332737#"'#"'&547#5!Ç'^_6# WDWDß#ß3w D?*nnEg# )% ‚ +2 0P4C# VVÕrró3 9( =+4–_;;%KAÿþÇJ"#4'&#"3"3273#"'&547&'&547632632#"'&54767327654'&3D* V>"(qNWW\E]*1@,D. W)4jQ4xw=#66O]! I1L2 40)7FV9+A0G (!_+W"^^\5I _:<6@ 9">).H40ÿþóÊ-4'&#!5!#"'&767327654'&+53276›9þþ6^ &DHEaë%"4¡U2->!!F G' ;; 22B;&$Ž5! 2,N2:0  ÿo Ê'+B74767#5!#"'#"'&%#"'&547632#73727654'&'&#"3253 ?v,]N / )v0W3!"/    D#h286AN;, WDŒh^';;Ci,+E+==(&   þVrc3X69L9B< VV ÿý Ê,73253327654'&#"%#"'#"'&547#5K) WDW' A5IO96 IO4% \0W3!"vv¡AVV/cA6IDØ;?x%'D->=(&@µN; ÿo Ê*.72533276'&'&#"%#"'#"'&547#5!3#‘WDW*)4MV9'¿/ )v0W3!"llT?Qþí#DDVV=b)9O5C]HE+==(&@»H;;Ls"Ír ÿþùÊ-7476323254'&'#5!#"'&'&'&#"& 8,4. -M+-Cñ%U-B%2?, "> = 6)!L(t9>D;Y/I%l2I5?%):ÿþ±Ê!#"'&54767#5"3254'&ùk, 99ZZ9:+]ÌM'++;‚9"Ê'4O"f?@B@c+06;KC'2I..¥V, ÿÿ'Í .KY%'&''&'&7676323&5432'27654'&#"4'!5&'&'7673676%3254'&#"& (H9%(WQ'# >SŠS[{$   ¨!# þÑ) /&/5" (M;(#þA ?  ô:1U2'rjcs+Ay yˆ%#   4HT.? ;/SA3)5(w92°$4 ÿþSÇ*4'&'3#"'&54763'654#"3276M2^OwoU_01A@ #4/CX9Oc@<ÿd36QA‚E:AJvS;:&8Q*h6#;7 ÿþ?aS_327#"'&7676#"'&54767"'&547632#"'53254/"3254'&#"3254'&'&y5+EW" h%.6#@#b04&.Y>   4 ‰!%Ü- <™>= " ý <>4\)‘K *.'#H+-D/98EL:8"Q_@ELGQŠ[XrZ2@ÿþ Ç3&5432#!5!254'&#"8 x‰m+~*6þþ™'CT 9Osr8Jœ+FŸB11Oÿþ ã)47"'&5432654'&#"'6323653#"'&5'"3254'&ÈE"x4=-)$F|‰E4M?!;&(+,) %X'X-V465= TœcJ2 I 2‹ $$ ÿþ!Ç;%274#""'&54767&'&5432#65&5#"367654'&'3.34*8"  Z7(ˆyH(UO:<‡)C®D/38831& 6&.€k . 5%A&7˜?4"C @ÿýÇ EO72765"2#654''&547674'&#"#47630767'476"6767&§4> + EKDU#( -&H-::A"4)", D6(#-ƒ)  "''12:4T8!—.)5-#&6--,FO.6H2 +##@ÿþ¿+73!!"'&547'72#"'&'74'&#"3276Œ=þÜ_/gE u0 >9"Ç2K4$! ‘3FB&4m@rx7#/E `ÿþ Ç"#4323!!"54?654( H|C":j83%þÛ›;l;‡d,;0E&& 9p;*;!%3@ÿþÇ/476;#"#"'&547632'4'&#"327654'&b+U-L44CA[‰8"!3F= 3 «I+'+,q0 8 A>(L68f5JA&'8 !B•("0!63PÿþÇ/%4#"32'2#"'327"'&547&54763!!"6B=O*K4A 3:@ @!(e<>##M=þ¹A@ð4o,+ %89-,C8)JI8<!<h¼ 2#"'&547627654/&#"ãU3$10FR4&=.;A%33%&2¼@-;F24?/=Q3%þÞ5 )?# #"3A%2Ò 0@72#"/4764'&#"3276#"'&'45476324'&#"3276i:(* +j((% +.+<4),ú.)H6b+ +$"7 9.3- (ÿ {lGVg#"/27"'5#"'&54763224/"#"'&5476721676737&#%27654'&5747{,%?&8 [xXavLl :*'$" A!'*0f þ6C7G "T-s! /Ž4 þÛ*"(ÕÖ;@k‹A+&$$ 8( N/* &¹Z<0†I0." 2/,<$$ÿ»c¢'&/"3767654'&'&/&'&'57237676767654/&'&/"32?"'&547632#"'&5476767633#"'&'&5476324'&#"3276   2  ?l- Zh51C N !%R§.h.$B'?#Z!L 3.$-°Z"a*BGd!I '3"V(>%&9:%-4 G )    '5")\@A# e5  4"-O E'L1 2¯ƒE  %:H2D"†A ,J'0'% HF0!,ÿþj Y|47632#"'&74'&#"3276476?676?676?2322#'"'&'&'&7276767676754'&'&+"#"'&5476724'&#"3276[&1'+    # þByà EQ#  .DxX  $A*)(  3až:JL<.b&G3V@>;(3;k^;'  ¢'+ 1   # ÷/ ) , ' $  þ˜T [-O$ & 1!0 9  o1*>l!& C05.? F03  ,:5*h, ')  $  þ¸ [R"'&/6762#'"3276767674'7#"'$476767676?4'&/"ƒ+ c'(4Ô[0< -,X.3-!AT a1Q* L*,),8 )E6@ :&_6D1þÀB>H‚m<  # '¬*'C[Y?`=$'"Y -&T , #+. :´"32?4'&4'&#";27676765276767#"'&'&'#"'&5476?2327654'&'#"'&547632#"'&5476654='4'&'&'&'&'&""'6;2'&™"­ 8 44E="  "'D #+ ( 5" . 1km;*W#". n„" !<3H5+J-8h7#½ (!S:6: A3vx&S6#6E !)(  ! +  J3RC./Fa- %&! ArRož> 2 &> P !"*4 3*4G&7"1ø"\". U!"+  A< =T\T0PB #‘Y ‹%27654'&/0;6767657"/#"'&'&#"'&'6767674'&'&#"#"'&5'47632676326+"/3276767654'&#"2óCu:/7H*76E1 5 ÊB#5V. ,*# HX*:  '=#33D 8 2(?9—k ,1,' #7! NMoA6IPXŠE"*N3 /5E`, . -ƒ F&r3#2"3¤\,,5^/  B46 #&$S4A\6A"$C )IpTS(-.3:\%4'&#"32767#"'&5476323767676767#"#"''?67654'&#"6767632%654='4'&'&'&'&'&""'6;2'&&&2# (\,BBf†@) &#,+70 ', ( `*(Y@K A  2}a5  ' © (!S:6: A3vx&S6#6E !)( e+ .%3d;MgQPS6M.12$  / )Jl_:@AC ))U5 ,/m"\". U!"+  A< =T\T0PB ?¤\n47632&'&;676765&'&'476767632#"/7?2767674'&'&'&#"672/&'&'&'&?]Fk& (I’4< *(&S-I& "4G9wNE*68M(!/ %9 Q!4]2I) 0I€ fB6 ,šR>  `)7P3  'J  (*)%ZPp4 +#G&$  @iM'K, C< #*?1DH6:!`“"327654'&76367674'&27"32?67673276767#"'#"'&'454767#"'&54763654='4'&'&'&'&'&""'6;2'&_  #  < |Dkµ["H),9'W(+ "#(B#$) ( 2/hkJ2d T804 $gk(g (!S:6: A3vx&S6#6E !)( ý   +!   I%%9P  $!%  F`Y_ZG@O T5 %I þñ"\". U!"+  A< =T\T0PB # ý:U7676?67676731#"'&'&'&'&767676767'&5474'&#"1"'&547672#"%&'4'&'&'&'&'&""'6;2^Ì:W &C / 'hFd8.390,. !Y(3 !  /"6)GI(B"r (!S:6: A3vx&S6#6E +"Fq-  &F! (5UD+ 211$&#  * %!*)V& U!"+  A< *W!_ g%%"32?4'&2674'"322'476726"'&5476?6234'&'"#'&'47632&+" 54/&'"#"'&'#47676767476n8+= * ]5 '€% W$ $=y  ;: bTU¢uƒU#w 2 /!  @$&0!(  ]2…%?bi>A# FD=|Ø, " C !0/ !!W' #9 !@-)KqG3KT‰[, 6   % .'2+k"yP @80-85 1*  K" „274'&#672#"'&'&54732#"'&5476?623&'"#'&'47632&+"27654'&/476?6?672n0 5 é)E/1#  A;!!B{p•¢uƒU#w P/!  @$&0!  ]2…%?bn.Ã';Õ? :D,+æ4",  "  %( ) 1+,+~NFKT‰[, K   % %9 2+k"y1']3~ ÿ0Âa!¹Û%27654'&'&#"67227676767267672672&#"72?#"'&547676376&/&#"#"'&'&5&#"2#"'&5#"'&'&#'67674'&'&#"'&547667677276?"'&'&7676ÕB#]4*!tW  = @#Í- O\.GSVOa?33/(r J64 6I^;# M;"–-!Y:  [–'% =Á&% F !%E >*#(*)  8Eaj96 B <J9pdA& $$0!-% £h4;  7 %%P6*ý`D.  (*3 ('&ÿ0Àaް4'&/"4?6767676%2&#"72?#"'&5476763672&/&#"#"'&#"#"'&547632;27654'&47632667677276?"'&'&7676I!G,/ I .‘WI /)*( U*< 6I^;# M4cm# H<  >;"ýA>W:)1/…, %E  :*#(*)  8Eao78  B <* <:O GjB7Z\{p[eP.!E/6/&5"…WO $ýWD.  (*3 ('+:1a!276767673"#"'&=747676;&#"%6'&'4'&'&'&/&'&'&""'6;2\ Q:&0'# / ' s—hj‚ .^(/;0!s  $*:6: A3vx&S6#5G $ :” $/3-$D@s8CcBk   !/4  /.   A= !;H@(*Xi7"'&/476767"3276765327676=&'#"'&'&547&'&/#"'&'3276767&'&'÷lA [(2&#*!2AR,B;  $!#S1 5*#)$."' "x30K-, 7$6*%(6a8"$D| m5C*yH  1 *@ $ :!*9!$VA 81;B*DRR_P$43 FMŽHV>:M€%#"'&54767#5!4'&'&'&#"#"'&547632'"2765;7276767#"'&%654='4'&'&'&'&'&""'6;2'&@*1S9:0HF !$  H‘Õ3 | 5 8B#$) (88,ÿÿô2¾ÐÙ%#"'&57#"'&/&'"'#"&'676?&747632%67632632#"'&5732765'54'&'&/"4'&'&#"6324'&#"3276%47632#'&'&'&'232767654'&'&'&74'&'&#"32767&'"Å0 ;"!  BZE:'?3"  G[F?^:?C.[~6§8;&`/ $D;(*2!H  =  96 1+ $->$,*ýº*" 4#71-‡#2G61L7 3þ£E#.›" #!"?2\p0ß8,# a& ((J; , 60 O60!ø) 70 &T #;.qÒ@ O&6l ;Z! F !"*)2!1"- - ˆ- 39#/OF2*;%%%¦E  $ %! î?!. !!Rf~"#"'&5476763267672322+"/3276767654'&'&'&#"2#"'&/&''676?674'&2327654'&'&á!3"+Q+ /59A,!%§ 4OA #:$'V%&(0B)Bs)$9EpeN:?T > !!*!š3q-GT. D 071<0>‹$*{B;9._9A-  !2*@TN`; 2* jIþ’Y#0\, Av+%ÿüð':G47'&'#"'&54767632&'"327654'&'#"'&'&327&'&'–0 UF0GÛQ* L*,),8 )E6@ :&_6D1þÀB>H‚o4?g-;"¦ / (*)  8Eam9G B< !;* þ(D.  (*3 (' :6i727673276767#"'&/#"'&547637#"%654='4'&'&'&'&'&""'6;2'&Ük? ""$B#$) ) /e%!"'$W88P5]"-’$ :( (!S:6: A3vx&S6#6E !)( –I .F4^2Y $3JJ`¾@)y$,O0!d"\". U!"+  A< =T\T0PB ‚Wt‹7676?6765'&#"#"/4767676;6767672"'7;6767674'&#"72#"'&'&'&'&;27676765&'&'x7   +# -0 1  * $A"J_]x2  L - 4QUŒ$I"@I$  ? M G8" / 5n< #J]/F Q~@-39L%8#   -17'21 -Q* L*,),8 )E6@ :&_6D1þÀBCKz‹3  # '¬*'C[Y?`=$'"Y -&T , #+. :e˜%4'&#"32767+'3767676767#"'&'&'&'&?727654'&#"47632#"'&'&'456767632654='4'&'&'&'&'&""'6;2'& #"#úM .,2:.- ( " GbD%%'7?(RC@B'8 .'2/ B^mIA¼ (!S:6: A3vx&S6#6E !)( a$ # !Â_ =W(Œ: X ,' 80 #"G1 +4 !?It??C;m"\". U!"+  A< =T\T0PB s^_#"'7127654'&/""'&547#"'47!4'0'&'&##"'&547632"327654#47632sœ!'%G"#N/"['5!V1!..o)3.hNPbP 2  " .?'-¬--/GDdb6"\4?k¾3#î, " K6E‡> 3"/ %\j-NObx;  %.499F3$%+&=kUh«9ý6€ª4'&#"37676"'&'47632#"'&5676?4'&#"327676?671"#"'&'&'4767632327654'34'4'&'&'&'&'&""'6;2è( " (K9I#%K  3(B]?/  _SSQ:&0' 3 ' s—Wpx 4("R#*o0G ÷ (!S:6: A3vx&S6#6E +"Ú32( ' X7d ;))+%,  ,5, ?-( $B! D@sCHS8DjN'  ? <(+> )*[ U!"+  A< *W!D0:¢Õ4'&#"327637676767"#"'&547?674##"#"'&54763232765&/#"'&547632#"'&'&767654'&'&#"327654'&5476?227654='4'&'&'&'&'&""'6;2'&æ! * %?!- ( 5)() 0'($8'./7s9&D/G0&UN)+7 O8)G,61/0  a ?.'"# - 1%× (!S:6: A3vx&S6#6E !)( ø" 0'#þŸ Ga)$$4  4"$yPn•N7)9 T(2 4 + 7&Ž=;–vI816D./26+* (5  1R,&!_,<-P $N*&6Hº:;‰} &   $# [X!"s 7fV,.JA *)#> OG-*7!/R:5 )'*þ:O|32767676731"#"'&=676767676374'&#"1"'&547672#"%&765'4'&'&'&'&'&""'6;2\ä Q:== / ' s—hj‚ 21&z3 !  /"6)GI(=x (!S:6: A3vx&S6#6E !):‚2$@! D@s8CcG5* %!* 69  U!"+  A< =T\ÿÿmXz%67&#732"2+&'&/&'&547676?632&'"32?4'&'&47632&'&#"&'&54767632674'&'&#5 =0š“(%4@>P? %5151*B<3J, >P/Q•'' 1?HiÂ? R '% = .'(98'=50  ‡S3I)+  /44DI344 # #1 šE% H#L,# --/9-)6 H $?#Â:–4Dj7&W$ '/Bhhz4'&#'47676322#"'&/#"'&54767#&767!4#""'&54767632#";276767653276'67674/&#"32;#-­F"#_& ( !"I_)#; M '5< — %*$$? _# 3gkSQL1)3M4,ÿ0f^v2/"#327676'476#'"'&'4'6327654'&'&76#"'&5476?676"'&'767324/&#"Ę4 ‘i$‚„!o3 HJXWA? & ]„hFW   'eOŽvu I`, O"df[+'  f> )¢1 A %. P00GEg b? KQ0%g=Iˆ 0/  ‹3'kk™ÎB -Ee L /({RK2+'/527676754'&##4''&'&#"7"/&'&547632676¡r> D¦) 4-44!#./<4&'&/3O> š"($G(,I7 ‰CIm…=0jOz.9+-M,   &/EM>? ,\ $3> #1Š: @ŠxX^{eýéþ—"+45&'&'&7676263'&'&1367&'"ýz$->(  !&(é`   ;4  þò/23P]947632'&'&'&'5327676?4'4'&'&#"3#, s  *F5!    8% Ý>'qB¡+6&    ë'21*ÿ~š"!37#&'&'&54?67#'&7076#… 9T 7*#D&U)W&/é šç-#%J:xAL‘49  ÿÊ–7"'&'&'&5476767#57'&'&'4?732?6.X(S J!B¸\_¨^Ç+5$ ) E í 48$+*(K#* h t'219a+ ! üíÕþûÕ*4'&/&#'""/&54767632/7276þÚ !|~3" 2 6)$WoI*`<$42 ?&  4# "+ 0(Q""&/ ýÕÿÛ:"7654'&#"'&547&/#""/&5476723322þ¼$)   F- "#V2E0.2 6):/: W-%Mu* $<0 ".  # "+N'2üíþúÿž(#;27632;7!"'&54763/"ýE)T*!C!€"ý½9!=% : „7")%¾HýÒ9#)E  % (üãÿÿ™+3276327&'&#"#"'&547632&#"ý 6BNQ@';/' VW&37Š+N. ;++' 0%u8 %$  ¥Býò %1"/)  ÿþoZ4E2674'&'&#"'6767632'&#"&'&54767667&'&#672§0G&D1 7*+(3 4)*-! <|3TA)P+.A-W 6@ t7t <$505þèWn>'0*#!inAR47632#"'&'&547632'&#"327654/&'&##&'&74'&#"3276ÎD*4d61XSs~Y'a`ˆY:B3)qSR[CZj>, $ %0_ Þ/$00 [I)&4MiEA\)23A…^`"  RTj_8):*:W!1:D&0 4/*ÿþBYO27654'&'47632#"/&'72767654/&#"#"'&5476372#'"À9)D ]XXBDZF+ !, E!* .K-0$   *\'\ RRm†bb<  3 5¥/  P+<'3D&  @"ÿÿÿžÿóGô&h:ÿÿ0ÿóŠô&Èr:ÿÿÿÿóGô&ç:ÿÿ0ÿóGô&ªì:ÿÿÿÿóGô&žç:ÿÿ0ÿóGô&«ì:ÿÿÿ£ÿóG„&Ÿm:ÿÿ0ÿó…„&¬m:ÿÿÿ¦ë&åÿÿ¦å&Èþÿÿþ!¦è'þëÿÿÿÙ¦ë'ªþÓÿÿþ?¦å'žÿ ÿÿ¦å'«ÿ ÿÿþÒ¦å'Ÿÿÿqÿÿÿ¦¦å'¬ÿÿqÿÿÿŒÿöÜô&V>ÿÿ'ÿöwô&È`>ÿÿÿ ÿöÜô&Õ>ÿÿ'ÿöñô&ªÚ>ÿÿÿ ÿöÜô&žÕ>ÿÿ'ÿöñô&«Ú>ÿÿþvfå'ÿ@ÿÿPfå'ÈÿJÿÿýsfå'þ=ÿÿÿCfå'ªþ=ÿÿýsfå'žþ=ÿÿÿCfå'«þ=ÿÿÿ¨ÿJòñ&r @ÿÿÿJ‹ô&Ès@ÿÿÿÿJòî&å @ÿÿÿJûî&ªä @ÿÿÿÿJòñ&žß @ÿÿÿJøô&«á@ÿÿÿ›ÿJò&Ÿe @ÿÿÿJ&¬w @ÿÿþgqå'ÿ1!ÿÿAqå'Èÿ;!ÿÿýdqå'þ.!ÿÿÿ4qå'ªþ.!ÿÿýdqå'žþ.!ÿÿÿ4qå'«þ.!ÿÿý÷qå'ŸþÂÿq!ÿÿþËqå'¬þÂÿq!ÿÿþîÿøô&¹Bÿÿ8ÿøÚô&ÈÃBÿÿþmÿøô'ÿ7Bÿÿ8ÿøSô'ªÿ<Bÿÿþmÿøô'žÿ7Bÿÿ8ÿøSô'«ÿ<Bÿÿþóÿø„&Ÿ¾BÿÿÿÇÿøÕ„&¬¾Bÿÿþk£å'ÿ5#ÿÿEVå'Èÿ?#ÿÿýh£å'þ2#ÿÿÿ8£å'ªþ2#ÿÿýh£å'žþ2#ÿÿÿ8£å'«þ2#ÿÿýû£å'ŸþÆÿq#ÿÿþÏÝå'¬þÆÿq#ÿÿÿžÿôô&hHÿÿ"ÿôŠô&ÈrHÿÿÿÿôô&çHÿÿ"ÿôô&ªìHÿÿÿÿôô&žçHÿÿ"ÿôô&«ìHÿÿþÿøÞè'ÿg)ÿÿ2ÿøÞë'Èÿ_)ÿÿý¯ÿøÞâ'þyÿþ)ÿÿÿsÿøÞß'ªþmÿû)ÿÿýëÿøÞâ'žþµÿþ)ÿÿÿ¦ÿøÞå'«þ )ÿÿÿÿòÞô&WNÿÿ(ÿòyô&ÈaNÿÿÿ ÿòÞô&ÖNÿÿ(ÿòòô&ªÛNÿÿÿ ÿòÞô&žÖNÿÿ(ÿòòô&«ÛNÿÿÿ’ÿòÞ„&Ÿ\Nÿÿ(ÿòt„&¬\Nÿÿÿþ—å'Èÿ.ÿÿÿÿþ—å'ªýû.ÿÿÿÿþ—å'«ýû.ÿÿþ˜ÿþ—å'¬þÿq.ÿÿÿüÿ÷Àô'ÆRÿÿ$ÿ÷èô'ÈÐRÿÿÿ{ÿ÷Àô&ERÿÿ$ÿ÷Àô&ªJRÿÿÿ{ÿ÷Àô&žERÿÿ$ÿ÷Àô&«JRÿÿÿ÷À„'ŸËRÿÿ$ÿ÷ã„'¬ËRÿÿþžÿÿÀâ'ÿhÿþ2ÿÿ*ÿÿÀå'Èÿr2ÿÿý¡ÿÿÀè'þk2ÿÿÿqÿÿÀè'ªþk2ÿÿýøÿÿÀâ'žþÂÿþ2ÿÿÿªÿÿÀ¾'«þ¤ÿÚ2ÿÿþCÿÿÀå'Ÿÿÿq2ÿÿÿÿÿÀî'¬ÿÿz2ÿÿ0ÿóGë'¼•:ÿÿ0ÿóGë&ÇO:ÿÿ'ÿöÜë'¼ƒ>ÿÿ'ÿöÜë&Ç=>ÿÿÿJòë'¼¢@ÿÿÿJòë&Çb@ÿÿÿûÿøë&¼æBÿÿÿûÿøë&Ç Bÿÿ"ÿôë'¼•Hÿÿ"ÿôë&ÇOHÿÿ(ÿòÞë'¼„Nÿÿ(ÿòÞë&Ç>Nÿÿ$ÿ÷Àë'¼óRÿÿ$ÿ÷Àë'Ç­RÿÿÿžÿGô&ràÿÿ0ÿŠô&ráÿÿÿÿGô&râÿÿ0ÿGô&rãÿÿÿÿGô&räÿÿ0ÿGô&råÿÿÿ£ÿG„&ræÿÿ0ÿ…„&rçÿÿÿÿñYë'¦ÿñèÿÿÿñYå'¦ÿñéÿÿþ!ÿñYè'¦ÿñêÿÿÿÙÿñYë'¦ÿñëÿÿþ?ÿñYå'¦ÿñìÿÿÿñYå'¦ÿñíÿÿþÒÿñYå'¦ÿñîÿÿÿ¦ÿñYå'¦ÿñïÿÿÿ¨ÿòñ&Ñüÿÿÿ‹ô&Ñýÿÿÿÿòî&Ñþÿÿÿûî&Ñÿÿÿÿÿòñ&Ñÿÿÿøô&Ñÿÿÿ›ÿò&Ñÿÿÿ&ÑÿÿþgÿëAå'ŽÿëÿÿAÿëAå'ŽÿëÿÿýdÿëAå'Žÿëÿÿÿ4ÿëAå'ŽÿëÿÿýdÿëAå'Žÿëÿÿÿ4ÿëAå'Žÿë ÿÿý÷ÿëAå'Žÿë ÿÿþËÿëAå'Žÿë ÿÿÿüÿ Àô'Ë4ÿÿ$ÿ èô'Ë5ÿÿÿ{ÿ Àô'Ë6ÿÿ$ÿ Àô'Ë7ÿÿÿ{ÿ Àô'Ë8ÿÿ$ÿ Àô'Ë9ÿÿÿ À„'Ë:ÿÿ$ÿ ã„'Ë;ÿÿþžÿî˜â'åÿî<ÿÿ*ÿî˜å'åÿî=ÿÿý¡ÿî˜è'åÿî>ÿÿÿqÿî˜è'åÿî?ÿÿýøÿî˜â'åÿî@ÿÿÿªÿ'åÿîAÿÿþCÿî˜å'åÿîBÿÿÿÿî˜î'åÿîCÿÿ0ÿóGÞ&ón:ÿÿ0ÿóG&qoà:ÿÿ0ÿGë&iDÿÿ0ÿG&i:ÿÿ0ÿGë&Eiÿÿ0ÿóG¿&÷rò:ÿÿ0ÿG¿&i‡ÿÿ¦¨'ó©Ìÿÿ¦g'qªªÿÿ¦å&¼ùÿÿ¦å&dzÿÿÿñYÌ'¦ÿñÿÿÿËX5Sÿuëÿÿ³²ÿ–ýÿÿÿ6Gÿ‡äÿÿÿclÔ÷ÿ^ÿÿd@o'‘£›jÿÿÿòë&ÑHÿÿÿò&Ñ@ÿÿÿòë&IÑÿÿÿJòà&÷m@ÿÿþ\hà'KÿY–ÿÿÿCfå'¼ÿ-ÿÿÿCfå'Çþçÿÿÿ4qå'¼ÿ!ÿÿÿ4qå'ÇþØ!ÿÿAÿëAÌ'Žÿë!ÿÿÿ6G×ä'¼ðÿÿÿ6G×ä'Ǫÿÿÿ6GDt'÷§ÿÿÿÍÿøÞ&ó¿BÿÿÿÛÿø&q¿àBÿÿÿßÿøz&ºÁóBÿÿÿÖÿøh&»¸îBÿÿÿÇÿø¿&÷ÂòBÿÿÿÕÿøt'÷ÿЧSÿÿÿÝ ¨'óÿÏÌ#ÿÿÿëýg'qÿϪ#ÿÿÿ8£å'¼ÿ"#ÿÿÿ8£å'ÇþÜ#ÿÿGä'¼ðÈÿÿGä'ǪÈÿÿ Gt'÷§Èÿÿ(ÿòÞÞ&ó]Nÿÿ(ÿòÞ&q^àNÿÿ(ÿòÞz&º`óNÿÿ(ÿòÞk&»LñNÿÿÿ³ÿ8ô&}Jÿÿ9ÿ8Ÿô'ȇJÿÿ(ÿòÞ¿&÷aòNÿÿ(ÿòÞv'÷c©Tÿÿÿþ—¨'ó°Ì.ÿÿÿþ—g'q±ª.ÿÿÿÿþ—å'¼þë.ÿÿÿÿþ—å'Çþ¥.ÿÿNÿÿpå'ÈÿH+ÿÿd(‡'¼$£jÿÿd3z'Ç–jÿÿPçäCÿÿ$ÿ Àë'ËPÿÿ$ÿ À'ËRÿÿ$ÿ Àë&QËÿÿ$ÿ÷À¿'÷ÐÿòRÿÿ$ÿ À¿'ËÀÿÿÿyÿøÞâ'¼ÿcÿþ)ÿÿÿ¸ÿøÞÜ'Çÿ\ÿø)ÿÿÿwÿÿÀÙ'¼ÿaÿõ2ÿÿÿžÿÿÀÁ'ÇÿBÿÝ2ÿÿ*ÿ'åÿî2ÿÿ\P-ävÿÿÆGä.ð8#5î8HHÿûð18!51ýÊ8HHÿ÷ðé8!5éü8HHAݞŠ#547673ž]L 00Ýen&S@ñÙ 356745#@]Q-0Ùer&B @ÿ€žh 73#56745#A]T00het&F@ñÙ #&'&=0 R Ùh: &d e0Ý+Å #547673#547673]L 00ž]L 00Ýen&Shen&S1Ý.Å 356745#7356745#1]Q-0 ]Q-0Åer&B her&B /ÿ€,h 7356745#7356745#/]Q-0 ]Q-0her&B her&B 1Ý.Å #&'&=3#&'&=Ž0 R ý0 R Åh: &d eh: &d e&ÿOÅ ###5353ÂXÁÁXöRý«URÏÏ&ÿOÅ#3##5#53#5353ÂÂÂXÁÁÁÁXöRþÍRÐÐR3RÏÏ2Ü,Ö2#"'&5476¯B%5!'@&4!Ö6 )?%4!(@&FÜ,Ö0FææÖ}|suh 7#5!#5!#5Ûhµhµhhhhhhhh ÿêáâ#3CSc2#"'&5476"327654'&%3#2#"'&5476"327654'&%2#"'&5476"327654'&žL,;(2K-;(21+1,4BþuB‚L,;(2K-;(21+2,NL,;(2K-;(21+2,Ø<)3H.<(3J-<*2*4 Fý +<)3H.<(3J-<*2+4 <<)3H.<(3J-<*2+4 ÿêIâ/@P`dt„2#"'&5476"327654'&%2#"'&5476"327654/&2#"'&5476"327654'&%3#2#"'&5476"327654'&KL,;(2K-;(21+2,NL,;(2K-;(21+2, ûßL,;(2K-;(21+1,4BþuB‚L,;(2K-;(21+2,<)3H.<(3J-<*2+4 <<)3H.<(3J-<*2+4 ý<)3H.<(3J-<*2*4 Fý +<)3H.<(3J-<*2+4 1¶âÌ'7U8U$$Ì(vxŽ1¶µÌ '7%'7U8U$$ U8U$$Ì(vxŽw(vxŽ1¶ˆÌ '7''7%'7`U8U$$›U8U$$ÞU8U$$Ì(vxŽw(vxŽw(vxŽ1¶âÌ/†7%%U7ÌwŽxv1¶µÌ //Y7%%U7~7%%U7ÌwŽxv(wŽxv1¶ˆÌ /%/%/Y8$$U8(8$$U8þ¯8$$U8ÌwŽxv(wŽxv(wŽxv[jó¶757[˜jjãYzSSSSUjï¶57'5ïšll=YzSSSSbD í/?K47632#"'&72#"'&5&76#&'&547632"'&547636'7'77'b  Õ   à  Õ  ݼ¼»»¼¼»»  Ü  Õ  Ü   ¼¼»»¼¼»»|æÙ #'#5#'#5Ð'STj'STÙþ®ßßRýhhqþ®ßßRýhhMýå (%#5#47632#547'7674'&JZ= U´~83? Z ZJ> hhh'F1 ÓS$+F;:/7!S ÿ BBGÿRÿìPÅ3#:þ<:Åý'ÿÿM)å'","Müå /3#'#5%#5476767674/&#"#47632#5ü'STþ¢Z#J=RU´~83? ZÙþ®ßßRýhh_72%!BBF :"@ÓS$+F;:Žhh|å .2#'#5%#5476767674'&#"#47632#5Ð'STäZ#J=%RU´~83? ZÙþ®ßßRýhh_72%!BBF:"@ÓS$+F;:Žhh0ÿO Ù32####0úgB7F 0M@R@9ÙQC\kD (þLJü¶JEÅ 2#"'&5476"327654°•o‚,&C[ZR Å߸©w6//­¯‰« ÿ8Þƒ735##5 >>>>I:jááQÅ #533##=мÌ.CC>€; þð5d™ªª FÅ"#632#"'&'3327654'&#"#7.¾&.W( D&3R* 8JI:.!4"Å4w@V*3/G<H#è?Å*"547672#&'"632'"327654'&ªš*/KV 8:R&CQ&?&.?-8 7Ïp;;H<o/= *O)ç18 /DGÅ #6767#5G&=#K/÷Å,³ºv1?4IÅ*:#"'&547&'&547632'"327654'&"327654'&ûNB%2Z*N4<"+S%#f<.91@3D2û"HJ$=(G"" @ 7 -‰, /) 2²/716FÅ-2"#"'&'32765#"'&5476"327654'&¬š*&IU!9:O)?R&?&/85< /ÅÐn=7F<i/=!)O).0 C/: ÿÿÿ*Eáëþÿÿ=ÿ8Þá{þÿÿÿ8Fátþÿÿÿ*Báuþÿÿÿ8Qáíþÿÿÿ)Fáîþÿÿÿ*?áïþÿÿÿ8Gáðþÿÿÿ*Iáñþÿÿÿ*Fáòþ[ÿé|Ù0HUa#&#"#"'&53327654/&'&547632%#327#"'&5#5353#!2#'327654/&+gXfRBPvZ4JÂX!GT 6NwT1D‘# þ2V 'Y GGSýu]-¡/?:SåÂf O"ÂzT1-F`,¢ /#/.3+]*eqDþ™&FC ŒD×þËÙv)7a94RJZ]ÿéÙ0NY#&#"#"'&53327654/&'&547632#!2#&574'&#'327654'&+ˆXfRBPvZ4JÂX!GT 6NwT1D‘# ü2]Pª) H> qPðáy& IázT1-F`,¢ /#/.3+]*eaþÆÙx!*b3 (%V` 0GAmRVB <X$%3336767676#&/!#!2ÅW^#)þ¯Wñ1  ˆW2þôWl< +œ¼þ:V'wþÕ LþÝ'ýõW!ÿéÅ/547#7367632&/"!!3#32767#"'&'&'#7OO?3F€b^ U9k, þòöÖ&ƒ6FMYkB ,S9;_KeCP?‹;;Ç& ]/GHf;!ÿêØ̓%#"'&54?#"#"'&547672#"'32767+"576?#"'&547654#"+"5476323276?632367632327676;2"6767654˜JHh L@<.yLoUD\ &!  Pd–+H±J VÒJ3.9  %;  R=:  A?™䀦~73G1UàIc9>W õQ±ÊR 0Œg U TkY¨lC4.&" 1 ×>YiyW"P  v(  /•þÕá=@6FyfE3tç] D+-ÿPΆ#&367676#"'476'4'&'&767'&'&767676776767454'&'&'&'&'76327676'&'&'&'&76767676767236ƒ[3. )%8&,1Z* W,7 *) ++',  O. -B!$0, 2="C!  % %%  )/Î €% -'K(;o!$5' MY,7   " 3 ,7:2 ,$o+J%(  (9>4!/N  G AI% /. :ÿï¸Í W76767%4732#"'&547672#"'23276?&'454767676763267654Á>~K{›6<K$+Q B~bR` &!  c Vp/%W5?†•I1›\+Q9/U<Ä iS31MTU  <3<"gC4-%" 4o-5NALY.) a„*b)E9@ÿuïÂ3~'&/&'&#"&/5&'&'&767676767676'7&76762376'&'&'&76767676#4'&#"'&'&'&ï'#+&2))  00;  Y+/%&  þO /++ J8- " =?  , F-. %#!\1 4';@'G &  [/ / /  ý+'''E&+6I<?3 3 <' # C* VY&'   ÿï ÍVbj2#"3277632327676;2"'&'+"547672;26?#"'&54767627&#"2"6765&;!EN'%T(3Ín!Q.bîd=dnGEL$ 7\-'Sj fR„ !\ EWP:V ’8(5]2þ“:H@>DL&çÁU/À;#3+B ;A6BŒ#ŒU=8N.,2& .:Rz=$/9L)ýF-$°þ¿%xC.0LÒÙ$.#52#"'&5476"327654'&'##3´îuJ- <#H. <(43,7,Ðiþ‡Xe}HHX;)3L-;)4J.9+3.4ý'Oý±Ùý¬TÿþÿïwÍ —œ267654'327676;2#"'&'&54?6765##"'&547672#"'3276?4767&#"3276?6=472#"'&'&5476763276321#6dQ6+jf! ")4* 9Q#4Q.""JGuZI_ #!  SXv[ Ž<{mrs?7B%#OG 'C,&G8@€}q…J/$!((S "K7"m F86'R£þ´ $*=O2 & q?neA2*""  . †!%€ ¾f,<9.-7 - Wa * D4" %@ O* 1% 7+   ÖJ  ‡;n8G  9?$ªÙ##5!##33#Dšw6FyC^„ƒ[C¢þ‚~77þ‚Uþ«µþ–jþKUÿÿ*ÿÿÀµ2*ÀÒ(%27654'&'5!##"'&54767#5!pƒD./.\°Ž%%šn“[Q)%[®" L?LjIc^PL&PLM†',[NQfseŒ\JD8LP;‡+0„QDÿtèÂ'&'&76767676'"/&#"6'&'&3"'&767637677676'&'&/&#4767675&/6737676767654'&E T.6`K6  !M G# GA   $ "5  ,; "K I,=J *#=W$E7E`S*‘  &+[-@.@,-I# 0UM>=1" ) &!7!!-   S3,LW*6C-  5 AA1;?!ÿÿO’Ù.ÿÿ¹‡"ÿò Ä™£32767676=472#"'&'&547676327632#"'&54767632#"32767654'#"'#"'&547672#"'327676767&#"267654'60327&#"½K(.' H  8(O2,K7@xo†I45m8VOW?! M *++.)3*.3%D5FHvZIb &!  ] Wt‰PRU?yjsr<6ï'-)%M€  $/dA.f*  MN8"9 STN/ (/. * '%?G6+%bfB3-""  2ƒ#)ÀXY?':9VL" #;5-(O®ÿóXÂw“7'&767767675&'&7676767677'#"'&76'&'76767676#"/&#"'&'&'&7676?6'&'&'&7676767&'&Œ %$4 '# p^25  hs!  $3 !C/&, V&LM  HD.  )'¡#  " +3;6%]$&Æ/   60!v$!   * H/>C ,  Y'( 9'(  *&)V9- * 8~~dF-ÿøÇÄx‚47632#"32767654'"#"632#"'32767654'"#"#"567632#"'&5476767&54767632#"'&274'&#"ì3*& &&-$*r+0()85(?%8&>\584$T,+  7-+g -[>8„,37j]T\ a! 6113 R"ó/.&3" 0 &"F!;P-   "9YM7 )*;>./8 @?3ÀiWþà9JG/Ð9)xC¬… ! $ ÿÿ=ÿì[Å'uþê'æm{ÿÿÿì[Å'uþê&tæmÿÿ=ÿì_Å'îþê!ÿÿÿì_Å'îþê&tæmÿÿÿì_Å'îþê&uæmÿÿÿì_Å'îþê&íæmÿÿ=ÿìXÅ'ïþê!ÿÿÿìXÅ'ïþê&îæmÿÿ=ÿìbÅ'ñþê!ÿÿÿìbÅ'ñþê&uæmÿÿÿìbÅ'ñþê&îæmÿÿÿìbÅ&ð'ñþêæmÿÿ=ÿì½Å&{æmÿÿdÂÙ,ÿÿdØÙ',,ÿÿdîÙ',,',,ÿÿd›Ù'9,ÿÿ…Ù9ÿÿ]Ù',›9ÿÿsÙ',±',›9ÿÿ‰Ù',Ç',±',›9ÿÿdŸÙ';,ÿÿ‰Ù;ÿÿ]Ù',›;ÿÿsÙ',±',›;ÿÿPÙ/ÿÿ0ÿé¥å&ÿÿY›Ù'ÿÿKùÙ0ÿÿB–ÙLÿÿBtÙ'LÞLÿÿBRÙ'L¼'LÞLÿÿBÄÙ'YÞLÿÿ æ Yÿÿ ŠÙ'LôYÿÿ hÙ'LÒ'LôYÿÿ FÙ'L°'LÒ'LôYÿÿB·Ù'[ÞLÿÿÙ [ÿÿŠÙ'Lô[ÿÿhÙ'LÒ'Lô[ÿÿD˜ÙOÿÿÿéÝFÿÿÿéïÙGÿÿFúP ÿñ®ÿ !&'67®üå2y#d——d#y281—#ww#—1-;Ž !#'67&'P81—#ww#—12y#d——d#y21ÿñ¿ÿ 75!&'7'6712y#d——d#y2Ü81—#ww#—1-ÿê;x 367&'781—#ww#—1xüå2y#d——d#y2ÿñÿ#!&'&'7'6767!&'&'6767‹X.%pD %li$%E:üþX.%%pD %li%E:\> †A!`}* `?\>3 †A!`}$ `?ÿêŽ$%'6767&'&'6767&'&'7ò\>3 †A!`}$ `?\> †A!`}$ `?]¾X.%%pD %li%E:ýBX.%pD %li%E:ÿðZu3!'7!#7þ[¦¦nuýÏTpoTÿñ«!!!&'&'6767«ýQQèýHM)\^&E)M~5PP5b!rZ$zP$!b'7'6767'#'#H!rZ$zP$!b5PP5m)\^&E)MýHèQQý¸-ÿìºü'7!5!7'!5!'7Á)MýHèQQý¸M)\^&E!b5PP5b!rZ$zP,ÿí<z&'&'7373!rZ$zP$!b5PP5)\^&E)M¸ýQQèýHÿìÿþ!'7'7!&'&'6767!7'!ñ8L(nD*oR&(LýÈL(nD*oR&(x‘TTýoT}_"„A'e`-"__"„A'e`-"þÃVVVÿÿÙG$Ù@À$ÿéþå#3#4'&'&'&#"'632#"'&5476"327654'&Ó%P(;P.6™›;/1§qGiÿ=ÍÙ!#!#idvþˆvÙüd7üÉÿÿiÿ=ÍÙGV@À)ÿ=´Ù !! !!5 8oþ%Mþ¨óýugþ¨Ù`þžþ…_Jm(Å  !5 þ FF2ÿõo %##5#53533!5!ÏFÏÏFÏþäÄÏÏFÏÏF@†¬(i7&'&767654#"'&'&76?6/&'&'&'&76765&'&'&6136767676'&/&'&ö  -&   `, -)   $ 22 &  ">0 `  + † '$0     , GG3"    1&,ÿÜ‘ '7Ü$˜ñ^”Á‘üPñ.!Iþt{•/<&?'&'&/'&76567667676&767'&z+%- 7 F/ 0H ,'.BU@70>V&(/O# Iþ¤U( #'=/E0t& ,$& "/&8!!2*C<'1 #)EO#A-#B*|±•-=67676'&/'&7676&'&'&767677676'&eG! KB6--@VP0?IH.#:@I.5 M$G'/ #/& g<3&!':&G)@!,%@=12P.5=/5B%) . 3@73 ! $:  $$)#;â¡!!¹)ý¾ ýZ¡%ý»7GÆ!# #GA××A^þ¢ÆBÝ7,ææ,þîÀþ‰wþ@(Üý!#54'&#"#54767632Ü7[WqqW[7]_ˆ Šfa¾mOLLOm¾´}`c_[{ (ÿïÜì3#"'&'&=332765¥7]AZ02Šfa7[WqqW[ì´}`D_[{ ´¾mOLLOmdÿ Æÿ47632&#"#"'732æ'4Q! D%%D ^!SO7GS  €ýÞh88Vdÿ ¶ÿ747632&#"#"'732'47632&#"#"'732Ö'4Q! D%%D ^ð'4Q! D%%D ^!SO7GS  €ýÞh88V„SO7GS  €ýÞh88Vdÿ Vÿ7S47632&#"#"'732'47632&#"#"'732'47632&#"#"'732v'4Q! D%%D ^È'4Q! D%%D ^È'4Q! D%%D ^!SO7GS  €ýÞh88V„SO7GS  €ýÞh88V„SO7GS  €ýÞh88Vdÿ Æÿ47632&#"#"'732æ'4Q! D%%D ^!SO7GS  €ýÞh88V£½Þ/747632#"'&%47632#"'&47632#"'&£$ ($ (˜$ ($ 'Ì$ ($ (A($ ($ ($ ("l($ ($ Ë3'&'&'676767ì%9P$p2)&B/T m73  ' !% ">K ü¶3#"/&#"#676323276Ç59'*b5T u,›U ?#ƒ E1 ÿçæ'&'&'676767''ì%9P$p2)&B/T m7q2þò33  ' !% ">Àþ_"è« ''7'7¶1’“2“’2“’1’«2’“2“’1“’1‘2Ø !5#5#5þ&hhhFF§hhphh5ÿÌG6/%#"'#7&#"'6327'&#"'63273327#"'327G‡4MG6RF%()|!%?F%()|.FG6Q G(‡#%CGß”3²ÍP„ ](P„,±Ìb”]*b ÿçæ7#537#5!73#3!'}¤9ÝL2;Ä9ýþÜL3oFfF…iFfFˆ-ÿõ %!55% þéþvŠ8CC3EÏO¡¤O-ÿõ %!55-5þéþŠþv8CCxEÏO¡¤O+ÿñÝ£ 533##5#53327654/&#"4767232"#"'&'4i6ßß6ÝÝþ÷XUw{VSXM`{V95aa‹Œddaa‹ŒddAÜ6ßß6{VSXUw{V9XM`Œddaa‹Œddaa‹+ÿñÝ£-!5!327654/&#"4767232"#"'&'4~þòýâXUw{VSXM`{V95aa‹Œddaa‹Œdd/6{VSXUw{V9XM`Œddaa‹Œddaa‹+ÿïÝ¡ #577''7!4767232"#"'&'47327654/&#"Á'œœ'œœ'œœ'œþÎaa‹Œddaa‹Œdd5XUw{VSXM`{V9ä'œ&œœ&œ'œŒddaa‹Œddaa‹{VSXUw{V9XMŒ¢%!5!3Œýƒ#7777ký•'ÿè Ï, 327654 &#"#"''7&54767632ŠþJVt\[ýÙ·Wq\?‚$[\ed‘ ‹fa%aYed‘ ˆh*þFJ\[uþ÷I\ Siqâ#[gŒ“kh[b%bf‰“khYÎè # ÀÀ>ÀÀ   ¡èþŒþŒttýT88þÈ7ò¶#"'&5476323#54'&8@ 86 ‰T‰&÷þ\2 '2 -7mC”88mfWX/ &/&f–C+ !$D&/MM3 .U,Pe62#"'&5476"327654'&¶6.7/- (- (6/ 8/9(. )0 ˜ª@^7676'&74767676%676'&76767676É %!P M *HþÀ$Y V! .W#5 2R±*:w* Jµ>”R,2 0N®!=y.  MÀ;”Fa#¿'%67#&7676737'&/&' YVÞO~m>G" Þ 73noP  !"B$)Zâ~«™sŠ›:] <*+ «sN2b0*:c|l/%676765&'&'&#"&'&'&54767636ôyjc^]xzjd[Zwˆvoea…#"‡zq ec„)¯YSkl]]WSjka_2b[x |mj`Yw%$zmj ÏXà 6 '&'&7&76îþê  þÞ /"  þjþe  ž Mþä &7676/&767¨þÆ ? þ²   õ£  þW þS! XÏè 3#3#2¼¼2¼22»»2»èþ þ ôôþ þ ôè 3#3#^¼2¼¼2‰2»»2»ôôþ þ èþ þ ô·ÿ÷¦ñ!2#!#"'&5&547632Z)!þ®  Ü ü¡)! g  ¾ÿ÷/ñ%47632#"'#"'&54763Î   Ü+ X^+ " üš   ¼2¶è %335#'3##Õ2–Èú–dKR2dü®2,¶ 73##533KÈ2––d„ü®KdRüJ¼¶è 3#¼ú] X úèÄr~=;f­2,è3#67676'&'&'&2úúT  \èü©Oz‚>=sŪÿûöù&&76?6'&/#"'&5'67½ æ ÖÌ ° ¿#Ù Êþ5Ì ± Åÿööí'%'&7676632"''&'&767š­  ˜  ¦  Ö)¡  ! þ !… ±BE Y67&&'376"#?23076767'67676'&'&''"#&'&'&767674È 5?24 8H  4‰A 1ly9QI 27&.C&j9r# +]O6TG:D/$2°EB>\ ÇeE3L!&xA“ X+?4)N#:Ae:.@"?$ .F/ T& P5 T\,"0„Zu¥[67&&'376#?27676767'67676'&'&'"5'"#&'&'&767674¼HJAH 5" Q !@'‰š @Dx" \Z ;7/7&I!+tF|*  #6zQ ?^O= F&9(=RZTnì{S?,$9-!E: *'V3 B~B&,2çM M`L/Kp“M[ž¥¦I%7'6'&'&'&%67&'&'&76‘3NAMþF?//*9-.E?/~(d< F‰Ž:9e¡¯SXRIL O%"h¯ó>"0'676'6767676'&'&'"'7767'&'&vKaFQ/=q6ph4H  0$"B%M$-Os/1µ=' )7WgN$$? "/B)" )ö9' A ÍV:†#1'676'676767676'&'&#&7767'&'&á€]pR[5Aw Cƒw6U%   8•*(T U05h …<:>+ /9]oW,(>%"7L0)1 :- A  †1#1;776767627#/&'&76'"''&?&'&Û ˆ6+A =Í/"  4= A Q"&|1« ß;% A P0b¤+5776767627#"'&76'''&7&'&° …KR¨ þÃC)( F3Ž ”8t 3 JÂ+ç;1]/@’šG7r@=þ¸(  ; G@B]1 ,1ù :+ A ˆ(eðe7&'7676'&7&'767676'&'&773767676'&'&'&'&'&767674˜<130Iþ®q ,-3y h>A2t |:¨q `' >AnO  ?  )!#7  ?M˜ B*06!.6rQ9;)C'þé7S ,WæAc=@]?)V<JYIO,'J33 ?5. w)8  !5K K35U<šn i7&'&7676'&5&'737676'&'&7"7767676'&'&'&'&'&76767&´F $-2-þP‚% 46E† †?@F ‹LÃ…i.CEsY$ ?1'&> HZ˜3- H19<". <‡º:%:)8þÚ@X 3a @¾†5@f8H PaRV 0+R=   G("=& *‘+ < $=L U<,wy‹ŽJ7'7&'&%'&'7767676/7767676'&'&'&'&'676s-Z" *.4Ÿ \$#&þh>Us? ApC@ &$.A!@' D11 p+7^/¤/Y.C—7#@p9= @ Z•˜K@ [T '8&G™O/ºÄ*C"šElY]ç° )g7&'7&''7'7&'&'&'&'7767676''7767676'&'&'&'&'676Y< ; w: = Æ.d).04®Š(&'iþ±FL&!kG@0$ Q( !D *#1E/I"F( K6 , u37d"5ö9!:%" /`= I8'?|??eL @ T²¦RGa¨\ *,7)J¦V4ÆÍ1Q#£Lw–h¤H'77&'7676767&767'&'&547676&''&'7767&ÓMº¢I >$6l‡F&P¬ŸA0^£T61K6.28Iwµ!<¯[UKW?NMCTZf"$*&‚»47ày-¤ A 9v€;" >* =33>/3S;' (!!%&-?0,6>>90 )- @ Jzÿñ¸Çc7&'7&''&'77&'7676767&"767'&'&5&767676&''&'7767&)=< x8 < þ²]’²P%?!F “M+_´ŸW/n­]=7P<41:RÀ&E·_`U^CS1E]ds%(8'É9<ì„3‚9 "!:""nA <„}P,>. E96?/3b<+,&#%) . ?2/8C5/ 1 7. @Tó;– $&'&/&'&7676767676-8f=Y TM/žEO!>" Fk  ²Mc C >¢.¢9@" +?# O¼át 97&'7&'&/&'&7676767676æ< ; w: = ž8h:*` OS¨/©ST%D$ Gmç9!:%" 2!¶J3k@C­.¯DD! !%-E% Q½u5¥b"/'&'77675367'676767&'&76Èi© ¬M"A)_d8 1‚N1 'ýÑ@%-@0!]@õ >! Š„2/# D/>0&8§z ÜrlÔâxuÆ YÇ3D7&'/77675&'&'67'676767&&'&5&768=< ‡t´8 ¹X$"A) < +kfD 5‰Aœ5 +ý£A(0@/%d9 "!ä@Ö#" X "=#—Ž6B,I2=4)>°ž ètâ! Þnâœy2F ?'&'&'&77767'&½=!~'#zÑý¯;0[ v œ³,0¤RF–Q+ @ 52T%¸@ A ƒ]lj+57&'7&'767'&'&'&7677'&8=< x8 < ýw<% Š)'‹Óþñ½A4`$k †EP³²XCP9 "!:""þœ_/ A# 77[±A A Œ>…9'&'7723&'767&'&767'&'&'&'&7676&þs& ¿r@FD$^:'’L?7I7@ ,9K^Œ!ŽN1/WCRm<@PV##4Ž @Fh u9 *>* ]lA6G 2=* (!?$ .9DZK) GrìáO7&'7&''&'7327&'767&&'&767'&'&'&7676&^> ; v;= þ¹¡&- ¸K,'A[žJ$]d'œSF=M?9=@Pf•&“K=9bDWmDI[c&&H¨9 !!:#" ´ @Ey vI+?.blr5L 74-**+# @# 0 ; v;= þïA !WidCV5R.(+tk4& 9 !!:#" Äð†­#S-I%5$v %u-(?& V T£z€6r„ B&'76'&'7727'7167'&'776767'&'&7676'a;B2" ¿!,òp A Z¶ ¯j W C|%ƒ1 < FZ:#1!;a9.¥>2 @ÎÌ@ 2*6†<% A !_/ %7K.!9mbÈ"[7&'7&'&'76'&'7763'767/77676767'&'&76764ò<< v: < ÃlA E9& šÙ* @SÖ Æk ] G‡0Š7 @#K]@&3 $?dC39"! :!" þiE 6"3@á”K"@"¯.9B' A #`0 )8O4$;#_p]UE'616763&532'"#/&'776'&'"%67'&'&'&'&'4'&76ñ‰ “A¬œA6j” *,FO¤«B0ŒP4% 7AE˜A’F|:ˆAX3 D <p»-!?5A '"Q^‡?TÛr^7&'7&'"#'76763&7452&#'&'&'73276'&'&7'&'&'&'&5&74L=< x8 < ý›”¡A±·@XWp8  + . "F_& ˆ24(‚GÖÌX”8(  #9 "!:""…@M¤œKƒIG@l8H  <*Š rO7)E& @ 1'VV•R)wa-77676&'&'&767676?'%'#'& ‘MG˜þ.ä..åR '£.n'* GÞþÔÄPƒ@?õA53: AI?+*B,3J7 1?î1¦| E7&'7&'%77676&'&'&76767'##'''< ; w: = ýû ¤LZ˜ýùô=34æ_—+  +õª5w+$:®.$‹þèù1U‹-9!:%" \A?þï$A"*B+3I>@)-J=I#V1 ,> (Lfr!<772367/&'&''623&'&%&'7676767'676Š?^F— žGE+"(d kC@„ƒ83þ—1_f/ A 3jwI (l7q,(# TA  "S @)>(LAAœ>#z]v±)#±tj+ƒ‘*8U7&'7&'772367'&'&''63&'&%&'736767#'67676Ô<< v: < þÃ?#gL£ ªLL-)*i €:JŽ=:^ þèGXƒ! A Of~D"*s8r) ?9"! :!" þ, WA %X'A->, b@]uhc>$…f~º2#µa$"Y~6f˜<&'7676?#6'&'7767676'&'&'&'76G>‹ {KAbÓ¼I'&O¿s6/L77 ‹(-ƒ·<ªW<6_;,AiL +A '?8>*‡‚…Æ&776?6"'676767676'&'&'‡¢U WA[90~!f¯-§L& a(<,06kcd²QA " XJLtU0 A .IAG5jg¶;7&'7&'776?6'676767676'&'&'3=< x8 < ý?¸Z ›]E`=4… %n¾,µV'"e-?07:qpk¾}9 "!:""ÃA%#]OSz[4 A 0L%$EM<UZþ5$%&'&'&76767;– ë^O!)*“/Œ8G%:Eeþ÷¦A@<4+8DV( <' ?!6Ro8/s.a6®17&'7&'%5$%&'&'&76767<< v: < ýUN¾ öe_%-,š"8”;O)= I‡þÎ9"! :!" @@?52?L]/ A) ? $:Ww<3|8¹O€"677'&'&'&76767&7457ÚFÐ þÿfZ#'  %–_ðïi«:, 7‚"AE-?91*6;?: A MDZ'#S7‚ÅÍ¢0¡ 97&'7&'67%'&#&'&'&76767&7453> ; v;= þÙPß þïpd'+  )£hþùfµ?/ =Œ%Aþ9 !!:#" _1@<4.<@F@ A OHa*%\9×ã:U“AZ%&'&767&'7&&''&'&'&76764'&7676%"'73676767'6766`1)J#lYq73N R,@ ?o o%42Ea8=o !þ±%j^9 @ 3`„W&zB8g<³%  &«A !A ,r_A8?D8== (! nl5&_ A IBR0 6x o**ˆ?. %9d™B682+? "; > * UlB(_ €B*)t'  "V><kMY»_%&'&76767767676&''&'&'&76766'&'&/&#5'6?5'76( D% "'2þA&)R$d‘f Z'*% :$D-I8.? G‹ ! ; 1R&'UaA.d6´ Jf D7)ú! #  ù‘„:‰ ?_ t|‡&6,C86-'KTa\"7hµµ 6~$C\ AUm¥'7'&'&76767676'67676'&'&'&3676 0f/3?6 > -wZh”…d0<"=”a—:(30sJ|]3 & _Ùþ‹ CCev{T@C2Tj|;/U4>.' Fa7+S* d7: 'Cg©¿h @:  Z5†$O ![F=3'PpM^! ýé@)A<9!ý¼K  & ð 6h @ CˆF#9% @ ‡p:8T71/ 6C J% €‹2 ø‡‡Ý"!„†_N€5gs"327654'&'2#"'&5476&"#767676'&'77676767&''&'&76767676&7476J    ) %) %‰S4 8[ ?g©¿h @`Z5†$O ![F=3'PpM^! ýé@)AN    $)$+ýzK  & ¥ @ Cˆ¾@ ‡p:8T71/ 6C J% €‹2 ø‡‡Ý"!„†r/¢;/'677676764'7&''&'&'&76767¢“ Œ;%B#d_Cc*#@Xd8F:"1†J\u6H=D’aàA=ŒQ34€X/(’1 õŸ!u{¬}¼7D[£&)„” U ÑkD7&'&''&'&7676767#'277676764'77&'B=< TCg9\3%5{‚c1LAFž|‚‡Æ’>/G$jjLj/&@ 8 < 29 "!3²¨!uȈË;.=a¯)-ˆ£A=‘S>>‰^"3!+œ ’) '" U ÃSO"327654'&&''&'&7676767#'277676764'7&7672#"h   C,h9\3%5{‚c1LAFž|‚‡Æ’>/G$jjLj/&@,")%%    Tu¯!uȈË;.=a¯)-ˆ£A=‘S>>‰^"3!+œ ’) t/ $) @Y­s 7?7&'&%'6767'&'&'772767676'&'&7&'&ª*J(L7M!þ&8:&(\T!&”0,Q9-6+T%M*0 +t0^z$X&.Ó1A.x"w&( f(&09, $,@rWL*  <57 (+<?v+nJ7; (;Î+LT7&'7&'7&'&%'6767/&'776767676'&'&7&'&À<< v: <  +O-P6N*#þ9>%)a\$) 0ˆ4V ;/;"'b%U,4"! $/}0e…$[-&½9"! :!" ’1F!4#{0'"!j)'390#&,”I}\R, C6< +1D C•+vQ7<& ;Î *7X`"327654'&'2#"'&54767&'&%'6767/&'776767676'&'&7&'&Ú    *$*$+O-P6N*#þ9>%)a\$) 0ˆ4V ;/;"'b%U,4"! $/}0e…$[-&µ   %)%)û1F!4#{0'"!j)'390#&,”I}\R, C6< +1D C•+vQ7<& L´¢Ò'7676&'&/&'&{/b:JRHV`Rœ*™HxC$ <®,lE<hx`ƒ 1NŒI   G+œÃ> 97&'7&''6767676&'&/&'&¹< ; w: = ý¶0_ =?@K[kX¤ *¡LI( "C$9!:%" þü,gE) m„g‹1ˆQ—P  O*+œÃB"327654'&'2#"'&5476'6767676&'&/&'&Ò    ) %) %ýš0_ =?@K[kX¤ *¡LI( "C$þ    $)$+þ”,gE) m„g‹1ˆQ—P  O*{l¢hIS%&#767676'&'776767&''&'&747676&'/776%76 ~L13T :]„‚IO˜ V5r:@€"l4 UB8/%T uDQ!^²ÃVþ@&Aý;  # 2 @?Æ >$ Se"P7B. :FK  0ŒA†— ït{þý‚v_NÓ„ co7&'&#767676'&'776767&/767&''&'&5&7676'45'7727274%76E< ; ¿ˆU58[ > e! OOª 0J./ ):  K :—"‚.![F=3'N|JZ!#gÒÊT ýê@)Aâ9!þ B &c A @ ”G :&?% n]7N!0 4B O Á @Fð ø‡‡Ý"!„†_NÄ„!fr"327654'&#767676'&'776767&'476367&''&'&5&7676'45'7727274%76\   ½ˆU58[ > e! OOª 0J8#&( K :—"‚.![F=3'N|JZ!#gÒÊT ýê@)AÑ    þB &c A @ ”G'+'$!?% n]7N!0 4B O Á @Fð ø‡‡Ý"!„†X;#©X%&7676763&67&''&'&'&7676'5'&'&765?3567'6Ìrk" 9UI Af¶ Åe]ƒ  E\·"›X"\B>+$;  0X{1/x;:@^$KêÕç*  ( *wngAli @y%&p8`(= &3%%µ%!E %˜ @m=˜GF306367676767'&'776767&''6767&''&'&7676tj<  R0"'Bhwki"3J&e¡A `991|& kS«h1#/U/ $I FO"M^¼ A  5Ô] 25s‡4 $=5(NH 8??`8f 1' #=ˆN5¨– e7&'&&'&'6'77634'76776767676'7#'&'&767'&#&'&'&7676766ï"=$;ýÑ  (?4{g;A:xF %)z¡58@$¹d~10#R+/#%¢7#H>É$!! =AUl^^ &>* ˆ\-R!) :A X!h7d  >43 <$%`‰“XI6767&'7676&'76?6'6767676'&'&''&'&'&76J<0T L&T 3M @Yi$?X=44A>:1 -}/55'81$8E,,5-r TLT(Ÿþó\e?KCS/ ƒ$† b3,‡q5$;ayT6F A4cO4S¸cB*)t'  $T£}#‰?O‹H676727'7676765&'&'7'&'&'&'&747&'7767&'&'7hA5c v4!E‚ IH a58_†%w=!=4*E$"-3;PjCw<¨ c8hçã,+E0L. 27CWH'0=.5+)3. #*/#!;›þˤ’yô I%765&'&''&74567676767&'7'&''67&'&'&'76'&]v<(G$0 .P=6 A(?2%?X’AC1QKNb6}!h-?1 ;)!BÒN3Iy4‘b]LcKÃ*¾e\Ä™nOi$8U3l%&sJ- :H7?(%a TVÏ%`°sP%76767654'&'&'&''&76767676767'7'&'6'67&'&'76'&e80O6%;'´gF< B-@31HX &,@ N:X Q Yo:‚!‚1U@ :."0Nö .b]I¯}c‹{WÖ!:èq\¼È…14šZn/ gi#7x-.~T3 >O7P-(€[)gï/Š1$:%&7676'4'&767767'&'&''&'&767676Ë[K23F;A`d# rR“)†CONX!Pi>Eí'  ( +&M—ø*6x^?! o*s 3j'Z*( HJz4W‰'1676/7767676'&'&'&'67&'&ÉA v:vomF(D$4[¦h¤J/"? D,/_:^9>_}>:pc;5´¾wZ BC&1`f5$?A  ,P6'5"M)P$ÜAA5;0  .+œ/67676'6767676'&'&'&76Q>9 rt4*.* & .WVA*0!9Y$*YÈ'ŸVj&@ ;þ­ / %M25fJ% 8?& T"_  ". C-(65f6šMYÙM7457767676767'"'&'&76'4'&'&#'?5'76 A&)R€jVF H  @ (.3 6"+g¢A’6—2Jf D7)À 0‘„:‰3|7, E=“ƒ' k [!&E3‡ˆ19 5¥©©¢&V\ A£"wf,77676'6767676'&'&'&''&5€+1 þǤ}_4XO•%;L :"&oÛ<^(ŸVj&@ ;þÊMJ)/ZV8) ?& 6B1- o64›‚EV<767676'67676'&'&&5'6?5'762A )E8icN'B #‡#i¦8$ (H "UeA7?7¡AR :0!‡yJ#;s +*' 8`;3Z8"=7+ 7I)# "cbÆšL=M% H AMY‡877676'67676'&'&#'6?5'76A&)RXipY,!I'”-|¹C/1T'(ayA%m6´ Jf D7)ð‘„:‰%G*- ?kE;d?(><1")@S4* 'v«®($C\ A8O¥i _%&7667676?'676'&'&'&767676654/&'&'&'&'&7676þgE 1V(þ§”I8   V!?X­¤¼+]WJ.&h,X fdI]Qj 6EBg,.26=$)$!aÅD  y0J?J)5ÂI|¤" A 28ª (b27r[C !7CB EHX:  ay8"0'1NJ,%jk±Ž 0~%7&'&%67'&'&767676'&'&66''67/7327676'&'676767'&'&'&'&'&'67&'&76ç$G#:$þW;   fQH$3 _[B)-!Î%J'¶ÀTh6z:+{º‹ns]6.Di—5 K2, >+H:,%'#<4g#ˆX ÷6.""HF¢6  !  '># #9  46(Y&5Á† A ?€w0 $*=T4K2   . 71<% ** 18pP.4”+wªS&'767767"'67667/&'2&'&'&'&7676767&'676>3d n:!@!g³' Ç\)()-9US2 \”•Q ApE mCÆÀQ€+'˜&X¡ .{+ˆAL—“F@^B (?(;dk"&9! (@5 .9GC i0¨XLKŽš57676767'&'&'&7&'"'76763676B #5Q1O1 U=P !:O³3¸[;h;Q—?,#  h…'' "_*]& 6ž#=G"2C½(žfÕ©þó 7!IÿûÛ´7&'7&'L<< v: < {9"! :!" ÿÿÿûÛ´ÝÏ,–67"#'%3''67676'457w>þ;ú6C1._ &$d%)b" "Aè*CAAJ"#!•PIP3M.D£¢?H$6767#52%''67676'&57OþxÆÙ°N,5m,*r(i%(A51VAAV$(/²^T\ 3T,SÀ5¨M¼Ñ'67676767#ÉR¬§FOo 5i8 A˜>N;M3 A™ '9 þ}vb×G'67676767#Ç]¼ºQZx 5q>AêHW ;V8I¥&œBþ?©*53!'67676767!#µA4>C›<ž>$<þ A`¯¯° ŠKQ9 =6)H» Äz#U’53!'67676767!#°Ad CJ¦s¶J+Gý¯AÂÐÐÃ9‘QY@(>=2!W×'ç(Œ£N  #5!#!!5!½ÝêPý>1_AAþ…AASÊ„ !5!!!!5!ºþúZþí‰üÏgËAAþ@AA„N46"#'%23&'7723#"/7767676'&'&''67676ÍþìD  AãÞ   =.P G   V?;„'‚6>ABrºA…oJ6 ?3 d„˜IEg 3f;HMhf˜3"5%'7%23"#/7767676'&'&''67676Ðtæ—A þû  H2XW#' fII™ (™DEzAÖÜAºeR>? "A u§·UUu3vLQˆwŒ/46'45723'77676767'"#'676†D‡‹EA$   #6$A>å ",{+/o*UiAHd˜JþMm, )=wi—qSnƒ,.rФo4ƒ'7'77%'%vºµ\:_ÇÃSþð‘:“þàuK…;„k9V%'67676767%3'67676767‹ 1s(s, .,? >,R?%)dÉ!?ÀO>+YW ©>1HY3X8 E¡ <@É^7+e^;V5(-\ÉMê‡:7&'7&''67676767%'67676767[<< v: < þ9$4v (u-2/? p,WA*/gÍ#UÑ\>,c_ N9"! :!" :C7L]3Z4Kª H@Õd@1ia&<\?*.gÝiJz"!'67676765!#'6767676Mþî(n 1v(@&ó" .q1&o*0oH~ +ˆH >‡ {DA¾\#QU$5Q0RÄK*â™ 87&'7&'!'676767!!'6767676T< ; w: = éþÔ.x 1‚,!@Xþö"2z#&v-6Z9!:%" ˆP‰ *•R F• ‰IAÊa*#W\ 4W4^Ù»£ûñ5!!5!Â9ýÀÿ°Aý²AÌ¢ŠØ–7&'7&'5!!5!J> ; v;= ývdý”+]9 !!:#" EAýˆAö™3\^#53533673#'676767##K²²AùA•™5/v,,p--õASAÉÉA‰¨!A¸pcm(0e@ ]¯ì}‘47&'7&'#5353!673#'676767!#3<< v: < þ ÃÃA@¥©81{&,t02þòAX9"! :!" ¢AÜÜH•{aAÊwgt#1gC&'i¼þÿŠQž.%%'676767677&'&7&'&ÆV/$_j9d<36dÅÊ]).F)G@$+&E>84 Q>C2Pº8 µNA.SHeA ;2> /52!!a"U"m2¾i&2<7&'7&''676767677&'&7&'&Ê<< v: < þHÊT@/fp$9h<:?mÒÖb+1L)E)$'M%>87$09"! :!" ý[=F-"(VÂ#B½QM4[L „@ ?3:M59 (e!Z'R^^$'67676767'%23&'&'&É`¼0#·Qb’þض&zP?5Cªž?4he| 6yIhÚA@ÓbR+5I4U«M4œH9`,X69t{nB;(FA0$NVš ‰E2&'6767676%7&'&ó?:'#,KH%›A'L? ý§-C".;,%Ù[S=hq26kA'(jâ"/?)0ea)%n$ÝÜ%/7&'7&''6767676%7&'&O> ; v;= /?>,%/N¤V%¢E/"SD ýv,G!"4;3£9 !!:#" èfXBmv=6pC./tò(/A/.sm(!s=™)'67676767%'6767&'&'767k. +a&/2?',`F#%Z´G!¥?W6H."SW)0P;M‡Ãw{2S3 I² ‚ @åm5*gn+7f2FN2?7`·VÿùÝÙ E7&'7&''676767676%'6767&'&'767O< ; w: = þ#.j*d& 15>‘",cG*.]¹@"¹TP5soa*4X?Wþp 9!:%" s4.IZ2W1L· U<?îpC5lr&7oGDMS@=eÏ qVf¬"!5!6'&''6767!!'67676Äþ­W[Ô Êag²—M \þ¡ &,u*&o)ôA@P "@ N`_)8\=!iî'JkŒ‡ ,]pgN#ìù%-57&'7&''6767676%7&%7&'&^= ; v;= >D,.:O¡S"¡E,!XMþ€< A þ‡0e1:(Á8 !!:#" >ébiIce28`;')o÷,]J#)t’ ,fwQZ3xD!5!!'67676'45!Ëþþ”  c 1g óöAAc:% Uu +vB=fAA9ï‡*.7&'7&'!5!!'67676'&5!`<< v: < þ}þo_þt  g 2m# þøN9"! :!" íAAl>(#Zz $*}ECl.AAyd‚#37&'&'&ºAAy;?f.c03/þ5þß)$'f.a  rD4¢&7&'7&'#37&'&'&z=< x8 < ¿AAƒ@Al .h609 "!:""}þ ^þÀ,')j /h$v7jj#5276'7%23"#'67676ÌräèsAB þº 'l 0e& ÿA]ËÖTAuMdy ,p?!"Ecµ‹î75!5!c(ýE2µAAøAAl6-ÿ67!5!&''6767"'&/7-?Sþ%i@Fy 1}F.!b½>!×m/&G•«ßUŠAA¯V9‰+87 ar%8|f-/-->02`ˆ¿ %7&'&'676767!5!&'&'#uD !;2HR ;sîÙej›þhã‚+Y@Cw*lFB…AAp"&&(e2]+$1þƒ¸•§P'6767676h?"!$F¡H#¦C0@)P ÄXF6hn/7l?,.aÌNÄ~µ7&%'6767635¹]:jþC@&e/f#!&þÖçÒ A Lk-k=A.­µp 07&'7&'7&'&%'6767674'< ; w: = Ù6Âj;C13þT@#(i/n'$79!:%" C&þõîTW  ŸLNq-tEF›.­©1 (:"327654'&'2#"'&54767&'&%'6767674c    )%)%þè6Âj;C13þT@#(i/n'$    $) %*”&þõîTW  ŸLNq-tEF›‡?%67'&'&'&5536767É8j#%9ÿg_AX"A…S]ÀÈ]_Ö–\ "@=*VÑùNþõhqJa"@žN_ÖÓie?9"! :!" þðt1[+%@ ?.\ ö]´VþõhqJa"@žN_ÖÓie?    $)$+þt1[+%@ ?.\ ö]´V ; v;= ýÉ4u7." ( w*u'þ·}'1 09 !!:#" þ¶&;. )È![3þE  1LðÄ@ 9"327654'&'2#"'&5476'67676$'&'&¼    *$*$ýÖ4u7." ( w*u'þ·}'1 0(   %)%)þ"&;. )È![3þE  1I‰^b $7&'&%'676767!5!53!!#S;3"#X-[($þs? !V,XÒþÔ,A1þÏAçt02T/W92†y47O 0O.-ûA­­Aþ(l¥!,87&'7&'7&'&'&%'676!5!53!!#ÿ> ; v;= Œ;4("`,c+'9þŽ> '"Y,a# âþ¸HALþ´Al9 !!:#" þÒx91^.]=6‚ „@:Q1V86 A¾¾Aýì(ly -8D"327654'&'2#"'&54767&'&'&%'676!5!53!!#     *$*$;4("`,c+'9þŽ> '"Y,a# âþ¸HALþ´Ax   %)%)þWx91^.]=6‚ „@:Q1V86 A¾¾Aýì‹ÂI$6767!5!&'&'7Ý|92<ý‹–(K;9|5L0t;.t&d£RA9tAA“EAU4S,~4(U5GÛP26%7'6&'&'&7&'&7&'&á´^ mµ ®UXŸ `n@E|rD6•DE~xA@®A P;K4A 7;4A;;9‡›‡$7'67676767&'7''ºq(*3?4,)[ùÍ0E0m5Uþúþ˜å¯ZaÍÑh] 7:L,œš'sG)A®^áˆ&'767&''676á@š•@ADn-b::'C)€)`ô(A( '7'7%'6767X®£`;d|1$#"T/c* þ»Ä;è0?-ÌÖi5g85V-bWYþ_dRU‹'7'7%'6767BÍÂq;v½2-&+]/p1 þzä:C9?6ñû{5}5P2P@I¦A»A  U*N,#ýÀ;.'a)c05C,7ÑVP8BK1E+ [ñ²‡O63676767'²A·[a˜ +‘L('kÅA6ý“+/2„0€26,3¾Æ3ú !#!#5òþ AuAIpþAB4ýÐ>·3(ˆ#!'67676767øAq 7B¥}¹H+5 GĤKZA.=B2!H²‹HRñ#!'67676767ÌAÇ =I´*rÇPA"=°ç(´.ScJ)=G2)/SÀ)]W‘ #3#5!533#!!#!53½½þJHAÀÀ3þÍAþ@´þëA««AþëAþùAo§zÜ%3!!55!'67¾A{üõmhŽ =èþáAA³AAvH8F@ÐGJõ67!5!'6767!5ÙýÉG3.+%P¯h©Dv0þ4rAAÁZ;.aW1;N0TyA¹g”7'676767677&'&Õ×^B-\U F.D_Û´-7&'7&'53!'67676767!#L<< v: < þuA€ "IO³}½O4 L!ý{A{9"! :!" RääÌ9¢Z`C,=@4!'\ß&5ü=¶]â ,H7&5723'77676767'#'6768ru:Aþ 2 94  Á *s(/b"H A€?å?`%$= eG‘_Hcy*-e1g›5Lû!#'676767!#'6767676<å#d1i ?ÖÏ  (c*'h' , %VJ')±þ'!=$––RM 4±&X#!5!ÆWý·ó ýô LL?4X#&'&'&/&'"'!5!34W  &9 þ ûS2#! ý Wzþ†t7 L 2Bþwþ‰9þX-)5!6767676767075&'&'&'&'!5!Ýþ\žN    "jþb¤_7 ()  "5¬L   .Ž6 'L  4= œE/E%í%#4767676767475!53!÷W %q. ýaWŸ8N:(VVr72@ 9Há•™E3."-?6X )!2&'&'&'!5ý ÓUT'3W) 9Gþ„X*?5 þÕ+3' þ@%éX#&'&'&/&'"'!5!éW  &9 þ>ÉT2#! zþ†t7 L 2B#uX.6+532767676=#5!#&'&'&'&'&/  % AT2)<ý›0! W  &;  þÔ?+L,)LH2@þ†t8 2ÅÚ!5353þÏF FFÏÏ;ÑÇ:>72;7676767453#&'&'&'&7336767676=3'3#— =$/R' 6!W^ @GRG?C-$Wc' W 3RˆGGà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3çG;ÑÇ:>72;7676767453#&'&'&'&7336767676=3'3#— =$/R' 6!W^ @GRG?C-$Wc' W 3R±GGà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3çG;ÑÇ:>B72;7676767453#&'&'&'&7336767676=3'73#3#— =$/R' 6!W^ @GRG?C-$Wc' W 3RÃGGÅGGà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3GG;ÑÇ:>B72;7676767453#&'&'&'&7336767676=3'73#3#— =$/R' 6!W^ @GRG?C-$Wc' W 3RÃGGþŒGGà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3GG:ÿ}FX#'#5&76767'367676753#3#ü0 W9 &”fä/ W: &”fþ¼¼E > %TPÒþ» =$––QM Ò %TPÒþ» =$––QM ÒƒuuGG:FX#'#5&76767'367676753#%3#ü0 W9 &”fä/ W: &”fþøGGE > %TPÒþ» =$––QM ÒÃG:6X%&'&'&'&'#533!53#• "j‹‘^1 () Jþ GGL'6 'L  4= þÒLL G±X%#73'&'&'&'&'&'4#3#B¯uÏQ > RWF"2X¿GG¬¬Ë§. L*R "þ…UG&X #!5!3#ÌWþ±ùþÇGG ýô LL·G?:X"#&'&'&/&'"'#5!33#:W  &9 ùS2#! þW€GGzþ†t7 L 2Bþwþ‰UGÇX333#pWµGGXý¨UG(X ##5!3#ÕWWþæGG ýô LL·G=:XDH"5632#"'&'&'&'336767674767475&'&'&/&'&3#: -*&HL$"  #MHIM!$ W  2 +#    3 2GG R+1AœG,!++!4@zþŒ8 "18·G ×X3'3#€WWtGGXþé#wG&ÿ8ÚX#&'&'&/&'"'#533#ÚW  &9 ²ºS2#! ûGGzý¾<7 L 2B,G9X-13#536767676767075&'&'&'&'#533#㪤N    "j¤ª_7 ()  "5¬GGL   .Ž6 'L  4= œE/EUG%!í 3##47676767675!53!âGG²W.þ[W¥.›G„*aEx1+$%)V 5á•™<9 $$0:X##532!534'&/&#3#Ö:X:NçM5U-þÖÓ#$8GG ýô L!A-;þ‰L+&%·G3FX)53&'&'&/&'43#Fþí¼  4 IMUìGGL(7L+.…%G=9XBF!"'&'&'4'!2'6767674767475&'&'&/&'"'#3#;IM!(@B $"  #MH+#    &9 £  2 GG+!:9z"1AœG,!+L "18 þØ8 G9ÿ8 X)-32#&'&'&/&'"'#3/&'&'&'%3#9×@? #! W  &9 yB"(G$+ÿGGX!2Bý¾<7 4 L$7 G?X9=3#53276767675&'&'&'"+3/&'&'4'5323#ôµ¯87 , ,;5 XB"(G%+µLB / $ #a GGL<Ž9* 4 L$: Ò5?œ&= !*›G3X 67676767670753!5!33#<.   W !"«þ&Fþ²dGGU *“š70" þóL þ½G>ÿ8&X%#5367677!5!#3#,>7h þoè 0þÏWÐGG!L*!2Lþ§G( IuýŽrUG%ïX#&'&'&/&'"'#533#ïW  &9 ÈÏT2#! þöGGzþ†t7 L 2B,G;ÑX:>72;7676767453#&'&'&'&7336767676=3'73#— =$/R' 6!W^ @GRG?C-$Wc' W 3RÃGGà52  4&(Rþ®fT#?:>RþÔ  ÏÏ+#3G#{X.26+532767676=#5!#&'&'&'&'&/3#  % AT2)<›0! W  &; GG þÔ?+L,)LH2@þ†t8 ·G>•Û333#>WOGGXý¨ÛG:6Û%&'&'&'&'#533!53#• "j‹‘^1 () JþnÈÈL'6 'L  4= þÒLLG9Û-13#536767676767075&'&'&'&'#533#㪤N    "j¤ª_7 ()  "5¬VÈÈL   .Ž6 'L  4= œE/EÛG?Û9=3#53276767675&'&'&'"+3/&'&'4'5323#ôµ¯87 , ,;5 XB"(G%+µLB / $ #aˆÈÈL<Ž9* 4 L$: Ò5?œ&= !*ÛGHFí5367676753#HWå/ W: &”fD©•þ» =$––QM Ò#ÿòòÁ!%)%5476767654'&'&#347632#3   7C„5 39/% 888þ˜hgé 3* N ˆ($+ ))" #;A{hgþ™"žZŠ ¥Jº,4J› Œ¶H‹Xú-\œ³% @€­ FD$Õ,T Z Š  ¥ Jº , 4J › Œ¶ H‹ Xú$$ †‘$H$TcCopyleft 2002, 2003 Free Software Foundation.Copyleft 2002, 2003 Free Software Foundation.FreeSansFreeSansMediumMediumFontForge 1.0 : Free Sans : 29-7-2004FontForge 1.0 : Free Sans : 29-7-2004Free SansFree SansVersion $Revision: 1.27 $ Version $Revision: 1.27 $ FreeSansFreeSansThe use of this font is granted subject to GNU General Public License.The use of this font is granted subject to GNU General Public License.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlThe quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.navadnoDovoljena je uporaba v skladu z licenco GNU General Public License.http://www.gnu.org/copyleft/gpl.html`erif bo za vajo spet kuhal doma e ~gance.ÿi2  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òó—ˆÃÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîºýþ    ÿ øù !"#$%&'()*+ú×,-./0123456789:âã;<=>?@ABCDEFGHI°±JKLMNOPQRSûüäåTUVWXYZ[\]^_`abcdefghi»jklmæçnopqrstuvwxyz{|}¦~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     ØáÛÜÝàÙß !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl›mnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëì²³¶·Äí´µÅï«Æðñòóôõö¾¿÷øù¼úûüýþÿ     Œ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`˜ab¨cdešf™ïgh¥i’jklmnœopqrstuvwx”•yz{|}¹~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOÀÁPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ softhyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Buni018Cuni018Euni018Funi0190uni0191uni0193uni0199uni019Duni019Euni019Funi01A5uni01A7uni01A8uni01A9uni01ABuni01ADuni01AEuni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccent Tcommaaccent tcommaaccentuni021Euni021Funi0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0250uni0251uni0252uni0253uni0254uni0256uni0257uni0258uni0259uni025Buni025Cuni0260uni0261uni0265uni0266uni0267uni0268uni0269uni026Auni026Duni026Funi0270uni0271uni0272uni0273uni0275uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0282uni0283uni0284uni0285uni0287uni0288uni0289uni028Cuni028Duni028Euni0290uni029Cuni029Euni02A0uni02CAuni02CB gravecomb acutecombuni0302 tildecombuni0304uni0306uni0307uni0308uni030Auni030Buni030Cuni030Funi0311uni0312uni0313uni0314uni0326uni0327uni0328uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni0400 afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061uni040D afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097uni0450 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109uni045D afii10110 afii10193uni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F8uni04F9uni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni055Auni055Buni055Cuni055Duni055Euni0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058A afii57799 afii57801 afii57800 afii57802 afii57793 afii57794 afii57795 afii57798 afii57797 afii57806 afii57796 afii57807 afii57839 afii57645 afii57841 afii57842 afii57804 afii57803 afii57658uni05C4 afii57664 afii57665 afii57666 afii57667 afii57668 afii57669 afii57670 afii57671 afii57672 afii57673 afii57674 afii57675 afii57676 afii57677 afii57678 afii57679 afii57680 afii57681 afii57682 afii57683 afii57684 afii57685 afii57686 afii57687 afii57688 afii57689 afii57690uni0700uni0701uni0702uni0703uni0704uni0705uni0706uni0707uni0708uni0709uni070Auni070Buni070Cuni070Duni0710uni0711uni0712uni0713uni0714uni0715uni0716uni0717uni0718uni0719uni071Auni071Buni071Cuni071Duni071Euni071Funi0720uni0721uni0722uni0723uni0724uni0725uni0726uni0727uni0728uni0729uni072Auni072Buni072Cuni0730uni0731uni0732uni0733uni0734uni0735uni0736uni0737uni0738uni0739uni073Auni073Buni073Cuni073Duni073Euni073Funi0740uni0741uni0742uni0743uni0744uni0745uni0746uni0747uni0748uni0749uni074Auni0901uni0902uni0905uni0906uni0907uni0908uni0909uni090Auni090Buni090Duni0910uni0911uni0913uni0914uni0915uni0916uni0917uni0918uni0919uni091Auni091Buni091Cuni091Duni091Euni091Funi0920uni0921uni0922uni0923uni0924uni0925uni0926uni0927uni0928uni0929uni092Auni092Buni092Cuni092Duni092Euni092Funi0930uni0931uni0932uni0933uni0935uni0936uni0937uni0938uni0939uni093Cuni093Duni093Euni093Funi0940uni0941uni0942uni0943uni0945uni0947uni0948uni0949uni094Buni094Cuni094Duni0950uni0951uni0966uni0967uni0968uni0969uni096Auni096Buni096Cuni096Duni096Euni096Funi0970uni0981uni0982uni0983uni0985uni0986uni0987uni0988uni0989uni098Auni098Buni098Cuni098Funi0990uni0993uni0994uni0995uni0996uni0997uni0998uni0999uni099Auni099Buni099Cuni099Duni099Euni099Funi09A0uni09A1uni09A2uni00C1uni09A4uni09A5uni00C4uni09A7uni00C6uni00C8uni09ABuni09ACuni09ADuni09AEuni09AFuni09B0uni09B2uni00B6uni09B7uni09B8uni09B9uni09BCuni00DAuni09BFuni09C0uni09C1uni09C2uni09C3uni09C4uni09C7uni09C8uni09CBuni09CCuni09CDuni09D7uni09DCuni09DDuni09DFuni09E0uni09E1uni09E2uni09E3uni00F1uni00F2uni00F3uni00F4uni00F5uni00F6uni00F7uni00F8uni00F9uni00FAuni09F0uni09F1uni09F2uni09F3uni09F4uni09F5uni09F6uni09F7uni09F8uni09F9uni09FAuni0A05uni0A06uni0A07uni0A08uni0A09uni0A0Auni0A0Funi0A10uni0A13uni0A14uni0A15uni0A16uni0A17uni0A18uni0A19uni0A1Auni0A1Buni0A1Cuni0A1Duni0A1Euni0A1Funi0A20uni0A21uni0A22uni0A23uni0A24uni0A25uni0A26uni0A27uni0A28uni0A2Auni0A2Buni0A2Cuni0A2Duni0A2Euni0A2Funi0A30uni0A32uni0A33uni0A35uni0A36uni0A38uni0A39uni0A3Cuni0A3Euni0A3Funi0A40uni0A41uni0A42uni0A47uni0A48uni0A4Buni0A4Cuni0A4Duni0A59uni0A5Auni0A5Buni0A5Cuni0A5Euni0A66uni0A67uni0A68uni0A69uni0A6Auni0A6Buni0A6Cuni0A6Duni0A6Euni0A6Funi0A70uni0A72uni0A73uni0A74uni0A81uni0A82uni0A85uni0A86uni0A87uni0A88uni0A89uni0A8Auni0A8Buni0A95uni0A96uni0A97uni0A98uni0A99uni0A9Auni0A9Buni0A9Cuni0A9Duni0A9Euni0A9Funi0AA0uni0AA1uni0AA2uni0AA3uni0AA4uni0AA5uni0AA6uni0AA7uni0AA8uni0AAAuni0AABuni0AACuni0AADuni0AAEuni0AAFuni0AB0uni0AB2uni0AB3uni0AB5uni0AB6uni0AB7uni0AB8uni0AB9uni0ABDuni0ABEuni0ABFuni0AC0uni0AC1uni0AC2uni0AC3uni0AC7uni0AC8uni0ACBuni0ACCuni0AD0uni0AE6uni0AE7uni0AE8uni0AE9uni0AEAuni0AEBuni0AECuni0AEDuni0AEEuni0AEFuni0B02uni0B03uni0B05uni0B06uni0B07uni0B09uni0B0Buni0B0Funi0B13uni0B15uni0B16uni0B17uni0B18uni0B1Auni0B1Cuni0B1Duni0B1Funi0B20uni0B21uni0B2Auni0B2Buni0B2Funi0B30uni0B32uni0B33uni0B36uni0B37uni0B38uni0B39uni0B3Euni0B3Funi0B40uni0B41uni0B42uni0B43uni0B47uni0B60uni0B66uni0B67uni0B68uni0B69uni0B6Auni0B6Buni0B6Cuni0B6Duni0B6Euni0B6Funi0B82uni0B83uni0B85uni0B86uni0B87uni0B88uni0B89uni0B8Auni0B8Euni0B8Funi0B90uni0B92uni0B93uni0B94uni0B95uni0B99uni0B9Auni0B9Cuni0B9Euni0B9Funi0BA3uni0BA4uni0BA8uni0BA9uni0BAAuni0BAEuni0BAFuni0BB0uni0BB1uni0BB2uni0BB3uni0BB4uni0BB5uni0BB7uni0BB8uni0BB9uni0BBEuni0BBFuni0BC0uni0BC1uni0BC6uni0BC7uni0BC8uni0BCAuni0BCBuni0BCCuni0BCDuni0BD7uni0BDAuni0BDBuni0BDCuni0BDDuni0BE1uni0C83uni0C85uni0C86uni0C87uni0C88uni0C89uni0C8Auni0C8Euni0C8Funi0C90uni0C92uni0C93uni0C94uni0C95uni0C96uni0C97uni0C98uni0C99uni0C9Auni0C9Cuni0C9Euni0C9Funi0CA0uni0CA1uni0CA2uni0CA3uni0CA4uni0CA5uni0CA6uni0CA7uni0CA8uni0CB0uni0CB1uni0CB2uni0CB3uni0CE6uni0CE7uni0CE8uni0CE9uni0CEAuni0CEBuni0CECuni0CEDuni0CEEuni0CEFuni0D82uni0D83uni0D85uni0D89uni0D8Auni0D8Buni0D91uni0D94uni0D99uni0D9Auni0D9Buni0D9Cuni0D9Euni0DA0uni0DA1uni0DA2uni0DA4uni0DA5uni0DA7uni0DA8uni0DA9uni0DAAuni0DABuni0DADuni0DAEuni0DAFuni0DB0uni0DB1uni0DB3uni0DB4uni0DB5uni0DB6uni0DB7uni0DB8uni0DB9uni0DBAuni0DBBuni0DBDuni0DC0uni0DC1uni0DC2uni0DC3uni0DC4uni0DC5uni0DC6uni0DCAuni0DCFuni0DD0uni0DD1uni0DD2uni0DD3uni0DD4uni0DD6uni0DD8uni0DD9uni0DDFuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2010 quotereverseduni201Funi2023uni2031minuteseconduni2034uni2035uni2036uni2037uni203B exclamdbluni203Duni2047uni2048uni2049uni204B zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferiorpesetauni20A8 afii57636Eurouni210Buni210Cuni2110Ifrakturuni2112 afii61352uni211BRfrakturuni2126uni2127uni2128uni212Auni212Buni212Cuni212Duni2130uni2131uni2132uni2133onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdncarriagereturn arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblboth universal existentialemptysetgradientelement notelementuni2210uni2213 asteriskmath proportionalangle logicaland logicalor intersectionunionuni222Cuni222Duni222E thereforesimilaruni223Euni2241uni2242uni2243uni2249 circleplusuni2296circlemultiply perpendicularuni2300 musicalnoteuni3001uni3002uni3003uni3005uni3007uni3008uni3009uni300Auni300Buni300Cuni300Duni300Euni300Funi3010uni3011uni3014uni3015uni3041uni3042uni3043uni3044uni3045uni3046uni3047uni3048uni3049uni304Auni304Buni304Cuni304Duni304Euni304Funi3050uni3051uni3052uni3053uni3054uni3055uni3056uni3057uni3058uni3059uni305Auni305Buni305Cuni305Duni305Euni305Funi3060uni3061uni3062uni3063uni3064uni3065uni3066uni3067uni3068uni3069uni306Auni306Buni306Cuni306Duni306Euni306Funi3070uni3071uni3072uni3073uni3074uni3075uni3076uni3077uni3078uni3079uni307Auni307Buni307Cuni307Duni307Euni307Funi3080uni3081uni3082uni3083uni3084uni3085uni3086uni3087uni3088uni3089uni308Auni308Buni308Cuni308Duni308Euni308Funi3090uni3091uni3092uni3093uni3099uni309Buni30A1uni30A2uni30A3uni30A4uni30A5uni30A6uni30A7uni30A8uni30A9uni30AAuni30ABuni30ACuni30ADuni30AEuni30AFuni30B0uni30B1uni30B2uni30B3uni30B4uni30B5uni30B6uni30B7uni30B8uni30B9uni30BAuni30BBuni30BCuni30BDuni30BEuni30BFuni30C0uni30C1uni30C2uni30C3uni30C4uni30C5uni30C6uni30C7uni30C8uni30C9uni30CAuni30CBuni30CCuni30CDuni30CEuni30CFuni30D0uni30D1uni30D2uni30D3uni30D4uni30D5uni30D6uni30D7uni30D8uni30D9uni30DAuni30DBuni30DCuni30DDuni30DEuni30DFuni30E0uni30E1uni30E2uni30E3uni30E4uni30E5uni30E6uni30E7uni30E8uni30E9uni30EAuni30EBuni30ECuni30EDuni30EEuni30EFuni30F0uni30F1uni30F2uni30F3uni30F4uni30F5uni30F6uni30F7uni30F8uni30F9uni30FAuni30FBuni30FCuni30FDuni30FEuniF639uniF63AuniF63BuniF63CuniF63DuniF63EuniF63FuniF640uniF641dotlessj commaaccent onefittedffffiffluniFB05uniFB06uniFB1DuniFB1E afii57705uniFB20uniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29 afii57694 afii57695uniFB2CuniFB2DuniFB2EuniFB2FuniFB30uniFB31uniFB32uniFB33uniFB34 afii57723uniFB36uniFB38uniFB39uniFB3AuniFB3BuniFB3CuniFB3EuniFB40uniFB41uniFB43uniFB44uniFB46uniFB47uniFB48uniFB49uniFB4A afii57700uniFB4CuniFB4DuniFB4EuniFB4FuniFFFDÿÿ jóôõömnno !HIOP|}}~~ T†DFLTarmn&hebr2latn>ÿÿÿÿÿÿÿÿfracliga liga&liga, " ¢²ÂzJT^hô- "(MIOLILKOJLIIõMOWNW MOLL,ILVAIniL}‘…¦&Pfæ "æææ "ææ æ  0JDFLTlatnÿÿÿÿkernkernŠV2@ftš¼ú F`†”¢°¾ÌÚ$ÍÿÎÑÿ×Hÿœ $ÿù7ÿ°9ÿÒ:ÿí<ÿ¤ƒÿù†ÿù‡ÿùˆÿõÍÿÍÑÿ×Hÿ› $ÿÎ7ÿ‚9ÿ£:ÿ¾<ÿ{ƒÿΆÿ·ÿΈÿÊ$ÿ½7ÿû: <ÿ÷ƒÿ½†ÿ½‡ÿ½ˆÿ±ÿÄÿÄ$ÿ¸GÿìRÿæUÿîVÿîWÿùYÿþZ\ÿúƒÿ¸†ÿ¸‡ÿ¸ˆÿ« $ÿÌ7 9:<ƒÿ̆ÿ̇ÿ̈ÿÀ $ÿË7 9:<ƒÿˆÿˇÿˈÿ¾$7ÿµ9ÿ»:ÿÞ<ÿ¥ˆ $ÿÔ7ÿ‡9ÿ¨:ÿÄ<ÿ€ƒÿÔ†ÿÔ‡ÿÔˆÿÐ@ÿþCÿÙHÿÒ@ÿÛCÿçHÿÜ@ÿþCÿßHÿÏ@CÿÈHÿ¬@CÿæHÿ´@CÿâHÿÕ ÿ‰ÿ‰ÿ³>ÿä?ÿé@ÿ£AÿâBÿØCÿüDÿäHÿË@CÿßHÿÐ@ÿýCÿÛHÿÕ ÿ¶ÿ¶=ÿÂ>ÿ»?ÿ½@ÿ¯Aÿ½BÿÂCÿ¦Dÿ¿Eÿ¿HÿŠ}ÌÍÐÑÒâ=>?@ABCDEHÒL¢<‚¬âXŠœîd¶à6¬Ö”Êdö ²¼ÒàêJdnx¶¼Îè    È Ò   € æ j ˜ 8 f Ø N T b x † ” ® ´ º Ø Þ*8FTbp~„š¬¶È&ÿý&ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿDÿüEFÿõGÿøHÿðJÿöRÿóTÿøWÿðXÿôYÿáZÿë\ÿÞmÿÔ‰ÿܘÿß›ÿÛœÿÛÿÛžÿÛ©ÿöÎÿÜÏÿõÍÿ¿ÑÿÈáÿØ$ÿë2ÿù9ÿ×:ÿç<ÿÔƒÿë„ÿë…ÿë†ÿë‡ÿëˆÿë”ÿù•ÿù–ÿù˜ÿùšÿÿÿû $ÿà+ÿô.ÿö2ÿøƒÿà†ÿà‡ÿàˆÿß•ÿø˜ÿø $ÿÖ-ÿû7ÿÓ9ÿÍ:ÿã;ÿË<ÿÁ‚ÿÖƒÿÖ„ÿÖ…ÿÖ†ÿÖ‡ÿÖÿ”ÿòÿ”$ÿ»-ÿÍ2ÿêDÿßHÿèLÿöMÿôRÿëUÿÝXÿß‚ÿ»ƒÿ»„ÿ»…ÿ»†ÿ»‡ÿ»˜ÿê£ÿߦÿß§ÿߨÿã«ÿèµÿë¸ÿëºÿëÿé $ÿú7ÿÔ9ÿÎ:ÿä<ÿ‚ÿúƒÿú„ÿú…ÿú†ÿú‡ÿúˆÿý$ÿà†ÿà‡ÿàˆÿáÿÑ&ÿÍ*ÿÍ2ÿÐ6ÿÚ7DÿõHÿàRÿãXÿí\ÿ•ÿИÿЦÿõ§ÿõ¨ÿùµÿã¸ÿã¾ÿíÿÓÿƒ$&ÿ×*ÿÖ2ÿ×6ÿí7ÿ—8ÿÝ9ÿ—:ÿ¼<ÿ‡Xÿù\ÿȃ†‡ˆ‰ÿÛ”ÿוÿ×–ÿ×—ÿטÿמÿݾÿùÎÿ×"ÿíÍÿkÑÿsÿùÿù$ÿ÷&ÿý*ÿþDÿûRƒÿ÷†ÿ÷‡ÿ÷ˆÿú‰ÿý£ÿû¦ÿû§ÿû¨ÿþµ¸ºÎÿý $ÿÝ7ÿÖ9ÿÓ:ÿé;ÿÒ<ÿŃÿ݆ÿ݇ÿ݈ÿÙÿyÿØÿy$ÿ²-ÿ²DÿäHÿáRÿåƒÿ²†ÿ²‡ÿ²ˆÿª£ÿä¦ÿä§ÿä¨ÿè«ÿáµÿå¸ÿåºÿåÿäÿþ&ÿð*ÿñ2ÿó7ÿé8ÿï9ÿÙ:ÿå<ÿÕDÿñHÿôRÿ÷Xÿ÷\ÿø‰ÿð•ÿó˜ÿóžÿï£ÿñ¦ÿñ§ÿñ¨ÿô«ÿôµÿ÷¸ÿ÷¼ÿ÷¾ÿ÷ÿõÿõ $ÿê7ÿä9ÿÖ:ÿä<ÿÐWÿýƒÿê†ÿê‡ÿêˆÿê/ÿœÿ³ÿœÿ{ÿ$ÿ¡&ÿÔ*ÿÓ-ÿœ2ÿÖ6ÿè9 :<DÿœFÿ¦Hÿ¡Jÿ§LÿýMÿûRÿ¤Uÿ¤Vÿ¤Xÿ¥Yÿ¡Zÿ£\ÿœmÿ‡‚ÿ¡ƒÿ¡„ÿ¡…ÿ¡†ÿ¡‡ÿ¡ˆÿŸ”ÿÖ•ÿÖ–ÿÖ—ÿÖ˜ÿÖšÿרÿŸºÿ©ÿÝ"ÿè#ÿÄáÿ‹ ÿåÿç$ÿÜPÿüQÿüSUÿüƒÿÜ„ÿÜ…ÿ܆ÿ܇ÿ܈ÿÙ&ÿ§ÿÚÿ§ÿ¾ÿ¾$ÿ¹&ÿÕ*ÿÖ2ÿØ6ÿÝ7DÿÅHÿÇJÿÎLÿûRÿÊUÿÖXÿ×\ÿìmÿ­‚ÿ¹ƒÿ¹„ÿ¹…ÿ¹†ÿ¹‡ÿ¹ˆÿ²”ÿØ•ÿØ–ÿØ—ÿؘÿØšÿߨÿɺÿÎÏÿÕ"ÿÝáÿ°$ÿÈÿóÿÈÿÌÿË$ÿÎ&ÿé*ÿê2ÿì6ÿè7DÿÚHÿàJÿçLÿÿRÿãUÿäXÿä\ÿúmÿÆ‚ÿ΃ÿ΄ÿÎ…ÿΆÿ·ÿΈÿÈ”ÿì•ÿì–ÿì—ÿì˜ÿìšÿó¨ÿÞºÿçáÿÊ ÿÍ&ÿÐ2ÿÓ4ÿÔDÿñHÿÜRÿßXÿè\ÿØÿÓ$ÿ‘ÿ¬ÿ‘ÿ©ÿ¨$ÿ &ÿÆ*ÿÆ2ÿÈ6ÿ×7Dÿ¨Hÿ§Jÿ­LRÿªSÿÊXÿÁYÿÜmÿ…‚ÿ ƒÿ „ÿ …ÿ †ÿ ‡ÿ ˆÿ™”ÿÈ•ÿÈ–ÿÈ—ÿȘÿÈšÿʨÿ¬ºÿ®áÿ‰Yÿß\ÿÚMÿüYÿëZÿó\ÿæÍÿéYÿõZÿý\ÿñKNWÿöYÿñZÿ÷[ÿå\ÿíÍÿîDÿ÷HÿñILÿþMÿüOÿýRÿöW£ÿ÷¦ÿ÷§ÿ÷¨ÿû«ÿñµÿö¸ÿöºÿ÷ÿôDÿû¦ÿû§ÿû¨ÿÿµ¸\ÿîÍÿñ7ÿùMÿýÿ×DÿþHÿëJÿðRÿíVÿýXÿõ£ÿþ¦ÿþ§ÿþ¨«ÿëµÿí¸ÿí¾ÿú\ÿûSYÿóZÿù\ÿî7ÿ SYÿóZÿù\ÿîÍÿò7ÿWÿöYÿîZÿö[ÿå\ÿêÍÿëWÿü\ÿðFX+ÿ»ÿÑÿ»ÿêÿêDÿûFÿúGÿÿHÿõIJÿüLNORÿúSTÿýVWXYZ[\] ¢ÿû£ÿû¤ÿû¦ÿû§ÿû¨ÿÿ©ÿ÷ªÿõ«ÿõ¬ÿõ´ÿúµÿú¶ÿú¸ÿúºÿúÏÿúÿøÍWÿýÍÿêÿäÿä6ÿøDÿÿHÿòKÿýRÿô£ÿÿ¦ÿÿ§ÿÿ¨«ÿòµÿô¸ÿôÍÿÿÍÿøÿ»ÿôÿ»ÿéÿéDÿîFÿðHÿëJÿòRÿïVÿ÷¢ÿî£ÿî¤ÿî¥ÿî¦ÿî§ÿî¨ÿòªÿë«ÿë¬ÿë´ÿïµÿï¸ÿïºÿïÏÿðÿÎÿÿÿÎÿéÿéDÿñFÿùHÿôJÿúRÿ÷Vÿû¢ÿñ£ÿñ¤ÿñ¥ÿñ¦ÿñ§ÿñ¨ÿõªÿô«ÿô¬ÿô´ÿ÷µÿ÷¸ÿ÷ºÿúDÿïFÿéHÿäRÿçTÿì«ÿäÿºÿòÿºÿåÿåDÿêFÿíHÿèJÿïOÿüRÿìVÿô¢ÿê£ÿê¤ÿê¥ÿê¦ÿê§ÿê¨ÿîªÿè«ÿè¬ÿè´ÿìµÿì¸ÿìºÿí &ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿÿý&ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿDÿüEFÿõGÿøHÿðJÿöRÿóTÿøWÿðXÿôYÿáZÿë\ÿÞmÿÔÍÿ¿áÿØ &ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿ &ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿÿý&ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿDÿüEFÿõGÿøJÿöRÿóTÿøWÿðXÿôYÿáZÿë\ÿÞmÿÔÍÿ¿ÑÿÈáÿØÿý&ÿÜ*ÿÝ2ÿß4ÿà7ÿ£8ÿÛ9ÿµ:ÿÍ<ÿDÿüEFÿõGÿøHÿðJÿöRÿóTÿøWÿðXÿôYÿáZÿë\ÿÞmÿÔÍÿ¿ÑÿÈáÿØ$ÿá7ÿÖ9ÿÓ<ÿÅ$ÿÝ7ÿÖ9ÿÓ:ÿé<ÿÅ7ÿÖ9ÿÓ<ÿÅ7ÿÖ9ÿÓ<ÿÅ$ÿÝ7ÿÖ9ÿÓ:ÿé;ÿÒ<ÿÅ$ÿß$ÿÜÿåÿç$ÿÜPÿüQÿüSUÿü$ÿÜÿåÿç$ÿÜEPÿüQÿüSUÿüYÿëZÿó\ÿæYÿëZÿó\ÿæYÿëZÿó\ÿæYÿëZÿó\ÿæYÿðZÿö\ÿìYÿñZÿ÷\ÿíYÿñZÿ÷\ÿíYÿîZÿö\ÿêYÿîZÿö\ÿêWÿöWÿöYÿîZÿö[ÿå\ÿê$ÿà+ÿô.ÿö2ÿøKN$ÿê7ÿä9ÿÖWÿýYÿß\ÿÚ$')*-/13 5= DFHLN\‚‡,‰‰2”˜3šž8¢£=¦¨?«¬B´¶D¸¸GÎÏH""J??Krgl/inst/fonts/FreeSerif.ttf0000644000176000001440000355616411257014121015603 0ustar ripleyusersFFTMD€µzÜXGDEFîö,…:GPOSŽÉ†Æø`GSUB, >äøú2"žÖÖÿþ""T¬¾¾ÿ„þaþbþ~þxþdþ7ÿ4jÿþìäúhà0ÿúàÿþÔìÿøÿü<0þòT„»ÿÙ_@öwÿÿ¡ÿÿwÆÿÿÆÿÿãÿýet w]ô*sÏZ"TD¿@ÿÿ;«UZUDâýøxÿÄþîÿ u€4Êñÿþ›êJKá\ÂHÉZVÖ'·L®T8Y‹W‹W§X¿[º[\ rTÄYŽWzZ½Z±S±T½Y†ÿìPQÅU„]¸\·\ÞV¤[¤^¥^¤^`¨X«ZŸY¦XŒ]£S¡MÝ8L©LL»L:IÛM¤O‚RðNìNLINÕNæNKM´MGL)LÖJÃH¿KÜLPMÎKM×MMNL LÛMåMâMëO KÁKÿKôMþMOMÿLÉM)JMËLM˜KÔLÑK“MÿÙC,(zJLÞL>LgPP¤LYÿѤL¤OðM£IœN¡MáNÑO¾N¾P¯M£P«PwÁÔ<>” $'>F%\ èÍ#\å?äF#v v &F+\\\{Í!F%”\ Í”v F%\ ÍF\v,'>F*Ív5v/Í>Í(ý°|¤üíýüíüãõ Œ!ˆ*EFFTFEFRF‰FîF1F²FFTFFFxFxF2FÃFF{FDFOFEF‚F+F±FgFgFXFXFŸFŸFxFOFFÿFEF1FxF/FQF½F=FƒFF1F1FúFõFÿgÒBÓÿ³þIþ[þIþ[þÿþÿV›IFFF–ÿ –ÿ·–ÿ‹ ÿŽ Vþ]ÿZþ»þ#ÿ þóÿ þºÃG8<8<g<§=¨<ÿåÿ<ƒ<`<«GÍ$ÅMÀP"MkMÞNáMËMÃMÓM×MJNÐM»LÃMÌMÑM®L¸&D1MDGÓLvMÒMMÈMöMÐLM¸M» MÌNÏKRÇMÔMÁMÆ!Ä! !u!Ã!Ä!Ä!¾!Ã!Ä!4Ã!Å!·!Á!À!¶!õ! !ÿÿ0!Â!s!Ä!ëÄ!å!Ä!å»!ô!FÇ!Ã!àžÅ!¢!GEE0  G öEV1211G8ö2d-k119111ý¥9q:+.Ô.)+Â;ÂMI.?>ý=SßkCÈ1;qG0‚RG1ö0¼1G-¼-ö0G--,G,Ù-G-G-1.‚1N‚öè$‚1(¼@¼@¼@ö¼@¼?ÙAN@7@¼>¼ý@¼¼¼ö¼ö$ÙAN7¼¼ý öö ¼  ÿÚöÿÚöÿÚ ÿÚ¼ÿÚ ÿÚ ÿÚÙ%Ù%Ù%"#Ù%Ù%öÙö;ö;ö;11ö:1Xö8ö;d11dG7k0Âà¼öˆ˜0Gk l*?á]*2‚?Ÿ%¼IöHÙH¼3Ÿ+¼6ö3¼6G/ß/6/G//G(G/¶ÿß*BÙAB*J¼A*N*Bà>ý>ŸQQˆ>Ù ˆ ´ Ù k Ù Ù q è öÿÜkÿÜT ö@k@¼7¼7¼Kà@ö4*NNö<G<ö;ðAdC "¼"¼" "­"Ùþ"Ù"Â&Â&Â&Â&Â&ýHÂ&Â&Ó0 0Ÿ0d%d0Ÿ4Ÿ0d%k+1+‚+Ù%Ù%öQ1+¼%ö˼¼%%ö4¼¼%ö˼¼%%ö4¼ Ó#Ÿ#Ÿ#dd#G' 3N#ˆ#*¼%1# ÿöÙÿöÙÿödŸÿöGÿ÷ ÿè1?ý?ý?1>à?ö11?ý?7?q?q?* ?4?c?‡FG6F‡8FüFGF‡8GFG6FG8FüFGF8Zö[G"Ó"G"áAdCö¼Iö¼I?Ÿ1ö*¼"ö&ö&ö&1 ö&öC1ö&‚1Ô.öé0G¦˜:˜: ; 0é0¼0Ÿ2d#‚L‚L‚2G¼OöQ‚OG2¼%ÙfÐHG6öC¼1ˆ%d2Gk0ä¿ ä ©' ™h¯ ý ôÒ¼˜ ô ûôÒ¼%›ô›ô›ô›¼ÒôÒôÒôÒôÒôc ¼c ¼c ¼c ¼c ¼, MÒ ôÒô Òô Òô Òô Òô MÿáM Ò"ôÒ"ôÒ"ôc c ÿïc ÿïc ÿïy  y  y  Ò ôÒ ôÒ ôÒ ôÒ"ôÒ"ôÒ"ôÒ"ô,ô,ô›M›M›M›M,*…3,*…3,*…3,*…',*…3c c cÿ÷cÿ÷Òô Òô Òô Òô Òô ÒôÒô°Ò°Ò°Ò°Ò°ÒÒ ôÒ ôÒôc ¼c ¼c ¼ô ÿýÒô¼%MÒ¼%'%Ò¼%Ò¼%'%Ò¼%Ò¼%Ò¼%Ò¼%'%Ò¼%Ò¼%c ¼¸ c ¼c ¼c ¼¸ c ¼c ¼MÿþðMÒ"ô'"IÒ"ôÒ"ô'"IÒ"ôÒ"ôÒ"ôÒ"ô'"IÒ"ôÒ"ôÒô 'I Òô Òô 'I Òô Òô ÒôÒô'IÒôK)K)K)K)K)K)K)K)ÒÿÿÒÿÿAAÿíA AÿúAÿíAÿäª)ª)ª)ª)ª)ª)y!y+°°°°ÿþyÿìyÿâèÿîèÿÐèÿäèÿÉèÿÄèÿ½ ! ! ÿò ÿá ÿñ ÿà ÿÙ ÿÙ,,¸3¸¸=¸¸¸ôôôôôôyÿûyÿû°ÿÕèÿé°ÿÕèÿìy èèèÿûµ)µ)µ)µ)µ)µ)µ)µ)°°èÿüèÿÞèÿüèÿ×èÿÊèÿËK)K)ª)ª) ; ;ôôµ)µ)K)K)K)K)K)K)K)K)°ÿÿ°ÿÿèÿíèÿÏèÿ÷èÿæèÿãèÿÚ\ÿì\ÿâËÿîËÿÐËÿäËÿÉËÿÄËÿ½µ)µ)µ)µ)µ)µ)µ)µ)““ËÿüËÿÞËÿüËÿ×ËÿÊËÿËK)K)K)K)K)K)K)ÒÒÒÒ°úÿ¬Lô¥ô]lÒÿÍÒÿÌyyµôvôuô] ÿæ ÿ× ÿí ÿè ÿÙ ÿèMM ôôôeôdô],,¸)¸)y0y/ |wôõ)µ)µ)µ)µ)yy(yyè!ôÁô¥M'M'ôôèèôMsMOMOMs¼+¼¼-¼+ô;ô:^(^(èoèS÷›cÜ ¸ ” ÕM?M0uš‚¼Dô¹5¹5:ÿ÷£EM+§ÿXXƒxD D ‚ôÅÿê,ÿû,9,,,ÿþ,ÿý,,ÿþ,2,2,2,ÿó,ÿû,9,,,,,ÿþ,ÿý,,ÿþ,2,2,2º7››, ô  Ò v °å"<c*#›ºè6ôÉ!—6ôô):® j ¡6 ºø&ÛžÒ"Rÿþÿ››oÔÒÛ õ!õ!—ÿùÒ"ÒŒ"f2#2-), 87¯‚;"¡îîÿûîîÿñîîÿûîîîîÿûîî$îMvŸûÒû$]ûÒ û $ c ›Òy ,B ô  6 ô  ¼ô Ä>ô.Ä>ô.Ä>ó-Ä>Ä>Ä>Ä>Ä>Ä>ñ;ñÿýÄ>ô.Ä>ó.E>EHE>ô-E>ô-ôÄ>Ä> Ä>â>â>â>â>’’- - «l«lÄ>Ä>óÝó-Ä>Ä>óÝó-Ä>H-Ä>Ä>H-Ä>H-Ä>Ä>Ä>Ä>Ä>Ä>&Ä>&Ä>&>>>>Ä>Ä>D D Ä>Ä>KÌlîK,K,ôdÉ$44·044·077É|>|>|>|C|C×>ñ>ñ>%ÿþ%ÿþ%ÿþ|U4ý>ý>ý>ý>@P@ÿëŽ>Ž>Ž>Ž> 7î7;7ÒVî7u>u>úHu>|>O>|>|8|8|86|8|>|>|8|>|>|>|8|8|>|>|3|>|>|>|>|>|>OQO>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>–4–4š>|3|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|4|4|4|4|4|4|4|4|4|4Ž>Ž>Ž>|4|4|4|4Ž>Ž>||||||||||=|=|=|=X>X>È>È>Ò>Ò>L>Æ>L>ÒÿÓÒÿÓLÿÓLÿÓ|>|>|>|>>>Æ>rlŽ>Ž>Ž>Ž>Ž>Ž>Ž>*úE×@u9Ò?0404|>|2|2|4|4Ž>Ž>Ž>|>|>|>¿4¿4|>|>|>|>|>|>|>|>|4|4|4|4|>|>|>|>|>|>|>|>úEètètèt 5¼#Ú>Ú>Ú>Ú>4%H®L® ’>’>II 7 7 7 7 7®Lô-##########yyy°y˜yyyyyyyyy°y°y˜y˜yyyyy°y°y˜y˜yyyyy°y°y˜y˜y˜y˜y˜y˜yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyhy°yhyhyyyy°yhyhyyyy°yhyhyyyyyyyyyyyyy°ùùùùùùùùùùùùùùùùù|ùù™ù#ù#|#|^|#|^#î#¬########ù#ù#ù#ù#ù#ù#ù#ù#0#7#7Ì7Ï"ù#ù#ù#øÀ#À#«#ô «#ô ô%V%î#î#%H€%H%CX2X2X2X2X2X2X2X2%C%H%H%H%" 8 77777¼3G07ŒÿþG7% %t%!õ#A#€#€$€À*%!€"%! a 5 ’ J Z ¸ ` 1 š I a ·r"¶#S"#¶#S"M7+7Ò7Ò7ŸBy<’2d]Î#Á#Î#Ô####²#%W!#¥##±#Î#ó"N$ú#ù#;ÿÿ¥$û#ø#÷#ò#î#(##A#´#######7##I#7#A#0#?#›#è#Ó#í#"#·####÷#Ã#Ä#ª#½#:#/###Ã!¯$¸#±#"#É##$i#ú#ú#÷#÷##Š##Ÿ#ˆ#ˆ"œ#œ$Ü# 8 "Ž#›#ø#ø#####################""#######~#ì#œ#ì#–#Ÿ# # #B#i#<#œ#œ#•#¢"£#Ï#s#D#D#c#c#¸#¸#j#j#ø#²#"a#"x"Ç#x"?#i$Ÿ#Ê#–"èfèPè8èèdè&è–èXèè¼è2è¼è2è¼è2è}èÕè>è«èYèèFè6èßèÂèwèªèXèƒèƒè™è™è/èCèaèŒèÇèÇèÁèÁèÿèùèLèLèfèfèwèwèmèmè‘è~è¹èqèqèDèDèíèíèŒèwèXècèOè‘è‘è‘è\è‹è‹èyèyèyè?èoèoè•è•è•èàè”ènèPè›è™èBèöè·èþèÀè³è*è èMè»èÐèˆè†èqèVèyùßèºèºèÅèzè&èðèËè€èºèkèÈèzèŒèŒèoèoèãèãèxèxè©è©èèè—è—èxèxèpèpè¿è¿èèèèèèèèè¤è¤ètètè*è*è~ètè…èxè1èvèvèvèºèºèºè¡è¡è¡èsèsèsèèèèwè èvèõèwèÉè}èÆèyè èÑèÐè?èxèíè¦èðè­è¨èkè°èsè€èÕèÆù­ù¨ùkù°úFèuôôô+ô ô ô"ôô8ôÿºMa23zôo[èÿÄ21€(€(€(€€€îÉîîÉîÉ®L€6€Ž€6€€1€îîÉî]#,, 8#5#¥3^'^0^0^=^/  ^0žržr4ÿô4ÿôî{î}DÿýDÿýRÿÿRÿÿjyjyIÿûIÿûƒ¼„0ÿê0ÿꀿE,6,,,6,3,,,XA -ÿêù•Œ¶~¶~%ÿü%ÿü{{4ÿô4ÿôœœ*ÿþ*ÿþî|î}>ÿý>ÿýìzî}XÿýXÿý½p}TÿýTÿýrrrrHÿÿHÿÿKÿÿKÿÿ·|·|XÿúXÿúµ|µ|‰ÿú‰ÿúµ‚µ‚77µ‚µ‚%ÿì%ÿì-ÿù&ÿùq‚?|¢ÿù&ÿöZ‚A|BÿïAÿö!€!€,ÿâ,ÿ⸂¸‚ŠÿâŠÿâõyõy>ÿñ>ÿñ„„ÎÿóÎÿó%%““‹y‹yCÿôCÿô¨n‚ ÿôÜÿîII¤zÔ{#uÿÙòQ耀€fFÇeKsM MZLLNKûGKKçE,KVKAI,K›@›@›@KKKKKKKFfO¢GƒK‰K£M®M(I(I(IKKKKKKšJšJšJKKKÑMÑMÑMKÑMÑMÑMÑMÑMÑMÑMKKKKKKKMM M³I¶IÃHÍM´M´M´M´M?M?M?M?MÆIÆIÆIãHðHðHðHNzLzLzLÐH<GÁHFFFKGKGKG´M´M´MGLGL}HGLGLDLGLñIñIñI)L)LûMýHHMoLoLoLÖJÖJÖJÖJÖJÖJÖJÖJÖJÖJÖJÖJ‚HóH/LxKxKxK'H¸M>M>MnM'JL1LÂLšJšJ×F×F×FÜLÜLâMíLÛPÛPÛPUMUM‘E‘E‘EÏM>P7P5PÌLäM'M:MTMTMTMÎKÎKæKAÕGÕGÕGnJnJnJMM×M×MÓH×M×M×M×M×M×M×M×M×M×MgKgKgKMMM‘H‘H‘H“LüJƒHƒHƒHOOONL™L™L™LQiIiIiIÇKÄMÇIÃKNLNLNL¬M¬M¬MøIñDL,LGGGH;HKKKÕIÕIÕIÖMLVHDHAG^H~M~M~M~M¥K¥K¥K L L LèGèGèGñH HØGØGØGØGèGèGèGèGèGèGèGïQïQïQ Y YÛMÛMÛMÛMÛMÛMÛMåMåMõMUHâMâMâMíKíM‚I‚I‚I‚IšI‚I‚I‚I‚I‚I‚I‚I J J JdJdJdJâMâMéK-MâMâMâMâMâMâMâMnGnGnG&J¬JùM$OHôGúGH#H™J™J™JÛHÛHÛHøHÛHÚIÚIÚII‚O‚O‚OíIíIíIûHôLôLôLýIDHËIýH‘F‘F‘F,I,I,I6MÅJÅJÅJpIpIpI M M M K K K K K K K K K K K K K K K N K K K K K K™H™H™H K K K K K K K K K KÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKNJNJNJÁKÁKÁKÁKÁKÁKÁKÁKÁKÁKÿKÿKMÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKÿKJJJÿKÿKÿKøH…JJ%J666þMþMúHþIþMþMþL¼I¼I¼IÓMIJIJIJ­I­I­I²P”E”E”EþMþMþMOO$OOOOOOOIOOOOOOOOOOOOOOOOOOOOOOOOOJ›J[KÉMÉMöJÉMÉMÉMÉMÉIÉ=ÉKÉMÉMÉMÉMÉMÉMÉMÉMÉMÉMÉMÉMÉMÉMÆMÆMÆMÉMÉMÉMÉMÉMÉMÉMÉMÉMÆMÆMÆMÉMÉMÉMËLËLÊHaIaIaIËLËLËLËLËLËLÊGÅIÔM]J]J]JŽI„JeJDJJMMMMMMM-H-H-HMMMMMMMMMM˜K˜K£M˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K˜K:T:T:TÔLÔLÞIëLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÈLÈLÈLÈLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLeMeMeMÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLÔLýJúJÞF¨KðLeKÎKÎKÎKÞMeJeJeJÑKÑKÑK)J)JFL6J6JMMMF9y¡(ž&MMMMMK%C D%KMFMMKBMMMMMMMMMM MMÿLÿLÿLÿLÿLÿ½þúþÏþ ÔÿöZ úiÿôÿòÞÿû\ÿþ'ÿñ¨ÿÿR=ÿÜ8‘>Ôo ÄYÈÿò2×Uÿô›ÿýdþú'ÿòìÿìgÿîC’DhþúUÿþñÿýÓÿètÿðÿôÿÿáÿïÌÿñÄÿóOÿñàÿñÎÿýÿñÿíóÿñ'ÿóÝÿþÞÁÿÿÿÿôþÿêh»ÿî ÿìÿñÿð ÿñûÿÎ éÿð£ÿú8¸ÿýøîõÿðîòÿöîÔÿöïÿó:ÿú”ÿõ:ÿúŒÿú|ÿðõÿúrÿñäL3äwä×ÿýÿñEÿö•ÿì•ýÿþþÿþÿþ÷ÿþ+\“““ÿ¶˜ÿÿWŸÿýq!:!„2ÃÿãÿÿÿÏ imee ²p²pŸÿ[ÂEüü'ÿý¡ÿýzÿï'ÿý$111EÞÿã#ÿòÃÿò#ÿòXÁ'I'Ïÿý'ÿþ'ÿþt66Ï6ÚÂp˜%%NÀÿôLÿôŸë êÿþ¬ pckÿý..B»ÿîÿö»ÿý&ÿüÿýõÿý—ÿýìÿñ<ÿý8>jÿýLUÈU;ÿýžÿýìÿñ%%Hÿù$ÿòððjÿþjÿþ;-@ÿòBÿòBÿò§ÿίéûÿÎÿÎûÿÎüšÿã·ÿæúæŒÿì@ÿì/ ÿìSÿþLÿô€)44ò4òò…zº”¤ 룗ÿþ?£U:ÿúä×ÿý˜ÿÿÄÿýOÿöžÿÏ Â'ÿýÝ ˆî'ÂÿòÅÿüÿñÈøûÿÎÿþú£¯ÿõsÿõÁ¬qOÿöOÿöóŒ©ÿÿ^ÿÿò舓C˜˜ê§ä¡ˆÿý?ÿý»ÿý;ÿýÖŒ ÀÔÿÿÿÿj.ñÿùÖÿΔÿÎÏÿΚÿÎÕ*Ëÿÿ…ÿÿÓNN¹F…ÿýCÿý…ÿý»ÿýÙÅWÿòm"ÿì¯:ÿúåä×ÿýɘÿÿÄÿýOÿö'ÿÿ*žÿÏ” ŸÂ'ÿýÝ ÞÁ'Àÿôc»ÿýìÏ®ûÿÎÓ £ ¤Õ»ÿý»ÿý>%ZM+[Mÿøþhžÿ¦þŽqÿµþ{»ÿ¹þýðþ15ÿEþwÂÿòþþ˜þáþf;ÿ–$ÿ+*ÿ–ý÷ýùýÞýïþf\Êþe:ôoÇ ô.·ÿæñÿýòÂÿòÂÿÄxÿÄet ]ô*sÏZ"TD@ÿÿ«;¿  M©)F S!ùŽŠAôEÞ:fùͳ@ì` ÇŸœµ;Jë¶ÃŸs91wUZU1¼þbþb â Æªª~ö357²¿ÇËÏÝîEauz~ŠŒ¡Î×áò†õù²¹¼ÀÃêô :KQikt~†˜¯ÌÔ°    5 9 E I M P ^ p ƒ Œ ¨ ° ² ¹ Ä È Î × Ý ã ú  ( 0 3 6 9 < B H M \ ^ p t ƒ Š • š œ Ÿ ¤ ª µ ¹ Â È Í ×   ( - 0 2   ( 9 C H M W a p ƒ … ‹ ‘ ” œ ž ¢ ¥ « ± » ½ Æ Ê Ô Ö Ù ß:[ÅõFHMVX]†ˆ®°µ¾ÅÎÖîFZ|")…‡›ùEMWY[]}´ÄÓÛïôþ  # & K q | Œ © ¬ ¯ ² Ý!!!! !$!(!.!3!9!!¨!®!·!Ý!à!â" """/"="K"W"Z"\"§"¯"¸"½"È"ñ## #####*#H#P#W#^#®$#$i%K%m%%•%¡%²%¶%¼%À%Æ%Ì%×%å%ê&&&& &#&&&(&*&,&c&f&q'' '''K'M'R'V'^'g'”'¯'¾00000”0™0›0üöAö¾öÃöÜøþûûû6û<û>ûAûDûNûYû}û‹û•ûÿýòýüþpþtþvþxþzþ|þþ’þÁþÅþîþüÿýÿÿ  ø&57P¹ÆÉÍÔî`tz~„ŒŽ£ÐÚðˆø±´»ÀÃÐð !AM`kt~†˜¯ÌÔ€      7 < G K P X ` … “ ª ² ¶ ¼ Ç Ë × Ü ß æ    * 2 5 8 < > G K Y ^ f r ‚ … Ž ’ ™ œ ž £ ¨ ® · ¾ Æ Ê ×     * 0 2     * > F J W ` f ‚ … ‰ ‘ ” ™ ž   ¤ § ­ ³ ½ À Ê Ï Ö Ø ß? ÐHJPXZ`ˆŠ°²¸ÀÈÐØð Ha  )„‡  HPY[]_€¶ÆÖÝòö   & 0 p t    ¬ ¯ ² Ý!!! !!"!&!*!0!5!S!!«!°!º!à!â"""%"4"@"M"Y"\"`"©"²"º"À"Ë##### #)#G#P#W#^#®$#$`%%P%€%”% %²%¶%¼%À%Æ%Ê%Ï%â%ç&& &&&"&&&(&*&,&.&e&i''' ')'M'O'V'X'a'v'˜'±00000A0™0›0¡ö9ö¾öÃöÙøæûûû*û8û>û@ûCûFûVûzûŠû’ûüýòýüþpþtþvþxþzþ|þþŒþ•þÅþÉþûÿýÿÿÿãÿÂÿÁÿ¿ÿ¹ÿ¸ÿ·ÿŸÿ’ÿ‘ÿÿŒÿ|ÿkÿQÿ?ÿ;ÿ8ÿ3ÿ2ÿ1ÿ0ÿ/ÿ-ÿÿÿÿÿ þhþgþfþcþaþUþPþ9þ+þ(þ'þ!þ þþþ þýùýèýÒý¶ý¯ýû´û³û²û±û°û¯û­û¬û«û©û¢û¡û‘ûûŽûŒû‹ûŠû‡û…ûƒûûyûuûtûrûhûdûbûaû`û_û^û\û[ûWûUûJûIûBûAú4ú3ú0ú/ú,ú+ú*ú'ú$ú!ú úúúúùåùäùãùâùáùßùÞùùù ù ù ùùùøûøóøïøÞøÝøÚøÕøÓøÏøÎøÍøÌøËøÊøÉøÈøÆøÃø¿ø¾ø½ø¸ø—ø“öOöEõ;õ:õ9õ8õ6õ5õ4õ2õ1õ0õ.õ-õ,õ*õ)õ'õ&õ%õ$õ#õ"õ õõõë•ë“ë’ë‘ëŽë‚ëëyë"ë ëëê¨ê¤êžêœêšê˜ê–ê•ê”ê“ê’êêêŽêŒê‹ê‰êˆê{êyêxêvêmêIêGêEê2ê0ê.ê,êéÞéÝéÚéÙéØé×éÖéÕéÔé»é«é©é¨é¦é¤é£é†é…éƒéé}é|é{ézéwévétéséqéoéaé[éWéNéIéDé(é!ééèÆèRèç€ç|çjçgç]çMçJçEçBç=ç:ç8ç.ç-ççç çççççççæÿæýænæmækæjæiæhæeædæbæTæQæPÞÞ Þ Þ ÝàÝÜÝÛÝÖšüûú×ÖÕÔÓÒË«Ÿ™3A8ÅÂÁÀ¿¾º°®«¨œœš RSTUVW   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾ ˜rdei šx¡pk úvj ׈š £s Û Ügw ˆ – ”ð ®l|Ù¨ºcn ŸT Å Œm} œb‚…— Œ ” • ‘¹ Á: ± Ü ¦ §üý ™y ’ – „ŒƒŠ‘Ž•–”œ›óXhqdefzigY!yXXXX ìLà¨l˜ä0ø `x¤ÄX´4làHx x Ä $ L t ˜  Ä ( Ä ” xü|À¬xàD¼DÔX¨x¨ t¤Àì,Tð`Ä@œÔP°´ü¨ lì X À!L!¤" "l##$ $T$¸$Ô%<%€%%à&d'(' (0(X)()p**++8+H+ü,,`,”,ð-`-ˆ-ì.T.€.Ì//P/Ü0T0ô1œ22,2D2\2t2Œ2¤3P3ì44444L4d4|4”4¬5,5D5\5t5Œ5¤5¼5ð6t6Œ6¤6¼6Ô6ì7l7ü88,8D8\8t8Œ9`9ü::,:D:\:t:Œ:¤;;œ;´;Ì;ä;ü<<,<ˆ<ø==(=@=X=p=ô> >$><>T>l>„?H?`?x??¨?À?Ø?ð@@ @Ð@àApAˆA A¸AÐAèBBBœB´BÌBäBüCC,CDC\DEE4ELEÜFhF€F˜F°FÈFàFøGdGìHHDH\HtHŒH¤H¼HÔItIŒI¤I¼IÔJ`JÜJôK KxKÐKèLLL0LHL`LxMMˆM M¸MÐMèNNNÄOXOpOˆO O¸OÐOèPPP0PHQ QØQðRR”S$S<SÀT T„TœT´TÌTäTüUU,UDU\UtVVV¨VÀVØVðWW W8WPWhW€W˜WôXtY0Y@Y¼Z@Z¬[[€\\\¨]] ]´^0^@^À_<_¨`H`ÜaŒaÌb bÀc`c´d@dðedeàeðf€fôgœh0hÄiPiØj\jèjøklkèlHl¨mm”n n4n¤o$oÀp$p|pŒpèqDqÔrDr´s sœtt$t<ttt„tœt´tÌtätüuu,uDu\utuŒu¤u¼uÔuìvvv<v\v€vœvÀvÜwww0wHwdw„w w¸wÐx\yDy\ytyŒy¤y¼yÔyôzz,zDz¨zÀzØzð{{{Ä{Ü{ô|||,|D|T|l|„|œ|´|Ì|ä|ü}},}D}\}t}Œ}¤}¼}Ô}ì~~~4~L~d~|~”~¬d€$€¨4Ld|”¬Ää‚‚ ‚<‚T‚l‚Œ‚¨‚À‚؃xƒÄƒØ„P„d„Ø„ì…x††ˆ† †´‡d‡tˆˆð‰x‰ÔŠ€‹‹xŒ Œ¨Œ¼@ÐèŽ,ŽlŽìlÀDX‘‘À’H’Ø“<“L“ü””•(•<•P•Ø–D–¼——t—ä—ø˜¤™™p™ÐšTšhšÄšÜ›H›X›l›€›”œœtœðLÜžHž¸žÌŸ4ŸLŸ\ŸpŸø   ¤ ð¡|¡ø¢x£$£ø¤Ð¥h¥ü¦Ð§ ¨4¨¤©¨ªª¤«L«¸¬4¬”¬¤¬ì­4­|­À®®(®L®h®”®Ä®Ø¯ ¯@¯d¯„¯¬¯È¯ü°(°p°¨°ô±4±D±X±l±€±”±¨±Ä±Ø±ì²²H²\²p²„²°²ø³8³Œ³¼³Ð³ä³ø´D´t´¨´Ì´ðµ µTµ˜µ¼µÜ¶¶ ¶p¶À¶ì·8·€·À·Ô·è¸¸4¸¬¸Ð¸ô¹(¹\¹¬¹È¹äº º\ºtºº°ºÐ»»4»\»Ä»ø¼8¼`¼`¼`¼ ¼ ¼ü½,½x½À½ð¾¾L¾\¾ˆ¾ ¾¸¾Ü¾ô¿ ¿$¿<¿T¿l¿„¿”¿¤¿øÀ$À4ÀDÀTÀàÀðÁÁhÁxÁˆÂ €ÂÂäÂôØÄDÄTÅ0ŰÆ$ÇÇÇ0ÇHÇ`ÇxÈ È¬É$É´ÊHÊðËXËÔÌ̈ÍÍtÍÈάμÏDÏÀÐ`ÐÈÑ8Ñ Ò8ÒÀÓHÓôÔ Ô$Ô<ÔTÔlÔüÕ¨ÖTÖlÖ„Öô×¼ØtÙÙŒÚÚ˜ÛHÛÜÜtÝ$ÝÈÞTÞ¤Þ¼ßhààlàÔàäàôá ááÄâtâøã¼ä\ååˆåìæ\ççHçÈè8é8é¼êDê\êüëhëØìTì¼í íŒíôîLî¸ï€ðð˜ñ ñ ò<òÀótóðô\õ õ”ö(ö°÷$÷x÷äøHù4ù úú4úÐû4û üülüÈýTý´þ þ€ÿ(ÿ¬Œ$Ä<à\¸L¼0ÐlÌ<L\t„ Ð \ t Œ ¤  Ô X ð ¤ `|̈L(@Ô¼Hà@¬ü,Ð|¬Ì° 8 ´!!$!d!ˆ!¬"à#ˆ$T%%”&&œ'4'ˆ'Ð(0(ˆ)()¸*Ð+Ì,ˆ-L-ü.¤/T/ø0¬1X22¬383¼4H4Ì5€6(77È8\99X9¸9È:4:¸;4;à<|<ô=l=ð>t>ü?ˆ@@xAA¨BŒCHCXCpCˆDDDüEtEìF|GGHH”II˜JJ0JHJ`JxJJ J°JÈJàK@KTKlK„KœK´KÌKäLDLœL´LÌLäLüMM,M„MÜMôN N$N<NTNlN„NœN´NÌNäNüOO,O¤O´PPPôQlQàR„SSœT@TôUˆVVŒWWX$X|X¨XìYLYdY”YÀZ ZLZdZÌ[´\\”\ô]Œ]ü^Œ^ø_°``\`ÄaTaÀb„bäcDcÔd¤e,eÈfgDhhxi„j,jük°lLl„làm(m„mün\n¼nÔnìoooDoœppqq˜rr¬rüs\s¤süt upvv°ww˜xx”y,yôz€zè{X{È|(|| }8}€}Ä}ð~T~|~Ü~ø(€€€ŒxÄø‚h‚¤ƒƒ|„(„œ…8…´…܆0†¬‡d‡ìˆˆ‰,‰Š Š|Šì‹„Œ@xŽ Žìhä ‘ˆ’$’Ø“¤”h•€•ð–`—@—䘰™H™Øš¼› œ8œÐœž(ždžÄŸŸ|Ÿà ˜ ô¡|¢$¢ˆ¢Ì£8£\£”¤Œ¥œ¦T§<§ø©ª ««4«Ð«è­,®Œ¯\°(°¨±\²²¸´(´Äµ¤¶d··¤¸L¸ì¹lºº¼»„¼8¼¤¼¼½0½ä¾Œ¿¿|ÀÀ”À¬Á`Â8ÂPÂìÃhÄÄàÅÅ´ÅðÆhÆØÇDǬÈȘÈðÉ0ɘɰÊʨÊØÌHÍ,ÎΨÏXÐÐÌÑ”ÓÔdÕ ÕìÖÖlÖÐׄØ$ØÐÙ`ÚÚÔÛxÛüܤÝÝpÝäÞpÞðßœàládâ8ãã¸äLäøåÜæ|çXçÜèpééœêLê¨ëPì4ì´í´îXï ï„ïìð€ñ ñœñìò`ò¼óLóôô@ô¼õ8õ öö°÷\÷ðø„ù ù<ùÌú(úˆúüû˜ûüü8ü°ýý°þLÿ(ÿLÿìHðpä Ð4”l¨ @ ´ X  h à  € °  ´ èX´lø(@Xpˆ 0HÀ €„àtÀP¼,„|ôlÌ$xà0œ øP L|ðLœ´Ø $ l ” Ü!!T!„!Ô""|"ø#`#ä$l$´% %l&&ˆ&Ô'€'Ø((ˆ(È)<)Ø*Ü++ø,à./Œ0`0ü2p3(3ä56h7ì88°9|:;\<„<À>@? ?Ì@ÔA(AŒBBˆC(CðDØE¨F|GèHÜJJˆJøK`K¬LTM MàNìOOO4OlPPP QQ¼RlS0TPU(VpWX$X´YpZ(ZÈ[|\t\ì]¼^$^ô_°`8`Üa¬b<ccÄd8dØe f€g@gèh`hèiTiÌj\kk¼ll¨mm€n˜oàp˜qÜr|sœt„u8uävÈwàxŒyˆzÀ{x||€}}Ð~,~Øà€Ì¬‚ ‚xƒ(ƒð„¼…\…¤††¤‡‡x‡ðˆ ‰T‰ÀŠtŠà‹@‹ŒPŒà@ÜŽ,¼T¸‘ ‘Œ’’“,”•T–°—D—ˆ˜™Lš4šˆšð›H›´œ œÜpžžpŸŸ4Ÿˆ ¡¢l£´¤p¥T¦ä¦ä§ø©,ª$«h¬h­È®ð°Ä²€³<´0µH¶h¸\¹ˆº4»0¼,½X¾\¿DÀ(ÁlÂ4ÄÅHÆ<ÆüÇøÈàÉøË4Ì8ÍDÎ`ÏÏ„ÐÐhÐôÑlÑôÒPÒÀÓ\ÔÔÐÕ8ÕÐÖ„××¼Ø ØøÙ|Ú(ÚÜ۴܄݌Þ|ß|à´á€âlã@ãÐä|ååŒææ°çç€çäèHè¬éé¬êDêàëtììœí8í¬î`ï$ïàðˆñ8ñÄòxóóÀô$ôXô¼õõpõðöTöœ÷÷,÷èø4ø¼ùTúú„ú¸ûdüü<ü¬ýPýxýàþþˆþðÿ0ÿȈ@ìÌhX äˆ \ Ì X ä ¨  Èdôhä¼HØ\x$dÄL|œ8¨@øtÌœ4¼ p!!x!ô"˜#d#ä$Œ%<%Ü&T&Ð'¨(D(à)|**˜+H+Ä,¤-P.@.Ô/¤00Ø1d22t2ü3ì4l55ä6À7`7ð8¼9L9Ô:˜;p<<Ô=|>`>ð?¨@tAAÈB¤C´D¬E FÐHHøJ K(LMxN¬PQ`RlSÄTÈU´W(X YdZ¬[¬\Ø] ^”_ä`ta,aÄb˜cld4e$fPghiiäjÜk¤l|m|n˜oðq4rDs tävwxŒyÄzà{ì|ü~(X€¨‚ƒt„І0‡ˆ‰,Š”‹ì\ŽÐt’<”•ä—¸™lš ››àœŒlž<žÀŸ¸ Ü¢8£t¤Œ¥Ô§¨©hªX« ¬À­Ø®ð°±²t³¨µ(¶”¸¹ˆºÜ¼°¾P¿0ÀHÁpÂTÃTÄ4Å`ƤÈÉ<ʈ˸ÌXÍ0ÍìάÏxÐ<Ñ0Ò@ÓhÔ¼Ö×|ØÔÚ ÛŒÝdÞ,ßààÔáÜâðã¬ääåÌæäçüèÌéÈêÈë¤ìÈíôï ð@ñdò¼ôDõÌ÷øpùäû0üøüøþÐx4Ø¼ÜØÄÈ ä ¬ <   ¬¸pÌÌȘX¸$ˆ´Ä ø"Œ#,$%%¬&¸'(t)T*œ+ø-.//è1d2„3ä5\6„7°8ü:;l=>¸@˜BC¼EFÜH´IHJJÄK€L@LèMNO”PˆQˆRxSTØVWHX€Y Z¬[À](^h_L`ˆa8bcldÜf|gØi0jül8m°o@p<qXr„s¤tÄuøvÐxLy0z8{L|8}@~P€\‚‚øƒ¸„œ…t††ôˆˆøŠ0‹DŒ\˜<ôè‘à’¼“¤”„•x–€—˜™Tš¨›$›üœ°ž4žàŸŒ¡¢\£°¥¦0§À©`«¬¤®¯@°è²L³äµX·\¹ºÈ¼d½¸¿œÀÀÀäÁdÁ´ÂL¤ÃÃhÃÈÄ(ÄÜÅ Å”Æ@ÇLjÈ<ÉÉ É8ÉPÉhÉ€ɘɰÉÈÉàÉøÊÊ(Ê@ÊXÊpʈÊ ʸÊÐÊèËËË0ËHË`ËxË˨ËÀËØËðÌÌ Ì8ÌPÌhÌ€̘̰ÌÈÌàÌøÍÍ(Í@ÍXÍp͈Í ͸ÍÐÍèÎÎÎ0ÎHÎ`ÎxÎΨÎÀÎØÎðÏÏ Ï8ÏPÏhÏ€ϘϰÏÈÏàÏøÐÐ(Ð@ÐXÐpЈРиÐÐÐèÑÑÑ0ÑHÑ`ÑxÑѨÑÀÑØÑðÒÒ Ò8ÒPÒhÒ€Ò˜Ò°ÒÈÒàÒøÓÓ(Ó@ÓXÓpÓˆÓ Ó¸ÓÐÓèÔÔÔ0ÔHÔ`ÔxÔÔ¨ÔÀÔØÔðÕÕ Õ8ÕPÕhÕ€Õ˜Õ°ÕÈÕàÕøÖÖ(Ö@ÖXÖpÖˆÖ Ö¸ÖÐÖè×××0×H×`×x×ר×Àר×ðØØ Ø8ØPØhØ€ؘذØÈØàØøÙÙ(Ù@ÙXÙpو٠ٸÙÐÙèÚÚÚ0ÚHÚ`ÚxÚÚ¨ÚÀÚØÚðÛÛ Û8ÛPÛhÛ€Û˜Û°ÛÈÛàÛøÜÜ(Ü@ÜXÜp܈Ü ܸÜÐÜèÝÝÝ0ÝHÝ`ÝxÝݨÝÀÝØÝðÞÞ Þ8ÞPÞhÞ€Þ˜Þ°ÞÈÞàÞøßß(ß@ßXßp߈ß ߸ßÐßèààà0àHà`àxàà¨àÀàØàðáá á8áPáhá€á˜á°áÈáàáøââ(â@âXâpâˆâ â¸âÐâèããã0ãHã`ãxãã¬ãÈãääää8äTälä„äœä´äÌäääüåå,åHå`åxåå¨åÄåàåøææ(æ@æXæpæˆæ¤æÀæØæôç ç$ç<çTçlç„çœç´çÌçèèèè8èPèhè€è˜è°èÈèàèøéé,éDé`éxé”é°éÌéäéüêê,êDê\êtêŒê¤ê¼êÔêìëëë4ëLëdë|ë”ë¬ëÄëÜëôì ì$ì<ìTìlì„ìœì´ìÌìäìüíí,íDí\ítíŒí¤í¼íÔíìîîî4îLîdî|î”î¬îÄîÜîôï ï$ï<ïTïlï„ïœðTðøññÈñàñøòò(ò@òXòpòˆòœò¬òøó8ó¤ó¼ôHô`ôxôô¨ôÀôÜôøõõlõÄö@ö¤öð÷€ø ø$ø<øTøløˆø¤ùù|ùøú„úøû°üdü|ü”ü¬üÄüÜüôýý,ýHý¨þþ4þLÿÿ4ÿLÿdÿ€ÿœÿ¸ÿÔÿìddd|Œœ´ÌÜHŒÌˆüpôxP|”|´    Ð è  , x Ä d |  0 € Ð øHd„à<Tl„´Ì t¨t¤,@h€¤0DXl€”¨¼Ðäø  ä hðÄDÄÜäp” xì¸!!Ä"p##´$ˆ%@&,&¼'L((¼)°*D*Ð,D-H-ü.˜/H040à1\1¸1È1à2˜2¨2¸4$4Ä5$6<77¤8È9 ::€:ä;8;P;p;ˆ;¨;È;è<< <8H>X>ä?”@hA0A@BBôCCC$C4CDC\C|C”C¤C¼CÜDDD,DDDdDtD„D”D¤DÐDüEE$E`EœEÈEøF F F`F G GxG¸GøH H H\HpH¤HÀHÔHèI0I˜JJŒJÜKK8KhK˜KÀKèL,LpLÄMM<M`M„M¤MÄMèNN(NpN¸OO@O€OÀPP4PlPÈQ8Q”QÌRR<RtRÄSSTS˜SÜT TdT¨U<UÐVV$V\V´W0WhWÔX`XˆX´XôYlYÀZZxZÐ[,[„[Ð[ì\$\h\|\˜]@]Œ]¼]è^^^¼_L_l__È``,`p`”`À`øa4a bˆcàd˜eäf@fœfàgXgŒgÜhdhÜiiXi˜ièj<jPj¸kk„ll|mmˆn,n¨ooLoŒoàp<p˜pøqXq´rrTr”rØssPs¤sättLtŒtÌu(uˆuÈvvw$wpw¼xx|xðyhzz¤zä{${œ||h|¸}}t~~¸<¸ô€0€”€üDŒ‚‚|‚؃4ƒŒƒè„@„h„„Ä„ø……@…¨…ø†d†¸‡‡ŒˆhˆÄ‰‰X‰Œ‰ÔŠŠ<ŠPŠxŠœŠÀŠð‹$‹d‹ ‹äŒ,ŒxŒØ0h ŽŽlޏŽÜH€ °ÀìD¼‘,‘\‘Œ‘Ü’ ’`’È“0“˜””L”¤”è•,•„•Ü–(–x–°–è—`—Ô˜x™™|™Øš šhšè›lœœÈhÈž,ž˜ŸŸxŸè Œ ü¡ ¡@¡`¡€¡˜¢4¢„¢˜¢Ø£ £H£p£ä¤X¤Ð¥H¥¨¥È¥ø¦„§D¨4¨Ì© ªx« «ð¬À­|­˜­´­Ð­ì­ì­ì­ì­ì­ì­ì­ì­ì® ®,®L®l®Œ®¬®Ì®ì¯ ¯,¯L¯l¯Œ¯¬¯Ì¯ì°°<°h°”°¼°è±±<±d±Œ±¸±ä² ²8²d²Œ²°²Ü³³,³T³€³¬³Ð³ø´$´P´x´ ´Ì´øµ µPµ€µ°µà¶¶@¶p¶¤¶Ø· ·@·p· ·Ð¸¸0¸T¸|¸¨¸Ô¹¹4¹`¹¹¼¹èººHºtº¨ºØ»»H»x»¨»è¼¼L¼Œ¼À¼ð½0½x½¼¾¾<¾X¾t¾¾¬¾È¾ä¿¿¿8¿T¿p¿Œ¿¨¿Ä¿Ü¿ôÀÀ,ÀHÀdÀÀ¬ÀÈÀäÁÁ ÁTÁ °ÂàÃ$ÃhèÃèÄ8ÄxĤÄÐÄìÅÅÅ4ÅhÅ”żÅ䯯lÆèǔȜȬÉ(ÉDÉTÊʬÌDÍÐÏ ÑlÒÈÓ<ÔØÕ(ÕdÕÈ×לØ@ØpجØèÙ,ÙhÙ¬ÙðÚ<ÝÝÈÞxÞøßìà\àÌáââ¬ã<ãÈälåæDæÄç<çÜètéPêêüëŒìXìØíˆîØïtð¬óó¼õtö¸÷ŒøÜú´û ü8ýý|ýøþœþìÿ„ÿÐ0|Ð0È0$ܰ€\P 8 ø Ü @ àd ø´tØp´èд@„Àì@¤,°<ÄÔDÈ l¼H¸XÄ  ` Ä! !À"p"ä#€#À$$´%Œ&È'œ(à)Ü+Œ..ø00à22Ü45<67D8X8°8ä99L9|9È9ä:::p:À;,; ?@@d@øAÄB0BÔC„CôDœE<EØFLFôG°H0HÔIœJJÜK¤LXL M$MÌN$N˜O0O€P P°Q(QTQ€Q¨QÐRRlRR´RøS`S„S°SàTTHTT´TäU(UlU°UðV4VtV¼WWLWüXlXØYLYÄZ Z”[$[ \@\è]X]|]¼]ä^X^Ä^ì__P_Œ_¬_È_ø`(`X`„`´`ÜabLc°dteHeÔfdg\hPiÜkllÔn„oüqÄrTs$tDu¼vtwˆxœzz„{P|X}¸~ø€Œp‚ ƒÌ…L†0‡ˆˆˆ„‰`Š‹ ‹°ŒŒäŽèD‘À’`“Ì•x——虚,›@œ¨ôžxŸP ¡ˆ£\¥¦@§P¨ ©°ªÐ«¸¬´­Ð®è¯°°|±X²²ì´(´Øµø·,¸P¹Ü»»Ø»ð¼D¼T¼ð½¤¾@¾ô¿ðÀäÁèÂÜüĬŬÆøÈÉpÊ<Ë\ÌHÍŒÎLÏdÐ`Ñ´ÒdÓdÔ$Õ<Ö`×ÐØlÙ`Ú4ÛdÜXݤÞlß8à\á`â¼ãHä$äð唿\ç|çôèˆétê8êäëììÈídîXï$ï ðpñ òôTõøö¨÷Pøø°ù¬úûxüüäýäþÜÿ¤d4°”DLT4È   Ô ì   4 D ˜ ¨ ¸ È Ø è ø   ( t ´ h °Ìä„dœ¸ð(H|Ì8pŒÄä T¤Ø€¬h`x°Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@XpìhÀÄxì `!! ""˜##¤#ð$<%X&@&ˆ&Ì&ø'X'€'à(@(¨(Ô))p)Ì**D*¬++\+¤,,Œ,ä-<-Ì.„.Ô/$/¤0P0˜0à1l2 2x2Ð3 3p3Ì4(4p4¸55\66¤7$7¤8|9T9ü:¤;<;Ô>€>ü?d?Ü@P@ÜA0AœB B¸CCD(DÀE@EÀFpG G¤H(H¸IHI¸J(JˆJèK$K`KÐL@L¤MMtMàNNXNÀO(O´PLP¸Q$Q¸R RŒSHS|S|TT´U°UÐVpVÔWÐXÜY”Zˆ[P[ä\¸]¤^t_¬abcDdte¨fähdjkldmäopdqðsLtÐvˆwœxÌz4{p}$~x€Ð‚ä„…|†€‡¸‰<Š‹Œ`”Žü¨‘¸“”|•Ø—™t›˜œôž„ \¡ø£,¤¦8§°¨äªT¬¬È­À®ˆ¯4¯ü°”±”²h³t´µ„¶$¶ü¸ ¹¹¸º¤»Ä¼Œ½¤¾ôÀpÁ˜¬ÃøÅ€Æ(ÆèÇðÈŒÉXÊ`Êô˼ÌÀ͸ÎàÐHÑÑðÒÈÓäÔÌÕÈ××ÔØÜÚÛÜ<Ý<Þ(ß0à,áhâÜäxååÐæXçèéêPëœììîïˆñPòdóœô¼õ´öèøHù”ûüXþÿðØà ð , t¼è@|@¤HtÜØ p!È#8$ü&è(¬*4,-Ü/T1 2ô3œ4x5 5ä6t7@808¬9h:L:à;¬<Œ= >x?¬AB´DEˆGLHDIpJäLLèMèO(P0QlRtS„TÈVHW(X`Y|ZÄ\D]€^ø`¬aÄbÈdexfÐhiœkhl¨n0oÔqTr¼tXv0wx,y€zH{({ô}~$L€¤ìƒœ„ІD‡ìˆ°‰´ŠðŒŒäð t‘¸’„“”Ô•ô–´—¬˜à™ø›LœØ¼žà (¡x£¤,¥ˆ§¨l©°«¬¤­Ð¯0°Ð²8³d´È¶h¶ø·´¸\¹ºº°»x¼„½X¾¾ô¿ÀœÁ< ÃÃÐÄðÅÀÆÌÈÉ Ê€˰ÌôÎ|Ï”ÐàÒpÓÈÔÄÖ ×|Ø ØØÙÌÚˆÛ€Ü<ÝhÞLßHà„áTâXãœä¬å@æ ç$çÀè¤éPê\ë,ìíîï€ðdñ¤òøó¨ô˜õ¬öˆ÷Ìøpù@úPûûàüèþþÜÿØ   ü , ” 0 ð Ü ¨ X P ä Ü ˜ d l ¨ 8    < ¤ 8 ü ” ˆ 4  8   , !4 "¤ #` $0 %@ %ä &¼ 'Ð (¤ )d *` +˜ , ,ð -è .À /Ô 1 1ì 2ø 4< 5P 6X 7¨ 9 9Ð :´ ;È <ì >, >ô @ AL BH Cd D” E¸ F Gx H¨ Ih Jl K  L` MT NŒ OD P4 Qd R\ Sˆ Tø Uì W X„ Y¤ Z [À ]$ ^ _ ` a b\ c¨ dÌ fT h ið kÀ lÐ n$ o´ pô r sP tÌ v w¼ xÈ yì {X |0 }H ~ˆ Ì €À ô ƒX „€ …Ü ‡t ˆ4 ‰ Š ‹8 Œ Ž$ ŽÐ ¤ P ‘d ’, “ ”, ”´ •| –h — —ä ˜ì š$ šÈ ›¤ œ° ˆ ž žô Ÿü  Ü ¡ð £L ¤< ¥\ ¦X §¬ © ªŒ «ü ­œ ¯d ±, ²$ ³T ´¼ µô ·L ¸¸ º »´ ½t ¿\ Á, Â@ Ãh ÄÌ ÅÈ Ç Èx ɰ ʬ ËÜ ÍP Έ Ïd Є ÑÌ Ò” Ó` Ô( Ô´ Õp Ö Öô ×ô Ù Ú ÛL ܰ Þ Þ° ß” à| áD áР☠㜠ät ål æx çp è¤ ê ë| ì ìà íè î¤ ïœ ðÀ ñx òh ó˜ ô| õ  ÷ ÷¤ øt ùˆ úX û` ü¨ ýH þ þ° ÿ@  ì  \ è ¸ ¬ ¤ ´ ¸ ” ´ ø  D à  0 ( 8 ˆ p Œ ô   @ ¨ ¼ " #Œ $œ & '€ (ì *4 +È -œ .Œ /¬ 0¬ 1ü 3\ 4Ð 6@ 7à 9¤ ;d = >x @( B C DT EÔ G Hx I” Jä Lx Ml N° P( Q€ S T° U¨ Vä XT Yt Z [ô ] ^¬ ` aŒ bˆ cÀ e0 f g@ hœ i| j€ k` l” mÐ o pt qÈ sD tð vœ x8 yˆ { |ì }ü T €Ü È ‚ð „X …` †œ ˆ ‰8 Š€ ‹Ø $ ŽÐ  ‘œ “X ”, •< –| —„ ˜€ ™ šè ›Ð œø ž\ Ÿ€   ¡à £l ¤l ¥¨ § ¨ © ª€ «¤ ¬l ­` ®˜ ¯´ ± ²œ ³´ µ ¶˜ ·ì ¹4 ºÀ ¼t ½„ ¾Ì ÀX Á„ Âô Ä´ Åd Æ4 Æð Ç  Èh Él Ê ÊÜ Ëì ̼ Í` ÎT Ït Ð| Ѽ Ó@ Ô4 Õd ÖÄ ØL Ú ÚÔ Ûð Ý Þd ߨ áL âì ä€ åT æx çÀ èÔ ê ëT ì¼ îH ïø ðä ñè ó( ô$ õ@ ö ÷h ø| ùÌ ú¤ û¼ ý ýä þð 8 8 h à x D è À Ô ( ¼ Ü , Œ  „ Œ 8 ¤ D Ü h € , Ì < ˜ è € Ð T ¨  Ä  ˜  Œ ¬ 8 ¬  ¨ @ Ü d ø  ˆ ä Ô œ h D  ´ !¬ "ä #Ð $¼ %Œ &4 &Ü '° (ˆ ) )Ô *h +( +ð ,À -H -à .¨ /\ 0 1 1Ð 2˜ 3\ 40 4Ø 5ˆ 6´ 7  8À :$ ;< < =p >€ ?ø A B$ Bì C´ D° E” F¨ GØ H  I° Jd K` L| MP N< OT P Q RX SÐ U¤ VÌ Wø Y\ [( \” ]Ä ^Ü `< aì cÈ e˜ f h4 j k¨ m n o¼ qŒ sX t| v w< xT yh z` {p |ô ~T \ €h ¸ ƒ4 ƒð … † ‡ ˆ` ‰P Št ‹¼ Œ€ Ü Žü ô ¸ ‘¼ ’è “Ì ”ð •Œ –  —œ ™ ™ä šÀ ›´ œ¬ ž ŸL  D ¡¬ ¢P £H ¤x ¥  ¦¼ §À ¨t ©4 ªD « ¬ ­T ® ®Ü ¯Ü ± ²` ³L ´d µˆ ¶¼ ·ð ¹ ºP »Œ ¼8 ½P ¾4 ¾Ð ¿| À` Á” ˆ ø Äœ Å„ ÆL Ç\ Èà ʈ ËÄ ÍP δ Ïä Ñ” Òœ ÓÌ Ôà Ö ×  ØÐ Ùô Û ÜÀ Þ ßÀ á áü ã< ä@ åd æì è éD ê¤ ë ìÔ íì ï( ð˜ ñ¨ óŒ õ öè ø ùL ú„ ü ýX þì   Ü ø p H h ° ì P h H h ô ˆ ¤ , 8 p Œ „ Ø  H   ! !Ü "ˆ #P $Œ & &à '¤ (| )œ *x + +ì ,¤ -„ .< / /Ô 1 1ô 2ð 3° 4œ 5  7 8h 9€ :ð <8 =Ì ?< A< C D` EŒ Fü HP I@ Jt K„ Lð N< Oœ Q R` Sà UD VØ XP Y˜ Z¸ \ ], ^l _ˆ al c4 dÀ f$ g gô i” k l° n, p q¸ s¼ uœ vø xl yÄ {d |à ~Ð € ‚„ „\ …@ †< ‡( ‡ø ‰ ‰ì ‹P Œ X Žx ä ‘H ’l “` ” ”Ô • –$ —( —Ô ˜¼ ™ø š¨ ›ø œÈ ¨ žH ž¼ Ÿp  d ¡ ¡° ¢X ¢Ø £œ ¤d ¤Ø ¥ ¦D ¦Ô §x ¨< © ©Ð ª «X ¬@ ¬Ô ­x ® ®È °, ±D ²l ³° ´ð µœ ¶$ ¶  · ·< ·ä ¸¨ ¹˜ º@ º¤ »H »Ì ¼$ ¼t ¼Ð ½ ½€ ½ü ¾” ¾ü ¿\ À À” Á ÁÌ Âd Âì Ô ÄH Äè Åh Åä Æp Ç| È< ÈÈ ÉÈ ÊH ʰ ÊÈ Êà Êø Ë Ë( Ë@ ËX Ëp ˈ Ë  ˸ ËÐ Ëè Ì Ì Ì0 ÌH Ì` Í ͸ Θ Ï| Ð( Ñd ÒT Ô Ôð ÕÔ Ö@ × ×œ Øh Ùt ÚX Û0 Ü€ ÝL ÞŒ ߀ àÈ â ã¤ ä” æl ç˜ èÀ é¬ ê€ ëp ìT íÈ ï ð ñœ ò¬ ô, õ¸ ÷ˆ ÷  ÷¸ ÷Ð ÷è ø øl øÔ!nš.±/<²í2±Ü<²í2±/<²í2²ü<²í23!%!!!MþÔ þõšýf!X‚ÿ÷í¤ 7#'.546322#"&4½ "5I, °l û #*P þ3 ..M¯K¤ #&54632#&54632+ ° ¯©#.w(©#.wð–##7##7#537#53733733#'#3×m:†!:!ktnv:…:ai&…†7ØØØØ7†7ÊÊÊÊ7†††,ÿ©É×$*046753#.'#5.'53.5654&4ZX"q0 F?(G4a`"?N-RGcO±g)ar,@N ?? (o@Aö,,C,KOWW‚OI7W-æR#2œþ÷`.9=ÿó¤ 5C2#"&5462>54&#"232673##"'#"&546"32654'.16.(3B6B‡+L)).J"þë&/)/E('þ0_4:'wV1E‡V0a!=f "s83:r)3G:^”þ«Li0!/hm $x&ýOr ]§K4_—¯I"U *ÿóî¤-8B654&'533267#"'#"&54?&54632>54&#"327&ëFU*I0:SA[0¯…¤ #&54632e ¯©#.w0ÿO0¤.54>7$8G6%%2M2! ,6226,±-P[€EHUO&$:]Y]†_<"ÿO¤'>54.')8G6%%2M2! ,62,B<¤-P[€EHUO&#<]Xy¢V/E °¤I46='5#"54>7'.5463254&5462>2#".'#"&Ö&1 $%Y' R23,!V %E"D'%2.R- #7 "`  WZ'7 2Xú 533##5#5ùBÛÛBÛÜÜBÜÜB8ÿsÃf#"&54632'654Ž  !".>2 R 3&-T82'Â3#'öö?Fÿõµd 72#"&546}!" !d" "ÿ÷ÿò¤#äDå¤ýN²ÿòܤ".5467632" 4&ú4R0 5+7Ob||eƒB0JaX+Xž*4Àš˜À˜þ½þÅ<¥oФ"57!5>54·6´$;þì8'Q[ý¨$/Å/Û¤>323267!57654&#" !)I.Nk€¨ï"! 7þz²‚N?4?Ý"A+"fKq†°+‰ ½Šz?N9I+ÿò°¤,7232654&'>54&#"'>32#"&546Q["7L6/M"16=1/GYREW*4#QKj ؤ %##5!53#ØfMþç:,Nðç@§§@½þCWþ© ÿò¶°(%4.#"54?3267+#"&5432326e/CS= mÑ &Ä*’Ž%9KE#8B+Y;PÂ5R- í Y Uuq;\8$ !%>c"ÿòÔ¬ "&547>7>32"32654&e{§7iUvž/0!VfumD/LB58G¡„Îw&#™qq`g‚Œ<;t…YR^gÿøÁ– ##"'7ÁÔAÆÙ)+ ;–ýrT3“8ÿò½¤$2#"&5467.54632'32654&'>54&#""ZAkZUk1QO-lRKa<\<,$F91=*B <3/=:sC[:M\\I3E=ED1DZP>3H,#F0AP=1*? 44=8+*Jÿêˤ#'>7#"&546322>=4#";rŸJLQcwYa|WN3dg01„, Cšz9p[e‡ž|e±9%"$ %'þ!68YiQÿõÀË 2#"&5462#"&546ˆ!" !!" !Ë" "þ™" "PÿsÛË#"&4632'6542#"&546¦ !".<4 R,!" !23&-T82Í" "ÿö%5% þüþ\¤ æBæH¿¿x‚!5!5þøþ‚BBÈBBÿö5-5¤þ\ü H¿¿HæBDÿøž¤*2#6?654&#"#"462#"&546æLl""%2%?-%:&0]L ¤UF$K/-@ZMA@UG2F& 0|Sý¿! tÿò)¤2>"327#"&54632#"&'#"&546327332654&4&#"326â~œ¤€Yk I[5›ÔÕ˜‹½nJ$36G%3qS EA'1P©)_ 0H…»‡‚¨0!Ä’Ì©|a(!HA/Z¢&þ .zKp ïoQ'.–¢%#5>54/!3#5>73%3Âÿ()þú.DÆ%).Ðùþ8çt+`u)5mëýÈ8ìQ–*5%#!5>54&'5! 2>54'&#32654&+"Q3dEþ²>"!?4="þÅ-B:T0ƒ_FMZV,´:9# 8¼7ª!3 ;´ :+\#øI?;CFÿòy¤46323273#&#"327#"&À@p !  7 m-LQ.vi.ŽU”¸EœÃ!!⺢ˆWAe=Bº­–%#!5>54&'5!24.#"3 ­6T‹Xþä9;[W9m,FrI>N-V\C, 6¼7)AYV6+OQ:%þ U–)7;2673!5>54&'5!#.+"32673#.+É!Hk\%-ýä7 7 6U‡ š@%  &>šP3Q©!5¼5!C& Þ'8è>" "–$%#.+!5>54&'5!#.+"32673ß (=‘!:þè9 7 6Uˆ ‘<) ç=#Ú6!#>±5!C& Þ#< ÿòŤ."326=4&'5!#".5463232673#.ˆ9X6" z6O9ÿ,@-ZbJ1Á–:q  `|)@VO(‹¡#¢8,Ë,0IzN™Æ!ÓN]¾–+!54&'5!!5>=!!5>54&'5!Ñ/:: 8þê:þÑ 8þê:::gÂ66þD5 "?ÃÎ5 "?±66;–74&'5!!5>s!@)?#$>þ×?"m¼7 7þD7!  ÿòr–723254&'5!#"&546; & ==XQ+8l BÏ77þŽ^g( "Ó–35!!563654&/!5>54&'5!7654&'"431¾éD2'þÏ *I9j :þæ; :=±Nƒ1¼úI"`8i»7#>±5!7Í¡H  V–%2>73!5>54&'5!3b2L* 0ýæ7 7;"7'%#®!5¼5!!5þ' _–$ ##5>54&'533!5>5¢ÿû$:ë>#!>ÆçÝÇ8 7þè; =ýÃ&þmL1/M–7þù 5þD5!#> ÿõÖ##5>5.#534&'53à þF$:ë>## «%;ëƒ3+ýò&þxL1/M¹#þQL/"ÿò°¤ !"&546324.#"32>c‡º¸·¹G+:71N- ,W<=Y-¿š—ÂÁœ—¾VHpD,*?VO)3bb<54&'5!2%3254&#" #:dB'#;þè98-TS2þ¬"®`eá06'¶7!!?±6&J:þü“MI"ÿN½¤-##"/.546 4&#"32>°%306!=€V ói/dƒ¸¸rs_2N. (BE&1M. K7`A6  OGz7" ˆ˜Ã•Œ§)?TM(XB)@UP“–%/2#!5>54&'5>54&#"%+NS2 Î%¡î8 :þë88»yqY^–#J5+ý4Å6 #>±5þÁMi"Ô[V?Q–#"#7!#.+!5>5þ6T949U6">þÜ> l.RªªS-þ7 !@ÿòÁ–%73267654&'53#"&54&'5!ÎKa8Z$:è> 5iM€{;<édg+$+]K1,Lþû;XO*}‚876ÿõ¹–#.'5!#654&'5¹%Þö'& .)—“ )– ;ýÏ%B%[þ®o0ÿõ¤–,# #.'53'.'5!654&'5¤(S:? šÁ''õ& k!"+ M„}&–'ߦ§þYF+ þˆR<" Fþ«S- À–4!563654/#5>?'.'5!7654&'5¸15/’À()þ×23_w4 ,é'*@mF=2.0U*q()–!:¶þî+LŒ”A OÁ g4 v;Š2 ¿–&!5>='.'5!#7654&'5¿'8+”$CþÎD!ƒ24" .”'–-BâÂ9!A®ÀI?Þâ U–%2>73!5#"#7!’. ý̵Ý3B! þP& ) °a,$!«ýŸXÿd+– #3#"3+ÓÓZ1ƒ2ý`4ÿ÷ÿò¤3# CåD¤ýN"ÿdõ– 3254+53#"Z-1VÓÓƒ, 4üÎ)¾–#3#\Dµ<µD)mþ“!ÿƒôÿµ!5!ôþ ô}2ûò¦#'&5432ò(š"ûa%ÿöºÌ+874>754#"#"&54632327#"&'#"&75327>%+GY/L*aGR> 'V<.;úZH%"' a&>''=S/AOQÃ!"'I, - ÿöÔ«$>32#"&54&#"576732654&#"™N.Ke‡cDE;'<©þÎ%0}\k’)þ—ü\S[m.ÿöœÌ!74632#"/.#"3267#"&ƒX?[" =KWD+>$ '&>!SkÕoˆ=*.aMVm*4 4 }ÿöë«*'5#"&5463254&#"567327#26=4&#"X0PSfzV63[8ð&3>(9DL @Cw`j•+œýÉ#+æ(5#53>32U 9{z =þü6RRP^-;DYt þÆ87: py#ÿ&ÖÌ/=L7467.54632;##"'"'#"&5467.32654&#"4.#"326I>2+aF((MS]? (N7B7TyGf-5JPBUh8Dey,#'9-#(6 :>/D_ '+)EV*:/8-D9(7'(% !(6+0=)2,HY1 ç«*#5>54&#"5767>32#5>=4#",Ø+ D/#D,{)Ô+K3Wñ45× þÐ-'ŸÇ4 3Æjý«"57#5>=4&2#"&46> ›1í40Š7þ66è!!*ÿºÿ&«"567#"&54632326542#"&46M-PLVS)52!Šþ7jp<>M{<!*ù«457677654&'53#"#53254./#5>54&#"W&‰Ì%S>™5!Ú Œê6o þ\z  9:Â&! »¸ 'â$«567#5>54&#"c<0ì/ oý«)(Ý#Ì?567>32632#5>=4&#"#5>=4#"#5>=4&#"HD>0=ü/ *Ùiþæ)ý$åÌ*567>32#5>=4#"#5>=4&#"J@3;#7?%Ð&I*$&Ô&ŽO0!OGå%"/Ña"þç+ø%ÿöÖÌ 2"&54632654&#"ú`|€¼}{!N?8@P?5AÌ€bhŒ‡egƒ¹k–`Ug‚Vÿ'ÖÌ,567632#"&'#5>54&#"32654&#" ?Q@PI^yY + 8ò,E#6CC8#C‰ MOx]m”/'Ô#<ö,gSWi,ÿ'èÍ$73#5>=#"&546323276=4#"h6 )ì5$DYFZ^6½>12$]@J© ýª  *¼Jx_l”Ü+PC "ÎdgOÌ#"&#"#5>=4&#"567>32(,2"3ð0PD%4j#:á+ &ú!\5)3ÿö\Ë1273#.#"#"&#"#5332654/.54632 2+"++l-'S:T   (&-4:@5M;!:¸ ˆC8&+@7%4L œ '!-!$B*6E ÿöC#327#"5#&54>7672ÿe 0HY5 2 þâ/+# L- 6+ t ÿößÂ#%'5#"&=4&'533276=4&'533ßN;++<7B$’*.*/ž"2S++G;ü#þº-"&ë%þ©#ÿòÝÂ#"'.'53654'5Ý€ x#Ä fc/Â2þ¿2/N$ ÿÿò¶Â/.'537654&'53"/#"'.'53_!Ë#TZ{ Š[p‡´c6P) .àÞ* þ¦1+ìð',V&þûßÂ2>54'533#5>54/3#5>?'.+53ø  (ž3S€#É[O(‘r^  Ï+.0)*xÄ" Œ{ ¥#Eÿ&ÛÂ)2654/&'53654#53#"&54632—>,u 'Î  sa0‡ š(O2 *2†|Oþ ý þhl\!¢Â%2>7!5#"#7!'. þ‡ Š- [þó "#‡•!7vþkdÿK^¨.=4&'>=4>7^XM#22#.7,4'&88&'4µ6T±4..4²,7  68¨>44>¨86 Cÿò…¤3CB²ýN‚ÿK|¨"25>=467.=4&'‚!*.#22#.7,4'&88&'4¨5%±4..4²,7  68¨>43?¨86 (ºö@23267#"&#"'>£2~#6"6#2~#6"6@D 0%D 0%ÿÿaÿ&ÌÕ 3#"5472#"&546 !54 l4Þ($*P : 5ÿvÀC"+7&5463273"&'3267#"'#7&#"©t],#/K& e ,@' &$;!1"Ps=K BeŒ|‡6þÝ ,89 ŠìC ]M6J ÿøê¤=H%#"&'#"&54632654'#53&54632"&'&#"3#32>322654&#"ê'D( =3*%2)lkjY8J,7-2 }yTA"2þe##3ˆ -2$##""* ¢-$!k5((4IB,]-##y+  %ÿê: Z&'7&547'76327'#"'"2654&b))b2`=BE8b0`''`0b9DA>`á?WWzUUl`;CE9b0`''`0b:CB=`2b))b§X?>YX@>XÿË–47#535'#53'.'537654&+533#3##5>5¾®®§_)*#óA vpÃ'5\’¦­­ 0ô2¶(L(­J*ÝÜ03¸(L(I5$%>Cÿò…¤33CBBBþìžþìFÿlª¤AM4654&#"+#"&5463232654.54632.54632#"4&#"326"$&/"‰YA38&OA:P"+(/6LL6B1 <(M>7ID‘&'…1)%&" ' *qJQ5C1;&9F:*$"*# =5:T03D2<(6D8*þÇ4w&2x( <n 2#"&54632#"&546BÚn((&ÿòÒ¤%12#&#"32673#"&54672 &546"32654&›"V^CHJB-8]+[ozJ‹ÅÆþâÈÉ’y«ªvu©¨FY[TS]'/L iUZoËÈÈ’È*²~{³³|zµŠ¤*4#"&54632327#"&'#"&54>754#"26=L =/i 0+('+$ 5&q   &`s ,&*ÀM*!È -7#"./7>7632#"./7>7632‡q O4A W (L³q O4A W (Là I-;Q ' 9^ I-;Q ' 9^l‚%5!5!ÔþJølÔBþêÿÿ'Â&ÿòÒ¤ (4@%".'##5>=4&'53232654#72#"&546"32654&õ )0 %¢% %±4?O9'%é+!$GÅÈÈÈvªªvs«§˜A c  ñ! 2*H O6]¨.+O¯Ë”ŒÇÈ‘É*´|{³²x€´ #BY!! 7þÉY69†W¤ 2#"&547"32654&ŒxST=:S+==*+>>¤S=323267#57654&#"2:I&.Vy %ýbQ+6 - -;/%D-U UkW2-F#¤%4&+5>54&#"'>32"5462326Ò?4+$?.-?5¬^dcn:9š:š:>86@\mbW6ý­5!üæ"?Ÿ?[_TFǵ6 2#"&546}!" !6" "4ÿ)73632#"'732654&#"b)# (.C:-'% ccA% '- 9ø¤#5>54#"57ø¿ %v&  7þ©Š0¤ 2#"&5463254&#"Ÿ@QXA?RU ,%G-$ '¤K;?UO<@Ok=QW9H(,!Ê -747'&5432#"'47'&5432#"í€K6  7( AfD À€K6  7( AfD *¢]A 6";XD ¢]A 6";XD%ÿòΤ #%##5#53#5# #5>54#"57Î7F´Ë/F‡³þ>1Åþ•¿ %v“9ZZ1 þþ³³ýN²þ‚  7þ©ÿòê¤3 # #5>54#"57>323267#57654&#"Xþ>1Åþ´¿ %v2:I&.Vy %ýbQ+6 ¤ýN²þ‚  7þ©  -;/%D-U UkW2-FÿòΤ 7%##5#53#5# 4&+5>54&#"'>32"5462326Î7F´Ë/F‡³þ>1Åþ„?5+$?/-?=Wo¦4%“9ZZ1 þþ³³ýN²þÖ,)%!3,0#'+#N:N2'%ÿ&xÔ(4>7332654&54632#"&2#"&546-8; %?-$;&0]ELl² ?-V>i;O?@UG2F& 0|SUY,! ÿÿÂz#\ÃÔ$ÿÿÂz#[¾Ô$ÿÿÂv#X¾Ô$ÿÿÂR#hÃÔ$ÿÿÂC#j¾Õ$ÿÿ“#f¹Ì$_–:=%.+;2673!57>=#3#5>7654&'5!#.+"32673%3ä$7‘1LQI+,þ-°@DÇ! õ )14ELWoG7ýöŸå7-î%0R¨!1˜5}!.ä 0)æ#>êF?ÿ)y¤7327#"'632#"'732654&#"'7.546323273#&#"-LQ.vi-U  (.C:-'% %}•À@p !  7 mRWAe=B4% '- YµˆœÃ!!⺢ÿÿ Uz#\ŒÔ(ÿÿ Uz#[ŒÔ(ÿÿ Uv#XŒÔ(ÿÿ UB#j‹Ô(ÿÿ;z#\Ô,ÿÿ=z#[Ô,ÿÿ Bv#XÔ,ÿÿ<C#jÕ,­–-#!5>=#5354&'5!24.#"3#3 ­6T‹Xþä9SS;[W9m*CwN’’>N-V\C, 6Î,Â7)AYV6'IT=)ã,íÿÿ ÿõÃR#hÃÔ1ÿÿ"ÿò°y#\ÄÓ2ÿÿ"ÿò°z#[ÃÔ2ÿÿ"ÿò°v#XÃÔ2ÿÿ"ÿò°R#hÃÔ2ÿÿ"ÿò°C#jÂÕ2&ñ 7'77''êÄ0ÄÅ0ÅÅ0ÅÄ0ýÄ0ÅÅ0ÄÅ0ÅÅ0"ÿ°°Þ!)7.5463273#"'# 32654 &#"—+¸XWH1X,¸‘[TO1×þÌObs;"B_9˜Â1k‚ D^:˜Á2tlþ54&'5!32%3254&#" #:dB(#;þè98<PxŒþ¬"®`g _06(47!!?±6#< bþü“MH ÿ÷Ô«3#"&546323254'&547654&#"#5>54>32¸hK+6@„ _0+'/‘&%I4N\9y#œRq) ‚Ê  vAJ:1ýÛ(r2LC$SE6?ÿÿ%ÿöº¦"\8Dÿÿ%ÿöº¦"[7Dÿÿ%ÿöº¢"X8Dÿÿ%ÿöº~"h6Dÿÿ%ÿöºk"j9ýDÿÿ%ÿöºÏ"f:D&ÿöxÌ5BI"&54632>32!3267#"'#"&546?54&#"'.=2673.#"(\DA4"3"LLþú  3+A$ '_?Q03@%3AEPV (– [:'8J=¦%(+(ˆ .>-VaJC,5UJI*=1-C!$?1%þ¾54!2-$3$éA;:ÿ)œÌ674632#"/.#"3267632#"'732654&#"'7.‚Y?[# =KWD+>$'V= (.C:-'$ &L[Ôo‰=*.aMVm*4 OI7% '- [ yÿÿÿö¨¦"\8Hÿÿÿö¨¦"[7Hÿÿÿö¨¢"X8Hÿÿÿö¨m"j7ÿHÿÿÿøý¦"\åóÿÿ#¦"[æóÿÿÿð'¢"Xåó  n (2#"&54632#"&546"57#5>=4&;²‰ ›1í4n((ä7þ66è!ÿö×®(#"&54632.''7&'7732654&#"×}c]}zZ$4& *,{!y>G*1A&_![Šþ N@9?P@5A~©…deˆ#7K-A@, 20…Çj˜aVfVÿÿå~"hTQÿÿÿöÖ¦"\TRÿÿÿöÖ¦"[TRÿÿÿöÖ¢"XTRÿÿÿöÖ}"hTÿRÿÿÿöÖk"jSýRÿö%!5!'2#"&5462#"&546þøü!" !!" !ÜBæ" "þa" "ÿÖ'"7&5463273#"'#3264&#"}`{a,09'Ab€_/.A% ¡#/8?ÞŸ%+5ANyfƒm}FzhŒ{ÞþÎ*b®Æ0$VFfÿÿ ÿöߦ"\?Xÿÿ ÿöߦ"[TXÿÿ ÿöߢ"XGXÿÿ ÿößm"j@ÿXÿÿÿ&Û¦"[T\ÿ'Ö«,567632#"&'#5>54&#"32654&#" ]4AOI^yY + 8ò, E#6CC8#CoþÖNx]m”/'ÀþÞö,gSWi,ÿÿÿ&Ûq"jd\ÿÿÂ#Z¾½$ÿÿ%ÿöº>"Z:åDÿÿÂ}#d¾å$ÿÿ%ÿöº¥"d: Dÿÿÿ[¢#g$%ÿ[¼Ì:G2327327#"&547&'#"&54>754#"#"&5465327>àR> +5;*6V<.;+GY/L*a†ZH%"' ÌOQÃ!$L, .++I''=S/Aþ¯‘!>, - ÿÿÿòyz#[ãÔ&ÿÿÿöœ¦"[LFÿÿÿòyv#XÖÔ&ÿÿÿöœ¢"XGFÿÿÿòyC#eÈÕ&ÿÿÿöœn"e6Fÿÿÿòyv#YÄÔ&ÿÿÿöœ¢"YLFÿÿ­w#YÃÕ'ÿöW«*>'5#"&5463254&#"567327#26=4&#"#"&54632'654X0PSfzV63[8ð&3>(9DLe  !".>2 R @Cw`j•+œýÉ#+æ((9DL>-" x"þc#4@Cw`j•+þÅæ("ZDåHÿÿ Ul#d~Ô(ÿÿÿö¨¥"dD Hÿÿ UC#eŒÕ(ÿÿÿö¨n"e8Hÿÿ ÿ[e–#gl(ÿ[¨Ì&,3267327#"&547#"&54632%3.#"a010G$6."+6;*5Weu\LT þÎÌ *.Z?[-09*G'1$L, .* xho‡[\ A2ÿÿ Uv#YŠÔ(ÿÿÿö¨£"Y:Hÿÿ ÿòÅu#XÖÓ*ÿÿÿ&Ö¢"XHJÿÿ ÿòÅk#dÃÓ*ÿÿÿ&Ö™"dTJÿÿ ÿòÅC#eÉÕ*ÿÿÿ&Ök"eDýJ þçŤ.B%4&'5!#".5463232673#.#"3265#"&54632'6549ÿ,@-ZbJ1Á–:q  `W9X6" z6O¥   !".>2 R÷8,Ë,0IzN™Æ!ÓN])@VO(‹¡#ã 3&-T82ÿ&Öà/=L`7467.54632;##"'"'#"&5467.32654&#"4.#"3267632#"&5467I>2+aF((MS]? (N7B7TyGf-5JPBUh8Dey,#'9-#(`   !".>2 R6 :>/D_ '+)EV*:/8-D9(7'(% !(6+0=)2,HY1v 3&-T82ÿÿ¾‡#XÂå+ÿÿ çz#XRØK¾–+/!5>=!!5>54&'5!!54&'5!!5f 8þê:þÑ 8þê:::/::þk/)þD5 "?ÃÎ5 "?±66==6š^^ «24#"#5>5#5354&#"57673#>32#5>5‡K3,Ø+pp D/ss#D,{)Ô+,j"ñ45†6 †6t-'ŸÇ4 3ÿÿKJ#hÌ,ÿÿÿä.r"hãôóÿÿ B#Z½,ÿÿÿí$>"Zâåóÿÿ;}#då,ÿÿÿü¥"dâ óÿ[–#!327#"&547#5>54&'5!; $+5;*6ø?"!@)?#$>.$L, .+ 8¼7 7þD7!ÿ[«#."57#"327#"&547#5>=4&2#"&46> ›1!++5;*6ƒ40Š7þ6*$L, .+6è!!*ÿÿ;C#eÿÿÕ,ýÌ"57#5>=4&> ›1í4Š7þ66è!ÿÿÿò¿–#-M,ÿÿÿ&Ø«#MLÿÿ ÿò~‡#X<å-ÿÿÿºÿ&2¯"Xð Üÿÿ"þíÓ–#TÒüâ.ÿÿþíù«#TXüâNêÌ8#"&#"#'&+#5>54&'533267>32Ó) %"26"Š}" ê66êC)0$˜+51 9b È '' ƒHF&ÿÿ V‹#[%å/ÿÿ&~#[ÿéØOÿÿ þíV–#Tpüâ/ÿÿþí«#TÿâüâO V¤/%2>73!5>54&'5!3#"&54632'654b2L* 0ýæ7 7;"7¯  !".>2 R'%#®!5¼5!!5þ' 3&-T82\«(567#5>54&#"#"&54632'654c<0ì/    !".>2 Roý«)(Ý#3 3&-T82ÿÿ Ñ–#y,/ÿÿŸ«#yê(O V–#%2>73!5>=5754&'5!73b2L* 0ýæ7 WW 7;"››7'%#®!5§212ä5!!5©Y1Yÿ«54&#"#5677#5>=5b c<MM0ì/NjÊ#þú5,5þÝ)(ç6,ÿÿ ÿõÃ|#[ÄÖ1ÿÿå§"[TQÿÿ ÿÖ#TÃüõ1ÿÿÿåÌ#TSüöQÿÿ ÿõÃt#YÂÒ1ÿÿå£"YTQÿÿâ"Q1T° ÿ&Ö.26=#5>5.#534&'53#"&54632þb$:ë>## «%;ë 4N)52¸>MCþxL1/M¹#þQL/3+ýýtf<ÿ&¨Ì02654#"#5>=4&#"567>32#"&54632$I*$&Ô&J@3;#7?VS)52¸>Maa"þç+ø%O0!OGþÊjp<ÿÿ"ÿò°#Z½2ÿÿÿöÖ>"ZTåRÿÿ"ÿò°}#dÂå2ÿÿÿöÖ¥"dT Rÿÿ"ÿò°z#iëÔ2ÿÿÿöÖ¨"iTRÿúuœ0=23!#.+"32673#.+;7>73!"#"&54>4&#"326V t+F =b3*hF9'4Š|/A&,þ¢‹ ›(?URƒ/4[ca\5/œC&ì%=ê;(õ8G¨³•O|K1ýçŒ72 “Ž˜/ÿö²Ì!+23267#"&'#"&54632>32%"3254&354&#"¤ 5'$;# 'R:.;C3[sqY.D&:)=^þC-@xg;‡ -"P*?J)(0QD,33,€dg‹"**"QfšIWÿ·px|*7ÿÿ“‹#[*å5ÿÿO§"[Uÿÿþí“–#Tªüâ5ÿÿþíOÌ#TÿÔüâUÿÿ“v#YªÔ5ÿÿO¢"YUÿÿ*ÿòë|#[pÖ6ÿÿ3ÿön¨"[1Vÿÿ*ÿòëv#XqÔ6ÿÿ%ÿö\£"XV*ÿ)ë¤G.#"+632#"'732654&#"'7.#"#'332654.546323273¼c<.:DOcXuU  (.C:-'$ $!O %bC7DB^]BgF*b ÏXT4)(H,5g>Mi3% '- XÔ[V?2/I47V9L_""Õ3ÿ)\ËJ273#.#"+632#"'732654&#"'7.#"#5332654/.54632 2+"++l-'S8  (.C:-'% ' 6   (&-4:@5M;!:¸ ˆC8&+@7%4L7% '- ] œ '!-!$B*6Eÿÿ*ÿòëw#YpÕ6ÿÿ'ÿö^¤"YVÿ)Q–0!632#"'732654&#"'7#5>5#"#7!#.+B (.C:-'% )> 6T949U6">A% '- c!@ô.RªªS-þ7  ÿ)C3632#"'732654&#"'7&5#&54>76723#327ª (.C:-'% &B5 2ee , 7% '- \m- 6+ t þâ/+# FÿÿQx#YŠÖ7 ÿö,¤/#"&546323#327#"5#&54>76723'654÷   !".R%e 0HY5 2R< 3&M< þâ/+# L- 6+ t82Q–#53#"#7!#.+3#!5>5þrr6T949U6rr">þÜ> :-.RªªS-þû-Í7 !@ ÿöC##535#&54>76723#3#327#"5F995 2eeee 0HY-b 6+ t b-/+# LÿÿÿòÁJ#hÂÌ8ÿÿ ÿößr"h/ôXÿÿÿòÁ#ZÁ½8ÿÿ ÿöß>"Z.åXÿÿÿòÁ}#dÁå8ÿÿ ÿöߥ"d. XÿÿÿòÁ§#fÁà8ÿÿ ÿößÏ"fBXÿÿÿòÁ|#iëÖ8ÿÿ ÿöߨ"iTXÿ[Á–473267654&'53327#"&547#"&54&'5!ÎKa8Z$:è> &;<+6;*34,~{;<édg+$+]K1,Lþû[[12,$L, -) ~876 ÿ[ôÂ0%327#"&5475#"&=4&'533276=4&'53;ß L+5;*++<7B$’*.*/ž"$7+$L, i++G;ü#þº-"&ë%þ©#ÿÿÿõ¤w#X.Õ:ÿÿÿò¶¤#XÑZÿÿ¿w#XÖÕ<ÿÿÿ&Û£"XW\ÿÿ¿C#jÒÕ<ÿÿ U{#[‹Õ=ÿÿ¢§"[8]ÿÿ UC#e‹Õ=ÿÿ¢k"e7ý]ÿÿ Uv#YŒÔ=ÿÿ¢¢"Y8]«".#"!5>5#53>32U 8 =þü6 P^-;DYþ287: py#ÿÿÿöÔ«,5354&#"57673#>32#"&532654&#"F C1N.Ke‡cDE;'<" x"˜%0}\k’)ÙÍü\S[m.ÿ˜Q–+8C%#!5>54&+"#"&543! 2>54'&#32654&+"Q3dEþ²>"9 $3<’ÿ4="þÅ-B:T0ƒ_FMZV,´:9# 8¼3#25)ª!3 ;´ :+\#øI?;CFÿÿ'`®#ÿöÿöÔ– +32654&#"7.+>32#"&54!™:'>DE;'<Ý  †N.Ke‡c#576732#!532654&á%=9 #&66!þ(ee:KqA( 3gFþ¾/#gÄ,> þÚ!BjHH þÓ&51<=%,-(YÿïÿöÔ«#>32#"&54&+57632654&#"”N.Ke‡cDE;'<«þÎ%0}\k’)IqCBþ¢ü\S[m.ÿòy¤"&#"#'332654.#"'>32*@p !  7 m-LQ.vi.ŽU”¸À!!⺢ˆWAe=Bº™œÃÿò&6*2327432#"&#"#&#"327#"&546k?r  ‚)52#7 m-LQ.vi.ŽU”¸À¤!!’<3$ûº¢ˆWAe=Bº™œÃÿö*:174632632#"&#"#"/.#"3267#"&ƒX1& x)52#" =KWD+>$ '&>!SkÕoˆ<3$3.aMVm*4 4 }ÿÿ­–’ÿœ­–34.#"3 #!5>54&+"#"&54;2@,FrI>m6T‹Xþä9/ $3<’ð[W9G+OQ:%þ)-V\C, 6¼1#25))AYV'`®&74>;#"#7!"3!"&7327&#"'<{VF¨~<%&;þºq‚{\L&##3J&¼!<>%s':þ9<&h^IX%-/ÿö÷– .726=4&#""#7!"327'5#"&546325û%4>(9DL ƒ.!“0PSfzV63**æ(=#"#5 $Aš ‡U6 7 7ýä-%\k4, š>& Ï9&Þ &C!5þD5!©Q3 ÷">èÿÿ%ÿò°¤éÿñä¾.4>3235##"&#"327'#".4>;5"&ž8,ˆi1Ro‡!/$Ši‹JEg,= &K4g^!7-¥ÌdO…! $?'Xm‡ a41600!Mÿ½ÿ4"–+23254&'5!#.+"32673#.+#"&546 & 7 6Uˆ ‘<)  (=‘XQ+8R B5!C& Þ#<è=#þ²^g( ÿ´ÿ&€«&>32#".#"3##"&546323265#5gP_-;9zzVS)52RÂqx#&%Yt þ^jp<;PÏ  ÿò06;%4&'5!#".546323265432#"&#"#.#"32659ÿ,@-ZbJ1Á–:q )52# `W9X6" z6O÷8,Ë,0IzN™Æ! ’<3$ìN])@VO(‹¡#ÿñƒ–%0#"&54>7&'5!7654'534'32ƒ1E‘9VH=I(À, %m{=ÐïX!.(Kƒ [ÀT(BGPM>!C3.¢¡'ýÏ({(6(2 ÿ÷Å«>#".6.#"#5>54&567363232>54.54632Å2X89D%%67,Ø,"i%9W2:*(.J#%%4g[8.IXYI.?ñ1"2×! þÒR/L\\L/Th,(#82ÿöF«%#"&54567327F+T<)OmD4!BLD;oýÛZ#K–5354&'5!3#!5>=r!@)?#rr$>þ×?":-Â7 7Â-Í7! 8Í"˜6".74#"7!5654.'!5>54&'5!7632"<;:Ìé*>þÏ8qh"8þæ;#7:"ô^P/h  5:Èú1% ƒd»6!%=±6 8ÍäXKù«8"&#"7654&'53#"#53254./#5>5>32A79‰Ì%S>™5!Ú Œê6P^-<DKYþÏz  9:Â&! »¸ 'ppy#«5673##5>=#5354&#"c<cc0ì/aa oþ¾-æ)(ã-Í#ÿöÊ /%#"./##4&'57&#"#54632732673ÊC:€U²yp2$$(" e[\ [e'ãþ²ÃS,MZ5*?5 E,>þ¿ % ÿö£–=%2654&'5!327'5#"'#"54/5!3274&'5!Y8W"0 3"YQ LH(a ]i4 5(4O5$4458É#"2þ[,"[9$ffØlD4þK:J¤8(3þ†ÿºÿ&Ö%4&'53##"&546323265.#538%;ë þF3N)52# «L/3+ýò&ýåtf<;Py#þÿ8åÌ*567>32#5>54#"#5>=4&#"J@3;#7?%Ð&I*$&Ô&ŽO0!OGþS%"/™a"þç+ø%ÿÿÿôÊ¡É"ÿòÄ24.#"32>4&54632#"&54632326>+:71N- ,W<=Y-d<lX¹”‡º¸?U3AHHpD,*?VO)3bb<54&#" &632>763274."2>þþè* .M,D´þÚ´´“D}-Ji$3-:þ@/WtW/.WvW.(£24:Y„”ÄÄ(Æ41 T'B/%þ¬9'86g_99_g67f_99_fÿ'Ì"3#5>54.#"#"&546326324.#"32>Û* E'_byx`w>MUv(þu;';; ;),8Ù+¬$93H`ŽŠda‡TT²þY&‘$KK/^>&QU6>Lÿ—– 43254&#"#"'!5>54&#"#"&54;2Ê"®`eT #:dB'#;þè96$3<’ï-TS2Oþü“MI‚06'¶7!!?±3#25)&Jÿ'Ö« 132654&#"7"&#"632#"&'#5>5>32ŸE#6CC8#Cš78@PI^yY + 8ò,P^-;Nö,gSWi,àKY¹Ox]m”/'Epy#ÿ“– .72654&#"723#!5>54&'5!ç\E6D,dbSzÎ%¡î8 :þë8!@)?#ä<(#7·ÞK/V"ý4T6 #>±7 7g*ÿòë¤/"#733263232673#.#"#"&54>54&73#&7 T:S'-l++"+2 9";M5@:4-&$  L4%7@+&8Cˆ E6*B$!-!' œ ÿÿ2•ÓÿB@«%#"&5#"&463232>324&"2@29If)>7672ÿe 3N)52 ,Y5 2 þâ/+# Btf<;P=- 7+ tÿ÷Q–!#.+!5>5#"#"&54‰Â9U6">þÜ> Ž!6<–ªS-þ7 !@ô&25)ÿôÿö^« "&#"3#327#"5#53>32479{z 0HYRRP^-;DKYt þâ/+# L- py#ÿ4Q–2>2#"&5#"#7!#.+Š (8+QX6T949U6¦  (g^s.RªªS-ý0Bÿò:P373267654&'532654&54632#"&54&'5!ÎKa8Z$:è'0<C6;#5iM€{;<édg+$+]K125)4<+Hþû;XO*}‚876 ÿö|1%'5#"&=4&'533276=4&'532654&546323ßN;++<7B$’*.*/ž$3<y"2S++G;ü#þº-"&ë%#25)v þÍ#ÿÿ!ÿóÉ— Ùê—Àÿñ°–#'&54&'5332>'.'.7>°¿‘ø!9ÀQ]O‘=. "0 $/'8+ Ižºþ87 þI^csÁ - 5Bj#š+!5>='&#"#"&546327654#53# 8”(?þÎ?&£A/,o42Y”EÛƒ(!&âÂ; ;¶ñ_ 30J6+Þâ!ÿ&‹Ë6#".#""&5463232654./&'53"7632‹ %= #28- / ?#r &Î  s<>s(W€F*þ¯# D#y!8Gö ýª¬( U– %2>73!5#53#"#7!3#’. ýÌ×Tt¾Ý3B! ÌaÄ& ) °+- ,$!«þà-þì¢Â%2>7!57#537#"#7!3#'. þ‡VtkŠ- [v_}y "#‡Å-£!7v²-¶ÿÿÿòð¤ñÿòð¤"327#"&54>3!#.+^BW5vi.ŽUXyD1‡ 5$“GJYDBe=Bx^&NA'Õ,A(ÿ/jÂ467'7!.+32632#"&W[•/#¦”WR20a(;EaƒMxä u#çuH2G<8*p.ÿ²Â3#"&54>54&#"'7#"#7!63232>32²AH=a-AA-(,Sм .V¸ 7L5LL54$ Š+>:*?'!*,È!а=5,D*&1#"("Û¤$%!5767#53654&#"'>323#3267Û7þz²7^uMB9=kWMh/a€¨ï$$‰‰ ½:2,73ANC?ZmhLDK,°%ÿòD–&%#"&'73264&+54&'5!#."#"32D…`Uƒ=eyMmmMZ"5¥(2 9\‰Î_xCDpcšc¦5!!+ ¥€ÿI”Ý$+#"&5463232654'.'"547327”&Ä+'zj4^ B7À8 nÑÖY UÙi{..!)!eH• çÿö{D+%#"&#"#5332654.=#&5476763#{W:M 6<#./BC/5 9,ee+l**w9H œCI&#-#'@)P 8Vt ..@5ÿ'ØÌ&3#5>54&567>324&#">Ø9be9$4ò**IGf5V2,'E\‡9>zfO"&1(Ô)€3L¾,>>*þÄ=¤ÿÿCÿò…¤_ÿÿCÿòM¤#_È_/ÿ”)f%##5#535#53533#3)ä2ääää2äää‚îî2’2îî2’ÿÿ‚ÿ÷í¤ÿÿ'v#?Ò'ÿÿt¢#@Ò'ÿÿÿö–«#@ôGÿÿ ÿòÕ–#-c/ÿÿ ÿ&%«#Mc/ÿÿÿ&Ø«#MOÿÿ ÿòD–#-Ò1ÿÿ ÿ&”«#MÒ1ÿÿÿ&¶«#MôQÿÿÂv#YÄÔ$ÿÿ%ÿöº¢"Y,Dÿÿ @v#YÿþÔ,ÿÿÿíÿþ$ "Yâþóþÿÿ"ÿò°v#Y¿Ô2ÿÿÿöÖ¢"YNRÿÿÿòÁr#YÖÐ8ÿÿ ÿöߢ"Y:XÿÿÿòÁ‘#ZÔ8#s!Ô8ÿÿ ÿößÑ"Z@x#sŽXÿÿÿòÁ£c[ý0I%Í#s!Ô8ÿÿ ÿöß"[Sn"j@XÿÿÿòÁÃcYí¦6ò3Z#s!Ô8ÿÿ ÿöß"Y@n"j@XÿÿÿòÁ¬#s!Ôc\ü÷1¦)+8ÿÿ ÿöß"\/n"j@Xÿÿÿö¡Ì HºÂÀÿÿÂB#s Ô$ÿÿ%ÿöºÑ"Z7x"j7Dÿÿ‘#ZÆ8"$e¾Ôÿÿ%ÿöºÑ"Z7x"De-ÿÿ_-#ZfÔˆÿÿ&ÿöxY#oö¨ ÿòŤ3232673#&#"326=#5354&'5!3##".546v>j ?œ?a7‡|)`EE!7ÿ0;;­F3`cH.Ǥ!Ó«7\m<§t,4$4,:1NRŽÁ ÿ&éÌ;GNR23263##"&#"3##".547#5367.54>7&5464&#"326.'!2ñ _1$ S_@ $ .N4E+’B8;&+2 #(]b¢51%&2'&#hO0$:þÃüÌ"'*2@S172,3> ( ,# .! )YJ]¾7k3NF;8þÝ +,8ÿÿ ÿòÅv#YÅÔ*ÿÿÿ&Ö¢"Y7Jÿÿ"Óv#Y¸Ô.ÿÿùv#YÔNÿÿ"ÿ[°¤#“22ÿÿÿ[ÖÌ#“ÒRÿÿ"ÿ[°-#“2"2Z¼Ôÿÿÿ[ÖY#“Ò"RZLÿÿÿòð‡#Y}åyÿÿÿ/j¢"Y 1ÿºÿ&$ 567#"&5463232654#'37M-PLVS)52·}>|"yzŠþ7jp<>M{<§§ggÿÿ'–#=Ò'ÿÿt–#]Ò'ÿÿÿö–«#]ôGÿÿ ÿòŤ*ÿÿÿ&Ö¦"[7Jÿò•–="57#"=!!5>54&'5!!54&'5!326=4& ›,O7ÄþÑ 8þê:::/:: &>7Š7ó'9@)×rÎ5 "?±66ÂÂ66þ˜*.Na!ÿÿ ÿõÃz#\çÔ1ÿÿå¦"\TQÿÿ“‡ÿÿ%ÿöºÏ§ÿÿ_z#[fÔˆÿÿ&ÿöx¦#[«¨ÿÿ"ÿ°°ÞšÿÿÿÖ¦"[UºÿÿÂz#zÅÔ$ÿÿÿöº¦#zkDÿÿÂl#|Ô$ÿÿ%ÿöº˜#|‡Dÿÿ Uz#zŸÔ(ÿÿÿö¨¦#zhHÿÿ Ul#|ËÔ(ÿÿÿö¨˜#|‡Hÿÿÿ³;z#zÔ,ÿÿÿ¹5¦#z óÿÿ;l#|MÔ,ÿÿÿü˜#|/óÿÿ"ÿò°z#zßÔ2ÿÿÿöÖ¦#znRÿÿ"ÿò°l#| Ô2ÿÿÿöÖ˜#|¡Rÿÿ“z#zÔ5ÿÿÿËO¦#zUÿÿ“l#|éÔ5ÿÿO˜#|JUÿÿÿòÁz#zæÔ8ÿÿ ÿöߦ#z\XÿÿÿòÁl#|!Ô8ÿÿ ÿöߘ#|X*þçë¤.B23273#.#"#"&#"#'332654.546#"&54632'654ô*b c<.:DOcXvV2g %bC7DB^]Bgx  !".>2 R¤""ÕXT4)(H,5g>Mi"Ô[V?2/I47V9L_üÎ 3&-T823þç\Ë1E273#.#"#"&#"#5332654/.54632#"&54632'654 2+"++l-'S:T   (&-4:@5M;!:C   !".>2 R¸ ˆC8&+@7%4L œ '!-!$B*6Eýº 3&-T82þçQ–+#"#7!#.+!5>5#"&54632'654þ6T949U6">þÜ> D  !".>2 Rl.RªªS-þ7 !@þú 3&-T82 þçC/#327#"5#&547>7672#"&54632'654ÿe 0HY5 8   !".>2 R þâ/+# L- >* tý° 3&-T82ÿÿ¾v#YÃÔ+ÿÿÿûçv#YÿðÔKÿÿÂB#e¾Ô$ÿÿ%ÿöºn"e-Dÿÿ ÿ)U–#z–(ÿÿÿ)¨Ì"zBHÿÿ"ÿò°‘#sÔ#ZÃ82ÿÿÿöÖÑ"ZLx"jSRÿÿ"ÿò°›#Z¹B#h½Ô2ÿÿÿöÖÑ"ZLx"hMRÿÿ"ÿò°B#eÃÔ2ÿÿÿöÖn"eSRÿÿ"ÿò°‘#ZÃ8#eÃÔ2ÿÿÿöÖÑ"ZLx"eSRÿÿ¿-#ZÓÔ<ÿÿÿ&ÛY"Zc\ÿBÌ-7#"''674#"#5>=4.#"567>32764#"326B7M{<ÿÿÿö˜Ì D½ÂÀÿößÌ&%'5#".54632>77'54#"326ß8SX,9N~a3> #’`FA=-,;$S%1F`8c•# þ£#MÎcvL,P?$ÿÿÿùíÏ ðýÅÀEÿöÔ« (32654&#"7"&#">32#"&5>32™:'>DE;'<›79N.Ke‡c7.54632#".#"6324#"326}?9+ >?|d2c ?B10T:;&+L%U—=d[ HrGf‘7.""oC:cx4e/ÿ&[« 1726=4&#"7#"&5463254&#"56732632#"&5û%4>(9DL—0PSfzV63[825)SV**æ((9DL†79“0PSfzV63©-<**æ(32327.54624'326²0" ;'&|dI=ù-L/BJ~T99/4  &"þžÈ'1?Bw,2$7 @--4Jf‘0F1- HD61KYK Ã3)â,oÿÿ)ÿöÍå)ÿöÍ6?32654&#"#"&5463232654&#"#"&54>32#")(Z3<-$ .  1#(*# "61AhE*/GgC‘l ]>3%45 +9$#=<(5A.@E)ÿö‡3V#".4654#"#"'732654&#"#"&5463232654&#"#"&54>32>2327.5462‡0"\ E*/GgC‘+(Z3<-$ .  2#(*# >A!S0 m& &"w,2$7 i !(5A.@Ev ]>3%45 +9$ ( ({KYK )ÿ÷Ê0%#"&546324&#"#"&543232654&#"326=L'WmnV'L=G//G\-$ . " . $-+)J]\K)+k(8‘ZX8(.AA%44%+=}MNƒ=ÿºÿ&Ì5673##"&54632326=#534M-PL??VS)52eeŠþW jp<>M- .<ÿ&m«.<"&#"#".54632326?#"&546325>323276=4#"C79/\@2)+7DYFZ^.2P^-;þ>12$]@JDKYýÊ'GD(CHmJx_l”py#þ­+PC "Îdgÿ&©Í /73276=4#"".5463232657#"&5463273n>12$]@JZ2)+8DYFZ^6=6 /\ñ+PC "ÎdgýÜCHmJx_l”$ þ7'GD(ÿ÷ÞË'%#"&546323273#&#"32=4&'53Þ‰sƒ‡aQ*j*?"SSK&½äˆ!~r`„t&AH(Vl#m% ÿçÂ+9#"&54>7&'53>54&'534.'32ç'p&<=42  ’!Ë>D'Ÿ·  !:¯*Â!ET@XT8("%!0JmmOýÊB7$!(#8ÿ÷)Ì ,.#"#".547&#"'6326324&'32>)g6V@-0 , /BJ~!#~/.,.'/ 5R<+k`9TLX=1- þù8a32#5>=4#"#5>5>32879#D,{)Ô+K3,Ø+P^-<DKY¾-'ŸÇ4 3Æj"ñ45\py# ÿ&««4"&#">32#"&5463232654#"#5>5>32879#D,{VS)52K3,Ø+P^-<DKY¾-'ŸþÓjp<;PYj"ñ45\py#ÿÿ«"èLÿö0Ì"57327#"=4&> › 0HYŠ7þ»/+# LÙ!Â7#5>=4&'53³4ò44ò4f66ö66ÿê4«+56732673#"'#5>5&#"#>3254&#"c< 0)0ì/# 5%  oþÒ 91æ)( .14˜#ÿý«!+##5>=.5463254.5673#.#"`,ì+"""#b=`´!!0Ü*)Ù µ!þž) ÿ&i«32632#"&54&#"#567¶25)SV c<©ý*P;<pj4#ÿ/«-4&'7!#5>54&#"#567!#"&432326ÎSV“þþ0ì/ c<>”[WƒaF:(a/32HuçþÏ)(Ý#ç äxMZp*80=ü/ *Ùi)þ$$ÿ&ÂÌE4&#"#5>=4#"#5>=4&#"567>32632#"&54632326n +B++à+B:(Þ*HD>0=ü/ *Ùiþæ)ý$K/TT²þæjp<;ÿÿ&åÌ04&#"567>32#5>=4#"#"&54632326PJ@3;#7?%Ð&I*$VS)52-%O0!OGå%"/Ña"þ¤jp<;ÿ&[Ì4%32632#"&=54#"#5>=4&#"567>32¨25)SVI*$&Ô&J@3;#7?°ÝP;<pj°MÑa"þç+ø%O0!OGåÿùãÂ##5>5.#5354&'53ã,þÚ  -~þ-¡±/þ›lþþ !0- þÂÚ/ ÿÿÿöÖÌ…ÿü†Ì/?%"#"&54632;#."32673#.+6:>74&#"326†BþùBVjsh^Ü)5Y()Y )! þ¿(#1 7)'rrƒXj‹ b •'(¤ !()E="(XM)ÿöŒæ7%#"&'##"&54>32&"32>54&543232>54Œ`R9??9R`\ŠKu½ÐÂu '",/.+1äW—I;;I—WMy<‘z‰b'C* 0=.546754&'53>54.'kc‡€j0ì/k‚j0ì/EQG5TGPQË |aiy k)(hyj^~ w)(ýÕ zI*PH þg™ nPKxÿÿÿûÿöE UJÂÀÿÿÿûE• JÍÀÿûÿ&±Â172326=4&'5332732632#"&'5#"&546",2"3ð0E25)QW%4X#:á+ &ú!BP;<kg\5)ÿ8OÌ#"&#"#5>54&#"567>32(,2"3ð0PD%4j#:þW+ &Â!\5)ÿ&SÌ)"&#"32632#"&54&#"567>32(,225)SVPD%4j#:þ˜P;<pjN!\5)€Í".#"!5>=>7>32V 9 =þü6 L/-;fYð87|B:$"'#ÿÎ:Í"#"&54632!5>=4Z;-/L 6þü= ±#'"$:B|78ðY ÎÐ&2;#'##5>54&'52654&#"ábSzr t‘(*Ø$ %¥H?/7ÐK/V"ª"Ñi,) .3%Þ>&"8·ÿÿ ÎÐ ÛÐÀ3ÿ&\Ë>273#.#"#"&'32632#"&=332654/.54632 2+"++l-'S:Q25)M4 (&-4:@5M;!:¸ ˆC8&+@7%4L5P;<drœ '!-!$B*6Eÿ´ÿ&€«>32#".#"#"&546323265gP_-;9VS)52Âqx#&%YýÊjp<;P ÿç«)".#"3#3##"&546232=#53#53432ç$<{z{{´"B$'23š25)SV5ce¢þ1P;<pj¢  t ÿÿÿúÿöîÂ" ŒúX ÿöæÂ'%"&54635#"#53"26545#4&+2æƒÀƒ`Hl·:?Z„Z@:¶ hHa©[XX[H^ €ŽN;BXXB54#53ï%f*á,Y+Çe,# 0•³˜„'+vƒ,% ”?35ÿ&UÂ"%2>732632#"&5!5#"#7!'. 25)N3þ¥ Š- [þó "#´P;<ft•!7vþkÿš©Â&%+'>7#5#"#7!36324&#"326©c7I * ' ‘ Š/[þó9m@"S!7*S6WE C•&2vþk¤X2Aÿ/jÂ4&'7#"'7!#"&432326$SV“¥#0”[WƒaF:(a/32Huç#u äxMZp*8&.DþþU:6D/0CP@F á*–3·_VX6EsW5&%63'œ¤%2#5>=232654&#"#"&546ÁZdP0ì/ DWK= "[¤‰n^|z)(ÂmVMa.*='œ¤&2#"/.#"32>3#5>=.546?[" =KWD /ì0Pd¤=*.aMVmÂ()z|^n‰ÿÿ'ÿòœ– 4ÖÀÿVœ£#4632#"/.#"3267#"&5ƒX?[" =KWD+>$ '&>!Sk¬oˆ=*.aMþ‡Ul*4 4 |aÿÿÿöÖÌ"y{ëRÿÿÍÐDÿÿ)ÿ÷Ê ýÆÁÀÿ÷ˆ£2#"&#"#&#"32=4&'53#"&546324632ˆ1a*j*?"SSK&½‰sƒ‡a'.xa";k<¶xt&AH(Vl#m%ˆ!~r`„ bƒÿÿÐOÿ[« $.#"&54632##"&5434.#"5673#"325 RS4'/DšOMS§'#0'9xýS(8C#D/sNþ7 0#3†ÿÿÿù NÂÀ®Ð45"32>73!5265h /ô2#Š þ}/ i,)(7þÁ "|'ÿ'n« 173276=4#"%"&#"#5>=#"&546325>32n>12$]@JÖ79)ì5$DYFZ^01P^-;ñ+PC "ÎdgúKYý=  *¼Jx_l”py#'œ¤-23##5>=#535232654&#"#"&546ÁZdPff0ì/^^ DWK= "[¤‰n^|:1)( 1…mVMa.*='œ¤.2#"/.#"32>33##5>=#535.546?[" =KWD ^^/ì0ffPd¤=*.aMVm…1 ()1:|^n‰ÿö«#+:%".'5##"&5463254&567!3267#"'54&#"326”|z *WY]vY:0&V=LþóŠE-kŠ0$V?(,;B1=‡‡=@ƒ]\š+œ%çþk(E(0áæ(M%#".546232654&#"'7#"7'5##"&5463254&567!54&#"326ˆhC:* DAH@, ϰ/"(“*WY]vY:0&V=F§WeþQ?(,;B1= fq, \G@F á/·(4=@ƒ]\š+œ%ç3·_æ(7#"'5##"&5463254&567!3632'#"%4#"326%54&#"326 c7I * ' ‘*WY]vY91&V=Lþó9m@"„Š0$E$6Z7*Sþe?(,;B1=6WE C =@ƒ]\š+œ%çþk¤ý(0á4 ŠAæ(76763#;2654.546323273#&#"W:Î\5 :]]3#./BC/S9=  T.0FE0w9H-Tt þ¾T&#-#'@)8B ‰{$1#&< ÿ"«-4".#"#"&546232=#"5#'>76763432#32"$<´"B$<,<\5<p´"Bþèp3 n&%Ytþ@é&%Y 8-VtéýÁUþÝU ÿšDCL%#"''>7&'#"5#'>76763#32>7&54632#".#"6324#"326}?9+ G 2X\5<ee3  |d2c ?B10T:;&+L%U—=d[ HHq-Vt þÛS  (/f‘7.""oC:cx4e/ÿ&¶«M".#"327>32#"&5463232654#"#5>=4+!5>5#53>32A 9{e"3;#7?VS)52I*$&Ô&=z =þü6RRP^-;DYt O0!OGþÊjp<>Maa"þç+øPþÆ87: py#«55673254.546323273#&#"#!5>54&#"c<0iQ/BC/S9=  T.0FE0V;þ¥/ oý²)?-#'@)8B ‰{$1#%<(8@(Ý#«!567!32>7!5>54&#"#"c<KþóŠ'. þ/ ÝŠ, oçþk "#‡(Ý#þåÿPÿúÏ–/_77.'537654#53#"/#"/&'537.'537654#53#"/#"/&'53~3; „*2 PP  ;I  Ru3; „*2 PP  ;I  RuÉzw!ir  »Ž¾$ yzw!ir  »Ž¾$ eÌ–%#"'7!.#"'7!.lð¢ð¢Ó(§§(†(§§(ÿVÒ6%326754&'53327'#"=4#"#"&54632K3,Ø+ Q""E,{21;"#8# ¨j"ñ45þ)  0-'Ÿ¸c<5'H'&ÿÉÔ@%32754&'5332632#".4&7#"=4#"#"&54632M85-Ø-21;",  :X|21;",  ¥j?ñ0#!1þBc< $'))*RŸºc< $')))ÿû1§%#5>=4ȷ632#5>=4#"[Œ 0,+4P ‰1#Ñw ý  ·3`h^?ÿù/§,"&#"632#5>=4#"#5>=>32¾ $%+4P ‰1#%Œ 4=&`-6h3`i_?&x ÃCH q¼Ž567#"&54632326=4&62"&4S,9n"   Ð þîƒ $%.˾ÿÿM¯K¤L õâ&#"32632#"&54632í"&'/4=<*%½#-*;4*> T ýâ732654#"#"54632#"T #&' / 4<;*&#-*;4*>L õâ#"&54632#"&#"32í%*<=4/'&"0 >*4;*-#fÿöÆ632#"'732654&#"f*99*!" » ;R: ++XÿèÆ&#"327#"&4632è "!*99*»++ :R; ûB¢#'#73B"zy"|>ûgg§ ûB¢#'37B}>|"yz¢§§gg #BY!! 7þÉY6]û=¦ #7632…(“û” ûò¦ #'&54>;2ò(š ûa ÿÿ ÿgBÿqýD2þØÿƒ #'&54>;2(š þØa 3þØÿƒ 7>;23“ šþØ” a þ’Aÿ533!5‹6€þÉþÈ··66 þbAÿO#5!##‹7€6ç66·%þ}'ÿ ##5#5353'f6ff6ç6ff6ff ÿBÿO!! 7þɱ6û3˜ 3#"&'3326|8Q 50,.˜FW2/(v Ùn 2#"&546¦n(C Ç 2#"&546"3264&¦);;)*9;)'&''Ç;R::*(;"&6'&6'@ÿ[ù#"&547332å5;*6.,IL, .+#"K~3#"/&#"#>32326.0) 1# 4&$" ~91 .14 ÿýûy¦#7632#7632Á(“#þÊ(“#û” a” ÿÿ±‘¤ •ÿÿþÆûÿ¥¦\þ³ÿÿÿûÿð¦[þ³ÿÿþ¾ûÿõ¢Xþ³ÿÿþ´ÿþ~hþ³ÿÿþ¾#ÿõYZþ³þ#ÿõY!!þÞþ"Y6ÿÿþÍûÿæ˜dþ³ÿÿÿ) ÿŒneþ³ÿÿþÅ ÿïnjþ³ÿ õÿ Æ#4654#"#"54632œ%( )37õ&U0 $!&Hÿÿþöÿ½Çfþ³ÿÿþ°û,¦iþ³ÿÿþ¾ûÿõ¢Yþ³ÿ7ûÿ{¿ #&54632ž ûþôûÿ¾¿ #&54632#&54632[ Ÿ û‰þ°û,¦3'&#"3'&#"˜(“#6(“#û” a” þÍûÿæÍ3#"&=332>'4632#"&7€:P_& —˜NJa"! þÍûÿæ˜ 3&#"3>327|8Q 50,.ûFW2/(ÿÿþÿ ÿ¨âSþ³ÿÿÿ ÿ°âTþ³ÿÿþÿ ÿ¨âUþ³þ–±ÿ!¤"#"&54632'>54þì&$ R ,&<)/Z ;þåþØÿÄÿƒ #'&54>;2<(š þØa þæþØÿÅÿƒ 7>;2þæ“ šþØ” aþâþJÿÏÿ#5353#g··66þË6€þÉþãþJÿÐÿ#33ç66·þË7€6þãùÿÐæ#5#506·æí·6þ³Mÿ}42654.54632#"'5þû"0 & #&/K53i% #9/5J"ÿ þµÿ›ÿ|&#"327#"&4632e "!*99*++ :R;þ½þ’ÿôÿ533!5Â6€þÉþÈ··66þ½þbÿôÿO#5!##Â7€6ç66·þØþ}ÿÚÿ ##5#5353&f6ff6ç6ff6ffþ¾ÿÿõÿO!!þ¾7þɱ6þ:ÿþ×.!#5367"&54623265þ¾90 -B."  »!.- þ“ÿÿ0.!327.5462"&=73þ¬ ".B- 0˜ -.!» ÿ(ÿÿŠÿƒ 4632#"&د! þÅÿÿîÿƒ 4632#"&74632#"&þÅǯ! ! þöþµÿ½ÿ| 4632#"7"3264&þö9*);;)**"!'&þïR;;R:¥++&6'þøþçÿƒÿÚ#"&54632'654²  !".>2 RŽ 3&-T82ÿÿþçÿ)ÿ¸zþ³ÿÿþóÿ[ÿ¬gþ³ÿ7þ¹ÿ{ÿ} #"&547ž ƒ‰þ½þ£ÿôÿO##5!#BË676çv¬¬þ½þ‹ÿüÿg+32>32654'&5432#"&'#"&54632Ý    ,K9(AK %=*2))1)?<X5$*6*$5Yþ¾þ´ÿõÿ[#'37 }>|"yz¥§§ggþ¾þ³ÿõÿZ#'#73 "zy"|>þ³gg§þÍþÉÿæÿf3#"&=332>7€:P_& šNJa"þÍþÈÿæÿe.#"#546327 &_P:€þÈ"aJNþ´þçÿþÿQ3#"/&#"#>32326 (2'4.#¯) .(= þ¾ÿÿõÿO!!þ¾7þɱ6þÿÿõÿO!!þÞþ"±6þþ­ÿõÿO!!!!þÞþ"Þþ"±666þÆ„3#"/&#"#>32326  (2'4.#„) .(= þÌÉÿ­ô%3#þÌááô+þ%Éÿáô%!!þ%¼þDô+þ1mÿÕP-þ1’þn”¼'¼þV2ÿ¯‹%þV:þÆQ:þÆÿþµÿ©ÿ|632#"'732654&#"ç*99*!" ;R: ++þ½þãÿôÿ53!53B6þÉ6çv¬¬vþÕþJÿÚÿO5#'!!\™6þûþ˜˜Îþûþ¿þªÿóÿ["2.#"#".'"&#"4632>]!/%   5 % (¥/ % !(% 8+)(,þãúÿÐæ 7'77'þãQQ%RR$PP)MMPQ'RR(PO%MMÿîÿ“í4&5467'6¬4/; 5446 55/& 7%þ#ÿõÅ!!5!!þÞþ"Þþ"Y6¢6ÿUL¶#"&#"#>323267L6'T%6*U¶)8+++6+þË-ÿîñ"&462'#.5462"&462((RU((q((D"`" L3m((ÿ4ÿÿÛÿµ#"=33265%]JL¥XOc.NþDõ§¯23267#"$#"'>ÏC J;u8?;$3þÆ0?q+u›TA'1C! TF"]DþH÷ˆÀ.#"'>32ˆDGuG-9qR\Dg˜U}Óþ*6& 32š‡â @2<".ÿ!È #"&547ȇ @2<"ÿ(ÿµ#"=33265(]JL¥XOc.NÿÿPÿsÛËX-Êð #7>2ÊS(Õš ÿÿ < "·1jÿÿ·"·ÇÂB`¸Ö"&462¸"2""2´2""2"ÿÿÿ~UŸ#·ÿ&ÿ¯Æÿÿÿ…¾™#·ÿ-ÿ©ÈÿÿÿÀ;Ÿ#·ÿhÿ¯ÊÿÿÿÐÿò°·#·ÿxÿÇÐÿÿÿ¡¥ #·ÿIÿ¯Õÿÿÿ±É¤#·ÿYÿ©ÙÿÿÿÐÿö "¸¾ýéÿÿ¢$ÿÿQ–% "–#.+"!5>54&'5!"+)(ˆ $7þè9!6%,þ6"';±5!v¢)3 výŠ6 ¹Üá¢ý€Ýþ#ÿÿ U–(ÿÿ U–=ÿÿ¾–+ÿôÊ¡. &6 4."32>#4&+"#53;26=3ÊÈþäÈÇ[2o”o0&5N.8\8\’’ÚþâÈÈÇþ©HŠeeŠH*UP>%9[j-#(Á*!ÿÿ;–,ÿÿ"Ó–.¢!!#532>54' 3#5>73Âÿ«²DÆ5Ðù  1œþO*=HëýÈ  ÿÿ _–0ÿÿ ÿõÖ1=;– !-#4&#!"#5!#4+"#53;2654'3!533!26=3;&/þÇ0þb;£ £%bþVC"&ç/,'4¯þIB"Ø"þI¯[1#ÿÿ"ÿò°¤2¾–)5>5!!5>54&'5!¾þê:þÑ"6þê: 8«7!"6&<òþ5"&<±7 6þD5"ÿÿ–32•) !#.+"!26=32ýÜLþ¶ dB¤ IS]þô1#)LI±@RMRZþõ2#ÿÿQ–7)¥ =4.#"#"&54632>32#"&54654&#"3!52>53)&$"9$-N7% #7K,$9"$"S/+þä"%KyI2 )!7 %324+5!&#"6324&#26"Ëa^S ,' þâW q¥!8IO(T *1# 3bT4jkU^bþÜYcZ55 (/^xl+J3#X)11U7Ucþ|mm„^XÎÿÿ À–;L–Q4.'53234.'5!27>76;#"';!526=#"&'.546U 4%$/+&= ZA"+.##7$?`;+ ;"þÔ#A 2n%($/  ?P^SC Y@þ¦ BQ^P@   *C;Kdq &%!q"U: 8!ɤ-#32673!5>54&#"!53;5"&54>32É‘kœ$þîSbhczaTþî¢k‘7^sBDvh<œlŸ9(š©VhŠŽdW©œ(9ŸlEi=:k;)#"&462"&462!5>54&'5! ((|((Ïþ×;&&;):((: ((((ü×9¼9 8þD8  †'P"&462"&4624.#"#"&54632>32#"&54654&#"3!52>546Ø((¢((/1$"9$-N7% #7K,$9"$"S/+þä" ((((ýÊo¡R$ )!7 %.9 d:Zks\AJ  T#+¡<-$2 9,.<ku#!8H‹\^’cG {r<B~,UF0LD"+OAOZHÿ7ì£9%#"&'332>54.#"#"546232>54&#"#4>32ìgW,G8'4 / &)$ 51#/R,R9HeŠTcÄXt0)'@K&:9$! 061J!<5"ýdU5\U1IEd/ _ÿ ÍÍ+4>54&#"#4323>5>32#"&Çt1K-*&^^œ5[9 =û'œ/?bB\\tn¨– |H*+,ÿúê¥%3%#"&546327.54632#.#"4.#"32ê}db{xU( =,/>15YG*(0GTG0]@0@> :'yÝa‚}^Rs $,/8C2(6)&;AdM-M:T@#EC))ÿöÍ6%#"&54675.54632#".#"32632#"&#"327+‘CgG/*EhA16" #*(#1  . $-<3Z(lvE@.A5(<=#$9+ 54%3>]'ÿ>Ȳ?#"543232654#"#"&547.54632&#"632#"'32632ÈyIC'C5W9 dSn0[N1 (; @W#Q&6/.12( ( @<-FO&)7ch¶‰8*,)$0?3›O1> .ÿ ÛÍ##4#"#4.#"#4323>32ÛT>U*[$ F='4 à&cþ´@gd",,D`27%3ÿöã )".54>2"#2>5ã .PhP. 0L`L0 \øøø-:-U0WbG//GbW0+VZD,,DZV"þÞ!*M5775M*;ÿö Ã%#"&5332>=3 /97/To;>;9Yþ… # á'>32#"&#"3#5254.'#4ȷº€m*+0f³%â,06?H%-\>O'^á?AKøQ-&ÿöÊ¡)%#"./##.#"#5463232673ÊC:€U² $$(- b [e'ãþ²Ã4 *5*@" &P/M?^o^?83;O/hN.". $4K&P][z\2D)€$bxoM(455$ / !-5 :M2)!H?7^/4M68$''+3*.2?A(0A&#- ,ÿÿÿöÖÌR#ÿö(Ö0+32653#"&5##".6'3325#"#>32327(*6*i21†f R24  BP1Ä1#Ö< þåEN*œ@3AþÛ#$%$0L-,ÿ#áÍ*%#"'#>54&54>324.#"32>áwfE6 T1V8ct\ 8&| :%!/ éh‹+ST/ " 6×65_P/€‰$IN1Á"IE,!89'ÿµô:2654&#"#"&5467632#"&#";72632#"&54632E)cI`ŠU52L$;"C6 O&6 "D,#. 0“*!~an¨(  .8+=V!3(6@-")ÿö ß"#"'#"&546323274.#"32 5/"*2x]b}~h~2 ;*=4ƒyßS _4^ˆ†bh‡ þÝ(JQ1gDò ÿö’Ô%#"'3253#"&5&#"#>32327’40: (+=00;%˜%"Ô9(þèw(+6+!=9ÿöÐÍ$#"&54654#"#463232654&54632ÐÂHP#0(610$2=F=?1þÅXI$‘$9\:FO4|6@g@(Ž$”ÿçÿ Í)42#7.54632.#"&54>4.#">(: zhT4L<+TK'(-)QQ $:• +]\iÍ'@A"lœÖÖ "4_=Vƒ!iK€dB,FV@8È67"ŽþñŒÿ/ÍÍ-#"./#'.#"#&54632733273Í + +†Y¸- 4$# /{W¬"+Y+9Bƒþñyu$N#)?)Œõþ©?>F+Sÿ }C0#7.54654#"#54323>54&54632¨ ^ _w!2d/2D?EV3 -X ÖÖh^s8_„O1x?G5ýË rH(‡ *";lgF)ÿöŒÍ@%#"&'##"&546732>54&543232>=4.'5Œ`R9>>9R`j]*  #",/.+1!+ &]jäW—I;;I—W_ˆ#9(  8&(0323>324#">4#"32ê|cqn4'‹R$5Nkn!%fBawP7E…^]F ƒ'8 GAàd†šuhOh#"*?Rm>Ji;)dB1þkÅ$>@%Dnÿö9Á3@#4##".546=4#"#4>3232="546322/.#"9AÉ3D *'#"-"kîQ:˜$2'´ &$BU!!þ¡"@B.LTV#*;:+ 2 &22Ѹ¤:Lþî88XF9 !ˆÿþb ?#"&54654&#"3!52>5465&6.'.54;2>32b"$"S/+þä"/)"2kQ! (4 $9? 7!) Là$‘$'T9EGF;-  LB',!*B*+<ÿÿÿ„b®"·ÿ,ÿ¾ÿÿÿþbC"j„Õ+ÿ U@%#7.546?34&'>U†oFo†—jj–TZPJX×PZWJâlzÖÖzlg~ss~gRuþc|tSM|ÿö J##"&'##"&5467#>3!54.+"32654&543232>5m66`R9>>9R`33#* K)ó] %Ü$ #1,/.+1!+µqBW—I;;I—W@o/Sþä 5!# "2! 8&(W6"t88s7V*L6&!ÿnõÍE%#"&542327#"547#"&54>7654#"#54>3267>32327õGK$<3 f%W`* #"? &Z5Q$]?2 –Dsq p¬'&H+ "%?6j- 4,²!"1<67OM6iKÿFט3"5463232654'.'&546323273#"&#"Þid/K H_bY_^n/  -;JOZTbbR ”º9&=- KGGLs¢ ?<fN(/83+3&Ycÿ>—Ì2"5463232654.'&54>323273#"&#"„NJ)E4MPA &X<X% */:GV=MN;†Â'6' 97AxW1.bG+'!'OXÿ÷ó+'. #"67'.#"'#'>554&/é  +3!’!;9!:ü*#=™   é‘H!ß5!,º? 7ÿ Ó1#"&#"6323273#"&#"#"54>32327 (/</ ;H' (/ 6#$2*$N:W& Ó2-+%:&=Q2-3%„ *68fP;ÿ9:!>"&54?654#"#!>?>54.'&546323263![P#– $ (þå&€.. !I#–# +%€ . Ç?,"7î %0ÀC& F$%4î &0À(- ;ÿµ:Ÿ1>?>7327"3263!+657654#"#;&€( 'U7–# +%€%/– $ ( %0À:ŽTî &0À8+P î ÿÿþ­054''&'"#"547.+"&#"&5467>3232#>¼ŒÖ*w þÁ!A" %a J$ ~™F;BNH*Éþëì þ` ™;  ÉŸ>Ð14Ú! åJ<"#"'632&54654'654'#"54>?654&'"&7>7.˜0):M¦%   l[,]ˆ! $'Z]4 !·! L8$ e5"JIU,g99B4\GJg$ .PH -‚+5!ÿöõÍ=%#"547#"&54>7654#"#54>3267>323273õ !W`* #"? &Z5Q$]?2 …+¬'&H+ "%?6j- 4,²!"1<67OM6iK)ÿ áÍ!2%#"&'##54.'&546324.#"32>áwfDh 39>8.+EKN0qpct\ 8&| :%!/ éh‹RA#39D4. 64gu£€‰$IN1Á"IE,!89)ÿö°Í%#"&54632.#"3267°=kb}~hd=;1t - 2=LV†bh‡V( À!+F*!)ÿÿ Us"(C®Í$…f >4632"&74632"&4!#.+3253#4&+;2673!5265&&-&.ý.-%6%þý"A!&ƱZ(6­!ŽKI$8ý×@#&$$#"##$%àF,— , þ÷dò52ù=G«-Fÿ&à–7"&#"32>54.#"5323'!3>;!5.=>322;#Lo18Z6/<*6U9ýÌ9T6 >$>".#8X*M¸< p›T8r`="-ï-SªªR.þ @! 7ïS{Bƒº "s!7!5>54&'5!#.+"7#7632É!:þè9 7 6Uˆ (“#m6!#>±5!C& z” ÿòy¤!3267'#".'!5!>323'##"&#"·•UŽ.iv ÀE˜»B=e '=hD,–ºâ!!Ãÿÿ*ÿòë¤6ÿÿ;–,ÿÿ ;+",jÿú½ÿÿ ÿòr–-ÿó´–0;%#!5>5##"&546322676=4&'5!3232654#"´3ST,þú:Ø%E.)< ( ,:;#EBd:# þ¬e`®"µ3K&"?òþñ4suL$#bŒÎ6!7³'60ˆIM“´–3>%#!5>=!!5>54&'5!!54&'5!3232654#"´3ST,þú:þÑ 8þê:::/:;#EBd:# þ¬e`®"µ3K&"?ÒÝ5 "?±66³³6!7³'60ˆIM“¥–.%!5>5#"#7!#.+>32#5>=4#"d">þÜ> 6T949U648"7?%Ð&I*$m7 !@ô.RªªS-ñ1 OGß%"/Ëa""¡s=F#"&#"3#'.+!5>54&'5!3267>32%#7632Ž$> C1(X ¤‰ :þæ; := 7YI1XþŒ(“#\"P?]C‘' Þ&Ù7#>±5!7½YCY;>j” ¾s+4754&'5!!5>5!5>54&'5!%#'&5432Ñ/:: 8þê:þÑ 8þê:::(š"Ò0'66þD5 "?JþÐ%5 "?±66Ÿaÿô×e/<732>7.'5!654&'53#"&5463#"&'3326—  –&0u™)õ73Ñ+KC(7c|8Q 50,.oc7>$9þì*7 =þgSE#öFW2/(ÿI¾–'!5.54675!!4675!!3547¾: 8þê:þÑ 8þê::$8"6¼5 "?þý5 "?þO6‘ › ôÍ 3!5254/!3#5>73„&'þæH 4þë=IÆ!$zôÍýŽ,0w .'5Z©þé'`®%4!#&+32#!5265%4&#"326ˆ%<~¨FHm>' „oþº;&]Sa##&K];:'sþø'6/Th&4.#"326RA<2D 5pPþÅB"#ACf;$ s^G!:)4#*T9,'J[÷1W .7'":;".E¥F,%3.ARþô <þä10þã R*_®4!#.+!5265Œ)9.CY±,8þÎ<&@8$œ5=ýÒ$(: ÿ@Ê®!*4!#";#.+"#5>265#ì):A('#3 noÁEL!% 8V-Ý"á n;8)$/þ&0-ÒlT',1<Òb…¦oþ!$¸þíŽ$…®(4!#.+3253#4&+;2673!5265‡"A!&ƱZ(6­!ŽKI$8ý×@#*F,— , þ÷dò52ù=G«-Fϵ`%;!526="#52>767.#""&5463232754!32>7632#"&#"3#.#'W þÒ3/ 0T±)F-G # -A(0'>G<6 02.8* 0;'!(2*@%# !"$'/D/±¬ fT!0ï-)M¡4.+526f8,ˆi1Ro‡!/$Ši‹JEg,= &K4g^!7-¥ÌdO…! $?'Xm‡ a41600!M#®/%265;!532654&+5!#"4&+5!";!5ö/!þ¬ /þÏ(*+, 1OT)*212!2þÎ-.žþ]++(3ß/!PþZ£/$!/þ!.-ÿÿ#s'döÛ*#æ¶:"32>7632#"&#";#'.+;!53254!H+*/E) +V[&C 5@)T*?B. ³«&7&RþËV225œ%0Ò(BDH98$!<ˆ Y;Z?í7(ïKUã0"ÿùÊ®%72>=4+5!"3!5>5##"54632š#W =3/*8þÎ5/ã®V";D6[^3æP!,þ*'!.!þóþ‚?(+²¯$4&'533"3!5265##5265'=ÒôñÐB""BþËC"þöþõ @ñC!&;7ýó ,Fþ[F--F»ýÀ@þEF+,G#¯+%>=!3!52654!"!54!"3!ÞE!þ®#BþÌA""A4B#R!E6B"#AþÊ*GÇÆF..E¥F,-E´´H*,Fþ[F-%ÿñÞ¾ #"'&5476 2654.#"ÞSNTeŒjiff fgþ¤f{ 1R4@\/xY[¡48gh˜’jjhhþ*¬‘*RYB+=df7²#®"%265!;!53254!#";!5ö,þ²+þÍS03ì 1%TþÍ/,ýé,/Vã.#+)þJI¯"#"'3!5>54!24&#"326I|b=H$CþËB !A%{‘|[B$&4!COîNnÃF-+F¥F,kYHV þïQ)ÿñ·¿"23273#.#"3267#"&546Ÿ3Q1  ‡U%EE2 6WW,M"d¿™ÒÖ¾.ébb.IxMV~@M; ©É”œÔ…®7265#"#7!#.+3!³@#Y9.] ,)]%@þÌ.Eþ)››%/þF-ÿñØ®$72327.#5!#"654+53#"&54ÃA$(ÿ1#$ CÅ’; ÓF)Ç?{(1]-HÏ0%' þ¤R$ )[þCŒ!2'?®(7G4!32#"'3!5265#"&54>34.#"32>%327&#"}0325.0Sz>¡ƒ.*9þÎ:)0 y£+AjD#<@#7P)ýÁ)P725'L." ..LL)o‡1&%2†p!?@0î;V,þb)DF%%FD)ž -Kö®5!"7654#53"3!5254'.'#5>?'.'AEuŒDì%,<3oš# "þÐC\¢Bá%A(³4>2®& ¢ª'B<ˆ×0$ %#"Ä$30×ÙI+%ÿ@®-%;#.#!52654&+5!#";2654+5!#"­%2 nnþ10()1&(!ç!P1/!p5)ÒlT(9Ú-"*6þ(%"íO**ȯ*4!"32754!";!5326=#"&5u213;)2?Af(<321TþÍ+*x]bMM-"('¨3:)ä.)"2þM'3Ï9UN$>®6%3!5254+5!";2654!";2654!"å'2ûæZP 4#!¥!+,4#!¤!+,.+h*,OæU-/þã7%-/þã4(%7$ÿ@>®:.#!5254+5!";2654!";2654!"3,nmüëZP 4#!¥!+,4#!¤!+,.+'2ÀmSOæU-/þã7%-/þã4(%7þ(*,Òή,7>5#"#7!#"32#!%4.#"326“B @', ¥,);[€>4gFþ½À%P9!#)J\,Eÿ2' (:¾$<=#<<%Æ,0þÚX&´®,@4.'5!#"32#!53265%4.#"3264&'5!3!5>5‡ 0T;Jq@) "5[:þ¿)*]":="#&L\ü!G„,50U:\€>3gFþ¾/#]%=9 #&66!F4 FÚ#><#<<%,-Y,> þÚ!Bÿñ–¾""#"'#3>32!!#"'326&#-Q4  †TlŠþÓ-’wb 4;X0‘ÓÖ¾.êbe¤€+Œ£† #1%Ç4Ò&ÿñ,¾&>"367632#"&'&'#3!5>54!4.#"32>R6*•_`ŒŽÄef„T03•'9þÔ1/00,_)86.6+%(BF'6<-œ&3̓bcÏ”fgZLQcà-,$0â/#þ¤JsF- 0DiAYB )Btʯ$,"323263!5.5467354632"Ed3®›/I0³  ! @+? 7 þMWD$)è¯"8:ƒ-À:;B½F++F¥C-·=Wþê(ÿòãÚ'42327#"'#".54674&#"#"54653276íZ='=3=WL+-~<"+',d”o%$!Ú@Uè0*LTT7+>\0^:%  **5?þƒ¶/,! 1ÿòûÇ!-"&546763273#>32"32654&f}SS,UH5VZ7G< FM*/B5&EEh0K^:.NSœéA'?w_;O 0W8jKLÃNe€oUae‡ÍÐ(4Ȕ+5>574+324&#"32>h +×^`ZuÙ×,ó€# ‰>J(#3 s'$5DM[ƒ'*÷U°|&8¶ $®Ð.+3#52654!™  Š#2ô/ !.ƒT  þÁ8'),&|ÿ„úÐ$4&+"#5>7654&'5!"3'265#è?IÂx 0 . ,JÊU|0L|Ž5,"Z`)((4þõEŽœ!]þÚj ÿòžÛ327#"&54632!7.#"c!G.a$^MXlp^OaþÆÔ5-. =J4kIh„lp‰fT'7@+"¸ÔY7.#"#"&54632;545"32>32#"&#"#'&#"#5>=&#"#56?6ë % (1,$%Ù(#,1' $  6&'$0~e)Ù' e}0$&+ü 2.$ #+=>+q)!$&q+>=+ B QF@°8Œ&")Œ8°@FUÿòÛ%4&#"#7332632#"'732654Ȏ7*^ D'MZ{ŽlRiJ OM.==G0Gh)2€@5Ri>KV =;0)?,Â+?4.'53#5>=#5>=4&'53¢Í Ð%%Ð&Í&Ð&&Ð%‰á%þà%"/Ïá$"/ü/"%ÿÿ‡"daïJöÕ82>32#"&#"#'&#"#5>545"Ë%0/$"$  % 3"{Iå, -å$% +==+  (3&$S"Æ$ŒG$$*'#.gÿò÷Ð#4&'5!"3#5265##"54632325•0­- '&í."¥89@ # /l+$))þü1%'5BöqW8# €Ð#453"3#5>5##5>5b*ž”›š*Iß)«¦ &¯,o('þ¡_(5þúI#$%þ€€þè1#&-Ð*"3545#526=##56545õ"!Ð "Û+#&Û(Ð*ÜI+ܾ,ss* $%þî- #&††'!H("-ÿòûÛ%#"'&546322654&#"ûFGbYDBˆgYDBÙ9FWE2LY÷gOODBc` DEþÂfSd‡Sbd‹Ð4!#5265##565b++#&Û(Ð*ÜIs)"$&þï- #&Uþ«'!Hÿ- Û!14&#"'73632#"'3#5265"32>54&d “FZ'6+FFXC.%1ú2!Æ?6%--LB0&7jj 0V5sGJ+€7&&7÷B¬95)P7Vlÿò«Ú327#"&54632#".#"jXJm"o?\re$;"#$;H]pqWd‹em‹%+%_ÌÐ.+#5265#"#7!· K&%æ-K ˜T þ­*')N ||ÿ,äÐ%232?&'537654'53#"&546X 5,%¡!+Ï  qM.„~(R9)od(gJ$ýÔN *Gþªi]$ÿ-wÍ*2;;#526=#"'&54763254#"'73632#"'27&#""3254u$%è&$+4A0100B1. ˆ,4E]]E2.š+)"`G$('#bv* !/.FFigFG.¨3=þà.Œjl‡. +O,þZ¦,þ±+Ï×ãÐ-37654'53#5254/3#56?'.'Ñ&*0$š4?1N39Í+BU,—,9YO,!Ð CF ]I{R7/i~U„{/%ÿ`åÂ#%#.#!5>54&'5334&'53â90þ­%%Ð&¯%Ð&¯@`% %"/þÆL%"/ü/"úÐ)45"327545#5>=#"&5U&Ô'!/2:'Û*,ç(&B`A)t%%$&S){&$#&þî($)„),?Ð74&'53"3!5>54&'53;26545";265z!#Ú($"ý & +Ü+!]"!×(#Vv',9ÿ)*%"',þì#$ )--þò$ÿ„Ð:%3#&#!5>54&'53;26545";2654&'53"Ê(ý¤& +Ü)!]"!×(#V!#Ú(b/!Ž|*%"%.þì#$ )--þò$$',9Ð("#7!"32+52654&#"326/2#8GU_pÛ,"ÿC, 5D° ! |(/`!*8R&#UþÖ5,¹ 8µÐ%9"32+5265454&#"3264&'53"3#5265 3#9FXC"(PÏ''&(ôZD,!6D²,ç-&&ç&%¾'0`!+2A ,+þ¶5,¹ :*%((þé''ÆÐ)"32+5265454.#"3263#9GU# (PÏ''&(ôY$#!!A8¾'0`!*0 ,+þ¶)¹ @ÿòÛ>32#3#"'32654&#"#"'#J# s™™ƒQDMh[xwY!L  B/¶ÐP h“liˆÿòðÚ&4"3>32#".'#3#52654&'57"32654&-qw_]ˆFI_4R- q%&ç&&$(ç÷6B%7++MS¾$,oW„hiJL)9H1Š('-!cQGh0Wdf† ÎÐ&7>=##532?&546;#;5&#"ö*(‘t rzSbÔ% $ØT?H7/),iÑ"ª"V/K%3ÿ. V&>·8ÿö¨Ÿ$3267#"&54632%3.#"7#'&5432a010G$nGVeu\LT þÎÌ *.ZÝ(š"?[-09QVygo‡[\ A2La ÿòž± .64632#"&74632#"&327#"&54632!7.#"b&&¬«!G._&`MXkp^OaþÆÓ5,(4}%%þ£=J4kGj„lp‰gS'7@20 ÿ'Ù«9"&#"32654&#"535#5'632#335.=>32U25)SVA8,D#ss] pp+Ø,3I·<pj6FO'-—"w "þW54ñ"aþŸP;Ÿ#.+#5>=4&'57#7632} -v%Ð&&o(“#Â}7!þ´%"/ü/"2” ÿöœÌ%"32>7'#"&'35#5463232654&ôZkS$?(#$>+5##"%3267654'&# # & 0FV iu½&’K1B¤0&+B +o8†/" O -3Q"/:Àxnã (@°Â3A%+5>=##5>=4&'53354&'53"32%3267654'&°iu½&¯%Ð&&Ð%¯&Ò 0FV þø0&+B„3Q"/u‡%"/ü/"%tb/" O ) (@ «24#"#5>5#5354&#"57673#>32#5>5‡K3,Ø+pp D/ss#D,{)Ô+,j"ñ45©" w"—-'ŸÇ4 3ÿÿöž&[/øLÿÿŸ&\zùJÿÿÿ,ä•&dTýUÿ~åÂ'%#4675#3376735.54675#T¯%Ð&&Ä( Ç%%Ð&%L%"/ü/"[ 67% %"/A÷¯D4&'&'5#"'#"&54>54'5732754&'5!32>Í$Yâ!ª‹€&!9#‹ª!âT)&9`=J&!@)=%$T=`9&4r '  ! 2bE¨Û£6!Û¨F^1!  )w3%IN;&8É9"4¼F&;NI)ÿ÷ŒÍ/43232654&'5#"'##"&546732654&,/...10*AYncOnnMel[%-a-0I86?Ndqfa‚e]ƒƒŽ_d„ @92ÓO>‡€– 32=4#'.'5!3#.#72#!5>5"#7, Å®¡16"¯8WEBd:# 1RU.þø6T9Kþü•“÷"&ªM3¨'504J& 3°2Nª­/A7>5#"#7354&#5673#.+32+%4&+32737>=x 4,  w 60GW(:l½323273#'.#"!!#3767§+“S›`Gi#BþÌO"A4C"j;M_F?s!  kMk|/þõ%"2C=!eaq=AfV‚³F.(7§ @(,DÅMwB* !!âHY˜},Ch<' \ÿ÷ŽÐ;%>32+.#"3#32>7#"&'##56545" ƒL<^=K±¯ Q?),[>YcX'ÜI*Ü&þ`n:-&)"`M%BX UG‚`~*E)!"'w¿² #&35>73/#56=46=#3!$Þö"%#è2M+2Kþš$$OL8¦Jœ!:BýÊD#£v©0- ! P­“1ÉÂßÏ%(35>7632/#6?4>=#3 € x) Ÿ.' ! ¹ #,i)S&"A1.þá\ Pr\; *zu9i² CF%6=#56=4/#4&'5!!3!5>?!!5>5%3'$OL8$÷K)2M+ý« 8 0ŒöýW Aþá!7þê8 ÈœR N­“1! bv©0-14  þmýÊ'+"©¬3"#?ÌÂæÐ'3=@45"37632!5>?##565%>54/>=#7'b*Ü&âI x#þ6 (Ó(ÜI# .‚ "-“*(t)!"'Ž·1# þáM% eg*Ei\4 r±zuÐiiÏ–8C%26="#52>7>73'.'5!"33#.#;!4&5!765[20 1S±"8/&8 fF1(8$¢' ‰k±!""±¬ "V þÒQþéq(2ð ,+OŸ#BEa#iE2% «þÒ.ìTc²Š1¸Ñ@O&+5!#"#"#;#'&'##5>='#"#56?636;?>=2='#½#Ò ,2  '!$0~e(Ù' e}0$&3(!\U À˜' 9N&%;@°6‚)* 8°@Fa~  ö°KV%26="#52>7!!5>54&'5!!'.'5!"33#.#;!4&5!765‚20!1S±)F-O!þƒ!7þê8 8F1(8$¢' ‰k±!""±¬ "V þÒQþéq(2ï ,*OŸ;M‰.ä3"#?Ë4 #ÆiE2% «þÒ.ìTc²Š1¯ÑWk45"!.'5!#"#"#;#'&'##5>=&#"#"'#56?67!#5657>=2='#Z*Ü&rP7Ò ,2  '!$0~e(Ù' e}0$ þø'ÜIÆBU Àt)!"'w|C 9N&%;@°6‚)* "°@;:ƒ*E7i~  ÿ1è@P26;#".546;2327654&+52654&#"#5332632#"3#"&=332>–S +%EC(OT+I#cRad=9ˆf5Pr‡FWL¹iU/2!+1# ,U@-2'/K'6##(75#"#675!3"'5.6.'&+3'&'37#!5#"&=332>76ø9D /$!BXþè)0o+#&4; #?Sq04,&6CPA ²% L'  2EQ.3> \> 2þ§+[^ZC  A9gh2>r2'q ;'!ÿ }H2#&?54&#"354323'>=&#"#3QJ†5,d2#ua ^ )C+! BŸ‹%Du :ýÆ €¶6I„_8­]hÖÖ$1A32#&#"#73ö "D # R"¶Wƒz*mCJ(i"= QþÝØþ¢ÿÿÿöv'z Іÿÿ ÿÿÒ 'zZÿú‡%ÿò5¾$K#"'&=476 26=4.#"%2327.#5!#"654+53#"&'54Þ&'¥hŒjiff fgþ¤hy 1R4@\/{A#)ÿ0'$ AÅ’; ÓF)Ç?{$3YOWRofh—’jjhg•þ¾¯*RYB+7>>32>=4&'#"€5gY7%FvI6iY75Wh5(6(eP V\^Zä 5VƒL7qgK !6VƒLJX8Q-@qG‡¥ ªyz³ÿÜÖë12#"'.=467>"'>32>=4.'ëQjeC! MeUH! %6!% &'+! ë {Zb{ ƒXUxf L4_}(^@+F; A÷OW4.5475'+"'54675!2#5#".546?67532>7;>7#5!53÷!âK' %9`=T$%=þ×;&&J=`9% 'Kâ!¢Œ4  %€Œ¢ýÃP PƒF^1!  ! w3%IN:&F¼4"'3É8&:NI%3w !  ! 2bE §Î&$ £ΧCNnBb)ÿøŒº8@74>753273326=4&'#"&=46=&#"+"5#5!53…-%\kcOo_QamZ@+^/--//.`tP Pæ3:?†b]Ž‚e]cƒb`¼P=Š68 ˆ54&/&'5#"'+.'54>54'57;2754&'#5!35.+#526=#"#7!Ä=`9% &Lâ!¢Œ& 9#Œ¢!âL& %9`=J&!>)=%$T  K%&æ*!K, ˜t&:NI%3w   ! 2bE §Î£7 Χ F^1!   w3%IN:&8É9"4¼Fó  @(!#,<)3||)ÿ÷Œ³:W%4&=43232754.'5#"/##"&=467;265.+#526=#"#7!C/-..^,"YncO`nMel[%-`-0Ó K&%æ*!K, ˜ † 86Œ?N¼0?8‚d]fƒ_d„ @92ÒN>˜  @(!#,<)3||ÿgÛ¤/327!5>="&'5467323273#&/&#""2F=!ze.þ×A ?l–´¹Œ ?s!  ! =Xq}RKs@) e2#*F.!·›¿!!âK' =§‚ÿœÞÛ,%#5>=#"&=46;23273#.#"327"š,Ø+0.[xwX!L  !* C3‚QD0"2 ’kgƒˆ&5mhÐP )|7'7'77'77''_6]LU6hqU7ZXb5uÏ)@.w8@=¾É/@4w>@C qº!5#!3Q PþàPXbBn#‘¿>3267.#"4®R'L3Y- 6œWa»J-,M; *-9D8 ¹¼#53!=98~Q1œ38 ¹¼!5!53#þ„~89Q83œÿ|Y )7ESbr""5462#"432#"&""%462#'&"#"2#"&#""542#"&""54#"&"#"5462#'&#"#"5462%""54632#"&V 0'1" F0 x2 ¢0 #  0þ¹ 0þŠ n   N< &‘!! &B: & :þº  & þ  $$  ¢ &  ‡   $ÿVQ (.6;254#"3254#"%3254#""3254"32544"24#"32$24#"I112‡1551F2112x2U221†ddþ¹1221þWf51!1221u/12T113‡412þº2112þˆ332T220„d#ÿnw3K%;#'7#53265;!532654&+5!#"4&+5!"$2>32+"&'54632²!2z&Yæ0 þ¬0þÏ+''0 1OT%.230þÎF0QieTm.-’'k--Ÿþ],*,.à-#NþX£-&"-«(/((A>*(/ÿn¨.E7#526=#5654'#5"74#533"&'543232>32|Y•&Ð'ÜI$Ü&ÐBÛ(! )zUJ#% % fkk (óò*E.!)îôD)þî+"’¯<(&#*##*#)=– .32654#"#!5>5#534&'5!3#632Êe`®23ST,þø8AA9;#DD'Bd:# KþüIM“™3K&6|6>!!7 6v'60ª .73267654'&+5>=#534.#53"3#32¢0&+B¸iu½"99Ò770FV Ú (@V3Q&Ð66& #–-327'7654&#"72'#"'!5>54&'5Ê"G+U'U`eN-TS2JO'Z5^'#;þè98OþüU&U!2MI3&J4[6O&Z¶7!!?±6ÿ'æÌ4327'7654&#"4&#"567632'#"&'#5>5ŸE#%e'_C8#CT ?Q@PI^GW'Z-4 + 8ò,Nö,e&_0EWi,# MOx]xJW&Z/' "ÿ!"!5>54&'5!2673þÊ !:þè9 7eU6 p þ6!#>±5!&C##5>=4&'5!2673}Ø%Ð&& - þ´%"/ü/"!7 "– 3#!5>5#5354&'5!#.+"É““!:þè9>> 7 6Uˆ NŽ6þã6!#>6i5!C& Â!#.+3##5>=#5354&'k -vNN%Ð&11&Â}7!{6›%"/‰6=/" ÿ&E–8"&#"32>54.#"546;23'!!5.=>32~2;#Lo18Z6/<* ˆU6 ýí7 9:!.#8X*M¸< p›T8r`="-Ñ &C!5þO>#!6ïS{Bƒºÿ&¸Â3%4#"#5>=4&'5!#.+>32#"&54632326dc %Ð&&k -v'1+0Dj`#;2%,;¿ p%"/ü/"}7!¼0 Kg;s« <$ÿœj%"./.'>7632326=4#"+54675!#"&'.#"32632#37>;!5.=3223ø$%XE >$X1I]7 =þä: 7]I1X$> EX ¤‰   ;9! "‰…,%‘]?P">;YCY½7!5½YCY;>"P?](‘' Þ+Î>#(9Î."Þÿ”äÌ^32632376;35.=32323'.'.'>3232654&#"+54675##"&'.#"0)  ""./"Šs" 6ê "s,+"/.""  )$0):,ê6:)0$˜+51 :_ ÈŽ' È48{ _: 15+&FFƒ  'tFF&ÿ%ë¤D>32+32#"'632#"'32654&#"7>54&'>54&#"#"'#`c<.:“200@ X/vi+‡Q& %'-:C.( OfA922eH*b ÏXT4)­969&)@e:BY -' %8eI7gW3K`""Õÿ)cËG""'#3>32+32#"&'632#"'32654&#"73>54&'>54&¿!: 2+#/9#%''<4$)E&-& %'-:C.( IB6$-UË ˆC87)$7A)3)57 !#Z -' %8L8'C5&5F"ÿ³œ>.'>7632326=4#"+54675!!5.=3223'".'º'C >$X1IY7 =þä: ;:  ‰…$%$#]?P">;YCY½7!5þO>#7Ù &%Þ•,%ÿ”íÌ;2654&#"+54675#35.=32323'.'.'>32§$0)C,ê66ê "},+"62"% )t&FHƒ  'þâ' È48{ b9 15+"¡œ@353>7>32#"&#"3#'&'#5#!5>54&'5!â"6%8 I1X$> C1(X ¤‰*6" :þæ; :=l‹~L1Y;>"P?]C‘' ÞDp†Ù7#>±5!7êÌ;#"&#"#'#5##5>54&'53353>32Ó) %"26"Šn6,ê66ê6 ('$˜+51 9b °Aq  '' ƒkU:,("¡œC3267>32#"&#"3#'.+!5>5#534&'5!3#â 7YI1X$> C1(X ¤‰ :þæ;KK :=QQlYCY;>"P?]C‘' Þ&Ù7#>|65 66êÌ>#"&#"#'&+#5>=#534&'533#3267>32Ó) %"26"Š}" ,ê6??5êBBC)0$˜+51 9b È  'ê6%  6@HF&#œ?#"#7!3267>32#"&#"3#'.+!5>5þ6T9«;# 7YI1X$> C1(X ¤‰ :þæ;l.Rª!7½YCY;>"P?]C‘' Þ&Ù7#>IÌ;#"&#"#'&+#5>5#"#7!"3267>322) %"26"Š}" ,ê6D- 9 C)0$˜+51 9b È  'K!7} QHF&ÿÆ–/%#.+5>=!!5>54&'5!!54&'5!f:>Qh:þÑ 8þê:::/::€6§H9"?ÃÎ5 "?±66ÂÂ66ÿ”êÂ/!23'.54675##54675#35.=3z,+&%Ð&¯%Ð&&Ð%¯&48{"/%"/bt%"/ü/"%‡u/"¾–046;23'!!54675!!5.=!!5.5f ˆU6 ýí:þÑ:þê::8 /:8 N &C6ÂÂ66þO?" 5ÎÃ?" 5„Â/323'!#54675#35.=335.54¼b- þ•&¯%Ð&&Ð%¯&Ð%!7}"/bt%"/ü/"%‡u/"%5ÿ&â–@"&#"32>54.#"54675!!5.5!!5.=>322;#Lo18Z6/<*:ýU::8 /:8 .#8X*L¸< p›T8r`="-¬66þO?" 5ýþ?" 5ïS{Bƒ·ÿ&»Â=%4#"#5>5##5>=4&'5!>32#"&54632326gc %Ð&¯%Ð&&Ó%'1+0Dj`#;2%,;¿ p%"/:þ´%"/ü/"%0 Kg;s« < ÿ¤A^2654.#"4/&=46323'##"&#"327+#".'37#"'4&546=4>32ŒS %Z@AZ%lu/J1 s7œ»€k[Fg; R) šR4 !$  ‹_ApNUuB A+N°‹ª73$Ó!!È—}¦_„©.T 3ùFd‰ $  2 -'ÿJÚ0=".#"632#327#".'.54632254&#"n#$?D" ”?=z[!1a$bI%5,%%I‚b-D!`r1*0@"G%+%cHP7¢D:Tg !kLd'J0oUq‡& þ÷^.DN>'ÿ)y¤4327632#"'732654&#"'7.546323273#&#"-LQ.viY¢ (.C:-'% #ޝÀ@p !  7 mRWAev4% '- U·–œÃ!!⺢ÿ)›Ì9"632#"'32654&#"7>7'#"&5463232654&óZbN& %'-:C.( 6#$>+DWK= "[̉n]|Z -' %8%)" 4*mVMa.*=ÿQ–!23'.5323'!3>;Q>:6U9ýÌ9T6 >9H§6ì-SªªR.þ @!ÿ”ÇÂ%323'!3>;323'.D- þ` -De,+&c:!7}}7!þ´ 48{"ÿÿ¿–<ÿ<ÝÂ#%#5>='.'53654'53*0ì/h#Ä fc/‹H¸)(´ùN$ ÿ2¿–-33#!5>=#535'.'5!#7654&'äÛ'8+”ee$CþÎD!llƒK3$ .”'–-Bâ 69!Av6Àj2Þâÿ<ÝÂ)3##5>=#53'.'53654'53œrrr0ì/qqh#Ä fc/‹eþâ6)(~6ùN$ ÿ ÿÆ–:!23'.'7>75#'&54>35!35.54?"Q>)'À’140î)(q*U þÒ2=FmC(&é, 4w_329H–+¶:! 2Š;v 4g ÁPA”ŒLÿ”ìÂ6>54'53#.+5>54/3#5>?'.+53ø  (ž3SŽ!+,f[O(‘r^  Ï+.0)*x× {84 Œ{ ¥#Aÿ»–'%!4&'5!#.#!5>5#"#7!#.+d‘ 8::>Qý¡:6T949U6,ý5 "?þb6§H96ÿ.RªªS-ÿ”¶Â'323'!3>;!23'.=4675#!D- þ` -D%º,+&&Ð%þý!7}}7!þ´%48{"/ü/"%þ´ÿÆ–-!23'.54675!#"&=4675!327Q>::þê:LR>S:þê:jSH:9H§6©66Õ=V=66~Uk=°?"ÿ”ÛÂ/7"&=4675#327323'.54675#ñ6%Ð&U+G-&e,+&%Ð&#Å"$d%"/T9<2c/"48{"/%"/j0¾—/536754&'5!!5>=#5.=4&'5!ÑI86@8:: 8þê:8@6dƒ::)9Tš– -Õ66þD5 "?°/ tpjQ~6ÿÿÖÂ3536754&'53#5>=#5#"&=4&'53¥!6&Ð%%Ð&6+U&Ð%qe#D@ j/"%þà%"/c WJ<9T/"¾–)%4&#"!5>54&'5!632!5>5S>RL:þê: 8:HSj:þê:ì=V=Õ66¼5 "?°=kU~66ÖÂ+%4&#"#5>54&'53632#5>=C61#&Ð%%Ð&-G+U&Ð%·$"0j/"% %"/c2<9T/"%dÿó@¤ 5.#".546;2>32!327#"&=4Ë *K/Vlsa<<6J«zIvB/ýé0NP)zh*›Q’µ¢+E3&zd08'76s1CW=7U|?e;DÁ—!ÿ÷ê+36;2!3267#".=47#.546;2;674.'#"×5R•þÌMK3G!A“5N'Q,=W(Î ,&Y—5·cw72¦*FG''!*<'77(="bE,qÿR@¤IS327327#"&=47.=47"'. 546;2>32!%.#"'0NP)zh$‹U)+4< )4=[F3 <6Jª}IvB/ýé¢ *K/VlKU|?e5D!$L+ /'.F€S '76o‘1CW= +E3&zdÿ]ê;C6;2!3267327#"&=47.=47#.546;2;674.'#"×5R•þÌMK3G!7u ,4< ),LUQ,=W(Î ,&Y—5·cw72$L+ *&x]'!*<'77(="bE,qÿÿ;–,ÿÿÏp'dIØ(ÿÿ¸™'dÀH"ÿ&ŽœF%4&+!5>54&'5!3267>32#"&#"#"&54632327>-ˆ£ :þæ; := 7YI1X$>  ( 3XN.ƒo)52 *^l|Ù7#>±5!7½YCY;>"1BT %;]:š¬<0#dÿ%ÓÌE2654&#"##5>54&'533267>32#"&#"2#"&#"&54632. 0GJ,ê66êC)0$) %N„dV )52¸fsYk  '' ƒHF&+51x[z‚<ÿoÊ®*7232>=4+5!"3#'7#5>5##"'546E;$W =3/.4y&Xè40ã®Ul(:`Y.çP ,þ.#‘'j ."þóþƒ=ÿn÷Ð+7232>=4&'5!"3#'7#5265##"'546&#  0­'&#*z&Y£0 ¥6;>O#6,!¡*%!/þú,*’'k'4CönY5ÿO¾–22325!!5>54&'5!!54&'5!#"&546‹ &þÑ 8þê:::/::XQ+87 B„Î5 "?±66ÂÂ66ýë^g( ÿ&åÂ1"&#"32654675##54675#35.=3$25)SV%Ð&¯%Ð&&Ð%¯¸<pjq%"/bt%"/ü/"%‡þûP;#ÿn¯3%3#'7#5>=!3!52756554!"!=4!"°#Az&YíD"þ®#BþÌO"A4C"R#C6B"…F-’'k+EÉÆF.(7§ @(,D¶´ >'+EÿoÐ.45"35453'7#526=##565b*Ü&Ð$Û(! )z&X”%Ð'ÜIt)!"'ts'#(þí+"’'j!'‡†*Eÿ¾–-!"#7>=#"&=4&'5!32754&'5!VQ>:HSj::S>RL:: 89H§6¨=kU~66=V=Õ66þD5 ÿ”ÖÂ/32754&'53#"#7>=#"&=4&'53¥61#&Ð%%c,+&-G+U&Ð% $"0j/"%þà%48{"/c2<9T/"%d+ÿn³¯)%33'7#5265##52654&'533"N#Az&YïB#þöþõ @ñA#'=ÒôñÐB"…F-’'k-D½ýÀ@þEF+-D£:8ýó +Eÿn‚Ð)%>5##5>5453"33'7#¡)«¦ +¯, )ž”›š+Iz&Yš#"'þ€€þè+#0+$þ¡_)3þùI’'kUšõ,%73UYGzÁk’ÿÿÂe"$dÂÍÿÿ(ÿòã‘&dHùBÿÿÂ+"$jÁ½ÿÿ(ÿòãW&jIéBÿÿ_–ˆÿÿ&ÿöx̨ÿÿ Ue"(dŠÍÿÿ ÿòž‘&d:ùG%ÿò°¤#"&'!654.#"'>32!326°´“‚±2sR{g*žN“=þahYZhÞþØÄ ‚$Q„We&ZaåJÿÿ#9'jõË*ÿÿW&j`éJÿÿ%ÿñÞ?'jÚÑ0ÿÿ-ÿòûf&juøP"ÿò°¤ "&5463232675."c‡º¸·¹þo^`qp¼n¿š—ÂÁœ—¾@ƒ™™ƒ6ƒ••ƒÿöÖÌ 2"&546;265'.#"ú`|€¼}{ A:7? K65AÌ€bhŒ‡egƒþüKkbT6QaVGÿÿ"ÿò°+'j½ùÿÿÿöÖW&jSéúÿÿÿñ–?'j£Ñ?ÿÿÿò_&j7ñ_ÿÿÿñØ 'ZÇÇ5ÿÿÿ,äB&ZTéUÿÿÿñØ9'jÆË5ÿÿÿ,ä[&jTíUÿÿÿñØt'i¼Î5ÿÿÿ,ä£&i8ýUÿÿÈ:'jÆÌ9ÿÿú[&j`íYÿÿ&´9'jFË=ÿÿµ['jÀÿí]–'74>354&'5!3!"&5'"326 #:dBE%982þør”T9­Å µ06'¶6"#=þN;  Y[m‘–ÿÿÿöë«Gÿþj–.8%26=4!"#"'!"&=4>354&'5!''"326*?2/536-Mbþør” #:dBE%976Ÿ9­Å 3:3©-!%*©NSY[06'¶6"$<þN‘–ÿìc«*84&#56732654'5#"&'#"&=463226754&#"TV=0)2€>6d/KUd{U54Y%1<*=@U=ýº 7*^ C)K[D Av_o+þ‰(ç(6Rg7*^ÿú´®2%##"5463232>=4!"26=4!"#"&üã®V;$,6=3/43/536-M\ZRŸåþóþƒ>(:`Y.ç)' ,þ>D+2Q©-!%*©MU?ÿÖtÐ8:7232>=4&'5!"32654'5#"&'#65##"'546%5&#  0­'&<)2€>62m¥6;>>O#6,!¡*%!/þù:7*^ C)K[KC EönY5#ü¯D"26=4!"#".'&=35!3!52756554!"!=4!B"43/536-EX)/+þ®#BþÌO"A4C"R#C6œ+EþdD+2Q©-!%*©LP9/ÆF.(7§ @(,D¶´ >'ÿØ›Ð6%".=##56545"354532654'5›>7I>Ï'ÜK")Ü&Ð$Û(!<)2€LZJ1q†*E)!"'ts'#(þò87*^ C ÿóŤ1.#"32654!#"&=46323273_2H.v€"5E?T>;ÿ-QAB Ä¾™9p Ñ&27¬‰ElA*RmI. (f?\ µœ™Æ!!Óÿø˜Ì*%2654&'5+"&=4632#"./"2==(eSVh€[OJ ?IU>(0  Rx}_mŠG !)$bKXk¹–*%"&5#"#7!#.+26=4!"#£_F6.6" 4 >>443/536- )(,>^Ì "*)ªª60þ'782Q©-!%*©<;ÿ×àÐ/.+332654'5#"&'#65#"#7!· K<)2€>62mK, ˜T  þøB87*^ C)K[KC A)3||þJþâÿ7ÿ– (3"&54626"&54632"&54632"&54632"&54632â   Ä S J  þâ s   !  ! † þþÝÿÿ” "&54632'"&54632'53þÿ    ñ þÝ  u  44þ ÿcþâÿ£ "&54632þÄ þ[ÿcÿ!ÿ£ "&54623"&5462þ~ u   þ[þÔÿÿ£ "&54623"&5462"&5462þ~ n O    þtÿ`ÿ<ÿ”53þtÈ 44þCþÃÿ ÿ”53#2#"5463þCÈO !  44;G<Dý_ý²j .4632ý‰  þJþÃÿ.ÿ’ "&5462"&5462"&5462þm A R ®  H G  ¹Tù 7"&546326¹ 4¶3#3444¶qI+i%.'67.'>7+ C$*+$  ($ ¦  % C%'U'% !,ÿûèHU64&547.546;237"&4632#"'./2+".'.##67632>G%?& aX3K,1:18 1$32#@à (/( s %‡3H;%$< "dBGE26(2(=/M*4H#>*&>/¤:.= øV"&547;23!7!4&#s((Î0G6#þC#r10º!67=PþÆll.'(V0"&547".5.5##54?>7>54'54&#" 7;   >vx# '± .B   /þø,Z)Ye. w )ÿþâT3!2++'"5465!"&545;$  þç1&T!'þ¢ < –)(8ÿþÑV73!2+#"'"5465!"54#'"#"54654&546324;*  þèZ4 V!Aþ© .—V1þM;$2 0 =V d0ÿV%2+"&554&#"#"&546732326¦1 .!!  3&( þ¬M E5#8 7ÿÿ V3"&543##"&54654&54>7"#"&547á     17t ¤ !Ž'.% ! + ?/W/1*6('&ÿþÒV#"&567"&5477!2+#"&5!A-';+ þ÷(230-1 Aþ§c —-þÆ7ðVB!654&#""546763632!65654&54>7"&54674&#F^/T='$X  ,B%  þp ++3+P C(¢ KŒ8$)1*’#Y0FB)Fi;7 4g#/J) 40!*9:=Aw"&546732632#4>54&#"v " "# )Þ$6 )%¯4)þ§ð43!2+#"'"&5!"546> E*&  þåV4&&þ8sZ.,# ÁE6åV$"547;2#!7!2654&=4&#eFö%1+=þ’$B3=ºW569'EUJSl,8 1-E.K12!2#"54>='&#%"=7>54&543Ÿ # 1.X  L[L  þÒK7*A"ÌG0T IGUq ¿" ãV#2>;#"!4&#"#!"&467"3…!:þ> +  #~þà/(%36>þUN.>B*â(45 çWF%!267!754&#""&=4&5467.54677>3ã(þ±@u_,H)  %.( H >P'  Hjy[u&7B4 b#B]6‹'"/   /"&@A.T=:þ©ú4"&547+"54654#"z#$U "9 3 ,0!#m9þC%.J 8/V"&547;2#7354&#"$!' 8%+¬7$¼#52 -P „nbSl %ìV3;232>54&#!7&547;2+".=4;&?! +Aþÿ+ö!/[S#1^Q "I:[E?uH?&=4$ . ‹!<6+F` ßXH2>57.54>?#"&547;24&#267>=4&&'&54673ž&Pª© ˆ!  !K  '‘ %'%4*Kþ° P "DH' '$N  K4.'U21ƒ1  =  þ­å3172654&#"#"546726;23254/5+"5®/.! :* šAK!¨Á<#)¶+>& Pf çM÷²j’’ # C$ G(2ØV772654&#"#"546726;2!!>=4.+"5¯0," 9* š&1þr#¡!"A-Á<#  Ø,:) $5(¢ld¤,CV7'#B$ 32 þ¨Ö4E."##"&54654.5467>7>7.5467» C/ (1(9 #-%(= i 0,þ&ÃEy 7 /$]>æ í&,-/ . ÜV>4'!67!4'.54654&+"&54677&546q!)!1(þL0:G:4!$ ¥'*V &!,# À .%2S ## D,#3  N<M¿.3þ©ã4/F%4.+".'&547;2#"5467>"4654&=4632É(0.Î" Â".# *GFOlB4!þƒ"   æ>F$ 2 +;M1 /&#() J&(þœdJ\¥p–#@$ (%+çÿÿÕV(2#"'"&=54&#"+"&5473P&& &á-* 3 4$=IZ&6:   L.!0<V]"&546764&#65#"&467&#3>54&&'&5467!4&5.54>?Q   * k" !|ï*@&% 4 75þ´* Ç:  /  1+­32?  +%þÔÖb 6 ,Yä‰ ' -8, ÿÿòV<;2#"5#"&74&#"#!+&54632.547"&54Gè8þÚ #&G / V  þ¬S aE&":$2#C5$*K#h?1%9ïV$K2+"&554&#"#"&546732326!2+"&54&#"#"&546732326–0  +$!  ÿ0  ('!   3'1þ¬M E7": ((þ¬N E:#8  !ïV$A2+"&554&#"#"&546732326"&546732632#54>54&#"—1 -""  þÇ  "!# *3)*#þ¬M E5"9 v%5 *$¯2'Aæw8"&546732632#54>54&#"!"&546732632#54654&#"] " "$ )þö " "# (Þ$6 )"²2($6 *$°/2)„ô)×2#"5467>GL @× $fFz$-ôZ×2#"5467>32#"5467>ÅGM @˜GM A× $gF{# $fF|#bÃõ¨"'6&>7632õ 9C  "2"  <@ #" ,-6µÚÒ"&5472+"54&3mE# : 5F‹8,…^E.  IIDFE“Æ… !*4632"&54654&#"#.'&+"5632“C7C5"!'@#.Å,<62—2CF.$ & #>. Q;#?F,þˆ:33UyIà"&#"32>767.54673(1# L›+6' D08k8F6 4u<0 $$5Z9( šeQ23267#"&#&>54'7š6 "(/7: 10##06 *$7E(ü{KBBCCBBC'P ©);Z>?# -2.!Â¸Û "'7'?'74.'7!"&547ô@CC¡@CC°ABBWAý777F 3*BBCCBBC7CCBþ8@N?)R­*7K~c)&|ÿßë)-237#"327#&'&5&546767.#">'7J¾oX­îJ6'M5p¸0¢„.-?>^4l62/<Ñ544ë!?fkLQ#A?&./1@? DyHv 0'þ}553zÿ4âù*237#"327#&'&5&546767.#">J ÃpY¯ïK6(N6nÅ%Ÿ¡…/-@>‘^3s42 !"5ù >djKP$A=%,.0?; CwHv !pÿZµÓ)-237# 327#&'&5&546767.#">7'74±iTþ½Š3#G1iÆ–˜}-*:=‰X2j1/  2c,++÷;ÃFK <<%;<- ;9>oGn  ±,,+rÈ«4.'7+"=7~  5"8Ê7 $"O )8hCN`&rȧ '7.'7+"=7/977„  4!7È6 Õ997þ $!N (7gBM_&ÿÿÿgY¿76?>54'E €16hSEF$¿EOH ñH 1 dcR&-WÿÿÿgYŽ'77>7654'F8;;7 €+"R CRm?Ž *! k( $Z$e44$"-E&!  A/@ e9FH*-MC1H8@D8%|ÿâ¹¼:>BF254'7#.'#"+.5473267654'732=7'7''7'7l1',&$";0-#&Œ )!j( $!/11"/11$/11Y$c42% !7I,9&?f6DG*,LC.H8>E 6&---:..,“---‚ÿé´Ò(32##"567>54'77674#"23276@$&»–%FS8ÔQkA\-?",x:1JTPg‡@Ò 8'!""B[0±oVNHNT!45GIHix7Rƒ‚ÿé´©(372##"567>54'77674#"23276'7@$&»–%FS8ÔQkA\-?",x:1JTPg‡@”100Ò 8'!""B[0±oVNHNT!45GIHix7…RƒI000ÿùÉ8"6547632#!'%4&#"!6¥V? sg&(=ýÿ9%&a~SE›µ2ƒ @.QO-'8ÿùÉ8&'76547632#!'%4&#"!6».//èV? sg&(=ýÿ9%&ad../þ‚~SE›µ2ƒ @.QO-'8‚ÿ%†ö&467&'=476;&#"32>73.‚>>W#A8F5D L› b. 7kD#’Iƒioh°²:C5”4K*>91*8%Q"CK{HL.A$8‚ÿ,€%)467&'=476;&#";673.'7‚B9W"A7E4E Mž _.wp#Idng­°:Á011><0J*>90)8$Q:BJzHI/A$7A000€Í+û$.246;2#%.'672326;2=.73275.''7P;,1Výò+""2È1!„!U8M(e$U'*122°;}0/@^B\/K6LN$"0 $ƒ =1'J¼223‚ÿÄÏi1B'7'7+&5&5473!367654'&#""5476767'#";27254'&'Å777f877ßG_¤Ñ3   `8K_(4!p!) &27777777þNŒ/8-v `zaFt&I 3 %1;53+l,  yǺý/+%"'&547;!654/&'&546?´Çmk"*ýµN2Ob }= "4[~£¾W3 t*)$2=,'$eW@C@-(MD y¥A4 $ê‹?0~ (A@ 2[-yÿŸ¡ú"'72>5&'7#"'"&547¹;::C[N&(:*HP8 ˆiÃ777ýò'M;œ `G¬NF^/jg\aJ:“ÊŠ4#"&'&5467'32654&ûHG 6@:<$EA*4#?4P‚'2 & (s &P. dIÿƒÆ"46;+5>7654'#&57.#"3232½@5 Dj;l5w=-"c*˜- %/AV ¡Up‡K F5J7)F42fÿÿƒÿðöÑ‚ƒÿDöÑ3'7'72&#"32632#".547$7&+"546ÍACCßACC !!"]P ?„YuRv<S 4h^..c_†zBBC"BBCç V%vO5#;>"ksb‚S]8A6.ù 7>77>7¾1:—;1:—îJ wJ ,ÿïÿÝ7>7'7>7´.9—;.9—™J >J 6ˆù 7>7¾1:—îJ 3kÿn'#67.546324&#"6Û 2"]G5  3"  'ò @$'I   "2)   ,ÿïÿƒ7>7´.9—™J X™ú4#"'#"&5473326732654'7ú !  $ó #-   2rK'7Kojj”|}z ›N #".'ÒO- >.þûÙx¢ÉAd¬¿42>7#"'#".'7,! ",K3    92<00Á & &aE~þÈu ÈB^D$e·8.326763232=>32&'#"'#"'65&6.'/,  1 M< '  , 8>&2; 11x-&_rça;2DIj?I²±S-2632+#"'.'732>32#&#"a%' 5H0 !A.0 7)D #'£ >kþüÕ£„_C,4,"  .½°&7"&54767'7#"'32>7632>54&‘;(*'h4WP;:<3Ea7  6 $%D½IGcb9€«g Ia<5Ðb¹0Q 6 + 2¶O‹Ñú'2>7#"5467.546732#"&#"÷ L9TáC[?VCu4$+ /.C'/ $-ù“ .ÚL :2~" B!/Ë„4'77#&546Ôs2q>aH" A0.[”þç‘Z-ém-/ $ 8dz)  '67:6C$š—&ClPÎWd¹þGaV  M¥¥4$%&547#"&54>32327.#"Ž…3%7.21=/0þé'*!¥yß" 4" '5-‚oLx>’"'lœ37"&5463267O'#%·. 8'90+N-ì"&#"32>767.54673Ë   !1e%,$Ê$- " !L$"#:Jrÿv¸ #%'7%4.'7!"&547'?'7ü455Ñ Bý,79G 4*Ÿ455‘555774Ç3C' @(U°+7O}e*&þ˜7749774{ÿ-ëú 6%'7'7'7237#"327#&'&5&546767.#">¡>??Š>??©>??¸ ÄrZ±òM6'O7rÇ%¢£†0-A?‘a6o63""5p??==??=º==>É!?fkMO#A@&-/2 @=CyIv "ÿÿÿgkó '7''7'77>7654'k455466455¡ €16h ./C&!K221G220¨221½EOH ñH +7a@65-Wy˺[/3+%"'&547;!654/&'&546?'6´Çmk"*ýµN2Ob }= "4[~£TþÐÂW3 t*)$2=,'$eW?C@-'MD y¥A4 "ksb‚S]8AZ¾º767&Z && &&î% %& ÿãqé%#"&54>732>?32q¬#   #'+)'" ÒdS   ÿžÿϦî)%2632##"&54?32>?&54632G % *#51&m"% #  #m"& ¾0 !  J :% $ ÿ”ÿÒúè?"54?326765.54?6732>?63226732#"'"&#">. +       3 1  R)8K.)R     !1 "  B ,ÿÙÿÐÓ,%"543>?&54?632>3"'â2- C.; #M>O1 l’ &&  *  ÿÿ˜ã&2%2#"&54676?64+"6?>#67&H,$(o:?DL9$ ( P:  Å"% &ã,'%+*6&H $EH   8ÿóÿ»lç672"32>?"54632?>?6&&/4?>Û+       ::\G&)  f)* ç      $& 6" # 3 I’ë 726?632#"&54654'4>™' VA, .Ã"- Þ# (:! (y / ÿÞ€Ú+72>;2#"/4>?>54#"#"=4?6*!VEH,   O@I#%9C9 ED  & @2*  ÿýÿ¨‚Ù%%2#"543632?67&546"3"?654*@K[Š&/) I3S55 (Ù"%(1=T&!  1$)N4(ÿÓ†ç%%"+&54>?2#"&'4>;26765&&)" <"!*   +Á «  "oQ e ÿÔÿ}p27&67'&46763#"#"&54>?'&Ó,(K ):  KcK"k0x      7 >   D" ÿºÿŠºû@%2674&/&'4?2?6?2#"'".4>32;2?67&'6325*   ! / 5Wš  7J '!O        9 SJ  /# &ÿýÿ¡˜Ù4D7#"&/463232>?4/&546?632#"/.'"72>54/#"ÞŠ( !  R#5970! ]   *<    IL   S ÿÎÿž¹î$%#"54?2>7>7#&576?>32¬ +mK»"+#/¢© 6#¬@0`) _  ÿÿŽí274672327474/47>72"+"&  ="&.K7  7u'2    +   ÿÿÿ¨ÚáM'"/.=7>75.5>?2376323>32"#"/&'#"76?6;2n%! ± , $   h  G K&"F  # *&      ?4  ýã(7'&546?#".'74?2722!36?>32#¡A<  % ª A n%j+   " ?CgÿÖhæ(7>3#/&'4>7/"hX  +&)6i  ]O0E Wš:    $, ÿ}¶íC72>722#"&'";?632'.54>7&54?26â d +   ? H  t/"h..CP #)   Æ4     )  2#;,  ,ÿuÒø:DP%2#';2?672#"&54>?&/&54676?674#"7>32674#" 6 h!(2L-"vQR@86  " -*$*ç"õ (+  "2/+ "8  S!  ÿ¿ÿȦÝ3747326?6;2#"&54?67"#".'>?2?6765&”/&'1 00 !' '!,v   >[©.& ˆ  1 $@ )5 ÿÔÿ}r =+"546?'&67'&46763#"#"&54>?'&r!  Ÿ,(K ):  KcK"k0"#o      7 >   D" #ÿgŠæH74632#"'32?2672#"/&546?>?3232654/".òc   50&6\ :rG :   ! ².  4- 6'  %5"  ÿšN€8C2#"&/"/&54?254&54>7>7"36?45 Zk 9)%!. ,#  +3U‘BUÞ** € /Q 6  $ %;H)4 Õ  ÿýÿ˜_ Qa%4632"&'"&546322"&46#"&/463232>?4/&546?632#"/.'"72>54/#"F !   S ! Š( !  R#5970! ]   ë !@ !!þÚ*<    IL   S ÿçué %%"&546327#"&54>732>?32P  ¬#   #'+)'"   ¸dS   ÿÎÿþ\V %4632"&#"&54?6;2>?32 ! L‘«"!  #&**'" 5  ^dR  ÿºÿŠºm L2#"&5462674&/&'4?2?6?2#"'".4>32;2?67&'6326*   ! / 5Wš  7J '!mþâ        9 SJ  /# &ÿÙÿÐÓT 6"&54632"543>?&54?632>3"'" )â2- C.; #M>O1  !¬’ &&  *   ýb F%"&54632'"&546324632"&'&546?#".'74?2722!36?>32#©   O   t  ! ‡A<  % ª A n%Î !K  9 ! w+   " ?C ÿòýã1%2"&46''&546?#".'74?2722!36?>32#€! ÒA<  % ª A n%3!7+   " ?Cƒ Y+2"&46&'&'46;!>?>?2!.'>£ ! þ¶%Ð$ M+ýü ; /Y!‡ "'  5 *  (ÿýÿ¡˜Ù >N4632"&'#"&/463232>?4/&546?632#"/.'"72>54/#" ! 0Š( !  R#5970! ]   "  :*<    IL   S ÿýÿ¡˜F >N"&54632#"&/463232>?4/&546?632#"/.'"72>54/#"/  rŠ( !  R#5970! ]     þý*<    IL   S ÿ»€Ú 54632#"'2>;2#"/4>?>54#"#"=4?6Á  !—!VEH,   O@I#$ !j9C9 ED  & @2*  ÿÞ€M 5"&546322>;2#"/4>?>54#"#"=4?6>   þÌ!VEH,   O@I#  !ì9C9 ED  & @2*  ÿÿŽv F4632"&'4632"&4672327474/47>72"+"&> !d !  ="&.K7  7u'U ! !þí    +   ÿ¨ŠV "/".46322#"543632?67&546"3"?654&   @K[Š&/) I3S55 ( A"%(1=T&!  1$)N4(ÕrÝ*#&=467>7632ÝÖ – \žjÝ„ #&5&>7632463>7632#&5ÝÖ"yA þÁ †# Öþ>07P$”þ|ÅÿF2"54>7>£  |('V$5º    N #% …þBËÿY2#"5467>"&547672}+Ä+>p“ cq JHC §' r"Fþé/J -('¾rºR 46;2#"&'4>7&#"+"#'&'ÞM&6\2I 1=; ! $2a) ,pO>>32"&54>?4#""74632/"'4'4>7674/#".O0&0U#HC% -_&$"&ôG0k6 G% 4 #" 0# ( \ !  ñiÓW272#"/&54?2]'  72 %®# U2¥  'EP '#On=0#"546?632;263226;2#"57>72%1r:9 s  —' lb w- |–C9$ V  ,9` G UlX9"54?3272?63"32#"&#'.5#"?>?"Å;,+ 0"63 "“#`"%ò"$    *V!§q»"4632"&5654&#"32?632#"&§½I.=j Q=ƒ 5 E%6ÐE¦/(=M =*z+% $9ÚqÌI 4632#"7";2654Úg8&-l.X#0 >½;Q+$9P 81ÿã«:ƒ!#'5".5437>54.732™877k0[;$]3 /5ƒ777¡1C>K:$3$/0µÿ$#'5Ç877$777t #'5#'5ÇTSSSTSSSSSþýSSSÿÚ…bZ367>=#"#"&'!2+"&=##".'432>74&##"&'&'&632656&#".7>32W XB C >Ÿ> ñ@S;K>2mM4  .4) 2$$!Qp%QV.Ž&Uz U % ¤?? ýÇ:&±;PJaUJ5'( $  d"!"( o23ÿÚ8cc367>=#"#"&'!;+.5#"&=##".'432>74&##"&'&'&632656&#".7>32W XB C >9 >žR>d@S;K>2mM4  .4) 2$$!Qp%QV.Ž&Uz U % ¤?? ýÇ: ÞýÇ:&±;PJaUJ5'( $  d"!"( o23ÿÙÿ‰PbC463235#"&'!2#"&+"&#"2632#"'./#"'&6323267"#"&KIQÐ&9@  à [E>g Be+,4   -8b6 -.0/ hBa|0%E=<”*b1"; -^2 %(W(./fÿÙÿ‰PWV463235#"&'!5.54632.#"32+"&#"2632#"'./#"'&6323267"#"&KIQÐ&9O X3)#W5/&3/Ã?è [E>g Be+,4   -8b6 -.0/ hBa|0%E= _+(56; 4",<”*b1"; -^2 %(W(./fÿÙ|bD4.#"#!"&'!2+#"&'.'476326=4.+"#"&54;26pþä&9C#=Ë%)#4BL]¸:  ;*32&5&?654&#"#".'.'43232654'&+"&'&'3ÞCOþæ F ?þ)%,  $HŠ1I)%,  E91^D83EC$Y : ;)$ +;.ERD 6SIM9#  ÿÙÿÅîb_25!"#"&'!32#!7&5>32"&#"32632#"&54632'"&=#&7>7.#"'.7>Ž=c9þß =» ?ýϵ U(T $8 9.+V{W.4Y*"A,‡ Aï#X"%5=^Ä13³?? ¾% Ms"857q+.HP  þù; ™G @ {  @ ÿÙÿ‚cbe>35!"#"&'!2#!;2>".54>54&#"#"&54654&#"'"'&546323 dIþW <3=þé'0'&7:/ ' 2A'(G,*<=*5Q( AT#*5$'A LŠ7),O!J 7.)R2FY™o.:ÿÿÿÙþçµs#òŸÁÿÙþçµc62654'%.=.'!2632+#"&5436=##"&'4&£# þÔO47x > ñ9#>Wò14/!#:Ê)Î635;B þë=5@  cËþžÒ#E/7ÿÿÿÚ8p"¹òAÿýÿÚ8~y2+.5#"&=##".'432>74&##"&'&'&632656&#".7>32367>=#"#"&'!.'+"&56;23Ý@˜N>d@S;K>2mM4  .4) 2$$!Qp%QV.Ž&Uz  XB C >\!9S;>U[6m" b<ýÇ: ÞýÇ:&±;PJaUJ5'( $  d"!"( o23  % ¤?-9;#?7"m9 ÿÚ8š+.5#"&=##".'432>74&##"&'&'&632656&#".7>32367>=#"#"&'!.'"&#"&'&324&'./.7632328Q>d@S;K>2mM4  .4) 2$$!Qp%QV.Ž&Uz  XB C >Y&ŠH 8 \ÃA:18…vY¥=ýÇ: ÞýÇ:&±;PJaUJ5'( $  d"!"( o23  % ¤?2A5`L([ =^Y<ÿÙÿÚb7K25#"&'!2#!632'.7654&#".546=#"&54>2654&=4&#&ª:/Ú&9ß=þZ&C‡ 9,W?,P)<3325!&/&2654&=4#"33 =E <= ñ@YŠ%6,F8þÚ9<XVF Nòz6I7?>Ë#6+6(ÿÙÿÚÝc-43246=4&=.'&+.'!2632+.5##"&7  7 ; ñ>ù+2,d47 )u ;C ýÇ: ÞjÇNYÿÙÿÚÝc?.56&'&'!2632+.=#"&54327>=+"32632#"Y/+  ; ñ>BXQ}O(if å #5 (  )3D#ˆ)=) C ýÇ=….}96€ \ »  %ÿÙ+c<C463235!"#"&'!2632#!"&#"2632#".'4763267"#"&%#'5cJGSþÛ<¾>þÍ XG> [FaoR;nG-A sEhiD`Ì877{1&E?@ ”+b/;I:TM5+R8?e)777ÿÙÿÚc+8.=#"&547#".63!635!+.'!2632+"326=#?H9 ñþÿ!2«&<iw<&% Á>@ È>',ÿÙÿiŸbs‡%.54635!"#"&'!32#!#"&76?>74.'#"&54>&/&5463:'"#&#"32>76"32>72654&5"&#"3 &n9-þU=n >þ§ W +\# A     ®It dc:!  #1EP?6&# Vi U‰96#*8 ' v9+-*AX$ $;&ÿÙÿÚUb572654&'.'!5!"&'!2+.=##".'432ü"+"$3þ,<%= ñ>Ì](/UbZ `‰3(A)s>? ýÇ< dT&9*OŒU  Z_ÿÙÿ‰ib>S463235#"&'!2+"&="##"'./#"'&6323267"#"&26=#"&#"263232KIQÐ&99= ñA>C# *,4   -8b6 -.0/ hBaà [E>)I$3Z|0%E=? ýÇ:$¹ != -^2 %(W(./f ª”*ÿÙÿÚcD2>75!+.'!2632+"&=#"'#"&542654&#"#"&'&76323G,(þœ9Â> ñAD0) *{?2A & $a*0 Ï>@ ýÇ;"­2K!rL + #aI!6A ÿÙœc6'4>35#.'&'!2632#!#"32>7>#".7Z[/Þ a ?þÝ -YU58J!,-  l`=oH*ù0E#s A ³#D,"    " 60HOÿÙœc&9'4>325#".'&'!2632#!#".%4&'"&#32>:tO ñ 1a ?þó[zZ:nJ-¤$" r‹"::W(û63s(A Áp2BY/FQ 6WH$ %6,ÿÙ+´c<463235!"#"&'!2632+"&#"2632#".'4763267"#"&cJGSþÛ<w > ê XG> [FaoR;nG-A sEhiD`{1&E?B ”+b/;I:TM5+R8?eÿÙˆb.94>;5!"#"&'!2+#"&54632#".2>54'#JWBHþö =N&;ÕECYJ#8^(X./mQe! ?;'p.> $(C ýÇ: Þâ#7":]3fþâU>!Œè*&ÿÙÿÚµc546;5!"#"&'!2632+.=+"#"&'&4CØþß =x > ñ>… $2 3 8   …I#2Oo?B ýÇ<'&S7  r%[ÿÚÝc4B4327.54632#326=#"&'!32+.=#".74&#"2326 '943( +€]H,Qt;M # ñ?-O9mD)¦ #%\*C($-rKAR o=™@ ýÇ<u';NE¢ )ÿÙsbJ463235#"&'!32+#"#"&#"&+"32634632#"#"&/4&"#".XZNé':; ? ñ " XW  51&%4 4 9   :iD(V?/Q:@ ” .>. ,62'#I+3MXÿÿÿÚÝc@7"&547&54632"32632#"327>=#"&'!32+.=õQ}2Z3=-. '  )3D#(if ;M # ñ>B‹}96L<*(@+! % \ »@ ýÇ=….ÿÙÿÚµc$46;!5!"#"&'!2632+.=##"& % þß =x > ñ>»%$b6&Ÿ?B ýÇ:(è"_ÿÿÿÙÿÚµc#éÿZÿüØÿÙÿÚŽb(%"&547.'!32+.='26=+"ÿT•'T = ñ?!k8T» »¼ˆ / @ ýÇ;‘ O9¥YLNÿÙÿÚ;b2@.=#"'.547.'!2#!632'.54>54'4&#"'26=+"Ž?$C82>' ?þY$B†" 0 (/!Û7Uº&;‘ 5*W / @ l {K[w  4 Gh-  3!8§Y#{ ÿÙÿÚ”b"0925!"".'&'!32+.=#"&5463654'&#"327ªTHþû   1Z = ñ>4]˜cMY +%#G &''Å@Ž(? ýÇ=D‰C8JZ=)   %B" ÿÙÿÚÝc/4&'"&'235#"&'!32+"&=##"&546;u(#<aP Ë;M # ñAË#_4È-?Y$81DÛ@ ýÇ:&¯8  ]%ÿÙÿÚÝc#46;5#"&'!2632+"&=##"&735#4< ; ñAó$_­óóÕ?C ýÇ:%¶8]PÕÿÙÿÚÝc%54&+"&'!2632+.=#"&'&56263>26=##• G; ; ñ?2GU˜&'8 5QtØ-V>,ì?C ýÇ<u({Z #0%þðo=™5:>T ÿÙÿÚfb,3267#"&5!32#!.'.U0ª%8/ >þØ 1"@DA- "R,D$š jN>> 'JH-(L81,F.NAQÿÿÿÙÿÚfb"éàÿÙÿÚ:b@4632327>35!"#"&'!2+.=&=4654#".?&XF#l:þW < = ñ35!#"&'!32#!#"&'##"&54632"32>?4&2>54&#"L R)þƒ%8F ?þ± !odI;s8T@M?&I4\7N!(K, Lä(>#&50#F+#A„=? †  \\E^Fd”YF\!,ZA2$>K ñ&/# (*24  !ÿÿÿÙÿ±wb#éÿLÿÁãÿÙÿÚ”b"625!"".'&'!32+.=#"&546"32654.'&ªTHþû   1Z = ñ>4]˜c/<(   C[$Å@Ž(? ýÇ=D‰C8JO 6% A@ÿÙÿÚŽb&%"&547.'!32+.=532>7ÿT•'T = ñ?!§ÈÚ"("»¼ˆ / @ ýÇ;‘ X¾¾<&j ÿÙÿÚc0>267>7#"#"&'!2632+.=#"'#".26=# - )C <Â> ñ?A#Gc -RT WbN3uæ/š%R;@@ ýÇ:%Ò-5za [‚¥&‡ ]0 ÿÙÿ/ˆbG46;5#".'&'!32+"+"32632&54>7&#"&'.547.m˜3÷ 1N =ó 3î '[€2 @"%:Tv7Qb-2_¤œU#0%@(@ …9q2"F? 1'E7">,- 7-R«54./.54>7;2;2#"&+"#"&'4'432¤%9 " ~`5BV#4)Eš  > ("1*"&.o7! =57" -j5*>  t@KÿÙÿÚ|c.5"&'!;+}>;0 >ð&: Þ?? ÿÙÿÚ~(.5"&'3=4632.#"36+}>;U8H3°F* X€>/K£ 3î&: Þ?¡ 7:2) 0 +),3V , þŒÿÚ|~%.5"&'3.'&#"&54632;2+}>;S 6<2R DaJT¤/®@æ&: Þ?({9*'>-b¢n = þ¹ÿMC%'4632#".'&54332654&#"+"&€D4jG-HZa& !)7X5:22' ( 'b82*+Y=(55%5 ' +ÿ:ÿBäX#'4632#".#"32632#"&Æ4).t^D (19M(&21  .&=y #)G`T-@@-&  , qÿbÿNœC4732#32>#"&ž¨ )¨06.C]ƒK0 I   jÿbþÇÇD6467&54>32632#"#"32636#"&#"32>72#"&Ž 47@ 'BgY/= *O$((X&=& +Y4Rv¥ 4*% ! &#- #()+cÿã«:s".5437>54.732Í0[;$]3 /5«1C>K:$3$/0ÿÙaŽ~#".'"&#"&'2Ž %0@i> <xÖVi(:;->qÿÙaš #"'&'"&#"&'2.'#"&'&56323 ¡Ž =ašgUB1c¸/e d:8:N< #" ®xÿÿÿÙÿÚ|s"òëþÈÿÚ|~%.5"&'3.'+"&56;2;2+}>;S!9S;>U[6m" ´@æ&: Þ?-9;#?7"m9<þÈÿÚ|š.24&'./.763232+.5"&'3.'"&#"&54þÐ\ÃA:18…vY¥=î>;P&ŠH ?)`L([ =^Y<ýÇ: Þ?2A= ÿÙÿ/ÿð .'"&52 %B*'<Ÿ†Ñ>¤ÿÙkª#†#'5#"&'&'32>=4&5432>32'&'&54>7654#"#".'&632654.'&#"#"&'&>7654&#"#"&54632{877'N>^¨;3c#&;@ýó0 IV28c<"#$    49_6+6  $)8P#ª777^2_sb 9"1*?þÇ)6$0C@ # -*(  ,67 /5.?< #!?+  9(* > 3C<4ÿÙÿÚb7KR25#"&'!2#!632'.7654&#".546=#"&54>2654&=4&#&#'5ª:/Ú&9ß=þZ&C‡ 9,W?,P)<35#"#"&'!2+.546=#"&54>325!#".2654&=4#"3#'5 . C => ñ@YŠ%6,F8þÚ>: FS QZGz6I7ýÇ< J„9!0 1g}/xq [‚¥†6+6(777ÿÙÿÚÝc-443246=4&=.'&+.'!2632+.5##"&#'57  7 ; ñ>ù+2,d87747 )u ;C ýÇ: ÞjÇNY~777ÿÙÿÚUb5<72654&'.'!5!"&'!2+.=##".'432#'5ü"+"$3þ,<%= ñ>Ì](/UbZ `ú877‰3(A)s>? ýÇ< dT&9*OŒU  Z_*777ÿÙÿ|´c<C463235!"#"&'!2632+"&#"2632#".'4763267"#"&#'5cJGSþÛ<w > ê XG> [FaoR;nG-A sEhiD`Å877{1&E?B ”+b/;I:TM5+R8?eþ777ÿÙÿUˆb.:A4>;5!"#"&'!2+#"&54632#".2>54'#'5#JWBHþö =N&;ÕECYJ#8^(X./mQ54'4&#"'26=+"#'5Ž?$C82>' ?þY$B†" 0 (/!Û7Uº877&;‘ 5*W / @ l {K[w  4 Gh-  3!8§Y#{ «777ÿÙÿ,îbŠ25!"#"&'!32#!7&5>32.#"32632#".32>2#".5465.54632&'"&=#&54>?>7.#".'.676Ž>c8þß =» ?ýϵ U( 0%>9 0 , +'B+N0H, ¿ A @ Â/ _!:>  8Ä22³?? ¾% Ms" #:  ! * )95++)90'þù; ™I ? c ÿÙþÞcb>35!"#"&'!2#!;2>#"'";2676;2#"&5462'&54>54&#"#"&54654&#"'"'&546323 dIþW <3=þé'0'&7:/ ' 2H! !9=L$9…  %*==*5Q( AT#*5$'A LŠ7),O!J 7.)R2FY™o.:ÿ2ÿ J;26#"&54654&#"&74&#""&5463232>32Ì0*%/0C2< - #5 >.1(&3TT9( P= ! *7"T$Efÿ2þ¦.JR"32632#"&=465'&54654&#"&'4654#"#"&54>3232>322>& " *- 4L 2 )% *0+>/#''2T0"Ò  +\=   &>& U$'*e1:  gÿÚ¶a 2.=54l >=aB ýÒ< ýõÿÚa 2.=5432.=54ú >=Ç >=a?ýÒ< ýB ýÒ< ýÿÿgkÔ 4>32#"&2>54&#""3+G•#3+G”“&: ' 3A)>‘I)>@"1+$!( 'ÿÿÿ.!b/>"&54?6'4/.'&54?67.546;22654&+ã @  W> V$iM 9z?60 • 8e-"  ,Ò>   ^C N n5KF‹b)JK4) ¢ "8200;$1$ÿi¶96#"&'.'&"#"&54632;2>54&'&#"#.54632¶…F,— 6d $ O'>D2)'/1U=p›XgKj7è71¤N+J+ = e+ÿizE@%#".'&#"#"&546323654&+"&76;2>5&+"&54;2z '%?E GD "N<)pBs)4 ¡< m4!M¦(JeZfQ2S&B +'@ '>*7 MK:a!174>7.542?632#.>54.53†#"² cFâ  @Ö*R.63oe%S ÷5%° b: ¯ > ¦TP&9q%  GJ ÿúÿ¢ñ`9'467367#"&'&=4323267>7432+".'#"&F.#] > &P   > @..À*0b=V(C[-&E@=B}=c9"6AA> kãA©+8<7HÿÿÿiµiL%"&547.54>3:"&#"32632#"32676.543#"&'.'"H•%P%>9  , oU  !==49*:('G 1 2 '‘I3+ `,&5   G0  = S*% #B" Bj0 Wÿÿ;a&94323267"&54632#".'4&"32654&5.'& ; +"--)b$RŠJ-I|Z.@?B5(³?6 #R [; R`? $0?G@7¥wm %8_w­fD*,0 FÿÙÿÛÞð+4.5!2#!&32632#"&7>7"#"&5476!$$¯6 þÚ ? !r9G[( > :t'Oiž&5  uŒ(e <@ $)q%eOÿþÿfåb%7"'#"&'&632;>'&/547>322654'"&#"AB3!ºK5&4  $IþÛ J*DrÈ*N78±6e/ÊK54$L6k$'u[@6' .ªÈ2 4>32#"&2>54&#"ª21=l21=lt.1 . »+:s7+:s76(& þÌ~ÿ» ##"&'72>72'#"&54632E# +T B î!0 ]8"  #%   /ÿÆV #2654&#"'&/5'&4>32#"&sG*$•9!6jfE;Ô))/=7(,C]7-%þÎ-$qT}U+:™#0L)'GTN# #/732?674&#"72654&#""&54>32#"&54632z$ !"%6D+#§31-?3&53;*'IK'Eo7!¨5-#Ý*FU,+.Pÿ)KK531?ÿìÿüf.*2!5!#./.'#"&'32654&##"&54>âQl:þz[)YQ(…M.&!!-1áqXeI22þ<. M¶§ y0"'92! ÿìÿïˆ;4'#&/.##"&'32654&##"&54>32!5!632'4&53#'‰J2 F$]S‹)…M.&&(1Ti:þ <:b`2šHþ$ZK´§ y0"!?2! sVeI28KrZ32ýó4ÿçÿ·J23!./3267.#"#"'67./#5!7654&#"'#".54;2327ð?QƒþÖ%/8 Œ?CQ@Ês<>N5^) ?"/k©&!!8s-7%)WºL3 2 0+j+,.QDD†}'110'4(S" 2  /!4(ÿðÿøZ67'&547"&'4>732654&#"#"&=467'#5!654&##"&'4?32?6323¦%+%3VR8>*() B=:(3 !P %+"u} ~!,R  O* XLfü 0" H(6-ˆK->-gSVJ UL>) 7S#' )%/'2 <2)I12ÿñ>0O23!32?632#".'32>54'#"&=#5!?4&#"#".54633()4#zþÐ "(6dS*F0'#/O0&;  V*&Ýf' 7-A+? ,7¹ 5$2”(.m6Tg -O>c5.B^K5,& #H.#½2 (  !ÿã7L O23!36?67#./&'2654'#"&=!5!2?4&+"+"&54732>7Ra€þé $  YqX9SA5W/[ .L0µ2 ;9#  '%q“426753#/&''./>7'&##"&546J1:)^6þûB&)4262tt!A7]841’ V1š+1R„?2'¬2þô0‰%<2þl/Wñ;F5K+O $!&"6ÒL32654&/.'47#654.'"2#"&546È4HV>2?ZQL,KjkKK% #$2=.N>>D',=12$ !) +Y@C2@.  ?#-<*ÿýï3;'.'&#"#"&547326324'632#"&546›5 5* HW* 9( >&&1&  $%.‡39þ/.ePJ:+7%' l  5  (/"K‘,ÿü?QP'.#.547326324'632#"&5>732654.5>7?4 '(–*4!)CO(:#10N %!1(0;*CHffH!axr ù&1+ þ‘6- $@+P52/-E'h  M5 +8,G+ W$2!=,3 *!>&9ð84632#"&/32654'#"'4632654&#"#"&ŸŠF7E',RA]‘;"!&9 #.-?8. $,#M3'€CUG5@-)?54.5467 +-c/9<+8"W@4]A;%k¤.9%"%%;2R({^85&&IhiI"! # ,D0 -491=8G6RykBEþú.&!$ .6&$$+=YN *F(0B54ÿðF.+%675!5!#2#"&54>32654&+'.'*Ij+A!þèœ|þÆVêBy1#)X0 *vR‘L.(*´s#'22&vU(4'3Jþpkbô‰03#&/./32654'"&54632>7ŒST  7S>S=v9f*%0)&"?H'Z=S2þ *04! g9)E '-*4C#L *_õ ÿîù83#'.'632'>54&#"#.5>32&/&=‡[[2$B*--((6>:I  "Q>[e^# 2ýò-),7*+,!3N&AL )3RgV*1‹ÿóÿþé.*27#"'47#5!#/.+"'767#"&¬26RfA± =ö]q<B+#*:‹'5 Nlx/:22þ45KD0 =¸>2654##".'32654'"&'5&'7632#"'6ë*<Qw -XB?e:( '4F4 \-J  &W*3I86‘'A> 29*CQEb|[&5/#"&5#5!ÐA-1!"„7EE.‘<>QµP'3þå-E' Ã)3)"G±Bp22ÿóÿ´ç. 826=/&'%&/&/32654&#"&=#5!!7|G)*FQJV;bt'@710,?•(,?F3Háþ™p2$5 ? ! 1I#T:'h& \P5/ ">'Ó22A %5-ÿñd.S47#5!!327#"/&47##"&'"3>36323#.5472654&'#"&~HÕsþçN82KT'   ;s 5 %K 'K<8V. eS#H *3F{7J229McrMN z@7.H! #(J&;N³)ÿýð,[%2674'#"&4633254&#7#.''.#"#"&47.#632#"54>72>7!*"!% 2a ]Ÿ*":9$-fM\*•.>N .K `U]#1S/*B'&.!*X78I'20Ò:)iœ1(2oHI.( \8d03p8OG65!?ÿÏJ´:23!3267#"&54632.5#5!754#"""&'>73Ø?QLþµ+m /1>vO!5JJD  F2[ /»G52þ¯$k-#!69B‹M$;20;3   ÿñ*¦_?72>54'#".547>54'#535&/&5473!7>#5.!60 J6*>16$ Ä¥34;%FÐV-7+_J0,N3,¦3“93I6&80-E'(2  NHA"30)[$2ÿö=#.(#"&/5#5!!>7#".52654”R& Ð-þÖ$F[ !N8;_5$ 3R4@RRFÍ22ÂD"3r5H0Dby^$8ea;N+"ÿñI­.!7"'#5!!>7#"&54632¢)/Y¼þÐ1P!%) /9.IOd22þ° W2'$//+K2&Ð2.=&53#'4&#"3'4632#".'&54632R G^6O:> %-3+ WA;)† d} >2þ85c.3)&'1" #CW<$ -ÿóD=.+/2#./264&#"#"&546%!!B/I(F'!&4W95!00H)1_A 1$0HþÙJý¶Ð$2>-DV/?hU>/ O6M2(Wn3$("6-+<^2 ÿûê‹13#&#'232654&##"&54>;25+"`# WTz«O@, %#*=2+O¨'<' N2 :2ýÿÒhV4  %(%8 Nÿñÿüô.'#5!!767'&54?CnCBþq5cLWA#+[m>E22Ó,RApvNNqf@'ÿîÌ4$32?53#'./7"&'4632#"'FeN}6Î! }†T ™T;~.8*10 ‘+H@]T&IB2ýòUO^1( 0 ÿôÿòÒ.2!5!#'.'#"&546¡/]þ«ÞW#*7&#*"4L”bA 22ýöLwB- #(+35?ÿú#p .&#"23#'&''764&#""&5632'5;4 "%!ôDM2#«G+ " 1”?t Ì$ 9 2ýþ-ÿe ª.* i^~“ ÿñr.94&#"'./7.'&/&'#5!!632#"&546323279, -4N+: )#,þ5J{,b Od/% C!)þx(7*S~    22I+gH7X_H(0! "ÿîÿ÷Î.%675!5!#'.'@]dwJþÖ—“þ®à\ #<`9ŠH2q¾k."22ýû&9C/ÿñL'.$(2767#./32654'#"&546'!!ø$BnnV[…- @8C*8NP>,?&Ö6ýÊÌ$8#>:./b2ÿñÿýù. '24.'&/#5!#'.'#"&54>„?U9°-6A  #]U,'0-%$ü+wA9+\» ,:22þ6p,4#$ÿñÿûè. .'#5!#'.+"'>ŸN3 ;[\‹‡*÷W€FD1Gü/D 9"z~W%22ýÿNqT+6ÿñÊ.""&546;2675!5!#'.'@]eCbŒ%%¶tµþ±ÙX (A`4‘Jd1R#$UB!22þ?K3ÿñÿû0.725!5!#'.#.'"&54632+"&54>3246H%þU?b2-".0#7 %(, ;P(" D&+É!%‡22ýÿ1%.++*1 !(,!O@&9 >*ÿÎÿü‡93#'4&#"#"&'#"&'67'&+'32>7'5¸ CZ2C4&, #   L A2m208!'  K 2þ.?` 5'/@#&3($''=$‹u ÿñå.,&'5".'#5!#&/.#'>?67&#"Y&+%&hKÂ; õ"ôY †; D, %2 0-2_z*"ŸB(22þ'&bX(  ÿñÿû.025#6?6&#"/#5!#'5.'"#"/7270 Ø$K]<',e2  '-.)!  )¤<  ?o22ýÿ9Ø! "!!9K# @ ÿìÿ¬Þ.+&/3674&#""&567654'#5!#6~BLeqÇÅ7@k~ *- 7''n*¤Õê/1@0J 0€DÇ$‡.G3!; <%22  1þÄÿeÿ8ÿÜ #"&=4632È %] "* ÿñÿ¬Þ./2&/3674&#""&5467654'#5©21>0nm¬à7@k~ *- 7'!S*Ÿ.".9,+>{D¼/‡.G3!; &82ÿ¯ÿï׈>23222&'3#'4&+Q   .ZX2@D.93ev82ýó4{1-ÿìÿ÷>7'&#"3#'#53'& %?(Xš4 TVeDV „r2Z^,t  "L= A8[)+2ýû/Ö2/þ…ÿûá-'23#'#53.#"2#>754#"&54¼B€_ rr2UUša2fO+; F5 {ET-;xL2ýÿ2Ï2cj*/2 $1(dþØÿN#a6>54'5.#"765656=3.'#"&54>Ò +#8W$#5)'%8 " d  ':* N-% ÿ ÿRK!#"&54632'&#"367?,:!-E  )";‡r5)('0rþáÿÿÞQ./?8 Zc‘)n  \å@:j2QN <%%ýûþNÿ_H#.''&/&/?'?·tn *'  -2b‘ 6‘)n *&îO5N% ;j" j2QN%ÿô:. ;&'467#"&547#5!:*E1%' $ 5"L_eœFý.>oF*> #1”mry2ÿÈ C 923#"&54>32#.547#53654/.5473;|)MS<8\/,?1= +A$i‰¿N-@; A µD1 2]=LH#" /.>M6f‚2 &  ,+*ÿôÿï ˆ34&+5732&'3#'&'>7#"&547#5!›@D1 . UU0þŸLg)@3)5"N^fœFž1-293†U72ýó4ÚavDCX")1™td{2ÿÈÿïJ N4&+576;2&'3#'23&#&54632#".'67#53654./&547Å@D1!7UU0ýkiWS ,|& m ("7+1F!  _‰¿ #A/* ž1-295†U32ýó4•0G2<,Et 14>^C‰n2   *,ÿºÿ^£.3#3#66FN›3.2ýã …4 64&#"267>54/&/&'4632#"&'" 65 ###Qg%  } ZG': b/D " ))$,)Á )  þe 4+ ?…A^*" dO-.( $N4%þóÿñè.3#'#53654&+"&54732632‰ hh2RR -k^RcDŸH 2ýõ6Õ2E+!#;ÿñÿŽ". <4632#"&"'5#5!!>3#".'2>54'è%(#0<×1þØ 2(1fL1R8,%0L/.4$S5* "":W»22™  *#g9Yt(>VQX8/NZ>. 6$!DÿñÿŸ³. +4672#"&#"/#5!!3>7#"&54632{  1 îˆA."ZÂþÊ/N $*$2(0#?!kA–X>22þº V1 'H%ÿìÿøê. -4632#"&'.+#'67&/&/&'#5!# ,0<oFÌ#' þ!~FC:Z #:'þbü: 5&"qþV"$GQqU=C  #22ÿ¯o’I26753#'&/&//&''&/?./>7'&##".'4>J1:)^6þûB&F-272rr n *'2>w‘B41’  ^š+1R„?P¬1þô"-‰%<2þl :ñ2;N%+'HjK+O )!6þñLk%#654#"632#"&54>3265654.'5+654.'"2#"&54632654&/.'47+-@@-" 4    #'7(:;. % #$2=04HV>2?ZQL,KjkKeB!4&$ #@   & !$L)$2@.  ?#->D',=12$ !) +Y@4jþêþ·ÿõ#6'#654&#"632#"&54>3265654.'467Ì )+k!A     "'7=JD #N( #$  ! !$K)! (#* ý×þwÿõ#8o#64&#"632#"&546326754.'467%#654&#"632#"&54>3265654.'467þ! +!("!   "%&8(:;.1 )+k!A     "'7=JD-  / $ H  %9L*$+2 #N( #$  ! !$K)! (#* 07¼¸ 4&#"326%4632#".'&~-6Ij8-!$ /A.0G%.- >}"ÿ¯à1!&/265&/.54632†K?qC$ ÇÆ1_G"Ec5 "0?'3?EP5&@¾*ª/(I+ $!" 0Jÿü%Üÿ$%#".'32654&'#"&54632Ü )I.1H@>,“M2`*E4'$3J:9sû/?3$5Sšd{©U54.#"&'>7.54>2Ù)7[( A&)+N!5'-+<,>(Z>6f C*33#H^E4U. Q(+¾ %+9&!* Í K9+6%R:5= G)/7& /& !F æ#074>7.'3.327#"&5467Û-%'/F^-=;&e )(?G112)6už^R¯+G-;"!“K#@'FG 1M+'>j_¸ÿÿ Ï(4#.'32>54'"&/"&4632>p_$@(;e=, #0G*)<  @!$>! B¢Fv!$:*Lgy[ *I=@/ !1')!,1*†""+#žA\Ó!$"36=4/.#&=#"&/46322!N› ±!0”Pk28q1íT-!!(þA  D±G"=gt7þêä' 64&#"2657""&'"54632>72>7!#,) kË  5)e[: 9& 9 & 9C  #ªdB¦   73F€Z8.Kj73'654&#"#"&54>32Jj  <~NVs/" 1(! 3FÁUßGD²ÚBFC"?&3*-!1 c) <>732>73#"&54322332654&"#"&54632#'#"@-"8bC8! !2T‡Q3L>  8/%0'0?!1'F“-DbVe7Z·¦h6FI2!    ')4J5'9 /„'7;#"54#632h &(&%‰9TG&7N-S()"+"=4#6232?>32;#"=4ÿ">#%F   % $&ŒO_OOî&6HüF&2! Ký8Sõ©#· 72>74#"'4>32#"&5|+:?!2 0 /(+< Z34SÚ**H(! =V&9 )(=R733&+"467#"54632- '0!%9 Eb  %-6  / þÒ/1 "*4e '-'J'4$ %0! u2Ø0%#"54674&'#"5474&'#53>733##5Î(19"< MV(262U8 e##8˜r2@ÓAJ490g nR#+%:AS,š9€+ U D?3 9þ#Óÿÿt#™Ømÿÿÿõ’»#³®šÿÿÿõ»#›â³ÿÿÿaDÚ#œ0´ÿÿÿ DÚ#0´ÿÿÿõäÑ#žô³ÿÿØ #ŸÆmÿðDÚ#-3#"!##"&'.'#5362654'!!!> ¨¨Ff Ú9'$_MQƒ# +û+Aþè>þ†$#'ÚCG:9?€ .BJTrL-Æ<9ÄýY8+*!® 3H0tÿÿæþ#¡*m&74632>5!5!##&'#"&7267.#"#_L1~þ@&@B&ˆ3L]E7Zs m#-7È*>gA(q.2D.G9rÝþ#D*J0;`O-9Cu[=+.p‰frK-1wÿó#,!!2#&'#"&54632654&#!5#5!.#"32þN,15L FIW>_YAs9@+#þ° ÀN)PSVÝt@3b7!=D548F.3­9þL!85ÿóö##"&5#463!5!5!3254'!öe_Vl83Eþböþ¡K8…þúÝþõhweD-8¯9þÌ@v¨ ÿô@"*3#!"3!2#"'.547&5463!5!5!4+326%;5#"@2þ--2&,nh<$- :0*þ2@h^-1&4þª3)/-%9Ý•+B2+D F./#0/;\9þ]@€!%€#Ü##5##67#&543235!5!Ü2@Ò@8` Òþ–ÜÝþ#×!“#:\8Í9.0!3267#'#"&5463232654&#"#"/7&'#5!Øþ¦%‰RJP 1C<;8‚ KY.W;70>A%z :z'3>.Ý‹?LEK "J*G <&&0/A%@99õ$#!"3!#3263#"5"&547.5#5!5!õ þ¹)=è¨9Gã7J? >ò`þì&Ýš0 9k9¢>2DM9ša,5ÿôþ'7>32;5!5!#&# 32>;#". )&;*G'' þXþ-+þðg;43# q9'[O4¶* –99ÏU^/#?[,F6ÿô74635#5!#2#"&2654&""BôèB†li‰ò9sk‚kt¢Hx{99{xHLba%G)9KL8*Fÿòü3%.#"3223265#"'5!##"54632654&#"#"54Sj)@qFŒl09b£ƒü22D5hH¸S;=u327&'!5!#.'&#"327#". l>0)6&"þà.Ö 5$+-S;,?€EzTuX?TV²GO3Z99(aG$f$+#5O|Sd #MÿúÔ)23265!5!##"&'632654&#"#"54…l09þ‚Ô'O>-!4Qz Su?N<)uLFe>;;;h7K2ML> N3)(8-. %5!32'!5!'#5!##5#"&'654”þìTbPêþÑ_ 2@-CIž'¯i(,TáŒ2299þ#\*Z4:][ÿôè%#"&'#546;35!5!#!32>3äj?gk 8(4ôþnèþÌ„B4 ŽAYŠu7,G±99êÆ10 7327!'#5!##5#"&'64jTbP$þÑ$i 2@-CIž'âT?IFAÐ99þ#z*Z4:šÿþ $74675#5!##532654&'3?"&]oê àl^mM#Ir89sJ"Mo„DiEg99gChG@F;57o o65;H73273##5#"&'64'#53jTbP$r2@-CIž'' V.âT?I9þ#z*Z4:š+9ReDÿõê$"&54;5!5!#!">274#"326@u£–ÖþlêþêT=\vR\&V'E<%&; ›Y~v99¯F:>*4715êµÿõ "&546;5!5!#326=#BR§;0äþh 2VûuA*1Î ‹Y2?“99þ©?Rpo5,~ÿþÆ297467&'#5!##"32654&'.'327#"&!>2AS#Ɔ#RBkO20^K'M""N'K^.NnÎþÐ ]00`¤3K8j99j6K5F`9F)&M89N%*E9`<ƒ…ÿþÿúÆ <C72"&467467&'#5!##"32654&'.'327#"&!> AS#Ɔ#RBkO20^K'M""N'K^.NnÎþÐ ]00`< h3K8j99j6K5F`9F)&M89N%*E9`<ƒ…ò##!"3!#3263#".'.546;5!5!ò þ°Fè^J92BmH9QD2þþnòÝš9;79"N791.;a9ÿú%!32#"&4"546?&'#5!##5# þðàŒ 9% H2@à ÝRÐ ,@'T(ŸB99þ#Ó;8-ÿü!3"546?&'#5!##5# þðàþÒ9% H2@à ÝRþð@'T(ŸB99þ#Ó;8-ÿôõ7325!5!##"&'&546;#"a\H~þ}õ2¬FV/,D5484Ò9l199þ½¦%=:<6D9TÂr7#5Ânrrrœ##53|@<œÝþå99*»#54&"3###5354632*@!6!<<@22K12J($%,9þ#Ý9.1FH1ÿ„®»###5354&"#546323®2@<žs1² SZkþx ÿÐ #"54632&#"+"5432.þ´- XÁ gmD$F>‚&‡Ì”V@%4".Zþd<ÿ¼ #&+"'3;2D4š_0–8,<@†F=þ7 ÿ¼þ"&5465337632#524&"3#ö]v Ž==\@  @rF9 I)o$"#ÿ4ÿH2ÿè &##"543532SW"H@W¸M -$ÿú'##5#"&'654'#53!535!322"&462@-CIž'' V*rrþòTbPþïÝþ#\*Z4:][+9T]±þ™}53T4 ÿþÿôZ )%5#"32!5!####"'&546;2"&46(†%/+$LþØZ2@€zZ=9B8þ÷a( //+°99þ#Ýþ}f=9L;Fû ÿúÜ"##5##67#&543235!5!2"&46Ü2@Ò@8` Òþ–ÜçÝþ#×!“#:\8Í9þ& Ô/23265!5!##'#"'#'&543232654&#"#"54™$K.@þ„Ô )OIHH2!LD@,(‹3I6&N1]a W/990W0JI1L: $TZ% 2*)")/9ÿõê$."&54;5!5!#!">274#"3262"&46@u£–ÖþlêþêT=\vR\&V'E<%&;þ¥ ›Y~v99¯F:>*471554&#"76ßy–J:Nur'3O‚Lv72…F5‡,d$wbA]–x6*R9EC8Q-F:ÿþ¨74&#"5632#'#"/"&5432654&#"#"#"54632326XS_k;Bdi‡$:Td( Euj?I 8r W4L[%7ƒ!4#EJQ98++?1F&("?)6%¤$.2654&'52+"&547&54632654&"ÒLF9-I]P8aC,Bb8P]I.8>QFhFIbID+29QCN2)CAUW?C)2NDP93* "ˆ,12+&))ÿø 72653#5#"&'654'3Ó2[@@&YMz"B3µ&ýê $91`;HMDVFG:ÿü½@%"&#"3!!"&547.54>7&546323"&#"2#"&#"32632d(.#þÞ:K9#5/.;'x\3r8)A& r"BX:0 †*7¬%!#9B7G @'- >-;5;F5&$ $&1) (*(é &54632#52>7654&#"r jQUqþíÖNn_T M87C "!!LZcO“Å9 /V87FA5 ÿü ".5#463!!;ÞužW$P9W|þ„+JvT.2h‹dX9X9EbW3;ÿüÙ%!3#".5#4633&54632&#"iU@þŽV‰u.\…Q/H7QîWkV 3C=5]4[lE9"9\dDN2HIeKM97þ>ÿeÏ#654&#"#&5462·( 2 &@V@>0 & #((# ÿõä%%26;#"/467&'#5!##&#"5!,! l=h?g9#N â,)03C7 .f~þÖ7%.`BW2S*[7Š99ã*.B ¦5_ÿðDÚ)16323##"&'.'#5!.#"!!>2654'! +Ýl 9'$_MQƒ# äuIGe zþ†$#'ž+Aþè>Äi[9?€ .BJTrL-Æ<92OG:C3H0tþ‡8+*!®ÿøÔÀ+@IQ[#54#"&#"!##"'.'&'#53>32632".54632#"&=%!3>4'#326%4&"26Ô@9uC+20H —1" RBD=1- `D*#Yi)FüÃ*@\;?X`B<"&@þ¼ û!+ñ6n'5þ5B55B5O(c:X595g)7?I5*j_G19OxN0"þs,&6HE9él :Wf·);,cî%•0ü'('(ÿÙŽ «4>32#"&''9.D-%.! BU.%5 - &$:fÿÿå[ %3?M%32654&#"#"&'4>3232654&#"#"&'4>3232654&#"#"&'4>32þ*0" 6!/ç]>BS'8/BSýk*0" 6!/ç]>BS'8/BS*0" 6!/ç]>BS'8/BS‘':A2+;DTf:$5 M>':A2+;DTf:$5 M':A2+;DTf:$5 Mÿ2b:8CS32735# &5463!654'&'#"54>3234>32654'"3:>7!!#(0Gö¨þÂÓ' NzL4 ;)}$0*I`L6ì)ý)*!+-5ÙKlW:&8%# ýØ:ü`&&+;Z^elV%/<%ácB#>(*$8!3O\FZÜ ‡.'0I%8ýø)=  $;%ÿ/:^iy5463!654'&'#"54>3234>7632#".5463232>54&#"3273#"=# &32654'"3:>7!' NzL4 ;)}$0*I`L6ì)2EJ\4`œ\&SQ5?7UB?VG25"++! XGö¨þÂÓ()*!+-5ÙKlW:&8%# ýØÈ%/<%ácB#>(*$8!3O\FZÜ ý‘dD/eZ:"@)(%  %1 .S3?/&&gY‹el4.'0I%8ýø)=  $;%ÿB9lwŠ254'"7#"546;2#"&'#"5467&54>32273#"54.#"632654.'.'3232654&'&#">‘Y45Að !E1–gO%&JN:%&)7"2QP).|/lk³K;9$G_”ZR„V@!>   C>n{LJuJ6,{VS$@(=ä4HNB8;›Q‚A@Me.}EV}aFcBs§TQ,@2_Z-/Hk/HxLIY 0F(6P(5}Bt$uZ:3SJQ9%.D@R9"þ;,,$3 _Ý]ƒE'8VG^.¿nk::A"UWC,ýZ&N $A>$1‰ZF,$M94€<,ƒÅX!K7237>'&5&57263>54&'#"547!"#32632#"547!32632M$ (þi8#5&G8 › !2)Gþ¸!&5$ "2) ÁIYœW 0 'þr&(MYœ+.þr&)ÿÿFW 72654'"7#"54>;2!#!"54>7654&'˜!745?í D1”%D+%Dj;' =;/J[»þ!AIdƒ.6^<<m#'F(9.QN((€ .&,>L73M7"!/=4>KIu(ÿÿp] T`4#"32674&#"632#".54>3263!+"32>?#"5463#"32>7#"5%4'"326#!"54>764&'#"54>;2(R)23/(#€=;*C' %[5G\I(<  %6\9p-K4e &EUK &EýH43A %3€ ú÷A-NWf&6]=9/J[*Y+"H5É2&&2$BE:KY#0<(8G:(621þ÷# +5R 7ð# 1/RÉF(9.!("þ¥8+?”t'J8<€ .&,=L83N6!!ÿûÔX6C4>3!+"3267#"&5463#"632#".32>54#"-BqEŸ V -"!1 Þ1O, 'd &bJ,E$T7)% VHLcR9þv1!6M3<.=S3S#;%bn/@O5558(.r.ÿmÔW6C%#".54>3!+"#"54>5&67#"63232>54#"_`H-G%-BqEŸV .>9ON Þ1O, 'd &þõ7)% VHÏ`p.@P5LbR9*þ0/J+  2Bã.=S3S#;758(.r.þ‹FZ x4&#"3267#"&54632632!"&#"32>323254.5476#"'#"'&54327>54&#"32>3#"=4&#"632ø(*+014'!JcBGTmuO)‘2K+ þr3c «%6/5H  2%Š'+ `rk?VY=?ÈÚ›!-8&R?,I %DGP*C' $\5G)'0+!G67632.547372#"&54632326'767.54632Å3: 2"/(3+ "?;R,¦}fYO3*pBSmF\q+SY#'OÒG-C7)? 19,JE&6L}hF8`u -UFP!7_s\P1( #*>)75 ,"%b;Ka3Q U6hOTE ;p„g6ngP6;j¡>^.$7-$<6.A  R†^MM7632.547372#".54>32#326'767.546322>54L/;4‡3: 2"/(3+}9e¤^/LCC2 *pBSmF\q+SY#'OÒG-C7)? 19,JE&6L}a€4S. 1: *8 / 7.8]!7_s\P ""3 ª (0ó1( #*>)75!.g^=%8`=OTE ;p„g6ngP6;j¡>^.$7-$<6.A  RTW'/# 2@2%  ! 35:# hN[x  ,"%22ÿÿÿýþ’²Y'æÚÁþù4X =73276=!"%547#"".54;547!"#32#"54?>74&+ThMP;þô)TÏ .@b8# |8 › ‡eQÞPCBEATa¿=K2Eo-_•+•þ ):4•W 0 '•WMº  =4GH‚¬C[L7#"547!"#>3232654>7#!"54;>54&#"547#32?2¡.,G8÷ › D-+3#M+Ü)>þ)#$¨5G7) #-%*²!fMYœW 0 '­>4#I0Um° þ>,eA6H ,0&%&+*þr&ÚX 073276=!"%547#"!+#".54;547!"+ThMP;þô)TÏ ¹ï@b8# |8 › ¿=K2Eo-_•+•0‚¬):4•W 2 '•þFZy…43232654.#"#".54327>54&#"32>?3#"=4&#"632#"&54>32632!"&#"3267632#"&4&#"326Òt'$H0-S.8MC5T1! ÈÙ›"EFT>0+ &DGP*C' $\8D]HJQ "4^;uO)‘2K+ þr3c «%6//M(@§6O(%I3QfÚ(*+014'!ÿ;- (9 Pb1+!1A9Ñ,m`Zx ) Ô# 6*RÍ'E'2#BE:H\uP5I;*^\ /C;!þ› –1K%?N|352/OF'0+!G6ÿÿþÍ,Xan%.#"3267#"&5463#"632#".54>3!+"632#"'&'&762>%32>54#"ÚJ/"-"!1 Þ1O, 'd &bJ,E$-BqEŸ V ;3 .%þÚïÔ“¯r F(8J5{sdž^>ý`7)% VHvQDy1!6M3<.=S3S#;%bn/@O5LcR9ß2&D,Ùÿ˜ÐÕ‰dÄE}UJ%D2Mg^v58(.r.Ã\%#!"&54>73à ýÙ=))2//5¶ þ ÿýùXt’732>54.#"%#".54>3263263!+"3276#"5463#"#".5467&#"#".5467&#">327"32654'&%"32654.Y /% )!, aO+E%V®p_lWnWjATŸV &"R ÏIŽ (C)2K#=3NXT"hT,F&>8HI;WE7[5 &Ö"GG8)@n ƒK 7&.> &¼ '- (/.'#ao-?L6Yœe11,+- þv1(G9lo¿5A6$=[LD‹4%Y¼q‰->M6J…0' !5dB:#;à™CF…]xŒA›@=K3fO8Z5# þ»CX J73276=!"%547#4.+#".54;547!"#32#!"#"5463!2>ThMP;þô)TÏ E/aï@b8# |8 › ‡Kd'6@ªþ¤  /Hn;W+¿=K2Eo-_•++•ë6B-‚¬):4•W 0 '•V~—=H(-Co=;*DCþÈŸXG7262#"547!"+>32#!"#"5463!2654&#"#"547#¤, G8÷ › B-*4$?}Vþô  /Hov3* #-%*²A( +/YœW 2 'þÎ?2"J10WS1(-Co=;Qh8F-X($Ó+*þr&ÿý_Y Td732654#"".5467&#">32#".5463263!+"3276#"5463#"74.#"326X7&)#V++ä3K%99>HFo>* [5 &cI-F&ͧUd@SŸ V HR ÏIŽu.'4'E4%)D¼77G(q0â7VP$1Ÿ9,>N7:#;%`p->M5Í)(þv1(€lXÈn†ë73!2654>7))>þ¤=))D )j>,/5¶ þ ° ò\%265#"#432#!"&54>73&7M RO |lcþX=))2Svþ‚r´ƒyž¾/5¶ þ #\'%#!"&'#&54>73274>73!2654>7#)>þ¤4,;Xh)AB))D )j>,"%Gc¶ þKeI þ ° ÿmX/72>32#"547!+"#"54>54>3#"i 4(GBÑV /=6-7- ÞA AYœS, þ1/J+  "$7â1þs'þÁ`=42325432632+"#"5&546;2654#"#"54#"#".5Ÿa$&O¦-UeCä  /HØy_\*2&(QLF!, k(0h…42ªþÆKi8(-C"- =;sk“>;þ…43yvuþ¦[.*ÿÿÿþX<J%#".54>3232=4./632#"=4#">324&#"32>f$99:V%=ds=4D! tW $*G=·¬w7W0 [5 &O+/E7&% Î;V,Ws:VˆN'@G6Ç­¤$3& aq{þõö‡¥,.377(/ØXIX%262#"5463#"3262#"54#">32#".54>32>3!+"%4#"326Z.,G ˜_!.,Gq]¤ [5*,#998N! 2L^W$v"22sVýßZ+ /)#B(LYvþ¸&(LZZrŽu:!C.;V,BaGFvK6J&$, þn5kr" '- Gþ” \K%265#".5!"&54>73!432+;2+"#".546232>>5S¤R-"þç=))  ƒe+HTV@MOZ"5"/5`?0L+ !6"-L?7J$&2œHvþ‚ž /0/5¶ þ r´‹‡Nj6X/' +!2:2!'0# &26G#683z[AM4.#">32#".54>32!2654>7#!"54>4#"326*V91F:/G01U#99-F$/J\Z(;]6$ -(7 ))>þ¥@080úY'0 :7)"0KU: %:jD7,KV;V,/@P3BsM8#5HC#8dG-° þ>, )3p;r)'$\Fþ¿$X z‡%4#"326">54&+#"'676?!"54>54.#">32#".547632!767.54>32'3254.Y'0 :7)"L'8 O7 - A‹E6ƒd 0 0D*6,þÔA -, *V91F:/G01U"77.G%?m«;]7# V0)'WS!.8)-G'<M>§! b; ¬r)'$\F¦#3)Bd -&)=Mþ0'3ð"&€j):`:KU: %:jD7,KV;V,/@O5eV™#5HC#e•&*81#uA,F'*3% &< =2#1::  (\J\2#"=4#"#"54.#">32#".54>3263232=4./64&#"32>§I8·¬I $-- ,'6V0! [5 &aQ:V%,BqFt65_[@tX%$ýŸ+/&  /% \le{þõö‡£%M2þÂ03G.G#-=O3:#;%`pWs;LcR8„„azÇ­¤BI þR2> '- (/þ³$V w%4#"3264>54.#">32#".54>323265432632#!"#"5463!2>54#"#"54#"#!"Z'0 :7)#` -, *V91F:/H0 &cJ7P#/U…N;]7# U1ñŸ`%$Q¦.UeBüç  /H @W.\*2&(QL-;þëA«q)'$\Gt):`:KU: %:jD7,#;%]sCaI6ugB#5HC#g’'h…42ªþÆLi8)-Co== ?L3“>;þ…43yvuþ¦+(X+62#"547!+"3262#"5463#"32 ,!GBÑV# ,!H Þ!j*.YœS+þ`'(*.Yœ1þr&ýø ‹%"#&546763?62#"54.Õ?Y*7i.0.JIM".,G*;6T!74</8.D#:BFÅþ-&#LYØGl=' ÿÄt•« 7254&#"&54632#"&54õ&"!A-jAYxW6Nš¶4;6D*(*;*3V([!Z@1l*8;1(þî Ób354'#"&=4'!263!2#¶ÎÏ 6% þ§ yG_L³% +ô.1•( 2c•_ÿ ÿ–¹ö8>'23267654'&#"32+"&=!26;!2#"&545467354'#4 ':nHS©-2FTja„ÖG'²6$þâ ù#R~J.`¼{ˆÖ±Î³l"01"]LUÁSdtXc•!/0Æ27Uwn=sÄ{~In³% ÿþEv J%2654&#"4.#".54632#"&'&5463232>?2#"5©)-!-,&3IYE%JR?)">†$*[A 96 4eGb9,¼ØMjU< 2#DJF832#"&5467.5462654&#"ó4#,-!0V 96 |g¡È4Ojc2tY!56F^* cŸ54.#"%#".54>32632#"54>54&#"#".5467&#">324&#"326Y /% )!, iC-G%V®p\hHbBi?)VK.7.…_-:gT7P#9:HF;WE7[5 &V[%"GG828¼ '- (/.'#jf->N4Yœe.-#5GA!S¢=+;qBgƒY¼q‰@^I2—8% !5dB:#;]†™CF…rÿÿÿþžv'Ú‹ßÿÿÿþÿÿÀw&àþÚ­ÿÿÿþzv'Ô¢ßܯŠ".54632X!, > * %$Ü&#/(%$ * ØYGV%262#"54#">32#".547632>3!+"3262#"563#"'4#"3265.,Es]¤ [5*,#99-F$?m«u#22sV ".,G˜_ýZ+ /)#B(KYZrŽu:!C.;V,.?O4eW™K&$+þn5(KX±wþ¸&kr" '- GKÿñ\ 2#"&5462654&#"ÔI?H=;QK;2B;1?65S5CWY@>Ké7,2;E+((\ÿíâ$ )7"546324632#""3274&3254&#"¥H#'#c,"!HC.)B,.–K%'!(`(", ,%2,Ò,(!Hÿñ¿?73254#"32#"5437&5432#".54632#"54732654#"w/+.üÇ …"H(,%O96P%/-'$? ŸTV9-Ö)&%M *C>0 9=%-A55>'#B "‚?QG(&ZÿðÚ(.6A%#"&54632#"=32654'53"&54632'654#"'"32654´§gh1/#"?8<.M<ภ!!"+$!/+ª‘hPg6E'$; 3 )5  :*,#%%/(*R 'Vÿ³’,=H%#"&54>54'#".54632>54#"+"'&"#"&54632632%3267&#" Q$5 C/V0 B8  r-!3)_,þþ1$%E [6 "&  #!0;I25!  #%22pS'&-/'ÿöÙËQYbk%#"&547##".'#53>74.54327676323223&54632#"'654#"24#"'4&#"#32>Ù)"$-ªXB(5&SRP7"!  AN@#0El")")5[R95 ÅI4$5 øó =,.!N$+1$ BM >+8P   8L1 P4#,%((& $ kN&u4D,!(1'Lÿó¶”S%3254#"7".#";:;!32?3254&#"&54632#"'#"&54>7&54;2<*)*)W9&-B !;! þÄ+#, !X  4$&N:-?,M&B* m!ƒ"#4&3$+%B" $#"^.::9@D(5+ *"& BTÿÙ¨zQ[d~%#"&47##"'#"&5467&5432632&5432#".#"!&5462#"54654"254&#"'3254&#"254&##"&47#32?1%-%$" ,‚:.B2-5N= T 9)+G£%>& d31ë+)&X !$È,$3 è%"(5/H-4E;!I3Ge$&.) 1!#!3)"-' (Ó.05!{B# $"4#*#)-$YÿíB60m2#"&54732654'&54'2#"&54732654&'&542654.5432#"'#"&54>54+"&5463232>7Ð !)@5.9 '9-0cÄ/D?7,: ,20.:)µ$'# C0%4 ,#0,5,5 '. #'*3*5 $3"L5BR9.221Ce_ODT9-4/4D4@ þì)5,? U\"=27:&*!-! $'%!)#-3(6)ÿöe532654&'263#"&54654"&#"#"54632>32¾T&43 o#/W† I#  0+ N0# &,€P@3I//"A#©' #Ÿ*dm L#1W#0)Wÿî‰j"(3723254.'&5432#"'#"&546"546254&#"Ÿ&%I23" 9F+,8 6!-(iC48"˜&,&^9N(C36032&23254.'&5432#"'#"&546"546254&#"o)) /-0&%I23" 9F+,8 6!-(iC48"C*8*#- w&,&^9N(C36054#"&54>70;0<*& +'< .J-  %%62;251' î-&+(26$,1&.(( .%"0(-( 4  [ÿñº¥D"&5473.54323232673254'432".3#"&54>54Å1'E  !+2<2<*& +'< .J-  %%62;2( 3@*) , %!1'+(27#,1&.)( .%"0(- ÿñ]È`&#"32"&'47##32673254'432".3#"&54>54#"&547#53654'"#"&#"4323!2H%;7=D1§&,2<2<*& +'< .J-  %%62;251'+0†#U? Ý)6 0+$,%-!1'+(27#,1&.)( .%"0(-( 4/' *+%#Tÿñe3*%#".543232654.54632#".#"eJ>(;   D8,.AA.6-+H & YGTG\0;-# 4"  ("!0 +Yÿ¦Æ4:CM2#"'#"547#"&4632654#"&5463232654.546&#"3262654&"jD(/ 32+$)D"+,,{0%&cA3 -*O/10!4V[-/#!2'D :0)/*,#"z;22A,5 ?ÂWÿí1"2#"'&>54.#"#"&54>ïIX8 &* 6%-R9 6@1dM.c&E( %-I5=Fd/5>*Zÿ¤v39DM2#".54732654&'&62#"'+"&54323254&'"546"3254&#&54%PH,+ &:+/<'Ï(Pe8( )I ! ! [B*€54 3hOME)  /2->:E  nOv5/"I V;K «$*P V!Zÿë¾3E"&5463237332>73254'432#"547#"&54>7654Æ1'.)!-4VÂI!4  .=  O T&11"' 2$&$ ^^"' # .--1#L  O4&!,Sÿî´902#"'#"&547.5463232>33254.54Nac5 #2"$ X&&=%! 1H!//!9lU‡><%0 '!,-.1,V3F Tÿ¤µ91<2#"'#"&547.5463232>33254.54+"54Nab8 #2"$ X&&=# 1H!//!9jU†>;%0 '!+"1+U2E þþG,&Yÿô»<P%2#"547#"&54>7654#"&54323254.'&5432#"&'32>73254'4 4$P*.6- *:(Y#)7C  /"7 L,5   H> x1%.J @7$  . 5I& !-,!#0)"( S/ ÿìÿ¤832#"'"547#"&54323254&'6323264&'&546 $=34 4 .54'#"&54632>54#"'4#"#"&5463263273533#&#"321  K)-BG.S K; =') =0\&S!^ÑC/H0]B -*  #1'!$ <I7L  $(52rL)‰"H0(UÿóÇ‹>G%2654.5432#"'#"&5467.5432#"&5472>32'254#"e$) & $A7A080:>5 $$ V& O--./(4->gH:W>32#".2654&#"74&#"326] @+FTPE#8!2QD3:EDa'’.:'VEJ]'/%[9B2@F4/DŒ(\ÿïÁ/1:%432#"&'#"&54632#".#"32>23254'#"7254#"7FB?,7 06/kXp  9,GV&!&$IV7<<%'%{=U5?4U2QfLZD!*&%L>4$\ÿ¥Á/6?J%432#"&'#".54632#".#"3276323254'#"&254#"&54747FC& 6 0%1kXq 9,GV!&A IV7%<%'%_}32#"&546322654#"&#"3"532>32#"&5464&=&546323254&#!.#[, &4)0U")CL mq %'54'*511"ç+!‡,O7#"&5473254&5.)”' 2^GE]XJ$"/  %6"S@@%¢M',/DSYCGg *%" !+A) ;!^ÿ¦©1'/;74632#"'#"&#.%4&#"32>32326"54672654&#"^aOGT?(3*),1G<*5$D!:)!, nVmjOF<87BS?M <*]$#E+*>#+':†  ^ÿó©1)74632#"'#"&#.%4.#"32>32326^aOGT?(3*),1 7%+5$D";(!lXmlOG<87BT-. =)^$$F+^ÿ¦©1'/74632#"'#"&#.%4&#"32>32326"546^aOGT?(3*),1G<*5$D!:)!,nVmjOF<87BS?M <*]$#E+*>#+':`ÿé8&2#"/&"#"&543232654&'"54öBe60.D<%+%MB8[k7H)@!+?"J !;$B_ Xÿí¨&*2#"'+"&54323254&'"543654&#"/(Qe9) *J!" ! ]C*²5&pQx6 0"K!!X54#"&5463232>32E"&# $+/$7;"0+5+6!&.J*1*2""(2.A  i:";2>@:%)!.!#(F)#*#1-XÿŸ¦7F2#"&'#"5467#"54>54&#"&5463232>323254'.76õ)@& ]  'N)2) &+ #'(1(9($8Eu#7*:7u00+ 6O , # ((-.1'Qœ]ÿï174>32#".2654&#"] @+FTPE#8!2QD3:ED’.:'VEJ]'/%[9B2@F4/DSÿö£-*5%#"&54632#"&54732654&'"5432'4#"326£"77H[<1F$ +0,9X%#  ³+«3L%bI9Q@$I#2 :C(4 7&Mÿõ H2#"&54>2654&#"÷2H!#@(Ee#@2@B0/CBH*=1 %2)`J $2)þéD.1A@20B8Þ¬'2"&42"&4672654&"2654&#"iD11D1S<1D11"" ¬/H//HÏ(+$//H/ þLÿöÀGUh74632632632#".54>7&#"#4.#"#"&547&#".2654'2654+53264&'Lt`F+4Gv.3[`B?QB&8 &1!'N;6T .(B20(J0C"042 i<;RLÿ`©ÀYgz74632632632#"'732654.'#".54>7&#"#4.#"#"&547&#".2654'2654+53264&'Lt`F+4Gv.3[{?ZWŽkD4$&`|1%QB&8 &1!'N;6T .(B20(J0C"042 i<;RLÿ`Â9E3"3!!"&5463!2654&#"#54&#"632#"&54632632#%2654&#"¾!:\ý¤2>>2uEPN>'0TH56Y$:0?D2>2uEPN>'0TH56Y$:0?D26@4CTmYD] $:0?D2=I…jGi5þ“!# !QjJKACd'II-A1 6hWOc( ‹h<3SA  \z-*I:%,7dLViA28HnMZG^t.KL}1%"/-#'0OÿK¢À/;FU2#".547&54632#"'32>5#"&5462654.#"%3254&#"2654.#"BPxx?zS2\b;xxQA4@?3?&{9SI&)>4>?A!!þº#=#€Äy,GE#%HF+ÀgMŒ)^1. ?-`+ŒMgE59I>\A !@/>J84FÑ0$ !%."WT#1W".;þ90* *0Rÿö¿+5?2#".5467&"#4&#"#"&5463262654'!2654'Žf‹UD)< :0`AS1&10: <(BW‹f]>D·'6Ug6þH(7gU4¿šqQm.C5:r$.%þÂ5H&p:6C.lRqšGGþuI8nHQl3GF4lQIm7JNÿ>îÂ6>2'654&#"33#".5#5654&#"&54632354626=#ókš2ygT\nS?4(< òH:+0@1<\KHb${‹"-¯ŒÜmg¿xš¯ˆ1#þu5G&>> -O/9F9G.[M]YJ:*0§Éýº' =7MNÿ@ð¾OW%#"/32654&+532654&#"33#"&5#5654&#"&54632354>3226=#”'5K< #2)&UE"DA(S?3@PòH:+0@1<\KHb${"5GC"?`.þ‹",† R>Jb?=-Â6V^g2'654&#"33#".5#5654&#"&546323546!2'654&#"632#"&54626=#%264&"j’›2zjRZpS?4(< òH9+2>0<]JHb${‹ü¤a‚y1W^J)A% ,=2C?4AN…ª"-üq&'@()°‹ÝlfÀ{—®‰1#þu7E&>> -O.:G8F.[M]YJ:*0§É„n“HAxYp"/>*HQ@9GmTy“ýº' =7M³-H1.H0NÿõJÂ1=2#"/32654&+532654.#"632#"&54>2654&#"f]|EPP<# % '/(((!<9É,?1BB6;IsT<_9$þm.%#0-$-(NÿôÖ R^2#".'332654&#"#546!2#"/32654&+532654.#"632#"&54>2654&#"'O`^N*@ 2'3C:1'4 Vþ~]|EPP<# % '/(((!<9É,?1BB6;IsT<_9$þm.%#0-$-(NÿôåÂ:lx4632632#"&=332654&#"#54&#"#&5465%2#"/32654&+532654.#"632#"&54>2654&#"]FN/6LH681cCQo!+)7O`I:",T1 ) þÙ]|EPP<# % '/(((!<9É,?1BB6;IsT<_9$þm.%#0-$-(KÿöÀ)08C2#"/32654&+#"'#"&546;4632#4&#"325#32=#"H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`UMÿõÃ$02!3!5654&#"632#"&5462654&#"7^‰VSþIebI)A$ ,=2CB6>K !)' *&ÃzdkX—þGJtPi"/>)HS<:HeS~˜þl.%#0-$'.Mÿô±À+2'>54&#"#"&547326=46N_ =-$3 J6%<ZCUe|42I<%8a¿u_9KC6I2#"/3254.+532654&#"#4&#"632#"&54>3262654&#"zGbBJ_G) 8U--'$.717/ASS,¥-?1AD9=CQ7ëSýrÓ+7$)#* + 9(R>I-—þG"?/"80! $. Hÿ÷ÃÀ1>%4632#"&547&#"!532654&"#&546323&2654&'udbECR@8Jo$Mf_ý¼Ë"-(D- +H;AQ2¸<'1%fße|QL`ZrXF„ZmWx;">-*3.%=IY=D,TB@F>TTc!1 KÿôÀÁLYb2+"32$32#"&547'#"&546;2654&#"#54&#"632#"&5463262654&#"324#"3>+,W;ñ,8!>2,86-#< ?¸`/8fSÞ9L5'(0R@0=$(&'*5.lS\:!“þ1**Á ?*.-&t3H,-!Z3&5AC5+57,Vg#0& 9E;$BR56þf ÿfLÿôÝÀKW"'#"&=4.#"#".5467&#"&546326323265332654.'2654'X*9 kª9.RB_:-(lUD)< 9/-M^^!kwb?4.MJX<)"?S2):N 3#ýD)5We(À@D3c„MLaLa :2ZzRl.B6;n% nW~?Mjƒ`M]LD,#Dþì4>iM-94þK6oIPo #,MÿõRÂ=GQ2'654&#"#"&5467&#"#4&#"632#"&54>3263262654'264&#"Xo‹{1WkY mSB?P9/"6CSS,¥->2B>6@N1QR+RE9\7.8P+3Wf6þ >&' *ÀiŒHBv\{ [|RjdS54&+"&54>32&#"36HT%=> ‚D=o6-.5a:J(O7‚D5i?L) ?5*= G9 ''F4/.G80)"MÿöÀ 2"&5462>54&#"'d‡‡¾€yQ1<*bGHa"IÀhd{afˆþn!H0Id`G3>+MÿôØÂ@#"'#"&=74&#".5463232653327654&'W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)À@D08X1 MLePSG>%M2J74>32632632'654&#"#4&#"#4&#"632#"&2654&#"L$8\:i0/Xj/*SN:A 3)+hK;'3S@2&6SS,¥-> !*E4>Lw,(*&°%HJ8#OMHJ=Df3U6 A‹Rf-$þÂ3B)þ¾,)5ÉG =*:Hj0,#'0-$'.Lÿö Ã-72'654&#"#"&5467&#"&5463262654' t5'1VqSnSB@P9/&0H#^!k‚X:84M*5We2Öf,<=Cpa~]zTheR;n%0G=~?Nl„ þrH8oIPo4EMÜ 2!33546"!54& \uýqT¥ps@P#RÂycæ¹þiâWg3YFιSaMÿñäÁ*2#"/32654&+532654&#"&54623K"KOgL%-1;G4+*4==2M](Á .% @K;P 7)"'2,)"$/yfO` rL{’MÿôáÀ.#"'#"'&54>732>5332654.'a&,nQV98PJ9; <*#*0B9(,S2*9M0"À 6R0g‚MM@Dc4F?o54.#"#4.#"632#"&5463262654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1MÿõóÂC%2#"/32654.5463232654.#"&54>32#"&#"326+8PWDM /  "7 /^AIf }BLo9#3( +'Mÿ "2!546!54&#4&#"6!7>.þNk³ % 9 "ÿBUFI &e« $8dA¶ž‡¢,/6  jm36 4Ý…{OÿöÀ!/@%2654'7#"'#"&54632632'>54&#"%327.54&#"!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ "2R31D1#&1"x]nBN{n“ •sSoVV*=4M4:)@UTÄŒt]pWGƒ[x]o@J”g‹þp>H=UTc:8LÿöÀ2'654&#".546/]t"4-bXADY0#*.À~f3V6)2vK\]M(82 5P/iƒMÈÁ2!!3!546"!54&^uþ²ÔSý…sv@U(PÁ‡j/—þGÐl…0UC6%N[JÿM.Á=G"3!!"&46;2>54춮&#"632#"&54632#'2654&"·!:wþ‰1<>/± . =$)7QBRl$:/@B78LtAQ7II$4+Ñ"$4 !)I6V@#5/$*4L98G98J\Cg} ?+=+B$3 1#$/-H2MÿøÃ&12#"'73254'"&5473&546>54&#"o$9 PK ?4c%F>]xK%#G9+O"==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDþâL-)75+KLÿöÌÁ233!5654&#".546)\{SÌSþvkZBFT+ )7zÁyÊ\—þGNcL_bJ'51!AD/d†Mÿ÷Ã-72#"&547&#"#"&54>7326=463254&'iPA8Px(*2I[HRb >+'5!/' $:i[?MlÔtVnWG„`"_HIOe~_7HC:@,2J!BJCZiþã:8{(lWKÿö™À.4>%>73!5654&#"&5463235".54>3273"54“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>LÿöÔÃ8#"&=4&#"#4&#"&5463263232654.'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7KÿöÒ¿22'654&#"!5>54&#"&546323&546õa|"6,aZHF\L8þ@(!7,0=5D\KIa&æM„¿~h5V4)2qKa\LH^ E-6=.G!2[FVSE7.Ejl‚Mÿô‘ 2#".5332654&#"#546âO`^N*@ 2'4B;0'4 R†cbƒ'9/'=jNIa10  EbÿÙÿY2#4&#"#>q=QT1'&2"VYI=þ-¾,70'AN*Y!2#4&#"#"&5462654&#”BTS4' #,$%1Q*"YI=þ-¾3B' $-2'4C®#&9,ÿ  À"7#"&547654'72654.#"« #>20A]6r’R) " '' 4"2EK4gvN’$D ­Zþ¢. !",#",(ÿü¥#"&547654'7'&#"32'3265#"ÀZ>Y2k‰6[5(- $d%%%çE2`rE‰#@! XŠj/U+- !+)"Jÿ }´$.>54.'&5473#"&54632264&";']Q=8aG5V@5(5(?)'@(#Ô ?3&/[Ú!&4cYf_2AY5>8E223 -B.-"8LÿõÂ(2'654&#"632#"&546264&"9a‚y1W^J)A% ,=2C?4AN… &'@()„n“HAxYp"/>*HQ@9GmTy“þm-H1.H0LÿöÞÁ#,62"&547&#"327&54632#"&5462654'>54&#"4Hb3R6* DQRC+:)&3aGj€~¼ =**2ÁD6'0.%/%m¨q-(1-&6Bec‚°742ê*1-Lÿõ8Â(HQ2'654&#"632#"&546264&"2'654&#"632#"&546264&"Ua‚y1W^J)A% ,=2C?4AN… &'@()þva‚y1W^J)A% ,=2C?4AN… &'@()„n“HAxYp"/>*HQ@:FmTy“þm-H1.H0“„n“HAxYp"/>*HQ@9GmTy“þm-H1.H0PÿËh>(BFkw2#!".54632>=4&#!"34632"=332654#"##53%2'654&#"632#"&5462654&#"Õ>U$5+ý+5$V=È +$W;ýb=U$5*ñ2AŒ…z/$I'#%VVþ®/A4%t.UZB%=" *8/ ;1=G{ #$'0>U=þ±*? ?*O=Uýº6!÷@SU>÷*? 4DC³½xHE‹(:P)°'F,gU?^AZ&1!:(# /9RD\þ½.(#$!PÿË>)EIpx‚2#!".54632>54&#!"34632"=33254#"##532#".54>32#"&547&#"327&54674'324.#"6}+4$$5*ýf+5$V=v+5$U>ý·=U$5*‹:9Œ…zSJ %WWÀ&RC2H& 6: BSE3ii .L."(".> >*þ±*? ?*O=Uý® ?*>UU>þý*? @L;´½{ Œ‹ O($+5":="4J&4+H $,š -&l1 )/‚+' Lÿô¥Â64632632#"&=332654&#"#54&#"#&=6M_CQ-6LH681cCSm!+)7O`H;0T2 ) QjJKADc(JH,C/ iVMe!'‹h;4 @, ÿѶèX2654'3#"&5473k$0*Q=;NM.î-$  =ID8 )Lÿô¥Â64632632#"&=332654&#"#54&#"#&=6M_CQ-6LH681cCSm!+)7O`H;0T2 ) QjJKADc(JH,C/ iVMe!'‹h;4 @, Oþò¢À-8DRs73265#"&54632#".547&54632#"%2654&#"%3254&#"2654&#"72'654&#"#54#"&546326xq”|†0<2>A1AO‚‚6\`65b]7ƒƒP@1A=3>{%3!þ¶$B"" èa~d&II,‚¡$0?) '%+"2 80('÷mZWoQR@;NtX¡0j0E##E0k5ŸWuM D,<"!MÿnðÁ<IS"&547632632#72654.'#"&5467&#"#4&#"%2>54'%2654'æAXEDh[C@fGz@Vo[@U ,&PA/9JE$c*NS1&. 194Í  9?-þ1(7gU4 nPjPQPRVNuQ_w;aN0BYwH5=e l-!þÂ5H&o;(7-<-$ GI*(&F4lQIm6KI¤j7>3!#%"32654'3#"&IS>È2þ(24&'2!> X@73546"!54&Ê[vþ¯¯-8& Mtr@T(UÁuWö (7)(øF]8M;Û²MdMÿö£À23!5654.#".5464WuSöþŸk>*IVm>J}À~_e\"Nc65!YJuD(t@kƒNÿö¦À%23#5654&#"#4&#"&546326¶@TH¤æJ:*'!@%/D[gU@NÀƒaiQ"WlLi2þÂ;4eKnUj|_…HHOÿù¢#2#"&5".5463532654&#|¥kRDYBx'T AYi9T0;iV1Âl[~J7gJ:0SzEfˆÊý±S;Qcþý#NÿA»NG2#654.#"3254퀆&#".54632#"&546ElA* C5hGv‘‰s–Ijˆ8)Ib#)‰d1<);U 1W9…Ÿ®N8Wsk5 1)?s;qpD¿œ†³ž;&1g(lPRO*I;b† 4#\s5;+ÑŸ²ëPÿC½Å52#"/32>54#"#4#"#4#"&543263261)9 =FiP4.I$?;#[?:C&TH"Y„5&EC#Å0[kGqbr9E†[Å.þ¼]'þ¼"W¯~KY“éD@7;MÿC²Ã$12#"/32654'&#"632#"&5462>54&#"~‚²“pP6 /QTnJJeYk4GB[);0Nj°( ;"@:ë€ÆD—tfFGjLCQ<*? vWo–þg(&.(*!+<PÿC¤Á%233#"/326=!654&#"&5461]tT¢Tp*Y ==lQþôjU?E[k‚Á€]~F•þChM";1H7–F``FpHEše‡Pÿó©h*32#"&=#"#4.#"&54632>3534&+32ú2H% 5$-7"+G"! f_ h\IA':4k.<)BÁ1QQ*#CC(aGîþ¨4' ·zAP–d„F)§þSfhþûOÁ3r 64>32#"&Á 1'<h¼ 2#"&546"2654&ãHd10FGe`L %.EfJE¼aGF24cHEd- 4"3JI51F2Ò #/7#"/4632'"32654&'"&54632'"32654&ÒD* 7(,=i&- ).-?4),@5<$.!)4•5.H(;9 (")++d6.);:,(:¯*" +, #(ÿ {l9HX2>7#"/27#"'5#"&5463224/"#"&543327&#%4&5747326Nl G7(7'$@&8[„­¨† :Y(qP  "D[¦.' 0lU90=+ G'9 þÛ*"(Õ Öƒctƒ&HOþŠQu† kUI&,<$"$ÿ»cs2#".#"37>54&'.'5;23267>54&'&/"32?"&54632#"'&54676323#".546232654&#"@+%   &= K|AXc 4e!.eH/R2LB&h-$5NC9?K†D'*°QFiG=XE1„e!+ &7/*A 0P &56.!9#  !9&'   )T)Hr  3% e5  J98CI@Gb1°W{!,=hA"€ 1*$6 ,% F4B 6'-6.ÿþj E^ju4632#"&74&#"2672322#'"'.54>76?>74&'#"2>767'4632#"&74&#"26[+ #/. 0 *õaAQ  d"%D0až:IM,B!$8XQr(FQ ‘qbx VG3V#!NL'(2$'#/. 0 *÷ ..# .0‹3d 1\ vX:l!@C5=`;8#5-O (ýýTb6!+ ;g/&/>ñ1.# .0þ¸ ZC%#"'.547>7632326374&/"#"&/4;2#' 32654'71HyJFN‚ oH8Ly ( - -&*-l -8C/Ôþô™yâPT aJ`P8/Õ¢B PD*’  Ki#9 F%‹´Q}*$ ),7;?ð#3,7? ‡°NÈÌxp< A3 !¬T@( €x8I$"®$6 &Q;# ÿÿ: o–4&#"3274654&#";2>52>7>32#"'#"&546?232654&'#"&4632#"&4>75.'4&'.#"#"'6;2&×$$$ë+ (*?2+@ 4$''5*  *A(|"?(bp;@#"#'Z?JO%" 2+>=+?igHPrè?6²?$s2uy&†<3u(( Ý("(: .F:(/D6# !  4MA<"n&µ~`s$ :($2<6 %21N3U<;IIwI6.;<A&cK4^GX,PF#‘Yc32654&#";>2+"/3264'&#"2#"/#"'&#"#"'>7674&#"#"&5'4632>yz4=µU‡DE23®—Ó##,' \HNMo-!4%JY@AH5V. I"H*  6q] % "=#_K9=2.MÿuV;?k’w, Iˆ¤x<\4* uàTS3$G9GuQr%I‡+y˜G"^/  32?>732#"''>54'&#">%4>75.'4&'.#"#"'6;2&g%4(+ )%N$A5'MU 1X7j…#'+L‚ 8H"Y@K+50 1~Vi5,?6²?$s2uy&†<3u(( f.*3N;*'=‰c9N?-pf/K$ ¥?ƒs+@A'7T'UQC/$+I6.;<A&cK4^GX,PF?¤\[%+'.'&54632&#";2>5&'&'4>32#"/7;7267654&'&#"672e†k -0," ~A@Rh…8RE 45(I".AN9q™]*8M!  #. ::V!4Jb,,¹Lf -6Dƒ§ p\7T* 'K  *5U2" ¤v4?…$  =l^x" XH !@: Nu"2654&4&#"2>7>'#"32?6732732#"'#"&5467#"&5464>75.'4&'.#"#"'6;2&_*ÍPO ![ ‘-45A73#"&'&54>7+"&5434&#""&54672"'6;2&'4&'.#"#Cd@]PcF&,T/. .JrB—½*" '(J(9119(„$s2uy&†<:H6%)?6²?¦:&-E"RQ! #`767654632632#"&546?632;4.'"+"&54632+"'#"n@0!4 2+ ' €  þj#:acFi#G+@ F+=|$k€0G<6[:@²èN<"6 4  bX2AT5/ GgØ"& #* " "%œ(9"y::F7*(9 85."'>?>2.IHsEª~=P #:(N6'B K" n2654&#2654&'&+46?6?632632#"&54732#"&546?632;&'"+"&54632+"'#"n5!£°¯@A<{=0 :D, ))E6B .( *%! A;T#30Ý£²èN<"6 4 ObX2X. 5/ Gg#:acæ!, þ¬@T,I>\~! !1*0 -""D;vœª~=P K :(H4B:(9"ÿ0Âa«726532654.#"632#"&54632>32672&#"#"72?#".547>37632.'&#"#"&5&#"2#"&5#"'&#'>74&#""&547>772>?ß-S"A1HQf)!@w( H 1  _D*6 DzbSVO`_† *G A^0NG`&# M’D/=9.7^. 2–O  3)Fj+;4!YE $:< b+(  6k=m6! ,+<'(F"7>4&#"4632632&"72?#".547>32632.'&#"#"'&"#"'&547632326"&547>772>?IG,/  ; 57ƒmQ;4^BS9/$(o-NG`&# Mê& A>W<)1 ß1z± $ D/   -1&b+(  6k=o7" ,+<* sRKdZ\{p[e,.!))-? Lþ~="7%* ,(+:!@"!2673#".=74>;&"'6;2'654'4'.#"#1H# ¯/:2wœHšr *F)E /-$s2uy&†<;q&% * :.¼aË/.”y]4Ÿ2w6i?B &0)LA&gHJ@/$+ 4YJ]*KV!"&'#"&/467"32>532>=&'#".547./3267&'(+='6WUq‡w?g1R,0:(6@_ 4H'*= " +R]F  2J¡H6<I€ 0DM„a*iˆCX)T1"F/(-Lr!$X?##3(2: *Yc–QP$/6#2E[>:=d%;72732#"&5#"'&5467#5!4&#"#"&54632'"26%4>75.'4&'.#"#"'6;2&}.=š) 86$D:aa:S9:",HF3+L B/EgÕ( XA:6F?6²?$s2uy&†<3u(( ã /¥qo!!B10CHI_E@-AI'%EQ%." 17>+I6.;<A&cK4^GX,PF*^i"#"&'4672"326?652>=&'#".547./#".'#"&546?#"543!4.73267&'MA#ÿÿô2my¡­¸4&#"632#"&57#"./.'#"&'>?&54654632%672632#"&5732654&=4./"2654&#"%2327>54.'.54632#'.'4&#"3267&#"þ:D '/ $-1F=,-D6?BZ%?;(3  [‚aD83Cþá)]p<" 'e-'$D;(*=058%"' &%­&$6&23ý"KOs4L"#! þ£ O<'5&%,A17#8&#$"?7WPjY&> ;'!B1+;$?G?  ,7#4õ7"0&(!1s % F8&5 " ¦/?$'!2 0'+: #$ %!&$÷JD !R[m4&#"#"&54>32>322+"/3267654&#"2#"&/&''>?64.#"2326& $&+4(* #HA%,9RB .z*!e|ä& 1")B& & #.+>lCWi*;?0.ˆ¤6 *B+:K=+(*2* >›3I Ê.E!+£1EU%ÿüð'/;".547'&'#"&547>32&#"32654&''327.'%9 0 V `«»¡Ä.,E9SZ@ag-‹´Q}*$ ),7;?ð#3,7? ‡°NÈÌxo42"p`!7 €x8I$"®$6 &Q;#ÿ0M_;V&##"/72?#".5476;632.'&#"#"&56?2"&547>772>?Je  eLNG`&# Mš&:&)b+(  6k=n8G ,+<' <&ýl="7%* ,( :4[3".54632632#"326732732#"./%4>75.'4&'.#"#"'6;2&ç0K)e} -^cV@BW"">'š) (/e!/  5¼?6²?$s2uy&†<3u(( ):I4–‘i`B^/0/1¥ ‡,Y$&  ôI6.;<A&cK4^GX,PF‚WQl2"&'>5'&#"#"/46;>72"'7;>74&#"#";267>54&'1D6' •KGRq329." ++!-rF  *zZ0eaF"' N - 7©‰/ I C6)#  (!CD(32B>¼ .R4"&;ODV X…99%2#/-:q%91 2X9J*Ka( 0 Ib‚¢%)-*'  5*<@ÿFl#>[4632&'";267#&'."#".'>332654&".547>73272747¼GU;4C;I=*ˆ] S V9;ƒŸ} 3S@Š_& A>I)7,C1, $U2'C$“µ"G.   )D*]s %,hnD sBILGüî))0% 0 3$4 - :iJU!"&546?632;4.'"+"&54632+"'#"2654&'&+'46;24&#"?27º²èN<"6 4  bX2AT5/ Gg#:acF°¯@A<{gI '/c݃L&0Zd`, ª~=P #:(N6'B:(9"@T,I 2i 4-#~vœû/D5%ÿüð'EQ".547./#"&54>724/"#"&/4632&#""232654&''327.'%9 0 V `«»—Î0eH% > PD*’  Ki#9 F%‹´Q}*$ ),7;?ð#3,7? ‡°NÈÌ”t#>@*A3 !¬T@( €x8I$"®$6 &Q;# : Mt7"32654&'>32+'37>732#"&'.54?32654&#"4632#"&'&%4>75.'4&'.#"#"'6;2&Ç"*%+Â"2B;c”?: d#<] Gb=M$,_ZNw 7'+?<*%.6£?6²?$s2uy&†<3u(( ¤'4)&).@d;&v]:B$# ‚[Th$X* )#-!@#B&?9*);#EsI6.;<A&cK4^GX,PFs^I4632#"'72654&/"#".547#"547!4&#"&54632"32>54’_‚ou&F"#D[`W!Dd%jN|7#"&'4632#"&54>?4&#"326?67#".'&'4>3232654'"'6;2'54'4&'.#"#è&! *! "15%5 74={E0(BJ$K ®Zs# 3?*wœ;”w %,! ;0]BUhGü$s2uy&†5&) $]B, :ZI+D! ˜*w?i63I6Z5%3"?02NA>)-A&(¦]J* =;<: ‚©4&#"32623>7>32#".54>74##"#"&54>3232654&'"&54632#"&54654&#"32654&546?2274>75.'4&'.#"#"'6;2&æ#")09-# ob55!81 ?>dn&W=0 I68U 4L3L)1OdEF[HD02.'"'@%1!!&=ó?6²?$s2uy&†<3u(( ø(0#&þ -8  ”¥<-!  ,<³„L|R)/ E1* $ &5/&*9O3=Ll#& •q8A  !(PI6.;<A&cK4^GX,PF,=aJV46327&#";726?33>?4.+4&54632#"&''"'&4&#"3226,u]&-#-68vhJ! E  e@P@%J/†~A=P&$]S8S"8¶Ò7Dm"‚>  j"$kF6h2 ;#:5>O )0"7U72## D>19#7,X0)3±0aÿýýi'B2#'&/&'4>76?>?2324&'#"3267>5Æ &7a;‰² a8FHiH.?-O (3d 1åVf,0l' +D0ÿbùTY2#"&'&547'"'672#'254.#"327>54&'7#'.'.5>7>ˆ´{¸04Læx$0&Ž%L[BHa%  U„ƒ?  $ 5 #1R,&!Oo6ID0MtTRy} &   $[0? JC7f*H0,p= DPF'4$7 4:JuU4'@4<&*þ:1Q4672#"3 73#".=>76374&#""&"'6;2&546/4&'.#"#a9119(Gç2W_832.#".54>#5 *,%/  !2[;Wb ,$ /S5W'%b_J1*B@/5< >r^–&+/7rG‡”08 &($ -48(<56*  § (,=1#8@1 )7. V…m‰   54&#"3263232%""&547>32#"2;>54'#"&546;7&+"'4632#".54634t<Ú#1**ù!iG/d )ÜF@H.×° !T+iO?O.Çào¢bŒj`""#¸!&D#[9 ME š!2 9(L,$$!1!!9PbD@ \)|“5{^ZmW/BhQb32654&+"'46322#"&/#"&5467#&547!4#""&547>32#";265%654&#"3263232º"F0QaN=T+iOAR @{bEOTAcz&1I =e]93GhÂ,V%Q8CI3G/32&+"#"&54632&+32654&&546?2"/632>74.#"6$"#2‘[oŠ~C.Q  X/c(  . ¼`M ;y%)¢Nl‡^y67C! *# +Z8*¼,&4&He„i @0P o$' !8c tDQ5&+ _Š ±y$…h3  <&?zVÿ0fVh%#"'&546?632/"32>54'4#'".'54'32654.76"#"&'76324 !8Db%+kjšu’ŒW`cr !0& -Ke 2\; r0LbP7”z   0/  é$ 95P({R94632>32+'#"'526754&##4&#"327"&(j…=`D`w%g)6+Vn b74&'eO,:0">YJ?(,†¬$¯{6B±ˆN+NO ]YUu ,\=v +L.<\,¦ýéþ—!*".'54654&#"'&5463232632'3254#"ýÐ #(5&[ !)/ñ þòB€ W7 (+%.687P]+"'4632#".'53267654'4&i# L6 +6-  ,L#4 1*#0 =33M@)>¥*6!)% 52¯<'?Sÿ~š&543767!37#.54?67#„ 29T \(ci)W&/{ ~èX;J* s]HE‘49ÿÊ–0#"&'.5467#57+*.'4?732?6Ê| B?)9332þ}$!& 8g5&6#![2RQ)' 6):#76W8 &.#$…XE#/.$.B % "+N' üíþúÿž(2;7!"&463/";26þbg€"ý½/?J7 (9M&€§7¾HýÒQhA % -&1/=üãÿÿ™#"#"&54632&#"326327.þž(Ú?]_2( "H@.9­; c' ¬Ã5G;$: #)3I ¥Býò , ÿþoZ#474>32674&#"'>32'&#".763267& &7-/HI:#B W/9O%!),9*/¸!0:'7’5P':G_$$.7[W/SˆD%' NÂ+#*#"Rs!!in5A#.54632#"&'&547632'&#"32654&'&#'"32654&Õ"/ J,B3)qSR’fW}# $#3;)$2<[(6@7=N*$M>f‰gP3A…^`  RTjUkWG>?X?1 /5*/E'!19B‚M†bb<   #%5>aE O*a€ZV;e<)F  U,305z7gUþ…mTF@  þ³**0  :LFË;-7%#!5354>54&#""&546;2326534&"26Ë&þä9'%"#&4&F1BHGZþã$$R"0é&<% %)0 "00"5GL/ 02 ë(åx((((F:8B4>3263232653#!5354>54&#"#4&#""74&"26F& ($.@KZ&þâ7!'!#&4B$$D4 *)F3 02 ë(åþ"0é.H#/#  !)0 "0R((((Fÿ7'134.54632#4&#"4>32#"'4&"26ž {]d}ZKDHV 0"*#(P$$Hn7S0Wp}kþ±2c†W@3,33 !.ÿC((((F 73=4632632#4&#"#4&#"54>32#"'#4.%4&"26FQ<:#C;AZ$%,<  0!)#(U"ÿ$$nYp66gUþ…™?1')Y.2+03 !.ÿFl7T((((FC:@JT4>326323#.'#"&546754>54&#"#4&#""74&"2632=F& ($.>-bZZ '>'P848/!'!#&4B$$ "# D4 *)F3 02 =:ÂýÉ"4@+ rXL+,C .H#/#  !)0 "0R((((þÅ45YF¨74632#7#"74&"26ë&./:UþóüB$$ÁD260þ/tþÜAR((((Fë7",2#54&'+"&5463254.#"'>4&"26 ^€Z+*$&,%F:,+oBrU$$7hTþ…e².  30"%0G0,@ ^>Hþø((((Fl7+1;2#"=#5#"&4632>754&#"'>254'%4&"26$a€/848P'>' U&&./:c,PFvEz&FFþ©$$7gUŠ C,+LXr +@4"ï0D260¦9<zEU_ :Lþ4LY¾((((FË\+5@%#!5354>54&#""&546;26=3%4&"2654'326Ë&þä7!'!'%"#&4&F1;E&Z13dþã$$Ã&GIR"0é.H#/)0 "00"5G;*`C> €ˆ((((þ§åc!W0ë(F\7EO4>326326=3#!5354>54&#"#4&#""54'3264&"26F& ($-9'Z13d&þâ7!'!#&4H&Kþú$$D4 *)<(cC> €æ"0é.H#/#  !)0 "0þåöa)0 ë(((((FÿöÒ7:@J23#4.'#"&546754&#"632#"&=467.'>2=4&"26a€K.ZY 2"P848/PFf?*I&&./:,305zŠFFY$$7gU‡/€ýÉ;;, rXL+,C |EUB Ã0D260Î*0  :Lþ945Yr((((FþÛÓ72JT^232653+4&#"632#"&=467.'>2654'3#"&54632#"'74&"26%4&"26a€RZ&îV;f?*I  &&./:,305zX(1JRT>I.+&&$$þå$$7gUþ(åþ"0mTFB  Ã0D260Î*0  :LüÀVH e{Q2'60D0"r((((õ((((Fÿ 27@JV2#&'#"&546326534&#"#"&5463254>7.'>4&"26&#"326Qa€Z&5 E'6FA<87-V;f?_(  ?2'#&'% z_$$º43$-:$77gUý’D+&,2! 7-6ñTFB@ à3D5"0¡+  :Lþ((((«#(Fÿ 27GQ]2#'#4'#"&546326=374&#"#"&5463254>7.'>4&"26&#"326Qa€P7.( 8,951,/'-V;f?_(  ?2'#&'% z_$$**$/+7gUý’80#(2! 7#!,% eeÿTFB@ à3D5"0¡+  :Lþ((((­#(Fþƒì3-R\fp22673#"&#"632#4'"&5463254#">4632#'#&'"&54632775#"4&"264&"26&#"32ò k  ,bL>5_JZG &4&-$45‹<,aB%,*-?3)%+#%( .2*$$l$$™ .1 -!BPLþïì4"00"'/0 eMkýD251ÓBB6$$( ! JEzÙ((((þ((((‰F}<@J%632#4&#"#4>54&#"#4&#""&4>32632'4&"26CMP@%8W)(#"Z##&4&& ($-2>“$$|ª8"þ½(e ‚w~.H#/"!)0 "00D4 *)D5/\0¼((((FÕ7FPV2#.546326323#4.'#"&546754&#"#&#">7.5464&"262= '!&/&\%%V/@"C:<K.ZY 2"P848/$;+11 '%#E$$+FF‚9I@^.L{g5hl66dT‡/€ýÉ;;, rXL+,C ¨@0'BPA+NV1 /"4S((((«45YFÿö47;AK2673#"=#4&#"632#"&=467.'>254'4&"26a€.KU/848P"2 YV;f?*I  &&./:,305zóFFþ>$$7gUÄ/Cþº C,+LXr ,;;mTFB  Ã0D260Î*0  :Lþ4LY'((((Fþ7(23.54632#4&#"67.546324&"26‘|[d}ZMB8[1 + %#) (&/&O$$?k32632#4&#"#&#"7.5464&"26 (&/&\%%.)@"C;AZ$;+11 8%#E$$–1!PFc.L{g56W/66gUþ…™?1'BPA+NVc/"4S((((Fÿöÿ7(22#4&#"632#"&=467.'>4&"26a€ZV;f?*I  &&./:,305z1$$7gUþ…mTFB  Ã0D260Î*0  :Lþ((((F<<)%632#4&#"##"&4632'4&"26MP@%8W))"!U&&./:U$$|ª8"þ½(e‡t£0D260((((Få3",22673#"&#"632#!53>54&+326ë k  ,bL:8To&þî&a©8<P.1 -!BHS¿"0iMkþ$Ì71þ’(Fk7!+54632>73#"&=##"254.'4&"26F&./:],Z/848&/&;' T»" þª$$ÁD260þ¥:<Cþº C,+L-+r +@4"£þ«4Y5§((((F!7"463232653#!53#"74&"26F&./:œZ&þ–7B$$ÁD260þG(åþ"0‹R((((F!""463232653#!53#"74&"26F&./:œZ&þ–7B$$ÁD260þG(Ðý0"0‹R((((F72#"'3#'#464&"26¯.&&‹’ZZ’ƒ]:k$$73!"0þ–ùöýÉõõÑ06T((((F#2#"'3#'#464&"26¯.&&‹’ZZ’ƒ]:k$$73!"0þ—ùáüÝõõÑ06T((((FY746323# ##"74&"26F&./:~~Zest_B$$ÁD260þåþåýɰþP£R((((FY#46323# ##"74&"26F&./:~~Zest_B$$ÁD260þåþÑüݰþP£R((((Fÿõ27,62#4&#"#"&5463254>7.'>4&"26Qa€ZV;f?_(  :/.&&'% z_$$7gUþ…mTFB@ ò063!"0¡+  :Lþ((((F 8 *446323#.'#"&54675#"74&"2632=F&./:-aZY '>'P848/B$$E"# ÂD260ß<:ÁýÉ"4@+ rXL+,C ³R((((þž45YFÿöÒ9,62653"&=4675.=4632#"'74&"26!(! "!?Z>Zr¢r?%:0;0/&&Q$$‡$  8;0*;;*Äþ<4II43=?  :"(;>3D0@((((Fÿõå3)322673#"&#"632#"&5463254#">4&"26ë k  ,bK:8hB:/.&&Œ=*a$$.1 -!B LN¶063!"0•fMkþ((((Fÿÿ7(22#4&#"632#"&=467.'>4&"26a€ZV;f?*I  &&./:,305z1$$7gUý“_TFB  Ã0D260Î*0  :Lþ((((Fÿ÷ë7*42#5.'#"632#"&=463254.#"'>4&"26 ^€Z D24!&&./:PHb1,+oBr8$$7hTþ…ê1HC?A0D260ŠIXS8,@ ^>Hþ((((Fÿ 27,62#4&#"#"&5463254>7.'>4&"26Qa€ZV;f?_(  :/.&&'% z_$$7gUý’`TFB@ ò063!"0¡+  :Lþ((((Fÿõé7&4.#"'>32#"&=46324&"26‘-+oBr:\€:/.&'$$m,A^>HbWþá063!!.C((((FV!3=34.54632673#4'#"'267&#"4>4&"26ž {]Y?[)Z!*()1 ]HV 0W$$Hn7S0Wp6#2N84Eþ©25)!.ÿ–!_W@3,3S((((Fw72<F4632326=#.54632#"'3273673#!53#"4&"26'4&"26F&./:œ ?H.+&&)Z6T&þ–74$$ò$$ÁD260þG(…Q2'40D0!Cÿ3KuC«"0‹.((((”((((Fÿ÷ U08B$#"&=463267.#"'>32673#5.'#"6327=4'4&"26#&./:PH", E'oBr:Z>[&Z D24!”!m$$mD260ŠIX ! *^>H/2I6&Oþ±ê1HC?A˜ "! þí((((F=>%/9%>7&5462#4&#"##"&463274&"26%4&"26(3&.@. X!,F2[&&./:ñ$$þº$$_‡‚. &%55%. )þ¯,)­À¤0D260((((((((F¿ &0:46326=3# ##"&4632#"&57";54&4&"26œ'.*9&@7-est_&&./:~~+6?# þÃ$$·"2.)+=0SýްþP£0D260þåþ 1%>#4#C%þñ((((Fÿöë7&02"&=4632#"'26=4.#"'>4&"26 ^€r¢r:/.&&?Z>,+oBr7$$7hTþø4II4ª063!"0|*;;*ú,@ ^>Hþø((((Fÿöëd,6@4632653"&=4632#"'26=4'#"7"327&4&"26FzLDB;22r¢r:/.&&?Z>W†V´L3"D7).$$ÆY&'+A-2Iÿþø4II4•063!"0g*;;*ú;&*g "#ñ((((F´<(2".=4632#"'3274>32#4&#"'4&"26½#3 .+&&= #-W  -$$],# (60D0M ##5%þŒ:'#+ ˆ((((Fÿÿž6+5?#"&54632#"'3267#"&54632#"'32674&"264&"26žxX>I.+&&,0FJxX>I.+&&,0F$$$$6_Q2'60D0!]fþ©_Q2'60D0!]f((((þ½((((ÿg|¿\#"&54632#"'32674&"26¿xX>I.+&&,0F$$\_Q2'60D0!]fR((((By7 !#4&#"'632yZ$,=<Xd/L˜33X †GVÿ³y"&462#4&#"'6324&"2M-@--@YZ$,=<Xd/Lþ´$$ïD//D/üâ˜33X †GV &&þI[ÿ¨4"#"54632&.#"32632þ²0_D2J%sXN>(4vª%S!-?* O 7S%&þ[[ÿºo"#"5463253&.#"32632þÄ0_D6,?sXN>(4vª%SPŽ/IO 7S%&þI[ÿ¨n+"#"5463254632&64&"2.#"32632þ²0_D"!"$/sI N>(4vª%S""'3b O~7S%&þ[[ÿºo "#"54675353&.#"32632þÆ1\C>?w\N>(4vª$S;B PŽ/IO 7S%&þÿþ²ÿ§ÿ¼ 4632#5#"74&"26þÿ%,*-@B$$ºD251¤vR((((þþ«ÿ§ÿ¼$463226=3+"&=#"74&"26þ%,*-@!N!B$$ºD251rѸ 22 +R((((ÿVÿLÿÅÿ» "&5462;%&$ .!~!"ÿuQ"*29@%+#5!5>54&'5!53'4'>"#"4'&'6&#Q1^? Bÿ>"">BÜ+§ˆv$'¸ e‹Í*°#6)‹‹"7¼7 ƒ„™ 1#¯oý 0Xæ¹dþç øFÿö7 $#"&536324&"26&./:U$$lD260ÛþSR((((Fÿö7 #-$#"&53632#"&536324&"26'4&"26&./:U×&./:U $$ý$$lD260ÛþS0D260ÛþSR((((((((ÿ ÿöP%*42632#"&54#"463232673#"&#"64&"26>hB&&./:Œ=*s@%(   ,^Z:2$$LNý‡0D260´fJn  -!B ü­((((ÿ·ÿöP(2<$#"&54&#"&546;2#"&546326324&"264&"26P&./:=%$2%&$!+JY>?[Ñ$$ß$$lD260-BA.#!20"#/Y5>YY>ý ¦((((ý((((ÿ‹ÿöP!+>32632#"&54&#"&54324&"26D,%9&&./:`›$$j[R9$üÐ0D260=(!?[:ü:((((ÿŽÿÅ7 #4&#"'632ÅZ$,=<Xd/Lñ‰33X †GVVÿ Ç<2<4632>32#7>54&#"#.#"632#".4&"26V>/%' 22 3W3 ('0$&&( y$$´9?OO?9Þ )0B#&0D0DC5((((þ]|ÿÏÒ5?4>3232657632327.54632#".#".%4&"26þ] C0=,.6PSE 2 %$% <0   :@$$**'41&'!-? ,!$/(%1CN$((((ÿZ›ÿ¤Ž#"&'\Ž’a]–þ»šÿâ]%232>73#"'567#"&44&"26ÿ*%&;7aABS]$6* C/%B:"#'6  þ#šÿ¶]0:4>3263232>73#"'5654&#"#4&#""&74&"26þ#%%   %';hc8 *Tá#0"!** C/Nu >!&''  ÿ ›ÿ§: ##5#53533Y7-::-7Ö;;*::þóšÿïz 4632326?"#"&74&"26þó5>  !&-9&!"'oß'< )& -'+ ÿ |ÿ§"&4624&"2Y-@--@ $$ïD//D/d&&þº}ÿ§µ#4>32&#"&"327#"&4632&÷ %9& ($ 1"11"2{   ? &-!07N74G}6$4&"26"&4624&"2"&462ÑAZAAZí¦ê¦¦ê‰”Ò””Ò%SvSSvîZAAZAãꦦê¦þ|Ò””Ò”8vSSvS<ÿöüž"&4624&"26üƒºƒƒº3SzSSzS"°||°|ÖNkkNMll<ÿôüž,62#"&54632'654.#"3267#"&=464&"26$-V.Ccƒ]\„M<G#+ 7Y1%&  &*>$$9*6tˆLX|ƒX9†5z/L* pIOj/(0!!2S((((ÿó*…=G%"&54632>32#".=4'7326=4&#"#.#"63274&"26 '6F6/ .=eIY?;D.VVaI' + &" $$z^154&#"#.#"327.546274&"26÷*6-gD< 'O.[IE'$/*  -1*# &4&R:$$ -K.Y{UTi[?uFIR$4  p;1J% -"00"8?w((((=ÿÿv‡3=74>=73263&5432#"'&#"#"&%4&"26=<`tt`<9ci{&$bOE B\&& HL'f#‡(Rd©$$£?[3(%-P7GQ74>7&5462>=7#3263&5432#"'&#"#"&4&"64&"26<%C/R(2F2DX;UFgMBbOE B\&& HL'f#‡(Sei 1B$$¡$<&' .#22#XA :W+ -'E(2H&Rh0D0#$ %$\w$î((((ÿåÿöÇ„-774632#"'3264&#"'654&'7632#".74&"26<2!&&2C6DD6!O,F/LX:=TvvT-H) }$$œ*32 "0Gjžj#%.Dz ‰M(|°|(1$((((<ÿñÃŽNX'>54&#"#.#"327.5462#".54632632>54'.'4&"26˜;`<. :}U'$/*  -1*# &4&R/*6-gD< 'O.[&$BC ec.$$Ž*3D:C%OŠauFIR$4  p;1J% -"00"8? -K.Y{UTi[+l$†U33umýü((((<ÿÿgƒ?I27#"&#"&5432;27#"&4632#".#".5>324&"26Úr 3"&‘'–'<@6C&&$5) ([H$2H"mO!£X$$V";/\V5%€>9'.'0D086#4 .-%/@7Uh,Ã((((<ÿû=ƒ=G2657#"&#"#.5.#"&5462#".546326324&"26à ! :"y4P&!-1G&4&9,*D' gD< 56’$$c€#6$CB(3]½#)4G16:)p;M]%"00"./"132#'54&#"#".=4632#"'74&"26cVþ¸%#1V  7#3 .+&& $$7mþΘ7±%56%-,þõ—:'#+ ,# (60D0_(((($ÿô±>ÿ(/7?GPW`gp67&546267&546267&546267&546327&54267&5476;#""&547'"547.'"&547&'"&547&'"&547.'"&547.'"&547&'#".54>32#"&54632#"'32>54.#"32>7&5463246'4#"64'32'4#"6654/'"6544'32'4#"6654'54#"64'24+"64'24'32Y& -% &   .  óø    (   "&&#2& "&¡m5D7&,CD":;"/)-?0 "*)''26?=(1MH!:bD.,&$7  S š \ µ v ã  Ž üµ þÑ! ¹ €  È,MF?,01$; $!L'.  +( 1? $  "("  0(  $ #" $""  ,;<"+  11 : ,4  -6)j34LB¡ *?mEJu@!(T<9T(09*= 8!.&J23I%=lDNt:9`jZ6,fQA1 3 *"7Ny©c=Sz(J/ThM1a?;G3d32632#"&'&/.#"54&#"26„BIwGrP>!"G28;1AD`E_*[((P]‰=$`%MH1 #B/3#1g'*11255DB.. 33! i8D(!H3]”… <…% N Û¬*%"&54>332654&#"#"&54632Xl 4$ 9*(<3#$4?"_QZko ]N"*‘"&&"á"'%$/)/BO[gþâUmM Ô­?%"&54>3326=4&+5326=4&#"#"&54632Vk:) 9(';11$5"#2(]LÃ`! \ aI20  “ '%"òt *%#1 '!BP–j$*e/<M Ï®,92#"&=4>=4&#"3"5463254&#"32Ÿ 6'7>*VkNs2GF2),+©aHI`0;&A9'a)'(=(a>ýûÁ#%#%Á$%M ¿­"0%#654&'"#"&546326324&#"326¿FG12$:lUSmgZFLB8!3&þ¯>"&;=#':ÍXj,4Þ!*3)þ®Pnh\*Nf11"C-þlÞ1*!þ#.)M έ(732#".54>32+7>54&#"­ )9)R84M(’8-%7˜ET)387"#9<þÙÅ+à *&"MЫ-2#".54>3326=4&+5;2=4¸a#>mR6R):*8$"B00 &9%«’b 9&…@Z)<320(3ï1x!(N M§R%.'&#"#572.54326326327>=4&#"#54&#"#54&#"M@1P'f%@U| =F3.¨9/<3<00;©F2 ( ,H,)S''+>&JóD+ #9'& +-H,//00=< x3#%``/%#``1/Z3% BD!MM έ#1%#"&463254.#"#"&546354&#"326Î%T9MrqP6* *%8'wGPp`02&87+&8Ë7F0qžrÁ "6) ((9^oPþ–G6*‘'99L ί%3#"&'"632#".5432324&#"3265Î ,+a 0/*:= %S=%<+ ÀC2E5,)6<%(6¯/ò "O<(>C%&M4R‘þ‘"&#%Á'!1)M ¿­-%#654&##54&#"6#.54632632¿N?17!$0I;%&;&4@pQX-4P5:(ÍTm&8á-$$ÂÂ1*!þM3 wG2Bn$$)H+M έ;%#".54632326=4&+532=4.'&5467Î)P<:A-%;%*8110 =$'W*<+`Ë*@8!@()() Á+$< (  7 $M Ϋ*2673#"54633265+5326=*N0(='Á;=8$50'':S? J6+þ)!«&O/x )4ß G5- L Á¬=%#6=4&#"#54&"#"&'&546?67>32632ÁBP25!$1I:L:('$1 Ixù-. *J4‘X9 Q:V)+W4H"ÉZd0.Á-#%‘‘!',"‹>#%T†w.b'!?100$/&&&?< Я$#".55763232654.543ƒÁ,8)1U";(!RbV-5"'J1À 5ýï!%/')!6fD 0­BO%#"&54672>=4./326=4632#"&547.54632'54&#"3260$5V4p‹c,%]4@9+&0 -"+AO)&=,j#sXÁ0û>B2!Œ^lˆ%lÁ1B8$Ç0*/  6*P './1d#,kÉ1/1#M 0®92#"&546732654&#"#54&#"#"&5432#"'26326›CRÁSn9@ ;%':.Ha%g&®PBþ¯ÁVS(Nz)%#â%$I``) I+ LG @­;I#"&546326=4&+532=4&#"#"54>3263254&#"326@bb'T;Ul@:9N;010$  $O—7B%<$$BLGþÜ"  tV_ ;?%[K%S‘"&&"ñ0H%, &Ž7F$$=œ!L ̰1%#"&546332654&#"2#"&54632557673Ì'Q8Rm=:%'.33% 8"g@3.010’*.9>?TR%&6ª M …®C%.'ȳ.=4632>32#6=4&"#54&#"…BJvFrP>, cAI/5OTFL1+:,U+  %6%27T.# 'A/1!:!h9E1Bc3I-…""ll# T)0#dMÏ­+%#".4>3265#"&54>3326=3Ͻ7S):* 9N9/GO\ 3% 4'-8aÍ¿);3&20  "&&"7X1.208ÁM ÿ®-;%#"&5463254&#"#54#""&463263254&#"326ÿ)O7WjlU4-,H*+NN=",#"BR`>#&;8- =Å$>8 ZfWjò"II085X4?FþBÁ/+ ¿!'&M ϯ!-%#>=4&#"#46326324&#"2>ÏeC 1:VaSV>SÙ"S,A(‘( 3..œ726=4&+532654.5472t#*#T(/X?Õ6( CjB$$$!; %‡1 :!$>&4PB#é•.9J21+þp8WV9w2..'6 L ί%%#".5463254&'&3254&#"326ÎqQ*8/!qO2/7*Hxa7,&77*'8ÌNs )H,NrÂ'8sOþ—+66*‘(99M -­-6#>=4&#"#54&#"632+463263254'"2-  "I 078 :7!”aIH;$$7*6%¾U-.ÁL` 1yyIØ$G1qfBB$$*þa`E þÇM Å­7B4632'4#"#"&#.'326327672#"/#5#".5&#"32MS7, ' !*0-"1.TV .`&66Á%7.G<’& &! ,*É: lR :çÇ7  k б)%#"&557632637354.#"326ÐpPOq0\*7/00‘` *%:+&8ÊNpqP¾ þõah'Ü’ "9'‘ #9Mÿ{/®+%"'#74/#'763273&"7/0(xr6 0%Á~7 7.T‹`##s£*#0Ír VG@*W'$$ +Çñ Çþ‹ N Ï®M37632#"&5463232>=4&+532654&+532654&#"5467ã '0'. U/2)R8Om$% a HH%HH'5R’& 6><65 CH.H x,$(%$7K Ì­DM#"&5463232=4.+532654&+532654&5467>54#"g % %)''N)%&T;WeG8*0F3gZ !!!: ¼3( ' "$5:M03MOEQp;1<‹»„„= $&($ OþâdGK0IR 3­$4%#"'#"5432327&54632326'4&">3-HD26,”/#;&}\CE[W/<+q,8,!SIG+  GVh*OG2þ—*a™20þj'/MÔ®.2+>54&/4?"#".547232>¾iD1Noo$@\<%Q9 A9.#5,L+£ %ß:C3];# (BR%#F­ '5" &M Õ­E2#"5463;2>=4+532>=4.54632".'"Ð%2A '?(Â@9;&** +5+A("D %2;2Ë.43 U&!•I+j  È#&+/*-! 8M έ!,5##"&5463<.&"546323#3'54&#"'"32ÎIJU@YW¼YCEWIII©"6CD4<=„5OICY; “DJCA…`x© ($$`&"þǨ.`H! ¥î(#".5432326=4'&54>7Ù.4.[i32654&#"26¯36"VP$-"+ ! +'K "6%>zέ<*! J60$-Œ+HH/‹ <)3G6"<"¤!  )/A(`d: <#f!/0Ø„ <„% !þð¢-#".=>7;>54&+#"&54632¢½;R'8) :&&87$.*^JÂOÁ42/1"%&!Ü4#$/*AOÀ!þ>#"&'54>7";>=4&+532>=4&'#"#"&54632£gWVk 2#D$:112$ 1%'YO^cb+9RRmYP!))‡)(ïs"&#$0"&AOIGn :-! £­0A%#"&=47>=4'#""'5463254&#"32>£[fUlq9)D,$¨bG58$80'6(`:%&<@ š:VKEaR2, m8"I  lF= 7$(*5!‘Á&% Á#% ! (77432>732#>=4&'#"#"%5.'#"26!Ç#3 -/!/` GI ,%/ 0„Ç) .'&7=F?׸ 67#4Vh & %.%G`aÂ#&Â.0! ¢Œ)2#7>=4&##".546á)9/!;)?#$;$3 oŒ)J/9*&)À0*/-D6Zl!þ,#"&'&5467326=4&+532=4&'52£lQ?i@8 9&(90;%4*c[a(9SZe.&"+2Iz!%#$î1x!%HGQ2=þðŒQ.'.'5632.5432>326732#2>=4&'#"#54&#"#54&'#"D‘zgÏy-;+.¨=> @/<ŸFI &"CH,S )/.U<6þðD_*$ 7S6/5[ x,H``/ !``100b# 2G`! ¢ª&6%#"&5463254&'#"#"&'54673254&'#"326¢oQMrqP6*7)0 (mQPl`5+&86*&8ÊNqqOPqÁ&8/ # @LkSþ–-36*‘'89! ¤®(7227#"&'"6732+".546354&#"326É0S:?"#i%:06(d_ ("(OI‰5,)64+)5¬ :/ò )E,nV'?'RDKý¿Á"&#%Á"%$! –87"&54747632>3#6=4&'#"#54&+632Ž1<2a$A$QY`100$ 1I=#'7" fVI[$Q> Nq00À*%$/$$’!  ¬;#"&'54732326=4&+532=4.54£ I>¬$6. B,.4&O-T  )(!Á+$<$)!þðŸŒ.73265#+5326=326=3#"&546˜;%$< 0, S< `.b/%M5]`: 0y '-Ü G( Mþ##='h@#R! •«=26=4&'#"#54&#"32+.=46?677>3267÷IU F.35" 1I=#&:<*9]b’E}!XI‘DNI(])!h‹Ma)\L?Á,$$‘‘/+#‹(3:-»Rg(<C[N06+%&$! Ô®+%#".55763232654&'5463Ô(J0+9)1U !;(!TI:2„#'J2À 5ýï!%0&~0(9+>*!þðÿ‹FT#"&54632>=4.'32=4;#"&547.=4732'54&"326ÿ7`;t{M: ?8$7%* M18NkaBqW¾(!#OJ1‘^j %5¿f7%Ä$6  /$!55*P (%ZW K oÃ00ÿÿþñâŽ@2632#".54673254&#"#54&#"#"&54632#"'32>º')2@H&K3>>(>:<([G X!   )-‹PBþ³)9&#A)4FEy"$GÛ%#,__*E  $$!þðM[%##"&'54>3326=4&'&5463>=4&'#"#"&54673263254&'#"326   alRLs/ 9&(92. DER@?W<#BGMþÝ16 þ% &D^Ve_G " ˆ!%#$î # H@NLDFG$(C˜04!!þð¡¯525572>73#"&'54>332654'"#"5467Î.E01 0TmgU 7' D &0T6 0HR<Žñ$ýe[Z@ "-$&x'%#Þ3$# -f,E!þñS‹=J%74&#"&'&'563.=46;6732#"&754&"326+ 0C/! 6%LV ï :'"\F#,"/C>_37$>`ä+8,*)öA" S* (/D)q/X9"f7F/DA/@ Dƒ""‚!þí£Œ*#"&'546;265#"&5463326=3£_^Ot>6 9N9/GTWD4 <#,5aT\c]L S  ‘ '&"6S=8Y18Á É­0C743254&'"#54&'"'.'546;672#"&'&%4.+"3265FÂ4-$H=M8%)2”^c4s #+&  4-@ÇÄò/II11%)4 …þœLm6:&‹#  ¿ '*! £®&0"#4632>7237>=4&74&#"26ç(-aPY>RÙ164$WR$2( 61_tþÒûL]C6<;)`"…L!þñÄŽ<%"&'54632#"=4>7326=4&+5326754U)&' 3,0YuÒ7'/w>6##"ü. %  '?IAouæ’.8I0138þu‹M=x6((! £®$%#"&'5463254&'5254&'#"326£qQNqqO2/7*Osa6+&75*'8ËNsqPNrÂ'8qQþ—(86*‘(8:þðå®),#'>=."#54&#"!#'467326;2#åDG$("H )-´Ë>+P&$6‹†ÐbL); .. xx! Òý{,2&8&$þ«þG!þñš¬KX$"/#"5767;>=4.'5#"&'5463254&#".5727632/&#";6š  0%/`C ÄsB*0"9ME8# I ')"bS0  TT³™ <„ 0$g>H#h!;d"#-‰!` L*3EË *  Vû< lS› k! Ó®*%#"&5576;637354&'#"326ÓpPOq0+* *7/00_7)&98)&8ËNpqP¾  þôah&Ý’&87)‘(89þñFŠ9%#"&/#526754ȷ'&#"&5467267#7327F;.L% N''Ne\WeD9(2F3eZ!"!*n'  A«#-1 "$5 @6LLMOEKu<0<‹»‚„=I$'#$ &jL !›4 âŒ*8%#"'+.546;327&=46732326'>=4&'"â;C=03A,E2 &TIFZ…12¸%#(+RH$    ITH'QE4H^? 00x-(x+!þô€Œ22>32#>=./4?"#".5432±$WA hD0Cet4'+N,# Q)8DG/#0/!Ý=4.+5326=4.546;2œ " 07WB'K2!;@&;>0+') **-,4,>'%*E(^;"c):* "G3&M3z$ #ä  +6%6 - ) ! ¢¬)3##"&'54635#"'54623#3'54&'#"'"326¢ISI@Wes¼Y†YIII©6CD4<#„?DJFGB`‘DJI;…`x©*$$`&"þǨ.`H+Eÿÿì,73267654.76?2#"&54>4'&>?632ª#&52**+­\?Z ' !(^4j~D'.> ‹? ˆ³U&*sND , þÕEÿÿëD%#"&5""#"#"&574676.7>3232>54.76?6322>72ë2)9 7  ¢Y@[  L ")$&(< 6-$2V% ú 5,o¦T'õ+!þÅ4W|c+?sV1ÿ× XN7"547#"&546'&676;232?674&76?2?267>;2#"."#"&#Â!ƒH"+8(y+ ++ @M@ ) C%  ;)8%   6PÑ /!X  &N"N0 *&…Œ#  *"ÖX57"547#"&54654?632327>/&76?632+Â!ƒH"+&%!y $ 7  gg  06PÑ .!U  a %:`(2ÉÄ,ÿúàY9I747+".546'&>;2327>'&'&7>3232#"&74+"'326¢¥#$ M K3?  O >W*56m. ØF 3KÔ# X +J%—*0‚—3N )+,  ÿö<a=3232>54654&54/&54632#".5465#"54>54&7>œ!4 g!;8! [&¦7>54&'&?26.#">j#$*N /;-?T" "! *)%/    bX$  %D'(( :'5&-#%U    :#þî ()PRy)!!   G" %011!\37467'.=4?2632+".'.'+"1ˆJ 5 '*., B  GO  K cmñ* M*3u\z2 VqŒ)8¨Q& 2Á\B7467.76?22672#"&'+"#".'.'+"2R'*+ 52/*h$ )'89+7 2K J`rè!B  %F1[:2 1-ŒS  ‡¿+ o%* 1ÿÖü\G7467.76?23>4676;2#"'"#""&+"/.'.'+"&1ƒQ'*+ !' !# ;.1H#    2g Jckí B <$2$3%Z'O(  *!2 2~t1´`* &8#\4+"&'&54>767&74?2632+".'?9\ 7 2(;6  ?## A —l7 * #B+- R4?+;ø7  ˆÁ)2Ò\3A7467.76?232"#"+".'&'+"%4&+;2652‚Q'*+*.P&fVO/, "( 2p>9(/ %bnê!B P0VË.$ Ë/Äc! ^Q-ÿòMU@L7467&/&5&>32"+.'.'.>32#"&732654&#"- R-*)  0%+   5$ <_E(3'%,$ /,d$#Hvú!9  1 .)P0$`C$ -ކ3 ,Š, 8%'  >4*, 1uUVb74>7&74?632?>7>7>32+"#'.547+".'.'+""32654&1@b097    @D 7 ! '3u %=%(@8#"(e>˜!!cI¤zN  00  7&[)$ ¾@  ¿+ !¡] ! M ( !9ÿv\V7"&54>7&74?263272>#"&5#"&'&6'&5467.'.'+T 4K>;6  F !5 4-- 0-8'§%71%() e„c9)4a@'R"L1tA  1 6)00 A Dà8EU  J_74>36=4.7>322+"&5>'.#+"54?"+"#"&5Rwd" O =¼" +3D9 E) BQ7) pBd1˜ "š>8 4 I J/!1 ?j$ ;1oB%S9#  -Jw74>36=4.7>3227>7>#"&5+"54654.'&#+"54?"+"#"&5Rwd" O M[O B@2 )(;c 8%<+ E) BQ7) pBd1˜ "š3 1 5+ $ Q&G*= ?j$ ;1oB%S9#  -ÿÖJq+"&'&=467>37>=4.7>323263>32#"'#"&+"54654&'+"&54?gG_-,  ƒm% O ×C ? D. 3,GH @o_ E3,A=&(  *-.A,+\  ¬Q 1 U " 1 3&T DO@h% $1oI\7+".5467>3>&'.7>37632+"&5>7'.#+"/&5467ƒ, <1){4   "F‹e +:I5 @  7'6#´ ,62Y  ¤(P1W C/"2 b  ])¸J`l74>36=4.7>3222++"54654.'&#+"54?"+"#"&5%232654&Rwd" O [kLRd^K3 %=* E) BQ7) å) pBd1˜ "š'M2*# + (E*< @h% ;1oB%S9#  -ME"’n4.'632>322+"&5>'.#+"54?"+"#"&=4>3>54&#'56 -'"* 1'=¼" +3D9 E) BQ7) Rwd" 1)6F     = •>8 4 I J/!1 ?j$ ;1oB%S9#  -0Bd1Œ  IZ74>3>4'.7>376322+"#"5475.'&'"+"&547+"&58O_G   "_oN &  (  B:S+, p5W2" -S%!— @) 7 9 %@#'9)" (ÿtÂIk†7+".5467>3>&'.7>376322>#"&5"#'#"54654&#+"/&5467#"&54654&767272632ƒ, <1){4   "\qO– )(9 $}] @  7'6#29,& U57  ´ ,62Y  ¤'Q5C   0 6+%QEU b  ])à 'K69\]¥F]ln%".#&#"#"&54>3276323632363632#"5+"&54?>.#"&#">326?64+">3>k #T(0&DsB#* $%.  ?>,i) =   6 <$ - % ^ P9 . (1þa 3(LQ; *7Q/!  m) &f3."',@& 2ªM1¬ {¡:\O¥Tk}%'.#&#"#"&5467632326323632326327>32#"'#'&+"54?4654&&#">326?63232654&+"k#T(0W*HR1B6$.  0 E.9I,! BJ;.@, )/# y?$ - % ^ à )=1þ¤a2&5m248" / 40B %#€) *×"',@& 2ªáv2º7.ÿÖ(d[v€4."###"54>?3263232637632767>32+"'#"&+"547""+#"&5464&+"##32723267676;?, ';PxmŒHÍà  ‰  '  C$!4 NH  @"[$) ($   *$&LýfNJ/]I ©)\9X)   3þ®1% . 3JMÂ(Z ) W) <>(Ð#E.—d8Wa%467"&'&54>'.###"54>?3263232+"4&+"##232632632676;?¦4#Ll %  ';PxmŒHÍà $‰A!Š  *$  )  ýfNJ/]IJ&œD  %5'*©)\9X) *.4þ°2&þ! Y >H(Ð#E+ÛdEdo€%>7"&'&54>'.###"54>?32632322+"#"&+"54&+"##2326326326763?"326=4'"&#¤?Ll %  ';PxmŒHÍà $1> Nq&6,   1‰  *$  )  ýf NJ/]IŠ %"5[-¦"  %5'*©)\9X) ,.0‚†##*  A½! Y >H Ð#EþÍ+ );‘dAS`3"5467>7&547>32$32#".=4&'#"#"+"4&#"#326=26=Jƒ ½311546 ?toR$E<  %  'R&  1 Ý%355"þJR* 6 #… ^81  V?6G ) !^/JN&O0'Ú/1376#".=4.5+"&4&#"#326=%346.+7N."š| 0û( VC¸x Ò1/?6372632326327>32+"&5##"&'&654&5467&4&#"#3263272>76;2?¦[$)  '$ : ˜(I?PzY$›šl   ‰ ^W  /*;[Tj9,( fƒ Šf $&&  ýeNM[~HPÂ+Y!¥8 9#2K&2'3þ®/  * 4-&I 5 Î'W*CL$ÚO>UÐ[#"'#"&'.54654&54;263232?>7>'&>7>4&54;232654&76;2632(T7674&7>7>54&54;26323254&76;2326ò*(:9 6k)H4G 5M L 5   + 'hC5‡  · 7+ 6- #2   !Ÿ0!  *  L( 7U ‡#>H .* ÿ×L9~%4>7"'&#+#"&54654&56;232>7>&?>54&'&6;263234674.76;2363>32#".#"+"'"&+"Ö%`>{&$, ;&    ' IV A t "G+ /2$  . $M0pb -$U  _ !    (8]#  7"þ¯65!- ²9a%467"'&#+#"&54654&56;23:>764?>4&5&6;26323>74&76;2+"&Ö6a>{&$, ;&  & IVA t BT0¸ -$U  _ !    &904þ¦7!!CEDgu%467"'&##"#"&54654&>;2;2634676474>54&76;23>'&6;232+"#"&+"7.#&#326= ) +II#+ ,   # / % 3ž  @ ] XcDO%  1"Ó#- V+ž?1#V ))) %>  &:43+4 4/þÿ54'4;23654&6;232654'&6;2#"&"#"/&+"vw>)Š , "!= < gL3=2b<$ X>, "Ñá4  #'[  n!3D >1' 27.+"&546'4&56;232632726?654&76;23274&76;2632#"'+"`:kH%"+=" 3  0 ot 3   -aAZ8ED8 7b–1#b  !N' U.)2 f; 0;(`\cÿvG8‚%467"."#+#"&54654&56;232>7>54&5&6;23>74&76;237>32#"&5+"#"&'&>'&5467&×5#A& {&$, ;& $ 'IU @ r  0V 0.8P 8h15' eƒ S4±  -$U  _ !  X;-6"$þ¬6*0 6)"Q & $0ÿ÷+2"'#"&547>7>372327>32½I5#MdvDX. G $9DE9$0(915(  * , B7^T/>E2  -M71.0A%+5   RP&F7467"&54>=46;2;2>#"&5#"#"+"&Ä9TGTG - /BB/7L (O2*2*:  ? 0 m!'(A&9 " *=$ 0   4 4- u !1&746;232654&54?2632#"&54>765‘ 0 '9.9 r0;Ž* 0L0y!4O$@9K k  #@-, IS% 2!+ $#,3'F6%) GM0ÿðÄ'N%#"&5#"&54>76=46;2632327>;>32Ä()::$$f<;\B_aJ -  7MPN7+#!) Oy i 5," & '5=6W>;P0 -J5/< %)$/'=" *1Ž+?K%2##"'#.54>74>?263232>7&547>3>32654&#"3%6%B@N778!?\]F 8 ;9NL(/,!$<Hy+$ð4(0  2#3V@?V2  ,J8)2=M"= #/ i*,!-ÿÿ'G%"'#".5&54&5>7272632;2#"&5"32>7>732½I0J1*,sd:/ X 1+A)5"H3 1@(  * , 2$& 2 ƒ–  +3Fš• $ "#  -ÿÿ~IIW%"'#".5&54&5>727263232632#"&#"#".47#3263>7322654.#"½I0J1*,nh1 *"E%73<9"- >MU)G@(  *! $ , 2$$ 4 ‚• 5(&9 )'„r–Q'"#  ( #0ÿñß{r".547>5"&#"+"&654&5&632726;23>32#"&+7>;>32#"&5#Á/.TVR46. (=  8HF* )$6,#3#8EG;+EB!) Oy '):#*  U / !!,G06R8  ! -$  )4 # /L4-*->& */ '=" .5, ) %-ÿûHE4674'4&546?26322##"&5>54&#"#"=4&-sO C ¶ 9G)45! 3& KZ0  1 ~"à $J¿ 71'M5!F<,C -ÿûHe4674'4&546?26323;2>#"&5#"#"5465>54&#"#"=4&-sO C šHF2 1*9] ;E-D]3& KZ0  1 t6  2 6,  ?; j¢8/_MB7+C ,ÿÛH[4674'4&546?263227>26467>;23#"''&565>54&#"#"=.,vM C gO @"  : @K,Œ F+B`2 ' J\0  1 FB%Ó + 4^«!80aM%%G8+C>v,ÿûHI4674'4&546?26322##.45>54&#"#".'.,f] C ¶ (A//;)3 %7b0  1 ~"à  n¦-6!I2)7(4-ÿûÏHN\4674'4&546?263222+"&5465>54&#"#&=4&4&+;26-sO C ¶ Ñ&6,1F, "0' 4% ;"1 'K[0  1 }“M  j¤80$A)82+ @Ÿ±! 0 -ÿûGDF4675./&'&37632632#"5465>54&#"+"=4&7-h= 6& V°YE*Bb2 & §GZ =aà# v~580`N%%G8+A £Â-ÿûHP4>74'4&546?26323#"54654&#"#"&=474&-CS, C IR  9 @/19'  8  "1N& 0  1 ?7c/ˆ+6!E.; $+ 9: ;3.ÿt G\467&76372632236#"&5''#"'&6'&7>34654&#"#".'4&.€B C  · Å ((:;8T2%() ¬)E+19'  7  $Cbd H{5½/-&1 8) 11 A  Dì80"F\A  >ÿûpg2>7>;2#".#"632#"=4&5>54&#"#"&/&546?6=##"'5>54'46?6‚@ ?;N!C* $F%* 1$=2<99&.5$  Z 6E(,P1 !X3 # 0 ]5*Õ" ( +Ë6)#G/‚# +E;;2M Z! " ÿû €2>7>;2#".#"2632632#"&5"#"#"54&54654&#"#"&/&546?6=##"'5>54'46?6‚@ ?;N!C* $F%* 1 M;?o(+7 ) S9&.5$  Z 6E(,P1 !X3 # 0 ]=) -, 2 8(u 0#Î1*#G/‚# +E;;2M Z! " ÿÜ0v2>7>;2#".#"632?>763+"'&54654&#"3#"&/&54676=##"'5>54'46?6‚@ ?;N!C* $F%* 10-= Q!  4 P W1!<#-5$  Z XK,P1 !X3 # 0 ] /@³; * 0 3$ Þ0*"F.ƒ5  +E;;FM Z! " ÿûpc2>7>;2#".#"2632#"54&54654&#"#.'&54>75##"'5>54'46?6‚@ ?;N!C* $F%* 1ž X9+:h 4 2F:,P1 !X3 # 0 ^p-¶* 0,Ê&.\CK'P (D&d! " ÿûÝr‚26726;67323#".'.322+"'&546=4&#"#".'&54675##"'5>54&'6;234&+;265Ô8C9^  /0# FR Ð%6,u 8) "+# Z  mGBO1  &.! ¤"/ '& 8  4  ]52~M 25Ä$, $=&\1 ‘M_ e""þ73 $ÿûŠy4'6;27263>76;23#".#63#"=4654&#"2'#"&=4&=4>75&/##"'5>[5 X8(!#!5$#'  4MY9&>Y  <  );57 1 "l ! !  -  02<#¾ 0.¬+4(^Kˆ (( d%A' TA"ÿûpr2>7>;2#".#"2632'&54&54654&#"##".'&54>76=##"'5>54'46?6‚@ ?;N!C* $F%* 1 =]  h8& ",$   R  6-!,P1 !X3 # 0 ]3;\ . e#,":$'…    %;' Z! " (ÿ†‰4>75#"#"'"&654&=463272>72723>32##"&+2632;2632#"&5+"''##"'&>'&763;&546=4&#"#".J2G:,%-  '08   " HC1 *  ))"5Ÿ#$V +(9. 9U9,+ ?<>=&G[ 7)E'c   ! 5 A $ Rp¶:  1 7+8C  6©( .)h8G A4@ÿý{G=NZ"=4>7#"&=4>?4654.76372632###3263>7%4&#">-  '0R7L[P   _ &J@-YQ   *|K !"L9!!))GP +;  M2L-# $‰ (>Y%1+& –"@ÿýŽGTeq"&5>7#"&=4>?4654.76372632#>7272>32#"'""33263>7%4&#">+'0R7L[P   _ &J@-YQ ) 6)! +3J .  Z‚K !"L9!!)$i +;  M2L-# $\&241 (>Y%1+& –"@ÿã€GJ[g"54>7#"&=4>?4654.76372632#2367>32#"'&3263>7%4&#">,  '0R7L[P   _ &J@-YQ # C- ;*5CáK !"L9!!)5 K4 +;  M2L-# $– !,!* (>Y%1+& –"ÿï´GGYa4>3>54.6372632##"&54654&763232;267>7"5473272?65654.'w>]K   _/X$/35$3Rj8)3   A -U:)x% !0 âm",+> - 3 38*8))> 0 %) 6CC* >&@ÿý{G8IUc"54>7#"&=4>?4654.76372632#2+3263>7%4&#">4&+;265,  '0R7L[P   _ &J@-YQÑ@>&&œK !"L9!!)!, *4 J5 +;  M2L-# $;L% (>Y%1+& –"ÓJ?ÿý{‘Pbn4&'5632632632####"=4>7#"&54654>?4654&##"'5>3263>7%4&#">®B34 %- &J@-YQ   *  ,1N6LZQ  ") K   L9!!)X 5J-# $‰ )GP +:  T þÍ&>Y!2+& –"Aˆ3ANZl%"&=47"&'.54>765654&54>32632#654&#"32?4&#""2>7>5N84 FTI>"F.**?+0"I^ 5:>K  .#7 &k( % ù-4 2< F / .&, ,(= ( $ 7 nS$.Y MY$-- @ÿýGUfr~"=47#"&=4>?4654.76372632#32326;2632+"#".547#3263>7%4&#">32654&#".!'0R7L[P   _ &J@-YQB )+Q )52; %F(W   QK !"L9!!).#$)“ +;  M2L-# $&6(%7! I(>Y%1+& –"µ*")!@ÿýñGq‹"=4>7#"54654723274654.763726;22>54.76;232632#"&5"&+"?####32?%4&#">.  8+~å   _ 0b 8 A R 4'8/$ Oÿ¾zGgr7"&547467>7>54.763722#;2+"&54654#"#"&#&#"&'&654&76723>7&547732767"267654.'ØLNtM (   _ w^$$WT 4 .   8 '&9  % #  ^ 4{JzI Ó%:F 7/6?8 7& ,  T $4  6  HÒ j 1zL2€* ÿlzGOgr€$467#"&54>7>54.763722#32"'"&"#"&=4654.7>7'263767>57">5&'4&+;265 !WB2IH7   ^ w]2XO-1:(.|u  ^;,&%yG[  -'ôL.M="'$ +<j"!0D? 16@8#!>M 1 ï 7=>,!“ œ ).S þÅ:@ÿý¶Gfwƒ"=4>7#"&=4>?4654.763726323:674654&76;2>32#"&547####3263>7%4&#">-  '0R7L[P   _ ?Q /   D '+*4/˜Y%1+& –"ÿýªŽkv~4'6323263:32>'>3232#"'6;2"#"54?65"#"54654>?#">32637%&#">L'/ ! !l#%.  @" 5+JA' Â!0BX   T!6Š6R?@! V1!kA&Mb L:, 3] ` #   <5 @.<%7 ‡! !é-— ,K¥,ÿýªŽŠ•4'6323263:32>'>3232#"'632"27272>32#"'"#"#"5765"#"54654>?#">32637%&#">L'/ ! !l#%.  @" 5+JA"Nf '/7 % 6)! +3JE  W6Š6R?@! V1!kA&Mb L:, 3] 3+     &24  4QQ<%7 ‡! !é-— ,K¥,ÿ㪎s~†4'6323263:32>'>3232#"'6;2";67>32#"'&#"5465"#"54654>?#">32637%&#">L'/ ! !l#%.  @" 5+JA' Âb‡  # C- ;*5Cl 6Š6R?@! V1!kA&Mb L:, 3] ` ** )h !,!* 0–<%7 ‡! !é-— ,K¥,ÿïåŽhq4'6323263:32>'>3232#"'632##"&54654&763233265#"547232>=#">2>54&#2635‡)- ! !l#%.  @" 5+J`e6 :S5"-Xj8)3   !GCe21„Ò@" V1!D %.;Ž "*', 3 b%3" !4,)> 0 @L 8x_! !ð-1¬–  ÿýªŽgrzŠ4'6323263:32>'>3232#"'632#"2+#"5465"#"54654>?#">32637%&#">4&+;265L'/ ! !l#%.  @" 5+JA"Fq9D4Ù@>#$+! 6Š6R?@! V1!kA&Mb L:!-% *, 3] .4"  "K& 4Œ<%7 ‡! !é-— ,K¥,Ç1 $ÿý¶¥tŠ%"&=4>?#".>7"&+"&654&54632;2326;26?>763#".#""76632####"547"'32637>5.# T:6U8: n) ))9C!  - -%7"   )9"'(G!<;# YU   +" +'@ Ì&$(;5Ò %6 ; " ;%  9  (  ‚ 1¦I.—!<"-Aˆ¸Yp}‰›4'56322>32"632+"&=47"&'.54>765654.5467&'#"'526%4&54;2632#"&546654&#"32?4&#""2>7>°-'"*& *5H3& 0"I^ 5:>K  XN84 FTI &&-5 #V <  8'#t.#7 &k( % ù-4 2< l  " 9* '!( $ 7 F / 7 (#   !2 #ëS$.Y MY$-- ÿýŽš¢®4'6323263:32>'>3232#"'632"32326;2632+"#".547##"54?65"#"54654>?#">32637%&#">32654&#"L'/ ! !l#%.  @" 5+JA( 9=$1v( G (!R 18O (_  R!6Š6R?@! V1!kA&Mb L:-#$, 3] ( %  "$;! 9 5 @.<%7 ‡! !é-— ,K¥,©*")!ÿýñŽš£°4'6323263:32>'>3232#"'6322>54.76;232632#"&5"&+"?#"#"54?65"#"&=4>?#">;7%4&+">M)- ! !l#%.  @" 5+JA!'>3232#"'632";2632+"&54?'"#"&""#"&5>76&54;263&5465#'.54676?#">;67>=4&#L'/ ! !l#%.  @" 5+JA( 3?."HT 5 0< 7 F' `  6P /.FB@! V1!iH,É$,=<, 3H %    *D)    >: "   –35j! !ä1|8- ."9+ÿOªŽŠ—¡±4'6323263:32>'>3232#"'632"#"32+"&#"#"&=4654&54>7&5465#'.54676?#">;67>=4&#4&+;265L'/ ! !l#%.  @" 5+JA#>?&#CL  f]%7* -# ^;+%%/r, 6P /.FB@! V1!iH,É$,=N1  œ35j! !ä1|8- ."9+þ§1 ÿý¶Ž‘œ¤4'6323263:32>'>3232#"'2>323:674654&76;2>32#"&547#"#"54?65"#"54654>?#">32637%&#">L'/ ! !l#%.  @" 5+JA *J>/   D '+*4/˜ê   T!6Š6R?@! V1!kA&Mb L:, 3] 1& EV   2 BK  <5 @.<%7 ‡! !é-— ,K¥,ÿüé4B74&54632""#"&=465>54654.#"#&546 ªvOd ,--;`  %aÈg|I<4á5" . $³3&4dt ' À=ÿü×4V%"'"#"&=465>=4&#"'#"=4&54>3267>32wK  0 >0/1 0 ' 2EV=Nc* G) # <í3*d4!  $ - "½5 4?+W;þ÷@>Á5S- F:h"/ ÿÚæ4I"'"&546?54.#"#"54&'467632?>3†Iœ' 00 2 & 2HRQ)LA<G.!B&4")#ÙE / -X=)[i ;E‡G>`#)?24é8 !- ÿüé4?4>32""#"5474654654.#"#&54654&2GV<Od ,&' AW  P $ Z4R. I<4á5H, à / oQf '  ?Pÿü«4CS232#"#"&=46?4654&'#"54&54>4&+;26,:;%l]"4&"WJ6%1  0 ' 0DT=0"3! '4 7&-¯, #";­%E.@(R7'{vA?¼6T/ þ$ 1  ÿüá4J"&54&'#"&5465'&7>726?>32#"=4654'&#"9 `B$% ® K]H*K?   ( !E// @!*3²% 3A 3 4L"@1*þó(D 0ì4.;+X;þä ÿüé4/4>32"&=4654&#"#"&=4&1DT<+LA E.D.+5$51 Q7U/ @2(& #% 0='R8þë !"*±ÿtÃ4\#"'&6'&76727&5465465.#"#"=4&54>3232>#"&5'&#"#$8-)% x3!5)@V  F) 1FU=*L>"E22 ((:<A 8 &I; #6ç7++oR59)  A W4R- @14å6 '  1 6*ÿÚÿü7È(k226372>7632#"'##"ᘖ&'64&54632""#"&=465>54654.#"#&546EDŠ6  :+4H$$ S26. ªvOd ,--;`  %©2    )"3  " /ý¸Èg|I<4á5" . $³3&4dt ' À=ÿÚÿü×È(226372>7632#"'##"ᘖ&'6"'"#"&=465>=4&#"'#"=4&54>3267>32EDŠ6  :+4H$$ S26.WK  0 >0/1 0 ' 2EV=Nc* G) # <©2    )"3  " /þD3*d4!  $ - "½5 4?+W;þ÷@>Á5S- F:h"/ ÿÚÿÚæÈ(r226372>7632#"'##"ᘖ&'6"'"&546?54.#"#"54&'467632?>3EDŠ6  :+4H$$ S26.fIœ' 00 2 & 2HRQ)LA<G.!B©2    )"3  " /ý14")#ÙE / -X=)[i ;E‡G>`#)?24é8 !- ÿÚÿü7È(h226372>7632#"'##"ᘖ&'64>32""#"5474654654.#"#&54654&EDŠ6  :+4H$$ S26.2GV<Od ,&' AW  P $ ©2    )"3  " /þ±4R. I<4á5H, à / oQf '  ?PÿÚÿü«È(jz226372>7632#"'##"ᘖ&'6232#"#"&=46?54&'#"54&54>4&+;26EDŠ6  :+4H$$ S26. :;%l]"4&"WB=%1  0 ' 0DT=0"3! '©2    )"3  " /u 7&-¯, $ "ÛE+G(R7'{vA?¼6T/ þ$ 1  ÿü/È(s226372>7632#"'##"ᘖ&'6"&54&'#"&5465'&7>726?>32#"=4654'&#"=DŠ6  :+4H$$ S26.! `B$% ® K]H*K?   ( !E// @©2    )"3  " /ýS!*3²% 3A 3 4L"@1*þó(D 0ì4.;+X;þä ÿÚÿü7È(X226372>7632#"'##"ᘖ&'64>32"&=4654&#"#"&=4&EDŠ6  :+4H$$ S26.1DT<+LA E.D.+5$51 ©2    )"3  " /þ¨7U/ @2(& #% 0='R8þë !"*±ÿÚÿtáÈ(„226372>7632#"'##"ᘖ&'6#"'&6'&76727&5465465.#"#"=4&54>3232?6#"&5'&#"#EDŠ6  :+4H$$ S26.8-)% x3!5)@V  F) "9@E0Oc69,? *':!8C 8 ©2    )"3  " /ý:&I; #6ç7++oR59)  A]+G-!I<4æ6 1 6+%ÿý´GW%467#"&=4654&54>7265>54.7>32>7>#"&5#"'##"#" i3%&).Z*   R f"G 1*9"; ' V. ý- 012  *7  d   1 7*þÑ%ÿý´Gw%467#"&=4654&54>7265>54.7>32>7>#"&5#"'#>?67632#"'"##" i3%&).Z*   R f"G 1*9";  !Q!)5K  &,ð5 012  *7  d   1 7*Ö-. 3  %ÿã´Gj"54#"&=4654&54>7265>54.7>32>7>#"&5#"'#7263>32#".##- &i3%&).Z*   R f"G 1*9";    C-  +5& 1! 012  *7  d   1 7*<Ç  $#ÿåüGg4>74654.7>322>#"&5"#"##"&54>'&5432332>7>5#"'&6'.˜2Š5  T %M22  +(8&%  '5Up$ 2 ;5I&A% *&Vr ; V   7* (#):+,  ! 07&< $3 ?  %ÿý´GVg%47#"&=4654&54>7265>54.7>32>7>#"&5#"'#2+#"7";26564'4# !i3%&).Z*   R f"G 1*9"; ÒA> . ~ $'H4 $ 012  *7  d   1 7*ÒL% *'%ÿý´‘h>54.5+"#"&654&54632;2>7>#"&5#"'###"547#"&546'&54672>38  <  #551 # wG 1);+3    3$l +,$ /Z-5 v W " AV   3 8)H É .   #( Cÿø—3Vc"&54>7#"&54654&54>7265654654.54>32#>67672#"&5+654&#"0 cG& &)\, (;37J .'& )- 4(8e  PV.#7 E:$CJ<95 #4 8,!2 ,   8)z/4# wS$.Y 'ÿn´G€%4#"&74654&5467265>54.7>32>7>#"&5#"'#2636#".5&#""'#"&54>'&7673>3& &iA$)S–   R mE2*9)  "‡ 3%0 # 4W&  g <1  4A 2  *7  d  2 7*:Û  3 *' .# ;ÿþÖzo26;>7>323#".#"#>76#"&5"'3##"&547#"&54>'&7>;>?##"'52654'5>323&o& :C6;*8% H x\   "$+8d $%f$ & J L [ t !1"" !$,#3h  +9(  þÖ  +  !2  "   A# ;ÿþÖz26;>7>323#".#"#>76#"&5"'67272>32#".#"2##"&54?>7#"&54>'&7>;>?##"'52654'5>323&o& :C6;*8% H x\   "$+8d& 5)! ;'% < $%f$ & J L [ t !1"" !$,#3h  +9( Ó1 3.  C'š'  !2  "   A# ;ÿÙÇz„273263>323#"'.>76#"&5"'?2>32#"&'#"#"&545#"&54>'&7>;>?#"'5>54'46½@ §6 C6   :; %x\   "$+8d (;4$  8%0 $ f$ & J L Qv  :S3% 2 " 3h  +9(  /U  /  '  !2  "   A"1ÿåz763237>323#"#"&'>76#"&'#"'##"&54>'&5432332676?#"&'&654&54732632674654654&#+#"'5>54'4632aa YC6." $. 7  u_ /(74)Vz9(2 A 3[b2%&nR  Ou  :D $- s  !# 7*dV%0.: ! %?e  215  ;A":ÿþÖnu‰63276?6323#"'>7>72#"&5#"'32+#"&545#"&54654&546;>?"#""춮'46324&#"#326;265ø° W H:02Fa d ,+ '(;G.Ep&6,#"&f$ &D(L "! ;,!:B' .! '. '"3 —  )6) Ê#) &  "4 1 Œ"!þ6Xý74654&7673>?#".>7"&+"&654&54632;2>;7>323#".'32>3>#"&5#"'+"545#"&u  dL : o) (:3 K 5# :@"-R 8 l` )*:H @Ee3%'ì7 ˜+  (7,   0' S    )  ?2 c¾ 2  878³១£³>54'5>32:;5&54654&76;2#"'>72#"&5+"#"&5467#"#"&54654&476;27254654.54>7'&#"+"&#%112654&+"ƒ$ %#)   # Q  ?0$ +W-_B9 (,9A  O L -%&4T  0 nj*! /  C#' #  *  (+71J   8 >4$ 8('Š '/  9  (,(  ±/8%R ;ÿnÖz—26;>7>323#".#"#>76#"&5"'326#"&'#"'""'#"&'&>'&54>7&547#"&54>'&7>;>?##"'52654'5>323&o& :C6;*8% H x\   "$+8d °  &,7*  0V% ) -x( f$ & J L [ t !1"" !$,#3h  +9( þ× &700 #3  #  #  !2  "   A# ,CW43232632654&54;2;2+"&546754'#/&#"#"&="#"&546'4&5U!g 7 A:  E7   ‡++'"»C  % S %Ü*Ó  *8=  ÷Cn4;2326326=4&76;2;232672#"&5#"+"&54654'.#"#"&="#"&54>'&4J ! d 3  :,?0 (*9-    E:   ‡$ ' », 'L#C 1 7+ 8> *Ý!   "1  ÿÖÿCr4;2326326=4&76;22;2?267632+"'"#""&+"54?464'.#"#"&="#"&54>'&4J ! d 3   (": & \ 0" M -0   ‡$ ' », 'L .Ô 0 - 3?Â6   "1  ÿÛ%CU4&546?6654&54;232##"&54>'&6;232>54&'.+"5465#"&'&6LN}) 7 ?2@n;$1   J-WX6 3 R*% * ‘  C  % S w-+?!7$1   A-f!  $5  =ÐCVc43232632654&54;2;22++"&546754'#/&#"#"&="#"&546'4&326=4U!g 7 @'ÌCB#@8   ‡++'"É .(&8»C  % S %žL% ,Ú   *8=  þ× ( 7DV"5465"+"&546762725654&47632;2;2+"&546754'#/&#"I0Z 0 ’V  5  A:  E7  ‹!=8  I`  %N %Ü*Ó 0Ndp47#"&54654&67>727>32633>72632#"&#"#"&5473273632+"&54654.+"%2654&#"(DG+5i1 h-#?<,/5 . #,),+N*    = = @!"=,$=8 1 &,-C $$ !E0=>A55   ª-&‘Ct432632654&54;2;23263232632#"&#"#"&547#"#"+"&546754'#/&#"#"&="#"&54>'&2654&#"5W.U  7 BA! ( 8*56- / 3'47 -  E7   l2%& •2  ºC  % S ) 6'(67&! ­ ,Ô  00"û!!'–C‹43726326=4&76;22;23234654.76;2326#"&5#"&4>7#"&#"+"&54654'.#"#"&="#"&54>'&5W.< 3   (!4  ' .0„  2'<œ    E:   l15& º, 'L ,1 4 n " 7, 'C#0 *Ý!   "P$ÿ TCy43726326=4&76;2;22;2+"&54654+"'#"&54654&54>7&54654'#.#"#"&="#"'&6'&5W.< 3  ;1; 7  4 '!& ¹<-$…¾ <  l15,' º, 'L 8³ %.  T   ,T2´    "PDÿƒ³Cp~432632654&54;2;22"#"#"&+"'"'&6'.67>7&54654'#.#"#"&="#"&54>'&4&+"32655W.U  7 ?oW"5$ $ o2J&"/x@ ;  l2%& ) $)&ºC  % S ' e-  87?     00"þÜ6 >Cu432632654&54;2;23>54&76;2>32#"&547+"&546754'#/&#"#"&="#"&54>'&5W.U  7 B9 7 E 130  G8   l2%& ºC  % S !+ VZ 1 A 2t,(*Õ   00"0ÿþZB6;2#"#"&5476&+'&'4654&#&636BAi †_! 8B$m /è    …  kÿþAN%"&5#""&=4'.#"#"54654.54;6322632326Ñ*7, "  I ‰ '  & C")‰ *š6,%?B!   ! k   k M  ! lÿìÜAB"'##"&5476&'&"#"54654.54;63276327>3}J; F u'  & ""ˆOI,":3  ! k   k þÑ"- ?)E#"&'32632632+"54654&"+#"54>726726323(7"*:3(  l' <84 ?*O2 5 \ » 6) a:@D  ) ‹R'5," /]¢A<J%++"54765&#"#"54?4654.7636327226=4&#;¢(:-#91w0 #G-J^«(!+ ! V! % " @ ! i ^;)W @ 2ÿþ'G4&#"#"&=4654&54>?632;2#"'4?>'&+"54?66 -2#&3N=n  P9*m G  t  N  ó   563   4 Z# ?ª ¶ D!?fP\"&54732>7276;632+"'4654&"+"54>7263>32#"&#"72654&#"u",),+ )  ?. ( C@$3@/# 8)?> ' ; .>!"y'! !E0=>’  ( • Q+F( - ! -&%ÿtk)e46727&4654.#"54>7>32632#"&'3263263237>#"&5##"&54654&;2R4! > E)X<« -(5"*:3(  l)I!  ((<=Uj<0#  S5A0( 2 6) a:@?d  " 4, 1E0 IÿþÁzn4'46323>7232>56;23#".'&#"#32637632+#"&5454&#&54?654&+#"'5>; b &[..& "  & z#ˆ2 $s !" /.  F  ÿ    N A"Hÿþàz2>7232>5672#".'&#"#32632326#"&5#*##"&54>76'.'"54654&#"&##"'52654'46?6µA 2&B &NE% #   0% ‡ **7(2(  <D& E (z !S3 +/ _   5  ! 6,cW  +‰V% j @#" HÿÙÅz‚2>7232>5672#".'&#"#32?263272>732#"'+"#"&54>?>'.'"54654&#"&##"'52654'46?6µA 2&B &NE% # &$F G /* :+3N *+ 5 O E (z !S3 +/ _  D•+  )"3  !§ % j @#" 3›—„2>7>32#".'&32672636#".'"&#"32632632+"&54654.*##"54>7>26&67#+"'5>54'6E9cN !*  8"$  $/)   ( #H4E& n(  +0 @&# 4 O1 o2  . : +V?>=˜ ” Q6$ " !#+¥‰l2>?672326763232#"'326372632++".'4>?65.#"&54654'#">54'56"32632>5654&#&šD ( % 8  Q 6+GI'*¦(:.#9 b G;-"0A-$a32 . 4k  O9 @! #Î  i "!þ,]  6ÿýv”~&>7#"#"'"&>54/&54322326;>7>32##"&+"2;2#"#&546?4+"54?654&'"#"&74654&7>3,*  5)GV.  >'&  .)!4+Q1¯6s)!J! ,3&' vÜ     6( ",     `" ë #  < 8  553 3Η‹4'632723263>32#"&'237;2632#"&#"#"&547.#"32632732632+"#"&54654&###"546747#+"'5>2654&#"i 2B §  , N"   3+ 4E -:4&!/# 6 *%<4D&L)  ! B @w: 4 Q0»$$ 2$ 4 >) &)"$ X@;A ’   TF[E"#²+6ÿtˆž·7"54>76567#"+.>54&5432;2;26;67>32#+"&+"2632#".'"&#"+"#"'72>373263237>#"&5##"&74654&546727&4654."+›?:DA2 ,' 5)F3 0  ?' !*  T ( # % '%I!  ((<=Uj<0&2R4!- íP5J!  !5("- # &5+ (/$"$” " 4, 1E 1   /8M7467#".'&6;2322+".'.#"#"&+"#"&5/gvX L)7  $,;,  H 47L ;  $GËk: u ' 4.U% $O-&?  /Ç8V7467#".'&6;232232672#"&5#+".'.#"#"&+"#"&5/gvX L)8+rT *?0 1*94-B  63N ;  $GËk: u )5J 2 5+#y "V1"¢=  /ÿ×*8a7467#".'&6;2322272>7632#"'"&+".'.#"+"&5/gvX L)8+, 6 #)5K:  M , 2; $GËk: u )' Z/9  ) 1  $A$   &s7 /8I74675#"&'&6;2322+".'.'"&#"&#"5#+"#"5&5/‚VT L)8;'3B. $#A   +# %B•K”,)^ u(  |{ "R0 32 % /Û8Xd7467#".'&6;2322632++"#".'.#*#"&+"#"&5%4&+23265/gvX L)8+ˆ+ aT&7/A  , : ;  E#$4 %$GËk: u )-L. "T.   _V Ei(Lj4'5>32#"'>4>75+"54?>32;26;2+".'.'"&#"#"&+"#"š) hN-3r:OG+1   2  ' /7-  4    [ 72# þ50t\C   -      5.d, #S0  sO% / 8G7467#".'&6;2322+*.'.#"+"&5/fwX L)7  $'@-    2 :5HL !HÌl: u '  #" +"&Ÿ> ÿߎv4'632326;>7>;2#"&'322+".'.#"#"&+"#"&5467#"'&'&"'#"Ȏ8#! 1'B(+B$    9&/07  $,;,  H 47L ;  gvK  (}# 1 L/ ' 4.U% $O-&?  GËk ` @#BÿümU74675&'&54?656&#&63637632632#"=46=4.#"#".'4&B:   $'OQ33 #& )# 4Q#)   ÝLaS! *k/ 5$ þõ B.¹+(vŠž   nAÿüÑmf74675&'&54?656&#&6363763263272#"&5##"&54654&#"#"5'.A;   $'OR%B7¯ '*99     7'7P .& áJ_S! *k/=0?!   6* R ) # !(ä-8w‰œF,UBÿÛômf74675&'&54?656&#&63637632632>6467>32+"'#"54654654&###".'4&B:   $'MR>b C#!  1 M ~) ;%5O )   ÝLaS! *k/;Cè#   ,3D ¸91y‚    nJÿümJ47"'&5>&'.'&63637632632#"=46=4&#"#"&JG3  $GX14#(7'8J H ]=  HK c( 6&5®7C Ç ,5qX!&  0Aÿü«mM[74675&'&54?656&#&636376326322&546=4&#"2#&5'.26=4&#3A;   $'OQ%B8 eXÎ%@7S $ Ã''1áJ_S! *k/&'&763637632632##"54654&>u=B   $'XE43 + )A229  %   \† F7 H=% )o( 5#0²8?>Ò35 [6 *T2  BÿýmO74675&'&54?656&#&63637632632#.54654.#""#"&5'&B;  $'OR22  * )&6R(  ÞL`S! *k/ 4#b  r&0 sƒ© ""0Q>±Cgs4&54;2+"546"&547#+"&'&54654.#"+"54&5'&54>32;26;232632#"&#"7"32654&L  0 1r)5]7 .#7M 9  "1V5Jq^/  ( 2 +54+ 5 .9"!#  7S Lþw5'yY+E92;22€B$¤ 6F9'SH6(&7•!! >ÞCx4&54;2+"54647#+"&'&54654.#"+"54&5'&54>232>76;2;2632#"&5#+"&L  0 1*i7  )7M 9  "2VjQ(fP   [ 0.8.G  7S Lþþ &Uf+E92; $*A$¤ 6F:(&8.', 2 7* Qÿ´oCl4&54;2+"546232?674654654&+"+"&54>3232+"&54674'"&#"&'&654.7632_  0 1i@XO ) 8 *L0Wx9  6  ˆ=$(    7S LþC kOK8QC ;PA.s]Æ  1  / :26 Qÿ³×Cmv4&54;2+"546##"&#"&#"#"&5&6'&6323267654&546=4654&##"+"&54654>32324&+326_< 3xYi (/:#0$ $E`A2-0 8 )U8Wy!.:(f%5  V Lþ“.  *. < $ %&IYœ7    M[?t^ l>hCq4&54;2+"546"&5"#+"&'&54654&#"+"&5.5>76322;254654.'&;22632L< 3×(8™ 7 5*'.! 7 =08F4[  N% T * V Lò9) 33PY1?J,+(L*W9º  ¹Cn &-) 6 <,3  ÿüµ—‚63237>322#".'&#632#"=46=4.#"#".'4&54675&'&54?46'4#&##"+"'52654'5632À} gD) 00& 4OQ33 #& )# 4Q#)   :  . $_&#/*=#. n/ 5$ þõ =.¸+(vŠž   nLaV  .%  ÿü€—“63237>322#".'&#63272#"&5##"&54654&#"#"5'.54675&'&54?46'4#&##"+"'52654'5632À} gD) 00& 4OR%B7¯ '*99     7'7P .& ;  . $_&#/*=#. n/=0?!   6* R ) # !(ä-8w‰œF,UJ_V  .%  ÿÛ£›’4'5632>?>32632#"'632>6467>32+"'#"54654654&###".'4&54675&'&54?46'4#&##"+"'526?#/*-? v%   7)I:MR>b C#!  1 M ~) ;%5O )   :  . $_&$%  - 4x/;Cè#   ,3D ¸91y‚    nLaV  . ÿüµ—u63237>322#".'&#632#"=46=4&#"#"&547"'&546=4#&##"+"'52654'5632À} gD) 00& 4GX14#(7'8J H G3. $_&#/*=#. 'J( 6&5®7C Ç ,5qX!&  0E]= r  .%  ÿüZ—zˆ63237>322#".'&#6322&546=4&#"2#&5'.54675&'&54?46'4#&##"+"'52654'563226=4&#3À} gD) 00& 4OQ%B8 eXÎ%@7S $ ;  . $_&#/*÷''1=#. n/322#".'&#632##"54654&>#"&5&547"'&547"'&?6&'&##"+"'52654'5632À} gD) 00& 4XE43 + )@229  %  =B . $_&#/*=#. L ( 5#0²8?>Ò35 [6 *T2    \† F7J) .%  ÿýµ—|63237>322#".'&#632#.54654.#""#"&5'&54675&'&54?46'4#&##"+"'52654'5632À} gD) 00& 4OR22  * )&6R(  ; . $_&#/*=#. n/ 4#b  r&0 sƒ© ""0QL`V  .%  ÿü6—¡®63237>322#".'&#63222636322632#"&#"#"&547#"#"=7654&#"##".'4&54675&'&54?46'4#&##"+"'52654'56322>4.#"À} gD) 00& 4OQ32V+  /0 )55+2 0 )4: / ):%5Q )   :  . $_&#/*Ë#=#. n/ 6% 6$)77'¨ @pp:2vŠ    nLaV  .% þD " ÿüe—¶2>72326;>32#".'#"63232>76;2;2326#"&5#+"&546547###"&=4654654&#"#"&'&54>7"#"5>54&#"&#+"'5>54'6323È ?. [ C1 ##'&\G21] P8„ -)9.L^  >"4S .  "6  O-  7 >%.  V. 6%((* T   7+ † $! Â7/x…,FV6V" v ! ! ÿÜÿ´Ç—¢2672326;>;2#".'&#63232+"&54674.5##"&'&>'&632323?674754654'.#"#"+"&7>75#"546'&"##"&#+"'52654'56323š:A [ D*5"&% 4+8Zw9   6 Ig8+&   :X1(4 ,2#)$  #O-'#3! > #. _#s]#£  0  / 1;   @8@('{;2 -)v s! #ÿÜÿ´/—Ÿ¨2672326;>;2#".'&#63232##"&#"&#"#"&'&?654&476;32676=4&546=4654&+"&5675#"546'&"##"&#+"'52654'563234&+326š:A [ D*5"&% 4.3W}!.:(Yi /+8%(  "  ]I+$14H)$  #O-'#3! 0%5 > #. _#q[  .   &/   $ @^wi¶- s! #þUl ÿü —Ÿ63237>322#".'&#6323265654'&;22632#"&5###"54654&#"#"5'.54675&'&54?46'4#&##"+"'52654'5632À} gD) 00& 4OR8]) M P 2*8 £  ( %<#5Q G' ;  . $_&#/*=#. n/30- <  2 6+3¾5I.¼25/v‡ž F,UJ_V  .% @YÄÚ4BQ2>3232632;#"+"#"&+"##"#"&5467>&#"326%4&#"327>@ 1  XZ""-a+  *   NT!s4; … 3, !/:& = "Î7>;23#".'"#&5"+"#"&#"#"54676327>76&#&#"%4&#"327>.7! hf//.  A& 9 :%( A =   -K•&$@$R<2 %:¸:& = "Ð ;UAv /  h(„$@þï;ð /6.{A2 c7ÿìƒ3J\2672632#"&54632654&#"3263>32#"'+".5>7#"&54>32>7"&#"('4-@T %?', ?(# @HC.3,FU 04)134 £"M&,&7ÿþƒ3BT"547#"&54>37263>67>32#"54632654&#""32>7"&#"!!?J4L=1  2=VX3A  =& -  ) )" $7" ß =2/DM9#$,0 <@*9XþÁ g"M&,&Kÿþv4ER^"54?67#"&54673263>2>7625463>74&#"2#"32>7"2654'4&+:=Hwk  "P=5 G )<!    "=<$=9!DŒ+  :SÙ#"*# !%{: ;2BY!1))-$#SABx< %  g" "I&Yþ’ L @YÄÙHUh26;327>32#"."#"+"#"&#"##"#"&5467>&#"326%4&#"327>A %pYG C- -3! !%<(! <!PR#s2< … 3, !08& ->"ÎHE  # 6K',90p%1þ¸§:#º?5Þa4’)1<H7"=4>?67"&54>7326;2#&+32674&+2326D/A+'n_ /S6 'Wi_9% G_1 5 9G3$Ý*3 3# %!#) :$"/'P?>T -::$ è;6 !=58&”A2Nÿïý2".547676632+"73>76=4654.'!*;| .0P8J" s *2A)(SAM8{A[  EP2Žh' še /.(:8%2ENÿîüý0H"&54>766322672#".5+"73>76=4654.'/ +?9#-&-)‚  2&0 R4MR*2A)(TwxAb;&  6$70 *( †p ›(= /.(:8%2F<ÿÖãWJ[4.547#"&+"&54632326327>3#"'"&+".'4654?6%326>54&#"È  %–4@›z¤(?  E]H,"2%T:  B  <þÝ" <+4Nb( :,L^v'M# œ  "- 2   †@‹!, S./K<0W+<%"74?6.547#"&+"&54632;2#326>54&#"…' R  %–4@›z¤(F g þÚ" <+4Nb-¹:,L^v'M Ü §!, S./K;™NASb4&5465+"#"&5467632;23+"#"&+"&546?>'2654&#"3724&'"&"3256È#!‚95&?OY#C * #ŠA?  8 6 š?4L#*"+   K1H <(1=#F-P  @$  }$!::?$6 .& #1þöQ% AÿóÌ0-B7467&/.5&6;2&"2"#"&73267654654.'A@Z @   (Z :,n #8g: E1+Ÿot, !=5%$:$$+ #OX{^4 -; >R@C+N(57"&54>767&=47>32+"+2654#"t!C.Mr>YO H1A{ §F4u 8E@N)($,Q63?+‚S  +EJ~x ]"ÿþÞF7>4.76?2632#"&=67###"5454'.>32¸ ¾ &$ .  80¿   % &/ B*³H K()#þ¸$"" å!¼#BJ$ "ÿþ¥\7>54/&763632>72#"&5#"&547###"5454'.>32¸ ¾ !#g. *(;=  $#¿   % &/ B*³H K$ !"¥0 5+M.(*Þ!¼#BJ$ "ÿغY7>4.76?632?267>32#"'.#"&=4?##&5454'.>32¸ ¾ %% . $  C% *1;e ¿   %/ B*³H K("#!þ¬  "" "&F¤!¼#)J$ "ÿþÞF7>4.76?2632#"&=67"#"#"5654.636372¸Ç &$ .  80$  K(. 9À d K()#þ¸$"" åD  ?æ  $"ÿþŽJ^7>54/&7>322#"#"&547###"5454'.>3226=4654&+"3¸ ¾ = Ô"4&!E$¿   % &/ B*"+"!+  ³H K$ & %‘BK   ò!¼#BJ$ þ(% ÿýª`2>74654/&763632#"&=467##"54?654&+"#"&54654&546326ó÷B& *  O###!þª&æ Ú #BC¸A "% %6  1"ÿþÞD7>54.7>32"#"547###"5454'.>32¸ ¶  D).) (¶   % &/ B*³H<1>ð 9&g!¼#BJ$ "ÿtµs7>54/&763263232>?6#"&5"#"'#"'#"&74654&7>2727&54?"#"#"5654.636372¸Ç  B+/ ;; " )*9 0  : W -* e&  $  K(. 9À d L$B"þ¸$ 17) !) 1 ?°D  ?æ  $&ÿý¡5j?>?2632#"&'6"#&=467#"#"54?654&#"#"&=46'4&54>76;2ƒÀ =' s1 .&8&! , #%#$   #   ! '  <+&":S*3##M%.+2 5' 4þÛ(A Í ë#D F·A $# ?2632#"&'>2#"&5"#"&=467#"#"54?654&#"#"&=46'4&54>76;2ƒÀ =' s1 .&8  7f* *(;/ $#    #   ! '  <+&":S*3##M%.+2 5'%&H$0 5+SR!"Ö ë#D F·A $# ?2632#"&'7>467>32#".#"=4>7#"#"54?654&#"#"&=46'4&54>76;2ƒÀ =' s1 %&84!   9+ ,6%  _(  #   ! '  <+&":S*3##M%.+4 5'"3ãF   " B ~P ë#D F·A $# ?2632#"&'6"#&=467#&'4&5>54&#"+"&=4654&7>76ù.\C† =' s1 .&8&! , #%#$ œ  I   & +}÷*@ M%.+2 5' 4þÛ(A Í  * /;]&! &9  4 &ÿþ¡5k}?>?2632#"&'2+"##"5467#"#"54?654&#"#"&=46'4&54>76;226=4654&+"3ƒÀ =' s1 .&84Ó%5- #)  #   ! '  <+&":S*3##+"!+  #M%.+2 5'"0;n?M AÎ  ë#D F·A $# 7635#"#"'"&>54&=43232;2326;23>7>32##"&+#67267>?2>72#".'#"54&5467"#"#"5454#"¡)#4S ,'+  4'>, - # A'3 %(!6 #]KD, @2 (#,1 0 %# '!)f   ^%.-$ =   A   !+# "-"  8  ,! "'3 &  -&% þê  @ Ö$  !@!6=< &9 &ÿþ¡4q2672>?>7>32#"&'&5467#"#"54?654&#"#"&=46'4&54>76;2ƒŽ *r0 3&9" ( !'¶#   ! '  <+&":S*3## )'1 5'  2¨ !kë#D F·A $# ?2632#"&'2>#"&5"#'"#"'#"&'&>'&7>;263&=467#&'4&5>54&#"+"&=4654&7>76ù.\C† =' s1 .&8.# " $F44 +(: '  . I& &  A6 !œ  I   & +}÷*@ M%.+2 5'$Å   : 6*#3 #   Ü   * /;]&! &9  4 0¾(-;##"&+"&=4.54>;2'">74¾£} %  '! #:eB;2#7272632">74¥)9   - 15qQ65'4F-! ## e *œ'3"7Q%i5,`9d"6)!;<$$(@$     1 © E/'5).0†(M[%"&45#+"&=4.54>;2#254&76;2326#"&5">74U C )7sQ @3£} &B 7)‰ 1*:¿'3"7Q%z B&T1#!::"'Mf# ; " 7+˜ E/'5).%ÿÞOD*<723267.54632#"&"#"ᘖ'56">54&!E 4"ˆo–¡€]@  BTC6*K!4)8- g ^W-`v\Mgº  5-"Ç ,7&!:%&0L(IZg%"&#"+"&547&'+"&=4.54!32#3;26322632">54&"32654. = ( #<"   4 <1¦y$ S 0. !'%þù )!.G'"ƒX ' L ' T /&¾'Ne&   '&º">( #+ þ· 4ÿñiDBN72727.54632#3254.76;2+"'#'."&546'&>2"654&m5.,Šn•¤z "+@ + 7>)F#-5(*"(; »| %ž4Xu]Mf&:& O 8 !&  #> ; ²+@2$†%0š(GU"&5"#"&##+"&=4.54>;2>2%">74X*9< $-Y5% +8oM<-++Q0' 2þº'3"7Q%8)"] 'S'8*::$&5.   ü E/'5).%26DP72;27.5&>7632#32>#"&5'#"&546'4&5&6">54&VA(B - AGEŸu ; C'.':4:)1" ,D3?+%› _F$ "-Lg\  2 6, 0< ;  …Uh"B++ÿþGDkz2;27&54>32#326?632326#"&5#"&#"#"54654&##".#"&=4654.76%2>54&#"W"B6*DE$©%+)( ,3„  )):6  H l   ;#3 .6'(./ ; 86+>Z* #*! 6, )D%  # ¼    +2 2 .7")<,7+ÿÙ/Ds‚2;27&54>32#263726326372>32#".'&##"&54?6&+#".#"&=4654.76%2>54&#"W"B6*DE$©%+)(   ($ O  =3& 4&' 2* , L   ;#3 .6'(./ ; 86+>Z*   È  -  &v  +2 2 .7")<,7+ÿþ`DRa2727&54>32#32637632#"#"&54?4#"#".#"&54654&76%2>54&#"V,; 0*DE$©%+)( #("  4 3  0n   <(1.6'(./ : 86+>Z*   Œ .  (8 8 /7")<,7%ÿû£6FR\72;27.5&>7632#3632#"&#"#"&547'#"&546'4&5&6">54&"264&VA(B - AGEŸu ; "77C;(! 2 ) (¦5:)1" ,D3?+%š,› _F$ "-Lg\>%!))" 0< ;  …Uh"B+þc"*%Å6Xd72;27.=4>3232672#"&5#"'"#32>#"&5'#"&546'4&5&6">54&VA(0+0eIHF,1B. *+7A  $)T4 ; C' 2':4:)1" ,D3?+%› DN#?A'"-412 7*\  4 6, 0< ;  …Uh"B+QïE>N7467&54>32632#"&5"/.#+"&">54&QmbA .T5A`:WD?:,J" 0,:: =K  *c/?)<(/I…AL$3*)04L% * 5. }DXD #!( '+ÿtD‚‘2;27&54>3267>363232326#"&5#"&#"##"&'&654&5467263&54?654"#"'&#"&=4654.76%2>54&#"W"B6*DE$¨$5C4   "H 3 )):B6 3 15( 1T6 ;o$  9&1 .6'(./ ; 86+>[$7  ½  1 6+#Q 7     +  (5 2 .7")<,7%ÿ‡l.^h46;2"+"&5232>7'&54632#7>32#"./&/&/"&##"&546'4&5&"654&1 .  0Ú#>!aQ97!‹i4s7 )( .%7 " 031" -D/ 8 þ9 dF1Tp +FSš' 2    F ; “‹$h#0ÿŠï=s‚4632;2&#"&52327.54632#3263263232672#"&5#"2#"7>'&+#"&'4654.76">54&  1  1Ó-;-)+v_«”k &:51B. *(9 . Q 8 %81# ,&.. %.)&% 7 þ‘ s'BQZFS' 2 8*0Œ'² )  2 =<-0/)ÿfÙ=|Ž4632;2"+*&454654&4763223>7.54632#3263?262676323+"'"#"#"?654&"#"#"&"7>54&  0  1 þ =#%&-xb¥1M5"## % %. 1 T  1 NN9  =  w!<(1D &'(%  9   þ#3 w'CR\*= ? >0 -3»  )9· 3"6 %&ÿŠ=\k4632;2&#"&52327.54632#326376322#"7>'&+#"&'4654.76">54&  1  1Ó-;-)+v_«”k '"#; Q 8 %81# ,&.. %.)&% 7 þ‘ s'BQZFS>·"'² )  2 =<-0/)%ÿS£.Zdn46;2"+"&5232>7'&54632#2637632#"&#"#"&547'#"&546'4&5&"654&"264&1 .  0Ú#>!aQ97!‹i'  E<(! . & ',Â031" -D/•* 8 þ9 dF1Tp +FSv *>&!))6( F ; “‹$h#0þ0,%ÿ‡þ.q{46;2"+"&5232>7.54>3232632#"&5##7>32#"./&/&/"&##"&546'4&5&"654&1 .  0Ú#>!&J3£ 0U()8De4s7 )( .%7 " 031" -D/ 8 þ9 XK#??(] "5,>Rš' 2    F ; “‹$h#04ÿŒÒ=O^4632;2&#"&5467.54632#632#"&5"/&#"#"&+"&">54&N  1  1þæhh!!zb£“k2d2O ,'78 1Y   &b.. %.)&% 7 ýÏJz!`#EO[ES*  3 9* tR  <-0/)ÿX¶vxˆ46;2&#"&527275.54632#32632326#"&5#"#"'&6'&7>3&4?654#"&54654'&6?>54&#"326 0  0Í,5*&-yc£’l%A66 0’ +'9y$C2%'' ›.+.+& 9+1Ô8Y%'5 _8 þ‘ v'DQ\DS? ˆ  2 6+  00D  $k$   < 3x B4(559%ÿ‡±‡F™2>7>;2636?2>76322+"'"+"'&67"">54'>232>7'&54632#7>32#"./&/&/"&##"&546'4&5&"654&§B 1 )     $. L 7 9 5'Z! 37#>!aQ97!‹i4s7 )( .%7 " 031" -D/_3   03 =6)"" ýº dF1Tp +FSš' 2    F ; “‹$h#0ÿŠï•0Ž2?327>;2#"'+".>7##"'5>54'62327.54632#3263263232672#"&5#"2#"7>'&+#"&'4654.76">54&ŠBI'wD* ;+4IS 8 4P2  -;-)+v_«”k &:51B. *(9 . Q 8 %81# ,&.. %.)&n3 # ,!3L#! #þ s'BQZFS' 2 8*0Œ'² )  2 =<-0/)ÿfÙ•<Ÿ±26>;2".'&+"&547&#"'5>54'6323264654&4763223>7.54632#3263?262676323+"'"#"#"?654&"#"#"&"7>54&DDI D*$ 8:&  ( 7 '  S!  3"# 2&þå =#%&-xb¥1M5"## % %. 1 T  1 NN9  =  w!<(1D &'(K #/ D7 # ýÆ3 w'CR\*= ? >0 -3»  )9· 3"6 %&ÿŠ”•0w†2?327>;2#"'+".>7##"'5>54'62327.54632#326376322#"7>'&+#"&'4654.76">54&ŠBI'wD* ;+4IS 8 4P2  -;-)+v_«”k '"#; Q 8 %81# ,&.. %.)&n3 # ,!3L#! #þ s'BQZFS>·"'² )  2 =<-0/)%ÿS±‡F‹•Ÿ2>7>;2636?2>76322+"'"+"'&67"">54'>232>7'&54632#2637632#"&#"#"&547'#"&546'4&5&"654&"264&§B 1 )     $. L 7 9 5'Z! 37#>!aQ97!‹i'  E<(! . & ',Â031" -D/•*_3   03 =6)"" ýº dF1Tp +FSv *>&!))6( F ; “‹$h#0þ0,%ÿ‡þ‡F¢¬2>7>;2636?2>76322+"'"+"'&67"">54'>232>7.54>3232632#"&5##7>32#"./&/&/"&##"&546'4&5&"654&§B 1 )     $. L 7 9 5'Z! 37#>!&J3£ 0U()8De4s7 )( .%7 " 031" -D/_3   03 =6)"" ýº XK#??(] "5,>Rš' 2    F ; “‹$h#04ÿŒÒ•0jy2?327>;2#"'+".>7##"'5>54'6467.54632#632#"&5"/&#"#"&+"&">54&ÄBI'wD* ;+4IS 8 4P2  Vhh!!zb£“k2d2O ,'78 1Y   &b.. %.)&n3 # ,!3L#! #ýNJz!`#EO[ES*  3 9* tR  <-0/) ÿX¶À<¡±4'6323?26;>7>32".#"+".6=#"'5>27275.54632#32632326#"&5#"#"'&6'&7>3&4?654#"&54654'&6?>54&#"326E)-"  -B" B&   (6%  ?8 6 V0 "+5*&-yc£’l%A66 0’ +'9y$C2%'' ›.+.+& 9+1 Ó8Y%'5 M 0  : 2""þ‚ v'DQ\DS? ˆ  2 6+  00D  $k$   < 3x B4(559#ÿþ°52%45.'""&=4654&54673>3"#"G4$9+')?'61LH  (3d$: -J0  K0þ’#ÿþ‚5G"54765.'"#"&54654&547263>72#".'"(& 44$B#'{T&0MF]$ 3 #3   6B $: 5D4 K0˜ 1 * ¤  #ÿÙ5?%45.'""&=4654&5467376322>7>323#".#"H4$:+%+=-,.TH*E4:+4& §)3l $: .J0  G8þ“ % '%ÿÄB2C4.#"#"&'&676&54>7632##"&54654&7>;2>54&5Ú" H&  *j%$+$M )8^iO;+,g1Ke6¬ 0  >: 3 :0Y:Q;$*P 4 "CO6!!#ÿýE57E2#"##"54?654&##"&=4654&546732634&+;26¯2rX#6%! *& )7% ;,%+<W#0M/!/ '´ ó.:.Øb @:G4  J2þ¢?'ÿý$5/:&54?65.##"&#"#"&5463226322654&"˜# 14'!6-3'bM!#j,OGJÿ&"2 >þ#<'*4 *;HE7þŠ ›)3ÿýêP<4#"#"&=46=4&767276=4&7>322"&54?>‚i  +' X+ EJJ >U) ˜. %+3 +& H&Fù" Tà )#ÿþ@5O\%45.'"#"&54654.7673>3;267232632#"&#"#"&547#""#""32654&G4$B#'U)71LU & 9 *47- - 0 )3e * ( +!3d$: 5D2   I6l  6R38% ×6###ÿý<5d$4?4&'"#"&=46=4&547263;24654&76;222632#"&5"&+"5467###&$%5$2%&{T&5H A  ) ,6P -*9;# B/  M#»º'9 332Q+.&2 2p1 7, 5+Îô5Z4'"&##"&54654&5473263232+"#"&=46'&+"#"&'4654&54>?>II G(^y0G?654&#""#"&54654&54673>;22#"74.'"3256¿1GD2&$""b,  d7$!"& %(?=U 5KLG_&7/<  (FY  88 >   =ú 4 %5  2 H& Ë*! M=% #ÿýå5Z$4?4&'"#"&=46=4&547263326746=4&76;2632#"&5+"+##&$%5$2%&{T&5H 8  C U 3,7 !W/  M#»º'9 332Q+.& H ,=1 9/+ÎÿöÿþTÈ1d654'56323?267>;23#".'"#"&#45.'""&=4654&54673>3"#" 7),/˜,  D' ;$' ä>+FG4$9+')?'61LH  (# 0!   - þd$: -J0  K0þ’ÿöÿþ¼È1y654'56323?267>;23#".'"#"&#"54765.'"#"&54654&547263>72#".'" 7),/˜,  D' ;$' ä>+l& 44$B#'{T&0MF]$ 3 #3   # 0!   - ýÜ6B $: 5D4 K0˜ 1 * ¤  ÿöÿÙÉÈ1q654'56323?267>;23#".'"#"&#45.'""&=4654&5467376322>7>323#".#" 7),/˜,  D' ;$' ä<,EH4$:+%+=-,.TH*E4:+4& §)# 0!   - þl $: .J0  G8þ“ % '%ÿÄŽÈ2u22672>7>32#".'##"#"ᘖ'56"##"&'&>'&54632632##"&54654&7>7654&=4&ž!) ´  D% *1'  ZQ$+6) $ '  I*^!2R2a{`;+, i|ƒ8©  "    1!¡!2  ?H CX; *P 4 .00Z <4ÿöÿþ€È1dr654'56323?267>;23#".'"#"&#45.'"#"&54654&54726322+"#"74&+;265 7),/˜,  D' ;$' ä>+EH4$ +&z\-Q2m^%8,#)#&Þ#1 +# 0!   - þc $:  %* 1 H6þù -!`9ÿ÷ÿýTÈ/^j226726&67632#".##"">54'56#&56?.#"##"&#"#"&546322>322654&#"d@ ´! :*6 $  ZQ8,*¢J$04'!6+5 'cK&:;5Lþ‡©2    )"  "ýœ7Lé#<")6 )":G Q**)ÿèÿýFŽa267>77>;2+".#2"&54?>54#"#"&'&6=4&54632676=+"'5>54'6U@ ( - 8A1 *4#  &JJ >U) i B$'R &6 Q0 !p3%#[&Fù" Tà ).5D4  >""?ÿý¬g463>2632###.=4&'&#"#"&5465?#"=46567>d & 259g " .F)   C 2# =)›‰ =/&“ +      *r]3  "®   Gê#&'$!    >V-O^?ÿýó¬ˆ463>2632767323#".'&#"#2#&=4&54.'&#"#"&5465?#"=46567>d & 44(8/$A ^)6%   #&$ ,:   C 2# =)›‰ %E,7  D" . 4PX' & ­   Gê#&'$!    >V-O^?ÿÖ÷ªu463>2632?>76;2#".#""#&=4.'&#"##"&5465?#"=46567>d & ):6a   <&& 52% -7   F 2# =)›‰ 6..Ï    1 ;3Z`(þì  Gê#&'$!    >V-O^>ÿþñS4>7467232##"'454&'#"##"54?67"#"#"54&>8ab96WpL (*9_R' ! ) :E3 5'49R*92‰   ,]-6 Ö  5 -e#"F.  5?ÿýתdv263232+##".54'.#"#"&5465?#"=46567>3463>4&+;265¾-67c#3E/&8)) $B)!  F 2# =)›W µ"0' (£7/)x # Ï$( þì  Gê#&'$!    >V-O^ þº  1ÆC465""'+"=>32+"=.'32+"&54?#"&62?+ 0·‹BcO:3 +0)) 9 ( Ua/ E0  (Ij(M2 "4 ;R ßK :ww?ÿëþÜP"=4674326;232623##"54654'"##"5467"e&Ÿ†;  BQH $,°  % ( %5,# <¶Õ  2'a 9lc  1Ÿ 9Ê '>sK/?ÿWõ‘463>>323267263#"&5"#'"#"'#"&'&654&7>;263&=6.'&#"6##"#"&76567##&546d ' 6a [1 3(:*  . ;34& " <-)/    ( Zb-¥l   :/+¤', 7)Q 4 #/O=1 n  P] ‚C n‡?ÿý)Àkv‚263232+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>4&+32546%4&+325464&#"#326ø ;M+K1 SO!0& 8%4H; XM!0& Z) V‰^P!0& 8%"™z ã%2 #?ý4%#?P'#$¢,*$+m/! 9-JZ3 4 BC . 0 (é"lU-! =H[$1TþÄl+ -?+ l?ÿýaÀ~‰• 26326;2672#"&5#32+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>4&+32546%4&+325464&#"#326ø =J9kKD' -)9jSO!0& 8%4H; XM!0& Z) V‰^P!0& 8%"™z ã%2 #?ý4%#?P'#$¢,6* 2 6,2r/! 9-JZ3 4 BC . 0 (é"lU-! =H[$1TþÄl+ -?+ l?ÿŸkÀo{†2632;2632#"&5"&#"#"&=4.'&#"32+#"54654672+#"#&5467>34632>4&+325464&#"#326ø =JM‚[ *(: - !* 3I": XM!0& Z) V‰^P!0& 8%"™z é%#?P'#$¢,\Y8o,  1 8*,_e 3#. 0 (é"lU-! =H[$1TþÄ-?+ l*ÿýá]lx‚>34637632632322+#.5?=4#;#+"&5467#2##"&546574#"326546!4&+232654&+326514Q…X& 0$ Ñ$UL87J  -ì !.VF**$ _o=QVF_»> &_'(B"& "&N//  }Ø /% ;b'L "*  º4 *#") + /- lØl?ÿýúÀ…‘œ¨³26322;>3>32+"#"&5#32+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>"32654&4&+32546%4&+325464&#"#326ø =K|I ;# B'53<O "9JSO!0& 8%4H; XM!0& Z) V‰^P!0& 8%"™z [! "!%2 #?ý4%#?P'#$¢,m 7)#8.5Q>(#"ý.)"w& )S0 =Wj8&-0³Û 7I /");b45 F. 7 À' I[E/% ;Î '!&Fu 0  + ?ÿQi£|Žš4>3766323262#"&5#"'"#"'#"&'&654&7673>7&=4'.#"32#+#"5465"2###"&=464&#"&#"&6;265%4.#"#326ž , 9NMƒ Œ( )(<*  , <9+ )"  b %R.BUJMO#& ‹O^J <) #?¥3)#!B)l  ,^Y?h+ 0 5+*D 5&µ%(- 8.1 $ ã o/}‡Ïp  lF6^S`74675.54>76=46;22#"&#"#".5.'4&+"+"2654&#"FY698*11 8 8ZM`NO  >F  ..Ò\B%/ 67@„A('4 + 991*>$ *)   D v6 2=$(%'# $3Gç^_l74675.54>76=46;2232672#"&5+"&6'.'4.+"+"2654&#"GW798*11 8 8ZM`Œ$&m .-9C  413F 4 ,Ñ\B%/ 65BƒA('4 + 991*>$   1 7(J!%F u:2=$(%'# $3Fÿ×%^er74675.54>76=46;223272>7632#"'"#""&+".5.'4&+"+"2654&#"FY698*11 8 8ZM`nP  )5K%   ?L ,/Ò\B%/ 67@„A('4 + 991*>$%G" - 1  R mA2=$(%'# $386^_l74>75.5472>54=46;22+"&6'.'4&+".45+".72654&#"8#3( (7… 0 z304¦  3&I ,*   ;êM;!(*5–4 <)]. % W /  6?   %G  - «6*#- + #5FÛ^Q^l74675.54>76=46;2232+"#"&+./.'4&+"+"&2654&#"4&#"#3265FY698*11 8 8ZM`RQoW^(  $$MF  <Ò\B%/ 6s' $5B„A('4 + 991*>$- * "N w5 =$(%'# $3Ö,+Fæ^kx74675.54>76=46;2;2632#"&5#"2#"&#"#".5.'4&+"+"2654&#"FY698*11 8 +0; \ 1*9: ŠNO   >F  ..Ò\B%/ 67@„A('4 + 9 +1 5+/4 *)   D v6 2=$(%'# $3F^CP74675.54>76=46;22+"&'4&54&+"+"&2654&#"FY698*11 8 8ZM`ZY -/OE  <Ò\B%/ 65B„A('4 + 991*>$% /  x5 =$(%'# $38ÿv^ƒ74>75.5472>54=46;2237>32#"&'"/##"&'&6'&>7267&=4&'4&+".45+".72654&#"8#3( (7… 0 z304zV"N)&6,< I$ & $DZ%N ,*   ;êM;!(*5–4 <)]. % W / 'D0 0 8&  "2 =  P  - «6*#- + #5F6 HU74675.54>322#"&#"#".5.'4&+"+"2654&#"FY698'??" >?&,/INO  >F  ..Ò\B%/ 67@„B($5 1!2 *)   D v6 2=$(%'# $3Gç Ta74675.54>32232672#"&5+"&6'.'4.+"+"2654&#"GW798'??" >?&,/IŒ$&m .-9C  413F 4 ,Ñ\B%/ 65BƒB($5 1!2   1 7(J!%F u:2=$(%'# $3Fÿ×% Zg74675.54>3223272>7632#"'"#""&+".5.'4&+"+"2654&#"FY698'??" >?&,/InP  )5K%   ?L ,/Ò\B%/ 67@„B($5 1!2%G" - 1  R mA2=$(%'# $386 HV74>75.546322+"&6'.'4&+".45+".72654&#"8#3( *4[jXl214¦  3&I ,*   ;êM;! "5–4 >(1NA8 0  6?   %G  - «6*#-%#5FÛ FSa74675.54>32232+"#"&+./.'4&+"+"&2654&#"4&#"#3265FY698'??" >?&,/IRQoW^(  $$MF  <Ò\B%/ 6s' $5B„B($5 1!2- * "N w5 =$(%'# $3Ö,+Fæ [h74675.54>32;2632#"&5#"2#"&#"#".5.'4&+"+"2654&#"FY67:'??"Xk; \ 1*9: ŠNO   >F  ..Ò\B%/ 67@„B($5 ?41 5+/4 *)   D v6 2=$(%'# $3F 8E74675.54>322+"&'4&54&+"+"&2654&#"FY698'??" >?&,/IZY -/OE  <Ò\B%/ 65B„B($5 1!2% /  x5 =$(%'# $38ÿv lz74>75.54632237>32#"&'"/##"&'&6'&>7267&=4&'4&+".45+".72654&#"8#3( *4[jXl214zV"N)&6,< I$ & $DZ%N ,*   ;êM;! "5–4 >(1NA8 0 'D0 0 8&  "2 =  P  - «6*#-%#5Zÿíè/B74&547>632+"#".7>?26=4.'32676=]‘":/L'+(Š% o] # #   ^%£—9Ò:@J7Š|(7=E« "!!+!bÁ/)=& %#[ÿîí0DT%#"&5+"#"'.54>326322672%>?26=4.'37>765í)(9A+:$K .?85EDu  ýß] #  ! ªK=+(D %» 6+U +UeCj@)I="`"Z "*7 ) 3G -@f""ÿáA&8LU7"&54>7>7"&54>726327>3#"'#"&#4.#">72632765ä 7j„!G/*AT FXH-!"2,J(   ¦ ¾I0"  )!z8-(2'[0 >¢:-  !+ 3 ¿  ;,%M&"°&%8B7"54?>7"&54>72632+4.">72632765à& >h† H2()@ ,4 NX( w ¾+2#!./Ž7-'3'"2) 3X€?  ¿!$;' O! "&)=FS74>7".546726322+"+"&544.#">72632765"232654&Í %LM0YM(?W\Lr%6+  E  ¦ ¾I0" *"s B) +2W Y- $Ð#*  —  ;,%M&þê#<  Aÿõ¾0/@J2&"2#"'.54767&'46;2654&'.'>2=!  (Z .-@$/ >)% @ $   VPª:0!=5%&A#2 (@4‡9% { þÍ A *E2à…T'/ @7C+N(/77"&54>767&=47>32+"+.#">=t!C.Mr>YO H1A{ tN#7¨ 8E@N)($,Q63?+‚S  ß(sšM6-ZÿéÈI@BP%#".+#"&4>54.'&6?632>26;2>763%32654&#""Ž*6 '*7³75IA\\A 9 '!;;J!6T" ($ ]! þ7D2;+' 6…*a?j]GEW0A)G:.8-"! 7Q)#203!GIGUg7"'54?>7#"&54>54./&476376326;27>32#"'2+;2>7654'æ  !=/9(88( #*KB !.P-" *2J S:  Q5F  ,  $  C +$";+)5  949 <0  ", s  + %  ÿæŸI>R266;265<62;2+"&#"&54>54.'&476?6.#"#""3265—'7pS=',)$9( @ E(#9_,:NA\\A 9 T 2    7(7$I?5XZC "0*#97  ?W $B54^GFX0  þ,,'"*(%!/IŠH_s%"&'4&5>7"#"&54>54&/.763726>;2332672#"&5"&#"#"+"7>54+1 EB9*==* H %5_ +!& R  2*9 )  ž  ~-$<)(2  2*>=    D1 6, `  E, " #ÿ¯9IIWd"&547"&#"&#"&4>54.'&6?6326326326323263#"&#"%32654&#"2654.#"A-+ #''.6';MA\\A 9 '>^A:1E.  !$-A,2;;þ29#;"%5* $)QA Aj]HEW0>)B@L4#7!*!2J8 ³+$#63(¶  #1Š'i%"54?>7"#"&=4>7632;2#"&547#"2>54.54;2;2>#"&5#"+ >R8/RN:F7 4)AH„*: ++E*6 HG3();`  ?%,O)-7Q0  -(85*K! #? 1 7+ E( *ÿø«J[ev%#".+"&#"&5'&54>7263232632#"&#"#".5476326;2>;232654&""32654&#"  +1$ +%- K).I(9Q3267'>7"#"&54>54&/.763726>2;2>72632#"&5"#"32636#".5"+"&#"#"&5"7>54+"'&(GEB9*==* H %5_ $0  8X  1*9 (c 3%0 = 9@$2  j0   ^-$<)(2  2*>=   ? " 6+[  1 *' 3C±, " #&ÿýÒd@%45#"&54654&54>?>323>;2#"&5#"*R1%,(D-FB2 W (): Y !EÔ 25 3   & 5, þ] &ÿüÒdW%4?#"&54654&54>?>323>;2#"&5767323#".#"&+R1%,(D-FB2 W (): ; ]:*0#*  *J L"ÛÛ 25 3   & 5, Òi6  '%j & #&ÿÖÒdY%4>7#"&54654&54>?>323>;2#"&532636723#"'#"&#"#&+R1%,(D-FB2 W ():$5 m  :$JG  8IOÙ– 25 3   & 5, þB:= 1 3 ÿÑ YQ47""#"&'4676&54726323>32#"&5##"&54654&76;6367>5p;& % m]w& ro 2+8€ ¯d:$% Wp=Xƒ> #4  (2 7( y)\8J[2, #?K?&ÿýÒdDS%45#"&54654&54>?>323>;2#"&52#"574&+;265+R1%,(D-FB2 W (): k]<&""!,"Ì+ (I¿ 25 3   & 5, -¡†:.B) CÿþïeP7#"&54654&47>7>37>323>32632#"&532#".547#"Iz2$&Ã( & U‹  -*:*V(* 2 9%™‹  01 2  2 5,’ &Å50 <ÿý(dW"&54>7674'#"&'&674&546;2?>?>323>;2#"&5##E;]dc ƒ2%&GF& X‰ ():O7Z_f$ 716V5292  11 -   & 5,3,32;&545#"&54654&54>?>323>;2#"&532632#"&5#@#- 7R1%,(D-FB2 W ():%` )(<B9 4 Ù 25 3   & 5, þ]  56,1­qe2>7>;2>7264676322+"'3267654&7>32#"&54>7>5"#">54'56 A 1 )' ! 1 N63td/!‘ L  54&5&632726363>32#+"&+6363>3232#"&+"&'&5467""&'.54654'4.#"#"#&##"#".%4#"#"#326363>2637.ä®*>!/8  :'HE(% *)"4 & ‹  .  :4s$4^N%7 e$D"ý—@I7Q3ZI[A     5  &7 # >9,þÐ-  /‡  ^)˜ +"`5 X 3;˜Î 5# 1ÿæ«qo2>7>;2636?264676322#"'632326;265<62;2+""#"&54>5#">54'56"326=.#"#"¤< 0 )   ! :;&F2/6e'E 6* 9( ? F(>[.:N,BLB,7 T2 ,?!7(7$ 2  I3   '"3 ,T4W '5( 97 =X #B6*O;C;O)"$þ|<((%!/,'0™¸ý-43?632""#"=4>3>72#"=0**   > ;  i Ü>   ?Ö  E C¦™ý,BS4376;2"#"=".54=46?632#"4>72##"=74>72#"=¦ S ? û A =þð3  L è 65 i Þ > ?W> > ƒ 3  A 3A:X\D,A3254>764672"#"=4376;2#&=G )_*! Ä¥ X  ; P  A D    ¨  2  AÔ ??:2]…#9O254?62.4=43764>732#"5"54676;2D)˜#¼" . Lm2  M :" ’< (_+… …>  ?  ï  7 ›    ;iÒ-$=>32"+"=42546>32+"=4Ïd -  ø  -þí Ç3d $   / @ ­ ‡ /@ 0™Ñý(?437632"#"=4&#54?>724672"#"=4&0L , ¡?L*™)þ_!X  : Þ > @ x |  2 A0(¸n+C2#"=4632632##&=46"=4676;2##"§  M  L L >  >n  5   Câ A   A þ¨? ?  0(Šn'=Ui}•2#"=4672.=4376!2.4=437632#+"=454676764672"#"=4&4>72"#"54376;2"#"=‘ L  { . Lá . LÜ ))   Hþ­!X : Ó 68  : é L    W n 5 Ab> ?  >  ?  qA @ ‘ 2 A   2 " =   ?2ÿt|ˆ#HY{"&'#"&'&6'&632632++"&5467>54&/&6;22>54&+"3"&5"&54676&76326329(8 Ê% && -@‚í  3VhU /81-S(  ;3",4%Â"+ 4 l *8Ô +8$ R…æ  *ý3. #3  D' þÓ>O6Da '"  )$$4—-2)>Ž&®6+ #(% '$ #ÿt2–%Q[€#"&5#"&546'&6323>2#"';2654&+"&76;2+"&'.54>32"254&#"&5#"&5465'&7>;263221,8BO13&" 2J j…#!, Hœ,M#)!1 /FecQ'&76323>32"&5+"&5>732632632"&5#"&54654.76;2632M1(<·9.+ b _~)$ a*9p B D x[ & ):š9-, YiÇ ** 5+ 'K "   0í7+þî %   -þg6+ 'K 0'0 LÿtM—&:Jn#"&5#"&54>'&76323>324>3#".7"32654&'&"&5#"&54654.76;2632M1(<·9.+ b _~)$ þ2J>7E.u]4Q- Öo !5,A  ):š9-, YiÇ ** 5+ 'K "   0þô3M&'O5'&76323>32#"'#"&54>54632;232632#"&5#"#"?63>323"&5#"&54>'&76;263231)<·9-& b _~)$  B&0A'77'  5/T 1*95 X'f I- +*8š9-%  YiÆ *) 4, (J!  þA ,%>- ;./=" '71 7+E7%##'$- Æ6+ (K" '$ ÿ`2‹$bu™#"&5#"&'&654.76;26324&'63227262#+".'&67>7654'#+#">4&#";2564#"&5#"&54654.763263220,9\ZH, WjË  þ#3  „ LD_YiB 3 % M/#F, Qž',9\Z% %O|×   6(  ;8 / '$¢ . *"-  6U !"Î) %è 6(  "3 3 '2Oÿ`‹&x›2632#"&'#"&'&676&7>34&#"#"&'&676.7>326263>32726&676;2#".'"#"+"#"=4?6#"&5#"&54654&5432632iÈ )-7\Z$ & DŽ ? 2%( Jh ,(‘2!#  ;)8&  \/ } Î0-8Z]++&^}Ú  d'( 6(  "2    Î   32 )  6è     *"9Òþ$ 6(  *81'1QÿZ‘#s—>32#"&5#"&'&654&76;2"&54>'&54>7#"&'&>'&54326;2632#".'2632#"&5##"&5#"&54654.763232632V}t  )(<{A$-  L¿' (k3PA&& vM1K” * #R0ˆ !.*8TW_3¨,,8| B+% > ( h‰  u 46+D: 5 ýx " * 0C + +þÖ66* 01T 9(-Q3   'OÿtO—(Saˆ#"&5#"&'&654.7672632326322>?>54.7>32#"&54654&54?632>7"&'#"&54676&7>32632O2)9š9-& I AÌ þ“ ƒ N0-=\3@X$) 5) ¡)8™ +%  '&.CÒ ,) 5+ (J 5 ( 247"I9CQG0X ¡ þë&#%=N)#Zü2. #( '2 2ÿ`2‹$Fj#"&5#"&54654.76;2632>54.763732+"&'4&#"&5#"&54654.763263220,9\ZH% WjË  þ 9 ; &5 1`',9\Z% %O|×   6(  ;8 . '$þr è 6 æ   ã 6(  "3 3 '2%ÿd—”"|¢2632#"&5#"&'&654&54324>54'#"&54654&54;2$76;2#"&52+"&'4+"+"&5"&5#"&54654&54;2>32e¯  ));™G' Xv,,`2%&j (*#  1+9a 5C+7 d T  Aw+9j09-%M \{B  1r"+5, :7 4þ5+,;!  112  6+  */*&Ald' #ü6+ (I2  fÿd¥”$b‡"&5#"&'&654&54323263246;2#"+"&'&54654&#"&546323265"&'#"&54654.76;2632^)9™ *' X^» *þÕ]H XR * 6"65Ccg8  !%à*8f37,2 Hx«  0 6+  "' 4"% æFT6Iu $t96H)#2J$ZGTm #F/(aP@þŽ3. 'J2 !1 Hÿf’ˆ&yž"&5#"&'&654&54.76;2632"5&54?67&'#"&546'&;232635465.54;2>54&74;2+#"&5#"&546'&76;2632A.7™2$* N#f³  )P  .?;dJ*$ 5  :  5 HDJC>)(;f3& %$  O#c· ÿ6) .. 2  !5 þW #3  ,K B #V  # : U! Ü ¨ 5* "1 A !&6ÿfüˆ'g#"&5#"&54654&54;26323>2467##"&54654&36;232?6>54.76;+"&#"&5#"&54654&54;263232632ü&-7|++%Io Û% …3'" 8 !#$  C IDÛ0-8|H&KQ£ 7(  )72&þ;† 2FQ  a  ) þì  ˜ 6)  :72! 1CÿdÒ”*j¡Æ#"&5#"&'&654.76323>32"5467#"&54>'&676326;2632#"&5"#"#"#"&546'.5467>3>;22>326#"&5+"#"&5#"&54654&54;2632v )(<™$ ' HTp&$þÌ]% * =N1g” .,6;    é%#5\ N  7  3(:2J% k9¯1);f32$+ Jk¨  ƒ 56+  "1 4  þ¹ Q  !2  " 1 :'8 þË=  Z9s $ 6+&Il 5,// 3 !(1ÿd…”)n{¢>32#"&5#"&'&654&54;2"'#".54>3763232632#"&#"#".547"32>7>32"32654."&5#"&54>'&76;2632éSo%$ /';™$ & M  ÝK2F2:0(7K79 C !19 :#- TST2" /  :* "):f3$ %  Ikª  2r + 6+ !2  4 ýÕ, 6)Lp9$ ($9 '%nŒQ  '%"$ýÇ6+ "2 #  !% %ÿfbˆ&§#"&5#"&'&654&763232632"54?>7#"&54654&5&323?326;>72#".'"+"&5467##"&5#"&54654&763232632Ì ),9¨ *( Zs® þU0 ^2$'f)N8&~ KKA- - $     E4/   `)-8¨2$( Zp² x3 7(  "(3!ýÅ/Gu4 123 % )Ej' û6¿Ÿ 6)  ./ 0! 22ÿd#”(So™#"&5#"&'&654&7632326324&547>32+"54654&#"#"&746"&'4?>32;2#"&5#"&54654&54.76;2632#-(<*`% &  C!^¤ þI€;92 " 3#*   =,(Òc  3Q  1*:f3 ++ He®   & 6+"3 1 " +®  %3  B   *R 0þÎ š  (} ‘ 5, "' 2  !ÿd#”&JX"&5#"&'&6'&7632326322#+"&54654.546">54&#"&5#"&546'4&54;2632â+81Z *'%  E ]¥ -¢¤.TM2  1W| 'MR…1)'&7632326"&54654.'+"&54654.54632!>7&5474632!+"654&!"654&"'#"&54>'&6323>32.c /)9A„ *,  R­ ð  /^wYDþþ!Ä6`tœþÿ"  ,þÔ(D ‚)D [Y šH9-% +Dq“.#  -}+ 5, "' "   ý¿9 &<.AG5%}?0 # >BZ| 6 €6>$Z&57 ['ýÔa (I!  ÜÐ!#5654&'##5>762/ÜÄ.—/‹ €[A#ÄA@EI!A2(õx$¤¤ ™Â"0%+5654&'532'4&#"264.#2>™m@á'&½!:<$d3Go>;C$*34)x;='.& 1#K 9¢7#”,­' ¡ # ËÂ%+5654&'5324#"326Ë“o¾$$µw”X´&!dUßls$.$psÅþªZšÂ+%!5>54&'5!#.+"32673#.+6:>7šþŒ$$n'2ZY()Y *  rr$.#b-•'(¢   ÿ÷Â#"546323254&'53(E=M 'Ô²&û>H2-;% Â5!#5354.'#5>54&'532>54.537 í"HI&Ñ(&Ò'L/1 ²'$z¦  UF‘%)'$%ŒC,9  x²  šÂ%!5>54&'536:>7šþŒ$$Ì$ *! rr$.##þ¿ !YÂ%!#5>5##5>54&'533YÏ(©œž,'šŠ˜”$$(1þ~sþð#/%þ¨X#þÒ$ £Â#.##5>5#"#7!£ &2,'×*$8' N4#þ¦&*S7t ÿ÷ð #"&=4&'5332=4&'53ð+NQTv&Ð%:Az* ³#.²Sb[QÕ%$æ@8’².%ÿòÝÂ"&'&'&'53>54'53Ý €ZB#Ä.a8+/‹³!þ¿2(øu$ð‹tÿò¶Â>#"&'#"'.'537.'53>54.'53¶ Š \ p ‡  ´.*:[ &Ë $!(# {³ þ¦*ï(ð',V  uŽÇ5+ []T[RY ¢Â%!5#"#7!3267¢þ‡ Š/[þóŠE-‡‡•&2vþk(E ‡Â&'3#5>54&'5324.#"32‡/NI)&Í'$Â"<:"P/* qG,:|%('$ 4%( ­ÿë«.=#"&5462326='5##"&5463254&5677'54&#"326ë/!0""z*WY]vY91&V=(—?(,;B1=˜!., !¹+=@ƒ]\š+œ%ýÉ(,æ(54&567>54#53"67ù-!0" Á C[  ê ,h3Œ2Ì/]C&™(+ ˜!., !˜[vµ  â,þ` 3D"Â3 ÿ«*#"&5462326=#5>54.567>7-!0" Ó+"#b= ˜!., !˜)Ý!ý«  ÿæÌB#"&5462326=#5>=4#"#5>54#"567>327æ-!0" ¸(M(;" Ô&# K?;&3 ˜!., !˜&+Ña9þç!(ÿ9O">9&eU  ÿßÂK#"&5462326=#52>54&'3#5>?'.#53">54'5367ß-!0" °  T V(‘r^  Ï+< 9(ž4S5/; ˜!., !˜ † ¥  \ U *xWJL ÿÿÿ¢#fÂý$ÿÿ%ÿºÌ#fIýDÿÿQ!#eг%ÿÿÿöÔ9#eDËEÿÿÿuQ–#eŠýj%ÿÿÿkÔ«#eDý`Eÿÿÿ¢Q–#qŠý%ÿÿÿ˜Ô«#qEýuEÿÿÿ)y#v~Û‰ÿÿÿ)œ•"vï©ÿÿ­!#e·³'ÿÿÿöë«"e>ÞGÿÿÿu­–#e·ýj'ÿÿÿkë«#e\ý`Gÿÿÿ¢­–#q¸ý'ÿÿÿ˜ë«#q\ýuGÿÿÿ)­–#zÂ'ÿÿÿë«"zföGÿÿÿ%­–#X¸ý*'ÿÿÿë«#X\ý Gÿÿ U#C®ZÔÿÿÿö¨,#C^†Õÿÿ U#vdZÔÿÿÿö¨,#v†Õÿÿ ÿ%U–#XŠý*(ÿÿÿ¨Ì#X:ý Hÿÿ ÿnU–#hŠýZ(ÿÿÿd¨Ì#h:ýPHÿÿ ÿ)U[#dŠÃáÿÿÿ)¨‡"d:ïâÿÿ "!#ep³)ÿÿ9#e"ËIÿÿ ÿòÅ #q̳*ÿÿÿ&Ö "qRÇJÿÿ¾!#eÁ³+ÿÿ ç9#ePËKÿÿÿu¾–#eÁýj+ÿÿ ÿuç«#ePýjKÿÿ¾!#j³+ÿÿ ç9#jQËKÿÿÿ)¾–#zÌ+ÿÿ ÿ)ç«"z\Kÿÿÿ;¾–#dÂý@+ÿÿ ÿ;ç«#dRý@KÿÿÿnK–#hýZ,ÿÿÿáÿn+«#hÿàýZLÿÿ<#vÿÚo‘ÿÿ  A#vÿ¿›±ÿÿ"Ói#v®Ã.ÿÿù#v3ÛNÿÿ"ÿuÓ–#eÓýj.ÿÿÿuù«#eXýjNÿÿ"ÿ¢Ó–#qÔý.ÿÿÿ¢ù«#qZýNÿÿ ÿuV–#eŠýj/ÿÿÿu«#eÿâýjOÿÿ ÿuVô#qŠ›Þÿÿÿïÿu& #qÿä³ßÿÿ ÿ¢V–#qŠý/ÿÿÿïÿ¢&«#qÿäýOÿÿ ÿ%V–#XŠý*/ÿÿÿïÿ%&«#Xÿäý*Oÿÿ _i#vèÃ0ÿÿ•#v¾ÿïPÿÿ _!#e³0ÿÿM#eäÿßPÿÿ ÿu_–#eýj0ÿÿÿuÌ#eäýjPÿÿ ÿõÃ!#eÀ³1ÿÿåM"eSßQÿÿ ÿjÖ#eÀý_1ÿÿÿuåÌ#eSýjQÿÿ ÿ—Ö#qÁýt1ÿÿÿ¢åÌ#qTýQÿÿ ÿÖ#XÁý1ÿÿÿ%åÌ#XTý*Qÿÿ"ÿò°%#vœ—ÿÿÿöÖQ#v,«·ÿÿ"ÿò°Ý#jÂo—ÿÿÿöÖ #jR›·ÿÿ"ÿò°#CæZÿÿÿöÖ,#Cw†ÿÿ"ÿò°#vœZÿÿÿöÖ,#v,†ÿÿi#vJÃ3ÿÿÿ'Ö•"v ïSÿÿ!#ep³3ÿÿÿ'ÖM"eFßSÿÿ“!#eª³5ÿÿOM"eßUÿÿÿu“–#eªýj5ÿÿÿuOÌ#eýjUÿÿÿu“ô#q¬› ÿÿÿuO "qÇ ÿÿÿ¢“–#q¬ý5ÿÿÿ¢OÌ#qýUÿÿ*ÿòë9#ecË6ÿÿ3ÿö\M"e ßVÿÿ*ÿgë¤#ecý\6ÿÿ3ÿk\Ë#e ý`Vÿÿ*ÿòë#ec—ÿÿ3ÿön9#e(Ëÿÿ*ÿòë#ec“"ÿÿ'ÿö^9#eË#ÿÿ*ÿgë9#ecË ÿÿ3ÿk\M"e ß ÿÿQ!#eг7ÿÿ ÿöÎ"eê`WÿÿÿuQ–#eŠýj7ÿÿ ÿkC#eÿêý`Wÿÿÿ¢Q–#qŠý7ÿÿÿ÷ÿ˜.C#qÿìýuWÿÿÿ%Q–#XŠý*7ÿÿÿ÷ÿ.C#Xÿìý WÿÿÿgÁ–#jÀý\8ÿÿ ÿkßÂ#jMý`Xÿÿÿ`Á–#hÂýL8ÿÿ ÿdßÂ#hNýPXÿÿÿÁ–#XÁý8ÿÿ ÿßÂ#XNý XÿÿÿòÁ%#vš*ÿÿ ÿößQ#v'«+ÿÿÿòÁ¸#jÀJ,ÿÿ ÿößä"jMv-ÿÿÿõ¹(#h¾ª9ÿÿÿòÝT"hRÖYÿÿÿj¹–#e½ý_9ÿÿÿgÝÂ#ePý\Yÿÿÿõ¤i#CRÃ:ÿÿÿò¶•#CãÿïZÿÿÿõ¤i#vÃ:ÿÿÿò¶•#v˜ÿïZÿÿÿõ¤!#j.³:ÿÿÿò¶M#j¾ÿßZÿÿÿõ¤!#e-³:ÿÿÿò¶M#e¾ÿßZÿÿÿj¤–#e-ý_:ÿÿÿg¶Â#e¾ý\Zÿÿ À!#e¾³;ÿÿßM"ePß[ÿÿ À!#j¾³;ÿÿßM"jQß[ÿÿ¿!#eó<ÿÿÿ&ÛM"eMß\ÿÿ Ue#XˆÃ=ÿÿ¢‘"X8ï]ÿÿ ÿuU–#eˆýj=ÿÿÿu¢Â#e7ýj]ÿÿ ÿ¢U–#qˆý=ÿÿÿ¢¢Â#q8ý]ÿÿ ÿ¢ç«#qRýKÿÿÿýÿö'Î"jë`Wÿÿÿò¶±#f¿ÿêZÿÿÿ&Û±"fNê\ÿÿ%ÿöºÆ"V6Dÿÿ9#e"ËAÿÿÿu¢#eÁýj$ÿÿ%ÿkºÌ#eHý`Dÿÿ˜#tÒ$ÿÿ%ÿöºÄ#t†ÿþDÿÿÂI#vœ£„ÿÿ%ÿöº#v"Û¤ÿÿÂI#C棄ÿÿ%ÿöº#CmÛ¤ÿÿÂ#tÉ„ÿÿ%ÿöò¸#tRÿò¤ÿÿÂ#hŠ„ÿÿ%ÿöº@#hJ¤ÿÿÿuÂ}#XÂÛ Dÿÿ%ÿkº‘"XIï EÿÿÂ?#vœ™Äÿÿ%ÿöºk#v"ÅÅÿÿÂ?#Cæ™Äÿÿ%ÿöºk#CmÅÅÿÿÂ#tJÄÿÿ%ÿöºF#t†€ÅÿÿÂþ#h€Äÿÿ%ÿöº*#hJ¬ÅÿÿÿuÂs#dÂÛ Dÿÿ%ÿkº‡"dIï Eÿÿ ÿuU–#e‰ýj(ÿÿÿk¨Ì#e9ý`Hÿÿ U˜#tÚÒ(ÿÿÿö¨Ä#tÿþHÿÿ U(#hŠª(ÿÿÿö¨T"h:ÖHÿÿ UI#vd£Œÿÿÿö¨#vÛ¬ÿÿ UI#C®£Œÿÿÿö¨#C^Û¬ÿÿ `˜#tÀÒŒÿÿÿöøÄ#tXÿþ¬ÿÿ U#hŠŠŒÿÿÿö¨@#h:¬ÿÿ ÿuUe#XŠÃ \ÿÿÿk¨‘"X:ï ]ÿÿÿ;#tÉ,ÿÿþðý»"täõóÿÿÿu;–#eÿÿýj,ÿÿÿuý«#eÿßýjLÿÿ"ÿg°¤#eÂý\2ÿÿÿkÖÌ#eRý`Rÿÿ"ÿò°œ#tÖ2ÿÿÿöÖÂ#tÿüRÿÿ"ÿò°I#vœ£–ÿÿÿöÖ#v,Û¶ÿÿ"ÿò°I#C棖ÿÿÿöÖ#CwÛ¶ÿÿ"ÿò°œ#tàÖ–ÿÿÿöÂ#tyÿü¶ÿÿ"ÿò°#hÊ–ÿÿÿöÖ@#hT¶ÿÿ"ÿg°}#XÂÛ pÿÿÿkÖ‘"XSï qÿÿ"ÿòÄ#[äÙbÿÿÿö§#[‚cÿÿ"ÿòĈ#\Ñâbÿÿÿö¥"\_ÿcÿÿ"ÿòÄœ#tÖbÿÿÿöÂ#tÿücÿÿ"ÿòÄY#hÐÛbÿÿÿöj"h]ìcÿÿ"ÿSÄ#e¼ýHbÿÿÿW(#ePýLcÿÿÿgÁ–#eÀý\8ÿÿ ÿkßÂ#eLý`XÿÿÿòÁ˜#t Ò8ÿÿ ÿößÄ#tÿþXÿÿÿò:’#[ëìqÿÿ ÿö¬"[drÿÿÿò:Œ#\üæqÿÿ ÿö¦"\irÿÿÿò:˜#t Òqÿÿ ÿöÄ#tÿþrÿÿÿò:P#hÔÇqÿÿ ÿö€"hJrÿÿÿS:P#e¼ýHqÿÿ ÿW|#eýLrÿÿ¿i#CèÃ<ÿÿÿ&Û•"Crï\ÿÿÿu¿–#eÃýj<ÿÿþ›ÛÂ#eMü\ÿÿ¿˜#tÒ<ÿÿÿ&ÛÄ#tžÿþ\ÿÿ¿(#hĪ<ÿÿÿ&ÛT"hNÖ\ÿÿ)ÿö."á Nÿÿ)ÿö."á †ÿÿ)ÿö.ð"á [ÿÿ)ÿö.ð"á hÿÿ)ÿö.ð"á \ÿÿ)ÿö.ð"á iÿÿ)ÿö.L"á ]ÿÿ)ÿö.L"á jÿÿÿÿ®"ÂT«Ìÿÿÿÿ®" †ÿZÿªÿÿ0®"Ân [‹¾ÿÿÿí0®"Ân hˆ¾ÿÿ 0®"Ân \–¾ÿÿÿú0®"Ân i–¾ÿÿÿí&®"Âd ]ÿÿbÿÿÿä&®"Âd jÿ‡ÿbÿÿ)ÿö"å Nèÿÿ)ÿö"å †èÿÿ)ÿöð"å [èÿÿ)ÿöð"å hèÿÿ)ÿöð"å \èÿÿ)ÿöð"å ièÿÿ!;–#ÆæTÍ´ÿÿ+E–#Æð ††’ÿÿ•–#Æ@ [£¦ÿÿŸ–#ÆJ h ¦ÿÿ•–#Æ@ \¤¦ÿÿÿþŸ–#ÆJ iš¦ÿÿÿ Û"ç Nÿÿÿ Û"ç †ÿÿÿ Ûð"ç [ÿÿÿ Ûð"ç hÿÿÿ Ûð"ç \ÿÿÿ Ûð"ç iÿÿÿ ÛL"ç ]ÿÿÿ ÛL"ç jÿÿÿìh–#ȪT˜´ÿÿÿâ^–#È  †ÿ=ÿ’ÿÿÿîÌ–#È [ÿxÿ¦ÿÿÿÐÌ–#È hÿkÿ¦ÿÿÿä–#È \ÿoÿ¦ÿÿÿÉÌ–#È iÿeÿ¦ÿÿÿÄÔ–#È ]ÿgÿJÿÿÿ½Ì–#È jÿ`ÿJÿÿ!ÿö "é Nÿ|ÿÿ!ÿö "é †ÿ|ÿÿÿòÿö ð"é [ÿ|ÿÿÿáÿö ð"é hÿ|ÿÿÿñÿö ð"é \ÿ|ÿÿÿàÿöð"é iÿ|ÿÿÿÙÿöL"é ]ÿ|ÿÿÿÙÿöL"é jÿ|ÿÿ –#ÊÒT¿´ÿÿ –#ÊÒ †ÿnÿ’ÿÿ3–#ÊT [½¦ÿÿ•–#ÊZ h¶¦ÿÿ=™–#Ê^ \Ȧÿÿ™–#Ê^ i´¦ÿÿ–#ÊT ]ÿ¤ÿJÿÿ–#ÊT jÿ¥ÿJÿÿÿöÖ"ï NÿÿÿöÖ"ï †ÿÿÿöÖð"ï [ÿÿÿöÖð"ï hÿÿÿöÖð"ï \ÿÿÿöÖð"ï iÿÿÿûÿòZ®#ЪT§ÌÿÿÿûÿòZ®#Ъ †ÿVÿªÿÿÿÕÿò–®#Ðæ [ÿ_ÿ¾ÿÿÿéÿòÈ®#Ð h„¾ÿÿÿÕÿò–®#Ðæ \ÿ`ÿ¾ÿÿÿìÿòÒ®#Ð" iˆ¾ÿÿÿöÐ"õ NÿÿÿöÐ"õ †ÿÿÿöÐð"õ [ÿÿÿöÐð"õ hÿÿÿöÐð"õ \ÿÿÿöÐð"õ iÿÿÿöÐL"õ ]ÿÿÿöÐL"õ jÿÿ Y­#Õ´ †ÿeÿ©ÿÿÑ¡#Õ, h ±ÿÿÛ #Õ6B i¡«@5@ÿÿÿûѪ#Õ, jÿžÿ^ÿÿ)ÿöŒ"ù Ngÿÿ)ÿöŒ"ù †gÿÿ)ÿöŒð"ù [gÿÿ)ÿöŒð"ù hgÿÿ)ÿöŒð"ù \gÿÿ)ÿöŒð"ù igÿÿ)ÿöŒL"ù ]gÿÿ)ÿöŒL"ù jgÿÿ‡®#Ù¾TºÌÿÿ‡®#Ù¾ †ÿiÿªÿÿÿü×®#Ù [†¾ÿÿÿÞ×®#Ù hÿyÿ¾ÿÿÿü×®#Ù \‡¾ÿÿÿ××®#Ù iÿsÿ¾ÿÿÿÊ×®#Ù ]ÿmÿbÿÿÿË×®#Ù jÿnÿbÿÿ)ÿö.ð"á zÿÿ)ÿö.ð"á …ÿÿ)ÿöð"å zèÿÿ)ÿöð"å …èÿÿÿ Ûð"ç zÿÿÿ Ûð"ç …ÿÿ;ÿö ð"é zÿ|ÿÿ;ÿö ð"é …ÿ|ÿÿÿöÖð"ï zÿÿÿöÖð"ï …ÿÿÿöÐð"õ zÿÿÿöÐð"õ …ÿÿ)ÿöŒð"ù zgÿÿ)ÿöŒð"ù …gÿÿ)ÿ." C Nÿÿ)ÿ." C †ÿÿ)ÿ.ð" C [ÿÿ)ÿ.ð" C hÿÿ)ÿ.ð" C \ÿÿ)ÿ.ð" C iÿÿ)ÿ.L" C ]ÿÿ)ÿ.L" C jÿÿÿÿ‘®" ¦ Miýÿÿÿÿ‘®" § Miýÿÿÿíë®" ¨ì MÃýÿÿÿÏë®" ©â MÃýÿÿÿ÷ë®" ªì MÃýÿÿÿæë®" «ì MÃýÿÿÿãë®" ¬ö MÃýÿÿÿÚë®" ­ö MÃýÿÿÿÛ" R NÿÿÿÛ" R †ÿÿÿÛð" R [ÿÿÿÛð" R hÿÿÿÛð" R \ÿÿÿÛð" R iÿÿÿÛL" R ]ÿÿÿÛL" R jÿÿÿìi–# MAý Âÿÿÿâ_–# M7ý ÃÿÿÿîÍ–# M¥ý ÄÿÿÿÐÍ–# M¥ý ÅÿÿÿäÖ# M›ý ÆÿÿÿÉÍ–# M¥ý ÇÿÿÿÄÕ–# M­ý Èÿÿÿ½Í–# M¥ý Éÿÿ)ÿŒ" | Ngÿÿ)ÿŒ" | †gÿÿ)ÿŒð" | [gÿÿ)ÿŒð" | hgÿÿ)ÿŒð" | \gÿÿ)ÿŒð" | igÿÿ)ÿŒL" | ]gÿÿ)ÿŒL" | jgÿÿˆ®# M`ý úÿÿˆ®# M`ý ûÿÿÿüØ®# M°ý üÿÿÿÞØ®# M°ý ýÿÿÿüØ®# M°ý þÿÿÿר®# M°ý ÿÿÿÿÊØ®# M°ý ÿÿÿËØ®# M°ý )ÿö.À /@#"&533267#".'##"&546323733265'4.#"32>ƒ€CG9.0-È9 d:Zks\AJ  T#+¡<-$2 9,.<ÀXE.3.3ý«u#!8H‹\^’cG {r<B~,UF0LD"+OAOZ)ÿö.&7!5!#".'##"&546323733265'4.#"32>’þÉ7œ9 d:Zks\AJ  T#+¡<-$2 9,.<K6ýêu#!8H‹\^’cG {r<B~,UF0LD"+OAOZÿÿ)ÿ.ð" C z)ÿ.Í"1B%#".'##"&546323733265#"=332654.#"32>.9 d:Zks\AJ  T#+]JL<-$2 9,.<ku#!8H‹\^’cG {r<BþðXOc.NŽ,UF0LD"+OAOZÿÿ)ÿ.ð" C …ÿÿ)ÿö.¶"á Oÿÿ)ÿ.¶" C OÿÿÂs"ÂdÂÛÿÿ "Âq³ÿÿ¤# zÿ_ÿ´Âÿÿ¤# …ÿ`ÿ´Âÿÿ›¢# MsýÂÿÿÿ¬lUCTÿXaÿÿÿ(ÿµµ¥-N#"'732654#"#"54632N;*& $%'/ 4<•*> $-*;]U™¶#"&#"#>323267™6'V%6*T¶)8+++6+l-¨"#"&#"#>323267"&462"&462¨6'V%6*V((¢(()8+++6+¤((((ÿÿÿÛð" R zÿÛÍ#2#4#"#4.#"#4323>32#"=33265ÛT>U*[$ F='4 º]JLà&cþ´@gd",,D`27%þ6XOc.NÿÿÿÛð" R …ÿÿÿ Û¶"ç OÿÿÿÛ¶" R OÿÿÿÍä# zÿ ÿ´ÆnÿÿÿÌä# …ÿ ÿ´Ænÿÿ^¤# zÿCÿ´È ÿÿ^¤# …ÿDÿ´È ÿÿ¿–# M—ýÈv-ð #.54632#7254&+"&5432" evO *(--505 7c7 #8u-€ð #7>2#7254&+"&5432€S(ŒwP*(-Õš Rc7 #8]-šL*#"&#"#>323267#"'732654#"#"54632š5(T% 6*V>0 %(/L*7+++6+Ï 0 !.ÿæÿö À #"&533267#"&5332>=3ÿ€CG9.0-'/97/TÀXE.3.3ý¯;>;9Yþ… #ÿ×ÿö!5!#"&5332>=3þÉ7/97/TK6ýî;>;9Yþ… #ÿíÿöð/"&462#.5462"&462#"&5332>=3((R".((Ø/97/Tq((`505  V((ýâ;>;9Yþ… #ÿèÿö ð-"&462'#7>2"&462#"&5332>=3 (()S(~((Ý/97/Tq((Hš q((ýâ;>;9Yþ… #ÿÿÿÙÿö¶"é Oÿ|ÿÿÿèÿö$"é Pÿ|ÿÿ;["ÊdÃÿÿ Bô"Êq›ÿÿÛ–#Ê  zÿVÿ¦ÿÿÑ–#Ê– …ÿMÿ¦e-Žð $#.5462#"&54632#"&#"327Ž"g &99.+"! -505  Ž 9&.6')d-”ð $#7>32#"&54632#"&#"327”"' •&99/,#! Õ 505š© 9&.6')]-™L*#"&#"#>323267#"&54632#"&#"327™6'T%6*TD!/.) L)8+++6+þë /!(."ÿöÐÀ 1#"&533267#"&54654#"#463232654&54632ƒ€CG9.0-jÂHP#0(610$2=F=?ÀXE.3.3þqþÅXI$‘$9\:FO4|6@g@(Ž$”ÿöÐ(!5!#"&54654#"#463232654&54632’þÉ7>ÂHP#0(610$2=F=?K6þ°þÅXI$‘$9\:FO4|6@g@(Ž$”ÿöÐðA"&462#.5462"&462#"&54654#"#463232654&54632Ÿ((R".((ÂHP#0(610$2=F=?q((`505  V((þ¤þÅXI$‘$9\:FO4|6@g@(Ž$”ÿöÐð?"&462'#7>2"&462#"&54654#"#463232654&54632š(()K'~((ÂHP#0(610$2=F=?q((H‚š q((þ¤þÅXI$‘$9\:FO4|6@g@(Ž$”ÿÿ,ÿ#á"ñ Nÿÿ,ÿ#á"ñ †ÿÿÿöж"õ OÿÿÿöÐ"õ Pÿÿ)¥s"ÕdÀÛÿÿ)¥ "ÕqÀ³ÿÿ0E®#Õ  zÿmÿ¾ÿÿ/E®#Õ  …ÿnÿ¾ÿÿæ–#ÒÈ †ÿbÿ’|-Ÿð"&462#.5462"&462Ÿ((R".((q((`505  V((w-šð"&462'#7>2"&462š(()K'~((q((H‚š q((Ã-4ð #.546324" -505 ÿÿ)ÿŒð" | zg)ÿŒÍ@O%#"&'##"&546732>54&543232>=4.'5#"=33265Œ`R9>>9R`j]*  #",/.+1!+ &]j¸]JLäW—I;;I—W_ˆ#9(  8&(023S(Õš ¥-N#"&54632#"&#"327N%*<=4/'%": >*4;*-$'Éú73#'ööú1ÿÿ'Éú ‰ÿÿÉôú ŒÉôú5!!ôþ ú1Éèú5!!èüú1ÿÿÉèú ÿ)ôÿµ!5!5!5!ôþ ôþ ô×2(2s±þ¤7632#"&5467¨  !".>2 R 3&-T82O±Ú¤#"&54632'654¥   !".>2 R< 3&-T82OÿsÚf#"&54632'654¥   !".>2 R 3&-T82s²þ¥"&#".54>32À&, R $&9; Z/)+±ž¤'7632#"&546737632#"&5467`  !".>2 Rö  !".>2 R 3&-T82 3&-T82±‘¤'#"&54632'6543#"&54632'654t !".>2 RÚ !".>2 R< 3&-T82 3&-T82-ÿs f'#"&54632'6543#"&54632'654ƒ  !".>2 RÚ  !".>2 R 3&-T82 3&-T82+²ž¥-"&#".54>323"&#".54>32x&, R $&Ð&, R $&9; Z/); Z/);ÿk»¤."&'#54&'6=#"5463254&5462>32•\&*(*)S , ]$$$%-O”Ž+h¯{{EŸ3+„ +" 2f i="&:ÿgº¤P>32#"&'>32#"&'#"&5465#"&463254'6=#"546324&54632)$&\ \%(%\  [&$$&[ [%())S , [&$vg?"& w0LI"?f g?"& %6r +">f (Ä6Ò 2#"&546®:NP78ONÒO:6OO98N(´6ã7(´/˜oÿõxd #72#"&546!2#"&546!2#"&546¦!" !c!" !c!" !d" "" "" "ÿíâÂ*6BN[232673##"'#"&54632654.2#"&546"32654&%2#"&546"32654&È"0 ,5C,þR/Š5(#)`F2DtK '95O '@.2d@3FuT0Q 3S#D.2d?4FuS&? 3S"¤Bý,’ O”O:U€~A'‚VþÔ=8[P:Pƒ™H(O&2=8[P;P‚]d(O'1ÿíL 1?N\kyˆ #'#"'#".54632326732654.'2#".546"32>54&%2#".546"32>54&%2#".546"32>54&7þR/ƒ 4%+_G $rN#2",7?þC 5M  2 É.3e>%)wQ3*B#C.3e>%)wQ3*B#C.3e>%)wQ3*B#Âý,‡Q–:&E…#>þê-†C  =H7632œq O4A W (Là I-;Q ' 9^0! 747'&5432#"1€K6  7( AfD *¢]A 6";XDÿæb3 )3''7'77"&5462"&5462$"&5462"&5462=ÜÜ%ÝÝ%ÜÜ%ÝÝÊ&$ .!%&$ .!þì&$ .!¹&$ .!çÝÝ%ÞÞ%ÝÝ%ÞÞH!"þ!"Ñ!"!"ÿÿ‚ÿ÷:¤#MDÿøž¤,8#'.54327>54&#"#"54632"&54632ž-/)#46 86!<&2g<-3'±" "þ"?7:V2x$®TR Ž X3L% ,?EK#=ýÔ ÿÿ#ôUB 5yŠy732>7#"&5EJxI &P9O<>Z-=}`€Ùp "6 #8# )Z))‚5yŠy7>32.#"5EÙ€`}=-Z>7'.54>3254&5432>32#".'#"&54654#"&54>7'.54>3254&5432>32#".'#"&54654%#"&54>7'.54>3254&5432>32#".'#"&54654Ë&0*C =) 4(%8& $F!Y,$2Ý&0*C =) 4(%8& $F!Y,$2¬&0*C =) 4(%8& $F!Y,$2Õ.  7 -L' X9%'6 :N U þ¥.  7 -L' X9%'6 :N U .  7 -L' X9%'6 :N U +–!*#5!ö*””ÿXÿòK¤ #Kþ>1ŤýN²XÿKý¨74675.=463"&5X$77$OV3(#22#(3VOy:9  9:£S8 96·22 22·69 8TƒÿK(¨%#5>=4&'>=4&'52(OV3(#22#(3VO$77$y¢T8 96·22 22·69 8S£:9  9ÿÿDÿøZ¤#"¼"ÿÿDÿ÷©¤#¼"ÿÿ‚ÿ÷ë¤#"MÿøÁ #"'7!ò€Ù)+ ;r€3“þFÿÿÿêÿf–Cx¬À@ÿû1¥4>32#".7"32654&21GTYB21›P+%"$!Ø:U+s^\u,Yí¶ZZbR]Y9ø¥ 2#"&4657#5>=4’Ev"¿ ¥&&¾&× ‚!2£ ##5#53#527F´Ë/F‡¡9ZZ1 þþ³³ ²##"546232654&'&#"54657327+ nZS4 429> K˜‡df EU2',*6“B%Jÿþ0©"&54>7632'"32654&œGW &=kF£'@JPQ,,&!+aP9@0%|G<@Nê&*?@3,5;ÿý(£ ##"'7(ŽG† £ þx[_*¦!-#"&5467.54632'3254'>54&#"¶G-RL;M35N=:L*S'&( E> ,#'(ï'6&09:-&%))+83&*^&-%,<&$"(ÿÿÿþ 0¯ ½.µÀ2}úE ##5#5353úK2KK2ú2KK2KK2Èúú#5úÈú222–ú,#57#5úÈÈÈÈ22d22ÿó@"*5>7>32#5>=4&#"#5>=4&# H"&$0› +ï02(ze! xÿÿÿûÿ-1Ï ¹þ*ÿÿ9ÿ8øÎ{þ*ÿÿÿ8(Îtþ*ÿÿÿ0#Îuþ*ÿÿÿ82Í »þ*ÿÿÿ0 Ü ¼þ*ÿÿÿþÿ00Ó ½þ*ÿÿÿýÿ8(Í ¾þ*ÿÿÿ-*Ð ¿þ*ÿÿÿþÿ60Ù Àþ*ÿÿ2ÿúe Áþ ÿÿ2ÿèú Âþ ÿÿ2ÿ¶úL Ãþ 7„³H";54&'5!#.+"32673#./32673!5>=#"&546323273#.$23^F#i'8\ i++i#A>þ‘#^ˆ‰^$RM—+W;ff~% a- —'ž)© %4s &•tul™8Eÿuy.4=327#"'#7&'#7&54>3273733273#&'&'õÂ$.zh?o?&#.$1 9$?Œ:`yA)$*%/$2& f¼c'IJ-6³YýÓe!3&„Œ¢³\ÇQ†T.vy ‡!ádB ýæC@W|Oþÿòy¤J"6=4.#"5673>32#"&#"327#"'#5.54>323273#.y<@0J? NF"7' 2zh?o?81-Td:`yA5x& p|+BoGiŠ ú Y3(#:á-e!3&%yQ†T.!!áSf "–-.+3267#.+!5>54&'5!#.+"3267¨ +0zz0,),:z$7þè8#4 9Tˆ z;+Z hÇþ®/7!$>±8B' – + ÿøê¤ Q72654&#"%#"'#"&54632654'#53.'#5354632#"&54#"3#3#32>2N!&/­cG7W&(3* uohdoT=4.#"3##54&#"#52>=4.#"567>32Ÿ9C010vÛ) )' ¡&Do %,G""Þ HD&$6B–ª‘²Î-Ó&u¯"rNS452 þæ! ýK ÿõÖ159=A#535#535.#53354&'533#3####5>57'#7'#5#35mVVVV$ «¼Å'9ë RRQQÝÝ&8ë;&ä8€[YŸ 7%B.F.¢$ìYQ+2+Y.F.þíuL2.N£FFtootFF.SS\–%+#"'!5>5#5354&'5!23'&#"#32ò$$:þè;MM7FoM>« ´åå —Á¡¶6"%<I.:5 !M9..‚ `.vÿÿÿö÷–#V›5ÿõ¤–GLPSWZ.'5337'.'5!"37654.'533#3##&'##&'#53.'#5&'#%#3#%7##’!&##õ$ 5µ!#* M 'µ%Æ$ 9}Ž §·1+Tpd&;µ¥Œç -“^;þì‘J9ªV_! ‹-R<& ec*œ. &.‡Œ6Ýþís . 0 .t!%FFF.N|FF.K"ÿòä.%#"&'#73&547#73>32&#"!!!!327Ã(šM…¬K1F9³~K—'l‚(?3. žþqqþ¨xf{gq;D{. .uD;i,V9.  .c|eÿ1  'Ui#"&5##6?>324.#"32>%#"&#"&#"'>32>7>7#"&54>324&#"326 ¥q15@e1*h-A L)1K&*0K&þ”þþÅ?-£ F,"5 %3!@†` 3d•Ž;|ºjzl) QYmW(†­"r»é_o³}Š"4-%-@_W! .?\U‡Ââ*'&6KP/,J*6*9pB+B@b3Ÿ”p£#/J4J o+Õ*ÿ©"×%/323273#.+232>7#5$4670" M!    7%,$)/[F"þú…*; &=×?!!â6/$ý® &>=JIAž¹ýŠK.O`Be8#ÿóò 2 &5464.#"326‘ÑÓþÖÒÕÙ5L]H–bT¿ˆ‡¿ÂÕ’•ÓÓ—•Ðþ™JwF.l\|‰ÀÀÿòy¤ %%".54>323273#.#"327y?o~sb::`yA5x& pX947BzhþyPq!3&'O‰ZQ†T.!!áSfýße$ÝP£šÿÿÿò¥¤#&,rØÿÿN¤#),rØÿ1ã¹(6#"54632326767#"&54>3274&#"32>ã & ‹\N +]*9D#52W‹A=  2e:2g<ª)¨‚;`‹@  u6=„!==$F7@šm=.I&r0-u‘!ÿêØÍqz326?6323>3232676;2#"&54?#"#"&54632#"'32767+"?6?#"&54654#"+"54632%"67654#!'\&™ä€jÃaG14®tIc9#U( <^$:9L@<.yAÃP9K0#!$ ?4d–+H±J VÒJ3.)%4$ i'!&j3–bÜP0@73%•þÕ©@6FI?fE3K8 FD60TkY¨[ˆ)& @"×>YiyW963 kU™…pD+-ÿbp«D%&#"'>32654.#"''7654.54>7327#".'67p+BD< FA+! !<4Dv+U4'GF5hJ$ lK,+,)2O6>9BL0J=l8c{ÂP3nQ/S;+EO; V:!';45E%*J-@:/g4HN::1"–+9)5>=!!5>54&'5!!54&'5!%4&'>"þê<þÑ9þ†<<z9/999ý­   &<ÃÎ3#!8¼9!5ÂÂ7!5þD3#e±%#!'þD&"'ÿ÷Þ«23267#"&54?654&#"#654&#"+567632ÀQ  ( -?&7 Z'!K‡ LQx‡^%v þñ 2 A1KÏ R;.XsV  þ@Ó%ÿ÷Þ«;%#"5454&#"#'?654+5677>3232>7Þ;-R ^ Ksa y&PM.¤ ¼='@H Q i$&(.2 d)/]m¶#!+?@  ©:!Cä7K/ þä :ÿï¸Í J>74632"'326?&547>7632>54'46;2#"&ÿK(DO4Fws"<þy/#!$( v?ž=^5&xm£5LtG)(Gr  I9-/;Ý\:N!y:UE##E1TxÝ?":{VWAL6G, 0ieK[ yG*>b\‚( ÿËBä@4632#"/&#"'763232>54/&54?&#".9ˆl-“H_ƒ UC  +W Œ" "(WG„SD[+&6!,<#Vs.(lð&8D( V5K )))*)U?G;9(  %A ÿï ÍCLT"327>3232676;2#"'+"546;26?#"&54>32"327&"67654TO¨`O7\gZ#,-ΰd=dnG1x" M|3TxfR„IQEWP:V c€Yƒ:!þP11^:H@Æ&çÁU/¦‘H16Lrm:)$]°ŒU=B/KD22&1:Rz@=5sK ý£$ -mþ¿%xC.3ÿõ°¥%0327#"&54>7'7>324&#">°-S7**F?[8/5\ o%(?%$/=#+#+H%X$LI*‚\&v=W54&'5!34&'53&'>' þH&8þ±>##>'9ëýªƒ2+ýò$þzL2#6¼7 þNQ+ýý¹9þD< 3ÿñ›2>I!5!4&'5354&>7632#"&#"##"&546323265%2#"&5463254&#"t$ý%;ªû 3#,6 þÌ4L'(8 _@QXA?RU ,%G-$ '22L/þJÍ20'# $+@þþÅ|b#6PøK;?UO<@Ok=QW9H(&ÿòÒ¤83254&##"&6324&#"326'+#5>=4&'532l+E(=Å‘ÇÇ‘Ž¦wy¨©xu¨|D0? $¢$ %±0Cõ¨V))þàÈÈ Êþ¦{µµ{z´µÆ-0c  ñ .-žÿ-f=LX4>7.547>7>7>32#"&5463232>54#"#"&2654/ž) W0+, ,,0 RG!1y(8V/Nu>6A &&4f=Cƒè2$ 8Fp' $./O8"=?ee+  "\* O aH%2KX-voLA2&@oœDgþçs.I%; G'&+6AI!N;*=‚–"0#"'!5>54&'5!24#"324&'>‚=>–$$:þ„<<lq•m¾ «þ³  âN9;¶6" 9¼:Z\‘ þüб&" (þD( %"ÿN½¤',#"/.546324&#"326½!îh/'JI-Â…?s]83PX+9Uo~W1,,1[zþ¢L±z7 .L{L¢¸,T‡SNO. : C韗ýÇš_óQ©¨ÿþÿïwÍ ƒˆ>54'324632#"'326?46367&#"3267>=472#"&54>763263232676;2#"&54?65##"&#6‘Hjnpý/#!# >3;Ž=[Ž<{rä;7BF%?&mA7-&:*vW~q…J- $ "0>+ "K_/ ¦"!NQ4""J>ÌU;Pe$cz='U¶þÓ<" wU€ ¾f,~SO4 615 K:,«&")/%^z-A/ %E/(+0i(HC…2#qHnX€':ÿñ÷Þ[46327632327.'.+'7'&#"'&"'7>32>54&#"'>54.u`0)"ƒ ¡¶),!n((  ÁQ?&h&&FN+AW%7 _0 $ %55%\p._ Œ5gJ XSW-†K )qv^`2)X =7>ˆmœ•)" 0 1' 4  ">÷–!-;!#!5>54&'5!24#"2>4&'>÷¡î8 :þ‡<<x)KV4$=Î$3ݬ'$,K,#þ°  4Å4# 9¼: !K6&< ý-Öˆö:þ¸±&# (þD(! &ÿò“–)5!#'#7'!5>54&'5!2734#"2>“¡5-)š8 :þë:6)KV4$=T,&[$3ݬ'$,K,#DR{ÇÅ4#%<±6 !K6&< gLrp-Öˆö:ÿ£“:'+09#'##7#5>54&'5!27'5'654'&#"27¯t$=Î$3¡ÄI0K-:64-¿ô 8ÍHe@*B'6‚)r&< ý-ýÝ ]]%<±6 B?,Qþ=׿Ûf6=öøcŸ%U#5>5#3#5>=4&'533%#"&+"#5332654/.546323273#&#"cº$™Œ(#‹|‰…  ý¾R0F    ,,/445A=7 L!#&b&%$þ¥Nõ *ù!þÊ6þñ ]6> /#&8-+C {n%):/½–;#5>5#"#5!#.#>=##5>=&'533#î &«% 1 Y í% š — ƒ 0yš g  %ª‚þÊ$$6%XX%þ” %ìþÈ6ß$$ù0þË5ÿ$ÿ£¹:%%#.'5!'5654.'53#-L-`š'% .)J¿ô›4“Í$"ÞŠç WB% [¥?,Qþ,to9 "9ýÏ Í–%!5#"#7!!2>7#3ÍýTµÝ3B! †þP/?$ DAþ`=°°a.!"«ýŸ/#$Àý¶ÿÿ!ɤÙÿÿ!ÿöÉšCÙš@Àÿùÿ^B¢B%#".#"#>323254."'67&'732654&#"&54632B­w6K$9%'54&Ž1B4 6/ "3<:KOCs N:jKaFXgPs$44$%.'87'Ä!2H/"% 2* 9[>RlVAK\(Y;B^uÿÿ"Ó–.ÿÿ“‡"ÿò Är}‡"&54>327632#"&54>32#"32>54'#"'#"&54632"'3267>7&#"32>=472%>54'632"327&5,žßb†I4  5@K8[…: / +J.'A% =,oL%D5F?ÍU;N/"!$( B6;=IR™L?yoã96 +:uA W{²(SM€'+  $/ 5#V§b*!  ,9(i3">9~Q$ $/( !) /Xz.,%bY‚'%<" yVgm¤8'xQL5(ny J~Bao2(O® 2ÿüV«8%#".54>327327#"''654&547."3267V\[‹D%G/!1 KI*(=K&<"hY ^(&:) 1`CIy´X`iY+ejF,"^/#Y ")¨+RM)(Ÿ.0?.$-J)?qlA3:#ÿöóÌ%#"&4632!3267%!.#"ð~Ob‰‰bT€þ‡%54&#"#"5>32#".54>7&54>7632#"&546324#"3xF-#S6F+X<%8!?%3R.@K1Y6 -4'N _1MBR6KC7P)(9G6!B-K>MBr&$X+ Å6(n O ]+,>TP JND';.@:#^6 =n6$,V&,..T9."17+"5467>763267>32#"'"547#"&4>3232#"&#"32654&5463#"&>5&#")0#!$ ”+bV:@z ¦R):`D?&% $'#C!t 7(/ûgF`Ù~¼TBÄ? CÃ@G…W5A\{ p#4é-;@"@;_K&%!=Dif)A5"[ 537!.n¶(˜>aM'M4MU!5{>"Gz#E !ÿÿ "–).–ÀÿÜ¿Ïj7;>7676332>7>?6332676;2#"&547>7#"=>7#"&5463632#"'B: *Y:s IV<kþŒMH*© v-“/G-o  Gl'+-?IwEþô-47…B@Ca"Z7'&54>7>7"#"54>7&#"&/#57654&¯ Z  ¿!O +7$D2 3 VÁ 5 ¯:Õ" l!, 2'ò410R!- "!Uu/"=  4,3cá%S/5% l[¹$%!7!26=&#!"&546573!2[*ýì*¾ Gþà5& ,)R% ˜˜˜ /<)% 0  (+ þË #¹&%#&#"#73254&/.#"&54657;2# Á$­ #5& +!3N‚ ¡LL!,% .  L"ô¹##!"&546573!2ô   & þÉ5& ,)b '&t|nI")% 0  {«!5>=4&'52"&544(þ™42V==X;ºþ§((Ó(=X;;-+ÿÿÿòÓ¤#u°þ÷ ÿÿÿûÿòʤ#u§þ÷"tú ± ÿÿÿò¸¤# Ê˜È ÿÿÿñÿð¾¤"tð# ¼žþê ± ÿÿÿî´¤"uø# ¼”þè ± ÿÿÿûÿ쪤" »ú# ¼Šþæ ± ÿÿÿð»¤# ½‹þê ÿÿÿè¼²" ¼# ½Œþâ ± ÿÿÿòФ# ¿¦þô ÿÿÿûÿòá¤"uí# ¿·þô ± ÿÿÿòá²" ¼# ¿·þô ± ÿÿ$ÿòâ¤# ± " ¾' ¿¸þôÿÿÿòX¤"{æ ± ÿÿ;–,d–!)5>54&'5!!2654&#"dý®?"!@R?#$>þ×>#"?>$% 8¼7 7þD7!!9¼9!"8þD7#– !/%2654&#"!!5>54&'!>54&;>#"?>$%ì{?#$>ü…?"!@R?#$>?"!!9¼9!"8þD7#ƒ 7þD7! 8¼7 7þD7! 8¼7ÿõâ–,"!5>54&'5!#654&'53#.;=%$>þ×?"!@1.)—“ )Í%Þö'ƒ#7þD7! 8¼7[þ®o0 ;ýÏ%B'ÿÿÿõ¹–9ÿõá–,"#.'5!#654&'5!!5>54&¹%Þö %% .)—“ )õ?#$>þ×?""ƒ>ýÏ%C%[þ®o0 7þD7! 8¼9!ÿõ – 932654&"%!!5>54&#"#.'5!#654&'$=<%"|$þm?#$>ý¯?"">%Þö %% .)—“ ))þD7#"8¼9!#6 7þD7! 8¼9!>ýÏ%C%[þ®o0ÿõ4–,:H)5>54&#"#.'5!#654&'5!!2654&#"#2654&#"4ü…?""?$ Þö'& .)—“ )H?#$>þ×>#"?>$%ì>#"?>$% 8¼9!!<ýÏ%B%[þ®o0 7þD7!!9¼9!"8þD7#!9¼9!"8þD7#é–C"326?'.%!"7654&'53!563654/!5>54&'=?%#:#)BmJ<þ¤["U*q()î15/’À '(þ×23_w4 ,ýö?"!@‚"7þD6$!QÁ i3 v;Š2 !:¶þî+LŒ”A 8¼7ÿÿ À–; à–C%2654&#"!563654/#5>?'.'5!"7654&'5!¾7#)8.7/’À +Dý·23_w4 ,é'*@mF=2."U*q()?#$>#7¼6$#;¶þî,LŒ”A OÁ g4 v;Š2  7þD7!  – Q%2654&#"#2654&#"!563654/#5>?'.'5!"7654&'5!à=$%<;''ç6$&;.60’À +müŽ23_w4 ,é'*@mF=2."U*q()??#$>"8¼8"#7þD7##7¼7#"<¶þî,LŒ”A OÁ g4 v;Š2  7þD7!ÿÿ V–/ÿÿÿòy¤&ÿÿ­–'ÿÿ _–0ÿÿý«Lÿÿ«#LLÿÿ)«#L,#LLÿÿÿòó«#YLÿÿÿòÝÂYÿÿÿòñ«#LôYÿÿÿò«#L #LôYÿÿÿò«#L #L #LôYÿÿõ«#[LÿÿßÂ[ÿÿñ«#Lô[ÿÿ«#L #Lô[ÿÿ«OÿÿÿöœÌFÿÿÿöë«GÿÿÌP>4†Î%!'7!†ý$wÄÄwÜå!ÌÎ!.ÿ]Ç¥'#'7Ç!8 Ìáwý$ÜwÄÿÿ>4†Î ;ÄÀÿÿ.ÿ]Ç¥ <õÀ>4†Î '7!'7!'7†Ävý‘wÄÄwovÎ ‘!ÌÎ!"-ÿSƯ %'7'7'7ÆÌÍ!’’!ÌÍ ““ÄÄy‡xÄÄxýyy>ÿ]†¥#!†"ý-¿"é¿->ÿ]†¥#'''5!†-ý"鿇¿ý"é-ÿÿ>ÿ]†¥ AÄÀÿÿ>ÿ]†¥ BÄÀ>4†Î%!#7!'7!73!†þo-2-þçwÄÄw(*2*‚妦!ÌÎ!››>4†Î'7!#7!5!73!'7†ÄwþÛ-2-þ{”*2*wÎ!¦¦8››!;4ñÎ#7'3232>325&#"#".+7';Äw*cj2-Q=:D$5')XU-Q<:E$*cj2wÎ!’99/BB/&,Ub/BB/88!ÿý4³Î#'7#"#".#"563232>;'7³Äw*cj2-Q=:D$5')XU-Q<:E$*cj2wÎ!’99/BB/&,Ub/BB/88!>4†Î%!'#'737!†ýìwªvwÄÄwx¨wå!±!ÌÎ!±!.ÿ]È¥'75'7''ß!±!ÌÎ!±!£wªvwÄÄwx¨wýìÿÿ>4†Î IÄÀÿÿ.ÿ]È¥ JöÀ>4ýÎ%'!'7!7ýªývwÄÄwŒ¨wU!±!ÌÎ!±!8ÿÿH4Î MEÀ>4ÞÎ %#5!'7!53Þ8ýwÄÄwü84±!ÌÎ!±ÿÿ-ÿ1Çч OÿùÀ@ÿÿ>4ÞÎ OÀÿÿ-ÿ1ÇÑ PôÀÿVõ¯!5!''7'7'7õþ ô.ÌÍ!’’!ÌÍ ““ª2ÒÄÄyDxÄÄxý¼y>4†Ô!##5!'7!54>324"32† 5,8þwÄÄwí,1G9~??] .qq"ÍÍ ‘ +1F1??@>4†Ô!'7!#5".54632!'754"3†Äwþ8,5 G1,íwþ3~?Î!qq. 1F1+ !±@??@ 4_Î.'7#"#".'#".+'7322>3232>;'7_Äwcx::9:@CbwÄÄwb"F6:A3'+ 6D"cwÎ!iT` `T45!ÌÎ!/.dc>K>./!>4†Î'7!#7!'7!73!'7†ÄvþÜ-2-þçwÄÄw(*2*vÎ ‘¦¦!ÌÎ!››">¤Ë !##'73¤8ÂwÄÄwúâ!ÌÎ!>¤Ë '7##3'7¤ÄwÂ8úwýÌ!þ!>¤Ë ##7'7'3¤8ÂwÄÄwúËþ!ÌÎ!>¤Ë %'##3¤ÄwÂ8úwÎÌ!âýæ! ‡X5!3'31TpoT!7þ[¦¦nÿðZu3!'7!#7þ[¦¦nuýÏTpoT #³!#.#"7'7>32#AÙ™v¿(†!ÎË Œ(è“´ÿ™ÙˆloÎÎs‰°ÿ #³%'7.#"#4327#ËÏ!‡(¿w™ÙAÿ´“è)‹ÎÎÎolˆÙ™´ÿ°‰sl?É &54732654&''?ÓþÔÔj"[·‚¸4(">éfii–ÓÓ–q"a}‚··8Šfè>"ql?É &547'7&' 654'7?ÓþÔÔjfé? \··\#ii–ÓÓ–q">è@&`··‚}a"o>å†Î%!7!†ü¸ÝxÄåé!>4†%!'!†ýå†Î%!5!'7†ü¸Äxå8!>4†'7!5†Ýxý<é!8Ýÿ^Ʀ%37Æé8;ÝHýÿІx'7!5!'7!'7!†Äwý$ÜwÄý$wÄÄwܬÎ!8!ýÃ!ÌÎ!-ÿ^¦'#'%7'7ùÎ!8!=!ÌÎ!¦Äwý$ÜwÄý$wÄÄwÜ>ÿІx!'7!'7!5!'7†ý$wÄÄwÜÄwý$Üw!ÌÎ!þ‘Î!8!>ÿІx%!'7'7!!!†ý$wÄ££ÄwÜý$uuÜ;!Ì«©Î!8ŽŽ-ÿ^¦'#'#'77!8ŽŽ8!Ì«©âwý$Üuuý$ÜwÄ££>ÿІx%'7!5!'7!5!'7†Äwý$Üwwý$ÜwÄ£XÎ!8Œ8!Ì«-ÿ^¦%''73737Ì«©Î!8Œ8"Ä££ÄwÜý$wwÜý$w>ÿφ4 !7!'7!5†ü¸ÝxÄÝxý<Ké!Ëé!8>ÿφ4 !5!'7!'!†ü¸ÄxÝý†þ%!#7#'7373!!!%!3†þT2©LññLî2gþŠ'þXþò=<è€ii]ûý]]]8““JI>þ'7##7#'73733'7'#!%!3ñLõ2©LññLî2°Lœ=î'þßþò=<èû]ii]ûý]]]]ýJ““JI>†þ'7##7!5!7!5!733'7'#!†ñLë2þ–y'þ`¯2¦Lœ=ä' û]ii8“8]]]ýJ“>†þ %!'7!!!†ýyLññL‡ýJ=<·]üý]8JIÿ]¥ '#'#'7]8JI8]û´Lýy¶=<ýI‡Lñ>†þ '7!5!7'!5!'7†ñLýy·<=ýJ‡Lü]8IJ8]ÿ]¥ %'73737ûý]8JI8]NññL‡ýJ=<·ýyL>þ '7!'7!'7'!!ñLþ0LññLÐLœ=ýÒ=<0ü^]ûþ^]ýJJJÿS¯ %'7'7'7'ûý__ýû__“KLLDññNÞNññNþ"Nz6>?ýÌ?>ÿÙ° %Ù(ý0^ Ð'ýQ )\x3'Ð _ý0(¯x]( >ÿÙ° /'/'/Ù) ýQ'Ï ^ý0(¯x\LxýQ(Ð_ ý0'¯ (>ÿÙ° %?7?77Ù þ¤xýQ(Ð^ ý1'¯ {þ¢) ®(ý/ `Ð'ýRw>ÿÙ° %ÙýQxþ¤) ¯'ý0 ^ÐùýR )^w®'ý0` Ñ>ÿÀ†A%! !!!!!†ý½MþÊ5MCýŽhÚý'hq;]A@]8r8r>ÿÁ†B '7!5!7!5!'!5!'7†þËMý½rhý&ÙhýCMþÀ]8r8r8] 4$Î27'3232>732>3235".#".#"#".+7' Äw\A?:<=92), (#7A>9;<9D=5AcwÎ!54Nc bP>I>"854Oc bPcc./! 4$Î2'7#"#".'#".#"#52>32>3232>;'7$Äw\A?:<=92), (#7A>9;<9D=5AcwÎ!54Nc bP>I>"854Oc bPcc./!>4†Î%#53#53#'73†¤¤þࣣþáwÄÄwå8888!ÎÌ!ÿÿ>4†Î „ÄÀÿò2– #33#2þõþ*hµhw—K–ý\¤þçþ¿Ëlÿu`]%#"&54632#.#"3267` €nh’’hn€ H ZOJghIN[ opŠ“gôh’‰qPbhJþ IhbOÿöÎñ*74>32654&#"'632#"&%&#"32>(R6&A0TH5?)M6ošDa8PmT72>V0)%;¹DP7&C(uˆ 3DZƒ4=qÑ7|Y>G1HSC,–)5!2=!5!54&#!5!þ p!þÄ<þ¦é%2ñ%Ü%,ÿz )#7#53#53!5!73354&+5#32þÁ#4$‹O…Gþß+%0%Žb E{…N²!††%#%%„„þ×ÜþüþêñþÝÿäܱ'.#"'#7.54>3273'&#"74'32Ü 0R5+! 1:3 0R5'% 193¢&/!ã!¡'‚K(UaJ160®S(TaJ260®Ñ$A@T, Oï›Rýï`°3 %!Aýí’½°ýP3Ê$ÿí©Î !©þ¨þÓUçþIÎýáýÔù4äú%#"&46;#"!!;äºggº¾Jlkþ• pE¾”Ê”2eI2Jd4ÿšäh!&%#"'#7.546;733#3#;#"3#äº&0677#53.#"5632ž—{5!''9.%ÐÒlR"4,l†p¢( %E-7Ep+ ÿ›#ï3!5265!3!52654#5!"Â/2þÎ1/þš/2þÍ2/_^uýŽ1  1µýK1  1rcÿ›#ï%3!5254!"!4!"Â^üû_/232/f/122/ccr1  1ýKµ1  1ÿ…·ð.#!!2673!!^!;1þô¼ÉHVC6ýòéW K%'# þŽþ %=Ò˜Ó¥>å>%!5!>þå8>>!5!##5#53533>þä8ää8äÎ4þ´¶¶8ÁÁ>>¦"&5462##5#53533s,,êä8ää8ä‡,þ?åå8ââÿÿCÿò6¤ ±ëCÿò6¤3#C.Å1¤ýN>?™Â;74>7.546324&54632>2#"&'"&465"&>1U U; k  p0UU1 k  o³`ce^  _ce\>G³» #"&546324&#"32³mMOllOMm0R8:QQ:9NllNMmm†rQQ9:P>G³» #"&54632³mMOllOMmNllNMmmÿþÿ¿œ'7pû_£º{8A/3Oþ‡ ÿÿÿþÿ¿Æ#u`" Ÿÿÿÿþÿ¿Å# »`" Ÿ>a¸*:&#"327#".'#"&54632>32.#"32a!ZE!(++0/ -6@>RF@J$05-þü .,50Mš0x =#/)$*).fCK…GF#1Í ! I17n4>!¸#/#"'#"&546326324&#"326%.#"326!dOoa'w6GOfO;q#taGM9B7&f ++936þ¥i-47A7&gP€6XaHQT9‹`v;jO(94%D>8rE5;jO>¿)3!¿þ(Yþ¨>¿$)3!¿þO2þÊ6$þ>¿$ )33#&'¿þO2Ð)0u¡DO$þ«Y2T.‚>¿é-'4'6¿þ~ }€’”èè3K2r0J³1(XY)Pÿòð¤333P(P(²ýN²ýNÿëÿòT¤73##5#7373ð Dd(P(!De(P(¿!hþz\Sþ÷ß"iŒþžS>P,!# #3P9ÏÑ9Èþ8,>P, #3Pÿþÿ9ÑÏ,ýÔ,þ8È>P=!#4&#"#462P3}YW3žØœ9RyXþÇ5nš™o>P="&5332653PœØž3WY}3o™šn5þÇXyR97ÿ8*%"&54623254632"&5467&#"¦,C"'acQ,C"'acÈ.'Ï\‰.'Ïýs\‰7ÿ8w+V"&546232>54632"&5467&#"!"&546232>54632"&5467&#"¦,C"'%]N,C"'%],B"'$]N,C"'%]È.'!?B-[Š.'!?B-ýs\‰.'&!?A.[Š.'!?B-ýs\‰7ÿ8Ä*V"&5467&#"#"&546232>54632"&546232>54632"&5467&#"%#"&546232>54632"&5467&#""'#ZM,C"'$YM,CU"'#ZM#L"'#Z´\J,C"(#YM,C"(#: A?/ýs\‰.'& @@/[Š.û×/& @?0\‰9 A?/ýs\‰åa„.'& @@/[Š.' A?/Vÿ8z3:A%.546754632"&5467&#"#"&54623257>54&'#>nz†bdQ,B"'aLm/‡adP,C"(`TbmyVTbmnaU \h˜8\‰.'Ï8 Zo:g˜8\‰.'&ÏQT]Š‘ST7ÿ8wgkry2"&5467&#"!54632"&5467&#"#"&546232>=!#"&546232>=.5467546!!>54&'©,C"'% ]N,C"'%RmmR]N,B"'$þô]N,C"'%RmnQ]  þôù_GG_XH^^H.'!?B-55[Š.'!?B-B¸ŽB\‰.'&!?A.55\‰.'!?B-BZ\B[ŠüÜñùQÕ‚þÆ‚PR€>ÿú7ò #"&5462"&5462#"&5462p,æ,,þ,Ó,þS,,>ÿú7ò"&5462#"&5462"&54627,,þ,æ,,Ó,,þS,Hÿú²ò #"&5462#"&5462²,,Ó,þS,>ÿú7ò%"&5462#"&5462"&5462#"&54627,,þ,®,,þ,Ó,,þS,,>å>à "&5462!5!s,,êþÁ,û8>þì %!5!7"&5462"&5462>þÀ$&%!. $&%!. å8–"!þ"!>>ì !+"&5462"&54625!5!%"&5462"&5462>$&%!. $&%!. þþo$&%!. $&%!. ³"!þ"!8–"!þ"!8 Eâ %"&5462"&5462%632327#".#"u$&%!. $&%!. þÃ&w&TP T‚)TL O'©"!þ"!b„77m –76Y8ŸE@7632327#".#"8&w&TP T‚)TL O'¼„77m –76Y8ŸE@%&#"#"'732>32E'O LT)‚T PT&w¼ Y67– m776ÿüÒ3&54>54'7Ò65j ’!'!U€‰)\V"Y"Ž$I3AU*(80EÒ#"'#7&#"'63273327E‚.6A6N6&N(&w+5A6N=$TG–$¥Ä)X„$¥Ã+l>>·5!5#".#"'632327>þþ%uB0<O~ B.;M&9´…"*"m —")"Yÿÿ>>· ¿|6À8ÿÌE6 &#"!!#7#537#"'732>?332E'O JþæG6G®Å6:0‚T:B;63w3 Y»8´³8ˆ)– m 1 “€>;>û#".#"'632327!5!!5!>~(RKM&%u%SNPþþñ–66X„76lþë8â8> >û%-#7#537!5!733#!#".#"'632327>þ¿0D0{­aþò@0D0|®a~(RKM&%u%SNP<324d4324d€–66X„76l>ÿÌ>6,%!#7#537#537.#"'63273327#"'3#!>þÌ,6,–¬.Úð$ <1M&%u,456?P~Úð.;oo8r8[/X„&…ž l –E8r8KE·%#".#"'6323275#".#"'632327E!C/<O&&v&TP S)TL O&&w&TP S­—")"Y…77mÕ—76Y…77m8ÿÌE6.#"'327#"'#7&#"'6327.#"'63273327E&)NS9JJ6V$O&&w&)#0O&&v3KJ6U$S­—h0m —<»ØY…gY…:¹Öm>;>û$(#".#"'632327#".#"'632327!5!>~(QKL'%uB/=Q~(RKM&%u%SNPþñ–66X„")"l³–66X„76lþë8>>û$6#".#"'63232?#".#"'632327#".#"'632327>~(RKM&%u%SNP~(QKL'%uB/=Q~(RKM&%u%SNPG–66X„76l¡–66X„")"lþ£–66X„76l3<IÆ)#".'7327& '4>32I!(2C%&B3'! [¢¤Z[þºZ 01N+%C3'!½# # ggþ ff ') $ >;>Ç#4&"#53>23#"&'#532653>µ):(À•>Ç#4&"#53>23!5!>´):(Á–>9 "&462!5!!5!s,,êþþ,,ï8þý8>ÿÉ>9 "&462!5!!5!"&462s,,êþþË,,,,ï8þý8£,,>ÿÉ>9 !5!$#"&462#"&4627!5!>þþj,µ,þJ8˜,,ýÛ,,L8>ÿÉ>9 #"&462!5!!5!#"&462>,þþþj,,,ï8þý8£,,Qì!5!!5!%"&5462"&5462þþý¯%&$ .!%&$ .!J8þý8ü!"þ‚!">þì "&5462"&5462'!5!!5!þ$&%!. $&%!. Àþþ³"!þ"!æ8þý8>>ƒ%53&547#5!#3'4&#"326>þ¼ ½½! ¼¾'"!&€8,-98,+H(+,%>>Ÿ #"&4632!5!!5!4&#"32¢;)*99*)×þþËdR::R;þ«8þý8n,"$#>>ˆ 3''!5!!5!2´¨¨Àþþˆ„ {{ º8þý8>>ˆ '77!5!!5!2´¨¨´ôþþä„ {{ „š8þý8>>Í #3!5!!5!'¼üy ûþþÃ>>Ëþ}8þý8<††>ÿÌ>6%!#7#537!5!733#!>þçG6G±È:þþG6G±È:€´³8“8´³8“>;>Ç !5!!5!!5!>þþþ8â8â8>ÿÌ>6%!#7#537#537!5!733#3#!>þÌ,6,–¬.Úð.þâ4,6,–¬.Úð.;oo8r8r8oo8r8r>ÿæ> !5!5!5!!5!!5!>þþþþ:8r8þt8â8>ÿÆ>> -5% !5!>þþ` þHðò8Ãú5>ÿÆ>> 5-5!5!>þ þ`þ9ò8ÃÃ9ñþy5>ÿ„>~ -5% !5!!5!>þþ` þþˆðò8Ãä5Í5>ÿ„>~ 5-5!5!!5!>þ þ`þþyò8ÃÃ9ñþ5Í5>ÿR>~-5% %#7#537!5!733#!>þþ` þ¿0D0{­aþò@0D0|®aˆðò8ÃÃþÄ324d4324d>ÿR>~5-5%#7#537!5!733#!>þ þ`þ¿0D0{­aþò@0D0|®ayò8ÃÃ9ñý÷324d4324d4bü -5% %5% býûþ\¤þ×ýûþ\¤òñ8ÃÄ8òñ8ÃÄ4bü %5-5 5-5býû¤þ\þ×ýû¤þ\÷ò8ÄÃ8ñò8ÄÃ8ñ>ÿV\ž!)&''67.547&'7>74'6\7A#2 4,,4 2#A7u1 "''" 1uIFFFF k¥E-  ))  -E¥k»y)&&)y¼ŸqqŸÄpp3ÿÌI63%&+#7'>?.'7;7367IZ¤ U6StG (*?$$?1%  Z£ U6TtG!*7)I0-F eÕÑP "&M" fÖÒQ  M'#>ÿš>h-#'5%737>þë_6g½U6IŸºHü¤p‚îY‡Ö·K8W¶yM5>ÿš>h%#75?%573'>þáU6IŸºHþþ_6g½`p4÷‡Ö·K8W¶y8‚îþüY 5‚>ÿ^>¤%#7#537'5%737'!>þž*6*h|WÓ?M6AšRìÿONÜĆ:ih4Ûc—Á¢<8IÏn9yÅ£[?>ÿ^>¤%#7#5375?%573!'>þž*6*h|C¿Ú>þè+a6i§ÿON`Z):ih4§Z8gœƒ9óþ÷NxÆH*h>ÿ>>%-5% #".#"'7>3232>5>þþ` D0%@'94? :$!@*;0 Hðò8ÃÃZ8/")"K ''"*"!+>ÿ>>%5-5#".#"'7>3232>5>þ þ`D0%@'94? :$!@*;0 9ò8ÃÃ9ñþÙ8/")"K ''"*"!+>ÿ^>¤/2%#".'#7'7>?'5%737'32>5>D0(@;<6?"4?*AÓ?M6AšRìÿ<@< 0 ÜĆ&8/&5 –ž-$ 0)¥c—Á¢<8IÏn9y— 5(!+ w[?>ÿ^>¤/2%#".'#7'7>?5?%57332>5'>D0(@;<6?"4?*-¿Ú>þè+a6i§ÿ<@< 0 `Z)&8/&5 –ž-$ 0)qZ8gœƒ9óþ÷Nx˜ 5(!+ *h>ÿ¯>S -5% 5-5>þþqþþqͺ¸2‘—º3‘2¸>ÿ¯>S 5-5%5% >þþqþþq‡º3‘2¸þº¸2‘>ÿ^>¤!%#75?'57'5%737''>þ­960n†CÉÚ÷S960n…CÈÚöÄË—‡—3i{y(31§I2OGZzy(20¨I3OFY]I7ç6>ÿ^>¤!%#7'5?5%7%5737'>þÂN6U“Î&ô "þÓ>N6U“Í&óþõ!,q3”E4QsÄÖ5J^X3aTl2rÃÔ5K^W2`Tm¯+ì>ÿó> '.'5>5> Ik¿tt¿kIM–ZI€N9 ?DCCCB$M;D33.>ÿó> %57>7./5>t¿kIM–ZZ–M Ik¿tôCCB$MÿÆ>N%'.'5>5!5!> Ik¿tt¿kI)N–ZZ–N)þ5?DCCBB$L)=CD>)»5>ÿÆ>N54>75.=!5!>t¿kI)N–ZI€N9 Ik¿tþ5CBB$L)>C310L?DCþx5>ÿ>N8%'.'5>5#".#"'7>3232>5> Ik¿tt¿kI)N–ZZ–N)D0%@'94? :$!@*;0 5?DCCBB$L)=CD>)[8/")"K ''"*"!+>ÿ>N954>75.=#".#"'7>3232>5>t¿kI)N–ZI€N9 Ik¿tD0%@'94? :$!@*;0 5CBB$L)>C310L?DCþØ8/")"K ''"*"!+>ÿš>h!&5'.'#&'5673>?%> 5oGo6v^n•qn6b1O% .X4 Nyþî+*: 5Gþé).ö<*M)6OP× >ÿš>h#%#757>?./53&'6>•rm6aY^iC P="&5332653#'73PœØž3WY}3›•Y““Y•o™šn5þÇXyR9ÿl™›l>P= 2#"&546"&5332653H+;<)*;:2œØž3WY}3°;+);;+);¨o™šn5þÇXyR9>P= ##5#53533"&5332653à3€3€pœØž3WY}33vv3‚‚^o™šn5þÇXyR94Hú%!!!!Hýìþâò2þt4Hú%!5!!5!Hýìâþ4Œ24ÿÆH< %!!!!5!HýìþâýíLñ2þvº54ÿÆH< %5!!5!!5!HýìâþýíL4Š3ýŠ5>P#!#!#!P3þT3ðþ#>P#)3!3Pýî3¬3#þðÿÔk. "&462.''3'>5#k±ø±±øƒ„],]„èé\…þóé„~ú°°ú°þê]ƒèè„\.鄌é]„ÿÔk. "&462."%326k±ø±±øƒ “Æ”þþ“dc“~ú°°ú°þêb‡‡b.bˆ‡ÿÔk. "&462&#"4'/'32k±ø±±ø(I[]G¤<¤¤ä¤<<h¤¤G][~ú°°ú°i<<¤}ºG¤¤¤¤GºG ¤¤<ÿÔk."&462&#"%4'326k±ø±±ø(I[j–<Ä<þ˜G]i—~ú°°ú°i<–j]G¤]Gþ˜<–ÿÔk."&4624&#"32"&5462k±ø±±ø„—ij––ji2$&% .!~ú°°ú°þiÔ––Ô–!"ÿÔk.%"&4624&#"32#"&4624&#"2k±ø±±ø„—ij––ji-X=>YX|W,>+,==X~ú°°ú°þjÒ—–Ô–=XW|WX=+V=7.546324&54632>23#"&'"&465"&k±ø±±ø„—ij––jiþé0V V; k  p0UV2 k  o~ú°°ú°þiÔ––Ô–²_ce^  _ce\ÿÔk. %!5!6"&4624&#"32!5!óþ–jx±ø±±ø„—ij––jiLþ–j®.¢ú°°ú°þiÔ––Ô–%.ÿÔk."&4624&#"327!5!k±ø±±ø„—ij––ji[þxˆ~ú°°ú°þiÔ––Ô–é.=? )!5##5#5##5#?ýþ8­8­’­8­å­­­­å­­­­=? )!5!5!?ýþ8þn’þnå­­å­­=? )!!#''?ýþ`þ¾¡É¡P¡j¡¡8¡ÉB¡¡þ¾(¡¡=?)!!$#"&5462?ýþ8þn""!0þ6’þnà0!!">%!#3!þ`88 åååÿÿ> TÀ>Š&!#!5!Šþö8þöLîþî8>Š&)5!3!Šý´ 8 8îþ>”%!#3!”þâ88ååå>” %!#3!!!”þâ88þ 8“> %!#3!#3þâ88þh88åååþã>ˆ %!#3!#3#3ˆþâ88þh88z88åååþãýþ> %!#3!!!#3þâ88þâþh88€€8“¸ÿÓ”%##5#733733#”ÔJ8*Ak82©Cªªþêåbƒ88såãã8 ÿÓ”%!#5#733733#3'#”þâ8*Ak8~]C^^ˆnöÊT€€88s}}8““qÿÓ%!#5#5#7373733þî 8B8 Kk8B8ÑMÜÜå ÙŸD[!!o“þ§DÛÙãÿÓ%!#5#5#73733733#!'#þâ8B8 Kk8B8XyMyy¯oü"€€ŸD[!!o“þ§D}}8r!“$>>ü-5%>þ2þ’ññþYX¬>>ü%%>þ`þ’÷ñöñ ¬þ¨>ÿÆ>> -5%!5!'>þþ2þ’Hðòýˆ5œW«>ÿÆ>> !5!%>þþ`þ’9ò÷ñþy5H«þ©>YÒ¨#"&'!#"&4632!>324&"2ÒbF?] þ ^>FbbF>] ú ]>FüìEbEEbFŒaP<YÒ¨#"&'!#"&4632!>324&"2ÒbF?] þ ^>FbbF>] ú ]>F0EbEEbFŒaP<Yˆ¨ #"&'!5!>324&"2ˆbF?] þý ]>F0EbEEbFŒaP<8P½ #3!5!Pþÿÿ9ÏÑ9ýî½ýÕ+þ9ÇýC4>P½ !5!# #3Pýî9ÏÑ9‰4ýCÇþ9+>P½ !5!#3Pýîÿþÿ9Ñω4’ýÕ+þ9Çÿÿ>P, ªÿÿ>P, «ÿÿ>P= ¬ÿÿ>P= ­*"Öà'7'ÖÖÖÖ™™™™ßßßߢ¢¢EÒ©6 #"&54632©@m–² 373'7@‚))‚j(ii(6||L}MM}9ÿã>$ %"&5462"&5462'773#''7#5L" (!" (tÀ%ÝÝ%ÀÁÁÀ%ÝÝ%À»Áþ Á%ÞÞ%Á8Á%ÞÞ%Á8?/‘}7#"&54632 632#"'%7a   þùäþâå4 & þû ýÚ ÆÅââþ;ã4ÿÞü¦! ' 7ü"þ¾þ¾"Bþ¾""Bþ¾"BB"4ÿÞü¦! 'ü"þ¾þ¾"¦"þ¾"Bþ¾"¦"þ¾>>·732>32&#"#"!5!>O<0Bu%&M;.B ~æþþ­ m"*"…Y")"—92K#.'3>7K5]>' 9sELDggD~›Ž>W¾È#1ÒddÒ12K%#.'#>73KMDggDLEs9 '>]1ÒddÒ1#ȾW>Ž›~4Hú!%!"&5463!!"3!!"&463!!"3!Hþð5IJ4þï+-þâggþÞQouK"„J32K2,>,®”Ê”2vQRu4Hú!#!5!2654&#!5!2#!5!264&#!5!2Hgþâ"KuoQþÞg J4þð+-þï5IfÊ”2uRQv2ù2K2,>*4J>P=!!#4&#"#462#4&"#4632P3WY}3œØžu2:P:2W<=X9XyRþÇ5o™šnþË,)7:&þÔ*>WW>>P=!#"&532653"&5332653ÛW<=X2:P:2uœØž3WY}3>WW>*þÔ)7;%,þËo™šn5þÇXyR9>PÜ!#4&'##46753P3kO8Ok3Šb8dŠ9Kz ýø uPþÇ5g” ¡  •g>ÿò>¤%3##5##5#535#533333#5#ް°(P(°°°°(P(°°(P·88“8"þÞ"þÞ8“““>>ü #"&5462%5% ø,eþþ` ,þÏòñ8ÃÄ>>ü%5-5$#"&5462>þ þ`þ°,÷ò8ÄÃ8ñ ,4‹ý -5% %5% %5% ‹ýûþ\¤þ×ýûþ\¤þ×ýûþ\¤òñ8ÃÄ8òñ8ÃÄ8òñ8ÃÄ4‹ý %5-5 5-5 5-5‹ýû¤þ\þ×ýû¤þ\þ×ýû¤þ\øò8ÄÃ8ñò8ÄÃ8ñò8ÄÃ8ñ>ÿ*>Ø %5% !5!5-5>þþqþþþqRº¸2‘ž4þɺ3‘2¸>ÿ*>Ø 5-5!5!%5% >þþqþþþq º3‘2¸þÇ4þº¸2‘>ÿº>H 5%%5% >þþþ` ò8òýrñò8ÃÃ>ÿº>H %55-5>þþ þ`ð9ñ¬ñ8ÃÃ9ñ>ÿª>X '5>54.'5>?>HiÁwq½lKIk¿tt¿kI )N–ZZ–N)  ??C2EII)ýR$BBCCD?L)>DC=)>ÿª>X '.=54>75.=>wÁiH Kl½qt¿kI)N–ZZ–N) Ik¿tC?>!MFJFšCBB$L)=CD>)L?DC>ÿš>h/5'.'#7&'57&'56?3>5'.'>:wJ\6cRgqYa…©J6:-3V>Oçø2G$;º–+SLU&i8+L2CED4 x  >ÿš>h/5%#754>?54>?.=7367'5&'6>¢€R6BGQ[@&Ln6f=Cp: :zNV6\Oc~e&w’™ ¾?Í¥._M%K b#WL/;9<2!L$;I×ç%^/\4ÿ^H¤%#7#537#!733#!!!!3Hþ”*6*q…!§l*6*r†#þÉ!X¼þÚ‰:ih4Qðih2þv4Qþu4ÿ^H¤%!!!#7#537#53!5!733#HþÉ!Wþ•*6*r†!§»þ¨l*6*r2TLQ4ih4Q4Š2ihþDŠþv4ÿ”H<%!!!733!#7#5Hýìþâþí.D.Ïþÿ.D.ÎLñ2þv…2252254ÿ”H<%5!!5!733!#7#5Hýìâþþí.D.Îÿ.D.ÏL4Š3ý¿225225>ÿ>>)-5% #"'#7&#"'7>327332>5>þþ` D056#DB,&4? :$16$DA-(0 Hðò8ÃÃZ8/+'F#K ''+'F$!+>ÿ>>)5-5#"'#7&#"'7>327332>5>þ þ`D056#DB,&4? :$16$DA-(0 9ò8ÃÃ9ñþÙ8/+'F#K ''+'F$!+>ÿ>N<%'.'5>5#"'#7&#"'7>327332>5> Ik¿tt¿kI)N–ZZ–N)D056#DB,&4? :$16$DA-(0 5?DCCBB$L)=CD>)[8/+'F#K ''+'F$!+>ÿ>N=54>75.=#"'#7&#"'7>327332>5>t¿kI)N–ZI€N9 Ik¿tD056#DB,&4? :$16$DA-(0 5CBB$L)>C310L?DCþØ8/+'F#K ''+'F$!+>ÿš>h -#'5%7377>þë_6g½U6IŸ2ˆH¤p‚îY‡Ö·KþYX@¶—M5>ÿš>h %#773'7'7>þáU6IŸ_6g½`p4Ј÷‡Ö·Kö‚îþüY 5‚—bþ¨@>ÿ^>¤%#7#537'5%737'!'7>þž*6*h|WÓ?M6AÿON2hRĆ:ih4Ûc—Á¢<þ yÅœW1ϰ[?>ÿ^>¤%#7#53773!'/7>þž*6*h|C¿+a6i§ÿON`Z)æ¨:ih4§Z÷óþ÷NxÆH*h}lþ©OE©þ #2#"&5462#"&5462#"&546wþþ³þ³tÒr6 ##"&54632#"&54632#"&54632rþ³þ³trþ ##"&54632#"&54632#"&54632rþ³þ³ÌþŸþŸtrþ #4632#"&4632#"&4632#"&tMMÌþÈþÈ5ÿ«ÒI *5"&632762#"'#"&54?&542>54'ƒ.I) ,5íCcX@• •8‹aW@•  •7ë.J) ,þí5½!/:*D7,E7•  •CUb‰7•  •DTaþÜ!/:*D7þî,#ÿŸ—¶$%32#"&/4737!"&547632!2 1•  IpþÕ ¦  —+n § ©Ò N þÏ>Oœ­!#!œþÞ<^qþÞ^>Oœ­#!5!œ<þÞ^O"<>œ^)3!œþ¢<"^þÞ>œ^)5!3œþ¢"<<"ÿÿl‚Cn4À@HÜ”44'&#"3276632#"'&54##"&547546232³TVwxUUªxvWTýö_ŠˆÂaaˆ‰`aål   l JxTVUWvxªUTbaˆŠ_a`a‰ˆœ ª ª  Lÿ­Ëš"#4>32#"&547&TJkS3GW?"7(!dþîÕþ0ešó‡X'.&#ÿÿ ÿ¬Ÿ™ iëFÀ>œT<%&#"'7>2TZ¤£Z 01NVM11¦ ff **>œT<#".'7327T!'3C%&B3'! Z£¤Z3 $ # ffÿ:2ê2ÚÚ3ææÑþAþAØØÿ:.ê'7.æ3ÚÚ3þ(¿¿7ÿbÐ’#%#&'!!673!2#!!"&5463!2 (bHý¸b(!EéþEÔý q Sj6þ˜Þþ˜6jV=(=þ¹  üø 7ÿbÐ’#&'3!!#67!"43!"&5463!2eE!(bý¸Hb(!EþAý q =Vj6hý"h6jV=(þT  üø 7ÿbÐ’$567&'!!!&5!"&5463!2p=Uo75qW; ý¸ Lý q E!+lk,!EýŠÞý";  üø 7ÿbÐ’$%&'547!!!6!"&5463!2*q57oU= þäHþä ;éý q G,kl+!Evý"ÞýŠEÄ  üø 7ÿbÐ’463!2#!"&5#&/#!7 q ý }ôH~ üø óõõý"ÞLŸ #2ŸSR üà -Ê  73!2=3!5F  4þc Z1V  #ÿóòÂ/;!5326=4&+567'2 &5464.#"326½$þý# Fl-‘ÑÓþÖÒÕÙ5L]H–bT¿ˆ‡¿LþŒ$!!(î  ?vÕ’•ÓÓ—•Ðþ™JwF.l\|‰ÀÀ#ÿóòÂ)5E326=3!&54>4&#"#"&54632'2#"&5464.#"326*/GJA Ä!!þ¯.AA."# P=LZš‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿Ò+>!"*³ )I87FL/  +8FµÕ’•ÓÓ—•Ðþ˜JxE/l]{‰ÁÀ#ÿóòÂ>JY%32654&#"532654&#""&546323#"&546322#"&5464.#" 6F):5- ,:'&TCELS #.nUCYJ‘ÑÒ•–ÒÕÙ5L]H–bT¾¿Ú E0+3$5-")  '171K 2!AT;-ÒÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿòòÁ#3%;#5326=#533#32#"&5464.#"326Ë ñ/ÁÕBooV‡‡‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿Â!!'AþÐ-ÿÒ¥Õ’•ÓÓ—•Ðþ™JwF.l\|‰À¿#ÿóòÂ0<L%32654&#"'67327#"#"'632#"&546322#"&5464.#"3269 (8-#*')s*I5-!%&- .DEZrUAVW‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿Û  D1-;2˜l( y$O=BY8*ÕÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ%1<K4654&#"632#".547632#"&"32654&2 &5464.#" 6Å 3S;NfN8Q)D.W@S4)72('1-&‘ÑÓþÖÒÕÙ5L]H–bT¾¿ê ]5)KL:G]/KJ%wN64(o?/0>=/3=WÕ’•ÓÓ—•Ðþ™JwF.l\|‰À¿#ÿóòÂ)8%"&54>?##5!2#"&5464.#" 6 "4# 8H¶ d] "‘ÑÒ•–ÒÕÙ5L]H–bT¾¿ð0  $I-Ie ""§š4J´Õ’•ÓÓ—”Ñþ™JwF.l]{‰À¿#ÿóòÂ"-9H#"&5467.54632'654&#"'326542#"&5464.#" 6Ê:2eNJY,8&R@8H t*2) (S:D7)(6O‘ÑÒ•–ÒÕÙ5L]H–bT¾¿A-BUE9*: ,!6E6*, /&#$•!(E*71%3©Õ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ#/;K%327>54'#"&54632#"&54632"32654&'2#"&5464.#"326P 1U;NgNXln[@T9&2-&)73!‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿Ø^4KL:G]€ioŒ4(J=/3=@.0>Õ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ&2B;#53265.+567"54632"3254'2#"&5464.#"326>Æ  3b"ÝJF—MF434 ‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿Mþ{##  9þ"òu}û~kÃÏÐÏÐÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿yD!!yü‡D0üy\!!yü‡\`°ÿ8à!3#°00!ü˜ÿ8ø!3#˜``!ü°ÿ8yD!!#°Éþg0D0þ$°ÿ8y\!!#°Éþg0\`þ<˜ÿ8yD!!#˜áþ`D0þ$˜ÿ8y\!!#˜áþ`\`þ<ÿ8àD#!5à0þPDýôÜ0ÿ8à\#!5à0þP\ýÜÄ`ÿ8øD#!5ø`þhDýôÜ0ÿ8ø\#!5ø`þh\ýÜÄ`°y!3!°0™ þ#0°üy!%3!°0™ü%þ;`˜y!3!˜` þ#0˜üy!%3!˜`ü%þ;`à!!5!3àþ °00Ýüà!%!5!3àþ °0ü`Åø!!5!3øþ˜`0Ýüø!%!5!3øþ˜`ü`Űÿ8y!3!!°0™þgÈéþ#0þ$°ÿ8y!!!#3à™þg00\`þ<é˜ÿ8y! #3!!#°`þg0 þ#0þ$˜ÿ8y! 3!!#°0™þ`DÝþ#0þ$ ˜ÿ8y!!!#3øþ``D0þ$é˜ÿ8y! %#3!!#°`þg0ü%þ;`þ<˜ÿ8y! 3!!#°0™þ`\Åþ;`þ<$˜ÿ8y!3!!˜`þÈéþ;`þ<ÿ8à!#!5!à0þP°!üÜ0Ýÿ8à!#!5!à0þP°!üÄ`Åÿ8ø! !3##!˜`0þPDÝýóþ$Üÿ8ø! 3#!5!3à`þh°0DýôÜ0Ýÿ8ø!#!5!ø`þh˜!üÜ0Ýÿ8ø! %!5!3##°þP˜`0ü`ÅýÛþ<ÿ8ø! 33#!5°0`þh\Åþ;ýÜÄ`ÿ8ø!#!5!ø`þh˜!ü(`aÿ8yD!!#!yþg0þPD0þ$Üÿ8y\ #!5!!à0þPà™þ$Ä`0ÿ8y\ 5!!#!5°Éþg0þPD`þ<Ü0ÿ8y\%!5!!#°þPyþg0ü``þ<ÿ8yD#!5!ø`þhyþ$Ü00ÿ8y\ #!5!!ø`þhøþ$Ä`0ÿ8y\ !5!5!!#˜þh˜áþ`0`þ<ÿ8y\!!#!yþ`þh\`þ<Äy!!5!3!yü‡°0™0Ýþ#üy! !!!5!3à™þgþ °0D0`Åüy! !!5!5!à™þ7þP°!þ;`0Ýüy!!!5!3à™ü‡°0\``Åy!3!!5˜`ü‡DÝþ#00üy! !!!5!3øþþ˜`D0`Åüy! !5!3!!˜þh˜`þ0Ýþ;`üy!%!5!3!yü‡˜`ü`Åþ;ÿ8y! !5!3!!#°þP°0™þg00Ýþ#0þ$ÿ8y! #!5!3!à0þP°0™þ$Ä`Åþ#0ÿ8y! !!#!5!3à™þg0þP°0\`þ<Ü0Ýÿ8y! !!#!5!3à™þg0þP°0\`þ<Ä`Åÿ8y! 3!!#!5˜`þg0þPDÝþ#0þ$Ü0ÿ8y! #!5!3!ø`þh°0™þ$Ü0Ýþ#0ÿ8y! !5!3!!#˜þh˜`þ`0Ýþ#0þ$ÿ8y! ##!5!3!ø0þP˜`þ<Ä`Åþ#0ÿ8y! %#5!5!3!!#°þh˜`þg0ü0Ýþ;`þ<ÿ8y! 3!!#!5!3àþ`þh°0\0þ$Ä`Åÿ8y! 533!!#!5˜0™þ`þhDÅþ;`þ<Ü0ÿ8y! %!5!3!!#°þP˜`þg0ü`Åþ;`þ<ÿ8y! 3!!#!5°0™þ`þh\Åþ;`þ<Ä`ÿ8y! #!5!3!ø`þh˜`þ$Ä`Åþ#0ÿ8y! !5!3!!#˜þh˜`þ`0Ýþ;`þ<ÿ8y! %!5!3!!#˜þh˜`þ`ü`Åþ;`þ<ÌyŒ5!!5!!yü‡yü‡ü0À0hÿ8(!3#3#h0000!üéü°ÿ8yŒ !!!!#°Éþg™þg0Œ0`0þlhÿ8yD !!###hþ¯0`0D0þ$Üþ$hÿ8yŒ %263!+!!ø+çoþ¯0`0þû0þlT0ÿ8àŒ #!5!5!5à0þP°þPŒý¬”0`0ÿ8(D ###!5(0`0þ˜DýôÜþ$Ü0ÿ8(Œ %#!=!#˜0þ˜(0ûþ=”0`0ý¬$°Ìy! %3!!!°0™þg™ÌUþk0`0hy! 333!h0`0Q þ#Ýþ#0hÌy! %!373!yýï0`0Qü0UýÚaÅþk0Ìà! %!5!5!5!3àþ °þP°0Ì0`0•(! !5!333(ýØh0`00Ýþ#ÝÌ(! 3!5'!5!3ø0ýØø`þhh0!ý«0a0•°ÿ8y! 3!!!!°0™þg™þgÈéþk0`0þlhÿ8y! 3!!+3ø0Qþ¯0`00!þ#0þ$éhÿ8y! 33!!!#h0`0Qþþ¯0Èéüéþk0`0þlÄÿ8à! #!5!5!5!à0þP°þP°!ü”0`0•ÿ8(! 3+!5!3ø00`0þ˜h0!üÜ0Ýÿ8(! 35!3#!5!ø0ýØh00þ˜˜Èéü$0•þ;ýÜ”0ÿ8yŒ !!!#!5yü‡yþg0þPŒ0`0þl”0ÿ8yD !!###!yþ¯0`0þ˜D0þ$Üþ$Üÿ8yŒ !!!##!5!yü‡yþ¯0`0þ˜˜Œ0`0þlÄþ<”0Ìy! %!5!%5!3!yü‡yü‡°0™Ì0`0•þk0y! !5!333!yü‡h0`0Q0Ýþ#Ýþ#Ìy! %!5!3!)5!3yü‡yþ0Qþþh0Ì0%þk00•þ;ÿ8y!!5!3!!!!#!5!°þP°0™þg™þg0þP°\0•þk0`0þl”0ÿ8y!##!5!333!!#ø`0þ˜h0`0Qþ¯0þ$Ü0Ýþ#Ýþ#0þ$ÿ8y! #!5!3!!!#%5!3˜0þ˜˜`0Qþþ¯0þh0È”0%þk0`0þlÄ`0•þ;°y¨!#5467à0øÑ«îºç0×Èù¼%!!ùýùÈôÿ8ùÿµ!5!ùýùÈ}ÿ8ù2!5!ùýùÈúÿ8ù¯!!ùýùÈwÿ8ù,!!ùýùÈôÿ8ù©!!ùýùÈqÿ8ù&!!ùýùÈîÿ8ù£!!ùýùÈkÿ8ù !!ùýùÈèÿ8š !!šýfšÈèÿ8; !!;ýÅ;Èèÿ8Ü !!Üþ$ÜÈèÿ8} !!}þƒ}Èèÿ8 !!þâÈèÿ8¿ #3¿¿¿Èèÿ8` #3```Èè|ÿ8ù !!ùþƒ}Èè£ù !5!ùýù£}™ÿ8ù #3ù``Èè#Ö³)!ÖýM³³#Ö³)!!ÖýM³ ý³ýmsý#ZÂ)ZüÉœÂ^ÿÆ ü^Â:6þd#ÿòZ³ Zþeþd³ý?Á^ÿÆ ü ý>üüÊœ#ÿòòÁ ‹þ˜hghgþ™Òä 33' Ñ¿Ä?½Å¢¤ykþ’þŠ:<5þÎ#ÿòõÄ "32654&'2#"&546‘‹ÃÀ‰ˆÁÀƒ‘ÒÔ•–ÓÖ¤¾ˆŠÂÁˆ‡Â Õ”•ÔÕ—•Ñ›r"/:CMW&'#5#&'7'&#"'632'654'>7#'>7&47#"'7327%&'#'n? + È ! + Ki  ?! 'þÊ A*=MM;##"& !þñ-6 !ß++ ; HHï!" # ù +2 À   ++þÌ #@#  þóIn ö=#Ö³)!!ÖýM³þ§þƳýmsý#Ö³7!!!Cs ýM³ sým³#Ö³!!!¶ý“ýM³“ý ³#ÿóà !''!™U çYçæZêÃþò®þ쪪®#Ï ''%77'7'žbÏFìæ<ÑgHì°0¶¸>¦ÜÏò¸þó—— ¸›¼Ôz|Ò”7¥n*732654.#"4>327632"'&`*5% Hg$A)If)%4@/N;ë ë2°A?×*B$hG &3+gH3Q- 2ë  ë=MY~??7ÿ”§q2=2>54&#"".546327&54632#"'4&#"32#/I(sPQrsP8Y1 ‹aPBV;Ša8X2 EEbR?W;ECùuOPstOQD!/:*QrsPQr((9F2b‰2²CYaŠ(9F2`GE3²CYaEE¢ stOQr"Š­609EOZ%+!"'"'>7654'#"'67>32#"'.''627&#""32654&%#"&'32%#"&'32Aþx !$ (A¯ZY¯@(ü<<E):8)(99 =$2%,þ/ ,1!7È=^U  C!!D  h))N8()99(':   ÿÿ#Ö³ þ#Ö³#4632327>763#"&'.!!!—3  7z&#IJÂ5 ?ýM³ ý/]­" Oþòc $Wó³ýmsýÿÿ#Ö³+ €‚v*= þÿÿyö: É#z8*;263326767>54.'.#"%#"'32654&#"‰l 46h:4M'5( ,¥2ZÝ™R($ $*1# !' 6 U.+=[.B_®KS]OPq#z8*;"&##"&'&'.54>7>32%327#"&546327l 46h:4M'5( ,¥2ZÝ™üðR($ $*1# !' 6 U.+=[.B_®KS]OPq#…ˆ/*.Xbu„’%2>737'#"&#"&#"3327#'23#"'5>7>737'#"'7'#"&54?6432#"&2632#"'.47"&54632'#"&546Ð4F6#S iÈ |(+$£¢i‹" X6,x 6î!€, .O 6C %2'+ ;$Gþtü?G€eE! ]$&"l `  ”<8 #J ¡1 Z "L .!$ 2Cþð0RÆ #*51  G=2Ra !*  ˆ*" 1  $ ÿ¨É *.V_rŽ#!7#54654'654&#"&#"&#"&#"%5!7#4./&54737'&5477'&546322'546#"&5476324632#"&7#"&54632;0Z "K / # 2Cþñ0RÆ  .# +40  H<2Ra " * ˆ)# 1  # `4F6#S hÇ|)*&£¢j‹" X6-þ—6î!€, ,R ! 6B $2(, <"HŽüTH$eþº"![2 $%"l b  ”<8"J #…ˆ/*.[i}¤%".'#'732632632##"'33275.'.'#'7327'732654/&#"%327654'.#"#"'&#"327>4"327>54&"32654&Û4F6#S iÈ|)*%£¢i‹" X6,þˆ 6! .O 6C %2'+ ;$G#(4G¯''„= !. ]N  (7  ' #J ¡1 Z "L .!$ 2Cþð"Æ  #*51  G!DR  ~% !* A&   Q $ ÿ¨É ,0]j}¤4>7#5'7!##"&5#"'#"'#"&547&!#3>7>757732?654'&'.327>54&'&54?4&#"324'&/.#"3264'./&'&#"326;0Z "L / # 2Cþñ"Æ # +40  H"DR  ~$" * A&  R  # T4F5#T hÈ |)*&¢¢i‹" X6-i7!-Q 6B $2(, <"H"%4þïH$³#'…< !/ ![1N   '7   "J Þ»"_go€#"/.5462#"/7326767632#"'#"'&'#"'"54>767&'#"547&54323254#"3254#"3273254.3  ?ZˆY !  !  !$ C"W0 !'O?R, ?2<6.  "?I2+*%&%&…&%$' {290?HI>&E0(--¾#5  ' ) 75"13 $%  6 +.&)+.&N  VÌI"46462#"&#&'27#"'òn1×Y¥%2$$$ØD\×1a6nEXVKG¹7Z‘ê$%##*$‘U;ª¸,(ÿû¯q&Lm{‡”4>3"&#"&'4>7&%4&'2654.#"'654&+5>2654'7372657#"'#"'4632&#""&6=63&'2.54¨,5**< <* #/K?R$:, IL?*D( NO$4)K-# )< þ¶?Q#  #D?-D"A/SB9Rn8,‡H.:4 /(0(¡ZD1 à Y2A·*D( %1'&2$) HV@("&:T*$CCN,6*%"i=5*!#*> D )#/'þHW;!   !'1R ! $!GDZ/ ) þùm =\µ`$V<#̳7'75#535#53533#3#7#ÏH"j¬¬\\Q\\¬¬I"kQe!H1¶PPPPPPPP!H2Š#̳3##5#535#53533 ¬¬Q¬¬\\Q\ÍæP——PæP––PHÝš"?#"&54632373'7ïz¨Thbs6V=ÀÂŽh^aaONNm¨xwTh#!‹ŒÁCä\\8]99]ÿînúlu4'6.54675#7.5467&'7#>54&'&'"&547&'"5475"&547>77>54' V+!ª dH15$,H$J-AG5 ZZ 5GA-Jfr>(Ge |3Z&l&Z4|ö!+V ô5?Z'< Eþ«3IGS#Lx$!,-J*# ,&X4=Y .. Z=6V,`[;x#zK-gRQ`J   08v$**$v80   L° <'Z?5+HÜ” )#"'&54763!'6'7654.'Âaaˆ‰`aa_Š¿~«`ˆ«TW-]Q3HÆîG3Q\-”ˆŠ_a`a‰ˆaaýܨðî¬BD)FoAnQÉÉPoBoE)þèCÝš ,832654'&#"632#"&546324&#"3262#"&546YCBY\[€Jt@* ‡AZÈþÉoÀÁŒÀÁRD\]C|\Z5J^@œXD_‹ŒÁ‹ŒÁ2&ô 3!5!5!5!5!5!2ôþ ôþ ôþ ddddd2&ô 35+3!5!5!5!^ÈÈdÈÈÈôþ ôþ ddþpddd2&ô 3!5!%35+3'!5!2ôþ ,ÈÈdÈÈÈôþ ddddÈd2&ô 35+335+3!5!^ÈÈdÈÈdÈÈdÈÈÈôþ ddÈddÈd2&ô 7#553!5!5úÈ,Èþ ôþ ddddddôddÈdd2&ô 35+335+3'!5!^ÈÈdÈÈdÈÈdÈÈÈôþ ddþpddÈd2&ô %3+5373+53'!!^ÈÈdÈÈdÈÈdÈÈÈôþ dddÈddÈd2&ô 35+335+335+3^ÈÈdÈÈdÈÈdÈÈdÈÈdÈÈddÈddÈdd CÝšYp…š¯¹Îãø %&'#"54323&'#"543247#"543267&542&5432#"'632#"'2632#"547"54&'&'&'26326326323#"'#"'#"'676767&547&547&5475&547&547&5472654&"7263263263&'67#"'#"'#"67&'&'&'676767&'ƒbF"!  A !! F !"GaBaG!"! F !! A !"!FbB-         + )/  0( $&{       9 /)  (0 @@  !"Ga!"ZN!"! @ !! @ !"!NZ"!aG"!  @ !!: )/ > /) +         {6 0(K )/ -    °   HÜ”)2;4'&#"3276632#"'&54&#"'>32'"&4622"&4632³TVwxUUªxvWTýö_ŠˆÂaaˆ‰`a®*:9,A('AÛ"Ê"JxTVUWvxªUTbaˆŠ_a`a‰ˆþÖ''%--%Ì" ""HÜ”(1:#"'&54763654'&#"32'#"&'726"&4632#"&462Âaaˆ‰`aa_ŠÍTTVwxUUªxv E()E1zQ"±"”ˆŠ_a`a‰ˆaaýéTyxTVUWvxªÊ%++%%ò"" "HÜ”"*632#"'&54327'#"'264&":64&"©_ŠˆÂaaˆ‰`aâ/SQ11675"×""3aˆŠ_a`a‰ˆðBBÆ$"""ÿìË V"32654&'763232+"/"&=&'"&4?&'#"&46;67'&5462675462’PloMNno9G7U T.x x.T U5I  H7U U/w w/U U8G  mONnoMNnŸw/U U7H  I5U T.x x.T U7G  G8U  U/w 8ÿ«ÐI#%#"567>4&'&'432>54.'ÐÔž&GPPG&žÔþ³BUC/0EW?jCDk=*9™¨™7ÿ«ÏI#.464632#"&…BUC/0EW?jCDk=*9™¨™í–¹ 4°4 »7ÿ)æÝH32654&#".5467.54632326546232+"&=#"&46;`*5% HghGIf›^fG68E  fIHg  E86GrQ‚ ‚  ƒ ƒB*B$hGHggþâ ‚J@li@ IffI @il?Uy„  ‚ ‚  7ÿ)æ032654&#".546232+"&=#"&46;`*5% HghGIf›^f€°rQ‚ ‚  ƒ ƒB*B$hGHggþâ ‚JY~XUy„  ‚ ‚  7æð5732654&#"#"'&54675#"&46;546232+`*5% HghGIf†%3@.XA?sQƒ ƒ  ‚ ‚Kx×*B$hGHggH3P- ??YUzƒ  ƒ ƒ  ƒv7¥n4732654.#"4>327#"&46;2"&="'&`*5% Hg$A)If)%4@/N;É’   É2°A?×*B$hG &3+gH3Q- 2É   ‘È=MY~??3ˆ«3>32356732+"=#"&54>54&#"#"3W29=!)ªÄ Ä(Ï 33($ &(=FG:,t[,ÌÉ  ÍÍ eŒ=*3- 0ÿ>«<"&5#"&5467356323+>32;2+"5454&M/B  I I H K!V#Un]Bj^Uš.B4È   H F ¿4&ŽY1ÿF  K%(Js7ÿŒæ|4>732654&#"#"'&54675#"&54?632"/2#"&54`*5% HghGIf†%3@.XA?sQY  { { XKx×  c*B$hGHggH3P- ??YUzýX  {{ XývF  ÿþÿK© m%"264&".54675.="&54?632#"/5#"&54?632"'>=#"&54?62#"' &3+gghG3Q- rRSq 7 7  YB 7 7 BY  87 qRLw??Ò$A)IfhŽhþy%4@/UyŽzT 88 Ccµ 88 µcC 88 TzŽuZXA?7«,%2#!"&546;2#4.#2>ü þO 4@gAM,-LAdB2ˆ9AbT<32#"5654&#"¦  `N8PgHEffEHgO8S[´þU «^‰M5-FdUDDUcF.5MŠtÿñ{Ê9%2>54&#"2#".5467.54322654&54x2O, }VW}~>VEAR+322654&"23267#"&5462#"'&546ÛT;;T;C/54&#""6264&"#O8#R.ÂS“_$33$8N7  NpO6A6¨tu¨6A6NpN77N7\pOƒm9t=zM0bSQ]+'77' 8NN8:}\w4`||`4w\}:8N(7N77N#ÿ>ˆ¹NZ4>7&54&""&54&""&54&#"&4632>32>32>32#"'#"&7654&#"u)]+KjL  KjL  L5 0PP0/PO02S[:Jnœ‰  !% Ò„•U;?_® ,(3ú5KK5þ ú5KK5þ ú5K  0((00((05,+9bI²þÃl   D ‡f-ª7LN7þ$$\ù 17!2#!"&462!2#!&=654&#"!"&463!5468 ûð l’  þß}YZ{þÞ  ’(   Ñ™t  db  t™ÿ‘€¶K#"&54&""&54&""&54&#"&4632>32>32327#"&46;2"&5Xah>OKjL  KjL  L5 0PP0/PO0Fb<0OR: o  L?:ú5KK5þ ú5KK5þ ú5K  0((00((0bFþ%->  o *•k*7#"&546;2"&=#"/#"&4?'&562×y‘   þ†Š ŠŠ  ŠŠ Éy   ‘þ†Š ŠŠ ŠŠ!ÿõ ¶+<"&463!2632#"'.547"&4767>7326754&#"5 µ "Z^z#',„¸ˆ\%&Zg†a v¥+›oþÊ'7C2Km t79Ž   &N0‡pay ™^742i 2Od)þ‡;\4" _H [v;"ÿñ]¾B„%".+".#"#"54632;>?232654'54732".+".#"#"&54632;>?232654'54732¸(C,'0(!#1 8*+9 3KcC(B+(/(!#1 %D.F'2LbC(C,'02$<# &D.F'3K cC(B+(0(!#1 &D.F'3KbÞ#12# +*!#12#I5 ,E`#12#+*!5?5I4+E`í#21#.605@5I5 E`#21#++ 5@5I4,E`!þ·4##"&547>4&'&546323>7632#"'.åya \mm\ ayåya [mm[ ayGj°+  )¨È¨)  +°kk°+  (¨ed¨)  +°a¿’0;GWdo2#"'.54>32474675'53733>>54#"7"3>54&.'6326"3265."32>54C $-ÈÇ!#-% 11)%  %)% 9•)+²1h·*3!YI /+B EegCþ¡$51(}gŒ`+8EÑ 4"*"*O6CCFZ 2$#4 ' %$&&$+, €+;;+VeQ4+(2ö&.22(H Qeþ¤   5ê†$*2Ÿ©±·Àæ%32232=4&#"32>&#"62&544  "32544&5462654&5463265'&54632+&#&52&74654/&5&'&5462654.54626%"3254'"324!"324"3254&.'&'63267&547.y, I{45z;AÂOSWK <À< þºF£;!. 6 !A!"."K‘I®1".!.!@".!6D  œ  þ¨› 63 R‡ˆQ44á-  h@{":!!9#1`r:!!! *%:C*"!)(Œ \ :":8 Š*)!!$,A,($+ !!9s[S @222@ @7?73/b F0&0//‚HW2 .?-’ˆK#';35'575'57335733573%!5%!'#'5#!75'##'5äþ¦fXZnZXfþ@°þ²BpBœA8 D D 8A„±±þ|EgÈM[[MÈgEO''c@@o8778JÿéО)7Cd¡"'632&547"2654"#43254&#"'32767.5#53533#23274&&'&#""326326732632.'.'632327&54654.5467&4632F'OO/1G/7Au*- ,ohpq>""$"" -5;2/A[" ;)B.1@o›G6*41! &_} zL  !17)7Gs"'' u   j  þh G^.<  8.^µ,'++',ð  !¸ <" ?5  0? "? 8"?i: !h?8Z¯OMv72#"547"54632'267&!654'&+.';2673232767>3272!>7#"&'#"'>54'32636¢ ]&0 05J'< '9 i,Q' 8H;)þ]!&#'7  0x61 ìz $¼ þó,[N.Î{$@ )È  #D#(B G æ=[a/%.H&9!1( <&ý%3"/ $¸eL.L!4.54>54/&546=4&#"&5467.547&5462j**e % /±@E D3F3E!EA (N6-G' .  $ ""þè "We#2C"+,!D 1$dW! `¿!1Bm|"#"54.#"327327>54&>32#"4#"326323254675'53733632#"'.'&546322#"'.546?-5&%6,)0=%'WX'&;0§$ 'A>b“(6noä&)% " $(#/24I'%ÊÈ'I341 %-=?'­'J/1L%,'[  W',·$:"P   \(&$%%$#0&D3)6 8^DD3O5)2E<!C, P1ÿÿç…!)1š¤µ%"326373233254'"3247"324!"324"3254&#"&54654&'4/&'&54632654.54632654&5462654&54632654'4632"3254&4#"32?3222¦A<l †þ¾  k' inÈ\}G .!"@!!7!.6!!  @!!. 0½  ª´µ-ANˆ ‚2?22 2?2 þƒA(@W 217* !#-A)-%*  !&8s^2$; !8$2^r9" ! &,)A-!!(?k 7Æ þz !šG#3'575'57335733573%35'35­eNG&o&HNeþ¨ãããGdÇMYYMÇdGÕ""´""IÿâÑš R^g%"3254#'2654+"4.54>7&4632372.'.'>3327&5467535#5##3"3254\3-7d31?%3n'(L&4/ '(1d<G4-;#"B+: !8 l4:E= # 0   *!#9j.&++&.aºM3=T2654#">54'43263632!>7#"5#'.7"265454'#""32ë2%}x )= 9H<)þZ"'$&8  /éSH;  .5.d' $¤%þ&("/(=[œa.%,G(:2) =  %£hZ 1E|N,·dL!&5467.547&5462ÒE E@þUAE E4F2ÆB3#dW# #Vf"2 C!,,!"OÁ,%!5>7#"&54>7#"I! þ !4R5K,FJHGKF-K5Rî5&!  !&5PJ5-J=BkCBjB>J.5J#ÿò“À7.'.5463267632">54&#"#".'&\Qm<+U>U22F=W6EžÄ1='57I. DJF.84?/ 9K‰ŽOY/?VK,6"8T;8pWÃ/F4%KFI_N&/hX[c/398 /!*J"ÿò0Á &'67>7.(¸8F¡!J¼ÁE;——;8-“Á0ù>PÜ<„äé6jµ¶j1°?0É#åÁ5!5>7#"&54632&5462>32#"’ ".F-þ-F/! O&@\S;""']‚]'+;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_#ÿò“À>32.'.54632\Y6=W5QTMQm<+U>w0JFT;6phi†BK‰ŽOY/?V"ÿò0Á &'6(¸8F¡!J¼ÁÁ0ù>PÜ<„äé7¶ %#"&46323B,-BB-3"S%..J.-7ò¶"&46323#54'&BZBB-6 ‰T‰&÷þ\%..J.-7mC”88m7™¿#"&4632#"&4632"F0/FF/:#F/0EE0:"kþs&--L-¬“þ'&--L-b7™¿5%#"&46325%#"&4632€þ¢wF/0EE0:"þ¢F0/FF/:#­==þ'&--L-Úþû&--L-¬BÿëpÚ#"577>324&#"326p;W_&( -FNW%'30;b,C|R0Ç þÊ VO=#"#&'57654.'5673;54&'567332>7332673#.+#.#"#&'#'L*J  ! XI" &'N U 0 Q$N#  %- T$Ð  *Q&M/! WQ*  )Ð%S   0 ]¬Ý $(48<'#&'675#&'6735'6737'5#5#'5#5##3355#5#¬`l=3573"o` ""Xu?53<.=k] à7 &‚@@@Ø&7ª0:<ôY'('2ô?;,/8;‚V ,* \~<5®&&û66NNÀÀ66þ¤&&#G«i2>J%632'#'"#"&546323267&'.54632'"32654&"32654&÷&K* $ _kþ^`\eb14(-D2#TE8‘091#.F_":"48%3!%0¾ 0(=7nr &2@*"2#_ ;&"0B*)Œ!1 0þœ!/$*#QŸc3<H32%632 #"'%"&5463267&#"&4632&"3264"32654&ô&_&8<)&þ‡z'8-9þË;Y '. %?.&")%'vŽ(r #(65)/;%A9X76$:*&:þÞ-#'!$#E«g5AM3727#"'%#"&54>7>7.#"#"&54632"32654&"32654&ð1ee\`¢m]"þ÷'I)F."1'55(YER#2D-(44":! 5> 2%#0%  ro6=&/ )*B0"!2 F##2"*@0þ®0!/!f/!*# #±³  *5Ax˜ ·72"&546"32654&2"&46"3264&2#"&547"32654&'26327632 #"/#"&#"#"&547>4.'&546324&546327&#"+"3267327-4654&#";27&#"#"¶$44J55+&%#"$44J44*%%""ó&/  ™8!¢cJ*@%þ»B5[CI¿03R?BQ@#{NS€#9QB=W*F æ/3C.þÛb9DKB63AÁœ8E",1þÏþ¸D43AL?C:^  'Gæ5$%44&%3&&&&²5$%45J3%4%%4%Õ   W _9 'ÂÍ=1~ ,+:LQCS) : *OBQN7%/þº, * ª>C>7CC®h&&Â/1@E6:E 8 #ÿóóÃ@IR%"&#"32654& #"&54632#"&54?4&5467>32#"'67"'6ZEÈÂþôÁ] "LÕ’”Õ×›Qm bD9>%-È 3"7‡ )6¿‰„¿¿„ygšOÒÕ•–ÐD3LÜM RyQ¡ <1Lþ« D!#ÿòó ".=%'>5%7&&#"76322"&5462#"&546"32654'.i£!'‘'þ–C¦ 1)("(;;T;<.‘ÑÓ•–ÒÖ—˜eVËŠÄo,t’V?&u>[nT'L ù¹Ç<)*;<*);Õ“•ÓÔ—•Ðo^~ŒÄÄŠ“d(.#ÿóùÁR4&'"'7'7'7>3765464./3232+32+32+32++76x2sJ3!##!3J$=!% W% '=!1<J Fx]jJ<1!='  %W cv vc  Æ 7  F  cc  F  7 ÅX#‰,!75'#"'!62ý”ÐvÐ;9ÐFÐÐýºÐv,þ]£)þ¯£ Ä¢77¢g£ £g¢77ÿöÂ3m{‰•™746;&54632&'&5.46327>32#"."'5332654'.#"32654/&'376;.'#.#"632>54&#"32654'&'7&'-0&%(& ++( ˜g8W0 •8, 3 % 6)Pe2›R  >L ![%( 8  M</ ôX G §-&ß"#/ f_.&5@oqAA#Yp ,=z•(8E2pT26'n"‹mS ' b % Loi !¢ 4™ B<™| pu* !;4x(cs‚Šš?67>776327#''#"'#"5?267327654/327#";2654&5'#43632'7&"3677654&#"327326547326%#7654R# EL1=U J]& —— \hc*O4Y8í C&B%K Bx;/:|   X¦%>K ' w   <'ìO $xX iÊZ4KA8#`  T; GgŽ8 8! o& 8%(D FF5  ²µ$B Y :!±  # ÏV$^]>2UKO ;CN#3l  *17=2#"&5467#!"''??2654/654'%>7%>7 . 0_­ $þëþN)Q|E!yIÍ#QBFþçnþ†?q+þDož ( *>>Wþû û šˆt‚|þY-%ŠRp/ iÛshàGbý$#ƒ&(-492"5'57!2"%5'%7654/'!!&!654'!!!6jNNeeÍá áþŽRRRöŸŸ(WþaB€þ•„þ|þwD® ¨NOOÍv¬w   ›b_¢_nmW‚îP4Õ()¢L#1l| ",39?2#"&546/763!27/4&+76%654''%.''%.'™- /}•Q)²$ŽþU"Iy!E«%µFBQýòŠþ’ p+þ l ' þb< = ׇš ùåv{‚rÈ*/oQ‰"þ;ïÚÞG ÞÜ#û#‹&E7"&546;32>32#".#"7232675##"&5463235."#"'#";> 8EJ:˜/',5ÏhNì5*$4G-&z'_0'(-_#w8(- =ƒ):8#‹ 2ÂU>CWK)0)xWH„&-&Bb&-&:HI0"#2FK?)0)JE2-G##gªL6E22#".5.#""#"'.5463:32>76#&#"32?64a!8/4S3:W1,7$"2   1%.J?R2'4    !o *$$* HnL*?B:  ;#"&'."M T¸:Z-pþÚQ%,Ý)GŽ4wþf–  7ƒ$ÿò+Â574&54>7>3232767632#"&'&'8    Ýnm  B)4öJ7G k˜!/'   ?'æqW  R#J/;ñ@/3 #×´  ' 7 ×þà ;þáþá; þà;yþâþà;!þß; ;þà #×´ ''7'77×®®®¬¬®®®®¬¬«­®®®®­«®®®ÿÿÿ»<”P#"&'#"&54654&54>767.'&'&5463262676327632>;2<eBX  [rT#  ›(  ,%   n#[·" Š3¢‘ + -#)½kP +U ˜) $ÿò‚ÁN7#"&##".'#'?4"".54654&'67.'6732632>32Q Zy# .:O =   t2$M <&D "   ‚r   #;T hU,•2?­,"[6K¡#ض #3##5#53573##5#535##33535#¬ææ\çç¡çççççÄ¡çç¡ççpç\ææ\çFççèèçç#ç¡èè¡#Ö³ 3##5#535ðææçææ³æçææçæ#Õ² !33)!%!!Ennnþp"þÞ"þÞ"þÞ"þÞnnn#Э !5353!3#%3#ÑÑÑþAîî¿îîîî¿îîÑÑÑ#̳ 33###53Ê[§§[§§³µ[þ]£[#³33##'#'537#3335#5µuLANkV8Z’’’]³GME|þ¢GLu|”]þc]”#÷³ #33###53'33###537#3335#5á[‰‰[ŒŒ2¿‰‰¿ŒŒŒŒ‰‰˜UþžbUʘ¹þžb¹˜‡þžb‡˜#`S1;54&'5!#"732673#54.#!526=+"#;iV[HnF[ Oj,W<[Hþ’F] NkJZSnmS\Gþ‘32SkiN ^Eo#ÿò‘¾  #3#'#7'337/373#/?#ZiÎffÎijÍffÍRR¨RRT?}A=<<==32#"&'#"&546=#"&54632.5462Ö5&'#"&546ƒ#/% 029P:2/ *&(1'99(1''3/  9P:2/3''2'99º0 )'(1'99(1''302:P92/$1!'99'0))2/2:(':#ÿòñÁC%4>=#"&546323.54622>32#".##"& #*#!0,5OM5 0-!!MjM 6$3235#"&547&54632#"'3&4632632#"'#"&547#632"&547.546325##"&'#"&4632$(‰$H&(%$Œ%1!" 8%Œ$$ (6' &$‰%% '&!%'Š&8 "' %&Š4$G $#D%$$ '& $$%% &2##ÿó÷Á!2#"'.'.'&54>7>76‹Ås xÏ C.(ˆ& ;o12KÁ k¸Òi 6v,(P833y* #ÿò÷Á&3#.'5>767>7.'.Ç€zÌ ¾…{½-/agqT2*",)HNÂþÜ œþä¿¿œ >,-??X?#ÿô #''%7632%7&/&547ŸcÑEêé@Óf?  þë3hh#JÒÒE&ðï2Âô¸þó—— ¸Òþû,5þÿÿB ¸¸Hœ›-,#ÿò 3'7'3!''!7#7'7#¡E’z7”—-t›CkÞZùöMÕiXÚ¨=ÇÆF°×'²\¤cc¤\Mþê§þí££§Ìä…Ü‚‚Ü…#ÿóÁ (23'7'372#"/#"'5'&543%7627'7'š-x]"jn%Xt›þÁ;ßâ=ÃfH¿‘5«§2“¾éuG‚MM‚GZœþó“ œîi· qÍttÍq #ÿóà !%'!%''5?%¤_Ýfþÿù`è RNNA¼…ÞÞÔSþ´Ãþî¥þç°°¥bSñbb’0þ䙂þåì0b#ÿóx 3#'''!7#7'7#—{RÕ?×Z…’²ƒVâaQî¾QÒÉKË÷Âõšþýk‚­ãöï#Ƴ7'#5'7'75À¸NÅÅN¸–¹NÅÅN¹³ßv…mn„uÛÛu„nm…vß#°³ #553'77''7 mmÓ6ÒýªÓ6ÒÒ6ÓVÒ6Ó³óóýMóó×z_zþ¦z_z¹z_zþ¦z_z#ʳ7%!'#'7!5'7 ×ê=þÃê× 1Î%åþÇ9娳þ¿ç Ô +ÒåþÅ;åÒ+ Ô çA"ÿñôÂ643274322#"/#"'#"54?%&543%'&5432fÛ´þè­Ñ×±þï´¥þêºÚײþé²Ó× #ÿòöÁ #&),/7'#''7'57'777!'/'7?7'–.Ë|ÜÙu ¼7 .Èxááx¼:+15+Üjl/ÊgÖµ/4+àngþÇÔkØÁÚ{À6 1ÃwáØv½5 3ËyÝík5ÌlÜ·.6'ÕflþËÉoà¹16'Ù#ÿð•Â$#/"/"54?'&54376272ÒÀö66öÀÀö66ùY®PþþP®­PýýQ#ÿùåº5732/#"/#"?#"54?'&54;'&327632êòËË ò+ˆ‰+ìÆÄê+ ‰„È,ŽŽ 0íÃÄï'…,é ¿#ÿùÞ»7''77''Ù§§Ù”‘Ù¨¨Ù‘»Ú“’â©©â’“Ú©#ÿÿõÐ7'''77'7''7G1®}®®}®1Œ2-ƒ-°ƒ¶¶ƒ°-ƒ-2 ¯,‚26ƒ.¯±±¯.ƒ62‚,¯ƒ³³#Õµ/3777!!'''#'7'7'7!5!'7'7'7l!`#j¼Áøú þóúøÁ¼j#`!a$j»Ãúþþïþúûj$aµþóúøÁ½k#c!a$n¿ÅûþþîþûÅ¿n$a!c#k½Áøú#ÿõ À ".8BK#"&54>7>32.54632#".2#"&547&54632"&54o<$*5L&Ç1_#*5L&Ç+H4($Zé+H5'$^­F22$#1U:  994 'ž&#iGW&#"&R³"&WÏ1F22$"DzLIþµ|IJ#ÿò Àoy%4654.'&##"&54>54&54654.546323267>54&5463232>32#".#"#"&"2654&%$   *&9"BNBBNB"9()  #$#%   *(8#BNBBNB#8(* ! %#$=++<+*9w  )0'!$,   ,$!(1( +)>o   (1(!%+   +$!(1( k!)+†+>++ +#ÿý‡¶N%".'&5465#"'&54>7.5476324&5467>3282%@%CMMC$@$3#(>m¢¢mA8)z 6"%F6 ¡(0&")%±j$*"&0(¡†% 22 %}3!( g  h &"|Ž&#53"$Ž|"& g  g (!3 ™$- D™H5&+||+&5#ÿîÌV`%4654"#"&467254#"#"&5463232654.546232>32#"/"3#"."3264&¤ 8%:]T(  Y3 6%8II8A #Y>9H C*7W$5,ICbEE`E#ÿð Á?Rf{¤%#"&54>7#"&54632&5462>32#"'#".7632654&#"?3232654&#"32654.'#"/&#"327/&54323267'#"54?— %6L ++ )FUL5$A2%LlK%1B$5LUF) $L6/  !'6)*6˜^ V&8L7'K„F1&6+",Cš>0-"+# =-&6þÖHZ6&1!UEÓN6&-= #+~!3&6XJ E\ #ÿòòÀ4=Wkƒ—±ÅÝò#"'#"'#"&547.4>7&4632632632%"264&#"&54?'32654/#"&54?'32?'#"&46327'&#"32?'&546327'&#"7'&546327654&#"76327654&#"7632#"/3264&#"#"/32654/ò*?+/SO/*@**>,.QP.*@)þ°&66J55  )1"#1)f< _h02#5.>n "" nj "00" j _!; .5"2/hQ )1"#1)f< _h02"6.>n "" nj "00!j _ < . (#1/hx>-+JaaG +->-+:JaaH+5J55J5Ïm "" mj "00" j_ < .3#1/gR, (1D1(f< _g02"5.>n "" nj "00" j_!< .4"20gR, (1D2(f< _g1#4. #ÿòòÀ  %*/4>2 &5466327#"'7.'%'%&47'>7'"264&‘ÒÒþÖÓÔ“D!#$!EE%&<¥6 þU¥6 ¤ ýé¤ >D 6JD 6QIdeŽdeÀÔ“•ÒÒ”—Ñ ¤ ýé¤ °C 6þ¶C 6RE J EE J ²¤6 þU¥6 `dHGeeŒg!¢Í:AGLSY^&547>32#"&'.547#"'&5467.547632%&#"654%>54&'3267%RRb0(IU[$5€Ÿ¬u 2&fPR/31'IT\$5ž®s 2&ea* F\V þÏ* Fþø!YWþø µC9( KªsW1%17/3#+[i´D(& M©sW1%17.3"+[d0#(ap˜'M‘™GþÏ#(ap™&K“˜I$‹°A7'/'#7'757'7'77''7'7'5'7'37?7'zŒnadc!Œg Z&Z gŒ!ceanŒŒnaec!Œg Z&Z gŒ!cdanXQ708 :k{Q¢D;rr;D¢Q{k: 807QQ708 ;l{Q¢D;rr;D¢Q{l; 807#ÿÿ•µLPTX\`d'4;7377632##"/'/"57'#"/&54?'7'"4?6327577'5'75'7'Ä  „}ˆ„„ˆ}„  „~ˆ„„ˆ~r˜rr…qssr˜rr…qsscK——K˜TDMLDT˜K——K˜TDLMDTvƒC…AA„BdBBA¥ƒC…AA„BcAAB#©A7'/'#7'7''7'7'77''7'7'77'7'37?7'rižc\X42imM"Mmi24X\cžiižc\X42imM"Mmi24X\cžU>"018fš;yx+FhhF+xy;šf810">="018fš;yx+FhhF+xy;šf810" "ÿòï¿ &2?LZi'>7#'&543'32.'7#"52#"&546#"'&54634632#.2#"&5476"&=>321Þ Í ¨Þ Í ¨ Ê wÊ Ú F####L& & e& ' tn‡N-ýùIN-žÊ Ú ‹Ê Ú  Þ jÞ Í ####mˆN-|ýpmˆN-|ƒ% & e% !   #ÿñðÀ *=M]7'7''762"&42'.546"&546763?2#"&'&5/>324632#"&UƢƲÇþ‡Ç8D00D0JF/  K4)F4*4E1-9OŠ#Dý30.7R‹"ByÇþ†ÇÇþ\ÇÀ1"!00DF1-,M‰!Bý10.0Y &@$!BpF/ M3*D0 M4#ÿó¦ÅP7&54632#"'62#"&547'#"&5475#"&54627'#"&546325&5462u…5#%44$%ƒƒH43%#4…F4"#5G…5#%45Hƒƒ #$43%#4…F3F5GxM "22#$5 NN 5%#12"L=#54#>L "31#%5 NN!6%#13"M<$54#> #ÿòôà #-:GQ[g#'&546323#"&547'7632#"&547%57632#"'%#"&546327#"''&546322#"&546” 1 ‹ X#þµ X#lœ  þ]œ  v †#þû †#°&88'(88Þœ þ]œ v †#þû †#¦ 1 ‹ X#K X#‰8('88'(8$ÿòï½a'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! *™» $$ º›* "m "# m  *™» $$º›* m¨º $$¹š* !m "." m"*™º $$¹š* "m "." n  ™#ÿóFÁ "&546324.#"326¯°Üã±­âäj$hC3 k\zˆ¿¾#׳ 3!5#!!niý¸l*ý÷ ³hýµaR!ýð#׳ )35!#!oý´lHh!ýöMfýµG ýõ#Õ³ !'!!VýÅw3ýî³xýÅs@!ýé#Õ³ )7!!VýÍw;ýî@sýÅWýé#ÿòíÁ ''7'7%7ˆ““•ú ••Å••—þŸ••Á¡••Ä™™•þ¤––Æ••”#h³#hE³ýM³#ò³#òϳýM³#|³!|þ§³ýM³#eÁ4>;#"32632#"&#'=fA W9( %4&#"#"&4632e™|6R( %=T\DIZ u’)# TzTc#yÁ"#"632>;632#"'#"&546>K{&#T2“eL)!>ZX@b.O1D[¤ÁL8PeuN5Z~Xg.9eLp™$zÁ&'3267#"'+'267#"&54632>32_K|&$T2”dJƒ )!>YX@c,O1D[ %:lL9OeuO6Z>?Xf-9eL8N>/#ÿq¹%4<%".54676;573#"'#"&5463232>7#ERx=^K1E. ! %I‚˜ ¤Mxg:8ÿòèÁ.'&547>22#"&466L(%JšJ%6G* 9SS;32.'&5462"&46›( *6B, 0082:'B­9SSvSTÀ"  L?%5%/()6*A?LþNTtTTvR#(k‹&2>2.'.546î/K2b°s!##ZM NZ%#!s‹96$ObuZ+#(@>=A( #+Yt#ÿóyÂ!.54632327&#"#"&5467»NJiI5F(2#23 Z>[8IgJNdb:Hg-HMO!AH*J4?fI;b#ÿóÖÁ9Df#"&54632563232654&54632#"'&54>7.#"654&#"632327632#"&54632Uq;5A""$1 52+" "‚?2 0 uh&8n$ 66N.B$5>5$#C `@{·M;b3! 7.46;32&5463232654'632>54'öj>Mm% 7!L> ( $/^=/.$& #' 58<)%G #  ýQ-2,H/VCM7%+S+ 1)3Z 6" $$.'%4&#!  '/ E*#ÿóò 2 &546#32+!5#"&5‘ÑÓþÖÒÕÎ$7vM "$( ÂÔ“•ÓÓ—”Ñ]H  þø## (#ÿóò 52#"&5464&54632!5#+>54&#"326‘ÑÒ•–ÒÖ[ &%C?su%!ÙIQN2eTDX ÂÕ’•ÓÔ—”ÐÌ 3)8Q.Vc É/'&9$)D0@L>/!#ÿóò L2#"&546#"'632#"&54654&#"32654.'&54>54&#"32654/>32‘ÑÒ•–ÒÕË>1&18>+  bK]y!1( ")"RMF] "*ÂÕ’•ÓÓ—”ÑÓ0:(8/5L !3C]G%8  1$7<4(  .#ÿóò "#2 &546"&=35##3+!5r–´‘ÑÓþÖÒÕxxKíÖ4 þæªÕ’•ÓÓ—”Ñý¾17Mþž"* ###ÿóò :2#"&5464654&#"32654&#"732>7#"'632#"&‘ÑÒ•–ÒÕ*" _F_€cMN1 1*.(5,!ÂÕ’•ÓÓ—”ÑýØ "-?bICX(† ,#~¢6B27M#ÿóò >2#"&5462#"&54632654&#"&5463232654&#"’(15*+6;*‘ÑÒ•–ÒÕG-Z>VrVB[9@5 \F3Q0 oB84AC43ESÕ’•ÓÓ—”Ñþ•)RS4iOAURYx !+9'73326‘ÑÒ•–ÒÕ¥ &yþv! Ê~X%$ÂÕ’•ÓÓ—•ÐýÔ4"ABͺ&% ªqI )$#ÿóò !9'&54632#"&542#"&546>54&#"32654&¬/6, !,AE;+,54&#"327#"&54654&#"…+78V355‘ÑÒ•–ÒÕ‡?]/xbUpXFZ6@5![KC43DA74BwÕ’•ÓÓ—”Ñý“7[[/sgNBRC\w%-;#ÿóòÂ)62"2#"&546"&5#32+35265#"Î||A“ÒÓ•”ÓÔh&D:9  Ü“OX§NR-7LìêLÔ”•ÒÓ”•ÓýÁ®"   þÚ&&.rŠƒNk:#ÿóò %3##532672#"&5464.#"326ˆ%54&#"#54632'2#"&5464.#"326&<=: áþßsG/3)(0=T@BWŽ‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿¹-G.'.4 QK.=.-97- ?STÉÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ(4D"#>32#"&54?32654&+532654&'2#"&5464.#"326†16J<=PDQTCGJ8GW=MD4  d1'+.++-&-œÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóò )##5#53'32#"&5464.#"326K8ÏÏ88——‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿2vv24þÌåå¥Õ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ(8%254&#"#3#632#"&'72#"&5464.#"326‘`4*#/-öÉ@ASZE8F-0%‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿ ‹.8+' 2…,YGLdA8 %."Õ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ+7G4>324.#"632#".7"32654&2#"&5464.#"326é64e3 19 L;LS>'+)67*&//‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿\Jh1k^Q DSAE\ 2WZ=.3C<15?EÕ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóò &!#>7#72#"&5464.#"326î8SYDmMþ¢‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿H*yÇibã\¬Õ’•ÓÓ—”Ñþ™JwF.l\|‰À¿#ÿóòÂ)5E"&547&54632'"32654&"2654&2#"&5464.#"326KUU‚SZHN<;Iˆ&..%&1.+)46P41&‘ÑÒ•–ÒÕÙ5L]H–bT¿ˆ‡¿×KX%".547632"3254%3##5>72#"&5464.#"326Ý$(*'AŽ..T.*RþÊ)54&#"&5462!5‘ÑÓ•–ÒÖQ 7@=)`IG]X(F++8L%<ÂÕ’•ÓÓ—•Ðýõ*)2H+DXVA  .55+(>"6/.A"ÿóò ;2#"&5464.'654&#"4632#"'632#"547326‘ÑÓ•–ÒÖ6:WB-/R& #-'"' ),)"IRWDH[ÂÕ’•ÓÓ—•Ðþ=!1 E;N ;* ,.)&#(=*&%.U :KT#ÿóòÂ#2#"&546##3353Š{‘ÑÒ•–ÒÖ.KHÙÏRK湕Ւ•ÓÔ—”Ðþk1þÏBuu#ÿóò &2 &5462#"&532654&#"535!36‘ÑÓþÖÒÕšP+(#&GL?LcZJ(*ÒþçGÂÔ“•ÓÓ—•ÐþÎm:>/+=FfPK\_AþçQ#ÿóò 32#"&542#"&54627&#"32654&#">cD'& $/[‘ÑÒ•–ÒÕ‘Lr7;#55 D[R@4. 'x:1-5=.*‚Õ’•ÓÓ—”Ñ  q2kLJf1bIDY)XA#ÿóò 2#"&546!3>75‘ÑÒ•–ÒÕJe_LOÂÕ“”ÓÓ—•ÐkA_Ýeo½„2#ÿóò  62#"&462"&5462#"&546>54&#"32654&Ž $&#$&+,F-+*‘ÑÒ•–ÒÕè$R?@W@R\EF]!'("#+)F)Ó,N11'&-nÕ’•ÓÓ—”Ñþ´/$9KL7H !V@UXA'3#ÿóò 02"&54672#"&546#"&'32>54.#"32€$/.D'&0‘ÑÒ•–ÒÕà MLn79"55E[Q?;'=.*8:1-5›Õ’•ÓÓ—”Ñþ›"'w3lMJg1_IEY#ÿóòÂ(2#"&54'2#"&546#+33"32654äGD"'‘ÑÒ•—ÑÕ5B.0SV¹ QLNR%ƺi[¼Õ’•ÓÓ—”Ñi(#6þëö}ƒyþ#:\z3 #7!5!޳þå³×ý¾Bzþßþáà„#^ºU7%7%{EN¬þ†SþUþëuþ©3p×#Œz'' 7#P‰þwPýâ¸C²ÍβB#^ºU7'%'%'{XpSz¬N^}×q2þªt#§t &'567#k>+ÁÞ°Ôþ…+>þ•pPXTD£ZQ#|˜!"'.546763!'&54632#"&47FþY46§2/7%$ää%&70 +, 2.&%6 þüþö!7L0#{2!55!#}ÛÛýƒjÈÙØÈ#}1!55!#ÛÛý¡Ùן#š !55!'3#'3#'3#6ääþûfLLS--Z²gÀ¿g±±±±±±#aFR 353#5#3#3#3#3#—°ˆVQ‹°aGGZ22[!!^èjN‹#!‰Khþáþáþáþá#hL!55!#ÿõõþëaòòa#Ryb'#Vüª&¬Ù¥bþèøÇÅ #Ryb7  %#&þÚVý$~þ[RùÏÏ #r° #Oü±É°þªþªV"S€`37!5 5!"'.6'5K6R+#_þ¡þÅ:#0 `S=SèéS*06*ã#T€`%5!"#5467>3!5!þÝH-*(4(%;_T Y ãHESè#ÿœ­ 5#35­þö€€ZþB‘Y#FPm !53#5!#Š ™ÿþü” þv]í",ä]#+"ˆ3 #5!!7!!™€ þ÷€þŠvþŠvúˆþÐþÓœ#ˆ ó #+"ˆ3 #5!!7!!—‚ þ÷‚þŒtqþ‹uúˆþÏþÔœ#ˆ ó #e@M5!57!7!!%œ¤þ>þ¥´D;þ¨ž;M¶u½\¸5H¯M§#e@O%'!'5!57%!!Cþ}´]À¢Œþs:þa¨ƒeT»\½v˜Ÿ§L²#,•‹ '5#'3-#3zþÚT¦Røþýøø‹þ¸þé?QUþZòãOþÛ#,•†%5#7357%#3-øR¦T&þžøøþý,iPQ?þëdþáPáï#KHe 5!'7'!7!!7; þíþ2DD=ýþ7D Àeþñþõ`Aƒœ!9„ƒ2µ#KHe%5!7'7!57'!!;ýèDDDÎúºÀý÷D7KZœƒA`þõÖ½¶3ƒ„#Õ²#".'! !67>32ÕØ®2_Y<b8þÈþž)%ŽH¬ëþÞÈ <)x=7&#"467'%67"%.ê}*3FM#1}«þû0yS©þý  i!6O`  7i Ú ÚžÚdCÙw#Ñ>ã&547#53&54!67!%!!&”G27a¡¡þõþ­(PW9þiS>?þ© ã+; K"" "!"!û1D-ÊH3"$à'7.5327.'%&%467%ê}1#(BH4*ý»WPþýtþü ©i7  bM7!þäÛÙÚwÚI"ÿîUÇ%&5467&#">7'&#"%632&54'&(7e*#DI^Ni5S3fM>MMþûTa,ÇÙ@=0F.U )d+ ¢„72WBBÚK 67A#{¤8"!>7&'!;.'>7Xfkþ®O<{R .F=+„ (x—†‰ "ITgIl0›>O" p?žA2¬MY("ÿìUÆ$%&547#"'%32?.'327.547)þý+*aTMM7#"&54632×H%E&) HD32&547&5467L?a<5@&26 2'(=1;nL?M…JLƒL"S!0/!?4&.- //#'5R27Œ Š62O*#•{9$4654+"+"&54?654/&54;2;254&54632#"w!Q(0 ô>;,ò6 $R$%yk"º,  ;  d [ B ' ne#K¤g;7"&54?654/&546;23254&54632#"&54654#"#‚0/  ,1Þ;1+' &” $'%"! '/9K-Z8 $^!'#1N  G#'— $‘'#U F0"ctP 3#>7.'3!5!.5!#>75>K¶ªW>=VZMlÂ8k4ý…þ#Hþm{4f"8LP‚vl‰XYD8qO5t&-%`þÏ-%n9&efXX/".fk‡.?^/7tDrPe62"&46"2654ŒT<V==V&/"!//!"89¼¼Š2þùX2þù?2Ôƒ2Ôb#¿$%67#547>737#".' YVÞO~T[1H" Þ 73noJ:[*Zâ~«™sj»— <**  «sH"Gƒ+:d}k""3>54.".=4>32ô6yjEe£VƒÛ]¥Y@xNÄFLúú62*æƒÝ¢ülq­}dk„ !!#!=!}îþ®Kþ¯î£Kþ ôáKKÕ©Ï' »» ÈÏdýDddî>Ï'7'KÈÈ ¼¼Ïdýdd¼d«nRú v%27&'7>7267654&76632632"'>54&#"#"'#"&547567#".7632746=4&7632>-VQs0Å0"0Ë 2|5 &5 35S. EmDCD9\M^ Q3+Då ' 2"5/A—•V+V DLƒN0q u=  2 +5'1=  %A$8K‚%FFE]*XM6o ! =$ &Yi¨š 727&'7>7267654&7663632#"7>54&#""&/#"&5476747#".'&7632746=4.7632>ß5og:÷981ÿ"D˜> A2 = Bh9% %D5^gŒv_ aD8SM¶ 5##& B%G9}b›lXI&V^¢#` 9ÇO  $@ &6C0 4!! )p:J]¶\-Wr8'J?GŸ(8! "œ-C#"&'63765654&'&'%4.5432676?#".- ee//0/#0& ý–   ;7 $$H%@,+G 5Š1 2 lª/;(  ) O¡ !,-]9-q¡F¥y J#"&'&73654654&'./3$4.543267>2#"&'&y!w%: >> A,J?üÿ %84 Y-.#(WQ  A±. D¼vtJ ) 3JÔ,*s<\+-8N6aÃÜ"/"#"&/4632632'5>54&'"&543KD $  6x,L9';+7cP“JI4ü)* F0,U>?#+[©A1!zU  ßDé¾#0"#".'&54632632#5654&'"&543NBpI# E ¢;4G"@y^ð'#Âa ]@ˆ#:&32d{.}OêßE0®r' Â^-àW#"&'.7632"54>7>7#".'&76;2326?263263232632#".#"#g 7 0H 7"þr!F-–,4H  % f..);¹ ,!'>)q }Jd,&%'d , D6 þ(&+  #  "0 /ª &&% %' wXyzU#"&'.'&632"&54>7>7#".763263263232632#".#""ƒ#A-/$D)þ )U(eŽNf&4 h ò( (fˆ (D-\>+„  NPYz7'1$ .=Ý 5A % ýŒ "2"]ˆ',,U [~$+$ .- 55ªjXß&’.56.#""543763654672>7&5.473727632>32#".'"54332654#"".'#"&563272>7654'#"&76;2O7EPB")&&ýó% $   >GO#z5H[RP,4 $.IP‚W` )"  0  ;&,,  ' þÅ  P!`* 3 (D,*-`EF3 *6y6n# +::)@= Xh®v%.'"56'&#"'43>567274&5.67632632>32+".'"5632654.#"".'#".'&563252>7465&'#"&76c u:  S)=! )Zýn;&)6G *_ $^/.ŽC^pe`5E >,Ua !E1jz 4*  %L-)- 7 a; þu ž7¯ &!;" )V753wVW> 3E11FŒP($J IG= Jƒq²{'‚2654'.'&7616#""3632"54>7#".'&5623263232>7654.7632632#".'&76332654&#"†)@e/C %+ 74ý'5   !    J"P&,-=, 3(UY4!(D#›=!7D%Q2    þï9³…   %'H!Y v A.:ÐX$$0(îV=3 S„cNƒqé{ Aœ#".'&7#".'&62654'.'&7616#""3632"54>7#".'&5623263232>7654.7632632#".'&76332654&#"é $""CP #N%)@e/C %+ 74ý'5   !    J"P&,-=, 3(UY4!(D#«#2 5[%0+õ=!7D%Q2    þï9³…   %'H!Y v A.:ÐX$$0(îV=3 S„cN™6-¯‹23%'#".'&76;237.'.'&563232632>32>32"##".#"32632#".54676323'.'#".'&56326ø ;™( (      ! T"8S0 (]+&2, %/:T/XyuK*‰ YQ!Io6jZ $kg(Ó- 7# !+*œ(    4$€$  K` !((g"'\ .C97`? aE $™6º¯ §#".'&74#".'&7623%'#".'&76;237.'.'&563232632>32>32"##".#"32632#".54676323'.'#".'&56326º  $DDQ "O$ý ;™( (      ! T"8S0 (]+&2, %/:T/XyuK*‰ YQ!Io6jZ $kg(Ó- 7# !7 $14Z&0)ó*œ(    4$€$  K` !((g"'\ .C97`? aE $/R¼®0%#"/.'&547>?>=4&4732¼ k >|D/c0 !%)VL  @l4oo { Jt6,:0 TE !E)5#@=   ,V:vCzv E#".'&7#".'&6#"/.'.54?>=4&672172v $!"DP #N%z`‰$%D‰Lœ#2 5[%0+þn BE 5 &7‡@  A'!@c!  #0Ua0§…Bh2#5>54'#".7632>74.'&6326%>76#"&54654&7632tŸ *8[JVj + M#[;  /#˜ýfL # !&0¦ 39]E?(37iç™' <:  D<5 "R p.9œorB 9e8e„Šñ *KŒzɆ`‡#".'&632#".'&76#"47>54&5#".7632>7.'&632632%>#"54654/4'&632É  $O  C "O$Mx.FRDJ` ' K_=  U •ý` "(<".&$1  ]&0)q*ElCC B^ψ  76  )%C) F w'0Šfo/?D0[50Ð|Ö . Ç‹?0A%2#".'&5463326+"##"5&6727.'.54332632 “^KxE1)-%6FD× -ngKl!šOPCCBIì$/# S'"' !÷( 93  Ç‹Ér>a#".'&632#".'&6322#".'&5463326+"##"5&6727.'.54332632É  $O  C " J $l“^KxE1)-%6FD× -ngKl!šOPCCBI$1  ]&0 )þ$/# S'"' !÷( 93  ÁX¡c'#".'&7632632327.'.'&4326327632+".#"72#"'.54>32326°R¢=5%"# Ý   4 * V O"   TN\( +* DDV-2I"ÁXîÊ#".'&632#".'&6'#".'&7632632327.'.'&4326327632+".#"72#"'.54>32326î $N  P "T %îR¢=5%"# Ý   4 * V O"   TN\( +* DDV-2I"ÿii¤,454&'&543232>76#"&+  +$Mºo.U,O?Y0hNn m  #C¯•FO@ NK&P(:uù‡4H#".'&632#".'&6%4&543232676#"&54654&546Ì $N  P "T %þ‰ ' #FZÎD Y0RU2\EÆ%0 C'/ 'K 3xˆIb4R%3f€bÎ# L#§¥ _3267.#"'2675.7632632#"&+#"7>7#".54>3254'#".'&546‚W,=  #8F„"ø9. 1 P8XAž590V )X'7#.*3' 'CþÛ!$&  ‘›M7OOÞ"š " ,  3@,""q&3: #žY# 6&'?%  4'+ L#§°*~#".'&72#".'&63267.#"'2675.7632632#"&+#"7>7#".54>3254'#".'&546ƒ  $ N  Q  "U $þPW,=  #8F„"ø9. 1 P8XAž590V )X'7#.*3' 'CþÛ!$&  ‘C &/  C '/ $þlM7OOÞ"š " ,  3@,""q&3: #žY# 6&'?%  4'+ f_¦tv%".=47#".'&54627>54.7667>54.763232#"&'#".'&76327467"32632†Vq[*p! 65 D 3 ƒœ 3 iX }+  2 Bp¥ '#*&.’ S_0ZF0/`. "-&F#  H? ƒ1 ^F %X#* 2, |D„ "  f_Ýt ’#".'&74#".'&76".=47#".'&54627>54.7667>54.763232#"&'#".'&76327467"32632Ý  $DDQ "O$þúVq[*p! 65 D 3 ƒœ 3 iX }+  2 Bp¥ '#*&.’ SØ $14Z&0)ý 0ZF0/`. "-&F#  H? ƒ1 ^F %X#* 2, |D„ "  wCGO"&54>76?67"##"&7632623263%$32#".5467” AB­  nB*@  ö &6—: ‘;5œˆ0DD0IQ=Ž”‚þãWÑ  *c~ ==$(W'm')( 3Z>1C! #:_2Pw5 3wC¨ i#".'&7#".'&6"&54>76?67"##"&7632623263%$32#".5467¨ $!"DP #N%ý< AB­  nB*@  ö &6—: ‘;5œˆ0DD0IQ=Ž”‚þãWâ#2 5[%0+ö  *c~ ==$(W'm')( 3Z>1C! #:_2Pw5 3mKŸ2Ll7"546767#".76327654.76327632%"&546746232632"=43>32##"54>7.+"&‰m- =;& \69 ´ 7t[Psn9M 3Ÿþ— t9 =5/4%LIK$ÊMrn%&<?#! W> þÒì'@3 1 4,  5Ù   mKŸ Nhˆ#".'&7#".'&6"546767#".76327654.76327632%"&546746232632"=43>32##"54>7.+"&e  $""DQ  "U $ýum- =;& \69 ´ 7t[Psn9M 3Ÿþ— t9 =5/4%LIó &/ 6Z '/ $ýl$ÊMrn%&<?#! W> þÒì'@3 1 4,  5Ù   ‘U_ÂR"&54>7"#".546327654&632>32>32"43>54&#"G $K' 0 GT- 5 =…Bš4  Rn=d‹5*F5Zˆ’_M8—,e)€^ 701!h !#= ( Jt*$*!`M3b& ‹R;S24~i„|#".'&72#".'&6"&54>7#".'&546327654&7632>32>32"5&3>54.#"  $ N  Q  "U $þ  %P   O $P2 7 Dˆ,>}6  Wt>'OS4cI5aIq=' 'E+;—5 &/  C '/ $þU $qT2 \ !" # Af$% A,[P /3<* #*5¹Yí("&54?>32#"&#"543>765.#"#ù+f}9dx‹e>\€H=BuPe6 &!kPK‹J(:+7$((q»jÐ."&54?2?632#"&#"543>74&#"È:7 'p{gOu:#9CG6RIhT>`yFMQ/? )+1NN'6Z<,  &8d?Wf!'!q»ÄŸN#".'&632#".'&632"&54?2?632#"&#"543>74&#"Ä  $O  C " J $ýU:7 'p{gOu:#9CG6RIhT>`yFMQ?$1  ]&0 )ê? )+1NN'6Z<,  &8d?Wf!'!D]aI@4>7##".'&543767>32#".'&š*>THL )z)bn[   dÕÖm., ª† &"C60rˆw=kIC'+   +    T“k/$(V2/D]°I \#".'&7#".'&64>7##".'&543767>32#".'&°  $""DQ  "U $þ;*>THL )z)bn[   dÕÖm., ª† &"C60rˆ5 &/ 6Z '/ $ª=kIC'+   +    T“k/$(V2/íƒ"Ÿ2467.'.4&3432>32#32632+".í_G P6 ;Æ"c²<Z=j‰"¨"#ÁÙL7>u.-“˜  ß!T %7#AJ'@0*K탣Ÿ L#".'&7#".'&6467.'.4&3432>32#32632+".£ $3& "T %ýš_G P6 ;Æ"c²<Z=j‰"¨"#ÁÙLÎ8%0'/ 'þœ>u.-“˜  ß!T %7#AJ'@0*KŒOˆ¨2>}"54>7#".'&546327654.763276323267.#"724&54>727.7632'&#"#".'#".4>Ì"P*2% W S Ls$R}McvE/1S a(=¢#9:@-  @H6!26* PQ = Z63L"&NR*4‚L 7&*:Q'œ°"Œ4//,PTAW+  +0 760?&D082*! $whoZ3^%#"&54>743232632.#"&7>32+"&676%762#"5654&54654&'&432oÞ~ª  ’62 s :1‡S WCc)#W)=(ýô34 *! 9É6TC& "&'Û   $ %&( T Y²vERrq Sg"<6CŽõ K  X£­‚ ~327&#"67327&'47.'&7667654&7632632#"/#"&54>7632654.#"#"/#"&÷V%KCD95WÊ%5"Es &"&G¿¤$_VP % 1D2x 3Rd6d%8*HN' ,P232654.#"#".'&'G1(G^'<þü1$iœ 4 8  !ì¥.B" 59^Hd,?63F**€ò à5)!!.@28(¬ 5 Äe:$ ,3'`! 6 ?%N/é*FJ)TH! 0QG'* !<>:Q(þô)V.)(O¢…(74&#"#".54>32"6762>54&'P¬ˆ&y¤1#?+Wr¢W“¶" ;'Kßý|†nJˆW3PÓzª -Ø»W][i\=À„%>4&*, “6˜¸)^ Zd\+u‘S‹‘ Z„%327>7&#"%4.'#".'&76327&=4.7632>32#"/#".5462667>76#"&5454&'&5432žK3>- \?&F ,4?E ‘#D 4 )= Uj_Dd /7).F"T„OþM2  ) & +" 3à> 3Y3j $(G!  ' #   ;ÏE *5  >)+$ (5± þ½lE( 7&#"%4.'#".'&76327&=4.7632>7.76'#"/#".5462667>76#"&5454&'&5432Ë $""CýÓK3>- \?&F ,4?E ‘#D 4 M$,>%N>_Dd /7).F"T„OþM2  ) & +" 3ñ#2 5ýË> 3Y3j $(G!  ' # $$ ;ÏE *5  >)+$ (5± þ½lE( 7&#"%4.'#".'&76327&=4.763267#"&54622632#"/#".5462667>76#"&5454&'&5432]&&þ&K3>- \?&F ,4?E ‘#D 4 t)(:)Uj_Dd /7).F"T„OþM2  ) & +" 3N&&ý­> 3Y3j $(G!  ' #)))%  ;ÏE *5  >)+$ (5± þ½lE( 7&#"#".'&54632632327674&546;2F0<,E]m’ANP ‹  m – 8PO87+.9±H&   7|AªF -‰ƒ€%8ˆm>Œca*()!BQ\pfXçv|<8.Oy1‹…ÓTo#".'&632#".'&76#".'#"&54>7&#".'&54632632327674&546;2Ó  $O  C "O$ ** 5$A[g‰=IL!‹e’ ;'F,ªD"   4ô$1  ]&0)þÍv¡ !Ztle7ƒl@Žba0)(!%$#!P7I)8- är=?Vy+‹…®R b2"&546"264#".'#"&54>7&#".'&54632632327674&546;2h)*8))/&&2 ** 5$A[g‰=IL!‹e’ ;'F,ªD"   4)8*))&&þ°v¡ !Ztle7ƒl@Žba0)(!%$#!P7I)8- är=?Vy+yqŽ_d7>7.546=4.7632#".+"4326727.'#".'&7632654'#".'&56Á "$5;Q.1f(!A *L7Äw (B$D®<' 4E<".'–  )Ø L',Š4%5   $(" M7*w  7R-,)= 2 :($* Ÿ$\( CyqŽ_ €#".'&7#".'&6>7.546=4.7632#".+"4326727.'#".'&7632654'#".'&56Q  $""DQ  "U $ýÁ "$5;Q.1f(!A *L7Äw (B$D®<' 4E<".'–  )q &/ 6Z '/ $þ{ L',Š4%5   $(" M7*w  7R-,)= 2 :($* Ÿ$\( CyqŽ_ w2#"&46"264>7.546=4.7632#".+"4326727.'#".'&7632654'#".'&56Ú))))0&&ýº "$5;Q.1f(!A *L7Äw (B$D®<' 4E<".'–  )Í))):(&&þ= L',Š4%5   $(" M7*w  7R-,)= 2 :($* Ÿ$\( C?ú™Ð,"".'&56326232>32#"'.œQEH& >=S%($%!"8šQ PSR²;H;#080 #&>H J®eFož' J#".'&632#".'&632"".'&56326232>32#"'.I $O  P # J %þÀLBD$  :8O$3?$0”RW¹dº#2 A%0 +6@6 *2*6'1rG LÌ`ož <2#"&546"264"".'&56326232>32#"'.µ:)))X&&þ¹LBD$  :8O$3?$0”RW¹d)))&&G6@6 *2*6'1rG LÌ`•‡nC o’%326?&#"&'#"&#"&'"5>3263>32632#"&'#"&54632654'+"&'.>2327&%762#"5454&'&5432qT()I QE1D %ƒ  `)•  & ^  IQBD 08'YS}=1F,$  Zcþ| 89(+'6-  3ð'&%2lV % %  RB(%* "& ,G(>-?Z „ ½WD nnPv0-¥^*L"•‡ÕC %‰¬#".'&7#".'&6326?&#"&'#"&#"&'"5>3263>32632#"&'#"&54632654'+"&'.>2327&%762#"5454&'&5432Õ $""CP #N%ýìT()I QE1D %ƒ  `)•  & ^  IQBD 08'YS}=1F,$  Zcþ| 89(+'6-  3—#2 5[%0+þt'&%2lV % %  RB(%* "& ,G(>-?Z „ ½WD nnPv0-¥^*L"•‡¡C¤2#"&47"264&326?&#"&'#"&#"&'"5>3263>32632#"&'#"&54632654'+"&'.>2327&%762#"5454&'&5432?:())F&þT()I QE1D %ƒ  `)•  & ^  IQBD 08'YS}=1F,$  Zcþ| 89(+'6-  3é):((:&&þ'&%2lV % %  RB(%* "& ,G(>-?Z „ ½WD nnPv0-¥^*L"àoX£ j%32>7&#"7254'".'.7>;&'#"&546;5.'&632>3267.76#".'#"&546E-/> 4KO=±"34I_ )Y1 9Ø j€+ A#=òh,,F}p‹Hm2Sn@Usß,"5' 6` .Q* Q32 e %9  0U/ ""‚5$c 5QNY>3764>;67&#".'&76332632654&76#"/"'4>767&'#"&&ç9#   &ÎL9\#(T4v0) H!.$)F>!L }H.nošw "767&#4632475#"&'"5432?4.7632>3232>54.54632+"#"&#"43676=32'4&#"#"=#"&ê%.++oL8  h!u!?" 4ofN$ z'|p---#$Y9   @c(ABPu[ä 'Mð(!)4  ” V2CA >'D!$+0 # # G4 x"$*-Xx56HNX‚;(5„h%6 ˜TPkžf]673>7&467'&'.'&7667654&7632"1"'47654&'".'+"&4+_7j•TH2!:9)ÏQ] Y  w}(1F`N7O?.Vö—Cz( H5'I?=uŒo_@x.(U?N‚“2H9+ /J$Jf"#((:e>o[%b¿g‹„­k b4i›6Wµ f67'4>7.'&76654.7632#"'#"'32>7654&/6#".547&'& X=%cZÕ?RQ:@K :}C#  I! 0 1>+9GZ/S6! ,- &7a;%HG+Ob-·^^ 0P59 1 '.M&-1* > wY  ;5EQ+BM$ *ZAf'@TE0.\?*C >™T9åU%"'./#".'&57627&546;274&7432#"&#"7632#".'"54332654&#"M, 3+;5   --+/0, 5 G 37#toKZDH5)5 &.A2<1^½NV ndQ)c *  >)(5< "F*(A,/8  +%0S |Ž5BJ‰[%#"'.'&'#".'&54627'.546;274&7632+"&#"7632#"&5632654&#"b  A6 4J+!  77 @ A=:CX @,/! ‘Y;S'ZC‡J*L@M>xë_n' j#€d3W&!4  :5$ FJ  #$B52-*:E*6$.7&'#"&5&54654&54>7&54>32632¢AK#:×/ 9F7) `"H%µ!#` "X%! % * # +E% 0F#$Fïp!5zL†bgM';*-þêQ›/"UPhj Q <(3[_@ / o )]   ‚&+I,L[?V'>@!&HH+·zo~ c67.'"%32654.'654'#"4767&'#"&54654&'&54>7&54>;2632#"Ž\U* %E ;GW%0!u, :N&Š38m J    4 , 7$V*59+ .N2)Mš)3 a¦yc2M) <þ¥cÆ70hV€z~9q=v° >Q(ˆz %(" ¥-7 4[ \pNl #6[9"EM;'þnà H%3265&#"46;24&54654.'.'&32>32#'#".'#"&\H3>F5T^    MLn p-E#v0  /R6¡5GÏD@< )5 >&^%>6 - *! /=B# * 5ÀkAz J7326765&#"4;23&54654.'.'&632>32#"'#".'#"&Ùx6B$QWBÙ %    ^Lh0!•-> ]Å Fh8XoEWãU'D%(v_9n-"'&EH !' >#7^ P& *4 KWA³SO—P#43676&4.632#"&"&5467>7633>32#"543>54&#"s6‰"01 =ž;Ô !  WZ‡@3O, TÓ9aQM-Saš¯ó '`+ þK . `h(!%T4L 34+$3?/~N+ &3N/Be£*MÉ›<"547&=4654.5432>32#7>54&#"U 66s%)(-@,h >Z-% 9/#Ê #rn+5 "$LOho32>54.#"c<>4 § ("8 >!. O6¦* 5Å‘`j·ŽUg,*/Y7D-$H/.~PTÀ, 22)Y )@   -.8# 7á=kXgŒ?3) H4.I()0!+'-MkÕ¤s6565'2674654.76326327>3232?#"&54654&#"#".'&76654'#"5475#".'&54l‘ G%G)  2”&2J7*,@?JG4>5*"@68*' ,'L žÉ;,#" 7 #=%H&( ?8!6QTA$þ÷)J,.]L>ø$)4,772t}K:$U&OyFñR_ ,  »{<_=632#"'43>54.#""&54>7>7#"#".'&63326k+|Ç+¤†d†UP8p–¨$K1^¼5 4ùž ;;¥\'x¦-VYIWN! !ŒP $-Q- 7ì'#2 1Ðe0Ø f%=47#"&/6;6765.763262632"'>5.#""#".'#"547k+6& 0% B &tq1I#L:c5<>(DPfc $¦¯8[4 5F $ ^2!   F e-A6RE"1N.>_f[<6 H&- "ˆbp m%=47#".'&7632>7654&763263223632'47$54.#"#".'#"&54746J)* $ !=  6 //L ,“‹>\+_(’8'L5ƒ{  (  Ϻ6‚3=& ¡ $0~7 ( O }9SDcZ%7oµ"?>%‚jSFB !H'8! j†d?d j%3267.#"'7>767"&54676=".#"#".'&6322632632#"&546;2654.#"!$U%(2%†7&#".6332>>32#"'#6322>32#".#"#".#"#"'"5&54>7&5463232>54.#"#"&§ * &˘²,55SD> .O73C(Pf8RAHP #)63m, !4 %J *%1fL  [ª5=&*+ 0H#';.*;M" Ú   !…Œ$" '{O$[A-@ <  -("# $;: <`&1$ *$ +D  VMz¢u&#"'&5>?#".54632?67.'"5432632>32>32>7.76#".'32632#".546:-K)'   Š(@q7 Ke-X/L# \ #,6T Ÿ\$OL&8%HŸ/&‚ %>‚E `^eb#8”ê8gc;|Î '½ B  !#5´I%(+7 !) $! j;f:x'& < 6%,Œyg{B%".#"#"&54>7654.7632>3232>763‹,9)!_S  5³ 5 œ">)2>,&D='0@Kz)ÿÿºÌŽuÅ|134&6#"47>7"#".'&4332$72632#"7>75&í$&6 \ AMžŠñ '& *C< #`_-SÜ#; #"²*eJÙ½ U@"^ zz€;4.76#"767"#".'&43232$726;2#"67>7&íND)D S`ɯþÑY6”I ) xw=f 48)+Ý62A  _ í' %kP.t&UÚè64&46&'#>767>?5654'5632#"&546c LNC3-šB+>05C    n""/#_9&L  1$@?  6G:˜ |ðK‚>4654&'"47>767>?5654.7632#.54654&{#|`q=¿Q1T :77    é. #G')sG+c  =?3 >T^¢*”(rË| é]4&5.5423234&54#'.'&6322>32#7>7>54&43'.##"#"&46÷ ' >N & H]3+=0PJU1â%6 $  ! !£!10#5A^*!w $= <€zL„Z4&'5.54623234.54&7632>32#"767>=4&##"+"546¸   . Ma.0_y  ;6L;eÖR('þæl#%   t)  $E','Å*!=<+D¡*›%  % N5EºÐH{`'&'4'#".'&63276;2632+"&#3;2#"&##"'##"&/47632672634>546é 6F  J !kåœú[46464&'&5"#".'.63232>;2632##"&#2#".##"'##".'&546374äCV R %!0Wû )* ' -v…_% ?} ;Sf  K ý½)6 _% &  &;C+“    '   ÈeJãQ%4>=4'>7#".'&763274&54654&632>32#"&'&#>-='Pq‹HY^ O¡(B 8‘ 1.[)  b02µ FF32;U4.+Kž}*,F01A É2 P  zaŸ}V#47>7#".'&763754654.7632>32#"&'63&54>=1*O;N2a‹³X“#'  b$ã 1H´=9s2 'ŒJK1IlB;5YÌ™  49/!;>S AÅ,# @9i  WD?Œ]xƒ]"#"&#"'47>7#"&54323763>54&5432>32#".'.'3>5 &…3QZsU9bC:#  J]@ H$\\* L “e&(/-  /;:3, {WF3%OHK@@2 @ *L S"*! b˜ˆV( &E G 59"}j°Œ]ƒ y#".'&74#".'&76"#"&#"'47>7#"&54323763>54&5432>32#".'.'3>  $DDQ "O$ &…3QZsU9bC:#  J]@ H$\\* L “e&(/-  /;:3,û $14Z&0)a {WF3%OHK@@2 @ *L S"*! b˜ˆV( &E G 59"}j°oO•}_"&54632>7'#".'&7632>7./.'&632>32%632"&'.'Ë@ / !.lC,5F  E! =-    H &±f¡1B @9~6O G º7|E  –  * ' 0,    D99  •T    *â=>ê*& oO¨•~#".'&632#".'&6"&54632>7'#".'&7632>7./.'&632>32%632"&'.'¨ $O  P #N%ýs@ / !.lC,5F  E! =-    H &±f¡1B @9~6O G º7(#2 A%0+þoE  –  * ' 0,    D99  •T    *â=>ê*& ã|!tI67&54?54/632>2#47>767"&#"òˆM! #Jc   0.D_>=fPB1)aJ$20CÛ_• E #      sW'#>>&F%F>=998<="5@*&ã|ìt e#".'&7#".'&667&54?54/632>2#47>767"&#"ì  $""DQ  "U $ýWˆM! #Jc   0.D_>=fPB1)aJ$20C &/ 6Z '/ $þí_• E #      sW'#>>&F%F>=998<="5@*&x}–wS6>7654654/37>32#""#"'+4>7&6>?654.732>1j?q 9X:%¤ %"00ƒÁW;é‰(# 5V'O& 1f 6Æ!"2@(W[8[ Ñ6#  &17 #X8%- Ax}ä|,9r6>7654654'%#".'&632#".'&6%37>32#""#"'+4>7&6>?654.732>1j?q 9X:%§ $O  P #N%þ %"00ƒÁW;é‰(# 5V'O& 1f 6Æ!"2@(W[8[ ·#2 A%0+56#  &17 #X8%- A©ç7òA%.#"#"&763672636'"#".'&54276 676326;2#"'Ñ þ»H8 H ⬠'þ </˜+6 òY M/-   þÑT ©çÚ~`#".'&632#".'&72.#"#"&763672636'"#".'&54276 676326;2#"'Ú $N  P " L %¹ þ»H8 H ⬠'þ </˜+6 %0 C'/ 'ýøY M/-   þÑT }tu["&=4&=4'#"&54667&54.76>7>&/632632+"&#">7a 79: G> #c_y*6  ,‹ !8 4!< ,A"‘o   P Q$A&#53 KE [ŽTI/ *_Ma;Z">0}Äzz#".'&72#".'&6"&=4&=4'#"&54667&54.76>7>&/632632+"&#">7Ä  $ N  Q  "U $ýî 79: G> #c_y*6  ,‹ !8 4!< ,A"‘o  &/  C '/ $þ—  P Q$A&#53 KE [ŽTI/ *_Ma;Z">0—vHX7#"&563#"&'&76"./6767™w  N n"S   ! ]~^ma3BØËš õd$ .þŒ2  ,/[ zd)5š—v[X ,9S#".'&7#".'&6#"&563#"&'&76"./6767[  $""DQ  "U $þw  N n"S   ! ]~^ma3BØä &/ 6Z '/ $š õd$ .þŒ2  ,/[ zd)5šx»DC%#".'&'"#'43>767'#"#".'&727>32326324O *Tš l¬jU*W7 S ]U !)+XN]2Ñ4[v2g6ZFnyP2  "   ç333M2x»°½c#".'&632#".'&632#".'&'"#'43>767'#"#".'&727>3232632°  $O  C " J $14O *Tš l¬jU*W7 S ]U !)+XN]2]$1  ]&0 )ýš4[v2g6ZFnyP2  "   ç333M2pdšmi%4654&5#"./632?4&54654.7632>7>2>7&'&/3#&#"32632#".‹ 1M %" M  “#>"o¬) *ZF › þê=>%@9± X‚~Š-ÝbT /  ,* p$'>!!@G!P#  E"œ Ia%@*!   1pdÆm ƒ#".'&7#".'&64654&5#"./632?4&54654.7632>7>2>7&'&/3#&#"32632#".Æ $!"DP #N%þ 1M %" M  “#>"o¬) *ZF › þê=>%@9± X‚~Š-ì#2 5[%0+þ bT /  ,* p$'>!!@G!P#  E"œ Ia%@*!   1¿“9I4&5".'&%4&7432#"547>76ÀA þ&(  M$"lm>dŠJ'%$D 7!5_,3   æ?;fB)E‹‚d|!¿“ßÄ/S#".'&632#".'&72&5".'&%4&7432#"547>76ß $N  P " L %ý1A þ&(  M$"lm>dŠJ'%W%0 C'/ 'D 7!5_,3   æ?;fB)E‹‚d|!èn ˆ-H4.'63>32>7.'&'>5>='#&#&³* ƒ @uv“`T„V. (_EJ4—¹ YBg& -" Z#2"7   !ªÎpU01c\;%&450À+þ§8Ô&>%  $ènß Ni#".'&632#".'&6324.'63>32>7.'&'>5>='#&#&ß $O  P # J %þ$* ƒ @uv“`T„V. (_EJ4—¹ YBg& -" Z#2"U#2 A%0 +   !ªÎpU01c\;%&450À+þ§8Ô&>%  $u|uW"&##"&7>7#".'&546;23267&=4&54654'"5436$7262&632PÕN-?(3@‡Ž  …x 5Ob Fm# }!@œXèOoJK+?og20&  & [)G uÓ®w#".'&632#".'&632"&##"&7>7#".'&546;23267&=4&54654'"5436$7262&632Ó  $O  C " J $2ÕN-?(3@‡Ž  …x 5Ob Fm# }!@œXN$1  ]&0 )þÀOoJK+?og20&  & [)G èzÚ%C#".'.'&372#".'.'&5%4.732"547>76é  M „  .  &Qd^Ea}4) 3 3'# A$y- (  #6Ž"  ë$(Y>)D‚gr4¤x]q$E#".'.'&32#".'&546"547>7654.743ç  a ®  #53 >`‡L6   /f7654.743î $N  P " L %þI  a ®  #53 >`‡L6   /f76?45"#".'&763237376;2#"&"&#"#".'&5432>32  S   (:)A )MZ'  44_tRˆËZTµ0+   G i­ak”þ 06HC%) !>.__>'   þû ,  tñp;Zz#".'&72#".'&6.76#4>76?45"#".'&763237376;2#"&"&#"#".'&5432>32ñ  $ N  Q  "U $þm S   (:)A )MZ'  44_tRˆËZTµ0+   G i­ak” &/  C '/ $ð 06HC%) !>.__>'   þû ,  *RÜs1".'"&54654&54654&'&542Ã,4}Q 6<2LW+s/Q(8èUF º<;Ä1+1; _H 0*R s M#".'&74#".'&76".'"&54654&54654&'&542  $DDQ "O$ ,4}Q 6<2LW+É $14Z&0)þÃ/Q(8èUF º<;Ä1+1; _H 0~y‰tI"&+"476765"#".'&57632>74&54654&/6326322`ÔH8S9‡%”Y) I &oQ  ;a^R) \xPM1€‚<^( ^*5 79C  tŸ¼8"#".'&57632632#"&"#".'&543;232632#"&Auà$m ùzšz ×bd…    ¯T^?‰3!2  ["   … NE".'#"=47$7.76>5#"&/4326;23>7632ö ! 6>”—d-…%M4*Ê'&W³´  &  c’o 5K(q+:JQo?.°*  K8¯)    +q!–x\ˆrb#"&'.76"&76354767&767>7"#".'&763>7632#"&54654&54.5'&ˆU2X*¿ 'Pþ”V+# H3®=>Éy0gö% /Kt\ ¬*!   R ) .Pál þ¤$FL^)%    Ú$D76”/ISb.DiE0$5 -‰€3/S=@-XIR?T<^!v‰Å/#".'&'&?2"57>7674654.732‰ *T<O(4-üïB3B 7L‹98v.Œ>@$CdM J7674654.732· $O  P # J %" *T<O(4-üïB3B 7L‹ì#2 A%0 +þh8v.Œ>@$CdM J7674654.732v&&K:)))k *T<O(4-üïB3B 7L‹&&2)8*)þ18v.Œ>@$CdM J54&732632#"&546=474&'&42ä¼!)=G< F\=CLìfæ\V8î'Y% !+  S!60;O [Ch4K]º³’` ]#".'&72#".'&632>54&732632#"&546=474&'&42’  $ N  Q  " L $ýÎä¼!)=G< F\=CLìfæ\V8ó &/  C '/ $ñ'Y% !+  S!60;O [Ch4K]º³WM"264&2"&4>54&732632#"&546=474&'&42N&&K:)):(þä¼!)=G< F\=CLìfæ\V8?&&3))(:þÀ'Y% !+  S!60;O [Ch4K]¡©&4"#".'&546326?632#47>7654&5&Èþh# _ GåOO ZpL1j@mKG%.   ß+*   # Ûu3.MB^8e#/¡©Ë¸ U#".'&632#".'&632"#".'&546326?632#47>7654&5&Ë $O  P # J %³þh# _ GåOO ZpL1j@mKG%.   K#2 A%0 +Q+*   # Ûu3.MB^8e#/¡©«§F"264.2#"&4"#".'&546326?632#47>7654&5&f&0:())Xþh# _ GåOO ZpL1j@mKG%.   &&):((:Ÿ+*   # Ûu3.MB^8e#/s;˜ )"&/32>;232>32#".#"· "  FZ'I+G"ToŒ‘–! }è <<"=5AbwbS s;˜$H#".'&632#".'&72"&/32>;232>32#".#"] $N  P " L %ýª "  FZ'I+G"ToŒ‘–! }·%0 C'/ '¸ <<"=5AbwbS s;˜@;"264'2#"&46"&/32>;232>32#".#"Ï&&-))))þ "  FZ'I+G"ToŒ‘–! }(&&2(:)):(þ¨ <<"=5AbwbS [ps%…%#".'.'&767>54&7654&546=4'#".'&57632674&54654/.76263632#"&#"#"#"&'&736p&#3—<ýB70W\ect BhU / "Ê Š8  y&< ä&M*2Vg)>d3:y#O8{#@ #(  )0 88" 15 $Š.S% V  [Ž/C£#".'&632#".'&6#".'.'&767>54&7654&546=4'#".'&57632674&54654/.76263632#"&#"#"#"&'&736 $N  P "T %1&#3—<ýB70W\ect BhU / "Ê Š8  y&<  %0 C'/ 'ýÛ&M*2Vg)>d3:y#O8{#@ #(  )0 88" 15 $Š.S% V  [p#7—"264'2#"&46#".'.'&767>54&7654&546=4'#".'&57632674&54654/.76263632#"&#"#"#"&'&736&&-))))&#3—<ýB70W\ect BhU / "Ê Š8  y&< x&&2(:)):(ýT&M*2Vg)>d3:y#O8{#@ #(  )0 88" 15 $Š.S% V  wØŽ<%#".'.6>767&##".'&533>7632‡+-M&š'E4-   þ0Z"  e‹Ý¹4 'LF)+Lï >&5 . +&'##    -    ¡"+f Tþp(9%#"&'&'"56#"&'.=4#"&'.563þ`‰´ 0“:\I-%W9\1"  ,w9Z3LD‰?†W")lK=+%O2  &A #$v’†>&A%#".'#".'&5432%.764&54654&?3#&57>†Î4È 4&$ n /Å:” $ýó #=--[«)-- 2 (V2T‡&\ ,#¥A"À\[Þõzt4".'"'47>7.563>54&7632ý,)3@M^8]‡P*54&'#".'&732$32#"&#"6;2#"&#"32632#".6{®/ 21*b 8! 66?#^=H ùg,­,)^$:/b Si4L:$ ß K ADA$ K].(;!&2BPÉX4ÙN%#"./"&/532632327.'.'&632>7>3'&>767* -C!   r    ?+Ÿ/ $OU ) #;w 2:A^ 17  HL  !W3 + 8  ]Lw+$}Q„qO%#"./#"&5423263232>7.'.'&632>763&>767"6  ”, ?  %" 5.##"&/63262326326;2#"&#"#"&5+ rx   jr  'J6)nk™¢.,,@0X    _G   5 yC–µF"#".'&5763>75>765.##"&'&763263232>32632#"&zÌÚ W&û@ ‹’)  !cu2 0@@7 „N *  ¦$4  'uU  ŠÅÏ[43326?2+"'#"'&#"#"#".'&74327>747#"#".'&763>3656'34'&+"#".'&  , ™FG  ])­,¤L!%dS ?ÃÎ   Hð  $ ¡- %$·-ÑùeZ2$3232+#"'&#"+".'&732767465"&#"#".'&763%676'56'&+"#".'&542Dg   &!˜ ! W&$‰ƒ , Î!ShÚ32 Ciÿ“    -  Ú1/ ¨B7 ÐZ-D".'&542332632#&7>76=&'2"'&/432326°þz q>•Ÿ)Ud†YJnP4+ -5=n4*$5 à_# "mƒG<%#AF8T;5 å "#?zÄt'C4654.7432#"47>54&4654&'&5432"&54&„ 5 2\2E!þá  5Ï%6 #þâK)S$`9vQh)+dS!O  +*` Qx©k'+J632267>7#".54>54&'43#47>54&546Ä . „&sOHy;  ¡% '6:K &  ui>\# \#XaQd  cʇ p l" (3L8, 'agA( #í•T*'63232$7#"&54>ED)nC$EIuM ãp/ f‰0 s" ¬pQ)?,9-Mé¦Í4è5P22+&'&#"+"&5&5&47./&'&4332>32632636?.#"#"'4B¹ D„   M¦LSp%!ýÖ „F#–'  )\Et}—þ¬     oA~78 ,F0ˆ]' ð“ì·?2>76&#"&#""&54654&543263>È @+f8R9%  !TL  7x>Lc¢ vT$!?B (IL=X<8    8  < >­™*GD"#"&#""&=465./43216$7632>76'4#&ÔpB¶  =‚Y 2$2F2^<_B4  ò  IK N   '/Ã?!;7"; *SFW>d?< ¨Rctx232>7.'&767263547#"&763263232674654&?26;2#"622#"&+"&5&'"#"&56326þ9('5 :?qv D   ‰<$2V480B>>ƒ&  e‚9*D  $Ò CH #A ?]% 5 (H   3Ž  pÅãb;kåœú^4&'#'./63232$72632>7>7&#2#".##"'##".'&54637474646æ £' 4?$fAiAW=5F ÿ v…_% ?} ;Sf  K ý=a1 /  @ )W  ;C+“    '   )6 °‹@3M2>72674/#&#"+"#".'&43232>32#&7>7#".'&76|/“e : ‘ÍK 55(³T X|N3k‰¯>)…\"  \…6 )  !&ï…5/D¬0 s±l/#"&'&74366&232676763#"&5326¡" '½  &ØK˜ˆ*Be:Mþ÷-R¡~ &þCV9uîK‚‡-32#"767>=4&##"+"546Ý  $ N  Q  "U $ý,   . Ma.0_y  ;6L;eÖR('þæl#%   / &/  C '/ $§)  $E','Å*!=<+D¡*›%  % N5EÕc*éU#"&#"#47>7#"./632>73654.7632>32#".'.'>7>ó €&FJ^>xƒ/n  1G>  ? lS  ' .0 LawD:$N¥‚ =/ C> I$Np. 8 2 '0ÛJ+Æ}CßE6>?654/32>72+"#"'>?&657>54'7432/0S5U ]\& " Q¹9¡:L):;:(6 š)1As § 1#   %%"GR 4ÿÿ­™Ž"usÅÿÿ¨Rñu"ubçÆÿÿkåŽ"uvÇÿÿ°‹&•#u—ÈÿÿFǵ6yuŸs"&#"#".'&5433>32p ×Omè$:9#‚ŽPw!2  ÿÿÿòܤÿÿÛ¤ÿÿ+ÿò°¤ÿÿ ؤÿÿ ÿò¶°ÿÿ"ÿòÔ¬ÿÿÿøÁ–ÿÿ8ÿò½¤ÿÿÿêˤÿºÿ&ÁÌ567#"&5463232654M-PLVS)52Šþ7jp<>M{<aþçìÿÚ#"&54632'654·   !".>2 RŽ 3&-T822ÿïä¡ 5@"&=46 4&#";26'#3#'#3#5254Ȕ4&+"676äÊÊÊÊ(³}³±~~³ž# x _…/ 1 §ŒC"59<HÉÊŽÉËŽ~³²~~²²ñ+ 𱂠 e"+†3ÿñå£#+323273#.#"326?#"&5466  264&"‹F?2:M@J$2   VjoþóÊÊÊþ⢳ü³³ü€(@cH?^   lVWoþ³ÊÊþâÊ×ü³³ü³%W¡7!54/3#525'%33#"3#525#3#5254&+=M%2 3%M`r„~p)2 3†33 ¡aCþÈ8Caþà þÝþ½3þû ÿÿoФÿˆPò3#88òû–ÿÄÜ'5!<VÜ882ÿìäž .5"&=46 4&#";262#'.+#254+äÊÊÊ¢³}³±~~³þø<=# :}1«GGzÔþâÉÊŽÉþ§~³²~~²²G.;#>L0 4£|®F=ƒ1ÿñ㣠(04>32#.#"32673#"&6  264&"â &@( ," 3?(8CD7/?//+HK]±ÊÊÊþ⢳ü³³üB48* 1!!.YICTD$80-k-ÊÊþâÊ×ü³³ü³%Õ¡##5!###33#³1}+}ˆ2i1GllG1%Q++þ¯5þË|þ½Cþ„5(þÛ´ž #7>7´­«4T"JT=.”pþbþþþW¦ »KoI'(ÿ«\3#(44ü(þÛ´ž .'&3\«­ .=TJ"T4õþþþbp 'IoK» ¦ÿ°Už!#Uþâ7ž7üIîÿ±737Oìüÿ°Tž3!!7þ¬žüI7Éÿµ·ž #4>7ÿ60\Bf0"K­5CU5/ M6ˆÿ«ÿ§74&'5>=3#ÉZabY6&..) )..&6§V„$„Vøê8Y4**4Y8îÉÿº·ž .53·B\06"0fF /5UC5¨ýXˆ6MÉÿ°ÿ§3É6P÷ü Lÿ¨ŸÏ3LSX'ûÙ6þÛž %'7#Ž«­ .=TJ"T4„žp 'IoK»þàþZŽÿ«Â3#Ž44ü6þÛž 636­«4T"JT=.þåpž©þZþà»KoI'ÿ°hž!#!R7þåžü·1ÿ±h317Oìüÿ°hž3!5!17þ¬žü7ÿµÿž #4'&'B\06"0fž /5UC5ýS­ˆ6MÉÿ«º§#54>7.=3ÿZabY6&..) )..&6¯V„$„Vüî8Y4**4Y8êÿºÿž 356765É60\Bf0"žýX5CU5/ M6ˆ#Ž«1=#".#"3##5>5##5>5#53>32632%"347.Ž<{z)Ü+»)Ü+DDljW+J"Bþ”)?¼ #nYt þ¶) .Dþ¶) .D m|''>Q+P1* «8".#"327#5>54&+#5>5#53>32¨ #"5 2?*Ü.HV*Ü*DE ,P5:E> ) A+ 5-þú03(þ·)0C!"5E- &   «%17>5#53>76323267#5>5##".#"35 ,EG-L H 9)×'¼+àE A¼ 79 BH ?ý¨'%Nþ­"Hš4#«GT"327#5>54&#"##5>5##5>5#53>32632#".!"367.1)?<5+Ü/"L5 )Ú*»)Ü+DEljf6_0N$þØ)?½#’>Q+ B þú.!0&þ¶)!-Dþ¶) .D m|33 ( >Q+K3#«3BN!#5>5##5>5##5>5#53>3263232675#".#"'"347.×%¼ 'à/»)Ü+DElj[*?H 6 '” C¨)?¾$%Nþ­$!59þ¶) .D m|**ý¨'³›Ð>Q+J5*!3ÿö¢»]4>7#".#"3273#&#"#"&#"#5332654.5463&54632326?63#327#"5#&˜ , MM,.7!  U.+l**W:M 6<#./CB/T:5I4 H7@ ee3! @#\5© /#66<-"B ‰{$.@5)9H œCI&#-#'@)9A5=4I)2)t þÜT# ,-ÿÿ¹#"ªÀ>ÿÿ½#">Ä>ÿÿ¹#"ªÀ#",8>ÿÿ½#">Ä#",8>ÿÿÿ èH#X@%ÿÿÿ èH#mH%ÿÿÿûèH#"öÿH%ÿÿøV#"’>&ÿÿ'(V""V>'ÿÿÿþâT#"’>(ÿÿÿþÑV#"¸>)ÿÿ0ÿV""L>*ÿÿ0ÿÿ V"">+ÿÿðV#":-ÿÿ=ùw""^@.ÿÿþ§ð4#"ß;/ÿÿåV#"’>0ÿÿK#"’>1ÿÿçW#"¸>3ÿÿ/V""V>5ÿÿìV#"Ú>6ÿÿþ­å3#",88ÿÿØV#",89ÿÿ ÜV"">;ÿÿþ©ã4#"Æ<<ÿÿÿÿÕV#"’>=ÿÿV#",8>ÿÿ ÿÿòV#"ð=?ÿÿ0ÿ½#">Ä*ÿÿø°#&ÿÿå°#0ÿÿذ#9rÿv¸ #%'7%4.'7!"&547'?'7ü455Ñ Bý,79G 4*Ÿ455‘555774Ç3C' @(U°+7O}e*&þ˜7749774rÿv¸ #%'7%4.'7!"&547'?'7ü455Ñ Bý,79G 4*Ÿ455‘555774Ç3C' @(U°+7O}e*&þ˜7749774ÿôÿ|- 7'7'?'7#'!54'”9::t999v9::--4ü 8::::½;;:I:::¢ATJnS f8ÿôÿ|- 7'7'?'7#'!54'”9::t999v9::--4ü 8::::½;;:I:::¢ATJnS f8{ÿ-ëú 5%'7'7'7237# 327#&'&5&546767.#">¡>??Š>??©>??¸ÃrZþ¦–6'O7rÇ%¢£†0-A?‘a6o63""5p??==??=º==>É!?ÑMO#A@&-/2 @=CyIv "}ÿ/ôõ9=A%'7;#.5%237# 327#&'&5&546767.#">'7'7ê433¾ +2((þáÆiYþ©”5)H0n£C¡ ‡--@>`3r43 0;433h433 443>R,Q#?0%y!>ÏLO18)"$0?= CxHt 0&þŽ4433443ÿýÿ¦bÍ %'7'7'7>32!"5%'&#"244à422#333ž "o>cý²Î!T;3333333”443U'M9#LKZÿýÿ¦bÍ %'7'7'7>32!"5%'&#"244à422#333ž "o>cý²Î!T;3333333”443U'M9#LKZÿÿÿgkó '7''7'77>7654'k455466455¡ €16h",0A&!K221G220¨221½EOOñH +7`?65-Wÿÿÿgkó '7''7'77>7654'k455466455¡ €16h",0A&!K221G220¨221½EOOñH +7`?65-Wy˺[04;!654/&/&546?+%"'&5476ŽIj }= [~£Çmk"*ýµN2ØþЪKI y¥A j2‚,ÿûÇ”5"&+%7!654/&/&546?'6ŽÇ€k"*þÎ4}= "_z£2þÐR6n'&"09*$#^N mš=  :O/>j2‚,ƒÿðöÑ-2&#"32632#".547$7&+"546Ê!!"]P ?„YuRv<S 4h^..c_†Ñ  V%vO5#;>"ksb‚S]8A„ÿ­Ñ 126=4#"+&5465476;"&#";2#.'547ri— n*T-m2 . oLoMrfU„[7* C0+ :2M#1@T AH cmV7G'/ÿêÿþK7'7'7#"5!54'­;==º;==--4ü1@879999999’>NEhN `5ÿêÿþK7'7'7#"5!54'­;==º;==--4ü1@879999999’>NEhN `5¿ªî¶2:^e254/7#&'#"'.54>35732654'73263%327523654'636#"'#"5473632654'67&'7–- 7.m c<+"6B*7 ")7-þQ#%[   "Wn-„¢ASbBIKr(&-"M[F+)ëk!Pk"–  )  I%ÿf, (,0N#".'&'7;4&'#"/7327654'7'7'7#"54732654/5473X¢%*‰ïw1($IDBA@49®77µ"`\Ž; ,s7j*( $27Taµ)C9eš?#&ä2q 9723764AX10;21œÕPN77>7¾29—;29—îJ wJ ,ÿïÿÝ7>7'7>7´/:—;/:—™J >J 6ˆù 7>7¾29—îJ 3kÿn'#67'&546324&#"6Û 2"]G5"4" 'ò @$'I #1*   ,ÿïÿƒ7>7´/:—™J X™ú4#"'#"&547332>72654'7ú !   $ó %-   2 šeQ23267#"&#&>54'7›3 $).694/#"07 *$7D)ü{54'7•  *šb¨71U®Yÿ¤«ŒÈ.…;"&'654'7× MWF/»K™,.6.Qbc…V=af~ÿ̽ %'7%4.'7!"&547„444NAý287F 4*665ßAN@)S®*7N} h%$!~ÿ̽ %'7%4.'7!"&547„444NAý287F 4*665ßAN@)S®*7N} h%$!ÿüÿØ? 7'7#!7!54'ûCDDZ-4þñ 7EED¬ASIoS f7ÿüÿØ? 7'7#!7!54'ûCDDZ-4þñ 7EED¬ASIoS f7{Ç'7'74&'7!"&547ACCACCÜ ?ýK47D 2)>BBCCBBCþ”OD='P©)5Kyd%# {Ç'7'74&'7!"&547ACCACCÜ ?ýK47D 2)>BBCCBBCþ”OD='P©)5Kyd%# ÿôÈ*ì'7'7+'!54'–9;;Ê9;;,3û7±::;<;;:ÕBRJoSb7ÿôÈ*ì'7'7+'!54'–9;;Ê9;;,3û7±::;<;;:ÕBRJoSb7Â¸Û !'7'?'74&'7!"&547ô@CC¡@CC°ABBW!Aý777F 3*BBCCBBC7CCBþ8QF?)R­*7N{f&$!Â¸Û !'7'?'74&'7!"&547ô@CC¡@CC°ABBW!Aý777F 3*BBCCBBC7CCBþ8QF?)R­*7N{f&$!ÿþÈ5W '7'7''7+'!54'£===¿<>>===_-4û7£==>@==>;>>=þ½ASIoS f7ÿþÈ5W '7'7''7+'!54'£===¿<>>===_-4û7£==>@==>;>>=þ½ASIoS f7|ÿßë)-237#"327#&'&5&546767.#">'7J¾oX®ïJ6'L5m¼0¢„.-?>^8i54 .<Ò544ë!?fkLR#A?&//1@= DvKv 0'þ}553}ÿ î<%'7%#.';%237#"327#&'&5&546767.#">ñ544N-A%8þDÂv[³öL7 )E,pÍ%¢¥‡0.@@”`]?(5 !"7T5548Yf #! Þ!?flNP48*/01@>!DyJy  !ÿýÿ÷]Ë632!"5%'.#"'7€g,W"[aý·Ê~B•544L5`LJX þ”554ÿýÿ÷]Ë632!"5%'.#"'7€g,W"[aý·Ê~B•544L5`LJX þ”554zÿ4âù)237#"327#&'&5&546767.#">J ÃpY°ðK6'M5rÄ%Ÿ¡…/-@>‘^1s52 4;ù >djKP"@?'-.0?; CwHv  4"}ÿ î:;#.5%237#"327#&'&5&546767.#">~8-( þÛÂv[³öL7(N6oÅ%™¤‡0.@@”`]?(5 !"7…#! P!4+i!?flNP"BA'/:'@>!DyJy  !ÿýÈ^Ë>32!"5%'&#"”0p;bý¶Ë~#Qa&""M8#LJXÿýÈ^Ë>32!"5%'&#"”0p;bý¶Ë~#Qa&""M8#LJXpÿZµÓ(,237# 327#&'&5&546767.#">7'74²jTþ»Š3#G1iÆ–˜+*=:‰X0m1. -8o,++÷;ÃFK <<%;<- ;9BpBn  -$±,,+}ÿí :'7#.';%237#"327#&'&5&546767.#">Ú655r-=, 19þ<Èt\¶ûO7*I0vË$¨¥‰2/BA•c[D*5 ##7¸665ýÜLm B*â"AimOS2;+132B?"F|Jz  #ÿýÈXš'7>32!"5%.#"@200{#9cý¼Ç:B"#Pj110þÅ&„"KI*-ÿýÈXš'7>32!"5%.#"@200{#9cý¼Ç:B"#Pj110þÅ&„"KI*-rÈ«4.'7+"=7~  4"8Ê7 $ O (8hCN`&rÈ«4.'7+"=7~  4"8Ê7 $ O (8hCN`&rȧ '7.'7+"=7/977„  4!7È6 Õ997þ #,&N (7gBM_&rȧ '7.'7+"=7/977„  4!7È6 Õ997þ #,&N (7gBM_&ÿÿÿgY¿76?>54'E €07hSEE%¿EOH ñH 1 ddQ&-WÿÿÿgY¿76?>54'E €07hSEE%¿EOH ñH 1 ddQ&-WÿÿÿgYŽ'7767>54'F8;;7 €+54'F?CC> €+"R C:F&?‹*! k( $Z$e47!"-E'  A/@ h6H5 )0Ž0H8@E7&|ÿßý9254'7+&'#"+.547326764'732=7r5(-)) !$:1+?Y!"5>"R C:F&?‹*! k( $Z$e47!"-E'  A/@ h6H5 )0Ž0H8@E7&ÿúÈ`Ð,2654'7#"'+"'+"'27654'73254'7 "49+-!SÅÞ !L  Q6Q,S$&&&&K5,5+/@7ÿúÈ`Ð,2654'7#"'+"'+"'27654'73254'7 "49+-!SÅÞ !L  Q6Q,S$&&&&K5,5+/@7|ÿâ¹¼=AEI254'7#.'#"+.5473267654'732=7'7''7'7l1',%$";0-#&Œ )!j( $!/11"/11$/11W$c42% !7I,9&?e6F3 ),KE-H8>D7%---:..,“---|ÿâ¹¼=AEI254'7#.'#"+.5473267654'732=7'7''7'7l1',%$";0-#&Œ )!j( $!/11"/11$/11W$c42% !7I,9&?e6F3 ),KE-H8>D7%---:..,“---ÿúɘ2+/372654'7#"'+"'+"'27654'73254'7'7''7'7: 9?01!$[!×ó !%S  7788'788)699 X54'77674#"23276@$&»–%GR8ÔQkA\-?",x:1JTRe‡@Ò 8'!""C[/±oVOILS!45GIHix7Rƒ‚ÿé´Ò(32##"567>54'77674#"23276@$&»–%GR8ÔQkA\-?",x:1JTRe‡@Ò 8'!""C[/±oVOILS!45GIHix7RƒÈMì"#!"'+&53>?;>4'!6Ôo +þ`03//©Á -eS}‰R-K7$ì¹h00F'›}[”D  6!ÈMì"#!"'+&53>?;>4'!6Ôo +þ`03//©Á -eS}‰R-K7$ì¹h00F'›}[”D  6!‚ÿé´©(372##"567>54'77674#"23276'7@$&»–%GR8ÔQkA\-?",x:1JTRe‡@”100Ò 8'!""C[/±oVOILS!45GIHix7…RƒH000‚ÿé´©(372##"567>54'77674#"23276'7@$&»–%GR8ÔQkA\-?",x:1JTRe‡@”100Ò 8'!""C[/±oVOILS!45GIHix7…RƒH000ÿìÈ9ð$'7#!"'+&53>?327>74'!6`100è"+þ`03//©Á#*\ WyT3R|]$À000þËHCh00P .A’vX”C € ÿìÈ9ð$'7#!"'+&53>?327>74'!6`100è"+þ`03//©Á#*\ WyT3R|]$À000þËHCh00P .A’vX”C € ÿùÉ8 6547632#!'%4&#"!6¥V? tf2I=ýÿ :$)bƒÿSEš´3ƒBVQO-';ÿùÉ8$'76547632#!'%4&#"!6».//èV? tf2I=ýÿ :$)bd../þ‚ƒÿSEš´3ƒBVQO-';‚ÿ%†ö$467&'5476;&#";673&'&‚>>W#A8F5D Mšb.xr#ŽMƒiohàqKC4•4K* =91*8$R: CK}FL.A !|ÿl\/;#&'327#"&54>7.#"#6g "&&dƒ†f4JN5NA3J+hPh‹7F> = ' !LLY6rG*@*38yb@wO9  wÿùÉ¡+327+"5&5>3&#"V:e«2®´ü@ _:8W"`63Y­$\M1L_:5I'"%ÿöÇ8%2;#"'+&'723254.#"#5>Z8LH$2JLH=Q_§˜  B( %O>M]]MY>C‚ÿ,€%)467&'=476;&#";673&'&'7‚A:W"A7E4E M_.wp#IdngÛrJÁ011><0J*=90)9$Q:BJyHL-A !b000|ÿl\Ó3'7;#&'327#"&54>7.#"#6Š122 "&&dƒ†f4JN5NA3J+hPh‹7F> =¢221» ' !LLY6rG*@*38yb@wO9  wÿïÉX"327+"5&5>3&#"'7ÞJ9]š.Ÿ¡åû; V43M O8-S’...¤]J0I^63F$"#2001ÿöÇ[ñ#'2;#"'+&'73254&#"#5>7'7c;LJ&2abJ?Rb«“ ˜  Dj111 ($LB\$%#6LN$"0 $#@>9W =1'J¼223€Í+û%/3#%.'67326;2=.5476;23275.''7Výò""S¦)¦)S:L'!..4$T'*122 `>B\$%#6LN$"0 $#@>9W =1'J¼223ÿâÈ>#)#!5732=.5476;2''7".(Sþ÷ÚP5K' -.S1000" !"ýBX?\J/ #"B98/Æ222þì2 !<1ÿâÈ>#)#!5732=.5476;2''7".(Sþ÷ÚP5K' -.S1000" !"ýBX?\J/ #"B98/Æ222þì2 !<1‚ÿÄÏi.<'7'7+&54&54733267654&#""546";27254/Å777f877n$HG[¨Ñ3 8rXmK  _A#) &27777777ÈUF?,8-v`zgA'5/ $K3/p8/ ‚ÿÄÏi.<'7'7+&54&54733267654&#""546";27254/Å777f877n$HG[¨Ñ3 8rXmK  _A#) &27777777ÈUF?,8-v`zgA'5/ $K3/p8/ ÿâÊ9%)#!5732=.546;2''7.#"'7$Rþû×O4I(8*.0//()%!'"‰/00÷=X>ZH. ##7w.Ä220þ§ 3V1220ÿâÊ9%)#!5732=.546;2''7.#"'7$Rþû×O4I(8*.0//()%!'"‰/00÷=X>ZH. ##7w.Ä220þ§ 3V1220yǺý0+%"'&547;!654/&'&54>7´Çm*U/(*ýµN2Ob }= "4!8TtM¾W3)hD@u7´Çm*U/(*ýµN2Ob }= "4!8TtM¾W3)hD@u767„ÇK1kUQ*þÎ4}= "40\w]Rnf›c_N j= 0 -(,0$ÿñÇŠË"+%7!654/&'&54>767„ÇK1kUQ*þÎ4}= "40\w]Rnf›c_N j= 0 -(,0$„ÿjÁ%#"54732765?™>rYõ=.LYHQ#Y%&4/4 ¡UlR$Áa¤KJ4.o¸&)’@0¬þé„ÿjÁ%#"54732765?™>rYõ=.LYHQ#Y%&4/4 ¡UlR$Áa¤KJ4.o¸&)’@0¬þéÿóÆú… '?6'Ò((-+lN\ …‚ þyJPMmÄÿóÆú… '?6'Ò((-+lN\ …‚ þyJPMmÄþ®7n%"&54732#'&#".'54>32&Pkd8$GF1=  ?(l_/&A"G'>$òƒ?0ƒ¡%þ®7n%"&54732#'&#".'54>32&Pkd8$GF1=  ?(l_/&A"G'>$òƒ?0ƒ¡%³­®2"/+5>3254/3%UMC/- 8ee"/()*4®z8= (L -,¾"4!³­®2"/+5>3254/3%UMC/- 8ee"/()*4®z8= (L -,¾"4!yÿŸ¡ú '7265&'7#"'"&547¹;::ƒ(:*HP8 ˆiÃ777ýòQlœ `G¬NF^/jg\aI9“yÿŸ¡ú '7265&'7#"'"&547¹;::ƒ(:*HP8 ˆiÃ777ýòQlœ `G¬NF^/jg\aI9“ÿôÈK°'7#!'!54'=>>E-4þæ 68v:::´>E-4þæ 68v:::´B;e ' (s HD"WJ g(‚ɇº%"&'#&547&547;%3267.'ggY K£ßJ,>^þGD5  ¡ÉU‚MGU^ &&þ¯VHï" -$Cÿô¼ë *&'#727&'47'62654''654'a³#fXXfS‰T3Ö8• F3_‚&0Q`뮿2B2 ROL0U§0%.þLV^S/m?7 c9"(/ÿîÿÝë*23#+"&/#737>324.#"3>654&#z0%ÜÜ .F' + ¿» ))*;   77‹:@W:”'" M='MQ6eM}A;^"  ;W13¤œ)3?IÿƒÆ#%#&=476;+5>76547.#"3232Jc**3 Dj;l5w=-" - % ÇH>9 ¡Ur…K E6J7*g51fIÿƒÆ#%#&=476;+5>76547.#"3232Jc**3 Dj;l5w=-" - % ÇH>9 ¡Ur…K E6J7*g51fz»f”(/>7'4&547767'&'"#"&5432>54'¸*D<  /6;h±z/44qAJ6-¶\É07 (4K“}i6+[1PÔM 74.¥³ß2>{Äã’%#"5'#"'6764';%&+'ã0i -\F¡6¦y”x*%þÚhwdhŤb¯>5:U ]Ÿw‹pµ5¥ØÊ#ÿòòÁ 354>54&#"34632#3 Ø#*#8#*#H=‰5#.$,888þ˜hgÄ0 2#,8"7A’/2'þÊA{hgþ™ÿÙÿÚœc"%->&54>&'&5!2632#!#".54657674&'"32>_`  #a ?þó\r]Bl>*C7·Ñ';Cœ$L*+c$/UIWP#, #A þän18D"1:,.?««3H0)Ÿ+ '$"1 ;Qÿ~;¹"&5473327èUB7!8y'* %‚ha¾´Î“‡Vþý´0#"&5463232=332654.=3ú('wZJ^#&8  .5(>T+*S-R@?L)GX<1)(  '>2*C7DyRlþI´9C#"&547.5463232=332654.=3264&#"ú('B@C13BJX#&8  .5(>T+*S 4"#"-R@?L)J-I1CC1#:0)(  '>2*C7DyRlüÙ#2#"þƒ´;J_#"&547.5463232=332654.=32654&+2>54'#"&'ú('QST=>R)$1#&8  .5(>T+*S,,%  C*2(1*(-R@?L)T- \AYTB?& +)(  '>2*C7DyRlüé  u# " %6$ #. ÿŪ!533þéÄS;#ÂFÿ÷e¶/923##".546;.#"#4&#".54632632=#"@s –“H:)7P;@')3Q+"*? t7LlRd%(R"A(?¶eP*d|87;K95+$þÉ.?*?2lQ €A]GGþË1‰(ÿEÍ\!2#"54654#"#"'46323276‘" .8>c3  /-R9\" ¹þÎPÈ.  ÆoÇKÿöbZ8CJR]%2#"&547##"'#"&546;4632>54&#"'>322654&+'4&#"325#32=#"×>MQ@5H TER'!A7LRU%N?+@ + D41'2O!4?$,5 /$.*22 &¤8,+44*fã?"bþE9:PX=4f€PPS=H1Vk,G4OQ!$*#,"80#L6>Ê1% 2X;Ë:PM=I=Rµ@ %`UMÿõq\LXa"&547&#"#4&#"#4&#"632#"&54>32632632654&#"'>322654'264&"*3XnKs>70SA3'3SS,¥->2B?5@N $7\;TE5\Z59\1.0'6 9.*De$,8#D# üÿ&'@()— w=jaQ>m- þ¾5@( þ¾,)5ÉGP=;HiT$FJ8$ONKL%+' ' 39$þgL?f=l=(3 -H1.H0Mÿö[6A#"'&547&#"#4&#"&54632632654&#"'6322654'«)4U?5&"sF*4S,#A+(v†pRh%1UC+1#3!*aik'/8#D)—!wH#"&547&#"#"&54>7326=4>32654&#"'6322654'°!,%4 C708"98O70$3!(bib+5l?ŽhQk_YE„`3M>1IaRB8;R'"#,&Qk$þh?Hr5We:8Nÿõ\'22#"&547&#"&54632654&#"'62654&'w*D+]PB9Jp0Nf_uƒa?+1'4j&- f,\39(5Tv_sWGƒ[vTs;HŒkŒ$,'RýÙJ<'aTc1@KÿøÂ29DO2#"/3254&+53254+#"'#"&547634632#4&#"325#32=#"ª#07;@)!6,CTER'!A:IC!hN?.B E8,+4)fâ?"b#+1*% !3!!'fPPR>T Vk0F7:PM=P (1"µ%( $`UGÿ_þ¿@GOY%#!"3!!"&5463!2654&+532654+#"'#"&546;4>3232%4&#"325#32=#"Æ 3)þ/Tý¬,66,Ã"-#A/TEQ("@8KTP( ;(EVZ30þþ7-+44*fã "?"bš,%, %G3*+; !$ $RcCCC69,43 \I),w1C?5A4@“. #%QBKÿ À3:CM2#"&54632&#"32654&+#"'#".546;4632#4&#"26=#26=#"mCY´šXkv_]M+4H'Yb~›<1WFS"'B&+N1KO@BWH6,*4\.6À3‘$(\+ÿwW~—)"$/%"nASb{QQ>)?6VkkVÕTA#=J0'UJ)9EÿFçÃ<C\dnx‚2#"'#"&547&#"#54&#"#"&5467#"&546346324&#"2654&##"'632632#'%3265#2654'32=#"2654'&jW@/ $IC5/@M#$.G"!M 0 6BE% 3CUoK=*=B7(0*3%0FQCN%F/5R þÙ2'(9¹(%PB-6(CQ"5*,JPYc>32'654.#"32#".547##"'#"&546;46322654&+'4&"3265#26=#"x *+5!^GE}1[(2$ 2U iT@4#4 /TER'#?:IUZN?$8—'!*#>2Ç9V44*'?Ã^'"b(3L&DD_hNt.H(K?7Q:G+>42f€PPV:H1Vk +<&Ñ8*4@<Ñ9QN*#Q4?>2:H0SFS&!A9JTXä%)#>*¿8,+44*fã?"bTm-G5Ã(+B;"!<6F 3+"C45(8  E92654&+'4&"325#32=#"vYuOLETý4üq.88.·J>)#&J/UnB9CA3.I&SFQ("@8KTT$M@%:0F&+"4‹9V44*fã "?"bÄKx K0K!(G5V55$!+30 -'Q,:.5@CN.WjCCC6:,E]%5F`þª' ") h°2A?4=6C˜4 #%QGKÿ/ÄNZait2#".54>32&"32654&#"2#".54>5##"'#"&546;46323>2654&+'4&#"325#32=#"?fŠÂ >N7bUSK?'jI\"–fT3È8,+44*fã?"bÄ®…¤Ð"" ¬ŒtšP97Q:G+?4  %JI.PPR>H1Vk#.=#Psþl8*4B:Ñ:PK?H@Pµ= $`U@ÿ$¢·P^dnx2#".54732>54&#"32#".547##"'#"&546346323>2654&+'4&"325#32=#"»hMxÁ|_¢u\:'bT!êt±e@\L1RZUE+"4 -SCR$A9GSsL>#77 )*4!U$!)!=Ã9R3! d¾Ÿ "= a·ˆm=ooQ2/BITO(~sdj§Å/GcW/UpI>6OC;)<4 (e|NNQ54&#"32#".547##"'#"&546346323>2654&+2654.#"4&"325#32=#"»hd+.*" #3 ¬_¢u\:'bT!êt±e@\L1RZUE+"4 -SCR$A9GSsL>#77 )*4!U$!)!=Ì6"(þ’9R3! d¾Ÿ "= a·ˆm£g A&"2 *"  4/BITO(~sdj§Å/GcW/UpI>6OC;)<4 (e|NNQ54&#"32#".547##"'#"&546346323>2654&+'4&"2654&#"2654'#"&'325#32=#"»h{9>#4*"6 r”_¢u\:'bT!êt±e@\L1RZUE+"4 -SCR$A9GSsL>#77 )*4!U$!)!=Ã9R3B""d.21$#-þ ! d¾Ÿ "= a·ˆm¶k T/*> "+ &/BITO(~sdj§Å/GcW/UpI>6OC;)<4 (e|NNQ@'0ŽH?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bu&;0%&/5./&5(-˜T57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`UKýüÀ)08Cp{2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#"&547&'73254+"&54632&#"3264&#"H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"b703<! .B*6&KS>@'0:DT0$C#6-?#!#$ÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`Uþ’09D*?16! &5(-$&;0%&þÊ-&--%KýêÀ)08Co|‘2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#"&547&'73254+"&54632&#"32654'#"'2>54'#"&547H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"b708?-# 4H6.&KS>@'0:DT0$C#6-$ ", 3&#/ÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`Uþ–/;$G$5 G4A$&5(-$&;0%&þü   P#!  '"4 & 0Kþ¼À)08Cn2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#".54732654+"54632&#"3H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bù0-.#N.:0%#!KýÿÀ)08Cw„2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#"&547.54732654+"54632&#"32>54&#"H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bù0<34! /A$P_8,65M+4?zK-.#N.:0%#!þÐ "-%KýèÀ)08Cv„—2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#"&547.54732654+"54632&#"32654'#"'2654'"&547H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bù0<:9 4"4H0LV8,65M+4?zK-.#N.:0%#!ÿ   P." 44 &".KþÁÀ)`goz„2#"/32654&+#"'#"&546;46322'654&#"#54&#"#54&#"632#"&54>3263264&#"325#32=#"2654#"H?C1&!'2ETER'!A:IRU%N?%:A7Pb$H-&>)!>&(d&!/0#+3 67C!9DP8,+44*fã?"b" +ÿT57I/3'4&f€PPV:H1Vk#.=#þóVCm*-V5>Ѷ)ÓÅ*t&4+'1F63J'0.+- :PM=I=Rµ? %`Uþ42Fþ¿À)ekt~‡’2#"/32654&+#"'#"&546;46322"&547&#"#54&#"#54&#"632#"&54>3263264&"325#2654'32=#"3254&#"‹H?B2&!'4CTER'!A;HRU%N?%:2EZ6X7D!,>, >," 0 (#.,#,6'0# >.%=:%.?9V44*fÃm!1@!þ (?"b/+ÿT56J/3'4&f€PPU;H1Vk#.=#þîfK8DC7P5 Òµ&!ÓÄ!, &:)&.D7+D%11.,9QM=I=Rµ þ4"'L.4E!)ž+:`UþB"1Oþ\iÀ+y‡’›¥2#"/32654&+#"'#"&546;46324632632632#"'732>54'#"&5467&#"#54&#"#54&#"632#"&4&"325#2654'32=#"3254#"Ÿ&8 B2% (2ETER'!A:IST%M@%:ýò_B=0"=9$(=S$9;dD)(+1!7 5,'3=)1%#?+ >&) / %"/1,4É9V44*fÃQ 0þ!(?"b;)(ÿ,,6J/2(4&f€PPV:H1Wj#.=#þ:Pf11..L X5Md# ?*C;H8,6C&#Ò¶'!ÔÆ*,&9*-'Dý9QM=I=Rµþ"&+%-$$Ÿ*;`UþA!23Gÿø›ÂAMS\e2'654&#"#".547&#"#5&+#"'#"&5463>322>3262654'%4&"325#32=#"Àbyk/L]L^K<%5 Y%>W)J>G#84AOdD8(:   eO6/2G$,JW"þ™0J+-$W§Ž)5T†f‘MC}Zp \yPn-C5M qBÓÐ g~LLR?I1Vi.K.NzþwH6lHNm #*Ê8MF?J;R° ,5.^RKÿ]…ÂQ[air"3!!"&5463!2654&#"#"&547&#"#5&##"'#"&546;>322>32632#'2654'%."327#32=#"§+Þü"1+3)ñIWXI!^K<5HY': ) 8'F$85?NMC9s ]J1-.>arfM¡$,JV8þ¯/J,-#V§!5T!M<&(;hRQlLgC]\@iB %7,§¤ =>%??F4=*IW¡Dg}fay<.\;B[6.ª0>=1?2D“ 4#/NEKÿ]‹ÁhryŠ2#!"3!!"&5463!2654&+532654&#"#".547&#"#5&##"'#"&546;463232>3262654'%.#"327#32=#"»=Y(DE`MüÍ0Ûü%,45+ùRG %%'HP+^K<%5 Y(0!*J>H" 64ANOE8!3"&0 /10E$-KV8þ¯1$%,-#W§"5T¿-$ 4&'B8K!M6,*9<&24"#9LgC]&9-jA @,§¤ Wi??E5=*GY%4,A#þ¶;/[3232>3262654'%4&#"325#32=#"Ædy²™Xm½\F50:mVs‹`O^K< #-Y%7^)K=G#83BOdC9!4 eO6/2G$,JW"þ™1$&*-$W§Ž)5TŸ‚®Ö,%G# ·q• [zRm$P7~N iKÔÑ g~LLS>I1Vj"+@  OzþvI6lHNm #+Ê:LI=J;R°<5.^RMþȯÂ_ƒ–ž§%#".54632.#"32>54.#"#".547&#"#5&+#"'#"&5463>322>326322'654&#"#54#"&546326'2654'%4&#"325#32=#"¯½¢AL4]yC' P;?XZC=a:%'M5^K< #-Y#7^)J>G#83BOdC9!4  eO6/2:!;A.þÏ&% #"%$,JW"þ™1$&*-$W§Ž)5T^¶à 2!6GB '/#&--G^X.;kg= [zRm$P7~N iKÔÑ g~LLS>I1Vj"+@  Oz/LƒþÁ' + ;% &ÃI6lHNm #+Ê:LI=J5.^RIÿ*Â[elu%>32632# 4>7!2>54&#"#".5467&#"#5&+#"'#"&5463463222654'%.#"3265#32=#"¼gO7.2:\AB #9_{²lý€/- [¤›…ËsHt?ZK<%5 4*#,@ *J>G# 62DNfE8(: !#.F[.þ©0$1-$#5¨Ž6TùM|PPj(JTHD/³#4i4jv¸`Z/FbW0_‚ W~Po.C6:m% -A4ÔÑ e€LLR?J0Tl.K.ÊJ5nFQj3EÊ;K=IJ32632".547# 4>7!2>54&#"#".5467&#"#5&+#"'#"&5463463222654'2>54&#".#"3265#32=#"¼gO7.2:\ABb,4*"#*’åý€/- [¤›…ËsHt?ZK<%5 4*#,@ *J>G# 62DNfE8(: !#.F[. *+ý«0$1-$#5¨Ž6TùM|PPjšhC("3 3" ?³#4i4jv¸`Z/FbW0_‚ W~Po.C6:m% -A4ÔÑ e€LLR?J0Tl.K.ÊJ5nFQj3EþÜ  î;K=IJ7!2>54&#"#".5467&#"#5&+#"'#"&546346322>32632%2654'264&'"2654&'#"&=.#"3265#32=#"¤ ( U>+> ˆÅý€/- [¤›…ËsHt?ZK<%5 4*#,@ *J>G# 62DNfE8(: !gO7.2:\ABþ›#.F[.Î.!V7'#8+-/)þ0$1-$#5¨Ž6Tj4 >U$5*$"/³#4i4jv¸`Z/FbW0_‚ W~Po.C6:m% -A4ÔÑ e€LLR?J0Tl.K. M|PPj¸8J5nFQj3Eþ×,z:( 5 588 (;K=IJ ?(. 9'(1KUK:7&$ÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`UòWB>K*Z+Fѵ&!A0\#.hCX10Kþ»À)08Cgq2#"/32654&+#"'#"&546;4632#4&#"325#32=#"2#"&547&#"#54#"&5463262654'H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"bÔCZ5,*7D *97'4MYK74'-m6B#ÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`UòiJ7ED6R6 ѵHC3Z!-hAZ0/þü)"O.4E#,KþXÀ)08C€Š2#"/32654&+#"'#"&546;4632#4&#"325#32=#"4>32632#"'732>54'#"&5467&#"#54#"&264'H?C1&!'2ETER'!A:IRU%N?%:E8,+44*fã?"b5 0& 4',;R0<9bH&& !3; 6+&2>+>",98  NZx"=%ÿT57I/3'4&f€PPV:H1Vk#.=#:PM=I=Rµ? %`Uþt.B 0.KT2Kf '0# P&$5 .>"9:PM=I=Rµþ¹).gM<$6TN] %`Uý“P." ,+ '".§JÿDšÂ18AK2#"$54732>54&+#"'#"&54;4632#4&#"325#32=#"=IÚ¬ÆþüVF„v’;ni?0&(UEQ'#?:I‡DM@$9F9+2,5)f£ "?!cQB‡£Ù¡˜k"nyŽZP5gG+9f€PPR>yUl ,;'9QV4I54&+#"'#"&54;4632324&#"325#2>54&"32=#"E#2 1"1CF\ÆþüVF„v’;ni?0&(UEQ'#?:I‡DM@$9B=Iþò9+2,5)fÂG.#2#þ3 "?!cU>* "*C1 Ù¡˜k"nyŽZP5gG+9f€PPR>yUl ,;'QBr9QV4I54&+#"'#"&54;4632#4&#"325#2654.#"2654'#"'32=#"=Ir%2 >*?R3BÆþüVF„v’;ni?0&(UEQ'#?:I‡DM@$9F9+2,5)fÂ,%D+75%C#þ& "?!cQB†T$.-8&Y=% Ù¡˜k"nyŽZP5gG+9f€PPR>yUl ,;'9QV4I,#N@,5_F:D=?V90I8NaH:+Z5:a"':PM=I=Rµ? %`Uþ #&C6%NOKþÀ)X_gr~‡2#"/32654&+#"'#"&546;4632"&547&=4&#"#"&5463232654'4&#"325#32=#"264&+"'2654'H?C1&!'2B TER'!A:IRU%N?%:_*5:B\B-6,#N@,5_F:D=?V90I8NaH:+Z5:a"':PM=I=Rµ? %`Uýb-&--%ª#&C6%NOKýë À)\ckv„™¢2#"/32654&+#"'#"&546;4632#"&547&=4&#"#"&5463232654'4&#"325#32=#"2654'#"'2654'#"&547'2654'H?C1&!'2B TER'!A:IRU%N?%:_*6C$ 4H93,#N@,5_F:D=?V90I8NaH:+Z5:a"':PM=I=Rµ? %`Uý“  P." ,4 '!/É#&C6%NOMÿøÓÂ8=IOXc%>73!5654&+#"'#".546;46323235"&54632"54&4&"3265#26=#"ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( þ9V44*'?Ã]'6- Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"…9QN73##".547!5654&+#"'#".546;46323235"&54632"54&264&"4&"3265#26=#"ÛI} E/ "*þPR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( Ù2##2#ýÙ9V44*'?Ã]'6- Ù•9þG,3A 2!*!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"þ"4""4V9QN73#"&547!5654&+#"'#".546;46323235"&54632"54&2654'#2>54'#"&'4&"3265#26=#"ÛI} )+TzS.þtR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( Ë&$!$(+3&1EýÒ9V44*'?Ã]'6- Ù•9þG!>BYW?A#!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"þ! !X 0%" &4"! 0-¹9QN73#"&54632&#"327675&=!5>54&##"'#"&546346323235".5463273"544&"265#32=#"ø#ec >4J/Vk#.=#?J5?*3EXTP/I–g2- w>Š9QM=H@PTa= $`UMþ¾ÓÂ8qv‚ˆ‘›¦%>73!5654&+#"'#".546;46323235"&546322'654&#"#54&#"#54&#"632#"&54>3263267"54&4&"3265#2654#"26=#"ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.Cs6O`F0' :) ":'*l +/"*2 67D !8FhH\‡( þ9V44*'?ÃJ-þ…'6- Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] þúVCm**[3DѶ +ÔÅ+.)&0F53K&21./6X–b( -r"…9QN73!5654&+#"'#".546;46323235"&546322#"&547&#"#54&#"#54&#"3632#"&54>3263267"54&2654'4&"3265#3254&#"%26=#"ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.CZCZ8(,6G#.:"("9.#,*",*#,4(:.=0$>;$.„H\‡( ü#5B#ý®9V44*'?Ãë.þ¸'6- Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] þ÷eM9BE5Q6 Ó¶-ÔÅ"' .8*&-D75N#330.9X–b( -r"ýb#)P/5I"+9QN73!5654&+#"'#".546;46323235"&546324>32632632#"'732>54'#"&54>7&#"#54&#"#54&#"632#"&"54&2654'4&"3265#26=#"3254&#"ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.Cýæ&/# ?.">:$(=T";9cD)% (=> 4+&2.4,:)!!:.$#2 )"-$)3,¾H\‡( ­ #ýð9V44*'?Ã]'6- -,Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] þB+D&3300L U7Oa %5.J#;G7, !,!+Ò¶")ÔÆ"1 .:(4KX–b( -r"ýa'-) %%9QN73!5654&+#"'#".546;46323235"&54632"54&4&"3265#26=#"4632!7354&'4#"6ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( þ9V44*'?Ã]'6- ï9T‘þâ½&¡-/*2,AmÙ•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"…9QN73!5654&+#"'#".546;46323235"&54632"54&4&"3265#26=#"4632##"&547#7354&'4#"62654'#ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( þ9V44*'?Ã]'6- å9T‘&A/1?&o½&¡-/*2,Am.&11%Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"…9QN73!5654&+#"'#".546;46323235"&54632"54&4&"3265#26=#"4632#".547#7354&'4#"6264&#"2>4'#"&5477#ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( þ9V44*'?Ã]'6- ê9T‘*3$%3c½&¡-/*2,Am%') )/' Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"…9QN..>"¾).gM<$6TNÀ$P '< ,+ '".§ Mþ,ÓÂ8=IOXc…™%>73!5654&+#"'#".546;46323235"&54632"54&4&"3265#26=#"4>32#".54632&#"326=#7354&#'"654&ÛI} ýƒR) TER'#E-<BN:N?$8*=K$»GUF9.C¤H\‡( þ9V44*'?Ã]'6- ó,-’CV38J5B;7N;)ó¼#$(¦30,_(t Ù•9þG!P&4f€PP@>.EVk +<&P75!T>7CQ] ÐX–b( -r"…9QN%$bPB!5?tS[!Kþ¿À)[bju2#"/32654&+#"'#"&546;46322654'7#"&=4&#"#54#"&546326324&#"325#32=#"H?C1&!'2B TER'!A:IRU%N?%:T"*Q^?5/A,,9: LWI57&!7/A&z8,+44*fã?"bÿT57I/3'4&f€PPV:H1Vk#.=#ýë=/b$*x?M@2190ѵI .b$-u?O0/A08)2:PM=I=Rµ? %`UKþÀ)biq|‡2#"/32654&+#"'#"&546;46322654'7"&547&=4&#"#54#"&546326324&#"325#32=#"264&#"H?C1&!'2B TER'!A:IRU%N?%:T"*Q^58B\B18,,9: LWI57&!7/A&z8,+44*fã?"b#!#$ÿT57I/3'4&f€PPV:H1Vk#.=#ýë=/b$*xS'A1??1;! D190ѵI .b$-u?O0/A08)2:PM=I=Rµ? %`Uýb-&--%Kýë À)fmu€¢2#"/32654&+#"'#"&546;46322654'7#"&547&=4&#"#54#"&546326324&#"325#32=#"2654'#"'2654'#"&547H?C1&!'2B TER'!A:IRU%N?%:T"*Q^6A$ 4H=5,,9: LWI57&!7/A&z8,+44*fã?"bï  &4)'"0ÿT57I/3'4&f€PPV:H1Vk#.=#ýë=/b$*xT&#I.G4F$ B190ѵI .b$-u?O0/A08)2:PM=I=Rµ? %`Uý“  P." ,4 '!/Kþ+À)w~†‘2#"/32654&+#"'#"&546;46322>54'7#"&54632&+"32>5#"&'.#"#54#"&54>326324&#"325#32=#"H?C1&!'2B TER'!A:IRU%N?%:G DZ%>;!=S`811*VR+>!:.6."97BNZ /% 5'!60BT8,+44*fã?"bÿT57I/3'4&f€PPV:H1Vk#.=#ýä 2"V&L’C_-251F:W6Ò¶H:=Z!+m-B 0/O> Y:PM=I=Rµ? %`UKþ¼À)AW^fq2#"/32654&+#"'#"&546;46322'654&#"&54&2'654&#"&544&#"325#32=#"H?C1&!'2ETER'!A:IRU%N?%:|L+A7+-8H [ó|LA$A7+-8H [a8,+44*fã?"bÿT57I/3'4&f€PPV:H1Vk#.=#þëRD$0) !L0;<1V*iEVRD@K !L0;<1V*iEk:PM=I=Rµ? %`UKþ À)Jbiq|ˆ2#"/32654&+#"'#"&546;4632#"&547'654&#"&54632%2'654&#"&5464&#"325#32=#"2654&#"H?C1&!'2B TER'!A:IRU%N?%:v*.B./A@A6,-8H [V?>Lþ*>L*(@6,-8I [V+8,+44*fã?"b %!"$ÿT57I/3'4&f€PPV:H1Vk#.=#ýà >%1?@0G!L0;<1V*iDWRDGÝRD.G"K1:>/V*iEV:PM=I=Rµ? %`Uýb$.-&Kýë À)Mcjr}ŠŸ2#"/32654&+#"'#"&546;4632#"&5467'654&#"&5462$2'654&#"&544&#"325#32=#"2654''2654'#"&547H?C1&!'2B TER'!A:IRU%N?%:k.3$ 4H4A7+-8H [W|Lýî|LA$A6,-8H [‰8,+44*fã?"bï#&4)'"0ÿT57I/3'4&f€PPV:H1Vk#.=#ýß F(.G4/9 !L0;<1V*iEVRDHÞRD@K !L0;<1V*iEk:PM=I=Rµ? %`Uý“ # P." ,4 '!/Mÿ6Ã/;G2!3##"&547#5654&#"632#"&5462>54&"%2654&#"7^‰VS&%A31C&ôebI)A$ ,=2CB6>KÛ#2#þ:!)' *&ÃzdkX—þG"41CC13#JtPi"/>)HS<:HeS~˜ý· ""+µ.%#0-$'.MþþÃ/<NZ2!3##"&547#5654&#"632#"&5462654&#"2654'#"&'%2654&#"7^‰VS/.U<=S1ÆebI)A$ ,=2CB6>K°%$,64%".EþS!)' *&ÃzdkX—þG%BDWTBD(JtPi"/>)HS<:HeS~˜ýÓX9)$ (2( 0-ñ.%#0-$'.Mÿ Â<H233#"&54632&#"3265!5654&#">32#"&5462654&#".cŠSîS/YDht^IHG"$}W"aBþ®a_I(A% +!4B6>AM%"'"((†ÂV—þ;8J;,# &#[cHjQp".=)+\31PeTsžþn8%2.#9Iÿ_°Á>2#!"3!!"&5463!2654&#"#"&546732654&546ñ6O(59VþÈ9 ñþ0;1:G]A4"3VJRhQ<2F& $<Y¿'?B#`JP(H:+#:tYE\GN$HVmXMf YC$: 9?5?OIÿb·ÄK2#!"3!!"&5463!254&+532654&#"#"&54>7326='546þ*D' AAcOþ¯9þ0;294}($46/)[FOj 2)3E /%,4`¿& 9#F;I$H:+#:T"0$+ !7<'TGYlZ-L,Z?-B =4W:FHÿÇÂ72#"54632&#"32654&#"#"&54>732=4>ø\s¼šÐnWmK(.$4 J=[M§€§×T"" ")µ–hŽØMh€`2JC5>1K`¨#/QAMþÈÎÀ@b%#".54632.#"32>5#"#"&54732=4>322'654&#"#54#"&546326ÎɤAL4]xD' O;?XZCAe='}%/ZCUe|fI54&#"#"&547326=462'654&#"#"&54732=46N_ =-$3 J6%<ZCUe|42I<%8a}5?bP-";;/8DUD-%9C¿u_9KC6w-%Y1>e*.=RCi1)P3@Q64AMþX±À+e2'>54&#"#"&547326=462+"3!!"&46;2654&#"#"&546732654&546N_ =-$3 J6%<ZCUe|42I<%8at$5 8&Í$$Hþ¸ (( ·-<)"6>,4G.1#.2"&<¿u_9KC654&#"#"&547326=462+"3!!"&546;254&+532654#"#"&5467326='46N_ =-$3 J6%<ZCUe|42I<%8as@:((@6Ý$$Qþ¯ '' ÊQ D8;05F1."/ %?¿u_9KC654&#"#"&547326=462#"5432&#"32654&#"#"&546732=46N_ =-$3 J6%<ZCUe|42I<%8ae;N{f‹ƒE6%5LQOa1';<+7E*5!' /(:C¿u_9KC654'#2>54&'#".=ÕwXËþ¶ÆS+7V= +$7þv›JM&7/Ue|42I<'6RC’SéBT#c*%&0 ("83%!,  *ù[nþñ—þG+H>U8#G,¡U¦B,D!{f¢FSLSdU.SSd·FÓVF6¾þ* [+( 76!-"  #MÿAÂMU%4632!!3#".54>32&#"326=!5#54#"#"&547326=463237"!5&ÕwXËþ¶ÆS‹£ \b7P?`F6B'iO:z[ýã›JM&7/Ue|42I<'6RC’SéBT#ù[nþñ—þGvv &" VX¡U¦B,D!{f¢FSLSdU.SSd·FÓVF6¾IÿóÇÄC2#"/32654&+532654&#"#".54>732?> 2L%LRbJ%$ 1#;3)#".(>",A(<377! =+'5G5a#9:Ä,& CO732?>264&" 2L%LR8:A3"2  1#;3)#".(>",A(<377! =+'5G5a#9:N4""4"Ä,& CO@&"C1C+! ' <%+&8,2)KYK,C!/\?7G@9?+Ma‘;9Q)ý»"4""4IþþÇÄKYk2#"&547/32654&+532654&#"#".54>732?>2654'+2654'#"&' 2L%LRCBU<=S0 1#;3)#".(>",A(<377! =+'5G5a#9:: +72'$.EÄ,& COG&$PDWUAB)<%+&8,2)KYK,C!/\?7G@9?+Ma‘;9Q)ýÒX:($ $6) 2+HÿDãÃL#".5432&#"32654&+532654&#"#"&54>7326=4>32Ò9/y<@]5D.˜W-"=Q9GVC6&&-9/60LZBSg >.$4 J=4'$1K`KI77P)MHÿëñÃk#"'#"&54>54&#"##532654&#"#"&54>7326=4>323265332>54&'u;A+4'I2T>8H)2)"& %& &:L=GW+&(D(! 0 5617!2" 1(Cþë;3%J1LaHÿDòÃs#"&547&'#"&54>54&#"##532654&#"#"&54>7326=4>323265332>54&'2654&+"u;AGH 1"1C4&T>8H)2)"& %& &:L=GW+&(D(! 0 56* Ã!‚IoDO "*C1$871)#*% BMOL_z`3W9# eQ/F!@JI3L'>17!2" 1(Cþë;3%J1Laýß* HþüñÃp}"&547&'#"&54>54&#"##532654&#"#"&54>7326=4>323265332>54&'2654'+2654'#"&'u;AYWTzS7%T>8H)2)"& %& &:L=GW+&(D(! 0 5617!2" 1(Cþë;3%J1Laýë( X9)" '3( #. NÿÃs#".54632&#"3265#"'#"54>54#"+532654#"#".546732676323265332>54'ŠD35eN8C/mP'U(3mI$eP1B[4j…(1(H4/I'& ?:1G F:k 2"') –@O7- "P3BL'!%6 kÃ@tle…k1" '" vk1HTY0*)3QttQ5N?H„'Wz.9&XeÍ90H,%#1'Dþê1<)=2tSLÿ(|Ãh%3254'7#"$54732>7#&'#"&54>54+5;254&#"#".546732>763232653ˆ!'k~ô’çþÌb `ÚQƒ_/ \5i6P)0)HG$6*O<1G F:k*" %%)N;P7/['P5@M¥*C®Š9O©vÁlð¿†eRw©Ï6$FT)00*EpdMi6O>H„'Wz.D Ja{"B;.H/"A"/(DLþñ}Ãu~#"&547#"$54732>7#&'#"&54>54+5;254&#"#".546732>7632326533254'7264&#"&9*" 0FŠ¢çþÌb `ÚQƒ_/ \5i6P)0)HG$6*O<1G F:k*" %%)N;P7/['P5@M!'k~Ž2""$&>."3 B4Hð¿†eRw©Ï6$FT)00*EpdMi6O>H„'Wz.D Ja{"B;.H/"A"/(Dþê*C®Š9O©‡þô#2"!4Lþ|Ãr•%3254'7"&547#"$54732>7#&'#"&54>54+5;254&#"#".546732>7632326532654.'#2654&'#".=ˆ!'k~†:@U|TsyçþÌb `ÚQƒ_/ \5i6P)0)HG$6*O<1G F:k*" %%)N;P7/['P5@M/.&A+7'#8'# $':¥*C®Š9O©¥s V1=VU>+ð¿†eRw©Ï6$FT)00*EpdMi6O>H„'Wz.D Ja{"B;.H/"A"/(Dýr y:( 5 6& & +7Hÿ÷ÓÅ=2'>54.#"#4&#"#"&5467326=4626 Pw :*"/ 0(!2S9+-CVEOjR/#1 /(#4hš8;Å„e3D?7<*2L%5=þìD .@KaO`}c\u6<,2L%?KMRg67Gÿö<Å9E2#"&547&#"#4&#"#"&54>7326=463262654&'=þrI:4`k27CHÿbÃÂTa4632632#"'7327654&'#"&54>7.#"#4.#"#"&54>732652654'PbO\8G^ŽI[WMLg;8('X=?7+M@7Q E0 H5/IS& )C\EPd ;*#1-# %;O2%3!0)ET77s‚LpML*JIa?R -:[mUF4?-)08þÝ:":CkK_|d3HB6<,5N#ISšBDF& 7&1?Fÿ÷Â+72!5>54&#"#"&54>732654&5&546354.'.m„þy^^)!+?bGPa ;*m@2.9}²KFê.%)ÂhÝNO'-@2\Rh|f4F@7J]O? Na¯Ds;Õ*>)Fÿ;Â6BJ2##"&547#5>54&#"#"&54>732654&5&546354.'264&".m„!!A31C!À^^)!+?bGPa ;*m@2.9}²KFê.%)4""4"ÂhÝ /0DC1/ NO'-@2\Rh|f4F@7J]O? Na¯Ds;Õ*>)þ"4""4FþþÂ6BOa2##"&547#5>54&#"#"&54>732654&5&546354.'2654&#"2654'#"&'.m„.,U<=S/“^^)!+?bGPa ;*m@2.9}²KFê.%)%$,64%".EÂhÝ&?DWTBD&NO'-@2\Rh|f4F@7J]O? Na¯Ds;Õ*>)þ3X9)$ (2( 2+GÿGJÂ52#".54732654&#"#"&5467326=46–3J&\µtr±[G#@¿—•¼D7*=`DPb<8"07B6+8cÁ-JK'jµrq´jƒhXqż‹M_9,…BYucH†#r@F\<0oL_GþéKÂ?J#"&=#".54732654&#"#"&5467326=4632264&#"í%9A31CJTr±[G#@¿—•¼D7*=`DPb<8"07B6+8cI3J&s##("1>.0DC1 q´jƒhXqż‹M_9,…BYucH†#r@F\<0oL_-JK'–þë"4"#"GþŠLÂBNa"&547#".54732654&#"#"&5467326=46322654&#"2654'#"&'Ì%.TzS 4;r±[G#@¿—•¼D7*=`DPb<8"07B6+8cI3J&DY&%'%*85$1 *(U 8%AZUAq´jƒhXqż‹M_9,…BYucH†#r@F\<0oL_-JK'U¢¿X9)" '3 # #. Mþ½±À+S\2'>54&#"#"&547326=46#"&=4&#"#"&5463232654'2654'N_ =-$3 J6%<ZCUe|42I<%8a’*C4/>,#N@,5`E:D=?V90I8NaH:+Z5:a"ð#&C6'LOMþ³À+[gp2'>54&#"#"&547326=46#"&547&=4&#"#"&5463232654'2654&+"'2654'N_ =-$3 J6%<ZCUe|42I<%8a’*5:B./A-6,#N@,5`E:D=?V90I8NaH:+Z5:a"þf&.-…#&C6'LOMýë»À+^l€‰2'>54&#"#"&547326=46#"&547&=4&#"#"&5463232654'2654'#"'2654'#"&547'2654'N_ =-$3 J6%<ZCUe|42I<%8a’*6C$ 4H93,#N@,5`E:D=?V90I8NaH:+Z5:a"þ—   P." ,4 '!š#&C6'LOLÿ;OÂ19A%4632!!3##"&547!5#5654&#"&5463237"!5&264&"ÛwXËþ¶ÆS A31C þTîI7(+4,;UEF]$véBT#s4""4"ù[nþñ—þG#.1CD0.#¡,H.9B76#2XHYYJ4'ÒVF6¾ýê"4""4LþþIÂ08EW%4632!!3##"&547!5#5654&#"&5463237"!5&2654&#"2654'#"&'ÛwXËþ¶ÆS,.T=>R1þ‚îI7(+4,;UEF]$véBT#\%%+72'1 Eù[nþñ—þG&‚ZUAD(¡,H.9B76#2XHYYJ4'ÒVF6¾þX9)$ %5"! 2+HÿxÂHO23467632!!3#"&54>32&#"325!5#5654.#"&546"!4ü $1(#-0J8O1 þ±ÕSþñF'@@ WQ#L02DU*ÂýÓøI&2D8Dc7OC(Â"<&3(Mh"&.LQ9—þLè.&¾¡+IB3= 2XHX*]@6ÓLþÈGÂBbj%4632!!3##"&54632.#"3276=!5#5654&#"&5463232'654&#"#54#"&546326"!5&ÛwXËþ¶ÆSÅ_z}_xD' Q;QFWFjKLýàîI7(+4,;UEF]$vD% #HBT#ù[nþñ—þG{©L+6GB (:$/HIf¡,H.9B76#2XHYYJ4'þ²$% ;;% % VF6¾LþºGÂ&.T%4632!!3!5#5654&#"&5463237"!5&2'654&#"#54&#"&546326ÛwXËþ¶ÆSý”îI7(+4,;UEF]$véBT#s6H)?(. 9'(1KUJ;7&%ù[nþñ—þG¡,H.9B76#2XHYYJ4'ÒVF6¾þUWB$-) *Z+Fѵ&!A0\#/gAZ10Lþ»GÂ&.R\%4632!!3!5#5654&#"&5463237"!5&2#"&547&#"#54#"&5463262654'ÛwXËþ¶ÆSý”îI7(+4,;UEF]$véBT#YCZ6+*7D+97'4MYJ86%/k 6B$ù[nþñ—þG¡,H.9B76#2XHYYJ4'ÒVF6¾þUgL7ED6R6 ѵHC3Z!-hAZ0/þü)"O.4E$+LþXGÂ&.jv%4632!!3!5#5654&#"&5463237"!5&4>32632#"'732>54'#"&5467&#"#54#"&2654'ÛwXËþ¶ÆSý”îI7(+4,;UEF]$véBT#þ² 0%5&,;R0<9_K&& (: ; 6+&2>+>",98  NZx"$%ù[nþñ—þG¡,H.9B76#2XHYYJ4'ÒVF6¾ý».B 0.KT2Ih ':0P&"!4Og&aÆDZ-þ±ÌSKxÓŠ®þâ¥$)#š ¢äýâÙI@.1<5C 45ñ*<)Á[D2+ý(R_F—þ>'FP9&ˆï’?_=7V9€ÎsÖ ¡+J-9;1F 0Y-C!)236ÓIþròÂKT`23432!!3#"&547#"$&54673 =!5#5654&#"&54>"!42654&#"Og&aÆDZ-þ±ÌSL3 2"4B‰Ç­þâ¦$)#š ¢äýâÙI@.1<5C 45ñ*<)f2""Á[D2+ý(R_F—þ>bB8- #*F0 )‡ð’?_=7V9€ÎsÖ ¡+J-9;1F 0Y-C!)236Óý!!!6IþòÂIRau23432!!3#"&547#"$&54673 =!5#5654&#"&54>"!42654.'#2654&'#"&=Og&aÆDZ-þ±ÌSw67U>=Uy¨­þâ¦$)#š ¢äýâÙI@.1<5C 45ñ*<)3.A+7'#8+-/)9Á[D2+ý(R_F—þ>|GQ.>UU>-$‡ð’?_=7V9€ÎsÖ ¡+J-9;1F 0Y-C!)236Óý  y:( 5 588 )9Lÿ;+ÂHP[2#".547&/3254&+532654&#"#4&#"632#"&54>326264&"%2654&#"zGbBJ86A3"2   8U29'$.717/ASS,¥-?1AD93262654'+2654'#"&'%2654&#"zGbBJ=FTzS/ 8U29'$.717/ASS,¥-?1AD932632#4&#"3265#';54#"26=#"v=J(# #'%(/ %/! !?/ '. B.0H)I@\D7.$:5*.7ä6+$?'H&"cI<%9 /F!28X0 1#" :'I)-" "PMkS9L>GI>SdS Ž )'c%þÃ,4UT)HÿøÂ5<DNY%#"/324+5324+#"'#"&547&54>3263232%4&#"3265#';54#"32=#"Ë$>1:H:H'20P)#?:IBD .(G%OEV7…þÿ8,+44*'?æ9)$?4?"bˆ##* ! ^"FD`.PPR>P@ 2 PPnSD^:PM=H@PTal*'c!Ü $`UHÿd¿AHOZe"3!!"&5463!254+53254+#"'#"&547&54>3263232#4&#"325#'";5432=#"´8Sý­1;<0“}6*/EZ;P)#?8KBD96G%O%:@|/5P;|7-+44*fÃ_.$"$„?"b 'B1()9:0(-dWCCC6D5%0 CC%4>,*,9%1C?5<4E˜‘!SÔ%QGMÿÂ:@JU^2#"&54632&#"32654&+#"'#"&547&54>32632#4&"';54#"32>5#32=#"nE]³—D’w\[B(0>"^T+r‰5,UEP)#?:IBD .(G%O.A E9V4¦9)$?.¥5)&1ã(?"br[}š,#.“m@Ue|PPR>P@ 2 PP/I29QN32#"&546326326322654&+53254'$264&#"+,SE(, AH(/0**%.41ES@KF:K ;(6]2*"L:\4% .!/=$ 9F£„a948dB'yF^ý— + &D@.32þÍ>&& %â ?$9E:!L 4211/$þÂ-E'>5$F #-^`?s" !/<.)M;!3bP€—NMF4?Ý) '.7;!h;=L-H1.HLÿ;oÃer…Ž%#"&547&/3254&+532654&#"#4&#"#"&5467&#">32#"&546326326322654&'%2654&+53254'$264&#"+,42A31C AH(/0**%.41ES@KF:K ;(6]2*"L:\4% .!/=$ 9F£„a948dB'yF^„4"& þ= + &D@.32þÍ>&& %â ?$A"!?0DC1- :!L 4211/$þÂ-E'>5$F #-^`?s" !/<.)M;!3bP€—NMF4?þv" ‹) '.7;!h;=L-H1.HLþù{Ãdn”%"&547&/3254&+532654&#"#4&#"#"&5467&#">32#"&546326326322654'#2>54'#"&'%2654&+53254'$264&#"+,;GS|R8 AH(/0**%.41ES@KF:K ;(6]2*"L:\4% .!/=$ 9F£„a948dB'yF^ž.)(C&0 5$"./þB + &D@.32þÍ>&& %â ?$D##TCXV@I):!L 4211/$þÂ-E'>5$F #-^`?s" !/<.)M;!3bP€—NMF4?þˆ% $v+'  '3) Có) '.7;!h;=L-H1.HJÿ7Ú¹)1233##"&547!532654&#"#&54>264&"=CQ7ëS"$B21C$þ4Ó+7$)#* + 974""4"(R>I-—þG"3/ED03""?/"80! $. þS#2##2Jþýܹ)5H233##"&547!532654&#"#&54>2654&#"2>54'#"&'=CQ7ëS,0S>=S2þ]Ó+7$)#* + 9.%C&0 3&1 /(R>I-—þG&BCXUAD)"?/"80! $. þmw+(  %5"! CJÿ9×¹%-233!5>7!532654&#"#&54>5#=CQ7ëRþ<9[8 þCÓ+7$)#* + 9oJ&#(R>I-—ý€ .9."?/"80! $. þ7¡):JþzÛ¹3;F233##"&547!5>7!532654&#"#&54>5#264&#"=CQ7ëR!! .B!þ÷9[8 þCÓ+7$)#* + 9oJ&#°#!#$(R>I-—ý€!.*?1.! .9."?/"80! $. þ7¡):©-&--%Jþaà¹4<G\233##".547!5>7!532654&#"#&54>5#2654'#2654'#"&547=CQ7ëR"+-# $5 +þÿ9[8 þCÓ+7$)#* + 9oJ&#œ"&4)+1(R>I-—ý€%8$5 -# 7& .9."?/"80! $. þ7¡):z P." *)  '$,JþÊÞ¹R\233!532654&#"#&54>2#"&547&#"!532654#"#&546323&54>2654'=CQ7ëSýrÓ+7$)#* + 9.+B5,%2H4@>þ€‡0 0(*7r&Di%B(R>I-—þG"?/"80! $. þÏ(:2=J:.V< J5M' '; (1;)*5E#>3þþ(.I5@ )JþjÚ¹nz233!532654&#"#&54>#!"3!!"&5463!2654'#"&5467&#"!532654&#"#&546323&54632'3254'=CQ7ëSýrÓ+7$)#* + 9Â@4þB$$5ýË&&ž0>> 1)$/<'+0B>þµc#,%'7o%OI-—þG"?/"80! $. þ3D&  A-B 2<3$,3>1A!.  &-!%.6:F? )%I$JþjÚ¹u233!532654&#"#&54>46322#!"3!!"&5463!254#5254&##"&547&#"!532654&#"#&546323&2654'=CQ7ëSýrÓ+7$)#* + 99MI-—þG"?/"80! $. þL;G-)/)'!!6&!'3?0)S7)C -  ',F .%'2F#Jþ4عu233!532654&#"#&54>4632#"&54632&#"32>54&'#".5467&#"!532654&"#&546323&2654'=CQ7ëSýrÓ+7$)#* + 9IQAN(0BkV1``(51%#7A+@ #4+#:*/!2 #þ¦n *3 )6 r(»V(R>I-—þG"?/"80! $. þ/CYK T@Y}  '@A"H '&.& #G<  -'4*)&8-5%& I3Jþ}عir233!532654&#"#&54>4>32#"&54732654'#"&547&#"!53264&#"#&546323&73254=CQ7ëSýrÓ+7$)#* + 9£ .@,,žuƒµ@9¤zg. *$K ( .þùK "*Z©0$'(R>I-—þG"?/"80! $. þN %.>E)Uo‰hO7 ;?\riM22B3%O.+E!,& +.!$/^*=I%Jýÿì¹t}‹233!532654&#"#&54>#"&547#"&54732654'#"&547&"!53264&#"#&546323&54>32'32542654&+=CQ7ëSýrÓ+7$)#* + 9•-:(G0'‡±@9¤zhŽ. *#K<( .þùK "*Z' @+-w+$' (  (R>I-—þG"?/"80! $. ý–.)+702 ŠgO7 ;?\riM10D3%O,,D",& +.!",9%6 >E)Mª.=I"þ®" "Jýëì¹{„§¬233!532654&#"#&54>4>32#".547#"&54732>54'#"&547&"!53264&#"#&546323&732542654''32654'"&57?&=CQ7ëSýrÓ+7$)#* + 9·' @+-J B2!2 "ƒµ@9¤z5I;*. *#K<( .þùK "*Z©+$' $297 &:&)?(R>I-—þG"?/"80! $. þN%6 >E)S6 %+?& ‰hO7 ;?\r&D+10D3%O,,D",& +.!",a.=I"þ."7  :“Hÿ‰À[i"3!!"&54>3!2654.'#"&54>7&#"!532654&#"#&546323&547632632#'2>54'»!$Óü-,<$ ÖO_$/ &O;?N2##/J72_ý¼Ë#,("#, +H;=U2¸<@?Z\Cgƒf{% &&+0GJ:)* iN)B% AIVweL+I. =;Lx;">-(5/$3!2>54&+532>54&+#"&54>7&#"!532654&"#&546323&54>3262654'µ^{HJP:ü§Úü#*.+$),- ) TC"S<9K"7+%<5L#_ý¼Ë"-(D- +H;AQ2¸< .O1g=p"*@G1{PC@(C4GI 0% & (%7#! ,4ATOp^A.N0$1G8x;">-*3.%=IY=D,Ti4A5$Jþ«UEK4^71@Lÿ1Â_m%4632#".54>32&#"32>54.'#".54>7&#"!532654&#"#&546323&2654'ß‚cz@Ji­‚ `e4K@SM99+#[f'7V4" +QD&7 E3$J5M#8+ýà®8*"#* + P3>W2²>%#0),Õi„r{dµ %)>TO(,8. 9Zy':-+>090F75m"U #11% E:O?A8VDM:;/.(JKÿvÄPZ%4>32#"$&547327654'#"&5467&#"!532654&#"#&546323&2654'j&T9u4MR†äŠœþý˜s 71$䬅UL92BQ9*5C-(Uþ#ˆ7-& * 6?9K*£2(TÝCS9p Jg¥YoÊ~Œg8cC ×Y`“Y%,)Y{YGL_2?8H: &J(,%0#2NR=@6RAL8B)J2oKþÌyÄ]gs#"&547#"$&547327654'#"&5467&#"!532654&#"#&546323&54>32%2654'2654&#"#++*" 4B}œþý˜s 71$䬅UL92BQ9*5C-(Uþ#ˆ7-& * 6?9K*£2&T9u4MRþõ(TÙ "("M @%"3 F0 6oÊ~Œg8cC ×Y`“Y%,)Y{YGL_2?8H: &J(,%0#2NR=@6RdCS9p Js-L8B)J2oþÛ$"""KþgzÄ[epƒ#"&547#"$&547327654'#"&5467&#"!532654&#"#&546323&54>32%2654'2654.'2654&'#"&=ø2PW<=Ukyœþý˜s 71$䬅UL92BQ9*5C-(Uþ#ˆ7-& * 6?9K*£2&T9u4MRþõ(T—.:V7'#8+-/)tO=@SU>'&oÊ~Œg8cC ×Y`“Y%,)Y{YGL_2?8H: &J(,%0#2NR=@6RdCS9p J‘KL8B)J2oþÍ.y:( 5 588 (Hÿ0(Ånw%2#!"3!!"&5463!2654'#"&547'#".54;2654&#"#54&#"632#"&54>32>32+"32>2654#"324#"ƒG^SBþ*9gý™/<:1²;L^8*)7 vp.14ÏÇ@M<03'S?3>! (&"-7,?7p0Y -C jzÏD:W)“£.3þY**™B61B ;.#$,.%?$(1-" B0 -!‚?4->D? O/7% 9 #8,(>7&7-:_4,>>‰//.f%MþܹÀ~ˆ‘%2#".54732>54#5254&##"&547'#"&54>;2654&#"#54&#"632#"&54>32>32+"32>2654#"324#"E[**=VkNC„jD\"S?b‚z>UmJEN9#9)2. $'D@",PGW2«AVC)5$S?4=!(%.#*9,A5p0X AXv™6G2$#@8@e.3þm**–?2% (/K) Fj¯n}| qkb™\< <)6(3!#.>>""1H7.:I63,DFO.8% 8(77-)> 7N=M[(!0 .. ¦!//*4fMÿ ?Åqzƒ%2#".54632&#"32654&'#"&547'".546;2654&#"#54&#"632#"&54>32>32+"32762654#"324#"yWo¯‹;F0kWpC8.K4D[#p‹/-6,)7 ŠB3 apÉ>O2:4&S?3>!(&.#.6,?7p0Y CUnYÛ'9 +#4†ˆ+.3þO**”aLc{"#,'nX-L$(1,#H7'! .KH4%=:< @.8% 9(77-(>7T=FX"AA„ //.fMþÈ@Åxœ¥®%2#".54632.#"32654.'#"&547'#".54>;2654&#"#54&#"632#"&54>32>32+"32762'654&#"#54#"&54632672654#"324#"y8Q+nf€AL4]yC' P;+7$[Br! 6,*6 Šg: #+(BC$É;R<07"S?3>!(&.#-7,?7o1Y @XpWÛH=-!6†…&% #"Q.3þO**”57~VO 2!6GB '$&-”m$6 $(1.!I6 /"3 E7,6;W@.8% 9(79+(>7Q@GW5!AAþá& + ;% %› //.fMÿólÅž§°¹%2"&547'#"&546;2>54#"#54&#"632#"'#"&54;2>54&#"#54&#"632#"&54>32>32+";2>7>32>32#"'#"32?62654#"324#"324#"*:8T6 ,%7.Q+6H}iµ@>f2'SG,=! (%.#0šsŠOUK©á(=7/ZS?3>!(&.#.6,?7o1Y .C {fËzu9Q›mE-@2p0X *A ~…#?`R@:f A !.3þF** ý]**¨5'(1.! 2(5?7#bBA O7/% 8(7U\D<(^"1*'0† S.8% 9(77-(>7$4*GV843O\*,> 7 /(XC,)#:„//.%ffJÿN(Ũ°¹Ã%2#!"3!!"5463!254'#"&547#"&546;2>54#"5#4'&#"632#"'#"&54;2>54#"#54&#"632#"&54>32>32+"3267654632>32+"32>2654#"3254#"3254#"—>SZDþX//Dý¼`7)n›=0(&0 a^/8EsXŸ54WMLH4 $#4)—izqq§Á44WLM+75 # *(1(:/a+ P&: ¹ËA,o_y?[Fa+O2ˆŠHPJ0&+þ##ýš$$®;1;F!5J$,Z1#(2,$ C-4+:F2$_|4]=$94,[[?3Cb4&_€ 4BE$#! )78-*? 5 /( @+c_>T5 ' [?,==‡,X*01101LÿDÅ´¿ÈÖà232#!"3!!"&5463!254#5264&+#"&547#".54;2>54#"#4'&#"632#"'#"&54;2>54#"#6=4&#"632#"&54>32>32+'";7>54>32>2654#"3254#""3267#"&%3254#"H*/ ƒ ª(-%þ4% ýö%01$¹&) 31'&0 UM / ·ž %-VNLG5 # *(>`ŽKzx¬½45WMM+85 # *)1(90a+L&: ¸yzEmIŒa<'81a+O'*þ™""#‘+8A-%/8üô##Å 8%q D*)9- ((!"!'3-# A." ‚ +_|\=$#! (8OP73E`4&_€ CD$$! )79,*> 5 /( 6@7P[%(>5þX&,, 01µ(.m „"01"Lÿ0Ű¹ÂÌ%2!".54632&#"32>54'#"&547#"&54;2>54#"#4'&#"632#"'#"'&54;2>54#"#54&#"632#"&54>32>32+"32>7>32>32+"32$2654#"324#"324#"15 þñ5A-jTRC7(4mF)HE)D1'%1 6h=3,SÈŸ#5 WMMH5 &!4)ft½%»¬44VML*84 # *(1'80a+N2ƱzST_­a&."`,L'; Ų/=,"'+þ€##ý­##© >,ù") -W=F##(2,$>#4(ƒ$ _| \=$94,S_B9+]4&_€44DC$#! )79,)=5 '  3$Wx6#75!0'›$v‚ --+#b"bLÿóÂÕŸ«µ2'654&#"#"'&5467&#"#4&#"632#".547!#"&546;2654&#"#54&#"632#"&54>32>32+";2>?>32>3262654'2654&#"%324#"Ój…6'1YfU#nWA@)$9/*.CyZy ]zRl>6E9p% 3*þÔ,2+i_H<<))$;;Ú5,+:T0$6::O7/% 8 #9+(<5!K=If%0K0*0P3 þqK6nJPo3G')&1-$=þ%fJÿœ¸¢¬¸ÄÌ%#".5467'654&#"#".5467&#"#4&#"632#"&547+"&46;2>54&#"#54&#"632#"&54>32>32+";2>?>32>326322654'2654&#"%2654&#"324#">-1" "*0 WeQ"lV?(< :,(-;Q:&N_ +6o-E2DRq]ð$,-#|?nDA pVK1F88B7g‚þ‡(3Ub54"+$"ý<$!&"(#ýF**D'- 2"+6 BvYu ZxPj-A47p" 1*þÛ%1*h[F"3)C;W^ :U*4V866#57:M&=$ &(&)8*': 3 I;Ja*&=#+1YO,# ŠezH6kIPk2EÇ$!""Á7$1,#; "!dJþŸ©´ÉÕÝ%#".5467654&#"#".5467&#"#4&#"632#"&547+"&46;2>54&#"#54&#"632#"&54>32>32+";2>?>32>326322654'2654&#"2>54'#"&'%2654&#"324#">%&S<*> O3JeQ"lV?(< :,(-;Q:&N_ +6o-E2DRq]ð$,-#|?nDA pVK1F88B7g‚þ‡(3Ub5ò*B)1%# #-8ýg$!&"(#ýF**?(54.#"#54&#"632#"&54632632+"32?6322654#"324#"×ê¹Îþài!]˜…©ñQ.$:)*6 !€i+ #+hUÉ,2"*)4'SA3:#(%/"*9hR`;1UFUkSå0.'2K†QDLbè.4þP** f‰ë¬Š~"mvžiZx($%1H,( D+ 05A 7$* KC@,;& 8(77-AN57K>CS ' !>"N@//.f%Fþ˜×¿xŽ˜%2#"&547#"$547327654&##"&547'#".546;2>54.#"#54&#"632#"&54632632+"32?62654#"264&+324#")LbOG 2"4BTbÎþài!]˜…©ñQ.$:)*6 !€i+ #+hUÉ,2"*)4'SA3:#(%/"*9hR`;1UFUkSå0.'2K†Q .4™!! #ýÐ**˜N?Q@N #*F0묊~"mvžiZx($%1H,( D+ 05A 7$* KC@,;& 8(77-AN57K>CS ' !>"Ž//.þÕ#2"#Df%Fþ?׿w€Š•©%2"&547#"$547327654&##"&547'#".546;2>54.#"#54&#"632#"&54632632+"32?62654#"324#"2654&'"2654&'#"&=)LbA33:U|TLGÎþài!]˜…©ñQ.$:)*6 !€i+ #+hUÉ,2"*)4'SA3:#(%/"*9hR`;1UFUkSå0.'2K†Q .4þP**.*A(:'#83%/):˜N?4X R/=VU>1& 묊~"mvžiZx($%1H,( D+ 05A 7$* KC@,;& 8(77-AN57K>CS ' !>"Ž//.f%ý¬ #y8* 5 5!-8 ,6LÿEÝÀWco#".547&'#"&=4.#"#".5467&#"&546326323265332654.'264&+%2654'X*9 GEE/ "*E0.RB_:-(lUD)< 9/-M^^!kwb?4.MJX<)"?S2):N 3#4""ýU)5We(À@D3sD K3A 2!  ALaLa :2ZzRl.B6;n% nW~?Mjƒ`M]LD,#Dþì4>iM-94ýâ"4"‰K6oIPo #,LþþßÀUbt€#"&547&'#"&=4.#"#".5467&#"&546326323265332654.'2654'2654'#"&'%2654'X*9 VXU<=S,4'.RB_:-(lUD)< 9/-M^^!kwb?4.MJX<)"?S2):N 3#) %)92'#/EýN)5We(À@D3‚B`DWW?A'3LaLa :2ZzRl.B6;n% nW~?Mjƒ`M]LD,#Dþì4>iM-94ýï% X8*$ %5) 2+öK6oIPo #,MÿÞÂht#".54>32&#"327#"'#".5&4.'&#"#".5467&#"&54632632265332>54'2654'y$AK‰e58CDZa'6SO,? Yý()5We(Á&zCnz<!(Ù%KK&90T"3(ZzRl-B67q& ,@7„HU–_€RH"RŠ+#Dþìq+A3YfþK6oIPo #,LþÈìÀo‘%#".54632.#"32>54'#"'#"&='.#"#".5467&#"&546326323265332654'72'654&#"#54#"&546326%2654'ì,Fa_4AL4]zB' P;@WZCAg9% 5LU9.RD]<5&lXA)< 9/+N]^!kwb?4.M.C"fFS2)>Ju';þÈ&% #ýß)5We(na—\; 2!7FB '/#%./AR;8MLbG4>7'&'#".'4&#"#".5467&#"&546326323265332>54&'2654'r%.þ´õ¦þô—17'502éHQQ$N$-I%8 *@# ]N:%5 /*&ATU _jU7.1;?NU#-LD'8 4+ý#.KV"ÂAD'¼øpÆzHh=7`B¤Æ.EH&9/‡nZxSl.C67n' u?ƒHY”`WC"R‰*"Dþìo.D74aþ–J5lHNm #+PþþÝÃkwƒ#"&=#"$&546732>7'&'#".'4&#"#".5467&#"&546326323265332>54&'72654&#"%2654'~,3F/0Fš¿ þ÷ 17'502éHQQ$N$-I%8 *@# ]N:%5 /*&ATU _jU7.1;?NU#-LD'8 4+ %.s ""ý•#.KV" B(4BA5SiÇ€Hh=7`B¤Æ.EH&9/‡nZxSl.C67n' u?ƒHY”`WC"R‰*"Dþìo.D74a AD'‹þö$"*"óJ5lHNm #+Pþ™ÞÃn|œ#"&547#"$&546732>7'&'#".'4&#"#".5467&#"&546326323265332>54&'72654&'"2654&'#"&=2654'V(; U>=U ‹Ÿ¢þö17'502éHQQ$N$-I%8 *@# ]N:%5 /*&ATU _jU7.1;?NU#-LD'8 4+ %.ž #(:,8+-/)8ýÅ#.KV"B%2(>UU>32#"&54632>326322654'264&"%2654&#"ÿ))D01C2GpU$mX@)< 9/*0CS-$ -F%/!4B6>AMŒrk-J)>58CkŽþy&3Wa5$2##2#ý%%"'"(( =%3AD0.6 PWZ{ [|Rl.C5:q# 5(þÔ,(#.?&)\31PeTx™M#*†l]=J7oILs3G¸"4""48%2.#9MþûSÂPZez†2"&54>7654&#"#".5467&#"#4.#">32#"&54632>3262654'2654&#"2>54'#"&'%2654&#"XkŽZ\S|R!1%FpU$mX@)< 9/*0CS-$ -F%/!4B6>AMŒrk-J)>58K&3Wa5þ,%%C*3&1/ý6%"'"((†laZaCXV@); PWZ{ [|Rl.C5:q# 5(þÔ,(#.?&)\31PeTx™M#*þtJ7oILs3G£u" " &5$ Fõ8%2.#9Eÿø‘ÄDO[233!53654&#""&547&#"#4&#">32#"&54763263262654'2654&#"ýVj_àSýןjJ8NNh@M&/SI63L&.!/F5>@OJH`_F$V.#)? )F",*þO'&!)(Â}_}E—þG":„KgInCRNCsA 2(þË,(6.I8)SA0LlOqRNONþ¾8/a-U*.:P/%$/.#9Eÿ;•ÄOWbn233##"&547!53654&#""&547&#"#4&#">32#"&5476326326264&"%2654'2654&#"ýVj_àS$(A31C)þ’ŸjJ8NNh@M&/SI63L&.!/F5>@OJH`_F$V.#)74""4"þ¬ )F",*þO'&!)(Â}_}E—þG51CC15":„KgInCRNCsA 2(þË,(6.I8)SA0LlOqRNONý½"4""4ß8/a-U*.:P/%$/.#9Eþþ›ÄN[ny…233#"&547!53654&#""&547&#"#4&#">32#"&54763263262654&#"2654'#"&'2654'2654&#"ýVj_àS'1TzS3þ»ŸjJ8NNh@M&/SI63L&.!/F5>@OJH`_F$V.#),%$+72'1 *(þ– )F",*þO'&!)(Â}_}E—þG&CAZTBF(":„KgInCRNCsA 2(þË,(6.I8)SA0LlOqRNONýÔX:($ $6"! #. B8/a-U*.:P/%$/.#9MÿÊÂiu2!3#".54>32&#"326=!53>54&#"#"&547&#"#4&#">32#"&54632>3262654'2654&#"RgZS.IU=N4bVlB=j"\H6u‘ý²ø+0D7" N 8%2?Z(0SJ2-F%+!4B6>AMŒrh0 ;+8()G#*@9 #þL%"'"((ÂvXr^—þ /5& $ !&_N"%e2LeNf-6%M;bT1)þË,(5#.?&+\31PeT{–M5þ¾9.T4 U+*+P8%2.#9Pÿø=Âfs~Š2#"'&547&#"!53>54&#"#"&547&#"#4&#"632#".54632>326323&5462>54&'%2654'2654&#"w/J) H;5"`.C 2%ýì´#,;/ C 3#,9N(#M>-DV'6- 8/$5 |e[*-2"#/F^LË6p•X'ý¾$73þŠ,"""Â*;H6Zy7.:ƒZ/E74l &c6HeMe,6%M7&#"!53>54&#"#"&547&#"#4&#"632#".54632>326323&547632632#!"3!!"&54>3!2654.'#"&%2654'2654&#"%2>54'[45#/J72_ýÞ´'(;/ C 3#,9N(#M>-DV'6- 8/$5 |e[*-2"#/F^LÔ<@?Z\Cgƒfý5!$µüK,<$ ¸O_$/ &N<=Pýö$73þŠ,"""6% &&+1¦5X( =;Lx;"$r(HeMe,6%M54&+532>54&+#"&54>7&#"!53>54&#"#"&547&#"#4&#"632#".54632>3263232&54763262654'%2654'2654&#"Y]|HJQ9üϲüK).:*ü),,!) SD"S<9K"-!%<5L#_ýè´#,;/ C 3#,9N(#M>-DV'6- 8/$5 |e[*-2"#/F^L3^7<@?Zf> r"*@G1ý¦$73þŠ,"""PC@(C4GI 0&,< ($7#! +5ATPo^A%C+$$0G9x;&c6HeMe,6%M32&#"32>54&'#".5467&#"!53654&#"#"&547&#"#4&#"3>32".54632>326323&7327654'2654'2>54&#"ÀqZl9A\™r;J4POKF70(OQ(0K. ,'I<"2 EE$8.D +-ý­ÛO;/ C*# .7N(#M>,ES ), 9^<{e[*6$2"#0I[Mä5Ã&$sýÊ$7!& þ} !"Ôe‰r_޶ % !)>TM'6_5X|(:.=k 5/E7)q &LmIeMf,@ N32#"&547'#".54>;2654#"#54&#"#"&547&#"#4&#">32#"&54632>3263262654#"%2654'2654&#"L-7%ßÊ)B'-aHc.*;9*(8 ;…E0 "*(BB"µ2^e3&S?35$(1#0CSJ2-F%.!4B6>AMŒrk-J);$'3r.˜-4þz**þ%"'"((à 8'Ÿ $!)!2%"-&D&#4 B0b9<-@.8 E #9+/&5(þÔ,(5#.?&)\31PeTx™M#*55þ\//.Ú"??É8%2.#9Mÿ:)Ñž©µ%#!"3!!"&57>3!2654&'#"&547#"&546;2>54#"#54&#"#"&547&#"#4&#">32#"&54632>32632632+"32>322654&#"%2654'2654&#")T4þS..5ýË*8)!“-H3'8-)7 _g05BwYÉ $-e7"S?35$(1#0CSJ2-F%.!4B6>AMŒrk-J);$'3r.l-7%XJý-I(.fMh/BZÕ ! þ~**þ%"'"(( 921%', 7")2'<.6,=J 0!b>T@.8 E #9+/&5(þÔ,(5#.?&)\31PfSx™M#*55 8'HW%*!%-%I;ð"??É8%2.#9Mÿ<Ø¡¬¸%2#!"3!!"&5463!254#5254##"&547#"54>;2>54#"#54&#"#"&547&#"#4&#">32#"&54632>32632632+"32>762654#"%2654'2654&#"€fV '2ýë))[ý¥)33)ÿ%.'P8-)7 -E!A2‡FV1¶*> e7"S?35$(1#0CSJ2-F%.!4B6>AMŒrk-J);$'3r.l-7%‚]º3HP&OGQ.1þ“**þ%"'"((™8&  0%:5$ '$*<$)2'/s.:* b>T@.8 E #9+/&5(þÔ,(5#.?&)\31PfSx™M#*55 8'GX1'4)4!‰/*.é"??É8%2.#9MÿóUÂgs€Œ2'654&#"#".5467&#"#4&#"#".547&#"#4&#"632#"&54632632632>3262654'!2>54'2654&#"bl‡{1WlQ nUD)< 80'3JSF9(k ?+': a(0CSI3-F%-< "*F-@N‹sSE1VC,2Je:I9=,7N(5We"ýõ(X-02þ) &&!).•eHDt]z ]zOo.B67r% 5?þë 2#"&54632>32632>3262654'2654&#'%2>54'2654&#"bkˆN2DbC.)? )E+!nTE(< 80'3JSF9+k$4+': a*2ASI3Qa .B2 0!AMŒrl,K)D+:Bi6>1B'4K(5We"ù4"" ,ý$. X+21þ*$#&!).½cVW 6.1CD0&@ MP1=2" ]zRl-B77r% 5?þë 7654.#"#".5467&#"#4&#"#".547&#"#4&#">2#"&54632>32632>3262654'2654&#"2654'#"'%2>54'2654&#"bkˆW`"+ =T0"F )E+!nTE(< 80'3JSF9+k$4+': a*2ASI3Qa .B2 0!AMŒrl,K)D+:Bi6>1B'4K(5We"Û,%"D,65%C7ý$. X+21þ*$#&!).½c]Ze%: W?(: PU1=2" ]zRl-B77r% 5?þë 54&+"&54>32&#"32654&"6HT>;A3"2 t==o6-.5a:J(O7‚D5i?L) k4""4"?5J)!E1C+! $!?9 ''F4/.G80)"þƒ"##KþþÓÀ.;N2"&547&'732>54&+"&54>32&#"32654&'#2654'#"&'6HTJKTzS+`1=o6-.5a:J(O7‚D5i?L) ^$$,63&"/*(?5S'"WAZUA@'49 ''F4/.G80)"þ– !X:($ &4' #. Kÿ…çÀ3"#"&54632&#"32>54/.54632&L@JbM`-IK(IjYDX<-><;/10cl%0r]‚H=•8'MWE5L'.& 0*' 6%] <(FUE5Aÿ?¿+Q%2#"&54632&#"32654'#"&4632&#"32'654#"#465654#"&546326NYm¨IabK^5Z2EJ5`zŠi=R`qJ=€’T$  ôaOt‘9/-;62&!,r\…HnU:4^Jþà    '   Gÿ>ÙÂ4%#"&'532654&+53254&+"&54632&#";2ˆ7Sa?wi5B9!ðÊx/#w:Ip^zG7g@O%e31 8'(B7+)1D*G4BOG70'# /!TGþ‡ÙÂ>K%#".547&'532654&+53254&+"&54632&#";22654&'#ˆ711A3"1 ~4i5B9!ðÊx/#w:Ip^zG7g@O%e31n ( (# 8'/#<1C)" &'7+)1D*G4BOG70'# /!Tþ+ ,#Gþ@ÙÂ;FY%"&547&'532654&+53254&+"&54632&#";22654&"2654'#"&'ˆ7HBTzS1c,i5B9!ðÊx/#w:Ip^zG7g@O%e31Ÿ%&$,65$"/*( 8'>$PAZUAD( 7+)1D*G4BOG70'# /!Tþœ%X:(" '3' #. JÿönÂ,%2#"'&54732654&#"+"54632&#"327ÍGZq\ŒgdTB¦vAR.5·o\|G7g9Zw ýK7=HRTogOBU^Ž.&"uHUG7/lJÿEoÂ7E%2#".547&'&54732654&#"+"54632&#"3272654&#ÍGZ67E/ "*‹abTB¦vAR.5·o\|G7g9Zw ,2#" ýK7;$!B3A 2!"RSmgOBU^Ž.&"uHUG7/lþŒ"! JþþsÂ5BT%2#"&547.54732654&#"+"54632&#"3272654&'2654'#"&'ÍGZGLU<=S(I‡`TB¦vAR.5·o\|G7g9Zw $,62'#/EýK7E$"WDWUA='A}NgOBU^Ž.&"uHUG7/lþ™ !X9)$ $6) 2+MÿTÀ(4%#".547#"&546322>54&#"264&+Ì0E/ ") _€yad‡û1<*bGHa"I¢2## 4 6-3A 1"{afˆhcH!H0Id`G3>+–"4"MÿÀ&6H2"&547.5462>54&#"2654&+2654'#"&''d‡`aTzS"*<.!yQ1<*bGHa"IŽ&! +72'1EÀhwCeBYW?6' -O2fˆþn!H0Id`G3>+’X8*" %5"! 2+MÿEØÂJR#".547&'#"&=74&#".5463232653327654&'264&"W)8 KE/ "*E12YHa5!(0 6.*; qK7\G-50S(.5*.G)2##2#À@D0tE33A 2!" BLePSG>%M354'#"&'W)8 ^\S>=S.5%2YHa5!(0 6.*; qK7\G-50S(.5*.G) &0 3&1 EÀ@D0†CbCXU‚)5LePSG>%M35#"'#".54754#".546323265332654&'N:K»¬`€|[oF5c"_Z%@i=)3?e(3T86!S:Op*: gS8CX'6SOBRB1Â&~EîÎ*!*#"$5?2'KK*R9‡fJyLCC1e3TU`G+#DþìqcJ7qMþ½ØÂ@v#"'#"&=74&#".5463232653327654&'2>54'7#"'#"&=74#"&54632326=3W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)  KV .%7%!:3>7 JZI4,6.#:À@D08X1 MLePSG>%M354'7"&547&'#"&=74#"&54632326=3264&+W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)  KV<=B\B+!:3>7 JZI4,6.#:C#!!$À@D08X1 MLePSG>%M354'7#"&547&'#"&=74#"&54632326=32654'"'2654'#"&547W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)  KV=F$ 4H7!:3>7 JZI4,6.#:2 L4)'"À@D08X1 MLePSG>%M3%M3,6'/(‘ . MþÙÂ@~‰”#"'#"&=74&#".5463232653327654&'2"&547&'#"&=4#"&54632326=33267#"&5462654&#"264&#"W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)F'1C?B\B&# %M3,6'/(‘ . þà-&--%MýëÝÂ@‚›¯#"'#"&=74&#".5463232653327654&'2#"&547&'#"&=4#"&54632326=33267#"&5462654&#"2654'#"'2654'#"&547W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)F'1DH$ 4H1" %M3,6'/(‘ . ï P." ,4 '!MþÆØÂ@HT[#"'#"&=74&#".5463232653327654&'4632!7354&'4#"6W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)‹9T‘þâ½&¡-/*2,AmÀ@D08X1 MLePSG>%M2%M254'#"&5477#W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)9T‘*3 4"4H3c½&¡-/*2,Am", )'"0& À@D08X1 MLePSG>%M2 $,G4>"¾).gM<$6TNÀ P#!  ,4 '!/§Mþ,ØÂ@bmv#"'#"&=74&#".5463232653327654&'4>32#".54632&#"326=#7354&#'"654&W)8 "/:)S92YHa5!(0 6.*; qK7\G-50S(.5*.G)‹,-’CV38J5B;7N;)ó¼#$(¦30,_(t À@D08X1 MLePSG>%M2%$bPB!5?tS[!KÿIfÃK".547327#"'#"&=4&#".546323265332654'7[y½sKi!dEi¯pâ‘\22VFe3" (0"G(*: qM7YH.6-S4+8Kj|þÛ·1Mjh7|tck0X[B*vJK`L\J?$I0PgDI4b{TaWNC9Cþì3?cOˆ:`Œ±ÛKÿ iÃXa#".=#".547327#"'#"&=4&#".546323265332654'7264&#"+.C1"2 …¡y½sKi!dEi¯pâ‘\22VFe3" (0"G(*: qM7YH.6-S4+8Kj|‹4""' B%1C+! =1Mjh7|tck0X[B*vJK`L\J?$I0PgDI4b{TaWNC9Cþì3?cOˆ:`Œ…þý#2##2Kþ©gÃYfz#"&547#".547327#"'#"&=4&#".546323265332654'72654&#"2654'#"&'ë"-U<=Ss€y½sKi!dEi¯pâ‘\22VFe3" (0"G(*: qM7YH.6-S4+8Kj|µ. C,64%"0 )6 8%DWUA(1Mjh7|tck0X[B*vJK`L\J?$I0PgDI4b{TaWNC9Cþì3?cOˆ:`Œ¢ò" v9)" &4)  MÿFÂKVb2#".547&'#"&=4&#".54632326533265##"&5462654&#"2>4.#";HQ((E/ "*\D3XIa4"8Mo*; jS//E+6.S!0';`*)1@E=")' &$  $$ÂmWˆM ?#3A 2! ONiVEKAkO…8BG2`ƒ'M5HSH;Aþè$5 cr&"R;7KÞ.")1/J1þ¦.!6!MþþÂKVdv2#"&547&'#"&=4&#".54632326533265##"&5462654&#"2654&+2654'#"&';H"aS>=S&G73XIa4"8Mo*; jS//E+6.S!0';`*)1@E=")' &$ %%+72'17ÂmW0R7 fCXUA<& @NiVEKAkO…8BG2`ƒ'M5HSH;Aþè$5 cr&"R;7KÞ.")1/J1þ²X9)$ %5"! %9MÿÁXd2#"&54632.#"3265#"'#".554#".546323265332>5##".5462654&#"yS8´®B”}[lM=M%!`V+wž;Zp,1\/F#S:Op@FgS7EU)5SL9,A! *#3 @G!**!'&Áq|íË+!(% ‚i6LL&?B#>‡fKxL&|Db‚7YWZH-%@þé7D'CD&#4(4KÝ.#;( ,7HÿA’Á f%2654&#"".5473 7#"'#"&574&#".54632326533265##".54632 +*#%'þÉzPb"]Bf‹„E‹!$`?5XL]2"*/ 1#(.hRBQ /!GSN8FU#E "+C154'#"&54>7&#"#4&#"#4&#"632#".547626326322654'%4&#"326ý”g@4$$3@4$dNA8K >($S?5T?3'5SI5,F$-<2D7+5DJGÀF6\X6=](B)#6(þÚ#,%1 -ýR%")$%'lu–, "2W5u"-6XlSB%6-$E:þÂ5@(þ¾,(6$/A$IV>4,@M+wPMONJK*! !.RkH:D, 9&-@NKGa_F3Ze0@Ql+# E !K'ü¯ &%!).©0 %/4," 3/) ")5'þÎ5@'!þ¿,(5$/@$H ?*1LfSuPNOMZZK<$*!&y/H0.#$2Hÿ;†Äiq|%2#"&547&/3254/&5463232654&#"#4&#"#4&#"632#"&547632632632#"&#"326264&"%264&#"&3-61A31C?& 1_`=q=8#G D9C[SA3'3SJ5,E$-< "*5>@NKGa_F3Ze0@Ql+# E !K'2##2#üð &%!).©0 0!>0DD0)4," 3/) ")5'þÎ5@'!þ¿,(5$/@$H ?*1LfSuPNOMZZK<$*!&þÖ"4""4/H0.#$2Hþþ†Äht†‘%2"&547&/3254/&5463232654&#"#4&#"#4&#"632#"&547632632632#"&#"3262654'#2654'#"&'%264&#"&3-@=TzS+( 1_`=q=8#G D9C[SA3'3SJ5,E$-< "*5>@NKGa_F3Ze0@Ql+# E !K'.$ %)92'17üù &%!).©0 6%LBYUA?( 4," 3/) ")5'þÎ5@'!þ¿,(5$/@$H ?*1LfSuPNOMZZK<$*!&þí! X9)$ %5"! %9ò/H0.#$2Oÿ+Áiv%2# $5467!2>54/&546322654&#"#4&#"#4&#"632#"&54632632632#"&#"2654&#"rTXo¶¹bþÙþ˜47*92M[£›\=q=2)CE1EaSA0)4SH4Pa +>+9 /!6XŒrk./Y54/&546322654&#"#4&#"#4&#"632#"&54632632632#"&#"2654&+2654&#"rTXLG 2"4B“ÁþÙþ˜47*92M[£›\=q=2)CE1EaSA0)4SH4Pa +>+9 /!6XŒrk./Y54/&546322654&#"#4&#"#4&#"632#"&54632632632#"&#"2654&'"#2654&'#".=2654&#"rTXs4;U|TЦþÙþ˜47*92M[£›\=q=2)CE1EaSA0)4SH4Pa +>+9 /!6XŒrk./Y/#!íÂDe=9^A¡Å-W=. 6(5 $!-3)þÍ5@( þ¿,*3i_I<<))Ucz˜MM; ["2(<!þj #y:( 5 5' & +7„9$3-$$$Lþ’KÂ>J[g74>32632632'654&#"#4&#"#4&#"632#"&2#"&5462>54.#"2654&#"L$8\:i0/Xj/*SN:A 3)+hK;'3S@2&6SS,¥-> !*E4>LêOfcNL`]? '.  & 5MLýÐ,(*&°%HJ8#OMHJ=Df3U6 A‹Rf-$þÂ3B)þ¾,)5ÉG =*:HjlcOIfcGOhþÊ 7$2H89Nr,#'0-$'.Lÿõ™ÃVb%#"'#".=4&#"#4&#"#4&#"632#"&5476326326323265332654'74&#"326™bIL2+M-7&.%*M7,!,N<.&="'6,<9.:E>BbC:*WS*'M%þ¾,(2"/:*FS>:HlRdRWJKHJ^JrD;*"Cþí3%þ¾,(2"/:*FS>:HlRdRWJKHJ^JrD;*"Cþí3<²#2# ‹+#$.+#%-LþùÃ_k€Œ%2654'7#"&547&'#".=4&#"#4&#"#4&#"632#"&547632632632326532654&+"2>54'#"&'%2654&#"ú2AgyUYU<>R9(+M-7&.%*M7,!,N<.&="'6,<9.:E>BbC:*WS*'M%þ¾,(2"/:*FS>:HlRdRWJKHJ^JrD;*"Cþí3<¦v+'  '3#  "ú+#$.+#%-Qÿ™Áx„#".54632&#"32>7#"'#".'&54#"#4&#"#4&#"632#"&546326326323265332654'2654&#"%(4%@aE =<%mQNF0*8O]+?, '4W%-I"7KRL5- !#M>-'= '5/;:.;D{f]**M]*!K0<M#-MC6Jgû²,!$'Á#JJ+_„h< !*% 9.,!HH", a†ZþÙ2A "þ¾,'4#->%G_1;HgSvœKKHH5WV]F*"CþìnhGlSþŒ%($1.!"1IþÞjÂny#"$&5467!2$7#"'#".'&54#"#4&#"#4&#"632#"&546326326323265332>54.'2654&"ò6BÄþ¢äßþ—Ó+6%0)öÕ$Õ+J+*K"8KQM6-6M>-D^'6&31'9E|e^))M_* K~+;$-MC&7 !# û³+ 4%'Á%A›éz{æ”G`HAV9ÏziW QI"- [†ZþÙ1B!$þ¾,&5qSG==7.fT{–JJGG·NFK+!Cþìn+?3>-- þŒ%($1-"$/IþÞmÂz…#".'!"$&5467!2$7#"'#".'&54#"#4&#"#4&#"632#"&546326326323265332>54.'7264&#"2654&" %; 1!+9Ôþ¶ßþ—Ó+6%0)öÕ$Õ+J+*K"8KQM6-6M>-D^'6&31'9E|e^))M_* K~+;$-MC&7 !# 6Bs !("û­+ 4%'-=0 "+10€{æ”G`HAV9ÏziW QI"- [†ZþÙ1B!$þ¾,&5qSG==7.fT{–JJGG·NFK+!Cþìn+?3>-- %A–þë$0##"%($1-"$/Iþ{nŠ¡¬2#".547!"$&5467!2$7#"'#".'&54#"#4&#"#4&#"632#"&546326326323265332>54.'72654.'2>54&'#".=2654&"Ý)5$$5* +$ ÌþÝßþ—Ó+6%0)öÕ$Õ+J+*K"8KQM6-6M>-D^'6&31'9E|e^))M_* K~+;$-MC&7 !# 6Bµ.:A&0 ("8 +"!, 8ûÝ+ 4%'_ @V? 8#f{æ”G`HAV9ÏziW QI"- [†ZþÙ1B!$þ¾,&5qSG==7.fT{–JJGG·NFK+!Cþìn+?3>-- %Aºþ÷/y+'85 ""  (:s%($1-"$/Kÿ÷ÃÀ_ky2#"'#".'&54#"#4&#"#4&#"632#".54632632632326533265#".5462654&#"2>54&#"G1K)R8`)&V*?JRM5-!-M>-DV'6- 9/$4 {f^))M^* K1<L2M@35Q!8(49?$#!û{!#'À]m+RQ1II"4(a…YþÙ1A'þ¾,&4g]F"3+:G$<;u›JJGG5WV[F7;þé1F]mC>;8FÚ-!:(*6´!%/+#$/MÿIâÀsŠ•%#"&547"#"'#".'&54#"#4&#"#4&#"632#".546326326323265332>7#".54>32'2654&#"2654&#"%2654&#"~'= 00B `)&V#7KRM6,7M>-DV'6&307$5 |e^))M^* K2<L4M@3&8 !:- 1'#3 k##"!3&%û]+ #''B$Šz+#:(+4þ—,´%($1-D1IÿðÀ{ˆ” %#"'53264'#"&547&'#".'&54#"#4&#"#4&#"632#".546326326323265332>5#".54>32'2>54&#"2654&#"%2654&#"t2JdK9,$A)8 -#(7Y%$X#7KQM6, !#M>-EU'6- 8/$5 |e^))N^* K~L$.L?4&8 !9, 1'3Ik $" û‰!"#' H:DSA09X )-/$(CJ!-\…ZþÙ2A "þ¾,'4jZG#3+:H%;<z—JJGG»zF6<þè0H'AA"C"3+5,^l‘€" <(*6þ§ ¥7$1/ $/KÿÅÁ|ˆ”2#"&54>32&#"32>5#"&'#".'&54#"#4&#"#4&#"632#".5463263263232653325#".5462654&#"2654&#"G$4 ,HqLXlDR.WG1Pqq>b;'6_*L&V"8KRM6,7M>-EU'6&307$5 {f]**L^*L2<L 1M@3{5- 9@##" ûz+"#'Á-LO+U€oG(.&% ("%.%!4FA"N("J"- \…ZþÙ3@!$þ¾,'4h\G==2Q%;<vœKKHH5WW[F7<þè2E³,#4*:FÛ- ;(+4µ%(%0/ $/Lþ¼KÂ>s‰74>32632632'654&#"#4&#"#4&#"632#"&2'654&#"#54&#"#54&#"632#"&546326326%2654&#"2654#"L$8\:i0/Xj/*SN:A 3)+hK;'3S@2&6SS,¥-> !*E4>Ll6O`F0' :) ":'*k +./"*2fDE 9E ýC,(*&F-°%HJ8#OMHJ=Df3U6 A‹Rf-$þÂ3B)þ¾,)5ÉG =*:HjsVCm**[6AѶ +ÔÅ+.6)&0G4`U21./C,#'0-$'.þ¶76Lþ½KÂ>|†’74>32632632'654&#"#4&#"#4&#"632#"&2#"&547&#"#54&#"#54&#"3632#"&54>3263262654'2654&#"3254&#"L$8\:i0/Xj/*SN:A 3)+hK;'3S@2&6SS,¥-> !*E4>LICZ5+,6G#.:"("9.#,*!-$),4(:.=0$>;$0j"5B$ý,(*&Ý .°%HJ8#OMHJ=Df3U6 A‹Rf-$þÂ3B)þ¾,)5ÉG =*:HjteM7DE5Q6 Ó¶-ÔÅ"' .:( 3E65N#330.þý#)Q.5I"+G,#'0-$'.þí4LþYYÂ>‘žªµ74>32632632'654&#"#4&#"#4&#"632#"&4>32632632#"'732>54'#"&54>7&#"#54&#"#54&#"632#"&2654'2654&#"3254&#"L$8\:i0/Xj/*SN:A 3)+hK;'3S@2&6SS,¥-> !*E4>Ló&/# ?.">:$(=T";9cD)% (=> 4+&2.4,:)! :.$#2 )!.$)3,W #ý;,(*&¾,°%HJ8#OMHJ=Df3U6 A‹Rf-$þÂ3B)þ¾,)5ÉG =*:Hjþ×+D&3300L U7Oa %5.J#;G7, !,!+Ò¶")ÔÆ"1 .:(4K '-) %$H,#'0-$'.þë(5 Mÿ÷­Á1=HQ>32!4&#"#4&#"632#"&546326322654&#""654&354#"TFÜþ"H5#8SH4Ob +>!2 5?AMŒr 5( 4]?PýÁ$#'"(#é . ¹)sQNú¡F[42þö·3A &þ¾,(5i_I"3+2OeS{— MBþ¯9%2.#=[#9;°ƒ‹%3hEsF–å1MÿA³Á;DOXd>32#"&547!4&#"#4&#"632#"&54632632354#'"654&2654&"%2654&#""TFÜCbC þäH5#8SH4Ob +>!2 5?AMŒr 5( 4]?PQNú¡F” . ¹)z4"!6!üÃ$#'"(#[42þö·-1CD0.3A &þ¾,(5i_I"3+2OeS{— MB^EsF–å1#9;°ƒ‹%3ýü"##2†9%2.#=Mþþ·Á<EP]p|>32##"&547!4&#"#4&#"632#"&54632632354#'"654&2654&#"2654'#"&'%2654&#""TFÜ.8U<=S:þÿH5#8SH4Ob +>!2 5?AMŒr 5( 4]?PQNú¡F” . ¹)m%)92'"/ 0üÄ$#'"(#[42þö· GDWUAJ"3A &þ¾,(5i_I"3+2OeS{— MB^EsF–å1#9;°ƒ‹%3þ "X8*$ $6( &)ð9%2.#=Iÿ\øÄ I%2654'%#!"3!!"&5463!2654&+"#"&5467&#".54632632v*4We5«bHþl?#9ýÇ3>?2j8KgU nSB@P<,0IY*5!>.v_;37F6V3" s;1]=D\.8f_‚'J5,+5kMYlMgGWTF1` `H&^"g+Xx 1A;Dÿ\óÆ S%2654'%#!"3!!"&54>3!2654&+532654&#"#"&5467&#"&54632632r*4Vf6©I>þJ>>4ýÌ0B 0!eH>(-7@C5lU@?Q/:(HZ_!kxX<75dÍ Kx<0Z>EY.8#xBfEA³LþÈ,Ã@co2#".54632.#"32654&#"#".547&#".54763262'654.#"#54#"&546326'2654'{—˦AL4]xD' O;@WZCœx`7nWB)< h)L`_!38DE_6.1 &%  #V)5We(ÃΙµß 2!7FB '/#%.Æœ‰º \zRl,B6}Q rU}>%vB^GGý²' , ;% 'ÀI9oIQo #,GÿøÄNXa2'654&#"#"&5467&#"#4&#"#"&5467&#"&5463263263262654' 2654' l‰,"1Zt]nSB@P:/!3KSL9lSB@P9/+'?% ^!k}]B04;k@1g5-9P*4Xe6ýêT4WeÑh,L3 Bu]{ \{UgfQ9q$B5þë @0-_vn_nRCAO:/!3KSJ;lRCAO9/+'?% ^!kyaA14;k@1g5-9@r…9oBÈV3XeþJ+3We4P*I4+-6h]r \{QkhO;o$B5þë 9O ZzQkhO9q$ /:-€=K’cˆ\[‹q=[‡I7mKPo3FI7oIPo4EGÿÄnw2#!"3!!"&5463!2654.+532654&#"#"&5467&#"#4&#"#"&5467&#"&54632632>3262654'2654',e‰RP-D5ü_"#Zû¦1?@0_JZ$! &%^C7nRCAO90!5ISK:lRCAO71+'?% ^!kyaA14;k@N:5-;}V3XeþJ+3We4ÃN?G))K0E I6),7E:$/ ,B,:\{QkhO9o&D3þë :N ZzQkhO9m( /:-€=K’cˆ\<þtI7oIPo3FI7oIPo4EHÿÁdp|2#"&54632&#"32>54&#"#".5467&#"#4&#"#".5467&#"&5463263263262654'!2654'"pŠ/GbX0Y|GZO0"U"\}%CK6#pV$nUD)< 9/ƒSE9&lUD)< 9/,0I#_!j{]>57Di6$~%48Q*4We(þ)5We(Ážwb•T5,$'+.I‚Ug ]yRl-B69q$ tþë ;J[yRl,B6:o% ,?7„HW”a~[ZþsJ8nJQo #,I9nJQo #,HþÉ<Á$™¥2'654.#"#54#"&546326".54632.#"32>54.#"#".5467&#"#4&#"#".5467&#"&546326326326322654'!2654'ú&%  #"?N5]yC' O;?X<-3Pt; .T6+nUD)< 9/ƒSF8"lWB)< 80*0I#_!j{]>57Di6$~'28LtœÇæ*4We(þ)5We(‹' ,  ;% &¬ 3#7FB '/#*?gj8JhT< \zRl-B6:o% tþë 8MZzRl,B69n' ,?7„HU–a~[ZÖž¯ÕkK7nJQo #,I9nJQo #,Kÿ=Á\fr2# $54732>54&#"#".547&#"#4&#"#".547&#"&54632632>3262654'!2654'1`vT؉þìþ­[%R7ùFˆ’lFeP_K<%5 ZlL<1]N:%5 Z!@TU!_mR8./<]/ B29#2F".KV.þP#-KV#ÀŠi6gmR4Þ¹ytgk£¾/JyNWu ]yPo.C6|Q rþë :IZxSl.C6{Q t?…FW•a~V9þwH6kINm2EI5lHNm "+KþùÁgq~Š2#".547# $54732>54&#"#".547&#"#4&#"#".547&#"&54632632>3262654'2654&#"%2654'1`v]+0F/#2 Úþìþ­[%R7ùFˆ’lFeP_K<%5 ZlL<1]N:%5 Z!@TU!_mR8./<]/ B29#2F".KV.é2"! ýŠ#-KV#ÀŠi‡e B&4B*" AÞ¹ytgk£¾/JyNWu ]yPo-B7|Q rþë :IZxSl.C6{Q t?…FW•a~V9þwH6kINm2E÷## ÕI5lHNm "+Kþ™Áeo}‘2#"&547# $54732>54&#"#".547&#"#4&#"#".547&#"&54632632>3262654'2654&'"2654&'#"&=2654'1`vC?3NU>=Uƒºþìþ­[%R7ùFˆ’lFeP_K<%5 ZlL<1]N:%5 Z!@TU!_mR8./<]/ B29#2F".KV.×  #(:,8+-/)8ý˜#-KV#ÀŠiMŽ4N|UU>!/Þ¹ytgk£¾/JyNWu ]yPo-B7|Q rþë :IZxSl.C6{Q t?…FW•a~V9þwH6kINm2Eÿ   [7+#5588 (:[I5lHNm "+Iÿ÷ÕÃ2<E2!5654&#"#"&5467&#".5463263235462654'"!54&[sý|RfK$nSB?Q:.,L`_!47wb=63Hd~CrýÌ*4We6Æ=L#UÃvbë@lYy ]ySjeR9r# qV}>$wAh†‰ÌIáViþrH9nJQo6CYWEÏŸ[qIÿEÛÃ?HT^2##".547!5654&#"#"&5467&#".546326323546"!54&2654&'#%2654'[s E/ "*!þ=RfK$nSB?Q:.,L`_!47wb=63Hd~Crj=L#U4"ýR*4We6Ãvbë-3A 2!-@lYy ]ySjeR9r# qV}>$wAh†‰ÌIáVi5WEÏŸ[qýû"!!ŠH9nJQo6CIÿßÃ=FSeot2##"&547!5654&#"#"&5467&#".546326323546"!54&2654&#"2654'#"&'%2654'#632[s$.U<=S1þbRfK$nSB?Q:.,L`_!47wb=63Hd~Crj=L#U &&)92'#.7ýY*4We6îÃvbë!@DWW?D"@lYy ]ySjeR9r# qV}>$wAh†‰ÌIáVi5WEÏŸ[qþ"X8*" %5( &8ñH9nJQo6C5MÿØÁ[bn2#".54632&#"3265!5>54.#"#".5467&#"&54632632354>54#"%2654' .J, 4lMAL3x`RG!)M&ZJ6\eýº)*%K1$nUD)< 9/+0I#_!j{]?43Hb&>C¬—‹þ )5We(Á,;7þø#??&!+#Rhh:>G1 ]yRl,B63263262654'H9B-0++iJ>&3S#5+nSB@P9/!Nc_!k*14%:69@gI9þ\T4WeÅ1bA1S6" ?‘Rb,%þÂ&7 ]zRjeR;m&…F|?M‘0O2$!!LNþoG9nJPo5HÿôVÄ[e%#"/3254.'&5463232654&#"#4&#"#"&5467&#"&54632632632#"&#"326322654'VU`O0 *]dHe .9# L =?B[SU@,#nTA@O9/#Mc^ k[<6=CvO?„Qi+$ D M%*7ý%+4Xd4V';5+-/) 04(þÍ?L\{VggP=m$ƒF~?K–gƒ!#^ZI=#,'-EH9nJQo4EHÿcDÀlv%#!"3!!"&5463!2654&#""#"546323254&#"#54&#"#"&5467&#".54632632632#"&#"32636322654'DDNý @#„ü|4>@2Ä6?'  Y3) L (H;AUSW5*$nSA>R:.!Db(7 &FvYB1?>kSE}Ri%*8 ?M 1.ý-+4Xd5^)>)B1()9# Q")&!(-!þþè>6MhGXTF0_ ^J)Z_IYmNLG3) ' K C/ 41**3   r/% B (C4F\SW5*$nSA>R:. 0=))6 &wYB16MhGXTF0_ !I2)Z-D(ZlNL6-& &!n`Ãr|%2#".54>32&#"32654&#"&54>7654&#"#4&#"#".5467&#"&54632632632#"&#"2654'½.C" "8`@2 \O3(M $'ZZ_LM4-*A-9C1E`SY76nVA)< 9/,0I#^ k{^>5;R7i?8D/\;."ýé)6Xd5‡00-2#!!#H74632632632!54.#"#"&5467&#"&%354#'"654&2654'Mwa;87=nJLïþ-*3& % nTB@O80!$Ja^!j RMú¡F@/º+þ*4We6Òh‰ ZZþõ·í)A%]yTigP32&#"3265!54.#"#".5467&#"&546326326354#'"654&2654'ŒEb4r_6OC\I6G&dP54&#""&5467&#"&54632632)6W`0&ÃþúN.MÞ§LxI0wC#!nT‚O9/#!2J!c&jX9:@;kŽ:XŽ5H:oIMs7Cíâ·wi\k™À"7IH&r’\zUhhO;o$0F:‚>K‘k… ­{+X\E-Kþ×¥ÄFPZ#".547#"$54732>54&#""&5467&#"&54632632%2654'264&#"O)-C1"2 P[ÃþúN.MÞ§LxI0wC#!nT‚O9/#!2J!c&jX9:@;kŽþr)6W`0)4""*E ?&1C*! â·wi\k™À"7IH&r’\zUhhO;o$0F:‚>K‘k… ­{H:oIMs7Cþæ"4"Kþ¦ÄFP]r#"&547#"$54732>54&#""&5467&#"&54632632%2654'2654&#"2>54'#"&'3,T=>R ??ÃþúN.MÞ§LxI0wC#!nT‚O9/#!2J!c&jX9:@;kŽþr)6W`0.%C*2'1  /` 6%AZUA# â·wi\k™À"7IH&r’\zUhhO;o$0F:‚>K‘k… ­{š6H:oIMs7Cþäw# $ %5"! &)LþÁ Ã-7_h2'654&#"#"&5467&#"&5463262654'#"&=4&#"#"&5463232654'2654' t5'1VqSnSB@P9/&0H#^!k‚X:84M*5We2J*C4/>,#N6%+6^G:D=?V/:I8NaH:+Z69a"ð#&C6%NOLþ  Ã-\ft}2'654&#"#"&5467&#"&546326"&547&=4&#"#"&5463232654'%2654'2654&'+'2654' t5'1VqSnSB@P9/&0H#^!k‚X:84Ò*.=A^A&9,#N6%+6^G:D=?V/:I8NaH:+Z69a"YH8oIPo4Eþ$"+&¦#&C6%NOLýë Ã-`jxŒ•2'654&#"#"&5467&#"&546326#"&547&=4&#"#"&5463232654'%2654'2654'#"'2654'#"&547'2654' t5'1VqSnSB@P9/&0H#^!k‚X:84Ò*8G$ 4H<8,#N6%+6^G:D=?V/:I8NaH:+Z69a"YH8oIPo4Eþ:   P." ,4 '!ž#&C6%NOGÿöêÃJT%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32%2654'@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7ý_*4W`22iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCH9nJLt6CGÿEêÃVcm%2654'7#".47.=4&#"#4&#"#"&5467&#"&54632632>32264&+%2654'@4Hp ~BB 2! "*?8?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7@4"" ýA*4W`22iM†;H¢u@ I "* 1Da>MRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKC©#2# ‰H9nJLt6CGþûêÃQ^pz%2654'7"&547&=4&#"#4&#"#"&5467&#"&54632632>322654&'"#2654'#"&'%2654'@4Hp ~VTTzS5_?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7. 'C,65$"..ýV*4W`22iM†;H¢‡>]AZUAH''€MRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCŸ "v9)" (2) @úH9nJLt6CHÿóÁw%4&'7#".54632&#"32>5#".=4&54.#"#4&#"#".5467&#"&54632632>3232>2654'ÆE5 ‡#8MgB>P6x`rC8b&WZ$In?' .Z&9 ).LSE9&lUD)< 9/-0I#_!j{]>57Di6=1&=$ $)?üµ)5W`3â:l!i‘>_\C9# *#/A;!:&9/W %,6>þë ;J[yQr/D7=m$ ,?7„HW™a~[#, )83B6-*=4›I9nJLt4FHþÈÁ"’œ2'654.#"#54#"&546326".54632.#"32654'#"&'254&#"#4&#"#".5467&#"&54632632>3232654'72654'Ó&%  #DN5]xD' P;?XXAy¢.RDY<(.LSE9$lXA)< 80,0I#_!j{]>57Di6X%*7+ ,8Bp (;,DaXý)5W`3‹% , ;% &­ 2!7FB '/#%.†n(g?QZL6>þë ;J[yTo/D7>l$ ,?7„HW™a~[2) ?,\). gL‹<Ojp=^ŽR3lI9nJLt4FGÿöØà U^h2!535462654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32"!54&2654'\uýÙ‘pþŽ4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7 @P#Qû*4W`2Âzbæ"âWgþpiM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKC]YFιRbþ¦H9nJLt6CGÿEãÃbkv€2##".547!535462654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32"!54&2654'#%2654'\uD0 "*þ™‘pþŽ4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7 @P#Q"/-#û%*4W`2Âzbæ,3A 2!,"âWgþpiM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKC]YFιRbýú"0 1!¬H9nJLt6CGÿçÃ_hsˆ’2#"&547!535462654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32"!54&2654&"2>54'#"&'%2654'\u-TzS0þ»‘pþŽ4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7 @P#Q&%&%*2'1 /ûK*4W`2Âzbæ"AAZUAB&"âWgþpiM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKC]YFιRbþ X# " %5"! &)óH9nJLt6CGÿØÃ%pyƒ2##"&54>32&#"3265!535462654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32"!54&2654'#AD)ÿ_6OC\I6G&dPl$1G=}?Mg‰ [ hUEKC]YFιaSþ¦H9nJLt6CGþºêÃJpz%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>322'654&#"#54&#"&546326%2654'@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7K6H)?(. 9'(1KUJ;7&%ýG*4W`22iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCHWB$-) *Z+Fѵ&!A0\#/gAZ10KH9nJLt6CGþ»êÃJnx‚%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>322#"&547&#"#54#"&5463262654'2654'@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7+CZ6+*7D+97'4MYJ86%/k 6B$ý*4W`22iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCHiJ7EC7S5 ѵHB4Z!-hAZ0/þü)"O.4E$+OH9nJLt6CGþXêÃJ†’œ%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>324>32632#"'732>54'#"&5467&#"#54#"&2654'2654'@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7þŒ 0%5&,;R0<9bH&& (: ; 6+&2>+=",98  NZx"$%ýq*4W`22iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCâ.B 0.KT2Kf ':0P&32354&'4#"62654'À9T‘þâ€4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7a&¡-/*2,Amý0*4W`2Òc]°xliM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKC®).gM<$6TOH9nJLt6CGþ êÃJTfqxƒ%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32%2654'4632##"&547#7354&'4#"62654'#@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7ý_*4W`2b9T‘&C-/A&o½$$'¡..*2,Am.&11%2iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCH9nJLt6Cþùc]°x`@A/0¾?$#gN;$6TNç$2 2$GýëëÃJTiu|†šœ%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32%2654'4632##"&547#7354&'4#"62654&"2>4'#"&5477#@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7ý_*4W`2p9T‘*3 4"4H3c½&¡..*2,Am& %()'"0& 2iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCH9nJLt6Cþùc]°x"> $,G4>"¾).gN;$6TOÁ $P '< ,4 '!/§Gþ,êÃJTs~ˆ%2654'7#"&=4&#"#4&#"#"&5467&#"&54632632>32%2654'432#".54632&#"326=#7354&#'"654&@4Hp ~bRES?) #*SJ4%lSBAO80%0I$_!k}]:81Jb=#6I[7ý_*4W`2j’CV37H7C;7N<(ó¼#$(¦30,_ t 2iM†;H¢c~`QMRF 2!þë :K[ySjhO>l$1G=}?Mg‰ [ hUEKCH9nJLt6C㢱€JM6:¾ >%$bQA (1tS[!QÿHìÁ q%2654'#".5473267#"'.'&#"#4&#"#".547&#"&54632632>3232>54'ß#.KR+À151Z{¶o‘ÜPi%^ 1Qj™\—ÀbZ  09M<0]K=%5 Z!4aY$_jU9,1;\/ A3AR3 "&c7H6lHLo2EŠ2j9&,UXJ:!2Noi=speo =E:8&/DL$j=5þë :IZxRm-C6{Q eN€KW•^V8fN WK$H0ˆ?QþþñÁq}‡#"&547#".5473267#"'.'&#"#4&#"#".547&#"&54632632>3232>54'72654&#"%2654'—%5*" 2D‘Í‘ÜPi%^ 1Qj™\—ÀbZ  09M<0]K=%5 Z!4aY$_jU9,1;\/ A3AR3 "&c$15Š2""  ý #.KR+=-"3 D2 =2Noi=speo =E:8&/DL$j=5þë :IZxRm-C6{Q eN€KW•^V8fN WK$H0ˆ?2j9&ƒþ!! 6ÑH6lHLo2EQþ˜ðÁp{“"&547#".5473267#"'.'&#"#4&#"#".547&#"&54632632>3232>54'72654&'"2654&'#".=2654'j(/!U|T„±‘ÜPi%^ 1Qj™\—ÀbZ  09M<0]K=%5 Z!4aY$_jU9,1;\/ A3AR3 "&c$15ž!"G("8&$ $'#ý#.KR+C<&=VU>("-2Noi=speo =E:8&/DL$j=5þë :IZxRm-C6{Q eN€KW•^V8fN WK$H0ˆ?2j9&¤ì%.[02 75' & *\H6lHLo2EYÿB%Á#12##".547!3354>54#"2>54&#"T9T*!A3+9 ýüTÛ&?CΗŒÖ# Á)DE$ë,1C20,¹þjá6N'þbŸÇ˜Î "+Yÿ"Á$1C2##"&547!3354>54#"2654&#"2654'#"&'T9T*)- >*?Q/þ)TÛ&?CΗŒ¨&%%+74&0 8Á)DE$ë&?-7&V?B(¹þjá6N'þbŸÇ˜Î‹W:'" %5# )8MþºÝ :2!33546"!54&2'654&#"#54&#"&546326 \uýqT¥ps@P#R 6H'$?(.!9"(1KUJ;7&$Âycæ¹þiâWg3YFιSaþ[WB,F *Z+Fѵ 'A0\#.hAZ10Mþ»Ü 09C2!335462#"&547&#"#54#"&546326"!54&2654' \uýqT¥p‰CZ5,*7D *97'4MYK74'-%@P#R6B#Âycæ¹þiâWgþ(iJ7ED6R6 ѵHC3Z!-hAZ0/¥YFιSaýW)"O.4E#,MþXæ Q\2!33546"!54&4>32632#"'732>54'#"&5467&#"#54#"&2654' \uýqT¥ps@P#Rþ@ 0& 4'+",98  NZx/)Âycæ¹þiâWg3YFιSaýÁ.B 0.KS2Ih ':0P&J^`2!33546"!54&4632##"&547#7354&'4#"62654&#"2654'#"&5477# \uýqT¥ps@P#R®9T‘*3$ 4H3c½&¡..*2,AmL4)'"V Âycæ¹þiâWg3YFιSaýŸc]°x">.G4>"¾*-gN;$6TNÀ P." ,4 '!xMþ,ß 7BK2!33546"!54&4>32#".54632&#"326=#7354&#'"654& \uýqT¥ps@P#Rª,-’CV37H7C;7N<(ó¼$%&¦+8,_(t Âycæ¹þiâWg3YFιSaýÃ1D ±€KL5;¾@&"bHJ!5?tS[!Mÿ=íÁ3;2#"&547&/32654&+532654&#"&546264&"23K"KO5>A31C-1;G4+*4==2M](“4""4"Á .% @K:* G0DD0#7)"'2,)"$/yfO` rL{’ýÀ"4""4MþöçÁ1>RX2"&547/32654&+532654&#"&5462654&+"2654'#"&'7"#6323K"KOJMTzS3 -1;G4+*4==2M](|"%+75$1*Á .% @KJ(!XBYW?F(7)"'2,)"$/yfO` rL{’ýÍX9)" '3"!  "½MÿFö¿:%#"&54632&#"32654&+532654&#"&54>32{54.#"&54>32'2'654&#"#465654#"&546326UqtYq?% U+IDS32á:F'K+$M*?B4554A?299/:<0>i&,GJ&I_T/-Q(*X'1?!#!("/$"+/,"!0orIf {CKn9H5H A(T3Mþ‡ãÁBM%#"&547&/32654&+532654&+532654&#"&54>322654&"(*02A31C0$M*?B4554A?299/:<0>i&,GJ&I_T/-q+#2#$30#=0DD0' ?!#!("/$"+/,"!0orIf {CKn9H5H A(Tþ¯""!MþEäÁAOb%"&547&/32654&+532654&+532654&#"&54>322654'+2654'#"&'(*>AR~Q2$M*?B4554A?299/:<0>i&,GJ&I_T/-›, )"G3&1 +'39#QAZW?F' ?!#!("/$"+/,"!0orIf {CKn9H5H A(TþÁ&  %X02  &4"! $. KÿîÁH%#".54632&#"32654#523254&#"53254&"&54>32„,/P_h8C/mO9K$&7pL$RHÏ „DT ‹;V@ & .N217&ã 7!d@>M!&"A+N'W1%#P#++FI&If {C$EJ6# 0 GMþŒõÁIn#".54632.#"32654&+53254&+57654&#"&54>322'654#"#465654#"&546326õ”s.:(]EZ1 A$/@A2UjaM03 …KL8`C-+@ & .N2:pA-.P\æ l‡ 3"8EB #0"&-hM@N*W3"# A!-+FI&If {C$EJ6#A3G# 7!d®" %#  .% $Iÿó‚ÂN#"'#"&54>54++53264&#"&546323265332654.'÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4IÿF‚ÂYd#".547&'#"&54>54++53264&#"&546323265332654.'264&+÷+< GDD0 "*J0mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$2##ÁAG7r> J3A 2!  @40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ýá"4" !Iþú‚ÂVbv"&547&'#"&54>54++53264&#"&546323265332654.'2654&#"2654'#"&'÷+< \[S|R0;(mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$%%$,65$".*ÁAG7ƒ=aCXV@B)540#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ýéX:(  '3(  "Iÿ„Âm#".54632&#"3267#"'#"&54>54++53264&#"&546323265332654.'÷.=Q8WEB3:6`‰rt:]X;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$ÁDK1-%LgX* *% %uŽOM40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4IþÇšÂd‡%2654'7#".54632.#"3265#"'#"&54?654#"532654&#"&54632326532'654.#"#54#"&546326Ð?Ox™2KPDN6]zB' O;?XY?‡>_X;lLF=(I(K-+01'HY({f>R?/ #'NE^S6@&%  #"4fM39þã8msU7 2"7FB '/F1¹™OM30/ !#,#!(‚_Mb oOt™@0< $  1#Cþë1?¿% , ;% %Iþº‚ÂNs#"'#"&54>54++53264&#"&546323265332654.'2'654&#"#54&#"&546326÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$6H -%?(. 9'(1KUK:7&%ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4þAWB1>*Z+Fѵ&!A0\#/gCX10Iþ»‚ÂNr|#"'#"&54>54++53264&#"&546323265332654.'2#"&547&#"#54#"&5463262654'÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$CZ6+*7D+97'4MYK74'-m6B$ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4þAgL7ED6R6 ѵHD2Z!-hAZ0/þü)"O.4E$+IþX†ÂN‹–#"'#"&54>54++53264&#"&546323265332654.'4>32632#"'732>54'#"&5467&#"#54#"&264'÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$þn 0& 4'++>",98  NZx"$%%ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ý§.B 0.KT2Kf '0# P&;L9.3A,"˶H 2!Y#-(\ +'!IþÆ‚ÂNVbi#"'#"&54>54++53264&#"&546323265332654.'4632!7354&'4#"6÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$€9T‘þâ½&¡-/*2,AmÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ý…c]°x¾).gM<$6TNIþ ÂN`ls~#"'#"&54>54++53264&#"&546323265332654.'4632##"&547#7354&'4#"62654'#÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$v9T‘&C-/A&o½&¡..*2,Am.&11$ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ý…c]°x`@A/1¾*-gN;$6TOè$2 2&IýëÂNdpwƒ—™#"'#"&54>54++53264&#"&546323265332654.'4632##"&547#7354&'4#"62654&#"2654'#"&5477#÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$v9T‘*3$ 4H3c½&¡..*2,AmL4)'"V ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ý…c]°x">.G4>"¾*-gN;$6TOÁ P." ,4 '!xIþ,ƒÂNp{„#"'#"&54>54++53264&#"&546323265332654.'4>32#".54632&#"326=#7354&#'"654&÷+< oSX;mLF=0906++/0(HY(}d>R? N6NXKS8+:J 3$x,-’CV37H7C;7N9+ó¼$%&¦+8,_(t ÁAG7c}M40#"!, B(|eMb qMx•>2< !J <Cþë2>fM/;4ý©1D ±€KL1?¾@&"bHJ!5?tS[!Jÿ? Á^#"$547327#"'#"54?654+53254&#"&54>323265332654&'§9@þýËéþáVQÖ¹‘)h bJ:iJþê Ám{#"&5465#"$547327#"'#"54?654+53254&#"&54>323265332654&'2654&#"§9@\,/ 2"3Cg|éþáVQÖ¹‘)h bJ:iý’" "Jþ… Áoy#"&547#"$547327#"'#"54?654+53254&#"&54>323265332654&'72654&'2654&'#"&=š(/!7#=USféþáVQÖ¹‘)h bJ:i"%ˆH³ö #.y9)%358&( +7Jÿ<hÁ3"&546732654&+532654&#"&54>32yˆ§ .sVK>3551?:@N`"( !3T6Rg[^AEÄÚ¹Ni;\x¡Ê]9;P0E&'@`t; @~&FH5!U>Q*7fU?EJþ™hÁ=K2#"&547#"&546732654&+532654&#"&54>2654&+¬Rg[^JGA31C  ˆ§ .sVK>3551?:@N`"( !3T{ "$ÀU>Q*7f\AO0DD0Ú¹Ni;\x¡Ê]9;P0E&'@`t; @~&FH5!ý+#!JþJiÁ;FY2#"&547.546732654&+532654&#"&54>2654&#"2654'#"&'¬Rg[^bcS>?Q!‚ .sVK>3551?:@N`"( !3T=.%C)95$1*(ÀU>Q*7fmBfAZW?6'Ú±Ni;\x¡Ê]9;P0E&'@`t; @~&FH5!ý""w6," '3"! $. MÿEçÀ:B%#".547&'#"'&54>732>5332654.'7264&"›2E/ "*H48PJ9; <*#*0B9(,S2*9M0"&,ˆ4""4"& 7-3A 2! EM@Dc4F?o732>5332654.'2654&+#2654'#"&'a&,\\T=>R06'8PJ9; <*#*0B9(,S2*9M0"%&%+75$1*À 6R0ˆAbBYV@D'4M@Dc4F?o5#"'#"'&54>73265332>54'7®Oy}Lc:4SjS"*MJ-7NX57PK9; >.",2I;'4S1!,3#j/<:agè4&!"%1aC9KL?Db2IBn>Ob.!Cþì>4%K1@$Xb3'i—N"MþÈÀKp".54632.#"32>7#"'#"'&54>732>5332654.'7'2'654.#"#54#"&546326©@N6]xD' O;?XN9Kp>)]CV98PU63 <*#ZC8)*S2*:L0"OX.G`[&%  #"þÈ 2!7FB '0"%05Ls[97MMMKCY4E@BˆOb + :þì3?hP+94Îw\’X9­% ,  ;% &MþºáÀ.S#"'#"'&54>732>5332654.'2'654&#"#54&#"&546326a&,nQV98PJ9; <*#*0B9(,S2*9M0"6H'$?(.!9"(1KUJ;7&$À 6R0g‚MM@Dc4F?o732>5332654.'2#"&547&#"#54#"&5463262654'a&,nQV98PJ9; <*#*0B9(,S2*9M0"CZ5,*7D *97'4MYK74'-m6B#À 6R0g‚MM@Dc4F?o732>5332654.'4>32632#"'732>54'#"&5467&#"#54#"&2654'a&,nQV98PJ9; <*#*0B9(,S2*9M0"þe 0& 4'+",98  NZx/)À 6R0g‚MM@Dc4F?o732>5332654.'4632!7354&'4#"6a&,nQV98PJ9; <*#*0B9(,S2*9M0"‰9T‘þâ½&¡..*2,AmÀ 6R0g‚MM@Dc4F?o732>5332654.'4632##"&547#7354&'4#"62654'#a&,nQV98PJ9; <*#*0B9(,S2*9M0"9T‘&C-1?&o½&¡-/*2,Am.&11%À 6R0g‚MM@Dc4F?o732>5332654.'4632##"&547#7354&'4#"62654&#"2654'#"&5477#a&,nQV98PJ9; <*#*0B9(,S2*9M0"9T‘*3$ 4H3c½&¡-/*2,Am.0&4)'"0& À 6R0g‚MM@Dc4F?o.G4>"¾).gM<$6TNÀ o." ,4 '!/§Mþ,áÀ.P[d#"'#"'&54>732>5332654.'4>32#".54632&#"326=#7354&#'"654&a&,nQV98PJ9; <*#*0B9(,S2*9M0"…,-’CV37H7C;7N<(ó¼$%&¦+8,_(t À 6R0g‚MM@Dc4F?o73265332654&'7áµåJ"EÈ›«z'%Z05QSm 4),gG:'5SQAOA'|ã¸ç¦ƒhZsÍ„KJ…a3U5 @‘Oe+#Cþìr`IQel¬ÐGþápÀEQ#".5465#"&547327#"'#"&54>73265332654&'72>54&"%7 2!"2 OYµåJ"EÈ›«z'%Z05QSm 4),gG:'5SQAOA'|‹.!6!9>- "*+!   禃hZsÍ„KJ…a3U5 @‘Oe+#Cþìr`IQel˜þù $$ Gþ†pÀBM_%4&'7#"&547#"&547327#"'#"&54>7326533262654&"2654'#"&'@A'|~#,U<@P >9µåJ"EÈ›«z'%Z05QSm 4),gG:'5SQAOr&%&%+72'#//ÛQelµi 7%DWW? 禃hZsÍ„KJ…a3U5 @‘Oe+#Cþìr`þŒX9)" $6) @Jÿø%Ã+6"&5467&#"#4&#".54632632'2654&'“AQ:0/3@S5!

7&#"#4&#".54>326322654'"­q:7&)_=8aPB9J E1'a6CS5!5*. 2#): "/;*P;@\)9:[WþØ'-(1"/mn*QJ_€-:ZsVF2?.F3)þË=304R,:5>D38X0 JH1$„JMÿøÄ?%#".54732&#"32654&#"#4&#".54>32632ø«Œ=I3ËSJ&;KpI6m„bM&1S5"3+.3%(."/;*P:ˆ¥%J2/?S6-=L 6.)7pXU:EV4R1 Ðx&% #"þÊ 3"7FB '/#"1Ä¡7db;-$þÂ3326326~$:Wf6¼e‹q1WlN!$mSB@O80/3BS3" *#4%*: !/9+Q;>Y9/;5=DmKPp5DŽ‹mŠJEmS‘[{RkgP=m$-%þÂ=3 &D+):5?E37W0 JJ GÿeôÄJT%#!"3!!"&5463!2654&#"#"&5467&#"#54&#".546326326322654'ôrTý‚6@üÀ72;.KL\hR!mSA?Q,<14@S5!6ME1'/lNR9BW4243!2654&+532654&#"#"&5467&#"#54&#".546326326322654'üN@ýB6Füº/: -‹E:"#Wj"mSA?Q,<12BS5!5NE1;KlNR9BW424FHe0!=þx*4Wf7p4@)@0' #3 9,'@= MgGWUE'`%%þõè2+TB?W eGVk=<.-#+8;1]=B^-9HÿÂPZ%#".54632&#"32654&#"#"&5467&#"#4&#".546326326322654'Å£!Y\{[YK+Z~[$z–p]#mSB@O803*GS3" *#4%*: sPQ;:X#J6Euþk$:Wf6 Õ $!+'½‹v– [{SjgP=m$&+þÂ=3 &D+):5?E3eƒJI­ß=DmKPp5DHþÉ'Â_ƒ".54632.#"32>54.#"#"&5467&#"#4&#".54>32632632'2'654&#"#54#"&546326'2654'¿>N4]zB' N<@W%8,?c;' 0V7"mQD@O8012?S4!)< 2$*: &S9Q;:X'F8C|š3O!&% #"^*4Wf4þÉ 3#7FB (/#$+CZT+LgS; [{QliN=m$,%þÂ=3-A6-93?E3DS9JIÓ›5fkQ3¬% , ;% %ÀG:nJPp3FJÿCœÂIS".54732$54&#"#"&5467&#"#4&#".54632632632'2654'yžü•Z!Q"ÝÐ rR mSB@O80.4@S5!5*.)"*: sPQ;D3eƒJJŠl²×òG:mKPp4EJþÿœÂZdqu2#".5465#".54732$54&#"#"&5467&#"#4&#".5463263262654'2654.#"'6£qˆ]$5 2! "*Š®žü•Z!Q"ÝÐ rR mTA@O80.4@S5!5*.)"*: sPQ;" "!Šl†b<- "* 1" ?`»zxpbh¡Å±][{UhfQ=m$.$þÂ=305R*F,>D3eƒJJþsG:mKPp4Eò$#$qJþ¤œÂV`k}2"&547#".54732$54&#"#"&5467&#"#4&#".5463263262654'2654&"2654'#"&'£qˆ€$,TzS {žü•Z!Q"ÝÐ rR mTA@O80.4@S5!5*.)"*: sPQ;D3eƒJJþsG:mKPp4EùX:(" (2"! @Hÿ÷ÚÃ?"!54&'2!5>54&#"#4&#".546326323546!=L"TZ]qýO,2N6&3S3" *#4%*: sPQ;8NRl\ÆrŽWEÏŸ]o5vbë*x54&#"#4&#".546326323546"!54&2>54&" ]qC1"2 þ ,2N6&3S3" *#4%*: sPQ;8NRl\Ærj=L"T #2#Ãvbë,1C+! +*x54&#"#4&#".546326323546"!54&2654&"2654'#"&' ]q.TzS1þ0,2N6&3S3" *#4%*: sPQ;8NRl\Ærj=L"T&%&%+74%"./Ãvbë"‚ZUAC%*x32&#"325!5654&#"#4&#"&54632632354>54#"$:S*„…54&#"#4&#".5463263235462'654&#"#54#"&546326"!54& H†ÃŽBL3}_xD' Q;,A ZCv•ýŒ,2N6&3S3" *#4%*: sPQ;8NRl\Ær&% #~=L"TÃy_ÿ{© 2!6GB (%.št*xP 3#): lWP;7ÂJ79#"I:J :.&(2,*$,+#þ¿<3hM,;5?E3c†JHIÿ;ÞÄDL2#"&547&/32654&+532654&#"#4&#".546326264&"0GaCI:9A31C -*3?3%(7/:0/@S2">P 3#): lWP;7‚2##2#ÂJ79#"IC$!C0DD0* :.&(2,*$,+#þ¿<3hM,;5?E3c†JHý½"4""4IþùìÄDPe2#"&547"/32654&+532654&#"#4&#".5463262654&#"2>54'#"&'0GaCIBPU<>R4 -*3?3%(7/:0/@S2">P 3#): lWP;7%:*5$"/ÂJ79#"IH$!YDWV@G':.&(2,*$,+#þ¿<3hM,;5?E3c†JHýÏ"X$ " '3(  "IÿÂM%#"&54>32&#"32654.+532654&#"#4&#".54632632C‹eJŽ)CD#n?'3RzB1|„ :)""9DH:3DS2"=Q3%): mVP;9oOiS:( +KL,(  &Wq%'4;/2>.!þ¿=3gO*<5?D3c†JHNAL<*COÿ?‚ÂH2#"$54732>54.+532654&#"#4&#".546326ÅReTZ.G`Y-Êþò[&Yï·Rs7*# 221>C71@S3!U"@T5T3! ܯ‰ma}’Á 53$5 78()2+"þ¿<4hO*;4@E3c„JGOþ¯‚ÂPb2#"&547#"$54732>54.+532654&#"#4&#".5463262654.#"#ÅReTZGGB21C;?Êþò[&Yï·Rs7*# 221>C71@S3!U"@T_:N/ED0 ܯ‰ma}’Á 53$5 78()2+"þ¿<4hO*;4@E3c„JGý4##Oþa‚ÂP\p2#"&547#"$54732>54.+532654&#"#4&#".5463262654&'2>54'#"&'ÅReTZa`S>=S!-Êþò[&Yï·Rs7*# 221>C71@S3!U"@To=dCXW?+!ܯ‰ma}’Á 53$5 78()2+"þ¿<4hO*;4@E3c„JGý:X+'  &4$ $. IÿõîÂH#"'#"&=4&#"#4&#".546326323265332654.'h*: nST:-\BWA-)32&#"32>5#"'#"&'&54#"#4&#".546326323265332>ÂD2‘.E_R,Ya_YkQ>\&YV)4\V33fd)2T?Ps)8S,#+@ v>HnTf'(b.D".:(6S%*,? æ8m`õR~G, %6$ & 9nLWJJW:TŸ.#þÂ0@,@3pP(zD`„II*?2/[b+$Cþì+F,A3Lÿ3õÃ\#".547! 7#"'#".=4&#"#4&#"&54632632326533254.'~9>Q|Ï„mµ~a9$ ,')UPp*U+'K)3#9'* M+2IhwdKC5*I,7&2) .M!€/#Á%ŒI8inQ4 4LO]Q*i]R[þw” =H ?+eUJ"" þÂ;2dMƒ8L—]ŽHF"K4k7A*">þì,1£-?9LþêõÃhs#"&5465#".547! 7#"'#".=4&#"#4&#"&54632632326533254.'2654&#"~9>]$5 1!4BŠÆmµ~a9$ ,')UPp*U+'K)3#9'* M+2IhwdKC5*I,7&2) .M!€/#2"",Á%ŒI“b>, "+F0 = 4LO]Q*i]R[þw” =H ?+eUJ"" þÂ;2dMƒ8L—]ŽHF"K4k7A*">þì,1£-?9ýŒ!!Lþ‡õÃhrˆ#"&547#".547! 7#"'#".=4&#"#4&#"&54632632326533254.'2654&'2654&'#".=~9>‡1S7#=U¦mµ~a9$ ,')UPp*U+'K)3#9'* M+2IhwdKC5*I,7&2) .M!€/#", :A)9-8'#!, ;Á%ŒI²iN@ ,#V=$"- 4LO]Q*i]R[þw” =H ?+eUJ"" þÂ;2dMƒ8L—]ŽHF"K4k7A*">þì,1£-?9ý€ #/y9)%35& "  +7IÿöþÄ62'654&#"#4&#"#4&#".546326326?Rm!3,'kK=&3SC2(2S2">P3B*: oTR:4^Y69Ça3V5=’Ne,$þÂ4A)"þÂ;4hL2p?E4e…ONIIHÿôF D%2654&'"&5467&#"#4&#"#4&#".54632632632¤(0/$h98AP91/,GSB3'3S2">P3%*; pSS:6\Y6EY`FIR4?68kQl5E=gQ:p&'-þÂ5A*"þÂ=3iM);5@D3e…NNJJLOoTmIÿaÊ U%3254'#"'7327654&'#"&5467&#"#4&#"#4&#".54632632632R,#W8Rxq;7')^=89-RB;F`>.VA9SB3'3S2">P3%*: lVS:6\Y6AVtQ[Z¤2r׋``YOx¾hØžOc2þÂ5@.þÂ1?gJ:k(|E`„MMIIýp$0#""Fþ…“ÁP_v2#".547#"$&54732654&#"#4&#"#4&#".5463263262654.'2>54&'#".=ÒWjKA(1"U>*4$ l€£þø›-)+ò’ÆûK=2,SA12+S-"?UB3=JoSg'.Xm.'{ " $-8+-!+ 9Á‚gT 9=(>U ?,")r׋``YOx¾hØžOc2þÂ5@.þÂ1?gJ:k(|E`„MMIIýb [*%358"  )9Iÿõ-Ä(02!4&#".546326354#4&#"6O(HE)þ+3!=Q3%*: pTU6DÂRMû¢FH, iµÄ8oM·<4gO*;5@E3e„TV£EuD–å1<%3½©ƒIÿB2Ä*3;F2##"&547!4&#".546326354#4&#"62654&#"O(HE)B21Cþï3!=Q3%*: pTU6DÂRMû¢FH, iµI>* Ä8oM·,/ED0,<4gO*;5@E3e„TV£EuD–å1<%3½©ƒþà*+Iÿ6Ä*3;GY2##"&547#4&#".546326354#4&#"62654&#"2654'#"&'O(HE)%.T=?Q1î3!=Q3%*: pTU6DÂRMû¢FH, iµA&%&)92'1 7Ä8oM·"ABYW?C%<4gO*;5@E3e„TV£EuD–å1<%3½©ƒþô"X8*" %5 # %9Mÿ1Á2;C746323632#".54632&#"326=!4&#"&%354#4&#"6MnTl!2‚Ü€‹AM5…bXJ 6G+ac(vQþ_,#A+(v‡UNQú¡FH*"iµÝ`„SSþö·Ša ",^`0@92FmU^ÏFoI–å1<$4½©ƒJÿ%ÃÁ9CK2#".546732>5!4&#"&5463236354+4&#"6è7=,Otd#b¤qX4 (.*ZCg‹„DThGþc.!?Uu…oRm!4ÍPNöœFG,!i¶Á #9bAÙ3N&2HLYK(Ff>gpV‡R4 E.0@gJwK^Š`„SS FqG–å0=%3½©ƒJþÅÁDNVb2#"&547#".546732>5!4&#"&5463236354+4&#"62654&#"è7=,AC 2"4B 82b¤qX4 (.*ZCg‹„DThGþc.!?Uu…oRm!4ÍPNöœFG,!i¶b "$+Á #9bAÙ>0K #*F0 2HLYK(Ff>gpV‡R4 E.0@gJwK^Š`„SS FqG–å0=%3½©ƒþ1$"! Jþ?ÆÁCMU`u"&547#".546732>5!4&#"&546323632354+4&#"6264&'2654&'#".=b')U|T'b¤qX4 (.*ZCg‹„DThGþc.!?Uu…oRm!47=,PNöœFG,!i¶ .P:'#8'#!+ £@*=VU>2'2HLYK(Ff>gpV‡R4 E.0@gJwK^Š`„SS #9bAÙN‘FqG–å0=%3½©ƒþ7,y8* 5 6& "  +IÿFrÃ3"&54732654&#"#4&#"&54>32632õµ÷A$:Ù ®PA&3S3!+3#v…!/:*P;:KSnѺâ²gVj™Ç°‹Yw,%þÂ<4%K0‘1C¦6V0 JK“u¨ÍIþÒrÃ?K2#"&547#"&54732654&#"#4&#"&54>3262654&#"±Sn^+0F/0FELµ÷A$:Ù ®PA&3S3!+3#v…!/:*P;:y4!! Óu™h A'4BB4â²gVj™Ç°‹Yw,%þÂ<4%K0‘1C¦6V0 JKýV## 2IþsrÃBNd2#".547#"&54732654&#"#4&#"&54>3262654.'"2654&'#"&=±SnD=1MU>+> 45µ÷A$:Ù ®PA&3S3!+3#v…!/:*P;:P.+A)9("8&/)9ÓuV™4O<=V$5*(# â²gVj™Ç°‹Yw,%þÂ<4%K0‘1C¦6V0 JKýNz9)858 )9Mþ¼[6NY#"'&547&#"#4&#"&54632632654&#"'6322'654&#"&5472654'«)4U?5&"sF*4S,#A+(v†pRh%1UC+1#3!*ai—|L+A7+-8H [ƒ'/8#D)—!w54'#"&547'«)4U?5&"sF*4S,#A+(v†pRh%1UC+1#3!*ai>9II98J-A7+-8H [V?>LL'/8#D)@.+,"*#$—!w32&#"32>5!5654&#"&546ù3J"&>Oê?O6)BC"K?-Dv:D13þJH071A5Dd*(:07,–þ7Ô '&P9-R&?@5C#3XK\KþÈ ¹<\2!33#".54632.#"326=!5654&#"&5462'654&#"#54#"&546326ù)A$&8TÅBL3}_zB'T9,A WFhþQH071@4Dc8&% #")'1# 7,—þG{© 2!6GB )$/h -M&?A5B$5WK\þL' ;;% %Kþ¾ ¹>2!3!5654&#"&5464632&#";2#"'73254+"&ù)A$&8TýýH071@4DcU:DU/$C#6-?70N1V,&KS>@(/)'1# 7,—þG -M&?A5B$5WK\þb&;0%&05./&5(,Kþ ¹GR2!3!5654&#"&5464632&#";2#"&547&'73254+"&264&#"ù)A$&8TýýH071@4DcU:DU/$C#6-?7098B./A,1&KS>@(/#!$%)'1# 7,—þG -M&?A5B$5WK\þb&;0%&0=>1??16 &5(,þØ-&-&$Kýë ¹IVj2!3!5654&#"&5462#"&547&'73254+"&54632&#"32654'#"'2654'#"&547ù)A$&8TýýH071@4Dcï70;=-# 4H7,&KS>@(/:DU/$C#6-  %533/)'1# 7,—þG -M&?A5B$5WK\þE0>!D$5 G4?"&5(,%&;0%&ÿP." '"#& '".Kþ¾¹FP2!3!5654&#"&5462'654&#""&547&#"&5463262654'ù)A$&8TýýH071@4DcÂL_Q$:H7F8V5C. ?HU;'$#3&8A")'1# 7,—þG -M&?A5B$5WK\þÆaFZ0 .H=S=O7FD6P6 .'R* 3`EYþû',F04G#+KþW¹U_2!3!5654&#"&5462#!"3!!"&546;2654&+""&547&#"&5463262654'ù)A$&8TýýH071@4DcÍITB0þø((vþŠ"**"í$1C7  G9T6B/:AIO>(!"2!7A")'1# 7,—þG -M&?A5B$5WK\þÄUFAT3$$D3:F2D099-F+?.F 'P;OÜ&:),;$KþX¹^h2!3!5654&#"&5464632632#!"3!!"&546;254&+532654#""&547&#"&72654'ù)A$&8TýýH071@4Dc¨P:+!$@ˆ./*0þá''sþ ,#)êWL-E8V5C/:@HÅ!7B")'1# 7,—þG -M&?A5B$5WK\þB;IS$.#73%0;!: 1C/::-?/>/G %&9)-9$Kþ-¹Wa2!3!5654&#"&5462#"&54632&#"32654&#"#".547&#"&54>3262654'ù)A$&8TýýH071@4Dc¸Q`j@LO=?6$9QQOaG< F7.$. C1>?H&7-$/#8@*)'1# 7,—þG -M&?A5B$5WK\þÄvYj‡0u\Ne3262'654#"#54#"&54632'2654'ù)A$&8TýýH071@4Dc­Qd…nN.6%*:@'ThO?$I:+(E3>>G%. $! .#9C )'1# 7,—þG -M&?A5B$5WK\þˆew” &$.+‚h[z=Q6H,# R6K8S) 2`%; þz ' ˆ/'H15I !$Kþº¹B2!3!5654&#"&5462'654&#"#54&#"&546326ù)A$&8TýýH071@4Dcí6H -%?(. 9'(1KUJ;7&%)'1# 7,—þG -M&?A5B$5WK\þÁWB1>*Z+Fѵ&!A0\#.hBY10Kþ»¹@J2!3!5654&#"&5462"&547&#"#54#"&5463262654'ù)A$&8TýýH071@4DcÍCZ6V6D+97'4MYJ86%/k6B$)'1# 7,—þG -M&?A5B$5WK\þÁiJ7EC7S5 ѵHB4Z!-hAZ0/þü)"O.4E$+KþX"¹Xc2!3!5654&#"&5464>32632#"'7327654'#"&5467&#"#54#"&2654'ù)A$&8TýýH071@4Dc8 /&5&,;R0<9bH'% <)$; 6+&2>+>",98  NZx"#')'1# 7,—þG -M&?A5B$5WK\þ'.B 0.KT2Kf 50=P&( #ô -M.7B4B$5WJ]Kþ>¹CO2!3##"&547#5654&#"&54632!5!5654&#"&5462654&#"ù)A$&8T*C-1?)ù/$*$/@4"1  þBH071@4Dcù..#-)'1# 7,—ýD20@B.2 2'*!+#:/@( "ê -M&?A5B$5WK\ýQ!"-#Kþ¹ERf2!3##"&547#5654&#"&54632!5!5654&#"&5462>54&#"2>4'#"&547ù)A$&8T(3-# 4H3ì/$*$/@4"1  þBH071@4Dcà %(!'41)'1# 7,—ýD%>$5 G4>% 2'*!+#:/@( "ê -M&?A5B$5WK\ýz P '< 4"' (".KþZ ¹O2!3#"&54632&#"3265!5654&#"&5463235!5654&#"&546ù)A$&8U`=+fU53*,L:Kþ4/$ *#.AdAlJJ)2½6)'1# 7,—þG -M&?A5B$5WK\þÃO@›4%)",#:1=<1$’9E&:+…g;HKþ¹GP\2!3!5654&#"&5462##"&547!5654&#"&54623546"354&2654&#"ù)A$&8TýýH071@4DcÕ>K)C-0@)þà/$ *#.AdAlJJ)2½6&.#$)'1# 7,—þG -M&?A5B$5WK\þÃO@›31?A/34%)",#:1=<1$’9E&:+…g;Hþx$"-%Kýë¹LU`t2!3!5654&#"&5462##".547!5654&#"&54623546"354&2654'#2654'#"&547ù)A$&8TýýH071@4DcÕ>K%3-# %3þê/$ *#.AdAlJJ)2½6.$&4350)'1# 7,—þG -M&?A5B$5WK\þÃO@› <$5 .< 4%)",#:1=<1$’9E&:+…g;Hþ©  P." '"#& '!/Hÿ+›Á/2!3# 47326=!5654&#"&546ŒL^$9PpžKþ[PAfžg[ºþQG8.3?4Dc*YJ;(–þ@:b3§}r_o@h]?%V8.N/9B3D"2YL[Hþ¯¥Á=K2!3#".547# 4732>=!5654&#"&546264&+"ŒL^$9P:DB2"2 /4ýè[PCk«qJX<þQG8.3?4Dcð## "*YJ;(–þ@?. J/E+!  “}r_o=aY;# 4".N/9B3D"2YL[ýÉ#2# "Hþ\¢Á;FZ2!3#"&547# 4732>=!5654&#"&5462654&"2>54'#"&'ŒL^$9PY`T=?Q ýè[PCk«qJX<þQG8.3?4DcÂ%&$*2'1 E*YJ;(–þ@N5eAZW?.#“}r_o=aY;# 4".N/9B3D"2YL[ýÊX# " %5"! 2+KþÁ¹EO2!3!5654&#"&546#"&=4&#"#"&5463232654'2>54'ù)A$&8TýýH071@4Dc *C4.?.!N6%+6_F0N=54'ù)A$&8TýýH071@4Dc *77C-1?04.!N6%+6_F0N=54'2654'#"&547ù)A$&8TýýH071@4Dc *CA-# 4HH3.!N6%+6_F0N=.c$+w>N@31)?&ѶH5'b$-u@O0.@18(3Kþ¹Vd2!3!5654&#"&5462654'7#"&547&=4&#"#54#"&546326322654&'+ù)A$&8TýýH071@4Dcô!+Q^08C-0@+7"'"9: %&MWK39$"6.A(#&-$)'1# 7,—þG -M&?A5B$5WK\ý¼>.c$+wN' @1?A/6"E1)?&ѶH5'b$-u@O0.@18(3§$$ 0%Kýë¹Xdy2!3!5654&#"&5462654'7#"&547&=4&#"#54#"&54632632264'#"'2654'#"&547ù)A$&8TýýH071@4Dcô!+Q^5;-# 4H.c$+wS&#E$5 G4E$ ?1)?&ѶH5'b$-u@O0.@18(3v$ P-# '"#& '!/Kþ+¹g2!3!5654&#"&5462654'7#"54632&#"32>5#"'&'&#"#54#"&54>32632ù)A$&8TýýH071@4Dcâ$0DZ&>; X4G'F4R+>!:^ 6"97'NZ .& 6&!61A)'1# 7,—þG -M&?A5B$5WK\ýºC1U'L’D_,2 341€J1Ò¶H," Z!+m-B 0/Q4.#"#ù)A$&8TýýH071@4Dc:"(ZN'& 0!0 :A¡½=9«³U, 6<:9.(KXI<2%!7p!0K  %)'1# 7,—þG -M&?A5B$5WK\þ2OBYb< 5 %$  ‚kPA:C[nK,# F/¿¦B=&[(g=J+*`I%*þú, !Kýë¹ixŒ2!3!5654&#"&5464&'7"&547#".547327#".=4&#"#54#"&546326323262>54&#"2654'#"&547ù)A$&8TýýH071@4Dc<(U`$9DbD1;8jj@:6¥†¨S&1 2976,&HTE9/$ 3k("g  .'"#'.)'1# 7,—þG -M&?A5B$5WK\þ<G?Qj95*,=<-# .\?J=7>UgG2.A,²›=9#U&`9E('YE#4è I0 -%  &KÿEÍÃ,5@2##".547!5654&#"&546323546"!54&2654'#óYvE/ "*þH8.1A4D`MJc%¬rm=O#S #//"Ãvbë,2B 2!,-O.:B4B$5WK[ZJ9)âVi6WFΠ[pýü#0 1"KÿÎÃ*3>R2##"&547!5654&#"&546323546"!54&2654&"2>54'#"&'óYv ,T=?Q/þ-H8.1A4D`MJc%¬rm=O#S %&$*2'1EÃvbë#?AZW?A&-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþX# " %5"! 2+KþÀÂÃDMS\e2!5654&#"&5463235462#"/32654&+#"'#"&54634632"!54&4&"325#32=#"óYvýGH8.1A4D`MJc%¬rÊ0**#!*8.5)'0783+Z 3=O#SA%6 "A}j (?Ãvbë-O.:B4B$5WK[ZJ9)âViý¬7F2 # !!CS227(0!7HWFΠ[pýâ%3/)1&6t#=7Kþ¿ÂÃNW^en2!5654&#"&5463235462#"/3254+53254+#"'#"&54634632"!54&4&#"325#32=#"óYvýGH8.1A4D`MJc%¬ré #G"*8.6*(/6O4*'27=O#S=-  A}k (?Ãvbë-O.:B4B$5WK[ZJ9)âViý¬ 6!CR226)27G73WFΠ[pýâ/(/(8Ngi  CT447(0 9F.% WFΠ[pýä&54'5 %(x5# ?9Kþ¾ÇÃ@I2!5654&#"&5463235464632&#";2#"'73254+"&"!54&óYvýGH8.1A4D`MJc%¬r':DU/$C$5-?70N1T.$MS>@'0F=O#SÃvbë-O.:B4B$5WK[ZJ9)âViýÈ&;0%&/5./&5(-&WFΠ[pKþÃÃ@NWb2!5654&#"&5463235464632&#";2#"'73254+"&2#"&46"!54&264&#"óYvýGH8.1A4D`MJc%¬r ;CT0$C#6-?61N1V,&KS>@'0µ*=*>=&=O#S"# #Ãvbë-O.:B4B$5WK[ZJ9)âViýÈ&;0%&/5./&5(-„:-&:Z:ªWFΠ[pü¿"4"+"KýíÏÃKTa{2!5654&#"&546323546"&547&'732654+"&54632&#";2"!54&2654&#"2>54'#"&547#óYvýGH8.1A4D`MJc%¬rÔ./IrI%C$%L"1>@'0M1U/$C(1-?+$=O#S$+ & -  $Ãvbë-O.:B4B$5WK[ZJ9)âViý)H'5MM56% $&(.#4-0% & $%‡WFΠ[püè[$ % !, ,+Kþ¾ÂÃ(Q[2!5654&#"&546323546"!54&2'654&#""&547&#"&5463262654'óYvýGH8.1A4D`MJc%¬rm=O#S:L_Q$:H7F8V5C. ?HU;'$"2'8A"Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþbaFZ0 .H=S=O7FD6P6 .'R* 3`EYþû)*F05F#+KþWÂÃ(`j2!5654&#"&546323546"!54&2#!"3!!"&546;2654&+""&547&#"&5463262654'óYvýGH8.1A4D`MJc%¬rm=O#S*IT@2þø((vþŠ"**"í%0C7  G9T6B /:AIO>(!"2!7A"Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþ`UF>W3$$D39G2D/:9-F+>/F 'P:PÜ&:)-:$KþXÈÃ(is2!5654&#"&546323546"!54&4632632#!"3!!"&546;254&+532654#""&547&#"&72654'óYvýGH8.1A4D`MJc%¬rm=O#Sþ¶P:+!$@ˆ./*0þá''sþ-, êWL.E8V5C/:@HÅ!7B"Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pýÞ;IS#.#73$';!%: 1C/::-@.>/G %&:(-9$Kþ-ÂÃ(cm2!5654&#"&546323546"!54&2#"&54632&#"32654&#"#".547&#"&54>3262654'óYvýGH8.1A4D`MJc%¬rm=O#S?Paj@LO=?6$9QQOaG< F7.$. C1>?H%.! $/#8@*Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþ`wXj‡0u\Ne32632#"'732>54'#"&5467&#"#54#"&2654'óYvýGH8.1A4D`MJc%¬rm=O#Sþ7 /&5&,;R0<9bH&& (: ; 6+&2>+=",98  NZx"#'Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pýÃ.B 0.KT2Kf ':0P&KþËÃ(S`2!5654&#"&546323546"!54&233##"&547#5654&#"&5462>54&#"óYvýGH8.1A4D`MJc%¬rm=O#Sì"1 Ç;%! 0@$£/$*$/B* .$%Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþ ( # þÝ0*A/0 1#*!+#:1>þº "&$KýõÉÃ(S^r2!5654&#"&546323546"!54&233##".547#5654&#"&5462654&#"2654'#"&547óYvýGH8.1A4D`MJc%¬rm=O#Sì"1 Ç;-5H3 %5›/$*$/B0A!'(!0Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pþ ( # þÝ&?4G.?& 1#*!+#:1>þße') 43 (".KþÆÂÃ(0<C2!5654&#"&546323546"!54&4632!7354&'4#"6óYvýGH8.1A4D`MJc%¬rm=O#S­9T‘þâ½&¡-/*2,AmÃvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pý¡c]°x¾).gM<$6TNKþ ËÃ(;GNY2!5654&#"&546323546"!54&4632##"&547#7354&'4#"62654'#óYvýGH8.1A4D`MJc%¬rm=O#S­9T‘&A/1?&o½&¡-/*2,Am.&11%Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pý¡c]°x0/AA/0¾).gM<$6TNç$2 2$KýëÉÃ(>JQ]qs2!5654&#"&546323546"!54&4632##".547#7354&'4#"62654&#"2654'#"&5477#óYvýGH8.1A4D`MJc%¬rm=O#S­9T‘*3H3 %3c½&¡-/*2,Am%535/' Ãvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pý¡c]°x">4G.>"¾).gM<$6TNÀ P." '"#& '".§JÿPÄ:C2#".5473265!5654&#"&54623546"!54&€^rOn‡^ 5itg_D(d*bGn’‡D©ÚýŒH8/2@4Dc–`%­oM>M#TÄx`þü4R, +FX{I…wk|VˆQ5aP-O.:C2B$3XL[ZI9*áTk5[BΟZrJþ“QÄFOY2#".547#".5473265!5654&#"&54623546"!54&264&#"€^rCD*" #2 rl5itg_D(d*bGn’‡D©ÚýŒH8/2@4Dc–`%­oM>M#T2""*Äx`þüA4L"3 *"  +FX{I…wk|VˆQ5aP-O.:C2B$3XL[ZI9*áTk5[BΟZrýK#2"Jþ=RÄEN\q#".547#".5473265!5654&#"&5462354632"!54&2654.'#2654&'#"&=é"GW<+> cW5itg_D(d*bGn’‡D©ÚýŒH8/2@4Dc–`%­oW^rÚ>M#T #"G'#83%/)+(£ G=@S$5*0% +FX{I…wk|VˆQ5aP-O.:C2B$3XL[ZI9*áTkx`þüSú[BΟZrýL%[02 5 6!-8 %0 KþÁÐÃIR[2!5654&#"&546323546#"&=4&#"#"&5463232>54'"!54&2654'óYvýGH8.1A4D`MJc%¬rÒ*C4/>,#N5&+6^G:D= QU=O#Sì(E%Ãvbë-O.:B4B$5WK[ZJ9)âViþ, ,1"@RA60.>?V.;I8NaH:+Z /!a"±WFΠ[pý_#&C6%NOKþÐÃQZgp2!5654&#"&546323546#"&547&=4&#"#"&5463232>54'"!54&2654&#"'2654'óYvýGH8.1A4D`MJc%¬rÒ*:5A/1?32,#N5&+6^G:D= QU=O#S &- %Ý(E%Ãvbë-O.:B4B$5WK[ZJ9)âViþ, ,1"W(!>/AA/=!!D0.>?V.;I8NaH:+Z /!a"±WFΠ[pü´$! $«#&C6%NOKýëÐÃW`mvŠ2!5654&#"&546323546#".547&=4&#"#"&5463232>54'"!54&2654'#"''2654'2654'#"&547óYvýGH8.1A4D`MJc%¬rÒ*?>$ %D0,#N5&+6^G:D= QU=O#S  "Ö(E%%535/Ãvbë-O.:B4B$5WK[ZJ9)âViþ, ,1"\'#G..L"!C0.>?V.;I8NaH:+Z /!a"±WFΠ[püâ   !}#&C6%NOÍ." '"#& '".KþºÎÃR[2!5654&#"&5463235462654'7#"&=4&#"#54#"&54>32632"!54&óYvýGH8.1A4D`MJc%¬rÃ!+Q^@4/A"'"9: %&MW-% 7&"6.A'7=O#SÃvbë-O.:B4B$5WK[ZJ9)âViý">.c$,v?M@31)?%ѶH5'b$-u*> 0.?28(3¨WFΠ[pKþÎÃZcq2!5654&#"&5463235462654'7#"&547&=4&#"#54#"&54>32632"!54&2654'#"'óYvýGH8.1A4D`MJc%¬rÃ!+Q^9/=*+=,7"'"9: %&MW-% 7&"6.A'7=O#S".  !Ãvbë-O.:B4B$5WK[ZJ9)âViý">.c$,vX$8-::-8E1)?%ѶH5'b$-u*> 0.?28(3¨WFΠ[pü¸#0  $KýßÒÃ\er‡2!5654&#"&5463235462654'7#"&547&=4&#"#54#"&54>32632"!54&2654'#"'2654'#".547óYvýGH8.1A4D`MJc%¬rÃ!+Q^6: 8%6LE)"'"9: %&MW-% 7&"6.A'7=O#S #V: & "-Ãvbë-O.:B4B$5WK[ZJ9)âViý">.c$,vS'&F&. K7M&!91)?%ѶH5'b$-u*> 0.?28(3¨WFΠ[püÚ   #[;*# ! %5*Kþ+ÄÃ(m2!5654&#"&546323546"!54&2654'7#"54632&#"32>5#"'&'&#"#54#"&5462632óYvýGH8.1A4D`MJc%¬rm=O#S $0DZ&>; X4G'F/R+= !:]  6"97BNZKl&!61AÃvbë-O.:B4B$5WK[ZJ9)âVi6WFΠ[pýVC1U'L’D_,2 341€J1Ò¶H:=Z!+m@Z0/QLA$A6X9H [VT=O#SÃvbë-O.:B4B$5WK[ZJ9)âViþ'RD@K !L0;<1V*iEVRD@K !L0;<1V*iEV£WFΠ[pKþÈÃCYbn2!5654&#"&5463235462#"&547'654&#"&54622'654&#"&54"!54&2654&#"óYvýGH8.1A4D`MJc%¬rÃ+<*> A6,-8H [W|L(þ|LA$A6,-8H [ð=O#S,#"+Ãvbë-O.:B4B$5WK[ZJ9)âViý#<+&:-+!L0;<1V*iEVRD@.RD@K !L0;=0V*iEùWFΠ[püÂ## KýãÉÃD[do„2!5654&#"&5463235462#"&547'654&#"&54632%2'654&"&546"!54&2654#"2654'#"&5475óYvýGH8.1A4D`MJc%¬r«%7 .&7K8A7+.7H [U@>Lþ,>L*(A6X9H [U¯=O#S.V:" 8 *Ãvbë-O.:B4B$5WK[ZJ9)âViý$ .&&8 L6D' !L0;<1V*iEVRD@ÖRD.G!L0;<1V*iEV£WFΠ[püÞ .[;*#% %'3*KÿB Ã=GR233##"&547#5>54.#"#4.#"632#"&5463262654&"%2654&#"eTdUìIB21CÔ#? 6%)8S40¤-;/>=2>K…j\C4o2##2#ýh$%&'Ás`€H—þG,/ED0,mQ44-!þ¿,$. ÉHR<;IkRuQOýÅ#""†.#%1.H1Kÿ Ã=HZe233##"&547#5>54.#"#4.#"632#"&5463262654&"2654'#"&'%2654&#"eTdUìI!-U<@P0®#? 6%)8S40¤-;/>=2>K…j\C4_%&$)92'2Eýc$%&'Ás`€H—þG"ADWW?B&mQ44-!þ¿,$. ÉHR<;IkRuQOýÙX8*" %5!" 2+í.#%1.H1MÿÁOZ%33#".54>32&#"3265!5654&#"#4&#">32#"&54632>322654&#",.4öS ;iJBN5eb%?I)N'gP54.#"#4.#"632#"&5463262654&#"2'654&#"#"&54732=46eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'ê4@bP-";<.8DUD&,9CÁs`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1EM?w-%Y1>e*/54.#"#4.#"632#"&5463262654&#"2+"3!!"&546;2654&#"#"&546732654&546eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'á$5  & Í$$Hþ¸'!( ·/:)"6?+4G.1"/;!<Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1E++'>"20"L9.:` -4H;*H :+6-*#+4KþZÿÃ2=233!5>54.#"#4.#"632#"&5463262654&#"2+"3!!"&546;254&+532654#"#"&5467326='46eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'à@:((@6Ý$$Qþ¯ '' ÊQ D8;05F? #.<"?Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1F=$-'02(#6!8?70:H;6B  ;*5.#:'/Kþ-ÿÃ2=n233!5>54.#"#4.#"632#"&5463262654&#"2#"5432&#"32654&#"#"&546732=4eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'—vN{f‹ƒG4%5LQOa1';<+7E*5!' 0':Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1CmVo8*vaE\2FTA&] :*/@k1Kþ½ Ã2}…‹–233!5>54.#"#4.#"632#"&5463262+"32632#"&547'#"&546;2654&"#54&#"632#"&5463264#"32$4#"3%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4Œ !*?JŸ$'.¾$%%  X]#%A8“&1"4 6,( %#H6?$""þÚþ$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ,)$;"L " ) #++##$9D .(+6#$ô‡DDÊ.#%1.H1KþAÿÃ2—Ÿ¥°233!5>54.#"#4.#"632#"&5463262#!"3!!"&5463!2654'#"&547'#"&54;2654&#"5#54&#"632#"&54>32>32+"3274#"32$4#"3%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4Tb<6,þÊ&&–þj '!&'2>%%NJ(%ˆƒ1,' ;6*") $$31K :+ EQ‰#0:ê""þàþs$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOýn-"!+'!)   + *V/)W 4%.&$/ $$ (>—DDÃ.#%1.H1KþNÃ2‘š ­¸233!5>54.#"#4.#"632#"&546326232#!"3!!"&5463!254#5254+"&547#".54;2654#"#4&#"632#"&54632>2654#"'4"2"3267+&%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4z &(WoþÑXþ§!!#/!2  k yi9933+#  L@ 3 ­..2&+m"ý¿$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ4 , L-  &  LV #?R I.-/2.#þè  –!! 7Iù.#%1.H1Kþ'Ã2›£©´233!5>54.#"#4.#"632#"&5463262#"&54632&#"32654&'#"&547'#"&546;2654&#"#54&#"632#"&54>32>32+"3264#"32$4#"3%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4u9Jt\$_P0H.%3O(+K[%. ˜()&@J…(5!';7*!( $32I <,8G<'1Ó)!!þÙþy$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOýk@3AQI;0  R410"(N *%%,%#.$7(09V9—DDÃ.#%1.H1Kþ¼ Ã2Yd233!5>54.#"#4.#"632#"&5463262#"/3254&+53254&#"&546%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4‡>5/1@6E+$I))DSýq$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ-=(/%7 )/ /GJ4?K3Q`A.#%1.H1Kþ Ã2cr}233!5>54.#"#4.#"632#"&5463262#"&547'62654&+53254&#"&5462654&'+2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4‡>5/1/1C-/A8 ++$I))DSK&" $ýB$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ-=(/0!;1?@0B  # /GJ4?K3Q`þP$"%&ñ.#%1.H1KýëÃ2hvŠ•233!5>54.#"#4.#"632#"&5463262#".547'632654&+53254&#"&5462654'#"'2654'#"&5472654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4‡>5/1.:-# %E -+$I))DS<  &4350ýV$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ-=(^$D$5 .L"  $ /GJ4?K3Q`þ P." '"#& '!/.#%1.H1KþPÃ2lw233!5>54.#"#4.#"632#"&546326#"&5432&#"32654&+532>54&#"&54>32%2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4ï($Q.0(Rq5$<&-72(% $*)4>*:DüÅ$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOýÐ4O$5 .  2+'3#! )4="6=K388!5s.#%1.H1KþÀ Ã2Wb233!5>54.#"#4.#"632#"&5463262654'7#"'#".547326=32654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4ˆ%1JUJ58%$5 %-\<,#%:!ýF$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOý+C4V$0gDU11 @,l,+Z3? ϶!(C.#%1.H1Kþ Ã2cq|233!5>54.#"#4.#"632#"&5463262654'7#"&547&'#".547326=32654.'+2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4ˆ%1JU::,<%$5 %-\<,#%:!4" -ýd$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOý+C4V$0gW+A&<+1 1 @,l,+Z3? ϶!(¢"  .Â.#%1.H1Kýß Ã2bn‚233!5>54.#"#4.#"632#"&5463262654'7#".547&'#".547326=32654'"'2654'#"&5472654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4ˆ%1JUB@M5&8 G$5 %-\<,#%:! ,V: &*#-ý§$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOý+C4V$0g]*%L8J .&P$ 1 @,l,+Z3? ϶!(… # *[:+# !65+é.#%1.H1Kþ8 Ã2=}233!5>54.#"#4.#"632#"&5463262654&#""&5432&#"32>5#"'#".547326=332>54'7eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'•6N…@'"7F230$3/'"77()F ( &@DÁs`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1þ "/ !@-'22@*n*)]6?Ö¶L9+U*:BEd3KýòÿÃ2r“ž233!5>54.#"#4.#"632#"&546326#".54632.#"32#"'#".547326=332654'2'654#"#54"&546322654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4ƒ4:1_B<;S>N.6%*:2'¾ B%7'$6%5 [;%,/6"'2JW( ý¤$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ'ˆO-VT4 &$.+ -*33%7,m+,Y-H϶!+F4X$þ ' Ô.#%1.H1Kþº Ã2=b233!5>54.#"#4.#"632#"&5463262654&#"2'654&#"#54&#"&546326eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'è6H -%?(. 9'(1KUJ;8%%Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1EWB1>*Z+Fѵ&!A0\#.hBY10Kþ»Ã2=ak233!5>54.#"#4.#"632#"&5463262654&#"2#"&547&#"#54#"&5463262654'eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&'ÈCZ5,*7D+97'4MYJ86%/k$6B$Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1EiJ7EC7R6 ѵHC3Z!-hAZ0/þü#(O.4E$+KþXÃ2={‡233!5>54.#"#4.#"632#"&5463262654&#"4>32632#"'732>54'#"&54>7&#"#54#"&2654'eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&') /&4'+",98  NZx"+ Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1ß.B 0.KS2Ih ':0P&7#5>54.#"#4.#"632#"&5463265#%2654&#"eTdUìIþ)8\7 ¯#? 6%)8S40¤-;/>=2>K…j\C4©h%#ýò$%&'Ás`€H—ý€ /:-mQ44-!þ¿,$. ÉHR<;IkRuQOýž¡(:Ð.#%1.H1Kþ| ÃFNZe233##".547!5>7#5>54.#"#4.#"632#"&5463265#2654&#"2654&#"eTdUìIE/ ")þç8\7 ¯#? 6%)8S40¤-;/>=2>K…j\C4©h%#É#$ "ýC$%&'Ás`€H—ý€,3A 1"- /:-mQ44-!þ¿,$. ÉHR<;IkRuQOýž¡(:Ÿ"!+"o.#%1.H1Kþ; ÃDLWju233##"&547#5>7#5>54.#"#4.#"632#"&5463265#2654&"2>54'#"&'2654&#"eTdUìI",S>=S.î8\7 ¯#? 6%)8S40¤-;/>=2>K…j\C4©h%#›%&)(+3&3/ý{$%&'Ás`€H—ý€#@AZW?A' /:-mQ44-!þ¿,$. ÉHR<;IkRuQOýž¡(:Œ%&X 0%$ &4"! A´.#%1.H1Kþ¼ÿÃ2=z233!5>54.#"#4.#"632#"&5463262654&#"2#"/3254.54>323254&#"&54>32#"&#"326eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4þ´$%&' %593-(1C0;02/%-E/0&7 ,+3 Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþn.#%1.H1ú!)  ! FP.ES+2J%!  JÿÃMY233# $546732>5!5654&#"#4&#"632#".5463262654&#" JcXæIBe„x;þìþ¯(1(ZJs»w}Í}þ½gI<'3SJ4%=&-@1A?4.,Šf^H6þ® %( !',ÃgS‚d–þC5U2! é¿NuBkŠ2^aF-(N4XGX+$þ¿,(6**4GO=;I'L2yžPPþm-#%0/"%/Jþš—ÃXgs#"&547# $546732>5!5654&#"#4&#"632#".54632632332654&#"2654&#"N2 2"3Cq’þìþ¯(1(ZJs»w}Í}þ½gI<'3SJ4%=&-@1A?4.,Šf^H6\JcXæIl " ýQ %( !',„8, #*D2 é¿NuBkŠ2^aF-(N4XGX+$þ¿,(6**4GO=;I'L2yžPPgS‚d–þCLÏ$"  O-#%0/"%/Jþ?˜ÃUcx„"&547# $546732>5!5654&#"#4&#"632#".54632632332654.'"2654&'#".=2654&#"&7;U|Tjwþìþ¯(1(ZJs»w}Í}þ½gI<'3SJ4%=&-@1A?4.,Šf^H6\JcXæI— !P:'#8'# $'ý¼ %( !',Ÿ T0=VU>1(é¿NuBkŠ2^aF-(N4XGX+$þ¿,(6**4GO=;I'L2yžPPgS‚d–þC_À[8* 5 6& & +w-#%0/"%/KþÁ Ã2Zcn233!5>54.#"#4.#"632#"&546326#"&=4&#"#"&5463232654'2654'2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4Ÿ*C4/>.!N5&+6_F0N=>Qý*E%þS$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ. ,1"@RA60.>?V.;I8Mb54.#"#4.#"632#"&546326#"&547&=4&#"#"&5463232654'2654&#"'2654'2654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4Ÿ*::C-/A37.!N5&+6_F0N=>Q&."$á*E%þS$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ. ,1"X'C1?@0>J0.>?V.;I8Mb54.#"#4.#"632#"&546326#"&547&=4&#"#"&5463232654'2654'#"''2654'2654'#"&5472654&#"eTdUìIþm#? 6%)8S40¤-;/>=2>K…j\C4Ÿ*?>$ 4HD0.!N5&+6_F0N=>Q "Ö*E%òL433ý$%&'Ás`€H—þGmQ44-!þ¿,$. ÉHR<;IkRuQOþ. ,1"\'#G.G4K#!C0.>?V.;I8Mb;254#"#"5463232654&#"&4>32#"&#"32636š#Bfä(!>þÂ.? /¢^= O W9#A R(´*.A9D}8 C %LÃ3$pE5' %K,K'"!/½;XjlT/ K6!  JÿÁV%#"&5467327654+53254&'&5463232654&#"&54>32#"&#"32632a‚bŸÃ(%&*@lD@8H"ÙuZ[R=2) N E1³*/@97Q%8;$K'&:M`ß·Y{>6nT-W^G-9*102(0 !-áFivIAc9# "2('%'$,2Jÿ À\%2#"&54>32&#"32654.#""#"&5463232654&#"&54>32#"&#'"&#"376s%0'n†H…3L@@7/-:O]#MS73 .!*G7 :H:Ã) 1D=!32#"&#"32632'2'654#"52#474654#"&54626MjaOt8"h5.I8czF8 2 % I8 60'5>V))6hH.@4%E*4%&5HWŸY  , þË2(+41- #hV=L(&(070-JG&H`vO0VQ0">&7/+cJm‚ƒ(     6ÿ#•ÃK%2#"&54732>54&#"&546323254.#"&54>32#"&#"æ^Q "6a>›ÂF*I§€6N$;E=/.&E > 7%86 /,IJ':T',#J U8+>2$Ý´¢j_’™Æ#3('<'*-:< !1`BQZ 32#"&#"264&+æ^QEFE/ ") ›ÍF*I¯ƒL`;E=/.&E > 7%86 /,IJ':T',#J n4"# U8T>M3A 1"Û¶¢j_’œÃQ<'<'*-:< !1`BQZ 32#"&#"2654&'2654'#"&'æ^Q[\U<=SšÂF*I¯ƒL`;E=/.&E > 7%86 /,IJ':T',#J ]&(%(:3&$-EU8e=cDWW?3%ر¢j_’œÃQ<'<'*-:< !1`BQZ ,E/ "*ókiJ % 9 "ÿ@SFI &e«u#//" $8dA¶-2B 2!,›Š¢,/6  gp36 4Ý…{þì#0 1"MÿÂ'/9L2##"&547#5463!54&+4&#"62654&"2>54'#"&'%5>,$-U32#"&4632.#"326=!54'%354&#'"654&H+<5ÝdƒMroQ([ E "UI-[=þ8,-üBUC&0°0ÏI)°}‹&2IþÙÂ+O^f2##".54632.#"3254'!5462'654#"5#465654#"&546326!54&+4&#"6!~aˆp7E/dI]6 F$3D 1&¹þ‘k_  d!'+ÿ@SFI'e«§¤*:r† 5$6HB!"/#%ì ›ŠýÇ$$ %#2  -% !$—0*+%( gp18&.Ý…{Mþº #G2!546!54&+4&#"62'654&#"#54&#"&546326!7>.þNk³ % 9 "ÿ@SFI &e«g6H> ?(. 9'(1KUK:7&$ $8dA¶ž‡¢,/6  gp36 4Ý…{³WB>K*Z+Fѵ&!A0\#.hCX10Mþ¼  #GQ2!546!54&+4&#"62#"&547&#"#54#"&5463262654'!7>.þNk³ % 9 "ÿ@SFI &e«Y=R2'&3?*52#0GRD31#*c 1=" $8dA¶ž‡¢,/6  gp36 4Ý…{´hJ7DC6Q6 Ï´GC2Y!-gBW//þþ#'N.4D",LþX  #^j2!546!54&+4&#"64>32632#"'7327654'#"&54>7&#"#54#"&2654'!7>.þNk³ % 9 "ÿ@SFI &e«Ö% )#-?''4L9 .!. *"% 0"-+2=F%  $8dA¶ž‡¢,/6  gp36 4Ý…{þ³-C 0.K K=Le 5/>P&54&#"#4&#".546326Rl[öIþk+3N6(1S3!=Q 3#): lWQ:7Ã}]vO—þG*u>SG,$þÂ;4gN-94?E3d„IIIÿBÉÃ;H233##".547#5>54&#"#4&#".5463262>4.#"Rl[öI A3"1 Ø+3N6(1S3!=Q 3#): lWQ:7‡  Ã}]vO—þG.0D)" .*u>SG,$þÂ;4gN-94?E3d„IIýÃ.+,IÿÇÃ9DV233##"&547#5>54&#"#4&#".5463262654&"2654'#"&'Rl[öI$-T=>R0­+3N6(1S3!=Q 3#): lWQ:7Z%&$+73&"/EÃ}]vO—þG$@AZTBC&*u>SG,$þÂ;4gN-94?E3d„IIýØX:(" &4' 2+MÿÍÁB233#".54>32&#"326=!5654&#"#4&#"&546326"Sm^ûNq’?O7f` Q>&R;Qe'g<þ¯aK7#;S,#?Uv†oSf'(Á„`iQ–þF…e & "El]fNg&+þÂ0@hIpRk{`„IIJÿ KÂG233#"$&546732>5!5>54.#"#4&#".546326µRk[æNІ±¡þûš)2*#‰æŽX³~þÄ*3 6&'1S3!20-$þÂ<4hO*;4@D2e„JJJþšQÂVb#".547#"$&546732>5!5>54.#"#4&#".54632632332654&#"2*" #2 jv¡þûš)2*#‰æŽX³~þÄ*3 6&'1S3!20-$þÂ<4hO*;4@D2e„JJ}]wN–þEF×$" #Jþ?RÂTat#".547#"$&546732>5!5>54.#"#4&#".54632632332654.'"2654&'#"&=Þ8 \_¡þûš)2*#‰æŽX³~þÄ*3 6&'1S3!20-$þÂ<4hO*;4@D2e„JJ}]wN–þEXÉ%[8* 5 6!-8 +I¬Ã&082!54>32>354+4&#"6%354+4&#"6Ìc}ü(BC$4D>3OuMRúŸFI+ jµþ¥NQúŸFI+ jµÖz³¿Jl6 ?,,1!¦FnJ–æ3;%4¶±}FoI–æ3;%4¶±IÿA¹Ã(0;EM2#"&547!54>32>354+4&#"6264&#"354+4&#"6Ìc} CbC!ýW(BC$4D>3OuMRúŸFI+ jµz$$ +þ32>354+4&#"62654&"2654'#"&'354+4&#"6Ìc}%0U<@P3ý€(BC$4D>3OuMRúŸFI+ jµM%&$)92'2EþfNQúŸFI+ jµÖz³!BDWW?F"¿Jl6 ?,,1!¦FnJ–æ3;%4¶±þúX8*" %5!" 2+ÛFoI–æ3;%4¶±Pÿ²Á*3;DL2#".4>32&#"3265!5&>76326354#4&#"6%354#4&#"6ÎouCM44MBX82:*ef&U^üÜ/{©+#úLSú¡FI*!jµþ¥LSú¡FI*!jµÁ|Ž·†f ,! TkŽ%D99>‹‹ GmJ–å49%3¶°‚|GmJ–å3:%3¶°EÿE–Â+274>32#"&5473265!354&+4#"6ã+;6Ý‘iœ»B$?¢†Nmþ” #5 ù?REGBj¬Ë<\4 þö»OiÛ´†gZy˜¼G4!- .2 –ku26N¬°{EþŸ™Â)9@O74>32#"&547"#"&5473265!354&+4#"62654&#"ã+;6Ý@C*" 0F œ»B$?¢†Nmþ” #5 ù?REGBj¬k""Ë<\4 þö»M1K#3 B4Û´†gZy˜¼G4!- .2 –ku26N¬°{þG!!$EþIšÂ+;BNb#".547+"&5473265!54>32354&+4#"62654&'"2654&'#"&=2 $U>+> +›¸B$?¢†Nmþ”+;6Ý— #5 ù?REGBj¬@!")9,8+-/)8— 6!=V$5*>+Û´†gZy˜¼G4Ê<\4 þö»`…- .2 –ku26N¬°{þH [9)#5588 (:MþÁ  0@HQ2!5462654'7#"&=4&#"#"&54632!54&+4&#"62654'!7>.þNkæ 0KY=2+;5I1$'4YB6@ % 9 "ÿ@SFI &e«l&A" $8dA¶ž‡ý(>1a"*rBPC40:2?V-.þNkæ:KY97B./A:-5I1$'4YB6@ % 9 "ÿ@SFI &e«w#!$%È&A" $8dA¶ž‡ý(69a"*rZ'A1??1C!C0:2?V-54'#"&547!7>.þNkæ:KY?;-# $5 3(5I1$'4YB6@ % 9 "ÿ@SFI &e«\ »&A"ú", 3&#/ $8dA¶ž‡ý(69a"*ra$$D$5 -# -: !?0:2?V-54&#"2654&#"327.54&#"Æ)*CbC  8*7€œVEK,@T*?ŒWmL%Xþ¼!-7-.>Dø"# #ýð0`A1D1#&16 >$1CD0 •sSoVV*=4Mx]nBN{vG4:)@UT54&#"2654&+2654'#"&'327.54&#"±+;TzS-*7€œVEK,@T*?ŒWmL%Xþ¼!-7-.>DË& %(:3&3Eþ0`A1D1#&1% A6BYW?3% •sSoVV*=4Mx]nBN{ˆ54:)@UT32&#"32>7#"'#"&5463263232654'>54&#"%327.54&#"¾9,0N{R>G3.JG#RH52›Š>\4! F7*7{¡VEK,@T*?ŒWmLÇ!-7-.>DþÏ}i /F/%&1À1µIEncB& !*#$5OE*a xSoVV*=4Mz[nBþ“4:)@UT32'>54&#"%327.54&#"4&"325#32=#"!WmL%XŠn8*7€œVEK,@T*?Œ¬0*+" !*8.5)'0782*Z Â!-7-.>DþÏ0`A1D1#&1è%6 "A}j (?"x]nBN{n“ •sSoVV*=4M³7#$1 # !!CS227(0!:EË4:)@UT54&#"%327.54&#"4&#"325#32=#"!WmL%XŠn8*7€œVEK,@T*?ŒÐ #G"*8.6*(/6O4*'2Ë!-7-.>DþÏ0`A1D1#&1ñ-  A}j (?"x]nBN{n“ •sSoVV*=4M³ 6!CR226)27G73Ë4:)@UT54&#"%327.54&#"2!"&5473254&+532654&+#"'#"&54634632#4&#"325#32=#"!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1V-$%þû–ÉA;°á" +8.6+'/9M3*-.&" Cl*A"x]nBN{n“ •sSoVV*=4M4:)@UTNgi  DS447(0 9F.% &54'5 %(x5# ?9Oþ.À!/?ry‚‹%2654'7#"'#"&54632632'>54&#"%327.54&#"2#"&54632&#"32654&+#"'#".546;4632#4&#"26=#'32=#"!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&15,#86Oþ¹À!\jz…Œ“œ%2654'7#"'#"&546326322'654&#"32#".547##"'#"&546;46323>'>54&#"%327.54&#"2654+'.#"327#32=#"!WmL%XŠn8*7€œVEK,@T*?Œl ".%S$=?. 6 A;$*) 8.6)'1994**##,ž!-7-.>DþÏ0`A1D1#&1½1'{# !A~k(?"x]nBN{n“ •sSoVV*=4M6 9$SG6I6G/(%6!420BT227(0!9E0 )7N4:)@UT54.#"32#"&547##"'#"&546;>326'>54&#"%327.54&#"2654&+'.#"327#32=#"!WmL%XŠn8*7€œVEK,@T*?Œq>T,04( .% " ' 3#+, (/8.6+'08:3** #(!-7-.>DþÏ0`A1D1#&1¢(" !A~k'?"x]nBN{n“ •sSoVV*=4M69*&'&- (1*% .&(1A2CS227(.#9E/"€N4:)@UT54&#"%327.54&#"#"&54732654&+532654#"32#"&547##"'#"&546334632>32'4&+326'.#"327#32=#"!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1Á’§Ö3/Çš|¢I0@ ,,*#,2*/'#,43 /&Q  K?9J"%½#«9n`#7"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"!WmL%XŠn8*7€œVEK,@T*?Œ,7"•9þQ‹%1 4 !-7-.>DþÏ0`A1D1#&1"x]nBN{n“ •sSoVV*=4Ms5+- þÝ(9$ $1‹4:)@UT54&#"%327.54&#"2654&#"!WmL%XŠn8*7€œVEK,@T*?Œ,7"•9#=*+=#þî‹%1 4 !-7-.>DþÏ0`A1D1#&14"" "x]nBN{n“ •sSoVV*=4Ms5+- þÝ/-::-/(9$ $1‹4:)@UT54&#"%327.54&#"2654#"2654'#"&547!WmL%XŠn8*7€œVEK,@T*?Œ,7"•9$4 /%&8 4ï‹%1 4 !-7-.>DþÏ0`A1D1#&1.V:,")$-"x]nBN{n“ •sSoVV*=4Ms5+- þÝ'A&8 /%A'(9$ $1‹4:)@UT54&#"%327.54&#"2654'!WmL%XŠn8*7€œVEK,@T*?Œ^L_Q$:H7F8V5C. ?HU;'$#v!-7-.>DþÏ0`A1D1#&1™&8A""x]nBN{n“ •sSoVV*=4M3aFZ0 .H=S=O7FD6P6 .'R* 3`EYK4:)@UT54&#"%327.54&#"2654'!WmL%XŠn8*7€œVEK,@T*?ŒiITB0þø((vþŠ"**"í$1C7  G9T6B/:AIO>(!"y!-7-.>DþÏ0`A1D1#&1!7A""x]nBN{n“ •sSoVV*=4M5UFAT3$$D3:F2D099-F+?.F 'P;OM4:)@UT54&#"%327.54&#"2654'!WmL%XŠn8*7€œVEK,@T*?Œ¼P:+!$@ˆ./*0þá''sþ ,#)êWL-E8V5C/:@H|!-7-.>DþÏ0`A1D1#&1Ÿ!7B""x]nBN{n“ •sSoVV*=4M·;IS$.#73%0;!: 1C/::-?/>/G %&4:)@UT54&#"%327.54&#"2#"&54632&#"32654&#"#".547&#"&54>3262654'!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1êQ`j@LO=?6$9QQOaG< F7.$. C1>?H&7-$/#8@*"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"2654'!2654'!WmL%XŠn8*7€œVEK,@T*?Œ~=RG5D6@/'&.=*1,!>/'%/<$17>I5%"@$<—!-7-.>DþÏ0`A1D1#&1Á"3:þã#3:"x]nBN{n“ •sSoVV*=4M4_E\/ -K=R=Q7EB7R6 ,#·¯(2:R7ED5R676R+ 0bDW<;L4:)@UT54&#"%327.54&#"2654'2654'!WmL%XŠn8*7€œVEK,@T*?Œ„LAD2ýæ%%ýs$#þ':@4 =.&$.:!*3,% <1#%-9)3:BI4# ">+&8œ!-7-.>DþÏ0`A1D1#&1Æ/7þÓ /7"x]nBN{n“ •sSoVV*=4M8Y7B^61#)K97C-K.;;,K' %š“!)-I/;;-J(>-M %Y:H12P4:)@UT54&#"%327.54&#"2654'2654'!WmL%XŠn8*7€œVEK,@T*?Œ 03)ýÈ(†ýz (P &,##;.%$,9!*1." :.H,8 !8@F4"!;,$8#8.Mþ·!-7-.>DþÏ0`A1D1#&1»-6þ×-7"x]nBN{n“ •sSoVV*=4MŒ 8'41 $;',' -I/;;,G*$›”"*-J/;:.J) /K 'W:J32'w4:)@UT54&#"%327.54&#"2#"&54632&#"3254.#"#"&547&#"#54&#"#".547&#"&5463263263262654'!2654'!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1AP&B@$7ET(7,16Hœ 2! @2'"/< L0(! ?2'"< $17=F7# !&= H !/!3;'þÛ!3;'"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"2'654&#"#54&#"&546326!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&16H -%?(. 9'(1KUJ;8%%"x]nBN{n“ •sSoVV*=4M4:)@UT*Z+Fѵ&!A0\#.hBY10Oþ»À!/?bl%2654'7#"'#"&54632632'>54&#"%327.54&#"2"&547&#"#54#"&5463262654'!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1ÿCZ6V6D+97'4MYJ86%/k6B$"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"462632#"'732>54'#"&5467&#"#54#"&2654'!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1`Nj&,;R0<9_K&& (: ; 6+&2>+>",98  NZx"#'"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"233!5654&"&546!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1="1 Ç;þ«/$<+$/@"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"233##"&547#5654&"&5462>54&#"!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1="1 Ç;%! /A$£/$<+$/@, .#%"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"233##".547#5654&"&5462654&"2654'#"&547!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1="1 Ç;-5-# %5›/$<+$/@&0A!'40"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"233#"&4632&#"3265!5654&#"&546!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1?"1 Ò002(iV43*+L/"54&#"%327.54&#"4632!7354&'4#"6!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1r9T‘þâ½&¡-/*2,Am"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"4632##"&547#7354&'4#"62654'#!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1r9T‘&C-1?&o½&¡-/*2,Am.&11%"x]nBN{n“ •sSoVV*=4M4:)@UT54&#"%327.54&#"4632##"&547#7354&'4#"62654&#"2654'#"&5477#!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1r9T‘*3-# 4H3c½&¡-/*2,Am&4350& "x]nBN{n“ •sSoVV*=4M4:)@UT$5 G4>"¾).gM<$6TNÀP-# '"#& '!/§Oþ,À!/?^is%2654'7#"'#"&54632632'>54&#"%327.54&#"432#".54632&#"326=#7354&#'"654&!WmL%XŠn8*7€œVEK,@T*?Œ@!-7-.>DþÏ0`A1D1#&1v’CV37H7C;7N<(ó¼#$(¦30,_ t "x]nBN{n“ •sSoVV*=4M4:)@UT%$bQA!(1tS[!Oÿ9À'5<L%2654'73!5>7&'#"&54632632'>54&#"5327.54&#"!WmL%X`5þ3Q**7€œVEK,@T*?Œ@!-7-.>Dõ*7#6#þ·0`A1D1#&1"x]nBN{„KïYC •sSoVV*=4M4:)@UT7&'#"&54632632'>54&#"5327.54&#"2654&'#!WmL%X`5 *" "1 þîQ**7€œVEK,@T*?Œ@!-7-.>Dõ*7#6#þ·0`A1D1#&1ò2#"x]nBN{„Kï+"2 )" +YC •sSoVV*=4M4:)@UT7&'#"&54632632'>54&#"5327.54&#"2654&#"2>54'#"&'!WmL%X`5,S>=S.õQ**7€œVEK,@T*?Œ@!-7-.>Dõ*7#6#þ·0`A1D1#&1Ô.%%C*3&3E"x]nBN{„Kï&?CXW?A)YC •sSoVV*=4M4:)@UTH2#"/2654&+532654&#"#"&547&#"&5463262654'5:W'KQ4!(F)' !!%7A<6lSB?Qi $M`^!jua>8>W(6V\. /% :$S (! 44&#*-."$8\wSjeRvTrV}?Lgˆ$$þrI9lHIs7CJÿ4›ÂAK2#"$54732654+53254.#"#"&547&#"&5463262654'ÌXsCGvn“ÇþíO E쯇±7%%- 4#=6lTA@Pi!"N`^ kua?8K%#".54632&#"32>54'#"&546;&#"&546322654'&#"]”x7@+fQO=.@kk>Z.SD9D[I0V3@+bw„aŒ9#ê+5;J"V‡´  *!&';cg9Fa|NAMjL(V:y<Jk‡ˆ%#%!!,P;@Y/"3MÿEÓÁ$/2!!3##".547!546"!54&2654'#^uþ²ÔSE/ "*þDsv@U(Pæ#//"Á‡j/—þG,2B 2!,Ðl…0UC6%N[ýø#0 1"MÿÔÁ"-A2!!3##"&547!546"!54&2654&"2>54'#"&'^uþ²ÔS ,T=?Q/þksv@U(P¼%&$*2'1EÁ‡j/—þG#?AZW?A&Ðl…0UC6%N[þ X# " %5"! 2+JÿöÁ-474632!!3#".54>32&#"326=4&5!"!4J[j^þ²S6`M@L4bVKF&R%YZ$QOý¨åNC)Ãy…Š•–þB@O: % (*:Q–_>6ÓMþÀÒÁ4=CKT2!!3!5462#"/32654&+#"'#"&54634632"!54&4&"325#32=#"^uþ²ÔSý…s¸0*,!!*8.5)'0784*Z þè@U(P¥%6 "A}j (?Á‡j/—þGÐl…ý®7#$1 # !!CS227(0!6I"UC6%N[ýÞ%3/)1&6t )#=7Mþ¿ØÁ=FMU^2!!3!5462#"/3254+53254+#"'#"&54634632"!54&4&#"325#32=#"^uþ²ÔSý…sÝ #G"*8.6+(/6O4*%3þÞ@U(P¯-! A}j(?Á‡j/—þGÐl…ý® 6!BS226)27G64"UC6%N[ýÞ/(2%9Ngi  CT447(0 9F.% &54'5 %(x5# ?9Mþ.ÉÁIPYb2!!3!546"!54&2#"&54632&#"32654&+#"'#"&546;4632#4&#"26=#'32=#"^uþ²ÔSý…sv@U(Pè,"86Iþ¹×ÁGP[bir2!!3!5462'654&#"32#"&547##"'#"&546;46323>"!54&2654+'4&#"325#32=#"^uþ²ÔSý…s|-B S$=?. 6 A;*$+)8.6+'1994**# $+÷@U(P~1' …% !B~k(?Á‡j/—þGÐl…þ+&7,SG6I5H/(%6&/S!CS228'0!9E0 )8¥UC6%N[ýT<*&‰%27 1'5s3%=6=þ½èÁXalszƒ2!!3!5462#"/3254+57>54&#"32#"&547##"'#"&546;>326"!54&264&+'.#"327#32=#"^uþ²ÔSý…s’>T,04( .% 7' 3#+*"(/8.6,'08:3** #”@U(Pt(" !A~k'?Á‡j/—þGÐl…þ+8+''&- (1*%! .&(1A2AU227(.#9E/!€¥UC6%N[ýT0! $,‰&16!1'5s3&=6Kþ&ÑÁbkry‚2!!3!546"!54&#"&54732654&+532654#"32#"&547##"'"&546;>32>32'#3254'4.#"325#32=#"^uþ²ÔSý…sv@U(PX°€Æ.*¸„l” B2'## '.%*B'./)"I  M.0G!Ï& ™03bV 1Á‡j/—þGÐl…0UC6%N[ýTPo§SM?OiT>&L(%0#)1@3 CQ//6)."8E}?A?2,=N57 "%T1)1p1";5MþºËÁ:2!!3!546"!54&2'654&#"#"&54732=46^uþ²ÔSý…sv@U(PÞ5?bP-";=-8DUD&,9@Á‡j/—þGÐl…0UC6%N[þYN>w-&X1>e*/54'#".547^uþ²ÔS'8I97K8ó‹%1 3&-6"•ý½sv@U(PÑ$.+-! "-$Á‡j/—ý'&E5MK7E&(9$ %06*/Ðl…0UC6%N[üê.[$ % , %5+Mþ¾ÕÁ8AK2!!3!5462'654&#"#"&547&#"&546326"!54&2654'^uþ²ÔSý…sjL_Q$:H7F7,+5C. ?HT<'$!Ê@U(PV'8A"Á‡j/—þGÐl…þ.aFZ0 .H=S/F 'P;O¤UC6%N[ý€&;(-:$MþXØÁPYc2!!3!5464632632#!"3!!"&546;254&+532654#"#"&547&#"&"!54&2654'^uþ²ÔSý…sUN<+!$@ˆ./*0þá''sþ5#)êW L.E7,+5C/:@H!@U(Pa!7B"Á‡j/—þGÐl…ýª9KS#.#73#0;!: 1C09:-@.>/G %}UC6%N[ý„&:(-9$Mþ-ÑÁPZ2!!3!546"!54&2#"&462&#"32654&#"#".547&#"&54>3262654'^uþ²ÔSý…sv@U(P§Paj?MM~6$9QQOaG< F7.$. C2=?H%.! $/#8@*Á‡j/—þGÐl…0UC6%N[þ\wXj‡.0u\Ne.;08*"!)6 '*' 7*"!)5 ?07@/#95÷@U(Pw,-3á-3Á‡j/—þGÐl…þ._F]/ -L?Q>Q7FD6U4 -"¹±(2;R7FC7R7@CT* 0cEW==¢UC6%N[ýW.'I15J#./'I15J$-MþUÉÁgpzƒ2!!3!5462#!"3!!"&5463!2654&#"#"&547&#"#54&#"#"&547&#"&546326326326"!54&2654'2654'^uþ²ÔSý…s.: +þ.6ýʺ#0.65(! '2 $,+ 3) '1 $,29>.6& 1ö@U(PŽ)0þè((0Á‡j/—þGÐl…þ(1<"/9'60$%K80I-I.;8.K'$™“'"-H/::-J'<.M $Y9H12¨UC6%N[ý~!&A%(B%( B$*@MþTÊÁqz„Ž2!!3!5462#!"3!!"&5463!254&#퀆&#"#"&547&#"#54&#"#"&547&#"&546326326326"!54&2654'2654'^uþ²ÔSý…s)B')-#þ#0ýÐ$"ÃE !(3)'1 $+' 2' &0"/17;/5$ 1õ@U(Pˆ'/ÿ(/Á‡j/—þGÐl…þ)'.7&51$$;$,' -I/;9/G*%š”"*-J0::.J)?/L 'W;I32§UC6%N[ý"&B#)@'(!B%*A(MþÛÈÁ)22!!3!5654&#"&546323!546"!54&^uþ²ÔSþ­/$*$/B2!2 Çý¾sv@U(PÁ‡j/—ý) 1#*!+#:1>' #Ðl…0UC6%N[Mþ'ÑÁ6?L2!!3##"&47#5654&#"&546323!546"!54&2654&'#^uþ²ÔS&! /A%¡/$*$/B2!2 Çý¾sv@U(Pè&%Á‡j/—ý)0*@` 1#*!+#:1>' #Ðl…0UC6%N[üÒ$&$$MþÕÁ:COb2!!3##".547#5654&#"&546323!546"!54&2654&#"2654'"&547^uþ²ÔS(5$ %5ž/$*$/B2!2 Çý¾sv@U(PÓ &4)>*1Á‡j/—ý)&?..@% 1#*!+#:1>' #Ðl…0UC6%N[üõ P." ,* &$,MþPÉÁ9B2!!3# 4732>=!5654&#"&546323!546"!54&^uþ²ÔSzVþž>5“©DEþä/$+$.@42?Éý»sv@U(PÁ‡j/—ý5G SL@Gjt &2%*")";2=<0$Ðl…0UC6%N[MþØÁDMZ2!!3#".547# 47326=!5654&#"&5463235!546"!54&2654&+]vþ²ÔS0?25(3 *þ¼ ”ŠQnþä/$ *$.@42?Éý»sv@U(PÓ4"+Á…l/—ýY,DK-*ÿ * !w]&2%*")";2=<0$ÒÐl…0UC6%N[üª# MýéÓÁCLVk2!!3#"&547# 47326=!5654&#"&5463235!546"!54&2654'2>54'"&547^uþ²ÔS:DC02@ þ¼ ”ŠQnþä/$ *$.@42?Éý»sv@U(PÛ&,$'&<& ?Á‡j/—ýY0K/CD.)ÿ * !w]&2%*")";2=<0$ÒÐl…0UC6%N[üÐ & 'Q ," (' $0)Mþ¼ÉÁ7@2!!3!546"!54&2!5654&#"&546323546"354&^uþ²ÔSý…sv@U(PÇ>Kþ4/$ *#.B12AlJJ)2½6Á‡j/—þGÐl…0UC6%N[þ[O@›3%)"+";1=<1$’7G&:+…g;HMþÑÁBKW2!!3!546"!54&2##"&547!5654&#"&546323546"354&2654&#"^uþ²ÔSý…sv@U(PÄ>K)B.0@)þà/$ *#.B12AlJJ)2½6&.$%Á‡j/—þGÐl…0UC6%N[þ[O@›31?@033%)"+";1=<1$’7G&:+…g;Hþx$"&$MýëÙÁGP[p2!!3!546"!54&2##".547!5654&#"&546323546"354&2654'#2>54'#"&547^uþ²ÔSý…sv@U(PÉ=L%3 4" %3þê/$ *#.B12AlJJ)2½6.$", 3&#/Á‡j/—þGÐl…0UC6%N[þ[O@› < $,.< 3%)"+";1=<1$’7G&:+…g;Hþ©  P#!  '"4 '".MþÁËÁ?HQ2!!3!546233#5>54&#"#54&#"632#"&546326"!54&3254&"^uþ²ÔSý…s 4?6”-ü'1 4+g &'&'/SB:*!^@U(Pà($Á‡j/—þGÐl…þ3M@W.þÛF8:2ÕÇ#†05)(0E8Ni65UC6%N[ý¨26!MþØÁKTaj2!!3!546233##".547#5>54&#"#54&#"632#"&546326"!54&2654&#"$3254&"^uþ²ÔSý…s 4?6”-+25(3 +e'1 4+g &'&'/SB:*!^@U(Pí!"þM($Á‡j/—þGÐl…þ3M@W.þÛ5K-*5F8:2ÕÇ#†05)(0E8Ni65UC6%N[ü´$+ #ô26!MýêÓÁR[f|…2!!3!5462363233##".547#5>54&#"#54&#"632#"&546326"!54&2>54#"2654'#"&5473254&"^uþ²ÔSý…s 4?6; 4-*2H3 %2?'1 4+g &'&'/SB:*!^@U(PÒ+/(84'"*)þe($Á‡j/—þGÐl…þ3M@W.þÛ$@4G.@$F8:2ÕÇ#†05)(0E8Ni65UC6%N[üÚ,*W8($ '!34 "%26!MþÆÈÁ+22!!3!5464632!"!54&354&'4#"6^uþ²ÔSý…sè9T‘þâr@U(Pì&¡-/*2,AmÁ‡j/—þGÐl…ýmc]°xËUC6%N[ýó).gM<$6TNMþ ÑÁ!*6=H2!!3!5464632##"&547#"!54&354&'4#"62654'#^uþ²ÔSý…sè9T‘%A/1?%nr@U(Pì&¡-/*2,Am.&11%Á‡j/—þGÐl…ýmc]°x0/AA/1ËUC6%N[ýó).gM<$6TNç$2 2$MýëÏÁ$-9@L`b2!!3!5464632##".547#"!54&354&'4#"62654&#"2654'#"&5477#^uþ²ÔSý…sè9T‘*3H3 %3cr@U(Pì&¡-/*2,Am%535/' Á‡j/—þGÐl…ýmc]°x">4G.>"ËUC6%N[ýó).gM<$6TNÀ P." '"#& '".§MþÁÖÀ 7AJ2!!3!54#"&=4&#"#"&5463232>54'"!542654'~_þ²ÔSý…)*C4/>,#N5&+6^G:D= QþÌ)<(`(E%Àˆ—þGÍóþ/ ,1"@RA60.>?V.;I8NaH:+Z /!a"º136ÑýV#&C6%NOMþÛÀ >HV_2!!3!54"&547&=4&#"#"&5463232>54'"!542654&'+'2654'~_þ²ÔSý…)*38B\B,5,#N5&+6^G:D= QþÌ)<(¢# .%ç(E%À‡Ž —þGÍóþ/ ,1"S'B1??17" G0.>?V.;I8NaH:+Z /!a"º136Ñü®-& 0$¨#&C6%NOMýëÖÀ EO\ey2!!3!54#".547&=4&#"#"&5463232>54'"!542654'#"''2654'2654'#"&547~_þ²ÔSý…)*??$ %D1,#N5&+6^G:D= QþÌ)<(„ !×(E%%53&#/À‡Ž —þGÍóþ/ ,1"]%$G..K"!D0.>?V.;I8NaH:+Z /!a"º136ÑüÙ   !}#&C6%NOÍ." '"4 '".LÿBÓÁ,8233##".547#5654&#".5462654&#")\{SÌSB2"1 ÈkZBFT+ )7z™ +##ÁyÊ\—þG,/E)" +NcL_bJ'51!AD/d†ýÅ+ "#LÿÔÁ*4H233##"&547#5654&#".5462654&"2>54'#"&')\{SÌS%-T=?Q/ kZBFT+ )7zX.%&C*2'1EÁyÊ\—þG"AAZW?B&NcL_bJ'51!AD/d†ýÙv# " %5"! 2+HÿÌÀ9233#"5432&#"32>5!5>54.#".546*^rQÐS 1V9ÖÖG912-< þÅ09/0HV>$$,{Àp_uX–þG 9@.KJ%&'6?."i:*>bKEW 5P.f†Iÿ/cÁ2233#"$5473265!5>54.#".546ÈaqQÌNµ‡ÎþðXHñ·jþÊ19?+CZA#(7€Ás^tX–þC^pæ¿€m_q¤ÈPB$j700]NFZ@C0jIþ›lÁ<I233"&547#"$5473265!5>54.#".5462654&#"ÈaqQÌN?HCbC04ÎþðXHñ·jþÊ19?+CZA#(7€!" Ás^tX–þCM5O1CD0 æ¿€m_q¤ÈPB$j700]NFZ@C0jý$#+IþOmÁ=J\233#"&547#"$5473265!5>54.#".5462654&#2654'#"&'ÈaqQÌNV`U<>RÎþðXHñ·jþÊ19?+CZA#(7€e# $,65$#/EÁs^tX–þC[8eDWV@+"æ¿€m_q¤ÈPB$j700]NFZ@C0jý&X9)" '3) 2+LþÁÖÁIR233!5654&#".546#"&=4&#"#"&5463232>54'2654')\{SÌSþvkZBFT+ )7z°*C4/>,#N5&+6^G:D= Qý(E%ÁyÊ\—þGNcL_bJ'51!AD/d†þ. ,1"@RA60.>?V.;I8NaH:+Z /!a"ð#&C6%NOLþÛÁP^g233!5654&#".546"&547&=4&#"#"&5463232>54'2654&'+'2654')\{SÌSþvkZBFT+ )7z°*38B\B,5,#N5&+6^G:D= Q# .%ç(E%ÁyÊ\—þGNcL_bJ'51!AD/d†þ. ,1"S'B1??17" G0.>?V.;I8NaH:+Z /!a"þh-& 0$¨#&C6%NOLýëÙÁVcx233!5654&#".546#".547&=4&#"#"&5463232>54'2654'#"'2>54'#"&547'2654')\{SÌSþvkZBFT+ )7z°*=@ 4" %B2,#N5&+6^G:D= Q ", 3&#/Å(E%ÁyÊ\—þGNcL_bJ'51!AD/d†þ. ,1"[&#I $,.J"!E0.>?V.;I8NaH:+Z /!a"þ“   P#!  '"4 '".Í#&C6%NOLÿ9ÌÁ&.233!5>7#5654&#".5465#)\{SÌSþ>9[8»kZBFT+ )7z´J%#ÁyÊ\—ý€ /9.NcL_bJ'51!AD/d†ýž¡(:Lþ}ÓÁ5=J233##".547#5>7#5654&#".5465#2654&'#)\{SÌS*" "1 þ9[8»kZBFT+ )7z´J%#®#"ÁyÊ\—ý€+"2 )" + /9.NcL_bJ'51!AD/d†ýž¡(:ž###"Lþ<×Á08CW233##"&47#5>7#5654&#".5465#2654&"2>54'#"&')\{SÌS(T=AO+×9[8»kZBFT+ )7z´J%#‡%&$*3&3EÁyÊ\—ý€&32632#!"3!!"&5463!2654&'#"&5467&#"#"&54>732652654'[$;>"sJ]=?ZDý‰" üí.?<-9>SL6PA;OPM-H8C[HRb >+'5!/' $:%,8S17Q)\FE_]zI6(*:lMF` 7kA\KIOe~_7HC:@,2J!BJ‡D7G; G:1@IÿÉÃ]g3!!"&5463!2654#5254&##"&54>7&#"#"&54>732654>32632#!"3254'|#üë,=15ƒ#/WXV>"U?:L 2++A.:[HQc =,&5 9'0.(O6gKA W:ý€"¡5)I AF†K9)G-%N(K.?7@_|\E+K1 6:F'IOe~_8H@9@.2>*Uz"@=$KTDA# /%:21D}M>OMÿÔÀUb%#".54>32&#"32654.'#"&5467&#"#"&54>732654>326322654'ÔÞ¦AN53L@dD8D=QK7‚°<(N>8JHF!L<9ZIQc =,&5!/' 0.(O7oF g}þ—$,)8*sÄ!"$¦„#;.'03]~]H?oBg‰Nf~_8H@8A-2I"Uz"><$Y‡®K>A8)5"-=Jÿö^ÃEP233!532654&#"#"&547&#"#"&54>7326=4>3262654'×I\còSý¤“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)B.4D¾wXˆE™þD#kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) þÏ15U00U*-JÿCfÃO_j233#"&547!532654&#"#"&547&#"#"&54>7326=4>3262654.+"2654'×I\còSCbCþf“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)Z"*þ{.4D¾wXˆE™þD-1CD0+#kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) ýÉ#  15U00U*-JÿgÃP[mx233##"&547!532654&#"#"&547&#"#"&54>7326=4>3262654&"2654'#"&'2654'×I\còS$-U<@P/þ“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)0%&$+72'#/Eþœ.4D¾wXˆE™þD#@DWW?B&#kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) ýÛX:($ $6) 2+L15U00U*-IÿÃ_i%!3#".54>32&#"3265!53>54&#"#"&547&#"#"'&546732674>76326322654'8+S~š@K46N=PJ ]4JI5lUý¨÷.9L?@@0+5H. *YDR63R>w 9'3%0V?%)?RgþÆ$4D õ;x–þGov  %b\#h9Ng7d9OM;YA$HO8LhE?TG…&V|/:'RU+,?6t¶6'U00U'6Jÿö…Ã[fq%4632#"&547&#"532654&#"#"&547&#"#"&54>7326=4>326323&2654&'%2654'ÂudaFCPB8Jo#Od_ý´“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)?I\cå<'1%f0ý.4Dßf{QL`XtWG„ZpTy:#kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) wXˆETB@F>TTc2@Y15U00U*-JÿhÆ‘œ3!!".54>3!2>54.'#"&54>7&#"532654&#"#"&547&#"#"&54>7326=4>32632!&547632632#!"%2654'%2654':ûü+--+Ü>V);'&O;=P1#%-4L#_ý–“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)?I\c<@?Z\Cf€ý*¯)#&SS>YAXJSSd`7JB8@+Ld:DN.J) wXˆETi[CCC€i~`|R2S:X42AX15U00U*-JÿGÓ¨2#!"3!!"&54>3!2654&+532654&+#"&54>7&#"!532654&#"#"&547&#"#"&54>7326=4>326323&54>3263254'2654'l]z@DM9ü«Ôü%/ ) `&#% (Q: 'Q@9L1(%4*C&_ý´“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)?I\cå< -R3_D¹-&M"A=ý½.4D|YC<"`.8$I?. $&*!<*./@BMUs`F*H0 %"/:*y:#kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) wXˆETi1B7&HÓ2CˆJ:QK15U00U*-JÿÇ”Ÿ%4632#".54>32&#"32>54.'#".54>7&#"!532654&#"#"&547&#"#"&54>7326=4>326323&2654'%2654'¿fxB>T!­‚ _f4K@SM99+"\f'7V4" 1&RC %/ E3&HK547,ý¶“FUC6@@0*6H+.5TEUg =,&5I;#7+6'22)?I\cä>%#0#2 ,ý’.4DÕh…r Q^3޶ %)>TO(=I 9Zy D/+>09:8O7k #kXLc7d>SS>YAXJSSd`7JB8@+Ld:DN.J) wXˆEXDM:82 4$(JW15U00U*-MþºÃ-R\2#"&547&#"#"&54>7326=462'654&#"#54&#"&546326'3254&'iPA8Px(*4G[HRb >+'5!/' $:iÆ6H'$?(. 9"(1KUJ;7&$7?MlÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ'WB,F *Z+Fѵ 'A0\#.hAZ10¼:8{(lWMþ»Ã-Q[e2#"&547&#"#"&54>7326=462#"&547&#"#54#"&546326'3254&'2654'iPA8Px(*4G[HRb >+'5!/' $:i¦CZ5,*7D+97'4MYK74'-?Ml}6B#ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ'iJ7EC7R6 ѵHC3Z!-hCX0/¼:8{(lWýÛ)"O.4E"-MþX"Ã-hr}2#"&547&#"#"&54>7326=464>32632#"'7327654'#"&5467&#"#54#"&3254&'2654'iPA8Px(*4G[HRb >+'5!/' $:iÞ /&5&,;R0<9bH'% <)$; 6+&2>+>",98  NZ9?Ml?"#'ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiý.B 0.KT2Kf 50=P&7326=464632!3254&'354&'4#"6iPA8Px(*4G[HRb >+'5!/' $:i'9T‘þâ4?Ml‰&¡..*2,AmÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiýkc]°xà:8{(lWþy*-gN;$6TNMþ Ã->HT[g2#"&547&#"#"&54>7326=464632##"&47#3254&'354&'4#"62654&#"iPA8Px(*4G[HRb >+'5!/' $:i'9T‘$C-/A#k4?Ml‰&¡..*2,Am-&-"$ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiýkc]°x`@A^à:8{(lWþy*-gN;$6TNé$"-&MýëÃ-BL]do„†2#"&547&#"#"&54>7326=464632##"&547#3254&'3632354&'4#"62654&#"2654'#"&5477#iPA8Px(*4G[HRb >+'5!/' $:i'9T‘#/-# 4H/b4?Ml‰&N  ...*2,Am&4350& ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiýkc]°x&:$5 G4:&à:8{(lWþy*-gN;$6TNÀP-# '"#& '!/§Mþ,Ã-7Ydm2#"&547&#"#"&54>7326=463254&'4>32#".54632&#"326=#7354&#'"654&iPA8Px(*4G[HRb >+'5!/' $:i[?Ml7,-’CV37H7C;7N<(ó¼$%&¦+8,_(t ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþã:8{(lWþG1D ±€KL5;¾@&"bHJ!5?tS[!Hÿ11ÂLY4>32#".547327654'#"&5467&#"#"&54>732652654'ò&B+–HR0-ý͘÷e!Z‚Ú†Ävfa NA7Jh>$aC4YFOh :*$2 -&':)$&0 "ÿ07'p >;P‘ºgÀz{tcok¥WbTon&*3_t`DHdIieQc|d4FB6>/0I#R]¬T3G) 7%,GHþÍ1ÂWdq4>32"&547#".547327654'#"&5467&#"#"&54>732652654'2654&#"ò&B+–HR0-W**CbCb˜÷e!Z‚Ú†Ävfa NA7Jh>$aC4YFOh :*$2 -&':)$&0 "Ö+* #ÿ07'p >;PrY @$1CC1 %gÀz{tcok¥WbTon&*3_t`DHdIieQc|d4FB6>/0I#R]¬T3G) 7%,GþÜ 4"Hþr1ÂZgt†4>32#"&547#".547327654'#"&5467&#"#"&54>732652654'2654&#"2654'#"&'ò&B+–HR0-{-S>?Q Oa˜÷e!Z‚Ú†Ävfa NA7Jh>$aC4YFOh :*$2 -&':)$&0 "¨%$+73&1 Eÿ07'p >;PŒ^ 6%CXW?!gÀz{tcok¥WbTon&*3_t`DHdIieQc|d4FB6>/0I#R]¬T3G) 7%,GþÕX:(  &4"! 2+MþÁÃ-U_h2#"&547&#"#"&54>7326=46#"&=4&#"#"&5463232654/3254&'2654'iPA8Px(*4G[HRb >+'5!/' $:iä*C4/>-"N5&+6_F:D=>Qy?Ml„)E%ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ, ,1"AQA60-??V.;I8MbH:+Z69a"Ê:8{(lWýá$%C6'LOMþÃ-]gs|2#"&547&#"#"&54>7326=46#"&547&=4&#"#"&5463232654/3254&'2654&#"'2654'iPA8Px(*4G[HRb >+'5!/' $:iä*;9B./A46-"N5&+6_F:D=>Qy?Mlw$!$%à)E%ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ, ,1"Z&B1??1=! H0-??V.;I8MbH:+Z69a"Ê:8{(lWý3&.&$®$%C6'LOMýëÃ-_iwŒ•2#"&547&#"#"&54>7326=46#"&547&=4&#"#"&5463232654/3254&'2654'#"'2654'#"&547'2654'iPA8Px(*4G[HRb >+'5!/' $:iä*9F-# 4H=7-"N5&+6_F:D=>Qy?Mlm &4350Ð)E%ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ, ,1"X'!M$5 G4G"J0-??V.;I8MbH:+Z69a"Ê:8{(lWýd   P-# '"#& '!/Í$%C6'LOMþºÃ-R\e2#"&547&#"#"&54>7326=462#"&547&#"#"&54732=46'3254&'3254'iPA8Px(*4G[HRb >+'5!/' $:i¢Da5-'6L7?.6CbQ;9G?MlN&.!BÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþ'`N8J:0U=25/7APBr+"^92V+;G¼:8{(lWþ$$"KH&6MþcÃ-q{†2#"&547&#"#"&54>7326=464632#!"3!!"5463!2654'#"&5467&#"#"&54>732653254&'3254'"iPA8Px(*4G[HRb >+'5!/' $:iC4O0+?5*þ£$$·þIF)5+57 *0".=')!,>.0:%# +(!"q?Ml 0 #%ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiýÆ-7<C61@*7'=+A,G1(+8'5+"+:D:(= <)*4(!J:8{(lWþF"J# $MþÃ-7‰’2#"&547&#"#"&54>7326=463254&'#!"3!!".5463!2654#5254&##".54>7&#"#"&54673265462632%3254'iPA8Px(*4G[HRb >+'5!/' $:i[?MlÀ`þY'  ý÷" 0¨9:7+9)", # ,%,;06A)5P +!:ˆ27326=463254&'#"&54>32&#"32654.'#"&5467&#"#"&5467326546326322654'iPA8Px(*4G[HRb >+'5!/' $:i[?Mlê“m*g#5(B-'*_VYq, 3*&/7&2(%L3H/ ERï)*ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþã:8{(lWþg‚ rS"/!! =S?.3B,EY5BQA'^#b=58QD;;Zr7#-#9#)Mþ7Ã-7s|2#"&547&#"#"&54>7326=463254&'32=432#"&54732654'#"&5467&#"#"&547%3254iPA8Px(*4G[HRb >+'5!/' $:i[?MlþÛ<@uc0/D©…šÌB;±Œz™@4*%0F'BN:/7BY,!v/)03ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiþã:8{(lWþH;7s€JI7326=46#".547#"&54732654'#"&5467&#"#"&54732=4323254&'32542654&#"iPA8Px(*4G[HRb >+'5!/' $:i#(7* #1:‘À>8¬s=1(".A&T$ 97326=46#".547#"&54732654'#"&5467&#"#"&547325'4323254&'32542654&#"#2>54'#".547iPA8Px(*4G[HRb >+'5!/' $:i'*@. / #¬82šrf‚7+$)8$6B3&-8JA37dS(+ì?Mlj5)+ *.  %#ÔtVnWG„`"`GIOe~_7HC:@,2J!BJCZiüø :!,=& {cA> 5;UjZB:3>3%(3'n,4A6Z"N0-^h<( M¹:8{(lWþ$"=H'þØ $J# ! ' KÿE¥À;AKV%>73##".547!5654&#"&5463235".54>3273"542654'#“S‡E/"1 þ.H8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ñ#//"ד7þG,2B)" ,-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>þ#0 1"Kÿ£À9?ITh%>73##"&547!5654&#"&5463235".54>3273"542654&"2>54'#"&'“S‡#-T=?Q0þWH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' Ä%&$*2'1 /ד7þG"@AZW?A&-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>þX# " %5"! AMÿ¤ÃLR]%>73#".54>32&#"326='!5654&#"&5463235".54>3273"54“=¥0\H@L4bVJ</C#\G8LKý±H8-2A4BaNK]$À/9(.% B2Æu7Æþ°' Ù‡Jþ1@4 % %193ESEU]F:)?*#4 WU K"Q –f). w>KþÀ¤À.TZdjr{%>73!5654&#"&5463235".54>322#"/32654&+#"'#"&546346323"544&"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2·0*+"!*8.4)'0784*Z *e5·þ¿' °%6 "A}j (?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ–7#"3 # !!CS227(0!6IÉ%O –g*<. w>ýæ%3/)1&6t )#=7Kþ¿ À.]cmt{„%>73!5654&#"&5463235".54>322#"/3254+53254+#"'#"&546346323"544&#"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2Ò #G"*8.5*(/8M3+%3*e5·þ¿' °-  A}k (?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ– 6!CR226)26H55É%O –g*<. w>ýæ/(/(8v}…Ž%>73!5654&#"&5463235".54>3273"54232#!"3!!"&5463!254+53254+#"'#"&54;464&#"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' y.9;A#$<þ³ ‰þw#$)4# +8.5*%1l3c%""Ck*Aד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>þh=00+5 /%'$5B,,,#C0;k -0+ ,a 5,Kþ.¥À.`fpw€‰%>73!5654&#"&5463235".54>322#"&5462&#"32654&+#"'#".546;46323"54.#"26=#'32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2ª,ýå)/0(Œ5, '1>#86Kþ¹¥À.gmw„‹’›%>73!5654&#"&5463235".54>322'654&#"32#"&547##"'#"&546;46323>3"542654+'.#"327#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2w-B S$=?. 6 A;*$+)8.6+'1994**# $+Oe5·þ¿' … 1'  " !A~k(?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# í&7,SG6I5H/(%6&/S!CS228'0!9E0 )8L%O –g*<. w>ý\<#‰&17 1(4s3$=6Kþ½¥À.y‰•œ£¬%>73!5654&#"&5463235".54>322#"/3254+57>54&#"32#"&5465##"'#"&546;463263"542654&+'4&#"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2|+> ,04( .% - !43#+0(/8.6+'08:4+* #Ãe5·þ¿' j($ !B~k'?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# í$ &'&- (1*%#.&/*A2CS227(.#6H/!€L%O –g*<. w>ý\" $,‰$36!1(4s3%=6Kþ`™À.4>ˆ“š£¬%>73!5654&#"&5463235".54>3273"542#!"3!!"&5463!254&+532654&#"32"&57##"'#"&54;46323>2654&+'4&#"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' Ñ:M43eþ ##Yý§%%ÊZ  28I +3->07/5*%1n3*Z  \.#\&"#Ck *Aד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>þk1(&2Q/$$:"6 %#*,49F,,+$D.=k/>áDt ,/)!.d5/Kþ*¦À.qwŒ“š¤%>73!5654&#"&5463235".54>322#"&54632&#"32654&#"2#".547##"'#"&546;>323>3"542654+'.#"327#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2tC\€j'gQ=66.$R6RbC5II9%)$8.6+'08<3*Y# Cye5·þ¿' ‚ 0(z" !@~k'?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# ïsXkŠ q[MbW$6!5)# DS227(0!:E5KN%O –g*<. w>ýX= 8‰'15#1(4t3 =7KþG¡À.\blrzƒ%>73!5654&#"&5463235".54>322#"&54732>54&+#"'#"&54;46323"544&"325#32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2´'3rƒ«:.VL`?Z/8.6+&1Z+4+Z -e5·þ¿' ¬$8 !A|k'?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ”5,YljfFJN\;435%DS227)P6IË%O –g*<. w>ýä&20(1(4t%&=7Kýî£À.ioy‡˜¢%>73!5654&#"&5463235".54>322"&547#"&54732>54&+#"'#"&54;46323"544&"325#2>54&+32=#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2´'3FH?b? ¯:.,>L89<- 8.5*&1Z+4+Z -e5·þ¿' ¬%6!!A|Ä - %þì'?ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ¤/'K0D(:9)}_Z>@F*C%3!;I,,.&G0?o»%O –g*<. w>ýô"++",#.f þÇ   60 Kýï¡À.lr|ƒ‹›¥¹%>73!5654&#"&5463235".54>322#".547#"&54732>54&+#"'#"&54;46323"544&#"325#2654&#'32=#"2654'#".547“S‡ýpH8.1A4D`MJc%À/9( 6&B2¸&0X(/ 1!"1  |¤8,WHV%CB'5,1("1V)1(U 'e5·þ¿' µ"!>v   ú&<æH2 %" ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ¬,$Q/8! %$ %vWR;8DO0' 7&8D))+#C-;h³%O –g*<. w>ýü*,)!*_ þ÷ ê2-þª& *   Kþ¾¥À.OU_%>73!5654&#"&5463235".54>324632&#";2#"'73254+"&3"54“S‡ýpH8.1A4D`MJc%À/9( 6&B2:DT0$C#6-?70N1V,$MS>@'0§e5·þ¿' ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ²&;0%&05./&5(-Ñ%O –g*<. w>Kþ¥À.X^ht%>73!5654&#"&5463235".54>324632&#";2#"&547&'73254+"&3"542654&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2:DT0$C#6-?7098B./A,1$MS>@'0§e5·þ¿' ó&.$%ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ²&;0%&0=>1??16 &5(-Ñ%O –g*<. w>üµ$"&$Kýë¦À.^dn{%>73!5654&#"&5463235".54>322#".547&'73254+"&54632&#"33"542654'#"'2654'#"&547“S‡ýpH8.1A4D`MJc%À/9( 6&B2ª70;=$ %7-$MS>@'0:DT0$C#6-Le5·þ¿' Ý  %533/ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ•0>"C..@!&5(-$&;0%&Ê%O –g*<. w>üæ P." '"#& '".Kþ9§À.4>m%>73!5654&#"&5463235".54>3273"544>32&#"#"&54632&#"32654/.“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' *8C%a:.Yl:K=H>K*9Q:?C/#0//#?6LS %ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>ýñ,95)I;CjD$+! ='I/Kþ£À.4>l%>73!5654&#"&5463235".54>3273"542#"&54632&#"32654+"&54632&#";2'654#"#465654#"&54632“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ÆEX‡f=KQ9K+G(7:,LbnT0CL[t;1fu@ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>ýÏH;Xl+#!-)% UEe7(*?,'G7Ø     Kþ¼¢À.Y_i%>73!5654&#"&5463235".54>322#".54732654+"54632&#"33"54“S‡ýpH8.1A4D`MJc%À/9( 6&B2£0<19?_.8,65M)6?zK-.#N.:0%#!Í%O –g*<. w>Kþ¢À.`fp{%>73!5654&#"&5463235".54>322".547.54732654+"54632&#"33"542654'#“S‡ýpH8.1A4D`MJc%À/9( 6&B2£0<0.-* +-Ua8,65M)6?zK-.#N.:0%#!Í%O –g*<. w>ü¿$0  +Kýê¥À.cis—%>73!5654&#"&5463235".54>322#"&547.547;63654+"54632&#"33"542654'+2>54'#"&547#“S‡ýpH8.1A4D`MJc%À/9( 6&B2˜0<.<-$ 4G)O[8,65M =?zK-. (#N.:0%#!Í%O –g*<. w>üâ   +V*&$ '!4.)Kþ†™À.4>JW%>73!5654&#"&5463235".54>3273"542#"&5462>54&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' yNgiHKa]? &. K75MLד7þG-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>þ^cOMbbHOhþÊ 8%8MHpOKþ§À.HNXkw%>73!5654&#"&5463235".54>322#"&547#"&5463233"542>54.#"2654&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2±3025,<Hd]KNg e5·þ¿' Y0 8&5M 8Â#+#"ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# ýùIK<+_KOhbP6-f%O –g*<. w>ý( & &0!I7'1!v# #"Kýí¡À.IOYcpŠ%>73!5654&#"&5463235".54>322#"&547#"&546323"542654#"'2>54&#"2>54'#".5“S‡ýpH8.1A4D`MJc%À/9( 6&B2Œ&. K79IIc]KNg:e5·þ¿' Ò$.¢&7 K75MLñ+ && $ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ 8%6LM5 `JOhcO#!G%O –g*<. w>üì.(< .&8MHpO—$ % !!  +Kþ¶£À.gmw%>73!5654&#"&5463235".54>322'654&#"#54&#"#54&#"632#"&54>3263263"542654#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2“ %-ZB,%7% 67d '*)#'/24@6BYe5·þ¿' Í +ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# ç C.q,,_9BÚ½!-ÜÍ!‡08*'3H84M)4301F%O –g*<. w>ýW:8Kþº¦À.jpz„%>73!5654&#"&5463235".54>322#"&547&#"#54&#"#54&"632#"&54>3263263"542654'%3254&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2‡ý]%)R18J#,5%6KþW¯À.|‚Œ—¡%>73!5654&#"&5463235".54>324>32632632#"'732>54'#"&467&#"#54&#"#54&"632#"&3"543254'3254#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2þk"2)7(53"6H41T=$  %-53 ,.--#2(2(>,"')%-Le5·þ¿' › ,  þB&%ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ^6N$4301M Z5Lf B,K%F>8XM+%Õ¹(#×É" 2"/:),(D9%O –g*<. w>ý¡%U, +1'56KþÙšÀKQ[%>733!5654&#"&546323!5654&#"&5463235".54>3273"54“S‡þ«/$*$/B2!2 ÇýªH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ד7þJþÝ 1#*!+$91>' "-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>Kþ#£ÀY_iv%>733##"&547#5654&#"&546323!5654&#"&5463235".54>3273"542>54&#"“S‡(! /A'¥/$*$/B2!2 ÇýªH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ó .$%ד7þJþÝ1*A/2 1#*!+$91>' "-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>üÖ "&$Kþ¡À[akvŠ%>733#".547#5654&#"&546323!5654&#"&5463235".54>3273"542654'#2654'#"&547“S‡*1$%1–/$*$/B2!2 ÇýªH8.1A4D`MJc%À/9( 6&B2·e5·þ¿' Ø  &4) )1ד7þJþÝ%:..;$ 1#*!+$91>' "-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>ý ! !P." ,+ &$,KþM™À\bl%>73#"&54632&#"325!5654&#"&546323!5654&#"&5463235".54>3273"54“S‡š;VV43*+LQeþá/$*$/B2"1 Ìý¦H8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ד7ý Œz4'*"+#:3<' $-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>KþR™ÀY_i%>73# 4732>=!5654&#"&546323!5654&#"&5463235".54>3273"54“S‡zVþž>5“©DEþä/)+$.@42?Éý§H8.1A4D`MJc%À/9( 6&B2·e5·þ¿' ד7ý5G SL@Gjt &2$*")";2=<0$-O.:B4B$5WK[ZJ9)?* #+RT# _%O –g*<. w>Kýí£À.flvƒ%>73!5654&#"&5463235".54>322353#"&547#"&547326=!5654&#"&5463"542>4.#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2V2?É77BA/0@Œ¼>5Ÿ~Qoþä/$ *$.C>e5·þ¿' ó  %%ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þã7. Óî/C,<<,!s`LG>?M^)!.")'!6/8|%O –g*<. w>ü›."!Kýë¤À.kq{‡›%>73!5654&#"&5463235".54>32#".547#"&547326=!5654&#"&546323533"542654&#"2654'#"&547“S‡ýpH8.1A4D`MJc%À/9( 6&B2½7-# %-‚¥70ŽsIdÿ+"&*;-.9µ1Ne5·þ¿' Û%535/ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þ :0$5 .:$cRB=47BQ#(!!/(1/'µÌ2B%O –g*<. w>üæ P." '"#& '".Kþ¼™À.NT^g%>73!5654&#"&5463235".54>322!5654&#"&5463235463"54"354&“S‡ýpH8.1A4D`MJc%À/9( 6&B2{>Kþ4/$ *#.B12AlHxe5·þ¿' Þ)2½6ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# íO@›3%)"+";1=<1$’6HL%O –g*<. w>þ=:+…g;HKþ¤À.Z`js€%>73!5654&#"&5463235".54>322##"&547!5654&#"&5463235463"54"354&2654&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B2{>K#-*,<#þÓ/$ *#.B12AlHxe5·þ¿' Þ)2½6!"ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# íO@›/'3 <+03%)"+";1=<1$’6HL%O –g*<. w>þ=:+…g;Hþ$+ #Kýí¡À.[akt~‘%>73!5654&#"&5463235".54>322##"&547!5654&#"&5463235463"54"354&2654#"2654'"&547“S‡ýpH8.1A4D`MJc%À/9( 6&B2{>K,6 8%7J6þ÷/$ *#.B12AlHxe5·þ¿' Þ)2½68-2*:%P%,8ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# íO@›"= #*E1="3%)"+";1=<1$’6HL%O –g*<. w>þ=:+…g;Hþ¢ ))R5&  211&5KþÆšÀ.6<FRY%>73!5654&#"&5463235".54>324632!3"54354&'4#"6“S‡ýpH8.1A4D`MJc%À/9( 6&B29T‘þâÎe5·þ¿' ù&¡-/*2,Amד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þUc]°xr%O –g*<. w>ýû).gM<$6TNKþ À.BHR^eq%>73!5654&#"&5463235".54>324632#".547#3"54354&'4#"62654&#"“S‡ýpH8.1A4D`MJc%À/9( 6&B29T‘!'-* +-'|Îe5·þ¿' ù&¡-/*2,Am 6!ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þUc]°x 1'3 2'1 r%O –g*<. w>ýû).gM<$6TNê$+  Kýé£À.DJT`gq„†%>73!5654&#"&5463235".54>324632#".547#3"54354&'4#"62654#"2654'"&5477#“S‡ýpH8.1A4D`MJc%À/9( 6&B29T‘(1 6J5 1]Îe5·þ¿' ù&¡-/*2,Am-1*74,5+78 ד7þG-O.:B4B$5WK[ZJ9)?* #+RT# þUc]°x&< #-,$ =%r%O –g*<. w>ýû).gM<$6TNÅ +*V8'! '!!'2'8ËTÿ;Ã@FQ%>73# $54673265!5654&#"&5463235".54>3273"54&9§©zŠþÿþÇ-0*$å›Ôý¬G:+1A3B`NK]$Á09(.% uÊt7Êþ«' Ù„Nþ5p<+ñÎAhA1:2ESEU]F9*?*#4 ®(P#P –f). w>TþšGÃOU`m#".547# $54673265!5654&#"&5463235".54>32>733"542654&#"þ0 2"#3 hmþÿþÇ-0*$å›Ôý¬G:+1A3B`NK]$Á09(.% u9§Kt7Êþ«' þ"##ƒ 8+ #*+" ñÎAhA1:2ESEU]F9*?*#4 ®(„Nþ5BŒ#P –f). w>ýV#!" TþCCÃJP[i~"&547# $54673265!5654&#"&5463235".54>32>733"542654.'"2654&'#".=Ø38U|TXSþÿþÇ-0*$å›Ôý¬G:+1A3B`NK]$Á09(.% u9§Kt7Êþ«' Î,P:-8'#!+ œQ/=VU>0&ñÎAhA1:2ESEU]F9*?*#4 ®(„Nþ5Tž#P –f). w>ýV[8*%36& "  +LÿE×ÃDQ#".547.=4&#"#4&#"&5463263232654.'2654&#H9S>AE/ "*8ND-)+S8"3',2%‚nOU91TDd<05A 4&6+* #À~fn;J2B 2!$ WGKWK )þÂ<5,1J,?;E°_yKI`KU>P_I0?7ýà "LþüÖÃ?L_#"&547.=4&#"#4&#"&5463263232654.'2654&'"#2>54'#"&'H=OQSS>=S50=D-)+S8"3',s‚nOU91TDd<05A 4& .&C&0 3&1 EÀ|d9]CXUAH'T=KWK )þÂ<5,1JˆFE°_yKI`KU>P_I0?7ýë $v+'  %5 # 2+IÿÝÃT%2654'7#"&54632&#"3265#"&'&'&#"#4&#".546326329Ig†-G}R[}|_^>0@(cu‘L+CR P+5S3# )# 2$*: pRQ;2RIb52gLiTbí.UbH/)"!-!Žt%+jWP6]yC' O;?X(;2|™0RI`q3/S0*'9 s‚lQU91TJ^l6@y0L&3N‚&&%  #þÈ 3#7FB '/#$¼‹?bK'Æ:þÂ3>)<1™5E°Z~KIcD%¹]K˜6t’F7jrT7­' , ;% &LþÀÖÃ8^dlv#"&=4&#"#4&#"&5463263232654.'2#"/32654&+#"'#"&5463>32#4&"325#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&O0*+"!*8.5+'0782*X0%6""A}j(?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÆ7#$1 # !!AU227(0!:E%32&1&6t ) =7Lþ¿ÖÃ8gpw€#"&=4&#"#4&#"&5463263232654.'2#"/3254+53254+#"'#"&54634632#4.#"325#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&n #G"*8.6*(/6O4*%30 ! A}k (?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÆ 6!CR226)27G64 2%8P_I0?7þ>=00+5/''$5B,,,#C0;k!,/+ ,a !5,Lþ.×Ã8ipy‚#"&=4&#"#4&#"&5463263232654.'2#"&5462&#"32654&+#"'#"&546;4632#.#"26=#'32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&B-;mp7JPz6"0*(?Sc& 9/5*:'.05+*:2!!;#{!Ž&;ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÅO9Dt ]F+5AP33/308GE:)/0(Œ5, (0>#86Lþ¹×Ã8ny€‡#"&=4&#"#4&#"&5463263232654.'2'654&#"32#".547##"'#"&546;46323>2654+'4&#"325#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4& ".%S$=?.(1A;*$) 8.6+'1993+V# C1' …% !B~k(?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þC 9$TF6I5H;%6&/20CS228'0!9E~4Jþù$<*&‰%27 1'5s3%=6Lþ½×Ã8Œ“š£#"&=4&#"#4&#"&5463263232654.'2#"/3254+57>54&#"32#"&547##"'#"&546;46326264&+'.#"327#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&+> ,04( .% - (8! 3#+0'08.7+'08:4+* ##(" !A~k'?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þC$ &'%. (1*%#'.&0)B1CS227(.#6H/!€þù0! $,‰&16!1(4s3%=6LþVÔÃ8ƒŽ•¦#"&=4&#"#4&#"&5463263232654.'2#!"3!!"&5463!254&+532654&#"32#"&57##"'#"&54;46323>2654&+'4&#"325#32=#"H-= ^PGbD-)+S8"3',s‚nOU91TDd<05A 4& 9N43eþ ##Yý§'&ÊZ 1!X+,&*"*%7/6,&0n3*Y ]/#\%"#Ck*AÀDP9_u`MKWK )þÂ<5,1J…IE°_yKI`KU>P_I0?7þA1(&2Q/"$:#"&,*$);%9F,,+$D.=k/>áDt ,/)#,d "5/Lþ*ÔÃ8{†”ž#"&=4&#"#4&#"&5463263232654.'2#"&54632&#"32654&#"2#".547##"'#"&546;>323>2654+'.#"327#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&C\€j'gQ=66.$R6RbC5IG;%)$8.6+'08<3*Y# C 0(z" !@~k'?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þAsXkŠ q[MbW%5!5*" DS227(0!:E5Kþ÷= 8‰'15#1(4t3 =7LþGÔÃ8fmu#"&=4&#"#4&#"&5463263232654.'2#"&54732>54&+#"'#"&54;>32#4&#"325#32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&L(2rƒ«:.VL`?Z/8.5)&1Z+3*Z 1#!!A|k'?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÄ7*YljfFGQ\;435%BU227)P:E%30(1(4t% =7LýîÕÃ8qwš#"&=4&#"#4&#"&5463263232654.'2"&547#"&54732>54&+#"'#"&54;>32#4&"325#2>54&+32=#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&L'3FH?b? ¯:.?^J&GE* 8.4)%2Z+3*Z 1%6!!A|Ä $ %þì'?ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÔ/'J1D(:9)}_Y>>H5L# ;):K--/%H1>o"++",$-f þÈ$   60LýìÔÃ8u}†–Ÿ³#"&=4&#"#4&#"&5463263232654.'#"&547#"&54732>54&+#"'#"&54;463232'.#"327#2>54&#'32=#"2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&S(, 0 1B y 6+;WE#B@'5*2'"/T(0(S '$/§;t ñ%;ãF0$'ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý 9 $;+$wXT;=A2H! 8&5H**-#C/:i-$Q¢  -)!,`þ÷ ì&3-þ§%+# !LþÏÔÃ8[e#"&=4&#"#4&#"&5463263232654.'233!5654&#"632#"&546"3254&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&¥?Z6¥9þÝCA.!0 ("-%+)2U,/ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þWS@E8 þÜ0K5C1#/6)!6C7TcŸ65LþßÃ8kx‚#"&=4&#"#4&#"&5463263232654.'233##".547#5654&#"632#"&5462>54&#""3254&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&¥?Z6¥9&! !0 &CA.!0 ("-%+)2U, ."þð,/ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þWS@E8 þÜ2*) 20K5C1#/6)!6C7TcþV "-. 65LýøÔÃ8kw‹•#"&=4&#"#4&#"&5463263232654.'233##".547#5654&#"632#"&5462654&#"2654'#"&547"3254&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&¥?Z6¥9-7 4" %7mCA.!0 ("-%+)2U ?!'&#0ë,/ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þWS@E8 þÜ#@ $,.@#0K5C1#/6)!6C7Tcþ|P') 44 (#-565Lþ¾ÔÃ8Y#"&=4&#"#4&#"&5463263232654.'4632&#";2#"'73254+"&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&b:DT0$C$5-?70N1V,&KS>@'0ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýâ&;0%&05./&5(-LýüÕÃ8ep#"&=4&#"#4&#"&5463263232654.'2#"&547&'73254+"&54632&#"3264&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&8703<! .B*6&KS>@'0:DT0$C$5-?#!$%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÅ09D*?16! &5(-$&;0%&þÊ-&-&$LýæÔÃ8gt‰#"&=4&#"#4&#"&5463263232654.'2#".547&'73254+"&54632&#"32654'#"'2>54'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&8708? 4" %6.&KS>@'0:DT0$C$5-$ ", )'"/ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÅ0;$G $,.?&&5(-$&;0%&þü   P#!  *4 &".Lþ¼ÔÃ8c#"&=4&#"#4&#"&5463263232654.'2#".54732654+"54632&#"3H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&10<19?_.8,65M)6?zKP_I0?7ýÂ3#!*,?7D6+7>-.#N.:0%#!LýÿÔÃ8lx#"&=4&#"#4&#"&5463263232654.'2#"&547.54732654+"54632&#"32654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&10<34! /A$R]8,65M)6?zKP_I0?7ýÂ3#0"<*@01!h:D6+7>-.#N.:0%#!þÐ$"&$LýèÔÃ8lz#"&=4&#"#4&#"&5463263232654.'2#".547.54732654+"54632&#"32654'#"'2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&10<:9H3 %0LV8,65M)6?zKP_I0?7ýÂ3#3$C4G.=$d8D6+7>-.#N.:0%#!ÿ   P." 43 &"Lþ¾ÔÃ;eo#"&=4&#"#4#"&54>;263232654.'2'654&#"#"&547&#"&5463262654'H/>^PGb>3)+SZ3',s‚,@4o%1TL\4'6@6'L_Q$:H7F6-+5C. ?HU;'$"2'8A"ÀFO1_u`MUES )þÂ;J,1J™5E°>\+KIhVU44`H,A;þFaFZ0 .H=S^PGbD-)+S8"3',s‚nOU91TDd<05A 4& ,@"B0þø((vþŠ"*)#í#2C7  G8+*6B .;AIN?(!#3!7A"ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þD12?V3$$C49G3C/:9-F+@-G 'P:PÜ&;(-:$LþXÔÃ8z„#"&=4&#"#4&#"&5463263232654.'4632632#!"3!!"&546;254&+532654#"#"&547&#"&72654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&þâN<+!$@ˆ./*0þá''sþ5#)êW L.E7,+5C/:@HÅ!7B"ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýÂ9KS#.#73#0;!: 1C09:-@.>/G %&:(-9$Lþ-ÕÃ8s}#"&=4&#"#4&#"&5463263232654.'2#"&54632&#"32654&#"#".547&#"&54>3262654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4& Paj@LO=?6$9QQOaG<F8-$. C2=?H%.! $/#8@*ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þDwXj‡0u\Ne3262'654#"#54#"&546326'2654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&Qd†m<N.5%*:@'ThN@$I9,(E2?>G%. $! 9"9C,ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þAˆex“ &$.+‚hZ{=Q5I,# R6K8S) 2`%; þz  ' 1%G24J,%LþLÔÃ8q{#"&=4&#"#4&#"&5463263232654.'2#"&54732>54.#""&547&#"&5463262654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&G^7mK­5!3‘l>Y.*$ G8V5C/ACGU;)"*;"7>ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þDpS$GG,”yNG54.#"#"&547&#"&54632632'2654'2654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&W#(=/.> ~§3 2j;W-" E8)*3A-/AFQ<&"'(D\ÿ!6;­",-#ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý 7)<9,†lG?8>Zp15"7 6H2?<2G29*M$ /U=ReJ]#*!@+-B 'è)#LýòÔÃ8ˆ”©#"&=4&#"#4&#"&5463263232654.'#".547#"&54732>54.#"#"&547&#"&54632632$2654'2654&#"2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&Q*, 0 +8 y 0/„h:S*6(B5('2>(3 ?CO8!$'%BWþô0 3:ª !#1 #%-ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý9" $,*${dA;2;Sg.0:;2B/98-C-.+E$ *O:J]E`+&:)(?Ü C&,, &LÿöÊà CL2!53546#"&=4&#"#4&#"&5463263232654.'"!54&ù\uýדpþ¤/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ê@P#RÂycæ"âWgFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7YFιSaLÿEÕÃPYd2##".547!53546#"&=4&#"#4&#"&5463263232654.'"!54&2654'#ù\uE/ "*þ—“pþ¤/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ê@P#R "//#Âycæ,3A 2!,"âWgFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7YFιSaýú"0 0#LÿÒÃNWdv2##"&547!53546#"&=4&#"#4&#"&5463263232654.'"!54&2654&#"2654'#"&'ù\u%-T=?Q0þÀ“pþ¤/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ê@P#R%%")92'1 EÂycæ"ABYW?B&"âWgFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7YFιSaþ "X9)" %5 # 2+LÿÊà Yb2#"&54632&#"3265!53546#"&=4&#"#4&#"&5463263232654.'"!54&ù\ut˜b|“KXI7F‹_'{^þ“pþ¤/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ê@P#RÂycævu-$ -"%a^"âWgFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7YFιSaLþºÔÃ8]#"&=4&#"#4&#"&5463263232654.'2'654&#"#54&#"&546326H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&"6H -%?(. 9'(1KUK:7&%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þAWB1>*Z+Fѵ&!A0\#/gCX10Lþ»ÔÃ8\f#"&=4&#"#4&#"&5463263232654.'2#"&547&#"#54#"&5463262654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&CZ6+*7D *97'4MYJ86%/k6B$ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þAgL7EC7R6 ѵHD2Z!-hAZ0/þü)"O.4E$+LþXàÃ8v‚#"&=4&#"#4&#"&5463263232654.'4>32632#"'732>54'#"&54>7&#"#54#"&2654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&þw /&4'+",98  NZx"+ ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý§.B 0.KS2Ih ':0P&^PGbD-)+S8"3',s‚nOU91TDd<05A 4&À!2 Ç;þ«/$*$/BÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýû' $ þÝ 1#*!+$91>Lþ"ÕÃ8bn#"&=4&#"#4&#"&5463263232654.'233##"&47#5654&#"&5462654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&À!2 Ç;%! /A$£/$*$/B*"!$%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýû' $ þÝ/*A^ 1#*!+$91>þº.-&$LýÿÔÃ8eq†#"&=4&#"#4&#"&5463263232654.'233##".547#5654&#"&5462654&#"2>54'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&À!2 Ç;-5 4" %5›/$*$/B %&)'"1ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýû' $ þÝ&? $,.?& 1#*!+$91>þß P ' ,4 '$,LþZÔÃ8n#"&=4&#"#4&#"&5463263232654.'233#"&54632&#"3265!5654&#"&546H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&¾+Ò002+fU54),L:P_I0?7þ  #þÜ(:  ?;4)*"+";2=Lþ`ÔÃ8e#"&=4&#"#4&#"&5463263232654.'233# 4732>=!5654&#"&546H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&½2?É7u[þž>5“©DEþä/) *$.@ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ýû;1& þÙ2J SL@Gjt &2$*")$92=LýîÕÃ8s#"&=4&#"#4&#"&5463263232654.'2353#"&547#"&547326=!5654&#"&5462654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&¼2?É78A! /A »>5žPpþä/$ *$.?)"!$%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þ7;1&ãÿ4!G*A/"{gRMAFRe-#2%*")";2=þJ.-&$LýëÔÃvƒ˜3#".547#"&54732>=!5654&#"&5463235#"&=4&#"#4&#"&5463263232654.'2654'2>54'#"&547H/>-$BJ 4" %! Šº>5€(G=þø/) *$.?52?µ.@GbD-)+S8"3',s‚nOU91TDd<05A 4& ", 3&#/ÀFO1[;ÿ>" P $,./$|fRMAFRe &3$*"+#:2=<0&Î)`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7üÆ  P#!  '"4 '".Lþ¼ÔÃ8W`#"&=4&#"#4&#"&5463263232654.'2!5654&#"&54623546"354&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&>Kþ4/# *#.BbBlJJ)2½6ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þCO@›3$)",";1=<1$’7G&9,…g;HLþßÃ8bkw#"&=4&#"#4&#"&5463263232654.'2##"&547!5654&#"&54623546"354&2654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&>K)B./A)þà/# *#.BbBlJJ)2½6&."$ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þCO@›41?@043$)",";1=<1$’7G&9,…g;Hþx$"-&LýëâÃ8eny#"&=4&#"#4&#"&5463263232654.'2##"&547!5654&#"&54623546"354&2654'#2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&>K%3$ 4H3þê/# *#.BbBlJJ)2½6.$ L433ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þCO@› <.G4< 3$)",";1=<1$’7G&9,…g;Hþ©  P-# '"#& '!LþÆÔÃ8@LS#"&=4&#"#4&#"&5463263232654.'4632!7354&'4#"6H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&9T‘þâ½&¡-/*2,AmÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý…c]°x¾).gM<$6TNLþ ÕÃ8JV]g#"&=4&#"#4&#"&5463263232654.'4632##"&47#7354&'4#"62654'#H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&9T‘&A/0@&o½&¡-/*2,Am6%11ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý…c]°x1/A@`¾).gM<$6TNç%2 2LýëÔÃ8P\co„†#"&=4&#"#4&#"&5463263232654.'4632##".547#7354&'4#"62654&#"2>54'#"&5477#H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&9T‘*3 4" %3c½&¡-/*2,Am", 3&#/' ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý…c]°x"> $,.>"¾).gM<$6TNÀ P#!  '"4 '".§Lþ,ÔÃ8Zen#"&=4&#"#4&#"&5463263232654.'4>32#".54632&#"326=#7354&#'"654&H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&},-’CV38J5B;7N;)ó¼#$(¦30,_(t ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý©1D ±€KL6:¾ >%$bPB!5?tS[!Mÿ1bÃH#"$5473 7#".=4.#"#4&#"&5463263232654'Ü=IIoºvìþÚ[$V Öœ%#.C 11$:S6#MþŒgÃTcu#"&547#"$5473 7#".=4.#"#4&#"&5463263232654'72654&#"2654'#"&'ê &U<=Sh‡ìþÚ[$V Öœ%#.C 11$:S6#54'2654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&C*C4/>,#N5&+6^G:D= Qý(E%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þF ,1"@RA60.>?V.;I8NaH:+Z /!a"ð#&C6%NOLþÕÃ8jx#"&=4&#"#4&#"&5463263232654.'#"&547&=4&#"#"&5463232>54'2654&'+'2654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&C*49A/0@-6,#N5&+6^G:D= Q# 2%ç(E%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þF ,1"R) A/A@08! H0.>?V.;I8NaH:+Z /!a"þg-% 3$©#&C6%NOLýëÔÃ8o|‘š#"&=4&#"#4&#"&5463263232654.'#".547&=4&#"#"&5463232>54'2654'#"'2>54'#"&547'2654'H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&C*=@ 4" %B2,#N5&+6^G:D= Q ", 3&#/Å(E%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þF ,1"[&#I $,.J"!E0.>?V.;I8NaH:+Z /!a"þ“   P#!  '"4 '".Í#&C6%NOLþºÔÃ8k#"&=4&#"#4&#"&5463263232654.'2654'7#"&=4&#"#54#"&54>32632H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&3!+Q^@4/A"'"9: %&MW-% 8%"6.A'ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý<>.c$,v?M@31)?%ѶH5'b$-u*> 0.?28(3LþÕÃ8s#"&=4&#"#4&#"&5463263232654.'2654'7#"&547&=4&#"#54#"&54>326322654&'+H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&3!+Q^08B./A+7"'"9: %&MW-% 8%"6.A'$#-%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý<>.c$,vN'A1??17!E1)?%ѶH5'b$-u*> 0.?28(3§-& 0$LýëÔÃ8x„™#"&=4&#"#4&#"&5463263232654.'2654'7#".547&=4&#"#54#"&54>326322654'#"'2>54'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&3!+Q^5; 4" %P_I0?7ý<>.c$,vR'$D $,.E$!>1)?%ѶH5'b$-u*> 0.?28(3v 0P#!  '"4 '".Lþ+ØÃ8‚#"&54.#"#4&#"&5463263232654.'2654'7#"54632&#"32>5#"'&'&#"#54#"&54>32632H,< _OI`.%3/S*0'9 s‚lQU91TJ^<05A 4%+$0DZ";>$X4G'D5R+>!:^4$97'NZ .& 5'!61AÀBK8_ubK`l!:þÂ,E)<1™5E°Z~KIeFU=Q_I1?8ý:C1V&L’@\02 251€J1Ò¶H," Z!+m-B 0/Q^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ƒ0ZHŒaO~L2=9­Ž´T-6 :9'/KXI<3$ 8=3$*$ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý¤7H K`,QN/#5HC"XG@IdyS )'6MÒ¶H;1b$-pCR0/?+Q("=LýïÖÃ8ˆ™#"&=4&#"#4&#"&5463263232654.'4&'7#".547#"&547327#".=4&#"#54#"&546326323262654&#"#H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&ƒ1ZN'& 0!0 :A¡½=9«³U, 6<:9.(KXI<3$9p%0K.-%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý²4@ BYb< 4 %%  ‚kPA:C[nK,# F/¿¦B=&[(g54&#"2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&…(U`,1 2"1D1;–¶:6¥†©R&1 (976,&HTE91" 3k("g  $1"#'.ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý¼G?Qj9<" &=,# xfJ=7>UgG2/A ,²›=9#U&`9E('YE'4è I' -%  'Lþ¼ÔÃ8Mc#"&=4&#"#4&#"&5463263232654.'2'654&"&54'2'654&"&546H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&+|LA$A6X9H [µ>LA$A6X9H [VÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þARD@K !L0;<1V*iEVRD@K !L0;<1V*iEVLþ ßÃ8Wmy#"&=4&#"#4&#"&5463263232654.'"&54>54&#"&5462$2'654&#"&542654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&Y-,A^A%+%7+-8H [W|Lýî|LA$A6,-8H [,&-.$ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý@ >%/AA/(04+0;<1V*iEVRD?ÕRD@K !L0;=0V*iEþ´$#!&LýëÝÃ8]u€”#"&=4&#"#4&#"&5463263232654.'#"&547'654&#"&54632%2'654&#"&5462654&"2654'#"&547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&> !)$ 4H?A7+.7H [V?>Lþ,>L*(A7+.7H [UÐ$L433ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7ý7 3".G4G$!L0;<1V*iEVRˆÚRD.G!L0;<1V*iEVþ…P." '"#& '!Lþ;×Ã8Zp#"&=4&#"#4&#"&5463263232654.'2#"&547 654&"&546#2'654&#"&546H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&': Æ—™Ë@9¹©@^9G ZSö9Ne@5,/:H [TÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þG':1|•˜TIBKl…‚j.>:1N,9XFXT?b:+B2=;0M-9XEYLýìÜÃ8N~‰#"&=4&#"#4&#"&5463263232654.'2'654&#"&546!2#"&547#"&54732654&"&5462654&#"H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&þé;Le@5,09H [T€': Z(+7*/A>@Ç@9µ‡­@^9G ZSY.!%%ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þGM7W6';+94,G'3P@N#4,iC 7 ),9+ŠqJC:E]|u`)84,H&3P@Nþ1(!2!LýëÔÃ8Nƒ“©#"&=4&#"#4&#"&5463263232654.'2'654&#"&546#".547#"&54732654.#"&546322>54.+2654'#".547H/>^PGbD-)+S8"3',s‚nOU91TDd<05A 4&þö7I`=4)*9E VO’-39+"3 7<’À=6«‰¤& -6D VPA&8 ‡   $1 "" .ÀFO1_u`MKWK )þÂ<5,1J™5E°_yKI`KU>P_I0?7þFG5S2%8)52)@'2I54&#"&546323&5462#¾#?Aü¿,H‚#Rl ,7(AxL8þ@(!7,0=5D\KIa&æMŽÌ•KIaM/T3:tx]3P, pQH^ E-6=.G!2[FVSE7.Eji†–rnLKJþýúÀM3!!"&5463%26544>54&#"!5>54&#"&54623&54632#"}!Cü½0=>/}.?7*$/ UB\rM7þ@(!8+0=5D\–_&æM’w`‚I]5ýQn*R<04C?#"';(&-RFÿÞÂE2#"54>32&#"3 4.#"!5654&#"&546323&546òk.EbX2Ö'@@ wN+8Y3B~ 44GV:0þ4D_NLb&êDr¨…\‹P1K$'K@^/[K>M/K$'1S3!:IeþXH073>4D_M*B$&ëJeSQ97ƒb3U5 =‘Qb+$þÂ<2aHH/K&:B2F!3XH_'0# 7,OuaxHHLÿùïÄ=H2#"&5467&#"#4&#"!5654&#"&54623&5463262654&'g†Q@AQ:0.2CS7+8J5þvG8-2@4C_–d%×AnRU9E¦(0,(g7ÃtRgfR>n$.&þÂ0=`OJa/K+6A4E"4XK[ZI:)FueJIþs<1,}!Ql6DKÿccÃTa%4632632#"'7327654&'#"&54>7&#"#4&#"!5654&#"&546323&2654' jWL7@\:i"\Vr=5'(_=87+RC;F!=((b5BS'DP]þvG7-1C5D`LKd&×K,/)'2!,é^|IH>4~Mm*QG`?Q -dMB/K,5B4C#2YJ\YJ6,O32#"&4632&#"326=!5654&#"&546323354+4&#"6 /X@äbA••AOB'M&XU)_BýgH8-2A4BaNK]$ '7'*úŸFI*!jµÇ:VG%þöåhO,>+%KP#-O-;>193ESEU]F;*'CF''–å2;%3¶°‚JÿaÃ;2#".54732654&#"!5654&#"&546323&546yd„þîàšù’[NÏÀïZCDV@1þPG7-4@4D`LJd&áDräw¼åoч„p `r±ÛÁœWxcJB]/J+7D2B$3XL[YI:*Aoi…Jþ×cÃKZ#".=#".54732>54&#"!5654&#"&546323&546322654&#" $6E/ ")x§’òŽ[NÇe¡bAZCAY@1þPG7-2B4DcIJd&áDs\c…r#$  C :/3A 1" 6mÆ|„p `rŸÖ+CYT+Wx^OB]/J,6B4D"3XK\XJ:*Aokƒ£x‡þú"!JþraÃLYk2#"&547#".54732>54&#"!5654&#"&546323&5462654&#"2654'#"&'yc…ƒ#/T=@P e†’òŽ[NÇe¡bAZCAY@1þPG7-2B4DcIJd&áDs¡%(:3&1 /ãx§n 8%BYY="mÆ|„p `rŸÖ+CYT+Wx^OB]/J,6B4D"3XK\XJ:*AokƒýG"X7+" &4"! CKþÁÒ¿2Zc2'654&#"!5>54&#"&546323&546#"&=4&#"#"&5463232654'2654'õa|"6,aZHF\L8þ@(!7,0=5D\KIa&æM„Ó*C4.?,#N5&+6^G:D=?V-54&#"&546323&546#"&547&=4&#"#"&5463232654'2654&'#'2654'õa|"6,aZHF\L8þ@(!7,0=5D\KIa&æM„Ó*/>B./A':,#N5&+6^G:D=?V-54&#"&546323&546#".547&=4&#"#"&5463232654'2654'#"'2>54'#"&547'2654'õa|"6,aZHF\L8þ@(!7,0=5D\KIa&æM„Ó*9F 4" %=7,#N5&+6^G:D=?V-54춮&#"632#"&54632#'2654&"2654'#·!:wE01E«1<=0± . =$)7QBRl$:/@B78LtAQ7II$4+Ñ"$4 !ø2"-.)I(3CB4(6V@#5/$*4L98G98J\Cg} ?+=+B$3 1#$/-H2þi#. .JþI6ÁJT_t"3!##".547#"&46;2>54춮&#"632#"&54632#'2654&"2654'#2654&'#3#"&=·!:w,4S@+> 4Ž1<=0± . =$)7QBRl$:/@B78LtAQ7II$4+Ñ"$4 !Ï.""V7,73%/))I+F32+"3!&54>;254+53254#"632#"&54>2654&#"2654&#"2654&#"A`{=WŸÔ6jvB31Cý¬, <,¢T:Ž$6.=A0;F/>< ay=WÕ6«.*¢€R:Žž#7/32+"3!&54>;254+53254#"632#"&54>2654&#"2654&"2654'#"&'2654&#"A`{=WŸÔ6jw+T=?R.ýÅ, <,¢T:Ž$6.=A0;F/>< ay=WÕ6«.*¢€R:Žž#7/AZV@A'# *9US%MPo8InMZG0J- ?4I!\r$&1 US%MPo8I78LZG;V+þÂ1$!/,#%1þxu/2# '""*7à1$!/-"%1MÿNÃ2=I2#".547&'73254'"&5473&546>54&#"2654&#"o$9 PK ':D1#3 V"F>]xK%#G9+O"==/%#*"!!+!Á$, 7\<02D*" @6<mMT6#+=@W?PMDþâL-)75+Kþ¶##$MÿÃ7BNg2;2#"&547&'73254'"&5473&546>54&#"2654.'2>54&'#".=o$9 PK *= 7#=U!`%F>]xK%#G9+O"==/%#*):"*-83%$&#Á$, 7\$5+ ,#V=6(E6<mMT6#+=@W?PMDþâL-)75+KþÆ/[$ %35!- ' *MþÊÃ&LW]fo2#"'73254'"&5473&5462#"/32654&+#"'#"&5463>32>54&#"4&"325#32=#"o$9 PK ?4c%F>]xK%#G9+O†1),! !*8.5)%2782*Z :==/%#*1%6 "A}j(?Á$, 7\+3F6<mMT6#+=@W?PMDý¸6$%0 # !CS226)0!:E*L-)75+Kþš%30(1'5t%=7FþÉÃ&U`hqz2#"'73254'"&5473&5462#"/3254+53254+#"'#"&54634632>54&#"4.#"325#32=#"o$9 PK ?4c%F>]xK%#G9+O— #G"*8.5)(/6O4*%30==/%#*' ! A}j(?Á$, 7\+3F6<mMT6#+=@W?PMDý¸ 6!CR226)1 7G55*L-)75+Kþš#&2%9 #%s%=69þ6 Ã&hs{„2#"'73254'"&5473&5462#".54732654&+532654+#"'#"&54634632>54&#".#"327#32=#"o$9 PK ?4c%F>]xK%#G9+O‘+-Y>*PO181(CF(bT !$*"!(/?,#$@==/%#*= 0 3eY 3Á$, 7\+3F6<mMT6#+=@W?PMDý±"30;uPUI>MC`1B, .1007)1!6H-%1L-)75+Kþ“ !U2 !q1-<5þëÃ#]hu{‚‹2#"'73254'"&5473&5462'654&#"32#".547##"'#"&546;46323>'>54&#"2654+'."327#32=#"«BVOL ?4c% H>_vK%#G9+O–-B S$=?.8 E7*$) 8.5*%3994** # $+e==/%#*V 1'  %6!!A~k(?ÁY<7[*4F6<oKT6#+=@W=RNCþ5&7,UE4K5H/(&5&/11CS227(0!9E.")8­L-)75+Kþ<#‰'00'1)3s3$=6(þÇÓÃ#p{‡Ž•ž2#"'73254'"&5473&5462#"/3254+572654&#"32#"&5465##"'#"&546;>3267>54&#"2654&+'4&#"325#32=#"ÉBVPK >5c% H>]xK%#G9+O¥*? ,05' .% - ' 3*$, %28.5*%28:3** #==0$#*E(%&!B~k'?ÁY<7\*4F6<mMT6#+=@W=RMDþ5$ ('$/ (1*%# 4 (1?4CS226).#9E/!€­K.+55+Kþ" $,‰$3+,1)3s3%=6&þ`ÆÃ#ny„‹’›2#"'73254'"&5473&5462#!"3!!"&5463!254&+532654#"32#"&547##"'#"&54;>323>'>54&#"2654&+'4&#"325#32=#"¡BVOL >5c% H>]xK%#G9+OÎ:N10fþ !!Xý¨&'ÈY N7F)&-,!3/75*&1o2+Z  \g==0$#*`!^$ !B~k'?ÁY<7[*4F6<mMT6#+=@W=RMDþ31)&0S1#%8$!53&#,.4 0O++.#D0;k/>¯K.+55+Kþ5 Cs+.)#+a* 4-MÿÃ&BM2#"'73254'"&5473&546233!532654#"#&5467>54&#"o$9 PK ?4c%F>]xK%#G9+OV-6"•9þ[%1 3ž==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDþ 6*/ þÝ(9$ %0ÖL-)75+KMþMÃ&P[hl2#"'73254'"&5473&546233##"&547#532654#"#&5467>54&#"2>54&#"7#62o$9 PK ?4c%F>]xK%#G9+OV-6"•9&! /A%ù%1 3ž==/%#*] .$%! Á$, 7\+3F6<mMT6#+=@W?PMDþ 6*/ þÝ0*A/0(9$ %0ÖL-)75+Kýª "&$Mþ.Ã&Q\g{2#"'73254'"&5473&546233##".547#532654#"#&5467>54&#"2654'#2654'#"&547o$9 PK ?4c%F>]xK%#G9+OV-6"•9"2-# $5 2ð%1 3ž==/%#*E##1))'"1Á$, 7\+3F6<mMT6#+=@W?PMDþ 6*/ þÝ#<$5 -# <#(9$ %0ÖL-)75+KýÓ ""P9 ,4 &$,Mþ¾%Ã&OZd2#"'73254'"&5473&5462'654&#""&547&#"&5463267>54&#"2654'o$9 PK ?4c%F>]xK%#G9+O54&#"2654'o$9 PK ?4c%F>]xK%#G9+O9ITB0þø((vþŠ"**"í#2C7  G9T6B /:AIO>(!"==/%#*$!7A"Á$, 7\+3F6<mMT6#+=@W?PMDþ,UFAT3$$D39G3C099-F+A,F (O:P¶L-)75+Kþ2&;(-:$KþXÃ&hs}2#"'73254'"&5473&5464632632#!"3!!"&546;254&+532654#"#"&547&#"&>54&#"2654'o$9 PK ?4c%F>]xK%#G9+OñP:+!$@ˆ./*0þá''sþ ,#)êWL.E6-+5C/:@H==/%#*'!7B"Á$, 7\+3F6<mMT6#+=@W?PMDýª;IS$/#73%0;!%: 1C-<:-?/>/F %L-)75+Kþ6&:(-9$CþÛ#Ã#ju~‡2#"'73254'"&5473&5462'654&#"#"&547&#"#54&#"#"&547&#"&546326326326'>54&#"3254'2654'yBVOL >5c% H>]xK%#G9+O{)70#-$ + ")   * ) *% *0%*(@==/%#*#%"(» "'ÁY<7[*4F6<mMT6#+=@W=RMDþ-SBT* (E6L8I2?3;N- )¦Ÿ#.6I2?>0L/C4L% +Y?O87µK.*65+Kþj*MC,3‰+"C,2ADþ Ã&|‡—2#"'73254'"&5473&5462#!"3!!"5463!27654&#"#"&547&#"#54#"#"&547&#"&546326326326'>54&#"4'32'4'32o$9 PK ?4c%F>]xK%#G9+Ou0)5þ¬œþd)B"' &!$  3 %!$  % ),"'$;==/%#*f# !Ì# !Á$, 7\+3F6<mMT6#+=@W?PMDþ1Q2NC,:"$%.+D)C2-2+C$ "‹…C(C3-3+B%6*G#O4B-.±L-)75+Kþ=@;!%;>Kþƒ$Ã&‹–ž¦2#"'73254'"&5473&5462#!"'#"3!!"&5463!254&'#53254&#"#"&547&#"#54&#"#"&547&#"&546326326326'>54&#"4'32'4'32o$9 PK ?4c%F>]xK%#G9+O“2 $þ“¨þX "U5 '!% !  '!% $& *,$(%K==/%#*s$! Ð#! Á$, 7\+3F6<mMT6#+=@W?PMDþ0$(1#0,"5(# )A)6+2@%"‹…$ )B)6./C%8+E#N3D.-²L-)75+Kþ; $;>?54&#"o$9 PK ?4c%F>]xK%#G9+OO6H'$?(.!9"(1KUJ;9$$==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDþ.WB,F *Z+Fѵ,A0[$.hAZ10´L-)75+KFþÅ(Ã&JU_2#"'73254'"&5473&5462#"&547&#"#54#"&5463267>54&#"2654'o$9 PK ?4c%F>]xK%#G9+OMCZ6+*7D!)97'4MYI96%.==/%#*„6B$Á$, 7\+3F6<mMT6#+=@W?PMDþ3gL7ED6R6 ѵHB4Y"-hBY0/¯L-)75+Kþ)"O.4E$+Mþ…Ã&^iv2#"'73254'"&5473&546462632#"'732>54'#"&54>7&#"#54#"&>54&#"2654'o$9 PK ?4c%F>]xK%#G9+OïN+*D G6C\ $4,H#A93*(5(¸¥A47Q)L-)75+Kþ&+#(5 Mþè Ã&S^2#"'73254'"&5473&5462'654&#"#54&#"#54#"&546326326'>54&#"o$9 PK ?4c%F>]xK%#G9+Ot&4F2#)()('&7 @5'(,).==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDþ-L8^$!S,:.´$+´>9-N%]7M,,))µL-)75+KKþðÃ&Wbk2#"'73254'"&5473&5462#"&547&#"#54&#"#54#"&546326326'>54&#"3254'o$9 PK ?4c%F>]xK%#G9+Os !&&&0 4'!)&&%5 ?4&%*)(==/%#*n(&/Á$, 7\+3F6<mMT6#+=@W?PMDþ)<(.;8,E+ -¬•"(¬•<7*I$W7H**((¹L-)75+Kþu#?@(,Bþ‡Ã&kv~2#"'73254'"&5473&5464632632632#"'732>54'#"&54>7&#"#54&#"#54#"&>54&#"4'32e$9 NM ?4a' H>`uK%#G9+Oò.!"'#$/! *;-$) !""$"" / 7==/%#*’ 8 #Á$, 4^*4F6<nLT6#)?@W=RNCý˜9J,,)(@ C6>T !1(G 1=0'#.& ´š$)²š>:+M&¤L-)75+Kþb,A=MÿÃ&CN2#"'73254'"&5473&546233!5654&#"&5467>54&#"o$9 PK ?4c%F>]xK%#G9+Os- ´5þÌ+!& *;Ã==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDþ ' # þÚ 2$*"*#;2>ÂL-)75+KMþ[ Ã&NYe2#"'73254'"&5473&546233##"&547#5654&#"&5467>54&#"2654&#"o$9 PK ?4c%F>]xK%#G9+Os- µ4":*,9#“* & ):Ã==/%#*o!(*Á$, 7\+3F6<mMT6#+=@W?PMDþ' ! þÛ31?@02 2$)"+ =2=ÃL-)75+Ký¸%"!.Mþ8Ã&R]i}2#"'73254'"&5473&546233##".547#5654&#"&5467>54&#"2654&#"2654'"&547o$9 PK ?4c%F>]xK%#G9+Os, ´5&0 0 !0 0+!& *;Ã==/%#*\ #.%8&+Á$, 7\+3F6<mMT6#+=@W?PMDþ ( # þÛ&@ $--$ @& 2$*"+#;2>ÂL-)75+Kýß Q-$ *) &"/MþÐÃ&.9EL2#"'73254'"&5473&5464632!>54&#"354&'4#"6o$9 PK ?4c%F>]xK%#G9+Oa9T‘þâƒ==/%#*a$¡-/*2,AmÁ$, 7\+3F6<mMT6#+=@W?PMDýwc]°xÓL-)75+Kþ¯),gM<!"6TNMþ Ã&<GSZe2#"'73254'"&5473&5464632##"&547#>54&#"354&'4#"62654'#o$9 PK ?4c%F>]xK%#G9+Oa9T‘'! /A&rƒ==/%#*a$¡-/*2,Am1"11%Á$, 7\+3F6<mMT6#+=@W?PMDýwc]°x0*A/0ÓL-)75+Kþ¯),gM<!"6TNç.2 2$MýõÃ&=HT[fz|2#"'73254'"&5473&5464632##".547#>54&#"354&'4#"62654&#"2654'#"&5477#o$9 PK ?4c%F>]xK%#G9+Oa9T‘(4-# $5 4gƒ==/%#*a$¡-/*2,Am 0?!'&#0& Á$, 7\+3F6<mMT6#+=@W?PMDýwc]°x">$5 -# >"ÓL-)75+Kþ¯),gM<!"6TNÀe') 44 (#-§Mþ»ÃAL233!5654&#"&5462#"'73254'"&5473&546>54&#"ç=R59þûF8-,7C UOË$9 PK ?4c%F>]xK%#G9+O"==/%#*QBA; þÝ1A2=@/O!0eBYÖ$, 7\+3F6<mMT6#+=@W?PMDþâL-)75+KMþ Ã%1Xc233##"&547#5654&#"&5462654&#"2#"'73254'"&5473&546>54&#"ñ=R59")B./A)UF:+-6C UOî$!$%$9 PK ?4c%F>]xK%#G9+O"==/%#*QBA; þÝ41??141A2=@/O!0eBYþS&.&$ƒ$, 7\+3F6<mMT6#+=@W?PMDþâL-)75+KMýëÃ&OZez2#"'73254'"&5473&546233##"&547#5654&#"&5467>54&#"2654'#2654'#"&547o$9 PK ?4c%F>]xK%#G9+OL=R59'3$ 4H3MF:+,7C UO±==/%#*P$&4330Á$, 7\+3F6<mMT6#+=@W?PMDþ*QBA; þÝ <.G4< 1A2=@/O!0eBY¸L-)75+Ký P." '"#& '!/Mþó Ã&U`2#"'73254'"&5473&5462654'7#"&=4#"#54#"&54632632>54&#"o$9 PK ?4c%F>]xK%#G9+O€9B,% /4(),6=4%((!.H==/%#*Á$, 7\+3F6<mMT6#+=@W?PMDýV4&R$c5?4+)W ®—<+.R%b4C(&6(."*ŒL-)75+KMþeÃ&[fq2#"'73254'"&5473&5462654'7"&547&=4#"#54#"&5462632>54&#"2654&'#o$9 PK ?4c%F>]xK%#G9+O}9B%%8.7!$4 ()$6=3L%8I==/%#*m& &Á$, 7\+3F6<mMT6#+=@W?PMDýZ2%N"_A/0)*/.3'S¦:0&O$]1A'%*0,'"ˆL-)75+Ký¶,MþCÃ&do{2#"'73254'"&5473&5462654'7#".547&=4#"#54#"&54>32632>54&#"#"&#"32542654'#".547o$9 PK ?4c%F>]xK%#G9+O{9B)1%# -)3 ((6=  &' .G==/%#*}52& $ Á$, 7\+3F6<mMT6#+=@W?PMDýX2&Q$aH?'1 +<;(V«•;&P$a"3 '&4).("ŠL-)75+Kþ$##€%   LÿEÀ(5%#".547'654&#".546322654&#"´3E/ "*5bXADY0#*.b]tŒ2#+ ' 7.2B 2!A!2vK\]M(82 5P/iƒ~flç# !LþúÀ'3FI%#"&5467'654&#".546322654&+"2>54'#"&'73¢33U<>R>,bXADY0#*.b]t®.%"C&0 5$1/# I,DWV@8F 2vK\]M(82 5P/iƒ~f|Îv+'  '3"! C½LþÇÀ72'654&#".5462'654&".546/]t"4-bXADY0#*.U>L*(A6X9H $&VÀ~f3V6)2vK\]M(82 5P/iƒþ5QE.G M0;<1VD+DWLþÀAM2'654&#".5462#"&547'654&".546322654&#"/]t"4-bXADY0#*.®.BB./A5 A6X9H $&V?>L8&."$À~f3V6)2vK\]M(82 5P/iƒý!?01?@0?  M0;<1VD+DWQEN0£$"-&LýëÀEPd2'654&#".5462#"&547'654&".546322654&#"2654'#"&547/]t"4-bXADY0#*.­#4 -# 4HC A6X9H $&V?>L9 &4350À~f3V6)2vK\]M(82 5P/iƒý!,$ $5 G4K" M0;<1VD+DWQEN0rP." '"#& '!/ 2.7".5463&'632À/G#£x+¿'504 ;VJ€«2CÃ*@"!5 $3ÿ½ 2&5432#.54?654&#".547373Ô(=e1C i<H11$JBP1ü!ú (5# "6 <>Z@rp? 1$#B8þúWG,%þú!,ÕWÕÏþÏÿzÿµ£'5.''6?2'¶-=G( +`%-H E–¼,M(! ,+ÿöwà.+'675#5!#2#"&546326=4.#/.'å=B%--×{\ïêÈ54'"&547>7Ë!Q=—P5/6%G7(1!% 0H6"+UQ!& "*?¼b*,'&#632'6?>57654&#"#"&5>Ÿ$<&! $A6((()53)1   *!L* <#6)-"\); .1Uÿôsƒ.(27#""&547#5!#/.+"'767Ž(*>H-{3 1HZ-3' ª) =H )22þw():4)ÿòdz. <&#"326326#"&'2654'#"&547#5!2"&'26J (%;  )[P:c| 1T4(2 -8)´g!2)-æa$m.TÅ­LcG7&!A4@F2I 0!,)ÿûp8. ""'"'"&/3>'"&5#5!é:)=z.=<)7/A .8'>#ÇKë.5  _9K(22ÿþ:w. 526=/&'7./32654''.=#5!!72_4" å5>7E,0¬C%"$2rAQ&/fþí! 0";K4 o &5B,:HG C.!B¤22 DÿñÙŽ.4327#"&'367#".52654'#"&54?67#5!Â$*&-: 4+#11:+L' G9 ( '") ˆü%, //&>+D`z3f_&22ÿÿ|Ñw-'#"'6?675#5!;#'.'/.ì!3˜ 4. 4'Eí$4A '"]¡  3%@@!2Ç/R"2þ­2´#>CƒB0h%274&'"&46332674&+37#&''.#"+"&547;25'&#632+"'#"=46;>32ì4   6?H%X">Q  [ 8F!‘L4Q$>  þ* $K): 'W¡   M=8,(_&ý LC.l V-=1$* ÿÜ­Oá?23!;3267+"&=>;+"&/5#536=4&+"".547¦2=:ÿV #Ai:&-ò,13 !›;22þýS">9u,ô2 '! •E87>54'#".547>=4'#53.=473{$0/,!{,$ 0( 0 'S‹s8(.6 ¶'7(== *R 9D0tV@,% `#!2 l!/' &A2¥¥.%&'5#5!#67+.'2654'#Í&˜¥ç13 &M;.F(&@( Q >-.ž22•MH%=U?bd6 *LK/-/6¬J.7"'#5!#>7#"&=>732}&9Jì&> #&X¬=22þü D%5Rw,×.+#"&54636;2,]+ &(%H(E-%Y$42,$9/ }yv53#.+'2674&#+"&54>;2) CA 0(A# = 't" ( :6&7$ OV 3þ‚;P82 &0 @!- @"›Ý:.'5#5!#>7'&54Ð+C+':á .,@)— 7#%¦33p#*@=((;4%fb.*3273753#&/./7#"&54632#"'ûJ@]-Ÿ `gA !c8-a") &  ¨;/J8@2þj6G=H%&  ÿò$/.&+"+.54632%3#*;;!0(.WþÃøø$e$ )2K2ß2ðŽ(%'&'"'7654'""&5>327'&#"ÊrR 2+<  p5M&c#%/(: §!* 3^x%o +uâ.74&#"/.#'6?.'&'#5!!632#".'4?2325Ÿ+$ ,A%-9P âþž43_!P76=4&+5!#2654&'#t+","'<z&#g£,2¦ #,,+ %22 h0 8/qp. .'#5!#'.+#'67s30KAk>( pCb5 4ü<]&C 22þu=VA!þúWG,%þú!,ÕWÕÏÿòÈ~.+/.#"&#"&5462#".5463254632'!5~$-N-809+:>34!'-#þvV !  `%,0'" ><4?#4 22=p&&#"#"&'"&54>74/6;2>;2d67 !!-+*,- o *$S|m,0$2""#">%Sÿì*h. %32?4'72654&#"7#"&547#5!Š   '}_B+<8y|º %"2^G&1422ÿîH¼.!.".5#"&'7326=4+5!#'2654&+3b(=7<  4–Î0 .3% 4X*" &S 1D22 #(/:%  83p.34&'#5!#&/32>754&#"#"&=>76oY´) l"C'‡ª*0C14&  9ß22 "I* :.5“"h$ %$.¤. 6%#"&54>72'"'5#5!#>7+.'32654'  5-š¤ä #'CN>1M* )C*1A7#"&=6732#¹$> :Oì!> "*g/_%Cõ22ûD'2$3xny. .2#"&546'.+"'67.'&'#5!#{' /X3v ¨b644> &yKü*-U)þÞ l=XA5.  22þúWG,%þú!,ÕWÕÏÿþ[c. "7.'"54637'675#5!#'.'N"j[3 ©54/&=467#53ÛT b0!(! &$‹öü`-²,'[+ L8-I/22ÿèÿòæ.U!!"'.'&#"#"&54732632'&'7#"&5>7>32#"&5463232654&þýF.C$(| )9*C0J  ":(2E?<H"e D),*.2•3þ¾; YJN<#9=5!  A, . ...M,,;&o#D%$ $ÿðÿ¶Š.>G%25&/675!5!#2#"&546326=4&+"/&#".547;6=H‹Eœ|þŒšôBy1#% X02e%JCOT" jIj##+J4E‚ Us#'22&vU(4,$3Hþ$&=N)!   4#GL 5$ÿº‰G3#/&+""#".547325&/32>54'#"&54726?67¥VV"J " /B ]{865°S6>+B])30!>F(Z=d%2ý¾&,+))3&Dn!g +O"=- 4B#N +^õÿÿÿÖ N3#/&+###".54732.#"632'7674&#"#"&5>32/&5&=— V[$J /B `zg h9*5(2, :X  *!Q>£: c!2ýÚ&.+)&2';G_*6!2-AZ .2S½=*  ‹ÿïÿ®ô.F267#"'47#5!#/&#""##".547325.+"'>?67#"&µ- 6RfA­"$xL^!3# -> Xt54 l9B% +<Š 5 Njx,B22ý²'.,$,4&D2BD' ?ÿñÿsß.87>7&'"&5#5!!/&#".547;25® +dy+ 9‹îþÎ*,7a/B qFZA  cK&Vþ†Dq22   $:@þÇ%***,V<§Bÿóÿcç. Y326=&'&/./.#"#".547;2725&/32676=4.'.=#5!!3632m CR/EQJV; "8H33 ' =Dš-o¨10%:R4s(#)Hæþ” 9& ,Q2 D-2M"T:' - =*&!  1DHL\(0  2K&Ó22 Sÿñÿ}d.3q%#"'22/&547&+"#"&'&#3>36323.54732654&'#"&'47#5!!327./&#"&54Š :&G6J@!;.  8i6%K (þÛ$ dN&K " .DIÕsþç -";0KP#"#:HZÓ &. 6 $( ::a9HB6+ I!#(QN4Œ4# N•' S+6K22  MVsNYˆ-QC#ÿñÿz÷V23!267#"&54632/&#"#"547325.5#5!754#"".5473$': Lþµ'q-1"25@¢Vr" )>,(.‰‰b6-B % '& » /& 2þ±k+# 454'.5473#/.#"&5473325#".547>54'#53Ð+A=#5/!$+5;Fа&B !„9Mˆ94 90 #-%5j ïÐT,@7gK0R42ç/o"<(3 )[$2,T= þÔ& L?,)X/";% „. '2ÿñÿw.L#"./5#5!!>7'.+"'#".547;25#".'32>54”R% Õ#þã%H*0#x3G" XV*:8/H5U0" #*?$(>RE Í22ÂE!]5@8þø.+-% 5$"ˆGbT$"E6@,+$ "ÿíÿp.:%25"'#5!!>7#"&54632/&#".547;6#D2A+,Ï1þÐ2P ) $) !2=ZZAIi& ;¹- Od22þ° X1$&//95þ²&HD&#  ,+ÿñÿòþ.48'.'&#"#"&54732632.'632"&'>%!!k4 $o%:H+<(8b1 0J *1&$09/þ— ýóç.þX; ZHO;/ O6M2(Wn3$("6-+<$2>-O8ü&8+&#  +,;Y2ÿþÿºê‹M3#/&#&#".547;25.+'232654&##"&54>32‚WT( s0E TR)45%GOC, #+?3+Q*"`#b,2ý¾&.+-%3$%@MhS7   (%7 N8$:( N2 ÿó.0'#5!!767'.#"#".=4737&54{=j Eoþ‘4^NU(,%*|,,!9.yR[dDJ22Ó,R@EmKR= !E1%- (MTDÿÿÿºÌ4A32?53#/&+""#"&547;225./7#"&'4632#"'FeN}6Î! }†Ta  J@NP! 1 5gH;~+3*10 ‘+H@]T&IB2ý¾%Q6(*5$4BCO^1( 0 ÿôÿÎ.3%25&'#"&54632!5!#/&#".547327%D 2r#*.(M:/]þkV6_9OKNe b;†Ž &':$5?bA 22ýÒ&9R&#  ,+ÿê.D%25#"&'#"&54632>54&#!5!#/&#".547327"D "X$!$0(#I  þ†2s!7=ZQJMf °;ÒS-.#,%(226'!þ·&=N$%  ,+ÿÈ#pE.#"272'53#/&#&#".547;2&''764&#""&54>;4Q %!5'   DO+ x3G" ”NV"'«G+ " +NÌ@9 Ï!/,~“ 2ýÌ&.+)) X6ÿVª.*  ,3$ÿ½ž.I".'#5!!72#"'46725674&#"'.#"&5473725.+'6?&¤*'žþ%@E{Vÿìÿû./32'.#".547;25"&546322676%!!n<  ‹;:# £3]2$,/#O*!%T þ‚/ýÑÈ3þ} "$G1:( y7ð"02'3&Lf2ÿñÿ…".AE%25#./32654'#"&54632767/&#".547;6!!"D&*[…- @8C*8NP>,?&1$BnB6^9VEMf% þå1ýÏ;~‹“[ Ot;"\2-!>:./$8#>4.'#5!#./&#"#"547327325.'#"&54>32¦BS9Š);;-G,]"G<­ ' ICAT A 3-'+*ü-vA9+]Æ+722ýÍ-•$! .#%7!64"* ÿñÿ·. <.#""'>7'.'#5!#.'&#"+.547;2ÑO2  ^Y0]:D3C . B4 \)W&yA7C '-2L$bü0C z~þO@FT-3 22ý»NS?! & ÿÎÿʇV3#/&+"""#".547;24&#"#"&'"&547'&+'32>?'5¸"CV$T  /B YU*79 EJ,-F!V  A2gK& !'  K 2ýÎ&-*-% 2';^ 22!-.;('2] =$‹uÿÅ+.E5&'".'#5!#./&##".547;25.#'76?67&#Ý= &+%&hKéY+[")*EH/B ' CD2ƒ? D& %0ü)#ŸÜ0-2_7  22ýÉ -#// #  #!> 'fX   ÿ¬.F>35#.#"/#5!#./&##"547;25.#""/727ì0 Ø$'* f")*@M ' CAŒ7%."0:$! |" ¤< %( 22ý°-#”*  #!=þ.2<3G& @ ÿð!ú.:E%25#"&'"&'732654+5!#/&#".54732?>54&+ D4T"< 3 ½ 9%8=ZQJMf l- x ,µ;ÚO)'7!2 E22.$#þ¶&=N#&  ,+ã!#-ÿ\Þ.I'./&##"547;25&/32674&#""&546765.'#5!#2|EBeq ")*EH ' @ ?Hc«”7?W<_*- 7'!P! Áê-1DB@ 0€D$t -#”""  ((Bˆ‡/<&4!;!%4 22 -ÿ´). 6&'%675!5!#./&##".547;25.'›'906T7{FþÖ˜’þe)]")*HE22 ' ?!?DV ‡EŠ @H)$3p¾k."22ý¸-#=*( (8AWÿE".;4.'"546;#%675!5!#'.##".547325.'l3U/ Hi']dwJþÖ—“þl"]-[(-A!.yA4RƒH" *2* "!b9¬H2q¾k."22ýI-01#! )<¨>Vÿúÿ¬ž.o3275#""&'#4'#5!#632"&=4632654&#"/&+""".547325&'#"&546;2654&#""&546;2$R^ i2Z {/8*0!þÜ'H¤ß4[9%0% .53 0B22PlDG$<7)0) "$ ç@P“NE1*L/E"22PN8? $þ@& :(+'4#^W+''1 &*+ÿÆL. #O%2?254&#3&546.#'6?5!5!#+#&'4632.#/./)(#E 0 Ph w `  þÓ+ @:M”þ×Lñ573##"&54672654&'3267"&54632".56?&+4/&/7675#5!654##"54732632b#/ùjÀ-Q" #7#',#$[ &'".vJ(4,N +]9ÚF1$ ”!-916@l !R/%Ö 2I;2 '8nFH12*(!G\(1#:(   > 2 X& -ÿD ô …>=73##"&5467265654'3267"&54632/&+###"5473225"56?&'#4/&/7675!5!654&+"#"5467;2î%.5¹jÀ.P$ #ZJ)%] ') !*$( ›Zx7#7z,*' +]9þéƒC(Ž !7T2,JQ(% þ2I6!38MŸ7&33$* 'þÛ&ˆ1"7#:œ s&9$   > 2 P+ 'ø.e!!2#"&547232654&#6"'&'4'32654'"&54632>54&##"&54632>øýPV84(12 .$ (RG¤o" 6;V,/>!%!)? 2%‡D4GC.2db N *! (#   "M4A>XDcM73%! ) " -)!?VJ' ÿðÿ½.KQ%2#".'32654&+#"&547'./675!5!#2#"&54626=4&#632'SB <)3^A' *A<,.;# @)5|[þêÉ:p! !#*?C H@?%1)âJ844 Nvb( Jf-> .*&( AY22XE( ;¾¼.Gÿtø. y5""!!/&/767&/&/32654'#"&54632>54&##"&54632>?632#"&5467232654&#6)$ (þñøýà  ;,%&$#0.F3"(˜W/>-)!)?2%‡D4G *70:>--2 .$ ,<$Z2þ¡+¯(-  2TYÇ3%!"# "+-)!?VJ'!=.$F#(#   *ÿöÿ+þ. \b35#"#'67.'32654&+#"&547'./675!5!#2#"&54626=4&#6322'.   &)+O4*bw.;# @)5|[þôÉ:p! !#*?C BA M E:%0*v <"-[nO ï> .*&( AY22XE( !;¾J8b+¨7,FÿFø.Š!!#".'32654'"&54>7>54&#"#"&54632>?632#"&'472232654&#6/&#"###".547322øýŠ,&G54 $ " 6;V,/>! !%@2%‡D6A *70:D#(02.$ )$.02Xz7#.2þ% %4WAd+&DcM73%!   "(-)!?VH!=.,>9(#   *$Nð& 9)1"9#:ÿöÿpà.Z`%'&#"#.5473272>73254&#"632#"&5467./675#5!#2#"&546326=4.#2'+ %5J+; P 0 + !2'0$"?55{\ïêȯ )"=(!D/'AZ22[B:! ) ÇÈ0Hÿóþé.dl25#".'32654&+#"&547'./675!5!#2#"&546326=4&#6322'&/&/##"&547Él(&3^A' *bw.; " @)4z\þô Î=n%&!#@C B +0KL ! (!t:E!oD~Nvb( ï> .)') AY22[B8!<¾J8A,þö - BU" $ 0 #ÿúÿŸF. F74&#&/.'"#"&546325./675!5!#72#"&5463*Kh !#ÈY1 . %6B4!G;?#E„”þÐLë ;v1#)# ‘J.‰6Iþ 46  ')%2)L)8 Ug/'22&|Q(4'" ÿõÿˆ¢.E2#72#"&5463274&#/./675!5!#'.'"#".546*Ij+A!‚"7$Î ;v0!+&Y1 4Y5E„”þË­I(   2‘L.(*9+ï&|Q)3%% 6Iþq,,7/Ug/'22ýŒ+I  .ÿúÿµF.Z74&#'.#""5.#"&54632#"&546326325./675!5!#72#"&'4632*Kh+A!ÈY1 #  -*  2,?# ';?#E„”þÐLë ;v2!$$‘J.(*‰6Iþ#+. $+    A)-,-71)8 Ug/'22&|Q*2)$ÿúž. Q"&'#323275#"&'#5!#632#"&'54632654&#"/&'"&546374&#""&54721^ {&|0!iR] »$H¤ß 2]=" & 8+!F6-&' "$3 iNE1uLE?@P322PK6/)  þ˜6f+!# 0. &*3 ÿðÿ~ž.f3275#"&'#7"/.##"546325&'#"&5463654&#"#"&5473254'#5!#632#"&54632654&$#&] i2Z {/8*0![#0%J3=N2$<#%*) "## 'R®ß:U,!%& 8Ý&P‚NE1*L/EÊþ $+7<%I$7QHW$*1 *&/ 22PU+'3  ÿúÿˆ.6n3275#"&'#2#632#"&=4632654&#"64&'#5!#'.'"#".=/&'#"&546;654&#"#"&54732$#&] i2Z {/8*0!„"BÅ 0_-"#& 8+þ™ HJ&# !F,$$) "$# Ý&P‚NE1*L/EV'ïPI2'7  þ¦@w 22ýŒ0D#6f'.1 *'/ÿñÿÓƒ."C27#"&5463254&'632#3267./7675!5!#'5.#"#"&'œ|Y‡)X & ,,:(ŒÈ+ ,#oF/DuWþ¯’R5;9:"CW&V R= #; þó 8ˆþ˜0!@LP&D22ý×.700?*ÿÜêIc%.#"632'767."#"&54632654&#"#"&54632&=&53#'32654.#"632V1C",;?:8'!N7   c4#;%'"C[9k '5 @*- & ¼ J +"4R"A4* .,W 37M6!!S3z  2ýö<=GV<  ÿü.?'5'&#"632'>54#"#"&54>325!!767'&54j>k C!A9  ,=?2M ' #4,6$! µþ4_MWA#+[iFEº 9  ,!0O#; Z3%8  Z2Ó,QAzrLJtcBÿ¾X>SX"'.+#'7'>54#"#"&54632'5;#7'&'54%2>7.#"6Ö  o= B%P %V= 7'!"'³ËO+,þ,<&< O>+îW?MI þà D^S*W 01T!$$ ˜‰/2´2M&aZ *¼™+"%-Ap º 0SÿC? _3274&#764''./>3'&+'7'764&#"#"&54632'53#7'&'c Z<*RÈ0,.š_@+&c( M0&p*COB%:/ K !Q8 :-0 š²O5.8e!/ Cw5TG7y)­ þH-<,=S*=3 */-Y%L5˜‰ 2´:%\Xk +ÿ¹ô‹K3#'&/.#"#".54632.#"632'6?654&#"#"&54>32'&=‡W[> $ C3&G e9,8%@:+ K &>) = a* 3ý¿ 7 %3/Ea)%' $$&A- *((/ ¾79'Šÿ††‹S%2#3#'.#"#"&547.'&#632'6?654&#"#"&54>32'&=£64téI  #& ,,*)6:+ K &>)Bp QEîþW) 3ýŒ'&  !-+)" *, $$&A- *((0 ML79'ŠÿÎôŒe>32'&=3#/.#"'&/&#"&5463632#"&54632>32.'&#7632'6?654&#"#"&U-¬= C[#  !(   *4+-, :-  0-[:+ K &¤:L¾79%‹ * 1ýÓ0    +   ';/?#&6B 6­!$v3ì^  < - - # Fl: BF#DŠ 5Wix+=22ý¥ !8 .", &>2BDH 5ÿñÿò.V654/3#".'#22#"546327&/#/.+'674'"#"&546?&'#5! ?EF>  -!1*8 ~+$P $l(3" V s0B~f9*",$/E-0S  & ? 97 0h",0 @þß-PLS'3) %) '22ÿöÿšR. u654'#".'##".'463254.+/&+"".5472;5/&+'674&'"#"&54746?.'#5!e  - 7M(J¢'-5 ~QKGS' (# >$3+,4I85 LCB~f&*#5 t\ü  ì4B!!> 0<`8!- * þ‡' <*-$1"*< FLS'$) ( 22ÿì¡.*7‡2654.''#275#"3"&'3265#"&'#%47#5!#632#"&54632654&#"'.'"&5463654&#"#"&'2>54'#"&,  < H ] þÔ2'$3l72654&#"./&#"'#"&'32747>54'#"&ÙR] þŽ&  4Û?R{07*.þó#+>GX4 47.*( %ý%«¡ß=R# "  J "Bus'e}+++  ' '>ü @P’  ,#]61*L/ 7!>:,A%A+!#( 1 %)e2Q22PR-'3  þX-OÏ£`]%)%  *4ÿþ‰ )f"567?>54/#"'"&'3267'2?#/&/#"&'>54'#"&547#5*% '*&(> +8(2 (&80L<*=[< SV <¼ W3b€@-7 ,9%¶ ‰ / (   5Ñ-H4*-<- *_õ2þ!¡6L˧þí 0)8.BS2ÿø.k32654'#"&5?6?37'#5!#+"/#""3376?67/47"&=?376?4/"ð % ¨'f›--? "  +R2  * ) ;%;()6   ü& ’ % )22 $S '#! 63:)&"21E7>HX D27 E"74  ÿþÿþ .1D}&'#5##3>3547767"&'"&'326?267#"#"/3272654'#"&=>54?67#5!#/./O(  $ ;2 ('¨, 6S$(I­!$-[/pE  98'6+9 ¶ ^\1÷  k ! &  5- 5 O Lx+¤7K‡1>BT+ @;  8.#  22þ4,Jÿþÿ¦ .1J]¢&'#5##3>3547767"&'"&'32673335./7267#"!>54?67#5!#'./&/#"&'./4?>54'#"&5O(  $ ;2 ('h,) g$(\4#, 6S$(I­!$þ× ¶ ^"4o3?#=+   70'3+9÷  k ! &  5w$; N"PÁ 5 O Lx+  22þY- E0$1>BT+ :"  2# 8.ÿþÿý.0@~27&5/&/#>724&/"'"&'326?>54?67#5!#/&/".'#"/3272654'#"&5&  "$  + *&2 ('oC   þ ¶X L  G!pE  98'6+9ý   … !  /8   5Ÿ9 5%  &\r  22þ-P,    )‡1>BT+ @;  8.ÿˆ;.'i##"'67&#326=##".'32654'"'5&'7>325!#/&/&#&#"#'"/?>;&"5-  |E# ( >0;a/ )P3'6&6S$J8)I   "$S)>!'# ï ,5 ˜( þ¥ x”A9aI(*QQ14 02ýŒ-,  * 20e.'2_5#2636?>?65"'"'"&'26=/&'7#'.=#'.5#5!!h   ¦    Jê#p"^%ô‡> 5  '6eþ× ^ê   þË  CÇEv1 (Iþå¥V˜>Q%   ;(22   !! ÿ´¶.2{;6?65/&/335>?65"'"'"&'326%2&/&/;272>?654/#'&'#'.5#5!!;7;  . Ø  z J _%,(8-'96bt<)910%?* &u%(4  '3žþš2  " : þÆCÇ ÷>)-8"76'h& \  3OM#   ;(22 ÿ¶. +?–5;6?65/&/335>?65"'"'"&'326%2&//.#'76?&/&/;272>?654/#'&'#'.5#5!!;7=?  þù  . Ø  z J _%,(8-'96 M0+<((#3<)910%?* &u%(4  '3žþš'  –K  " : þÆCÇ ÷>)-8"76'ì &/< - \  3OM#   ;(22 ÿ_¶.2©;6?65/&/335>?65"'"'"&'326%2'&'./&/#&#.'&=46?32225&/&/;272>?654/#'&'#'.5#5!!;7;  . Ø  z J _%,(8-'96 "4o/' gDC@<)910%?* &u%(4  '3žþš2  " : þÆCÇ ÷>)-8"76' z-  #>"  E/ \  3OM#   ;(22 ÿ¶ù0)s“¦732?2'&#"6"&'#"/&'"&=47'#'3#6?6;7>32#"&/'./""#%2654/".5463263654&#"%32?6565'&/&/+3v ";#  8 !#  > f;G &3Ø0€$" % 41#  P%H' #*f #  iô! " %%i[ýè   ù': )K#+$ #  ¼VFá20* *.&   l 65H.4,:!IÌ11 # O  " +f*V   ÿÿÿK .T726?6?6=/&/&'#'.5#5!!./&+"+"&546?632x1  "$-‰62 .H¡þ×^  ,/ $-!#H7 /þ¹3Fn22  !  @ þ¸ !V/!, Iÿé.%˜"&'32?22?65254'#"&54?%47#5!!&#"327?6323'&/&5'&54?"/&'326;2+'&/&'#"/./37>54&##"&^f!$' * N) 8 !)7 þì3Ÿýù *+ %/ *16! 54&##"&547#5!!&#"327?6323O" $éf!$' * N) 8 !)7 xN %%& ! +9! (<$ A7 !(3/$$(   *$1":3Ÿýù *+ %/ *16! X<ÙE"& .+-(C3 6,! 5`T.  -  )#HJ&%# % 6I !4#%B<)_&%4'  4;@,22   5  ÿDi. 8%57467'"&/&'326?5'465%467#5!!";267/&//&/&#'2?'./532654/#'.4< %  a %#N %.' ,)   þÄ-½iþý7%9 L*   (:@(L ! /? - >Y#  ³„ P4 & )*„ U‚£'P33 ' OM1&  © ¯%F ?$ C*Ia(-#* $ /?ÿýY¨.$~$274'#"&54>32654&#"'32?/&'467#5!!32?6?6?2#'./#"/&/2654'4#"#"'"/&×l4"`Õ(% 6.3Ë«þŠ N  15! 1 ,R>%  !(L *' Œ3 X3}?+& *-+[22   1 ' 7 7.&I'8ž8.A6&"ÿú`` Z75%4'"32654'#"5463276#"'/./?.#"2#"/&/463256?632‘) "?0_[(/!0$&8(n;\&9;]Œ+ 5 !  ]A(O /9<*2'+÷ !%åF( R0(p#8, µ.9±þÐ:$: a@N" % %#(G5"œ9š"?D4A$ÿ<D-™765'64/%26=4'#"&57>3267'&#"'#"./463?6?2'.'./&/25&/"&'54?6?654&"˜P }5  &Fòm7>((' @4S ( 2. , _)9.!G€;+.®+*3OV0"*C  Ä ! O b %    V„ 3MC)A#  ?R53(#(  "  H$,,)f_  5E#0   !ÿÎ'*+«2654/&#""#".54632654/"'&/5?"/&'3267#"&/;265'4.'"&54?65654'""&546323?6?32722µ%"  "" #‡Z  (2$($ #GL\ HI  #)  &!Z6(%3 '   $  F>\*4)5 & 28 9(7nKS8W$92-!  1&4+ , -]&% .2}4I 7"&/74/&'"/46?67226?'4/&/2?6?/&/'./?654/&'""672"/&5&546?256?6?22šr*'ÀD $"/A &    "    *  ,""Š3;4vn        R"$/[4 &", é22/è-I"¬      <8  ÚS ) v j,`H>F  "   /=C=– f  ÿãÒi23!32?6?6?'.5467"&/&532654'#"&/&=#5!7654/#"&5463732ò '. _þÃ% ! Y^a  !23(R&$9 g< &> 1-N . ""1)&  !23'S,9 «€ &>¶ šB )_& ÆIj C[-.-)1 !%!"²U9#8A3T q8C1 !%Â7 EP$Í2Vc79&‹ -2þ-!+"+++$4."%]?K0>K9’"#:;!<}.!a#"'4'5!32?326?674%#"/5#5!!2?+'&/#'./&/326?4&a$,þÄ % '%5#$Cþy_'+É}þê"J#&XHG:. Y,":#   B7K RPCć. 6`"&/& "LO@22¤K a#Rn ZT8"7 !-/:6.,1%A (ÿˆx.U26?7322#"/5#5!#/&/&#&#"#'"/?67#"/&/32675&÷B 0_ #  k_& ÆxI    %$9U9#8A3T üÂ7 ?E|/ ïªP$Í22ýŒ-.  * ]?K0>K9’"#:;!J|d&#"7'4632#.=>;25!74+"#".546?723!3267"&57632#"&/ÿ!A&  %&(5 #0$ /)DO -B   ¦?QLþ³&'e%4"2S3 2 »- 0&5,) $4 ,,2' '    G52þ±$f038.%<U8 ÿ~|’72;25#"&/5&#"7'4632#.=>;25!74+"#".546?723!3267"&57632/&+###".=4674?363Û*7# 2 !A&  %&(5 #0$ /)DO -B   ¦?QLþ³&'e%4"2 "n  024/:‚ 8 ú- 0&5,) $4 ,,2' '    G52þ±$f038.%<û& :)8  'W|&'2>?653#+"&5&54>?6?6?/74/&'"7'4632#'.546?2765'4&'4/&/&5467–- 6 5#£$)ͧ " 2@+,a+/ 4 )   %&#*@%%)5  C !5#&K92&" "%2% Ç1L02/2z+(6J T$    0&5C9N Y/$‚")5Eª4b46;37#".'&543573265"'#"&=463263654&''54&#"3274;#".W;*$,1  ?07[<2 /^_%++  45( %&C! ²,V$P3+7C$01Jn`; ª‹! '  4 O!,# !6$A .^46;25!!;26?#"&/&/./&';2?6?>="5&'#".#&/&5'*.  XþØ  6%.0\6r   91LZA&   ,!0%  % ¬5™2®&4$m$U2F ( F/ e37L5  1 # % @L@  ÿsª4~%25#".'&543573265"'#"&=463263654&''54&#"3274;#".546;37/&#".547327>7[<2 /^_%++  45( %&C! ;*$,1  3i%LDG` <~1Jn`; ª‹! '  4 O!,# !6$A,V$P3+7Cö'?O,.+ÿF /Š2;25#"&/&/./&';2?6?>="5&'#".#&/&=46;25!!;26?/&+"###".5474?327*6$(6r   91LZA&   ,!0%  % '*.  XþØ  6%. $T  /A 4/%:„F ( F/ e37L5  1 # % @L@   5š2¯&4$m$U ð&-* 8 ÿ[I­.B.#"7'4632#.=>;25!!26?"&57>32"'J98  %&(5 #0$ 5'cþÍ] $ $H;*+-µ/ 0&5,) $4 002þ° Q##  6Bl$Pÿ´Íe7"&546?2'&547'3#'54/./"'432+".54>?2354&/"/4632#”5HE2%    D[7 8!/,/'&" $-4&%  C,'5%0&ùZD>L   2= †2ý¸8K .5 #" 8' *"Ù9V 9* '-ÿˆO X32"&546?2'&=7'3#/&/&#&#"#'"/?674&/"/4632#r#  þ¾5HE2%    ÆI    % C,'5%0&üþU ïþýZD>L   2KH 22ýŒ-0 *9V 9* '- .TX4632#"/&/&/&/326?4/"&54>7>54&#"#"&!!–zQ4G+:"# 4" ""!<8+: !! %  +– ýöQ3bJ'I:2 5$B4 'lC+0&!4+   "  $2ÿf . n25#2!!/&/&/>7&/&/&/&/326?4/"&54>7>54&#"#"&54632E  ! þÑ ýöà  "%&-= 4" ""!<8+: !! %  +zQ4G@<h2þ¡"1½-( 5$B4 'lC+0&!4+   "  $&3bJ'Iÿå}P#"/7>?27;#/&/&/./2?6?654/'74&'"’&0  ( $ =0$ 63  >:FS36,!% R"% + 8"†6!")B.".36# #5"4ýë3%$ p  ( A.  ÿýÿe=.e!!.#'.+"+"&546325#"/&/&/&/&'2>=4/.#""/4?63@ýÀK4 $.D2&F &$$ ' 0.' F9"  + 2=!3x+' j A "(  % 8 O!qÿýÿˆ¬.Hq$2>=4/.#""/4?63#"/&/&/&/&'5!#/&/&#&#"#'"/?6;22F9"  + 2=!3x+' j A Y22ýŒ-.  *) ïÿïÿˆ‘.E2!5!#'.'#"&546324'#".'32654.#"#"&54>C3F0) <ýæ¢XY 3.#H(,P6/ 0YwN !*'ÛTDJ+?D  , 22ýŒ (?5"+) ,3F]@Ï13 32+ÿýÿT=.|!!/&#"/&+"2&5463632#"&5463246;25#"/&/&/&/&'2>=4/.#""/4?63@ýÀ=# (   2,2&4! &$$ ' 0.' F9"  + 2=!3x+' j A "(  % 8 O!qÿó4’ b>?6?!'#5!'&=3#'./&/&#?'>54&"/&/54iEB%& þùÖAmC3ôI3" C[-   *2 .:RB # ) =/ ¡kBE23"S7:%‹ ,2ý÷-)*) **"."AX&F*#5  3'%<*&ÿü. 'R767#"'>754?#267#"'#5!#/.//&/54}% þâQR2 ìf- 6H$(F­!$}AmC3^\0=# 0'! H5 r 5 B$ H"x+/kBE22þ4/G>#5  3'%<*&ÿñ<.?76?6?67'.54754747'&/47'#5!!YC(G ,,$L%&' D , "/( <'<þ?6vC1& ” >> #  "    $J$.(Eo*N*TXþ.  'ª1  ² N $#!-@|D"&" > þ (0$ .2G +,@®44Œ  ÿãÿ”ô.5/&#+"&546326='47'#5!!>? @-S#-08*AmCPþuCC%&~f °$6v&!($7 œ93kBE22Ó ;0ÿòÿÝQ*`2;?/&54?'5#5!!?6?+"'"&/&/;26?5'+'.546?2# #   "*,Ä_þ›B&L /*+)."/`!!  k›#R  "&60      + 0 44|09(2 B:>=PD"306=´,-þÚ(1#!- $+"!ÿòÿ¤×*X2/&/#'.=656?6?325"/&5474?63227&547'5#5!!7676Z % 'W +  - I%)#+'   %!" ):,våþÇ= #L0 )þ¿ "- %2 ´!# +   ,"9*'*0 44|, 9?C ÿòÿQ*ˆ2;25+"'"&/&/;26?5'+'.546?22;?/&54?'5#5!!?6?/&+""#".5474?363â+ 7#@ /`!!  k›#R  "&60  #   "*,Ä_þ›B&L /*?"n /A 4/ X:ˆD"306=´,-þÚ(1#!- $+"!    + 0 44|09(2 B:>e6ü&,* : ÿˆf.F%6;22!>?''#5!#/&/&#&#"#'"/?67&/54b +þ|CC%&W AmC3fI      l  +ïÓ ;0A5F*#5ákBE22ýŒ-0   /<*&'ÿ¡Ì4M'32?53#/.+"+"&546325'./7"/474632#"'"/1(&WAµ! }†T 3 -D2L,<:;~C+/ y!+d N&IB2ý¥ !"4 0 &1E;!-O^. / 'ÿˆX4Q73232?5!#/&/&#&#"#'"/?67.'&/7"/474632#"'"/1(&WAK2þ™! }I    !`"<;~C+/ y!+d uþU ï'&IB2ýŒ-.  * UO^. / J¦Z23!3267"&57632#"&/5.+"#"&546325!5!74+"#".546?Ê?QLþ³&'e%4"2S3 2 %1&0(3- þ×)DO -B   »G52þ±$f038.%<U8 y% 0+*1- Š22' &   ÿ…¦†%2;25#"&/5.+"#"&546325!5!74+"#".546?723!3267"&57632/&+""##".5474?327*6$ 2 %1&0(3- þ×)DO -B   ¦?QLþ³&'e%4"2 $$T /A 4/:‡8 y% 0+*1- Š22' &    G52þ±$f038.1'!þý&-* 8 ÿý'ÕWp.'2?6?653#+"&5&54>57>=&/&/#"&54632>5'4'!53/&5467r)6  /& f; ´’    F4+\&%   "&7); " þýô!&M'C)* "!&' -( 20 /&*6!")L2#6"*!&03  G&2',#)()ÿþ8;.W"&576325!5!!32?#"./&/.'2?4'#"/&/&/   2  þþ=þö +  kW?T'  '  )A*L+X * B 9 ’22º C/!&Yo=.K>9#8G 21.I:    ÿþÿu;.„72;25#"./&/.'2?4'#"/&/&/"&576325!5!!32?/&+"""#".5474?3327Ñ*6$'7?T'  '  )A*L+X *   2  þþ=þö +  7$T  /A 4/ :~=.K>9#8G 21.I:     9 ’22º C/!&V=ø&,* 7 Iƒ.746325!5!!26?"&57>32"'5'&+"#"&F0(3- þàƒþÍ`$  $ G<*+--+1&q*1- ~22þ° T # ' @n$P­ : 0+D.Z#"'"&/3264/##"&/46?&=&/&'#"&54632>5654.#!5!#±(*'  *: 0(  -**D@3)(  )&*2&*g þ”D”!V@9$=&ce +722L>% "+ '#(#,@ 226')ÿqD.m25#27/././>7"'"&/3264/##"&/46?&=&/&'#"&54632>5654.#!5!#N% !½3 %%&'" *{< 0(  -**D@3)(  )&*2&*g þ”D”! (*0<ú8L Ê -`h +722L>% "+ '#(#,@ 226') @ÿÕ'.k#/&#""&/&=74?72?254&+'#72"&/4?'&'#"&54632>54.#!5!!@3N  A*6 )#    &  /!)0(*kþÅ'ü6' þš =%"   E  !Ò '  ".  ")#,A 22ÿ]D.j25+".'26=4.+#"&=46?.+#.=654632654'!5!#/.#".547327KE/'5cC< (21M*8L #3#+ J# 2&FT4.þ”D” R# =ZPKPb ;€AWtF 3!J,'E&  %-#7 2.#,T2-22&72$g@+þý& =N(!*-ÿVó. \6;7&/&'7&/&/&/326=4'7'&#"#"&547567#"&54632>54.#!5!#²$'/à=O $"O/BB; , W28v&T  @!$ )0(*kþÅòs!O 33 <7K(B.-B("  w&<% ': ")#,A 226' ÿüØ.>46325!5!!>?/&/547'5'&+"#"&F0(3- þéØþu FI"&W# BmC "*1&q*1- u22Ó<5A5F*#5 3'%<*&EkAEu * 0+ÿéx.@%'%46325!5!!7>32/&/&#'?'&'"'5'&+"#"&Æ! þ90(3- þéxþÓ[; #7[7'$-70 "*1&· „’*1- u22¢$7T þ$  ?'"/&#"#"/&/57?3'&/47'5.+"#"&F0(3- oºÎþ‘ FI"&U8 )z@ !  K 4- A! .E1&r*1- ‰23Ó<5@¢)8, ,9  $=MG!15JR  0+ÿè2.D7/46325!5!#?6372/&'5/.#'?.#"#"&°Cø6*&Qþá2â  & $  U:0@`< +Ñ7¡f,52"Š22‹ ~wI ú þÂ0@@,33  ÿt2. Z25#22'/46325!5!#?6372/&'5'/./67'.#'?.#"#"&  ! ACø6*&Qþá2â  & $  %%&QK U:0@`< +2<þ7¡f,52"Š22‹ ~wI ú þÂu-H @@,33  ÿ¡[.q7'2;25.#'?.#"#"&546325!5!#?6372/&'5/&+"""#".5474?3327ÙC˜%  A50@`< +6*'Pþ¸[â  & $ G  (7 ,(Ñ7¡á  ;&0 @,33  !,51#Š22‹ ~w/9 ú þ{%,* 7 ÿôÿÞ.C746;25&/.##"&/46;35!5!#/&/.##"'E4  &aP'"))G2  %'þ«êb P(& F€2A~¨ 4E" "&4? %= »22ý”*'2E+>ÿôÿˆX.C3246;3!5!#/&/&#&#"#'"/?6;.##'&'{2þ

3253#/&/./&/&5372654/".57463'&/'6?'&,  <Y-  Y$J[-E4:$*# /" $1)9&7(ŒA Ù'?^Ù 2ÀB!:D%2{6)7  2() ) 3#„  ÿÖ#p S'&#"27&&#'&+"+"&546325&5./'764&#"#"&54?>32'53#/O"> vœ*1 $.D2$F! «G+   ,A)*I,  DOØ @M uþ!V/!&1)ÖEª.* ,$4. ~“  2ÿîy<GU`3#'54/'7654&#"54?>?654&#"#"&54?>32'&=254&//""27&/&#"27&¹ DQ2±6+  D-%    ,A)A} µ);" 7  8H vO"> v`2ýò)c ·.' /  ,E6d{þÏ/.Š'1w  M uð @M uÿˆ¹p d'&#"27&7332"&54?>32'53#/&/&#&#"#'"/?6727675&5./'764&#"/O"> vœ#  þ  ,A)*I,  ÚI     ! «G+ Ø @M u*þV ïŒ,$4. ~“  2ýŒ-0   ÞEª.* ÿÅ#p m'&#"27&"&54?>32'53#/.#"'.+"&546732#"./&54632>;25&5./'764&#"/O"> vò  ,A)*I,  DO# # ' %!, +-&! «G+ Ø @M ub,$4. ~“  2ýÉ0 + $#  A$7çEª.*  ÿû/. ;h27'&/"%76?2'4632'&/#"'7654'""&%.#"/#5!#'5/&#""/&/72?&‚!&c#"/6-ýˆnH'O 2+ < à '* f0  !(.  !  Aƒ,o-d 6  4¤’ r.#:  §!* '  22ýÿ9Ø #:A&%  Wÿâ„j"&'5.#'6?.'&'#5!74+"#".'473723!563#".'4?23257.#">7#"&546;2c: Z0-9P úD@2 *2$% 5¦@PYýü43_i @J' +#0Q!+)rS,‹)2G. 22 /2   H42"FO*:ýG6$   þ– J*!B=tÿ r.s232?4&/"/.#"&/&+"2&546732#"&5463246;25&/&#'?'&/&/#5!!6;2#".'47æ  ?$  '  $2,1'& #"4H:._" rþ5H={,5" 0;(/%$H ,þ0   +  $C';   .2%S1M 22 & ™C `&+#FQ'.jaÜ=þÏ) 6 S    œžMkC1/OD,22×- ,=$()*V& "9*66ÿ=. _'/.#'?5#5!!76?673./&/#"&/&54?3337/&5'4º"Ë%Y>Q'.jaÜ=þÏ) 6 S  "4o5' 1g   œžMkC1/OD,22×- ,=$()*V5ˆ- #= " *  6"9*66ÿ¾L. J%577%>75!5!#72/54&/"/&/&'#'7/#%(6, &?)-þÙK‚ZþºLÕO  , A  ;B!BSã% ¾75<)22´!‘ S ¼ þà %ES2 ÿîÿ®Î./4725./675!5!##/./.+"+"&546ÁI6!uT@—“þ®à\ %  &.C²]dwJjI-:Y[k."22ý²     .#%1 H2qÿöÿ’(.9767#"./32654'#"&'5467&/7675!5!#"2!2%23b[I;mL>! Si,A;+8.:`14UPþÔ2Ô‘.%s.3SOa8QcK˜u09!;7%"RF$822þÈ ÿýÿ Î.N>;25'&/.#'?675!5!#/.#"/&+"&546732#"&54632ÑRK*" >  !+0#@;25##"&'&/2?4&"ýÞªB#+GH " B:6F #  ( %2,-+&'Dd< 9.0"[+.2†&225;#>2F,j< þ÷0  +   $C'B#C  *: 0(2J%**D@3(*0*#0­:t.Lˆ$0 0cY1 ce heL>%+!. 4  ,22ÿýÿû ‹l672654&'#%3#'./7>54&#""'+"/+#"&54727256=4&+5!637632Q Z£ %ÄWT>n+0O&HC- /   *(&*'0<z 16+Q-  R ü ˆ0Lî,2ýÿX4;h!>"  #%4 -2%K;4$  P ÿýÿü. P2654&'#'4&+5!!>?/&/547'5+"/+#"&547272565 £ %’<þu BD&'W# AmC(&*'0t0LI-22Ó ;2A5F*#5   43'%<*&EkBE_#%4 ÿý&£. T2654&'#.#'.+"+"&546325#"/+#"&54727256=4&+5!# £ %`5 .D2&F&(&*'0<¦R" t0Lþ²!,* /!&1,—#%4 -22$0 *ÿñÿ§ù.<F74>325.'#"&54>324.'&/#5!##&/&/&+"+"&w+" G8;'0-%$ -6A  #]   " $- ?U9 %JH&6,4#$ ,:22ý«   %/+wA9+\ÿýÿúDp `'&#"27&2654&'#7632'53#''&/'764&#"+"/+#"&54727256=4&+5!#PO"> vþ´£ %r3f*I,  DO0 «G+  @(&*'0<z& Ø @M u^0LkG$4. ~“  2ýþ-ÿ21ª.* C#%4 -22ÿÈDp Ž'&#"27&2754754&'#4&#"+"/+#"&54727256=4&+5!#632'53#/&+"""#".5474?332732;2'&/'7PO"> vþ·$ £ %ÑA)&*#0<z& 6b*I,  DO$T  /A 4/, 0 «G+Ø @M u` .L6*F#% 4 -22F$4. ~“  1ýÌ&,* 7 ÿ21ª.ÿÅJp š'&#"27&2654&'#+"/+#"&54727256=4.+5!#632'53#/.#"./&+"&546732#"./&54632>;25&5./'764&#"VO"# vþ²£ %v.&)&*#0<z&8cv@  DO# *  *3%&! «G+ Ø @" u_.L-#% 3  22Iƒ ~“  2ýÊ0  #+" $  :%7çEª.* ÿýq. r254/#'4&+5!!6;2#"&'4?232?4&/"/.#'?'&/"&'"'+"/+#"&547272565 3¤ %’<tþ5 &={,6!0;(/%$ ? ":T0:._" 0!(&*'0t<&LI-22 Kg &9X"F/(0(#  ,þx,:#S1M  **#%4 ÿ½‚/ 2654'#7+"/+#"&547263656=4.+5!!72#"&'4?232?4&/'./#".54??2325'&#'?'&/"&'"'¶ %}20)&*'0 <‚þ%H={$-,)k[0$$! %#?O(9  !F  Sy:._"u0 '%G#%3  2354'#"/&/4747467#"/"&54?636=&/&+5!#+"'»<µ *&72.4cQ_U& 164SZE!'+ 5!6" f€Ø$> 1.   " µ1;Q;RdI9-6#_>&"1*1  5 "!  22 ,   *  ÿ¨Í.[m/&/#'.=46?325"&=6?632267&/+".54?654&+5!#'2654&+L&  V + - I%)$() &.  $K :0&1 JÍc" 4 « 2)!þ¿ !.5%2 ´!"/$  =!(%*/'22$6 * @%#: #ÿ7€.…%2672/&#".547327325#"/&/&/2>54'#"/&/4747467#"/"&54?636=&/&+5!#+"'74&+32?6„2.495=ZOLNd "D )_U& 164SZE!'+ 5!6" f€Ø$> R<µ *&Ò1;Q;X3ð&:Q(! ,+;y I9-6#_>&"1*1  5 "!  22 ,   *  Ë1.   " ÿýÿ¥F. #]2654&'#7#4'#"/+#"&54727256=4&+5!#/./"/4?672 £ %}  m">&(&*'0<IX -,, 9t0L4  % &´$0²0#%4 -22ý©-+4 ÿý3³.cp%25+"/+#"&54727256=4&+5!#/.#"./&+"&5463632#"&5463246372654&'#ÿ  (&*'0<¶b"# *  2,1'4!£ %ä|#%4 -22$0þØ0  +    B(;? 0Lÿñÿšù.Xb%25.'#"&54>324.'&/#5!#/&/&#"./&+"3&546732#"&546324639 ;'0-%$ -6A  #]%     (+2,,%²?U9KR&6,4#$ ,:22ýž0    %<.A%±+wA9+\ÿû6.k76?2'2654&'#7+"/+#"&54727256=4.+5!#'5/&#""/&/72?/.+"'Ç-þq£ %}20)&*(0<6f0 F   !  A 'ü 6  4¤ˆ.LH#%4  22ýÿ9Ø #b&%  W ÿš6.“76?2'2654&'#2;2/&#""/&/72?/.+"'+"/+#"&54727256=4.+5!#/&+""##".5474?327Ç-þq£ %ì*0 F   !  A '20)&*(0<6f$T /B 4/ü 6  4¤ˆ.Lþ» #b&%  W H#%4  22ýž&-) 8 ÿùÿëY. m%5'246725!5!#32#"/46?274&#/&#'?4&'#"'4&#"&5432#&/&574>748 Àþœ`Ê  E* G¥1fj #%N  /4 $(  û+  $¬Æ  ˆ33±Q<6 %2þÞ'^HI7 ) .!  *.   ÿòÿí2Œj26?!5!>32/&=3#'.'.#?'>54&#"+.'&+.#"&5462#"&546326.þŠ$W8" W[- ! / *1 +!:S K   7()#80:)N?2/%!  2) 8"S77‹ * 2ýñ-) %*($4."AY*+ 7)1 0'#P?4? #;Jn25!5!74+"#".546?723!3267"&57632#"&/5.+."&5462#"&546326<+þvŠDO-B   ¦@PLþ³&%h%4"2Q5 3  ! 7R#80#! )N@15!  k22( '    H42þ±$f039-&<U8 ™ + 5+1 0&  Q>4?#;ÿwœ%2;25#"&/5.+."&5462#"&546326325!5!74+"#".546?723!3267"&57632/&+"""#".5474?363]+ 6$  3  ! 7R#80#! )N@15! -+þvŠDO-B   ¦@PLþ³&%h%4"2 $T  /A 4/ :…8 ™ + 5+1 0&  Q>4?#; k22( '    H42þ±$f039-&<û&,* 9 ÿþ8~.x#&/&574>?246?25!5!#32?#"&/54?2?4'#"&57'654&'#"'&/&+"&5432Ä $0    !þ¦€ø +  kW7p D*L+V# !   3 /45    " .{22º C/#$YoG7)  %1.F /  & $*ÿþÿf~.¡2;25#"&/54?2?4'#"&57'654&'#"'&/&+"&5432#&/&574>?246?25!5!#32?/&+"#".5474?363*7# /7p D*L+V# !   3 /4 $0    !þ¦€ø +  '"n /A 4/:† G7)  %1.F /  & $*.    " .{22º C/#$1Vú&,* 9 ÿßG/y632767325!5!##"'"&/././.'3264/##"&/467>3735&#"'&/"&'4632#"/.5t Y4   þBGY 5B -j$   (  ;7**D@3&( &# +:/ ,$p`&  t33þû%8O!T#5 #  (d)L>%"+   A<**%$1ÿüD.Q6325!5!!>?6?/&/547'5&+."&5462#"&54632 - þ}DþuJ$'W#AmC 7R#80#! )N@15‡;`22ÓB A5F*#5 !?3($<*&EkBE„+ 5+1 0&  Q>4?ÿÝ/ s%46725!5!#7632/754#"./6?6754&#'./"&54632#"/.57>32€ &,“, þ`    +79" )! 1  % )&(9?"$ Å!  l)'‡33þö +J0$  ^ë  /&(F,3"$ &" + C7!1;ÿòÿúJp Z'&#"27&'!5.+.#"&5462#"&5463263262'53#'&5./'764&#VO"# vâþvŒ*  7()#80:)N?2/%! ->ì@  DO0! «G+ /Ø @" u\22Ø+ 7)1 0'#P?4? #; mƒ ~“  2ýþ-ÿEª.*ÿòO.i6327'&/&/!5!!6;2#"&'4?232?4&/"/.#'?&+.#"&5462#"&54632ø -  5" þø]þ5H={,6!0;(/%$ ? ":U0:. 7()#80:)N?2/%‡;  + 2232Ó#  `È, þa²I    $ )  0 %!)&)8>#$ R ïn)'‡32ýŒ-,  *ö, !"$?+ B7!0<ÿÒ/u25!5!#/.#"'&/"&'4632#"/.=632767325'&/&+/&'"/"&54632+/&57>3246*8þzY % +:/  %" Y5  0 !&"AMF($ ,É4€33ýú #**% : `& BÎ  > 5 0' 7 -P3;)ÿÎÿª‡~4&#"#"/"/4?67/&+'32>?2'5#+"/./&'32>54./##"&/4636732‘D % /# &'  A2g#  1  MS*%J3  -I 4 >>**$8 4!$8  gZ  # !"  .* 1 E'#‹u   2þ¿*>75 H: 2 ‡2&H%! ! %"%6 0¸0 R%26=/&'76325!!#'.5&#""#"/#"&54?4/¤#p".-þ¬+&)0 Yþ×^‡> 517 !!&0,- sv1 /þåµ'0 J2   !! V˜>c'5"+"ÿ´ 0t;6?65/&/2&/&/;2726?654/#'.='&+""#"/#"&54?4/376325!!;7‘  . ³%,(8-'46bt<)910%+J1 &u%' // !!&0,- :+&?”þš >2  "   >)-8"46'h& \+, 3O"qP'5"+"'%+N2 ÿÎÿ½‡c.#'.+"#"&546324&#"#"/#"&/46?67/&+'32>?2'53#Ç5 '$D2#BD % +#  1  A2g#  1 CVC!,* 8&1''Z  #"   * 2 E'#‹u  2ÿÎÿˆ¬‡ m3324&#"#"/#"&/46?67/&+'32>?2'53#/&/&#&#"#'"/?67Ç  ¢D % +#  1  A2g#  1 ÒI    !üþV ï•Z  #"   * 2 E'#‹u  2ýŒ-.  * ÿÎÿ؇…4&#"#"/#"&/46?67/&+'32>?2'53#/.#"./&+"&5463632#"./&5463246;2‘D % +#  1  A2g#  1 CV#  *  "!1'4! gZ  #"   * 2 E'#‹u  2ýÜ0   +"    ;?ÿê . ",\2654/&'"#"32?654/&7#"&/46?274&#/.#'?'&547#5!#   '    Be8! B É*G cO016,8Š   N$  2‹+=W6  $3þ¼/-GG%$ !81422 &,ÿãÿÕ¬.!±2>54/&'""32?654/&#7>;2+"/&'4>72326=4&'#/&#""&/&=74?72?254&+'#72"&/4>7#"'".547#5!!3  '" B´ (      2 (%$@3N  A*6 )#  ' ()8¤Éþ›      2F         ( !þ­ =%#   E  !Ò$  "4'4122 ÿæM½ …2654/7>54/"3723#3?>5.5467#'"&547474?'#"/.=76?#5!656574&/#".547¶$H z( %#ê f=?Sk   š+ !H 4-'+5)   8  T(%9 K [  #;&+,s (2|" ' !!   .$ / & &2% *ÿp °>54/"2654/2;25#'"&5474?'#"/&=76?67#5!67574&/#".54673723#3?>5.5467/&+###"&'&5474?327R( %# B%H *6#-'+5>   Ä| T)%9   f=@Sk  ¯  !H  #l  G%4.†&+,R [  #þ¹:­ .$!8) % 2% '  (2 Œ & #!  þÜ%%? 8 $ôN -c7265'4''2?65&7#6?'43##'.'&=?&/&'465'&+53/&567Ü1f.8=6   ‰ 0!" #2Ĩ D8.$J 69ú(#(TwMDBWc&!%6     œ ("'&J##22<2'F4!.#$6#  -:  X 22<>D+%w/:o5'&'?46327654&+"";2654/&'#.72#"&'/.#&+'?/#".'4.'#5!#>—8)(# /'/‹!  (0SU!&#  1*5  7#'W{3 D|&µ+ Yü'$%Ÿ± 1!ž( !o!c,  Ø?/ $  5)V%þú4(^Xk  33ZPÿìÿú p$/j672654/&'""32?654/&#%'&#"27&47#5!632'53#'&5./'764&#"#"'#"'".% _   '" BO"= vþ8y|&8v@  DO0! «G+ 6()ü _   2 @M u;142ƒ ~“  2ýþ-ÿEª.* &4ÿÈp#.“72654/&'""32?654/&#%'&#"27&"#"'#"'".547#5!632'53#/&+"""#".5474?332732;2'&/'764&9 [   '"  BŒO"= v²6()8y|)2*I,  DO$T  /A 4/*0 «G+ û_ # 2 @M uO &4'142$4. ~“  2ýÍ&,* 8 ÿ21ª.*ÿìJ. n2654/&'""32?654/&#47#5!!6;2#"&'4?232?4&/"/.#'?'&/&'#"'".é   '" B[8y^þ5H={,6! 0;(0$$? %9U/:._"  #()   2$1422?2732/&5472326?'4&//.#"#'".5474?32?24'672"54>7"/.5#"/&5732654'#5!o% 5(N  " :,  #-    1#5..B! -%#$K9 !(  3`$/  0 µmš#"Ac-  6R:)   )$  $ þÝ+"  58 &5#4D   3 , f," < !#D22ÿ¶Ž‰ e3?654#'&/./37>54&'#"&5432?.5#"/&5732654+5!ö)+ !< %(:@ SV  `;PL$%< (   $!0/&6K  $ 0 –ãü;  $-% (/& +$_2ýº 7+Q ' ! "3$Y !#D22M ‡3?654&'3723#3?>5.5467#'"&5474746?67&/&5#"/&5732654'#5!2574&/#".5467ö)+ !þù f=@Sj  ¯  !H 2-'+5)6  D  $ 0 ™  T)%9 ü;   & (2    Œ & #!   .$ ;#4/!#D2 % 'ÿ~. ­2654&'#"&5474?36;2;25#'"&54746?67&/&5#"/&5732654'#5!2574&/#".54673723#3?>5.5467#/&+##x *{**¨SH4/*7# -'+5)6  D  '0 ³©  T)%9   f=?Sj  ¯  !H "n  ˜ &; þ6Q7 8 :” .$;#4.!#D2 % *  +2    Œ & #!  þû&@. f2654&+7#"'"&/./3264/##"&/4672637'.5#"/&5732654+5!ž )x)+`DC  -i$  0(  <6*+D@3&1 ;  $ 0 Ö@˜$; d-%  "bW3S$5   (e(L>%%. F !#D22ÿx@.t25#22654&+/./>?"&/./3264/##"&/4672637'.5#"/&5732654+5!#}  ! 7 )x)+‚D  ; %&40i$  0(  <6*+D@3&1 9  $ 0 Ö@VD.<À$; ÎY2Ç -(P(5   (e(L>%%. D!#D22-%  "ÿÕ. r3?654/&#""&/&=74?72?254&+'#72"&/4?>7.5#"/&5732654+5!ö)+ !< @3O  A*6 )#   )     $ 0 –ü;  $-% þš =%"   E  !Ò '  ".*!#D22ÿJ@.v25#"'"&/./3264/##"&/4672637'.5#"/&5732654+5!#/&#".5473272654&+:F -i$  0(  <6*+D@3&1 ;  $ 0 Ö@VD=7i.QJMf † )x)+";ƒS$5   (e(L>%%. F !#D22-%  "bT1û&=N$% ,+º$; ÿ`. f3?654&#>7327327.5#"/&5732654+5!#+&/&/326=4'7'&#"#"&547ö)+ !ÿ 00'   $ 0 –V$&!?M$ b/BB;:=W26x&T! A $ü;  $ä& & !#D22-% = 8K'  Q.-B(""w&<% ': /. O3?654./&/&+"+"&546?6325#"&5#"/&5732654+5!ö(, ! <   $-!#&F6M  $ 0 –þ=  &-'  þÐ ! %/!, ,³X!#D00ÿúpc67#3?654&#'&#"27&%4+5!632'53#'./'764&#"#&#&##"&5#"/&57326ª×)+ !. !O"# výü –ã)?v@  DO0$ «G+ .6M  $ 0ü ;  $$ @! u2#ƒ ~“  2ýþ-ÿ Wª.* Y !#DÿÈ‹p>7#'3?654&#'&#"27&2;2&5./'7654&#"##"&'#"/&5732654+5!632'53#/&+"""#".5474?3327´ º)+ !) O"# vO*1 ! «G+    !]  $ 0 –ã):v@  DO$T  /A 4/è  ;  $$ @" uþ‹ÿEª.  ?5!#D2 ƒ ~“  2ýÌ&,* 8 ÿņp7264&+%'&#"27&%4+5!632'53#/.#"'.+"&546732#"./&54632>;25&5./'764&#"##"&5#"/&57326ªe *x)+HO"> vþ –ã%9*I,  DO# $ * %!, +-&! «G+   6M  $ 0üd"$; @ @M u2$4. ~“  2ýÉ0 +" $#  A$7çEª.*  X!#DÆ. d3?654/4+5!!6;2#"&'4?232?4&/"/.#'?'&/&'#"&5#"/&57326ö)+ !Ï –Æþ5H={,6! 0;(0$$? #:T/:._" $&6M  $ 0ü;  221F  HD" Ö6v&!(1*7Q 4‡ &$&1  22Sÿ¬¢.{272?6;2+"/&'4>72326=4&'#'&/&/;726?654&#"#"&=46?654&'#5!!ò[ ,2.   2 (%$?D2, D6I6Xh7!V = @)"& ¢þ5Ó=9!#5   (  +:  HD80 4‡ &$&1  22ÿþÿý†.#0r5"/&'"''3275#"&546?674/#5!#754747/.'+&#&5463654&+  !B/ <  3%ƒ  MˆÖX48W"3$ &"' ( C   Æ2   #Ÿ*F®"0 22F5< |Lý  þ€!D!E  *1 "+  ÿ¬T.g25!66;2467>7.#""&5>?654'#5!#'.+.'"&54632+"''&/3lþ/ !4 9%þ]$2#)- 7''1&*Ta3,!4)D!$,R&!Seq³Â7!["É'‡   @" -Ù '1!; #) 22ýÿ1&. 0'F  @?* 0€D­$‡ÿPÞ.w//&#"'.#"'6=>32#"&=>3226325/&/;726?654&#"#"&=46?654&'#5!#2|AK2, D( '!+;3*- ".Xh7!V = @)"& Áê!i>1F  HD‘(3  @ #:!344‡ &$&1  22SÿŽ_Œ +†4&#"76#"&54>7254?>7#76?%3#'.'.#?'+"'#"&/&/326?654'#"/5#5!'&=/ !;Ó#%§ &˜W[- ! / *1 !%!`5>P2  $D#)M",5È"I0" p %-@þb    ² "$ £#ó,2þ- %*+$4." IGNb%&$JK)3B2) %"K »20"S79&‹ÿúÿaF. P%4&#/.#&#'>7./76?6?675!5!#72#"/4?2*!) ! 6@?P$ÈP:  J+#"7L8E,2 *'þÐLë :w0!   T   )  Æ-G?}-RýÏ &1<$ " U  '22&wV)3 ÿ·ôH%4>32/&=7#'&#'76375./&#?'>54&#"#"&l4*<"þ¢>)W8% C[!2Z$5Y.-*1 !%  :R K &ž-*‡(/ 8%P77‹ -2ý» h?(Gi4+*+ ."AY*)ÿýÿ`é.7%7267#""&54?#5!#'&#'>7&/7673> ª, 61J$(E­!$#B 3ì^!0\$45Òþš   $–@  "  >)-8"76'à &0<(  \0' 3O"Ó22 ÿöÿ3d.…25#2/./6?>?67'&5467'"&/&#"376?6363232#"./&/5732>54&'#"&546?#5!!3732?©" $ž7& %%&    "^ 3 % :  :&'D,   _/01  *2@Ðnþç/2  /n<âe*&7UÒ -   {2Y &C& # G &. 4++3a 93R " T,&22)ÿÏÿ‹´M777'&#'767./#5!74+"#".546?723!3267"&57632ê ?^-!0\$ #;;DO -B   ¦@PLþ³%h%4"2Z(ÄQ1þÚ h? 2;22' %    H42þ±f038ÿ’#.B25""#"/5#5!!26?/./>7#"/&/32675&ö< #w_& Æ#þÔB 0N  >%&H U9#8A3T <<P$Í22Â7 ?Et.À -0]?K0>K9’"#:;!ÿÊÐH%5'"&546?2'&=7'3#'&#'>?6754&/"/4632# <"‹5HE2%    G^!0\$/(C,'5%0&*€VZD>L   2KH 22ýÎ h?%  c9V 9* '-ÿýÿ—=. a25""!!#/./&/>?67#"/&/&/&/&'2>=4/.#""/4?632< #þ¤@ýÀ  ,%&3 $$ ' 0.' F9"  + 2=!3&Ì-&>x+' j A "(  % 8 O!q ÿHê‹J%73#'&#'6?./7>54&#""&5?>32@ <"!WT!2Z$k \60O&ID, /  $ .5)+Q- R *1,2ýL h?Q ': h?# ))K;!8+   P ÿé.+7/7>32/&/&#'?'&'"'5#5!!Þ! Â[; #7[7'$-70/þÓ· „{&5T þ$  ?675#%32?5!#/.#'/.'&/7"/474632#"'"/x 4V(1øf1(&WAÔRK*" >þF! }¸] "ˆL  n"<;~C+/ c *"ƒ!+d ,5 * -a&IB2ýû&Jfþô3!dO^. / ÿòø.<'&#'76?&=&/&'#"&54632>5654&#!5!#AL!0 R &32'53#'&#'6;5&5./'764&#"~ <"pO"> vò  ,A)*I,  DO!2Z$Ž! «G+ ˜*+ @M ub,$4. ~“  2ýÆ h?oBEª.* ÿüÿòü0!-8/./&#'/&/&#'?5!5!?5#25 B6" /+ "7X©þ¼þvi‘úÃ8R U+ þ½ K!2"þýô&.: × 9#P6R022¤8@,Ž55*1 !9Úÿñÿ²'. =A%"25"./6?&'32654'#"&54632767'!!k   >%& ©P @8C*8NP>,?&1$Bn/) þ\6ýÊ6 :./$8#>%"œ ,&1 Lϱ  ­  )",# &ü$6  þ±!"[e"%*/ 22™%#*%   ©&2§ÿ….r%5'254&'#"&5474?;2325/&#'7#&/+".54?'4/&+5!#7/&+"##,# &: ­ (¥I>.)# 3  1F"œ ,&1 }e"J º&2§}H*%   þqP7 9    #:[e"%*0  22"8  þU%ÿÇ1/J%46725!5!#'&#'?6754&#'./"&54632#"/.57>32% <"”, þc1`!2Z$[*)! 0  %!)&)8>#$ ´ *Z)'‡33ýË h?E Y-2!"$ ?+ A8!0<ÿÎÿ²‡V%574&#"#"/#"&/46?67/&+'32>?2'53#'.#'7671>""AD % +#  1  A2g#  1 CV M,,Y7d+áZ  #"   * 2 E'#‹u  2ý¶,5LA$ ÿþÿÿ'./:@2654'#5!#'&/&#'73.5#"/&57%2654&'#35q0 «)c$! 1F#º>A   % 5(C,!"&ŽD22*)þ§:]x D% !# #"AÁ'2§ÿ¬.M%?675!4&'#5!#/&/&#''&/;>754&#""&5>?6 RK*" >þ¡3+PV(1þ_ ] %2!"/-feq³Â7![" "1#*- 7''  &[5 * -~ "./*"$ 22ýû&P!'=' 0€D­$‡ &3!; ' ÿ.Þ. Y%5'.'/.#'>?'&/;726?654&#"#"&=46?654&'#5!#2+? % LAK2, D? K3+*/# Xh7!V = @)"& Áê!i' –)1F  HD 0é &0<" 4‡ &$&1  22Sÿõÿº¼‰„4>72"/&//&+"#".547474?36;2;25&/&/&/?>54/#"&=632?3!2?4'#"&Ê"%!"n /A 4/*6  MvS*%&)= +C'!+0L< = - SÈþâ +4, €:8þ{&,* 8 5D   Lg / ( *0-H4 3<- #(õ2‘7 /$ÿõÿº‰y2?3##7/&=4'4'/&+"#".547474?36;2;25&/&/&/?>54/#"&=6C0L< = -ãV:   : 8"n /A 4/*6  MvS*%&)= +C'! -H4 3<- #(õ 0 *_T 5%$0 ‰ þ¦&,* 8 5D   Lg / ( *03Ý.b46327#"&'./3265'#".'4632>54&'.#"?32'7674#"'XL+ ,\ 5/"=3%Ia$ <1&('/ '  ( 3=   %>M*­'L &n©0*$/1*ÌQZ ,503( YQ1H >5?   ÿÖÌ…4>72"/&//&+###".5474?32732;2.'.#?'>54&#"#"&54>32'&=753!2?4'#"&Ú"%!$n  /A 4/ *7# %)4 )1 !%!:R J &>)¡< 3ØþÝ5, €:8þ’&-* 7 :%-!++$4."AX*)(/ ½79&‹ -2Š)/$ ÿÖ‰v4>32'&=353#7/&=4'4'/&+###".5474?32732;2.'.#?'>54&#"#"&>)¡< Àà7   :3$n  /A 4/ *7# %)4 )1 !%!:R J &¤(/ ½79&‹ -2œ *_T 5%$‰ þÂ&-* 7 :%-!++$4."AX*)ÿμ“4>32/&=753!2?4'#"&54>72"/&//&"'&/&+"&5463632#"&54632>;2535./&#?'>54&#"#"&>)W8% 3ØþÝ+4, "%!# (   +33%4!.-*1 !%  :R K &¤(/ 8%P77‹ -2Š7 /$:8þŠ0)   +    :0:?<3Î4+*+ ."AY*)ÿÎ{…3#7/&=4'4'/&"'&/&+"&5463632#"&54632>;2535./&#?'>54&#"#"&54>32/&=‡Þâ9   :6# (   +33%4!.-*1 !%  :R K &>)W8% c* 2 *_&@ 5%$0 ‰þº0)   +    :0:?<3Î4+*+ ."AY*)(/ 8%P77‹ÿöÿ}J.>»%#"'333/&5467'"&/&#"376?636323274>72"/&/./&/#"&/&54?&/&/5732>54&'#"&546?#5!!3732?"2?4'#"&‹ :&G61g    "^ 3 % : Í"%! !&"4o5   _/01  *2@ÐTþ/2  /K 5, Ó &.6 )  :{2Y &C& # G˜:8 L &7Uˆ- )8 " "+3a 93R " T,&22)M  )/$ ÿöÿ}ä.>¨%#"'333/&5467'"&/&#"376?6363232/&=4'4'./&/#"&/&54?&/&/5732>54&'#"&546?#5!!3732?7‹ :&G61g    "^ 3 % : í :6&"4o5   _/01  *2@Ðîþg/2  /F  Ó &.6 )  :{2Y &C& # G:&@ 5%$0 ‰ $&7Uˆ- )8 " "+3a 93R " T,&22)I *ÿòá.x!!4>72"/&/'.'&++".546?3237632'&'7#"&54746?6?22?4'#"&áýï"%! $o 6D C  '<%4   021( @5, .2|:8þ®;  6D*: Y&!  $% (4>*/()/$ ÿò›.i!!'.'&++".546?3237632'&'7#"&54746?6?27/&=4'4›ýeý/ $o 6D C  '<%4   021( @4   :.2Ê þÝ;  6D*: Y&!  $% (4>*/9 *_T 5%$0 ‰ÿÿÿº¼‹…4>72"/&//&+""#"&5474?36;2;25'./7>54&#""&5?>32!!2?4'#"&Ê"%!#i PD2-(2 e;0O&ID, /  $ .5)+Q- R )þÚ+4, €:8þs&Q7 : 2%(D h?# ))K;!8+   P ,2†7 /$ÿÿÿºj‹z%/&=4'4'/&+""#"&5474?36;2;25'./7>54&#""&5?>323#7þ : +#i PD2-(2 e;0O&ID, /  $ .5)+Q- R ×Ô+  ®&@ 5%$0 ‰ þ¢&Q7 : 2%(D h?# ))K;!8+   P ,2– *ÿš. T7654'5.#"&/./#"&/46?23257>54'#"&547#5!!>76ú3 c8 48 >!#6' 2)19ES722W(:7ÿóò/k7?3'&/47'#5!!>?2?4'#"&54>72"/&/'"/&#"#"/&/57)  K 4- A! .Eoòý³ FI"&U 6, #%!& ({@ Æ  $=GM!15J33Ó<5@*/$ :6n)8, ,9ÿó”/]7?3'&/47'#5!!>?7/&=4'4''"/&#"#"/&/57)  K 4- A! .Eo”þ FI"&U   : 5 ({@ Æ  $=GM!15J22Ô<5@  *_S 5%$0 ‰9)8, ,9ÿºœ4ƒ74672"/&//&+""#".547474?23;25'./7"/474632#"'"/32?5!!2?4'#"&541(&WA~*"%!a  *-.* I <:;~C+/ ! }VþÜ0/, y!+d !:6þu% 9)  9 4!-O^. / &IB2‰:/$ÿºP4w/&=4'4'/&+""#".547474?23;25'./7"/474632#"'"/32?5!#71(&WA· : .a  *-.* I <:;~C+/ ! } Ø/  y!+d Ù&@ 5%$‰þ¤% 9)  9 4!-O^. / &IB2˜ *ÿß1.##"/&/./&'3;2?674&'"&5463273265./##"&467'&'#"&54632>5654.#!5!›! )  /. <.,-"%. '( !!  #)D>)&*2&*g þ©1ü6'5#,&  - aƒ\)(" )"  $#JI'#(#,@ 22ÿó¥/„4>72"/./'"/&#"#"/&/57?3'&/47'5.+"#"&546325!5!!>?2?4'#"&³#% !0$ )z@ !  K 4- A! .E1&0(3- þ×¥ýº FI"&U 6,  :8-i)8, ,9  $=MG!15JR  0+*1- Š22Ô<5@ */$ÿóU/v46325!5!!>?7/&=4'4''"/&#"#"/&/57?3'&/47'5.+"#"&F0(3- þ×Uþ FI"&U   : ; )z@ !  K 4- A! .E1&r*1- Š22Ô<5@ *_S 5%$0 ‰7)8, ,9  $=MG!15JR  0+ÿÈôp Š'&#"27&4>72"/&'/&+"""#".5474?332732;2&5./'764&#"#"&54?>32'5!!2?4'#"&/O"> vÊ#%!&$T  /A 4/*1 ! «G+   ,A)*I,  þà9, Ø @M uZ:6þ&-* 8 ÿEª.* ,$4. ~“  2–-/$ ÿÈ´p ~'&#"27&"&54?>32'53#7/&=4'4'/&+"""#".5474?332732;2&5./'764&#"/O"> vò  ,A)*I,  Õà7   :3$T  /A 4/*1 ! «G+ Ø @M ub,$4. ~“  2œ *_T 5%$‰ þ´&-* 8 ÿEª.* ÿÅïp ‘'&#"27&"&54?>32'5!!2?4'#"&54>72"/&//.#"'.+"&546732#"./&54632>;25&5./'764&#"/O"> vò  ,A)*I,  þå /0, "%!# # ' %!, +-&! «G+ Ø @M ub,$4. ~“  2œ :/$ :6þ‘0 + $#  A$7çEª.* ÿÅ´p …'&#"27&"&54?>32'53#7/&=4'4'/.#"'.+"&546732#"./&54632>;25&5./'764&#"/O"> vò  ,A)*I,  Õà7   :3# # ' %!, +-&! «G+ Ø @M ub,$4. ~“  2œ *_T 5%$‰ þ±0 + $#  A$7çEª.* ÿýÿº”.s74>72"/&//&+"#".547474?36;2;2335'&/.#'?675!5!!2?4'#"&ÑRK*" > #%!`  )9 -)&    !+0#@   !+0#@;25'&/.#'?675!5!!2?4'#"&54>72"/&//.#"/&+"&546732#"&54632ÑRK*" >  !+0#@;25'&/.#'?675!5!#7/&=4'4'/.#"/&+"&546732#"&54632ÑRK*" >  !+0#@72"/&//./#".=46?725#"/&54?6322?6322?4'#"&áýï"%! €3L' )g'; 0 =C"  89  5 5, .2|:8þµ!56& 0 &ð 1+  :?  +  )/$ ÿûž.a!!/./#".=46?725#"/&54?6322?6327/&=4'4žýb6 €3L' )g'; 0 =C"  89  5 9   :.2Êþç!56& 0 &ð 1+  :?  +  *_T 5%$‰ÿÈp ±'&#"27&2754754&'#%472"/&'/&+"""#".5474?332732;2'&/'764&#"+"/+#"&54727256=4&+5!#632'5!!2?4'#"&PO"> vþ·$ £ %.M%!1$T  /A 4/, 0 «G+ A)&*#0<z& 6b*I,  þÞ6, Ø @M u` .L 2:6'þ†&,* 7 ÿ21ª.*F#% 4 -22F$4. ~“  2Œ*/$ ÿÈÓp ¦'&#"27&2754754&'#7632'53#7/&=4'4'/&+"""#".5474?332732;2'&/'764&#"+"/+#"&54727256=4&+5!#PO"> vþ·$ £ %p6b*I,  ÓÞ5   :1$T  /A 4/, 0 «G+ A)&*#0<z&Ø @M u` .LnF$4. ~“  2› *_S 5%$0 ‰ þ´&,* 7 ÿ21ª.*F#% 4 -22ÿÿÿÉâ.Š4>72"/&/./&/#&#.'&=46?32225'./"/4?6724&/&/&/#5!!2?4'#"&¦D   a"%!"4o/' gH 3 , 9+ *-  8ãþÝ5, ü: %  &]|:8þ…-  #>"  7 ,   /8 22Š)/$ ÿÿÿÉ›.{./&/#&#.'&=46?32225'./"/4?6724&/&/&/#5!#7/&=4'4¦D   n."4o/' gH 3 , 9+ *-  8œÜ3   :ü: %  &]Ê þ´-  #>"  7 ,   /8 22š *_T 5%$0 ‰{. S72#"&54674>72"/&//./&#'76?675!5!!2?4'#"&¡'‰5,'D4*V"%! -4.%-AZ U(1þÍ{þê40, ‘$#õ4- :8 þÊS6Y; (!22š> /$ ?. H72#"&5467/&=4'4'/./&#'76?675!5!#7¡'‰5,'D4*  : /-4.%-AZ U(1þÍ?Ú1  ‘$#õ4- ã&@ 5%$0 ‰ þëS6Y; (!22™ *ÿ˜/'•463275.#"'&/"&725!5!##".'&/3265'#"'46;3>54&'.#"73'7674#".54>7.=632767‰   (%* +:/ ­/þzY 1*-7P<#$!# 3-$$#-5  & /7 !   $7:G A() Y4  2%    R8‡%** ©Bt33þ˜ + </+)7EC 69$%  0  A=&4 1(/    9 `& ÿùYØU…2?674&'&/&/+"/+&54?67//724?6;37#"&/&/&/&/32>?'#"&'4>n%.    1+ ?    + #  ^  ; $#RK", )f HR    &  '   0h& ; 2E&(,.#NEF+b0*K "ÿÎÿÊæ‡–4>72"/&//&+"""#".5474?36;2;24&#"#"/#"&/46?67/&+'32>?2'5!!2?4'#"&ô"%!$T  /A 4/ *3D % +#  1  A2g#  1  þá4, €:8þŠ&,* 8 1;Z  #"   * 2 E'#‹u  2)/$ ÿÎÿÊ¡‡‰%/&=4'4'/&+"""#".5474?36;2;24&#"#"/#"&/46?67/&+'32>?2'53#75 :-$T  /A 4/ *3D % +#  1  A2g#  1 ÇÚ1  ®&@ 5%$‰ þ´&,* 8 1;Z  #"   * 2 E'#‹u  2™ *ÿÎÿØá‡¬4&#"#"/#"&/46?67/&+'32>?2'5!!2?4'#"&54>72"/&//.#"./&+"&5463632#"./&5463246;2‘D % +#  1  A2g#  1 þæ 5, "%!#  *  "!1'4! gZ  #"   * 2 E'#‹u  2• )/$ :8þ0   +"    ;?ÿÎÿؤ‡ž4&#"#"/#"&/46?67/&+'32>?2'53#7/&=4'4'/.#"./&+"&5463632#"./&5463246;2‘D % +#  1  A2g#  1 ÊÝ4   :.#  *  "!1'4! gZ  #"   * 2 E'#‹u  2› *_&@ 5%$‰ þÃ0   +"    ;?ÿÈèp#.¹72654/&'""32?654/&#%'&#"27&4>72"/&//&+"""#".5474?332732;2'&/'764&#"#"'#"'".547#5!632'5!!2?4'#"&549 [   '"  BŒO"= vÆ %%!$T  /A 4/*0 «G+ 6()8y|)2*I,  þå .1, û_ # 2 @M uH:6þ&,* 8 ÿ21ª.* &4'142$4. ~“  2” :/$ÿÈ«p#.«72654/&'""32?654/&#%'&#"27&'632'53#7/&=4'4'/&+"""#".5474?332732;2'&/'764&#"#"'#"'".547#5!9 [   '"  BŒO"= vµ)2*I,  ÓÞ5   :1$T  /A 4/*0 «G+ 6()8y|û_ # 2 @M uA$4. ~“  2› *_S 5%$0 ‰ þ´&,* 8 ÿ21ª.* &4'142ÿã:. ~2654&+7###"&'3;2>74&'"&5463273265./#"#"&5467&5#"/&5732654+5!Ž *x**`$  ‰/Y‚C,- 1-, '!! 4"'QC4  '0 Æ:˜$; d-%  1# i Ÿ¶\ /( " -""*(N -(!#D22ÿÿÿ¬Ö.ƒ76?2'4>72"/&'./&/#"&/.54?3225/&#""/&/72?&5.#"/#5!!2?4'#"&®-^#%!(""4o5' KgA&  (.  !  A '* Öþá6,  ü7  4¤|:8þl- < " 0!þ #:A&%  W  22*/$ÿÿÿ¬“.x76?2'/&=4'4'./&/#"&/.54?3225/&#""/&/72?&5.#"/#5!#7®-¡ : 3""4o5' KgA&  (.  !  A '* “Ü3  ü7  4¤þ²&@ 5%$0 ‰þ—- < " 0!þ #:A&%  W  22š *ÿÁÝ.—76?2'.#"/#5!!2?4'#"&54>72"/&//.#"/&+"&5463632#".5&5463246;25/&#""/&/72?&®-µ '* ÝþÚ6, #%!#  '  )-+4!  (.  !  Aü7  4¤{  22†*/$ :6þz0   +   !  B?*Ô #:A&%  WÿÁŒ.ˆ76?2'.#"/#5!#7/&=4'4'/.#"/&+"&5463632#".5&5463246;25/&#""/&/72?&®-µ '* ŒÕ,   : +#  '  )-+4!  (.  !  Aü7  4¤{  22— *_T 5%$‰ þª0   +   !  B?*Ô #:A&%  WÿÈ\p²>7#'3?654&#'&#"27&4>72"/&//&+"""#".5474?332732;2&5./'7654&#"##".'#"/&5732654+5!632'5!!2?4'#"&´ º)+ !) O"# vÌ"%!$T  /A 4/*1 ! «G+    67  $ 0 –ã):v@  þà+4, è  ;  $$ @" uR:8þ‡&,* 8 ÿEª.  8% !#D2 ƒ ~“  2Ž7 /$ÿÈp¡>7#'3?654&#'&#"27&&#".'#"/&5732654+5!632'53#72/&=4'4'/&+"""#".5474?332732;2&5./'7654&#"´ º)+ !) O"# vî#67 < $ 0 –ã):v@  Õà76 :3$T  /A 4/*1 ! «G+  è  ;  $$ @" ub 8%*VD2 ƒ ~“  2œ-‰&@ 5%$0 ‰ þ´&,* 8 ÿEª. ÿÅ\p´7264&+%'&#"27&%4+5!632'5!!2?4'#"&54>72"/&//.#"'.+"&546732#"./&54632>;25&5./'764&#"##"&5#"/&57326ªe *x)+HO"> vþ –ã%9*I,  þÛ+4, "%!# $ * %!, +-&! «G+   6M  $ 0üd"$; @ @M u2$4. ~“  2ˆ7 /$:8þ0 +" $#  A$7çEª.*  W!#DÿÅp¨7264&+%'&#"27&%4+5!632'53#7/&=4'4'/.#"'.+"&546732#"./&54632>;25&5./'764&#"##"&5#"/&57326ªe *x)+HO"> vþ –ã%9*I,  ÓÞ5   :1# $ * %!, +-&! «G+   6M  $ 0üd"$; @ @M u2$4. ~“  2› *_T 5%$‰ þ°0 +" $#  A$7çEª.*  W!#Dÿwñ.GK'&/&/&/32?6?654&//674&/"2+&#.5?6?27%!!›HW$>…"EH&M31FF&%  I  -  KINþeÍþ3;K! +u= 10 }   0 _    > XI¶2ÿ¬X.W27/&=4'4''&/&/;726?654&#"#"&=46?654&'#5!!òV8   :7 ?82, D6I6Xh7!V = @)"& XþÓ:9 *_T 5%$0 ‰%.  HD80 4‡ &$&1  22ÿýÿ÷—.M&/.'574>72"/&'/&/.#'?675!5!!2?4'#"&@(81' &7K*" e#%! + %2!+0#@72"/&//&/.#'?675!5!!2?4'#"&= >!B%'”RK*" >ž"%! %2!+0#@!B%'”RK*" >â :2 %2!+0#@72"/&/./&/#&#&5?35'&/.#'?675!5!!2?4'#"&‘ >!!S:”RK*" > #%! (ƒy. %8g82  !+0#@!!S:”RK*" >þä%8g82  !+0#@54'#"&547#5!K$.?4Mi /þH '7(/ }[*FJ)<,$9S2 %,9E?!5!#"+&+"#"'#"&#"'546?65'&/.+"#"&54: *  /P!,óPS/þƒtE*3') -*!'$3n3$? B&!g P;§>+: B222& h !"'@& $3n   -)ÿê‚.'…#326?65'&546?#76325!#"+&+"#"'#"&#"'546?65'&5467.'#5"'#""#"/#"&54?4/‹A  / *  /P!,þÇ,% ‚B*(") -*    !!&0,- ü þA$3n1&? B&!g P8'22& h !"8@$3n3$8  '5"+"ÿìÿê3.$G€72654/&'""32?654/&#326?65'&546?#47#5!#"+&+"#"'#"&#"'546?65'&5#"'".% S   '" B / *  /P" ì8yGB*(") -* 8()ü_   2þU$3n3$> B& h P|14213&!g # 8@$3n()4ÿê¾.-g7#3?654&#4>7#32>5'&/&7"#"'"'54>5/&=#"&5#"/&5732654+5!ªÑ)+ !›0P!$) &.   Z (AB"0 !(!  6M  $ 0 –¾ü ;  $©*8?& –+@> 2! 25×[+>Q%2J% ."n1&Y !#D22ÿ¬ª.U3274&=4>7!2%"#"'./;726?654&#"#"&546?654'#5!|7-A*$þ¬!i *#[EJE KBÍ}7W) 9+/!%&&*ª>B' 7S %U~ V7C[^DH‹‡ 4!2 22ÿúÿ^F. <3#4&#/./76?6?675!5!#72#"/4?2[N›3þø 6@?P$ÈP: 4W4E,2 *'þÐLë :w0!   !&-G?}-Rþq,-6-U  '22&wV)3 ÿ^‡‰>3#2?#/&/&/?>54/#"&=6žN›3ýï0L< = - SV   MvS*%&)= +C'!!«-H4 3<- #(õ2þ Lg / ( *0ÿE‚?3#3#'./&#?'>54&#"#"&54>32/&=™N›3ÈW[-.-*1 !%  :R K &>)W8% :-2ýñ-)4+*+ ."AY*)(/ 8%P77‹ÿýÿLt..3#267#""&54?#5!#/./767‹N›3þi, 61J$(E­!$#B 3ì^]0B03> 5W G#x+"4) 22þ4.HD2ÿGZ3#4#"37>#"'#'./32654'#"&'5./7632#"'2?,N›3‘ 0 '- "2'%'_# Lt7D #, ;CJ) (U3K;"8†0 g 19,+? GK-50vD;›7- 9y :M b %2 Z"ÿÿÿ^±.63#26?6?6=/&/&'#'.5#5!!ÈN›3þú1  "$-ó“? .H¡þ×^!1 /ŒC«Fn22  !  ÿýÿ3.P3#;6?65/&/2&/&/;272?654/#'.=#5!!;7,N›3þŠ  . ³%,(8-'96btÒþšLÿ  "  >)-8"76'h& \0' 3O"Ó22 ÿöÿ^Ý.p3#"&546?#5!!3732?"/&5467'"&/&#"376?6363232#"./&/5732>54&'ôN›3þG2@Ðpþå/2  /K7&(   "^ 3 % :  :&'D,   _/01  *!ŸT,&22)Me*&7U z2Y &C& # G &. 4++3a 93R " ÿÿÿ^Ÿ‹73#/&/&'/.'&/76?5!5!;#¶N›3þÇ U#5!· l6Ce.,[þÌd 9S!7 4074/"&46327654&+"7#"&//./#+"&/&=?32'&#"72+"5463>32¶N›3 #  #&  !u L®' #*e!?(LeMB+9 !+ TŽD9c0$I8V  .!##f. &Qæ4,: HÒ, -#+- &&4""H 0( \> &p!jHÿÏÿ^·I3#23!3267"&57632#"&/#5!74+"#".546?ÈN›3¦@POþ°%h%4"2 /( 4 ;;DO -B   !]H42þ±f038.6#  +/);22' %   ÿ^ß_O3#4'32>3##'.547>54'#535./.547öN›3|=…  '2#y '$а  @7$617& µ–5!ÀRM*ŒA #)UF )413 D'A%*; #- .E%'3  #Z:*ÿ^#.53##"/5#5!!26?#"/&/32675&,N›3N_& Æ#þÔB 0'TK9’"#:;!ÿ^±.$3#26?"&57>32"'#5!!ÈN›3þü] $ $H;*+-J­þÍ!N Q##  6Bl$Pc22ÿ^$;3#"&546?2'&=7'3#'4&/"/4632#;N›3þ£5HE2%    G^6C,'5%0&!›ZD>L   2KH 22þ89V 9* '-ÿýÿ^y.P3#!!2>=4/.#""/4?63#"/&/&/&/&'N›3ý·@ýÀF9"  + 2=!3x+' j A  ÿXN‹?3#3#'./7>54&#""&5?>32eN›3™WT>e;0O&ID, /  $ .5)+Q- R ' ,2ýÿX(D h?# ))K;!8+   P ÿ[I.-3#'#5!!>?/&/54`N›3×AmC3ôþuCC%&W# $kBE22Ó ;0A5F*#5  3'%<*&'ÿ=/4 73#'32?53#/.'&/7"/474632#"'"/FN›3ê1(&WAµ! }†T  n"<;~C+/ B<!+d N&IB2ýò3!dO^. / ÿôÿD3.)3#46;3!5!#'74.##'&'JN›3þH1  %'þ«ÞW1^4 "8 ;Ü3@ %=  22ýö8p % #@ÿDp@3#'&#"27&"&54?>32'53#'&5./'764&#"¤N›3þÕO"> vò  ,A)*I,  DO0! «G+ ;” @M ub,$4. ~“  2ýþ-ÿEª.* ÿNr.C3#232?4&/"/&/&#'?'&/&/#5!!6;2#".'47_N›3/  ?#24H:._" rþ5H={,5" 0;(/%$1ú ,þx?)%S1M 22N›3þÝRK*" >o %2!+0#@2F,j<  MÍC %=X(]'!ÿNU.93#/&/"/4?6724&/&/&/#5!#lN›3þbC   0 L , 9+ *.  ôX1®9 5%  &\þ-P,   /8 22ÿDA.+3#'.'&#'?'&/#5!#XN›3þ‡ " ! & 5)2X99D+k.&"ÞW;¸ &! * !3~ýÿ/n T-U  22ÿN.33#2#"&546/./&#'76?675!5!#3N›3Ø5,'D4*’'Ý-4.%-AZ U(1þͽX184- ÿ$#S6Y; (!22ÿHj/B3#46725!5!#'4&#'./"&54632#"/.57>32N›3þ¶, þ`4)! 1  % )&(9?"$ 7F)'‡33ýÿ1,3"$ &" + C7!1;ÿÎÿN{‡M3#4&#"#"/#"&/46?67/&+'32>?2'53#'’N›3·D % +#  1  A2g#  1 CV61Z  #"   * 2 E'#‹u  2þ.ÿLC/73#'&'7'54.'#5!#/.#&+'?/#".ZN›3ß# /'/Ä8)þÇå[{3 D|&3ÿ 1!žÜ'$%Ÿ 33þ4(^Xk ÿHq.?3#76?2'.#"/#5!#'5/&#""/&/72?&ˆN›3þp-µ '* f0  (.  !  A7´7  4¤{  22ýÿ9Ø #:A&%  Wÿ[ã.D3#'&/&/;726?654&#"#"&=46?654&'#5!#2úN›34AK2, D6I6Xh7!V = @)"& Áê!i$ã1F  HD80 4‡ &$&1  22Sÿ^y.P3#'#"&54>72+"'#"&/&/326?654'#"/5#5!!76?63N›3ê#%‰eH>P2  $D#)M",5È"þ× &# A!n    YqNb%&$JK)3B2) %"K »22£#- qÿ^.13#'#"&54632'326?"&5763"/#5!!/N›3õ! * o W$ 1! eA,$K³þÎ!†)!$!¸ M'!4H6sX>22ÿK?.23##"&54632'&#'76?.'&'#5!#VN›3þ” J $, b'b #'”OªC.7$?êb4±M 2;HþT'$sÁU,+*22ÿýÿK). -3#&/.'5/&/.#'?675!5!#@N›3¶(81' &7K*" 1 %2!+0#@!B%'”RK*" >o %2!+0#@3>32. ö  %  &  &9  %. §,+ L   2 !H `'¿??þM  n  -$ ( ,Y &. ?$   $<  ý£ÿ|;¡2`753##"/&/&'46?27654/./57672"&54?>3632#"&/2654.'4öX"*   $2 G" ! $G  4,1] L*+6 ä??™R$/  ": ý¬1  PB!2E,0@…D#'/ +ÿo!§  Lh7"7654&#"4&#"#32753'27654/./57672#"/&'467"&5467&54>372š&1"/O=6 .ºö. $[+, L $V(- /;'%B8)&5$®#î. &"1??Ê 'H  '->% þ€.'': 1>+,0" 'ÿt@º,or7"&54?>;2#"&/2654.'2'#53'&/&/&/3272?654'4&/&54>?6;'±! $E ;(/] @.+7  "P % !.$ öæ#"# &  "9 k)0 OB -}G,0Nt E"(hQ3  )', ,? m   *  ‡ÿøÿn!  Tp7"7654&#"4&#"#32753&54?>;2#"&/2654.'".'"&5467&54>372š&1"/O=6 .ºöÄ $E  7+._ K,2/  w(- %E'%B8)&5$®#î. &"1??=  MD!5~F,0'† J( þ .''4'1>+,0" 'þhÿ'ÿ¹L732?654/"723275'7&/"&/4?67þ• ++* 4  3=*!,7  +' 12*1 " ÿ¦éÔ.'+4>72"/&/52?4'#"&73##%!# 6, ØØ€:6#5*/$ Ã2þŽÿÿÈW'%27&#"2?67'"/"&5746þñ 7 Œ‹  ';!;! ' vy+ 2ÿµœ.7/&=4'4'573#0 :;>  \ÀÀ®&@ 5%$0 ‰J *!2þ{þõÿ|=&/?Ÿ@8n’)q*#ð0!?k2QP! $ÿ¹Äí.594&'#'72?6;2+"/&'4>723265!!€(%$  ,2.   2 Ç4þÌ(  !!#5   (2þ6/C3#26373#"'"&/./&/.'32>54/##"&/4666² &*M* .j$   (  <6*+ '/!3&1/2¨  !:'FRT#5 ;#  (e( -%%.ýðÿå60T3##"/&'3;2>74'"&54636;65./#"#"&54>72#66:‰/FB3K,- 1,- '!  4")"J45N 02þYi ;<Æ\/( " - ##%"-!:.$ þ1ÿÖ6/;3#2/&#".5473263254&#"632+"&5467266’.@ U .3 793$ >  +TD/2‡!þš =  ;*/142!Ò *+)-8gÿEÿ05«&/47'5376?   $& <80).8!  4&+,>B#!R&Ф4)?6þwÿEÿ¶«-8'4#"./6?6=37632/7'p + @9" * % ^&,0ë / /( EQ -+J0$  U !  ÿò4ø.,"=&/&'#"&54632>5654.#!5!#":+ )&*2&*g þŇ!I'#(#,@ 226' %þÿjÿ*|%257/&/.#+"&546þp6F0 '$-0_7Xþî6( &!(#8þ˜ÿÔÿ¸ª.#'&+"#"&5463257H*1 $(#B4G8+,!V 9%2IPþáÿÿ§Q 25""&/&/6?637'Ú<   X 4%& 6" !<d -Òþfÿxÿ7µ%7&#'763767þå <"2Z$[9 G* Ñh?E* þÃÿ–ÿ÷N. /./&#'?675#5!#‰8RK*" L 6,"/-@3þÊ.# (  *43%4!n<3Ä0)  #+    :0:?þfÿÃÿ³0'25/&#".#"'6=>32#"&=>;6°.(  9 %!,:3*) Œ)"‡(30 7@ #:%3ð/;25!5!#/.#"'&/"&'4632#"&'.=6327679/þzY * +:/  : Y4  ÊBt33è  ** %  `& .167';267'&'"6?4467#53##"/&¢F   #2 HÀ6mÌ)  T7 +V D  x  H >$J33 2"UHã. .3?654#"&5#"/&5732654+5!ö)+ !<$&6M  $ 0 –ãü;  $-% Z !#D22þeÿa6/:3#2&/&/326=4'7'&#"#"&5475>?363666«%P>N$ b/BB;:=W26x&T! @!$ 1'/2‘J75P%  Q.-B(""w&<% &; +-&( C%2674#""&54632;#"=4#"#"=4#6232>7>32¸0,+"&;;.$:8µ $& ""%F  %í"'3.$*1)9"'1CI8Sõd+0 Oî&6Hü-0 :! K-ß' )932?>74#""&54632;#"54#632;#"54#632E ) +4&;;.*48´ &(&%‹ &(&% 3.l*1)9(!4@K9TG&7Nþ²9TG&7N/T',32?>74#""&54632;#"54#632º ) 4':;.*48´ &(&% 3 m*1)9(!1CH9TG&7N ÷&.(7"&546?2&/&/"/4632#‰5H;<% '5%*,÷ZD2V  =9* '1.ÿêâr +2#"/46?274&#/.#'6?F07'* G cO0-`i 8!!! r#E+6 %2þ¼/-GG#@!>+ÿæM½_7"&54747467>7!5!656574&/#".5473723#3?>5.5467#¡+5)\hþ¶8  T(%9  f=?Sk   š+ !H 4-'N.$ ;8nG2% * (2|" ' !!   ÿýÿê‚.D232>5'&/&'546?3#"'"'54>5&/&54?#5!ÇB  N &.   /VY +84/!!(! /‹‚üN<.;9e( 2! % 35- 8 BC)X@#)@& ."4B'82B22L.0%"#"'>54'#"&547#5!!>767  7@,2)19ES722W(:7 "8 ?rÿòÿ´Š.FX"=&/&'#"&54632>5654.#!5!#/&/&/"/4?>724'"7#:+ )&*2&*g þŘX > )  #6  ‘!I'#(#,@ 22ý¸-*%     8" . %  &¦6'%ÿÄÿ‹; ,4&#".546323?632#"5špZlb% TBš|&DK6#" &GøfxJ2   O6J\ $8dAýñ&# $YÿÄt•« 7254&#"&54632#"&54õ&"!A-jAYxW6Nš¶4;6D*(*;*3V([!Z@1l*8;1(ÿÿ4Š'åþÄÿÿCŠ'åDÅÿÿÚŠ'åÂÆÿÿÿÿþÍ,Š'åLÈÿÿÊ'å@ÉÿÿÿýùŠ'å¡Êÿÿþ»CŠ'å|ËÿÿþÈŸŠ'åÌÿÿ)Š'åÑÎÿÿòŠ'å"Ïÿÿ#Š'åTÐÿÿ'åŽÚÿÿÿÿÿþŠ'åeÓÿÿzŠ'å¢Öÿÿþ” Š'å¨ÕÿÿØŠ'åPæÿÿþÁŠ'å»Òÿÿÿý_Š'å¾ÍþÀÜ\/:%+#"'>?67!"&54>73!.54632"7654&Ü Å F:# 9A þÄ=))GRq\68"@)Q9Fb8'.=2/(¬!% FVP&/5¶ þ #hUNd D0 „NcMrLV=2BÜ\)7%#!"&54>7;.54>2#"&746732>76&#"Ü ýÀ=))Ú7>L~ÔTP:=d%Kq2+h/*)2//5¶ þ 2?6bHUMLIKJG aL>„)!2+/ 41GÿÿþÍX P%3276=!"%547#2>54&+#".54;547!"#32#"'&5&76.hMP;þó)TÏrb™\<PM`ðOp4|8 › ‡$A=#þßàÓ”°r F(8J5{¿=K2Do-_•++•ý£.G_Y.p`‚¬(CA$•W 0 '•2aBÄã˜ÐësdÄE}UJ%Dÿ •[V7#"547!"#>3232654>732?2#"=!"54;>54&#"547#32?2¡.,G8÷ › D-+3#M+Ü!.,Gþ#$¨5G7) #-%*²!fMYœW 0 '­>4#I0Um° ý&MYšeA6H ,0&%&+*þr&øX+3?+327#"=47##".54;547!"+#547#3276=!"ø )Dsð@b8# |8 ‡ OφhMP;þó)`0µ##1/Rº ‚¬):4•W 2 '••++•¡=K2Do-þ¶Xx327!32>54#"".543!654.#"3267#"&5463#"632#".54>3!+"6323254>7+bªyødýÎ[7)% VH&ZŠN1‚v33!+!1 Þ1O, 'd &bJ,E$-BqEŸ V ;FUV%^$)>…+——‘L:†N58(.r.ýÇ&4,49BCa2w1!-<3<.=S3S#;%bn/@O5LcR9â.ˆwbR7= ý‚>,EVÿ@ÛlX2#"'&54>76323276#"54&#"32>54&#"3267#"&54>76OAQ/G{N½ƒR)P_AX‘'p‹$G "4!DÆ¢.JQ*<9i´?D3!8/F&' *!1)/‚u`-ZfM3¨g×uµ}R!,I4ioþs&(2RšŽ­5*<ØyT"²'326326323254>7+! '&543!6=4#"#".54>7&#"#".5467&#">32%"32654'&32>7!""32654'&»E 0)# )!¥fEOj1J‰WknVk[mTrº6µ$*=ä¢ýÛþËTq‚TpV4kP7P#9+M[&(kP7P#?:IUAi=*[5 &g!I 6$.:oüž²âo¦«†1üBMÊ!I 6$/9o.3 &- G(/'Nel•lJgS<..//þürQº47= ý‚?+·&3\4n¿oî Y¼pŠ@^INo'& Y¼o‹@^IK‡0$*=L::#;à™C7+#"'&543!6!"32Úψ#9; R9þóJ^&"BðKm7|8 › i¤N•$ ))>ÅGÎs…Fq‚Fmþ3M>WN¨]•++•‡.C"2Do›4B ‚¬)BC"•U2 '• £z7= ý‚>,Va&=R4g™&( þ¸ÈYKT23254>7+#".543!654&#"#"547#3262#"547!"+>!"326;:^›$ ))>À7ÈqHr@)‚öC+*.%*²!.,G8÷ › ZIþEM¡5f¢creB7= ý‚>,Wb-6'4;K_K )!X($Ó+*þr&(MYœW 2 'þÎ/-þR&)8Cÿ^\#"=#!"&54>73!2654>7327D þÂ=))D)òR£/5¶ þ ° ý##1/ÿÿþZ\D%265#"#432+#"'&<>7632765!"&54>73Ž7M RN C^2€dU,JzT±‘Œ 1 Z-Ò_„\*þù=)2žRvþ‚r´'IV8—ÃDfb>&€{K)J2< eÊŒŽb•j/ 04¶ þ!ÿ\5"=!"&'#"54>73274>7;2654>767326?ÒDþÒ4,;Xh)AB))þ( -òR "%Gd¶ þKeI þ ° ý#  ,&þÍÃXL%262#"547!"+632#"'&547632654&#"#"547#±.,G8÷ › )rBVCgƒv6ºŒ¤i .Z;ui˜Ë6" #-%*²A(LYœW 2 'þ×krN^˜]?˜Ð»£ #:‡V>aV^$EÈG7-X($Ó+*þr&þ·X Zc%4#"3267#".54763232=4./632!254>7#!!"'&543!65&=4#">32!"326Z& :6)#Of=/J(HXÍR/tX%$*ACŒ$)>þØBþÿ…Fq‚¸†vqƒ [51TÎþyM®9gp¨q!_GKhi,>N9ji5"„Ç­¤BI ^t{ëF7= ý‚?+·&>Q4+8؇£‰z:KþM&,7Fÿ¯[HT"=!"54>54.#">32#".54>32!2654>73274#"326pEþ@080*V91F:/G01U#99-F$/J\Z(;]7# -(7 ))ýŽY'0 :7)"òR  )3pIKU: %:jD7,KV;V,/@P3BsM8#5HC#8dG-° ý##1/žr)'$\FþŸ ]Q%265#"2>54&#""=!"&54>7;432+632#".54>>7M R£#]lH-&%4þø=)ø D^1€dV6Bu×µN“˜qG"/2" W!7NSaU3žRvþ‚þ£=)))(3r05¶ þ!r´(JU7–ÅV32#".54>32>3!+"632#".5476! 7654&#"ùZ+ /)#C.,G ˜_!.,Gq]¤ [5*,#998N! 2L^W$u#22sV/U@WN‚®¹cn»‡jC,i S;ƒv*09­r" '- GD(LYvþ¸&(LZZrŽu:!C.;V,BaGFvL6K&$, û=pPc¡iG#:RZf]0øf  ,<}Nßþï†y1O[5þ½È]BK623254326323254>7+#"'&543!>54#"#"54#"#".53267!"OŸ`%'N¦ •$ ))>¾‚å‡Dq‚ü \*2&(QLF - ¡5[©/þDMh(0h…44¦þÀL[*7= ý‚>,·&>Q4!Qk:;þ…43yxwþ¦[/* þé)8DCþºœY ]lv%4&#"32>6=4#"#".5467&#">32#".54>326323254>7+# 543"32654'&!"3 +/E7&% TpV4qP5L#=8JZBi<*[5 &iS8P 1J‰WpoUnºY¼$ ))>îLâ‹þt‚À"G 6$/9o ¶ý©MFkR#¬2>.377(/ðˆ¥oî Z»o‹@^IJ…0'+,X_µ40—D>H1iU¢Býž&*êZ[547#"3276="+32>32!"#!"&54>7654&#""=&+#".54;547”»>)$. .>E2 ‡ KgT.9T44‚þ”""-6*-DVQ$.=7<`9%|8b•++•25_2Co*2 '•U83VD1L-  ("$$A>HoDPwi‚*@%+:5•W þ”‚[€"=!"54;>54&#"#"547#32?2#"547!"+>3232654>7632#".546;2+"3 7654.#"327mDþ#$¨5G7) #-%*²!.,G8÷ › D-+3#M+Ü>U$4 OzÊ‚·ï{.DP¥3-¥I Jºæ[V," &,)˜RFeA6H ,0($&+*þr&MYœW 2 '­>4#I0Um° ýä@41/WZA*3=-(>!I3(‡F6* B##1/þžXdlx‚%# '&54>32#"'32>54&#"32>75#"=47##".54;547!"+!+632%547#3276=!"%2654#"#^ò™þù´º%>C%)*JBQ,cB%š\œkU1! 2$7 &Ds,LK,Op4|8 ‡  -R>RýóφhMP;þô)þþ%7M*;51eqW9 ¦ÕbI! 8(HK<+&Œ—cŽ0??A.&G 2.Rº ‚4H"(CA$•W 2 '•0~Jbá•++•¡=K2Eo-)(4^V"Bþ´»X„‘˜2632#"5467#"+#".5463!654.#"3267#"&5463#"632#".54>3!+"632325463!+"32>54#"!"32>--H ¬-)>…!dvu?ZŠN1AAv 9',(+!1 Þ1O, 'd &bJ,E$-BqEŸ V 9S%:#%^$#³Pû97)% VHýÎMªyøS)MY06ýè>,4K(&3*9B$IK.&]1! -<3<.=S3S#;%bn/@O5LcR9ò= 2FC%aR7,!4, ýÏ'58(.r.þL:ÿ6/^GW46&#"32>54&#"32673#"&54>7632#"'&5%632#"&74&#"#"326 ];L€±Õµ“+PO/9.<' /!10^EM,D]T-»…RMVªÉ ?.DNÜ% 0('$+T;TIþëáÉÿ:rNI`v0E>3=ª þÔK~^U„L0¨g׈’(–g)8%RDA<%& &þºÚX›¥³%4&#"326262#"5&63#"+! '&543!6=4#"#".5467&#"#".5467&#">32#"&54>32632632325463!+"4&#"32632$7!""32654&(-.& 7'#)5--H ¬-)>ä¢ýÛþ¦Wq‚8QXU!(?=-E$?:HV†[8 W8;KhDOj 7LxIipWj^mVmº6µ$$³Pý"[%"GH9,<ûÿKǪè1^üMñ"F 6$+<\ª4>68?Ë)MY-6ýë>,·&3\4mÀoî Y¼q‰@^IJ†1&Z»Gh4-=N5Jˆ1#d>c9XHfl•l;QMC)..00þürV¶37&9, ýÒ'A\†™CF…rþ­!(6Qb˜CÆFÌu…Fq‚F0FBðKm7|8 › i¤N•$$³Pýþ3M=WN§a•++•‡.C"2Doþ‚)+-Y-6ýë>,Va&=R4gˆOM‚­)CC"•W 2 '• ¢{7&9, ýÒ'?&( þ»nYir%4&#"#"547#3262#"547!"+>3232547!+"3262#"5463#"+#"'&543!6!"326ˆ;2*.%*²!--G8÷ › Z!10›$B³ P#,H¬-)>À2V‚K…Fq‚ø%þEM¡5d¡jU )!X'#Ó+*þr&(NZœW 2 'þÎ/--Z>d@7W ýÒ')+-Y-6ýë>,5@(&=R40b&)8Cþœk\X3 7654.#"326?#"=!"&54>73!2654>7>32!"'.6'6;2+"[7[^4X#" .: -Dþ‹=)D)+()< O‹þüÉR$0  †¥3-¥!à . œ?/)4.#  ,&R<04¶ þ!° ýâ#  59\S’&# ^!þ¸…\CM%265#"%32767!"&54>7;432+#".54632#"'72654#"¹7M RüôùÈuU1þú=)ø D^1€dU.^¼1[jYU;$_VHJR:G-f$9M)92žRvþ‚u»þþL,ž04¶ þ!r´(JU7•Å 7q 2Tmœ_´D@PD= +2^O.>þœ \[3 7654.#"32>7#"=!"&'#"54>73274>7;2654>7>32#".54;2+"\?Ê»V#" ), )DþÒ4,;XhAB)þ (6þñάàv,•¥3-¥?Á(.œ?/)#I# 10RF"%Gd¶ þKeI þ!° ýõ¤Œ¾,7(s!þÊX W2654#""'32654&#"#"547#3262#"547!"+632#"$&54>32¬$9M)7MI* .Ur­h’Ò5$ $-%*²!.,G8÷ › *u4WüÑ¥þõ%>C%ƒU)+2^N/>-=f*Zg[J,Ë¡C9-X($Ó+*þr&(LYœW 2 'þ×lZcÁðyä’bI!@IþººXv„Ž2632#"5463#"#!.'&543!65&=4&#">32#".54>3232=4./632!25463!+"%4&#"32>!"326=--H ¬-)>þØr‡bq‚¸…;P7W/! [5 &$99:V%=ds=2F&tW $*G=Œ$$³Pü+/E7&% þzMagepP)MY-6ýë?+GW =R4*7؇XQ-=Q3:#;%;V,Ws:VˆP("?9-Ç­¤$3& aq{ë>#7$;, ýÒ'ü2>.377(/þÞ&0Fþ”…[ …%4#"3264>54.#">32#".547632!2654>7>32#"$&546;2+"3 7654.#"326?3#"=!"Y'0 :7)"a -, *V91F:/G01U#99-F$?m«;\8# Y-7(4+; OzË‚æþõ_FO¥3-¥? ·ì\V#" &, -DþA¬r)'$\Fs):`:KU: %:jD7,KV;V,/@P3eV™"6KG&Už#° ýí53-UZB*+F8)I!7"(œ=0( B# 10RFþ”“\P\%265#"4&#""=!"&54>7;432+632# 54>32#"'3262654#"Ç7M R—.#%4þø=))ø €h€dV6NiwÀ‚þæþ%>B&)*ICJ* e(†‹v)¤Íü¼$9M( 2Svþ‚Þ6&(3}.6¶ þ r´†vœÀaþ—ÔXŠ”%32>54&#"%"3262#"5467#"3262#"54#"632#"&547632>3!+"632#".54>32#"'! $54&%2654#"í7'% &0, 45!"/+G ˜_!.,Es5L?3;^;K$K5SdCd³s%14sV /N>-!/GrÈv—ø¥xB*92)*N>Q,¡rÊP5ûb%7M*;¾68'-.E#1&^7*LXžxþ¸(*MY\r $8gAYXH!AE*’mha‘J%%,øCF3K/]eYR:"1Vk~u54#"#"54#"#".542325432632325463!+"3267!"ñ,H¬-)>¾GÈiqIq‚ú\*2&(QLF ,!a$&O¦”$#³ Pû¡5\¤0þGMQ)+-Y-6ýë>,aX(=R4"Ir“>;þ43vuþ¦[0+ (0h…42ªþÆŽC7)7 ýÒ'e)8AFþ¼BZ |Š”%4#"3267#"&54>32632325463!+"32632#"5463#"+# 543!6=4&#"#".5467&#">324.#"326!"3 ZE 0)#OmONZ1J‰WpoUnºY¼$#³ P%,H ¬-)>îLâ‹þt‚¡UEC@2(?=-E$=8JZBi<*[5 &a)+"GH8-=:ý«MFkR#­q.3 &- GKR~¤\JgS<11þür·ˆ7'7ýÔ')+-Y56ýí>,X_µ4‡¦o…j!Z»Gh4-=N5I…1'+7;254326;.54>32#"&5473+">32#".546;2.+"!2>54&#"3254&ÿ, H Yc &(QL*Eþú=))î3n!CL=$$BrC¶[16D*AWI³ u'>+,@!8[}‚‘u8/8nGa?<DQ¥`B"x&¥"Ý`ʹwP*,4(BA-E( +.Y—@Uþ¬43yvuþ¦4(/6¶ þ ?h…E?R1;:'”F?D8.9b/L+ þÈ)'@C$MYE)  $5 .?<<&+ !s-U•]:Q,$'2%/]D0;þ¼X (4¤±%4&#"326">54&547#3276=!"%+#"'676?#"54>54.#"632#"&547##".54;547!"+36323767.54>323254.9+/+ 0)#&8 O7 - Aü3φjKP;þó(   $5Q< ." ƒd 0!.D*6,ð>'=;H4( 4H" bML^Gð@b8# |8 › [Eœ$?F2 Fí(1='/E8-G'œ" b; ©3@# &- F¦#3)Bc ,&)=MÊ—++—¡=K2Do.¬(H'2 16'ò"&€l#)P/:U*Q1.\pya$0‚¬):4—V 2 '—Š #8b@M`*70 6Q.5M$*3%þû468  ÿÿþFŠ'åhÇÿÿþ¿$Š'åä×ÿÿ(Š'åÐØÿÿþ³$Š'å,Ùÿÿþ¼Š'å¼ÏþbªY%7262#"54'&#"#"&54632y.,G:q‘&% IQ|vA]D!A(LYØq#]n =  MGN[BoQþ-&þbªD$7262#"54'&#"#"&54632y.,G:^TQ!"Objuc€A(LYØ]#^;(0 E=J^……þ-&&3h °È' ]ž Í Fe$ö,u f œ  º NÏ G 4h ¹ Œ× H¬ X$¢$ †²$H:$T„Copyleft 2002, 2003, 2005 Free Software Foundation.Copyleft 2002, 2003, 2005 Free Software Foundation.FreeSerifFreeSerifMediumMediumFontForge 1.0 : Free Serif : 28-11-2006FontForge 1.0 : Free Serif : 28-11-2006Free SerifFree SerifVersion $Revision: 1.56 $ Version $Revision: 1.56 $ FreeSerifFreeSerifThe use of this font is granted subject to GNU General Public License.The use of this font is granted subject to GNU General Public License.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlThe quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.navadnoDovoljena je uporaba v skladu z licenco GNU General Public License.http://www.gnu.org/copyleft/gpl.html`erif bo za vajo spet kuhal doma e ~gance.ÿœ2×  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òó—ˆÃÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîºýþ    ÿ øù !"#$%&'()*+ú×,-./0123456789:âã;<=>?@ABCDEFGHI°±JKLMNOPQRSûüäåTUVWXYZ[\]^_`abcdefghi»jklmæçnopqrstuvwxyz{|}~€¦‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒØá„…†‡ˆ‰Š‹ŒÛÜÝàÙߎ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     › !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ®²³ ¯ °¶·Ä ±´µÅ ²‚‡ ³«Æ ´ µ ¶ · ¸ ¹ º »¾¿ ¼ ½ ¾ ¿ À Á  à ļ Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç÷ è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ         Œ                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜˜ ™ 𠛍 œ ž Ÿ   ¡ ¢š £™ï ¤ ¥ ¦ § ¨ © ª¥ « ¬ ­’ ® ¯ ° ± ² ³ ´ µ ¶ ·œ ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í§ Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à ᔕ â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ        ¹                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖר softhyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccent Tcommaaccent tcommaaccentuni021Euni021Funi0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0235uni0237uni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02BAuni02BB afii57929 afii64937uni02BEuni02BFuni02C9uni02CAuni02CBuni02CDuni02CEuni02CFuni02D4uni02D5uni02D6uni02D7uni02EE gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0360uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni0400 afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061uni040D afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097uni0450 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109uni045D afii10110 afii10193FL96FL0461hFL0462hFL0463hFL0464hFL0465hFL0466hFL0467hFL0468hFL106FL046ChFL105FL046DhFL046FhFL046EhFL109FL046BhFL0471hFL0472hFL0473hFL0474hFL0475hFL0476hFL0477hFL0478hFL0479hFL047AhFL047BhFL124FL047DhFL126FL047FhFL0480hFL0481hFL0482hFL0483hFL0484hFL0485hFL0486hFL137FL0488hFL0489hFL048Ahuni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4FL04C5hFL198uni04C7uni04C8FL201FL202uni04CBuni04CCFL04CDhFL04CEhFL207uni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F8uni04F9FL0500hFL0501hFL0502hFL0503hFL0506hFL0507hFL0504hFL0505hFL0508hFL0509hFL050AhFL050BhFL050ChFL050DhFL050FhFL050Eh afii57801 afii57800 afii57793 afii57794 afii57795 afii57798 afii57797 afii57806 afii57796 afii57807 afii57842 afii57658 afii57664 afii57665 afii57666 afii57667 afii57668 afii57669 afii57670 afii57671 afii57672 afii57673 afii57674 afii57675 afii57676 afii57677 afii57678 afii57679 afii57680 afii57681 afii57682 afii57683 afii57684 afii57685 afii57686 afii57687 afii57688 afii57689 afii57690 afii57716 afii57717 afii57718uni05F3uni05F4 afii57388 afii57403 afii57407 afii57409 afii57410 afii57411 afii57412 afii57413 afii57414 afii57415 afii57416 afii57417 afii57418 afii57419 afii57420 afii57421 afii57422 afii57423 afii57424 afii57425 afii57426 afii57427 afii57428 afii57429 afii57430 afii57431 afii57432 afii57433 afii57434 afii57441 afii57442 afii57443 afii57444 afii57445 afii57446 afii57470 afii57448 afii57449 afii57450 afii57451 afii57453 afii57454 afii57455 afii57456 afii57457 afii57392 afii57393 afii57394 afii57395 afii57396 afii57397 afii57398 afii57399 afii57400 afii57401uni066Buni0674 afii57506 afii57507 afii57508 afii57509uni06CCuni06D4uni0780uni0781uni0782uni0783uni0784uni0785uni0786uni0787uni0788uni0789uni078Auni078Buni078Cuni078Duni078Euni078Funi0790uni0791uni0792uni0793uni0794uni0795uni0796uni0797uni0798uni0799uni079Auni079Buni079Cuni079Duni079Euni079Funi07A0uni07A1uni07A2uni07A3uni07A4uni07A5uni07A6uni07A7uni07A8uni07A9uni07AAuni07ABuni07ACuni07ADuni07AEuni07AFuni07B0uni0901uni0902uni0903uni0905uni0906uni0907uni0908uni0909uni090Auni090Buni090Cuni090Duni090Funi0911uni0913uni0914uni0915uni0916uni0917uni0918uni0919uni091Auni091Buni091Cuni091Duni091Euni091Funi0920uni0921uni0922uni0923uni0924uni0925uni0926uni0927uni0928uni0929uni092Auni092Buni092Cuni092Duni092Euni092Funi0930uni0931uni0932uni0933uni0934uni0935uni0937uni0938uni0939uni093Cuni093Duni093Euni093Funi0940uni0941uni0942uni0943uni0944uni0945uni0947uni0948uni0949uni094Buni094Cuni094Duni0950uni0958uni0959uni095Auni095Buni095Cuni095Duni095Euni0960uni0961uni0962uni0963uni0964uni0965uni0966uni0967uni0968uni0969uni096Auni096Buni096Cuni096Duni096Euni096Funi0970bn_candrabindu bn_anusvara bn_visargabn_abn_aabn_ibn_iibn_ubn_uubn_ribn_libn_ebn_aibn_obn_aubn_kabn_khabn_gabn_ghabn_ngabn_cabn_chabn_jabn_jhabn_nyabn_ttabn_tthabn_ddabn_ddhabn_nnabn_tabn_thabn_dabn_dhabn_nabn_pabn_phabn_babn_bhabn_mabn_yabn_rabn_labn_shabn_ssabn_sabn_habn_nukta bn_avagraha bn_aakaarbn_ikaar bn_iikaarbn_ukaar bn_uukaar bn_rikaar bn_rrikaarbn_ekaar bn_aikaarbn_okaar bn_aukaar bn_hasanta Khanda_Ta bn_aumarkbn_rrabn_rhabn_yyabn_rribn_lli bn_likaar bn_llikaarbn_zerobn_onebn_twobn_threebn_fourbn_fivebn_sixbn_sevenbn_eightbn_nine bn_asamira bn_asamiba bn_rupeemark bn_rupeesign bn_currency1 bn_currency2 bn_currency3 bn_currency4bn_currencyless bn_currency16 bn_issharuni0A05uni0A06uni0A07uni0A08uni0A09uni0A0Auni0A0Funi0A10uni0A13uni0A14uni0A15uni0A16uni0A17uni0A18uni0A19uni0A1Auni0A1Buni0A1Cuni0A1Duni0A1Euni0A1Funi0A20uni0A21uni0A22uni0A23uni0A24uni0A25uni0A26uni0A27uni0A28uni0A2Auni0A2Buni0A2Cuni0A2Duni0A2Euni0A2Funi0A30uni0A32uni0A33uni0A35uni0A36uni0A38uni0A39uni0A3Cuni0A3Euni0A3Funi0A40uni0A41uni0A42uni0A47uni0A48uni0A4Buni0A4Cuni0A4Duni0A59uni0A5Auni0A5Buni0A5Cuni0A5Euni0A66uni0A67uni0A68uni0A69uni0A6Auni0A6Buni0A6Cuni0A6Duni0A6Euni0A6Funi0A70uni0A72uni0A73uni0A74PulliAyuthamTamlATamlAATaml_ITaml_IITamlUTamlUUTamlETamlEETamlAITamlOTamlOOTamlAUTamlKATamlNGATamlCATamlJATamlNYATamlTTATamlNNATamlTATamlNATamlNNNATamlPATamlMATamlYATamlRATamlRRATamlLATamlLLATamlLLLATamlVATamlSSATamlSATamlHATaml_v_ATaml_v_I Taml_v_IITaml_v_U Taml_v_UUTaml_v_E Taml_v_EE Taml_v_AI Taml_vow_O Taml_vow_OOTaml_AUsTaml_pulTaml_AUuni0C02uni0C03uni0C05uni0C06uni0C07uni0C08uni0C09uni0C0Auni0C0Buni0C0Cuni0C0Euni0C0Funi0C10uni0C12uni0C13uni0C14uni0C15uni0C16uni0C17uni0C18uni0C19uni0C1Auni0C1Buni0C1Cuni0C1Duni0C1Euni0C1Funi0C20uni0C21uni0C22uni0C23uni0C24uni0C25uni0C26uni0C27uni0C28uni0C2Auni0C2Buni0C2Cuni0C2Duni0C30uni0C32uni0D02uni0D03uni0D05uni0D06uni0D07uni0D08uni0D09uni0D0Auni0D0Bl1uni0D0Euni0D0Funi0D10uni0D12uni0D13uni0D14k1k2k3k4ngch1ch2ch3ch4njt1t2t3t4nhth1th2th3th4n1p1p2p3p4m1y1r3rhl3lhzhv1z1shs1h1uni0D3Euni0D3Funi0D40u1u2r1uni0D46uni0D47uni0D48uni0D4Auni0D4Buni0D4Cxxuni0D57r2l2uni0D66uni0D67uni0D68uni0D69uni0D6Auni0D6Buni0D6Cuni0D6Duni0D6Euni0D6Funi0D70uni0D82uni0D83uni0D85uni0D89uni0D8Auni0D8Buni0D91uni0D94uni0D99uni0D9Auni0D9Buni0D9Cuni0D9Euni0DA0uni0DA1uni0DA2uni0DA4uni0DA5uni0DA7uni0DA8uni0DA9uni0DAAuni0DABuni0DADuni0DAEuni0DAFuni0DB0uni0DB1uni0DB3uni0DB4uni0DB5uni0DB6uni0DB7uni0DB8uni0DB9uni0DBAuni0DBBuni0DBDuni0DC0uni0DC1uni0DC2uni0DC3uni0DC4uni0DC5uni0DC6uni0DCAuni0DCFuni0DD0uni0DD1uni0DD2uni0DD3uni0DD4uni0DD6uni0DD8uni0DD9uni0DDFuni0E01uni0E02uni0E03uni0E04uni0E05uni0E06uni0E07uni0E08uni0E09uni0E0Auni0E0Buni0E0Cuni0E0Duni0E0Euni0E0Funi0E10uni0E11uni0E12uni0E13uni0E14uni0E15uni0E16uni0E17uni0E18uni0E19uni0E1Auni0E1Buni0E1Cuni0E1Duni0E1Euni0E1Funi0E20uni0E21uni0E22uni0E23uni0E24uni0E25uni0E26uni0E27uni0E28uni0E29uni0E2Auni0E2Buni0E2Cuni0E2Duni0E2Euni0E2Funi0E30uni0E31uni0E32uni0E33uni0E34uni0E35uni0E36uni0E37uni0E38uni0E39uni0E3Auni0E3Funi0E40uni0E41uni0E42uni0E43uni0E44uni0E45uni0E46uni0E47uni0E48uni0E49uni0E4Auni0E4Buni0E4Cuni0E4Duni0E4Euni0E4Funi0E50uni0E51uni0E52uni0E53uni0E54uni0E55uni0E56uni0E57uni0E58uni0E59uni0E5Auni0E5Buni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni1200uni1201uni1202uni1203uni1204uni1205uni1206uni1208uni1209uni120Auni120Buni120Cuni120Duni120Euni120Funi1210uni1211uni1212uni1213uni1214uni1215uni1216uni1217uni1218uni1219uni121Auni121Buni121Cuni121Duni121Euni121Funi1220uni1221uni1222uni1223uni1224uni1225uni1226uni1227uni1228uni1229uni122Auni122Buni122Cuni122Duni122Euni122Funi1230uni1231uni1232uni1233uni1234uni1235uni1236uni1237uni1238uni1239uni123Auni123Buni123Cuni123Duni123Euni123Funi1240uni1241uni1242uni1243uni1244uni1245uni1246uni1248uni124Auni124Buni124Cuni124Duni1250uni1251uni1252uni1253uni1254uni1255uni1256uni1258uni125Auni125Buni125Cuni125Duni1260uni1261uni1262uni1263uni1264uni1265uni1266uni1267uni1268uni1269uni126Auni126Buni126Cuni126Duni126Euni126Funi1270uni1271uni1272uni1273uni1274uni1275uni1276uni1277uni1278uni1279uni127Auni127Buni127Cuni127Duni127Euni127Funi1280uni1281uni1282uni1283uni1284uni1285uni1286uni1288uni128Auni128Buni128Cuni128Duni1290uni1291uni1292uni1293uni1294uni1295uni1296uni1297uni1298uni1299uni129Auni129Buni129Cuni129Duni129Euni129Funi12A0uni12A1uni12A2uni12A3uni12A4uni12A5uni12A6uni12A7uni12A8uni12A9uni12AAuni12ABuni12ACuni12ADuni12AEuni12B0uni12B2uni12B3uni12B4uni12B5uni12B8uni12B9uni12BAuni12BBuni12BCuni12BDuni12BEuni12C0uni12C1uni12C2uni12C3uni12C4uni12C5uni12C8uni12C9uni12CAuni12CBuni12CCuni12CDuni12CEuni12D0uni12D1uni12D2uni12D3uni12D4uni12D5uni12D6uni12D8uni12D9uni12DAuni12DBuni12DCuni12DDuni12DEuni12DFuni12E0uni12E1uni12E2uni12E3uni12E4uni12E5uni12E6uni12E7uni12E8uni12E9uni12EAuni12EBuni12ECuni12EDuni12EEuni12F0uni12F1uni12F2uni12F3uni12F4uni12F5uni12F6uni12F7uni12F8uni12F9uni12FAuni12FBuni12FCuni12FDuni12FEuni12FFuni1300uni1301uni1302uni1303uni1304uni1305uni1306uni1307uni1308uni1309uni130Auni130Buni130Cuni130Duni130Euni1310uni1312uni1313uni1314uni1315uni1318uni1319uni131Auni131Buni131Cuni131Duni131Euni1320uni1321uni1322uni1323uni1324uni1325uni1326uni1327uni1328uni1329uni132Auni132Buni132Cuni132Duni132Euni132Funi1330uni1331uni1332uni1333uni1334uni1335uni1336uni1337uni1338uni1339uni133Auni133Buni133Cuni133Duni133Euni133Funi1340uni1341uni1342uni1343uni1344uni1345uni1346uni1348uni1349uni134Auni134Buni134Cuni134Duni134Euni134Funi1350uni1351uni1352uni1353uni1354uni1355uni1356uni1357uni1358uni1359uni135Auni1361uni1362uni1363uni1364uni1365uni1366uni1367uni1368uni1369uni136Auni136Buni136Cuni136Duni136Euni136Funi1370uni1371uni1372uni1373uni1374uni1375uni1376uni1377uni1378uni1379uni137Auni137Buni137Cuni1D00uni1D03uni1D05uni1D07uni1D0Buni1D0Cuni1D0Duni1D0Euni1D1Buni1D1Cuni1D20uni1D21uni1D22uni1D29uni1D81uni1D84uni1D85uni1D87uni1D8Duni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFE afii61664afii301uni2010uni2011 figuredash afii00208 underscoredbl quotereverseduni201Funi2023uni2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204B zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni207Auni207Buni207Cuni207F zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferioruni208Auni208Buni208Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9Eurouni20AFuni20B2uni20DDuni2102uni2103 afii61248uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110Ifrakturuni2112 afii61289uni2115 afii61352uni2117 weierstrassuni2119uni211Auni211BRfrakturuni211D prescriptionuni211Funi2120uni2123uni2124uni2126uni2127uni2128uni212Auni212Buni212Cuni212D estimateduni2130uni2131uni2132uni2133alephuni2136uni2137uni2138uni2139onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21ABuni21ACuni21ADuni21AEuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21E0uni21E2 universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni2210uni2213uni2214uni2215uni2216 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2221uni2222uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222F thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2240uni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2259uni225Auni225C equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22B2uni22B3uni22B4uni22B5uni22B6uni22B7uni22B8uni22BAuni22BBuni22BCuni22BDuni22C0uni22C1uni22C2uni22C3uni22C4dotmathuni22C6uni22C7uni22C8uni22CBuni22CCuni22CDuni22CEuni22CFuni22D0uni22D1uni22D2uni22D3uni22D4uni22D5uni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni2300uni2301uni2308uni2309uni230Auni230B revlogicalnotuni231A integraltp integralbtuni2322uni2323 angleleft anglerightuni2347uni2348uni2350uni2357uni235Euni23AEuni2423uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254BSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Dupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockuni2594uni2595 filledboxH22073triagupuni25B6triagdnuni25C0uni25C6circleuni25CCH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7uni25E2uni25E3uni25E4uni25E5uni25E7uni25E8uni25E9uni25EAuni2605uni2606uni260Cuni260Duni260Euni2610uni2611uni2612uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2622uni2623uni2626uni2628uni262Auni262Cuni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubheartdiamonduni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2780uni2781uni2782uni2783uni2784uni2785uni2786uni2787uni2788uni2789uni278Auni278Buni278Cuni278Duni278Euni278Funi2790uni2791uni2792uni2793uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni3001uni3002uni3003uni3005uni3007uni3008uni3009uni300Auni300Buni300Cuni300Duni300Euni300Funi3010uni3011uni3012uni3014uni3015uni3041uni3042uni3043uni3044uni3045uni3046uni3047uni3048uni3049uni304Auni304Buni304Cuni304Duni304Euni304Funi3050uni3051uni3052uni3053uni3054uni3055uni3056uni3057uni3058uni3059uni305Auni305Buni305Cuni305Duni305Euni305Funi3060uni3061uni3062uni3063uni3064uni3065uni3066uni3067uni3068uni3069uni306Auni306Buni306Cuni306Duni306Euni306Funi3070uni3071uni3072uni3073uni3074uni3075uni3076uni3077uni3078uni3079uni307Auni307Buni307Cuni307Duni307Euni307Funi3080uni3081uni3082uni3083uni3084uni3085uni3086uni3087uni3088uni3089uni308Auni308Buni308Cuni308Duni308Euni308Funi3090uni3091uni3092uni3093uni3094uni3099uni309Buni30A1uni30A2uni30A3uni30A4uni30A5uni30A6uni30A7uni30A8uni30A9uni30AAuni30ABuni30ACuni30ADuni30AEuni30AFuni30B0uni30B1uni30B2uni30B3uni30B4uni30B5uni30B6uni30B7uni30B8uni30B9uni30BAuni30BBuni30BCuni30BDuni30BEuni30BFuni30C0uni30C1uni30C2uni30C3uni30C4uni30C5uni30C6uni30C7uni30C8uni30C9uni30CAuni30CBuni30CCuni30CDuni30CEuni30CFuni30D0uni30D1uni30D2uni30D3uni30D4uni30D5uni30D6uni30D7uni30D8uni30D9uni30DAuni30DBuni30DCuni30DDuni30DEuni30DFuni30E0uni30E1uni30E2uni30E3uni30E4uni30E5uni30E6uni30E7uni30E8uni30E9uni30EAuni30EBuni30ECuni30EDuni30EEuni30EFuni30F0uni30F1uni30F2uni30F3uni30F4uni30F5uni30F6uni30F7uni30F8uni30F9uni30FAuni30FBuni30FCuniF639uniF63AuniF63BuniF63CuniF63DuniF63EuniF63FuniF640uniF641uniF6BE commaaccentcopyrightserif registerseriftrademarkserif onefitted arrowvertex arrowhorizex registersans copyrightsans trademarksans parenlefttp parenleftex parenleftbt bracketlefttp bracketleftex bracketleftbt bracelefttp braceleftmid braceleftbtbraceex integralex parenrighttp parenrightex parenrightbtbracketrighttpbracketrightexbracketrightbt bracerighttp bracerightmid bracerightbtffffiffluniFB06 afii57694 afii57695uniFB2CuniFB2DuniFB2EuniFB2FuniFB30uniFB31uniFB32uniFB33uniFB34 afii57723uniFB36uniFB38uniFB39uniFB3AuniFB3BuniFB3CuniFB3EuniFB40uniFB41uniFB43uniFB44uniFB46uniFB47uniFB48uniFB49uniFB4A afii57700uniFB4CuniFB4DuniFB4EuniFB56uniFB57uniFB58uniFB59uniFB7AuniFB7BuniFB7CuniFB7DuniFB8AuniFB8BuniFB92uniFB93uniFB94uniFB95uniFBFCuniFBFDuniFBFEuniFBFFuniFDF2uniFDFCuniFE70uniFE74uniFE76uniFE78uniFE7AuniFE7CuniFE81uniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC5uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEFBuniFEFCuniFFFD uni0937091Fr4xxx1y2y2u1y2u2v2 NameMe-195550 NameMe-195551k1xxnhxxn1xxl3xxlhxxr3xxk1u1k1u2k1r1k1r2k1l1k1k1k1k1u1k1k1u2k1k1r1k1k1r3k1k1r3u1k1k1r3u2k1t1k1t1u1k1t1u2k1t1r3k1t1r3u1k1t1r3u2k1t1nhk1nhu1k1nhu2k1th1k1th1u1k1th1u2k1th1r1k1th1r2k1th1r3 k1th1r3u1 k1th1r3u2k1n1k1n1u1k1n1u2k1m1k1m1u1k1m1u2k1r3k1r3u1k1r3u2k1l3k1l3u1k1l3u2k1shk1shu1k1shu2k1shr1k1shnhk1shnhu1k1shnhu2k1shm1k1shm1u1k1shm1u2k1shm1r1k1s1k1s1u1k1s1u2k1s1r1k1rhrhk1rhrhu1k1rhrhu2k2u1k2u2k2r1k3u1k3u2k3r1k3r2k3k3k3k3u1k3k3u2k3k3r1k3k4k3k4u1k3k4u2k3k4r1k3th3k3th3u1k3th3u2k3th3r1k3th3th4 k3th3th4u1 k3th3th4u2 k3th3th4r1 k3th3th4r3 k3th3th4r3u1 k3th3th4r3u2k3n1k3n1u1k3n1u2k3m1k3m1u1k3m1u2k3r3k3r3u1k3r3u2k3l3k3l3u1k3l3u2k4u1k4u2k4r1k4r2k4n1k4n1u1k4n1u2k4r3k4r3u1k4r3u2ngu1ngu2ngk1ngk1u1ngk1u2ngk1r1ngngngngu1ngngu2ch1u1ch1u2ch1ch1ch1ch1u1ch1ch1u2ch1ch2ch1ch2u1ch1ch2u2ch1ch2r1ch1ch2r3 ch1ch2r3u1 ch1ch2r3u2ch2u1ch2u2ch2r1ch2r3ch2r3u1ch2r3u2ch3u1ch3u2ch3r1ch3r2ch3ch3ch3ch3u1ch3ch3u2ch3ch3r1ch3njch3nju1ch3nju2ch3r3ch3r3u1ch3r3u2ch4u1ch4u2ch4r1ch4r2ch4r3ch4r3u1ch4r3u2nju1nju2njch1njch1u1njch1u2njch1r1njch2njch2u1njch2u2njch2r1njch3njch3u1njch3u2njnjnjnju1njnju2t1u1t1u2t1r1t1r2t1t1t1t1u1t1t1u2t1r3t1r3u1t1r3u2t2u1t2u2t3u1t3u2t3r1t3t3t3t3u1t3t3u2t3t4t3t4u1t3t4u2t3m1t3m1u1t3m1u2t3m1r1t3r3t3r3u1t3r3u2t4u1t4u2t4r1t4r3t4r3u1t4r3u2nhu1nhu2nht1nht1u1nht1u2nht1r3nht1r3u1nht1r3u2nht2nht3nht3u1nht3u2nht3r1nht3r3nht3r3u1nht3r3u2nht4nht4u1nht4u2nht4r1nhnhnhnhu1nhnhu2nhm1nhm1u1nhm1u2th1u1th1u2th1r1th1r2th1th1th1th1u1th1th1u2th1th1r1th1th1r2th1th1r3 th1th1r3u1 th1th1r3u2th1th2th1th2u1th1th2u2th1th2r1th1n1th1p4th1p4u1th1p4u2th1p4r1th1m1th1m1u1th1m1u2th1m1r1th1r3th1r3u1th1r3u2th1l3th1l3u1th1l3u2th1s1th1s1u1th1s1u2th1s1r1th1s1r2th1s1th2 th1s1th2u1 th1s1th2u2 th1s1th2r1th1s1n1 th1s1n1u1 th1s1n1u2th1s1m1 th1s1m1u1 th1s1m1u2 th1s1m1r1th1s1r3 th1s1r3u1 th1s1r3u2th2u1th2u2th2n1th2n1u1th2n1u2th2m1th2m1u1th2m1u2th2m1r1th3u1th3u2th3r1th3r2th3th3th3th3u1th3th3u2th3th3r1th3th3r2th3th4th3th4u1th3th4u2th3th4r1th3th4r2th3th4n1 th3th4n1u1 th3th4n1u2th3th4m1 th3th4m1u1 th3th4m1u2 th3th4m1r1th3th4r3 th3th4r3u1 th3th4r3u2th3r3th3r3u1th3r3u2th4u1th4u2th4r1th4r2th4n1th4n1u1th4n1u2th4m1th4m1u1th4m1u2th4m1r1th4r3th4r3u1th4r3u2n1u1n1u2n1r1n1r2n1th1n1th1u1n1th1u2n1th1r1n1th1r2n1th1r3 n1th1r3u1 n1th1r3u2n1th2n1th2u1n1th2u2n1th2r1n1th2r2n1th3n1th3u1n1th3u2n1th3r1n1th3r3 n1th3r3u1 n1th3r3u2n1th4n1th4u1n1th4u2n1th4r1n1th4r3 n1th4r3u1 n1th4r3u2n1n1n1n1u1n1n1u2n1n1r1n1n1r3n1n1r3u1n1n1r3u2n1m1n1m1u1n1m1u2n1m1r1n1m1r3n1m1r3u1n1m1r3u2n1r3n1r3u1n1r3u2n1rhn1rhu1n1rhu2p1u1p1u2p1r1p1r2p1t1p1t1u1p1t1u2p1th1p1th1u1p1th1u2p1th1r1p1th1r2p1n1p1n1u1p1n1u2p1p1p1p1u1p1p1u2p1p1r1p1p2p1p2u1p1p2u2p1r3p1r3u1p1r3u2p1l3p1l3u1p1l3u2p1s1p1s1u1p1s1u2p1s1r1p1s1r3p1s1r3u1p1s1r3u2p2u1p2u2p2k1p2k1u1p2k1u2p2t1p2t1u1p2t1u2p2th1p2th1u1p2th1u2p2th1r1p2n1p2n1u1p2n1u2p2p1p2p1u1p2p1u2p2m1p2m1u1p2m1u2p2r3p2r3u1p2r3u2p2l3p2l3u1p2l3u2p2s1p2s1u1p2s1u2p2s1r1p2rhrhp2rhrhu1p2rhrhu2p3u1p3u2p3r1p3k3p3k3u1p3k3u2p3k3r1p3ch3p3ch3u1p3ch3u2p3ch3r1p3th3p3th3u1p3th3u2p3th3r1p3th4p3th4u1p3th4u2p3th4r1p3th4r2p3n1p3n1u1p3n1u2p3p3p3p3u1p3p3u2p3p4p3r3p3r3u1p3r3u2p3l3p3l3u1p3l3u2p4u1p4u2p4r1p4r2p4r3p4r3u1p4r3u2m1u1m1u2m1r1m1r2m1n1m1n1u1m1n1u2m1p1m1p1u1m1p1u2m1p1r1m1p1r3m1p1r3u1m1p1r3u2m1m1m1m1u1m1m1u2m1m1r1m1r3m1r3u1m1r3u2m1l3m1l3u1m1l3u2y1u1y1u2y1r1y1k1y1k1u1y1k1u2y1k1r1y1k1k1y1k1k1u1y1k1k1u2y1ch1y1ch1u1y1ch1u2y1th1y1th1u1y1th1u2y1th1r1y1th1th1 y1th1th1u1 y1th1th1u2 y1th1th1r1y1n1y1n1u1y1n1u2y1p1y1p1u1y1p1u2y1p1r1y1m1y1m1u1y1m1u2y1m1r1y1y1y1y1u1y1y1u2r3u1r3u2r3r1l3u1l3u2l3r1l3k1l3k1u1l3k1u2l3k1r1l3k1k1l3k1k1u1l3k1k1u2l3k3l3k3u1l3k3u2l3k3r1l3ch1l3ch1u1l3ch1u2l3th1l3th1u1l3th1u2l3th1r1l3th1th1 l3th1th1u1 l3th1th1u2l3p1l3p1u1l3p1u2l3p1r3l3p1r3u1l3p1r3u2l3p2l3p2u1l3p2u2l3p3l3p3u1l3p3u2l3m1l3m1u1l3m1u2l3l3l3l3u1l3l3u2v1u1v1u2v1r1v1r3v1r3u1v1r3u2v1l3v1l3u1v1l3u2v1v1v1v1u1v1v1u2z1u1z1u2z1r1z1ch1z1ch1u1z1ch1u2z1ch1r1z1ch2z1ch2u1z1ch2u2z1ch2r1z1n1z1n1u1z1n1u2z1m1z1m1u1z1m1u2z1m1r1z1r3z1r3u1z1r3u2z1l3z1l3u1z1l3u2z1z1z1z1u1z1z1u2z1z1r1z1z1r3z1z1r3u1z1z1r3u2shu1shu2shr1shk1shk1u1shk1u2shk1r1shk1k1shk1k1u1shk1k1u2shk1k1r1shk1r3shk1r3u1shk1r3u2sht1sht1u1sht1u2sht1r1sht1r2sht1r3sht1r3u1sht1r3u2sht2sht2u1sht2u2shnhshnhu1shnhu2shp1shp1u1shp1u2shp1r1shp1r3shp1r3u1shp1r3u2shp2shp2u1shp2u2shm1shm1u1shm1u2shm1r3shm1r3u1shm1r3u2s1u1s1u2s1r1s1r2s1k1s1k1u1s1k1u2s1k1r1s1k1k1s1k1k1u1s1k1k1u2s1k1k1r1s1k1r3s1k1r3u1s1k1r3u2s1k2s1k2u1s1k2u2s1t1s1t1u1s1t1u2s1t1r3s1t1r3u1s1t1r3u2s1th1s1th1u1s1th1u2s1th1r1s1th1r2s1th1r3 s1th1r3u1 s1th1r3u2s1th2s1th2u1s1th2u2s1th2r1s1n1s1n1u1s1n1u2s1p1s1p1u1s1p1u2s1p1r1s1p1r3s1p1r3u1s1p1r3u2s1p2s1p2u1s1p2u2s1m1s1m1u1s1m1u2s1m1r1s1r3s1r3u1s1r3u2s1l3s1l3u1s1l3u2s1s1s1s1u1s1s1u2s1s1r1s1s1r3s1s1r3u1s1s1r3u2s1rhrhs1rhrhu1s1rhrhu2s1rhrhr3 s1rhrhr3u1 s1rhrhr3u3h1u1h1u2h1r1h1n1h1n1u1h1n1u2h1m1h1m1u1h1m1u2h1m1r1h1r3h1r3u1h1r3u2h1l3h1l3u1h1l3u2lhu1lhu2lhlhlhlhu1lhlhu2zhu1zhu2zhk1zhk1u1zhk1u2zhk1k1zhk1k1u1zhk1k1u2zhch1zhch1u1zhch1u2zhth1zhth1u1zhth1u2zhth1th1 zhth1th1u1 zhth1th1u2zhn1zhn1u1zhn1u2zhn1n1zhn1n1u1zhn1n1u2zhp1zhp1u1zhp1u2zhm1zhm1u1zhm1u2zhv1zhv1u1zhv1u2zhs1zhs1u1zhs1u2rhu1rhu2rhrhrhrhu1rhrhu2 bn_initekaar bn_initaikaarbn_reph bn_baphala bn_raphala bn_half_ka bn_half_kha bn_half_ga bn_half_gha bn_half_nga bn_half_ca bn_half_cha bn_half_ja bn_half_jha bn_half_nya bn_half_tta bn_half_ttha bn_half_dda bn_half_ddha bn_half_nna bn_half_tha bn_half_da bn_half_dha bn_half_na bn_half_pa bn_half_pha bn_half_ba bn_half_bha bn_half_ma bn_half_ya bn_half_ra bn_half_la bn_half_sha bn_half_ssa bn_half_sa bn_half_ha bn_half_rra bn_half_rha bn_half_yyabn_half_asamirabn_half_asamiba bn_yaphalabn_k_rabn_k_ra1bn_kh_rabn_g_rabn_gh_rabn_c_rabn_ch_rabn_j_rabn_tt_ra bn_tth_rabn_dd_ra bn_ddh_rabn_t_rabn_t_ra1bn_th_rabn_d_rabn_dh_rabn_n_rabn_n_ra1bn_p_rabn_ph_rabn_b_rabn_bh_ra bn_bh_ra1bn_m_rabn_y_rabn_sh_rabn_ss_rabn_s_rabn_s_ra1bn_h_ra bn_asamir_ra bn_asamib_ra bn_k_ss_rabn_k_kabn_k_tta bn_k_tt_rabn_k_tabn_k_ta1 bn_k_t_ba bn_k_t_ba1 bn_k_t_ra bn_k_t_ra1 bn_k_t_ra2bn_k_nabn_k_mabn_k_labn_k_ssa bn_k_ss_nna bn_k_ss_mabn_k_sabn_g_gabn_g_dabn_g_dha bn_g_dh_babn_g_nabn_g_mabn_g_labn_gh_nabn_ng_ka bn_ng_k_ra bn_ng_k_ssa bn_ng_k_ss_ra bn_ng_khabn_ng_ga bn_ng_gha bn_ng_gh_rabn_ng_ma bn_ng_ma1bn_c_cabn_c_cha bn_c_ch_ba bn_c_ch_rabn_c_nyabn_c_nabn_j_ja bn_j_j_babn_j_jhabn_j_nyabn_ny_ca bn_ny_chabn_ny_ja bn_ny_jha bn_tt_tta bn_tt_tt_rabn_tt_mabn_dd_ga bn_dd_ddabn_dd_ma bn_nn_tta bn_nn_tt_ra bn_nn_ttha bn_nn_dda bn_nn_dda1 bn_nn_dd_ra bn_nn_dd_ra1 bn_nn_ddha bn_nn_nnabn_nn_mabn_t_ta bn_t_t_babn_t_thabn_t_nabn_t_mabn_t_ma1bn_t_labn_d_gabn_d_ghabn_d_da bn_d_d_ba bn_d_d_rabn_d_dha bn_d_dh_babn_d_nabn_d_bha bn_d_bh_ra bn_d_bh_ra1bn_d_mabn_dh_nabn_dh_mabn_n_tta bn_n_tt_ra bn_n_tthabn_n_dda bn_n_dd_ra bn_n_ddhabn_n_ta bn_n_t_ba bn_n_t_ra bn_n_t_ra1bn_n_thabn_n_da bn_n_d_ba bn_n_d_rabn_n_dha bn_n_dh_ba bn_n_dh_rabn_n_nabn_n_mabn_n_sabn_p_ttabn_p_tabn_p_nabn_p_pabn_p_mabn_p_labn_p_sa bn_ph_ttabn_ph_labn_b_jabn_b_da bn_b_d_rabn_b_dhabn_b_nabn_b_bhabn_b_labn_bh_labn_m_tabn_m_thabn_m_dabn_m_nabn_m_na1bn_m_pa bn_m_p_ra bn_m_p_labn_m_pha bn_m_ph_rabn_m_bha bn_m_bh_ra bn_m_bh_ra1bn_m_mabn_m_labn_m_la1bn_m_sa bn_m_s_rabn_l_kabn_l_gabn_l_tta bn_l_tt_rabn_l_dda bn_l_dd_rabn_l_tabn_l_dabn_l_dhabn_l_pabn_l_pha bn_l_ph_rabn_l_mabn_l_labn_sh_tabn_sh_ca bn_sh_chabn_sh_nabn_sh_mabn_sh_labn_ss_ka bn_ss_k_ra bn_ss_tta bn_ss_tt_ra bn_ss_ttha bn_ss_nnabn_ss_pa bn_ss_p_ra bn_ss_pha bn_ss_ph_rabn_ss_mabn_s_ka bn_s_k_rabn_s_khabn_s_tta bn_s_tt_rabn_s_ta bn_s_t_ba bn_s_t_ra bn_s_t_ra1bn_s_thabn_s_nabn_s_pa bn_s_p_ra bn_s_p_labn_s_pha bn_s_ph_rabn_s_mabn_s_labn_s_la1bn_h_nnabn_h_nabn_h_mabn_h_labn_h_la1bn_rr_gabn_k_babn_g_babn_gh_babn_c_babn_ch_babn_j_babn_tt_babn_dd_babn_nn_babn_t_babn_th_babn_d_babn_dh_babn_n_babn_p_babn_b_babn_bh_babn_m_ba bn_m_b_rabn_l_babn_sh_babn_s_babn_h_babn_h_ba1 bn_kh_r_ukaarbn_kh_r_uukaar bn_g_ukaar bn_g_r_ukaar bn_g_r_uukaar bn_g_l_ukaar bn_g_l_uukaar bn_j_r_ukaar bn_j_r_uukaar bn_t_r_ukaar bn_t_r_uukaar bn_th_r_ukaarbn_th_r_uukaar bn_d_ukaar bn_d_r_ukaar bn_d_r_uukaar bn_dh_r_ukaarbn_dh_r_uukaar bn_n_t_ukaarbn_n_d_r_ukaarbn_n_d_r_uukaar bn_p_r_ukaar bn_p_r_uukaar bn_p_l_ukaar bn_p_l_uukaar bn_b_r_ukaar bn_b_r_uukaar bn_b_l_ukaar bn_b_l_uukaar bn_bh_r_ukaarbn_bh_r_uukaarbn_m_p_r_ukaarbn_m_p_r_uukaar bn_m_r_ukaar bn_m_r_uukaar bn_r_ukaar bn_r_uukaar bn_l_g_ukaar bn_sh_ukaar bn_sh_r_ukaarbn_sh_r_uukaar bn_sh_l_ukaarbn_sh_l_uukaarbn_ss_p_r_ukaarbn_ss_p_r_uukaar bn_s_t_ukaar bn_s_r_ukaar bn_s_r_uukaar bn_s_l_ukaar bn_s_l_uukaarbn_s_p_r_ukaarbn_s_p_r_uukaarbn_s_p_l_ukaarbn_s_p_l_uukaar bn_h_ukaar bn_h_rikaarbn_asamir_ukaarbn_asamir_uukaarbn_asamib_ukaarbn_asamib_uukaarbn_asamib_r_ukaarbn_asamib_r_uukaarbn_d_yabn_n_yabn_sh_yabn_ss_yabn_s_yabn_h_ya bn_k_hasanta bn_kh_hasanta bn_g_hasanta bn_gh_hasanta bn_ng_hasanta bn_c_hasanta bn_ch_hasanta bn_j_hasanta bn_jh_hasanta bn_ny_hasanta bn_tt_hasantabn_tth_hasanta bn_dd_hasantabn_ddh_hasanta bn_nn_hasanta bn_t_hasanta bn_th_hasanta bn_d_hasanta bn_dh_hasanta bn_n_hasanta bn_p_hasanta bn_ph_hasanta bn_b_hasanta bn_bh_hasanta bn_m_hasanta bn_y_hasanta bn_r_hasanta bn_l_hasanta bn_sh_hasanta bn_ss_hasanta bn_s_hasanta bn_h_hasanta bn_rr_hasanta bn_rh_hasanta bn_yy_hasantabn_asamir_hasantabn_asamib_hasanta bn_one_two bn_one_three bn_one_four bn_two_three bn_three_four bn_ukaar1 bn_ukaar2 bn_uukaar1 bn_uukaar2 bn_rikaar1 bn_post_ka bn_below_tabn_below_t_ukaar bn_below_t_ra bn_below_da bn_below_dha bn_above_na bn_below_na1 bn_below_na bn_below_ba1 bn_below_ba bn_post_ba bn_maphala bn_maphala1 bn_raphala1 bn_raphala2 bn_raphala3 bn_below_la bn_below_la1 bn_above_la bn_pre_ssa1 bn_pre_sa1 bn_below_tha bn_glyph571 bn_glyph572 bn_glyph573 bn_glyph574 bn_glyph575 bn_glyph576 bn_yaphala1 bn_glyph578bn_above_na.001 taml_v_i_2 taml_v_ii_2TamlKA_Taml_pul.halfTamlNGA_Taml_pul.halfTamlCA_Taml_pul.halfTamlNYA_Taml_pul.halfTamlTTA_Taml_pul.halfTamlNNA_Taml_pul.halfTamlTA_Taml_pul.halfTamlNA_Taml_pul.halfTamlPA_Taml_pul.halfTamlMA_Taml_pul.halfTamlYA_Taml_pul.halfTamlRA_Taml_pul.halfTamlLA_Taml_pul.halfTamlVA_Taml_pul.halfTamlLLLA_Taml_pul.halfTamlLLA_Taml_pul.halfTamlRRA_Taml_pul.halfTamlNNNA_Taml_pul.halfTamlTTA_Taml_v_I.abvsTamlTTA_Taml_v_II.abvsTamlKA_Taml_v_U.pstsTamlNGA_Taml_v_U.pstsTamlCA_Taml_v_U.pstsTamlNYA_Taml_v_U.pstsTamlTTA_Taml_v_U.pstsTamlNNA_Taml_v_U.pstsTamlTA_Taml_v_U.pstsTamlNA_Taml_v_U.pstsTamlPA_Taml_v_U.pstsTamlMA_Taml_v_U.pstsTamlYA_Taml_v_U.pstsTamlRA_Taml_v_U.pstsTamlLA_Taml_v_U.pstsTamlVA_Taml_v_U.pstsTamlLLLA_Taml_v_U.pstsTamlLLA_Taml_v_U.pstsTamlRRA_Taml_v_U.pstsTamlNNNA_Taml_v_U.pstsTamlKA_Taml_v_UU.pstsTamlNGA_Taml_v_UU.pstsTamlCA_Taml_v_UU.pstsTamlNYA_Taml_v_UU.pstsTamlTTA_Taml_v_UU.pstsTamlNNA_Taml_v_UU.pstsTamlTA_Taml_v_UU.pstsTamlNA_Taml_v_UU.pstsTamlPA_Taml_v_UU.pstsTamlMA_Taml_v_UU.pstsTamlYA_Taml_v_UU.pstsTamlRA_Taml_v_UU.pstsTamlLA_Taml_v_UU.pstsTamlVA_Taml_v_UU.pstsTamlLLLA_Taml_v_UU.pstsTamlLLA_Taml_v_UU.pstsTamlRRA_Taml_v_UU.pstsTamlNNNA_Taml_v_UU.psts*TamlSA_Taml_pul.half_TamlRA_Taml_v_II.pstsTamlCA_TamlSSATamlJA_Taml_pul.halfTamlSSA_Taml_pul.halfTamlSA_Taml_pul.halfTamlHA_Taml_pul.halfTamlCA_TamlSSA.half taml_v_i_3 taml_v_i_4ÿÿ &Yóôõöjk€¬­­®NOOP A B B C    úû2334–—˜™™š ¡¢£×ØÙÚ  !!"'(())**++,-.7889CDDEEFFGJKKL^__``aabijjkrsstuvvw‚ƒƒ„ˆ‰‰Šš››œ¢££¤ª««¬­®®¯×ØØÙáââãæççèòóóôúûûüÿno•–ÎÏÏÐÔÕÖÿü· žÐDFLT&arab4bengBlatnbmlymrtaml‚ÿÿÿÿÿÿ  ÿÿÿÿ ÿÿ aalt˜abvsžakhn¤akhn¬blwf²blws¸dlig¾fracÄfracÊhalfÐhalfÖhalnÜhalnâhalnèinitîligaôligaúligaprespstf pstspstsrlig rphf&vatu,     8@HPX`hpx€ˆ˜ ¨°¸ÀÈÐØàèðøØÞ’6Ü:'4'¨'Æ)Ê'ê+ +0*Â,-’3\7š9x7ª7Ö˜>‡ˆšÏæ1N>! BVD3ˆˆ’N0 $ÅQ0Q;I¬SÕQ<!<%º%P\0ÜB¦6rJübt " ^ ˜ nÀTÌ\æVš¬Pjˆ‚¶bâH!v% œ[Y8r€Žœª¸ÆÔâðþ &2>JVblv€Š”ž¨²¼ÆÐÚäîø  *4>HRZbjrz‚В𢍮´ãQ<Q<IâQ<Q<HÜQBQ9JÛQBQ9IÚQBQ9HØQBQ/I×QBQ/HÄQ0Q;HºQ+Q;I¹Q+Q;H´Q!Q;I³Q!Q;HÖQBQ/áQ<Q<¸Q+Q;ÙQBQ9ÃQ0Q;²Q!Q;ÍQ;HËQ9IÊQ9HÈQ4IÇQ4HßQCIÞQCHàQCJÂQ0SÁQ0JÀQ0I¿Q0H½Q/IÕQBJÔQBIÓQBH·Q+I¶Q+HÑQ=IÐQ=HÎQ;I±Q!J°Q!I¯Q!HÆQ4ÏQ=µQ+¾Q0ÝQC»Q/ÉQ9ÒQBÌQ;®Q!­«JªI©HæJåIäH#HZl|Š˜¦²¼ÆÐÚäîø  *4>HR\dlt|„Œ”š ¦ýQ2Q3Q;IüQ2Q3Q;HûQ2Q3Q;úQ2Q3JùQ2Q3IøQ2Q3H÷Q2Q3ÿQ4H Q=IQ=HQ;IQ;HQ9IQ9HQ4IöQ2JõQ2IôQ2HòQ$JñQ$IðQ$HîQ#JíQ#IìQ#HþQ4Q9ïQ$Q=óQ2Q;ëQ#êSéJèIçH  *4>FNTZ`Q;IQ;HQ4IQ4HQ;Q4 S J I H  *4>HPX^Q!QJQ%HQ%IQ!IQ!HQ%Q!IH (6BLV`jt|„Š(Q'Q;I'Q'Q;H&Q'Q;%Q'J$Q'I#Q'H!Q&I Q&H"Q'Q&IH"*06.Q;I-Q;H,Q;+J*I)H(2<FPZdlt|‚ˆŽ<Q;I;Q;H9Q*I8Q*H6Q(J5Q(I4Q(H7Q*:Q;3Q(2S1J0I/H$,28>CQ;IBQ;HAQ;@S?J>I=H",6@JT^hr|†Ž–ž¦¬SQ*IRQ*HPQ(IOQ(HMQ'JLQ'IKQ'HIQ&JHQ&IGQ&HNQ(QQ*JQ'FQ&EIDH  *4>FNTZ`]Q;I\Q;HZQ+IYQ+H[Q;XQ+WSVJUITH _I^H",6@JT^hr|„Œ”œ¢¨oQ;InQ;HlQ9JkQ9IjQ9HhQ.IgQ.HeQ-IdQ-HfQ.mQ;iQ9cQ-bJaI`H"*06uQ;ItQ;HsQ;rJqIpH6DR`nz†š¤®¸ÂÌÖàêôþ&.4…Q-Q;I„Q-Q;H}Q+Q;I|Q+Q;HƒQ-Q;{Q+Q;‡Q.HQ9IŽQ9HŒQ/I‚Q-JQ-I€Q-H‹Q/H‰Q.JˆQ.IzQ+IyQ+HŠQ/Q9†Q.Q-~Q,xQ+wIvH2ft‚ž¬ºÈÖäò&2>JT^hr|†š¤®¸ÂÌÖàêôþ$,4<DLT\bhnÁQCQ;IÀQCQ;H¾QCQ9J½QCQ9I¼QCQ9HºQCQ4I¹QCQ4H·QCQ1J¶QCQ1IµQCQ1H›Q0Q;IšQ0Q;H¸QCQ4´QCQ1¿QCQ;»QCQ9™Q0Q;°QCH®Q=I­Q=H«Q;IªQ;H¨Q9J§Q9I¦Q9H¤Q8J£Q8I¢Q8HŸQ1JžQ1IQ1H³QCS²QCJ±QCI˜Q0S—Q0J–Q0I•Q0H©Q;¡Q8 Q4¥Q9¯QC¬Q=œQ1”Q0“S’J‘IH (2<FNV\ÊQ9JÉQ9IÈQ9HÆQ4IÅQ4HÇQ9ÄQ4ÃIÂH8FTbp~Œš¦²¾ÈÒÜæðú"*2:@FLâQ3Q;IáQ3Q;HßQ3Q9JÞQ3Q9IÝQ3Q9HÛQ3Q4IÚQ3Q4HàQ3Q;ÜQ3Q9ÙQ3Q4åQ;IäQ;HØQ3S×Q3JÖQ3IÕQ3HÓQ2SÒQ2JÑQ2IÐQ2HãQ;ÔQ3ÏQ2ÎSÍJÌIËH(2<FPZdlt|‚ˆŽóQ;IòQ;HðQ9JïQ9IîQ9HìQ4IëQ4HñQ;íQ9êQ4éSèJçIæH3hv„’ ®¼ÊØæô $0:DNXblv€Š”ž¨²¼ÆÐÚäîø  (08@HPX`flr Q9Q;IQ9Q;HQ4Q;IQ4Q;HQ3Q;IQ3Q;H Q2Q;I Q2Q;HÿQ0Q;IþQ0Q;HQ4Q; Q2Q;Q3Q;Q9Q;ýQ0Q;Q4H#Q;IQ9JQ9IQ3JQ3I Q3HQ9H"Q;H&Q<IQ2JQ2IQ2HQ1SQ1JQ1IQ1H%Q<HQ4JQ4IüQ0SûQ0JúQ0IùQ0HQ9Q2Q4$Q<!Q; Q3Q1øQ0÷SöJõIôH#HVdpz„Ž˜¢¬¶ÀÊÔÞèòü$.8@HPX`hpx~„ŠIQCQ;IHQCQ;HGQCQ;FQCJEQCIDQCHBQ=IAQ=H?Q;I>Q;H<Q6I;Q6H9Q5J8Q5I7Q5H5Q4I4Q4H2Q0S1Q0J0Q0I/Q0H-Q+I,Q+HCQC@Q=6Q5:Q6.Q0=Q;3Q4+Q+*S)J(I'H"FTbnx‚Œ– ª´¾ÈÒÜæðú",6>FNV^fnv~„kQ<Q<IjQ<Q<HiQ<Q<hQCJgQCIfQCHdQ-IcQ-HaQ;I`Q;H^Q9I]Q9H[Q5IZQ5HXQ4IWQ4HUQ0JTQ0ISQ0HQQ+IPQ+HNQ!IMQ!HeQCYQ5RQ0bQ-\Q9OQ+VQ4_Q;LQ!KIJH!DNXblv€Š”ž¨²¼ÆÐÚäîø &.6>FNV^djŒQ=I‹Q=H‰Q;IˆQ;H…Q7I„Q7H‚Q4IQ4HQ3S~Q3J}Q3I|Q3HzQ2JyQ2IxQ2HvQ(JuQ(ItQ(HrQ#JqQ#IpQ#HwQ2†Q8ŠQ={Q3sQ(€Q4‡Q;ƒQ7oQ#nJmIlH$,28>“Q;I’Q;H‘Q;SJŽIH2@NZdnx‚Œ– ª´¾ÈÒÚâêòú ¡Q5Q;I Q5Q;HŸQ5Q;§Q;H¥Q9J¤Q9I£Q9H«Q=IªQ=H¨Q;IžQ5JQ5IœQ5HšQ4I™Q4H¢Q9›Q5¦Q;©Q=˜Q4—S–J•I”H#HVdr€Žš¦°ºÄÎØâìö (2<FPZbjrz‚Š’˜žÀQ0Q0J¿Q0Q0I¾Q0Q0HµQ!Q!I´Q!Q!H½Q0Q0³Q!Q!ÅQ5HÃQ4IÂQ4HÎQ:IÍQ:HËQ9JÊQ9I¼Q0J»Q0IºQ0H¸Q&I·Q&HÉQ9HÇQ5JÆQ5I²Q!J±Q!I°Q!HÈQ9ÌQ:¹Q0ÁQ4ÄQ5¶Q&¯Q!®J­I¬HÑJÐIÏHÖQ<HÔIÓH*Vdr€Žœª¶ÂÎØâìö (2<FPZdnx‚Œ– ¨°¸ÀÈÐØàèîôïQ5Q;IîQ5Q;HéQ0Q0IèQ0Q0HÛQ!Q!IÚQ!Q!HíQ5Q;çQ0Q0ÙQ!Q!úQ=HøQ9IìQ5IëQ5H÷Q9HõQ7IôQ7HæQ0JåQ0IäQ0HâQ&IáQ&HßQ#JÞQ#IÝQ#HòQ6IñQ6HûQ=IØQ!J×Q!IÖQ!HùQ=ÜQ#ãQ0öQ9ðQ6àQ&óQ7êQ5ÕQ!ÔJÓIÒH  (.¯Q>I®Q>H­Q>¬I«H#HVdr€Žœ¨´ÀÊÔÞèòü$.8BLV`hpx€ˆ˜ ¦ÆQ4Q4IÅQ4Q4HÀQ0Q0I¿Q0Q0H·Q!Q!I¶Q!Q!HÄQ4Q4¾Q0Q0µQ!Q!ÑQCHÏQ@IÃQ4IÂQ4HÎQ@HÌQ9IËQ9H½Q0I¼Q0HºQ&I¹Q&HÉQ5IÈQ5HÒQCI´Q!I³Q!HÍQ@¸Q&ÇQ5ÊQ9ÁQ4»Q0ÐQC²Q!±I°H $.8BLV^fntzQ@IQ@HQ=IQ=HQ;IQ;HQ@Q=ÿQ;þJýIüH@N\hr|†š¤®¸ÂÌÖàêôþ$,4<DLTZ`&QAQ;I%QAQ;H$QAQ;#QAJ"QAI!QAHQ=IQ=HQ;IQ;HQ9JQ9IQ9HQ4IQ4HQ'JQ'IQ'HQ&J Q&I Q&HQ9 QAQ'Q=Q4Q; Q& J IH,Zhv„’ ®¼ÊØæô $0:DNXblv€Š”ž¨²¼ÆÐÚäìôü "(RQ9Q;IQQ9Q;HIQ5Q;IHQ5Q;H<Q+Q;I;Q+Q;H4Q!Q;I3Q!Q;H1Q!Q!J0Q!Q!I/Q!Q!H2Q!Q;:Q+Q;PQ9Q;GQ5Q;.Q!Q!>Q,HKQ6HOQ9INQ9H9Q+S8Q+J7Q+I6Q+HLQ6IFQ5IEQ5IDQ5HBQ/IAQ/H?Q,I-Q!J,Q!I+Q!H@Q/5Q+CQ5MQ9=Q,JQ6*Q!)J(I'HH’¤¶ÆÔâðþ (6DR`n|ˆ” ¬¸ÄÐÜèòü$.8BLV`jt~ˆ’œ¦°ºÄÎØâìö &.6>FNV^fnv~„ŠšQ<Q<Q;I™Q<Q<Q;H˜Q<Q<Q;”QCQ;I“QCQ;H€Q5Q;IQ5Q;HrQ0Q;IqQ0Q;HjQ+Q;IiQ+Q;HaQ!Q;I`Q!Q;H^Q!Q!J]Q!Q!I\Q!Q!H—Q<QIhQ+Q;~Q5Q;–Q<QH_Q!Q;’QCQ;pQ0Q;•Q<Q<[Q!Q!|Q5I{Q5HyQ4IxQ4HvQ1JuQ1ItQ1HQ=IŒQ=HŠQ;IoQ0SnQ0JmQ0IlQ0H‰Q;H‡Q9J†Q9IgQ+IfQ+HdQ"IcQ"H…Q9HƒQ6I‚Q6H‘QCJQCIQCH}Q5JZQ!JYQ!IXQ!HbQ"ˆQ;kQ0sQ1zQ5„Q9ŽQCwQ4eQ+‹Q=Q6WQ!VSUJTISH",6@JT^hr|„Œ”œ¢¨ªQ=I©Q=H§Q;I¦Q;H¤Q9J£Q9I¢Q9H Q4IŸQ4H¡Q9¥Q;¨Q=žQ4JœI›HYY!DnHR\ô- "(ÿIOþILýOüLûIõMW ÿOþL,ILVû ÚNÚN;b*  ÛNÜNÜN7;bÂ%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ÝNÞNßNàNáNâNãNäNåNæNçNèNéNêNëNONìNíNîNïNðNñNòNóNôNõNöN÷NøNùNúNûNüNýNþNÿNN!@QS bc#2<FPZdnx‚Œ– ª´¾ÈÒÜæðú–å—å˜åÐå™åšå›åœåå§åžåŸå å¡å¦å¢å¥å¤å£åÑåÒåÓåÄÙD ,8l\k[jZm[n\YZ[N:ædz¦Ð"*2:BJ  ±   ±   ±   ±   ±   ±   ±  "  ±   ±   ± V>HR\fpz„Ž˜¢¬¶ÀÊÔÞèòü$.8BLÜÜÜÜÜÜ Ü Ü Ü Ü ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Ü"Ü#Ü!$&(+.0: =@cc11š:d®àê,NhФ¾BTÖ"T^ØJ|ÖXz„ $k<i9h4g1e0  &,28>D4?0</9.4+'0& %+$! &,;<:99473625#<4$*06<E9C$B#A"@#?1>=! L4JH'G&P*O)M( T)S(R'Q&W9V U+Z9Y-X#$*06<d9c/b.` ^-],\ [+$*06<w9ut8q3pn2m$l# y9x4"(.4:@FLRX^djpv|?Œ9‹4Šˆ3‡…2„1‚€0.~ }-|,{ z+"(.4”?“<’9‘540Ž+ –<•+ &,<œ8š3™˜2—(ž< &,28>DJPV\bhnt°¯?­<¬9ª©8¨§6¦“¥¤5¢4¡2 1Ÿ0$*06<BHNTZ`fl¾<½9¼»6º5¹3¸2·0¶ µ-´ ³+²#±! &,Ä<Ã9Â4Á'À&¿0 $*06<BHNTÏ9ÎÍ6ÌË5Ê/É,È Ç+ÆÅ!"(.4:@FLRX^djpv|á<à9ßÞ6Ý“ÜÛ5Ú4Ù1×Õ0Ô Ó+Ò"ÑÐ! æ<å9ä4ã/è#3N92N/OÝßàáâäæçéëíîïðñòóô÷øùúûü1Î:z„– ª´¾ÈÒÜæø  *4FPbl†˜ª¼Îàò(:L^p‚”¦°ÂÌÖàêô"4FXbt†˜ª¼éÛ FêÛëÛìÛíÛîÛïÛðÛñÛòÛ FôÛõÛöÛ÷ÛøÛùÛúÛ %G$FüÛ 'FýÛþÛ8H7FÿÛ :G9F <G;F GF GF  GF  G F  G F GF GF GF GF GF #G"F )G(F 0G/F >G=F)Û GFIÛNÛfÛoÛrÛ FÛ†Û GF GF GF !G F&F +G*F -G,F .FÖÛ 4G3F 6G5F 2G1F:!#$&'(+-/02345789;<=?@bc "';HMenq€…‡“¥²ÄÌÕÜÝá ©Ü¨ÛÉ.  Ÿ:Iž:H @:Q|,>Pbt†˜ª¼Îàò(:L^p ¼ÞªÝ ½Þ«Ý ¾Þ¬Ý ¿Þ­Ý ÀÞ®Ý ÁÞ¯Ý ÂÞ°Ý ÃÞ±Ý ÍÞ»Ý ÄÞ²Ý ÅÞ³Ý ÆÞ´Ý ÇÞµÝ ÌÞºÝ ÈÞ¶Ý ËÞ¹Ý ÊÞ¸Ý ÉÞ·ÝÎÑÜÄÆÈÖÒÒ›[\\Â%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN[N\N]N^N_N`NaNbNcNdNeNfNgNhNiN!@QS bc#2<FPZdnx‚Œ– ª´¾ÈÒÜæðú–å—å˜åÐå™åšå›åœåå§åžåŸå å¡å¦å¢å¥å¤å£åÑåÒåÓåÄÙ^(2<JT£Q¤Q¥Q¨Q×Q<I¦Q§Q!/4;<=> ŽJK r˜DFLT&arab2bengÐúŒ–¬ºÄÞ,V`j°ºÌæ    Ò Ü   ‚ ì  p ž  > l Þ T Z h ~ Œ š ´ º À Þ ä"0>LZhv„Š ª´ÆÌ$ÿýÿéÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯DÿúEÿìFÿãGÿäHÿåJÿìRÿØTÿëWÿìXÿäYÿ¯Zÿ·\ÿ­mÿÀ‰ÿǘÿÄ›ÿœÿÂÿžÿ©ÿã ‘ÿŒ •ÿ¥ ¦ÿ¶$ÿÍ2ÿè9ÿ¿:ÿÅ<ÿ¼ƒÿÍ„ÿÍ…ÿ͆ÿ͇ÿ͈ÿÔ”ÿè•ÿè–ÿè˜ÿèšÿéÿî $ÿé+ÿþ.ÿö2ÿôƒÿé†ÿé‡ÿéˆÿñ•ÿô˜ÿô $ÿ½-ÿ×7ÿö9ÿ¹:ÿÇ;ÿÀ<ÿ¶‚ÿ½ƒÿ½„ÿ½…ÿ½†ÿ½‡ÿ½ÿÍÿÆ$ÿ¹-ÿó2ÿöDÿÞHÿíLÿóMÿìRÿëUÿöXÿõ‚ÿ¹ƒÿ¹„ÿ¹…ÿ¹†ÿ¹‡ÿ¹˜ÿö£ÿÞ¦ÿö§ÿÞ¨ÿÜ«ÿíµÿë¸ÿëºÿëÿë $ÿæ7ÿë9ÿé:ÿî<ÿæ‚ÿæƒÿæ„ÿæ…ÿæ†ÿæ‡ÿæˆÿí$ÿˆÿˇÿˈÿÒÿÁ&ÿÕ*ÿÏ2ÿÍ6DHÿíRÿáXÿí\ÿª•ÿ͘ÿͦ§µÿá¸ÿá¾ÿíÿÔ&2ÿý67ÿ·8ÿæ9ÿ:ÿ§<ÿœXÿö\ÿȈ”ÿý•ÿý–ÿý—ÿý˜ÿýžÿæ¾ÿö ‘ÿƒ •ÿœÿòÿë$ÿä&ÿð*ÿí2ÿìDÿåHÿïRÿëXÿçƒÿä†ÿä‡ÿäˆÿë‰ÿð•ÿì˜ÿì£ÿå¦ÿå§ÿå¨ÿå«ÿïµÿë¸ÿëºÿì¾ÿç $ÿÆ7ÿ÷9ÿ»:ÿÊ;ÿÉ<ÿ¸ƒÿƆÿƇÿƈÿÎÿ¢ÿÛÿ›$ÿ¦-ÿÌDÿïHÿéRÿçƒÿ¦†ÿ¦‡ÿ¦ˆÿ¥£ÿï¦ÿï§ÿï¨ÿî«ÿéµÿç¸ÿçºÿçÿçÿÌ&ÿ×*ÿÔ2ÿÓ7ÿÞ8ÿÈ9ÿ·:ÿ½<ÿ´DÿþHÿéRÿÜXÿè\ÿÛ‰ÿוÿÓ˜ÿÓžÿÉ£ÿþ¦ÿþ§ÿþ¨ÿû«ÿéµÿܸÿܼÿè¾ÿèÿÙÿá $ÿÛ7ÿí9ÿå:ÿë<ÿâWÿìƒÿÛ†ÿÛ‡ÿÛˆÿâ-ÿ¶ÿ·ÿ®ÿ©ÿ©$ÿË&ÿø*ÿõ-ÿî2ÿö6ÿö9:< Dÿ³Fÿ©HÿªJÿ¥LÿîMÿçRÿ¦UÿÎVÿ·Xÿ£Yÿ—Zÿ–\ÿšmÿŽ‚ÿ˃ÿË„ÿË…ÿˆÿˇÿˈÿÓ”ÿö•ÿö–ÿö—ÿö˜ÿöšÿö¨ÿ°ºÿ§ÿü ¦ÿƒ ÿáÿÛ$ÿ¿PÿßQÿáSÿäUÿåƒÿ¿„ÿ¿…ÿ¿†ÿ¿‡ÿ¿ˆÿÆ$ÿ—ÿ»ÿÿ¦ÿ§$ÿ„&ÿÁ*ÿ¾2ÿ½6ÿÑ7 Dÿ¨Hÿ«Jÿ›LÿìRÿ§UÿÈXÿÍ\ÿÊmÿ“‚ÿ„ƒÿ„„ÿ„…ÿ„†ÿ„‡ÿ„ˆÿ˜”ÿ½•ÿ½–ÿ½—ÿ½˜ÿ½šÿ¿¨ÿ§ºÿ¨ ¦ÿ‰$ÿ§ÿÈÿ ÿ¯ÿ¯$ÿ&ÿË*ÿÈ2ÿÈ6ÿ×7Dÿ°Hÿ¸Jÿ¥LÿóRÿ´UÿÑXÿÕ\ÿÓmÿŸ‚ÿƒÿ„ÿ…ÿ†ÿ‡ÿˆÿž”ÿÈ•ÿÈ–ÿÈ—ÿȘÿÈšÿɨÿ¯ºÿµ ¦ÿ• ÿÊ&ÿÌ2ÿÃ4ÿÃDÿùHÿäRÿ×Xÿã\ÿ ˜ÿÃ$ÿ ÿžÿ™ÿ“ÿ”$ÿ¶&ÿ¼*ÿ¹2ÿ»6ÿÔ7 DÿHÿ™JÿLÿïRÿ•Sÿ¨Xÿ²Yÿªmÿy‚ÿ¶ƒÿ¶„ÿ¶…ÿ¶†ÿ¶‡ÿ¶ˆÿ½”ÿ»•ÿ»–ÿ»—ÿ»˜ÿ»šÿ»¨ÿšºÿ– ¦ÿoYÿÐ\ÿÎMÿæYÿâZÿá\ÿà ‘ÿØYÿãZÿâ\ÿàKÿñNÿíWÿöYÿåZÿä[ÿÝ\ÿâ ‘ÿâDÿçHÿÞILMO,RÿÚVÿëW £ÿç¦ §ÿú¨ÿç«ÿÞµÿÚ¸ÿÿºÿÛÿÜ ‘ DÿïHÿçOÿùU ¦ÿï§ÿï¨ÿî«ÿçµÿæ¸ÿæ\ÿâ ‘ÿÚ7ÿäMÿÜÿ¿ÿþDHÿíJÿôRÿàVX£¦§¨ÿÿ«ÿíµÿà¸ÿà¾Yÿä\ÿçSÿ÷YÿâZÿá\ÿá7ÿÉSÿóYÿâZÿá\ÿá ‘ÿÙ7ÿ¥Wÿ÷YÿÜZÿÜ[ÿÜ\ÿ× ‘ÿÞWÿú\ÿäFÿùXÿô.ÿ×ÿÒÿÐÿùÿùDÿÿFÿøGÿöHÿúIJÿñKÿúLMNÿöOÿîPQRÿøSTÿöUWXYZ[\]¢ÿÿ£ÿÿ¤ÿÿ¦ÿÿ§ÿÿ¨ÿý©ÿøªÿú«ÿú¬ÿú´ÿøµÿø¶ÿø¸ÿøºÿùÿù ‘ÿíWÿñ ‘ÿÚ ÿøÿø6D K Rÿø£ ¦ § ¨ µÿø¸ÿø ‘ÿã ‘ÿÜÿ»ÿäÿ´ÿìÿìDÿèFÿÛHÿÜJÿ×OÿáRÿÚVÿë¢ÿè£ÿè¤ÿè¥ÿè¦ÿè§ÿè¨ÿèªÿÜ«ÿܬÿÜ´ÿÚµÿÚ¸ÿÚºÿÚÿÀÿèÿ¹ÿéÿéDÿåFÿßHÿáJÿÕOÿßRÿÝVÿé¢ÿå£ÿå¤ÿå¥ÿå¦ÿå§ÿå¨ÿåªÿá«ÿá¬ÿá´ÿݵÿݸÿݺÿÞDÿõFÿÞHÿàRÿÓTÿæ«ÿàÿ¾ÿåÿ·ÿéÿéDÿàFÿÛHÿÝJÿÐOÿàRÿÙVÿæ¢ÿà£ÿà¤ÿà¥ÿà¦ÿà§ÿà¨ÿáªÿÝ«ÿݬÿÝ´ÿÙµÿÙ¸ÿÙºÿÚ ÿýÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯ÿýÿéÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯DÿúEÿìFÿãGÿäHÿåJÿìRÿØTÿëWÿìXÿäYÿ¯Zÿ·\ÿ­mÿÀ ‘ÿŒ ¦ÿ¶ ÿýÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯ ÿýÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯ÿýÿéÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯DÿúEÿìFÿãGÿäJÿìRÿØTÿëWÿìXÿäYÿ¯Zÿ·\ÿ­mÿÀ ‘ÿŒ •ÿ¥ ¦ÿ¶ÿýÿéÿö&ÿÍ*ÿÇ2ÿÄ4ÿÄ7ÿÊ8ÿÂ9ÿ}:ÿ<ÿ¯DÿúEÿìFÿãGÿäHÿåJÿìRÿØTÿëWÿìXÿäYÿ¯Zÿ·\ÿ­mÿÀ ‘ÿŒ •ÿ¥ ¦ÿ¶$ÿå7ÿ÷9ÿ»<ÿ¸$ÿÆ7ÿ÷9ÿ»:ÿÊ<ÿ¸7ÿ÷9ÿ»<ÿ¸7ÿ÷9ÿ»<ÿ¸$ÿÆ7ÿ÷9ÿ»:ÿÊ;ÿÉ<ÿ¸$ÿÆ$ÿ¿ÿáÿÛ$ÿ¿PÿßQÿáSÿäUÿå$ÿ¿ÿáÿÛ$ÿ¿EPÿßQÿáSÿäUÿåYÿâZÿá\ÿàYÿâZÿá\ÿàYÿâZÿá\ÿàYÿâZÿá\ÿàYÿåZÿä\ÿâYÿåZÿä\ÿâYÿåZÿä\ÿâYÿÜZÿÜ\ÿ×YÿÜZÿÜ\ÿ×Wÿ÷Wÿ÷YÿÜZÿÜ[ÿÜ\ÿ×$ÿé2ÿôKÿñNÿí$ÿÛ7ÿí9ÿåWÿìWÿñYÿÐ\ÿÎ$')*-/13 5= DFHLN\‚‡,‰‰2”˜3šž8¢£=¦¨?«¬B´¶D¸¸GÎÏH"#J??LòŽ 0bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|cžcž6ž§žj¢|žcžâÊôÌìÊ„¦ùÈìÊúÊQÊùÈ}È-¢cžôÌ+ž¢§žj¢j¢ùÈõž|žìÊæÍÜÈÿÈÿÈÞÌæÍæÍÚÍÝÍŽÍùÈìÊÁ¤¤ô›Á¤¤š¬¿0$&(,28<DFHLRX\¨ºHIJPRYabchqrŸïðñó÷øúû (346@A*Jk­­Z`flrx~„Š–œ¢¨®´ºÀÆÌÒØÿZÈÿXÈÿ\Ìÿ\Ìÿ\ÌÿÌÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ\Ìÿ¹ÌÁ]-IÁ‘ÄÁ‘Ärgl/configure.ac0000644000176000001440000001554712262005310013357 0ustar ripleyusers## ## This file is part of RGL ## ## It uses some R-specific macros, so process it in two steps: ## 1. Copy m4/R.m4 from the R source directory to rgl/aclocal.m4 ## 2. Process configure.ac with autoconf to produce a configure script. ## NB: the files in src/build/autoconf may need updating for a new ## version of autoconf ## ## ## $Id: configure.ac 982 2013-10-06 16:24:58Z murdoch $ ## AC_PREREQ(2.50) ## ---[ VERSION ]------------------------------------------------------------- AC_INIT() AC_CONFIG_AUX_DIR(src/build/autoconf) ## pick up compiler as will be used by R CMD INSTALL/SHLIB if test -n "${R_HOME}"; then CC=`${R_HOME}/bin/R CMD config CC` CPP=`${R_HOME}/bin/R CMD config CPP` CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS` CXX=`${R_HOME}/bin/R CMD config CXX` CXXFLAGS=`${R_HOME}/bin/R CMD config CXXFLAGS` fi AC_PROG_CPP AC_PROG_CC R_GCC4_VISIBILITY AC_ARG_ENABLE([cocoa], [ --disable-cocoa use X11 instead of Mac OS X native Cocoa UI] ) if test `uname` = "Darwin" ; then darwin="yes" ## we want the *build* cputype and not the host one. cmd=`echo $CC $CFLAGS | grep -E 'x86_64|ppc64|-m64'` if test -n "$cmd"; then have_64bit="yes" else have_64bit="no" fi else darwin="no" fi ## --- LibPNG ---------------------------------------------------------------- AC_ARG_ENABLE([libpng], [ --disable-libpng compile without PNG image support] ) AC_ARG_ENABLE([libpng-config], [ --disable-libpng-config disable libpng-config test and configuration] ) AC_ARG_ENABLE([libpng-dynamic], [ --disable-libpng-dynamic disable dynamic libpng linkage, force static version linkage (only with --enable-libpng-config)] ) if test "x$enable_libpng" != "xno"; then if test "x$enable_libpng_config" != "xno"; then AC_CHECK_PROG([HAVE_LIBPNG_CONFIG],[libpng-config],[yes],[no]) fi if test "x$HAVE_LIBPNG_CONFIG" = "xyes" ; then AC_MSG_NOTICE([using libpng-config]) CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H `libpng-config --I_opts`" if test "x$enable_libpng_dynamic" != "xno"; then AC_MSG_NOTICE([using libpng dynamic linkage]) LIBS="${LIBS} `libpng-config --ldflags`" else AC_MSG_NOTICE([using libpng static linkage]) LIBS="${LIBS} `libpng-config --static --L_opts`/libpng.a" fi else AC_MSG_CHECKING([libpng]) save_LIBS="${LIBS}" save_CPPFLAGS="${CPPFLAGS}" AC_CHECK_HEADERS(png.h) AC_CHECK_LIB(png, png_read_update_info) if test "${ac_cv_header_png_h}"; then if test "${ac_cv_lib_png_png_read_update_info}"; then CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H" LIBS="${LIBS} -lpng" AC_MSG_NOTICE([libpng header and lib found]) if test "x$enable_libpng_dynamic" != "xno"; then AC_MSG_NOTICE([using libpng dynamic linkage]) else AC_MSG_NOTICE([using libpng static linkage]) fi else LIBS=${save_LIBS} CPPFLAGS=${save_CPPFLAGS} AC_MSG_NOTICE([libpng header and lib not found]) fi fi fi fi ## --- Darwin ---------------------------------------------------------------- if test x$darwin == "xyes" -a "x$enable_cocoa" != "xno" ; then AGLCPPFLAGS="${CPPFLAGS} -DRGL_USE_COCOA" AGLLIBS="${LIBS} -framework Cocoa" BUILD_AGL_TRUE="" else BUILD_AGL_TRUE="#" fi # ---[ X11 ]------------------------------------------------------------------ AC_PATH_X if test x$no_x = xyes ; then AC_MSG_ERROR([X11 not found but required, configure aborted.]) fi if test -n "${x_includes}"; then CPPFLAGS="${CPPFLAGS} -I${x_includes}" fi if test -n "${x_libraries}"; then LIBS="${LIBS} -L${x_libraries} -lX11" else LIBS="${LIBS} -lX11" fi if test $darwin = yes; then CPPFLAGS="${CPPFLAGS} -DDarwin" # Apple's OpenGL is different from the X11 one - it must be loaded *before* X11 if test -e /System/Library/Frameworks/OpenGL.framework ; then CPPFLAGS="-I/System/Library/Frameworks/OpenGL.framework/Headers ${CPPFLAGS} -DNO_GL_PREFIX" # OSX 10.5 messes up X11; this works around it LIBS="-framework OpenGL -dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib ${LIBS}" fi # some X11 installations on OSX 10.5 feature -rpath which doesn't work when used in # conjunction with 10.4u SDK (and is redundant anyway since OS X always uses full paths) if test rpath`echo "${LIBS}" | sed -n 's/.*-Wl,-rpath,.*/Yes/p' 2>/dev/null` = rpathYes; then LIBS=`echo "${LIBS}" | sed 's:-Wl,-rpath,[[^ ]]*::'` AGLLIBS=`echo "${AGLLIBS}" | sed 's:-Wl,-rpath,[[^ ]]*::'` fi # X11 must come *after* the OpenGL stuff CPPFLAGS="${CPPFLAGS} -I/usr/X11R6/include" fi ## --- OpenGL ---------------------------------------------------------------- AC_ARG_WITH(gl-includes, [ --with-gl-includes=DIR specify location of OpenGL headers], [CPPFLAGS="${CPPFLAGS} -I${withval}"] ) if test $darwin != yes; then AC_CHECK_HEADERS(GL/gl.h GL/glu.h) if test "x$ac_cv_header_GL_gl_h" = xno; then AC_ERROR([missing required header GL/gl.h]) fi if test "x$ac_cv_header_GL_glu_h" = xno; then AC_ERROR([missing required header GL/glu.h]) fi fi AC_ARG_WITH(gl-libs, [ --with-gl-libs=DIR specify location of OpenGL libs], [LDFLAGS="${LDFLAGS} -L${withval}" L_LIB="-L${withval}"] ) AC_ARG_WITH(gl-libname, [ --with-gl-libname=NAME specify Library name (defaults to "GL")], [lGL=${withval}], [lGL=GL] ) AC_CHECK_LIB($lGL, glEnd) this=`eval echo '${'$as_ac_Lib'}'` if test "x$this" != xyes; then AC_ERROR([missing required library ${lGL}]) fi AC_ARG_WITH(glu-libname, [ --with-glu-libname=NAME specify GLU Library name (defaults to "GLU")], [lGLU=${withval}], [lGLU=GLU] ) AC_CHECK_LIB($lGLU, gluProject) this=`eval echo '${'$as_ac_Lib'}'` if test "x$this" != xyes; then AC_ERROR([missing required library ${lGLU}]) fi if test x$L_LIB != x; then LIBS="${L_LIB} ${LIBS}" fi ## --- FTGL ------------------------------------------------------------------ AC_ARG_ENABLE([ftgl], [ --disable-ftgl compile without FTGL font support] ) if test "x$enable_ftgl" != "xno"; then if test "x$darwin" = "xyes"; then AC_MSG_NOTICE([Darwin, so ensuring /usr/X11/bin is at the head of the PATH...]) PATH=/usr/X11/bin:${PATH} fi AC_CHECK_PROG([HAVE_FREETYPE_CONFIG],[freetype-config],[yes],[no]) if test "x$HAVE_FREETYPE_CONFIG" = "xyes"; then CPPFLAGS="${CPPFLAGS} -DHAVE_FREETYPE -Iext/ftgl `freetype-config --cflags`" LIBS="${LIBS} `freetype-config --libs`" AGLCPPFLAGS="${AGLCPPFLAGS} -DHAVE_FREETYPE -Iext/ftgl `freetype-config --cflags`" AGLLIBS="${AGLLIBS} `freetype-config --libs`" AC_MSG_NOTICE([using Freetype and FTGL]) fi else AC_MSG_NOTICE([compiling without FTGL support]) fi ## --- Output ---------------------------------------------------------------- AC_SUBST(CPPFLAGS) AC_SUBST(CXXFLAGS) AC_SUBST(LIBS) AC_SUBST(AGLCPPFLAGS) AC_SUBST(AGLLIBS) AC_SUBST(BUILD_AGL_TRUE) AC_OUTPUT(src/Makevars) rgl/tests/0000755000176000001440000000000012174042270012227 5ustar ripleyusersrgl/tests/demos.R0000644000176000001440000000027612174042270013466 0ustar ripleyuserslibrary(rgl) # regression : this failed for headless tests par3d(userMatrix = diag(4)) for(demo in demo(package="rgl")$results[,"Item"]) demo(demo, package="rgl", character.only=TRUE) rgl/src/0000755000176000001440000000000012262026246011657 5ustar ripleyusersrgl/src/x11gui.cpp0000644000176000001440000004651612262026246013515 0ustar ripleyusers#include "config.hpp" #ifdef RGL_X11 // --------------------------------------------------------------------------- // C++ source // This file is part of RGL. // // $Id: x11gui.cpp 976 2013-10-04 15:06:19Z murdoch $ // Uncomment for verbose output on stderr: // #define RGL_X11_DEBUG // --------------------------------------------------------------------------- #include #include #include #include "x11gui.hpp" #include "lib.hpp" #include "R.h" namespace rgl { // --------------------------------------------------------------------------- extern SEXP rglNamespace; // --------------------------------------------------------------------------- class X11WindowImpl : public WindowImpl { public: X11WindowImpl(rgl::Window* in_window , X11GUIFactory* in_factory , ::Window in_xwindow , XVisualInfo* invisualinfo ); virtual ~X11WindowImpl(); void setTitle(const char* title); void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void show(); void hide(); void bringToTop(int stay); void update(); void destroy(); bool beginGL(); void endGL(); void swap(); void captureMouse(View* captureview); void releaseMouse(); GLFont* getFont(const char* family, int style, double cex, bool useFreeType); private: void initGL(); GLBitmapFont* initGLFont(); void shutdownGL(); static int translate_key(KeySym keysym); void on_init(); void on_shutdown(); void on_paint(); void processEvent(XEvent& ev); X11GUIFactory* factory; ::Window xwindow; ::GLXContext glxctx; friend class X11GUIFactory; XVisualInfo* xvisualinfo; }; } // namespace rgl using namespace rgl; // --------------------------------------------------------------------------- // X11WindowImpl Implementation // --------------------------------------------------------------------------- X11WindowImpl::X11WindowImpl(Window* w, X11GUIFactory* f, ::Window in_xwindow, XVisualInfo* invisualinfo) : WindowImpl(w) , factory(f) , xwindow(in_xwindow) , xvisualinfo(invisualinfo) { on_init(); } // --------------------------------------------------------------------------- X11WindowImpl::~X11WindowImpl() { if (xwindow != 0) destroy(); // free XVisualInfo structure if (xvisualinfo) { XFree(xvisualinfo); xvisualinfo = 0; } } // --------------------------------------------------------------------------- void X11WindowImpl::setTitle(const char* title) { XStoreName(factory->xdisplay,xwindow,title); factory->flushX(); } // --------------------------------------------------------------------------- void X11WindowImpl::setWindowRect(int left, int top, int right, int bottom) { ::Window root, child, parent, *children; int x, y; unsigned int nchildren; XQueryTree(factory->xdisplay, xwindow, &root, &parent, &children, &nchildren); XTranslateCoordinates(factory->xdisplay, xwindow, parent, 0, 0, &x, &y, &child); // The weird calculation below (subtracting twice (x,y)) compensates for the diff // between coordinates of the rgl window within the parent window. // There's probably a smarter way to do this... XMoveWindow(factory->xdisplay, xwindow, left-2*x, top-2*y); XResizeWindow(factory->xdisplay, xwindow, right-left, bottom-top); factory->flushX(); } // --------------------------------------------------------------------------- void X11WindowImpl::getWindowRect(int *left, int *top, int *right, int *bottom) { ::Window root, child; int x, y; unsigned int width, height, border_width, depth; factory->processEvents(); factory->flushX(); XGetGeometry(factory->xdisplay, xwindow, &root, &x, &y, &width, &height, &border_width, &depth); XTranslateCoordinates(factory->xdisplay, xwindow, root, x, y, left, top, &child); XTranslateCoordinates(factory->xdisplay, xwindow, root, x+width, y+height, right, bottom, &child); } // --------------------------------------------------------------------------- static Bool IsMapNotify(Display* d, XEvent* ev, XPointer arg) { ::Window w = (::Window) arg; return ( (ev->xany.window == w) && (ev->type == MapNotify) ); } void X11WindowImpl::show() { XMapWindow(factory->xdisplay, xwindow); XEvent ev; XIfEvent(factory->xdisplay, &ev, IsMapNotify, (XPointer) xwindow ); factory->processEvents(); factory->flushX(); update(); } // --------------------------------------------------------------------------- void X11WindowImpl::hide() { XUnmapWindow(factory->xdisplay, xwindow); factory->flushX(); } // --------------------------------------------------------------------------- void X11WindowImpl::bringToTop(int stay) { XRaiseWindow(factory->xdisplay, xwindow); factory->processEvents(); factory->flushX(); } // --------------------------------------------------------------------------- void X11WindowImpl::on_paint() { if (window) { if (window->skipRedraw) return; window->paint(); SAVEGLERROR; } swap(); SAVEGLERROR; } // --------------------------------------------------------------------------- void X11WindowImpl::update() { on_paint(); SAVEGLERROR; } // --------------------------------------------------------------------------- void X11WindowImpl::destroy() { if (xwindow != 0) { on_shutdown(); XDestroyWindow(factory->xdisplay, xwindow); factory->flushX(); factory->notifyDelete(xwindow); /* Why didn't this happen in the lines above, from the DestroyNotify event? */ xwindow = 0; if (window) window->notifyDestroy(); delete this; } } // --------------------------------------------------------------------------- bool X11WindowImpl::beginGL() { if ( glXMakeCurrent(factory->xdisplay, xwindow, glxctx) == False ) { printMessage("ERROR: can't bind glx context to window"); return false; } else return true; } // --------------------------------------------------------------------------- void X11WindowImpl::endGL() { } // --------------------------------------------------------------------------- void X11WindowImpl::swap() { glXSwapBuffers(factory->xdisplay, xwindow); } // --------------------------------------------------------------------------- void X11WindowImpl::captureMouse(View* captureview) { } // --------------------------------------------------------------------------- void X11WindowImpl::releaseMouse() { } // --------------------------------------------------------------------------- void X11WindowImpl::processEvent(XEvent& ev) { char keybuffer[8]; KeySym keysym; XComposeStatus compose; int count, keycode; ::Window root, child; int rootx, rooty, winx, winy; unsigned int mask; switch(ev.type) { case ButtonPress: switch(ev.xbutton.button) { case 1: if (window) window->buttonPress( GUI_ButtonLeft, ev.xbutton.x, ev.xbutton.y ); break; case 2: if (window) window->buttonPress( GUI_ButtonMiddle, ev.xbutton.x, ev.xbutton.y ); break; case 3: if (window) window->buttonPress( GUI_ButtonRight, ev.xbutton.x, ev.xbutton.y ); break; case 4: if (window) window->wheelRotate( GUI_WheelForward ); break; case 5: if (window) window->wheelRotate( GUI_WheelBackward ); break; } break; case ButtonRelease: switch(ev.xbutton.button) { case 1: if (window) window->buttonRelease( GUI_ButtonLeft, ev.xbutton.x, ev.xbutton.y ); break; case 2: if (window) window->buttonRelease( GUI_ButtonMiddle, ev.xbutton.x, ev.xbutton.y ); break; case 3: if (window) window->buttonRelease( GUI_ButtonRight, ev.xbutton.x, ev.xbutton.y ); break; } break; case KeyPress: count = XLookupString(&ev.xkey, keybuffer, sizeof(keybuffer), &keysym, &compose); keycode = translate_key(keysym); if (keycode) if (window) window->keyPress(keycode); break; case KeyRelease: count = XLookupString(&ev.xkey, keybuffer, sizeof(keybuffer), &keysym, &compose); keycode = translate_key(keysym); if (keycode) if (window) window->keyRelease(keycode); break; case MappingNotify: XRefreshKeyboardMapping(&ev.xmapping); break; case MotionNotify: if( XQueryPointer(factory->xdisplay, xwindow, &root, &child, &rootx, &rooty, &winx, &winy, &mask) == True ) if (window) window->mouseMove( winx, winy ); break; case Expose: if (ev.xexpose.count == 0) { if (window) { if (window->skipRedraw) break; window->paint(); } swap(); } break; case ConfigureNotify: if (window) window->resize( ev.xconfigure.width, ev.xconfigure.height ); break; case MapNotify: if (window) window->show(); break; case UnmapNotify: if (window) window->hide(); break; case ClientMessage: if ( ( (::Atom) ev.xclient.data.l[0] ) == factory->atoms[GUI_X11_ATOM_WM_DELETE]) if (window) window->on_close(); break; case DestroyNotify: factory->notifyDelete(xwindow); xwindow = 0; if (window) window->notifyDestroy(); delete this; break; } } // --------------------------------------------------------------------------- void X11WindowImpl::initGL() { glxctx = glXCreateContext(factory->xdisplay, xvisualinfo, NULL, True); if (!glxctx) factory->throw_error("unable to create GLX Context"); } // --------------------------------------------------------------------------- void X11WindowImpl::shutdownGL() { // destroy GL context if (glxctx) { glXMakeCurrent(factory->xdisplay, None, NULL); glXDestroyContext(factory->xdisplay, glxctx); glxctx = NULL; } } // --------------------------------------------------------------------------- GLFont* X11WindowImpl::getFont(const char* family, int style, double cex, bool useFreeType) { for (unsigned int i=0; i < fonts.size(); i++) { if (fonts[i]->cex == cex && fonts[i]->style == style && !strcmp(fonts[i]->family, family) && fonts[i]->useFreeType == useFreeType) return fonts[i]; } if (useFreeType) { #ifdef HAVE_FREETYPE int len=0; SEXP Rfontname = VECTOR_ELT(PROTECT(eval(lang2(install("rglFonts"), ScalarString(mkChar(family))), rglNamespace)), 0); if (isString(Rfontname) && length(Rfontname) >= style) { const char* fontname = CHAR(STRING_ELT(Rfontname, style-1)); GLFTFont* font=new GLFTFont(family, style, cex, fontname); if (font->font) { fonts.push_back(font); UNPROTECT(1); return font; } else { warning(font->errmsg); delete font; } } UNPROTECT(1); #endif } if (strcmp(family, fonts[0]->family)) warning("font family \"%s\" not found, using \"%s\"", family, fonts[0]->family); else if (style != fonts[0]->style) warning("\"%s\" family only supports font %d", fonts[0]->family, fonts[0]->style); else if (cex != fonts[0]->cex) warning("\"%s\" family only supports cex = %g", fonts[0]->family, fonts[0]->cex); else if (useFreeType) warning("FreeType font not available"); return fonts[0]; } GLBitmapFont* X11WindowImpl::initGLFont() { GLBitmapFont* font = NULL; if (beginGL()) { font = new GLBitmapFont("bitmap", 1, 1, "fixed"); font->nglyph = GL_BITMAP_FONT_COUNT; font->firstGlyph = GL_BITMAP_FONT_FIRST_GLYPH; GLuint listBase = glGenLists(font->nglyph); font->listBase = listBase - font->firstGlyph; glXUseXFont(factory->xfont->fid, font->firstGlyph, font->nglyph, listBase); font->widths = new unsigned int[font->nglyph]; for(unsigned int i=0;inglyph;i++) font->widths[i] = 9; font->ascent = factory->xfont->ascent; endGL(); // Should this be added? } return font; } // --------------------------------------------------------------------------- void X11WindowImpl::on_init() { initGL(); fonts[0] = initGLFont(); } void X11WindowImpl::on_shutdown() { shutdownGL(); } // --------------------------------------------------------------------------- // // FUNCTION // translate_key // // translates X11 KeySym keycode to GUI_Key code // // --------------------------------------------------------------------------- int X11WindowImpl::translate_key(KeySym keysym) { if ( (keysym >= XK_space) && (keysym <= XK_asciitilde) ) return (int) keysym; else if ((keysym >= XK_F1) && (keysym <= XK_F12)) return GUI_KeyF1 + keysym - XK_F1; else { switch(keysym) { case XK_Return: return GUI_KeyReturn; case XK_Escape: return GUI_KeyESC; default: return 0; } } } // --------------------------------------------------------------------------- // X11GUIFactory Implementation // --------------------------------------------------------------------------- // throw error // --------------------------------------------------------------------------- void X11GUIFactory::throw_error(const char* string) { printMessage(string); disconnect(); } // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- static int error_code; static void ConvertError(Display *dsp) { char buff[1000]; XGetErrorText(dsp, error_code, buff, 1000); error("X11 protocol error: %s", buff); } static int X11SaveErr(Display *dsp, XErrorEvent *event) { error_code = event->error_code; return 0; } X11GUIFactory::X11GUIFactory(const char* displayname) : xdisplay(0) , xfont(0) { // Open one display connection for all RGL X11 devices xdisplay = XOpenDisplay(displayname); if (xdisplay == 0) { throw_error("unable to open X11 display"); return; } /* XSynchronize(xdisplay, True); */ // Load System font xfont = XLoadQueryFont(xdisplay,"fixed"); // Obtain display atoms static char* atom_names[GUI_X11_ATOM_LAST] = { const_cast("WM_DELETE_WINDOW") }; Status s = XInternAtoms(xdisplay, atom_names, sizeof(atom_names)/sizeof(char*), True, atoms); if (!s) printMessage("some atoms not available"); // Query glx extension if ( glXQueryExtension(xdisplay, &errorBase, &eventBase) == False ) { throw_error("GLX extension missing on server"); return; } } // --------------------------------------------------------------------------- X11GUIFactory::~X11GUIFactory() { disconnect(); } // --------------------------------------------------------------------------- void X11GUIFactory::disconnect() { // process pending XDestroyNotify events if (xdisplay) { XSync(xdisplay, False); processEvents(); } // free xfont if (xfont) { XUnloadFont(xdisplay, xfont->fid); xfont = 0; } // disconnect from X server if (xdisplay) { XCloseDisplay(xdisplay); xdisplay = 0; } } // --------------------------------------------------------------------------- void X11GUIFactory::flushX() { XSync(xdisplay, False); glXWaitX(); } // --------------------------------------------------------------------------- void X11GUIFactory::processEvents() { for(;;) { int nevents = XEventsQueued(xdisplay, QueuedAfterReading); if (nevents == 0) return; while(nevents--) { XEvent ev; XNextEvent(xdisplay,&ev); X11WindowImpl* impl = windowMap[ev.xany.window]; if (impl) impl->processEvent(ev); #ifdef RGL_X11_DEBUG else fprintf(stderr,"unknown window id %lx(code %lx)\n" , static_cast(ev.xany.window) , static_cast(ev.type) ); #endif } } } // --------------------------------------------------------------------------- WindowImpl* X11GUIFactory::createWindowImpl(Window* window) { X11WindowImpl* impl = NULL; XVisualInfo* xvisualinfo; // Choose GLX visual static int attribList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_ALPHA_SIZE, 0, GLX_DEPTH_SIZE, 1, None, None, // Space for optional AA settings None, None, None }; #ifdef GLX_SAMPLE_BUFFERS // Setup antialiasing based on "rgl.antialias" option int aa; SEXP rgl_aa = GetOption(install("rgl.antialias"),R_BaseEnv); if (isNull(rgl_aa)) aa = RGL_ANTIALIAS; else aa = asInteger(rgl_aa); if(aa > 0) { attribList[12] = GLX_SAMPLE_BUFFERS; attribList[13] = 1; attribList[14] = GLX_SAMPLES; attribList[15] = aa; } #endif xvisualinfo = glXChooseVisual( xdisplay, DefaultScreen(xdisplay), attribList ); #ifdef GLX_SAMPLE_BUFFERS // Try to set up visual without MSAA if it failed if (xvisualinfo == 0 && aa > 0) { attribList[12] = None; xvisualinfo = glXChooseVisual( xdisplay, DefaultScreen(xdisplay), attribList ); } #endif if (xvisualinfo == 0) { throw_error("no suitable visual available"); } // create X11 window // We don't want a border, but MacOSX Xvfb requires one. unsigned long valuemask=CWEventMask|CWColormap|CWBorderPixel; XSetWindowAttributes attrib; XErrorHandler old_handler; attrib.event_mask = ButtonMotionMask | PointerMotionHintMask | VisibilityChangeMask | ExposureMask | StructureNotifyMask | ButtonPressMask | KeyPressMask | KeyReleaseMask | ButtonReleaseMask; ::Window xparent = RootWindow(xdisplay, DefaultScreen(xdisplay)); attrib.colormap = XCreateColormap(xdisplay, xparent, xvisualinfo->visual, AllocNone); attrib.border_pixel = 0; /* Work around problems with Xvfb on MacOSX: temporarily catch protocol errors and convert to R errors */ error_code = 0; old_handler = XSetErrorHandler(X11SaveErr); ::Window xwindow = XCreateWindow( xdisplay, xparent, 0, 0, 256, 256, 0, xvisualinfo->depth, InputOutput, xvisualinfo->visual, valuemask, &attrib ); XSync(xdisplay, False); /* set WM_CLASS on window */ XClassHint *classHint = XAllocClassHint(); if (classHint) { classHint->res_name = const_cast("rgl"); classHint->res_class = const_cast("R_x11"); XSetClassHint(xdisplay, xwindow, classHint); XFree(classHint); } XSetErrorHandler(old_handler); if (error_code) ConvertError(xdisplay); /* will not return */ if (!xwindow) return NULL; // set window manager protocols int n = 0; ::Atom proto_atoms[GUI_X11_ATOM_LAST]; if (atoms[GUI_X11_ATOM_WM_DELETE]) { proto_atoms[n] = atoms[GUI_X11_ATOM_WM_DELETE]; n++; } if (n) XSetWMProtocols(xdisplay,xwindow,proto_atoms,n); // create window implementation instance impl = new X11WindowImpl(window, this, xwindow, xvisualinfo); // register instance windowMap[xwindow] = impl; // flush X requests flushX(); return (WindowImpl*) impl; } // --------------------------------------------------------------------------- void X11GUIFactory::notifyDelete(::Window xwindowid) { #ifdef RGL_X11_DEBUG fprintf(stderr,"notifyDelete %lx\n", xwindowid); #endif // remove window from map windowMap.erase(xwindowid); } // --------------------------------------------------------------------------- #endif // RGL_X11_HPP rgl/src/COPYING.GL2PS0000644000176000001440000000170011664440733013544 0ustar ripleyusers GL2PS LICENSE Version 2, November 2003 Copyright (C) 2003, Christophe Geuzaine Permission to use, copy, and distribute this software and its documentation for any purpose with or without fee is hereby granted, provided that the copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Permission to modify and distribute modified versions of this software is granted, provided that: 1) the modifications are licensed under the same terms as this software; 2) you make available the source code of any modifications that you distribute, either on the same media as you distribute any executable or other form of this software, or via a mechanism generally accepted in the software development community for the electronic transfer of data. This software is provided "as is" without express or implied warranty. rgl/src/Material.cpp0000644000176000001440000000777312262026246014137 0ustar ripleyusers#include "gl2ps.h" #include "Material.hpp" #include "opengl.hpp" #include "Texture.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Material // Material::Material(Color bg, Color fg) : ambient(0.0f,0.0f,0.0f,1.0f), specular(1.0f,1.0f,1.0f,1.0f), emission(0.0f,0.0f,0.0f,0.0f), shininess(50.0f), size(3.0f), lwd(1.0f), colors(bg,fg), texture(), front(FILL_FACE), back(FILL_FACE), smooth(true), lit(true), fog(true), useColorArray(false), point_antialias(false), line_antialias(false), depth_mask(true), depth_test(1), // "less" glVersion(-1.0) { alphablend = ( ( bg.getAlphaf() < 1.0f ) || ( fg.getAlphaf() < 1.0f ) ) ? true : false; } void Material::setup() { const char* version = (const char*)glGetString(GL_VERSION); if (version) glVersion = atof(version); else glVersion = 1.0; } void Material::beginUse(RenderContext* renderContext) { int ncolor = colors.getLength(); GLenum depthfunc[] = { GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS }; SAVEGLERROR; glDepthFunc(depthfunc[depth_test]); glDepthMask(depth_mask ? GL_TRUE : GL_FALSE); SAVEGLERROR; glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT ); SAVEGLERROR; if (!alphablend) glDepthMask(GL_TRUE); SAVEGLERROR; if (point_antialias) glEnable(GL_POINT_SMOOTH); if (line_antialias) glEnable(GL_LINE_SMOOTH); SAVEGLERROR; glDisable(GL_CULL_FACE); for (int i=0;i<2;i++) { PolygonMode mode = (i==0) ? front : back; GLenum face = (i==0) ? GL_FRONT : GL_BACK; SAVEGLERROR; switch (mode) { case FILL_FACE: glPolygonMode( face, GL_FILL); break; case LINE_FACE: glPolygonMode( face, GL_LINE); break; case POINT_FACE: glPolygonMode( face, GL_POINT); break; case CULL_FACE: glEnable(GL_CULL_FACE); glCullFace(face); break; } } SAVEGLERROR; glShadeModel( (smooth) ? GL_SMOOTH : GL_FLAT ); SAVEGLERROR; if (lit) { glEnable(GL_LIGHTING); SAVEGLERROR; #ifdef GL_VERSION_1_2 if (glVersion < 0.0) setup(); if (glVersion >= 1.2) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, (texture) ? GL_SEPARATE_SPECULAR_COLOR : GL_SINGLE_COLOR ); #endif SAVEGLERROR; glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT, ambient.data); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, specular.data); glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS, shininess); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION, emission.data); } SAVEGLERROR; if ( (useColorArray) && ( ncolor > 1 ) ) { glEnableClientState(GL_COLOR_ARRAY); colors.useArray(); } else colors.useColor(0); SAVEGLERROR; if (renderContext->gl2psActive == GL2PS_NONE) { glPointSize( size ); glLineWidth( lwd ); } else { gl2psPointSize( size ); gl2psLineWidth( lwd ); } if (texture) texture->beginUse(renderContext); SAVEGLERROR; if (!fog) glDisable(GL_FOG); SAVEGLERROR; } void Material::useColor(int index) { if (colors.getLength() > 0) colors.useColor( index % colors.getLength() ); } void Material::endUse(RenderContext* renderContext) { int ncolor = colors.getLength(); if ( (useColorArray) && ( ncolor > 1 ) ) { glDisableClientState(GL_COLOR_ARRAY); SAVEGLERROR; } if (texture) { texture->endUse(renderContext); SAVEGLERROR; } #if USE_GLGETERROR saveGLerror(__FILE__, __LINE__); #endif glPopAttrib(); #if USE_GLGETERROR if (SaveErrnum == GL_NO_ERROR) glGetError(); /* work around bug in some glX implementations */ #endif SAVEGLERROR; glDepthFunc(GL_LESS); glDepthMask(GL_TRUE); } void Material::colorPerVertex(bool enable, int numVertices) { useColorArray = enable; if (enable) colors.recycle(numVertices); } rgl/src/rglview.h0000644000176000001440000001130412262026246013506 0ustar ripleyusers#ifndef RGLVIEW_H #define RGLVIEW_H // C++ header file // This file is part of RGL // // $Id: rglview.h 976 2013-10-04 15:06:19Z murdoch $ #include "scene.h" #include "gui.hpp" #include "fps.h" #include "select.h" #include "pixmap.h" namespace rgl { enum MouseModeID {mmTRACKBALL = 1, mmXAXIS, mmYAXIS, mmZAXIS, mmPOLAR, mmSELECTING, mmZOOM, mmFOV, mmUSER}; enum MouseSelectionID {msNONE=1, msCHANGING, msDONE, msABORT}; typedef void (*userControlPtr)(void *userData, int mouseX, int mouseY); typedef void (*userControlEndPtr)(void *userData); typedef void (*userCleanupPtr)(void **userData); class RGLView : public View { public: RGLView(Scene* scene); ~RGLView(); bool snapshot(PixmapFileFormatID formatID, const char* filename); bool pixels(int* ll, int* size, int component, float* result); bool postscript(int format, const char* filename, bool drawText); // event handler: void show(void); void hide(void); void paint(void); void resize(int width, int height); void buttonPress(int button, int mouseX, int mouseY); void buttonRelease(int button, int mouseX, int mouseY); void mouseMove(int mouseX, int mouseY); void wheelRotate(int dir); void captureLost(); void keyPress(int code); Scene* getScene(); MouseModeID getMouseMode(int button); void setMouseMode(int button, MouseModeID mode); void setMouseCallbacks(int button, userControlPtr begin, userControlPtr update, userControlEndPtr end, userCleanupPtr cleanup, void** user); void getMouseCallbacks(int button, userControlPtr *begin, userControlPtr *update, userControlEndPtr *end, userCleanupPtr *cleanup, void** user); MouseSelectionID getSelectState(); void setSelectState(MouseSelectionID state); double* getMousePosition(); void getUserMatrix(double* dest); void setUserMatrix(double* src); void getScale(double* dest); void setScale(double* src); const char* getFontFamily() const; void setFontFamily(const char *family); int getFontStyle() const; void setFontStyle(int style); double getFontCex() const; void setFontCex(double cex); bool getFontUseFreeType() const; void setFontUseFreeType(bool useFreeType); void setDefaultFont(const char *family, int style, double cex, bool useFreeType); const char* getFontname() const; /* NB: these functions do not maintain consistency with userMatrix */ void getPosition(double* dest); void setPosition(double* src); // These are set after rendering the scene GLdouble modelMatrix[16], projMatrix[16]; GLint viewport[4]; protected: void setWindowImpl(WindowImpl* impl); private: typedef void (RGLView::*viewControlPtr)(int mouseX,int mouseY); typedef void (RGLView::*viewControlEndPtr)(); viewControlPtr ButtonBeginFunc[3], ButtonUpdateFunc[3]; viewControlEndPtr ButtonEndFunc[3]; void setDefaultMouseFunc(); // // DRAG USER-INPUT // int drag; // o DRAG FEATURE: adjustDirection void polarBegin(int mouseX, int mouseY); void polarUpdate(int mouseX, int mouseY); void polarEnd(); void trackballBegin(int mouseX, int mouseY); void trackballUpdate(int mouseX, int mouseY); void trackballEnd(); void oneAxisBegin(int mouseX, int mouseY); void oneAxisUpdate(int mouseX, int mouseY); PolarCoord camBase, dragBase, dragCurrent; Vertex rotBase, rotCurrent, axis[3]; // o DRAG FEATURE: adjustZoom void adjustZoomBegin(int mouseX, int mouseY); void adjustZoomUpdate(int mouseX, int mouseY); void adjustZoomEnd(); int zoomBaseY; float zoomCamBase; // o DRAG FEATURE: adjustFOV (field of view) void adjustFOVBegin(int mouseX, int mouseY); void adjustFOVUpdate(int mouseX, int mouseY); void adjustFOVEnd(); int fovBaseY; // o DRAG FEATURE: user supplied callback void userBegin(int mouseX, int mouseY); void userUpdate(int mouseX, int mouseY); void userEnd(); void* userData[9]; userControlPtr beginCallback[3], updateCallback[3]; userControlEndPtr endCallback[3]; userCleanupPtr cleanupCallback[3]; int activeButton; bool busy; // o DRAG FEATURE: mouseSelection void mouseSelectionBegin(int mouseX,int mouseY); void mouseSelectionUpdate(int mouseX,int mouseY); void mouseSelectionEnd(); // // RENDER SYSTEM // // o LAYERS Scene* scene; FPS fps; SELECT select; // o CONTEXT RenderContext renderContext; bool autoUpdate; enum { FSHOWFPS = 1<<0, FAUTOUPDATE = 1<<1 }; int flags; MouseModeID mouseMode[3]; MouseSelectionID selectState; double mousePosition[4]; }; } // namespace rgl #endif /* RGLVIEW_H */ rgl/src/Surface.hpp0000644000176000001440000000307612262006354013764 0ustar ripleyusers#ifndef SURFACE_HPP #define SURFACE_HPP #include "Shape.hpp" #include "render.h" #include namespace rgl { // // CLASS // Surface // class Surface : public Shape { public: Surface(Material& material, int nx, int nz, double* x, double* z, double* y, double* normal_x, double* normal_z, double* normal_y, double* texture_s, double* texture_t, int* coords, int orientation, int* flags, int ignoreExtent); /** * overload **/ virtual void draw(RenderContext* renderContext); /* Center of square with upper left at (ix, iz) */ Vertex getCenter(int ix, int iz); virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "surface", buflen); }; int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); virtual int getElementCount(void) { return (nx-1)*(nz-1); } /** * location of individual items **/ virtual Vertex getElementCenter(int item) ; /** * begin sending items **/ virtual void drawBegin(RenderContext* renderContext) ; /** * send one item **/ virtual void drawElement(RenderContext* renderContext, int index) ; /** * end sending items **/ virtual void drawEnd(RenderContext* renderContext) ; private: Vertex getNormal(int ix, int iz); VertexArray vertexArray; NormalArray normalArray; TexCoordArray texCoordArray; int nx, nz, coords[3], orientation, user_normals, user_textures; bool use_normal, use_texcoord; }; } // namespace rgl #endif // SURFACE_HPP rgl/src/String.cpp0000644000176000001440000000442112262026246013632 0ustar ripleyusers#include "String.hpp" #include "types.h" using namespace std; ////////////////////////////////////////////////////////////////////////////// // // SECTION: Strings // // // CLASS // StringArrayImpl // namespace rgl { class StringArrayImpl : public AutoDestroy { public: StringArrayImpl(int in_ntexts, char** in_texts) { int i; ntexts = in_ntexts; lengths = new unsigned int [ntexts]; starts = new unsigned int [ntexts]; int buflen = 0; for(i=0;i 0) { impl = new StringArrayImpl(in_ntexts, in_texts); impl->ref(); } else impl = NULL; } StringArray::StringArray(StringArray& from) { impl = from.impl; if (impl) impl->ref(); } StringArray::~StringArray() { if (impl) impl->unref(); } String StringArray::operator[](int index) { if (impl && index < impl->ntexts) return String(impl->lengths[index], impl->textbuffer + impl->starts[index]); else return String(0, NULL); } int StringArray::size() { if (impl) return impl->ntexts; else return 0; } // // CLASS // StringArrayIterator // StringArrayIterator::StringArrayIterator(StringArray* in_array) { array = in_array; } void StringArrayIterator::first() { cnt = 0; if (array->impl) textptr = array->impl->textbuffer; else textptr = NULL; } void StringArrayIterator::next() { if ( (textptr) && (cnt < array->impl->ntexts) ) textptr += 1 + array->impl->lengths[cnt++]; } String StringArrayIterator::getCurrent() { return String(array->impl->lengths[cnt], textptr ); } bool StringArrayIterator::isDone() const { if (array->impl) return (cnt == array->impl->ntexts) ? true : false; else return true; } rgl/src/Texture.cpp0000644000176000001440000001437212262026246014032 0ustar ripleyusers #include "Texture.hpp" #include "pixmap.h" using namespace std; using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Texture // Texture::Texture( const char* in_filename , Type in_type , bool in_mipmap , unsigned int in_minfilter , unsigned int in_magfilter , bool in_envmap) { texName = 0; pixmap = new Pixmap(); type = in_type; mipmap = in_mipmap; envmap = in_envmap; magfilter = (in_magfilter) ? GL_LINEAR : GL_NEAREST; if (mipmap) { switch(in_minfilter) { case 0: minfilter = GL_NEAREST; break; case 1: minfilter = GL_LINEAR; break; case 2: minfilter = GL_NEAREST_MIPMAP_NEAREST; break; case 3: minfilter = GL_NEAREST_MIPMAP_LINEAR; break; case 4: minfilter = GL_LINEAR_MIPMAP_NEAREST; break; default: minfilter = GL_LINEAR_MIPMAP_LINEAR; break; } } else { switch(in_minfilter) { case 0: minfilter = GL_NEAREST; break; default: minfilter = GL_LINEAR; break; } } filename = new char [1 + strlen(in_filename)]; memcpy(filename, in_filename, 1 + strlen(in_filename)); if ( !pixmap->load(filename) ) { delete pixmap; pixmap = NULL; } } Texture::~Texture() { if (texName) { glDeleteTextures(1, &texName); } if (pixmap) delete pixmap; } bool Texture::isValid() const { return (pixmap) ? true : false; } void Texture::getParameters(Type *out_type, bool *out_mipmap, unsigned int *out_minfilter, unsigned int *out_magfilter, bool *out_envmap, int buflen, char *out_filename) { *out_type = type; *out_mipmap = mipmap; switch(minfilter) { case GL_NEAREST: *out_minfilter = 0; break; case GL_LINEAR: *out_minfilter = 1; break; case GL_NEAREST_MIPMAP_NEAREST: *out_minfilter = 2; break; case GL_NEAREST_MIPMAP_LINEAR: *out_minfilter = 3; break; case GL_LINEAR_MIPMAP_NEAREST: *out_minfilter = 4; break; case GL_LINEAR_MIPMAP_LINEAR: *out_minfilter = 5; break; default: *out_minfilter = 6; break; } *out_magfilter = (magfilter == GL_LINEAR) ? 1 : 0; *out_envmap = envmap; strncpy(out_filename, filename, buflen); } static unsigned int texsize(unsigned int s) { return 1U << msb(s-1); } #include "lib.hpp" static void printGluErrorMessage(GLint error) { const GLubyte* gluError; char buf[256]; gluError = gluErrorString (error); sprintf(buf, "GLU Library Error : %s", (const char*) gluError); printMessage(buf); } void Texture::init(RenderContext* renderContext) { glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter); GLint internalFormat = 0; GLenum format = 0; GLint ualign; unsigned int bytesperpixel = 0; switch(type) { case ALPHA: internalFormat = GL_ALPHA; break; case LUMINANCE: internalFormat = GL_LUMINANCE; break; case LUMINANCE_ALPHA: internalFormat = GL_LUMINANCE_ALPHA; break; case RGB: internalFormat = GL_RGB; break; case RGBA: internalFormat = GL_RGBA; break; } switch(pixmap->typeID) { case GRAY8: ualign = 1; bytesperpixel = 1; switch(internalFormat) { case GL_LUMINANCE: format = GL_LUMINANCE; break; case GL_ALPHA: format = GL_ALPHA; break; case GL_LUMINANCE_ALPHA: format = GL_LUMINANCE; break; } break; case RGB24: ualign = 1; format = GL_RGB; bytesperpixel = 3; break; case RGB32: ualign = 2; format = GL_RGB; bytesperpixel = 4; break; case RGBA32: ualign = 2; format = GL_RGBA; bytesperpixel = 4; break; default: // INVALID return; } glPixelStorei(GL_UNPACK_ALIGNMENT, ualign); GLenum gl_type = GL_UNSIGNED_BYTE; GLint glTexSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glTexSize ); unsigned int maxSize = static_cast(glTexSize); if (mipmap) { int gluError = gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, pixmap->width, pixmap->height, format, gl_type, pixmap->data); if (gluError) printGluErrorMessage(gluError); } else { unsigned int width = texsize(pixmap->width); unsigned int height = texsize(pixmap->height); if ( (width > maxSize) || (height > maxSize) ) { char buf[256]; sprintf(buf, "GL Library : Maximum texture size of %dx%d exceeded.\n(Perhaps enabling mipmapping could help.)", maxSize,maxSize); printMessage(buf); } else if ( (pixmap->width != width) || ( pixmap->height != height) ) { char* data = new char[width * height * bytesperpixel]; int gluError = gluScaleImage(format, pixmap->width, pixmap->height, gl_type, pixmap->data, width, height, gl_type, data); if (gluError) printGluErrorMessage(gluError); glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, gl_type , data); delete[] data; } else { glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, pixmap->width, pixmap->height, 0, format, gl_type , pixmap->data); } } if (envmap) { glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); } delete pixmap; pixmap = NULL; } void Texture::beginUse(RenderContext* renderContext) { if (!texName) { init(renderContext); } glPushAttrib(GL_TEXTURE_BIT|GL_ENABLE_BIT|GL_CURRENT_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBindTexture(GL_TEXTURE_2D, texName); if (type == ALPHA) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } } void Texture::endUse(RenderContext* renderContext) { glPopAttrib(); } rgl/src/Color.hpp0000644000176000001440000000347712262005307013454 0ustar ripleyusers#ifndef COLOR_HPP #define COLOR_HPP // // CLASS // Color // // IMPLEMENTATION // uses floats as the general format for single colors, clear colors, // lighting and material color properties // #include "types.h" namespace rgl { class Color { public: Color(); Color(float red, float green, float blue, float alpha=1.0f); Color(u8 red, u8 green, u8 blue, u8 alpha); Color(const char* string); float getRedf() const { return data[0]; } float getGreenf() const { return data[1]; } float getBluef() const { return data[2]; } float getAlphaf() const { return data[3]; } u8 getRedub() const { return (u8) (data[0]*255.0f); } u8 getGreenub()const { return (u8) (data[1]*255.0f); } u8 getBlueub() const { return (u8) (data[2]*255.0f); } u8 getAlphaub()const { return (u8) (data[3]*255.0f); } float* getFloatPtr() const { return (float*) data; } /// set by integer ptr void set3iv(int* color); void useClearColor() const; void useColor() const; float data[4]; }; // // CLASS // ColorArray // IMPLEMENTATION // uses unsigned bytes as internal format for mass color datas // carries alpha values // class ColorArray { public: ColorArray(); ColorArray( ColorArray& src ); ColorArray( Color& bg, Color& fg ); ~ColorArray(); // void set( int ncolor, RColor* rcolors, u8 alpha=255 ); void set( int ncolor, char** colors, int nalpha, double* alphas ); void set( int ncolor, int* colors, int nalpha, double* alphas ); void useColor( int index ) const; void useArray() const; unsigned int getLength() const; Color getColor( int index ) const; void recycle( unsigned int newsize ); bool hasAlpha() const; private: bool hint_alphablend; unsigned int ncolor; unsigned int nalpha; u8* arrayptr; friend class Material; }; } // namespace rgl #endif // COLOR_HPP rgl/src/LineStripSet.cpp0000644000176000001440000000121612262026246014750 0ustar ripleyusers#include "PrimitiveSet.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // LineStripSet // LineStripSet::LineStripSet(Material& in_material, int in_nvertices, double* in_vertex, bool in_ignoreExtent, bool in_bboxChange) : PrimitiveSet(in_material, in_nvertices, in_vertex, GL_LINE_STRIP, 1, in_ignoreExtent, in_bboxChange) { material.lit = false; if (material.line_antialias) blended = true; } void LineStripSet::drawElement(RenderContext* renderContext, int index) { if (index < nvertices-1) glDrawArrays(type, index*nverticesperelement, 2*nverticesperelement); } rgl/src/PlaneSet.cpp0000644000176000001440000001132312262026246014076 0ustar ripleyusers#include #include "PlaneSet.hpp" #include "Viewpoint.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // PlaneSet // PlaneSet::PlaneSet(Material& in_material, int in_nnormal, double* in_normal, int in_noffset, double* in_offset) : TriangleSet(in_material,true, false/* true */), nPlanes(max(in_nnormal, in_noffset)), normal(in_nnormal, in_normal), offset(in_noffset, in_offset) { /* We'll set up 4 triangles per plane, in case we need to render a hexagon. Each triangle has 3 vertices (so 12 for the plane), and each vertex gets 3 color components and 1 alpha component. */ ARRAY colors(36*nPlanes); ARRAY alphas(12*nPlanes); if (material.colors.getLength() > 1) { material.colors.recycle(nPlanes); for (int i=0; i vertices(36*nPlanes), normals(36*nPlanes); for (int i=0; igetBoundingBox()); return TriangleSet::getBoundingBox(scene); } void PlaneSet::renderBegin(RenderContext* renderContext) { updateTriangles(renderContext->scene->getBoundingBox()); invalidateDisplaylist(); TriangleSet::renderBegin(renderContext); } void PlaneSet::updateTriangles(const AABox& sceneBBox) { int perms[3][3] = { {0,0,1}, {1,2,2}, {2,1,0} }; double bbox[2][3] = { {sceneBBox.vmin.x, sceneBBox.vmin.y, sceneBBox.vmin.z}, {sceneBBox.vmax.x, sceneBBox.vmax.y, sceneBBox.vmax.z} }; double x[12][3]; for (int elem = 0; elem < nPlanes; elem++) { Vertex Av = normal.getRecycled(elem); double A[3] = { Av.x, Av.y, Av.z }; double d = offset.getRecycled(elem); int nhits = 0; int face1[12], face2[12]; /* to identify which faces of the cube we're on */ for (int i=0; i<3; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) { int u=perms[0][i], v=perms[1][i], w=perms[2][i]; if (A[w] != 0.0) { double intersect = -(d + A[u]*bbox[j][u] + A[v]*bbox[k][v])/A[w]; if (bbox[0][w] < intersect && intersect < bbox[1][w]) { x[nhits][u] = bbox[j][u]; x[nhits][v] = bbox[k][v]; x[nhits][w] = intersect; face1[nhits] = j + 2*u; face2[nhits] = k + 2*v; nhits++; } } } if (nhits > 3) { /* Re-order the intersections so the triangles work */ for (int i=0; i i+1) { for (int j=0; j<3; j++) swap(x[i+1][j], x[which][j]); swap(face1[i+1], face1[which]); swap(face2[i+1], face2[which]); } } } if (nhits >= 3) { /* Put in order so that the normal points out the FRONT of the faces */ Vec3 v0(x[0][0] - x[1][0] , x[0][1] - x[1][1], x[0][2] - x[1][2]), v2(x[2][0] - x[1][0] , x[2][1] - x[1][1], x[2][2] - x[1][2]), vx = v0.cross(v2); bool reverse = vx*Av > 0; for (int i=0; i // C++ header file // This file is part of RGL // // $Id: pngpixmap.h 986 2013-10-11 11:35:10Z murdoch $ namespace rgl { class PNGPixmapFormat : public PixmapFormat { public: PNGPixmapFormat() { } bool checkSignature(std::FILE* fd) { unsigned char buf[8]; fread(buf, 1, 8, fd); fseek(fd, 0, SEEK_SET); return !png_sig_cmp(buf, 0, 8); } bool load(std::FILE* fd, Pixmap* pixmap) { Load load(fd, pixmap); if (load.init()) { bool success; success = load.process(); if (!success) printMessage("pixmap png loader: process failed"); return success; } else { printMessage("pixmap png loader: init failed"); return false; } } bool save(std::FILE* fd, Pixmap* pixmap) { Save save(fd, pixmap); if (save.init()) return save.process(); else return false; } private: // // CLASS // Load // class Load { public: Load(std::FILE* _file, Pixmap* _pixmap) { file = _file; pixmap = _pixmap; png_ptr = NULL; info_ptr = NULL; finish = false; error = false; } bool init(void) { bool success = false; png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp)this, error_callback, warning_callback); if (png_ptr) { info_ptr = png_create_info_struct(png_ptr); if (info_ptr) { png_set_progressive_read_fn(png_ptr, (void *)this, info_callback, row_callback, end_callback); success = true; } } return success; } bool process() { while ((!feof(file)) && (!error)) { int size = fread(buffer,1,sizeof(buffer),file); if (ferror(file)) { printError("file read error"); return false; } png_process_data(png_ptr, info_ptr, buffer, size); } return finish; } ~Load() { if (png_ptr) png_destroy_read_struct(&png_ptr, (info_ptr) ? &info_ptr : NULL, (png_infopp)NULL); } private: static void printError(const char* error_msg) { char buf[256]; sprintf(buf, "PNG Pixmap Loader Error: %s", error_msg); printMessage(buf); } static void printWarning(const char* warning_msg) { char buf[256]; sprintf(buf, "PNG Pixmap Loader Warning: %s", warning_msg); printMessage(buf); } static void error_callback(png_structp png_ptr, png_const_charp error_msg) { // Load* load = (Load*) png_get_error_ptr(png_ptr); printError( (const char*) error_msg ); } static void warning_callback(png_structp png_ptr, png_const_charp warning_msg) { // Load* load = (Load*) png_get_error_ptr(png_ptr); printWarning( (const char*) warning_msg ); } static void info_callback(png_structp png_ptr, png_infop info) { char buffer[256]; Load* load = (Load*) png_get_progressive_ptr(png_ptr); png_uint_32 width, height; int bit_depth, color_type, interlace_type, compression_type, filter_type; png_get_IHDR(load->png_ptr, load->info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, &compression_type, &filter_type); char* color_type_name; switch(color_type) { case PNG_COLOR_TYPE_RGB: color_type_name = (char*)"RGB"; break; case PNG_COLOR_TYPE_GRAY: color_type_name = (char*)"GRAY"; break; case PNG_COLOR_TYPE_PALETTE: color_type_name = (char*)"INDEX"; break; case PNG_COLOR_TYPE_RGB_ALPHA: color_type_name = (char*)"RGBALPHA"; break; case PNG_COLOR_TYPE_GRAY_ALPHA: color_type_name = (char*)"GRAYALPHA"; break; default: color_type_name = (char*)"unknown"; break; }; const char* interlace_string = (interlace_type == PNG_INTERLACE_ADAM7) ? "adam7 interlace " : ""; if (bit_depth == 16) png_set_strip_16(png_ptr); else if (bit_depth < 8 && color_type == PNG_COLOR_TYPE_GRAY) png_set_expand_gray_1_2_4_to_8(png_ptr); else if (bit_depth != 8) /* this should never happen with current formats... */ goto unsupported; if (interlace_type == PNG_INTERLACE_ADAM7) goto unsupported; PixmapTypeID typeID; switch(color_type) { case PNG_COLOR_TYPE_RGB: typeID = RGB24; goto init; case PNG_COLOR_TYPE_GRAY: typeID = GRAY8; goto init; case PNG_COLOR_TYPE_RGB_ALPHA: typeID = RGBA32; goto init; case PNG_COLOR_TYPE_PALETTE: png_set_palette_to_rgb(png_ptr); typeID = RGB24; goto init; case PNG_COLOR_TYPE_GRAY_ALPHA: png_set_gray_to_rgb(png_ptr); typeID = RGBA32; goto init; default: goto unsupported; break; }; init: if (typeID == RGB24 && png_get_valid(png_ptr, info, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png_ptr); typeID = RGBA32; } load->pixmap->init(typeID, width,height,bit_depth); png_read_update_info(load->png_ptr,load->info_ptr); return; unsupported: sprintf(buffer,"%s%s format unsupported: %lux%lu (%d bits per channel)", interlace_string, color_type_name, (long unsigned int)width, (long unsigned int)height, bit_depth); printMessage(buffer); load->error = true; png_read_update_info(load->png_ptr,load->info_ptr); return; /* Do any setup here, including setting any of the transformations mentioned in the Reading PNG files section. For now, you _must_ call either png_start_read_image() or png_read_update_info() after all the transformations are set (even if you don't set any). You may start getting rows before png_process_data() returns, so this is your last chance to prepare for that. */ } static void row_callback(png_structp png_ptr, png_bytep new_row, png_uint_32 row_num, int pass) { Load* load = (Load*) png_get_progressive_ptr(png_ptr); void* rowptr = load->pixmap->data + load->pixmap->bytesperrow * (load->pixmap->height-1-row_num); memcpy(rowptr, new_row, load->pixmap->bytesperrow); } static void end_callback(png_structp png_ptr, png_infop info) { Load* load = (Load*) png_get_progressive_ptr(png_ptr); load->finish = true; /* This function is called after the whole image has been read, including any chunks after the image (up to and including the IEND). You will usually have the same info chunk as you had in the header, although some data may have been added to the comments and time fields. Most people won't do much here, perhaps setting a flag that marks the image as finished. */ } /* static void end_callback(void) { } */ typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); std::FILE* file; Pixmap* pixmap; png_structp png_ptr; png_infop info_ptr; int bufsize; unsigned char buffer[4096]; bool error; bool finish; int width; int height; int bit_depth; }; // // CLASS // Save // class Save { public: Save(std::FILE* in_file, Pixmap* in_pixmap) { file = in_file; pixmap = in_pixmap; png_ptr = NULL; info_ptr = NULL; } bool init(void) { bool success = false; png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, (png_voidp)this, error_callback, warning_callback); if (png_ptr) { info_ptr = png_create_info_struct(png_ptr); if (info_ptr) { png_init_io(png_ptr, file); success = true; } } return success; } bool process(void) { if (setjmp(png_jmpbuf(png_ptr))) { printError("an error occured"); png_destroy_write_struct(&png_ptr, &info_ptr); return false; } png_set_filter(png_ptr, 0, PNG_FILTER_NONE); const int color_type = PNG_COLOR_TYPE_RGB; const int interlace_type = PNG_INTERLACE_NONE; const int compression_type = PNG_COMPRESSION_TYPE_DEFAULT; const int filter_type = PNG_FILTER_TYPE_DEFAULT; png_set_IHDR(png_ptr, info_ptr, pixmap->width, pixmap->height, pixmap->bits_per_channel, color_type, interlace_type, compression_type, filter_type); png_text text[1]; text[0].key = (png_charp)"Software"; text[0].text = (png_charp)"R/RGL package/libpng"; text[0].compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png_ptr, info_ptr, text, sizeof(text)/sizeof(png_text) ); png_write_info(png_ptr, info_ptr); png_bytep rowptr = (png_bytep) ( ((u8*)pixmap->data) + (pixmap->height - 1) * pixmap->bytesperrow ); for(unsigned int i=0;iheight;i++) { png_write_row(png_ptr, rowptr); rowptr -= pixmap->bytesperrow; } png_write_end(png_ptr, info_ptr); return true; } ~Save() { if (png_ptr) png_destroy_write_struct(&png_ptr, (info_ptr) ? &info_ptr : NULL); } private: static void printError(const char* error_msg) { char buf[256]; sprintf(buf, "PNG Pixmap Saver Error: %s", error_msg); printMessage(buf); } static void printWarning(const char* warning_msg) { char buf[256]; sprintf(buf, "PNG Pixmap Saver Warning: %s", warning_msg); printMessage(buf); } static void error_callback(png_structp png_ptr, png_const_charp error_msg) { // Save* save = (Save*) png_get_error_ptr(png_ptr); printError( (const char*) error_msg ); } static void warning_callback(png_structp png_ptr, png_const_charp warning_msg) { // Save* save = (Save*) png_get_error_ptr(png_ptr); printWarning( (const char*) warning_msg ); } std::FILE* file; Pixmap* pixmap; png_structp png_ptr; png_infop info_ptr; }; }; } // namespace rgl rgl/src/rglview.cpp0000644000176000001440000004422612262026246014052 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: rglview.cpp 986 2013-10-11 11:35:10Z murdoch $ #ifdef __sun #include #else #include #endif #include #include "rglview.h" #include "opengl.hpp" #include "lib.hpp" #include "rglmath.h" #include "pixmap.h" #include "fps.h" #include "select.h" #include "gl2ps.h" #include "R.h" // for error() using namespace rgl; // // CAMERA config // #define ZOOM_MIN 0.0001f #define ZOOM_MAX 10000.0f RGLView::RGLView(Scene* in_scene) : View(0,0,256,256,0), dragBase(0.0f,0.0f),dragCurrent(0.0f,0.0f), autoUpdate(false) { scene = in_scene; drag = 0; flags = 0; selectState = msNONE; setDefaultMouseFunc(); renderContext.rect.x = 0; renderContext.rect.y = 0; // size is set elsewhere for (int i=0; i<3; i++) { beginCallback[i] = NULL; updateCallback[i] = NULL; endCallback[i] = NULL; cleanupCallback[i] = NULL; for (int j=0; j<3; j++) userData[3*i + j] = NULL; } for (int i=0; i<4; i++) { viewport[i] = i < 2 ? 0 : 1024; for (int j=0;j<4;j++) { modelMatrix[4*i + j] = i == j; projMatrix[4*i + j] = i == j; } } } RGLView::~RGLView() { for (int i=0; i<3; i++) if (cleanupCallback[i]) (*cleanupCallback[i])(userData + 3*i); } void RGLView::show() { fps.init( getTime() ); } void RGLView::hide() { autoUpdate=false; } void RGLView::setWindowImpl(WindowImpl* impl) { View::setWindowImpl(impl); // // Currently the FreeType font handling in AGL on the Mac is too poor to be worth // using, so default to not using it. // #if defined HAVE_FREETYPE renderContext.font = impl->getFont("sans", 1, 1, true); #else renderContext.font = impl->fonts[0]; #endif } Scene* RGLView::getScene() { return scene; } void RGLView::resize(int in_width, int in_height) { View::resize(in_width, in_height); renderContext.rect.width = in_width; renderContext.rect.height = in_height; if (drag) captureLost(); } void RGLView::paint(void) { double last = renderContext.time; double t = getTime(); double dt = (last != 0.0f) ? last - t : 0.0f; renderContext.time = t; renderContext.deltaTime = dt; SAVEGLERROR; if (windowImpl->beginGL()) { scene->render(&renderContext); glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); glGetIntegerv(GL_VIEWPORT,viewport); if (selectState == msCHANGING) select.render(mousePosition); if (flags & FSHOWFPS && selectState == msNONE) fps.render(renderContext.time, &renderContext ); glFinish(); windowImpl->endGL(); SAVEGLERROR; } // if (flags & FAUTOUPDATE) // windowImpl->update(); } ////////////////////////////////////////////////////////////////////////////// // // user input // void RGLView::keyPress(int key) { switch(key) { case GUI_KeyF1: flags ^= FSHOWFPS; windowImpl->update(); break; case GUI_KeyESC: selectState = msABORT; break; } } void RGLView::buttonPress(int button, int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); if ( viewpoint->isInteractive() ) { if (!drag) { drag = button; windowImpl->captureMouse(this); (this->*ButtonBeginFunc[button-1])(mouseX,mouseY); } } } void RGLView::buttonRelease(int button, int mouseX, int mouseY) { if (drag == button) { windowImpl->releaseMouse(); drag = 0; (this->*ButtonEndFunc[button-1])(); } } void RGLView::mouseMove(int mouseX, int mouseY) { if (drag) { mouseX = clamp(mouseX, 0, width-1); mouseY = clamp(mouseY, 0, height-1); (this->*ButtonUpdateFunc[drag-1])(mouseX,mouseY); } } void RGLView::wheelRotate(int dir) { Viewpoint* viewpoint = scene->getViewpoint(); float zoom = viewpoint->getZoom(); #define ZOOM_STEP 1.05f #define ZOOM_PIXELLOGSTEP 0.02f switch(dir) { case GUI_WheelForward: zoom *= ZOOM_STEP; break; case GUI_WheelBackward: zoom /= ZOOM_STEP; break; } zoom = clamp( zoom , ZOOM_MIN, ZOOM_MAX); viewpoint->setZoom(zoom); View::update(); } void RGLView::captureLost() { if (drag) { (this->*ButtonEndFunc[drag-1])(); drag = 0; } } ////////////////////////////////////////////////////////////////////////////// // // INTERACTIVE FEATURE // adjustDirection // // // FUNCTION // screenToPolar // // DESCRIPTION // screen space is the same as in OpenGL, starting 0,0 at left/bottom(!) // static PolarCoord screenToPolar(int width, int height, int mouseX, int mouseY) { float cubelen, cx,cy,dx,dy,r; cubelen = (float) getMin(width,height); r = cubelen * 0.5f; cx = ((float)width) * 0.5f; cy = ((float)height) * 0.5f; dx = ((float)mouseX) - cx; dy = ((float)mouseY) - cy; // // dx,dy = distance to center in pixels // dx = clamp(dx, -r,r); dy = clamp(dy, -r,r); // // sin theta = dx / r // sin phi = dy / r // // phi = arc sin ( sin theta ) // theta = arc sin ( sin phi ) // return PolarCoord( math::rad2deg( math::asin( dx/r ) ), math::rad2deg( math::asin( dy/r ) ) ); } static Vertex screenToVector(int width, int height, int mouseX, int mouseY) { float radius = (float) getMax(width, height) * 0.5f; float cx = ((float)width) * 0.5f; float cy = ((float)height) * 0.5f; float x = (((float)mouseX) - cx)/radius; float y = (((float)mouseY) - cy)/radius; // Make unit vector float len = sqrt(x*x + y*y); if (len > 1.0e-6) { x = x/len; y = y/len; } // Find length to first edge float maxlen = math::sqrt(2.0f); // zero length is vertical, max length is horizontal float angle = (maxlen - len)/maxlen*math::pi()/2.0f; float z = math::sin(angle); // renorm to unit length len = math::sqrt(1.0f - z*z); x = x*len; y = y*len; return Vertex(x, y, z); } void RGLView::trackballBegin(int mouseX, int mouseY) { rotBase = screenToVector(width,height,mouseX,height-mouseY); } void RGLView::trackballUpdate(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); rotCurrent = screenToVector(width,height,mouseX,height-mouseY); if (windowImpl->beginGL()) { viewpoint->updateMouseMatrix(rotBase,rotCurrent); windowImpl->endGL(); View::update(); } } void RGLView::trackballEnd() { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->mergeMouseMatrix(); } void RGLView::oneAxisBegin(int mouseX, int mouseY) { rotBase = screenToVector(width,height,mouseX,height/2); } void RGLView::oneAxisUpdate(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); rotCurrent = screenToVector(width,height,mouseX,height/2); if (windowImpl->beginGL()) { viewpoint->mouseOneAxis(rotBase,rotCurrent,axis[drag-1]); windowImpl->endGL(); View::update(); } } void RGLView::polarBegin(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); camBase = viewpoint->getPosition(); dragBase = screenToPolar(width,height,mouseX,height-mouseY); } void RGLView::polarUpdate(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); dragCurrent = screenToPolar(width,height,mouseX,height-mouseY); PolarCoord newpos = camBase - ( dragCurrent - dragBase ); newpos.phi = clamp( newpos.phi, -90.0f, 90.0f ); viewpoint->setPosition( newpos ); View::update(); } void RGLView::polarEnd() { // Viewpoint* viewpoint = scene->getViewpoint(); // viewpoint->mergeMouseMatrix(); } ////////////////////////////////////////////////////////////////////////////// // // INTERACTIVE FEATURE // adjustFOV // void RGLView::adjustFOVBegin(int mouseX, int mouseY) { fovBaseY = mouseY; } void RGLView::adjustFOVUpdate(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); int dy = mouseY - fovBaseY; float py = ((float)dy/(float)height) * 180.0f; viewpoint->setFOV( viewpoint->getFOV() + py ); View::update(); fovBaseY = mouseY; } void RGLView::adjustFOVEnd() { } ////////////////////////////////////////////////////////////////////////////// // // INTERACTIVE FEATURE // user callback // void RGLView::userBegin(int mouseX, int mouseY) { int ind = drag - 1; activeButton = drag; if (beginCallback[ind]) { busy = true; (*beginCallback[ind])(userData[3*ind+0], mouseX, mouseY); busy = false; } } void RGLView::userUpdate(int mouseX, int mouseY) { int ind = activeButton - 1; if (!busy && updateCallback[ind]) { busy = true; (*updateCallback[ind])(userData[3*ind+1], mouseX, mouseY); busy = false; } } void RGLView::userEnd() { int ind = activeButton - 1; if (endCallback[ind]) (*endCallback[ind])(userData[3*ind+2]); } ////////////////////////////////////////////////////////////////////////////// // // INTERACTIVE FEATURE // adjustZoom // void RGLView::adjustZoomBegin(int mouseX, int mouseY) { zoomBaseY = mouseY; } void RGLView::adjustZoomUpdate(int mouseX, int mouseY) { Viewpoint* viewpoint = scene->getViewpoint(); int dy = mouseY - zoomBaseY; float zoom = clamp ( viewpoint->getZoom() * exp(-dy*ZOOM_PIXELLOGSTEP), ZOOM_MIN, ZOOM_MAX); viewpoint->setZoom(zoom); View::update(); zoomBaseY = mouseY; } void RGLView::adjustZoomEnd() { } // // snapshot // bool RGLView::snapshot(PixmapFileFormatID formatID, const char* filename) { bool success = false; if ( (formatID < PIXMAP_FILEFORMAT_LAST) && (pixmapFormat[formatID])) { if ( windowImpl->beginGL() ) { // alloc pixmap memory Pixmap snapshot; snapshot.init(RGB24, width, height, 8); // read front buffer glPushAttrib(GL_PIXEL_MODE_BIT); glReadBuffer(GL_FRONT); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0,0,width,height,GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) snapshot.data); glPopAttrib(); success = snapshot.save( pixmapFormat[formatID], filename ); windowImpl->endGL(); } } else error("pixmap save format not supported in this build"); return success; } bool RGLView::pixels( int* ll, int* size, int component, float* result ) { bool success = false; GLenum format[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_DEPTH_COMPONENT, GL_LUMINANCE}; if ( windowImpl->beginGL() ) { glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); // read front buffer glPushAttrib(GL_PIXEL_MODE_BIT); glReadBuffer(GL_FRONT); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(ll[0],ll[1],size[0],size[1],format[component], GL_FLOAT, (GLvoid*) result); glPopAttrib(); success = true; windowImpl->endGL(); } return success; } void RGLView::setMouseMode(int button, MouseModeID mode) { int index = button-1; mouseMode[index] = mode; switch (mode) { case mmTRACKBALL: ButtonBeginFunc[index] = &RGLView::trackballBegin; ButtonUpdateFunc[index] = &RGLView::trackballUpdate; ButtonEndFunc[index] = &RGLView::trackballEnd; break; case mmXAXIS: case mmYAXIS: case mmZAXIS: ButtonBeginFunc[index] = &RGLView::oneAxisBegin; ButtonUpdateFunc[index] = &RGLView::oneAxisUpdate; ButtonEndFunc[index] = &RGLView::trackballEnd; // No need for separate function if (mode == mmXAXIS) axis[index] = Vertex(1,0,0); else if (mode == mmYAXIS) axis[index] = Vertex(0,1,0); else axis[index] = Vertex(0,0,1); break; case mmPOLAR: ButtonBeginFunc[index] = &RGLView::polarBegin; ButtonUpdateFunc[index] = &RGLView::polarUpdate; ButtonEndFunc[index] = &RGLView::polarEnd; break; case mmSELECTING: ButtonBeginFunc[index] = &RGLView::mouseSelectionBegin; ButtonUpdateFunc[index] = &RGLView::mouseSelectionUpdate; ButtonEndFunc[index] = &RGLView::mouseSelectionEnd; break; case mmZOOM: ButtonBeginFunc[index] = &RGLView::adjustZoomBegin; ButtonUpdateFunc[index] = &RGLView::adjustZoomUpdate; ButtonEndFunc[index] = &RGLView::adjustZoomEnd; break; case mmFOV: ButtonBeginFunc[index] = &RGLView::adjustFOVBegin; ButtonUpdateFunc[index] = &RGLView::adjustFOVUpdate; ButtonEndFunc[index] = &RGLView::adjustFOVEnd; break; case mmUSER: ButtonBeginFunc[index] = &RGLView::userBegin; ButtonUpdateFunc[index] = &RGLView::userUpdate; ButtonEndFunc[index] = &RGLView::userEnd; break; } } void RGLView::setMouseCallbacks(int button, userControlPtr begin, userControlPtr update, userControlEndPtr end, userCleanupPtr cleanup, void** user) { if (drag) captureLost(); int ind = button - 1; if (cleanupCallback[ind]) (*cleanupCallback[ind])(userData + 3*ind); beginCallback[ind] = begin; updateCallback[ind] = update; endCallback[ind] = end; cleanupCallback[ind] = cleanup; userData[3*ind + 0] = *(user++); userData[3*ind + 1] = *(user++); userData[3*ind + 2] = *user; setMouseMode(button, mmUSER); } void RGLView::getMouseCallbacks(int button, userControlPtr *begin, userControlPtr *update, userControlEndPtr *end, userCleanupPtr *cleanup, void** user) { int ind = button - 1; *begin = beginCallback[ind]; *update = updateCallback[ind]; *end = endCallback[ind]; *cleanup = cleanupCallback[ind]; *(user++) = userData[3*ind + 0]; *(user++) = userData[3*ind + 1]; *(user++) = userData[3*ind + 2]; } MouseModeID RGLView::getMouseMode(int button) { return mouseMode[button-1]; } MouseSelectionID RGLView::getSelectState() { return selectState; } void RGLView::setSelectState(MouseSelectionID state) { selectState = state; } double* RGLView::getMousePosition() { return mousePosition; } ////////////////////////////////////////////////////////////////////////////// // // INTERACTIVE FEATURE // mouseSelection // void RGLView::mouseSelectionBegin(int mouseX,int mouseY) { if (selectState == msABORT) return; mousePosition[0] = (float)mouseX/(float)width; mousePosition[1] = (float)(height - mouseY)/(float)height; mousePosition[2] = mousePosition[0]; mousePosition[3] = mousePosition[1]; selectState = msCHANGING; } void RGLView::mouseSelectionUpdate(int mouseX,int mouseY) { mousePosition[2] = (float)mouseX/(float)width; mousePosition[3] = (float)(height - mouseY)/(float)height; View::update(); } void RGLView::mouseSelectionEnd() { if (selectState == msABORT) return; selectState = msDONE; View::update(); } void RGLView::getUserMatrix(double* dest) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->getUserMatrix(dest); } void RGLView::setUserMatrix(double* src) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->setUserMatrix(src); View::update(); } void RGLView::getScale(double* dest) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->getScale(dest); } void RGLView::setScale(double* src) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->setScale(src); View::update(); } void RGLView::setDefaultFont(const char* family, int style, double cex, bool useFreeType) { GLFont* font = View::windowImpl->getFont(family, style, cex, useFreeType); if (!font) error("font not available"); renderContext.font = font; } const char* RGLView::getFontFamily() const { if (!renderContext.font) error("font not available"); return renderContext.font->family; } void RGLView::setFontFamily(const char *family) { setDefaultFont(family, getFontStyle(), getFontCex(), getFontUseFreeType()); } int RGLView::getFontStyle() const { if (!renderContext.font) error("font not available"); return renderContext.font->style; } void RGLView::setFontStyle(int style) { setDefaultFont(getFontFamily(), style, getFontCex(), getFontUseFreeType()); } double RGLView::getFontCex() const { if (!renderContext.font) error("font not available"); return renderContext.font->cex; } void RGLView::setFontCex(double cex) { setDefaultFont(getFontFamily(), getFontStyle(), cex, getFontUseFreeType()); } const char* RGLView::getFontname() const { if (!renderContext.font) error("font not available"); return renderContext.font->fontname; } bool RGLView::getFontUseFreeType() const { if (!renderContext.font) error("font not available"); return renderContext.font->useFreeType; } void RGLView::setFontUseFreeType(bool useFreeType) { setDefaultFont(getFontFamily(), getFontStyle(), getFontCex(), useFreeType); } void RGLView::getPosition(double* dest) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->getPosition(dest); } void RGLView::setPosition(double* src) { Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->setPosition(src); } void RGLView::setDefaultMouseFunc() { setMouseMode(1, mmPOLAR); setMouseMode(2, mmFOV); setMouseMode(3, mmZOOM); } bool RGLView::postscript(int formatID, const char* filename, bool drawText) { bool success = false; std::FILE *fp = fopen(filename, "wb"); char *oldlocale = setlocale(LC_NUMERIC, "C"); GLint buffsize = 0, state = GL2PS_OVERFLOW; GLint vp[4]; GLint options = GL2PS_SILENT | GL2PS_SIMPLE_LINE_OFFSET | GL2PS_NO_BLENDING | GL2PS_OCCLUSION_CULL | GL2PS_BEST_ROOT; if (!drawText) options |= GL2PS_NO_TEXT; if (windowImpl->beginGL()) { glGetIntegerv(GL_VIEWPORT, vp); while( state == GL2PS_OVERFLOW ){ buffsize += 1024*1024; gl2psBeginPage ( filename, "Generated by rgl", vp, formatID, GL2PS_BSP_SORT, options, GL_RGBA, 0, NULL, 0, 0, 0, buffsize, fp, filename ); if ( drawText ) { // signal gl2ps for text scene->invalidateDisplaylists(); if (formatID == GL2PS_PS || formatID == GL2PS_EPS || formatID == GL2PS_TEX || formatID == GL2PS_PGF) renderContext.gl2psActive = GL2PS_POSITIONAL; else renderContext.gl2psActive = GL2PS_LEFT_ONLY; } // redraw: scene->render(&renderContext); glFinish(); if ( drawText ) { scene->invalidateDisplaylists(); renderContext.gl2psActive = GL2PS_NONE; } success = true; state = gl2psEndPage(); } windowImpl->endGL(); } setlocale(LC_NUMERIC, oldlocale); fclose(fp); return success; } rgl/src/Disposable.hpp0000644000176000001440000000240512262005772014457 0ustar ripleyusers#ifndef RGL_DISPOSABLE_HPP #define RGL_DISPOSABLE_HPP #include namespace rgl { // forward declaration class Disposable; /** * Dispose Listener Interface. **/ struct IDisposeListener { virtual ~IDisposeListener() { } virtual void notifyDisposed(Disposable* disposing) = 0; }; /** * Disposable objects can be disposed autonomous while * they might be managed by a different Subject. * They allow for registering listeners that will be notified when * the object becomes disposed. **/ class Disposable { public: /** * register listener. It is not allowed to add the listener * if it is already registered. * * @arg l listener to be added to list **/ void addDisposeListener(IDisposeListener* l); /** * unregister listener. * @arg l listener to be removed **/ void removeDisposeListener(IDisposeListener* l); /** * dispose object. * Default implementatin will fire NotifyDisposed. **/ void dispose(); protected: /** * fires 'notifyDisposed' on all registered listeners. * It is save to call add/remove during 'notifyDisposed'. **/ void fireNotifyDisposed(); private: typedef std::vector Container; Container disposeListeners; }; } // namespace rgl #endif // RGL_DISPOSABLE_HPP rgl/src/scene.h0000644000176000001440000000742212262026246013132 0ustar ripleyusers#ifndef SCENE_HPP #define SCENE_HPP // C++ header file // This file is part of RGL // // $Id: scene.h 987 2013-10-26 14:07:14Z murdoch $ #include #include "types.h" #include "SceneNode.hpp" #include "geom.hpp" #include "String.hpp" #include "Color.hpp" #include "Texture.hpp" #include "Material.hpp" #include "Light.hpp" #include "Shape.hpp" #include "PrimitiveSet.hpp" #include "TextSet.hpp" #include "SpriteSet.hpp" #include "SphereSet.hpp" #include "PlaneSet.hpp" #include "ClipPlane.hpp" #include "ABCLineSet.hpp" #include "Surface.hpp" #include "Viewpoint.hpp" #include "Background.hpp" #include "BBoxDeco.hpp" namespace rgl { class Scene { public: Scene(); ~Scene(); // ---[ client services ]--------------------------------------------------- /** * remove all nodes of the given type. **/ bool clear(TypeID stackTypeID); /** * add node to scene **/ bool add(SceneNode* node); /** * remove specified node of given type, or last-added if id==0 **/ bool pop(TypeID stackTypeID, int id, bool destroy = true); /** * get information about stacks */ int get_id_count(TypeID type); void get_ids(TypeID type, int* ids, char** types); /** * get a SceneNode of any type */ SceneNode* get_scenenode(int id, bool recursive = false); /** * get information about particular shapes **/ Shape* get_shape(int id, bool recursive = false); /** * get information about particular lights **/ Light* get_light(int id); /** * get the background */ Background* get_background() const { return background; } /** * get the bbox */ BBoxDeco* get_bboxdeco() const { return bboxDeco; } // ---[ grouping component ]----------------------------------------------- /** * obtain scene's axis-aligned bounding box. **/ const AABox& getBoundingBox(); // ---[ Renderable interface ]--------------------------------------------- /** * TODO: implements Renderable **/ void render(RenderContext* renderContext); // ---[ bindable component ]----------------------------------------------- /** * obtain bounded viewpoint **/ Viewpoint* getViewpoint(); /** * Get and set flag to ignore elements in bounding box **/ int getIgnoreExtent(void); void setIgnoreExtent(int in_ignoreExtent); /** * invalidate display lists so objects will be rendered again **/ void invalidateDisplaylists(); private: // ---[ Renderable implementation ]---------------------------------------- /** * sub-pass: setup global lighting model **/ void setupLightModel(RenderContext* renderContext, const Sphere& viewSphere); /** * compute bounding-box **/ void calcDataBBox(); /** * add shapes **/ void addShape(Shape* shape); // ---[ bounded slots ]---------------------------------------------------- /** * bounded background **/ Background* background; /** * bounded viewpoint **/ Viewpoint* viewpoint; /** * bounded decorator **/ BBoxDeco* bboxDeco; // ---[ stacks ]----------------------------------------------------------- /** * number of lights **/ int nlights; /** * list of light sources **/ std::vector lights; /** * list of shapes **/ std::vector shapes; std::vector unsortedShapes; std::vector zsortShapes; std::vector clipPlanes; void renderZsort(RenderContext* renderContext); void deleteAll(std::vector list); void deleteShapes(); void deleteLights(); // ---[ grouping data ]---------------------------------------------------- /** * bounding box of overall scene **/ AABox data_bbox; bool ignoreExtent; bool bboxChanges; }; } // namespace rgl #endif /* SCENE_HPP */ rgl/src/api.cpp0000644000176000001440000010462512262026246013144 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: api.cpp 988 2013-10-26 14:58:27Z murdoch $ #include "lib.hpp" #include "DeviceManager.hpp" #include "rglview.h" #include "lib.hpp" #include "R.h" #include "api.h" using namespace rgl; // // API Success is encoded as integer type: // #define RGL_FAIL 0 #define RGL_SUCCESS 1 inline int as_success(int b) { return (b) ; } // // data type conversion utilities: // inline bool as_bool(int idata) { return (idata) ? true : false; } // // rgl::rgl_init moved to init.cpp // namespace rgl { extern DeviceManager* deviceManager; } // // FUNCTION // rgl::rgl_quit // // DESCRIPTION // Gets called by .onUnload ( R function ) // void rgl::rgl_quit(int* successptr) { if (deviceManager) { delete deviceManager; deviceManager = 0; } quit(); *successptr = RGL_SUCCESS; } // // FUNCTION // rgl::rgl_dev_open // void rgl::rgl_dev_open(int* successptr, int* useNULL) { *successptr = as_success( deviceManager && deviceManager->openDevice(*useNULL) ); CHECKGLERROR; } // // FUNCTION // rgl::rgl_dev_close // void rgl::rgl_dev_close(int* successptr) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->close(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_dev_bringtotop(int* successptr, int* stay) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->bringToTop(*stay); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } // // FUNCTION // rgl::rgl_dev_getcurrent // // RETURNS // device id // SEXP rgl::rgl_dev_getcurrent(void) { SEXP result; if (deviceManager) { int id = deviceManager->getCurrent(); PROTECT(result = ScalarInteger(id)); if (id) { PROTECT(result = namesgets(result, ScalarString(mkChar(deviceManager->getDevice(id)->getDevtype())))); CHECKGLERROR; UNPROTECT(1); } UNPROTECT(1); return result; } return ScalarInteger(0); } // // FUNCTION // rgl::rgl_dev_list // // RETURNS // list of active device ids // SEXP rgl::rgl_dev_list(void) { SEXP result, names; if (deviceManager) { int n = deviceManager->getDeviceCount(); PROTECT(result = allocVector(INTSXP, n)); deviceManager->getDeviceIds(INTEGER(result), n); PROTECT(names = allocVector(STRSXP, n)); for (int i = 0; i < n; i++) { Device* device = deviceManager->getDevice(INTEGER(result)[i]); SET_STRING_ELT(names, i, mkChar(device->getDevtype())); } PROTECT(result = namesgets(result, names)); CHECKGLERROR; UNPROTECT(3); return result; } return allocVector(INTSXP, 0); } // // FUNCTION // rgl::rgl_dev_setcurrent // // PARAMETERS // idata // [0] device id // void rgl::rgl_dev_setcurrent(int* successptr, int* idata) { int id = idata[0]; bool silent = (bool) idata[1]; *successptr = as_success ( deviceManager && deviceManager->setCurrent(id, silent) ); CHECKGLERROR; } // // SCENE MANAGEMENT // static Material currentMaterial(Color(1.0f,1.0f,1.0f),Color(1.0f,0.0f,0.0f)); // // FUNCTION // rgl::rgl_clear ( successPtr, idata(type) ) // // PARAMETERS // idata // [0] count of types // [1], [2], ... TypeID 1, 2, ... // // void rgl::rgl_clear(int* successptr, int *idata) { int success = RGL_SUCCESS; Device* device; int num = idata[0]; if (deviceManager && (device = deviceManager->getAnyDevice())) { for (int i=1; success && i<=num; i++) { TypeID stackTypeID = (TypeID) idata[i]; success = as_success( device->clear( stackTypeID ) ); // viewpoint & material handled in R, background ignored } CHECKGLERROR; } *successptr = success; } // // FUNCTION // rgl::rgl_pop ( successPtr, idata ) // // PARAMETERS // idata // [0] stack TypeID // [1] id SceneNode identifier // // void rgl::rgl_pop(int* successptr, int* idata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { TypeID stackTypeID = (TypeID) idata[0]; int id = idata[1]; success = as_success( device->pop( stackTypeID, id ) ); CHECKGLERROR; } *successptr = success; } // // FUNCTION // rgl::rgl_id_count // void rgl::rgl_id_count(int* type, int* count) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); *count = 0; while (*type) { *count += scene->get_id_count((TypeID) *type); type++; } CHECKGLERROR; } else { *count = 0; } } // // FUNCTION // rgl::rgl_ids // void rgl::rgl_ids(int* type, int* ids, char** types) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); while (*type) { int n = scene->get_id_count((TypeID) *type); scene->get_ids((TypeID) *type, ids, types); ids += n; types += n; type++; } CHECKGLERROR; } } // // FUNCTION // rgl::rgl_attrib_count // void rgl::rgl_attrib_count(int* id, int* attrib, int* count) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); AABox bbox = scene->getBoundingBox(); SceneNode* scenenode = scene->get_scenenode(*id, true); if ( scenenode ) *count = scenenode->getAttributeCount(bbox, *attrib); else *count = 0; } } // // FUNCTION // rgl::rgl_attrib // void rgl::rgl_attrib(int* id, int* attrib, int* first, int* count, double* result) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); AABox bbox = scene->getBoundingBox(); SceneNode* scenenode = scene->get_scenenode(*id, true); if ( scenenode ) scenenode->getAttribute(bbox, *attrib, *first, *count, result); } } // // FUNCTION // rgl::rgl_text_attrib // void rgl::rgl_text_attrib(int* id, int* attrib, int* first, int* count, char** result) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); AABox bbox = scene->getBoundingBox(); SceneNode* scenenode = scene->get_scenenode(*id, true); if (scenenode) for (int i=0; i < *count; i++) { String s = scenenode->getTextAttribute(bbox, *attrib, i + *first); if (s.length) { *result = R_alloc(s.length + 1, 1); strncpy(*result, s.text, s.length); (*result)[s.length] = '\0'; } result++; } } } // // FUNCTION // rgl::rgl_bg ( successPtr, idata ) // // PARAMETERS // idata // [0] bool environment sphere // [1] int fogtype // void rgl::rgl_bg(int* successptr, int* idata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { bool sphere = as_bool( idata[0] ); int fogtype = idata[1]; success = as_success( device->add( new Background(currentMaterial, sphere, fogtype) ) ); CHECKGLERROR; } *successptr = success; } // // FUNCTION // rgl::rgl_light ( successPtr, idata, cdata, ddata ) // void rgl::rgl_light ( int* successptr, int* idata, double* ddata ) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { bool viewpoint_rel = as_bool( idata[0] ); bool finite_pos = as_bool( idata[10] ); Color ambient; Color diffuse; Color specular; ambient.set3iv ( &idata[1] ); diffuse.set3iv ( &idata[4] ); specular.set3iv( &idata[7] ); float theta = (float) ddata[0]; float phi = (float) ddata[1]; Vertex finposition = Vertex( ddata[2], ddata[3], ddata[4] ); success = as_success( device->add( new Light( PolarCoord(theta, phi), finposition, (bool) viewpoint_rel, (bool) finite_pos, ambient, diffuse, specular ) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_viewpoint(int* successptr, int* idata, double* ddata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { float theta = static_cast( ddata[0] ); float phi = static_cast( ddata[1] ); float fov = static_cast( ddata[2] ); float zoom = static_cast( ddata[3] ); Vertex scale = Vertex( ddata[4], ddata[5], ddata[6] ); int interactive = idata[0]; int polar = idata[1]; if (polar) success = as_success( device->add( new Viewpoint(PolarCoord(theta, phi), fov, zoom, scale, interactive) ) ); else success = as_success( device->add( new Viewpoint(ddata + 7, fov, zoom, scale, interactive) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_getZoom(int* successptr, double* zoom) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); Viewpoint* viewpoint = scene->getViewpoint(); *zoom = viewpoint->getZoom(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setZoom(int* successptr, double* zoom) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->setZoom( *zoom ); rglview->update(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getFOV(int* successptr, double* fov) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); Viewpoint* viewpoint = scene->getViewpoint(); *fov = viewpoint->getFOV(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setFOV(int* successptr, double* fov) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); Viewpoint* viewpoint = scene->getViewpoint(); viewpoint->setFOV(*fov); rglview->update(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getIgnoreExtent(int* successptr, int* ignoreExtent) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { *ignoreExtent = device->getIgnoreExtent(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setIgnoreExtent(int* successptr, int* ignoreExtent) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { device->setIgnoreExtent(*ignoreExtent); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getSkipRedraw(int* successptr, int* skipRedraw) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { *skipRedraw = device->getSkipRedraw(); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setSkipRedraw(int* successptr, int* skipRedraw) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { device->setSkipRedraw(*skipRedraw); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_primitive(int* successptr, int* idata, double* vertex, double* normals, double* texcoords) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int type = idata[0]; int nvertex = idata[1]; int ignoreExtent = device->getIgnoreExtent(); int useNormals = idata[2]; int useTexcoords = idata[3]; SceneNode* node; switch(type) { case 1: // RGL_POINTS: node = new PointSet( currentMaterial, nvertex, vertex, ignoreExtent); break; case 2: // RGL_LINES: node = new LineSet( currentMaterial, nvertex, vertex, ignoreExtent); break; case 3: // RGL_TRIANGLES: node = new TriangleSet( currentMaterial, nvertex, vertex, normals, texcoords, ignoreExtent, useNormals, useTexcoords); break; case 4: // RGL_QUADS: node = new QuadSet( currentMaterial, nvertex, vertex, normals, texcoords, ignoreExtent, useNormals, useTexcoords); break; case 5: // RGL_LINE_STRIP: node = new LineStripSet( currentMaterial, nvertex, vertex, ignoreExtent); break; default: node = NULL; } if (node) { success = as_success( device->add( node ) ); if (!success) delete node; } CHECKGLERROR; } *successptr = success; } void rgl::rgl_surface(int* successptr, int* idata, double* x, double* z, double* y, double* normal_x, double* normal_z, double* normal_y, double* texture_s, double* texture_t, int* coords, int* orientation, int* flags) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nx = idata[0]; int nz = idata[1]; success = as_success( device->add( new Surface(currentMaterial, nx, nz, x, z, y, normal_x, normal_z, normal_y, texture_s, texture_t, coords, *orientation, flags, device->getIgnoreExtent()) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_spheres(int* successptr, int* idata, double* vertex, double* radius) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nvertex = idata[0]; int nradius = idata[1]; success = as_success( device->add( new SphereSet(currentMaterial, nvertex, vertex, nradius, radius, device->getIgnoreExtent()) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_planes(int* successptr, int* idata, double* normals, double* offsets) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nnormal = idata[0]; int noffset = idata[1]; success = as_success( device->add( new PlaneSet(currentMaterial, nnormal, normals, noffset, offsets) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_clipplanes(int* successptr, int* idata, double* normals, double* offsets) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nnormal = idata[0]; int noffset = idata[1]; success = as_success( device->add( new ClipPlaneSet(currentMaterial, nnormal, normals, noffset, offsets) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_abclines(int* successptr, int* idata, double* bases, double* directions) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nbases = idata[0]; int ndirs = idata[1]; success = as_success( device->add( new ABCLineSet(currentMaterial, nbases, bases, ndirs, directions) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_sprites(int* successptr, int* idata, double* vertex, double* radius, int* shapes, double* userMatrix) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int nvertex = idata[0]; int nradius = idata[1]; int nshapes = idata[2]; int count = 0; Shape** shapelist; if (nshapes) { shapelist = (Shape**) R_alloc(nshapes, sizeof(Shape*)); RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); while (nshapes) { int id = *(shapes++); nshapes--; Shape* shape = scene->get_shape(id); if (shape) { scene->pop(SHAPE, id, false); shapelist[count++] = shape; } } if (!count) { *successptr = RGL_FAIL; return; } } else shapelist = NULL; success = as_success( device->add( new SpriteSet(currentMaterial, nvertex, vertex, nradius, radius, device->getIgnoreExtent(), count, shapelist, userMatrix) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_material(int *successptr, int* idata, char** cdata, double* ddata) { Material& mat = currentMaterial; int ncolor = idata[0]; mat.lit = (idata[1]) ? true : false; mat.smooth = (idata[2]) ? true : false; mat.front = (Material::PolygonMode) idata[3]; mat.back = (Material::PolygonMode) idata[4]; mat.fog = (idata[5]) ? true : false; Texture::Type textype = (Texture::Type) idata[6]; bool mipmap = (idata[7]) ? true : false; int minfilter = idata[8]; int magfilter = idata[9]; int nalpha = idata[10]; mat.ambient.set3iv( &idata[11] ); mat.specular.set3iv( &idata[14] ); mat.emission.set3iv( &idata[17] ); bool envmap = (idata[20]) ? true : false; mat.point_antialias = (idata[21]) ? true : false; mat.line_antialias = (idata[22]) ? true : false; mat.depth_mask = (idata[23]) ? true : false; mat.depth_test = idata[24]; int* colors = &idata[25]; char* pixmapfn = cdata[0]; mat.shininess = (float) ddata[0]; mat.size = (float) ddata[1]; mat.lwd = (float) ddata[2]; double* alpha = &ddata[3]; mat.alphablend = false; if ( strlen(pixmapfn) > 0 ) { mat.texture = new Texture(pixmapfn, textype, mipmap, (unsigned int) minfilter, (unsigned int) magfilter, envmap); if ( !mat.texture->isValid() ) { mat.texture->unref(); // delete mat.texture; mat.texture = NULL; } else mat.alphablend = mat.alphablend || mat.texture->hasAlpha(); } else mat.texture = NULL; mat.colors.set( ncolor, colors, nalpha, alpha); mat.alphablend = mat.alphablend || mat.colors.hasAlpha(); CHECKGLERROR; *successptr = RGL_SUCCESS; } void rgl::rgl_getcolorcount(int* count) { *count = currentMaterial.colors.getLength(); CHECKGLERROR; } void rgl::rgl_getmaterial(int *successptr, int *id, int* idata, char** cdata, double* ddata) { Material* mat = ¤tMaterial; unsigned int i,j; if (*id > 0) { Device* device; *successptr = RGL_FAIL; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); Scene* scene = rglview->getScene(); Shape* shape = scene->get_shape(*id, true); if (shape) mat = shape->getMaterial(); /* success! successptr will be set below */ else { BBoxDeco* bboxdeco = scene->get_bboxdeco(); if (bboxdeco && *id == bboxdeco->getObjID()) mat = bboxdeco->getMaterial(); else { Background* background = scene->get_background(); if (background && *id == background->getObjID()) mat = background->getMaterial(); else return; } } } else return; } idata[1] = mat->lit ? 1 : 0; idata[2] = mat->smooth ? 1 : 0; idata[3] = (int) mat->front; idata[4] = (int) mat->back; idata[5] = mat->fog ? 1 : 0; if (mat->texture) { mat->texture->getParameters( (Texture::Type*) (idata + 6), (bool*) (idata + 7), (unsigned int*) (idata + 8), (unsigned int*) (idata + 9), (bool*) (idata + 20), strlen(cdata[0]), cdata[0] ); } else { idata[6] = 4; /* mat.texture.type; */ idata[7] = 0; /* mat.texture.mipmap ? 1 : 0; */ idata[8] = 1; /* mat.texture.minfilter; */ idata[9] = 1; /* mat.texture.magfilter; */ idata[20] = 0; /* mat.texture.envmap ? 1 : 0; */ cdata[0][0] = '\0'; } idata[11] = (int) mat->ambient.getRedub(); idata[12] = (int) mat->ambient.getGreenub(); idata[13] = (int) mat->ambient.getBlueub(); idata[14] = (int) mat->specular.getRedub(); idata[15] = (int) mat->specular.getGreenub(); idata[16] = (int) mat->specular.getBlueub(); idata[17] = (int) mat->emission.getRedub(); idata[18] = (int) mat->emission.getGreenub(); idata[19] = (int) mat->emission.getBlueub(); idata[21] = mat->point_antialias ? 1 : 0; idata[22] = mat->line_antialias ? 1 : 0; idata[23] = mat->depth_mask ? 1 : 0; idata[24] = mat->depth_test; for (i=0, j=25; (i < mat->colors.getLength()) && (i < (unsigned int)idata[0]); i++) { idata[j++] = (int) mat->colors.getColor(i).getRedub(); idata[j++] = (int) mat->colors.getColor(i).getGreenub(); idata[j++] = (int) mat->colors.getColor(i).getBlueub(); } idata[0] = i; ddata[0] = (double) mat->shininess; ddata[1] = (double) mat->size; ddata[2] = (double) mat->lwd; if (mat->colors.hasAlpha()) { for (i=0, j=3; (i < mat->colors.getLength()) && (i < (unsigned int)idata[10]); i++) ddata[j++] = (double) mat->colors.getColor(i).getAlphaf(); idata[10] = i; } else idata[10] = 0; CHECKGLERROR; *successptr = RGL_SUCCESS; } void rgl::rgl_texts(int* successptr, int* idata, double* adj, char** text, double* vertex, int* nfonts, char** family, int* style, double* cex, int* useFreeType) { int success = RGL_FAIL; Device* device; #ifndef HAVE_FREETYPE if (*useFreeType) error("FreeType not supported in this build"); #endif if (deviceManager && (device = deviceManager->getAnyDevice())) { int ntext = idata[0]; FontArray fonts; device->getFonts(fonts, *nfonts, family, style, cex, (bool) *useFreeType); success = as_success( device->add( new TextSet(currentMaterial, ntext, text, vertex, adj[0], adj[1], device->getIgnoreExtent(), fonts) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_bbox(int* successptr, int* idata, double* ddata, double* xat, char** xtext, double* yat, char** ytext, double* zat, char** ztext) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int xticks = idata[0]; int yticks = idata[1]; int zticks = idata[2]; int xlen = idata[3]; int ylen = idata[4]; int zlen = idata[5]; int marklen_rel = idata[6]; int front = idata[7]; float xunit = (float) ddata[0]; float yunit = (float) ddata[1]; float zunit = (float) ddata[2]; float marklen = (float) ddata[3]; float expand = (float) ddata[4]; AxisInfo xaxis(xticks, xat, xtext, xlen, xunit); AxisInfo yaxis(yticks, yat, ytext, ylen, yunit); AxisInfo zaxis(zticks, zat, ztext, zlen, zunit); success = as_success( device->add( new BBoxDeco(currentMaterial, xaxis, yaxis, zaxis, marklen, (bool) marklen_rel, expand, (bool)front ) ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_snapshot(int* successptr, int* idata, char** cdata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { int format = idata[0]; char* filename = cdata[0]; success = as_success( device->snapshot( format, filename ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_pixels(int* successptr, int* ll, int* size, int* component, float* result) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { success = as_success( device->pixels( ll, size, *component, result) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_user2window(int* successptr, int* idata, double* point, double* pixel, double* model, double* proj, int* view) { int success = RGL_FAIL; GLdouble* vertex = pixel; int columns = idata[0]; GLint viewport[4]; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { for (int i=0; i<4; i++) viewport[i] = view[i]; for (int i=0; igetAnyDevice())) { for (int i=0; i<4; i++) viewport[i] = view[i]; for (int i=0; igetAnyDevice())) { RGLView* rglview = device->getRGLView(); *mode = static_cast( rglview->getMouseMode(*button) ); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setMouseMode(int* successptr, int* button, int* mode) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); rglview->setMouseMode(*button, (MouseModeID)(*mode)); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_selectstate(int* successptr, int* selectstate, double* locations) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); selectstate[0] = (int)rglview->getSelectState(); double* mousePosition = rglview->getMousePosition(); locations[0] = *mousePosition; locations[1] = *(mousePosition+1); locations[2] = *(mousePosition+2); locations[3] = *(mousePosition+3); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setselectstate(int* successptr, int *idata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { MouseSelectionID selectState = (MouseSelectionID) idata[0]; RGLView* rglview = device->getRGLView(); rglview->setSelectState(selectState); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getUserMatrix(int* successptr, double* userMatrix) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); rglview->getUserMatrix(userMatrix); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setUserMatrix(int* successptr, double* userMatrix) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); rglview->setUserMatrix(userMatrix); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getPosition(double* position) { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); rglview->getPosition(position); CHECKGLERROR; } } void rgl::rgl_setPosition(double* position) { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); rglview->setPosition(position); CHECKGLERROR; } } void rgl::rgl_getScale(int* successptr, double* scale) { int success = RGL_FAIL; Device* device = deviceManager->getAnyDevice(); if (device) { RGLView* rglview = device->getRGLView(); rglview->getScale(scale); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setScale(int* successptr, double* scale) { int success = RGL_FAIL; Device* device = deviceManager->getAnyDevice(); if (device) { RGLView* rglview = device->getRGLView(); rglview->setScale(scale); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getModelMatrix(int* successptr, double* modelMatrix) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); for (int i=0; i<16; i++) { modelMatrix[i] = rglview->modelMatrix[i]; } success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getProjMatrix(int* successptr, double* projMatrix) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); for (int i=0; i<16; i++) { projMatrix[i] = rglview->projMatrix[i]; } success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getViewport(int* successptr, int* viewport) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { RGLView* rglview = device->getRGLView(); for (int i=0; i<4; i++) { viewport[i] = rglview->viewport[i]; } success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_getWindowRect(int* successptr, int* rect) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->getWindowRect(rect, rect+1, rect+2, rect+3); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_setWindowRect(int* successptr, int* rect) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->setWindowRect(rect[0], rect[1], rect[2], rect[3]); success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } void rgl::rgl_postscript(int* successptr, int* idata, char** cdata) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { int format = idata[0]; bool drawText = (bool)idata[1]; char* filename = cdata[0]; success = as_success( device->postscript( format, filename, drawText ) ); CHECKGLERROR; } *successptr = success; } void rgl::rgl_getBoundingbox(int* successptr, double* bboxvec) { int success = RGL_FAIL; Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { const AABox& bbox = device->getScene()->getBoundingBox(); bboxvec[0] = bbox.vmin.x; bboxvec[1] = bbox.vmax.x; bboxvec[2] = bbox.vmin.y; bboxvec[3] = bbox.vmax.y; bboxvec[4] = bbox.vmin.z; bboxvec[5] = bbox.vmax.z; success = RGL_SUCCESS; CHECKGLERROR; } *successptr = success; } /* font access functions. These are only used from par3d */ char* rgl::rgl_getFamily() { Device* device; const char* f; char* result = NULL; if (deviceManager && (device = deviceManager->getAnyDevice())) { f = device->getRGLView()->getFontFamily(); result = R_alloc(strlen(f)+1, 1); strcpy(result, f); CHECKGLERROR; } return result; } bool rgl::rgl_setFamily(const char *family) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->getRGLView()->setFontFamily(family); CHECKGLERROR; return true; } else return false; } int rgl::rgl_getFont() { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int result = device->getRGLView()->getFontStyle(); CHECKGLERROR; return result; } else return -1; } bool rgl::rgl_setFont(int font) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->getRGLView()->setFontStyle(font); CHECKGLERROR; return true; } else return false; } double rgl::rgl_getCex() { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { double result = device->getRGLView()->getFontCex(); CHECKGLERROR; return result; } else return -1; } bool rgl::rgl_setCex(double cex) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->getRGLView()->setFontCex(cex); CHECKGLERROR; return true; } else return false; } int rgl::rgl_getUseFreeType() { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { int result = (int) device->getRGLView()->getFontUseFreeType(); CHECKGLERROR; return result; } else return -1; } bool rgl::rgl_setUseFreeType(bool useFreeType) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { device->getRGLView()->setFontUseFreeType(useFreeType); CHECKGLERROR; return true; } else return false; } char* rgl::rgl_getFontname() { Device* device; const char* f; char* result = NULL; if (deviceManager && (device = deviceManager->getAnyDevice())) { f = device->getRGLView()->getFontname(); result = R_alloc(strlen(f)+1, 1); strcpy(result, f); CHECKGLERROR; } return result; } int rgl::rgl_getAntialias() { Device* device; if (deviceManager && (device = deviceManager->getAnyDevice())) { WindowImpl* windowImpl = device->getRGLView()->windowImpl; if (windowImpl->beginGL()) { int result; glGetIntegerv(GL_SAMPLES, &result); windowImpl->endGL(); CHECKGLERROR; return result; } } return 1; } int rgl::rgl_getMaxClipPlanes() { int result; glGetError(); glGetIntegerv(GL_MAX_CLIP_PLANES, &result); if (glGetError() == GL_NO_ERROR) return result; else return 6; } rgl/src/opengl.hpp0000644000176000001440000000162311701644317013660 0ustar ripleyusers#ifndef RGL_OPENGL_H #define RGL_OPENGL_H // --------------------------------------------------------------------------- // Using OpenGL and GLU // // $Id: opengl.hpp 840 2012-01-06 16:07:37Z murdoch $ // --------------------------------------------------------------------------- #include "config.hpp" // --------------------------------------------------------------------------- #ifdef RGL_OSX #include #include #endif // --------------------------------------------------------------------------- #ifdef RGL_W32 #include #include #include #include #include #endif // --------------------------------------------------------------------------- #ifdef RGL_X11 #include #include #endif // --------------------------------------------------------------------------- #endif // RGL_OPENGL_HPP rgl/src/rglmath.h0000644000176000001440000002101012262026246013460 0ustar ripleyusers#ifndef RGL_MATH_H #define RGL_MATH_H // C++ header file // This file is part of RGL // // $Id: rglmath.h 976 2013-10-04 15:06:19Z murdoch $ using namespace std; #include #include #include "types.h" #ifndef M_PI #define M_PI 3.1415926535897932384626433832795 #endif namespace rgl { namespace math { // template-based math functions with default 'double' implementation using math.h template inline T acos(T x) { return static_cast( ::acos( static_cast(x) ) ); } template inline T asin(T x) { return static_cast( ::asin( static_cast(x) ) ); } template inline T atan(T x) { return static_cast( ::atan( static_cast(x) ) ); } template inline T atan2(T x, T y) { return static_cast( ::atan2( static_cast(x), static_cast(y) ) ); } template inline T cos(T x) { return static_cast( ::cos( static_cast(x) ) ); } template inline T sin(T x) { return static_cast( ::sin( static_cast(x) ) ); } #ifdef HAVE_SINF template<> inline float sin(float rad) { return ::sinf(rad); } #endif template inline T tan(T x) { return static_cast( ::tan( static_cast(x) ) ); } // template inline T acosh(T x) { return static_cast( ::acosh( static_cast(x) ) ); } // template inline T asinh(T x) { return static_cast( ::asinh( static_cast(x) ) ); } // template inline T atanh(T x) { return static_cast( ::atanh( static_cast(x) ) ); } // template inline T cosh(T x) { return static_cast( ::cosh( static_cast(x) ) ); } // template inline T sinh(T x) { return static_cast( ::sinh( static_cast(x) ) ); } // template inline T tanh(T x) { return static_cast( ::tanh( static_cast(x) ) ); } template inline T exp(T x) { return static_cast( ::exp( static_cast(x) ) ); } // template inline T exp2(T x) { return static_cast( ::exp2( static_cast(x) ) ); } // template inline T expm1(T x) { return static_cast( ::expm1( static_cast(x) ) ); } template inline T log(T x) { return static_cast( ::log( static_cast(x) ) ); } template inline T log10(T x) { return static_cast( ::log10( static_cast(x) ) ); } // template inline T log2(T x) { return static_cast( ::log2( static_cast(x) ) ); } template inline T log1p(T x) { return static_cast( ::log1p( static_cast(x) ) ); } template inline T logb(T x) { return static_cast( ::logb( static_cast(x) ) ); } template inline T modf(T x, T* y) { double i; double r = ::modf( static_cast(x), &i ); *y = static_cast(i); return static_cast(r); } template<> inline double modf(double x, double* y) { return ::modf(x,y); } //template<> inline float modf(float x, float* y) { return ::modff(x,y); } template inline T ldexp(T x, int y) { return static_cast( ::ldexp(static_cast(x),y) ); } // template inline T frexp(T x, int* y) { return static_cast( ::frexp( static_cast(x),n) ); } template inline int ilogb(T x) { return ::ilogb( static_cast(x) ); } template inline T scalbn(T x, int n) { return static_cast( ::scalbn( static_cast(x),n ) ); } template inline T fabs(T x) { return static_cast( ::fabs( static_cast(x) ) ); } template inline T cbrt(T x) { return static_cast( ::cbrt( static_cast(x) ) ); } // template inline T hypot(T x) { return static_cast( ::hypot( static_cast(x) ) ); } template inline T pow(T x, T y) { return static_cast( ::pow( static_cast(x), static_cast(y) ) ); } template inline T sqrt(T x) { return static_cast( ::sqrt( static_cast(x) ) ); } template inline T erf(T x) { return static_cast( ::erf( static_cast(x) ) ); } template inline T erfc(T x) { return static_cast( ::erfc( static_cast(x) ) ); } template inline T lgamma(T x) { return static_cast( ::lgamma( static_cast(x) ) ); } // template inline T tgamma(T x) { return static_cast( ::tgamma( static_cast(x) ) ); } template inline T ceil(T x) { return static_cast( ::ceil( static_cast(x) ) ); } template inline T floor(T x) { return static_cast( ::floor( static_cast(x) ) ); } // template inline T nearbyint(T x) { return static_cast( ::nearbyint( static_cast(x) ) ); } template inline T rint(T x) { return static_cast( ::rint( static_cast(x) ) ); } // template inline long int lrint(T x) { return ( ::lrint( static_cast(x) ) ); } // template inline long long int llrint(T x) { return ::llrint( static_cast(x) ); } // template inline T round(T x) { return static_cast( ::round( static_cast(x) ) ); } template inline T pi() { return static_cast( M_PI ); } template inline T deg2rad(T deg) { return ( pi() / T(180.0) ) * deg; } template inline T rad2deg(T rad) { return rad / ( pi() / T(180.0) ); } } // inline float deg2radf(float deg) { return ((float)(PI/180.0)) * deg; } // inline float rad2degf(float rad) { return rad / ((float)(PI/180.0)); } // inline float deg2radf(float deg) { return deg2rad(deg); } // inline float rad2degf(float rad) { return rad2deg(rad); } struct Vec3 { float x,y,z; Vec3() : x(0),y(0),z(0) { } Vec3(float in_x,float in_y, float in_z) : x(in_x), y(in_y), z(in_z) { } Vec3(const Vec3& that) : x(that.x), y(that.y), z(that.z) { } inline float getLength() const { return math::sqrt( x*x + y*y + z*z ); } void normalize(); Vec3 cross(Vec3 op2) const; float angle(const Vec3& op2) const; float operator * (Vec3 op2); Vec3 operator * (float value); Vec3 operator+(Vec3 op2) const; Vec3 operator-(Vec3 op2) const; Vec3 scale(const Vec3& op2) const; void operator+=(Vec3 op2); void rotateX(float degree); void rotateY(float degree); bool missing() const; /* Any components missing */ static inline Vec3& asVec3(float* ptr) { return *( reinterpret_cast( ptr ) ); } }; template<> inline void copy(double* from, Vec3* to, int size) { copy(from, (float*) to, size*3); } typedef Vec3 Vertex; typedef Vertex Vertex3; typedef Vertex3 Normal; struct Vec4 { float x,y,z,w; Vec4(const Normal& n, float in_w=0.0f) : x(n.x), y(n.y), z(n.z), w(in_w) {}; Vec4() {}; Vec4(const float x, const float y, const float z, const float w=1.0f); float operator * (const Vec4& op2) const; Vec4 operator * (const float value) const; Vec4 operator + (const Vec4& op2) const; bool missing() const; /* Any components missing */ static inline Vec4& asVec4(float* ptr) { return *( reinterpret_cast( ptr ) ); } }; class Matrix4x4 { public: Matrix4x4(); Matrix4x4(const Matrix4x4& src); Matrix4x4(const double*); Vec3 operator*(const Vec3 op2) const; Vec4 operator*(const Vec4& op2) const; Matrix4x4 operator*(const Matrix4x4& op2) const; Vec4 getRow(int row); void setIdentity(void); void setRotate(const int axis, const float degree); void getData(double* dest); private: inline float val(int row, int column) const { return data[4*column+row]; } inline float& ref(int row, int column) { return data[4*column+row]; } float data[16]; }; // // CLASS // RectSize // struct RectSize { RectSize() : width(0), height(0) {}; RectSize(int in_width, int in_height) : width(in_width), height(in_height) {}; int width; int height; }; struct Rect2 { Rect2(int in_x, int in_y, int in_w, int in_h) : x(in_x) , y(in_y) , width(in_w) , height(in_h) { } int x, y; int width, height; }; // // CLASS // PolarCoord // struct PolarCoord { PolarCoord(float in_theta=0.0f, float in_phi=0.0f) : theta(in_theta), phi(in_phi) {}; PolarCoord(const PolarCoord& src) : theta(src.theta), phi(src.phi) {}; PolarCoord operator + (const PolarCoord& op2) const { return PolarCoord(theta+op2.theta, phi+op2.phi); } PolarCoord operator - (const PolarCoord& op2) const { return PolarCoord(theta-op2.theta, phi-op2.phi); } Vec3 vector() const; float theta; float phi; }; typedef Vec4 Vertex4; } // namespace rgl #endif /* MATH_H */ rgl/src/pretty.c0000644000176000001440000001460612262026246013361 0ustar ripleyusers/* This file is taken from the R sources, r61744 of src/appl/pretty.c, with minimal changes */ #include "pretty.h" #include #include #include #include /* * R : A Computer Language for Statistical Data Analysis * Copyright (C) 1995-2012 The R Core Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * http://www.r-project.org/Licenses/ */ /* Pretty Intervals * ---------------- * Constructs m "pretty" values which cover the given interval *lo <= *up * m ~= *ndiv + 1 (i.e., ndiv := approximate number of INTERVALS) * * It is not quite clear what should happen for *lo = *up; * S itself behaves quite funilly, then. * * In my opinion, a proper 'pretty' should always ensure * *lo < *up, and hence *ndiv >=1 in the result. * However, in S and here, we allow *lo == *up, and *ndiv = 0. * Note however, that we are NOT COMPATIBLE to S. [Martin M.] * * NEW (0.63.2): ns, nu are double (==> no danger of integer overflow) * * We determine * if the interval (up - lo) is ``small'' [<==> i_small == TRUE, below]. * For the ``i_small'' situation, there is a parameter shrink_sml, * the factor by which the "scale" is shrunk. ~~~~~~~~~~ * It is advisable to set it to some (smaller) integer power of 2, * since this enables exact floating point division. */ /* Leave out all the R includes that we can #ifdef HAVE_CONFIG_H #include #endif #ifdef ENABLE_NLS #include #define _(String) gettext (String) #else #define _(String) (String) #endif #include #include #include #include #include #ifdef DEBUGpr # include #endif #ifdef HAVE_VISIBILITY_ATTRIBUTE # define attribute_hidden __attribute__ ((visibility ("hidden"))) #else # define attribute_hidden #endif */ /* non-API, used by rgl */ double R_pretty0(double *lo, double *up, int *ndiv, int min_n, double shrink_sml, double high_u_fact[], int eps_correction, int return_bounds) { /* From version 0.65 on, we had rounding_eps := 1e-5, before, r..eps = 0 * 1e-7 is consistent with seq.default() */ #define rounding_eps 1e-7 #define h high_u_fact[0] #define h5 high_u_fact[1] double dx, cell, unit, base, U; double ns, nu; int k; Rboolean i_small; dx = *up - *lo; /* cell := "scale" here */ if(dx == 0 && *up == 0) { /* up == lo == 0 */ cell = 1; i_small = TRUE; } else { cell = fmax2(fabs(*lo),fabs(*up)); /* U = upper bound on cell/unit */ U = (1 + (h5 >= 1.5*h+.5)) ? 1/(1+h) : 1.5/(1+h5); /* added times 3, as several calculations here */ i_small = dx < cell * U * imax2(1,*ndiv) * DBL_EPSILON *3; } /*OLD: cell = FLT_EPSILON+ dx / *ndiv; FLT_EPSILON = 1.192e-07 */ if(i_small) { if(cell > 10) cell = 9 + cell/10; cell *= shrink_sml; if(min_n > 1) cell /= min_n; } else { cell = dx; if(*ndiv > 1) cell /= *ndiv; } if(cell < 20*DBL_MIN) { /* warning(_("Internal(pretty()): very small range.. corrected")); */ cell = 20*DBL_MIN; } else if(cell * 10 > DBL_MAX) { /* warning(_("Internal(pretty()): very large range.. corrected")); */ cell = .1*DBL_MAX; } base = pow(10., floor(log10(cell))); /* base <= cell < 10*base */ /* unit : from { 1,2,5,10 } * base * such that |u - cell| is small, * favoring larger (if h > 1, else smaller) u values; * favor '5' more than '2' if h5 > h (default h5 = .5 + 1.5 h) */ unit = base; if((U = 2*base)-cell < h*(cell-unit)) { unit = U; if((U = 5*base)-cell < h5*(cell-unit)) { unit = U; if((U =10*base)-cell < h*(cell-unit)) unit = U; }} /* Result: c := cell, u := unit, b := base * c in [ 1, (2+ h) /(1+h) ] b ==> u= b * c in ( (2+ h)/(1+h), (5+2h5)/(1+h5)] b ==> u= 2b * c in ( (5+2h)/(1+h), (10+5h) /(1+h) ] b ==> u= 5b * c in ((10+5h)/(1+h), 10 ) b ==> u=10b * * ===> 2/5 *(2+h)/(1+h) <= c/u <= (2+h)/(1+h) */ ns = floor(*lo/unit+rounding_eps); nu = ceil (*up/unit-rounding_eps); #ifdef DEBUGpr REprintf("pretty(lo=%g,up=%g,ndiv=%d,min_n=%d,shrink=%g,high_u=(%g,%g)," "eps=%d)\n\t dx=%g; is.small:%d. ==> cell=%g; unit=%g\n", *lo, *up, *ndiv, min_n, shrink_sml, h, h5, eps_correction, dx, (int)i_small, cell, unit); #endif if(eps_correction && (eps_correction > 1 || !i_small)) { if(*lo) *lo *= (1- DBL_EPSILON); else *lo = -DBL_MIN; if(*up) *up *= (1+ DBL_EPSILON); else *up = +DBL_MIN; } #ifdef DEBUGpr if(ns*unit > *lo) REprintf("\t ns= %.0f -- while(ns*unit > *lo) ns--;\n", ns); #endif while(ns*unit > *lo + rounding_eps*unit) ns--; #ifdef DEBUGpr if(nu*unit < *up) REprintf("\t nu= %.0f -- while(nu*unit < *up) nu++;\n", nu); #endif while(nu*unit < *up - rounding_eps*unit) nu++; k = (int)(0.5 + nu - ns); if(k < min_n) { /* ensure that nu - ns == min_n */ #ifdef DEBUGpr REprintf("\tnu-ns=%.0f-%.0f=%d SMALL -> ensure nu-ns= min_n=%d\n", nu,ns, k, min_n); #endif k = min_n - k; if(ns >= 0.) { nu += k/2; ns -= k/2 + k%2;/* ==> nu-ns = old(nu-ns) + min_n -k = min_n */ } else { ns -= k/2; nu += k/2 + k%2; } *ndiv = min_n; } else { *ndiv = k; } if(return_bounds) { /* if()'s to ensure that result covers original range */ if(ns * unit < *lo) *lo = ns * unit; if(nu * unit > *up) *up = nu * unit; } else { *lo = ns; *up = nu; } #ifdef DEBUGpr REprintf("\t ns=%.0f ==> lo=%g\n", ns, *lo); REprintf("\t nu=%.0f ==> up=%g ==> ndiv = %d\n", nu, *up, *ndiv); #endif return unit; #undef h #undef h5 } /* attribute_hidden void R_pretty(double *lo, double *up, int *ndiv, int *min_n, double *shrink_sml, double *high_u_fact, int *eps_correction) { R_pretty0(lo, up, ndiv, *min_n, *shrink_sml, high_u_fact, *eps_correction, 1); } */ rgl/src/pretty.h0000644000176000001440000000047112262026246013361 0ustar ripleyusers#ifndef RGL_PRETTY_H #define RGL_PRETTY_H #ifdef __cplusplus extern "C" { #endif double R_pretty0(double *lo, double *up, int *ndiv, int min_n, double shrink_sml, double high_u_fact[], int eps_correction, int return_bounds); #ifdef __cplusplus } #endif #endif /* RGL_API_H */ rgl/src/ClipPlane.hpp0000644000176000001440000000243612262005640014237 0ustar ripleyusers#ifndef CLIPPLANE_HPP #define CLIPPLANE_HPP #include "scene.h" #include "geom.hpp" #include "Shape.hpp" #include "PrimitiveSet.hpp" #include namespace rgl { class ClipPlaneSet : public Shape { private: /* Use parametrization ax + by + cz + d = 0 */ int nPlanes; GLenum firstPlane; ARRAY normal; /* (a,b,c) */ ARRAY offset; /* d */ public: ClipPlaneSet(Material& in_material, int in_nnormal, double* in_normal, int in_noffset, double* in_offset); // ~PlaneSet(); static int num_planes; // clip plane count for drawing; set to 0 initially, incremented // as each plane is added or drawn. /** * tell type. **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "clipplanes", buflen); }; virtual void renderBegin(RenderContext* renderContext); virtual void drawElement(RenderContext* renderContext, int index); virtual int getElementCount(void) { return nPlanes; } virtual int getAttributeCount(AABox& bbox, AttribID attrib); virtual void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); void enable(bool show); // after it has been drawn, this enables it or disables it bool isClipPlane(void) { return true; } }; } // namespace rgl #endif // CLIPPLANE_HPP rgl/src/NULLgui.hpp0000644000176000001440000000122312262005307013640 0ustar ripleyusers#ifndef RGL_NULL_GUI_HPP #define RGL_NULL_GUI_HPP // --------------------------------------------------------------------------- // $Id: win32gui.hpp 840 2012-01-06 16:07:37Z murdoch $ // --------------------------------------------------------------------------- #include "gui.hpp" namespace rgl { // --------------------------------------------------------------------------- class NULLGUIFactory : public GUIFactory { public: NULLGUIFactory(); virtual ~NULLGUIFactory(); WindowImpl* createWindowImpl(Window* window); }; // --------------------------------------------------------------------------- } // namespace rgl #endif // RGL_NULL_GUI_HPP rgl/src/win32lib.cpp0000644000176000001440000000466512262026246014027 0ustar ripleyusers#include "config.hpp" #ifdef RGL_W32 // --------------------------------------------------------------------------- // W32 Library Implementation // $Id: win32lib.cpp 976 2013-10-04 15:06:19Z murdoch $ // --------------------------------------------------------------------------- #include "lib.hpp" #include "win32gui.hpp" #include "NULLgui.hpp" #include #include "assert.hpp" #include "R.h" using namespace rgl; // --------------------------------------------------------------------------- // GUI Factory // --------------------------------------------------------------------------- Win32GUIFactory* gpWin32GUIFactory = NULL; NULLGUIFactory* gpNULLGUIFactory = NULL; // --------------------------------------------------------------------------- GUIFactory* rgl::getGUIFactory(bool useNULLDevice) { if (useNULLDevice) return (GUIFactory*) gpNULLGUIFactory; else if (gpWin32GUIFactory) return (GUIFactory*) gpWin32GUIFactory; else error("wgl device not initialized"); } // --------------------------------------------------------------------------- const char * rgl::GUIFactoryName(bool useNULLDevice) { return useNULLDevice ? "null" : "wgl"; } // --------------------------------------------------------------------------- // printMessage // --------------------------------------------------------------------------- void rgl::printMessage( const char* string ) { warning("RGL: %s\n", string); } // --------------------------------------------------------------------------- // getTime // --------------------------------------------------------------------------- double rgl::getTime() { return ( (double) ::GetTickCount() ) * ( 1.0 / 1000.0 ); } // --------------------------------------------------------------------------- // init // --------------------------------------------------------------------------- bool rgl::init(bool useNULLDevice) { if (!useNULLDevice) gpWin32GUIFactory = new Win32GUIFactory(); gpNULLGUIFactory = new NULLGUIFactory(); return true; } // --------------------------------------------------------------------------- // quit // --------------------------------------------------------------------------- void rgl::quit() { assert(gpWin32GUIFactory != NULL && gpNULLGUIFactory != NULL); delete gpWin32GUIFactory; delete gpNULLGUIFactory; gpWin32GUIFactory = NULL; gpNULLGUIFactory = NULL; } // --------------------------------------------------------------------------- #endif // RGL_W32 rgl/src/ftgl.cpp0000644000176000001440000000060112262026246013314 0ustar ripleyusers #ifdef HAVE_FREETYPE #include "FTBuffer.cpp" #include "FTCharmap.cpp" #include "FTFace.cpp" #include "FTFont/FTFont.cpp" #include "FTFont/FTBufferFont.cpp" #include "FTFont/FTPixmapFont.cpp" #include "FTGlyphContainer.cpp" #include "FTGlyph/FTGlyph.cpp" #include "FTGlyph/FTPixmapGlyph.cpp" #include "FTGlyph/FTBufferGlyph.cpp" #include "FTLibrary.cpp" #include "FTSize.cpp" #endif rgl/src/assert.cpp0000644000176000001440000000035312262026246013665 0ustar ripleyusers#include "R.h" #include "assert.hpp" void rgl_assert (const char* assertion, const char* file, int line) { error("Assertion failure: %s\nFile: %s\nLine: %d\nPlease report to rgl maintainer.", assertion, file, line); } rgl/src/RenderContext.hpp0000644000176000001440000000143612262005310015145 0ustar ripleyusers#ifndef RENDERCONTEXT_HPP #define RENDERCONTEXT_HPP namespace rgl { class Scene; class Viewpoint; class GLFont; } // namespace rgl #include "rglmath.h" #include "opengl.hpp" namespace rgl { class RenderContext { public: RenderContext() : scene(0) , rect(0,0,0,0) , viewpoint(0) , font(0) , time(0.0) , lastTime(0.0) , deltaTime(0.0) , Zrow() , Wrow() , gl2psActive(0) , NULLActive(0) { } Scene* scene; Rect2 rect; // RectSize size; Viewpoint* viewpoint; GLFont* font; double time; double lastTime; double deltaTime; float getDistance(const Vertex& v) const; GLdouble modelview[16]; GLdouble projection[16]; GLint viewport[4]; Vec4 Zrow; Vec4 Wrow; int gl2psActive; bool NULLActive; }; } // namespace rgl #endif // RENDERCONTEXT_HPP rgl/src/SceneNode.hpp0000644000176000001440000000311612262005640014227 0ustar ripleyusers#ifndef SCENENODE_HPP #define SCENENODE_HPP // // ABSTRACT BASE CLASS // SceneNode // #include "types.h" #include "String.hpp" #include "geom.hpp" namespace rgl { /* enum TypeID { SHAPE=1, LIGHT, BBOXDECO, VIEWPOINT, BACKGROUND }; */ #define SHAPE 1 #define LIGHT 2 #define BBOXDECO 3 #define VIEWPOINT 4 #define BACKGROUND 6 // 5 was used for the material typedef unsigned int TypeID; typedef int ObjID; #define BBOXID 1 /* Possible attributes to request */ #define VERTICES 1 #define NORMALS 2 #define COLORS 3 #define TEXCOORDS 4 #define SURFACEDIM 5 #define TEXTS 6 #define CEX 7 #define ADJ 8 #define RADII 9 #define CENTERS 10 #define IDS 11 #define USERMATRIX 12 #define TYPES 13 #define FLAGS 14 #define OFFSETS 15 typedef unsigned int AttribID; class SceneNode { public: inline const TypeID getTypeID() const { return typeID; } inline const ObjID getObjID() const { return objID; } virtual ~SceneNode() { }; static ObjID nextID; /* Some nodes depend on the bbox, so we pass it to all */ virtual int getAttributeCount(AABox& bbox, AttribID attrib) { return 0; } virtual void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { return; } virtual String getTextAttribute(AABox& bbox, AttribID attrib, int index) { return String(0, NULL); } protected: SceneNode(const TypeID in_typeID) : typeID(in_typeID) { objID = nextID++; }; private: const TypeID typeID; ObjID objID; }; /** * used in find_if searches, so can't be a method */ bool sameID(SceneNode* node, int id); } // namespace rgl #endif // SCENENODE_HPP rgl/src/geom.cpp0000644000176000001440000000642412262026246013320 0ustar ripleyusers#include "geom.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // AABox // AABox::AABox() { invalidate(); } void AABox::invalidate(void) { vmax = Vertex( -FLT_MAX, -FLT_MAX, -FLT_MAX ); vmin = Vertex( FLT_MAX, FLT_MAX, FLT_MAX ); } void AABox::operator += (const Vertex& v) { if (!ISNAN(v.x)) { vmin.x = getMin(vmin.x, v.x); vmax.x = getMax(vmax.x, v.x); } if (!ISNAN(v.y)) { vmin.y = getMin(vmin.y, v.y); vmax.y = getMax(vmax.y, v.y); } if (!ISNAN(v.z)) { vmin.z = getMin(vmin.z, v.z); vmax.z = getMax(vmax.z, v.z); } } void AABox::operator += (const AABox& aabox) { *this += aabox.vmin; *this += aabox.vmax; } void AABox::operator += (const Sphere& sphere) { *this += sphere.center - Vertex(sphere.radius,sphere.radius,sphere.radius); *this += sphere.center + Vertex(sphere.radius,sphere.radius,sphere.radius); } bool AABox::operator < (const AABox& that) const { return true; } bool AABox::isValid(void) const { return ((vmax.x >= vmin.x) && (vmax.y >= vmin.y) && (vmax.z >= vmin.z)) ? true : false; } Vertex AABox::getCenter(void) const { return Vertex( (vmax + vmin) * 0.5f ); } ////////////////////////////////////////////////////////////////////////////// // // CLASS // Sphere // Sphere::Sphere(const AABox& bbox) { Vertex hdiagonal( (bbox.vmax - bbox.vmin) * 0.5f ); center = bbox.getCenter(); radius = hdiagonal.getLength(); } Sphere::Sphere(const AABox& bbox, const Vertex& s) { Vertex hdiagonal( ((bbox.vmax - bbox.vmin) * 0.5f).scale(s) ); center = bbox.getCenter(); radius = hdiagonal.getLength(); } Sphere::Sphere(const float in_radius) : center(0.0f, 0.0f, 0.0f), radius(in_radius) { } Sphere::Sphere(const Vertex& in_center, const float in_radius) : center(in_center), radius(in_radius) { } ////////////////////////////////////////////////////////////////////////////// // // CLASS // Frustum // // // setup frustum to enclose the space given by a bounding sphere, // field-of-view angle and window size. // // window size is used to provide aspect ratio. // // void Frustum::enclose(float sphere_radius, float fovangle, int width, int height) { float s=0.5, t=1.0; if (fovangle != 0.0) { float fovradians = math::deg2rad(fovangle/2.0f); s = math::sin(fovradians); t = math::tan(fovradians); ortho = false; } else { ortho = true; } distance = sphere_radius / s; znear = distance - sphere_radius; zfar = znear + sphere_radius*2.0f; float hlen = t * znear; // hold aspect ratio 1:1 float hwidth, hheight; bool inside = false; if (inside) { // inside bounding sphere: fit to max(winsize) if (width >= height) { hwidth = hlen; hheight = hlen * ( (float)height ) / ( (float)width ); } else { hwidth = hlen * ( (float)width ) / ( (float)height ); hheight = hlen; } } else { // outside(in front of) bounding sphere: fit to min(winsize) if (width >= height) { hwidth = hlen * ( (float)width ) / ( (float)height ); hheight = hlen; } else { hwidth = hlen; hheight = hlen * ( (float)height ) / ( (float)width ); } } left = -hwidth; right = hwidth; bottom = -hheight; top = hheight; } rgl/src/pixmap.h0000644000176000001440000000206612262026246013332 0ustar ripleyusers#ifndef PIXMAP_H #define PIXMAP_H // C++ header file // This file is part of RGL // // $Id: pixmap.h 991 2013-11-20 20:26:13Z murdoch $ #include #include "opengl.hpp" namespace rgl { class PixmapFormat; enum PixmapTypeID { INVALID=0, RGB24, RGB32, RGBA32, GRAY8 }; enum PixmapFileFormatID { PIXMAP_FILEFORMAT_PNG = 0, PIXMAP_FILEFORMAT_LAST }; class Pixmap { public: Pixmap(); ~Pixmap(); bool init(PixmapTypeID typeID, int width, int height, int bits_per_channel); bool load(const char* filename); bool save(PixmapFormat* format, const char* filename); PixmapTypeID typeID; unsigned int width; unsigned int height; unsigned int bits_per_channel; unsigned int bytesperrow; unsigned char *data; }; class PixmapFormat { public: virtual ~PixmapFormat() { } virtual bool checkSignature(std::FILE* file) = 0; virtual bool load(std::FILE* file, Pixmap* pixmap) = 0; virtual bool save(std::FILE* file, Pixmap* pixmap) = 0; }; extern PixmapFormat* pixmapFormat[PIXMAP_FILEFORMAT_LAST]; } // namespace rgl #endif /* PIXMAP_H */ rgl/src/gl2ps.c0000644000176000001440000055230212262026246013061 0ustar ripleyusers/* * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2012 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: * * a) the GNU Library General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your * option) any later version; or * * b) the GL2PS License as published by Christophe Geuzaine, either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either * the GNU Library General Public License or the GL2PS License for * more details. * * You should have received a copy of the GNU Library General Public * License along with this library in the file named "COPYING.LGPL"; * if not, write to the Free Software Foundation, Inc., 51 Franklin * Street, Fifth Floor, Boston, MA 02110-1301, USA. * * You should have received a copy of the GL2PS License with this * library in the file named "COPYING.GL2PS"; if not, I will be glad * to provide one. * * For the latest info about gl2ps and a full list of contributors, * see http://www.geuz.org/gl2ps/. * * Please report all bugs and problems to . */ #include "gl2ps.h" #include #include #include #include #include #include #if defined(GL2PS_HAVE_ZLIB) #include #endif #if defined(GL2PS_HAVE_LIBPNG) #include #endif /********************************************************************* * * Private definitions, data structures and prototypes * *********************************************************************/ /* Magic numbers (assuming that the order of magnitude of window coordinates is 10^3) */ #define GL2PS_EPSILON 5.0e-3F #define GL2PS_ZSCALE 1000.0F #define GL2PS_ZOFFSET 5.0e-2F #define GL2PS_ZOFFSET_LARGE 20.0F #define GL2PS_ZERO(arg) (fabs(arg) < 1.e-20) /* Primitive types */ #define GL2PS_NO_TYPE -1 #define GL2PS_TEXT 1 #define GL2PS_POINT 2 #define GL2PS_LINE 3 #define GL2PS_QUADRANGLE 4 #define GL2PS_TRIANGLE 5 #define GL2PS_PIXMAP 6 #define GL2PS_IMAGEMAP 7 #define GL2PS_IMAGEMAP_WRITTEN 8 #define GL2PS_IMAGEMAP_VISIBLE 9 #define GL2PS_SPECIAL 10 /* BSP tree primitive comparison */ #define GL2PS_COINCIDENT 1 #define GL2PS_IN_FRONT_OF 2 #define GL2PS_IN_BACK_OF 3 #define GL2PS_SPANNING 4 /* 2D BSP tree primitive comparison */ #define GL2PS_POINT_COINCIDENT 0 #define GL2PS_POINT_INFRONT 1 #define GL2PS_POINT_BACK 2 /* Internal feedback buffer pass-through tokens */ #define GL2PS_BEGIN_OFFSET_TOKEN 1 #define GL2PS_END_OFFSET_TOKEN 2 #define GL2PS_BEGIN_BOUNDARY_TOKEN 3 #define GL2PS_END_BOUNDARY_TOKEN 4 #define GL2PS_BEGIN_STIPPLE_TOKEN 5 #define GL2PS_END_STIPPLE_TOKEN 6 #define GL2PS_POINT_SIZE_TOKEN 7 #define GL2PS_LINE_WIDTH_TOKEN 8 #define GL2PS_BEGIN_BLEND_TOKEN 9 #define GL2PS_END_BLEND_TOKEN 10 #define GL2PS_SRC_BLEND_TOKEN 11 #define GL2PS_DST_BLEND_TOKEN 12 #define GL2PS_IMAGEMAP_TOKEN 13 #define GL2PS_DRAW_PIXELS_TOKEN 14 #define GL2PS_TEXT_TOKEN 15 typedef enum { T_UNDEFINED = -1, T_CONST_COLOR = 1, T_VAR_COLOR = 1<<1, T_ALPHA_1 = 1<<2, T_ALPHA_LESS_1 = 1<<3, T_VAR_ALPHA = 1<<4 } GL2PS_TRIANGLE_PROPERTY; typedef GLfloat GL2PSxyz[3]; typedef GLfloat GL2PSplane[4]; typedef struct _GL2PSbsptree2d GL2PSbsptree2d; struct _GL2PSbsptree2d { GL2PSplane plane; GL2PSbsptree2d *front, *back; }; typedef struct { GLint nmax, size, incr, n; char *array; } GL2PSlist; typedef struct _GL2PSbsptree GL2PSbsptree; struct _GL2PSbsptree { GL2PSplane plane; GL2PSlist *primitives; GL2PSbsptree *front, *back; }; typedef struct { GL2PSxyz xyz; GL2PSrgba rgba; } GL2PSvertex; typedef struct { GL2PSvertex vertex[3]; int prop; } GL2PStriangle; typedef struct { GLshort fontsize; char *str, *fontname; /* Note: for a 'special' string, 'alignment' holds the format (PostScript, PDF, etc.) of the special string */ GLint alignment; GLfloat angle; } GL2PSstring; typedef struct { GLsizei width, height; /* Note: for an imagemap, 'type' indicates if it has already been written to the file or not, and 'format' indicates if it is visible or not */ GLenum format, type; GLfloat zoom_x, zoom_y; GLfloat *pixels; } GL2PSimage; typedef struct _GL2PSimagemap GL2PSimagemap; struct _GL2PSimagemap { GL2PSimage *image; GL2PSimagemap *next; }; typedef struct { GLshort type, numverts; GLushort pattern; char boundary, offset, culled; GLint factor; GLfloat width; GL2PSvertex *verts; union { GL2PSstring *text; GL2PSimage *image; } data; } GL2PSprimitive; typedef struct { #if defined(GL2PS_HAVE_ZLIB) Bytef *dest, *src, *start; uLongf destLen, srcLen; #else int dummy; #endif } GL2PScompress; typedef struct{ GL2PSlist* ptrlist; int gsno, fontno, imno, shno, maskshno, trgroupno; int gsobjno, fontobjno, imobjno, shobjno, maskshobjno, trgroupobjno; } GL2PSpdfgroup; typedef struct { /* General */ GLint format, sort, options, colorsize, colormode, buffersize; char *title, *producer, *filename; GLboolean boundary, blending; GLfloat *feedback, offset[2], lastlinewidth; GLint viewport[4], blendfunc[2], lastfactor; GL2PSrgba *colormap, lastrgba, threshold, bgcolor; GLushort lastpattern; GL2PSvertex lastvertex; GL2PSlist *primitives, *auxprimitives; FILE *stream; GL2PScompress *compress; GLboolean header; /* BSP-specific */ GLint maxbestroot; /* Occlusion culling-specific */ GLboolean zerosurfacearea; GL2PSbsptree2d *imagetree; GL2PSprimitive *primitivetoadd; /* PDF-specific */ int streamlength; GL2PSlist *pdfprimlist, *pdfgrouplist; int *xreflist; int objects_stack; /* available objects */ int extgs_stack; /* graphics state object number */ int font_stack; /* font object number */ int im_stack; /* image object number */ int trgroupobjects_stack; /* xobject numbers */ int shader_stack; /* shader object numbers */ int mshader_stack; /* mask shader object numbers */ /* for image map list */ GL2PSimagemap *imagemap_head; GL2PSimagemap *imagemap_tail; } GL2PScontext; typedef struct { void (*printHeader)(void); void (*printFooter)(void); void (*beginViewport)(GLint viewport[4]); GLint (*endViewport)(void); void (*printPrimitive)(void *data); void (*printFinalPrimitive)(void); const char *file_extension; const char *description; } GL2PSbackend; /* The gl2ps context. gl2ps is not thread safe (we should create a local GL2PScontext during gl2psBeginPage) */ static GL2PScontext *gl2ps = NULL; /* Need to forward-declare this one */ static GLint gl2psPrintPrimitives(void); /********************************************************************* * * Utility routines * *********************************************************************/ static void gl2psMsg(GLint level, const char *fmt, ...) { /* Avoid R check complaints: GL2PS_SILENT is always set va_list args; if(!(gl2ps->options & GL2PS_SILENT)){ switch(level){ case GL2PS_INFO : fprintf(stderr, "GL2PS info: "); break; case GL2PS_WARNING : fprintf(stderr, "GL2PS warning: "); break; case GL2PS_ERROR : fprintf(stderr, "GL2PS error: "); break; } va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fprintf(stderr, "\n"); } */ /* if(level == GL2PS_ERROR) exit(1); */ } static void *gl2psMalloc(size_t size) { void *ptr; if(!size) return NULL; ptr = malloc(size); if(!ptr){ gl2psMsg(GL2PS_ERROR, "Couldn't allocate requested memory"); return NULL; } return ptr; } static void *gl2psRealloc(void *ptr, size_t size) { void *orig = ptr; if(!size) return NULL; ptr = realloc(orig, size); if(!ptr){ gl2psMsg(GL2PS_ERROR, "Couldn't reallocate requested memory"); free(orig); return NULL; } return ptr; } static void gl2psFree(void *ptr) { if(!ptr) return; free(ptr); } static int gl2psWriteBigEndian(unsigned long data, int bytes) { int i; int size = sizeof(unsigned long); for(i = 1; i <= bytes; ++i){ fputc(0xff & (data >> (size - i) * 8), gl2ps->stream); } return bytes; } /* zlib compression helper routines */ #if defined(GL2PS_HAVE_ZLIB) static void gl2psSetupCompress(void) { gl2ps->compress = (GL2PScompress*)gl2psMalloc(sizeof(GL2PScompress)); gl2ps->compress->src = NULL; gl2ps->compress->start = NULL; gl2ps->compress->dest = NULL; gl2ps->compress->srcLen = 0; gl2ps->compress->destLen = 0; } static void gl2psFreeCompress(void) { if(!gl2ps->compress) return; gl2psFree(gl2ps->compress->start); gl2psFree(gl2ps->compress->dest); gl2ps->compress->src = NULL; gl2ps->compress->start = NULL; gl2ps->compress->dest = NULL; gl2ps->compress->srcLen = 0; gl2ps->compress->destLen = 0; } static int gl2psAllocCompress(unsigned int srcsize) { gl2psFreeCompress(); if(!gl2ps->compress || !srcsize) return GL2PS_ERROR; gl2ps->compress->srcLen = srcsize; gl2ps->compress->destLen = (int)ceil(1.001 * gl2ps->compress->srcLen + 12); gl2ps->compress->src = (Bytef*)gl2psMalloc(gl2ps->compress->srcLen); gl2ps->compress->start = gl2ps->compress->src; gl2ps->compress->dest = (Bytef*)gl2psMalloc(gl2ps->compress->destLen); return GL2PS_SUCCESS; } static void *gl2psReallocCompress(unsigned int srcsize) { if(!gl2ps->compress || !srcsize) return NULL; if(srcsize < gl2ps->compress->srcLen) return gl2ps->compress->start; gl2ps->compress->srcLen = srcsize; gl2ps->compress->destLen = (int)ceil(1.001 * gl2ps->compress->srcLen + 12); gl2ps->compress->src = (Bytef*)gl2psRealloc(gl2ps->compress->src, gl2ps->compress->srcLen); gl2ps->compress->start = gl2ps->compress->src; gl2ps->compress->dest = (Bytef*)gl2psRealloc(gl2ps->compress->dest, gl2ps->compress->destLen); return gl2ps->compress->start; } static int gl2psWriteBigEndianCompress(unsigned long data, int bytes) { int i; int size = sizeof(unsigned long); for(i = 1; i <= bytes; ++i){ *gl2ps->compress->src = (Bytef)(0xff & (data >> (size-i) * 8)); ++gl2ps->compress->src; } return bytes; } static int gl2psDeflate(void) { /* For compatibility with older zlib versions, we use compress(...) instead of compress2(..., Z_BEST_COMPRESSION) */ return compress(gl2ps->compress->dest, &gl2ps->compress->destLen, gl2ps->compress->start, gl2ps->compress->srcLen); } #endif static int gl2psPrintf(const char* fmt, ...) { int ret; va_list args; #if defined(GL2PS_HAVE_ZLIB) static char buf[1024]; char *bufptr = buf; GLboolean freebuf = GL_FALSE; unsigned int oldsize = 0; #if !defined(GL2PS_HAVE_NO_VSNPRINTF) /* Try writing the string to a 1024 byte buffer. If it is too small to fit, keep trying larger sizes until it does. */ size_t bufsize = sizeof(buf); #endif if(gl2ps->options & GL2PS_COMPRESS){ va_start(args, fmt); #if defined(GL2PS_HAVE_NO_VSNPRINTF) ret = vsprintf(buf, fmt, args); #else ret = vsnprintf(bufptr, bufsize, fmt, args); #endif va_end(args); #if !defined(GL2PS_HAVE_NO_VSNPRINTF) while(ret >= (bufsize - 1) || ret < 0){ /* Too big. Allocate a new buffer. */ bufsize *= 2; if(freebuf == GL_TRUE) gl2psFree(bufptr); bufptr = (char *)gl2psMalloc(bufsize); freebuf = GL_TRUE; va_start(args, fmt); ret = vsnprintf(bufptr, bufsize, fmt, args); va_end(args); } #endif oldsize = gl2ps->compress->srcLen; gl2ps->compress->start = (Bytef*)gl2psReallocCompress(oldsize + ret); memcpy(gl2ps->compress->start + oldsize, bufptr, ret); if(freebuf == GL_TRUE) gl2psFree(bufptr); ret = 0; } else{ #endif va_start(args, fmt); ret = vfprintf(gl2ps->stream, fmt, args); va_end(args); #if defined(GL2PS_HAVE_ZLIB) } #endif return ret; } static void gl2psPrintGzipHeader(void) { #if defined(GL2PS_HAVE_ZLIB) char tmp[10] = {'\x1f', '\x8b', /* magic numbers: 0x1f, 0x8b */ 8, /* compression method: Z_DEFLATED */ 0, /* flags */ 0, 0, 0, 0, /* time */ 2, /* extra flags: max compression */ '\x03'}; /* OS code: 0x03 (Unix) */ if(gl2ps->options & GL2PS_COMPRESS){ gl2psSetupCompress(); /* add the gzip file header */ fwrite(tmp, 10, 1, gl2ps->stream); } #endif } static void gl2psPrintGzipFooter(void) { #if defined(GL2PS_HAVE_ZLIB) int n; uLong crc, len; char tmp[8]; if(gl2ps->options & GL2PS_COMPRESS){ if(Z_OK != gl2psDeflate()){ gl2psMsg(GL2PS_ERROR, "Zlib deflate error"); } else{ /* determine the length of the header in the zlib stream */ n = 2; /* CMF+FLG */ if(gl2ps->compress->dest[1] & (1<<5)){ n += 4; /* DICTID */ } /* write the data, without the zlib header and footer */ fwrite(gl2ps->compress->dest+n, gl2ps->compress->destLen-(n+4), 1, gl2ps->stream); /* add the gzip file footer */ crc = crc32(0L, gl2ps->compress->start, gl2ps->compress->srcLen); for(n = 0; n < 4; ++n){ tmp[n] = (char)(crc & 0xff); crc >>= 8; } len = gl2ps->compress->srcLen; for(n = 4; n < 8; ++n){ tmp[n] = (char)(len & 0xff); len >>= 8; } fwrite(tmp, 8, 1, gl2ps->stream); } gl2psFreeCompress(); gl2psFree(gl2ps->compress); gl2ps->compress = NULL; } #endif } /* The list handling routines */ static void gl2psListRealloc(GL2PSlist *list, GLint n) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot reallocate NULL list"); return; } if(n <= 0) return; if(!list->array){ list->nmax = n; list->array = (char*)gl2psMalloc(list->nmax * list->size); } else{ if(n > list->nmax){ list->nmax = ((n - 1) / list->incr + 1) * list->incr; list->array = (char*)gl2psRealloc(list->array, list->nmax * list->size); } } } static GL2PSlist *gl2psListCreate(GLint n, GLint incr, GLint size) { GL2PSlist *list; if(n < 0) n = 0; if(incr <= 0) incr = 1; list = (GL2PSlist*)gl2psMalloc(sizeof(GL2PSlist)); list->nmax = 0; list->incr = incr; list->size = size; list->n = 0; list->array = NULL; gl2psListRealloc(list, n); return list; } static void gl2psListReset(GL2PSlist *list) { if(!list) return; list->n = 0; } static void gl2psListDelete(GL2PSlist *list) { if(!list) return; gl2psFree(list->array); gl2psFree(list); } static void gl2psListAdd(GL2PSlist *list, void *data) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot add into unallocated list"); return; } list->n++; gl2psListRealloc(list, list->n); memcpy(&list->array[(list->n - 1) * list->size], data, list->size); } static int gl2psListNbr(GL2PSlist *list) { if(!list) return 0; return list->n; } static void *gl2psListPointer(GL2PSlist *list, GLint idx) { if(!list){ gl2psMsg(GL2PS_ERROR, "Cannot point into unallocated list"); return NULL; } if((idx < 0) || (idx >= list->n)){ gl2psMsg(GL2PS_ERROR, "Wrong list index in gl2psListPointer"); return NULL; } return &list->array[idx * list->size]; } static void gl2psListSort(GL2PSlist *list, int (*fcmp)(const void *a, const void *b)) { if(!list) return; qsort(list->array, list->n, list->size, fcmp); } static void gl2psListAction(GL2PSlist *list, void (*action)(void *data)) { GLint i; for(i = 0; i < gl2psListNbr(list); i++){ (*action)(gl2psListPointer(list, i)); } } static void gl2psListActionInverse(GL2PSlist *list, void (*action)(void *data)) { GLint i; for(i = gl2psListNbr(list); i > 0; i--){ (*action)(gl2psListPointer(list, i-1)); } } #if defined(GL2PS_HAVE_LIBPNG) static void gl2psListRead(GL2PSlist *list, int index, void *data) { if((index < 0) || (index >= list->n)) gl2psMsg(GL2PS_ERROR, "Wrong list index in gl2psListRead"); memcpy(data, &list->array[index * list->size], list->size); } static void gl2psEncodeBase64Block(unsigned char in[3], unsigned char out[4], int len) { static const char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; out[0] = cb64[ in[0] >> 2 ]; out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; out[2] = (len > 1) ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='; out[3] = (len > 2) ? cb64[ in[2] & 0x3f ] : '='; } static void gl2psListEncodeBase64(GL2PSlist *list) { unsigned char *buffer, in[3], out[4]; int i, n, index, len; n = list->n * list->size; buffer = (unsigned char*)gl2psMalloc(n * sizeof(unsigned char)); memcpy(buffer, list->array, n * sizeof(unsigned char)); gl2psListReset(list); index = 0; while(index < n) { len = 0; for(i = 0; i < 3; i++) { if(index < n){ in[i] = buffer[index]; len++; } else{ in[i] = 0; } index++; } if(len) { gl2psEncodeBase64Block(in, out, len); for(i = 0; i < 4; i++) gl2psListAdd(list, &out[i]); } } gl2psFree(buffer); } #endif /* Helpers for rgba colors */ static GLboolean gl2psSameColor(GL2PSrgba rgba1, GL2PSrgba rgba2) { if(!GL2PS_ZERO(rgba1[0] - rgba2[0]) || !GL2PS_ZERO(rgba1[1] - rgba2[1]) || !GL2PS_ZERO(rgba1[2] - rgba2[2])) return GL_FALSE; return GL_TRUE; } static GLboolean gl2psVertsSameColor(const GL2PSprimitive *prim) { int i; for(i = 1; i < prim->numverts; i++){ if(!gl2psSameColor(prim->verts[0].rgba, prim->verts[i].rgba)){ return GL_FALSE; } } return GL_TRUE; } static GLboolean gl2psSameColorThreshold(int n, GL2PSrgba rgba[], GL2PSrgba threshold) { int i; if(n < 2) return GL_TRUE; for(i = 1; i < n; i++){ if(fabs(rgba[0][0] - rgba[i][0]) > threshold[0] || fabs(rgba[0][1] - rgba[i][1]) > threshold[1] || fabs(rgba[0][2] - rgba[i][2]) > threshold[2]) return GL_FALSE; } return GL_TRUE; } static void gl2psSetLastColor(GL2PSrgba rgba) { int i; for(i = 0; i < 3; ++i){ gl2ps->lastrgba[i] = rgba[i]; } } static GLfloat gl2psGetRGB(GL2PSimage *im, GLuint x, GLuint y, GLfloat *red, GLfloat *green, GLfloat *blue) { GLsizei width = im->width; GLsizei height = im->height; GLfloat *pixels = im->pixels; GLfloat *pimag; /* OpenGL image is from down to up, PS image is up to down */ switch(im->format){ case GL_RGBA: pimag = pixels + 4 * (width * (height - 1 - y) + x); break; case GL_RGB: default: pimag = pixels + 3 * (width * (height - 1 - y) + x); break; } *red = *pimag; pimag++; *green = *pimag; pimag++; *blue = *pimag; pimag++; return (im->format == GL_RGBA) ? *pimag : 1.0F; } /* Helper routines for pixmaps */ static GL2PSimage *gl2psCopyPixmap(GL2PSimage *im) { int size; GL2PSimage *image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); image->width = im->width; image->height = im->height; image->format = im->format; image->type = im->type; image->zoom_x = im->zoom_x; image->zoom_y = im->zoom_y; switch(image->format){ case GL_RGBA: size = image->height * image->width * 4 * sizeof(GLfloat); break; case GL_RGB: default: size = image->height * image->width * 3 * sizeof(GLfloat); break; } image->pixels = (GLfloat*)gl2psMalloc(size); memcpy(image->pixels, im->pixels, size); return image; } static void gl2psFreePixmap(GL2PSimage *im) { if(!im) return; gl2psFree(im->pixels); gl2psFree(im); } #if defined(GL2PS_HAVE_LIBPNG) #if !defined(png_jmpbuf) # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #endif static void gl2psUserWritePNG(png_structp png_ptr, png_bytep data, png_size_t length) { unsigned int i; GL2PSlist *png = (GL2PSlist*)png_get_io_ptr(png_ptr); for(i = 0; i < length; i++) gl2psListAdd(png, &data[i]); } static void gl2psUserFlushPNG(png_structp png_ptr) { (void) png_ptr; /* not used */ } static void gl2psConvertPixmapToPNG(GL2PSimage *pixmap, GL2PSlist *png) { png_structp png_ptr; png_infop info_ptr; unsigned char *row_data; GLfloat dr, dg, db; int row, col; if(!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) return; if(!(info_ptr = png_create_info_struct(png_ptr))){ png_destroy_write_struct(&png_ptr, NULL); return; } if(setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return; } png_set_write_fn(png_ptr, (void *)png, gl2psUserWritePNG, gl2psUserFlushPNG); png_set_compression_level(png_ptr, Z_DEFAULT_COMPRESSION); png_set_IHDR(png_ptr, info_ptr, pixmap->width, pixmap->height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); row_data = (unsigned char*)gl2psMalloc(3 * pixmap->width * sizeof(unsigned char)); for(row = 0; row < pixmap->height; row++){ for(col = 0; col < pixmap->width; col++){ gl2psGetRGB(pixmap, col, row, &dr, &dg, &db); row_data[3*col] = (unsigned char)(255. * dr); row_data[3*col+1] = (unsigned char)(255. * dg); row_data[3*col+2] = (unsigned char)(255. * db); } png_write_row(png_ptr, (png_bytep)row_data); } gl2psFree(row_data); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); } #endif /* Helper routines for text strings */ static GLint gl2psAddText(GLint type, const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, GL2PSrgba color) { GLfloat pos[4]; GL2PSprimitive *prim; GLboolean valid; if(!gl2ps || !str || !fontname) return GL2PS_UNINITIALIZED; if(gl2ps->options & GL2PS_NO_TEXT) return GL2PS_SUCCESS; glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if(GL_FALSE == valid) return GL2PS_SUCCESS; /* the primitive is culled */ glGetFloatv(GL_CURRENT_RASTER_POSITION, pos); prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = type; prim->boundary = 0; prim->numverts = 1; prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex)); prim->verts[0].xyz[0] = pos[0]; prim->verts[0].xyz[1] = pos[1]; prim->verts[0].xyz[2] = pos[2]; prim->culled = 0; prim->offset = 0; prim->pattern = 0; prim->factor = 0; prim->width = 1; if (color) memcpy(prim->verts[0].rgba, color, 4 * sizeof(float)); else glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba); prim->data.text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring)); prim->data.text->str = (char*)gl2psMalloc((strlen(str)+1)*sizeof(char)); strcpy(prim->data.text->str, str); prim->data.text->fontname = (char*)gl2psMalloc((strlen(fontname)+1)*sizeof(char)); strcpy(prim->data.text->fontname, fontname); prim->data.text->fontsize = fontsize; prim->data.text->alignment = alignment; prim->data.text->angle = angle; gl2psListAdd(gl2ps->auxprimitives, &prim); glPassThrough(GL2PS_TEXT_TOKEN); return GL2PS_SUCCESS; } static GL2PSstring *gl2psCopyText(GL2PSstring *t) { GL2PSstring *text = (GL2PSstring*)gl2psMalloc(sizeof(GL2PSstring)); text->str = (char*)gl2psMalloc((strlen(t->str)+1)*sizeof(char)); strcpy(text->str, t->str); text->fontname = (char*)gl2psMalloc((strlen(t->fontname)+1)*sizeof(char)); strcpy(text->fontname, t->fontname); text->fontsize = t->fontsize; text->alignment = t->alignment; text->angle = t->angle; return text; } static void gl2psFreeText(GL2PSstring *text) { if(!text) return; gl2psFree(text->str); gl2psFree(text->fontname); gl2psFree(text); } /* Helpers for blending modes */ static GLboolean gl2psSupportedBlendMode(GLenum sfactor, GLenum dfactor) { /* returns TRUE if gl2ps supports the argument combination: only two blending modes have been implemented so far */ if( (sfactor == GL_SRC_ALPHA && dfactor == GL_ONE_MINUS_SRC_ALPHA) || (sfactor == GL_ONE && dfactor == GL_ZERO) ) return GL_TRUE; return GL_FALSE; } static void gl2psAdaptVertexForBlending(GL2PSvertex *v) { /* Transforms vertex depending on the actual blending function - currently the vertex v is considered as source vertex and his alpha value is changed to 1.0 if source blending GL_ONE is active. This might be extended in the future */ if(!v || !gl2ps) return; if(gl2ps->options & GL2PS_NO_BLENDING || !gl2ps->blending){ v->rgba[3] = 1.0F; return; } switch(gl2ps->blendfunc[0]){ case GL_ONE: v->rgba[3] = 1.0F; break; default: break; } } static void gl2psAssignTriangleProperties(GL2PStriangle *t) { /* int i; */ t->prop = T_VAR_COLOR; /* Uncommenting the following lines activates an even more fine grained distinction between triangle types - please don't delete, a remarkable amount of PDF handling code inside this file depends on it if activated */ /* t->prop = T_CONST_COLOR; for(i = 0; i < 3; ++i){ if(!GL2PS_ZERO(t->vertex[0].rgba[i] - t->vertex[1].rgba[i]) || !GL2PS_ZERO(t->vertex[1].rgba[i] - t->vertex[2].rgba[i])){ t->prop = T_VAR_COLOR; break; } } */ if(!GL2PS_ZERO(t->vertex[0].rgba[3] - t->vertex[1].rgba[3]) || !GL2PS_ZERO(t->vertex[1].rgba[3] - t->vertex[2].rgba[3])){ t->prop |= T_VAR_ALPHA; } else{ if(t->vertex[0].rgba[3] < 1) t->prop |= T_ALPHA_LESS_1; else t->prop |= T_ALPHA_1; } } static void gl2psFillTriangleFromPrimitive(GL2PStriangle *t, GL2PSprimitive *p, GLboolean assignprops) { t->vertex[0] = p->verts[0]; t->vertex[1] = p->verts[1]; t->vertex[2] = p->verts[2]; if(GL_TRUE == assignprops) gl2psAssignTriangleProperties(t); } static void gl2psInitTriangle(GL2PStriangle *t) { int i; GL2PSvertex vertex = { {-1.0F, -1.0F, -1.0F}, {-1.0F, -1.0F, -1.0F, -1.0F} }; for(i = 0; i < 3; i++) t->vertex[i] = vertex; t->prop = T_UNDEFINED; } /* Miscellaneous helper routines */ static GL2PSprimitive *gl2psCopyPrimitive(GL2PSprimitive *p) { GL2PSprimitive *prim; if(!p){ gl2psMsg(GL2PS_ERROR, "Trying to copy an empty primitive"); return NULL; } prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = p->type; prim->numverts = p->numverts; prim->boundary = p->boundary; prim->offset = p->offset; prim->pattern = p->pattern; prim->factor = p->factor; prim->culled = p->culled; prim->width = p->width; prim->verts = (GL2PSvertex*)gl2psMalloc(p->numverts*sizeof(GL2PSvertex)); memcpy(prim->verts, p->verts, p->numverts * sizeof(GL2PSvertex)); switch(prim->type){ case GL2PS_PIXMAP : prim->data.image = gl2psCopyPixmap(p->data.image); break; case GL2PS_TEXT : case GL2PS_SPECIAL : prim->data.text = gl2psCopyText(p->data.text); break; default: break; } return prim; } static GLboolean gl2psSamePosition(GL2PSxyz p1, GL2PSxyz p2) { if(!GL2PS_ZERO(p1[0] - p2[0]) || !GL2PS_ZERO(p1[1] - p2[1]) || !GL2PS_ZERO(p1[2] - p2[2])) return GL_FALSE; return GL_TRUE; } /********************************************************************* * * 3D sorting routines * *********************************************************************/ static GLfloat gl2psComparePointPlane(GL2PSxyz point, GL2PSplane plane) { return (plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3]); } static GLfloat gl2psPsca(GLfloat *a, GLfloat *b) { return (a[0]*b[0] + a[1]*b[1] + a[2]*b[2]); } static void gl2psPvec(GLfloat *a, GLfloat *b, GLfloat *c) { c[0] = a[1]*b[2] - a[2]*b[1]; c[1] = a[2]*b[0] - a[0]*b[2]; c[2] = a[0]*b[1] - a[1]*b[0]; } static GLfloat gl2psNorm(GLfloat *a) { return (GLfloat)sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2]); } static void gl2psGetNormal(GLfloat *a, GLfloat *b, GLfloat *c) { GLfloat norm; gl2psPvec(a, b, c); if(!GL2PS_ZERO(norm = gl2psNorm(c))){ c[0] = c[0] / norm; c[1] = c[1] / norm; c[2] = c[2] / norm; } else{ /* The plane is still wrong despite our tests in gl2psGetPlane. Let's return a dummy value for now (this is a hack: we should do more intelligent tests in GetPlane) */ c[0] = c[1] = 0.0F; c[2] = 1.0F; } } static void gl2psGetPlane(GL2PSprimitive *prim, GL2PSplane plane) { GL2PSxyz v = {0.0F, 0.0F, 0.0F}, w = {0.0F, 0.0F, 0.0F}; switch(prim->type){ case GL2PS_TRIANGLE : case GL2PS_QUADRANGLE : v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; w[0] = prim->verts[2].xyz[0] - prim->verts[0].xyz[0]; w[1] = prim->verts[2].xyz[1] - prim->verts[0].xyz[1]; w[2] = prim->verts[2].xyz[2] - prim->verts[0].xyz[2]; if((GL2PS_ZERO(v[0]) && GL2PS_ZERO(v[1]) && GL2PS_ZERO(v[2])) || (GL2PS_ZERO(w[0]) && GL2PS_ZERO(w[1]) && GL2PS_ZERO(w[2]))){ plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; } else{ gl2psGetNormal(v, w, plane); plane[3] = - plane[0] * prim->verts[0].xyz[0] - plane[1] * prim->verts[0].xyz[1] - plane[2] * prim->verts[0].xyz[2]; } break; case GL2PS_LINE : v[0] = prim->verts[1].xyz[0] - prim->verts[0].xyz[0]; v[1] = prim->verts[1].xyz[1] - prim->verts[0].xyz[1]; v[2] = prim->verts[1].xyz[2] - prim->verts[0].xyz[2]; if(GL2PS_ZERO(v[0]) && GL2PS_ZERO(v[1]) && GL2PS_ZERO(v[2])){ plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; } else{ if(GL2PS_ZERO(v[0])) w[0] = 1.0F; else if(GL2PS_ZERO(v[1])) w[1] = 1.0F; else w[2] = 1.0F; gl2psGetNormal(v, w, plane); plane[3] = - plane[0] * prim->verts[0].xyz[0] - plane[1] * prim->verts[0].xyz[1] - plane[2] * prim->verts[0].xyz[2]; } break; case GL2PS_POINT : case GL2PS_PIXMAP : case GL2PS_TEXT : case GL2PS_SPECIAL : case GL2PS_IMAGEMAP: plane[0] = plane[1] = 0.0F; plane[2] = 1.0F; plane[3] = -prim->verts[0].xyz[2]; break; default : gl2psMsg(GL2PS_ERROR, "Unknown primitive type in BSP tree"); plane[0] = plane[1] = plane[3] = 0.0F; plane[2] = 1.0F; break; } } static void gl2psCutEdge(GL2PSvertex *a, GL2PSvertex *b, GL2PSplane plane, GL2PSvertex *c) { GL2PSxyz v; GLfloat sect, psca; v[0] = b->xyz[0] - a->xyz[0]; v[1] = b->xyz[1] - a->xyz[1]; v[2] = b->xyz[2] - a->xyz[2]; if(!GL2PS_ZERO(psca = gl2psPsca(plane, v))) sect = -gl2psComparePointPlane(a->xyz, plane) / psca; else sect = 0.0F; c->xyz[0] = a->xyz[0] + v[0] * sect; c->xyz[1] = a->xyz[1] + v[1] * sect; c->xyz[2] = a->xyz[2] + v[2] * sect; c->rgba[0] = (1 - sect) * a->rgba[0] + sect * b->rgba[0]; c->rgba[1] = (1 - sect) * a->rgba[1] + sect * b->rgba[1]; c->rgba[2] = (1 - sect) * a->rgba[2] + sect * b->rgba[2]; c->rgba[3] = (1 - sect) * a->rgba[3] + sect * b->rgba[3]; } static void gl2psCreateSplitPrimitive(GL2PSprimitive *parent, GL2PSplane plane, GL2PSprimitive *child, GLshort numverts, GLshort *index0, GLshort *index1) { GLshort i; if(parent->type == GL2PS_IMAGEMAP){ child->type = GL2PS_IMAGEMAP; child->data.image = parent->data.image; } else{ if(numverts > 4){ gl2psMsg(GL2PS_WARNING, "%d vertices in polygon", numverts); numverts = 4; } switch(numverts){ case 1 : child->type = GL2PS_POINT; break; case 2 : child->type = GL2PS_LINE; break; case 3 : child->type = GL2PS_TRIANGLE; break; case 4 : child->type = GL2PS_QUADRANGLE; break; default: child->type = GL2PS_NO_TYPE; break; } } child->boundary = 0; /* FIXME: not done! */ child->culled = parent->culled; child->offset = parent->offset; child->pattern = parent->pattern; child->factor = parent->factor; child->width = parent->width; child->numverts = numverts; child->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); for(i = 0; i < numverts; i++){ if(index1[i] < 0){ child->verts[i] = parent->verts[index0[i]]; } else{ gl2psCutEdge(&parent->verts[index0[i]], &parent->verts[index1[i]], plane, &child->verts[i]); } } } static void gl2psAddIndex(GLshort *index0, GLshort *index1, GLshort *nb, GLshort i, GLshort j) { GLint k; for(k = 0; k < *nb; k++){ if((index0[k] == i && index1[k] == j) || (index1[k] == i && index0[k] == j)) return; } index0[*nb] = i; index1[*nb] = j; (*nb)++; } static GLshort gl2psGetIndex(GLshort i, GLshort num) { return (i < num - 1) ? i + 1 : 0; } static GLint gl2psTestSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane) { GLint type = GL2PS_COINCIDENT; GLshort i, j; GLfloat d[5]; for(i = 0; i < prim->numverts; i++){ d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); } if(prim->numverts < 2){ return 0; } else{ for(i = 0; i < prim->numverts; i++){ j = gl2psGetIndex(i, prim->numverts); if(d[j] > GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; else if(type != GL2PS_IN_BACK_OF) return 1; if(d[i] < -GL2PS_EPSILON) return 1; } else if(d[j] < -GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; else if(type != GL2PS_IN_FRONT_OF) return 1; if(d[i] > GL2PS_EPSILON) return 1; } } } return 0; } static GLint gl2psSplitPrimitive(GL2PSprimitive *prim, GL2PSplane plane, GL2PSprimitive **front, GL2PSprimitive **back) { GLshort i, j, in = 0, out = 0, in0[5], in1[5], out0[5], out1[5]; GLint type; GLfloat d[5]; type = GL2PS_COINCIDENT; for(i = 0; i < prim->numverts; i++){ d[i] = gl2psComparePointPlane(prim->verts[i].xyz, plane); } switch(prim->type){ case GL2PS_POINT : if(d[0] > GL2PS_EPSILON) type = GL2PS_IN_BACK_OF; else if(d[0] < -GL2PS_EPSILON) type = GL2PS_IN_FRONT_OF; else type = GL2PS_COINCIDENT; break; default : for(i = 0; i < prim->numverts; i++){ j = gl2psGetIndex(i, prim->numverts); if(d[j] > GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_BACK_OF; else if(type != GL2PS_IN_BACK_OF) type = GL2PS_SPANNING; if(d[i] < -GL2PS_EPSILON){ gl2psAddIndex(in0, in1, &in, i, j); gl2psAddIndex(out0, out1, &out, i, j); type = GL2PS_SPANNING; } gl2psAddIndex(out0, out1, &out, j, -1); } else if(d[j] < -GL2PS_EPSILON){ if(type == GL2PS_COINCIDENT) type = GL2PS_IN_FRONT_OF; else if(type != GL2PS_IN_FRONT_OF) type = GL2PS_SPANNING; if(d[i] > GL2PS_EPSILON){ gl2psAddIndex(in0, in1, &in, i, j); gl2psAddIndex(out0, out1, &out, i, j); type = GL2PS_SPANNING; } gl2psAddIndex(in0, in1, &in, j, -1); } else{ gl2psAddIndex(in0, in1, &in, j, -1); gl2psAddIndex(out0, out1, &out, j, -1); } } break; } if(type == GL2PS_SPANNING){ *back = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); *front = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); gl2psCreateSplitPrimitive(prim, plane, *back, out, out0, out1); gl2psCreateSplitPrimitive(prim, plane, *front, in, in0, in1); } return type; } static void gl2psDivideQuad(GL2PSprimitive *quad, GL2PSprimitive **t1, GL2PSprimitive **t2) { *t1 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); *t2 = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); (*t1)->type = (*t2)->type = GL2PS_TRIANGLE; (*t1)->numverts = (*t2)->numverts = 3; (*t1)->culled = (*t2)->culled = quad->culled; (*t1)->offset = (*t2)->offset = quad->offset; (*t1)->pattern = (*t2)->pattern = quad->pattern; (*t1)->factor = (*t2)->factor = quad->factor; (*t1)->width = (*t2)->width = quad->width; (*t1)->verts = (GL2PSvertex*)gl2psMalloc(3 * sizeof(GL2PSvertex)); (*t2)->verts = (GL2PSvertex*)gl2psMalloc(3 * sizeof(GL2PSvertex)); (*t1)->verts[0] = quad->verts[0]; (*t1)->verts[1] = quad->verts[1]; (*t1)->verts[2] = quad->verts[2]; (*t1)->boundary = ((quad->boundary & 1) ? 1 : 0) | ((quad->boundary & 2) ? 2 : 0); (*t2)->verts[0] = quad->verts[0]; (*t2)->verts[1] = quad->verts[2]; (*t2)->verts[2] = quad->verts[3]; (*t2)->boundary = ((quad->boundary & 4) ? 2 : 0) | ((quad->boundary & 8) ? 4 : 0); } static int gl2psCompareDepth(const void *a, const void *b) { const GL2PSprimitive *q, *w; GLfloat dq = 0.0F, dw = 0.0F, diff; int i; q = *(const GL2PSprimitive* const*)a; w = *(const GL2PSprimitive* const*)b; for(i = 0; i < q->numverts; i++){ dq += q->verts[i].xyz[2]; } dq /= (GLfloat)q->numverts; for(i = 0; i < w->numverts; i++){ dw += w->verts[i].xyz[2]; } dw /= (GLfloat)w->numverts; diff = dq - dw; if(diff > 0.){ return -1; } else if(diff < 0.){ return 1; } else{ return 0; } } static int gl2psTrianglesFirst(const void *a, const void *b) { const GL2PSprimitive *q, *w; q = *(const GL2PSprimitive* const*)a; w = *(const GL2PSprimitive* const*)b; return (q->type < w->type ? 1 : -1); } static GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root) { GLint i, j, count, best = 1000000, idx = 0; GL2PSprimitive *prim1, *prim2; GL2PSplane plane; GLint maxp; if(!gl2psListNbr(primitives)){ gl2psMsg(GL2PS_ERROR, "Cannot fint root in empty primitive list"); return 0; } *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0); if(gl2ps->options & GL2PS_BEST_ROOT){ maxp = gl2psListNbr(primitives); if(maxp > gl2ps->maxbestroot){ maxp = gl2ps->maxbestroot; } for(i = 0; i < maxp; i++){ prim1 = *(GL2PSprimitive**)gl2psListPointer(primitives, i); gl2psGetPlane(prim1, plane); count = 0; for(j = 0; j < gl2psListNbr(primitives); j++){ if(j != i){ prim2 = *(GL2PSprimitive**)gl2psListPointer(primitives, j); count += gl2psTestSplitPrimitive(prim2, plane); } if(count > best) break; } if(count < best){ best = count; idx = i; *root = prim1; if(!count) return idx; } } /* if(index) gl2psMsg(GL2PS_INFO, "GL2PS_BEST_ROOT was worth it: %d", index); */ return idx; } else{ return 0; } } static void gl2psFreeImagemap(GL2PSimagemap *list) { GL2PSimagemap *next; while(list != NULL){ next = list->next; gl2psFree(list->image->pixels); gl2psFree(list->image); gl2psFree(list); list = next; } } static void gl2psFreePrimitive(void *data) { GL2PSprimitive *q; q = *(GL2PSprimitive**)data; gl2psFree(q->verts); if(q->type == GL2PS_TEXT || q->type == GL2PS_SPECIAL){ gl2psFreeText(q->data.text); } else if(q->type == GL2PS_PIXMAP){ gl2psFreePixmap(q->data.image); } gl2psFree(q); } static void gl2psAddPrimitiveInList(GL2PSprimitive *prim, GL2PSlist *list) { GL2PSprimitive *t1, *t2; if(prim->type != GL2PS_QUADRANGLE){ gl2psListAdd(list, &prim); } else{ gl2psDivideQuad(prim, &t1, &t2); gl2psListAdd(list, &t1); gl2psListAdd(list, &t2); gl2psFreePrimitive(&prim); } } static void gl2psFreeBspTree(GL2PSbsptree **tree) { if(*tree){ if((*tree)->back) gl2psFreeBspTree(&(*tree)->back); if((*tree)->primitives){ gl2psListAction((*tree)->primitives, gl2psFreePrimitive); gl2psListDelete((*tree)->primitives); } if((*tree)->front) gl2psFreeBspTree(&(*tree)->front); gl2psFree(*tree); *tree = NULL; } } static GLboolean gl2psGreater(GLfloat f1, GLfloat f2) { if(f1 > f2) return GL_TRUE; else return GL_FALSE; } static GLboolean gl2psLess(GLfloat f1, GLfloat f2) { if(f1 < f2) return GL_TRUE; else return GL_FALSE; } static void gl2psBuildBspTree(GL2PSbsptree *tree, GL2PSlist *primitives) { GL2PSprimitive *prim, *frontprim = NULL, *backprim = NULL; GL2PSlist *frontlist, *backlist; GLint i, idx; tree->front = NULL; tree->back = NULL; tree->primitives = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); idx = gl2psFindRoot(primitives, &prim); gl2psGetPlane(prim, tree->plane); gl2psAddPrimitiveInList(prim, tree->primitives); frontlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); backlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); for(i = 0; i < gl2psListNbr(primitives); i++){ if(i != idx){ prim = *(GL2PSprimitive**)gl2psListPointer(primitives,i); switch(gl2psSplitPrimitive(prim, tree->plane, &frontprim, &backprim)){ case GL2PS_COINCIDENT: gl2psAddPrimitiveInList(prim, tree->primitives); break; case GL2PS_IN_BACK_OF: gl2psAddPrimitiveInList(prim, backlist); break; case GL2PS_IN_FRONT_OF: gl2psAddPrimitiveInList(prim, frontlist); break; case GL2PS_SPANNING: gl2psAddPrimitiveInList(backprim, backlist); gl2psAddPrimitiveInList(frontprim, frontlist); gl2psFreePrimitive(&prim); break; } } } if(gl2psListNbr(tree->primitives)){ gl2psListSort(tree->primitives, gl2psTrianglesFirst); } if(gl2psListNbr(frontlist)){ gl2psListSort(frontlist, gl2psTrianglesFirst); tree->front = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(tree->front, frontlist); } else{ gl2psListDelete(frontlist); } if(gl2psListNbr(backlist)){ gl2psListSort(backlist, gl2psTrianglesFirst); tree->back = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(tree->back, backlist); } else{ gl2psListDelete(backlist); } gl2psListDelete(primitives); } static void gl2psTraverseBspTree(GL2PSbsptree *tree, GL2PSxyz eye, GLfloat epsilon, GLboolean (*compare)(GLfloat f1, GLfloat f2), void (*action)(void *data), int inverse) { GLfloat result; if(!tree) return; result = gl2psComparePointPlane(eye, tree->plane); if(GL_TRUE == compare(result, epsilon)){ gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); if(inverse){ gl2psListActionInverse(tree->primitives, action); } else{ gl2psListAction(tree->primitives, action); } gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); } else if(GL_TRUE == compare(-epsilon, result)){ gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); if(inverse){ gl2psListActionInverse(tree->primitives, action); } else{ gl2psListAction(tree->primitives, action); } gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); } else{ gl2psTraverseBspTree(tree->front, eye, epsilon, compare, action, inverse); gl2psTraverseBspTree(tree->back, eye, epsilon, compare, action, inverse); } } static void gl2psRescaleAndOffset(void) { GL2PSprimitive *prim; GLfloat minZ, maxZ, rangeZ, scaleZ; GLfloat factor, units, area, dZ, dZdX, dZdY, maxdZ; int i, j; if(!gl2psListNbr(gl2ps->primitives)) return; /* get z-buffer range */ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, 0); minZ = maxZ = prim->verts[0].xyz[2]; for(i = 1; i < prim->numverts; i++){ if(prim->verts[i].xyz[2] < minZ) minZ = prim->verts[i].xyz[2]; if(prim->verts[i].xyz[2] > maxZ) maxZ = prim->verts[i].xyz[2]; } for(i = 1; i < gl2psListNbr(gl2ps->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, i); for(j = 0; j < prim->numverts; j++){ if(prim->verts[j].xyz[2] < minZ) minZ = prim->verts[j].xyz[2]; if(prim->verts[j].xyz[2] > maxZ) maxZ = prim->verts[j].xyz[2]; } } rangeZ = (maxZ - minZ); /* rescale z-buffer coordinate in [0,GL2PS_ZSCALE], to make it of the same order of magnitude as the x and y coordinates */ scaleZ = GL2PS_ZERO(rangeZ) ? GL2PS_ZSCALE : (GL2PS_ZSCALE / rangeZ); /* avoid precision loss (we use floats!) */ if(scaleZ > 100000.F) scaleZ = 100000.F; /* apply offsets */ for(i = 0; i < gl2psListNbr(gl2ps->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(gl2ps->primitives, i); for(j = 0; j < prim->numverts; j++){ prim->verts[j].xyz[2] = (prim->verts[j].xyz[2] - minZ) * scaleZ; } if((gl2ps->options & GL2PS_SIMPLE_LINE_OFFSET) && (prim->type == GL2PS_LINE)){ if(gl2ps->sort == GL2PS_SIMPLE_SORT){ prim->verts[0].xyz[2] -= GL2PS_ZOFFSET_LARGE; prim->verts[1].xyz[2] -= GL2PS_ZOFFSET_LARGE; } else{ prim->verts[0].xyz[2] -= GL2PS_ZOFFSET; prim->verts[1].xyz[2] -= GL2PS_ZOFFSET; } } else if(prim->offset && (prim->type == GL2PS_TRIANGLE)){ factor = gl2ps->offset[0]; units = gl2ps->offset[1]; area = (prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * (prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) - (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]); if(!GL2PS_ZERO(area)){ dZdX = ((prim->verts[2].xyz[1] - prim->verts[1].xyz[1]) * (prim->verts[1].xyz[2] - prim->verts[0].xyz[2]) - (prim->verts[1].xyz[1] - prim->verts[0].xyz[1]) * (prim->verts[2].xyz[2] - prim->verts[1].xyz[2])) / area; dZdY = ((prim->verts[1].xyz[0] - prim->verts[0].xyz[0]) * (prim->verts[2].xyz[2] - prim->verts[1].xyz[2]) - (prim->verts[2].xyz[0] - prim->verts[1].xyz[0]) * (prim->verts[1].xyz[2] - prim->verts[0].xyz[2])) / area; maxdZ = (GLfloat)sqrt(dZdX * dZdX + dZdY * dZdY); } else{ maxdZ = 0.0F; } dZ = factor * maxdZ + units; prim->verts[0].xyz[2] += dZ; prim->verts[1].xyz[2] += dZ; prim->verts[2].xyz[2] += dZ; } } } /********************************************************************* * * 2D sorting routines (for occlusion culling) * *********************************************************************/ static GLint gl2psGetPlaneFromPoints(GL2PSxyz a, GL2PSxyz b, GL2PSplane plane) { GLfloat n; plane[0] = b[1] - a[1]; plane[1] = a[0] - b[0]; n = (GLfloat)sqrt(plane[0]*plane[0] + plane[1]*plane[1]); plane[2] = 0.0F; if(!GL2PS_ZERO(n)){ plane[0] /= n; plane[1] /= n; plane[3] = -plane[0]*a[0]-plane[1]*a[1]; return 1; } else{ plane[0] = -1.0F; plane[1] = 0.0F; plane[3] = a[0]; return 0; } } static void gl2psFreeBspImageTree(GL2PSbsptree2d **tree) { if(*tree){ if((*tree)->back) gl2psFreeBspImageTree(&(*tree)->back); if((*tree)->front) gl2psFreeBspImageTree(&(*tree)->front); gl2psFree(*tree); *tree = NULL; } } static GLint gl2psCheckPoint(GL2PSxyz point, GL2PSplane plane) { GLfloat pt_dis; pt_dis = gl2psComparePointPlane(point, plane); if(pt_dis > GL2PS_EPSILON) return GL2PS_POINT_INFRONT; else if(pt_dis < -GL2PS_EPSILON) return GL2PS_POINT_BACK; else return GL2PS_POINT_COINCIDENT; } static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim, GL2PSbsptree2d **tree) { GLint ret = 0; GLint i; GLint offset = 0; GL2PSbsptree2d *head = NULL, *cur = NULL; if((*tree == NULL) && (prim->numverts > 2)){ /* don't cull if transparent for(i = 0; i < prim->numverts - 1; i++) if(prim->verts[i].rgba[3] < 1.0F) return; */ head = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); for(i = 0; i < prim->numverts-1; i++){ if(!gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[i+1].xyz, head->plane)){ if(prim->numverts-i > 3){ offset++; } else{ gl2psFree(head); return; } } else{ break; } } head->back = NULL; head->front = NULL; for(i = 2+offset; i < prim->numverts; i++){ ret = gl2psCheckPoint(prim->verts[i].xyz, head->plane); if(ret != GL2PS_POINT_COINCIDENT) break; } switch(ret){ case GL2PS_POINT_INFRONT : cur = head; for(i = 1+offset; i < prim->numverts-1; i++){ if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[i+1].xyz, cur->front->plane)){ cur = cur->front; cur->front = NULL; cur->back = NULL; } } if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i].xyz, prim->verts[offset].xyz, cur->front->plane)){ cur->front->front = NULL; cur->front->back = NULL; } else{ gl2psFree(cur->front); cur->front = NULL; } break; case GL2PS_POINT_BACK : for(i = 0; i < 4; i++){ head->plane[i] = -head->plane[i]; } cur = head; for(i = 1+offset; i < prim->numverts-1; i++){ if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[i+1].xyz, prim->verts[i].xyz, cur->front->plane)){ cur = cur->front; cur->front = NULL; cur->back = NULL; } } if(cur->front == NULL){ cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d)); } if(gl2psGetPlaneFromPoints(prim->verts[offset].xyz, prim->verts[i].xyz, cur->front->plane)){ cur->front->front = NULL; cur->front->back = NULL; } else{ gl2psFree(cur->front); cur->front = NULL; } break; default: gl2psFree(head); return; } (*tree) = head; } } static GLint gl2psCheckPrimitive(GL2PSprimitive *prim, GL2PSplane plane) { GLint i; GLint pos; pos = gl2psCheckPoint(prim->verts[0].xyz, plane); for(i = 1; i < prim->numverts; i++){ pos |= gl2psCheckPoint(prim->verts[i].xyz, plane); if(pos == (GL2PS_POINT_INFRONT | GL2PS_POINT_BACK)) return GL2PS_SPANNING; } if(pos & GL2PS_POINT_INFRONT) return GL2PS_IN_FRONT_OF; else if(pos & GL2PS_POINT_BACK) return GL2PS_IN_BACK_OF; else return GL2PS_COINCIDENT; } static GL2PSprimitive *gl2psCreateSplitPrimitive2D(GL2PSprimitive *parent, GLshort numverts, GL2PSvertex *vertx) { GLint i; GL2PSprimitive *child = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); if(parent->type == GL2PS_IMAGEMAP){ child->type = GL2PS_IMAGEMAP; child->data.image = parent->data.image; } else { switch(numverts){ case 1 : child->type = GL2PS_POINT; break; case 2 : child->type = GL2PS_LINE; break; case 3 : child->type = GL2PS_TRIANGLE; break; case 4 : child->type = GL2PS_QUADRANGLE; break; default: child->type = GL2PS_NO_TYPE; break; /* FIXME */ } } child->boundary = 0; /* FIXME: not done! */ child->culled = parent->culled; child->offset = parent->offset; child->pattern = parent->pattern; child->factor = parent->factor; child->width = parent->width; child->numverts = numverts; child->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); for(i = 0; i < numverts; i++){ child->verts[i] = vertx[i]; } return child; } static void gl2psSplitPrimitive2D(GL2PSprimitive *prim, GL2PSplane plane, GL2PSprimitive **front, GL2PSprimitive **back) { /* cur will hold the position of the current vertex prev will hold the position of the previous vertex prev0 will hold the position of the vertex number 0 v1 and v2 represent the current and previous vertices, respectively flag is set if the current vertex should be checked against the plane */ GLint cur = -1, prev = -1, i, v1 = 0, v2 = 0, flag = 1, prev0 = -1; /* list of vertices that will go in front and back primitive */ GL2PSvertex *front_list = NULL, *back_list = NULL; /* number of vertices in front and back list */ GLshort front_count = 0, back_count = 0; for(i = 0; i <= prim->numverts; i++){ v1 = i; if(v1 == prim->numverts){ if(prim->numverts < 3) break; v1 = 0; v2 = prim->numverts - 1; cur = prev0; } else if(flag){ cur = gl2psCheckPoint(prim->verts[v1].xyz, plane); if(i == 0){ prev0 = cur; } } if(((prev == -1) || (prev == cur) || (prev == 0) || (cur == 0)) && (i < prim->numverts)){ if(cur == GL2PS_POINT_INFRONT){ front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); front_list[front_count-1] = prim->verts[v1]; } else if(cur == GL2PS_POINT_BACK){ back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = prim->verts[v1]; } else{ front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); front_list[front_count-1] = prim->verts[v1]; back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = prim->verts[v1]; } flag = 1; } else if((prev != cur) && (cur != 0) && (prev != 0)){ if(v1 != 0){ v2 = v1-1; i--; } front_count++; front_list = (GL2PSvertex*)gl2psRealloc(front_list, sizeof(GL2PSvertex)*front_count); gl2psCutEdge(&prim->verts[v2], &prim->verts[v1], plane, &front_list[front_count-1]); back_count++; back_list = (GL2PSvertex*)gl2psRealloc(back_list, sizeof(GL2PSvertex)*back_count); back_list[back_count-1] = front_list[front_count-1]; flag = 0; } prev = cur; } *front = gl2psCreateSplitPrimitive2D(prim, front_count, front_list); *back = gl2psCreateSplitPrimitive2D(prim, back_count, back_list); gl2psFree(front_list); gl2psFree(back_list); } static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree) { GLint ret = 0; GL2PSprimitive *frontprim = NULL, *backprim = NULL; /* FIXME: until we consider the actual extent of text strings and pixmaps, never cull them. Otherwise the whole string/pixmap gets culled as soon as the reference point is hidden */ if(prim->type == GL2PS_PIXMAP || prim->type == GL2PS_TEXT || prim->type == GL2PS_SPECIAL){ return 1; } if(*tree == NULL){ if((prim->type != GL2PS_IMAGEMAP) && (GL_FALSE == gl2ps->zerosurfacearea)){ gl2psAddPlanesInBspTreeImage(gl2ps->primitivetoadd, tree); } return 1; } else{ switch(gl2psCheckPrimitive(prim, (*tree)->plane)){ case GL2PS_IN_BACK_OF: return gl2psAddInBspImageTree(prim, &(*tree)->back); case GL2PS_IN_FRONT_OF: if((*tree)->front != NULL) return gl2psAddInBspImageTree(prim, &(*tree)->front); else return 0; case GL2PS_SPANNING: gl2psSplitPrimitive2D(prim, (*tree)->plane, &frontprim, &backprim); ret = gl2psAddInBspImageTree(backprim, &(*tree)->back); if((*tree)->front != NULL){ if(gl2psAddInBspImageTree(frontprim, &(*tree)->front)){ ret = 1; } } gl2psFree(frontprim->verts); gl2psFree(frontprim); gl2psFree(backprim->verts); gl2psFree(backprim); return ret; case GL2PS_COINCIDENT: if((*tree)->back != NULL){ gl2ps->zerosurfacearea = GL_TRUE; ret = gl2psAddInBspImageTree(prim, &(*tree)->back); gl2ps->zerosurfacearea = GL_FALSE; if(ret) return ret; } if((*tree)->front != NULL){ gl2ps->zerosurfacearea = GL_TRUE; ret = gl2psAddInBspImageTree(prim, &(*tree)->front); gl2ps->zerosurfacearea = GL_FALSE; if(ret) return ret; } if(prim->type == GL2PS_LINE) return 1; else return 0; } } return 0; } static void gl2psAddInImageTree(void *data) { GL2PSprimitive *prim = *(GL2PSprimitive **)data; gl2ps->primitivetoadd = prim; if(prim->type == GL2PS_IMAGEMAP && prim->data.image->format == GL2PS_IMAGEMAP_VISIBLE){ prim->culled = 1; } else if(!gl2psAddInBspImageTree(prim, &gl2ps->imagetree)){ prim->culled = 1; } else if(prim->type == GL2PS_IMAGEMAP){ prim->data.image->format = GL2PS_IMAGEMAP_VISIBLE; } } /* Boundary construction */ static void gl2psAddBoundaryInList(GL2PSprimitive *prim, GL2PSlist *list) { GL2PSprimitive *b; GLshort i; GL2PSxyz c; c[0] = c[1] = c[2] = 0.0F; for(i = 0; i < prim->numverts; i++){ c[0] += prim->verts[i].xyz[0]; c[1] += prim->verts[i].xyz[1]; } c[0] /= prim->numverts; c[1] /= prim->numverts; for(i = 0; i < prim->numverts; i++){ if(prim->boundary & (GLint)pow(2., i)){ b = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); b->type = GL2PS_LINE; b->offset = prim->offset; b->pattern = prim->pattern; b->factor = prim->factor; b->culled = prim->culled; b->width = prim->width; b->boundary = 0; b->numverts = 2; b->verts = (GL2PSvertex*)gl2psMalloc(2 * sizeof(GL2PSvertex)); #if 0 /* FIXME: need to work on boundary offset... */ v[0] = c[0] - prim->verts[i].xyz[0]; v[1] = c[1] - prim->verts[i].xyz[1]; v[2] = 0.0F; norm = gl2psNorm(v); v[0] /= norm; v[1] /= norm; b->verts[0].xyz[0] = prim->verts[i].xyz[0] +0.1*v[0]; b->verts[0].xyz[1] = prim->verts[i].xyz[1] +0.1*v[1]; b->verts[0].xyz[2] = prim->verts[i].xyz[2]; v[0] = c[0] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; v[1] = c[1] - prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; norm = gl2psNorm(v); v[0] /= norm; v[1] /= norm; b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0] +0.1*v[0]; b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1] +0.1*v[1]; b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; #else b->verts[0].xyz[0] = prim->verts[i].xyz[0]; b->verts[0].xyz[1] = prim->verts[i].xyz[1]; b->verts[0].xyz[2] = prim->verts[i].xyz[2]; b->verts[1].xyz[0] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[0]; b->verts[1].xyz[1] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[1]; b->verts[1].xyz[2] = prim->verts[gl2psGetIndex(i, prim->numverts)].xyz[2]; #endif b->verts[0].rgba[0] = 0.0F; b->verts[0].rgba[1] = 0.0F; b->verts[0].rgba[2] = 0.0F; b->verts[0].rgba[3] = 0.0F; b->verts[1].rgba[0] = 0.0F; b->verts[1].rgba[1] = 0.0F; b->verts[1].rgba[2] = 0.0F; b->verts[1].rgba[3] = 0.0F; gl2psListAdd(list, &b); } } } static void gl2psBuildPolygonBoundary(GL2PSbsptree *tree) { GLint i; GL2PSprimitive *prim; if(!tree) return; gl2psBuildPolygonBoundary(tree->back); for(i = 0; i < gl2psListNbr(tree->primitives); i++){ prim = *(GL2PSprimitive**)gl2psListPointer(tree->primitives, i); if(prim->boundary) gl2psAddBoundaryInList(prim, tree->primitives); } gl2psBuildPolygonBoundary(tree->front); } /********************************************************************* * * Feedback buffer parser * *********************************************************************/ static void gl2psAddPolyPrimitive(GLshort type, GLshort numverts, GL2PSvertex *verts, GLint offset, GLushort pattern, GLint factor, GLfloat width, char boundary) { GL2PSprimitive *prim; prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = type; prim->numverts = numverts; prim->verts = (GL2PSvertex*)gl2psMalloc(numverts * sizeof(GL2PSvertex)); memcpy(prim->verts, verts, numverts * sizeof(GL2PSvertex)); prim->boundary = boundary; prim->offset = offset; prim->pattern = pattern; prim->factor = factor; prim->width = width; prim->culled = 0; /* FIXME: here we should have an option to split stretched tris/quads to enhance SIMPLE_SORT */ gl2psListAdd(gl2ps->primitives, &prim); } static GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p) { GLint i; v->xyz[0] = p[0]; v->xyz[1] = p[1]; v->xyz[2] = p[2]; if(gl2ps->colormode == GL_COLOR_INDEX && gl2ps->colorsize > 0){ i = (GLint)(p[3] + 0.5); v->rgba[0] = gl2ps->colormap[i][0]; v->rgba[1] = gl2ps->colormap[i][1]; v->rgba[2] = gl2ps->colormap[i][2]; v->rgba[3] = gl2ps->colormap[i][3]; return 4; } else{ v->rgba[0] = p[3]; v->rgba[1] = p[4]; v->rgba[2] = p[5]; v->rgba[3] = p[6]; return 7; } } static void gl2psParseFeedbackBuffer(GLint used) { char flag; GLushort pattern = 0; GLboolean boundary; GLint i, sizeoffloat, count, v, vtot, offset = 0, factor = 0, auxindex = 0; GLfloat lwidth = 1.0F, psize = 1.0F; GLfloat *current; GL2PSvertex vertices[3]; GL2PSprimitive *prim; GL2PSimagemap *node; current = gl2ps->feedback; boundary = gl2ps->boundary = GL_FALSE; while(used > 0){ if(GL_TRUE == boundary) gl2ps->boundary = GL_TRUE; switch((GLint)*current){ case GL_POINT_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; gl2psAddPolyPrimitive(GL2PS_POINT, 1, vertices, 0, pattern, factor, psize, 0); break; case GL_LINE_TOKEN : case GL_LINE_RESET_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; i = gl2psGetVertex(&vertices[1], current); current += i; used -= i; gl2psAddPolyPrimitive(GL2PS_LINE, 2, vertices, 0, pattern, factor, lwidth, 0); break; case GL_POLYGON_TOKEN : count = (GLint)current[1]; current += 2; used -= 2; v = vtot = 0; while(count > 0 && used > 0){ i = gl2psGetVertex(&vertices[v], current); gl2psAdaptVertexForBlending(&vertices[v]); current += i; used -= i; count --; vtot++; if(v == 2){ if(GL_TRUE == boundary){ if(!count && vtot == 2) flag = 1|2|4; else if(!count) flag = 2|4; else if(vtot == 2) flag = 1|2; else flag = 2; } else flag = 0; gl2psAddPolyPrimitive(GL2PS_TRIANGLE, 3, vertices, offset, pattern, factor, 1, flag); vertices[1] = vertices[2]; } else v ++; } break; case GL_BITMAP_TOKEN : case GL_DRAW_PIXEL_TOKEN : case GL_COPY_PIXEL_TOKEN : current ++; used --; i = gl2psGetVertex(&vertices[0], current); current += i; used -= i; break; case GL_PASS_THROUGH_TOKEN : switch((GLint)current[1]){ case GL2PS_BEGIN_OFFSET_TOKEN : offset = 1; break; case GL2PS_END_OFFSET_TOKEN : offset = 0; break; case GL2PS_BEGIN_BOUNDARY_TOKEN : boundary = GL_TRUE; break; case GL2PS_END_BOUNDARY_TOKEN : boundary = GL_FALSE; break; case GL2PS_END_STIPPLE_TOKEN : pattern = factor = 0; break; case GL2PS_BEGIN_BLEND_TOKEN : gl2ps->blending = GL_TRUE; break; case GL2PS_END_BLEND_TOKEN : gl2ps->blending = GL_FALSE; break; case GL2PS_BEGIN_STIPPLE_TOKEN : current += 2; used -= 2; pattern = (GLushort)current[1]; current += 2; used -= 2; factor = (GLint)current[1]; break; case GL2PS_SRC_BLEND_TOKEN : current += 2; used -= 2; gl2ps->blendfunc[0] = (GLint)current[1]; break; case GL2PS_DST_BLEND_TOKEN : current += 2; used -= 2; gl2ps->blendfunc[1] = (GLint)current[1]; break; case GL2PS_POINT_SIZE_TOKEN : current += 2; used -= 2; psize = current[1]; break; case GL2PS_LINE_WIDTH_TOKEN : current += 2; used -= 2; lwidth = current[1]; break; case GL2PS_IMAGEMAP_TOKEN : prim = (GL2PSprimitive *)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = GL2PS_IMAGEMAP; prim->boundary = 0; prim->numverts = 4; prim->verts = (GL2PSvertex *)gl2psMalloc(4 * sizeof(GL2PSvertex)); prim->culled = 0; prim->offset = 0; prim->pattern = 0; prim->factor = 0; prim->width = 1; node = (GL2PSimagemap*)gl2psMalloc(sizeof(GL2PSimagemap)); node->image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); node->image->type = 0; node->image->format = 0; node->image->zoom_x = 1.0F; node->image->zoom_y = 1.0F; node->next = NULL; if(gl2ps->imagemap_head == NULL) gl2ps->imagemap_head = node; else gl2ps->imagemap_tail->next = node; gl2ps->imagemap_tail = node; prim->data.image = node->image; current += 2; used -= 2; i = gl2psGetVertex(&prim->verts[0], ¤t[1]); current += i; used -= i; node->image->width = (GLint)current[2]; current += 2; used -= 2; node->image->height = (GLint)current[2]; prim->verts[0].xyz[0] = prim->verts[0].xyz[0] - (int)(node->image->width / 2) + 0.5F; prim->verts[0].xyz[1] = prim->verts[0].xyz[1] - (int)(node->image->height / 2) + 0.5F; for(i = 1; i < 4; i++){ for(v = 0; v < 3; v++){ prim->verts[i].xyz[v] = prim->verts[0].xyz[v]; prim->verts[i].rgba[v] = prim->verts[0].rgba[v]; } prim->verts[i].rgba[v] = prim->verts[0].rgba[v]; } prim->verts[1].xyz[0] = prim->verts[1].xyz[0] + node->image->width; prim->verts[2].xyz[0] = prim->verts[1].xyz[0]; prim->verts[2].xyz[1] = prim->verts[2].xyz[1] + node->image->height; prim->verts[3].xyz[1] = prim->verts[2].xyz[1]; sizeoffloat = sizeof(GLfloat); v = 2 * sizeoffloat; vtot = node->image->height + node->image->height * ((node->image->width - 1) / 8); node->image->pixels = (GLfloat*)gl2psMalloc(v + vtot); node->image->pixels[0] = prim->verts[0].xyz[0]; node->image->pixels[1] = prim->verts[0].xyz[1]; for(i = 0; i < vtot; i += sizeoffloat){ current += 2; used -= 2; if((vtot - i) >= 4) memcpy(&(((char*)(node->image->pixels))[i + v]), &(current[2]), sizeoffloat); else memcpy(&(((char*)(node->image->pixels))[i + v]), &(current[2]), vtot - i); } current++; used--; gl2psListAdd(gl2ps->primitives, &prim); break; case GL2PS_DRAW_PIXELS_TOKEN : case GL2PS_TEXT_TOKEN : if(auxindex < gl2psListNbr(gl2ps->auxprimitives)) gl2psListAdd(gl2ps->primitives, gl2psListPointer(gl2ps->auxprimitives, auxindex++)); else gl2psMsg(GL2PS_ERROR, "Wrong number of auxiliary tokens in buffer"); break; } current += 2; used -= 2; break; default : gl2psMsg(GL2PS_WARNING, "Unknown token in buffer"); current ++; used --; break; } } gl2psListReset(gl2ps->auxprimitives); } /********************************************************************* * * PostScript routines * *********************************************************************/ static void gl2psWriteByte(unsigned char byte) { unsigned char h = byte / 16; unsigned char l = byte % 16; gl2psPrintf("%x%x", h, l); } static void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GL2PSimage *im) { GLuint nbhex, nbyte, nrgb, nbits; GLuint row, col, ibyte, icase; GLfloat dr, dg, db, fgrey; unsigned char red = 0, green = 0, blue = 0, b, grey; GLuint width = (GLuint)im->width; GLuint height = (GLuint)im->height; /* FIXME: should we define an option for these? Or just keep the 8-bit per component case? */ int greyscale = 0; /* set to 1 to output greyscale image */ int nbit = 8; /* number of bits per color compoment (2, 4 or 8) */ if((width <= 0) || (height <= 0)) return; gl2psPrintf("gsave\n"); gl2psPrintf("%.2f %.2f translate\n", x, y); gl2psPrintf("%.2f %.2f scale\n", width * im->zoom_x, height * im->zoom_y); if(greyscale){ /* greyscale */ gl2psPrintf("/picstr %d string def\n", width); gl2psPrintf("%d %d %d\n", width, height, 8); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile picstr readhexstring pop }\n"); gl2psPrintf("image\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ gl2psGetRGB(im, col, row, &dr, &dg, &db); fgrey = (0.30F * dr + 0.59F * dg + 0.11F * db); grey = (unsigned char)(255. * fgrey); gl2psWriteByte(grey); } gl2psPrintf("\n"); } nbhex = width * height * 2; gl2psPrintf("%%%% nbhex digit :%d\n", nbhex); } else if(nbit == 2){ /* color, 2 bits for r and g and b; rgbs following each other */ nrgb = width * 3; nbits = nrgb * nbit; nbyte = nbits / 8; if((nbyte * 8) != nbits) nbyte++; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, nbit); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ icase = 1; col = 0; b = 0; for(ibyte = 0; ibyte < nbyte; ibyte++){ if(icase == 1) { if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = red; b = (b<<2) + green; b = (b<<2) + blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; gl2psWriteByte(b); b = 0; icase++; } else if(icase == 2) { b = green; b = (b<<2) + blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; b = (b<<2) + green; gl2psWriteByte(b); b = 0; icase++; } else if(icase == 3) { b = blue; if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(3. * dr); green = (unsigned char)(3. * dg); blue = (unsigned char)(3. * db); b = (b<<2) + red; b = (b<<2) + green; b = (b<<2) + blue; gl2psWriteByte(b); b = 0; icase = 1; } } gl2psPrintf("\n"); } } else if(nbit == 4){ /* color, 4 bits for r and g and b; rgbs following each other */ nrgb = width * 3; nbits = nrgb * nbit; nbyte = nbits / 8; if((nbyte * 8) != nbits) nbyte++; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, nbit); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ col = 0; icase = 1; for(ibyte = 0; ibyte < nbyte; ibyte++){ if(icase == 1) { if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(15. * dr); green = (unsigned char)(15. * dg); gl2psPrintf("%x%x", red, green); icase++; } else if(icase == 2) { blue = (unsigned char)(15. * db); if(col < width) { gl2psGetRGB(im, col, row, &dr, &dg, &db); } else { dr = dg = db = 0; } col++; red = (unsigned char)(15. * dr); gl2psPrintf("%x%x", blue, red); icase++; } else if(icase == 3) { green = (unsigned char)(15. * dg); blue = (unsigned char)(15. * db); gl2psPrintf("%x%x", green, blue); icase = 1; } } gl2psPrintf("\n"); } } else{ /* 8 bit for r and g and b */ nbyte = width * 3; gl2psPrintf("/rgbstr %d string def\n", nbyte); gl2psPrintf("%d %d %d\n", width, height, 8); gl2psPrintf("[ %d 0 0 -%d 0 %d ]\n", width, height, height); gl2psPrintf("{ currentfile rgbstr readhexstring pop }\n"); gl2psPrintf("false 3\n"); gl2psPrintf("colorimage\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ gl2psGetRGB(im, col, row, &dr, &dg, &db); red = (unsigned char)(255. * dr); gl2psWriteByte(red); green = (unsigned char)(255. * dg); gl2psWriteByte(green); blue = (unsigned char)(255. * db); gl2psWriteByte(blue); } gl2psPrintf("\n"); } } gl2psPrintf("grestore\n"); } static void gl2psPrintPostScriptImagemap(GLfloat x, GLfloat y, GLsizei width, GLsizei height, const unsigned char *imagemap){ int i, size; if((width <= 0) || (height <= 0)) return; size = height + height * (width - 1) / 8; gl2psPrintf("gsave\n"); gl2psPrintf("%.2f %.2f translate\n", x, y); gl2psPrintf("%d %d scale\n%d %d\ntrue\n", width, height,width, height); gl2psPrintf("[ %d 0 0 -%d 0 %d ] {<", width, height); for(i = 0; i < size; i++){ gl2psWriteByte(*imagemap); imagemap++; } gl2psPrintf(">} imagemask\ngrestore\n"); } static void gl2psPrintPostScriptHeader(void) { time_t now; /* Since compression is not part of the PostScript standard, compressed PostScript files are just gzipped PostScript files ("ps.gz" or "eps.gz") */ gl2psPrintGzipHeader(); time(&now); if(gl2ps->format == GL2PS_PS){ gl2psPrintf("%%!PS-Adobe-3.0\n"); } else{ gl2psPrintf("%%!PS-Adobe-3.0 EPSF-3.0\n"); } gl2psPrintf("%%%%Title: %s\n" "%%%%Creator: GL2PS %d.%d.%d%s, %s\n" "%%%%For: %s\n" "%%%%CreationDate: %s" "%%%%LanguageLevel: 3\n" "%%%%DocumentData: Clean7Bit\n" "%%%%Pages: 1\n", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); if(gl2ps->format == GL2PS_PS){ gl2psPrintf("%%%%Orientation: %s\n" "%%%%DocumentMedia: Default %d %d 0 () ()\n", (gl2ps->options & GL2PS_LANDSCAPE) ? "Landscape" : "Portrait", (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[3] : (int)gl2ps->viewport[2], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[2] : (int)gl2ps->viewport[3]); } gl2psPrintf("%%%%BoundingBox: %d %d %d %d\n" "%%%%EndComments\n", (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[1] : (int)gl2ps->viewport[0], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[0] : (int)gl2ps->viewport[1], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[3] : (int)gl2ps->viewport[2], (gl2ps->options & GL2PS_LANDSCAPE) ? (int)gl2ps->viewport[2] : (int)gl2ps->viewport[3]); /* RGB color: r g b C (replace C by G in output to change from rgb to gray) Grayscale: r g b G Font choose: size fontname FC Text string: (string) x y size fontname S?? Rotated text string: (string) angle x y size fontname S??R Point primitive: x y size P Line width: width W Line start: x y LS Line joining last point: x y L Line end: x y LE Flat-shaded triangle: x3 y3 x2 y2 x1 y1 T Smooth-shaded triangle: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST */ gl2psPrintf("%%%%BeginProlog\n" "/gl2psdict 64 dict def gl2psdict begin\n" "0 setlinecap 0 setlinejoin\n" "/tryPS3shading %s def %% set to false to force subdivision\n" "/rThreshold %g def %% red component subdivision threshold\n" "/gThreshold %g def %% green component subdivision threshold\n" "/bThreshold %g def %% blue component subdivision threshold\n", (gl2ps->options & GL2PS_NO_PS3_SHADING) ? "false" : "true", gl2ps->threshold[0], gl2ps->threshold[1], gl2ps->threshold[2]); gl2psPrintf("/BD { bind def } bind def\n" "/C { setrgbcolor } BD\n" "/G { 0.082 mul exch 0.6094 mul add exch 0.3086 mul add neg 1.0 add setgray } BD\n" "/W { setlinewidth } BD\n"); gl2psPrintf("/FC { findfont exch /SH exch def SH scalefont setfont } BD\n" "/SW { dup stringwidth pop } BD\n" "/S { FC moveto show } BD\n" "/SBC{ FC moveto SW -2 div 0 rmoveto show } BD\n" "/SBR{ FC moveto SW neg 0 rmoveto show } BD\n" "/SCL{ FC moveto 0 SH -2 div rmoveto show } BD\n" "/SCC{ FC moveto SW -2 div SH -2 div rmoveto show } BD\n" "/SCR{ FC moveto SW neg SH -2 div rmoveto show } BD\n" "/STL{ FC moveto 0 SH neg rmoveto show } BD\n" "/STC{ FC moveto SW -2 div SH neg rmoveto show } BD\n" "/STR{ FC moveto SW neg SH neg rmoveto show } BD\n"); /* rotated text routines: same nameanem with R appended */ gl2psPrintf("/FCT { FC translate 0 0 } BD\n" "/SR { gsave FCT moveto rotate show grestore } BD\n" "/SBCR{ gsave FCT moveto rotate SW -2 div 0 rmoveto show grestore } BD\n" "/SBRR{ gsave FCT moveto rotate SW neg 0 rmoveto show grestore } BD\n" "/SCLR{ gsave FCT moveto rotate 0 SH -2 div rmoveto show grestore} BD\n"); gl2psPrintf("/SCCR{ gsave FCT moveto rotate SW -2 div SH -2 div rmoveto show grestore} BD\n" "/SCRR{ gsave FCT moveto rotate SW neg SH -2 div rmoveto show grestore} BD\n" "/STLR{ gsave FCT moveto rotate 0 SH neg rmoveto show grestore } BD\n" "/STCR{ gsave FCT moveto rotate SW -2 div SH neg rmoveto show grestore } BD\n" "/STRR{ gsave FCT moveto rotate SW neg SH neg rmoveto show grestore } BD\n"); gl2psPrintf("/P { newpath 0.0 360.0 arc closepath fill } BD\n" "/LS { newpath moveto } BD\n" "/L { lineto } BD\n" "/LE { lineto stroke } BD\n" "/T { newpath moveto lineto lineto closepath fill } BD\n"); /* Smooth-shaded triangle with PostScript level 3 shfill operator: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STshfill */ gl2psPrintf("/STshfill {\n" " /b1 exch def /g1 exch def /r1 exch def /y1 exch def /x1 exch def\n" " /b2 exch def /g2 exch def /r2 exch def /y2 exch def /x2 exch def\n" " /b3 exch def /g3 exch def /r3 exch def /y3 exch def /x3 exch def\n" " gsave << /ShadingType 4 /ColorSpace [/DeviceRGB]\n" " /DataSource [ 0 x1 y1 r1 g1 b1 0 x2 y2 r2 g2 b2 0 x3 y3 r3 g3 b3 ] >>\n" " shfill grestore } BD\n"); /* Flat-shaded triangle with middle color: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 Tm */ gl2psPrintf(/* stack : x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 */ "/Tm { 3 -1 roll 8 -1 roll 13 -1 roll add add 3 div\n" /* r = (r1+r2+r3)/3 */ /* stack : x3 y3 g3 b3 x2 y2 g2 b2 x1 y1 g1 b1 r */ " 3 -1 roll 7 -1 roll 11 -1 roll add add 3 div\n" /* g = (g1+g2+g3)/3 */ /* stack : x3 y3 b3 x2 y2 b2 x1 y1 b1 r g b */ " 3 -1 roll 6 -1 roll 9 -1 roll add add 3 div" /* b = (b1+b2+b3)/3 */ /* stack : x3 y3 x2 y2 x1 y1 r g b */ " C T } BD\n"); /* Split triangle in four sub-triangles (at sides middle points) and call the STnoshfill procedure on each, interpolating the colors in RGB space: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STsplit (in procedure comments key: (Vi) = xi yi ri gi bi) */ gl2psPrintf("/STsplit {\n" " 4 index 15 index add 0.5 mul\n" /* x13 = (x1+x3)/2 */ " 4 index 15 index add 0.5 mul\n" /* y13 = (y1+y3)/2 */ " 4 index 15 index add 0.5 mul\n" /* r13 = (r1+r3)/2 */ " 4 index 15 index add 0.5 mul\n" /* g13 = (g1+g3)/2 */ " 4 index 15 index add 0.5 mul\n" /* b13 = (b1+b3)/2 */ " 5 copy 5 copy 25 15 roll\n"); /* at his point, stack = (V3) (V13) (V13) (V13) (V2) (V1) */ gl2psPrintf(" 9 index 30 index add 0.5 mul\n" /* x23 = (x2+x3)/2 */ " 9 index 30 index add 0.5 mul\n" /* y23 = (y2+y3)/2 */ " 9 index 30 index add 0.5 mul\n" /* r23 = (r2+r3)/2 */ " 9 index 30 index add 0.5 mul\n" /* g23 = (g2+g3)/2 */ " 9 index 30 index add 0.5 mul\n" /* b23 = (b2+b3)/2 */ " 5 copy 5 copy 35 5 roll 25 5 roll 15 5 roll\n"); /* stack = (V3) (V13) (V23) (V13) (V23) (V13) (V23) (V2) (V1) */ gl2psPrintf(" 4 index 10 index add 0.5 mul\n" /* x12 = (x1+x2)/2 */ " 4 index 10 index add 0.5 mul\n" /* y12 = (y1+y2)/2 */ " 4 index 10 index add 0.5 mul\n" /* r12 = (r1+r2)/2 */ " 4 index 10 index add 0.5 mul\n" /* g12 = (g1+g2)/2 */ " 4 index 10 index add 0.5 mul\n" /* b12 = (b1+b2)/2 */ " 5 copy 5 copy 40 5 roll 25 5 roll 15 5 roll 25 5 roll\n"); /* stack = (V3) (V13) (V23) (V13) (V12) (V23) (V13) (V1) (V12) (V23) (V12) (V2) */ gl2psPrintf(" STnoshfill STnoshfill STnoshfill STnoshfill } BD\n"); /* Gouraud shaded triangle using recursive subdivision until the difference between corner colors does not exceed the thresholds: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 STnoshfill */ gl2psPrintf("/STnoshfill {\n" " 2 index 8 index sub abs rThreshold gt\n" /* |r1-r2|>rth */ " { STsplit }\n" " { 1 index 7 index sub abs gThreshold gt\n" /* |g1-g2|>gth */ " { STsplit }\n" " { dup 6 index sub abs bThreshold gt\n" /* |b1-b2|>bth */ " { STsplit }\n" " { 2 index 13 index sub abs rThreshold gt\n" /* |r1-r3|>rht */ " { STsplit }\n" " { 1 index 12 index sub abs gThreshold gt\n" /* |g1-g3|>gth */ " { STsplit }\n" " { dup 11 index sub abs bThreshold gt\n" /* |b1-b3|>bth */ " { STsplit }\n" " { 7 index 13 index sub abs rThreshold gt\n"); /* |r2-r3|>rht */ gl2psPrintf(" { STsplit }\n" " { 6 index 12 index sub abs gThreshold gt\n" /* |g2-g3|>gth */ " { STsplit }\n" " { 5 index 11 index sub abs bThreshold gt\n" /* |b2-b3|>bth */ " { STsplit }\n" " { Tm }\n" /* all colors sufficiently similar */ " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse }\n" " ifelse } BD\n"); gl2psPrintf("tryPS3shading\n" "{ /shfill where\n" " { /ST { STshfill } BD }\n" " { /ST { STnoshfill } BD }\n" " ifelse }\n" "{ /ST { STnoshfill } BD }\n" "ifelse\n"); gl2psPrintf("end\n" "%%%%EndProlog\n" "%%%%BeginSetup\n" "/DeviceRGB setcolorspace\n" "gl2psdict begin\n" "%%%%EndSetup\n" "%%%%Page: 1 1\n" "%%%%BeginPageSetup\n"); if(gl2ps->options & GL2PS_LANDSCAPE){ gl2psPrintf("%d 0 translate 90 rotate\n", (int)gl2ps->viewport[3]); } gl2psPrintf("%%%%EndPageSetup\n" "mark\n" "gsave\n" "1.0 1.0 scale\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psPrintf("%g %g %g C\n" "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath fill\n", gl2ps->bgcolor[0], gl2ps->bgcolor[1], gl2ps->bgcolor[2], (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3], (int)gl2ps->viewport[0], (int)gl2ps->viewport[3]); } } static void gl2psPrintPostScriptColor(GL2PSrgba rgba) { if(!gl2psSameColor(gl2ps->lastrgba, rgba)){ gl2psSetLastColor(rgba); gl2psPrintf("%g %g %g C\n", rgba[0], rgba[1], rgba[2]); } } static void gl2psResetPostScriptColor(void) { gl2ps->lastrgba[0] = gl2ps->lastrgba[1] = gl2ps->lastrgba[2] = -1.; } static void gl2psEndPostScriptLine(void) { int i; if(gl2ps->lastvertex.rgba[0] >= 0.){ gl2psPrintf("%g %g LE\n", gl2ps->lastvertex.xyz[0], gl2ps->lastvertex.xyz[1]); for(i = 0; i < 3; i++) gl2ps->lastvertex.xyz[i] = -1.; for(i = 0; i < 4; i++) gl2ps->lastvertex.rgba[i] = -1.; } } static void gl2psParseStipplePattern(GLushort pattern, GLint factor, int *nb, int array[10]) { int i, n; int on[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int off[8] = {0, 0, 0, 0, 0, 0, 0, 0}; char tmp[16]; /* extract the 16 bits from the OpenGL stipple pattern */ for(n = 15; n >= 0; n--){ tmp[n] = (char)(pattern & 0x01); pattern >>= 1; } /* compute the on/off pixel sequence */ n = 0; for(i = 0; i < 8; i++){ while(n < 16 && !tmp[n]){ off[i]++; n++; } while(n < 16 && tmp[n]){ on[i]++; n++; } if(n >= 15){ i++; break; } } /* store the on/off array from right to left, starting with off pixels. The PostScript specification allows for at most 11 elements in the on/off array, so we limit ourselves to 5 on/off couples (our longest possible array is thus [on4 off4 on3 off3 on2 off2 on1 off1 on0 off0]) */ *nb = 0; for(n = i - 1; n >= 0; n--){ array[(*nb)++] = factor * on[n]; array[(*nb)++] = factor * off[n]; if(*nb == 10) break; } } static int gl2psPrintPostScriptDash(GLushort pattern, GLint factor, const char *str) { int len = 0, i, n, array[10]; if(pattern == gl2ps->lastpattern && factor == gl2ps->lastfactor) return 0; gl2ps->lastpattern = pattern; gl2ps->lastfactor = factor; if(!pattern || !factor){ /* solid line */ len += gl2psPrintf("[] 0 %s\n", str); } else{ gl2psParseStipplePattern(pattern, factor, &n, array); len += gl2psPrintf("["); for(i = 0; i < n; i++){ if(i) len += gl2psPrintf(" "); len += gl2psPrintf("%d", array[i]); } len += gl2psPrintf("] 0 %s\n", str); } return len; } static void gl2psPrintPostScriptPrimitive(void *data) { int newline; GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; /* Every effort is made to draw lines as connected segments (i.e., using a single PostScript path): this is the only way to get nice line joins and to not restart the stippling for every line segment. So if the primitive to print is not a line we must first finish the current line (if any): */ if(prim->type != GL2PS_LINE) gl2psEndPostScriptLine(); switch(prim->type){ case GL2PS_POINT : gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %g P\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], 0.5 * prim->width); break; case GL2PS_LINE : if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) || !gl2psSameColor(gl2ps->lastrgba, prim->verts[0].rgba) || gl2ps->lastlinewidth != prim->width || gl2ps->lastpattern != prim->pattern || gl2ps->lastfactor != prim->factor){ /* End the current line if the new segment does not start where the last one ended, or if the color, the width or the stippling have changed (multi-stroking lines with changing colors is necessary until we use /shfill for lines; unfortunately this means that at the moment we can screw up line stippling for smooth-shaded lines) */ gl2psEndPostScriptLine(); newline = 1; } else{ newline = 0; } if(gl2ps->lastlinewidth != prim->width){ gl2ps->lastlinewidth = prim->width; gl2psPrintf("%g W\n", gl2ps->lastlinewidth); } gl2psPrintPostScriptDash(prim->pattern, prim->factor, "setdash"); gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %s\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], newline ? "LS" : "L"); gl2ps->lastvertex = prim->verts[1]; break; case GL2PS_TRIANGLE : if(!gl2psVertsSameColor(prim)){ gl2psResetPostScriptColor(); gl2psPrintf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[2].rgba[0], prim->verts[2].rgba[1], prim->verts[2].rgba[2], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[1].rgba[0], prim->verts[1].rgba[1], prim->verts[1].rgba[2], prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2]); } else{ gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("%g %g %g %g %g %g T\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_QUADRANGLE : gl2psMsg(GL2PS_WARNING, "There should not be any quad left to print"); break; case GL2PS_PIXMAP : gl2psPrintPostScriptPixmap(prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->data.image); break; case GL2PS_IMAGEMAP : if(prim->data.image->type != GL2PS_IMAGEMAP_WRITTEN){ gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintPostScriptImagemap(prim->data.image->pixels[0], prim->data.image->pixels[1], prim->data.image->width, prim->data.image->height, (const unsigned char*)(&(prim->data.image->pixels[2]))); prim->data.image->type = GL2PS_IMAGEMAP_WRITTEN; } break; case GL2PS_TEXT : gl2psPrintPostScriptColor(prim->verts[0].rgba); gl2psPrintf("(%s) ", prim->data.text->str); if(prim->data.text->angle) gl2psPrintf("%g ", prim->data.text->angle); gl2psPrintf("%g %g %d /%s ", prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->data.text->fontsize, prim->data.text->fontname); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: gl2psPrintf(prim->data.text->angle ? "SCCR\n" : "SCC\n"); break; case GL2PS_TEXT_CL: gl2psPrintf(prim->data.text->angle ? "SCLR\n" : "SCL\n"); break; case GL2PS_TEXT_CR: gl2psPrintf(prim->data.text->angle ? "SCRR\n" : "SCR\n"); break; case GL2PS_TEXT_B: gl2psPrintf(prim->data.text->angle ? "SBCR\n" : "SBC\n"); break; case GL2PS_TEXT_BR: gl2psPrintf(prim->data.text->angle ? "SBRR\n" : "SBR\n"); break; case GL2PS_TEXT_T: gl2psPrintf(prim->data.text->angle ? "STCR\n" : "STC\n"); break; case GL2PS_TEXT_TL: gl2psPrintf(prim->data.text->angle ? "STLR\n" : "STL\n"); break; case GL2PS_TEXT_TR: gl2psPrintf(prim->data.text->angle ? "STRR\n" : "STR\n"); break; case GL2PS_TEXT_BL: default: gl2psPrintf(prim->data.text->angle ? "SR\n" : "S\n"); break; } break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(prim->data.text->alignment == GL2PS_PS || prim->data.text->alignment == GL2PS_EPS) gl2psPrintf("%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintPostScriptFooter(void) { gl2psPrintf("grestore\n" "showpage\n" "cleartomark\n" "%%%%PageTrailer\n" "%%%%Trailer\n" "end\n" "%%%%EOF\n"); gl2psPrintGzipFooter(); } static void gl2psPrintPostScriptBeginViewport(GLint viewport[4]) { GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintPostScriptHeader(); gl2ps->header = GL_FALSE; } gl2psPrintf("gsave\n" "1.0 1.0 scale\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psPrintf("%g %g %g C\n" "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath fill\n", rgba[0], rgba[1], rgba[2], x, y, x+w, y, x+w, y+h, x, y+h); } gl2psPrintf("newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath clip\n", x, y, x+w, y, x+w, y+h, x, y+h); } static GLint gl2psPrintPostScriptEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2psPrintf("grestore\n"); return res; } static void gl2psPrintPostScriptFinalPrimitive(void) { /* End any remaining line, if any */ gl2psEndPostScriptLine(); } /* definition of the PostScript and Encapsulated PostScript backends */ static GL2PSbackend gl2psPS = { gl2psPrintPostScriptHeader, gl2psPrintPostScriptFooter, gl2psPrintPostScriptBeginViewport, gl2psPrintPostScriptEndViewport, gl2psPrintPostScriptPrimitive, gl2psPrintPostScriptFinalPrimitive, "ps", "Postscript" }; static GL2PSbackend gl2psEPS = { gl2psPrintPostScriptHeader, gl2psPrintPostScriptFooter, gl2psPrintPostScriptBeginViewport, gl2psPrintPostScriptEndViewport, gl2psPrintPostScriptPrimitive, gl2psPrintPostScriptFinalPrimitive, "eps", "Encapsulated Postscript" }; /********************************************************************* * * LaTeX routines * *********************************************************************/ static void gl2psPrintTeXHeader(void) { char name[256]; time_t now; int i; if(gl2ps->filename && strlen(gl2ps->filename) < 256){ for(i = (int)strlen(gl2ps->filename) - 1; i >= 0; i--){ if(gl2ps->filename[i] == '.'){ strncpy(name, gl2ps->filename, i); name[i] = '\0'; break; } } if(i <= 0) strcpy(name, gl2ps->filename); } else{ strcpy(name, "untitled"); } time(&now); fprintf(gl2ps->stream, "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); fprintf(gl2ps->stream, "\\setlength{\\unitlength}{1pt}\n" "\\begin{picture}(0,0)\n" "\\includegraphics{%s}\n" "\\end{picture}%%\n" "%s\\begin{picture}(%d,%d)(0,0)\n", name, (gl2ps->options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); } static void gl2psPrintTeXPrimitive(void *data) { GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; switch(prim->type){ case GL2PS_TEXT : fprintf(gl2ps->stream, "\\fontsize{%d}{0}\n\\selectfont", prim->data.text->fontsize); fprintf(gl2ps->stream, "\\put(%g,%g)", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); if(prim->data.text->angle) fprintf(gl2ps->stream, "{\\rotatebox{%g}", prim->data.text->angle); fprintf(gl2ps->stream, "{\\makebox(0,0)"); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: fprintf(gl2ps->stream, "{"); break; case GL2PS_TEXT_CL: fprintf(gl2ps->stream, "[l]{"); break; case GL2PS_TEXT_CR: fprintf(gl2ps->stream, "[r]{"); break; case GL2PS_TEXT_B: fprintf(gl2ps->stream, "[b]{"); break; case GL2PS_TEXT_BR: fprintf(gl2ps->stream, "[br]{"); break; case GL2PS_TEXT_T: fprintf(gl2ps->stream, "[t]{"); break; case GL2PS_TEXT_TL: fprintf(gl2ps->stream, "[tl]{"); break; case GL2PS_TEXT_TR: fprintf(gl2ps->stream, "[tr]{"); break; case GL2PS_TEXT_BL: default: fprintf(gl2ps->stream, "[bl]{"); break; } fprintf(gl2ps->stream, "\\textcolor[rgb]{%g,%g,%g}{{%s}}", prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2], prim->data.text->str); if(prim->data.text->angle) fprintf(gl2ps->stream, "}"); fprintf(gl2ps->stream, "}}\n"); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if (prim->data.text->alignment == GL2PS_TEX) fprintf(gl2ps->stream, "%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintTeXFooter(void) { fprintf(gl2ps->stream, "\\end{picture}%s\n", (gl2ps->options & GL2PS_LANDSCAPE) ? "}" : ""); } static void gl2psPrintTeXBeginViewport(GLint viewport[4]) { (void) viewport; /* not used */ glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintTeXHeader(); gl2ps->header = GL_FALSE; } } static GLint gl2psPrintTeXEndViewport(void) { return gl2psPrintPrimitives(); } static void gl2psPrintTeXFinalPrimitive(void) { } /* definition of the LaTeX backend */ static GL2PSbackend gl2psTEX = { gl2psPrintTeXHeader, gl2psPrintTeXFooter, gl2psPrintTeXBeginViewport, gl2psPrintTeXEndViewport, gl2psPrintTeXPrimitive, gl2psPrintTeXFinalPrimitive, "tex", "LaTeX text" }; /********************************************************************* * * PDF routines * *********************************************************************/ static int gl2psPrintPDFCompressorType(void) { #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ return fprintf(gl2ps->stream, "/Filter [/FlateDecode]\n"); } #endif return 0; } static int gl2psPrintPDFStrokeColor(GL2PSrgba rgba) { int i, offs = 0; gl2psSetLastColor(rgba); for(i = 0; i < 3; ++i){ if(GL2PS_ZERO(rgba[i])) offs += gl2psPrintf("%.0f ", 0.); else if(rgba[i] < 1e-4 || rgba[i] > 1e6) /* avoid %e formatting */ offs += gl2psPrintf("%f ", rgba[i]); else offs += gl2psPrintf("%g ", rgba[i]); } offs += gl2psPrintf("RG\n"); return offs; } static int gl2psPrintPDFFillColor(GL2PSrgba rgba) { int i, offs = 0; for(i = 0; i < 3; ++i){ if(GL2PS_ZERO(rgba[i])) offs += gl2psPrintf("%.0f ", 0.); else if(rgba[i] < 1e-4 || rgba[i] > 1e6) /* avoid %e formatting */ offs += gl2psPrintf("%f ", rgba[i]); else offs += gl2psPrintf("%g ", rgba[i]); } offs += gl2psPrintf("rg\n"); return offs; } static int gl2psPrintPDFLineWidth(GLfloat lw) { if(GL2PS_ZERO(lw)) return gl2psPrintf("%.0f w\n", 0.); else if(lw < 1e-4 || lw > 1e6) /* avoid %e formatting */ return gl2psPrintf("%f w\n", lw); else return gl2psPrintf("%g w\n", lw); } static void gl2psPutPDFText(GL2PSstring *text, int cnt, GLfloat x, GLfloat y) { GLfloat rad, crad, srad; if(text->angle == 0.0F){ gl2ps->streamlength += gl2psPrintf ("BT\n" "/F%d %d Tf\n" "%f %f Td\n" "(%s) Tj\n" "ET\n", cnt, text->fontsize, x, y, text->str); } else{ rad = (GLfloat)(3.141593F * text->angle / 180.0F); srad = (GLfloat)sin(rad); crad = (GLfloat)cos(rad); gl2ps->streamlength += gl2psPrintf ("BT\n" "/F%d %d Tf\n" "%f %f %f %f %f %f Tm\n" "(%s) Tj\n" "ET\n", cnt, text->fontsize, crad, srad, -srad, crad, x, y, text->str); } } static void gl2psPutPDFSpecial(GL2PSstring *text) { gl2ps->streamlength += gl2psPrintf("%s\n", text->str); } static void gl2psPutPDFImage(GL2PSimage *image, int cnt, GLfloat x, GLfloat y) { gl2ps->streamlength += gl2psPrintf ("q\n" "%d 0 0 %d %f %f cm\n" "/Im%d Do\n" "Q\n", (int)image->width, (int)image->height, x, y, cnt); } static void gl2psPDFstacksInit(void) { gl2ps->objects_stack = 7 /* FIXED_XREF_ENTRIES */ + 1; gl2ps->extgs_stack = 0; gl2ps->font_stack = 0; gl2ps->im_stack = 0; gl2ps->trgroupobjects_stack = 0; gl2ps->shader_stack = 0; gl2ps->mshader_stack = 0; } static void gl2psPDFgroupObjectInit(GL2PSpdfgroup *gro) { if(!gro) return; gro->ptrlist = NULL; gro->fontno = gro->gsno = gro->imno = gro->maskshno = gro->shno = gro->trgroupno = gro->fontobjno = gro->imobjno = gro->shobjno = gro->maskshobjno = gro->gsobjno = gro->trgroupobjno = -1; } /* Build up group objects and assign name and object numbers */ static void gl2psPDFgroupListInit(void) { int i; GL2PSprimitive *p = NULL; GL2PSpdfgroup gro; int lasttype = GL2PS_NO_TYPE; GL2PSrgba lastrgba = {-1.0F, -1.0F, -1.0F, -1.0F}; GLushort lastpattern = 0; GLint lastfactor = 0; GLfloat lastwidth = 1; GL2PStriangle lastt, tmpt; int lastTriangleWasNotSimpleWithSameColor = 0; if(!gl2ps->pdfprimlist) return; gl2ps->pdfgrouplist = gl2psListCreate(500, 500, sizeof(GL2PSpdfgroup)); gl2psInitTriangle(&lastt); for(i = 0; i < gl2psListNbr(gl2ps->pdfprimlist); ++i){ p = *(GL2PSprimitive**)gl2psListPointer(gl2ps->pdfprimlist, i); switch(p->type){ case GL2PS_PIXMAP: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gro.imno = gl2ps->im_stack++; gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; case GL2PS_TEXT: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gro.fontno = gl2ps->font_stack++; gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; case GL2PS_LINE: if(lasttype != p->type || lastwidth != p->width || lastpattern != p->pattern || lastfactor != p->factor || !gl2psSameColor(p->verts[0].rgba, lastrgba)){ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } else{ gl2psListAdd(gro.ptrlist, &p); } lastpattern = p->pattern; lastfactor = p->factor; lastwidth = p->width; lastrgba[0] = p->verts[0].rgba[0]; lastrgba[1] = p->verts[0].rgba[1]; lastrgba[2] = p->verts[0].rgba[2]; break; case GL2PS_POINT: if(lasttype != p->type || lastwidth != p->width || !gl2psSameColor(p->verts[0].rgba, lastrgba)){ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1,2,sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } else{ gl2psListAdd(gro.ptrlist, &p); } lastwidth = p->width; lastrgba[0] = p->verts[0].rgba[0]; lastrgba[1] = p->verts[0].rgba[1]; lastrgba[2] = p->verts[0].rgba[2]; break; case GL2PS_TRIANGLE: gl2psFillTriangleFromPrimitive(&tmpt, p, GL_TRUE); lastTriangleWasNotSimpleWithSameColor = !(tmpt.prop & T_CONST_COLOR && tmpt.prop & T_ALPHA_1) || !gl2psSameColor(tmpt.vertex[0].rgba, lastt.vertex[0].rgba); if(lasttype == p->type && tmpt.prop == lastt.prop && lastTriangleWasNotSimpleWithSameColor){ /* TODO Check here for last alpha */ gl2psListAdd(gro.ptrlist, &p); } else{ gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); } lastt = tmpt; break; case GL2PS_SPECIAL: gl2psPDFgroupObjectInit(&gro); gro.ptrlist = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*)); gl2psListAdd(gro.ptrlist, &p); gl2psListAdd(gl2ps->pdfgrouplist, &gro); break; default: break; } lasttype = p->type; } } static void gl2psSortOutTrianglePDFgroup(GL2PSpdfgroup *gro) { GL2PStriangle t; GL2PSprimitive *prim = NULL; if(!gro) return; if(!gl2psListNbr(gro->ptrlist)) return; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); if(prim->type != GL2PS_TRIANGLE) return; gl2psFillTriangleFromPrimitive(&t, prim, GL_TRUE); if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_LESS_1){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack ++; } else if(t.prop & T_CONST_COLOR && t.prop & T_VAR_ALPHA){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->trgroupno = gl2ps->trgroupobjects_stack++; gro->trgroupobjno = gl2ps->objects_stack++; gro->maskshno = gl2ps->mshader_stack++; gro->maskshobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_1){ gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_LESS_1){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; } else if(t.prop & T_VAR_COLOR && t.prop & T_VAR_ALPHA){ gro->gsno = gl2ps->extgs_stack++; gro->gsobjno = gl2ps->objects_stack++; gro->shno = gl2ps->shader_stack++; gro->shobjno = gl2ps->objects_stack++; gro->trgroupno = gl2ps->trgroupobjects_stack++; gro->trgroupobjno = gl2ps->objects_stack++; gro->maskshno = gl2ps->mshader_stack++; gro->maskshobjno = gl2ps->objects_stack++; } } /* Main stream data */ static void gl2psPDFgroupListWriteMainStream(void) { int i, j, lastel; GL2PSprimitive *prim = NULL, *prev = NULL; GL2PSpdfgroup *gro; GL2PStriangle t; if(!gl2ps->pdfgrouplist) return; for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); lastel = gl2psListNbr(gro->ptrlist) - 1; if(lastel < 0) continue; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(prim->type){ case GL2PS_POINT: gl2ps->streamlength += gl2psPrintf("1 J\n"); gl2ps->streamlength += gl2psPrintPDFLineWidth(prim->width); gl2ps->streamlength += gl2psPrintPDFStrokeColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2ps->streamlength += gl2psPrintf("%f %f m %f %f l\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } gl2ps->streamlength += gl2psPrintf("S\n"); gl2ps->streamlength += gl2psPrintf("0 J\n"); break; case GL2PS_LINE: /* We try to use as few paths as possible to draw lines, in order to get nice stippling even when the individual segments are smaller than the stipple */ gl2ps->streamlength += gl2psPrintPDFLineWidth(prim->width); gl2ps->streamlength += gl2psPrintPDFStrokeColor(prim->verts[0].rgba); gl2ps->streamlength += gl2psPrintPostScriptDash(prim->pattern, prim->factor, "d"); /* start new path */ gl2ps->streamlength += gl2psPrintf("%f %f m\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); for(j = 1; j <= lastel; ++j){ prev = prim; prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); if(!gl2psSamePosition(prim->verts[0].xyz, prev->verts[1].xyz)){ /* the starting point of the new segment does not match the end point of the previous line, so we end the current path and start a new one */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prev->verts[1].xyz[0], prev->verts[1].xyz[1]); gl2ps->streamlength += gl2psPrintf("%f %f m\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } else{ /* the two segements are connected, so we just append to the current path */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } } /* end last path */ gl2ps->streamlength += gl2psPrintf("%f %f l\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1]); gl2ps->streamlength += gl2psPrintf("S\n"); break; case GL2PS_TRIANGLE: gl2psFillTriangleFromPrimitive(&t, prim, GL_TRUE); gl2psSortOutTrianglePDFgroup(gro); /* No alpha and const color: Simple PDF draw orders */ if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_1){ gl2ps->streamlength += gl2psPrintPDFFillColor(t.vertex[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } } /* Const alpha < 1 and const color: Simple PDF draw orders and an extra extended Graphics State for the alpha const */ else if(t.prop & T_CONST_COLOR && t.prop & T_ALPHA_LESS_1){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n", gro->gsno); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } gl2ps->streamlength += gl2psPrintf("Q\n"); } /* Variable alpha and const color: Simple PDF draw orders and an extra extended Graphics State + Xobject + Shader object for the alpha mask */ else if(t.prop & T_CONST_COLOR && t.prop & T_VAR_ALPHA){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/TrG%d Do\n", gro->gsno, gro->trgroupno); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&t, prim, GL_FALSE); gl2ps->streamlength += gl2psPrintf("%f %f m\n" "%f %f l\n" "%f %f l\n" "h f\n", t.vertex[0].xyz[0], t.vertex[0].xyz[1], t.vertex[1].xyz[0], t.vertex[1].xyz[1], t.vertex[2].xyz[0], t.vertex[2].xyz[1]); } gl2ps->streamlength += gl2psPrintf("Q\n"); } /* Variable color and no alpha: Shader Object for the colored triangle(s) */ else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_1){ gl2ps->streamlength += gl2psPrintf("/Sh%d sh\n", gro->shno); } /* Variable color and const alpha < 1: Shader Object for the colored triangle(s) and an extra extended Graphics State for the alpha const */ else if(t.prop & T_VAR_COLOR && t.prop & T_ALPHA_LESS_1){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/Sh%d sh\n" "Q\n", gro->gsno, gro->shno); } /* Variable alpha and color: Shader Object for the colored triangle(s) and an extra extended Graphics State + Xobject + Shader object for the alpha mask */ else if(t.prop & T_VAR_COLOR && t.prop & T_VAR_ALPHA){ gl2ps->streamlength += gl2psPrintf("q\n" "/GS%d gs\n" "/TrG%d Do\n" "/Sh%d sh\n" "Q\n", gro->gsno, gro->trgroupno, gro->shno); } break; case GL2PS_PIXMAP: for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psPutPDFImage(prim->data.image, gro->imno, prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_TEXT: for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba); gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } break; case GL2PS_SPECIAL: for(j = 0; j <= lastel; ++j){ prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psPutPDFSpecial(prim->data.text); } default: break; } } } /* Graphics State names */ static int gl2psPDFgroupListWriteGStateResources(void) { GL2PSpdfgroup *gro; int offs = 0; int i; offs += fprintf(gl2ps->stream, "/ExtGState\n" "<<\n" "/GSa 7 0 R\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->gsno >= 0) offs += fprintf(gl2ps->stream, "/GS%d %d 0 R\n", gro->gsno, gro->gsobjno); } offs += fprintf(gl2ps->stream, ">>\n"); return offs; } /* Main Shader names */ static int gl2psPDFgroupListWriteShaderResources(void) { GL2PSpdfgroup *gro; int offs = 0; int i; offs += fprintf(gl2ps->stream, "/Shading\n" "<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->shno >= 0) offs += fprintf(gl2ps->stream, "/Sh%d %d 0 R\n", gro->shno, gro->shobjno); if(gro->maskshno >= 0) offs += fprintf(gl2ps->stream, "/TrSh%d %d 0 R\n", gro->maskshno, gro->maskshobjno); } offs += fprintf(gl2ps->stream,">>\n"); return offs; } /* Images & Mask Shader XObject names */ static int gl2psPDFgroupListWriteXObjectResources(void) { int i; GL2PSprimitive *p = NULL; GL2PSpdfgroup *gro; int offs = 0; offs += fprintf(gl2ps->stream, "/XObject\n" "<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(!gl2psListNbr(gro->ptrlist)) continue; p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(p->type){ case GL2PS_PIXMAP: gro->imobjno = gl2ps->objects_stack++; if(GL_RGBA == p->data.image->format) /* reserve one object for image mask */ gl2ps->objects_stack++; offs += fprintf(gl2ps->stream, "/Im%d %d 0 R\n", gro->imno, gro->imobjno); case GL2PS_TRIANGLE: if(gro->trgroupno >=0) offs += fprintf(gl2ps->stream, "/TrG%d %d 0 R\n", gro->trgroupno, gro->trgroupobjno); break; default: break; } } offs += fprintf(gl2ps->stream,">>\n"); return offs; } /* Font names */ static int gl2psPDFgroupListWriteFontResources(void) { int i; GL2PSpdfgroup *gro; int offs = 0; offs += fprintf(gl2ps->stream, "/Font\n<<\n"); for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(gro->fontno < 0) continue; gro->fontobjno = gl2ps->objects_stack++; offs += fprintf(gl2ps->stream, "/F%d %d 0 R\n", gro->fontno, gro->fontobjno); } offs += fprintf(gl2ps->stream, ">>\n"); return offs; } static void gl2psPDFgroupListDelete(void) { int i; GL2PSpdfgroup *gro = NULL; if(!gl2ps->pdfgrouplist) return; for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist,i); gl2psListDelete(gro->ptrlist); } gl2psListDelete(gl2ps->pdfgrouplist); gl2ps->pdfgrouplist = NULL; } /* Print 1st PDF object - file info */ static int gl2psPrintPDFInfo(void) { int offs; time_t now; struct tm *newtime; time(&now); newtime = gmtime(&now); offs = fprintf(gl2ps->stream, "1 0 obj\n" "<<\n" "/Title (%s)\n" "/Creator (GL2PS %d.%d.%d%s, %s)\n" "/Producer (%s)\n", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer); if(!newtime){ offs += fprintf(gl2ps->stream, ">>\n" "endobj\n"); return offs; } offs += fprintf(gl2ps->stream, "/CreationDate (D:%d%02d%02d%02d%02d%02d)\n" ">>\n" "endobj\n", newtime->tm_year+1900, newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec); return offs; } /* Create catalog and page structure - 2nd and 3th PDF object */ static int gl2psPrintPDFCatalog(void) { return fprintf(gl2ps->stream, "2 0 obj\n" "<<\n" "/Type /Catalog\n" "/Pages 3 0 R\n" ">>\n" "endobj\n"); } static int gl2psPrintPDFPages(void) { return fprintf(gl2ps->stream, "3 0 obj\n" "<<\n" "/Type /Pages\n" "/Kids [6 0 R]\n" "/Count 1\n" ">>\n" "endobj\n"); } /* Open stream for data - graphical objects, fonts etc. PDF object 4 */ static int gl2psOpenPDFDataStream(void) { int offs = 0; offs += fprintf(gl2ps->stream, "4 0 obj\n" "<<\n" "/Length 5 0 R\n" ); offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, ">>\n" "stream\n"); return offs; } /* Stream setup - Graphics state, fill background if allowed */ static int gl2psOpenPDFDataStreamWritePreface(void) { int offs; offs = gl2psPrintf("/GSa gs\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ offs += gl2psPrintPDFFillColor(gl2ps->bgcolor); offs += gl2psPrintf("%d %d %d %d re\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); offs += gl2psPrintf("f\n"); } return offs; } /* Use the functions above to create the first part of the PDF*/ static void gl2psPrintPDFHeader(void) { int offs = 0; gl2ps->pdfprimlist = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); gl2psPDFstacksInit(); gl2ps->xreflist = (int*)gl2psMalloc(sizeof(int) * gl2ps->objects_stack); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psSetupCompress(); } #endif gl2ps->xreflist[0] = 0; offs += fprintf(gl2ps->stream, "%%PDF-1.4\n"); gl2ps->xreflist[1] = offs; offs += gl2psPrintPDFInfo(); gl2ps->xreflist[2] = offs; offs += gl2psPrintPDFCatalog(); gl2ps->xreflist[3] = offs; offs += gl2psPrintPDFPages(); gl2ps->xreflist[4] = offs; offs += gl2psOpenPDFDataStream(); gl2ps->xreflist[5] = offs; /* finished in gl2psPrintPDFFooter */ gl2ps->streamlength = gl2psOpenPDFDataStreamWritePreface(); } /* The central primitive drawing */ static void gl2psPrintPDFPrimitive(void *data) { GL2PSprimitive *prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; prim = gl2psCopyPrimitive(prim); /* deep copy */ gl2psListAdd(gl2ps->pdfprimlist, &prim); } /* close stream and ... */ static int gl2psClosePDFDataStream(void) { int offs = 0; #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ if(Z_OK != gl2psDeflate()) gl2psMsg(GL2PS_ERROR, "Zlib deflate error"); else fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); gl2ps->streamlength += gl2ps->compress->destLen; offs += gl2ps->streamlength; gl2psFreeCompress(); } #endif offs += fprintf(gl2ps->stream, "endstream\n" "endobj\n"); return offs; } /* ... write the now known length object */ static int gl2psPrintPDFDataStreamLength(int val) { return fprintf(gl2ps->stream, "5 0 obj\n" "%d\n" "endobj\n", val); } /* Put the info created before in PDF objects */ static int gl2psPrintPDFOpenPage(void) { int offs; /* Write fixed part */ offs = fprintf(gl2ps->stream, "6 0 obj\n" "<<\n" "/Type /Page\n" "/Parent 3 0 R\n" "/MediaBox [%d %d %d %d]\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); if(gl2ps->options & GL2PS_LANDSCAPE) offs += fprintf(gl2ps->stream, "/Rotate -90\n"); offs += fprintf(gl2ps->stream, "/Contents 4 0 R\n" "/Resources\n" "<<\n" "/ProcSet [/PDF /Text /ImageB /ImageC] %%/ImageI\n"); return offs; /* End fixed part, proceeds in gl2psPDFgroupListWriteVariableResources() */ } static int gl2psPDFgroupListWriteVariableResources(void) { int offs = 0; /* a) Graphics States for shader alpha masks*/ offs += gl2psPDFgroupListWriteGStateResources(); /* b) Shader and shader masks */ offs += gl2psPDFgroupListWriteShaderResources(); /* c) XObjects (Images & Shader Masks) */ offs += gl2psPDFgroupListWriteXObjectResources(); /* d) Fonts */ offs += gl2psPDFgroupListWriteFontResources(); /* End resources and page */ offs += fprintf(gl2ps->stream, ">>\n" ">>\n" "endobj\n"); return offs; } /* Standard Graphics State */ static int gl2psPrintPDFGSObject(void) { return fprintf(gl2ps->stream, "7 0 obj\n" "<<\n" "/Type /ExtGState\n" "/SA false\n" "/SM 0.02\n" "/OP false\n" "/op false\n" "/OPM 0\n" "/BG2 /Default\n" "/UCR2 /Default\n" "/TR2 /Default\n" ">>\n" "endobj\n"); } /* Put vertex' edge flag (8bit) and coordinates (32bit) in shader stream */ static int gl2psPrintPDFShaderStreamDataCoord(GL2PSvertex *vertex, int (*action)(unsigned long data, int size), GLfloat dx, GLfloat dy, GLfloat xmin, GLfloat ymin) { int offs = 0; unsigned long imap; GLfloat diff; double dmax = ~1UL; char edgeflag = 0; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; offs += (*action)(edgeflag, 1); /* The Shader stream in PDF requires to be in a 'big-endian' order */ if(GL2PS_ZERO(dx * dy)){ offs += (*action)(0, 4); offs += (*action)(0, 4); } else{ diff = (vertex->xyz[0] - xmin) / dx; if(diff > 1) diff = 1.0F; else if(diff < 0) diff = 0.0F; imap = (unsigned long)(diff * dmax); offs += (*action)(imap, 4); diff = (vertex->xyz[1] - ymin) / dy; if(diff > 1) diff = 1.0F; else if(diff < 0) diff = 0.0F; imap = (unsigned long)(diff * dmax); offs += (*action)(imap, 4); } return offs; } /* Put vertex' rgb value (8bit for every component) in shader stream */ static int gl2psPrintPDFShaderStreamDataRGB(GL2PSvertex *vertex, int (*action)(unsigned long data, int size)) { int offs = 0; unsigned long imap; double dmax = ~1UL; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; imap = (unsigned long)((vertex->rgba[0]) * dmax); offs += (*action)(imap, 1); imap = (unsigned long)((vertex->rgba[1]) * dmax); offs += (*action)(imap, 1); imap = (unsigned long)((vertex->rgba[2]) * dmax); offs += (*action)(imap, 1); return offs; } /* Put vertex' alpha (8/16bit) in shader stream */ static int gl2psPrintPDFShaderStreamDataAlpha(GL2PSvertex *vertex, int (*action)(unsigned long data, int size), int sigbyte) { int offs = 0; unsigned long imap; double dmax = ~1UL; /* FIXME: temp bux fix for 64 bit archs: */ if(sizeof(unsigned long) == 8) dmax = dmax - 2048.; if(sigbyte != 8 && sigbyte != 16) sigbyte = 8; sigbyte /= 8; imap = (unsigned long)((vertex->rgba[3]) * dmax); offs += (*action)(imap, sigbyte); return offs; } /* Put a triangles raw data in shader stream */ static int gl2psPrintPDFShaderStreamData(GL2PStriangle *triangle, GLfloat dx, GLfloat dy, GLfloat xmin, GLfloat ymin, int (*action)(unsigned long data, int size), int gray) { int i, offs = 0; GL2PSvertex v; if(gray && gray != 8 && gray != 16) gray = 8; for(i = 0; i < 3; ++i){ offs += gl2psPrintPDFShaderStreamDataCoord(&triangle->vertex[i], action, dx, dy, xmin, ymin); if(gray){ v = triangle->vertex[i]; offs += gl2psPrintPDFShaderStreamDataAlpha(&v, action, gray); } else{ offs += gl2psPrintPDFShaderStreamDataRGB(&triangle->vertex[i], action); } } return offs; } static void gl2psPDFRectHull(GLfloat *xmin, GLfloat *xmax, GLfloat *ymin, GLfloat *ymax, GL2PStriangle *triangles, int cnt) { int i, j; *xmin = triangles[0].vertex[0].xyz[0]; *xmax = triangles[0].vertex[0].xyz[0]; *ymin = triangles[0].vertex[0].xyz[1]; *ymax = triangles[0].vertex[0].xyz[1]; for(i = 0; i < cnt; ++i){ for(j = 0; j < 3; ++j){ if(*xmin > triangles[i].vertex[j].xyz[0]) *xmin = triangles[i].vertex[j].xyz[0]; if(*xmax < triangles[i].vertex[j].xyz[0]) *xmax = triangles[i].vertex[j].xyz[0]; if(*ymin > triangles[i].vertex[j].xyz[1]) *ymin = triangles[i].vertex[j].xyz[1]; if(*ymax < triangles[i].vertex[j].xyz[1]) *ymax = triangles[i].vertex[j].xyz[1]; } } } /* Writes shaded triangle gray == 0 means write RGB triangles gray == 8 8bit-grayscale (for alpha masks) gray == 16 16bit-grayscale (for alpha masks) */ static int gl2psPrintPDFShader(int obj, GL2PStriangle *triangles, int size, int gray) { int i, offs = 0, vertexbytes, done = 0; GLfloat xmin, xmax, ymin, ymax; switch(gray){ case 0: vertexbytes = 1+4+4+1+1+1; break; case 8: vertexbytes = 1+4+4+1; break; case 16: vertexbytes = 1+4+4+2; break; default: gray = 8; vertexbytes = 1+4+4+1; break; } gl2psPDFRectHull(&xmin, &xmax, &ymin, &ymax, triangles, size); offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<< " "/ShadingType 4 " "/ColorSpace %s " "/BitsPerCoordinate 32 " "/BitsPerComponent %d " "/BitsPerFlag 8 " "/Decode [%f %f %f %f 0 1 %s] ", obj, (gray) ? "/DeviceGray" : "/DeviceRGB", (gray) ? gray : 8, xmin, xmax, ymin, ymax, (gray) ? "" : "0 1 0 1"); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psAllocCompress(vertexbytes * size * 3); for(i = 0; i < size; ++i) gl2psPrintPDFShaderStreamData(&triangles[i], xmax-xmin, ymax-ymin, xmin, ymin, gl2psWriteBigEndianCompress, gray); if(Z_OK == gl2psDeflate() && 23 + gl2ps->compress->destLen < gl2ps->compress->srcLen){ offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)gl2ps->compress->destLen); offs += gl2ps->compress->destLen * fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); done = 1; } gl2psFreeCompress(); } #endif if(!done){ /* no compression, or too long after compression, or compress error -> write non-compressed entry */ offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", vertexbytes * 3 * size); for(i = 0; i < size; ++i) offs += gl2psPrintPDFShaderStreamData(&triangles[i], xmax-xmin, ymax-ymin, xmin, ymin, gl2psWriteBigEndian, gray); } offs += fprintf(gl2ps->stream, "\nendstream\n" "endobj\n"); return offs; } /* Writes a XObject for a shaded triangle mask */ static int gl2psPrintPDFShaderMask(int obj, int childobj) { int offs = 0, len; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /XObject\n" "/Subtype /Form\n" "/BBox [ %d %d %d %d ]\n" "/Group \n<<\n/S /Transparency /CS /DeviceRGB\n" ">>\n", obj, (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); len = (childobj>0) ? strlen("/TrSh sh\n") + (int)log10((double)childobj)+1 : strlen("/TrSh0 sh\n"); offs += fprintf(gl2ps->stream, "/Length %d\n" ">>\n" "stream\n", len); offs += fprintf(gl2ps->stream, "/TrSh%d sh\n", childobj); offs += fprintf(gl2ps->stream, "endstream\n" "endobj\n"); return offs; } /* Writes a Extended graphics state for a shaded triangle mask if simplealpha ist true the childobj argument is ignored and a /ca statement will be written instead */ static int gl2psPrintPDFShaderExtGS(int obj, int childobj) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n", obj); offs += fprintf(gl2ps->stream, "/SMask << /S /Alpha /G %d 0 R >> ", childobj); offs += fprintf(gl2ps->stream, ">>\n" "endobj\n"); return offs; } /* a simple graphics state */ static int gl2psPrintPDFShaderSimpleExtGS(int obj, GLfloat alpha) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/ca %g" ">>\n" "endobj\n", obj, alpha); return offs; } /* Similar groups of functions for pixmaps and text */ static int gl2psPrintPDFPixmapStreamData(GL2PSimage *im, int (*action)(unsigned long data, int size), int gray) { int x, y, shift; GLfloat r, g, b, a; if(im->format != GL_RGBA && gray) return 0; if(gray && gray != 8 && gray != 16) gray = 8; gray /= 8; shift = (sizeof(unsigned long) - 1) * 8; for(y = 0; y < im->height; ++y){ for(x = 0; x < im->width; ++x){ a = gl2psGetRGB(im, x, y, &r, &g, &b); if(im->format == GL_RGBA && gray){ (*action)((unsigned long)(a * 255) << shift, gray); } else{ (*action)((unsigned long)(r * 255) << shift, 1); (*action)((unsigned long)(g * 255) << shift, 1); (*action)((unsigned long)(b * 255) << shift, 1); } } } switch(gray){ case 0: return 3 * im->width * im->height; case 1: return im->width * im->height; case 2: return 2 * im->width * im->height; default: return 3 * im->width * im->height; } } static int gl2psPrintPDFPixmap(int obj, int childobj, GL2PSimage *im, int gray) { int offs = 0, done = 0, sigbytes = 3; if(gray && gray !=8 && gray != 16) gray = 8; if(gray) sigbytes = gray / 8; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /XObject\n" "/Subtype /Image\n" "/Width %d\n" "/Height %d\n" "/ColorSpace %s \n" "/BitsPerComponent 8\n", obj, (int)im->width, (int)im->height, (gray) ? "/DeviceGray" : "/DeviceRGB" ); if(GL_RGBA == im->format && gray == 0){ offs += fprintf(gl2ps->stream, "/SMask %d 0 R\n", childobj); } #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psAllocCompress((int)(im->width * im->height * sigbytes)); gl2psPrintPDFPixmapStreamData(im, gl2psWriteBigEndianCompress, gray); if(Z_OK == gl2psDeflate() && 23 + gl2ps->compress->destLen < gl2ps->compress->srcLen){ offs += gl2psPrintPDFCompressorType(); offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)gl2ps->compress->destLen); offs += gl2ps->compress->destLen * fwrite(gl2ps->compress->dest, gl2ps->compress->destLen, 1, gl2ps->stream); done = 1; } gl2psFreeCompress(); } #endif if(!done){ /* no compression, or too long after compression, or compress error -> write non-compressed entry */ offs += fprintf(gl2ps->stream, "/Length %d " ">>\n" "stream\n", (int)(im->width * im->height * sigbytes)); offs += gl2psPrintPDFPixmapStreamData(im, gl2psWriteBigEndian, gray); } offs += fprintf(gl2ps->stream, "\nendstream\n" "endobj\n"); return offs; } static int gl2psPrintPDFText(int obj, GL2PSstring *s, int fontnumber) { int offs = 0; offs += fprintf(gl2ps->stream, "%d 0 obj\n" "<<\n" "/Type /Font\n" "/Subtype /Type1\n" "/Name /F%d\n" "/BaseFont /%s\n" "/Encoding /MacRomanEncoding\n" ">>\n" "endobj\n", obj, fontnumber, s->fontname); return offs; } /* Write the physical objects */ static int gl2psPDFgroupListWriteObjects(int entryoffs) { int i,j; GL2PSprimitive *p = NULL; GL2PSpdfgroup *gro; int offs = entryoffs; GL2PStriangle *triangles; int size = 0; if(!gl2ps->pdfgrouplist) return offs; for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){ gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i); if(!gl2psListNbr(gro->ptrlist)) continue; p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, 0); switch(p->type){ case GL2PS_POINT: break; case GL2PS_LINE: break; case GL2PS_TRIANGLE: size = gl2psListNbr(gro->ptrlist); triangles = (GL2PStriangle*)gl2psMalloc(sizeof(GL2PStriangle) * size); for(j = 0; j < size; ++j){ p = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j); gl2psFillTriangleFromPrimitive(&triangles[j], p, GL_TRUE); } if(triangles[0].prop & T_VAR_COLOR){ gl2ps->xreflist[gro->shobjno] = offs; offs += gl2psPrintPDFShader(gro->shobjno, triangles, size, 0); } if(triangles[0].prop & T_ALPHA_LESS_1){ gl2ps->xreflist[gro->gsobjno] = offs; offs += gl2psPrintPDFShaderSimpleExtGS(gro->gsobjno, triangles[0].vertex[0].rgba[3]); } if(triangles[0].prop & T_VAR_ALPHA){ gl2ps->xreflist[gro->gsobjno] = offs; offs += gl2psPrintPDFShaderExtGS(gro->gsobjno, gro->trgroupobjno); gl2ps->xreflist[gro->trgroupobjno] = offs; offs += gl2psPrintPDFShaderMask(gro->trgroupobjno, gro->maskshno); gl2ps->xreflist[gro->maskshobjno] = offs; offs += gl2psPrintPDFShader(gro->maskshobjno, triangles, size, 8); } gl2psFree(triangles); break; case GL2PS_PIXMAP: gl2ps->xreflist[gro->imobjno] = offs; offs += gl2psPrintPDFPixmap(gro->imobjno, gro->imobjno+1, p->data.image, 0); if(p->data.image->format == GL_RGBA){ gl2ps->xreflist[gro->imobjno+1] = offs; offs += gl2psPrintPDFPixmap(gro->imobjno+1, -1, p->data.image, 8); } break; case GL2PS_TEXT: gl2ps->xreflist[gro->fontobjno] = offs; offs += gl2psPrintPDFText(gro->fontobjno,p->data.text,gro->fontno); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(p->data.text->alignment == GL2PS_PDF) offs += fprintf(gl2ps->stream, "%s\n", p->data.text->str); break; default: break; } } return offs; } /* All variable data has been written at this point and all required functioninality has been gathered, so we can write now file footer with cross reference table and trailer */ static void gl2psPrintPDFFooter(void) { int i, offs; gl2psPDFgroupListInit(); gl2psPDFgroupListWriteMainStream(); offs = gl2ps->xreflist[5] + gl2ps->streamlength; offs += gl2psClosePDFDataStream(); gl2ps->xreflist[5] = offs; offs += gl2psPrintPDFDataStreamLength(gl2ps->streamlength); gl2ps->xreflist[6] = offs; gl2ps->streamlength = 0; offs += gl2psPrintPDFOpenPage(); offs += gl2psPDFgroupListWriteVariableResources(); gl2ps->xreflist = (int*)gl2psRealloc(gl2ps->xreflist, sizeof(int) * (gl2ps->objects_stack + 1)); gl2ps->xreflist[7] = offs; offs += gl2psPrintPDFGSObject(); gl2ps->xreflist[8] = offs; gl2ps->xreflist[gl2ps->objects_stack] = gl2psPDFgroupListWriteObjects(gl2ps->xreflist[8]); /* Start cross reference table. The file has to been opened in binary mode to preserve the 20 digit string length! */ fprintf(gl2ps->stream, "xref\n" "0 %d\n" "%010d 65535 f \n", gl2ps->objects_stack, 0); for(i = 1; i < gl2ps->objects_stack; ++i) fprintf(gl2ps->stream, "%010d 00000 n \n", gl2ps->xreflist[i]); fprintf(gl2ps->stream, "trailer\n" "<<\n" "/Size %d\n" "/Info 1 0 R\n" "/Root 2 0 R\n" ">>\n" "startxref\n%d\n" "%%%%EOF\n", gl2ps->objects_stack, gl2ps->xreflist[gl2ps->objects_stack]); /* Free auxiliary lists and arrays */ gl2psFree(gl2ps->xreflist); gl2psListAction(gl2ps->pdfprimlist, gl2psFreePrimitive); gl2psListDelete(gl2ps->pdfprimlist); gl2psPDFgroupListDelete(); #if defined(GL2PS_HAVE_ZLIB) if(gl2ps->options & GL2PS_COMPRESS){ gl2psFreeCompress(); gl2psFree(gl2ps->compress); gl2ps->compress = NULL; } #endif } /* PDF begin viewport */ static void gl2psPrintPDFBeginViewport(GLint viewport[4]) { int offs = 0; GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintPDFHeader(); gl2ps->header = GL_FALSE; } offs += gl2psPrintf("q\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } offs += gl2psPrintPDFFillColor(rgba); offs += gl2psPrintf("%d %d %d %d re\n" "W\n" "f\n", x, y, w, h); } else{ offs += gl2psPrintf("%d %d %d %d re\n" "W\n" "n\n", x, y, w, h); } gl2ps->streamlength += offs; } static GLint gl2psPrintPDFEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2ps->streamlength += gl2psPrintf("Q\n"); return res; } static void gl2psPrintPDFFinalPrimitive(void) { } /* definition of the PDF backend */ static GL2PSbackend gl2psPDF = { gl2psPrintPDFHeader, gl2psPrintPDFFooter, gl2psPrintPDFBeginViewport, gl2psPrintPDFEndViewport, gl2psPrintPDFPrimitive, gl2psPrintPDFFinalPrimitive, "pdf", "Portable Document Format" }; /********************************************************************* * * SVG routines * *********************************************************************/ static void gl2psSVGGetCoordsAndColors(int n, GL2PSvertex *verts, GL2PSxyz *xyz, GL2PSrgba *rgba) { int i, j; for(i = 0; i < n; i++){ xyz[i][0] = verts[i].xyz[0]; xyz[i][1] = gl2ps->viewport[3] - verts[i].xyz[1]; xyz[i][2] = 0.0F; for(j = 0; j < 4; j++) rgba[i][j] = verts[i].rgba[j]; } } static void gl2psSVGGetColorString(GL2PSrgba rgba, char str[32]) { int r = (int)(255. * rgba[0]); int g = (int)(255. * rgba[1]); int b = (int)(255. * rgba[2]); int rc = (r < 0) ? 0 : (r > 255) ? 255 : r; int gc = (g < 0) ? 0 : (g > 255) ? 255 : g; int bc = (b < 0) ? 0 : (b > 255) ? 255 : b; sprintf(str, "#%2.2x%2.2x%2.2x", rc, gc, bc); } static void gl2psPrintSVGHeader(void) { int x, y, width, height; char col[32]; time_t now; time(&now); if (gl2ps->options & GL2PS_LANDSCAPE){ x = (int)gl2ps->viewport[1]; y = (int)gl2ps->viewport[0]; width = (int)gl2ps->viewport[3]; height = (int)gl2ps->viewport[2]; } else{ x = (int)gl2ps->viewport[0]; y = (int)gl2ps->viewport[1]; width = (int)gl2ps->viewport[2]; height = (int)gl2ps->viewport[3]; } /* Compressed SVG files (.svgz) are simply gzipped SVG files */ gl2psPrintGzipHeader(); gl2psPrintf("\n"); gl2psPrintf("\n", width, height, x, y, width, height); gl2psPrintf("%s\n", gl2ps->title); gl2psPrintf("\n"); gl2psPrintf("Creator: GL2PS %d.%d.%d%s, %s\n" "For: %s\n" "CreationDate: %s", GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); gl2psPrintf("\n"); gl2psPrintf("\n"); gl2psPrintf("\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psSVGGetColorString(gl2ps->bgcolor, col); gl2psPrintf("\n", col, (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3], (int)gl2ps->viewport[0], (int)gl2ps->viewport[3]); } /* group all the primitives and disable antialiasing */ gl2psPrintf("\n"); } static void gl2psPrintSVGSmoothTriangle(GL2PSxyz xyz[3], GL2PSrgba rgba[3]) { int i; GL2PSxyz xyz2[3]; GL2PSrgba rgba2[3]; char col[32]; /* Apparently there is no easy way to do Gouraud shading in SVG without explicitly pre-defining gradients, so for now we just do recursive subdivision */ if(gl2psSameColorThreshold(3, rgba, gl2ps->threshold)){ gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("\n", xyz[0][0], xyz[0][1], xyz[1][0], xyz[1][1], xyz[2][0], xyz[2][1]); } else{ /* subdivide into 4 subtriangles */ for(i = 0; i < 3; i++){ xyz2[0][i] = xyz[0][i]; xyz2[1][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[2][i] = 0.5F * (xyz[0][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = rgba[0][i]; rgba2[1][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[2][i] = 0.5F * (rgba[0][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[1][i] = xyz[1][i]; xyz2[2][i] = 0.5F * (xyz[1][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[1][i] = rgba[1][i]; rgba2[2][i] = 0.5F * (rgba[1][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[2][i]); xyz2[1][i] = xyz[2][i]; xyz2[2][i] = 0.5F * (xyz[1][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[2][i]); rgba2[1][i] = rgba[2][i]; rgba2[2][i] = 0.5F * (rgba[1][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); for(i = 0; i < 3; i++){ xyz2[0][i] = 0.5F * (xyz[0][i] + xyz[1][i]); xyz2[1][i] = 0.5F * (xyz[1][i] + xyz[2][i]); xyz2[2][i] = 0.5F * (xyz[0][i] + xyz[2][i]); } for(i = 0; i < 4; i++){ rgba2[0][i] = 0.5F * (rgba[0][i] + rgba[1][i]); rgba2[1][i] = 0.5F * (rgba[1][i] + rgba[2][i]); rgba2[2][i] = 0.5F * (rgba[0][i] + rgba[2][i]); } gl2psPrintSVGSmoothTriangle(xyz2, rgba2); } } static void gl2psPrintSVGDash(GLushort pattern, GLint factor) { int i, n, array[10]; if(!pattern || !factor) return; /* solid line */ gl2psParseStipplePattern(pattern, factor, &n, array); gl2psPrintf("stroke-dasharray=\""); for(i = 0; i < n; i++){ if(i) gl2psPrintf(","); gl2psPrintf("%d", array[i]); } gl2psPrintf("\" "); } static void gl2psEndSVGLine(void) { int i; if(gl2ps->lastvertex.rgba[0] >= 0.){ gl2psPrintf("%g,%g\"/>\n", gl2ps->lastvertex.xyz[0], gl2ps->viewport[3] - gl2ps->lastvertex.xyz[1]); for(i = 0; i < 3; i++) gl2ps->lastvertex.xyz[i] = -1.; for(i = 0; i < 4; i++) gl2ps->lastvertex.rgba[i] = -1.; } } static void gl2psPrintSVGPixmap(GLfloat x, GLfloat y, GL2PSimage *pixmap) { #if defined(GL2PS_HAVE_LIBPNG) GL2PSlist *png; unsigned char c; int i; /* The only image types supported by the SVG standard are JPEG, PNG and SVG. Here we choose PNG, and since we want to embed the image directly in the SVG stream (and not link to an external image file), we need to encode the pixmap into PNG in memory, then encode it into base64. */ png = gl2psListCreate(pixmap->width * pixmap->height * 3, 1000, sizeof(unsigned char)); gl2psConvertPixmapToPNG(pixmap, png); gl2psListEncodeBase64(png); gl2psPrintf("height, pixmap->width, pixmap->height); gl2psPrintf("xlink:href=\"data:image/png;base64,"); for(i = 0; i < gl2psListNbr(png); i++){ gl2psListRead(png, i, &c); gl2psPrintf("%c", c); } gl2psPrintf("\"/>\n"); gl2psListDelete(png); #else (void) x; (void) y; (void) pixmap; /* not used */ gl2psMsg(GL2PS_WARNING, "GL2PS must be compiled with PNG support in " "order to embed images in SVG streams"); #endif } static void gl2psPrintSVGPrimitive(void *data) { GL2PSprimitive *prim; GL2PSxyz xyz[4]; GL2PSrgba rgba[4]; char col[32]; int newline; prim = *(GL2PSprimitive**)data; if((gl2ps->options & GL2PS_OCCLUSION_CULL) && prim->culled) return; /* We try to draw connected lines as a single path to get nice line joins and correct stippling. So if the primitive to print is not a line we must first finish the current line (if any): */ if(prim->type != GL2PS_LINE) gl2psEndSVGLine(); gl2psSVGGetCoordsAndColors(prim->numverts, prim->verts, xyz, rgba); switch(prim->type){ case GL2PS_POINT : gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("\n", xyz[0][0], xyz[0][1], 0.5 * prim->width); break; case GL2PS_LINE : if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) || !gl2psSameColor(gl2ps->lastrgba, prim->verts[0].rgba) || gl2ps->lastlinewidth != prim->width || gl2ps->lastpattern != prim->pattern || gl2ps->lastfactor != prim->factor){ /* End the current line if the new segment does not start where the last one ended, or if the color, the width or the stippling have changed (we will need to use multi-point gradients for smooth-shaded lines) */ gl2psEndSVGLine(); newline = 1; } else{ newline = 0; } gl2ps->lastvertex = prim->verts[1]; gl2psSetLastColor(prim->verts[0].rgba); gl2ps->lastlinewidth = prim->width; gl2ps->lastpattern = prim->pattern; gl2ps->lastfactor = prim->factor; if(newline){ gl2psSVGGetColorString(rgba[0], col); gl2psPrintf("width); if(rgba[0][3] < 1.0F) gl2psPrintf("stroke-opacity=\"%g\" ", rgba[0][3]); gl2psPrintSVGDash(prim->pattern, prim->factor); gl2psPrintf("points=\"%g,%g ", xyz[0][0], xyz[0][1]); } else{ gl2psPrintf("%g,%g ", xyz[0][0], xyz[0][1]); } break; case GL2PS_TRIANGLE : gl2psPrintSVGSmoothTriangle(xyz, rgba); break; case GL2PS_QUADRANGLE : gl2psMsg(GL2PS_WARNING, "There should not be any quad left to print"); break; case GL2PS_PIXMAP : gl2psPrintSVGPixmap(xyz[0][0], xyz[0][1], prim->data.image); break; case GL2PS_TEXT : gl2psSVGGetColorString(prim->verts[0].rgba, col); gl2psPrintf("data.text->fontsize); if(prim->data.text->angle) gl2psPrintf("transform=\"rotate(%g, %g, %g)\" ", -prim->data.text->angle, xyz[0][0], xyz[0][1]); switch(prim->data.text->alignment){ case GL2PS_TEXT_C: gl2psPrintf("text-anchor=\"middle\" baseline-shift=\"%d\" ", -prim->data.text->fontsize / 2); break; case GL2PS_TEXT_CL: gl2psPrintf("text-anchor=\"start\" baseline-shift=\"%d\" ", -prim->data.text->fontsize / 2); break; case GL2PS_TEXT_CR: gl2psPrintf("text-anchor=\"end\" baseline-shift=\"%d\" ", -prim->data.text->fontsize / 2); break; case GL2PS_TEXT_B: gl2psPrintf("text-anchor=\"middle\" baseline-shift=\"0\" "); break; case GL2PS_TEXT_BR: gl2psPrintf("text-anchor=\"end\" baseline-shift=\"0\" "); break; case GL2PS_TEXT_T: gl2psPrintf("text-anchor=\"middle\" baseline-shift=\"%d\" ", -prim->data.text->fontsize); break; case GL2PS_TEXT_TL: gl2psPrintf("text-anchor=\"start\" baseline-shift=\"%d\" ", -prim->data.text->fontsize); break; case GL2PS_TEXT_TR: gl2psPrintf("text-anchor=\"end\" baseline-shift=\"%d\" ", -prim->data.text->fontsize); break; case GL2PS_TEXT_BL: default: /* same as GL2PS_TEXT_BL */ gl2psPrintf("text-anchor=\"start\" baseline-shift=\"0\" "); break; } if(!strcmp(prim->data.text->fontname, "Times-Roman")) gl2psPrintf("font-family=\"Times\">"); else if(!strcmp(prim->data.text->fontname, "Times-Bold")) gl2psPrintf("font-family=\"Times\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Times-Italic")) gl2psPrintf("font-family=\"Times\" font-style=\"italic\">"); else if(!strcmp(prim->data.text->fontname, "Times-BoldItalic")) gl2psPrintf("font-family=\"Times\" font-style=\"italic\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-Bold")) gl2psPrintf("font-family=\"Helvetica\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-Oblique")) gl2psPrintf("font-family=\"Helvetica\" font-style=\"oblique\">"); else if(!strcmp(prim->data.text->fontname, "Helvetica-BoldOblique")) gl2psPrintf("font-family=\"Helvetica\" font-style=\"oblique\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Courier-Bold")) gl2psPrintf("font-family=\"Courier\" font-weight=\"bold\">"); else if(!strcmp(prim->data.text->fontname, "Courier-Oblique")) gl2psPrintf("font-family=\"Courier\" font-style=\"oblique\">"); else if(!strcmp(prim->data.text->fontname, "Courier-BoldOblique")) gl2psPrintf("font-family=\"Courier\" font-style=\"oblique\" font-weight=\"bold\">"); else gl2psPrintf("font-family=\"%s\">", prim->data.text->fontname); gl2psPrintf("%s\n", prim->data.text->str); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if(prim->data.text->alignment == GL2PS_SVG) gl2psPrintf("%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintSVGFooter(void) { gl2psPrintf("\n"); gl2psPrintf("\n"); gl2psPrintGzipFooter(); } static void gl2psPrintSVGBeginViewport(GLint viewport[4]) { GLint idx; char col[32]; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintSVGHeader(); gl2ps->header = GL_FALSE; } if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psSVGGetColorString(rgba, col); gl2psPrintf("\n", col, x, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - (y + h), x, gl2ps->viewport[3] - (y + h)); } gl2psPrintf("\n", x, y, w, h); gl2psPrintf(" \n", x, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - y, x + w, gl2ps->viewport[3] - (y + h), x, gl2ps->viewport[3] - (y + h)); gl2psPrintf("\n"); gl2psPrintf("\n", x, y, w, h); } static GLint gl2psPrintSVGEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); gl2psPrintf("\n"); return res; } static void gl2psPrintSVGFinalPrimitive(void) { /* End any remaining line, if any */ gl2psEndSVGLine(); } /* definition of the SVG backend */ static GL2PSbackend gl2psSVG = { gl2psPrintSVGHeader, gl2psPrintSVGFooter, gl2psPrintSVGBeginViewport, gl2psPrintSVGEndViewport, gl2psPrintSVGPrimitive, gl2psPrintSVGFinalPrimitive, "svg", "Scalable Vector Graphics" }; /********************************************************************* * * PGF routines * *********************************************************************/ static void gl2psPrintPGFColor(GL2PSrgba rgba) { if(!gl2psSameColor(gl2ps->lastrgba, rgba)){ gl2psSetLastColor(rgba); fprintf(gl2ps->stream, "\\color[rgb]{%f,%f,%f}\n", rgba[0], rgba[1], rgba[2]); } } static void gl2psPrintPGFHeader(void) { time_t now; time(&now); fprintf(gl2ps->stream, "%% Title: %s\n" "%% Creator: GL2PS %d.%d.%d%s, %s\n" "%% For: %s\n" "%% CreationDate: %s", gl2ps->title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION, GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT, gl2ps->producer, ctime(&now)); fprintf(gl2ps->stream, "\\begin{pgfpicture}\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ gl2psPrintPGFColor(gl2ps->bgcolor); fprintf(gl2ps->stream, "\\pgfpathrectanglecorners{" "\\pgfpoint{%dpt}{%dpt}}{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{fill}\n", (int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3]); } } static void gl2psPrintPGFDash(GLushort pattern, GLint factor) { int i, n, array[10]; if(pattern == gl2ps->lastpattern && factor == gl2ps->lastfactor) return; gl2ps->lastpattern = pattern; gl2ps->lastfactor = factor; if(!pattern || !factor){ /* solid line */ fprintf(gl2ps->stream, "\\pgfsetdash{}{0pt}\n"); } else{ gl2psParseStipplePattern(pattern, factor, &n, array); fprintf(gl2ps->stream, "\\pgfsetdash{"); for(i = 0; i < n; i++) fprintf(gl2ps->stream, "{%dpt}", array[i]); fprintf(gl2ps->stream, "}{0pt}\n"); } } static const char *gl2psPGFTextAlignment(int align) { switch(align){ case GL2PS_TEXT_C : return "center"; case GL2PS_TEXT_CL : return "west"; case GL2PS_TEXT_CR : return "east"; case GL2PS_TEXT_B : return "south"; case GL2PS_TEXT_BR : return "south east"; case GL2PS_TEXT_T : return "north"; case GL2PS_TEXT_TL : return "north west"; case GL2PS_TEXT_TR : return "north east"; case GL2PS_TEXT_BL : default : return "south west"; } } static void gl2psPrintPGFPrimitive(void *data) { GL2PSprimitive *prim; prim = *(GL2PSprimitive**)data; switch(prim->type){ case GL2PS_POINT : /* Points in openGL are rectangular */ gl2psPrintPGFColor(prim->verts[0].rgba); fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%fpt}{%fpt}}" "{\\pgfpoint{%fpt}{%fpt}}\n\\pgfusepath{fill}\n", prim->verts[0].xyz[0]-0.5*prim->width, prim->verts[0].xyz[1]-0.5*prim->width, prim->width,prim->width); break; case GL2PS_LINE : gl2psPrintPGFColor(prim->verts[0].rgba); if(gl2ps->lastlinewidth != prim->width){ gl2ps->lastlinewidth = prim->width; fprintf(gl2ps->stream, "\\pgfsetlinewidth{%fpt}\n", gl2ps->lastlinewidth); } gl2psPrintPGFDash(prim->pattern, prim->factor); fprintf(gl2ps->stream, "\\pgfpathmoveto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgfusepath{stroke}\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); break; case GL2PS_TRIANGLE : if(gl2ps->lastlinewidth != 0){ gl2ps->lastlinewidth = 0; fprintf(gl2ps->stream, "\\pgfsetlinewidth{0.01pt}\n"); } gl2psPrintPGFColor(prim->verts[0].rgba); fprintf(gl2ps->stream, "\\pgfpathmoveto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgflineto{\\pgfpoint{%fpt}{%fpt}}\n" "\\pgfpathclose\n" "\\pgfusepath{fill,stroke}\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); break; case GL2PS_TEXT : fprintf(gl2ps->stream, "{\n\\pgftransformshift{\\pgfpoint{%fpt}{%fpt}}\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1]); if(prim->data.text->angle) fprintf(gl2ps->stream, "\\pgftransformrotate{%f}{", prim->data.text->angle); fprintf(gl2ps->stream, "\\pgfnode{rectangle}{%s}{\\fontsize{%d}{0}\\selectfont", gl2psPGFTextAlignment(prim->data.text->alignment), prim->data.text->fontsize); fprintf(gl2ps->stream, "\\textcolor[rgb]{%g,%g,%g}{{%s}}", prim->verts[0].rgba[0], prim->verts[0].rgba[1], prim->verts[0].rgba[2], prim->data.text->str); fprintf(gl2ps->stream, "}{}{\\pgfusepath{discard}}}\n"); break; case GL2PS_SPECIAL : /* alignment contains the format for which the special output text is intended */ if (prim->data.text->alignment == GL2PS_PGF) fprintf(gl2ps->stream, "%s\n", prim->data.text->str); break; default : break; } } static void gl2psPrintPGFFooter(void) { fprintf(gl2ps->stream, "\\end{pgfpicture}\n"); } static void gl2psPrintPGFBeginViewport(GLint viewport[4]) { GLint idx; GLfloat rgba[4]; int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3]; glRenderMode(GL_FEEDBACK); if(gl2ps->header){ gl2psPrintPGFHeader(); gl2ps->header = GL_FALSE; } fprintf(gl2ps->stream, "\\begin{pgfscope}\n"); if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0){ glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); } else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); rgba[0] = gl2ps->colormap[idx][0]; rgba[1] = gl2ps->colormap[idx][1]; rgba[2] = gl2ps->colormap[idx][2]; rgba[3] = 1.0F; } gl2psPrintPGFColor(rgba); fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%dpt}{%dpt}}" "{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{fill}\n", x, y, w, h); } fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%dpt}{%dpt}}" "{\\pgfpoint{%dpt}{%dpt}}\n" "\\pgfusepath{clip}\n", x, y, w, h); } static GLint gl2psPrintPGFEndViewport(void) { GLint res; res = gl2psPrintPrimitives(); fprintf(gl2ps->stream, "\\end{pgfscope}\n"); return res; } static void gl2psPrintPGFFinalPrimitive(void) { } /* definition of the PGF backend */ static GL2PSbackend gl2psPGF = { gl2psPrintPGFHeader, gl2psPrintPGFFooter, gl2psPrintPGFBeginViewport, gl2psPrintPGFEndViewport, gl2psPrintPGFPrimitive, gl2psPrintPGFFinalPrimitive, "tex", "PGF Latex Graphics" }; /********************************************************************* * * General primitive printing routine * *********************************************************************/ /* Warning: the ordering of the backends must match the format #defines in gl2ps.h */ static GL2PSbackend *gl2psbackends[] = { &gl2psPS, /* 0 */ &gl2psEPS, /* 1 */ &gl2psTEX, /* 2 */ &gl2psPDF, /* 3 */ &gl2psSVG, /* 4 */ &gl2psPGF /* 5 */ }; static void gl2psComputeTightBoundingBox(void *data) { GL2PSprimitive *prim; int i; prim = *(GL2PSprimitive**)data; for(i = 0; i < prim->numverts; i++){ if(prim->verts[i].xyz[0] < gl2ps->viewport[0]) gl2ps->viewport[0] = (GLint)prim->verts[i].xyz[0]; if(prim->verts[i].xyz[0] > gl2ps->viewport[2]) gl2ps->viewport[2] = (GLint)(prim->verts[i].xyz[0] + 0.5F); if(prim->verts[i].xyz[1] < gl2ps->viewport[1]) gl2ps->viewport[1] = (GLint)prim->verts[i].xyz[1]; if(prim->verts[i].xyz[1] > gl2ps->viewport[3]) gl2ps->viewport[3] = (GLint)(prim->verts[i].xyz[1] + 0.5F); } } static GLint gl2psPrintPrimitives(void) { GL2PSbsptree *root; GL2PSxyz eye = {0.0F, 0.0F, 100.0F * GL2PS_ZSCALE}; GLint used; used = glRenderMode(GL_RENDER); if(used < 0){ gl2psMsg(GL2PS_INFO, "OpenGL feedback buffer overflow"); return GL2PS_OVERFLOW; } if(used > 0) gl2psParseFeedbackBuffer(used); gl2psRescaleAndOffset(); if(gl2ps->header){ if(gl2psListNbr(gl2ps->primitives) && (gl2ps->options & GL2PS_TIGHT_BOUNDING_BOX)){ gl2ps->viewport[0] = gl2ps->viewport[1] = 100000; gl2ps->viewport[2] = gl2ps->viewport[3] = -100000; gl2psListAction(gl2ps->primitives, gl2psComputeTightBoundingBox); } (gl2psbackends[gl2ps->format]->printHeader)(); gl2ps->header = GL_FALSE; } if(!gl2psListNbr(gl2ps->primitives)){ /* empty feedback buffer and/or nothing else to print */ return GL2PS_NO_FEEDBACK; } switch(gl2ps->sort){ case GL2PS_NO_SORT : gl2psListAction(gl2ps->primitives, gl2psbackends[gl2ps->format]->printPrimitive); gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); /* reset the primitive list, waiting for the next viewport */ gl2psListReset(gl2ps->primitives); break; case GL2PS_SIMPLE_SORT : gl2psListSort(gl2ps->primitives, gl2psCompareDepth); if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psListActionInverse(gl2ps->primitives, gl2psAddInImageTree); gl2psFreeBspImageTree(&gl2ps->imagetree); } gl2psListAction(gl2ps->primitives, gl2psbackends[gl2ps->format]->printPrimitive); gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); /* reset the primitive list, waiting for the next viewport */ gl2psListReset(gl2ps->primitives); break; case GL2PS_BSP_SORT : root = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); gl2psBuildBspTree(root, gl2ps->primitives); if(GL_TRUE == gl2ps->boundary) gl2psBuildPolygonBoundary(root); if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psTraverseBspTree(root, eye, -GL2PS_EPSILON, gl2psLess, gl2psAddInImageTree, 1); gl2psFreeBspImageTree(&gl2ps->imagetree); } gl2psTraverseBspTree(root, eye, GL2PS_EPSILON, gl2psGreater, gl2psbackends[gl2ps->format]->printPrimitive, 0); gl2psFreeBspTree(&root); /* reallocate the primitive list (it's been deleted by gl2psBuildBspTree) in case there is another viewport */ gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); break; } gl2psbackends[gl2ps->format]->printFinalPrimitive(); return GL2PS_SUCCESS; } /********************************************************************* * * Public routines * *********************************************************************/ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, GLint viewport[4], GLint format, GLint sort, GLint options, GLint colormode, GLint colorsize, GL2PSrgba *colormap, GLint nr, GLint ng, GLint nb, GLint buffersize, FILE *stream, const char *filename) { GLint idx; int i; if(gl2ps){ gl2psMsg(GL2PS_ERROR, "gl2psBeginPage called in wrong program state"); return GL2PS_ERROR; } gl2ps = (GL2PScontext*)gl2psMalloc(sizeof(GL2PScontext)); if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))){ gl2ps->format = format; } else { gl2psMsg(GL2PS_ERROR, "Unknown output format: %d", format); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } switch(sort){ case GL2PS_NO_SORT : case GL2PS_SIMPLE_SORT : case GL2PS_BSP_SORT : gl2ps->sort = sort; break; default : gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", sort); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } if(stream){ gl2ps->stream = stream; } else{ gl2psMsg(GL2PS_ERROR, "Bad file pointer"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->header = GL_TRUE; gl2ps->maxbestroot = 10; gl2ps->options = options; gl2ps->compress = NULL; gl2ps->imagemap_head = NULL; gl2ps->imagemap_tail = NULL; if(gl2ps->options & GL2PS_USE_CURRENT_VIEWPORT){ glGetIntegerv(GL_VIEWPORT, gl2ps->viewport); } else{ for(i = 0; i < 4; i++){ gl2ps->viewport[i] = viewport[i]; } } if(!gl2ps->viewport[2] || !gl2ps->viewport[3]){ gl2psMsg(GL2PS_ERROR, "Incorrect viewport (x=%d, y=%d, width=%d, height=%d)", gl2ps->viewport[0], gl2ps->viewport[1], gl2ps->viewport[2], gl2ps->viewport[3]); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->threshold[0] = nr ? 1.0F / (GLfloat)nr : 0.064F; gl2ps->threshold[1] = ng ? 1.0F / (GLfloat)ng : 0.034F; gl2ps->threshold[2] = nb ? 1.0F / (GLfloat)nb : 0.100F; gl2ps->colormode = colormode; gl2ps->buffersize = buffersize > 0 ? buffersize : 2048 * 2048; for(i = 0; i < 3; i++){ gl2ps->lastvertex.xyz[i] = -1.0F; } for(i = 0; i < 4; i++){ gl2ps->lastvertex.rgba[i] = -1.0F; gl2ps->lastrgba[i] = -1.0F; } gl2ps->lastlinewidth = -1.0F; gl2ps->lastpattern = 0; gl2ps->lastfactor = 0; gl2ps->imagetree = NULL; gl2ps->primitivetoadd = NULL; gl2ps->zerosurfacearea = GL_FALSE; gl2ps->pdfprimlist = NULL; gl2ps->pdfgrouplist = NULL; gl2ps->xreflist = NULL; /* get default blending mode from current OpenGL state (enabled by default for SVG) */ gl2ps->blending = (gl2ps->format == GL2PS_SVG) ? GL_TRUE : glIsEnabled(GL_BLEND); glGetIntegerv(GL_BLEND_SRC, &gl2ps->blendfunc[0]); glGetIntegerv(GL_BLEND_DST, &gl2ps->blendfunc[1]); if(gl2ps->colormode == GL_RGBA){ gl2ps->colorsize = 0; gl2ps->colormap = NULL; glGetFloatv(GL_COLOR_CLEAR_VALUE, gl2ps->bgcolor); } else if(gl2ps->colormode == GL_COLOR_INDEX){ if(!colorsize || !colormap){ gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } gl2ps->colorsize = colorsize; gl2ps->colormap = (GL2PSrgba*)gl2psMalloc(gl2ps->colorsize * sizeof(GL2PSrgba)); memcpy(gl2ps->colormap, colormap, gl2ps->colorsize * sizeof(GL2PSrgba)); glGetIntegerv(GL_INDEX_CLEAR_VALUE, &idx); gl2ps->bgcolor[0] = gl2ps->colormap[idx][0]; gl2ps->bgcolor[1] = gl2ps->colormap[idx][1]; gl2ps->bgcolor[2] = gl2ps->colormap[idx][2]; gl2ps->bgcolor[3] = 1.0F; } else{ gl2psMsg(GL2PS_ERROR, "Unknown color mode in gl2psBeginPage"); gl2psFree(gl2ps); gl2ps = NULL; return GL2PS_ERROR; } if(!title){ gl2ps->title = (char*)gl2psMalloc(sizeof(char)); gl2ps->title[0] = '\0'; } else{ gl2ps->title = (char*)gl2psMalloc((strlen(title)+1)*sizeof(char)); strcpy(gl2ps->title, title); } if(!producer){ gl2ps->producer = (char*)gl2psMalloc(sizeof(char)); gl2ps->producer[0] = '\0'; } else{ gl2ps->producer = (char*)gl2psMalloc((strlen(producer)+1)*sizeof(char)); strcpy(gl2ps->producer, producer); } if(!filename){ gl2ps->filename = (char*)gl2psMalloc(sizeof(char)); gl2ps->filename[0] = '\0'; } else{ gl2ps->filename = (char*)gl2psMalloc((strlen(filename)+1)*sizeof(char)); strcpy(gl2ps->filename, filename); } gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); gl2ps->auxprimitives = gl2psListCreate(100, 100, sizeof(GL2PSprimitive*)); gl2ps->feedback = (GLfloat*)gl2psMalloc(gl2ps->buffersize * sizeof(GLfloat)); glFeedbackBuffer(gl2ps->buffersize, GL_3D_COLOR, gl2ps->feedback); glRenderMode(GL_FEEDBACK); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEndPage(void) { GLint res; if(!gl2ps) return GL2PS_UNINITIALIZED; res = gl2psPrintPrimitives(); if(res != GL2PS_OVERFLOW) (gl2psbackends[gl2ps->format]->printFooter)(); fflush(gl2ps->stream); gl2psListDelete(gl2ps->primitives); gl2psListDelete(gl2ps->auxprimitives); gl2psFreeImagemap(gl2ps->imagemap_head); gl2psFree(gl2ps->colormap); gl2psFree(gl2ps->title); gl2psFree(gl2ps->producer); gl2psFree(gl2ps->filename); gl2psFree(gl2ps->feedback); gl2psFree(gl2ps); gl2ps = NULL; return res; } GL2PSDLL_API GLint gl2psBeginViewport(GLint viewport[4]) { if(!gl2ps) return GL2PS_UNINITIALIZED; (gl2psbackends[gl2ps->format]->beginViewport)(viewport); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEndViewport(void) { GLint res; if(!gl2ps) return GL2PS_UNINITIALIZED; res = (gl2psbackends[gl2ps->format]->endViewport)(); /* reset last used colors, line widths */ gl2ps->lastlinewidth = -1.0F; return res; } GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle, GL2PSrgba color) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, color); } GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GLshort fontsize, GLint alignment, GLfloat angle) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL); } GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize) { return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, GL2PS_TEXT_BL, 0.0F, NULL); } GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str) { return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL); } GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, GLint xorig, GLint yorig, GLenum format, GLenum type, const void *pixels) { int size, i; const GLfloat *piv; GLfloat pos[4], zoom_x, zoom_y; GL2PSprimitive *prim; GLboolean valid; if(!gl2ps || !pixels) return GL2PS_UNINITIALIZED; if((width <= 0) || (height <= 0)) return GL2PS_ERROR; if(gl2ps->options & GL2PS_NO_PIXMAP) return GL2PS_SUCCESS; if((format != GL_RGB && format != GL_RGBA) || type != GL_FLOAT){ gl2psMsg(GL2PS_ERROR, "gl2psDrawPixels only implemented for " "GL_RGB/GL_RGBA, GL_FLOAT pixels"); return GL2PS_ERROR; } glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if(GL_FALSE == valid) return GL2PS_SUCCESS; /* the primitive is culled */ glGetFloatv(GL_CURRENT_RASTER_POSITION, pos); glGetFloatv(GL_ZOOM_X, &zoom_x); glGetFloatv(GL_ZOOM_Y, &zoom_y); prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive)); prim->type = GL2PS_PIXMAP; prim->boundary = 0; prim->numverts = 1; prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex)); prim->verts[0].xyz[0] = pos[0] + xorig; prim->verts[0].xyz[1] = pos[1] + yorig; prim->verts[0].xyz[2] = pos[2]; prim->culled = 0; prim->offset = 0; prim->pattern = 0; prim->factor = 0; prim->width = 1; glGetFloatv(GL_CURRENT_RASTER_COLOR, prim->verts[0].rgba); prim->data.image = (GL2PSimage*)gl2psMalloc(sizeof(GL2PSimage)); prim->data.image->width = width; prim->data.image->height = height; prim->data.image->zoom_x = zoom_x; prim->data.image->zoom_y = zoom_y; prim->data.image->format = format; prim->data.image->type = type; switch(format){ case GL_RGBA: if(gl2ps->options & GL2PS_NO_BLENDING || !gl2ps->blending){ /* special case: blending turned off */ prim->data.image->format = GL_RGB; size = height * width * 3; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); piv = (const GLfloat*)pixels; for(i = 0; i < size; ++i, ++piv){ prim->data.image->pixels[i] = *piv; if(!((i + 1) % 3)) ++piv; } } else{ size = height * width * 4; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); memcpy(prim->data.image->pixels, pixels, size * sizeof(GLfloat)); } break; case GL_RGB: default: size = height * width * 3; prim->data.image->pixels = (GLfloat*)gl2psMalloc(size * sizeof(GLfloat)); memcpy(prim->data.image->pixels, pixels, size * sizeof(GLfloat)); break; } gl2psListAdd(gl2ps->auxprimitives, &prim); glPassThrough(GL2PS_DRAW_PIXELS_TOKEN); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psDrawImageMap(GLsizei width, GLsizei height, const GLfloat position[3], const unsigned char *imagemap){ int size, i; int sizeoffloat = sizeof(GLfloat); if(!gl2ps || !imagemap) return GL2PS_UNINITIALIZED; if((width <= 0) || (height <= 0)) return GL2PS_ERROR; size = height + height * ((width - 1) / 8); glPassThrough(GL2PS_IMAGEMAP_TOKEN); glBegin(GL_POINTS); glVertex3f(position[0], position[1],position[2]); glEnd(); glPassThrough((GLfloat)width); glPassThrough((GLfloat)height); for(i = 0; i < size; i += sizeoffloat){ const float *value = (const float*)imagemap; glPassThrough(*value); imagemap += sizeoffloat; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psEnable(GLint mode) { GLint tmp; if(!gl2ps) return GL2PS_UNINITIALIZED; switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_BEGIN_OFFSET_TOKEN); glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &gl2ps->offset[0]); glGetFloatv(GL_POLYGON_OFFSET_UNITS, &gl2ps->offset[1]); break; case GL2PS_POLYGON_BOUNDARY : glPassThrough(GL2PS_BEGIN_BOUNDARY_TOKEN); break; case GL2PS_LINE_STIPPLE : glPassThrough(GL2PS_BEGIN_STIPPLE_TOKEN); glGetIntegerv(GL_LINE_STIPPLE_PATTERN, &tmp); glPassThrough((GLfloat)tmp); glGetIntegerv(GL_LINE_STIPPLE_REPEAT, &tmp); glPassThrough((GLfloat)tmp); break; case GL2PS_BLEND : glPassThrough(GL2PS_BEGIN_BLEND_TOKEN); break; default : gl2psMsg(GL2PS_WARNING, "Unknown mode in gl2psEnable: %d", mode); return GL2PS_WARNING; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psDisable(GLint mode) { if(!gl2ps) return GL2PS_UNINITIALIZED; switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_END_OFFSET_TOKEN); break; case GL2PS_POLYGON_BOUNDARY : glPassThrough(GL2PS_END_BOUNDARY_TOKEN); break; case GL2PS_LINE_STIPPLE : glPassThrough(GL2PS_END_STIPPLE_TOKEN); break; case GL2PS_BLEND : glPassThrough(GL2PS_END_BLEND_TOKEN); break; default : gl2psMsg(GL2PS_WARNING, "Unknown mode in gl2psDisable: %d", mode); return GL2PS_WARNING; } return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psPointSize(GLfloat value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_POINT_SIZE_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psLineWidth(GLfloat value) { if(!gl2ps) return GL2PS_UNINITIALIZED; glPassThrough(GL2PS_LINE_WIDTH_TOKEN); glPassThrough(value); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psBlendFunc(GLenum sfactor, GLenum dfactor) { if(!gl2ps) return GL2PS_UNINITIALIZED; if(GL_FALSE == gl2psSupportedBlendMode(sfactor, dfactor)) return GL2PS_WARNING; glPassThrough(GL2PS_SRC_BLEND_TOKEN); glPassThrough((GLfloat)sfactor); glPassThrough(GL2PS_DST_BLEND_TOKEN); glPassThrough((GLfloat)dfactor); return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psSetOptions(GLint options) { if(!gl2ps) return GL2PS_UNINITIALIZED; gl2ps->options = options; return GL2PS_SUCCESS; } GL2PSDLL_API GLint gl2psGetOptions(GLint *options) { if(!gl2ps) { *options = 0; return GL2PS_UNINITIALIZED; } *options = gl2ps->options; return GL2PS_SUCCESS; } GL2PSDLL_API const char *gl2psGetFileExtension(GLint format) { if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))) return gl2psbackends[format]->file_extension; else return "Unknown format"; } GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format) { if(format >= 0 && format < (GLint)(sizeof(gl2psbackends) / sizeof(gl2psbackends[0]))) return gl2psbackends[format]->description; else return "Unknown format"; } GL2PSDLL_API GLint gl2psGetFileFormat() { return gl2ps->format; } rgl/src/callbacks.cpp0000644000176000001440000000431612262026246014306 0ustar ripleyusers#include "api.h" #include "rglview.h" #include "DeviceManager.hpp" using namespace rgl; namespace rgl { extern DeviceManager* deviceManager; } /* These defines are not in the installed version of R */ #include "R.h" #include #include static void userControl(void *userData, int mouseX, int mouseY) { SEXP fn = (SEXP)userData; eval(lang3(fn, ScalarInteger(mouseX), ScalarInteger(mouseY)), R_GlobalEnv); } static void userControlEnd(void *userData) { SEXP fn = (SEXP)userData; eval(lang1(fn), R_GlobalEnv); } static void userCleanup(void **userData) { for (int i=0; i<3; i++) { if (userData[i]) { R_ReleaseObject((SEXP)userData[i]); userData[i] = 0; } } } SEXP rgl::rgl_setMouseCallbacks(SEXP button, SEXP begin, SEXP update, SEXP end) { Device* device; if (deviceManager && (device = deviceManager->getCurrentDevice())) { RGLView* rglview = device->getRGLView(); void* userData[3]; userControlPtr beginCallback, updateCallback; userControlEndPtr endCallback; userCleanupPtr cleanupCallback; int b = asInteger(button); if (b < 1 || b > 3) error("button must be 1, 2 or 3"); rglview->getMouseCallbacks(b, &beginCallback, &updateCallback, &endCallback, &cleanupCallback, (void**)&userData); if (isFunction(begin)) { beginCallback = &userControl; userData[0] = (void*)begin; R_PreserveObject(begin); } else if (begin == R_NilValue) beginCallback = 0; else error("callback must be a function"); if (isFunction(update)) { updateCallback = &userControl; userData[1] = (void*)update; R_PreserveObject(update); } else if (update == R_NilValue) updateCallback = 0; else error("callback must be a function"); if (isFunction(end)) { endCallback = &userControlEnd; userData[2] = (void*)end; R_PreserveObject(end); } else if (end == R_NilValue) endCallback = 0; else error("callback must be a function"); rglview->setMouseCallbacks(b, beginCallback, updateCallback, endCallback, &userCleanup, userData); } else error("no rgl device is open"); return R_NilValue; } rgl/src/TextSet.cpp0000644000176000001440000000653212262026246013771 0ustar ripleyusers#include "TextSet.hpp" #include "glgui.hpp" #include "R.h" #ifdef HAVE_FREETYPE #include "Viewpoint.hpp" #include #endif using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // TextSet // // INTERNAL TEXTS STORAGE // texts are copied to a buffer without null byte // a separate length buffer holds string lengths in order // TextSet::TextSet(Material& in_material, int in_ntexts, char** in_texts, double *in_center, double in_adjx, double in_adjy, int in_ignoreExtent, FontArray& in_fonts) : Shape(in_material, in_ignoreExtent), textArray(in_ntexts, in_texts) { int i; material.lit = false; material.colorPerVertex(false); adjx = in_adjx; adjy = in_adjy; // init vertex array vertexArray.alloc(in_ntexts); fonts = in_fonts; #ifdef HAVE_FREETYPE blended = true; #endif for (i=0;ivalid(textArray[i].text)) error("text %d contains unsupported character", i+1); } } TextSet::~TextSet() { } void TextSet::render(RenderContext* renderContext) { draw(renderContext); } void TextSet::drawBegin(RenderContext* renderContext) { Shape::drawBegin(renderContext); material.beginUse(renderContext); } void TextSet::drawElement(RenderContext* renderContext, int index) { GLFont* font; if (!vertexArray[index].missing()) { GLboolean valid; material.useColor(index); glRasterPos3f( vertexArray[index].x, vertexArray[index].y, vertexArray[index].z ); glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if (valid) { font = fonts[index % fonts.size()]; if (font) { String text = textArray[index]; font->draw( text.text, text.length, adjx, adjy, *renderContext ); } } } } void TextSet::drawEnd(RenderContext* renderContext) { material.endUse(renderContext); Shape::drawEnd(renderContext); } int TextSet::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case CEX: return fonts.size(); case TEXTS: case VERTICES: return textArray.size(); case ADJ: return 1; } return Shape::getAttributeCount(bbox, attrib); } void TextSet::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { switch(attrib) { case VERTICES: while (first < n) { *result++ = vertexArray[first].x; *result++ = vertexArray[first].y; *result++ = vertexArray[first].z; first++; } return; case CEX: while (first < n) *result++ = fonts[first++]->cex; return; case ADJ: *result++ = adjx; *result++ = adjy; return; } Shape::getAttribute(bbox, attrib, first, count, result); } } String TextSet::getTextAttribute(AABox& bbox, AttribID attrib, int index) { int n = getAttributeCount(bbox, attrib); if (index < n && attrib == TEXTS) return textArray[index]; else return Shape::getTextAttribute(bbox, attrib, index); } rgl/src/ABCLineSet.cpp0000644000176000001440000000633512262026246014243 0ustar ripleyusers#include #include "ABCLineSet.hpp" #include "Viewpoint.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // PlaneSet // ABCLineSet::ABCLineSet(Material& in_material, int in_nbase, double* in_base, int in_ndir, double* in_dir) : LineSet(in_material,true, false/* true */), nLines(max(in_nbase, in_ndir)), base(in_nbase, in_base), direction(in_ndir, in_dir) { /* We'll set up 1 segment per line. Each segment has 2 vertices, and each vertex gets 3 color components and 1 alpha component. */ ARRAY colors(3*nLines); ARRAY alphas(nLines); if (material.colors.getLength() > 1) { material.colors.recycle(nLines); for (int i=0; i vertices(6*nLines); for (int i=0; igetBoundingBox()); return LineSet::getBoundingBox(scene); } void ABCLineSet::renderBegin(RenderContext* renderContext) { updateSegments(renderContext->scene->getBoundingBox()); invalidateDisplaylist(); LineSet::renderBegin(renderContext); } void ABCLineSet::updateSegments(const AABox& sceneBBox) { double bbox[2][3] = { {sceneBBox.vmin.x, sceneBBox.vmin.y, sceneBBox.vmin.z}, {sceneBBox.vmax.x, sceneBBox.vmax.y, sceneBBox.vmax.z} }; double x[2][3]; for (int elem = 0; elem < nLines; elem++) { Vertex bv = base.getRecycled(elem); double b[3] = { bv.x, bv.y, bv.z }; Vertex dv = direction.getRecycled(elem); double d[3] = { dv.x, dv.y, dv.z }; // Rprintf("bbox min=%f %f %f max=%f %f %f\n", bbox[0][0], bbox[0][1], bbox[0][2], // bbox[1][0], bbox[1][1], bbox[1][2]); int nhits = 0; for (int i=0; i<3; i++) // which coordinate for (int j=0; j<2; j++) // which limit if (d[i] != 0) { double s = (bbox[j][i] - b[i])/d[i]; bool keep = true; for (int k=0; k<3; k++) { double intersect = b[k] + s*d[k]; if (k != i && (intersect <= bbox[0][k] || bbox[1][k] <= intersect)) { keep = false; break; } x[nhits][k] = intersect; } if (keep) nhits++; } if (nhits == 2) { setVertex(2*elem + 0, x[0]); setVertex(2*elem + 1, x[1]); } else { double missing[3] = {NA_REAL, NA_REAL, NA_REAL}; setVertex(2*elem + 0, missing); setVertex(2*elem + 1, missing); } } } void ABCLineSet::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { updateSegments(bbox); LineSet::getAttribute(bbox, attrib, first, count, result); } rgl/src/config.hpp0000644000176000001440000000111211673454432013637 0ustar ripleyusers#ifndef RGL_CONFIG_HPP #define RGL_CONFIG_HPP // --------------------------------------------------------------------------- // Platform detection // --------------------------------------------------------------------------- #if defined(__APPLE__) # define RGL_OSX 1 # if defined(RGL_USE_COCOA) # define RGL_COCOA 1 # else # define RGL_X11 1 # endif #else # if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) # define RGL_W32 1 # else # define RGL_X11 1 # endif #endif // --------------------------------------------------------------------------- #endif //RGL_CONFIG_HPP rgl/src/glgui.hpp0000644000176000001440000001116212262005772013501 0ustar ripleyusers#ifndef GL_GUI_H #define GL_GUI_H // C++ header // This file is part of rgl // // $Id: glgui.hpp 991 2013-11-20 20:26:13Z murdoch $ #include "opengl.hpp" #include #ifdef HAVE_FREETYPE #include "FTGL/ftgl.h" #endif #include "RenderContext.hpp" namespace rgl { // CLASS // GLFont // class GLFont { public: GLFont(const char* in_family, int in_style, double in_cex, const char* in_fontname, bool in_useFreeType): style(in_style), cex(in_cex), useFreeType(in_useFreeType) { family = new char[strlen(in_family) + 1]; memcpy(family, in_family, strlen(in_family) + 1); fontname = new char[strlen(in_fontname) + 1]; memcpy(fontname, in_fontname, strlen(in_fontname) + 1); }; virtual ~GLFont() { delete [] family; delete [] fontname; } virtual void draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc) = 0; virtual void draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc) = 0; virtual double width(const char* text) = 0; virtual double width(const wchar_t* text) = 0; virtual double height() = 0; virtual bool valid(const char* text) { return true; }; // justify returns false if justification puts the text outside the viewport GLboolean justify(double width, double height, double adjx, double adjy, const RenderContext& rc); char* family; int style; double cex; char* fontname; bool useFreeType; int gl2ps_centering; private: GLFont(const GLFont &); GLFont &operator=(const GLFont &); }; #define GL_BITMAP_FONT_FIRST_GLYPH 32 #define GL_BITMAP_FONT_LAST_GLYPH 127 #define GL_BITMAP_FONT_COUNT (GL_BITMAP_FONT_LAST_GLYPH-GL_BITMAP_FONT_FIRST_GLYPH+1) #define GL2PS_FONT "Helvetica" #define GL2PS_FONTSIZE 12 #define GL2PS_SCALING 0.8 #define GL2PS_NONE 0 #define GL2PS_LEFT_ONLY 1 #define GL2PS_POSITIONAL 2 // // CLASS // GLBitmapFont // class GLBitmapFont : public GLFont { public: // Most initialization of this object is done by the system-specific driver GLBitmapFont(const char* in_family, int in_style, double in_cex, const char* in_fontname): GLFont(in_family, in_style, in_cex, in_fontname, false) {}; ~GLBitmapFont(); void draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc); void draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc); double width(const char* text); double width(const wchar_t* text); double height(); bool valid(const char* text); GLuint listBase; GLuint firstGlyph; GLuint nglyph; unsigned int* widths; unsigned int ascent; }; // // CLASS // GLFTFont // class GLFTFont : public GLFont { public: GLFTFont(const char* in_family, int in_style, double in_cex, const char* in_fontname); ~GLFTFont(); #ifdef HAVE_FREETYPE void draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc); void draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc); double width(const char* text); double width(const wchar_t* text); double height(); FTFont *font; const char *errmsg; #endif }; // // CLASS // NULLFont // class NULLFont : public GLFont { public: NULLFont(const char* in_family, int in_style, double in_cex): GLFont(in_family, in_style, in_cex, "NULL", false) {}; void draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc) {}; void draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc) {}; double width(const char* text) {return 0.0;}; double width(const wchar_t* text) {return 0.0;}; double height() {return 0.0;}; }; /** * FontArray **/ typedef std::vector FontArray; /* The macros below are taken from the R internationalization code, which is marked Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc. */ /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. */ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ /* Win32, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) #endif } // namespace rgl #endif /* GL_GUI_H */ rgl/src/lib.hpp0000644000176000001440000000116012262005307013127 0ustar ripleyusers#ifndef RGL_LIB_HPP #define RGL_LIB_HPP // --------------------------------------------------------------------------- // $Id: lib.hpp 976 2013-10-04 15:06:19Z murdoch $ // --------------------------------------------------------------------------- namespace rgl { // --------------------------------------------------------------------------- bool init(bool onlyNULLDevice); const char * GUIFactoryName(bool useNULLDevice); void quit(); void printMessage(const char* string); double getTime(); // --------------------------------------------------------------------------- } // namespace rgl #endif // RGL_LIB_HPP rgl/src/init.hpp0000644000176000001440000000055512262005307013333 0ustar ripleyusers#ifndef RGL_INIT_H #define RGL_INIT_H #include "R.h" #include #include namespace rgl { #ifdef __cplusplus extern "C" { #endif /* // RGL initialization // */ /* library service */ SEXP rgl_init (SEXP initValue, SEXP onlyNULL, SEXP in_namespace); #ifdef __cplusplus } #endif } // namespace rgl #endif /* RGL_INIT_H */ rgl/src/glgui.cpp0000644000176000001440000001111212262026246013466 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: glgui.cpp 976 2013-10-04 15:06:19Z murdoch $ #include #ifdef HAVE_FREETYPE #include "FTGL/ftgl.h" #include "R.h" #endif #include "types.h" #include "glgui.hpp" #include "gl2ps.h" #include "opengl.hpp" #include "RenderContext.hpp" using namespace rgl; // // CLASS // GLFont // GLboolean GLFont::justify(double width, double height, double adjx, double adjy, const RenderContext& rc) { GLdouble pos[4], pos2[4]; double basex = 0.0, basey = 0.0, scaling = 1.0; GLboolean valid; gl2ps_centering = GL2PS_TEXT_BL; if (adjx > 0) { if (rc.gl2psActive > GL2PS_NONE) scaling = GL2PS_SCALING; if ( adjx > 0.25 && rc.gl2psActive == GL2PS_POSITIONAL) { if (adjx < 0.75) { basex = 0.5; gl2ps_centering = GL2PS_TEXT_B; } else { basex = 1.0; gl2ps_centering = GL2PS_TEXT_BR; } } } if ((adjx != basex) || (adjy != basey)) { glGetDoublev(GL_CURRENT_RASTER_POSITION, pos); pos[0] = pos[0] - scaling*width*(adjx-basex); pos[1] = pos[1] - scaling*height*(adjy-basey); gluUnProject( pos[0], pos[1], pos[2], rc.modelview, rc.projection, rc.viewport, pos2, pos2 + 1, pos2 + 2); glRasterPos3dv(pos2); } glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); return valid; } // // CLASS // GLBitmapFont // GLBitmapFont::~GLBitmapFont() { delete [] widths; if (nglyph) glDeleteLists(listBase+GL_BITMAP_FONT_FIRST_GLYPH, nglyph); }; double GLBitmapFont::width(const char* text) { double result = 0.0; for(int i=0; text[i]; i++) { char c; if ((int)(text[i]) >= (int)firstGlyph && (c = text[i] - firstGlyph) < (int)nglyph) result += widths[(int)c]; } return result; } double GLBitmapFont::width(const wchar_t* text) { double result = 0.0; for(int i=0; text[i]; i++) { wchar_t c; if (text[i] >= firstGlyph && (c = text[i] - firstGlyph) < nglyph) result += widths[c]; } return result; } double GLBitmapFont::height() { return ascent; } bool GLBitmapFont::valid(const char* text) { for (int i=0; text[i]; i++) if ((int)text[i] < (int)firstGlyph || text[i] - firstGlyph >= (int)nglyph) return false; return true; } void GLBitmapFont::draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc) { if (justify(width(text), height(), adjx, adjy, rc)) { if (rc.gl2psActive == GL2PS_NONE) { glListBase(listBase); glCallLists(length, GL_UNSIGNED_BYTE, text); } else gl2psTextOpt(text, GL2PS_FONT, GL2PS_FONTSIZE*cex, gl2ps_centering, 0.0); } } void GLBitmapFont::draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc) { if (justify(width(text), height(), adjx, adjy, rc)) { GLenum type = sizeof(wchar_t) == 4 ? GL_UNSIGNED_INT : sizeof(wchar_t) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE ; if (rc.gl2psActive == GL2PS_NONE) { glListBase(listBase); glCallLists(length, type, text); } // gl2ps doesn't support wchar_t? Should convert? } } #ifdef HAVE_FREETYPE GLFTFont::GLFTFont(const char* in_family, int in_style, double in_cex, const char* in_fontname) : GLFont(in_family, in_style, in_cex, in_fontname, true) { font=new FTGLPixmapFont(fontname); if (font->Error()) { errmsg = "Cannot create Freetype font"; delete font; font = NULL; } else { unsigned int size = 16*cex + 0.5; if (size<1) { size=1; } if (!font->FaceSize(size)) { errmsg = "Cannot create Freetype font of requested size"; delete font; font = NULL; } } /* font->CharMap(ft_encoding_unicode); if (font->Error()) { error("Cannot set unicode encoding."); }*/ } GLFTFont::~GLFTFont() { if (font) delete font; } double GLFTFont::width(const char* text) { return font->Advance(text); } double GLFTFont::width(const wchar_t* text) { return font->Advance(text); } double GLFTFont::height() { return font->Ascender(); } void GLFTFont::draw(const char* text, int length, double adjx, double adjy, const RenderContext& rc) { if ( justify( width(text), height(), adjx, adjy, rc ) ) { if (rc.gl2psActive == GL2PS_NONE) font->Render(text); else gl2psTextOpt(text, GL2PS_FONT, GL2PS_FONTSIZE*cex, gl2ps_centering, 0.0); } } void GLFTFont::draw(const wchar_t* text, int length, double adjx, double adjy, const RenderContext& rc) { if ( justify( width(text), height(), adjx, adjy, rc ) ) { if (rc.gl2psActive == GL2PS_NONE) font->Render(text); } } #endif rgl/src/render.h0000644000176000001440000000202512262026246013306 0ustar ripleyusers#ifndef RENDER_H #define RENDER_H #include "RenderContext.hpp" #include "types.h" namespace rgl { // // CLASS // VertexArray // /** * VertexArray **/ class VertexArray { public: VertexArray(); ~VertexArray(); void alloc(int nvertex); void copy(int nvertex, double* vertices); void beginUse(); void endUse(); Vertex& operator[](int index); void setVertex(int index, double* v); Vertex getNormal(int v1, int v2, int v3); protected: float* arrayptr; }; inline Vertex& VertexArray::operator[](int index) { return (Vertex&) arrayptr[index*3]; } /** * NormalArray **/ class NormalArray : public VertexArray { public: void beginUse(); void endUse(); }; struct TexCoord { float s,t; }; /** * TexCoordArray **/ class TexCoordArray { public: TexCoordArray(); ~TexCoordArray(); void alloc(int in_nvertex); void beginUse(); void endUse(); TexCoord& operator[](int index); int size() { return nvertex; }; private: int nvertex; float* arrayptr; }; } // namespace rgl #endif // RENDER_H rgl/src/Surface.cpp0000644000176000001440000001754712262026246013771 0ustar ripleyusers#include "Surface.hpp" #include "Material.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Surface // // in_coords permutes the coordinates to allow surfaces over arbitrary planes // orientation is 1 to swap front and back Surface::Surface(Material& in_material, int in_nx, int in_nz, double* in_x, double* in_z, double* in_y, double* in_normal_x, double* in_normal_z, double* in_normal_y, double* in_texture_s, double* in_texture_t, int* in_coords, int in_orientation, int* in_flags, int in_ignoreExtent) : Shape(in_material, in_ignoreExtent) { nx = in_nx; nz = in_nz; coords[0] = *(in_coords++); coords[1] = *(in_coords++); coords[2] = *(in_coords++); orientation = in_orientation; int nvertex = nx*nz; material.colorPerVertex(true, nvertex); vertexArray.alloc(nvertex); if (material.texture) texCoordArray.alloc(nvertex); Vertex v; float *x,*y,*z, *va[3]; va[0] = &(v.x); va[1] = &(v.y); va[2] = &(v.z); x = va[coords[0]-1]; y = va[coords[1]-1]; z = va[coords[2]-1]; int xmat = in_flags[0]; int zmat = in_flags[1]; user_normals = in_flags[2]; user_textures = in_flags[3]; if (user_normals) normalArray.alloc(nvertex); int iy = 0; for(int iz=0;izis_envmap() ) ) { if (!user_textures) { texCoordArray[iy].s = ((float)ix)/((float)(nx-1)); texCoordArray[iy].t = 1.0f - ((float)iz)/((float)(nz-1)); } else { texCoordArray[iy].s = in_texture_s[iy]; texCoordArray[iy].t = in_texture_t[iy]; } } } } use_normal = user_normals || material.lit || ( material.texture && material.texture->is_envmap() ); if ( use_normal && !user_normals ) { normalArray.alloc(nvertex); iy = 0; for(int iz=0;izis_envmap() ) ); if ((material.point_antialias && ( material.front == material.POINT_FACE || material.back == material.POINT_FACE)) || (material.line_antialias && ( material.front == material.LINE_FACE || material.back == material.LINE_FACE))) blended = true; } Vertex Surface::getNormal(int ix, int iz) { int i = iz*nx + ix; Vertex total(0.0f,0.0f,0.0f); if (!vertexArray[i].missing()) { // List the 8 surrounding vertices. Repat the 1st one to make looping simpler. int ind[9]; int xv[9] = { 1, 1, 0, -1, -1, -1, 0, 1, 1 }; int zv[9] = { 0, -1, -1, -1, 0, 1, 1, 1, 0 }; int okay[9]; /* checks of surrounding vertices from right counterclockwise */ for (int j=0; j<8; j++) { int xval = ix + xv[j], zval = iz + zv[j]; if (0 <= xval && xval < nx && 0 <= zval && zval < nz) { ind[j] = i + xv[j] + zv[j]*nx; okay[j] = !vertexArray[ind[j]].missing(); } else { okay[j] = 0; ind[j] = 0; } } okay[8] = okay[0]; ind[8] = ind[0]; /* Estimate normal by averaging cross-product in successive triangular sectors */ for (int j=0; j<8; j++) { if (okay[j] && okay[j+1] ) total += vertexArray.getNormal(i, ind[j], ind[j+1] ); } total.normalize(); } if (orientation) { total.x = -total.x; total.y = -total.y; total.z = -total.z; } return total; } void Surface::draw(RenderContext* renderContext) { bool missing; drawBegin(renderContext); for(int iz=0;iz #include #include "assert.hpp" using namespace rgl; void Disposable::addDisposeListener(IDisposeListener* l) { Container::iterator pos = std::find( disposeListeners.begin(), disposeListeners.end(), l ); assert( pos == disposeListeners.end() ); disposeListeners.push_back(l); } void Disposable::removeDisposeListener(IDisposeListener* l) { Container::iterator pos = std::find( disposeListeners.begin(), disposeListeners.end(), l ); assert( pos != disposeListeners.end() ); disposeListeners.erase(pos); } void Disposable::fireNotifyDisposed() { // copy the listeners to a queue, // so add/remove are stable during 'notifyDispose'. std::vector queue( disposeListeners.begin(), disposeListeners.end() ); for ( std::vector::iterator i = queue.begin() ; i != queue.end() ; ++ i ) (*i)->notifyDisposed(this); } void Disposable::dispose() { fireNotifyDisposed(); } rgl/src/PrimitiveSet.cpp0000644000176000001440000002170012262026246015007 0ustar ripleyusers#include "PrimitiveSet.hpp" #include "R.h" using namespace rgl; // ===[ PRIMITIVE SET ]======================================================= PrimitiveSet::PrimitiveSet ( Material& in_material, int in_type, int in_nverticesperelement, bool in_ignoreExtent, bool in_bboxChange ) : Shape(in_material, in_ignoreExtent, SHAPE, in_bboxChange) { type = in_type; nverticesperelement = in_nverticesperelement; } void PrimitiveSet::initPrimitiveSet( int in_nvertices, double* in_vertices ) { nvertices = in_nvertices; nprimitives = in_nvertices / nverticesperelement; vertexArray.alloc(nvertices); hasmissing = false; for(int i=0;iunbind(); windowImpl->destroy(); windowImpl = 0; } } // --------------------------------------------------------------------------- void View::setSize(int inWidth, int inHeight) { if ((windowImpl) && (flags & WINDOW_IMPL_OWNER)) { int left, top, right, bottom; windowImpl->getWindowRect(&left, &top, &right, &bottom); windowImpl->setWindowRect(left, top, left+inWidth, top+inHeight); } else resize(inWidth, inHeight); } // --------------------------------------------------------------------------- void View::setLocation(int inBaseX, int inBaseY) { if ((windowImpl) && (flags & WINDOW_IMPL_OWNER)) { int left, top, right, bottom; windowImpl->getWindowRect(&left, &top, &right, &bottom); windowImpl->setWindowRect(inBaseX, inBaseY, inBaseX + left-right, inBaseY + bottom-top); } else relocate(inBaseX, inBaseY); } // --------------------------------------------------------------------------- void View::update(void) { if (windowImpl) windowImpl->update(); } // --------------------------------------------------------------------------- void View::setWindowImpl(WindowImpl* inWindowImpl) { windowImpl = inWindowImpl; } // --------------------------------------------------------------------------- void View::show(void) { } // --------------------------------------------------------------------------- void View::hide(void) { } // --------------------------------------------------------------------------- void View::paint(void) { } // --------------------------------------------------------------------------- void View::resize(int inWidth, int inHeight) { width = inWidth; height = inHeight; } // --------------------------------------------------------------------------- void View::relocate(int inBaseX, int inBaseY) { baseX = inBaseX; baseY = inBaseY; } // --------------------------------------------------------------------------- void View::keyPress(int code) { } // --------------------------------------------------------------------------- void View::keyRelease(int code) { } // --------------------------------------------------------------------------- void View::buttonPress(int button, int mouseX, int mouseY) { } // --------------------------------------------------------------------------- void View::buttonRelease(int button, int mouseX, int mouseY) { } // --------------------------------------------------------------------------- void View::mouseMove(int mouseX, int mouseY) { } // --------------------------------------------------------------------------- void View::wheelRotate(int direction) { } // --------------------------------------------------------------------------- void View::captureLost() { } // --------------------------------------------------------------------------- // Window Implementation // --------------------------------------------------------------------------- Window::Window(View* in_child, GUIFactory* factory) : View(0,0,in_child->width, in_child->height,WINDOW_IMPL_OWNER) , child(in_child) , title("untitled") { skipRedraw = false; windowImpl = factory->createWindowImpl(this); if (child) child->setWindowImpl(windowImpl); } // --------------------------------------------------------------------------- Window::~Window() { if (child) { delete child; } fireNotifyDisposed(); } // --------------------------------------------------------------------------- void Window::setWindowImpl(WindowImpl* impl) { View::setWindowImpl(impl); if (child) child->setWindowImpl(impl); } // --------------------------------------------------------------------------- void Window::setTitle(const char* in_title) { if (windowImpl) windowImpl->setTitle(in_title); } // --------------------------------------------------------------------------- void Window::update(void) { windowImpl->update(); } // --------------------------------------------------------------------------- void Window::setVisibility(bool state) { if (state) windowImpl->show(); else windowImpl->hide(); } // --------------------------------------------------------------------------- void Window::bringToTop(int stay) { windowImpl->bringToTop(stay); } // --------------------------------------------------------------------------- void Window::getWindowRect(int *left, int *top, int *width, int *height) { windowImpl->getWindowRect(left, top, width, height); } // --------------------------------------------------------------------------- void Window::setWindowRect(int left, int top, int width, int height) { windowImpl->setWindowRect(left, top, width, height); } // --------------------------------------------------------------------------- int Window::getSkipRedraw(void) { return (int)skipRedraw; } // --------------------------------------------------------------------------- void Window::setSkipRedraw(int in_skipRedraw) { skipRedraw = (bool)in_skipRedraw; if (!skipRedraw) update(); } // --------------------------------------------------------------------------- void Window::show(void) { if (child) child->show(); } // --------------------------------------------------------------------------- void Window::hide(void) { if (child) child->hide(); } // --------------------------------------------------------------------------- void Window::resize(int in_width, int in_height) { if (child) child->resize(in_width,in_height); } // --------------------------------------------------------------------------- void Window::paint(void) { if (child) child->paint(); } // --------------------------------------------------------------------------- void Window::notifyDestroy(void) { if (child) { delete child; child = NULL; } fireNotifyDisposed(); } // --------------------------------------------------------------------------- void Window::buttonPress(int button, int mouseX, int mouseY) { if (child) child->buttonPress(button, mouseX, mouseY); } // --------------------------------------------------------------------------- void Window::buttonRelease(int button, int mouseX, int mouseY) { if (child) child->buttonRelease(button, mouseX, mouseY); } // --------------------------------------------------------------------------- void Window::mouseMove(int mouseX, int mouseY) { if (child) child->mouseMove(mouseX, mouseY); } // --------------------------------------------------------------------------- void Window::keyPress(int code) { if (child) child->keyPress(code); } // --------------------------------------------------------------------------- void Window::wheelRotate(int dir) { if (child) child->wheelRotate(dir); } // --------------------------------------------------------------------------- void Window::on_close() { windowImpl->destroy(); } // --------------------------------------------------------------------------- void Window::getFonts(FontArray& outfonts, int nfonts, char** family, int* style, double* cex, bool useFreeType) { windowImpl->getFonts(outfonts, nfonts, family, style, cex, useFreeType); } // --------------------------------------------------------------------------- rgl/src/Material.hpp0000644000176000001440000000236012262005307014122 0ustar ripleyusers#ifndef MATERIAL_HPP #define MATERIAL_HPP #include "Color.hpp" #include "Texture.hpp" #include "RenderContext.hpp" namespace rgl { // // STRUCT // Material // class Material { public: enum PolygonMode { FILL_FACE=1, LINE_FACE, POINT_FACE, CULL_FACE }; Material( Color bg, Color fg ); void setup(); // called when complete void beginUse(RenderContext* renderContext); void endUse(RenderContext* renderContext); void useColor(int index); void colorPerVertex(bool enable, int numVertices=0); bool isTransparent() const { return alphablend; } Color ambient; Color specular; Color emission; float shininess; float size; // point size float lwd; // line width ColorArray colors; // color or if lit, represents diffuse color Ref texture; PolygonMode front; PolygonMode back; bool alphablend; bool smooth; bool lit; bool fog; bool useColorArray; bool point_antialias; bool line_antialias; bool depth_mask; int depth_test; // 0=GL_NEVER, 1=GL_LESS, etc. float glVersion; }; } // namespace rgl #endif // MATERIAL_HPP rgl/src/SpriteSet.cpp0000644000176000001440000001106512262026246014310 0ustar ripleyusers #include "SpriteSet.hpp" #include "Shape.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // SpriteSet // SpriteSet::SpriteSet(Material& in_material, int in_nvertex, double* in_vertex, int in_nsize, double* in_size, int in_ignoreExtent, int count, Shape** in_shapelist, double* in_userMatrix) : Shape(in_material, in_ignoreExtent), vertex(in_nvertex, in_vertex), size(in_nsize, in_size) { if (!count) material.colorPerVertex(false); else { blended = false; for (int i=0;iisBlended(); } for (int i=0;i<16;i++) userMatrix[i] = *(in_userMatrix++); } for(int i=0;i::iterator i = shapes.begin(); i != shapes.end() ; ++ i ) (*i)->draw(renderContext); Shape::drawBegin(renderContext); } else { material.useColor(index); glBegin(GL_QUADS); if (doTex) glTexCoord2f(0.0f,0.0f); glVertex3f(-s, -s, 0.0f); if (doTex) glTexCoord2f(1.0f,0.0f); glVertex3f(s, -s, 0.0f); if (doTex) glTexCoord2f(1.0f,1.0f); glVertex3f(s, s, 0.0); if (doTex) glTexCoord2f(0.0f,1.0f); glVertex3f(-s, s, 0.0f); glEnd(); } } void SpriteSet::drawEnd(RenderContext* renderContext) { glPopMatrix(); if (!shapes.size()) material.endUse(renderContext); Shape::drawEnd(renderContext); } void SpriteSet::render(RenderContext* renderContext) { draw(renderContext); } int SpriteSet::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case VERTICES: return vertex.size(); case RADII: return size.size(); case IDS: case TYPES: return shapes.size(); case USERMATRIX: { if (!shapes.size()) return 0; else return 4; } } return Shape::getAttributeCount(bbox, attrib); } void SpriteSet::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); int ind = 0; if (first + count < n) n = first + count; if (first < n) { switch(attrib) { case VERTICES: while (first < n) { Vertex v = vertex.get(first); *result++ = v.x; *result++ = v.y; *result++ = v.z; first++; } return; case RADII: while (first < n) *result++ = size.get(first++); return; case IDS: for (std::vector::iterator i = shapes.begin(); i != shapes.end() ; ++ i ) { if ( first <= ind && ind < n ) *result++ = (*i)->getObjID(); ind++; } return; case USERMATRIX: while (first < n) { *result++ = userMatrix[first]; *result++ = userMatrix[4 + first]; *result++ = userMatrix[8 + first]; *result++ = userMatrix[12 + first]; first++; } return; } Shape::getAttribute(bbox, attrib, first, count, result); } } String SpriteSet::getTextAttribute(AABox& bbox, AttribID attrib, int index) { int n = getAttributeCount(bbox, attrib); if (index < n && attrib == TYPES) { char* buffer = R_alloc(20, 1); shapes[index]->getShapeName(buffer, 20); return String(strlen(buffer), buffer); } else return Shape::getTextAttribute(bbox, attrib, index); } Shape* SpriteSet::get_shape(int id) { return get_shape_from_list(shapes, id, true); } rgl/src/select.cpp0000644000176000001440000000121512262026246013641 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: select.cpp 976 2013-10-04 15:06:19Z murdoch $ #include "select.h" #include using namespace rgl; void SELECT::render(double* position) { double llx, lly, urx, ury; llx = *position; lly = *(position+1); urx = *(position+2); ury = *(position+3); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f,1.0f,0.0f,1.0f,0.0f,1.0f); glColor3f(0.5f,0.5f,0.5f); glLineWidth(2.0); glBegin(GL_LINE_LOOP); glVertex2f(llx, lly); glVertex2f(llx, ury); glVertex2f(urx, ury); glVertex2f(urx, lly); glEnd(); } rgl/src/pragma.h0000644000176000001440000000150712262026246013302 0ustar ripleyusers#ifndef RGL_PRAGMA_HPP #define RGL_PRAGMA_HPP /** * compiler- and platform-specific pragma's **/ // // ---[ Borland C++ ]--------------------------------------------------------- // #ifdef __BCPLUSPLUS__ #define _RWSTD_NO_EXCEPTIONS #define ARCH_X86 #endif // // ---[ Microsoft Visual C++ ]------------------------------------------------ // #ifdef _MSC_VER #pragma warning(disable:4530) /** * remove warnings on truncated 'debug information' to 255 characters **/ #pragma warning(disable:4786) /** * remove warnings " 'this' : used in base member initializer list " **/ #pragma warning(disable:4355) #ifdef _M_IX86 #define ARCH_X86 #endif #endif // // ---[ GCC ]----------------------------------------------------------------- // #ifdef __GNUC__ #ifdef _X86_ #define ARCH_X86 #endif #endif #endif // RGL_PRAGMA_HPP rgl/src/SphereMesh.hpp0000644000176000001440000000223212262005306014424 0ustar ripleyusers#ifndef SPHERE_MESH_HPP #define SPHERE_MESH_HPP #include "render.h" namespace rgl { // // CLASS // SphereMesh // class SphereMesh { public: enum Type { GLOBE, TESSELATION }; SphereMesh(); inline void setGenNormal (bool in_genNormal) { genNormal = in_genNormal; } inline void setGenTexCoord (bool in_genTexCoord) { genTexCoord = in_genTexCoord; } void setGlobe (int segments, int sections); void setTesselation (int level); void setCenter (const Vertex& center); void setRadius (float radius); void update(); void update (const Vertex& scale); /* void beginDraw(RenderContext* renderContext); void drawSection(int section); void endDraw(RenderContext* renderContext); */ void draw(RenderContext* renderContext); private: Vertex center; float radius; float philow; float phihigh; float thetalow; float thetahigh; VertexArray vertexArray; NormalArray normalArray; TexCoordArray texCoordArray; int segments; int sections; int flags; Type type; bool genNormal; bool genTexCoord; void setupMesh(); }; } // namespace rgl #endif // SPHERE_MESH_HPP rgl/src/device.cpp0000644000176000001440000001075712262026246013634 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: device.cpp 976 2013-10-04 15:06:19Z murdoch $ // --------------------------------------------------------------------------- #include #include "Device.hpp" #include "lib.hpp" using namespace rgl; // --------------------------------------------------------------------------- Device::Device(int id, bool useNULL) : id_(id) { scene = new Scene(); rglview = new RGLView(scene); window = new Window( rglview, getGUIFactory(useNULL) ); devtype = GUIFactoryName(useNULL); window->addDisposeListener(this); } // --------------------------------------------------------------------------- Device::~Device() { delete scene; } // --------------------------------------------------------------------------- int Device::getID() { return id_; } // --------------------------------------------------------------------------- void Device::notifyDisposed(Disposable* disposable) { dispose(); } // --------------------------------------------------------------------------- void Device::setName(const char* string) { window->setTitle(string); } // --------------------------------------------------------------------------- void Device::update() { // window->update(); } // --------------------------------------------------------------------------- bool Device::open(void) { window->setVisibility(true); return true; } // --------------------------------------------------------------------------- void Device::close(void) { window->on_close(); } // --------------------------------------------------------------------------- void Device::bringToTop(int stay) { window->bringToTop(stay); } void Device::setWindowRect(int left, int top, int right, int bottom) { window->setWindowRect(left, top, right, bottom); } void Device::getWindowRect(int *left, int *top, int *right, int *bottom) { window->getWindowRect(left, top, right, bottom); } // --------------------------------------------------------------------------- int Device::getIgnoreExtent(void) { return scene->getIgnoreExtent(); } // --------------------------------------------------------------------------- void Device::setIgnoreExtent(int in_ignoreExtent) { scene->setIgnoreExtent(in_ignoreExtent); } // --------------------------------------------------------------------------- int Device::getSkipRedraw(void) { return window->getSkipRedraw(); } // --------------------------------------------------------------------------- void Device::setSkipRedraw(int in_skipRedraw) { window->setSkipRedraw(in_skipRedraw); } // --------------------------------------------------------------------------- bool Device::clear(TypeID stackTypeID) { bool success; success = scene->clear(stackTypeID); rglview->update(); return success; } // --------------------------------------------------------------------------- int Device::add(SceneNode* node) { bool success; success = scene->add(node); rglview->update(); if (success) return node->getObjID(); else return 0; } // --------------------------------------------------------------------------- bool Device::pop(TypeID stackTypeID, int id) { bool success; bool inGL = rglview->windowImpl->beginGL(); // May need to set context for display lists. success = scene->pop(stackTypeID, id); if (inGL) { rglview->windowImpl->endGL(); } rglview->update(); return success; } // --------------------------------------------------------------------------- bool Device::snapshot(int format, const char* filename) { return rglview->snapshot( (PixmapFileFormatID) format, filename); } // --------------------------------------------------------------------------- bool Device::pixels(int* ll, int* size, int component, float* result) { return rglview->pixels( ll, size, component, result); } // --------------------------------------------------------------------------- RGLView* Device::getRGLView(void) { return rglview; } // --------------------------------------------------------------------------- bool Device::postscript(int format, const char* filename, bool drawText) { return rglview->postscript( format, filename, drawText); } // --------------------------------------------------------------------------- void Device::getFonts(FontArray& outfonts, int nfonts, char** family, int* style, double* cex, bool useFreeType) { window->getFonts(outfonts, nfonts, family, style, cex, useFreeType); } // --------------------------------------------------------------------------- const char * Device::getDevtype() { return devtype; } rgl/src/Shape.hpp0000644000176000001440000000765412262005640013437 0ustar ripleyusers#ifndef SHAPE_HPP #define SHAPE_HPP #include #include "SceneNode.hpp" #include "Material.hpp" #include "RenderContext.hpp" #include "opengl.hpp" #include "geom.hpp" namespace rgl { // // CLASS // Shape // class Shape : public SceneNode { public: Shape(Material& in_material,bool in_ignoreExtent, TypeID in_typeID=SHAPE, bool in_bboxChanges=false); ~Shape(); /** * render shape. * Default Implementation: uses z-buffer and a display list * that stores everything from a call to draw(). **/ virtual void render(RenderContext* renderContext); /** * request update of node due to content change. * This will result in a new 'recording' of the display list. **/ virtual void update(RenderContext* renderContext); /** * draw. **/ virtual void draw(RenderContext* renderContext); /** * obtain bounding box **/ const AABox& getBoundingBox() const { return boundingBox; } /** * does this shape change dimensions according to the way it is rendered? * if so, the above is just a guess... **/ const bool getBBoxChanges() const { return bboxChanges; } /** * this shows how the shape would be sized in the given context **/ virtual AABox& getBoundingBox(Scene* scene) { return boundingBox; } /** * obtain material **/ Material* getMaterial() { return &material; } const bool getIgnoreExtent() const { return ignoreExtent; } virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "shape", buflen); }; /** * invalidate display list **/ void invalidateDisplaylist(); /** * access to individual items **/ virtual int getElementCount(void) = 0; /* overrides */ int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); /** * location of individual items **/ virtual Vertex getElementCenter(int index) { return boundingBox.getCenter(); } /** * Starting to render the shape. After this, the renderContext won't change until * the next call. This will only be called once per rendering. **/ virtual void renderBegin(RenderContext* renderContext) { }; /** * begin sending items. This may be called multiple times, e.g. if the * items are being intermixed with items from other shapes **/ virtual void drawBegin(RenderContext* renderContext); /** * send one item **/ virtual void drawElement(RenderContext* renderContext, int index) = 0; /** * end sending items **/ virtual void drawEnd(RenderContext* renderContext); /** * Some shapes (currently just sprites) contain others. Do a recursive search */ virtual Shape* get_shape(int id) { return NULL; } const bool isTransparent() const { return transparent; } const bool isBlended() const { return blended; } /** * Does this shape need to go at the head of the shape list, rather than the tail? * (e.g. clip planes need to come first **/ virtual bool isClipPlane() { return false; } protected: /** * bounding volume of overall geometry **/ AABox boundingBox; /** * bounding volume changes depending on the scene? **/ bool bboxChanges; /* * whether this object should be ignored in scene bounding box calculations */ bool ignoreExtent; /** * material **/ Material material; private: /** * display list **/ GLuint displayList; int drawLevel; /* for debugging */ protected: /** * update indicator **/ bool doUpdate; bool transparent, blended; }; class ShapeItem { public: ShapeItem(Shape* in_shape, int in_itemnum) : shape(in_shape), itemnum(in_itemnum) {}; Shape* shape; int itemnum; }; /** * This function is used both in Scene::get_shape and in SpriteSet::get_shape */ Shape* get_shape_from_list(std::vector shapes, int id, bool recursive); } // namespace rgl #endif // SHAPE_HPP rgl/src/rgl-win.def0000644000176000001440000000004412262005307013707 0ustar ripleyusersLIBRARY rgl.dll EXPORTS R_init_rglrgl/src/SphereSet.cpp0000644000176000001440000000552112262026246014270 0ustar ripleyusers#include "SphereSet.hpp" #include "Viewpoint.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // SphereSet // SphereSet::SphereSet(Material& in_material, int in_ncenter, double* in_center, int in_nradius, double* in_radius, int in_ignoreExtent) : Shape(in_material, in_ignoreExtent, SHAPE, true), center(in_ncenter, in_center), radius(in_nradius, in_radius) { material.colorPerVertex(false); if (material.lit) sphereMesh.setGenNormal(true); if ( (material.texture) && (!material.texture->is_envmap() ) ) sphereMesh.setGenTexCoord(true); sphereMesh.setGlobe(16,16); for (int i=0;igetViewpoint()->scale; scale.x = 1.0/scale.x; scale.y = 1.0/scale.y; scale.z = 1.0/scale.z; boundingBox.invalidate(); for(int i=0;iviewpoint->scale ); sphereMesh.draw(renderContext); } void SphereSet::drawEnd(RenderContext* renderContext) { material.endUse(renderContext); Shape::drawEnd(renderContext); } void SphereSet::render(RenderContext* renderContext) { if (renderContext->viewpoint->scaleChanged) doUpdate = true; Shape::render(renderContext); } int SphereSet::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case RADII: return radius.size(); case VERTICES: return center.size(); } return Shape::getAttributeCount(bbox, attrib); } void SphereSet::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { switch (attrib) { case VERTICES: while (first < n) { *result++ = center.get(first).x; *result++ = center.get(first).y; *result++ = center.get(first).z; first++; } return; case RADII: while (first < n) *result++ = radius.get(first++); return; } Shape::getAttribute(bbox, attrib, first, count, result); } } rgl/src/geom.hpp0000644000176000001440000000211312262005307013307 0ustar ripleyusers#ifndef GEOM_HPP #define GEOM_HPP #include "rglmath.h" namespace rgl { // // CLASS // AABox (axis-aligned box) // class Sphere; class AABox { public: AABox(); AABox(const AABox& that) : vmin(that.vmin), vmax(that.vmax) { } void invalidate(void); bool isValid(void) const; void operator += (const AABox& aabox); void operator += (const Sphere& sphere); void operator += (const Vertex& vertex); bool operator < (const AABox& aabox) const; Vertex getCenter(void) const; Vertex vmin, vmax; }; // // CLASS // Sphere // class Sphere { public: Sphere() : center(0,0,0), radius(1) {}; Sphere(const Vertex& center, const float radius); Sphere(const float radius); Sphere(const AABox& aabox); Sphere(const AABox& aabox, const Vertex& scale); Vertex center; float radius; }; // // CLASS // Frustum // class Frustum { public: Frustum() : ortho(false) {}; void enclose(float sphere_radius, float fovangle, int win_width, int win_height); float left, right, bottom, top, znear, zfar, distance; bool ortho; }; } // namespace rgl #endif // GEOM_HPP rgl/src/String.hpp0000644000176000001440000000141212262005307013627 0ustar ripleyusers#ifndef STRING_HPP #define STRING_HPP namespace rgl { // // CLASS // StringArray // struct String { String(int in_length, char* in_text) { length = in_length; text = in_text; } int length; char* text; }; class StringArrayImpl; class StringArray { public: StringArray(); StringArray(int ntexts, char** in_texts); StringArray(StringArray& from); ~StringArray(); String operator[](int index); int size(); private: StringArrayImpl* impl; friend class StringArrayIterator; }; class StringArrayIterator { public: StringArrayIterator(StringArray* array); void first(); void next(); String getCurrent(); bool isDone() const; private: StringArray* array; int cnt; char* textptr; }; } // namespace rgl #endif // STRING_HPP rgl/src/pixmap.cpp0000644000176000001440000000460612262026246013667 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: pixmap.cpp 986 2013-10-11 11:35:10Z murdoch $ using namespace std; #include "pixmap.h" #include "lib.hpp" // PNG FORMAT IMPLEMENTATION using namespace rgl; #ifdef HAVE_PNG_H #include "pngpixmap.h" namespace rgl { PNGPixmapFormat png; } #endif // PIXMAP FORMAT TABLE PixmapFormat* rgl::pixmapFormat[PIXMAP_FILEFORMAT_LAST] = { // PNG FORMAT #ifdef HAVE_PNG_H &png, #else NULL, #endif }; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Pixmap // Pixmap::Pixmap() { typeID = INVALID; width = 0; height = 0; bits_per_channel = 0; data = NULL; bytesperrow = 0; } Pixmap::~Pixmap() { if (data) delete[] data; } bool Pixmap::init(PixmapTypeID in_typeID, int in_width, int in_height, int in_bits_per_channel) { if (data) delete data; typeID = in_typeID; width = in_width; height = in_height; bits_per_channel = in_bits_per_channel; int channels; if (typeID == RGB24) channels = 3; else if (typeID == RGBA32) channels = 4; else if (typeID == GRAY8) channels = 1; else return false; bytesperrow = ( (channels * bits_per_channel) >> 3 ) * width; data = new unsigned char [ bytesperrow * height ]; return true; } bool Pixmap::load(const char* filename) { bool success = false; std::FILE* file = NULL; file = fopen(filename, "rb"); if (!file) { char buffer[256]; sprintf(buffer, "Pixmap load: unable to open file '%s' for reading", filename); printMessage(buffer); return false; } bool support = false; for(int i=0;icheckSignature(file) ) ) { support = true; success = format->load(file, this); break; } } if (!support) { printMessage("Pixmap load: file format unsupported"); } if (!success) { printMessage("Pixmap load: failed"); } fclose(file); return success; } bool Pixmap::save(PixmapFormat* format, const char* filename) { std::FILE* file = NULL; file = fopen(filename, "wb"); if (!file) { char buffer[256]; sprintf(buffer, "Pixmap save: unable to open file '%s' for writing", filename); printMessage(buffer); return false; } bool success = format->save(file, this); fclose(file); return success; } rgl/src/build/0000755000176000001440000000000012262026246012756 5ustar ripleyusersrgl/src/build/autoconf/0000755000176000001440000000000012262026246014574 5ustar ripleyusersrgl/src/build/autoconf/install-sh0000644000176000001440000003325512136475400016605 0ustar ripleyusers#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: rgl/src/build/autoconf/config.guess0000644000176000001440000012743212136475400017122 0ustar ripleyusers#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: rgl/src/build/autoconf/config.sub0000644000176000001440000010527412136475400016565 0ustar ripleyusers#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: rgl/src/Viewpoint.hpp0000644000176000001440000000343312262005307014352 0ustar ripleyusers#ifndef VIEWPOINT_HPP #define VIEWPOINT_HPP #include "SceneNode.hpp" #include "render.h" #include "geom.hpp" namespace rgl { class Viewpoint : public SceneNode { #define VIEWPOINT_MAX_ZOOM 10 public: Viewpoint(PolarCoord position=PolarCoord(0.0f,15.0f), float fov=90.0f, float zoom=1.0f, Vec3 in_scale=Vec3(1.0f, 1.0f, 1.0f), bool interactive=true); Viewpoint(double* userMatrix, float fov=90.0f, float zoom=1.0f, Vec3 in_scale=Vec3(1.0f, 1.0f, 1.0f), bool interactive=true); PolarCoord& getPosition(); void setPosition(const PolarCoord& position); void clearMouseMatrix(); float getZoom(void) const; void setZoom(const float zoom); float getFOV(void) const; void setFOV(const float in_fov); void setupFrustum(RenderContext* rctx, const Sphere& viewvolumeSphere); void setupTransformation(RenderContext* rctx, const Sphere& viewvolumeSphere); void setupOrientation(RenderContext* rctx) const; bool isInteractive() const; void updateMouseMatrix(Vertex dragStart,Vertex dragCurrent); void updateMouseMatrix(PolarCoord newpos); void mouseOneAxis(Vertex dragStart,Vertex dragCurrent,Vertex axis); void mergeMouseMatrix(); void getUserMatrix(double* dest); void setUserMatrix(double* src); void getScale(double* dest); void setScale(double* src); void getPosition(double* dest); void setPosition(double* src); Frustum frustum; Vertex getCOP(const Sphere& viewvolumeSphere) const; Vertex scale; bool scaleChanged; private: PolarCoord position; float fov; float zoom; bool interactive; GLdouble userMatrix[16], mouseMatrix[16]; }; } // namespace rgl #endif // VIEWPOINT_HPP rgl/src/Background.cpp0000644000176000001440000001104312262026246014441 0ustar ripleyusers#include "Background.hpp" #include "Viewpoint.hpp" #include "scene.h" #include "rglmath.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Background // Material Background::defaultMaterial( Color(0.3f,0.3f,0.3f), Color(1.0f,0.0f,0.0f) ); Background::Background(Material& in_material, bool in_sphere, int in_fogtype) : Shape(in_material, true, BACKGROUND), sphere(in_sphere), fogtype(in_fogtype) { clearColorBuffer = true; if (sphere) { material.colors.recycle(2); material.front = Material::CULL_FACE; material.colorPerVertex(false); if (material.back == Material::FILL_FACE) clearColorBuffer = false; if ( (material.lit) || ( (material.texture) && (material.texture->is_envmap() ) ) ) sphereMesh.setGenNormal(true); if ( (material.texture) && (!material.texture->is_envmap() ) ) sphereMesh.setGenTexCoord(true); sphereMesh.setGlobe (16,16); sphereMesh.setCenter( Vertex(0.0f,0.0f,0.0f) ); sphereMesh.setRadius( 1.0f ); sphereMesh.update(); } else material.colors.recycle(1); } GLbitfield Background::getClearFlags(RenderContext* renderContext) { if (clearColorBuffer) { material.colors.getColor(0).useClearColor(); return GL_COLOR_BUFFER_BIT; } else return 0; } // FIXME: this doesn't follow the pattern of other render methods. void Background::render(RenderContext* renderContext) { const AABox& bbox = renderContext->scene->getBoundingBox(); // setup fog if ((fogtype != FOG_NONE) && (bbox.isValid() )) { // Sphere bsphere(bbox); glFogfv(GL_FOG_COLOR, material.colors.getColor(0).getFloatPtr() ); switch(fogtype) { case FOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); glFogf(GL_FOG_START, renderContext->viewpoint->frustum.znear /*bsphere.radius*2*/); glFogf(GL_FOG_END, renderContext->viewpoint->frustum.zfar /*bsphere.radius*3*/ ); break; case FOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 1.0f/renderContext->viewpoint->frustum.zfar /*(bsphere.radius*3)*/ ); break; case FOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); glFogf(GL_FOG_DENSITY, 1.0f/renderContext->viewpoint->frustum.zfar /*(bsphere.radius*3)*/ ); break; } glEnable(GL_FOG); } else { glDisable(GL_FOG); } // render bg sphere if (sphere) { float fov = renderContext->viewpoint->getFOV(); float hlen, znear; if (fov > 0.0) { float rad = math::deg2rad(fov/2.0f); hlen = math::sin(rad) * math::cos(math::deg2rad(45.0)); znear = hlen / math::tan(rad); } else { hlen = math::cos(math::deg2rad(45.0)); znear = hlen; } float zfar = znear + 1.0f; float hwidth, hheight; float winwidth = (float) renderContext->rect.width; float winheight = (float) renderContext->rect.height; // aspect ratio if (winwidth >= winheight) { hwidth = hlen; hheight = hlen * (winheight / winwidth); } else { hwidth = hlen * (winwidth / winheight); hheight = hlen; } glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (fov != 0.0) { glFrustum(-hwidth, hwidth, -hheight, hheight, znear, zfar ); } else { glOrtho(-hwidth, hwidth, -hheight, hheight, znear, zfar ); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-znear); renderContext->viewpoint->setupOrientation(renderContext); Shape::render(renderContext); } } void Background::drawElement(RenderContext* renderContext, int index) { glPushAttrib(GL_ENABLE_BIT); material.beginUse(renderContext); material.useColor(1); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); sphereMesh.draw(renderContext); material.endUse(renderContext); glPopAttrib(); } int Background::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case FLAGS: return 4; } return Shape::getAttributeCount(bbox, attrib); } void Background::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { switch(attrib) { case FLAGS: if (first <= 0) *result++ = (double) sphere; if (first <= 1) *result++ = (double) fogtype == FOG_LINEAR; if (first <= 2) *result++ = (double) fogtype == FOG_EXP; if (first <= 3) *result++ = (double) fogtype == FOG_EXP2; return; } Shape::getAttribute(bbox, attrib, first, count, result); } } rgl/src/PointSet.cpp0000644000176000001440000000070212262026246014127 0ustar ripleyusers#include "PrimitiveSet.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // PointSet // PointSet::PointSet(Material& in_material, int in_nvertices, double* in_vertices, bool in_ignoreExtent, bool in_bboxChange) : PrimitiveSet(in_material, in_nvertices, in_vertices, GL_POINTS, 1, in_ignoreExtent) { material.lit = false; if (material.point_antialias) blended = true; } rgl/src/RenderContext.cpp0000644000176000001440000000046712262026246015156 0ustar ripleyusers#include "RenderContext.hpp" #include using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // RenderContext // float RenderContext::getDistance(const Vertex& v) const { Vertex4 vec = Vertex4(v, 1.0f); return (Zrow*vec) / (Wrow*vec); } rgl/src/Color.cpp0000644000176000001440000001243212262026246013443 0ustar ripleyusers#include "Color.hpp" #include "types.h" using namespace std; #include #include // for memcpy using namespace rgl; // // COLOR UTILS // // // FUNCTION // HexCharToNibble // static u8 HexCharToNibble(char c) { u8 nibble = 0; if ((c >= '0') && (c <= '9')) nibble = c - '0'; else if (( c >= 'A') && (c <= 'F')) nibble = (c - 'A') + 10; else if (( c >= 'a') && (c <= 'f')) nibble = (c - 'a') + 10; return nibble; } // // FUNCTION // StringToRGB8 // static void StringToRGB8(const char* string, u8* colorptr) { char* strptr = (char*) string; int cnt = 0; if (( *strptr++ == '#') && (cnt < 3)) { char c; while( (c = *strptr++) != '\0' ) { u8 component; component = (HexCharToNibble(c) << 4); if ( (c = *strptr++) == '\0') break; component |= HexCharToNibble(c); *colorptr++ = component; cnt++; } } for(int i=cnt;i<3;i++) *colorptr++ = 0x00; } ////////////////////////////////////////////////////////////////////////////// // // CLASS // Color // // Color::Color() { data[0] = 1.0f; data[1] = 1.0f; data[2] = 1.0f; data[3] = 1.0f; } Color::Color(float red, float green, float blue, float alpha) { data[0] = red; data[1] = green; data[2] = blue; data[3] = alpha; } Color::Color(u8 red, u8 green, u8 blue, u8 alpha) { data[0] = ((float)red)/255.0f; data[1] = ((float)green)/255.0f; data[2] = ((float)blue)/255.0f; data[3] = ((float)alpha)/255.0f; } Color::Color(const char* string) { u8 tmp[4]; tmp[3] = 255; StringToRGB8(string, tmp); for (int i=0;i<4;i++) data[i] = ((float)tmp[i])/255.0f; } void Color::set3iv(int* color) { data[0] = ((float)color[0])/255.0f; data[1] = ((float)color[1])/255.0f; data[2] = ((float)color[2])/255.0f; data[3] = 1.0f; } // TODO: move to rendergl.cpp #include "opengl.hpp" void Color::useClearColor() const { glClearColor(data[0],data[1],data[2], data[3]); } void Color::useColor() const { glColor4fv(data); } ////////////////////////////////////////////////////////////////////////////// // // CLASS // ColorArray // ColorArray::ColorArray() { arrayptr = NULL; ncolor = 0; nalpha = 0; } ColorArray::ColorArray( Color& bg, Color &fg ) { ncolor = 2; nalpha = 2; arrayptr = (u8*) realloc( NULL, sizeof(u8) * 4 * ncolor); arrayptr[0] = bg.getRedub(); arrayptr[1] = bg.getBlueub(); arrayptr[2] = bg.getGreenub(); arrayptr[3] = bg.getAlphaub(); arrayptr[4] = fg.getRedub(); arrayptr[5] = fg.getBlueub(); arrayptr[6] = fg.getGreenub(); arrayptr[7] = fg.getAlphaub(); hint_alphablend = ( (bg.getAlphaub() < 255) || (fg.getAlphaub() < 255) ) ? true : false; } ColorArray::ColorArray( ColorArray& src ) { ncolor = src.ncolor; nalpha = src.nalpha; hint_alphablend = src.hint_alphablend; if (ncolor > 0) { arrayptr = (u8*) realloc( NULL, sizeof(u8) * 4 * ncolor); memcpy( arrayptr, src.arrayptr, sizeof(u8) * 4 * ncolor); } else { arrayptr = NULL; } } ColorArray::~ColorArray() { if (arrayptr) free(arrayptr); } void ColorArray::set( int in_ncolor, char** in_color, int in_nalpha, double* in_alpha) { ncolor = getMax(in_ncolor, in_nalpha); nalpha = in_nalpha; u8* ptr = arrayptr = (u8*) realloc( arrayptr, sizeof(u8) * 4 * ncolor); hint_alphablend = false; for (unsigned int i=0;i 0) { u8 alpha = (u8) ( clamp( (float) in_alpha[i%in_nalpha], 0.0f, 1.0f) * 255.0f ); if (alpha < 255) hint_alphablend = true; ptr[3] = alpha; } else ptr[3] = 0xFF; ptr += 4; } } void ColorArray::set( int in_ncolor, int* in_color, int in_nalpha, double* in_alpha) { ncolor = getMax(in_ncolor, in_nalpha); nalpha = in_nalpha; u8* ptr = arrayptr = (u8*) realloc( arrayptr, sizeof(u8) * 4 * ncolor); hint_alphablend = false; for (unsigned int i=0;i 0) { u8 alpha = (u8) ( clamp( (float) in_alpha[i%in_nalpha], 0.0f, 1.0f) * 255.0f ); if (alpha < 255) hint_alphablend = true; ptr[3] = alpha; } else ptr[3] = 0xFF; ptr += 4; } } unsigned int ColorArray::getLength() const { return ncolor; } bool ColorArray::hasAlpha() const { return hint_alphablend; } void ColorArray::useArray() const { glColorPointer(4, GL_UNSIGNED_BYTE, 0, (const GLvoid*) arrayptr ); } void ColorArray::useColor(int index) const { glColor4ubv( (const GLubyte*) &arrayptr[ index * 4] ); } Color ColorArray::getColor(int index) const { return Color( arrayptr[index*4], arrayptr[index*4+1], arrayptr[index*4+2], arrayptr[index*4+3] ); } void ColorArray::recycle(unsigned int newsize) { if (ncolor != newsize) { if (ncolor > 1) { if (newsize > 0) { arrayptr = (u8*) realloc(arrayptr, sizeof(u8)*4*newsize); for(unsigned int i=ncolor;i /* Default for antialiasing */ #define RGL_ANTIALIAS 8 /* Set this to 1 to turn on glGetError testing */ #define USE_GLGETERROR 0 #if USE_GLGETERROR #define SAVEGLERROR saveGLerror(__FILE__, __LINE__); #define CHECKGLERROR checkGLerror(__FILE__, __LINE__); /* saveGLerror is safe to call from a message handler. It saves one error. */ /* checkGLerror is not safe within a message handler. It checks for saved errors or */ /* other errors, then reports them through R. */ /* Neither one can be called with glBegin() ... glEnd() pairs. */ /* They are defined in glErrors.cpp */ namespace rgl { extern int SaveErrnum; void saveGLerror(const char *, int); void checkGLerror(const char *, int); } // namespace rgl #else #define SAVEGLERROR #define CHECKGLERROR #endif #endif /* RGL_R_H */ rgl/src/TextSet.hpp0000644000176000001440000000237212262005306013766 0ustar ripleyusers#ifndef TEXTSET_HPP #define TEXTSET_HPP #include "Shape.hpp" #include "render.h" #include "String.hpp" #include "glgui.hpp" #ifdef HAVE_FREETYPE #include "FTGL/ftgl.h" #endif namespace rgl { // // TEXTSET // class TextSet : public Shape { public: TextSet(Material& in_material, int in_ntexts, char** in_texts, double *in_center, double in_adjx, double in_adjy, int in_ignoreExtent, FontArray& in_fonts); ~TextSet(); /* Can't use display lists */ void render(RenderContext* renderContext); virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "text", buflen); }; int getElementCount(void){ return textArray.size(); } int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); String getTextAttribute(AABox& bbox, AttribID attrib, int index); Vertex getElementCenter(int index) { return vertexArray[index]; } void drawBegin(RenderContext* renderContext); void drawElement(RenderContext* renderContext, int index); void drawEnd(RenderContext* renderContext); private: VertexArray vertexArray; StringArray textArray; FontArray fonts; double adjx; double adjy; }; } // namespace rgl #endif // TEXTSET_HPP rgl/src/par3d.cpp0000644000176000001440000002437012262026246013402 0ustar ripleyusers/* Avoid conflict with Rinternals.h */ // #undef DEBUG #include "R.h" #include "Rversion.h" #include "api.h" /* These defines are not in the installed version of R */ #define _ #define streql(s, t) (!strcmp((s), (t))) #include #include using namespace rgl; /* par3d implementation based on R's par implementation * * Main functions: * par3d(.) * Specify(.) [ par(what = value) ] * Query(.) [ par(what) ] */ static void par_error(const char *what) { error(_("invalid value specified for rgl parameter \"%s\""), what); } static void lengthCheck(const char *what, SEXP v, int n) { if (length(v) != n) error(_("parameter \"%s\" has the wrong length"), what); } static void dimCheck(const char *what, SEXP v, int r, int c) { SEXP dim = coerceVector(getAttrib(v, R_DimSymbol), INTSXP); if (length(dim) != 2 || INTEGER(dim)[0] != r || INTEGER(dim)[1] != c) error(_("parameter \"%s\" has the wrong dimension"), what); } #ifdef UNUSED static void nonnegIntCheck(int x, const char *s) { if (x == NA_INTEGER || x < 0) par_error(s); } static void posIntCheck(int x, const char *s) { if (x == NA_INTEGER || x <= 0) par_error(s); } static void naIntCheck(int x, const char *s) { if (x == NA_INTEGER) par_error(s); } #endif static void posRealCheck(double x, const char *s) { if (!R_FINITE(x) || x <= 0) par_error(s); } #ifdef UNUSED static void nonnegRealCheck(double x, const char *s) { if (!R_FINITE(x) || x < 0) par_error(s); } static void naRealCheck(double x, const char *s) { if (!R_FINITE(x)) par_error(s); } #endif static void BoundsCheck(double x, double a, double b, const char *s) { /* Check if a <= x <= b */ if (!R_FINITE(x) || (R_FINITE(a) && x < a) || (R_FINITE(b) && x > b)) par_error(s); } /* These modes must match the definitions of mmTRACKBALL etc in rglview.h ! */ namespace rgl { const char* mouseModes[] = {"none", "trackball", "xAxis", "yAxis", "zAxis", "polar", "selecting", "zoom", "fov", "user"}; } #define mmLAST 10 /* At R 2.6.0, the type of the first arg to psmatch changed to const char *. Conditionally cast to char * if we're in an old version */ #if defined(R_VERSION) && R_VERSION < R_Version(2, 6, 0) #define OLDCAST (char *) #else #define OLDCAST #endif static void Specify(const char *what, SEXP value) { /* Do NOT forget to update ../R/par3d.R */ /* if you ADD a NEW par !! */ SEXP x; double v; int iv; int success; success = 0; if (streql(what, "FOV")) { lengthCheck(what, value, 1); v = asReal(value); BoundsCheck(v, 0.0, 179.0, what); rgl_setFOV(&success, &v); } else if (streql(what, "ignoreExtent")) { lengthCheck(what, value, 1); iv = asLogical(value); rgl_setIgnoreExtent(&success, &iv); } else if (streql(what, "mouseMode")) { value = coerceVector(value, STRSXP); if (length(value) > 3) par_error(what); for (int i=1; i<=3 && i <= length(value); i++) { if (STRING_ELT(value, i-1) != NA_STRING) { success = 0; /* check exact first, then partial */ for (int mode = 0; mode < mmLAST; mode++) { if (psmatch(OLDCAST mouseModes[mode], CHAR(STRING_ELT(value, i-1)), (Rboolean)TRUE)) { rgl_setMouseMode(&success, &i, &mode); break; } } if (!success) { for (int mode = 0; mode < mmLAST; mode++) { if (psmatch(OLDCAST mouseModes[mode], CHAR(STRING_ELT(value, i-1)), (Rboolean)FALSE)) { rgl_setMouseMode(&success, &i, &mode); break; } } } if (!success) par_error(what); } } } else if (streql(what, "skipRedraw")) { lengthCheck(what, value, 1); iv = asLogical(value); rgl_setSkipRedraw(&success, &iv); } else if (streql(what, "userMatrix")) { dimCheck(what, value, 4, 4); x = coerceVector(value, REALSXP); rgl_setUserMatrix(&success, REAL(x)); } else if (streql(what, "scale")) { lengthCheck(what, value, 3); x = coerceVector(value, REALSXP); rgl_setScale(&success, REAL(x)); } else if (streql(what, "zoom")) { lengthCheck(what, value, 1); v = asReal(value); posRealCheck(v, what); rgl_setZoom(&success, &v); } else if (streql(what, ".position")) { lengthCheck(what, value, 2); x = coerceVector(value, REALSXP); rgl_setPosition(REAL(x)); success = 1; } else if (streql(what, "windowRect")) { lengthCheck(what, value, 4); x = coerceVector(value, INTSXP); rgl_setWindowRect(&success, INTEGER(x)); } else if (streql(what, "family")) { lengthCheck(what, value, 1); x = coerceVector(value, STRSXP); if (rgl_setFamily(CHAR(STRING_ELT(x, 0)))) success = 1; } else if (streql(what, "font")) { lengthCheck(what, value, 1); x=coerceVector(value, INTSXP); if (INTEGER(x)[0] < 1 || INTEGER(x)[0] > 5) { par_error(what); } if (rgl_setFont(INTEGER(x)[0])) success = 1; } else if (streql(what, "cex")) { lengthCheck(what, value, 1); x=coerceVector(value, REALSXP); if (REAL(x)[0] <= 0) { par_error(what); } if (rgl_setCex(REAL(x)[0])) success = 1; } else if (streql(what, "useFreeType")) { lengthCheck(what, value, 1); x=coerceVector(value, LGLSXP); #ifndef HAVE_FREETYPE if (LOGICAL(x)[0]) warning("FreeType not supported in this build"); #endif if (rgl_setUseFreeType(LOGICAL(x)[0])) success = 1; } else warning(_("parameter \"%s\" cannot be set"), what); if (!success) par_error(what); return; } /* Do NOT forget to update ../R/par3d.R */ /* if you ADD a NEW par !! */ static SEXP Query(const char *what) { SEXP value, names; int i, mode, success; char* buf; success = 0; value = R_NilValue; if (streql(what, "FOV")) { value = allocVector(REALSXP, 1); rgl_getFOV(&success, REAL(value)); } else if (streql(what, "ignoreExtent")) { value = allocVector(LGLSXP, 1); rgl_getIgnoreExtent(&success, LOGICAL(value)); } else if (streql(what, "modelMatrix")) { value = allocMatrix(REALSXP, 4, 4); rgl_getModelMatrix(&success, REAL(value)); } else if (streql(what, "mouseMode")) { PROTECT(value = allocVector(STRSXP, 3)); for (i=1; i<4; i++) { rgl_getMouseMode(&success, &i, &mode); if (mode < 0 || mode > mmLAST) mode = 0; SET_STRING_ELT(value, i-1, mkChar(mouseModes[mode])); }; PROTECT(names = allocVector(STRSXP, 3)); SET_STRING_ELT(names, 0, mkChar("left")); SET_STRING_ELT(names, 1, mkChar("right")); SET_STRING_ELT(names, 2, mkChar("middle")); UNPROTECT(2); value = namesgets(value, names); success = 1; } else if (streql(what, "projMatrix")) { value = allocMatrix(REALSXP, 4, 4); rgl_getProjMatrix(&success, REAL(value)); } else if (streql(what, "skipRedraw")) { value = allocVector(LGLSXP, 1); rgl_getSkipRedraw(&success, LOGICAL(value)); } else if (streql(what, "userMatrix")) { value = allocMatrix(REALSXP, 4, 4); rgl_getUserMatrix(&success, REAL(value)); } else if (streql(what, "scale")) { value = allocVector(REALSXP, 3); rgl_getScale(&success, REAL(value)); } else if (streql(what, "viewport")) { value = allocVector(INTSXP, 4); rgl_getViewport(&success, INTEGER(value)); } else if (streql(what, "zoom")) { value = allocVector(REALSXP, 1); rgl_getZoom(&success, REAL(value)); } else if (streql(what, "bbox")) { value = allocVector(REALSXP, 6); rgl_getBoundingbox(&success, REAL(value)); } else if (streql(what, ".position")) { value = allocVector(REALSXP, 2); rgl_getPosition(REAL(value)); success = 1; } else if (streql(what, "windowRect")) { value = allocVector(INTSXP, 4); rgl_getWindowRect(&success, INTEGER(value)); } else if (streql(what, "family")) { buf = rgl_getFamily(); if (buf) { value = mkString(buf); success = 1; } } else if (streql(what, "font")) { value = allocVector(INTSXP, 1); INTEGER(value)[0] = rgl_getFont(); success = INTEGER(value)[0] >= 0; } else if (streql(what, "cex")) { value = allocVector(REALSXP, 1); REAL(value)[0] = rgl_getCex(); success = REAL(value)[0] >= 0; } else if (streql(what, "useFreeType")) { int useFreeType = rgl_getUseFreeType(); value = allocVector(LGLSXP, 1); if (useFreeType < 0) { LOGICAL(value)[0] = false; success = 0; } else { LOGICAL(value)[0] = (bool)useFreeType; success = 1; } } else if (streql(what, "fontname")) { buf = rgl_getFontname(); if (buf) { value = mkString(buf); success = 1; } } else if (streql(what, "antialias")) { value = allocVector(INTSXP, 1); INTEGER(value)[0] = rgl_getAntialias(); success = 1; } else if (streql(what, "maxClipPlanes")) { value = allocVector(INTSXP, 1); INTEGER(value)[0] = rgl_getMaxClipPlanes(); success = 1; } if (! success) error(_("unknown error getting rgl parameter \"%s\""), what); return value; } SEXP rgl::rgl_par3d(SEXP args) { SEXP value; int nargs; args = CADR(args); nargs = length(args); if (isNewList(args)) { SEXP oldnames, newnames, tag, val; int i; PROTECT(newnames = allocVector(STRSXP, nargs)); PROTECT(value = allocVector(VECSXP, nargs)); oldnames = getAttrib(args, R_NamesSymbol); for (i = 0 ; i < nargs ; i++) { if (oldnames != R_NilValue) tag = STRING_ELT(oldnames, i); else tag = R_NilValue; val = VECTOR_ELT(args, i); if (tag != R_NilValue && CHAR(tag)[0]) { SET_VECTOR_ELT(value, i, Query(CHAR(tag))); SET_STRING_ELT(newnames, i, tag); Specify(CHAR(tag), val); CHECKGLERROR; } else if (isString(val) && length(val) > 0) { tag = STRING_ELT(val, 0); if (tag != R_NilValue && CHAR(tag)[0]) { SET_VECTOR_ELT(value, i, Query(CHAR(tag))); SET_STRING_ELT(newnames, i, tag); CHECKGLERROR; } } else { SET_VECTOR_ELT(value, i, R_NilValue); SET_STRING_ELT(newnames, i, R_NilValue); } } setAttrib(value, R_NamesSymbol, newnames); UNPROTECT(2); } else { error(_("invalid parameter passed to par3d()")); return R_NilValue/* -Wall */; } return value; } rgl/src/BBoxDeco.cpp0000644000176000001440000004404312262026246014015 0ustar ripleyusers#include "BBoxDeco.hpp" #include "gl2ps.h" #include "glgui.hpp" #include "scene.h" #include #include #include "R.h" #include "pretty.h" #if 0 // This is debugging code to track down font problems. #include "R.h" static GLenum flags[] = { GL_ALPHA_TEST , GL_AUTO_NORMAL , GL_MAP2_VERTEX_4, GL_BLEND, GL_CLIP_PLANE0, GL_CLIP_PLANE1, GL_CLIP_PLANE2, GL_COLOR_LOGIC_OP, GL_COLOR_MATERIAL, GL_COLOR_TABLE, GL_CONVOLUTION_1D, GL_CONVOLUTION_2D, GL_CULL_FACE, GL_DEPTH_TEST, GL_DITHER, GL_FOG, GL_HISTOGRAM, GL_INDEX_LOGIC_OP, GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHTING, GL_LINE_SMOOTH, GL_LINE_STIPPLE, GL_MAP1_COLOR_4, GL_MAP1_INDEX, GL_MAP1_NORMAL, GL_MAP1_TEXTURE_COORD_1, GL_MAP1_TEXTURE_COORD_2, GL_MAP1_TEXTURE_COORD_3, GL_MAP1_TEXTURE_COORD_4, GL_MAP1_VERTEX_3, GL_MAP1_VERTEX_4, GL_MAP2_COLOR_4, GL_MAP2_INDEX, GL_MAP2_NORMAL, GL_MAP2_TEXTURE_COORD_1, GL_MAP2_TEXTURE_COORD_2, GL_MAP2_TEXTURE_COORD_3, GL_MAP2_TEXTURE_COORD_4, GL_MAP2_VERTEX_3, GL_MAP2_VERTEX_4, GL_MINMAX, GL_NORMALIZE, GL_POINT_SMOOTH, GL_POLYGON_OFFSET_FILL, GL_POLYGON_OFFSET_LINE, GL_POLYGON_OFFSET_POINT, GL_POINT, GL_POLYGON_SMOOTH, GL_POLYGON_STIPPLE, GL_POST_COLOR_MATRIX_COLOR_TABLE, GL_POST_CONVOLUTION_COLOR_TABLE, GL_RESCALE_NORMAL, GL_SEPARABLE_2D, GL_SCISSOR_TEST, GL_STENCIL_TEST, GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_GEN_Q, GL_TEXTURE_GEN_R, GL_TEXTURE_GEN_S, GL_TEXTURE_GEN_T}; void Rpf(const char * msg) { int flag1=0, flag2 = 0; for (int i=0; i< 32; i++) { GLboolean f; glGetBooleanv( flags[i], &f); if (f) flag1 += (1 << i); glGetBooleanv( flags[i+32], &f); if (f) flag2 += (1 << i); } Rprintf("%s: Flags 0 to 31: %x 32 to 63: %x\n", msg, flag1, flag2); GLint modes[2]; glGetIntegerv( GL_POLYGON_MODE, modes); Rprintf(" Polygon modes: %X %X\n", modes[0], modes[1]); } #endif using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // BBoxDeco // AxisInfo::AxisInfo() : textArray() { mode = AXIS_LENGTH; nticks = 0; ticks = NULL; len = 2; unit = 0; } AxisInfo::AxisInfo(int in_nticks, double* in_ticks, char** in_texts, int in_len, float in_unit) : textArray(in_nticks, in_texts) { int i; nticks = in_nticks; len = in_len; unit = in_unit; ticks = NULL; if (nticks > 0) { mode = AXIS_CUSTOM; ticks = new float [nticks]; for(i=0;i 0) mode = AXIS_UNIT; else if (unit < 0) mode = AXIS_PRETTY; else if (len > 0) mode = AXIS_LENGTH; else mode = AXIS_NONE; } } AxisInfo::AxisInfo(AxisInfo& from) : textArray(from.textArray) { mode = from.mode; nticks = from.nticks; len = from.len; unit = from.unit; if (nticks > 0) { ticks = new float [nticks]; memcpy (ticks, from.ticks, sizeof(float)*nticks); } else ticks = NULL; } AxisInfo::~AxisInfo() { if (ticks) { delete [] ticks; } } void AxisInfo::draw(RenderContext* renderContext, Vertex4& v, Vertex4& dir, Matrix4x4& modelview, Vertex& marklen, String& string) { Vertex4 p; GLboolean valid; // draw mark ( 1 time ml away ) p.x = v.x + dir.x * marklen.x; p.y = v.y + dir.y * marklen.y; p.z = v.z + dir.z * marklen.z; glBegin(GL_LINES); glVertex3f(v.x,v.y,v.z); glVertex3f(p.x,p.y,p.z); glEnd(); // draw text ( 2 times ml away ) p.x = v.x + 2 * dir.x * marklen.x; p.y = v.y + 2 * dir.y * marklen.y; p.z = v.z + 2 * dir.z * marklen.z; glRasterPos3f( p.x, p.y, p.z ); glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if (valid) { // Work out the text adjustment float adj = 0.5; Vertex4 eyedir = modelview * dir; bool xlarge = fabs(eyedir.x) > fabs(eyedir.y); if (xlarge) { adj = fabs(eyedir.y)/fabs(eyedir.x)/2.0; if (eyedir.x < 0) adj = 1.0 - adj; } if (renderContext->font) renderContext->font->draw(string.text, string.length, adj, 0.5, *renderContext); } } int AxisInfo::getNticks(float low, float high) { switch (mode) { case AXIS_CUSTOM: return nticks; case AXIS_LENGTH: return len; case AXIS_UNIT: return (high - low)/unit; case AXIS_PRETTY: { double lo=low, up=high, shrink_sml=0.75, high_u_fact[2]; int ndiv=len, min_n=3, eps_correction=0; int count=0; high_u_fact[0] = 1.5; high_u_fact[1] = 2.75; unit = R_pretty0(&lo, &up, &ndiv, min_n, shrink_sml, high_u_fact, eps_correction, 0); for (int i=(int)lo; i<=up; i++) { float value = i*unit; if (value >= low && value <= high) count++; } return count; } } return 0; } float AxisInfo::getTick(float low, float high, int index) { switch (mode) { case AXIS_CUSTOM: return ticks[index]; case AXIS_LENGTH: { float delta = (len>1) ? (high-low)/(len-1) : 0; return low + delta*(float)index; } case AXIS_UNIT: { float value = ( (float) ( (int) ( ( low+(unit-1) ) / (unit) ) ) ) * (unit); return value + index*unit; } case AXIS_PRETTY: { double lo=low, up=high, shrink_sml=0.75, high_u_fact[2]; int ndiv=len, min_n=3, eps_correction=0; int count=0; high_u_fact[0] = 1.5; high_u_fact[1] = 2.75; unit = R_pretty0(&lo, &up, &ndiv, min_n, shrink_sml, high_u_fact, eps_correction, 0); for (int i=(int)lo; i<=up; i++) { float value = i*unit; if (value >= low && value <= high) { if (count == index) return value; count++; } } } } return NA_REAL; } struct Side { int vidx[4]; Vertex4 normal; Side( int i0, int i1, int i2, int i3, Vertex4 v ) : normal(v) { vidx[0] = i0; vidx[1] = i1; vidx[2] = i2; vidx[3] = i3; } }; static Side side[6] = { // BACK Side(0, 2, 3, 1, Vertex4( 0.0f, 0.0f,-1.0f, 0.0f) ), // FRONT Side(4, 5, 7, 6, Vertex4( 0.0f, 0.0f, 1.0f, 0.0f) ), // LEFT Side(4, 6, 2, 0, Vertex4(-1.0f, 0.0f, 0.0f, 0.0f) ), // RIGHT Side(5, 1, 3, 7, Vertex4( 1.0f, 0.0f, 0.0f, 0.0f) ), // BOTTOM Side(0, 1, 5, 4, Vertex4( 0.0f,-1.0f, 0.0f, 0.0f) ), // TOP Side(6, 7, 3, 2, Vertex4( 0.0f, 1.0f, 0.0f, 0.0f) ) }; struct Edge{ Edge(int in_from, int in_to, Vertex4 in_dir) : from(in_from), to(in_to), dir(in_dir) { } int from, to; Vertex4 dir; }; static Edge xaxisedge[4] = { Edge( 5,4, Vertex4( 0.0f, 0.0f, 1.0f, 0.0f) ), Edge( 0,1, Vertex4( 0.0f, 0.0f,-1.0f, 0.0f) ), Edge( 6,7, Vertex4( 0.0f, 0.0f, 1.0f, 0.0f) ), Edge( 3,2, Vertex4( 0.0f, 0.0f,-1.0f, 0.0f) ) }; static Edge yaxisedge[8] = { Edge( 5,7, Vertex4( 1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 7,5, Vertex4( 0.0f, 0.0f, 1.0f, 0.0f) ), Edge( 6,4, Vertex4(-1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 4,6, Vertex4( 0.0f, 0.0f, 1.0f, 0.0f) ), Edge( 2,0, Vertex4( 0.0f, 0.0f,-1.0f, 0.0f) ), Edge( 0,2, Vertex4(-1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 3,1, Vertex4( 1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 1,3, Vertex4( 0.0f, 0.0f,-1.0f, 0.0f) ) }; static Edge zaxisedge[4] = { Edge( 1,5, Vertex4( 1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 4,0, Vertex4(-1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 7,3, Vertex4( 1.0f, 0.0f, 0.0f, 0.0f) ), Edge( 2,6, Vertex4(-1.0f, 0.0f, 0.0f, 0.0f) ) }; AxisInfo BBoxDeco::defaultAxis(0,NULL,NULL,0,5); Material BBoxDeco::defaultMaterial( Color(0.6f,0.6f,0.6f,0.5f), Color(1.0f,1.0f,1.0f) ); BBoxDeco::BBoxDeco(Material& in_material, AxisInfo& in_xaxis, AxisInfo& in_yaxis, AxisInfo& in_zaxis, float in_marklen_value, bool in_marklen_fract, float in_expand, bool in_front) : SceneNode(BBOXDECO), material(in_material), xaxis(in_xaxis), yaxis(in_yaxis), zaxis(in_zaxis), marklen_value(in_marklen_value), marklen_fract(in_marklen_fract), expand(in_expand), draw_front(in_front) { material.colors.recycle(2); } Vertex BBoxDeco::getMarkLength(const AABox& boundingBox) const { return (marklen_fract) ? (boundingBox.vmax - boundingBox.vmin) * (1 / marklen_value) : Vertex(1,1,1) * marklen_value; } AABox BBoxDeco::getBoundingBox(const AABox& in_bbox) const { AABox bbox2(in_bbox); Vertex marklen = getMarkLength(bbox2); Vertex v = marklen * 2; bbox2 += bbox2.vmin - v; bbox2 += bbox2.vmax + v; return bbox2; } void BBoxDeco::render(RenderContext* renderContext) { AABox bbox = renderContext->scene->getBoundingBox(); if (bbox.isValid()) { Vertex center = bbox.getCenter(); bbox += center + (bbox.vmin - center)*expand; bbox += center + (bbox.vmax - center)*expand; // Sphere bsphere(bbox); glPushAttrib(GL_ENABLE_BIT); int i,j; // vertex array: Vertex4 boxv[8] = { Vertex4( bbox.vmin.x, bbox.vmin.y, bbox.vmin.z ), Vertex4( bbox.vmax.x, bbox.vmin.y, bbox.vmin.z ), Vertex4( bbox.vmin.x, bbox.vmax.y, bbox.vmin.z ), Vertex4( bbox.vmax.x, bbox.vmax.y, bbox.vmin.z ), Vertex4( bbox.vmin.x, bbox.vmin.y, bbox.vmax.z ), Vertex4( bbox.vmax.x, bbox.vmin.y, bbox.vmax.z ), Vertex4( bbox.vmin.x, bbox.vmax.y, bbox.vmax.z ), Vertex4( bbox.vmax.x, bbox.vmax.y, bbox.vmax.z ) }; Vertex4 eyev[8]; // transform vertices: used for edge distance criterion and text justification Matrix4x4 modelview(renderContext->modelview); for(i=0;i<8;i++) eyev[i] = modelview * boxv[i]; // setup material material.beginUse(renderContext); if (material.line_antialias || material.isTransparent()) { // SETUP BLENDING if (renderContext->gl2psActive == GL2PS_NONE) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); else gl2psBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); // ENABLE BLENDING glEnable(GL_BLEND); } // edge adjacent matrix int adjacent[8][8] = { { 0 } }; // draw back faces // construct adjacent matrix glBegin(GL_QUADS); for(i=0;i<6;i++) { const Vertex4 q = modelview * side[i].normal; const Vertex4 view(0.0f,0.0f,1.0f,0.0f); float cos_a = view * q; const bool front = (cos_a >= 0.0f) ? true : false; if (draw_front || !front) { // draw face glNormal3f(side[i].normal.x, side[i].normal.y, side[i].normal.z); for(j=0;j<4;j++) { if (!front) { // modify adjacent matrix int from = side[i].vidx[j]; int to = side[i].vidx[(j+1)%4]; adjacent[from][to] = 1; } // feed vertex Vertex4& v = boxv[ side[i].vidx[j] ]; glVertex3f(v.x, v.y, v.z); } } } glEnd(); // setup mark length Vertex marklen = getMarkLength(bbox); // draw axis and tickmarks // find contours glDisable(GL_LIGHTING); material.useColor(1); for(i=0;i<3;i++) { Vertex4 v; AxisInfo* axis; Edge* axisedge; int nedges; float* valueptr; float low, high; switch(i) { case 0: axis = &xaxis; axisedge = xaxisedge; nedges = 4; valueptr = &v.x; low = bbox.vmin.x; high = bbox.vmax.x; break; case 1: axis = &yaxis; axisedge = yaxisedge; nedges = 8; valueptr = &v.y; low = bbox.vmin.y; high = bbox.vmax.y; break; case 2: default: axis = &zaxis; axisedge = zaxisedge; nedges = 4; valueptr = &v.z; low = bbox.vmin.z; high = bbox.vmax.z; break; } if (axis->mode == AXIS_NONE) continue; // search z-nearest contours float d = FLT_MAX; Edge* edge = NULL; for(j=0;jfrom]; switch (axis->mode) { case AXIS_CUSTOM: { // draw axis and tickmarks StringArrayIterator iter(&axis->textArray); for (iter.first(), j=0; (jnticks) && (!iter.isDone());j++, iter.next()) { float value = axis->ticks[j]; // clip marks if ((value >= low) && (value <= high)) { String string = iter.getCurrent(); *valueptr = value; axis->draw(renderContext, v, edge->dir, modelview, marklen, string); } } } break; case AXIS_LENGTH: { float delta = (axis->len>1) ? (high-low)/((axis->len)-1) : 0; for(int k=0;klen;k++) { float value = low + delta * (float)k; *valueptr = value; char text[32]; sprintf(text, "%.4g", value); String string(strlen(text),text); axis->draw(renderContext, v, edge->dir, modelview, marklen, string); } } break; case AXIS_UNIT: { float value = ( (float) ( (int) ( ( low+(axis->unit-1) ) / (axis->unit) ) ) ) * (axis->unit); while(value < high) { *valueptr = value; char text[32]; sprintf(text, "%.4g", value); String s (strlen(text),text); axis->draw(renderContext, v, edge->dir, modelview, marklen, s ); value += axis->unit; } } break; case AXIS_PRETTY: { /* These are the defaults from the R pretty() function, except min_n is 3 */ double lo=low, up=high, shrink_sml=0.75, high_u_fact[2]; int ndiv=axis->len, min_n=3, eps_correction=0; high_u_fact[0] = 1.5; high_u_fact[1] = 2.75; axis->unit = R_pretty0(&lo, &up, &ndiv, min_n, shrink_sml, high_u_fact, eps_correction, 0); for (int i=(int)lo; i<=up; i++) { float value = i*axis->unit; if (value >= low && value <= high) { *valueptr = value; char text[32]; sprintf(text, "%.4g", value); String s (strlen(text),text); axis->draw(renderContext, v, edge->dir, modelview, marklen, s ); } } } break; } } } material.endUse(renderContext); glPopAttrib(); } } int BBoxDeco::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case TEXTS: { int count = ((xaxis.mode == AXIS_CUSTOM) ? xaxis.nticks : 0) + ((yaxis.mode == AXIS_CUSTOM) ? yaxis.nticks : 0) + ((zaxis.mode == AXIS_CUSTOM) ? zaxis.nticks : 0); if (count == 0) return 0; } /* if non-zero, we want labels for every vertex, so fall through. */ case VERTICES: return xaxis.getNticks(bbox.vmin.x, bbox.vmax.x) + yaxis.getNticks(bbox.vmin.y, bbox.vmax.y) + zaxis.getNticks(bbox.vmin.z, bbox.vmax.z); case COLORS: return material.colors.getLength(); case FLAGS: return 1; } return SceneNode::getAttributeCount(bbox, attrib); } void BBoxDeco::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { switch(attrib) { case VERTICES: float low, high; int i, thisn; i = 0; low = bbox.vmin.x; high = bbox.vmax.x; thisn = xaxis.getNticks(low, high); for (int j=0; jis_envmap() ) ) { if (!user_textures) { texCoordArray[iy].s = ((float)ix)/((float)(nx-1)); texCoordArray[iy].t = 1.0f - ((float)iz)/((float)(nz-1)); } else { texCoordArray[iy].s = in_texture_s[iy]; texCoordArray[iy].t = in_texture_t[iy]; } } boundingBox += v; } } use_texcoord = user_textures || ( material.texture && !(material.texture->is_envmap() ) ); use_normal = !user_normals && ( material.lit || ( (material.texture) && (material.texture->is_envmap() ) ) ); if ((material.point_antialias && ( material.front == material.POINT_FACE || material.back == material.POINT_FACE)) || (material.line_antialias && ( material.front == material.LINE_FACE || material.back == material.LINE_FACE))) blended = true; } void Surface::setNormal(int ix, int iz) { int i = iz*nx + ix; Vertex total(0.0f,0.0f,0.0f); if (!vertexArray[i].missing()) { // 0, 1, 2, 3, 4, 5, 6, 7 // right, NE, top, NW, left, SW, bottom, SE // i+1, i-nx+1, i-nx, i-nx-1, i-1, i+nx-1, i+nx, i+nx+1 int okay[8] = {0,0,0,0,0,0,0,0}; /* checks of surrounding vertices from right counterclockwise */ if (ix < nx-1 && !vertexArray[i+1].missing() ) { okay[0] = 1; if (iz > 0 && !vertexArray[i-nx].missing() ) { okay[2] = 1; total += vertexArray.getNormal(i, i+1, i-nx );// right/top } if (iz < nz-1 && !vertexArray[i+nx].missing() ) { total += vertexArray.getNormal(i, i+nx, i+1 );// bottom/right okay[6] = 1; } } if (ix > 0 && !vertexArray[i-1].missing() ) { okay[4] = 1; if (okay[2]) // top/left total += vertexArray.getNormal(i, i-nx, i-1 ); if (okay[6]) total += vertexArray.getNormal(i, i-1, i+nx );// left/bottom } if (total.getLength() == 0.0) { /* possibly have a degenerate side; try harder by doing 8 triangular sectors */ if (okay[0]) { if (i-nx+1 > 0 && !vertexArray[i-nx+1].missing() ) { okay[1] = 1; total += vertexArray.getNormal(i, i+1, i-nx+1); // right/NE } if (i+nx+1 < nx*nz && !vertexArray[i+nx+1].missing() ) { okay[7] = 1; total += vertexArray.getNormal(i, i+nx+1, i+1); // SE/right } } if (okay[2]) { if (okay[1]) total += vertexArray.getNormal(i, i-nx+1, i-nx); // NE/top if (i-nx-1 >= 0 && !vertexArray[i-nx-1].missing() ) { okay[3] =1; total += vertexArray.getNormal(i, i-nx, i-nx-1); // top/NW } } if (okay[4]) { if (okay[3]) total += vertexArray.getNormal(i, i-nx-1, i-1); // NW/left if (i+nx-1 < nx*nz && !vertexArray[i+nx-1].missing() ) { // left/SW okay[5] = 1; total += vertexArray.getNormal(i, i-1, i+nx-1); } } if (okay[6]) { if (okay[5]) total += vertexArray.getNormal(i, i+nx-1, i+nx); // SW/bottom if (okay[7]) total += vertexArray.getNormal(i, i+nx, i+nx+1); // bottom/SE } } total.normalize(); } if (orientation) glNormal3f(-total.x,-total.y,-total.z); else glNormal3f(total.x,total.y,total.z); } void Surface::draw(RenderContext* renderContext) { bool missing; drawBegin(renderContext); for(int iz=0;izdestroy(); else dispose(); } // protected: // event handlers: void show(); void hide(); void resize(int width, int height); void paint(); void on_close(); void notifyDestroy(); void buttonPress(int button, int mouseX, int mouseY); void buttonRelease(int button, int mouseX, int mouseY); void mouseMove(int mouseX, int mouseY); void keyPress(int code); void wheelRotate(int dir); void bringToTop(int stay); void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void getFonts(FontArray& outfonts, int nfonts, char** family, int* style, double* cex, bool useFreeType); // data: View* child; const char* title; bool skipRedraw; }; // --------------------------------------------------------------------------- } // namespace rgl #endif // RGL_GUI_HPP rgl/src/glErrors.cpp0000644000176000001440000000135112262026246014162 0ustar ripleyusers// // This file is part of RGL. // #include "opengl.hpp" #include "R.h" namespace rgl { int SaveErrnum = GL_NO_ERROR; } using namespace rgl; static const char * SaveFile; static int SaveLine; void saveGLerror(const char * file, int line) { GLenum errnum; if (SaveErrnum == GL_NO_ERROR && (errnum = glGetError()) != GL_NO_ERROR) { SaveErrnum = errnum; SaveFile = file; SaveLine = line; } } void checkGLerror(const char * file, int line) { saveGLerror(file, line); if (SaveErrnum != GL_NO_ERROR) { int err = SaveErrnum; SaveErrnum = GL_NO_ERROR; while (glGetError() != GL_NO_ERROR) {} /* clear other errors, if any */ error("OpenGL error at %s:%d: %s", SaveFile, SaveLine, gluErrorString(err)); } } rgl/src/types.h0000644000176000001440000000571212262026246013201 0ustar ripleyusers#ifndef RGL_TYPES_H #define RGL_TYPES_H #include #include "pragma.h" // C++ header file // This file is part of RGL // // $Id: types.h 991 2013-11-20 20:26:13Z murdoch $ namespace rgl { // // // constants // // #ifndef NULL #define NULL 0UL #endif // // // fundamental data types // // typedef unsigned char u8; typedef long u32; // // memory management objects // class AutoDestroy { public: AutoDestroy() { refcount = 0; } virtual ~AutoDestroy() { } void ref() { refcount++; } void unref() { if ( !(--refcount) ) delete this; } private: int refcount; }; template class Ref { public: Ref() : ptr(NULL) { } Ref(T* in_ptr) : ptr(in_ptr) { if (ptr) ptr->ref(); } Ref(const Ref& ref) : ptr(ref.ptr) { if (ptr) ptr->ref(); } ~Ref() { if (ptr) ptr->unref(); } Ref& operator = (T* in_ptr) { if (ptr) ptr->unref(); ptr = in_ptr; if (ptr) ptr->ref(); return *this; } T* operator -> () { return ptr; } operator bool () { return (ptr) ? true : false; } private: T* ptr; }; // // CLASS // DestroyHandler // class DestroyHandler { public: virtual ~DestroyHandler(); virtual void notifyDestroy(void* userdata) = 0; }; // // mem copy // template inline void copy(A* from, B* to, int size) { memcpy( (void*) to, (const void*) from, size*sizeof(A) ); } // // TEMPLATE // ARRAY // template struct ARRAY { int _size; T* ptr; inline int size() { return _size; } inline ARRAY(int in_size) : _size(in_size), ptr(new T [_size]) { } template inline ARRAY(int in_size, SRC* src) : _size(in_size), ptr(new T [_size]) { copy(src, ptr,_size); } inline ~ARRAY() { delete [] ptr; } inline T& get(int index) { return ptr[index]; } inline T& getRecycled(int index) { return ptr[index%_size]; }; }; // // cast-copy doubles to floats // template<> inline void copy(double* from, float* to, int size) { while(size--) { *to = (float) *from; from++; to++; } } /** * get most significant bit * @param x unsigned value * @return bit position between 1..32 or 0 if value was 0 **/ inline int msb(unsigned int x) { if (x) { int bit = sizeof(int)*8; unsigned int mask = 1<<((sizeof(int)*8)-1); while ( !(x & mask) ) { --bit; mask >>= 1; } return bit; } else return 0; } // template T getMax(T a, T b) { return (a > b) ? a : b; } // template T getMin(T a, T b) { return (a < b) ? a : b; } inline int getMin(int a, int b) { return (a <= b) ? a : b; } inline float getMin(float a, float b) { return (a <= b) ? a : b; } inline int getMax(int a, int b) { return (a >= b) ? a : b; } inline float getMax(float a, float b) { return (a >= b) ? a : b; } inline float clamp(float v, float floor, float ceil) { return (vceil) ? ceil : v ); } inline int clamp(int v, int floor, int ceil) { return (vceil) ? ceil : v ); } } // namespace rgl #endif /* RGL_TYPES_H */ rgl/src/DeviceManager.hpp0000644000176000001440000000220112262005307015050 0ustar ripleyusers#ifndef RGL_DEVICE_MANAGER_HPP #define RGL_DEVICE_MANAGER_HPP // C++ header file // This file is part of RGL // // $Id: DeviceManager.hpp 976 2013-10-04 15:06:19Z murdoch $ #include "Device.hpp" #include namespace rgl { /** * Manager component that is used as a front-end for multiple devices access * using an 'id' to set the current device. **/ class DeviceManager : protected IDisposeListener { public: DeviceManager(bool in_useNULLDevice); virtual ~DeviceManager(); bool openDevice(bool useNULL); Device* getCurrentDevice(void); Device* getAnyDevice(void); Device* getDevice(int id); bool setCurrent(int id, bool silent = false); int getCurrent(); int getDeviceCount(); void getDeviceIds(int *buffer, int bufsize); protected: /** * Dispose Listener implementation **/ void notifyDisposed(Disposable*); private: void nextDevice(); void previousDevice(); typedef std::list Container; typedef Container::iterator Iterator; int newID; Container devices; Iterator current; bool useNULLDevice; }; } // namespace rgl #endif // DEVICE_MANAGER_HPP rgl/src/Light.hpp0000644000176000001440000000164712262021674013447 0ustar ripleyusers#ifndef LIGHT_HPP #define LIGHT_HPP #include "SceneNode.hpp" #include "rglmath.h" #include "Color.hpp" #include "RenderContext.hpp" #include "opengl.hpp" namespace rgl { // // CLASS // Light // class Light : public SceneNode { public: Light( PolarCoord in_position = PolarCoord(0.0,0.0) , Vertex in_finposition=Vertex(0.0f,0.0f,0.0f), bool in_viewpoint=true, bool in_posisfinite=false, Color ambient=Color(1.0f,1.0f,1.0f), Color diffuse=Color(1.0,1.0,1.0), Color specular=Color(1.0,1.0,1.0) ); void setup(RenderContext* renderContext); int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); private: float position[4]; Vertex finposition; Color ambient; Color diffuse; Color specular; GLenum id; bool viewpoint; bool posisfinite; friend class Scene; }; } // namespace rgl #endif // LIGHT_HPP rgl/src/Device.hpp0000644000176000001440000000410012262005307013555 0ustar ripleyusers#ifndef RGL_DEVICE_HPP #define RGL_DEVICE_HPP // C++ header file // This file is part of RGL // // $Id: Device.hpp 976 2013-10-04 15:06:19Z murdoch $ #include "Disposable.hpp" #include "types.h" #include "rglview.h" namespace rgl { // // class Device // // - display device title // - setup the view matrix container (rows and columns of views) // - setup the view/scene relation (scene per view -or- shared scene) // - manages current view // - dispatches scene services to current view's scene // class Device : public Disposable, protected IDisposeListener { public: // -- all methods are blocking until action completed Device(int id, bool useNULL); virtual ~Device(); int getID(); void setName(const char* string); bool open(void); // -- if failed, instance is invalid and should be deleted void close(void); // -- when done, instance is invalid and should be deleted bool snapshot(int format, const char* filename); bool pixels(int* ll, int* size, int component, float* result); bool postscript(int format, const char* filename, bool drawText); bool clear(TypeID stackTypeID); int add(SceneNode* node); // -- return a unique id if successful, or zero if not bool pop(TypeID stackTypeID, int id); // accessor method for Scene, modeled after getBoundingBox() // from scene.h Scene* getScene() const { return scene; } void bringToTop(int stay); RGLView* getRGLView(void); int getIgnoreExtent(void); void setIgnoreExtent(int in_ignoreExtent); int getSkipRedraw(void); void setSkipRedraw(int in_skipRedraw); void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void getFonts(FontArray& outfonts, int nfonts, char** family, int* style, double* cex, bool useFreeType); const char* getDevtype(void); // event handlers protected: void notifyDisposed(Disposable* disposable); private: void update(void); Window* window; RGLView* rglview; Scene* scene; const char* devtype; int id_; }; } // namespace rgl #endif // RGL_DEVICE_HPP rgl/src/QuadSet.cpp0000644000176000001440000000103512262026246013730 0ustar ripleyusers#include "PrimitiveSet.hpp" using namespace rgl; #if 0 ////////////////////////////////////////////////////////////////////////////// // // CLASS // QuadSet // QuadSet::QuadSet(Material& in_material, int in_nelements, double* in_vertex) : FaceSet(in_material, in_nelements, in_vertex) { if (material.lit) { normalArray.alloc(nvertices); for (int i=0;i #include #include "assert.hpp" #include "R.h" #include #include namespace rgl { extern int gInitValue; extern HANDLE gHandle; extern SEXP rglNamespace; static WNDPROC gDefWindowProc; static HWND gMDIClientHandle = 0; static HWND gMDIFrameHandle = 0; // describe requirements static const PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 1, // version number 0 | PFD_DRAW_TO_WINDOW // support window | PFD_SUPPORT_OPENGL // support OpenGL | PFD_GENERIC_FORMAT // generic format | PFD_DOUBLEBUFFER // double buffered , PFD_TYPE_RGBA, // RGBA type 16, // 16-bit color depth 0, 0, 0, 0, 0, 0, // color bits ignored 1, // alpha buffer 0, // shift bit ignored 0, // no accumulation buffer 0, 0, 0, 0, // accum bits ignored 16, // 16-bit z-buffer 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0 // layer masks ignored }; // --------------------------------------------------------------------------- // // translate keycode // // --------------------------------------------------------------------------- static int translate_key(int wParam) { if ( (wParam >= VK_F1) && (wParam <= VK_F12) ) { return ( GUI_KeyF1 + (wParam - VK_F1) ); } else { switch(wParam) { case VK_UP: return GUI_KeyUp; case VK_DOWN: return GUI_KeyDown; case VK_LEFT: return GUI_KeyLeft; case VK_RIGHT: return GUI_KeyRight; case VK_INSERT: return GUI_KeyInsert; case VK_ESCAPE: return GUI_KeyESC; default: return 0; } } } // --------------------------------------------------------------------------- class Win32WindowImpl : public WindowImpl { public: Win32WindowImpl(Window* in_window); ~Win32WindowImpl(); void setTitle(const char* title); void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void show(); void hide(); int isTopmost(HWND handle); void bringToTop(int stay); void update(); void destroy(); void captureMouse(View* pView); void releaseMouse(); GLFont* getFont(const char* family, int style, double cex, bool useFreeType); private: LRESULT processMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static bool registerClass(); static void unregisterClass(); static LRESULT CALLBACK delegateWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK windowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static ATOM classAtom; HWND windowHandle; View* captureView; bool painting; // window is currently busy painting bool autoUpdate; // update/refresh automatically bool refreshMenu; // need to tell Windows to update the menu #if defined(WGL_ARB_pixel_format) && !defined(WGL_WGLEXT_PROTOTYPES) PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; #endif friend class Win32GUIFactory; public: bool beginGL(); void endGL(); void swap(); private: bool initGL(); void shutdownGL(); GLBitmapFont* initGLBitmapFont(u8 firstGlyph, u8 lastGlyph); HDC dcHandle; // temporary variable setup by lock HGLRC glrcHandle; }; } // namespace rgl using namespace rgl; // ---------------------------------------------------------------------------- // constructor // ---------------------------------------------------------------------------- Win32WindowImpl::Win32WindowImpl(Window* in_window) : WindowImpl(in_window) { windowHandle = NULL; captureView = NULL; dcHandle = NULL; glrcHandle = NULL; painting = false; autoUpdate = false; refreshMenu = false; } Win32WindowImpl::~Win32WindowImpl() { beginGL(); for (unsigned int i=0; i < fonts.size(); i++) { delete fonts[i]; } endGL(); } void Win32WindowImpl::setTitle(const char* title) { SetWindowText(windowHandle, title); } void Win32WindowImpl::setWindowRect(int left, int top, int right, int bottom) { if (windowHandle) { RECT rect; rect.left = left; rect.top = top; rect.right = right; rect.bottom = bottom; // Specification gives the desired client coordinates; expand to include the frame AdjustWindowRectEx(&rect, GetWindowLong(windowHandle, GWL_STYLE), FALSE, GetWindowLong(windowHandle, GWL_EXSTYLE)); MoveWindow(windowHandle, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE); } } void Win32WindowImpl::getWindowRect(int *left, int *top, int *right, int *bottom) { if (windowHandle) { RECT rect; GetClientRect(windowHandle, &rect); ClientToScreen(windowHandle, (LPPOINT)&rect.left); ClientToScreen(windowHandle, (LPPOINT)&rect.right); // Rect is now in screen coordinates; convert to parent client area coordinates // for MDI HWND parent = GetParent(windowHandle); if (parent) { ScreenToClient(parent, (LPPOINT)&rect.left); ScreenToClient(parent, (LPPOINT)&rect.right); } *left = rect.left; *top = rect.top; *right = rect.right; *bottom = rect.bottom; } } void Win32WindowImpl::show() { if (windowHandle) { // ShowWindow is required in SDI to show the window once // (otherwise to update takes place) ShowWindow(windowHandle, SW_SHOW); SetWindowPos( windowHandle ,HWND_TOP ,0,0,0,0 ,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE ); update(); } else printMessage("window not bound"); } void Win32WindowImpl::hide() { if (windowHandle) { ShowWindow(windowHandle, SW_HIDE); } } int Win32WindowImpl::isTopmost(HWND handle) { return GetWindowLong(handle, GWL_EXSTYLE) & WS_EX_TOPMOST; } void Win32WindowImpl::bringToTop(int stay) /* stay=0 for regular, 1 for topmost, 2 for toggle */ { if (windowHandle) { SetForegroundWindow(windowHandle); /* needed in Rterm */ BringWindowToTop(windowHandle); /* needed in Rgui --mdi */ if (stay == 2) stay = !isTopmost(windowHandle); if (stay) SetWindowPos( windowHandle , HWND_TOPMOST , 0, 0, 0, 0 , SWP_NOMOVE | SWP_NOSIZE ); else SetWindowPos(windowHandle , HWND_NOTOPMOST , 0, 0, 0, 0 , SWP_NOMOVE | SWP_NOSIZE ); } else printMessage("window not bound"); } void Win32WindowImpl::update() { InvalidateRect(windowHandle, NULL, false); SAVEGLERROR; UpdateWindow(windowHandle); SAVEGLERROR; } void Win32WindowImpl::destroy() { if (gHandle) SendMessage(gMDIClientHandle, WM_MDIDESTROY, (WPARAM) windowHandle, 0); else DestroyWindow(windowHandle); } bool Win32WindowImpl::beginGL() { dcHandle = GetDC(windowHandle); if (wglMakeCurrent( dcHandle, glrcHandle )) return true; else return false; } void Win32WindowImpl::endGL() { ReleaseDC(windowHandle, dcHandle); } void Win32WindowImpl::swap() { dcHandle = GetDC(windowHandle); SwapBuffers(dcHandle); ReleaseDC(windowHandle, dcHandle); } void Win32WindowImpl::captureMouse(View* inCaptureView) { captureView = inCaptureView; SetCapture(windowHandle); } void Win32WindowImpl::releaseMouse(void) { captureView = NULL; ReleaseCapture(); } bool Win32WindowImpl::initGL () { bool success = false; // obtain a device context for the window dcHandle = GetDC(windowHandle); if (dcHandle) { int iPixelFormat; #ifdef WGL_ARB_pixel_format // Setup antialiasing based on "rgl.antialias" option int aa; SEXP rgl_aa = GetOption(install("rgl.antialias"),R_BaseEnv); if (isNull(rgl_aa)) aa = RGL_ANTIALIAS; else aa = asInteger(rgl_aa); if (aa > 0) { float fAttributes[] = { 0, 0 }; int iAttributes[] = { WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_SUPPORT_OPENGL_ARB, GL_TRUE, WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, WGL_COLOR_BITS_ARB, 24, WGL_ALPHA_BITS_ARB, 8, WGL_DEPTH_BITS_ARB, 16, WGL_STENCIL_BITS_ARB, 0, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, WGL_SAMPLES_ARB, aa, 0, 0 }; UINT numFormats = 0; if (!wglChoosePixelFormatARB || !wglChoosePixelFormatARB(dcHandle, iAttributes, fAttributes, 1, &iPixelFormat, &numFormats) || numFormats < 1) { iPixelFormat = ChoosePixelFormat(dcHandle, &pfd); } } else #endif // get the device context's best, available pixel format match iPixelFormat = ChoosePixelFormat(dcHandle, &pfd); if (iPixelFormat != 0) { // make that match the device context's current pixel format SetPixelFormat(dcHandle, iPixelFormat, &pfd); // create GL context if ( ( glrcHandle = wglCreateContext( dcHandle ) ) ) success = true; else printMessage("wglCreateContext failed"); } else printMessage("iPixelFormat == 0!"); ReleaseDC(windowHandle,dcHandle); } return success; } void Win32WindowImpl::shutdownGL() { dcHandle = GetDC(windowHandle); wglMakeCurrent(NULL,NULL); ReleaseDC(windowHandle, dcHandle); wglDeleteContext(glrcHandle); } GLFont* Win32WindowImpl::getFont(const char* family, int style, double cex, bool useFreeType) { for (unsigned int i=0; i < fonts.size(); i++) { if (fonts[i]->cex == cex && fonts[i]->style == style && !strcmp(fonts[i]->family, family) && fonts[i]->useFreeType == useFreeType) return fonts[i]; } if (!useFreeType) { // Not found, so create it. This is based on code from graphapp gdraw.c if (strcmp(family, "NA") && beginGL()) { // User passes NA_character_ for default, looks like "NA" here SEXP Rfontname = VECTOR_ELT(PROTECT(eval(lang2(install("windowsFonts"), ScalarString(mkChar(family))), rglNamespace)), 0); if (isString(Rfontname)) { const char* fontname = CHAR(STRING_ELT(Rfontname, 0)); GLBitmapFont* font = new GLBitmapFont(family, style, cex, fontname); HFONT hf; LOGFONT lf; double size = 12*cex + 0.5; lf.lfHeight = -MulDiv(size, GetDeviceCaps(dcHandle, LOGPIXELSY), 72); lf.lfWidth = 0 ; lf.lfEscapement = lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0; if ((! strcmp(fontname, "Symbol")) || (! strcmp(fontname, "Wingdings"))) lf.lfCharSet = SYMBOL_CHARSET; else lf.lfCharSet = DEFAULT_CHARSET; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; if ((strlen(fontname) > 1) && (fontname[0] == 'T') && (fontname[1] == 'T')) { const char *pf; lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; for (pf = &fontname[2]; isspace(*pf) ; pf++); strncpy(lf.lfFaceName, pf, LF_FACESIZE-1); } else { lf.lfOutPrecision = OUT_DEFAULT_PRECIS; strncpy(lf.lfFaceName, fontname, LF_FACESIZE-1); } if (style == 2 || style == 4) lf.lfWeight = FW_BOLD; if (style == 3 || style == 4) lf.lfItalic = 1; if ((hf = CreateFontIndirect(&lf))) { SelectObject (dcHandle, hf ); font->nglyph = GL_BITMAP_FONT_LAST_GLYPH - GL_BITMAP_FONT_FIRST_GLYPH + 1; font->widths = new unsigned int [font->nglyph]; GLuint listBase = glGenLists(font->nglyph); font->firstGlyph = GL_BITMAP_FONT_FIRST_GLYPH; font->listBase = listBase - font->firstGlyph; GetCharWidth32( dcHandle, font->firstGlyph, GL_BITMAP_FONT_LAST_GLYPH, (LPINT) font->widths ); { TEXTMETRIC tm; GetTextMetrics( dcHandle, &tm); font->ascent = tm.tmAscent; } wglUseFontBitmaps(dcHandle, font->firstGlyph, font->nglyph, listBase); DeleteObject( hf ); endGL(); fonts.push_back(font); UNPROTECT(1); return font; } delete font; endGL(); } UNPROTECT(1); } } else { // useFreeType #ifdef HAVE_FREETYPE char fontname_absolute[MAX_PATH+1] = ""; int len=0; SEXP Rfontname = VECTOR_ELT(PROTECT(eval(lang2(install("rglFonts"), ScalarString(mkChar(family))), rglNamespace)), 0); if (isString(Rfontname) && length(Rfontname) >= style) { const char* fontname = CHAR(STRING_ELT(Rfontname, style-1)); if (!IS_ABSOLUTE_PATH(fontname)) { LPITEMIDLIST pidlFonts; assert(SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_FONTS, &pidlFonts)) && SUCCEEDED(SHGetPathFromIDList(pidlFonts, fontname_absolute)) ); len = strlen(fontname_absolute); if (len && fontname_absolute[len-1] != '\\') { strcat(fontname_absolute, "\\"); len++; } } assert(len + strlen(fontname) <= MAX_PATH); strcat(fontname_absolute, fontname); GLFTFont* font=new GLFTFont(family, style, cex, fontname_absolute); if (font->font) { fonts.push_back(font); UNPROTECT(1); return font; } else { warning(font->errmsg); delete font; } } UNPROTECT(1); #endif } if (strcmp(family, fonts[0]->family)) warning("font family \"%s\" not found, using \"%s\"", family, fonts[0]->family); else if (style != fonts[0]->style) warning("\"%s\" family only supports font %d", fonts[0]->family, fonts[0]->style); else if (cex != fonts[0]->cex) warning("\"%s\" family only supports cex = %g", fonts[0]->family, fonts[0]->cex); else if (useFreeType) warning("FreeType font not available"); return fonts[0]; } GLBitmapFont* Win32WindowImpl::initGLBitmapFont(u8 firstGlyph, u8 lastGlyph) { GLBitmapFont* font = NULL; if (beginGL()) { font = new GLBitmapFont("bitmap", 1, 1, "System"); SelectObject (dcHandle, GetStockObject (SYSTEM_FONT) ); font->nglyph = lastGlyph-firstGlyph+1; font->widths = new unsigned int [font->nglyph]; GLuint listBase = glGenLists(font->nglyph); font->firstGlyph = firstGlyph; font->listBase = listBase - firstGlyph; GetCharWidth32( dcHandle, font->firstGlyph, lastGlyph, (LPINT) font->widths ); { TEXTMETRIC tm; GetTextMetrics( dcHandle, &tm); font->ascent = tm.tmAscent; } wglUseFontBitmaps(dcHandle, font->firstGlyph, font->nglyph, listBase); endGL(); } return font; } LRESULT Win32WindowImpl::processMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT returnValue = 0; switch(message) { case WM_CREATE: windowHandle = hwnd; initGL(); fonts[0] = initGLBitmapFont(GL_BITMAP_FONT_FIRST_GLYPH, GL_BITMAP_FONT_LAST_GLYPH); if (gHandle) { refreshMenu = true; } break; case WM_SHOWWINDOW: if ( ( (BOOL) wParam ) == TRUE ) { window->show(); autoUpdate = true; } else { window->hide(); autoUpdate = false; } break; case WM_PAINT: // Warning: don't put Rprintf calls in paint/render/draw methods, or you get a permanent loop! if (!painting) { painting = true; if (refreshMenu) { SendMessage(gMDIClientHandle, WM_MDIREFRESHMENU, 0, 0); DrawMenuBar(gMDIFrameHandle); refreshMenu = false; } if (!window->skipRedraw) { window->paint(); swap(); } ValidateRect(hwnd, NULL); painting = false; } break; case WM_SIZE: window->resize(LOWORD(lParam), HIWORD(lParam)); if (gHandle) return gDefWindowProc(hwnd,message,wParam,lParam); else break; case WM_CLOSE: window->on_close(); break; case WM_KEYDOWN: if (int keycode = translate_key(wParam) ) { window->keyPress(keycode); } else return -1; case WM_CHAR: window->keyPress( (int) ( (char) wParam ) ); break; case WM_LBUTTONDOWN: ( (captureView) ? captureView : window ) -> buttonPress(GUI_ButtonLeft, (short) LOWORD(lParam), (short) HIWORD(lParam) ); break; case WM_LBUTTONUP: ( (captureView) ? captureView : window ) -> buttonRelease(GUI_ButtonLeft, (short) LOWORD(lParam), (short) HIWORD(lParam)); break; case WM_RBUTTONDOWN: ( (captureView) ? captureView : window ) -> buttonPress(GUI_ButtonRight,(short) LOWORD(lParam), (short) HIWORD(lParam) ); break; case WM_RBUTTONUP: ( (captureView) ? captureView : window ) -> buttonRelease(GUI_ButtonRight,(short) LOWORD(lParam), (short) HIWORD(lParam) ); break; case WM_MBUTTONDOWN: ( (captureView) ? captureView : window ) -> buttonPress(GUI_ButtonMiddle, (short) LOWORD(lParam), (short) HIWORD(lParam) ); break; case WM_MBUTTONUP: ( (captureView) ? captureView : window ) -> buttonRelease(GUI_ButtonMiddle, (short) LOWORD(lParam), (short) HIWORD(lParam) ); break; #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) case WM_MOUSEWHEEL: { int dir = ( (short) HIWORD(wParam) > 0 ) ? GUI_WheelForward : GUI_WheelBackward; ( (captureView) ? captureView : window ) -> wheelRotate(dir); break; } #endif case WM_MOUSEMOVE: ( (captureView) ? captureView : window ) -> mouseMove( ( (short) LOWORD(lParam) ), ( (short) HIWORD(lParam) ) ); break; case WM_CAPTURECHANGED: if (captureView) { captureView->captureLost(); captureView = NULL; } break; case WM_DESTROY: shutdownGL(); #if defined (WIN64) || defined(_MSC_VER) SetWindowLongPtr(hwnd, GWLP_USERDATA, (long)NULL); #else SetWindowLong(hwnd, GWL_USERDATA, (LONG) NULL ); #endif if (window) window->notifyDestroy(); delete this; break; default: return gDefWindowProc(hwnd,message,wParam,lParam); } return returnValue; } // static LRESULT CALLBACK Win32WindowImpl::delegateWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { #if defined (WIN64) || defined(_MSC_VER) Win32WindowImpl* windowImpl = (Win32WindowImpl*) GetWindowLongPtr(hwnd, GWLP_USERDATA); #else Win32WindowImpl* windowImpl = (Win32WindowImpl*) GetWindowLong(hwnd, GWL_USERDATA); #endif return windowImpl->processMessage(hwnd, message, wParam, lParam); } // static LRESULT CALLBACK Win32WindowImpl::windowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_CREATE) { Win32WindowImpl* windowImpl; LPCREATESTRUCT pCreateStruct = reinterpret_cast(lParam); if (gHandle) { LPMDICREATESTRUCT pMDICreateStruct = reinterpret_cast(pCreateStruct->lpCreateParams); windowImpl = reinterpret_cast( pMDICreateStruct->lParam ); } else { windowImpl = reinterpret_cast( pCreateStruct->lpCreateParams ); } if (windowImpl) { #if defined (WIN64) || defined(_MSC_VER) SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)windowImpl ); SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) delegateWindowProc ); #else SetWindowLong(hwnd, GWL_USERDATA, (long) windowImpl ); SetWindowLong(hwnd, GWL_WNDPROC, (long) delegateWindowProc ); #endif return windowImpl->processMessage(hwnd, message, wParam, lParam); } } return gDefWindowProc(hwnd, message, wParam, lParam); } // static bool Win32WindowImpl::registerClass() { WNDCLASSEX wcex; ZeroMemory( &wcex, sizeof(WNDCLASSEX) ); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wcex.lpfnWndProc = (WNDPROC) windowProc; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.lpszClassName = "RGLDevice"; classAtom = RegisterClassEx(&wcex); return (classAtom) ? true : false; } // static void Win32WindowImpl::unregisterClass(void) { if (classAtom) UnregisterClass(MAKEINTATOM(classAtom), NULL ); } // static ATOM Win32WindowImpl::classAtom = (ATOM) NULL; // --------------------------------------------------------------------------- // // Win32GUIFactory class // // --------------------------------------------------------------------------- Win32GUIFactory::Win32GUIFactory() #if defined(WGL_ARB_pixel_format) && !defined(WGL_WGLEXT_PROTOTYPES) : wglChoosePixelFormatARB(NULL) #endif { if (gInitValue) { // we must be running in pre-2.6.0 R gHandle = reinterpret_cast(gInitValue); } if (gHandle) { // the handle is given for the console window, so that // client and frame windows can be derived HWND consoleHandle = reinterpret_cast(gHandle); gMDIClientHandle = GetParent(consoleHandle); gMDIFrameHandle = GetParent(gMDIClientHandle); gDefWindowProc = &DefMDIChildProc; } else gDefWindowProc = &DefWindowProc; if ( !Win32WindowImpl::registerClass() ) error("window class registration failed"); #if defined(WGL_ARB_pixel_format) && !defined(WGL_WGLEXT_PROTOTYPES) HANDLE saveHandle = gHandle; gHandle = NULL; /* call below fails for MDI windows */ // wglGetProcAddress needs to be called within valid GL context, we need to create dummy window here HWND windowHandle = CreateWindow(MAKEINTATOM(Win32WindowImpl::classAtom), "", WS_POPUP | WS_DISABLED, 0, 0, 10, 10, NULL, NULL, NULL, NULL); if (windowHandle) { HDC dcHandle = GetDC(windowHandle); if (dcHandle) { int iPixelFormat = ChoosePixelFormat(dcHandle, &pfd); if (iPixelFormat != 0) { SetPixelFormat(dcHandle, iPixelFormat, &pfd); HGLRC glrcHandle = wglCreateContext(dcHandle); if (glrcHandle) { wglMakeCurrent(dcHandle, glrcHandle); wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); wglMakeCurrent(NULL, NULL); wglDeleteContext(glrcHandle); } } ReleaseDC(windowHandle, dcHandle); } DestroyWindow(windowHandle); } gHandle = saveHandle; #endif } // --------------------------------------------------------------------------- Win32GUIFactory::~Win32GUIFactory() { Win32WindowImpl::unregisterClass(); } // --------------------------------------------------------------------------- WindowImpl* Win32GUIFactory::createWindowImpl(Window* in_window) { Win32WindowImpl* impl = new Win32WindowImpl(in_window); #if defined(WGL_ARB_pixel_format) && !defined(WGL_WGLEXT_PROTOTYPES) impl->wglChoosePixelFormatARB = wglChoosePixelFormatARB; #endif RECT size; size.left = 0; size.right = in_window->width-1; size.top = 0; size.bottom = in_window->height-1; AdjustWindowRect( &size , WS_OVERLAPPEDWINDOW // WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX , false // no menu ); HWND success = 0; if (gHandle) { success = CreateMDIWindow( MAKEINTATOM(Win32WindowImpl::classAtom) , in_window->title , MDIS_ALLCHILDSTYLES|WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, 0 , size.right- size.left+1, size.bottom - size.top+1 , gMDIClientHandle, NULL // GetModuleHandle(NULL) , reinterpret_cast(impl) ); } else { success = CreateWindow( MAKEINTATOM(Win32WindowImpl::classAtom) , in_window->title , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, 0 , size.right- size.left+1, size.bottom - size.top+1 , NULL, NULL, NULL , reinterpret_cast(impl) ); } if (!success) error("window creation failed"); return impl; } // --------------------------------------------------------------------------- #endif // RGL_W32 rgl/src/osx/0000755000176000001440000000000012262025370012465 5ustar ripleyusersrgl/src/osx/osxgui.hpp0000644000176000001440000000102212262005307014505 0ustar ripleyusers#ifndef RGL_OSX_GUI_HPP #define RGL_OSX_GUI_HPP // --------------------------------------------------------------------------- #include "../gui.hpp" // --------------------------------------------------------------------------- namespace rgl { class OSXGUIFactory : public GUIFactory { public: OSXGUIFactory(); ~OSXGUIFactory(); WindowImpl* createWindowImpl(Window* w); bool hasEventLoop(); }; } // namespace rgl // --------------------------------------------------------------------------- #endif // RGL_OSX_GUI_HPP rgl/src/osx/osxgui.mm0000644000176000001440000003503512262005307014342 0ustar ripleyusers#include "../config.hpp" // --------------------------------------------------------------------------- #ifdef RGL_COCOA /** * TODO - get font width **/ #ifndef HAVE_FREETYPE #error Cocoa backend reguires FreeType font render #endif // --------------------------------------------------------------------------- #include "osxgui.hpp" #include "../lib.hpp" // --------------------------------------------------------------------------- #include #include "../opengl.hpp" #include "../assert.hpp" #include "../R.h" #include // --------------------------------------------------------------------------- // configuration // --------------------------------------------------------------------------- #define EMULATE_RIGHT_KEYMOD NSControlKeyMask #define EMULATE_MIDDLE_KEYMOD NSAlternateKeyMask // --------------------------------------------------------------------------- namespace rgl { extern SEXP rglNamespace; // --------------------------------------------------------------------------- class OSXWindowImpl : public WindowImpl { public: OSXWindowImpl(Window* window); ~OSXWindowImpl(); void setTitle(const char* title); void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void show(); void hide() { } void update(); void bringToTop(int stay); void destroy(); bool beginGL(); void endGL(); void swap(); void captureMouse(View* captureView) { } void releaseMouse(void) { } GLFont* getFont(const char* family, int style, double cex, bool useFreeType); // events received from GL Cocoa class void on_dealloc(); void on_paint(); void on_resize(int width, int height); void on_buttonPress(int button, int x, int y); void on_buttonRelease(int button, int x, int y); void on_mouseMove(int x, int y); void on_wheelRotate(int wheel); void on_keyDown(unichar c); int translate_key(unichar c); private: NSWindow *osxWindow; }; // --------------------------------------------------------------------------- } // --------------------------------------------------------------------------- // interfaces // --------------------------------------------------------------------------- @interface GLView : NSOpenGLView { rgl::OSXWindowImpl *impl; NSUInteger lastModifierFlags; } - (id)initWithFrame:(NSRect)frame pixelFormat:(NSOpenGLPixelFormat *)pixelFormat impl:(rgl::OSXWindowImpl *)impl; @end // --------------------------------------------------------------------------- namespace rgl { // --------------------------------------------------------------------------- OSXWindowImpl::OSXWindowImpl(Window* window) : WindowImpl(window) { NSOpenGLPixelFormatAttribute attributes[] = { NSOpenGLPFAWindow, NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 32, NSOpenGLPFADepthSize, 32, 0, 0, 0, 0, 0, 0 }; // Setup antialiasing based on "rgl.antialias" option SEXP rgl_aa = GetOption(install("rgl.antialias"),R_BaseEnv); int aa; if (isNull(rgl_aa)) aa = RGL_ANTIALIAS; else aa = asInteger(rgl_aa); if(aa > 0) { attributes[6] = NSOpenGLPFAMultisample; attributes[7] = NSOpenGLPFASampleBuffers; attributes[8] = (NSOpenGLPixelFormatAttribute)1; attributes[9] = NSOpenGLPFASamples; attributes[10] = (NSOpenGLPixelFormatAttribute)aa; } NSRect frame = NSMakeRect(100, 100, 256, 256); NSRect bounds = NSMakeRect(0, 0, 256, 256); NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; // Try to set up pixel format without MSAA if it failed if(!pixelFormat && aa > 0) { attributes[6] = 0; pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; // if(pixelFormat) warning("MSAA %dx not supported, lower or disable \"rgl.aa\"", aa); } if(!pixelFormat) { error("no suitable pixel format available"); return; } GLView *view = [[GLView alloc] initWithFrame:bounds pixelFormat:pixelFormat impl:this]; [pixelFormat release]; osxWindow = [[NSWindow alloc] initWithContentRect:frame styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; [osxWindow setContentView:view]; [osxWindow makeFirstResponder:view]; [osxWindow setReleasedWhenClosed:YES]; [view release]; #ifdef HAVE_FREETYPE // Determine path to system font NSFont *font = [NSFont systemFontOfSize:12.0]; CTFontDescriptorRef fontRef = CTFontDescriptorCreateWithNameAndSize((CFStringRef)[font fontName], [font pointSize]); // kCTFontURLAttribute is present only in 10.6 API, but works in 10.5, otherwise we fallback to built-in path CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fontRef, CFSTR("kCTFontURLAttribute")); fonts[0] = new GLFTFont("Lucida Grande", 0, 12, url ? [[(NSURL *)url path] UTF8String] : "/System/Library/Fonts/LucidaGrande.dfont"); if(url) CFRelease(url); CFRelease(fontRef); #endif } // --------------------------------------------------------------------------- OSXWindowImpl::~OSXWindowImpl() { } // --------------------------------------------------------------------------- void OSXWindowImpl::setTitle(const char *text) { NSString *title = [[NSString alloc] initWithUTF8String:text]; [osxWindow setTitle:title]; [title release]; } // --------------------------------------------------------------------------- void OSXWindowImpl::setWindowRect(int left, int top, int right, int bottom) { NSRect frame = NSMakeRect(left, top, right - left, bottom - top); [osxWindow setFrame:frame display:YES]; } // --------------------------------------------------------------------------- void OSXWindowImpl::getWindowRect(int *left, int *top, int *right, int *bottom) { NSRect frame = [osxWindow frame]; if(left) *left = frame.origin.x; if(top) *top = frame.origin.y; if(right) *right = frame.origin.x + frame.size.width; if(bottom) *bottom = frame.origin.y + frame.size.height; } // --------------------------------------------------------------------------- void OSXWindowImpl::destroy() { } // --------------------------------------------------------------------------- GLFont* OSXWindowImpl::getFont(const char* family, int style, double cex, bool useFreeType) { for (unsigned int i=0; i < fonts.size(); i++) { if (fonts[i]->cex == cex && fonts[i]->style == style && !strcmp(fonts[i]->family, family) && fonts[i]->useFreeType == useFreeType) return fonts[i]; } if (useFreeType) { #ifdef HAVE_FREETYPE int len=0; SEXP Rfontname = VECTOR_ELT(PROTECT(eval(lang2(install("rglFonts"), ScalarString(mkChar(family))), rglNamespace)), 0); if (isString(Rfontname) && length(Rfontname) >= style) { const char* fontname = CHAR(STRING_ELT(Rfontname, style-1)); GLFTFont* font=new GLFTFont(family, style, cex, fontname); if (font->font) { fonts.push_back(font); UNPROTECT(1); return font; } else { warning(font->errmsg); delete font; } } UNPROTECT(1); #endif } if (strcmp(family, fonts[0]->family)) warning("font family \"%s\" not found, using \"%s\"", family, fonts[0]->family); else if (style != fonts[0]->style) warning("\"%s\" family only supports font %d", fonts[0]->family, fonts[0]->style); else if (cex != fonts[0]->cex) warning("\"%s\" family only supports cex = %g", fonts[0]->family, fonts[0]->cex); else if (useFreeType) warning("FreeType font not available"); return fonts[0]; } // --------------------------------------------------------------------------- void OSXWindowImpl::swap() { [[(NSOpenGLView *)[osxWindow contentView] openGLContext] flushBuffer]; } // --------------------------------------------------------------------------- bool OSXWindowImpl::beginGL() { return true; } // --------------------------------------------------------------------------- void OSXWindowImpl::endGL() { } // --------------------------------------------------------------------------- void OSXWindowImpl::update() { #if 1 // Draw rect should be called directly here if we want immediate result [[osxWindow contentView] drawRect:NSZeroRect]; #else [[osxWindow contentView] setNeedsDisplay:YES]; #endif } // --------------------------------------------------------------------------- void OSXWindowImpl::show() { [osxWindow makeKeyAndOrderFront:nil]; } // --------------------------------------------------------------------------- void OSXWindowImpl::bringToTop(int stay) { [osxWindow makeKeyAndOrderFront:nil]; } // --------------------------------------------------------------------------- void OSXWindowImpl::on_dealloc() { if (window) window->notifyDestroy(); delete this; } // --------------------------------------------------------------------------- void OSXWindowImpl::on_paint() { if (window && !window->skipRedraw) window->paint(); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_resize(int width, int height) { if (window) window->resize(width, height); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_buttonPress(int button, int x, int y) { if (window) window->buttonPress(button, x, y); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_buttonRelease(int button, int x, int y) { if (window) window->buttonRelease(button, x, y); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_mouseMove(int x, int y) { if (window) window->mouseMove(x, y); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_wheelRotate(int wheel) { if (window) window->wheelRotate(wheel); } // --------------------------------------------------------------------------- void OSXWindowImpl::on_keyDown(unichar c) { int key = translate_key(c); if (key && window) window->keyPress(key); } // --------------------------------------------------------------------------- int OSXWindowImpl::translate_key(unichar c) { if (c == 27) return GUI_KeyESC; else return 0; } // GUI Factory // --------------------------------------------------------------------------- OSXGUIFactory::OSXGUIFactory() { } // --------------------------------------------------------------------------- OSXGUIFactory::~OSXGUIFactory() { } // --------------------------------------------------------------------------- WindowImpl* OSXGUIFactory::createWindowImpl(Window* window) { return new OSXWindowImpl(window); } // --------------------------------------------------------------------------- extern int gInitValue; bool OSXGUIFactory::hasEventLoop() { return gInitValue != 0; } // --------------------------------------------------------------------------- } // namespace rgl // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // implementation // --------------------------------------------------------------------------- @implementation GLView - (id)initWithFrame:(NSRect)frame pixelFormat:(NSOpenGLPixelFormat *)pixelFormat impl:(rgl::OSXWindowImpl *)windowImpl { if ((self = [super initWithFrame:frame pixelFormat:pixelFormat])) { impl = windowImpl; } return self; } - (void)dealloc { if (impl) impl->on_dealloc(); [super dealloc]; } - (void)drawRect:(NSRect)theRect { [[self openGLContext] makeCurrentContext]; if (impl) impl->on_paint(); [[self openGLContext] flushBuffer]; } - (void)update { [super update]; if (impl) { NSRect frame = [self frame]; impl->on_resize(frame.size.width, frame.size.height); } } - (void)reshape { [super reshape]; if (impl) { NSRect frame = [self frame]; impl->on_resize(frame.size.width, frame.size.height); } } - (NSPoint)pointForEvent:(NSEvent *)event { NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil]; NSRect bounds = [self bounds]; // OpenGL y axis is reversed here point.y = bounds.size.height - point.y; return point; } - (int)buttonFromModifierFlags:(NSUInteger)modifierFlags { if((modifierFlags & EMULATE_RIGHT_KEYMOD) != 0) { return rgl::GUI_ButtonRight; } else if((modifierFlags & EMULATE_MIDDLE_KEYMOD) != 0) { return rgl::GUI_ButtonMiddle; } return rgl::GUI_ButtonLeft; } - (void)scrollWheel:(NSEvent *)event { if (impl) { CGFloat delta = [event deltaY]; if(delta != 0.0) impl->on_wheelRotate(delta > 0.0 ? rgl::GUI_WheelForward : rgl::GUI_WheelBackward); } } - (void)keyDown:(NSEvent *)event { if (impl) { unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; impl->on_keyDown(c); } } - (void)mouseDown:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; lastModifierFlags = [event modifierFlags]; impl->on_buttonPress([self buttonFromModifierFlags:lastModifierFlags], point.x, point.y); } } - (void)mouseUp:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_buttonRelease([self buttonFromModifierFlags:lastModifierFlags], point.x, point.y); } } - (void)mouseDragged:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_mouseMove(point.x, point.y); } } - (void)rightMouseDown:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_buttonPress(rgl::GUI_ButtonRight, point.x, point.y); } } - (void)rightMouseUp:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_buttonRelease(rgl::GUI_ButtonRight, point.x, point.y); } } - (void)rightMouseDragged:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_mouseMove(point.x, point.y); } } - (void)otherMouseDown:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_buttonPress(rgl::GUI_ButtonMiddle, point.x, point.y); } } - (void)otherMouseUp:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_buttonRelease(rgl::GUI_ButtonMiddle, point.x, point.y); } } - (void)otherMouseDragged:(NSEvent *)event { if (impl) { NSPoint point = [self pointForEvent:event]; impl->on_mouseMove(point.x, point.y); } } @end #endif // RGL_COCOA rgl/src/osx/osxlib.cpp0000644000176000001440000000422412262026246014476 0ustar ripleyusers#include "../config.hpp" // --------------------------------------------------------------------------- #ifdef RGL_COCOA // --------------------------------------------------------------------------- #include "../lib.hpp" #include "../NULLgui.hpp" // --------------------------------------------------------------------------- #include "osxgui.hpp" // --------------------------------------------------------------------------- #include "../R.h" #include "../assert.hpp" // --------------------------------------------------------------------------- using namespace rgl; void rgl::printMessage(const char* message) { warning("RGL: %s\n", message); } // --------------------------------------------------------------------------- double rgl::getTime() { return 0.0; } // --------------------------------------------------------------------------- OSXGUIFactory* gGUIFactory = 0; NULLGUIFactory* gNULLFactory = 0; // --------------------------------------------------------------------------- GUIFactory* rgl::getGUIFactory(bool useNULLDevice) { if (useNULLDevice) return gNULLFactory; else if (gGUIFactory) return gGUIFactory; else error("NSOpenGL device not initialized"); } // --------------------------------------------------------------------------- const char * rgl::GUIFactoryName(bool useNULLDevice) { return useNULLDevice ? "null" : "NSOpenGL"; } // --------------------------------------------------------------------------- bool rgl::init(bool useNULLDevice) { bool success = false; gNULLFactory = new NULLGUIFactory(); if (useNULLDevice) { success = true; } else { gGUIFactory = new OSXGUIFactory(); if (!gGUIFactory->hasEventLoop()) { error("RGL: configured for Cocoa, must run in R.app"); } else success = true; } return success; } // --------------------------------------------------------------------------- void rgl::quit() { if (gGUIFactory) delete gGUIFactory; delete gNULLFactory; gGUIFactory = 0; gNULLFactory = 0; } // --------------------------------------------------------------------------- #endif // RGL_COCOA // --------------------------------------------------------------------------- rgl/src/scene.cpp0000644000176000001440000003672512262026246013475 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: scene.cpp 989 2013-10-26 15:00:21Z murdoch $ #include "gl2ps.h" #include "scene.h" #include "rglmath.h" #include "render.h" #include "geom.hpp" #include #include #include #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Scene // static int gl_light_ids[8] = { GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7 }; ObjID SceneNode::nextID = BBOXID + 1; Scene::Scene() { background = NULL; viewpoint = NULL; nlights = 0; bboxDeco = NULL; ignoreExtent = false; bboxChanges = false; add( new Background ); add( new Viewpoint ); add( new Light ); } Scene::~Scene() { clear(SHAPE); clear(LIGHT); clear(BBOXDECO); if (background) delete background; if (viewpoint) delete viewpoint; } Viewpoint* Scene::getViewpoint() { return viewpoint; } void Scene::deleteShapes() { std::vector::iterator iter; for (iter = shapes.begin(); iter != shapes.end(); ++iter) { delete *iter; } shapes.clear(); bboxChanges = false; } void Scene::deleteLights() { std::vector::iterator iter; for (iter = lights.begin(); iter != lights.end(); ++iter) { delete *iter; } lights.clear(); } bool Scene::clear(TypeID typeID) { bool success = false; switch(typeID) { case SHAPE: deleteShapes(); SAVEGLERROR; zsortShapes.clear(); SAVEGLERROR; unsortedShapes.clear(); SAVEGLERROR; clipPlanes.clear(); SAVEGLERROR; data_bbox.invalidate(); SAVEGLERROR; success = true; break; case LIGHT: deleteLights(); SAVEGLERROR; nlights = 0; success = true; break; case BBOXDECO: delete bboxDeco; SAVEGLERROR; bboxDeco = NULL; success = true; break; } return success; } void Scene::addShape(Shape* shape) { if (!shape->getIgnoreExtent()) { const AABox& bbox = shape->getBoundingBox(); data_bbox += bbox; bboxChanges |= shape->getBBoxChanges(); } shapes.push_back(shape); if ( shape->isBlended() ) { zsortShapes.push_back(shape); } else if ( shape->isClipPlane() ) { clipPlanes.push_back(shape); } else unsortedShapes.push_back(shape); } bool Scene::add(SceneNode* node) { bool success = false; switch( node->getTypeID() ) { case LIGHT: if (nlights < 8) { Light* light = (Light*) node; light->id = gl_light_ids[ nlights++ ]; lights.push_back( light ); success = true; } break; case SHAPE: { Shape* shape = (Shape*) node; addShape(shape); success = true; } break; case VIEWPOINT: { if (viewpoint) delete viewpoint; viewpoint = (Viewpoint*) node; success = true; } break; case BACKGROUND: { if (background) delete background; background = (Background*) node; success = true; } break; case BBOXDECO: { if (bboxDeco) delete bboxDeco; bboxDeco = (BBoxDeco*) node; success = true; } break; default: break; } return success; } bool Scene::pop(TypeID type, int id, bool destroy) { bool success = false; std::vector::iterator ishape; std::vector::iterator ilight; switch(type) { case SHAPE: { if (id == BBOXID) { type = BBOXDECO; id = 0; } else if (shapes.empty()) return false; break; } case LIGHT: if (lights.empty()) return false; default: break; } if (id == 0) { switch(type) { case SHAPE: ishape = shapes.end() - 1; id = (*ishape)->getObjID(); /* for zsort or unsort */ break; case LIGHT: ilight = lights.end() - 1; break; default: break; } } else { switch(type) { case SHAPE: ishape = std::find_if(shapes.begin(), shapes.end(), std::bind2nd(std::ptr_fun(&sameID), id)); if (ishape == shapes.end()) return false; break; case LIGHT: ilight = std::find_if(lights.begin(), lights.end(), std::bind2nd(std::ptr_fun(&sameID), id)); if (ilight == lights.end()) return false; break; default: return false; } } switch(type) { case SHAPE: { Shape* shape = *ishape; shapes.erase(ishape); if ( shape->isBlended() ) zsortShapes.erase(std::find_if(zsortShapes.begin(), zsortShapes.end(), std::bind2nd(std::ptr_fun(&sameID), id))); else if ( shape->isClipPlane() ) clipPlanes.erase(std::find_if(clipPlanes.begin(), clipPlanes.end(), std::bind2nd(std::ptr_fun(&sameID), id))); else unsortedShapes.erase(std::find_if(unsortedShapes.begin(), unsortedShapes.end(), std::bind2nd(std::ptr_fun(&sameID), id))); if (destroy) delete shape; calcDataBBox(); success = true; } break; case LIGHT: { Light* light = *ilight; lights.erase(ilight); if (destroy) delete light; nlights--; success = true; } break; case BBOXDECO: { if (bboxDeco) { if (destroy) delete bboxDeco; bboxDeco = NULL; success = true; } } break; default: // VIEWPOINT,BACKGROUND ignored break; } return success; } int Scene::get_id_count(TypeID type) { switch(type) { case SHAPE: return shapes.size(); case LIGHT: return lights.size(); case BBOXDECO: return bboxDeco ? 1 : 0; case VIEWPOINT: return viewpoint ? 1 : 0; case BACKGROUND: return background ? 1 : 0; default: return 0; } } void Scene::get_ids(TypeID type, int* ids, char** types) { char buffer[20]; switch(type) { case SHAPE: for (std::vector::iterator i = shapes.begin(); i != shapes.end() ; ++ i ) { *ids++ = (*i)->getObjID(); buffer[19] = 0; (*i)->getShapeName(buffer, 20); *types = R_alloc(strlen(buffer)+1, 1); strcpy(*types, buffer); types++; } return; case LIGHT: for (std::vector::iterator i = lights.begin(); i != lights.end() ; ++ i ) { *ids++ = (*i)->getObjID(); *types = R_alloc(strlen("light")+1, 1); strcpy(*types, "light"); types++; } return; case BBOXDECO: if (bboxDeco) { *ids = bboxDeco->getObjID(); *types = R_alloc(strlen("bboxdeco")+1, 1); strcpy(*types, "bboxdeco"); } return; case VIEWPOINT: if (viewpoint) { *ids = viewpoint->getObjID(); *types = R_alloc(strlen("viewpoint")+1, 1); strcpy(*types, "viewpoint"); } return; case BACKGROUND: if (background) { *ids = background->getObjID(); *types = R_alloc(strlen("background")+1, 1); strcpy(*types, "background"); } return; default: return; } } SceneNode* Scene::get_scenenode(int id, bool recursive) { Light* light; Shape* shape; Background *background; BBoxDeco* bboxdeco; if ( (shape = get_shape(id, recursive)) ) return shape; else if ( (light = get_light(id)) ) return light; else if ( (background = get_background()) && id == background->getObjID()) return background; else if ( (bboxdeco = get_bboxdeco()) && id == bboxdeco->getObjID()) return bboxdeco; else return NULL; } Shape* Scene::get_shape(int id, bool recursive) { return get_shape_from_list(shapes, id, recursive); } Light* Scene::get_light(int id) { std::vector::iterator ilight; if (lights.empty()) return NULL; ilight = std::find_if(lights.begin(), lights.end(), std::bind2nd(std::ptr_fun(&sameID), id)); if (ilight == lights.end()) return NULL; else return *ilight; } const AABox& Scene::getBoundingBox() { if (bboxChanges) calcDataBBox(); return data_bbox; } void Scene::renderZsort(RenderContext* renderContext) { std::vector::iterator iter; std::multimap distanceMap; int index = 0; for (iter = zsortShapes.begin() ; iter != zsortShapes.end() ; ++iter ) { Shape* shape = *iter; shape->renderBegin(renderContext); for (int j = 0; j < shape->getElementCount(); j++) { ShapeItem* item = new ShapeItem(shape, j); float distance = renderContext->getDistance( shape->getElementCenter(j) ); distanceMap.insert( std::pair(-distance, item) ); index++; } } { Shape* prev = NULL; std::multimap::iterator iter; for (iter = distanceMap.begin() ; iter != distanceMap.end() ; ++ iter ) { ShapeItem* item = iter->second; Shape* shape = item->shape; if (shape != prev) { if (prev) prev->drawEnd(renderContext); shape->drawBegin(renderContext); prev = shape; } shape->drawElement(renderContext, item->itemnum); } if (prev) prev->drawEnd(renderContext); } } void Scene::render(RenderContext* renderContext) { renderContext->scene = this; renderContext->viewpoint = viewpoint; // // CLEAR BUFFERS // GLbitfield clearFlags = 0; SAVEGLERROR; // Depth Buffer glClearDepth(1.0); glDepthFunc(GL_LESS); glDepthMask(GL_TRUE); // mask and func will be reset by material // if ( unsortedShapes.size() ) clearFlags |= GL_DEPTH_BUFFER_BIT; // Color Buffer (optional - depends on background node) clearFlags |= background->getClearFlags(renderContext); // clear glClear(clearFlags); // renderContext.clear(viewport); // userMatrix and scale might change the length of normals. If this slows us // down, we should test for that instead of just enabling GL_NORMALIZE glEnable(GL_NORMALIZE); if (bboxChanges) calcDataBBox(); Sphere total_bsphere; if (data_bbox.isValid()) { // // GET DATA VOLUME SPHERE // total_bsphere = Sphere( (bboxDeco) ? bboxDeco->getBoundingBox(data_bbox) : data_bbox, viewpoint->scale ); if (total_bsphere.radius <= 0.0) total_bsphere.radius = 1.0; } else { total_bsphere = Sphere( Vertex(0,0,0), 1 ); } SAVEGLERROR; // // SETUP LIGHTING MODEL // setupLightModel(renderContext, total_bsphere); // // SETUP VIEWPORT TRANSFORMATION // glViewport(renderContext->rect.x,renderContext->rect.y,renderContext->rect.width, renderContext->rect.height); // // SETUP BACKGROUND VIEWPOINT PROJECTION // // FIXME: move to background // viewpoint->setupFrustum( renderContext, total_bsphere ); // // RENDER BACKGROUND // // DISABLE Z-BUFFER TEST glDisable(GL_DEPTH_TEST); // DISABLE Z-BUFFER FOR WRITING glDepthMask(GL_FALSE); background->render(renderContext); SAVEGLERROR; // // RENDER MODEL // if (data_bbox.isValid() ) { // // SETUP VIEWPOINT TRANSFORMATION // viewpoint->setupTransformation( renderContext, total_bsphere); // Save matrices for projection/unprojection later glGetDoublev(GL_MODELVIEW_MATRIX,renderContext->modelview); glGetDoublev(GL_PROJECTION_MATRIX,renderContext->projection); glGetIntegerv(GL_VIEWPORT, renderContext->viewport); // // RENDER SOLID SHAPES // // ENABLE Z-BUFFER TEST glEnable(GL_DEPTH_TEST); // ENABLE Z-BUFFER FOR WRITING glDepthMask(GL_TRUE); // DISABLE BLENDING glDisable(GL_BLEND); // RENDER CLIP PLANES { std::vector::iterator iter; ClipPlaneSet::num_planes = 0; for (iter = clipPlanes.begin() ; iter != clipPlanes.end() ; ++iter ) { Shape* shape = *iter; shape->render(renderContext); SAVEGLERROR; } } // // RENDER BBOX DECO // if (bboxDeco) bboxDeco->render(renderContext); // This changes the modelview/projection/viewport SAVEGLERROR; { std::vector::iterator iter; for (iter = unsortedShapes.begin() ; iter != unsortedShapes.end() ; ++iter ) { Shape* shape = *iter; shape->render(renderContext); SAVEGLERROR; } } // #define NO_BLEND #ifndef NO_BLEND // // RENDER BLENDED SHAPES // // render shapes in bounding-box sorted order according to z value // // DISABLE Z-BUFFER FOR WRITING glDepthMask(GL_FALSE); SAVEGLERROR; // SETUP BLENDING if (renderContext->gl2psActive == GL2PS_NONE) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); else gl2psBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); SAVEGLERROR; // ENABLE BLENDING glEnable(GL_BLEND); SAVEGLERROR; // // GET THE TRANSFORMATION // viewpoint->setupTransformation(renderContext, total_bsphere); Matrix4x4 M(renderContext->modelview); Matrix4x4 P(renderContext->projection); P = P*M; renderContext->Zrow = P.getRow(2); renderContext->Wrow = P.getRow(3); renderZsort(renderContext); #endif // DISABLE CLIP PLANES { std::vector::iterator iter; for (iter = clipPlanes.begin() ; iter != clipPlanes.end() ; ++iter ) { Shape* shape = *iter; static_cast(shape)->enable(false); SAVEGLERROR; } } /* Reset flag(s) now that scene has been rendered */ renderContext->viewpoint->scaleChanged = false; SAVEGLERROR; } } void Scene::setupLightModel(RenderContext* rctx, const Sphere& viewSphere) { Color global_ambient(0.0f,0.0f,0.0f,1.0f); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient.data ); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE ); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); #ifdef GL_VERSION_1_2 // glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR ); #endif // // global lights // rctx->viewpoint->setupFrustum(rctx, viewSphere); rctx->viewpoint->setupTransformation(rctx, viewSphere); SAVEGLERROR; std::vector::const_iterator iter; for(iter = lights.begin(); iter != lights.end() ; ++iter ) { Light* light = *iter; if (!light->viewpoint) light->setup(rctx); } SAVEGLERROR; // // viewpoint lights // glMatrixMode(GL_MODELVIEW); glLoadIdentity(); for(iter = lights.begin(); iter != lights.end() ; ++iter ) { Light* light = *iter; if (light->viewpoint) light->setup(rctx); } SAVEGLERROR; // // disable unused lights // for (int i=nlights;i<8;i++) glDisable(gl_light_ids[i]); } void Scene::calcDataBBox() { data_bbox.invalidate(); std::vector::const_iterator iter; bboxChanges = false; for(iter = shapes.begin(); iter != shapes.end(); ++iter) { Shape* shape = *iter; if (!shape->getIgnoreExtent()) { data_bbox += shape->getBoundingBox(this); bboxChanges |= shape->getBBoxChanges(); } } } // --------------------------------------------------------------------------- int Scene::getIgnoreExtent(void) { return (int)ignoreExtent; } // --------------------------------------------------------------------------- void Scene::setIgnoreExtent(int in_ignoreExtent) { ignoreExtent = (bool)in_ignoreExtent; } // --------------------------------------------------------------------------- void Scene::invalidateDisplaylists() { std::vector::iterator iter; for (iter = shapes.begin(); iter != shapes.end(); ++iter) { (*iter)->invalidateDisplaylist(); } } bool rgl::sameID(SceneNode* node, int id) { return node->getObjID() == id; } rgl/src/win32gui.hpp0000644000176000001440000000152612262005307014036 0ustar ripleyusers#ifndef RGL_W32_GUI_HPP #define RGL_W32_GUI_HPP // --------------------------------------------------------------------------- // $Id: win32gui.hpp 976 2013-10-04 15:06:19Z murdoch $ // --------------------------------------------------------------------------- #include "gui.hpp" // --------------------------------------------------------------------------- #include namespace rgl { // --------------------------------------------------------------------------- class Win32GUIFactory : public GUIFactory { public: Win32GUIFactory(); virtual ~Win32GUIFactory(); WindowImpl* createWindowImpl(Window* window); #ifndef WGL_WGLEXT_PROTOTYPES PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; #endif }; // --------------------------------------------------------------------------- } // namespace rgl #endif // RGL_W32_GUI_HPP rgl/src/BBoxDeco.hpp0000644000176000001440000000337312262005307014016 0ustar ripleyusers#ifndef BBOX_DECO_HPP #define BBOX_DECO_HPP #include "SceneNode.hpp" // // CLASS // BBoxDeco // #include "rglmath.h" #include "geom.hpp" #include "RenderContext.hpp" #include "String.hpp" #include "Material.hpp" namespace rgl { enum { AXIS_CUSTOM, AXIS_LENGTH, AXIS_UNIT, AXIS_PRETTY, AXIS_NONE }; struct AxisInfo { AxisInfo(); AxisInfo(int in_nticks, double* in_values, char** in_texts, int xlen, float xunit); AxisInfo(AxisInfo& from); ~AxisInfo(); void draw(RenderContext* renderContext, Vertex4& v, Vertex4& dir, Matrix4x4& modelview, Vertex& marklen, String& string); int getNticks(float low, float high); float getTick(float low, float high, int index); int mode; int nticks; float* ticks; StringArray textArray; int len; float unit; }; class BBoxDeco : public SceneNode { public: BBoxDeco(Material& in_material=defaultMaterial, AxisInfo& xaxis=defaultAxis, AxisInfo& yaxis=defaultAxis, AxisInfo& zaxis=defaultAxis, float marklen=15.0, bool marklen_fract=true, float in_expand=1.0, bool in_front=false); void render(RenderContext* renderContext); AABox getBoundingBox(const AABox& boundingBox) const; Vertex getMarkLength(const AABox& boundingBox) const; int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); String getTextAttribute(AABox& bbox, AttribID attrib, int index); Material* getMaterial() { return &material; } private: Material material; AxisInfo xaxis, yaxis, zaxis; float marklen_value; bool marklen_fract; float expand; bool draw_front; static Material defaultMaterial; static AxisInfo defaultAxis; }; } // namespace rgl #endif // BBOX_DECO_HPP rgl/src/SpriteSet.hpp0000644000176000001440000000302212262005307014302 0ustar ripleyusers#ifndef SPRITE_SET_HPP #define SPRITE_SET_HPP #include #include "Shape.hpp" namespace rgl { // // SPRITESET // class SpriteSet : public Shape { private: ARRAY vertex; ARRAY size; public: SpriteSet(Material& material, int nvertex, double* vertex, int nsize, double* size, int ignoreExtent, int count = 0, Shape** shapelist = NULL, double* userMatrix = NULL); ~SpriteSet(); /** * overload **/ virtual void render(RenderContext* renderContext); virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "sprites", buflen); }; virtual int getElementCount(void); int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); String getTextAttribute(AABox& bbox, AttribID attrib, int index); /** * location of individual items **/ virtual Vertex getElementCenter(int index); /** * begin sending items **/ virtual void drawBegin(RenderContext* renderContext); /** * send one item **/ virtual void drawElement(RenderContext* renderContext, int index); /** * end sending items **/ virtual void drawEnd(RenderContext* renderContext); /** * extract individual shape */ virtual Shape* get_shape(int id); private: GLdouble userMatrix[16]; /* Transformation for 3D sprites */ Matrix4x4 m; /* Modelview matrix cache */ bool doTex; std::vector shapes; }; } // namespace rgl #endif // SPRITE_SET_HPP rgl/src/NULLgui.cpp0000644000176000001440000000551012262026246013643 0ustar ripleyusers #include #include #include "config.hpp" // C++ source // This file is part of RGL. // // $Id: win32gui.cpp 923 2013-01-27 10:41:11Z murdoch $ #include "NULLgui.hpp" #include "lib.hpp" #include "glgui.hpp" #include "assert.hpp" #include "R.h" // --------------------------------------------------------------------------- namespace rgl { class NULLWindowImpl : public WindowImpl { public: NULLWindowImpl(Window* in_window); ~NULLWindowImpl() {}; void setTitle(const char* title) {}; void setWindowRect(int left, int top, int right, int bottom); void getWindowRect(int *left, int *top, int *right, int *bottom); void show() {}; void hide() {}; void bringToTop(int stay) {}; void update() {}; void destroy() {}; void captureMouse(View* pView) {}; void releaseMouse() {}; GLFont* getFont(const char* family, int style, double cex, bool useFreeType); private: int rect[4]; friend class NULLGUIFactory; public: bool beginGL() { return 0; }; void endGL() {}; void swap() {}; }; } // namespace rgl using namespace rgl; // ---------------------------------------------------------------------------- // constructor // ---------------------------------------------------------------------------- NULLWindowImpl::NULLWindowImpl(Window* in_window) : WindowImpl(in_window) { setWindowRect(0, 0, 256, 256); fonts[0] = new NULLFont("sans", 1, 1.0); } void NULLWindowImpl::setWindowRect(int left, int top, int right, int bottom) { rect[0] = left; rect[1] = top; rect[2] = right; rect[3] = bottom; window->resize(right-left, bottom-top); } void NULLWindowImpl::getWindowRect(int *left, int *top, int *right, int *bottom) { *left = rect[0]; *top = rect[1]; *right = rect[2]; *bottom = rect[3]; } GLFont* NULLWindowImpl::getFont(const char* family, int style, double cex, bool useFreeType) { for (unsigned int i=0; i < fonts.size(); i++) { if (fonts[i]->cex == cex && fonts[i]->style == style && !strcmp(fonts[i]->family, family) && fonts[i]->useFreeType == useFreeType) return fonts[i]; } GLFont* font = new NULLFont(family, style, cex); fonts.push_back(font); return font; } // --------------------------------------------------------------------------- // // NULLGUIFactory class // // --------------------------------------------------------------------------- NULLGUIFactory::NULLGUIFactory() { } // --------------------------------------------------------------------------- NULLGUIFactory::~NULLGUIFactory() { } // --------------------------------------------------------------------------- WindowImpl* NULLGUIFactory::createWindowImpl(Window* in_window) { NULLWindowImpl* impl = new NULLWindowImpl(in_window); return impl; } // --------------------------------------------------------------------------- rgl/src/LineSet.cpp0000644000176000001440000000126512262026246013732 0ustar ripleyusers#include "PrimitiveSet.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // LineSet // LineSet::LineSet(Material& in_material, int in_nvertices, double* in_vertices, bool in_ignoreExtent, bool in_bboxChange) : PrimitiveSet(in_material, in_nvertices, in_vertices, GL_LINES, 2, in_ignoreExtent, in_bboxChange) { material.lit = false; if (material.line_antialias) blended = true; } LineSet::LineSet(Material& in_material, bool in_ignoreExtent, bool in_bboxChange) : PrimitiveSet(in_material, GL_LINES, 2, in_ignoreExtent, in_bboxChange) { material.lit = false; if (material.line_antialias) blended = true; } rgl/src/Background.hpp0000644000176000001440000000166512262005307014452 0ustar ripleyusers#ifndef BACKGROUND_HPP #define BACKGROUND_HPP #include "Shape.hpp" #include "opengl.hpp" #include "SphereMesh.hpp" namespace rgl { // // CLASS // Background // class Background : public Shape { public: enum { FOG_NONE=1, FOG_LINEAR, FOG_EXP, FOG_EXP2 }; Background( Material& in_material = defaultMaterial, bool sphere=false, int fogtype=FOG_NONE); void render(RenderContext* renderContext); int getElementCount(void) { return 1; } void drawElement(RenderContext* renderContext, int index); GLbitfield getClearFlags(RenderContext* renderContext); int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); protected: bool clearColorBuffer; bool sphere; int fogtype; SphereMesh sphereMesh; // GLuint displayList; friend class Scene; private: static Material defaultMaterial; }; } // namespace rgl #endif // BACKGROUND_HPP rgl/src/rglmath.cpp0000644000176000001440000001142112262026246014020 0ustar ripleyusers// C++ source // This file is part of RGL. // // $Id: rglmath.cpp 976 2013-10-04 15:06:19Z murdoch $ #include "rglmath.h" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Vertex // void Vec3::normalize() { float len = this->getLength(); if (len != 0.0f) { float f = 1.0f/len; x *= f; y *= f; z *= f; } } Vec3 Vec3::cross(Vec3 op2) const { Vec3 v; v.x = y * op2.z - z * op2.y; v.y = z * op2.x - x * op2.z; v.z = x * op2.y - y * op2.x; return v; } float Vec3::angle(const Vec3& that) const { float dot; dot = x*that.x + y*that.y + z*that.z; return math::rad2deg(math::acos( dot/(this->getLength() * that.getLength()))); } Vec3 Vec3::operator * (float s) { Vec3 v; v.x = x*s; v.y = y*s; v.z = z*s; return v; } float Vec3::operator * (Vec3 v) { return (x*v.x + y*v.y + z*v.z); } Vec3 Vec3::operator - (Vec3 op2) const { Vec3 v; v.x = x - op2.x; v.y = y - op2.y; v.z = z - op2.z; return v; } void Vec3::operator += (Vec3 op2) { x += op2.x; y += op2.y; z += op2.z; } Vec3 Vec3::scale(const Vec3& op2) const { Vec3 t(*this); t.x *= op2.x; t.y *= op2.y; t.z *= op2.z; return t; } Vec3 Vertex::operator + (Vec3 op2) const { Vec3 t(*this); t += op2; return t; } void Vec3::rotateX(float degree) { Vec3 t(*this); float rad = math::deg2rad(degree); float s = math::sin(rad); float c = math::cos(rad); y = c*t.y + -s*t.z; z = s*t.y + c*t.z; } void Vec3::rotateY(float degree) { Vec3 t(*this); float rad = math::deg2rad(degree); float s = math::sin(rad); float c = math::cos(rad); x = c*t.x + s*t.z; z = -s*t.x + c*t.z; } bool Vec3::missing() const { return ISNAN(x) || ISNAN(y) || ISNAN(z); } ////////////////////////////////////////////////////////////////////////////// // // CLASS // Vec4 // Vec4::Vec4(const float in_x, const float in_y, const float in_z, const float in_w) { x = in_x; y = in_y; z = in_z; w = in_w; } float Vec4::operator * (const Vec4& v) const { return (x*v.x + y*v.y + z*v.z + w*v.w); } Vec4 Vec4::operator * (const float s) const { Vec4 r; r.x = x*s; r.y = y*s; r.z = z*s; r.w = w*s; return r; } Vec4 Vec4::operator + (const Vec4& v) const { return Vec4(x+v.x, y+v.y, z+v.z, w+v.w); } ////////////////////////////////////////////////////////////////////////////// // // CLASS // Matrix4x4 // Matrix4x4::Matrix4x4() { } Matrix4x4::Matrix4x4(const Matrix4x4& src) { for(int i=0;i<16;i++) data[i] = src.data[i]; } Matrix4x4::Matrix4x4(const double* from) { for(int i=0;i<16;i++) data[i] = (float) from[i]; } Vec3 Matrix4x4::operator * (const Vec3 v) const { Vec3 r; const float v_w = 1.0f; r.x = val(0,0) * v.x + val(0,1) * v.y + val(0,2) * v.z + val(0,3) * v_w; r.y = val(1,0) * v.x + val(1,1) * v.y + val(1,2) * v.z + val(1,3) * v_w; r.z = val(2,0) * v.x + val(2,1) * v.y + val(2,2) * v.z + val(2,3) * v_w; return r; } Vec4 Matrix4x4::operator*(const Vec4& v) const { Vec4 r; r.x = val(0,0) * v.x + val(0,1) * v.y + val(0,2) * v.z + val(0,3) * v.w; r.y = val(1,0) * v.x + val(1,1) * v.y + val(1,2) * v.z + val(1,3) * v.w; r.z = val(2,0) * v.x + val(2,1) * v.y + val(2,2) * v.z + val(2,3) * v.w; r.w = val(3,0) * v.x + val(3,1) * v.y + val(3,2) * v.z + val(3,3) * v.w; return r; } bool Vec4::missing() const { return ISNAN(x) || ISNAN(y) || ISNAN(z) || ISNAN(w); } Matrix4x4 Matrix4x4::operator * (const Matrix4x4& op2) const { Matrix4x4 r; for(int i=0;i<4;i++) for(int j=0;j<4;j++) { float tmp = 0; for(int k=0;k<4;k++) tmp += val(i, k) * op2.val(k, j); r.ref(i,j) = tmp; } return r; } Vec4 Matrix4x4::getRow(int row) { Vec4 r; r.x = val(row, 0); r.y = val(row, 1); r.z = val(row, 2); r.w = val(row, 3); return r; } void Matrix4x4::setIdentity(void) { for(int i=0;i<16;i++) data[i] = 0.0f; ref(0,0) = 1.0f; ref(1,1) = 1.0f; ref(2,2) = 1.0f; ref(3,3) = 1.0f; } void Matrix4x4::setRotate(const int axis, const float degree) { float rad = math::deg2rad(degree); float s = math::sin(rad); float c = math::cos(rad); setIdentity(); switch(axis) { case 0: ref(1,1) = c; ref(1,2) = -s; ref(2,1) = s; ref(2,2) = c; break; case 1: ref(0,0) = c; ref(0,2) = s; ref(2,0) = -s; ref(2,2) = c; break; case 2: ref(0,0) = c; ref(0,1) = -s; ref(1,0) = s; ref(1,1) = c; break; } } void Matrix4x4::getData(double* dest) { for(int i=0;i<16;i++) dest[i] = data[i]; } Vertex PolarCoord::vector() const { float t = math::deg2rad(theta); float p = math::deg2rad(phi); return Vertex ( math::cos(p) * math::sin(t), math::sin(p), math::cos(p) * math::cos(t) ); } rgl/src/Light.cpp0000644000176000001440000000475612262026246013446 0ustar ripleyusers#include "Light.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Light // Light::Light( PolarCoord in_position, Vertex in_finposition, bool in_viewpoint, bool in_posisfinite, Color in_ambient, Color in_diffuse, Color in_specular ) : SceneNode(LIGHT), finposition(in_finposition), ambient(in_ambient), diffuse(in_diffuse), specular(in_specular), id(GL_FALSE), viewpoint(in_viewpoint), posisfinite(in_posisfinite) { if (posisfinite) { position[0] = finposition.x; position[1] = finposition.y; position[2] = finposition.z; position[3] = 1.0f; } else { Vertex v(0.0f, 0.0f, 1.0f); v.rotateX( -in_position.phi ); v.rotateY( in_position.theta ); position[0] = v.x; position[1] = v.y; position[2] = v.z; position[3] = 0.0f; } } void Light::setup(RenderContext* renderContext) { glLightfv(id, GL_AMBIENT, ambient.data ); glLightfv(id, GL_DIFFUSE, diffuse.data ); glLightfv(id, GL_SPECULAR, specular.data ); glLightfv(id, GL_POSITION, position ); glLightf(id, GL_SPOT_EXPONENT, 0.0f); glLightf(id, GL_SPOT_CUTOFF, 180.0f); glLightf(id, GL_CONSTANT_ATTENUATION, 1.0f); glLightf(id, GL_LINEAR_ATTENUATION, 0.0f); glLightf(id, GL_QUADRATIC_ATTENUATION, 0.0f); glEnable(id); } int Light::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case COLORS: return 3; case VERTICES: return 1; case FLAGS: return 2; } return 0; } void Light::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { switch (attrib) { case COLORS: { while (first < n) { Color color; switch(first) { case 0: color = ambient; break; case 1: color = diffuse; break; case 2: color = specular;break; } *result++ = color.data[0]; *result++ = color.data[1]; *result++ = color.data[2]; *result++ = color.data[3]; first++; } return; } case VERTICES: { *result++ = position[0]; *result++ = position[1]; *result++ = position[2]; return; } case FLAGS: { if (first == 0) *result++ = (double) viewpoint; *result++ = (double) posisfinite; return; } } } } rgl/src/SphereSet.hpp0000644000176000001440000000256312262005307014273 0ustar ripleyusers#ifndef SPHERESET_HPP #define SPHERESET_HPP #include "scene.h" #include "Shape.hpp" #include "SphereMesh.hpp" namespace rgl { class SphereSet : public Shape { private: ARRAY center; ARRAY radius; SphereMesh sphereMesh; public: SphereSet(Material& in_material, int nsphere, double* center, int nradius, double* radius, int in_ignoreExtent); ~SphereSet(); /** * overload **/ /* Check whether scale has changed before rendering */ void render(RenderContext* renderContext); int getElementCount(void){ return center.size(); } int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); /** * location of individual items **/ Vertex getElementCenter(int index) { return center.get(index); } /** * Spheres appear as spheres, so their bbox depends on scaling **/ virtual AABox& getBoundingBox(Scene* scene); /** * begin sending items **/ void drawBegin(RenderContext* renderContext); /** * send one item **/ void drawElement(RenderContext* renderContext, int index); /** * end sending items **/ void drawEnd(RenderContext* renderContext); virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "spheres", buflen); }; }; } // namespace rgl #endif // SPHERESET_HPP rgl/src/init.cpp0000644000176000001440000001637712262026246013344 0ustar ripleyusers#include #include #include "R.h" #include "lib.hpp" #include "DeviceManager.hpp" #include "init.hpp" #include "api.h" using namespace rgl; // // FUNCTION // rgl_init // // // GLOBAL: deviceManager pointer // namespace rgl{ DeviceManager* deviceManager = NULL; int gInitValue; void* gHandle; SEXP rglNamespace; // // FUNCTION // rgl_init // // PARAMETERS // ioptions - platform-specific options. // Windows: // [0] multiple-document-interface console handle (MDI) // or 0 (SDI) // MacOSX: // [0] indicator of presence (1) or absence (0) of Carbon/Cocoa // #ifdef __cplusplus extern "C" { #endif SEXP rgl_init(SEXP initValue, SEXP useNULL, SEXP in_namespace) { int success = 0; bool useNULLDevice = asLogical(useNULL); gInitValue = 0; gHandle = NULL; rglNamespace = in_namespace; if ( isNumeric(initValue) ) { gInitValue = asInteger(initValue); } else if ( TYPEOF(initValue) == EXTPTRSXP ) { gHandle = R_ExternalPtrAddr(initValue); } else if ( !isNull(initValue) ) { return ScalarInteger( 0 ); } if ( init(useNULLDevice) ) { deviceManager = new DeviceManager(useNULLDevice); success = 1; } return(ScalarInteger(success)); } #define FUNDEF(name, n) {#name, (DL_FUNC) &name, n} #undef CHECK_ARGS #ifdef CHECK_ARGS R_NativePrimitiveArgType aI[1] = {INTSXP}; R_NativePrimitiveArgType aL[1] = {LGLSXP}; R_NativePrimitiveArgType aII[2] = {INTSXP, INTSXP}; R_NativePrimitiveArgType aLI[2] = {LGLSXP, INTSXP}; R_NativePrimitiveArgType aLL[2] = {LGLSXP, LGLSXP}; R_NativePrimitiveArgType aIII[3] = {INTSXP, INTSXP, INTSXP}; R_NativePrimitiveArgType aIIS[3] = {INTSXP, INTSXP, STRSXP}; R_NativePrimitiveArgType aIID[3] = {INTSXP, INTSXP, REALSXP}; R_NativePrimitiveArgType aLII[3] = {LGLSXP, INTSXP, INTSXP}; R_NativePrimitiveArgType aLIS[3] = {LGLSXP, INTSXP, STRSXP}; R_NativePrimitiveArgType aLID[3] = {LGLSXP, INTSXP, REALSXP}; R_NativePrimitiveArgType aIIDD[4] = {INTSXP, INTSXP, REALSXP, REALSXP}; R_NativePrimitiveArgType aLISD[4] = {LGLSXP, INTSXP, STRSXP, REALSXP}; R_NativePrimitiveArgType aLIDD[4] = {LGLSXP, INTSXP, REALSXP, REALSXP}; R_NativePrimitiveArgType aIIIID[5] = {INTSXP, INTSXP, INTSXP, INTSXP, REALSXP}; R_NativePrimitiveArgType aIIIIS[5] = {INTSXP, INTSXP, INTSXP, INTSXP, STRSXP}; R_NativePrimitiveArgType aLIIIS[5] = {LGLSXP, INTSXP, INTSXP, INTSXP, STRSXP}; R_NativePrimitiveArgType aLIIID[5] = {LGLSXP, INTSXP, INTSXP, INTSXP, REALSXP}; R_NativePrimitiveArgType aLIISD[5] = {LGLSXP, INTSXP, INTSXP, STRSXP, REALSXP}; R_NativePrimitiveArgType aLIIIF[5] = {LGLSXP, INTSXP, INTSXP, INTSXP, SINGLESXP}; R_NativePrimitiveArgType aLIDDD[5] = {LGLSXP, INTSXP, REALSXP, REALSXP, REALSXP}; R_NativePrimitiveArgType aIIDDD[5] = {INTSXP, INTSXP, REALSXP, REALSXP, REALSXP}; R_NativePrimitiveArgType aIIDDID[6] = {INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, REALSXP}; R_NativePrimitiveArgType aLIDDDDI[7] = {LGLSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP}; R_NativePrimitiveArgType aLIDDSDSDS[9] = {LGLSXP, INTSXP, REALSXP, REALSXP, STRSXP, REALSXP, STRSXP, REALSXP, STRSXP}; R_NativePrimitiveArgType aIIDSDISIDI[10] = {INTSXP, INTSXP, REALSXP, STRSXP, REALSXP, INTSXP, STRSXP, INTSXP, REALSXP, INTSXP}; R_NativePrimitiveArgType aIIDDDDDDDDIII[13] = {INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP}; static const R_CMethodDef CEntries[] = { {"rgl_dev_open", (DL_FUNC) &rgl_dev_open, 2, aLL}, {"rgl_dev_close", (DL_FUNC) &rgl_dev_close, 1, aL}, {"rgl_dev_setcurrent", (DL_FUNC) &rgl_dev_setcurrent, 2, aLI}, {"rgl_snapshot", (DL_FUNC) &rgl_snapshot, 3, aLIS}, {"rgl_postscript", (DL_FUNC) &rgl_postscript, 3, aLIS}, {"rgl_material", (DL_FUNC) &rgl_material, 4, aLISD}, {"rgl_getmaterial", (DL_FUNC) &rgl_getmaterial, 5, aLIISD}, {"rgl_getcolorcount", (DL_FUNC) &rgl_getcolorcount, 1, aI}, {"rgl_dev_bringtotop", (DL_FUNC) &rgl_dev_bringtotop, 2, aLL}, {"rgl_clear", (DL_FUNC) &rgl_clear, 2, aLI}, {"rgl_pop", (DL_FUNC) &rgl_pop, 2, aLI}, {"rgl_id_count", (DL_FUNC) &rgl_id_count, 2, aII}, {"rgl_ids", (DL_FUNC) &rgl_ids, 3, aIIS}, {"rgl_viewpoint", (DL_FUNC) &rgl_viewpoint, 3, aLID}, {"rgl_attrib_count", (DL_FUNC) &rgl_attrib_count, 3, aIII}, {"rgl_attrib", (DL_FUNC) &rgl_attrib, 5, aIIIID}, {"rgl_text_attrib", (DL_FUNC) &rgl_text_attrib, 5, aIIIIS}, {"rgl_bg", (DL_FUNC) &rgl_bg, 2, aLI}, {"rgl_bbox", (DL_FUNC) &rgl_bbox, 9, aLIDDSDSDS}, {"rgl_light", (DL_FUNC) &rgl_light, 3, aIID}, {"rgl_pixels", (DL_FUNC) &rgl_pixels, 5, aLIIIF}, {"rgl_planes", (DL_FUNC) &rgl_planes, 4, aIIDD}, {"rgl_clipplanes", (DL_FUNC) &rgl_planes, 4, aIIDD}, {"rgl_abclines", (DL_FUNC) &rgl_abclines, 4, aIIDD}, {"rgl_primitive", (DL_FUNC) &rgl_primitive, 5, aIIDDD}, {"rgl_surface", (DL_FUNC) &rgl_surface, 13, aIIDDDDDDDDIII}, {"rgl_spheres", (DL_FUNC) &rgl_spheres, 4, aIIDD}, {"rgl_texts", (DL_FUNC) &rgl_texts, 10, aIIDSDISIDI}, {"rgl_sprites", (DL_FUNC) &rgl_sprites, 6, aIIDDID}, {"rgl_user2window", (DL_FUNC) &rgl_user2window, 7, aLIDDDDI}, {"rgl_window2user", (DL_FUNC) &rgl_window2user, 7, aLIDDDDI}, {"rgl_selectstate", (DL_FUNC) &rgl_selectstate, 3, aLID}, {"rgl_setselectstate", (DL_FUNC) &rgl_setselectstate, 2, aLI}, {"rgl_quit", (DL_FUNC) &rgl_quit, 1, aL}, {NULL, NULL, 0} }; #else // don't CHECK_ARGS static const R_CMethodDef CEntries[] = { FUNDEF(rgl_dev_open, 2), FUNDEF(rgl_dev_close, 1), FUNDEF(rgl_dev_setcurrent, 2), FUNDEF(rgl_snapshot, 3), FUNDEF(rgl_postscript, 3), FUNDEF(rgl_material, 4), FUNDEF(rgl_getmaterial, 5), FUNDEF(rgl_getcolorcount, 1), FUNDEF(rgl_dev_bringtotop, 2), FUNDEF(rgl_clear, 2), FUNDEF(rgl_pop, 2), FUNDEF(rgl_id_count, 2), FUNDEF(rgl_ids, 3), FUNDEF(rgl_viewpoint, 3), FUNDEF(rgl_attrib_count, 3), FUNDEF(rgl_attrib, 5), FUNDEF(rgl_text_attrib, 5), FUNDEF(rgl_bg, 2), FUNDEF(rgl_bbox, 9), FUNDEF(rgl_light, 3), FUNDEF(rgl_pixels, 5), FUNDEF(rgl_planes, 4), FUNDEF(rgl_clipplanes, 4), FUNDEF(rgl_abclines, 4), FUNDEF(rgl_primitive, 5), FUNDEF(rgl_surface, 13), FUNDEF(rgl_spheres, 4), FUNDEF(rgl_texts, 10), FUNDEF(rgl_sprites, 6), FUNDEF(rgl_user2window, 7), FUNDEF(rgl_window2user, 7), FUNDEF(rgl_selectstate, 3), FUNDEF(rgl_setselectstate, 2), FUNDEF(rgl_quit, 1), {NULL, NULL, 0} }; #endif // CHECK_ARGS static const R_CallMethodDef CallEntries[] = { FUNDEF(rgl_init, 3), FUNDEF(rgl_dev_getcurrent, 0), FUNDEF(rgl_dev_list, 0), FUNDEF(rgl_setMouseCallbacks, 4), {NULL, NULL, 0} }; static const R_ExternalMethodDef ExtEntries[] = { FUNDEF(rgl_par3d, 1), {NULL, NULL, 0} }; void attribute_visible R_init_rgl(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, NULL, ExtEntries); } #ifdef __cplusplus } #endif // --------------------------------------------------------------------------- } // namespace rgl // --------------------------------------------------------------------------- rgl/src/render.cpp0000644000176000001440000000507012262026246013644 0ustar ripleyusers#include "render.h" #include "opengl.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // SECTION: MATERIAL // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // CLASS // VertexArray // VertexArray::VertexArray() { arrayptr = NULL; } VertexArray::~VertexArray() { if (arrayptr) delete[] arrayptr; } void VertexArray::alloc(int nvertex) { if (arrayptr) delete[] arrayptr; arrayptr = new float [nvertex*3]; } void VertexArray::copy(int nvertex, double* vertices) { for(int i=0;i using namespace rgl; void FPS::init(double time) { lastTime = time; framecnt = 0; buffer[0] = '0'; buffer[1] = '\0'; } void FPS::render(double t, RenderContext* ctx) { if (lastTime + 1.0f < t ) { lastTime = t; sprintf(buffer, "FPS %d", framecnt); framecnt = 0; } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0f,1.0f,-1.0f,1.0f,-1.0f,1.0f); glColor3f(1.0f,1.0f,1.0f); glRasterPos2f( 1.0f, -0.9f); if (ctx->font) ctx->font->draw(buffer, strlen(buffer), -1, 0.0, *ctx); framecnt++; } rgl/src/select.h0000644000176000001440000000053212262026246013307 0ustar ripleyusers#ifndef PLX_SELECT_H #define PLX_SELECT_H // C++ header file // This file is part of RGL // // $Id: select.h 976 2013-10-04 15:06:19Z murdoch $ #include "scene.h" namespace rgl { // // Mouse selection rectangle // class SELECT { public: inline SELECT() { }; void render(double* position); }; } // namespace rgl #endif // PLX_SELECT_H rgl/src/Shape.cpp0000644000176000001440000000637012262026246013431 0ustar ripleyusers #include #include #include "Shape.hpp" #include "SceneNode.hpp" #include "R.h" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Shape // Shape::Shape(Material& in_material, bool in_ignoreExtent, TypeID in_typeID, bool in_bboxChanges) : SceneNode(in_typeID), bboxChanges(in_bboxChanges), ignoreExtent(in_ignoreExtent), material(in_material), displayList(0), drawLevel(0), doUpdate(true), transparent(in_material.isTransparent()), blended(in_material.isTransparent()) { } Shape::~Shape() { if (displayList) glDeleteLists(displayList, 1); } void Shape::update(RenderContext* renderContext) { doUpdate = false; } void Shape::draw(RenderContext* renderContext) { drawBegin(renderContext); SAVEGLERROR; for(int i=0;i shapes, int id, bool recursive) { std::vector::iterator ishape; if (shapes.empty()) return NULL; ishape = std::find_if(shapes.begin(), shapes.end(), std::bind2nd(std::ptr_fun(&sameID), id)); if (ishape != shapes.end()) return *ishape; if (recursive) for (std::vector::iterator i = shapes.begin(); i != shapes.end() ; ++ i ) { Shape* shape = (*i)->get_shape(id); if (shape) return shape; } return NULL; } rgl/src/x11lib.cpp0000644000176000001440000000514112262026246013464 0ustar ripleyusers#include "config.hpp" #ifdef RGL_X11 // C++ source // This file is part of RGL. // // $Id: x11lib.cpp 977 2013-10-04 16:57:22Z murdoch $ #include "R.h" #include "lib.hpp" #include "NULLgui.hpp" // // ===[ GUI IMPLEMENTATION ]================================================= // #include "x11gui.hpp" using namespace rgl; namespace rgl { X11GUIFactory* gpX11GUIFactory = NULL; NULLGUIFactory* gpNULLGUIFactory = NULL; } GUIFactory* rgl::getGUIFactory(bool useNULLDevice) { if (useNULLDevice) return (GUIFactory*) gpNULLGUIFactory; else if (gpX11GUIFactory) return (GUIFactory*) gpX11GUIFactory; else error("glX device not initialized"); } // --------------------------------------------------------------------------- const char * rgl::GUIFactoryName(bool useNULLDevice) { return useNULLDevice ? "null" : "glX"; } // // ===[ R INTEGRATION ]======================================================= // #include "R.h" #include static InputHandler* R_handler = NULL; static void R_rgl_eventHandler(void * userData) { gpX11GUIFactory->processEvents(); } static void set_R_handler() { // add R input handler (R_ext/eventloop.h) // approach taken from GtkDevice ... good work guys! R_handler = ::addInputHandler(R_InputHandlers, gpX11GUIFactory->getFD(), R_rgl_eventHandler, XActivity); // seek end of node while(R_handler->next) R_handler = R_handler->next; } static void unset_R_handler() { if (R_handler) { ::removeInputHandler(&R_InputHandlers, R_handler); R_handler = NULL; } } // // ===[ LIB INIT / QUIT ]===================================================== // bool rgl::init(bool useNULLDevice) { bool success = false; // construct GUI Factory gpNULLGUIFactory = new NULLGUIFactory(); if (useNULLDevice) { success = true; } else { gpX11GUIFactory = new X11GUIFactory(NULL); if ( gpX11GUIFactory->isConnected() ) { set_R_handler(); success = true; } } return success; } void rgl::quit() { unset_R_handler(); delete gpX11GUIFactory; delete gpNULLGUIFactory; gpX11GUIFactory = 0; gpNULLGUIFactory = 0; } // // ===[ LIB SERVICES ]======================================================= // // // printMessage // void rgl::printMessage( const char* string ) { warning("RGL: %s\n", string); } // // getTime // #include #include double rgl::getTime() { struct ::timeval t; gettimeofday(&t,NULL); return ( (double) t.tv_sec ) * 1000.0 + ( ( (double) t.tv_usec ) / 1000.0 ); } // --------------------------------------------------------------------------- #endif // RGL_X11 rgl/src/PrimitiveSet.hpp0000644000176000001440000001424512262005310015007 0ustar ripleyusers#ifndef PRIMITIVE_SET_HPP #define PRIMITIVE_SET_HPP #include "Shape.hpp" #include "render.h" #include namespace rgl { // // ABSTRACT CLASS // PrimitiveSet // class PrimitiveSet : public Shape { public: /** * overloaded **/ virtual void draw(RenderContext* renderContext); /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "primitive", buflen); } /** * overloaded **/ virtual int getElementCount(void) { return nprimitives; } int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); /** * overloaded **/ virtual Vertex getElementCenter(int item) { return getCenter(item); } /** * begin sending primitives * interface **/ virtual void drawBegin(RenderContext* renderContext); /** * send primitive * interface **/ virtual void drawElement(RenderContext* renderContext, int index); /** * end sending primitives * interface **/ virtual void drawEnd(RenderContext* renderContext); /** * set a vertex **/ const void setVertex(int index, double* v) { vertexArray.setVertex(index, v); } /** * setup all vertices **/ void initPrimitiveSet(int in_nvertices, double* in_vertices); protected: /** * abstract class constructor **/ PrimitiveSet ( Material& in_material, int in_nvertices, double* vertex, int in_type, int in_nverticesperelement, bool in_ignoreExtent, bool in_bboxChange = false ); PrimitiveSet( Material& in_material, int in_type, int in_verticesperelement, bool in_ignoreExtent, bool in_bboxChange ); /** * get primitive center point **/ inline Vertex getCenter(int index) { Vertex accu; int begin = index*nverticesperelement; int end = begin+nverticesperelement; for (int i = begin ; i < end ; ++i ) accu += vertexArray[i]; return accu * ( 1.0f / ( (float) nverticesperelement ) ); } // ---[ PRIMITIVE DRAW INTERFACE ]------------------------------------------ /** * send all elements * interface **/ virtual void drawAll(RenderContext* renderContext); void initPrimitiveSet ( int in_nvertices, double* vertex, int in_type, int in_nverticesperelement, bool in_ignoreExtent, bool in_bboxChange ); int type; int nverticesperelement; int nvertices; int nprimitives; VertexArray vertexArray; bool hasmissing; /* whether any vertices contain missing values */ }; // // ABSTRACT CLASS // FaceSet // class FaceSet : public PrimitiveSet { public: /** * overload **/ virtual void drawBegin(RenderContext* renderContext); /** * overload **/ virtual void drawEnd(RenderContext* renderContext); /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "faces", buflen); }; int getAttributeCount(AABox& bbox, AttribID attrib); void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); protected: /** * Constructor **/ FaceSet( Material& in_material, int in_nelements, double* in_vertex, double* in_normals, double* in_texcoords, int in_type, int in_nverticesperelement, bool in_ignoreExtent, int in_useNormals, int in_useTexcoords, bool in_bboxChange = false ); FaceSet( Material& in_material, int in_type, int in_verticesperelement, bool in_ignoreExtent, bool in_bboxChange = false ); /* (re-)set mesh */ void initFaceSet(int in_nelements, double* in_vertex, double* in_normals, double* in_texcoords); private: NormalArray normalArray; TexCoordArray texCoordArray; }; // // CLASS // PointSet // class PointSet : public PrimitiveSet { public: PointSet(Material& material, int nvertices, double* vertices, bool in_ignoreExtent, bool bboxChange=false); /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "points", buflen); }; }; // // CLASS // LineSet // class LineSet : public PrimitiveSet { public: LineSet(Material& material, int nvertices, double* vertices, bool in_ignoreExtent, bool in_bboxChange=false); LineSet(Material& in_material, bool in_ignoreExtent, bool in_bboxChange); /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "lines", buflen); }; }; // // CLASS // TriangleSet // class TriangleSet : public FaceSet { public: TriangleSet(Material& in_material, int in_nvertex, double* in_vertex, double* in_normals, double* in_texcoords, bool in_ignoreExtent, int in_useNormals, int in_useTexcoords, bool in_bboxChange = false) : FaceSet(in_material,in_nvertex, in_vertex, in_normals, in_texcoords, GL_TRIANGLES, 3, in_ignoreExtent, in_useNormals, in_useTexcoords, in_bboxChange) { } TriangleSet(Material& in_material, bool in_ignoreExtent, bool in_bboxChange) : FaceSet(in_material, GL_TRIANGLES, 3, in_ignoreExtent, in_bboxChange) { } /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "triangles", buflen); }; }; // // CLASS // QuadSet // class QuadSet : public FaceSet { public: QuadSet(Material& in_material, int in_nvertex, double* in_vertex, double* in_normals, double* in_texcoords, bool in_ignoreExtent, int in_useNormals, int in_useTexcoords) : FaceSet(in_material,in_nvertex,in_vertex, in_normals, in_texcoords, GL_QUADS, 4, in_ignoreExtent, in_useNormals, in_useTexcoords) { } /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "quads", buflen); }; }; // // CLASS // LineStripSet // class LineStripSet : public PrimitiveSet { public: LineStripSet(Material& material, int in_nelements, double* in_vertex, bool in_ignoreExtent, bool in_bboxChange = false); void drawElement(RenderContext* renderContext, int index); /** * overloaded **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "linestrip", buflen); }; }; } // namespace rgl #endif // PRIMITIVE_SET_HPP rgl/src/ClipPlane.cpp0000644000176000001440000000344712262026246014242 0ustar ripleyusers#include "ClipPlane.hpp" #include "Viewpoint.hpp" #include "R.h" #include using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // ClipPlaneSet // int ClipPlaneSet::num_planes = 0; ClipPlaneSet::ClipPlaneSet(Material& in_material, int in_nnormal, double* in_normal, int in_noffset, double* in_offset) : Shape(in_material,true), nPlanes(max(in_nnormal, in_noffset)), normal(in_nnormal, in_normal), offset(in_noffset, in_offset) { } int ClipPlaneSet::getAttributeCount(AABox& bbox, AttribID attrib) { switch (attrib) { case NORMALS: case OFFSETS: return nPlanes; } return 0; } void ClipPlaneSet::getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result) { int n = getAttributeCount(bbox, attrib); if (first + count < n) n = first + count; if (first < n) { if (attrib == NORMALS) { while (first < n) { *result++ = normal.getRecycled(first).x; *result++ = normal.getRecycled(first).y; *result++ = normal.getRecycled(first).z; first++; } } else if (attrib == OFFSETS) { while (first < n) *result++ = offset.getRecycled(first++); } } } void ClipPlaneSet::renderBegin(RenderContext* renderContext) { firstPlane = GL_CLIP_PLANE0 + num_planes; num_planes += nPlanes; } void ClipPlaneSet::drawElement(RenderContext* renderContext, int index) { GLdouble eqn[4]; eqn[0] = normal.getRecycled(index).x; eqn[1] = normal.getRecycled(index).y; eqn[2] = normal.getRecycled(index).z; eqn[3] = offset.getRecycled(index); glClipPlane(firstPlane + index, eqn); glEnable(firstPlane + index); } void ClipPlaneSet::enable(bool show) { for (int i=0; i #include #include "DeviceManager.hpp" #include "types.h" #include "assert.hpp" #include "lib.hpp" using namespace rgl; DeviceManager::DeviceManager(bool in_useNULLDevice) : newID(1), devices(), current( devices.end() ), useNULLDevice(in_useNULLDevice) { } DeviceManager::~DeviceManager() { std::vector disposeList; { for( Container::const_iterator i = devices.begin(), end = devices.end() ; i!=end ; ++i ) { disposeList.push_back(*i); } } // disploseList. devices.begin(), devices.end() ); for (std::vector::iterator i = disposeList.begin(); i != disposeList.end() ; ++ i ) { // remove manager from listeners (*i)->removeDisposeListener(this); // close device (*i)->close(); } } bool DeviceManager::openDevice(bool useNULL) { Device* pDevice = new Device(newID, useNULL); if ( pDevice->open() ) { ++newID; pDevice->addDisposeListener(this); devices.insert( devices.end(), pDevice ); setCurrent( pDevice->getID() ); return true; } else { delete pDevice; return false; } } Device* DeviceManager::getCurrentDevice() { if ( current != devices.end() ) return *current; else return NULL; } Device* DeviceManager::getAnyDevice() { Device* pDevice = getCurrentDevice(); if (pDevice == NULL) { openDevice(useNULLDevice); pDevice = getCurrentDevice(); } return pDevice; } Device* DeviceManager::getDevice(int id) { for (Container::iterator i = devices.begin() ; i != devices.end() ; ++i ) { if ( (*i)->getID() == id ) return *i; } return NULL; } bool DeviceManager::setCurrent(int id, bool silent) { char buffer[64]; Container::iterator i; for (i = devices.begin() ; i != devices.end() ; ++ i ) { if ( (*i)->getID() == id ) break; } if ( i != devices.end() ) { if ( !silent && current != devices.end() ) { sprintf(buffer, "RGL device %d", (*current)->getID() ); (*current)->setName(buffer); } current = i; if ( !silent ) { sprintf(buffer, "RGL device %d [Focus]", (*current)->getID() ); (*current)->setName(buffer); } return true; } else return false; } int DeviceManager::getCurrent() { if ( current != devices.end() ) return (*current)->getID(); else return 0; } int DeviceManager::getDeviceCount() { int result = 0; for (Container::iterator i = devices.begin(); i != devices.end() ; ++i, ++result); return result; } void DeviceManager::getDeviceIds(int *buffer, int bufsize) { int count = 0; for (Container::iterator i = devices.begin(); i != devices.end() && count < bufsize; ++i, ++count) { *(buffer++) = (*i)->getID(); } } /** * Device disposed handler **/ void DeviceManager::notifyDisposed(Disposable* disposed) { Container::iterator pos = std::find( devices.begin(), devices.end(), static_cast( disposed ) ); assert( pos != devices.end() ); if ( pos == current ) { if ( devices.size() == 1 ) current = devices.end(); else nextDevice(); } devices.erase(pos); } void DeviceManager::nextDevice() { if ( current != devices.end() ) { // cycle to next Iterator next = ++current; if ( next == devices.end() ) next = devices.begin(); setCurrent( (*next)->getID() ); } else { // ignore: no devices } } void DeviceManager::previousDevice() { if ( current != devices.end() ) { // cycle to previous Iterator prev = current; if (prev == devices.begin() ) prev = devices.end(); --prev; setCurrent( (*prev)->getID() ); } else { // ignore: no devices } } rgl/src/x11gui.hpp0000644000176000001440000000306212262005307013502 0ustar ripleyusers#ifndef X11_GUI_HPP #define X11_GUI_HPP // --------------------------------------------------------------------------- // C++ header file // This file is part of RGL // // $Id: x11gui.hpp 976 2013-10-04 15:06:19Z murdoch $ // --------------------------------------------------------------------------- #include #include #include #include "gui.hpp" namespace rgl { // --------------------------------------------------------------------------- class X11WindowImpl; enum { GUI_X11_ATOM_WM_DELETE = 0, GUI_X11_ATOM_LAST }; // --------------------------------------------------------------------------- class X11GUIFactory : public GUIFactory { public: X11GUIFactory (const char* displayname); virtual ~X11GUIFactory (); WindowImpl* createWindowImpl(Window* window); inline bool isConnected() { return (xdisplay) ? true : false; } inline int getFD() { return ConnectionNumber(xdisplay); } void notifyDelete(::Window xwindowid); // implementation services: void processEvents(); void flushX(); // display specific: Display* xdisplay; ::Atom atoms[GUI_X11_ATOM_LAST]; // GLX specific int errorBase, eventBase; // Font specific XFontStruct* xfont; void throw_error(const char* string); private: void connect(const char* displayname); void disconnect(); // administrative data: typedef std::map< XID , X11WindowImpl*> WindowMap; WindowMap windowMap; }; // --------------------------------------------------------------------------- } // namespace rgl #endif // X11_GUI_HPP rgl/src/assert.hpp0000644000176000001440000000163012262005306013663 0ustar ripleyusers/* * assert.hpp * Based on assert.h from MinGW, which had the following notice: * This file has no copyright assigned and is placed in the Public Domain. * This file is a part of the mingw-runtime package. * No warranty is given; refer to the file DISCLAIMER within the package. * * Define the assert macro for debug output. * */ /* We should be able to include this file multiple times to allow the assert macro to be enabled/disabled for different parts of code. So don't add a header guard. */ #undef assert #ifdef __cplusplus extern "C" { #endif #ifdef NDEBUG /* * If not debugging, assert does nothing. */ #define assert(x) ((void)0) #else /* debugging enabled */ void rgl_assert (const char*, const char*, int); /* * Definition of the assert macro. */ #define assert(e) ((e) ? (void)0 : rgl_assert(#e, __FILE__, __LINE__)) #endif /* NDEBUG */ #ifdef __cplusplus } #endif rgl/src/Texture.hpp0000644000176000001440000000226412262005307014027 0ustar ripleyusers#ifndef TEXTURE_HPP #define TEXTURE_HPP #include "pixmap.h" #include "types.h" namespace rgl { // // CLASS // Texture // class RenderContext; class Pixmap; #include "opengl.hpp" class Texture : public AutoDestroy { public: enum Type { ALPHA = 1 , LUMINANCE, LUMINANCE_ALPHA, RGB, RGBA }; Texture(const char* in_filename , Type type , bool mipmap , unsigned int minfilter , unsigned int magfilter , bool envmap); virtual ~Texture(); bool isValid() const; void beginUse(RenderContext* renderContext); void endUse(RenderContext* renderContext); bool is_envmap() const { return envmap; } bool hasAlpha() const { return (type == ALPHA || type == LUMINANCE_ALPHA || type == RGBA ); } void getParameters(Type *out_type, bool *out_mipmap, unsigned int *out_minfilter, unsigned int *out_magfilter, bool *out_envmap, int bufsize, char *out_filename) ; Pixmap* getPixmap() const { return pixmap; } private: void init(RenderContext* renderContext); Pixmap* pixmap; GLuint texName; Type type; bool mipmap; GLenum minfilter; GLenum magfilter; bool envmap; char* filename; }; } // namespace rgl #endif // TEXTURE_HPP rgl/src/gl2ps.h0000644000176000001440000001534512262026246013067 0ustar ripleyusers/* * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2012 C. Geuzaine * * This program is free software; you can redistribute it and/or * modify it under the terms of either: * * a) the GNU Library General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your * option) any later version; or * * b) the GL2PS License as published by Christophe Geuzaine, either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either * the GNU Library General Public License or the GL2PS License for * more details. * * You should have received a copy of the GNU Library General Public * License along with this library in the file named "COPYING.LGPL"; * if not, write to the Free Software Foundation, Inc., 51 Franklin * Street, Fifth Floor, Boston, MA 02110-1301, USA. * * You should have received a copy of the GL2PS License with this * library in the file named "COPYING.GL2PS"; if not, I will be glad * to provide one. * * For the latest info about gl2ps and a full list of contributors, * see http://www.geuz.org/gl2ps/. * * Please report all bugs and problems to . */ #ifndef __GL2PS_H__ #define __GL2PS_H__ #include #include /* Define GL2PSDLL at compile time to build a Windows DLL */ #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) # if defined(_MSC_VER) # pragma warning(disable:4115) # pragma warning(disable:4996) # endif # include # if defined(GL2PSDLL) # if defined(GL2PSDLL_EXPORTS) # define GL2PSDLL_API __declspec(dllexport) # else # define GL2PSDLL_API __declspec(dllimport) # endif # else # define GL2PSDLL_API # endif #else # define GL2PSDLL_API #endif #if defined(__APPLE__) || defined(HAVE_OPENGL_GL_H) # include #else # include #endif /* Support for compressed PostScript/PDF/SVG and for embedded PNG images in SVG */ #if defined(HAVE_ZLIB) || defined(HAVE_LIBZ) # define GL2PS_HAVE_ZLIB # if defined(HAVE_LIBPNG) || defined(HAVE_PNG) # define GL2PS_HAVE_LIBPNG # endif #endif #if defined(HAVE_NO_VSNPRINTF) # define GL2PS_HAVE_NO_VSNPRINTF #endif /* Version number */ #define GL2PS_MAJOR_VERSION 1 #define GL2PS_MINOR_VERSION 3 #define GL2PS_PATCH_VERSION 8 #define GL2PS_EXTRA_VERSION "" #define GL2PS_VERSION (GL2PS_MAJOR_VERSION + \ 0.01 * GL2PS_MINOR_VERSION + \ 0.0001 * GL2PS_PATCH_VERSION) #define GL2PS_COPYRIGHT "(C) 1999-2012 C. Geuzaine" /* Output file formats (the values and the ordering are important!) */ #define GL2PS_PS 0 #define GL2PS_EPS 1 #define GL2PS_TEX 2 #define GL2PS_PDF 3 #define GL2PS_SVG 4 #define GL2PS_PGF 5 /* Sorting algorithms */ #define GL2PS_NO_SORT 1 #define GL2PS_SIMPLE_SORT 2 #define GL2PS_BSP_SORT 3 /* Message levels and error codes */ #define GL2PS_SUCCESS 0 #define GL2PS_INFO 1 #define GL2PS_WARNING 2 #define GL2PS_ERROR 3 #define GL2PS_NO_FEEDBACK 4 #define GL2PS_OVERFLOW 5 #define GL2PS_UNINITIALIZED 6 /* Options for gl2psBeginPage */ #define GL2PS_NONE 0 #define GL2PS_DRAW_BACKGROUND (1<<0) #define GL2PS_SIMPLE_LINE_OFFSET (1<<1) #define GL2PS_SILENT (1<<2) #define GL2PS_BEST_ROOT (1<<3) #define GL2PS_OCCLUSION_CULL (1<<4) #define GL2PS_NO_TEXT (1<<5) #define GL2PS_LANDSCAPE (1<<6) #define GL2PS_NO_PS3_SHADING (1<<7) #define GL2PS_NO_PIXMAP (1<<8) #define GL2PS_USE_CURRENT_VIEWPORT (1<<9) #define GL2PS_COMPRESS (1<<10) #define GL2PS_NO_BLENDING (1<<11) #define GL2PS_TIGHT_BOUNDING_BOX (1<<12) /* Arguments for gl2psEnable/gl2psDisable */ #define GL2PS_POLYGON_OFFSET_FILL 1 #define GL2PS_POLYGON_BOUNDARY 2 #define GL2PS_LINE_STIPPLE 3 #define GL2PS_BLEND 4 /* Text alignment (o=raster position; default mode is BL): +---+ +---+ +---+ +---+ +---+ +---+ +-o-+ o---+ +---o | o | o | | o | | | | | | | | | | | | +---+ +---+ +---+ +-o-+ o---+ +---o +---+ +---+ +---+ C CL CR B BL BR T TL TR */ #define GL2PS_TEXT_C 1 #define GL2PS_TEXT_CL 2 #define GL2PS_TEXT_CR 3 #define GL2PS_TEXT_B 4 #define GL2PS_TEXT_BL 5 #define GL2PS_TEXT_BR 6 #define GL2PS_TEXT_T 7 #define GL2PS_TEXT_TL 8 #define GL2PS_TEXT_TR 9 typedef GLfloat GL2PSrgba[4]; #if defined(__cplusplus) extern "C" { #endif GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer, GLint viewport[4], GLint format, GLint sort, GLint options, GLint colormode, GLint colorsize, GL2PSrgba *colormap, GLint nr, GLint ng, GLint nb, GLint buffersize, FILE *stream, const char *filename); GL2PSDLL_API GLint gl2psEndPage(void); GL2PSDLL_API GLint gl2psSetOptions(GLint options); GL2PSDLL_API GLint gl2psGetOptions(GLint *options); GL2PSDLL_API GLint gl2psBeginViewport(GLint viewport[4]); GL2PSDLL_API GLint gl2psEndViewport(void); GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize); GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname, GLshort fontsize, GLint align, GLfloat angle); GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname, GLshort fontsize, GLint align, GLfloat angle, GL2PSrgba color); GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str); GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height, GLint xorig, GLint yorig, GLenum format, GLenum type, const void *pixels); GL2PSDLL_API GLint gl2psEnable(GLint mode); GL2PSDLL_API GLint gl2psDisable(GLint mode); GL2PSDLL_API GLint gl2psPointSize(GLfloat value); GL2PSDLL_API GLint gl2psLineWidth(GLfloat value); GL2PSDLL_API GLint gl2psBlendFunc(GLenum sfactor, GLenum dfactor); /* undocumented */ GL2PSDLL_API GLint gl2psDrawImageMap(GLsizei width, GLsizei height, const GLfloat position[3], const unsigned char *imagemap); GL2PSDLL_API const char *gl2psGetFileExtension(GLint format); GL2PSDLL_API const char *gl2psGetFormatDescription(GLint format); GL2PSDLL_API GLint gl2psGetFileFormat(); #if defined(__cplusplus) } #endif #endif /* __GL2PS_H__ */ rgl/src/ext/0000755000176000001440000000000012100313501012437 5ustar ripleyusersrgl/src/ext/GLsdk/0000755000176000001440000000000012100313501013443 5ustar ripleyusersrgl/src/ext/GLsdk/windemo/0000755000176000001440000000000012100313500015104 5ustar ripleyusersrgl/src/ext/GLsdk/windemo/Makefile0000644000176000001440000000101512262026246016562 0ustar ripleyusersMAKE = $(MAKE) /nologo # Turn off copyright notice all: singlewin.exe multiwin.exe multithread.exe singlewin.exe: @cd singlewin @$(MAKE) /$(MAKEFLAGS) @cd .. multiwin.exe: @cd multiwin @$(MAKE) /$(MAKEFLAGS) @cd .. multithread.exe: @cd multithread @$(MAKE) /$(MAKEFLAGS) @cd .. clean: @cd singlewin @$(MAKE) /$(MAKEFLAGS) clean @cd .. @cd multiwin @$(MAKE) /$(MAKEFLAGS) clean @cd .. @cd multithread @$(MAKE) /$(MAKEFLAGS) clean @cd .. rgl/src/ext/GLsdk/windemo/singlewin/0000755000176000001440000000000012100313500017103 5ustar ripleyusersrgl/src/ext/GLsdk/windemo/singlewin/Makefile0000644000176000001440000000124112262026246020562 0ustar ripleyusersGLSDKDIR = ..\.. INCS = -I$(GLSDKDIR) INCS = $(INCS) -I.. # add windemo directory LIBS = GDI32.lib User32.lib OpenGL32.lib GLU32.lib !if ("$(BLDENV)" == "") CFLAGS = -c LNFLAGS = !else CFLAGS = -c -Od -Zi LNFLAGS = -debug -debugtype:cv -pdbtype:con !endif demo: demo.obj demogl.obj glprocs.obj link demo.obj demogl.obj glprocs.obj $(LIBS) $(LNFLAGS) demo.obj: demo.c ..\demogl.h cl $(CFLAGS) $(INCS) demo.c demogl.obj: ..\demogl.c ..\demogl.h cl $(CFLAGS) $(INCS) ..\demogl.c glprocs.obj: $(GLSDKDIR)\GL\glprocs.c cl $(CFLAGS) $(INCS) $(GLSDKDIR)\GL\glprocs.c clean: @erase demo.obj glprocs.obj demogl.obj demo.exe *.pdb *.ilk > nul rgl/src/ext/GLsdk/windemo/singlewin/demo.c0000644000176000001440000001673212262026246020225 0ustar ripleyusers/* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #include // Required inclusion on windows #include // OpenGL definitions #include #include #include #include "demogl.h" static char szAppName[] = "OpenGL"; HINSTANCE _hInstance; WindowData wdata[] = { {"ICD OpenGL", 50, 250, 200, 200, PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER}, }; int nWnd = sizeof (wdata) / sizeof (wdata[0]);; #define TESTFLAGS (PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_GENERIC_FORMAT) //======================================================================== // Setup a pixel format for a window, create context and initialize // OpenGL 1.2 procs. void SetupWindow (HWND hWnd, WindowData *pwdata) { int iPixelFormat = 0; int numPixelFmts; PIXELFORMATDESCRIPTOR pfd; int i; pwdata->hDC = GetDC (hWnd); // Create a DC for the window. // Search for a pixel format which matches the flags specified for // the window. numPixelFmts = DescribePixelFormat (pwdata->hDC, 1, sizeof (pfd), NULL); for (i = 0; i < numPixelFmts; i++) { DescribePixelFormat (pwdata->hDC, i+1, sizeof(pfd), &pfd); if ((pfd.dwFlags & TESTFLAGS) == pwdata->pfdFlags) { iPixelFormat = i+1; break; } } if (iPixelFormat == 0) { // Did not find a suitable pixel format assert (0); exit(1); } // Set pixel format for the window if (SetPixelFormat (pwdata->hDC, iPixelFormat, &pfd) == FALSE) { assert (0); exit (1); } // Create a context for the window pwdata->hRC = wglCreateContext (pwdata->hDC); // Bind this context to this thread. Since each thread is working on // each window, we have to do MakeCurrent only once. wglMakeCurrent (pwdata->hDC, pwdata->hRC); // Initialize the OpenGL context. InitializeOpenGL (pwdata); } //======================================================================== // Proc to receive window messages LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; WindowData *pwdata; RECT rect; // Obtain the window data for this thread. Note that WM_CREATE cannot // "read" the values in window data since it has not yet been setup until // we have gone through creation/initialization. Also, pwdata as // computed below is incorrect when we receive WM_CREATE msg. if (hWnd == wdata[0].hWnd) { pwdata = &wdata[0]; } else { pwdata = &wdata[1]; } // Process the window message. switch (msg) { case WM_CREATE: SetupWindow (hWnd, ((LPCREATESTRUCT) lParam)->lpCreateParams); return (0); case WM_SIZE: pwdata->width = LOWORD (lParam); pwdata->height = HIWORD (lParam); glViewport (0, 0, pwdata->width, pwdata->height); return 0; case WM_PAINT: BeginPaint (hWnd, &ps); DrawScene(pwdata); // Update the client area EndPaint (hWnd, &ps); return 0; case WM_DESTROY: // Delete the context. wglDeleteContext (pwdata->hRC); PostQuitMessage( 0 ); return 0; } return DefWindowProc (hWnd, msg, wParam, lParam); } //======================================================================== int ThreadMain (int i) { // Create a window for the application. wdata[i].hWnd = CreateWindow( szAppName, // Application name wdata[i].windowTitle, // Window title text WS_OVERLAPPEDWINDOW | // Window style WS_CLIPCHILDREN | // Needed for OpenGL WS_CLIPSIBLINGS, // Needed for OpenGL wdata[i].xpos, wdata[i].ypos, wdata[i].width, wdata[i].height, NULL, // No parent window NULL, // Use the window class menu. _hInstance, // This instance owns this window &wdata[i]); // Application window data structure // Check for window creation if (!wdata[i].hWnd) { assert (0); exit (1); } // Make the window visible & update its client area ShowWindow (wdata[i].hWnd, SW_SHOWNORMAL); UpdateWindow (wdata[i].hWnd); // Send WM_PAINT message return (0); } //======================================================================== // Windows main program. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wc; // windows class sruct int i; HANDLE hThread; DWORD IDThread; MSG msg; // message struct _hInstance = hInstance; // Save for later use. // Fill in window class structure with parameters that // describe the main window. wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s). wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // Owner of this class wc.hIcon = NULL; // Icon name wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Cursor wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // Default color wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; // Name to register as // Register the window class RegisterClass( &wc ); // Create a single window without creating threads. for (i = 0; i < nWnd; i++) { ThreadMain (0); } // Enter the Windows message loop. Get and dispatch messages // until WM_QUIT. while (GetMessage(&msg, // message structure NULL, // handle of window receiving the message 0, // lowest message id to examine 0)) { // highest message id to examine TranslateMessage (&msg); DispatchMessage (&msg); } return (msg.wParam); } rgl/src/ext/GLsdk/windemo/README0000644000176000001440000000253511664440423016014 0ustar ripleyusersdemogl.{c,h} - OpenGL rendering routines (this directory. Shared by programs in threee directories below). The following three directories have the same "demo.c" program which uses demogl, but is setup three different ways. singlewin - Window setup to render in a single window. Most normal aplications work this way and don't have do anything special for OpenGL 1.2, 1.3 and extension procs. multiwin - Multiple windows with a single message loop. At any given time, there is only context which is current. The application defines its own method for accessing the proc table (see _APP_PROCTABLE flag in the Makefile). Since there is only window which is current, a global variable can be used to provide reference to the current proc table. multithread - Multiple windows with a multiple message loops using multiple threads. At any given time, there can be multiple current contexts. The application defines its own method for accessing the proc table (see _APP_PROCTABLE flag in the Makefile). However, there can me multiple current contexts on different thread, the application uses thread local storage to define proper access to the current proc table. rgl/src/ext/GLsdk/windemo/demogl.h0000644000176000001440000000514012262026246016545 0ustar ripleyusers#ifndef __DEMOGL_H__ #define __DEMOGL_H__ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ // Define a structure keeping all application data on a per window // basis. typedef struct { // Intialized data char *windowTitle; int xpos; int ypos; int width; // Size of client region int height; int pfdFlags; // Flags for selecting pixel format descriptor // Computed data int hasMultitexture; // Supports multi-texture int hasWinSwapHint; // Supports WinSwapHint int spin; // Rotation angle of triangle per window int texid; // Texture id per window HWND hWnd; // Main window handle. HDC hDC; // Device context HGLRC hRC; // OpenGL context // If we are using multiple renderers in a single process or on // multiple threads, we must keep our function table for // OpenGL 1.2, OpenGL 1.3 and extension functions #ifdef _APP_PROCTABLE _GLextensionProcs extensionProcs; #endif } WindowData; // Extern defintions for rendering functions in demogl.c. void InitializeOpenGL (WindowData *pwdata); void DrawScene (WindowData *pwdata); #endif /* __DEMOGL_H__ */ rgl/src/ext/GLsdk/windemo/multithread/0000755000176000001440000000000012100313500017426 5ustar ripleyusersrgl/src/ext/GLsdk/windemo/multithread/Makefile0000644000176000001440000000172112262026246021110 0ustar ripleyusersGLSDKDIR = ..\.. INCS = -I$(GLSDKDIR) INCS = $(INCS) -I.. # add demogl directory LIBS = GDI32.lib User32.lib OpenGL32.lib GLU32.lib # By default build release binaries. !if "$(BLDENV)" == "" CFLAGS = -c LNFLAGS = !else CFLAGS = -c -Od -Zi LNFLAGS = -debug -debugtype:cv -pdbtype:con !endif #********************************************************************* # Since this is a multi-thread/multi-device application, we define # our own proctable. CFLAGS = $(CFLAGS) -D_APP_PROCTABLE #********************************************************************* demo: demo.obj demogl.obj glprocs.obj link demo.obj demogl.obj glprocs.obj $(LIBS) $(LNFLAGS) demo.obj: demo.c ..\demogl.h cl $(CFLAGS) $(INCS) demo.c demogl.obj: ..\demogl.c ..\demogl.h cl $(CFLAGS) $(INCS) ..\demogl.c glprocs.obj: $(GLSDKDIR)\GL\glprocs.c cl $(CFLAGS) $(INCS) $(GLSDKDIR)\GL\glprocs.c clean: @erase demo.obj glprocs.obj demogl.obj demo.exe *.pdb *.ilk > nul rgl/src/ext/GLsdk/windemo/multithread/demo.c0000644000176000001440000002576712262026246020560 0ustar ripleyusers/* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #include // Required inclusion on windows #include // OpenGL definitions #include #include #include #include "demogl.h" static WNDCLASSEX wcx; static char szAppName[] = "OpenGL"; HINSTANCE _hInstance; WindowData wdata[] = { {"MS OpenGL", 50, 50, 150, 150, PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_GENERIC_FORMAT}, {"ICD OpenGL", 50, 250, 200, 200, PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER}, }; int nWnd = sizeof (wdata) / sizeof (wdata[0]);; #define TESTFLAGS (PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_GENERIC_FORMAT) //****************************************************************** //****************************************************************** DWORD tlsIndex; // Index for thread local data. // Function to get thread local proc table. _GLextensionProcs *_GET_TLS_PROCTABLE(void) { WindowData *pwdata; // Get pointer to thread local data. pwdata = TlsGetValue (tlsIndex); // Return the pointer to the extension proc table // hanging off the thread local data. return (&pwdata->extensionProcs); } //****************************************************************** //****************************************************************** //======================================================================== // Setup a pixel format for a window, create context and initialize // OpenGL 1.2 procs. void SetupWindow (HWND hWnd, WindowData *pwdata) { int iPixelFormat = 0; int numPixelFmts; PIXELFORMATDESCRIPTOR pfd; int i; pwdata->hDC = GetDC (hWnd); // Create a DC for the window. // Search for a pixel format which matches the flags specified for // the window. numPixelFmts = DescribePixelFormat (pwdata->hDC, 1, sizeof (pfd), NULL); for (i = 0; i < numPixelFmts; i++) { DescribePixelFormat (pwdata->hDC, i+1, sizeof(pfd), &pfd); if ((pfd.dwFlags & TESTFLAGS) == pwdata->pfdFlags) { iPixelFormat = i+1; break; } } if (iPixelFormat == 0) { // Did not find a suitable pixel format assert (0); exit(1); } // Set pixel format for the window if (SetPixelFormat (pwdata->hDC, iPixelFormat, &pfd) == FALSE) { assert (0); exit (1); } // Create a context for the window pwdata->hRC = wglCreateContext (pwdata->hDC); // Bind this context to this thread. Since each thread is working on // each window, we have to do MakeCurrent only once. wglMakeCurrent (pwdata->hDC, pwdata->hRC); // Initialize the OpenGL context. InitializeOpenGL (pwdata); } //======================================================================== // Proc to receive window messages LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; WindowData *pwdata; RECT rect; // Obtain the window data for this thread. Note that WM_CREATE cannot // "read" the values in window data since it has not yet been setup until // we have gone through creation/initialization. pwdata = TlsGetValue (tlsIndex); // Process the window message. switch (msg) { case WM_CREATE: SetupWindow (hWnd, ((LPCREATESTRUCT) lParam)->lpCreateParams); return (0); case WM_SIZE: pwdata->width = LOWORD (lParam); pwdata->height = HIWORD (lParam); glViewport (0, 0, pwdata->width, pwdata->height); return 0; case WM_PAINT: // Since each thread has its own context, we don't have // to do a MakeCurrent for each paint message. BeginPaint (hWnd, &ps); DrawScene(pwdata); // Update the client area EndPaint (hWnd, &ps); return 0; case WM_DESTROY: // Delete the context. wglDeleteContext (pwdata->hRC); PostQuitMessage( 0 ); return 0; } return DefWindowProc (hWnd, msg, wParam, lParam); } //======================================================================== int ThreadMain (void *vi) { int i = (int) vi; MSG msg; // message struct //****************************************************************** //****************************************************************** // Store the windowData for this thread in the thread local data. TlsSetValue (tlsIndex, &wdata[i]); // Initialize the OpenGL extension proc table for this window data. // (One time intiailization per device context). We do it early // so that even wgl Extensions are correctly available to the thread. _InitExtensionProcs (&wdata[i].extensionProcs); //****************************************************************** //****************************************************************** // Fill in the window class structure with parameters // that describe the main window. wcx.cbSize = sizeof(wcx); // size of structure wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes wcx.lpfnWndProc = WndProc; // points to window procedure wcx.cbClsExtra = 0; // no extra class memory wcx.cbWndExtra = 0; // no extra window memory wcx.hInstance = _hInstance; // handle to instance wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); // predefined app. icon wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow wcx.hbrBackground = GetStockObject( WHITE_BRUSH); // white background brush wcx.lpszMenuName = NULL; // name of menu resource wcx.lpszClassName = szAppName; // name of window class wcx.hIconSm = LoadImage(_hInstance, // small class icon MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); // Register the window class. RegisterClassEx(&wcx); // Create a window for the application. wdata[i].hWnd = CreateWindow( szAppName, // Application name wdata[i].windowTitle, // Window title text WS_OVERLAPPEDWINDOW | // Window style WS_CLIPCHILDREN | // Needed for OpenGL WS_CLIPSIBLINGS, // Needed for OpenGL wdata[i].xpos, wdata[i].ypos, wdata[i].width, wdata[i].height, NULL, // No parent window NULL, // Use the window class menu. _hInstance, // This instance owns this window &wdata[i]); // Application window data structure // Check for window creation if (!wdata[i].hWnd) { assert (0); exit (1); } // Make the window visible & update its client area ShowWindow (wdata[i].hWnd, SW_SHOWNORMAL); UpdateWindow (wdata[i].hWnd); // Send WM_PAINT message // Enter the Windows message loop. Get and dispatch messages // until WM_QUIT. while (GetMessage(&msg, // message structure NULL, // handle of window receiving the message 0, // lowest message id to examine 0)) { // highest message id to examine TranslateMessage (&msg); DispatchMessage (&msg); } UnregisterClass(szAppName, _hInstance); return (msg.wParam); } //======================================================================== // Windows main program. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wc; // windows class sruct int i; HANDLE hThread; DWORD IDThread; _hInstance = hInstance; // Save for later use. // Fill in window class structure with parameters that // describe the main window. wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s). wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // Owner of this class wc.hIcon = NULL; // Icon name wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Cursor wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // Default color wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; // Name to register as // Register the window class RegisterClass( &wc ); //****************************************************************** //****************************************************************** // For multi-threaded applications, allocate a thread local storage // for storing a global for each thread. if ( (tlsIndex = TlsAlloc()) == -1) { assert (0); exit(1); } //****************************************************************** //****************************************************************** for (i = 0; i < nWnd; i++) { hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadMain, (void *) i, 0, &IDThread); if (hThread == NULL) { assert (0); exit(1); } } // We don't nee this thread anymore since the two threads are // taking care of the two windows independently. However, we // exit the thread and not the process. ExitThread (0); } rgl/src/ext/GLsdk/windemo/multiwin/0000755000176000001440000000000012100313500016754 5ustar ripleyusersrgl/src/ext/GLsdk/windemo/multiwin/Makefile0000644000176000001440000000165512262026246020444 0ustar ripleyusersGLSDKDIR = ..\.. INCS = -I$(GLSDKDIR) INCS = $(INCS) -I.. # add demogl directory LIBS = GDI32.lib User32.lib OpenGL32.lib GLU32.lib !if ("$(BLDENV)" == "") CFLAGS = -c LNFLAGS = !else CFLAGS = -c -Od -Zi LNFLAGS = -debug -debugtype:cv -pdbtype:con !endif #********************************************************************* # Since this is a multi-thread/multi-device application, we define # our own proctable. CFLAGS = $(CFLAGS) -D_APP_PROCTABLE #********************************************************************* demo: demo.obj demogl.obj glprocs.obj link demo.obj demogl.obj glprocs.obj $(LIBS) $(LNFLAGS) demo.obj: demo.c ..\demogl.h cl $(CFLAGS) $(INCS) demo.c demogl.obj: ..\demogl.c ..\demogl.h cl $(CFLAGS) $(INCS) ..\demogl.c glprocs.obj: $(GLSDKDIR)\GL\glprocs.c cl $(CFLAGS) $(INCS) $(GLSDKDIR)\GL\glprocs.c clean: @erase demo.obj glprocs.obj demogl.obj demo.exe *.pdb *.ilk > nul rgl/src/ext/GLsdk/windemo/multiwin/demo.c0000644000176000001440000002372312262026246020074 0ustar ripleyusers/* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #include // Required inclusion on windows #include // OpenGL definitions #include #include #include #include "demogl.h" static char szAppName[] = "OpenGL"; HINSTANCE _hInstance; WindowData wdata[] = { {"MS OpenGL", 50, 50, 150, 150, PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_GENERIC_FORMAT}, {"ICD OpenGL", 50, 250, 200, 200, PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER}, }; int nWnd = sizeof (wdata) / sizeof (wdata[0]);; #define TESTFLAGS (PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_GENERIC_FORMAT) //****************************************************************** //****************************************************************** WindowData *currentWindowData; // Function to get thread local proc table. _GLextensionProcs *_GET_TLS_PROCTABLE(void) { // Return the pointer to the extension proc table // hanging off the current local data. return (¤tWindowData->extensionProcs); } //****************************************************************** //****************************************************************** //======================================================================== // Setup a pixel format for a window, create context and initialize // OpenGL 1.2 procs. void SetupWindow (HWND hWnd, WindowData *pwdata) { int iPixelFormat = 0; int numPixelFmts; PIXELFORMATDESCRIPTOR pfd; int i; pwdata->hDC = GetDC (hWnd); // Create a DC for the window. // Search for a pixel format which matches the flags specified for // the window. numPixelFmts = DescribePixelFormat (pwdata->hDC, 1, sizeof (pfd), NULL); for (i = 0; i < numPixelFmts; i++) { DescribePixelFormat (pwdata->hDC, i+1, sizeof(pfd), &pfd); if ((pfd.dwFlags & TESTFLAGS) == pwdata->pfdFlags) { iPixelFormat = i+1; break; } } if (iPixelFormat == 0) { // Did not find a suitable pixel format assert (0); exit(1); } // Set pixel format for the window if (SetPixelFormat (pwdata->hDC, iPixelFormat, &pfd) == FALSE) { assert (0); exit (1); } // Create a context for the window pwdata->hRC = wglCreateContext (pwdata->hDC); // Bind this context to this thread. Since each thread is working on // each window, we have to do MakeCurrent only once. wglMakeCurrent (pwdata->hDC, pwdata->hRC); //******************************************************** //******************************************************** // Every time we do MakeCurrent, we must setup the global // ptr to currentWindowData so that we have the correct // proc table for OpenGL functions. currentWindowData = pwdata; //******************************************************** //******************************************************** // Initialize the OpenGL context. InitializeOpenGL (pwdata); } //======================================================================== // Proc to receive window messages LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; WindowData *pwdata; RECT rect; // Obtain the window data for this thread. Note that WM_CREATE cannot // "read" the values in window data since it has not yet been setup until // we have gone through creation/initialization. Also, pwdata as // computed below is incorrect when we receive WM_CREATE msg. if (hWnd == wdata[0].hWnd) { pwdata = &wdata[0]; } else { pwdata = &wdata[1]; } // Process the window message. switch (msg) { case WM_CREATE: SetupWindow (hWnd, ((LPCREATESTRUCT) lParam)->lpCreateParams); return (0); case WM_SIZE: pwdata->width = LOWORD (lParam); pwdata->height = HIWORD (lParam); glViewport (0, 0, pwdata->width, pwdata->height); return 0; case WM_PAINT: // Since both the contexts are running on the same thread, // make the context for the current window current // before rendering. wglMakeCurrent (pwdata->hDC, pwdata->hRC); //******************************************************** //******************************************************** // Every time we do MakeCurrent, we must setup the global // ptr to currentWindowData so that we have the correct // proc table for OpenGL functions. currentWindowData = pwdata; //******************************************************** //******************************************************** BeginPaint (hWnd, &ps); DrawScene(pwdata); // Update the client area EndPaint (hWnd, &ps); return 0; case WM_DESTROY: // Delete the context. wglDeleteContext (pwdata->hRC); // In multi-window scenario, post the quit message // only when the number of window becomes zero. nWnd -= 1; if (nWnd == 0) { PostQuitMessage( 0 ); } return 0; } return DefWindowProc (hWnd, msg, wParam, lParam); } //======================================================================== int ThreadMain (int i) { //****************************************************************** //****************************************************************** // Initialize the OpenGL extension proc table for this window data. // (One time intiailization per device context). We do it early // so that even wgl Extensions are correctly available to the thread. _InitExtensionProcs (&wdata[i].extensionProcs); //****************************************************************** //****************************************************************** // Create a window for the application. wdata[i].hWnd = CreateWindow( szAppName, // Application name wdata[i].windowTitle, // Window title text WS_OVERLAPPEDWINDOW | // Window style WS_CLIPCHILDREN | // Needed for OpenGL WS_CLIPSIBLINGS, // Needed for OpenGL wdata[i].xpos, wdata[i].ypos, wdata[i].width, wdata[i].height, NULL, // No parent window NULL, // Use the window class menu. _hInstance, // This instance owns this window &wdata[i]); // Application window data structure // Check for window creation if (!wdata[i].hWnd) { assert (0); exit (1); } // Make the window visible & update its client area ShowWindow (wdata[i].hWnd, SW_SHOWNORMAL); UpdateWindow (wdata[i].hWnd); // Send WM_PAINT message return (0); } //======================================================================== // Windows main program. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wc; // windows class sruct int i; HANDLE hThread; DWORD IDThread; MSG msg; // message struct _hInstance = hInstance; // Save for later use. // Fill in window class structure with parameters that // describe the main window. wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s). wc.lpfnWndProc = (WNDPROC)WndProc; // Window Procedure wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // Owner of this class wc.hIcon = NULL; // Icon name wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Cursor wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // Default color wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; // Name to register as // Register the window class RegisterClass( &wc ); // Create multiple windows without creating threads. for (i = 0; i < nWnd; i++) { ThreadMain (i); } // Enter the Windows message loop. Get and dispatch messages // until WM_QUIT. while (GetMessage(&msg, // message structure NULL, // handle of window receiving the message 0, // lowest message id to examine 0)) { // highest message id to examine TranslateMessage (&msg); DispatchMessage (&msg); } return (msg.wParam); } rgl/src/ext/GLsdk/windemo/demogl.c0000644000176000001440000001662712262026246016554 0ustar ripleyusers/* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #include // Required inclusion on windows #include // OpenGL definitions #include // OpenGL {1.2, 1.3, 1.4, 1.5} and extension functions #include "demogl.h" //==================================================================== // Using strstr for extension search can result in false positives // because of substring matches. Since extension names in the // extension string are separated by spaces, this can be fixed simply // by looking for a space OR the end-of-string character immediately // following the extension we're looking for (by skipping ahead 'len' // characters). //==================================================================== static GLboolean IsExtensionSupported(const GLubyte *extensionStr, const GLubyte *checkExtension) { const GLubyte *s; GLint len; s = extensionStr; len = strlen (checkExtension); while ((s = strstr (s, checkExtension)) != NULL) { s += len; if ((*s == ' ') || (*s == '\0')) { return (GL_TRUE); } } return (GL_FALSE); } //======================================================================== // Initialize the OpenGL context - create textures, check the extensions // supported by the driver etc. void InitializeOpenGL (WindowData *pwdata) { const GLubyte *extstrGL; GLubyte image[] = { 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, }; // Setup the extensions extstrGL = glGetString (GL_EXTENSIONS); // Check for WIN_swap_hint extension. if (GL_TRUE == IsExtensionSupported(extstrGL, "GL_WIN_swap_hint")) { pwdata->hasWinSwapHint = TRUE; } // Check for multi-texture extension. if (GL_TRUE == IsExtensionSupported (extstrGL, "GL_ARB_multitexture")) { pwdata->hasMultitexture = TRUE; // Multi-texturing is supported. Create a texture for unit1 and // bind it in MODULATE mode. //========================================================== //========================================================== // Use an extension function without doing anything special! // OpenGL 1.2, OpenGL 1.3 procs can be used similarly - as // long we ensure it is supported - just as we have done // for multi-texturing here. //========================================================== //========================================================== glActiveTextureARB (GL_TEXTURE1_ARB); // Use unit1 glGenTextures (1, &pwdata->texid); glBindTexture (GL_TEXTURE_2D, pwdata->texid); // Bound on unit 1 glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable (GL_TEXTURE_2D); } } //======================================================================== void DrawScene (WindowData *pwdata) { // If WIN_swap_hint extension is supported, use it to create GREEN // border around the frame. We render the first frame with GREEN. // The second frame is the actual rendering rectangle - but is // swapped with a smaller swap rectangle. if (pwdata->hasWinSwapHint) { glClearColor (0.0, 1.0, 0.0, 0.0); // GREEN glClear(GL_COLOR_BUFFER_BIT); SwapBuffers (pwdata->hDC); // Setup the swap hint rect for the next frame //========================================================== //========================================================== // Use an extension function without doing anything special! // OpenGL 1.2, OpenGL 1.3 procs can be used similarly - as // long we ensure it is supported - just as we have done // for SwapHint here. //========================================================== //========================================================== glAddSwapHintRectWIN(20, 20, pwdata->width - 40, pwdata->height - 40); } // Render a triangle - multi-textured if ARB_multitexture is supported. glClearColor (0.0, 0.0, 0.0, 0.0); // BLACK glClear(GL_COLOR_BUFFER_BIT); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glRotatef (pwdata->spin, 0.0, 0.0, 1.0); pwdata->spin += 2; if (pwdata->spin >= 360) { pwdata->spin = 0; } if (pwdata->hasMultitexture) { //========================================================== //========================================================== // Use an extension function without doing anything special! // OpenGL 1.2, OpenGL 1.3 procs can be used similarly - as // long we ensure it is supported - just as we have done // for MultiTexCoord here. //========================================================== //========================================================== glBegin( GL_POLYGON ); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0, 0.0); glColor3f (1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 0.0); glColor3f (0.0, 1.0, 0.0); glVertex3f(0.5, 0.0, 0.0); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 1.0); glColor3f (0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glEnd(); } else { glBegin( GL_POLYGON ); glColor3f (1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glColor3f (0.0, 1.0, 0.0); glVertex3f(0.5, 0.0, 0.0); glColor3f (0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glEnd(); } SwapBuffers (pwdata->hDC); } rgl/src/ext/GLsdk/GL/0000755000176000001440000000000012262026246013765 5ustar ripleyusersrgl/src/ext/GLsdk/GL/glprocs.h0000644000176000001440000054064312262026246015623 0ustar ripleyusers#ifndef _GLPROCS_H_ #define _GLPROCS_H_ /* ** GLprocs utility for getting function addresses for OpenGL(R) 1.2, ** OpenGL 1.3, OpenGL 1.4, OpenGL 1.5 and OpenGL extension functions. ** ** Version: 1.1 ** ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. ** ** Initial version of glprocs.{c,h} contributed by Intel(R) Corporation. */ #ifdef _WIN32 #include "glext.h" #include "wglext.h" #else #include #endif #ifndef _WIN32 /* non-Windows environment */ #ifndef APIENTRY #define APIENTRY #endif #ifdef __GNUC__ #define _inline __inline__ #else #define _inline #endif #endif #ifdef __cplusplus extern "C" { #endif /* Structure of all OpenGL {1.2, 1.3, 1.4, 1.5}, GL extension procs.*/ typedef struct { void (APIENTRY *BlendColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); void (APIENTRY *BlendEquation) (GLenum mode); void (APIENTRY *DrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); void (APIENTRY *ColorTable) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); void (APIENTRY *ColorTableParameterfv) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *ColorTableParameteriv) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *CopyColorTable) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); void (APIENTRY *GetColorTable) (GLenum target, GLenum format, GLenum type, GLvoid *table); void (APIENTRY *GetColorTableParameterfv) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetColorTableParameteriv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *ColorSubTable) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); void (APIENTRY *CopyColorSubTable) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); void (APIENTRY *ConvolutionFilter1D) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); void (APIENTRY *ConvolutionFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); void (APIENTRY *ConvolutionParameterf) (GLenum target, GLenum pname, GLfloat params); void (APIENTRY *ConvolutionParameterfv) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *ConvolutionParameteri) (GLenum target, GLenum pname, GLint params); void (APIENTRY *ConvolutionParameteriv) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *CopyConvolutionFilter1D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); void (APIENTRY *CopyConvolutionFilter2D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); void (APIENTRY *GetConvolutionFilter) (GLenum target, GLenum format, GLenum type, GLvoid *image); void (APIENTRY *GetConvolutionParameterfv) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetConvolutionParameteriv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetSeparableFilter) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); void (APIENTRY *SeparableFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); void (APIENTRY *GetHistogram) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); void (APIENTRY *GetHistogramParameterfv) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetHistogramParameteriv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetMinmax) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); void (APIENTRY *GetMinmaxParameterfv) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetMinmaxParameteriv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *Histogram) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); void (APIENTRY *Minmax) (GLenum target, GLenum internalformat, GLboolean sink); void (APIENTRY *ResetHistogram) (GLenum target); void (APIENTRY *ResetMinmax) (GLenum target); void (APIENTRY *TexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *TexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *CopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); void (APIENTRY *ActiveTexture) (GLenum texture); void (APIENTRY *ClientActiveTexture) (GLenum texture); void (APIENTRY *MultiTexCoord1d) (GLenum target, GLdouble s); void (APIENTRY *MultiTexCoord1dv) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord1f) (GLenum target, GLfloat s); void (APIENTRY *MultiTexCoord1fv) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord1i) (GLenum target, GLint s); void (APIENTRY *MultiTexCoord1iv) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord1s) (GLenum target, GLshort s); void (APIENTRY *MultiTexCoord1sv) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord2d) (GLenum target, GLdouble s, GLdouble t); void (APIENTRY *MultiTexCoord2dv) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord2f) (GLenum target, GLfloat s, GLfloat t); void (APIENTRY *MultiTexCoord2fv) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord2i) (GLenum target, GLint s, GLint t); void (APIENTRY *MultiTexCoord2iv) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord2s) (GLenum target, GLshort s, GLshort t); void (APIENTRY *MultiTexCoord2sv) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord3d) (GLenum target, GLdouble s, GLdouble t, GLdouble r); void (APIENTRY *MultiTexCoord3dv) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord3f) (GLenum target, GLfloat s, GLfloat t, GLfloat r); void (APIENTRY *MultiTexCoord3fv) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord3i) (GLenum target, GLint s, GLint t, GLint r); void (APIENTRY *MultiTexCoord3iv) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord3s) (GLenum target, GLshort s, GLshort t, GLshort r); void (APIENTRY *MultiTexCoord3sv) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord4d) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); void (APIENTRY *MultiTexCoord4dv) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord4f) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); void (APIENTRY *MultiTexCoord4fv) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord4i) (GLenum target, GLint s, GLint t, GLint r, GLint q); void (APIENTRY *MultiTexCoord4iv) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord4s) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); void (APIENTRY *MultiTexCoord4sv) (GLenum target, const GLshort *v); void (APIENTRY *LoadTransposeMatrixf) (const GLfloat *m); void (APIENTRY *LoadTransposeMatrixd) (const GLdouble *m); void (APIENTRY *MultTransposeMatrixf) (const GLfloat *m); void (APIENTRY *MultTransposeMatrixd) (const GLdouble *m); void (APIENTRY *SampleCoverage) (GLclampf value, GLboolean invert); void (APIENTRY *CompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexImage1D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *GetCompressedTexImage) (GLenum target, GLint level, GLvoid *img); void (APIENTRY *BlendFuncSeparate) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); void (APIENTRY *FogCoordf) (GLfloat coord); void (APIENTRY *FogCoordfv) (const GLfloat *coord); void (APIENTRY *FogCoordd) (GLdouble coord); void (APIENTRY *FogCoorddv) (const GLdouble *coord); void (APIENTRY *FogCoordPointer) (GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *MultiDrawArrays) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); void (APIENTRY *MultiDrawElements) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); void (APIENTRY *PointParameterf) (GLenum pname, GLfloat param); void (APIENTRY *PointParameterfv) (GLenum pname, const GLfloat *params); void (APIENTRY *PointParameteri) (GLenum pname, GLint param); void (APIENTRY *PointParameteriv) (GLenum pname, const GLint *params); void (APIENTRY *SecondaryColor3b) (GLbyte red, GLbyte green, GLbyte blue); void (APIENTRY *SecondaryColor3bv) (const GLbyte *v); void (APIENTRY *SecondaryColor3d) (GLdouble red, GLdouble green, GLdouble blue); void (APIENTRY *SecondaryColor3dv) (const GLdouble *v); void (APIENTRY *SecondaryColor3f) (GLfloat red, GLfloat green, GLfloat blue); void (APIENTRY *SecondaryColor3fv) (const GLfloat *v); void (APIENTRY *SecondaryColor3i) (GLint red, GLint green, GLint blue); void (APIENTRY *SecondaryColor3iv) (const GLint *v); void (APIENTRY *SecondaryColor3s) (GLshort red, GLshort green, GLshort blue); void (APIENTRY *SecondaryColor3sv) (const GLshort *v); void (APIENTRY *SecondaryColor3ub) (GLubyte red, GLubyte green, GLubyte blue); void (APIENTRY *SecondaryColor3ubv) (const GLubyte *v); void (APIENTRY *SecondaryColor3ui) (GLuint red, GLuint green, GLuint blue); void (APIENTRY *SecondaryColor3uiv) (const GLuint *v); void (APIENTRY *SecondaryColor3us) (GLushort red, GLushort green, GLushort blue); void (APIENTRY *SecondaryColor3usv) (const GLushort *v); void (APIENTRY *SecondaryColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *WindowPos2d) (GLdouble x, GLdouble y); void (APIENTRY *WindowPos2dv) (const GLdouble *v); void (APIENTRY *WindowPos2f) (GLfloat x, GLfloat y); void (APIENTRY *WindowPos2fv) (const GLfloat *v); void (APIENTRY *WindowPos2i) (GLint x, GLint y); void (APIENTRY *WindowPos2iv) (const GLint *v); void (APIENTRY *WindowPos2s) (GLshort x, GLshort y); void (APIENTRY *WindowPos2sv) (const GLshort *v); void (APIENTRY *WindowPos3d) (GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *WindowPos3dv) (const GLdouble *v); void (APIENTRY *WindowPos3f) (GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *WindowPos3fv) (const GLfloat *v); void (APIENTRY *WindowPos3i) (GLint x, GLint y, GLint z); void (APIENTRY *WindowPos3iv) (const GLint *v); void (APIENTRY *WindowPos3s) (GLshort x, GLshort y, GLshort z); void (APIENTRY *WindowPos3sv) (const GLshort *v); void (APIENTRY *GenQueries) (GLsizei n, GLuint *ids); void (APIENTRY *DeleteQueries) (GLsizei n, const GLuint *ids); GLboolean (APIENTRY *IsQuery) (GLuint id); void (APIENTRY *BeginQuery) (GLenum target, GLuint id); void (APIENTRY *EndQuery) (GLenum target); void (APIENTRY *GetQueryiv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetQueryObjectiv) (GLuint id, GLenum pname, GLint *params); void (APIENTRY *GetQueryObjectuiv) (GLuint id, GLenum pname, GLuint *params); void (APIENTRY *BindBuffer) (GLenum target, GLuint buffer); void (APIENTRY *DeleteBuffers) (GLsizei n, const GLuint *buffers); void (APIENTRY *GenBuffers) (GLsizei n, GLuint *buffers); GLboolean (APIENTRY *IsBuffer) (GLuint buffer); void (APIENTRY *BufferData) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); void (APIENTRY *BufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); void (APIENTRY *GetBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); GLvoid* (APIENTRY *MapBuffer) (GLenum target, GLenum access); GLboolean (APIENTRY *UnmapBuffer) (GLenum target); void (APIENTRY *GetBufferParameteriv) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetBufferPointerv) (GLenum target, GLenum pname, GLvoid* *params); void (APIENTRY *ActiveTextureARB) (GLenum texture); void (APIENTRY *ClientActiveTextureARB) (GLenum texture); void (APIENTRY *MultiTexCoord1dARB) (GLenum target, GLdouble s); void (APIENTRY *MultiTexCoord1dvARB) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord1fARB) (GLenum target, GLfloat s); void (APIENTRY *MultiTexCoord1fvARB) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord1iARB) (GLenum target, GLint s); void (APIENTRY *MultiTexCoord1ivARB) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord1sARB) (GLenum target, GLshort s); void (APIENTRY *MultiTexCoord1svARB) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord2dARB) (GLenum target, GLdouble s, GLdouble t); void (APIENTRY *MultiTexCoord2dvARB) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); void (APIENTRY *MultiTexCoord2fvARB) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord2iARB) (GLenum target, GLint s, GLint t); void (APIENTRY *MultiTexCoord2ivARB) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord2sARB) (GLenum target, GLshort s, GLshort t); void (APIENTRY *MultiTexCoord2svARB) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord3dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r); void (APIENTRY *MultiTexCoord3dvARB) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord3fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r); void (APIENTRY *MultiTexCoord3fvARB) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord3iARB) (GLenum target, GLint s, GLint t, GLint r); void (APIENTRY *MultiTexCoord3ivARB) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord3sARB) (GLenum target, GLshort s, GLshort t, GLshort r); void (APIENTRY *MultiTexCoord3svARB) (GLenum target, const GLshort *v); void (APIENTRY *MultiTexCoord4dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); void (APIENTRY *MultiTexCoord4dvARB) (GLenum target, const GLdouble *v); void (APIENTRY *MultiTexCoord4fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); void (APIENTRY *MultiTexCoord4fvARB) (GLenum target, const GLfloat *v); void (APIENTRY *MultiTexCoord4iARB) (GLenum target, GLint s, GLint t, GLint r, GLint q); void (APIENTRY *MultiTexCoord4ivARB) (GLenum target, const GLint *v); void (APIENTRY *MultiTexCoord4sARB) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); void (APIENTRY *MultiTexCoord4svARB) (GLenum target, const GLshort *v); void (APIENTRY *LoadTransposeMatrixfARB) (const GLfloat *m); void (APIENTRY *LoadTransposeMatrixdARB) (const GLdouble *m); void (APIENTRY *MultTransposeMatrixfARB) (const GLfloat *m); void (APIENTRY *MultTransposeMatrixdARB) (const GLdouble *m); void (APIENTRY *SampleCoverageARB) (GLclampf value, GLboolean invert); void (APIENTRY *CompressedTexImage3DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexImage2DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexImage1DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage3DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage2DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *CompressedTexSubImage1DARB) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); void (APIENTRY *GetCompressedTexImageARB) (GLenum target, GLint level, GLvoid *img); void (APIENTRY *PointParameterfARB) (GLenum pname, GLfloat param); void (APIENTRY *PointParameterfvARB) (GLenum pname, const GLfloat *params); void (APIENTRY *WeightbvARB) (GLint size, const GLbyte *weights); void (APIENTRY *WeightsvARB) (GLint size, const GLshort *weights); void (APIENTRY *WeightivARB) (GLint size, const GLint *weights); void (APIENTRY *WeightfvARB) (GLint size, const GLfloat *weights); void (APIENTRY *WeightdvARB) (GLint size, const GLdouble *weights); void (APIENTRY *WeightubvARB) (GLint size, const GLubyte *weights); void (APIENTRY *WeightusvARB) (GLint size, const GLushort *weights); void (APIENTRY *WeightuivARB) (GLint size, const GLuint *weights); void (APIENTRY *WeightPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *VertexBlendARB) (GLint count); void (APIENTRY *CurrentPaletteMatrixARB) (GLint index); void (APIENTRY *MatrixIndexubvARB) (GLint size, const GLubyte *indices); void (APIENTRY *MatrixIndexusvARB) (GLint size, const GLushort *indices); void (APIENTRY *MatrixIndexuivARB) (GLint size, const GLuint *indices); void (APIENTRY *MatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *WindowPos2dARB) (GLdouble x, GLdouble y); void (APIENTRY *WindowPos2dvARB) (const GLdouble *v); void (APIENTRY *WindowPos2fARB) (GLfloat x, GLfloat y); void (APIENTRY *WindowPos2fvARB) (const GLfloat *v); void (APIENTRY *WindowPos2iARB) (GLint x, GLint y); void (APIENTRY *WindowPos2ivARB) (const GLint *v); void (APIENTRY *WindowPos2sARB) (GLshort x, GLshort y); void (APIENTRY *WindowPos2svARB) (const GLshort *v); void (APIENTRY *WindowPos3dARB) (GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *WindowPos3dvARB) (const GLdouble *v); void (APIENTRY *WindowPos3fARB) (GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *WindowPos3fvARB) (const GLfloat *v); void (APIENTRY *WindowPos3iARB) (GLint x, GLint y, GLint z); void (APIENTRY *WindowPos3ivARB) (const GLint *v); void (APIENTRY *WindowPos3sARB) (GLshort x, GLshort y, GLshort z); void (APIENTRY *WindowPos3svARB) (const GLshort *v); void (APIENTRY *VertexAttrib1dARB) (GLuint index, GLdouble x); void (APIENTRY *VertexAttrib1dvARB) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib1fARB) (GLuint index, GLfloat x); void (APIENTRY *VertexAttrib1fvARB) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib1sARB) (GLuint index, GLshort x); void (APIENTRY *VertexAttrib1svARB) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib2dARB) (GLuint index, GLdouble x, GLdouble y); void (APIENTRY *VertexAttrib2dvARB) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib2fARB) (GLuint index, GLfloat x, GLfloat y); void (APIENTRY *VertexAttrib2fvARB) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib2sARB) (GLuint index, GLshort x, GLshort y); void (APIENTRY *VertexAttrib2svARB) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib3dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *VertexAttrib3dvARB) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib3fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *VertexAttrib3fvARB) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib3sARB) (GLuint index, GLshort x, GLshort y, GLshort z); void (APIENTRY *VertexAttrib3svARB) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib4NbvARB) (GLuint index, const GLbyte *v); void (APIENTRY *VertexAttrib4NivARB) (GLuint index, const GLint *v); void (APIENTRY *VertexAttrib4NsvARB) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib4NubARB) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); void (APIENTRY *VertexAttrib4NubvARB) (GLuint index, const GLubyte *v); void (APIENTRY *VertexAttrib4NuivARB) (GLuint index, const GLuint *v); void (APIENTRY *VertexAttrib4NusvARB) (GLuint index, const GLushort *v); void (APIENTRY *VertexAttrib4bvARB) (GLuint index, const GLbyte *v); void (APIENTRY *VertexAttrib4dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *VertexAttrib4dvARB) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib4fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *VertexAttrib4fvARB) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib4ivARB) (GLuint index, const GLint *v); void (APIENTRY *VertexAttrib4sARB) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); void (APIENTRY *VertexAttrib4svARB) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib4ubvARB) (GLuint index, const GLubyte *v); void (APIENTRY *VertexAttrib4uivARB) (GLuint index, const GLuint *v); void (APIENTRY *VertexAttrib4usvARB) (GLuint index, const GLushort *v); void (APIENTRY *VertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); void (APIENTRY *EnableVertexAttribArrayARB) (GLuint index); void (APIENTRY *DisableVertexAttribArrayARB) (GLuint index); void (APIENTRY *ProgramStringARB) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); void (APIENTRY *BindProgramARB) (GLenum target, GLuint program); void (APIENTRY *DeleteProgramsARB) (GLsizei n, const GLuint *programs); void (APIENTRY *GenProgramsARB) (GLsizei n, GLuint *programs); void (APIENTRY *ProgramEnvParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *ProgramEnvParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); void (APIENTRY *ProgramEnvParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *ProgramEnvParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); void (APIENTRY *ProgramLocalParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *ProgramLocalParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); void (APIENTRY *ProgramLocalParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *ProgramLocalParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); void (APIENTRY *GetProgramEnvParameterdvARB) (GLenum target, GLuint index, GLdouble *params); void (APIENTRY *GetProgramEnvParameterfvARB) (GLenum target, GLuint index, GLfloat *params); void (APIENTRY *GetProgramLocalParameterdvARB) (GLenum target, GLuint index, GLdouble *params); void (APIENTRY *GetProgramLocalParameterfvARB) (GLenum target, GLuint index, GLfloat *params); void (APIENTRY *GetProgramivARB) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetProgramStringARB) (GLenum target, GLenum pname, GLvoid *string); void (APIENTRY *GetVertexAttribdvARB) (GLuint index, GLenum pname, GLdouble *params); void (APIENTRY *GetVertexAttribfvARB) (GLuint index, GLenum pname, GLfloat *params); void (APIENTRY *GetVertexAttribivARB) (GLuint index, GLenum pname, GLint *params); void (APIENTRY *GetVertexAttribPointervARB) (GLuint index, GLenum pname, GLvoid* *pointer); GLboolean (APIENTRY *IsProgramARB) (GLuint program); void (APIENTRY *BindBufferARB) (GLenum target, GLuint buffer); void (APIENTRY *DeleteBuffersARB) (GLsizei n, const GLuint *buffers); void (APIENTRY *GenBuffersARB) (GLsizei n, GLuint *buffers); GLboolean (APIENTRY *IsBufferARB) (GLuint buffer); void (APIENTRY *BufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); void (APIENTRY *BufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); void (APIENTRY *GetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); GLvoid* (APIENTRY *MapBufferARB) (GLenum target, GLenum access); GLboolean (APIENTRY *UnmapBufferARB) (GLenum target); void (APIENTRY *GetBufferParameterivARB) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetBufferPointervARB) (GLenum target, GLenum pname, GLvoid* *params); void (APIENTRY *GenQueriesARB) (GLsizei n, GLuint *ids); void (APIENTRY *DeleteQueriesARB) (GLsizei n, const GLuint *ids); GLboolean (APIENTRY *IsQueryARB) (GLuint id); void (APIENTRY *BeginQueryARB) (GLenum target, GLuint id); void (APIENTRY *EndQueryARB) (GLenum target); void (APIENTRY *GetQueryivARB) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetQueryObjectivARB) (GLuint id, GLenum pname, GLint *params); void (APIENTRY *GetQueryObjectuivARB) (GLuint id, GLenum pname, GLuint *params); void (APIENTRY *DeleteObjectARB) (GLhandleARB obj); GLhandleARB (APIENTRY *GetHandleARB) (GLenum pname); void (APIENTRY *DetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj); GLhandleARB (APIENTRY *CreateShaderObjectARB) (GLenum shaderType); void (APIENTRY *ShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); void (APIENTRY *CompileShaderARB) (GLhandleARB shaderObj); GLhandleARB (APIENTRY *CreateProgramObjectARB) (void); void (APIENTRY *AttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj); void (APIENTRY *LinkProgramARB) (GLhandleARB programObj); void (APIENTRY *UseProgramObjectARB) (GLhandleARB programObj); void (APIENTRY *ValidateProgramARB) (GLhandleARB programObj); void (APIENTRY *Uniform1fARB) (GLint location, GLfloat v0); void (APIENTRY *Uniform2fARB) (GLint location, GLfloat v0, GLfloat v1); void (APIENTRY *Uniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); void (APIENTRY *Uniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); void (APIENTRY *Uniform1iARB) (GLint location, GLint v0); void (APIENTRY *Uniform2iARB) (GLint location, GLint v0, GLint v1); void (APIENTRY *Uniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2); void (APIENTRY *Uniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); void (APIENTRY *Uniform1fvARB) (GLint location, GLsizei count, const GLfloat *value); void (APIENTRY *Uniform2fvARB) (GLint location, GLsizei count, const GLfloat *value); void (APIENTRY *Uniform3fvARB) (GLint location, GLsizei count, const GLfloat *value); void (APIENTRY *Uniform4fvARB) (GLint location, GLsizei count, const GLfloat *value); void (APIENTRY *Uniform1ivARB) (GLint location, GLsizei count, const GLint *value); void (APIENTRY *Uniform2ivARB) (GLint location, GLsizei count, const GLint *value); void (APIENTRY *Uniform3ivARB) (GLint location, GLsizei count, const GLint *value); void (APIENTRY *Uniform4ivARB) (GLint location, GLsizei count, const GLint *value); void (APIENTRY *UniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void (APIENTRY *UniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void (APIENTRY *UniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void (APIENTRY *GetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat *params); void (APIENTRY *GetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint *params); void (APIENTRY *GetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); void (APIENTRY *GetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); GLint (APIENTRY *GetUniformLocationARB) (GLhandleARB programObj, const GLcharARB *name); void (APIENTRY *GetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); void (APIENTRY *GetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat *params); void (APIENTRY *GetUniformivARB) (GLhandleARB programObj, GLint location, GLint *params); void (APIENTRY *GetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); void (APIENTRY *BindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB *name); void (APIENTRY *GetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); GLint (APIENTRY *GetAttribLocationARB) (GLhandleARB programObj, const GLcharARB *name); void (APIENTRY *BlendColorEXT) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); void (APIENTRY *PolygonOffsetEXT) (GLfloat factor, GLfloat bias); void (APIENTRY *TexImage3DEXT) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *TexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *GetTexFilterFuncSGIS) (GLenum target, GLenum filter, GLfloat *weights); void (APIENTRY *TexFilterFuncSGIS) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); void (APIENTRY *TexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *TexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *CopyTexImage1DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); void (APIENTRY *CopyTexImage2DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); void (APIENTRY *CopyTexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); void (APIENTRY *CopyTexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); void (APIENTRY *CopyTexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); void (APIENTRY *GetHistogramEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); void (APIENTRY *GetHistogramParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetHistogramParameterivEXT) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetMinmaxEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); void (APIENTRY *GetMinmaxParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetMinmaxParameterivEXT) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *HistogramEXT) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); void (APIENTRY *MinmaxEXT) (GLenum target, GLenum internalformat, GLboolean sink); void (APIENTRY *ResetHistogramEXT) (GLenum target); void (APIENTRY *ResetMinmaxEXT) (GLenum target); void (APIENTRY *ConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); void (APIENTRY *ConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); void (APIENTRY *ConvolutionParameterfEXT) (GLenum target, GLenum pname, GLfloat params); void (APIENTRY *ConvolutionParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *ConvolutionParameteriEXT) (GLenum target, GLenum pname, GLint params); void (APIENTRY *ConvolutionParameterivEXT) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *CopyConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); void (APIENTRY *CopyConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); void (APIENTRY *GetConvolutionFilterEXT) (GLenum target, GLenum format, GLenum type, GLvoid *image); void (APIENTRY *GetConvolutionParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetConvolutionParameterivEXT) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetSeparableFilterEXT) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); void (APIENTRY *SeparableFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); void (APIENTRY *ColorTableSGI) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); void (APIENTRY *ColorTableParameterfvSGI) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *ColorTableParameterivSGI) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *CopyColorTableSGI) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); void (APIENTRY *GetColorTableSGI) (GLenum target, GLenum format, GLenum type, GLvoid *table); void (APIENTRY *GetColorTableParameterfvSGI) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetColorTableParameterivSGI) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *PixelTexGenSGIX) (GLenum mode); void (APIENTRY *PixelTexGenParameteriSGIS) (GLenum pname, GLint param); void (APIENTRY *PixelTexGenParameterivSGIS) (GLenum pname, const GLint *params); void (APIENTRY *PixelTexGenParameterfSGIS) (GLenum pname, GLfloat param); void (APIENTRY *PixelTexGenParameterfvSGIS) (GLenum pname, const GLfloat *params); void (APIENTRY *GetPixelTexGenParameterivSGIS) (GLenum pname, GLint *params); void (APIENTRY *GetPixelTexGenParameterfvSGIS) (GLenum pname, GLfloat *params); void (APIENTRY *TexImage4DSGIS) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); void (APIENTRY *TexSubImage4DSGIS) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); GLboolean (APIENTRY *AreTexturesResidentEXT) (GLsizei n, const GLuint *textures, GLboolean *residences); void (APIENTRY *BindTextureEXT) (GLenum target, GLuint texture); void (APIENTRY *DeleteTexturesEXT) (GLsizei n, const GLuint *textures); void (APIENTRY *GenTexturesEXT) (GLsizei n, GLuint *textures); GLboolean (APIENTRY *IsTextureEXT) (GLuint texture); void (APIENTRY *PrioritizeTexturesEXT) (GLsizei n, const GLuint *textures, const GLclampf *priorities); void (APIENTRY *DetailTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); void (APIENTRY *GetDetailTexFuncSGIS) (GLenum target, GLfloat *points); void (APIENTRY *SharpenTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); void (APIENTRY *GetSharpenTexFuncSGIS) (GLenum target, GLfloat *points); void (APIENTRY *SampleMaskSGIS) (GLclampf value, GLboolean invert); void (APIENTRY *SamplePatternSGIS) (GLenum pattern); void (APIENTRY *ArrayElementEXT) (GLint i); void (APIENTRY *ColorPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); void (APIENTRY *DrawArraysEXT) (GLenum mode, GLint first, GLsizei count); void (APIENTRY *EdgeFlagPointerEXT) (GLsizei stride, GLsizei count, const GLboolean *pointer); void (APIENTRY *GetPointervEXT) (GLenum pname, GLvoid* *params); void (APIENTRY *IndexPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); void (APIENTRY *NormalPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); void (APIENTRY *TexCoordPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); void (APIENTRY *VertexPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); void (APIENTRY *BlendEquationEXT) (GLenum mode); void (APIENTRY *SpriteParameterfSGIX) (GLenum pname, GLfloat param); void (APIENTRY *SpriteParameterfvSGIX) (GLenum pname, const GLfloat *params); void (APIENTRY *SpriteParameteriSGIX) (GLenum pname, GLint param); void (APIENTRY *SpriteParameterivSGIX) (GLenum pname, const GLint *params); void (APIENTRY *PointParameterfEXT) (GLenum pname, GLfloat param); void (APIENTRY *PointParameterfvEXT) (GLenum pname, const GLfloat *params); void (APIENTRY *PointParameterfSGIS) (GLenum pname, GLfloat param); void (APIENTRY *PointParameterfvSGIS) (GLenum pname, const GLfloat *params); GLint (APIENTRY *GetInstrumentsSGIX) (void); void (APIENTRY *InstrumentsBufferSGIX) (GLsizei size, GLint *buffer); GLint (APIENTRY *PollInstrumentsSGIX) (GLint *marker_p); void (APIENTRY *ReadInstrumentsSGIX) (GLint marker); void (APIENTRY *StartInstrumentsSGIX) (void); void (APIENTRY *StopInstrumentsSGIX) (GLint marker); void (APIENTRY *FrameZoomSGIX) (GLint factor); void (APIENTRY *TagSampleBufferSGIX) (void); void (APIENTRY *DeformationMap3dSGIX) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); void (APIENTRY *DeformationMap3fSGIX) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); void (APIENTRY *DeformSGIX) (GLbitfield mask); void (APIENTRY *LoadIdentityDeformationMapSGIX) (GLbitfield mask); void (APIENTRY *ReferencePlaneSGIX) (const GLdouble *equation); void (APIENTRY *FlushRasterSGIX) (void); void (APIENTRY *FogFuncSGIS) (GLsizei n, const GLfloat *points); void (APIENTRY *GetFogFuncSGIS) (GLfloat *points); void (APIENTRY *ImageTransformParameteriHP) (GLenum target, GLenum pname, GLint param); void (APIENTRY *ImageTransformParameterfHP) (GLenum target, GLenum pname, GLfloat param); void (APIENTRY *ImageTransformParameterivHP) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *ImageTransformParameterfvHP) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *GetImageTransformParameterivHP) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetImageTransformParameterfvHP) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *ColorSubTableEXT) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); void (APIENTRY *CopyColorSubTableEXT) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); void (APIENTRY *HintPGI) (GLenum target, GLint mode); void (APIENTRY *ColorTableEXT) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); void (APIENTRY *GetColorTableEXT) (GLenum target, GLenum format, GLenum type, GLvoid *data); void (APIENTRY *GetColorTableParameterivEXT) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetColorTableParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetListParameterfvSGIX) (GLuint list, GLenum pname, GLfloat *params); void (APIENTRY *GetListParameterivSGIX) (GLuint list, GLenum pname, GLint *params); void (APIENTRY *ListParameterfSGIX) (GLuint list, GLenum pname, GLfloat param); void (APIENTRY *ListParameterfvSGIX) (GLuint list, GLenum pname, const GLfloat *params); void (APIENTRY *ListParameteriSGIX) (GLuint list, GLenum pname, GLint param); void (APIENTRY *ListParameterivSGIX) (GLuint list, GLenum pname, const GLint *params); void (APIENTRY *IndexMaterialEXT) (GLenum face, GLenum mode); void (APIENTRY *IndexFuncEXT) (GLenum func, GLclampf ref); void (APIENTRY *LockArraysEXT) (GLint first, GLsizei count); void (APIENTRY *UnlockArraysEXT) (void); void (APIENTRY *CullParameterdvEXT) (GLenum pname, GLdouble *params); void (APIENTRY *CullParameterfvEXT) (GLenum pname, GLfloat *params); void (APIENTRY *FragmentColorMaterialSGIX) (GLenum face, GLenum mode); void (APIENTRY *FragmentLightfSGIX) (GLenum light, GLenum pname, GLfloat param); void (APIENTRY *FragmentLightfvSGIX) (GLenum light, GLenum pname, const GLfloat *params); void (APIENTRY *FragmentLightiSGIX) (GLenum light, GLenum pname, GLint param); void (APIENTRY *FragmentLightivSGIX) (GLenum light, GLenum pname, const GLint *params); void (APIENTRY *FragmentLightModelfSGIX) (GLenum pname, GLfloat param); void (APIENTRY *FragmentLightModelfvSGIX) (GLenum pname, const GLfloat *params); void (APIENTRY *FragmentLightModeliSGIX) (GLenum pname, GLint param); void (APIENTRY *FragmentLightModelivSGIX) (GLenum pname, const GLint *params); void (APIENTRY *FragmentMaterialfSGIX) (GLenum face, GLenum pname, GLfloat param); void (APIENTRY *FragmentMaterialfvSGIX) (GLenum face, GLenum pname, const GLfloat *params); void (APIENTRY *FragmentMaterialiSGIX) (GLenum face, GLenum pname, GLint param); void (APIENTRY *FragmentMaterialivSGIX) (GLenum face, GLenum pname, const GLint *params); void (APIENTRY *GetFragmentLightfvSGIX) (GLenum light, GLenum pname, GLfloat *params); void (APIENTRY *GetFragmentLightivSGIX) (GLenum light, GLenum pname, GLint *params); void (APIENTRY *GetFragmentMaterialfvSGIX) (GLenum face, GLenum pname, GLfloat *params); void (APIENTRY *GetFragmentMaterialivSGIX) (GLenum face, GLenum pname, GLint *params); void (APIENTRY *LightEnviSGIX) (GLenum pname, GLint param); void (APIENTRY *DrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); void (APIENTRY *ApplyTextureEXT) (GLenum mode); void (APIENTRY *TextureLightEXT) (GLenum pname); void (APIENTRY *TextureMaterialEXT) (GLenum face, GLenum mode); void (APIENTRY *AsyncMarkerSGIX) (GLuint marker); GLint (APIENTRY *FinishAsyncSGIX) (GLuint *markerp); GLint (APIENTRY *PollAsyncSGIX) (GLuint *markerp); GLuint (APIENTRY *GenAsyncMarkersSGIX) (GLsizei range); void (APIENTRY *DeleteAsyncMarkersSGIX) (GLuint marker, GLsizei range); GLboolean (APIENTRY *IsAsyncMarkerSGIX) (GLuint marker); void (APIENTRY *VertexPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); void (APIENTRY *NormalPointervINTEL) (GLenum type, const GLvoid* *pointer); void (APIENTRY *ColorPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); void (APIENTRY *TexCoordPointervINTEL) (GLint size, GLenum type, const GLvoid* *pointer); void (APIENTRY *PixelTransformParameteriEXT) (GLenum target, GLenum pname, GLint param); void (APIENTRY *PixelTransformParameterfEXT) (GLenum target, GLenum pname, GLfloat param); void (APIENTRY *PixelTransformParameterivEXT) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *PixelTransformParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *SecondaryColor3bEXT) (GLbyte red, GLbyte green, GLbyte blue); void (APIENTRY *SecondaryColor3bvEXT) (const GLbyte *v); void (APIENTRY *SecondaryColor3dEXT) (GLdouble red, GLdouble green, GLdouble blue); void (APIENTRY *SecondaryColor3dvEXT) (const GLdouble *v); void (APIENTRY *SecondaryColor3fEXT) (GLfloat red, GLfloat green, GLfloat blue); void (APIENTRY *SecondaryColor3fvEXT) (const GLfloat *v); void (APIENTRY *SecondaryColor3iEXT) (GLint red, GLint green, GLint blue); void (APIENTRY *SecondaryColor3ivEXT) (const GLint *v); void (APIENTRY *SecondaryColor3sEXT) (GLshort red, GLshort green, GLshort blue); void (APIENTRY *SecondaryColor3svEXT) (const GLshort *v); void (APIENTRY *SecondaryColor3ubEXT) (GLubyte red, GLubyte green, GLubyte blue); void (APIENTRY *SecondaryColor3ubvEXT) (const GLubyte *v); void (APIENTRY *SecondaryColor3uiEXT) (GLuint red, GLuint green, GLuint blue); void (APIENTRY *SecondaryColor3uivEXT) (const GLuint *v); void (APIENTRY *SecondaryColor3usEXT) (GLushort red, GLushort green, GLushort blue); void (APIENTRY *SecondaryColor3usvEXT) (const GLushort *v); void (APIENTRY *SecondaryColorPointerEXT) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *TextureNormalEXT) (GLenum mode); void (APIENTRY *MultiDrawArraysEXT) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); void (APIENTRY *MultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); void (APIENTRY *FogCoordfEXT) (GLfloat coord); void (APIENTRY *FogCoordfvEXT) (const GLfloat *coord); void (APIENTRY *FogCoorddEXT) (GLdouble coord); void (APIENTRY *FogCoorddvEXT) (const GLdouble *coord); void (APIENTRY *FogCoordPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *Tangent3bEXT) (GLbyte tx, GLbyte ty, GLbyte tz); void (APIENTRY *Tangent3bvEXT) (const GLbyte *v); void (APIENTRY *Tangent3dEXT) (GLdouble tx, GLdouble ty, GLdouble tz); void (APIENTRY *Tangent3dvEXT) (const GLdouble *v); void (APIENTRY *Tangent3fEXT) (GLfloat tx, GLfloat ty, GLfloat tz); void (APIENTRY *Tangent3fvEXT) (const GLfloat *v); void (APIENTRY *Tangent3iEXT) (GLint tx, GLint ty, GLint tz); void (APIENTRY *Tangent3ivEXT) (const GLint *v); void (APIENTRY *Tangent3sEXT) (GLshort tx, GLshort ty, GLshort tz); void (APIENTRY *Tangent3svEXT) (const GLshort *v); void (APIENTRY *Binormal3bEXT) (GLbyte bx, GLbyte by, GLbyte bz); void (APIENTRY *Binormal3bvEXT) (const GLbyte *v); void (APIENTRY *Binormal3dEXT) (GLdouble bx, GLdouble by, GLdouble bz); void (APIENTRY *Binormal3dvEXT) (const GLdouble *v); void (APIENTRY *Binormal3fEXT) (GLfloat bx, GLfloat by, GLfloat bz); void (APIENTRY *Binormal3fvEXT) (const GLfloat *v); void (APIENTRY *Binormal3iEXT) (GLint bx, GLint by, GLint bz); void (APIENTRY *Binormal3ivEXT) (const GLint *v); void (APIENTRY *Binormal3sEXT) (GLshort bx, GLshort by, GLshort bz); void (APIENTRY *Binormal3svEXT) (const GLshort *v); void (APIENTRY *TangentPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *BinormalPointerEXT) (GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *FinishTextureSUNX) (void); void (APIENTRY *GlobalAlphaFactorbSUN) (GLbyte factor); void (APIENTRY *GlobalAlphaFactorsSUN) (GLshort factor); void (APIENTRY *GlobalAlphaFactoriSUN) (GLint factor); void (APIENTRY *GlobalAlphaFactorfSUN) (GLfloat factor); void (APIENTRY *GlobalAlphaFactordSUN) (GLdouble factor); void (APIENTRY *GlobalAlphaFactorubSUN) (GLubyte factor); void (APIENTRY *GlobalAlphaFactorusSUN) (GLushort factor); void (APIENTRY *GlobalAlphaFactoruiSUN) (GLuint factor); void (APIENTRY *ReplacementCodeuiSUN) (GLuint code); void (APIENTRY *ReplacementCodeusSUN) (GLushort code); void (APIENTRY *ReplacementCodeubSUN) (GLubyte code); void (APIENTRY *ReplacementCodeuivSUN) (const GLuint *code); void (APIENTRY *ReplacementCodeusvSUN) (const GLushort *code); void (APIENTRY *ReplacementCodeubvSUN) (const GLubyte *code); void (APIENTRY *ReplacementCodePointerSUN) (GLenum type, GLsizei stride, const GLvoid* *pointer); void (APIENTRY *Color4ubVertex2fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); void (APIENTRY *Color4ubVertex2fvSUN) (const GLubyte *c, const GLfloat *v); void (APIENTRY *Color4ubVertex3fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *Color4ubVertex3fvSUN) (const GLubyte *c, const GLfloat *v); void (APIENTRY *Color3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *Color3fVertex3fvSUN) (const GLfloat *c, const GLfloat *v); void (APIENTRY *Normal3fVertex3fSUN) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *Normal3fVertex3fvSUN) (const GLfloat *n, const GLfloat *v); void (APIENTRY *Color4fNormal3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *Color4fNormal3fVertex3fvSUN) (const GLfloat *c, const GLfloat *n, const GLfloat *v); void (APIENTRY *TexCoord2fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *TexCoord2fVertex3fvSUN) (const GLfloat *tc, const GLfloat *v); void (APIENTRY *TexCoord4fVertex4fSUN) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *TexCoord4fVertex4fvSUN) (const GLfloat *tc, const GLfloat *v); void (APIENTRY *TexCoord2fColor4ubVertex3fSUN) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *TexCoord2fColor4ubVertex3fvSUN) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); void (APIENTRY *TexCoord2fColor3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *TexCoord2fColor3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); void (APIENTRY *TexCoord2fNormal3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *TexCoord2fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); void (APIENTRY *TexCoord2fColor4fNormal3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *TexCoord2fColor4fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); void (APIENTRY *TexCoord4fColor4fNormal3fVertex4fSUN) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *TexCoord4fColor4fNormal3fVertex4fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); void (APIENTRY *ReplacementCodeuiVertex3fSUN) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiVertex3fvSUN) (const GLuint *rc, const GLfloat *v); void (APIENTRY *ReplacementCodeuiColor4ubVertex3fSUN) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiColor4ubVertex3fvSUN) (const GLuint *rc, const GLubyte *c, const GLfloat *v); void (APIENTRY *ReplacementCodeuiColor3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiColor3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *v); void (APIENTRY *ReplacementCodeuiNormal3fVertex3fSUN) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *n, const GLfloat *v); void (APIENTRY *ReplacementCodeuiColor4fNormal3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); void (APIENTRY *ReplacementCodeuiTexCoord2fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiTexCoord2fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); void (APIENTRY *ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); void (APIENTRY *ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); void (APIENTRY *BlendFuncSeparateEXT) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); void (APIENTRY *BlendFuncSeparateINGR) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); void (APIENTRY *VertexWeightfEXT) (GLfloat weight); void (APIENTRY *VertexWeightfvEXT) (const GLfloat *weight); void (APIENTRY *VertexWeightPointerEXT) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *FlushVertexArrayRangeNV) (void); void (APIENTRY *VertexArrayRangeNV) (GLsizei length, const GLvoid *pointer); void (APIENTRY *CombinerParameterfvNV) (GLenum pname, const GLfloat *params); void (APIENTRY *CombinerParameterfNV) (GLenum pname, GLfloat param); void (APIENTRY *CombinerParameterivNV) (GLenum pname, const GLint *params); void (APIENTRY *CombinerParameteriNV) (GLenum pname, GLint param); void (APIENTRY *CombinerInputNV) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); void (APIENTRY *CombinerOutputNV) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); void (APIENTRY *FinalCombinerInputNV) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); void (APIENTRY *GetCombinerInputParameterfvNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); void (APIENTRY *GetCombinerInputParameterivNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); void (APIENTRY *GetCombinerOutputParameterfvNV) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); void (APIENTRY *GetCombinerOutputParameterivNV) (GLenum stage, GLenum portion, GLenum pname, GLint *params); void (APIENTRY *GetFinalCombinerInputParameterfvNV) (GLenum variable, GLenum pname, GLfloat *params); void (APIENTRY *GetFinalCombinerInputParameterivNV) (GLenum variable, GLenum pname, GLint *params); void (APIENTRY *ResizeBuffersMESA) (void); void (APIENTRY *WindowPos2dMESA) (GLdouble x, GLdouble y); void (APIENTRY *WindowPos2dvMESA) (const GLdouble *v); void (APIENTRY *WindowPos2fMESA) (GLfloat x, GLfloat y); void (APIENTRY *WindowPos2fvMESA) (const GLfloat *v); void (APIENTRY *WindowPos2iMESA) (GLint x, GLint y); void (APIENTRY *WindowPos2ivMESA) (const GLint *v); void (APIENTRY *WindowPos2sMESA) (GLshort x, GLshort y); void (APIENTRY *WindowPos2svMESA) (const GLshort *v); void (APIENTRY *WindowPos3dMESA) (GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *WindowPos3dvMESA) (const GLdouble *v); void (APIENTRY *WindowPos3fMESA) (GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *WindowPos3fvMESA) (const GLfloat *v); void (APIENTRY *WindowPos3iMESA) (GLint x, GLint y, GLint z); void (APIENTRY *WindowPos3ivMESA) (const GLint *v); void (APIENTRY *WindowPos3sMESA) (GLshort x, GLshort y, GLshort z); void (APIENTRY *WindowPos3svMESA) (const GLshort *v); void (APIENTRY *WindowPos4dMESA) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *WindowPos4dvMESA) (const GLdouble *v); void (APIENTRY *WindowPos4fMESA) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *WindowPos4fvMESA) (const GLfloat *v); void (APIENTRY *WindowPos4iMESA) (GLint x, GLint y, GLint z, GLint w); void (APIENTRY *WindowPos4ivMESA) (const GLint *v); void (APIENTRY *WindowPos4sMESA) (GLshort x, GLshort y, GLshort z, GLshort w); void (APIENTRY *WindowPos4svMESA) (const GLshort *v); void (APIENTRY *MultiModeDrawArraysIBM) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); void (APIENTRY *MultiModeDrawElementsIBM) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); void (APIENTRY *ColorPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *SecondaryColorPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *EdgeFlagPointerListIBM) (GLint stride, const GLboolean* *pointer, GLint ptrstride); void (APIENTRY *FogCoordPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *IndexPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *NormalPointerListIBM) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *TexCoordPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *VertexPointerListIBM) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); void (APIENTRY *TbufferMask3DFX) (GLuint mask); void (APIENTRY *SampleMaskEXT) (GLclampf value, GLboolean invert); void (APIENTRY *SamplePatternEXT) (GLenum pattern); void (APIENTRY *TextureColorMaskSGIS) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); void (APIENTRY *IglooInterfaceSGIX) (GLenum pname, const GLvoid *params); void (APIENTRY *DeleteFencesNV) (GLsizei n, const GLuint *fences); void (APIENTRY *GenFencesNV) (GLsizei n, GLuint *fences); GLboolean (APIENTRY *IsFenceNV) (GLuint fence); GLboolean (APIENTRY *TestFenceNV) (GLuint fence); void (APIENTRY *GetFenceivNV) (GLuint fence, GLenum pname, GLint *params); void (APIENTRY *FinishFenceNV) (GLuint fence); void (APIENTRY *SetFenceNV) (GLuint fence, GLenum condition); void (APIENTRY *MapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); void (APIENTRY *MapParameterivNV) (GLenum target, GLenum pname, const GLint *params); void (APIENTRY *MapParameterfvNV) (GLenum target, GLenum pname, const GLfloat *params); void (APIENTRY *GetMapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); void (APIENTRY *GetMapParameterivNV) (GLenum target, GLenum pname, GLint *params); void (APIENTRY *GetMapParameterfvNV) (GLenum target, GLenum pname, GLfloat *params); void (APIENTRY *GetMapAttribParameterivNV) (GLenum target, GLuint index, GLenum pname, GLint *params); void (APIENTRY *GetMapAttribParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); void (APIENTRY *EvalMapsNV) (GLenum target, GLenum mode); void (APIENTRY *CombinerStageParameterfvNV) (GLenum stage, GLenum pname, const GLfloat *params); void (APIENTRY *GetCombinerStageParameterfvNV) (GLenum stage, GLenum pname, GLfloat *params); GLboolean (APIENTRY *AreProgramsResidentNV) (GLsizei n, const GLuint *programs, GLboolean *residences); void (APIENTRY *BindProgramNV) (GLenum target, GLuint id); void (APIENTRY *DeleteProgramsNV) (GLsizei n, const GLuint *programs); void (APIENTRY *ExecuteProgramNV) (GLenum target, GLuint id, const GLfloat *params); void (APIENTRY *GenProgramsNV) (GLsizei n, GLuint *programs); void (APIENTRY *GetProgramParameterdvNV) (GLenum target, GLuint index, GLenum pname, GLdouble *params); void (APIENTRY *GetProgramParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); void (APIENTRY *GetProgramivNV) (GLuint id, GLenum pname, GLint *params); void (APIENTRY *GetProgramStringNV) (GLuint id, GLenum pname, GLubyte *program); void (APIENTRY *GetTrackMatrixivNV) (GLenum target, GLuint address, GLenum pname, GLint *params); void (APIENTRY *GetVertexAttribdvNV) (GLuint index, GLenum pname, GLdouble *params); void (APIENTRY *GetVertexAttribfvNV) (GLuint index, GLenum pname, GLfloat *params); void (APIENTRY *GetVertexAttribivNV) (GLuint index, GLenum pname, GLint *params); void (APIENTRY *GetVertexAttribPointervNV) (GLuint index, GLenum pname, GLvoid* *pointer); GLboolean (APIENTRY *IsProgramNV) (GLuint id); void (APIENTRY *LoadProgramNV) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); void (APIENTRY *ProgramParameter4dNV) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *ProgramParameter4dvNV) (GLenum target, GLuint index, const GLdouble *v); void (APIENTRY *ProgramParameter4fNV) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *ProgramParameter4fvNV) (GLenum target, GLuint index, const GLfloat *v); void (APIENTRY *ProgramParameters4dvNV) (GLenum target, GLuint index, GLuint count, const GLdouble *v); void (APIENTRY *ProgramParameters4fvNV) (GLenum target, GLuint index, GLuint count, const GLfloat *v); void (APIENTRY *RequestResidentProgramsNV) (GLsizei n, const GLuint *programs); void (APIENTRY *TrackMatrixNV) (GLenum target, GLuint address, GLenum matrix, GLenum transform); void (APIENTRY *VertexAttribPointerNV) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY *VertexAttrib1dNV) (GLuint index, GLdouble x); void (APIENTRY *VertexAttrib1dvNV) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib1fNV) (GLuint index, GLfloat x); void (APIENTRY *VertexAttrib1fvNV) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib1sNV) (GLuint index, GLshort x); void (APIENTRY *VertexAttrib1svNV) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib2dNV) (GLuint index, GLdouble x, GLdouble y); void (APIENTRY *VertexAttrib2dvNV) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib2fNV) (GLuint index, GLfloat x, GLfloat y); void (APIENTRY *VertexAttrib2fvNV) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib2sNV) (GLuint index, GLshort x, GLshort y); void (APIENTRY *VertexAttrib2svNV) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib3dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *VertexAttrib3dvNV) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib3fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *VertexAttrib3fvNV) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib3sNV) (GLuint index, GLshort x, GLshort y, GLshort z); void (APIENTRY *VertexAttrib3svNV) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib4dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *VertexAttrib4dvNV) (GLuint index, const GLdouble *v); void (APIENTRY *VertexAttrib4fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *VertexAttrib4fvNV) (GLuint index, const GLfloat *v); void (APIENTRY *VertexAttrib4sNV) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); void (APIENTRY *VertexAttrib4svNV) (GLuint index, const GLshort *v); void (APIENTRY *VertexAttrib4ubNV) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); void (APIENTRY *VertexAttrib4ubvNV) (GLuint index, const GLubyte *v); void (APIENTRY *VertexAttribs1dvNV) (GLuint index, GLsizei count, const GLdouble *v); void (APIENTRY *VertexAttribs1fvNV) (GLuint index, GLsizei count, const GLfloat *v); void (APIENTRY *VertexAttribs1svNV) (GLuint index, GLsizei count, const GLshort *v); void (APIENTRY *VertexAttribs2dvNV) (GLuint index, GLsizei count, const GLdouble *v); void (APIENTRY *VertexAttribs2fvNV) (GLuint index, GLsizei count, const GLfloat *v); void (APIENTRY *VertexAttribs2svNV) (GLuint index, GLsizei count, const GLshort *v); void (APIENTRY *VertexAttribs3dvNV) (GLuint index, GLsizei count, const GLdouble *v); void (APIENTRY *VertexAttribs3fvNV) (GLuint index, GLsizei count, const GLfloat *v); void (APIENTRY *VertexAttribs3svNV) (GLuint index, GLsizei count, const GLshort *v); void (APIENTRY *VertexAttribs4dvNV) (GLuint index, GLsizei count, const GLdouble *v); void (APIENTRY *VertexAttribs4fvNV) (GLuint index, GLsizei count, const GLfloat *v); void (APIENTRY *VertexAttribs4svNV) (GLuint index, GLsizei count, const GLshort *v); void (APIENTRY *VertexAttribs4ubvNV) (GLuint index, GLsizei count, const GLubyte *v); void (APIENTRY *TexBumpParameterivATI) (GLenum pname, const GLint *param); void (APIENTRY *TexBumpParameterfvATI) (GLenum pname, const GLfloat *param); void (APIENTRY *GetTexBumpParameterivATI) (GLenum pname, GLint *param); void (APIENTRY *GetTexBumpParameterfvATI) (GLenum pname, GLfloat *param); GLuint (APIENTRY *GenFragmentShadersATI) (GLuint range); void (APIENTRY *BindFragmentShaderATI) (GLuint id); void (APIENTRY *DeleteFragmentShaderATI) (GLuint id); void (APIENTRY *BeginFragmentShaderATI) (void); void (APIENTRY *EndFragmentShaderATI) (void); void (APIENTRY *PassTexCoordATI) (GLuint dst, GLuint coord, GLenum swizzle); void (APIENTRY *SampleMapATI) (GLuint dst, GLuint interp, GLenum swizzle); void (APIENTRY *ColorFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); void (APIENTRY *ColorFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); void (APIENTRY *ColorFragmentOp3ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); void (APIENTRY *AlphaFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); void (APIENTRY *AlphaFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); void (APIENTRY *AlphaFragmentOp3ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); void (APIENTRY *SetFragmentShaderConstantATI) (GLuint dst, const GLfloat *value); void (APIENTRY *PNTrianglesiATI) (GLenum pname, GLint param); void (APIENTRY *PNTrianglesfATI) (GLenum pname, GLfloat param); GLuint (APIENTRY *NewObjectBufferATI) (GLsizei size, const GLvoid *pointer, GLenum usage); GLboolean (APIENTRY *IsObjectBufferATI) (GLuint buffer); void (APIENTRY *UpdateObjectBufferATI) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); void (APIENTRY *GetObjectBufferfvATI) (GLuint buffer, GLenum pname, GLfloat *params); void (APIENTRY *GetObjectBufferivATI) (GLuint buffer, GLenum pname, GLint *params); void (APIENTRY *FreeObjectBufferATI) (GLuint buffer); void (APIENTRY *ArrayObjectATI) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); void (APIENTRY *GetArrayObjectfvATI) (GLenum array, GLenum pname, GLfloat *params); void (APIENTRY *GetArrayObjectivATI) (GLenum array, GLenum pname, GLint *params); void (APIENTRY *VariantArrayObjectATI) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); void (APIENTRY *GetVariantArrayObjectfvATI) (GLuint id, GLenum pname, GLfloat *params); void (APIENTRY *GetVariantArrayObjectivATI) (GLuint id, GLenum pname, GLint *params); void (APIENTRY *BeginVertexShaderEXT) (void); void (APIENTRY *EndVertexShaderEXT) (void); void (APIENTRY *BindVertexShaderEXT) (GLuint id); GLuint (APIENTRY *GenVertexShadersEXT) (GLuint range); void (APIENTRY *DeleteVertexShaderEXT) (GLuint id); void (APIENTRY *ShaderOp1EXT) (GLenum op, GLuint res, GLuint arg1); void (APIENTRY *ShaderOp2EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); void (APIENTRY *ShaderOp3EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); void (APIENTRY *SwizzleEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); void (APIENTRY *WriteMaskEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); void (APIENTRY *InsertComponentEXT) (GLuint res, GLuint src, GLuint num); void (APIENTRY *ExtractComponentEXT) (GLuint res, GLuint src, GLuint num); GLuint (APIENTRY *GenSymbolsEXT) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); void (APIENTRY *SetInvariantEXT) (GLuint id, GLenum type, const GLvoid *addr); void (APIENTRY *SetLocalConstantEXT) (GLuint id, GLenum type, const GLvoid *addr); void (APIENTRY *VariantbvEXT) (GLuint id, const GLbyte *addr); void (APIENTRY *VariantsvEXT) (GLuint id, const GLshort *addr); void (APIENTRY *VariantivEXT) (GLuint id, const GLint *addr); void (APIENTRY *VariantfvEXT) (GLuint id, const GLfloat *addr); void (APIENTRY *VariantdvEXT) (GLuint id, const GLdouble *addr); void (APIENTRY *VariantubvEXT) (GLuint id, const GLubyte *addr); void (APIENTRY *VariantusvEXT) (GLuint id, const GLushort *addr); void (APIENTRY *VariantuivEXT) (GLuint id, const GLuint *addr); void (APIENTRY *VariantPointerEXT) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); void (APIENTRY *EnableVariantClientStateEXT) (GLuint id); void (APIENTRY *DisableVariantClientStateEXT) (GLuint id); GLuint (APIENTRY *BindLightParameterEXT) (GLenum light, GLenum value); GLuint (APIENTRY *BindMaterialParameterEXT) (GLenum face, GLenum value); GLuint (APIENTRY *BindTexGenParameterEXT) (GLenum unit, GLenum coord, GLenum value); GLuint (APIENTRY *BindTextureUnitParameterEXT) (GLenum unit, GLenum value); GLuint (APIENTRY *BindParameterEXT) (GLenum value); GLboolean (APIENTRY *IsVariantEnabledEXT) (GLuint id, GLenum cap); void (APIENTRY *GetVariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); void (APIENTRY *GetVariantIntegervEXT) (GLuint id, GLenum value, GLint *data); void (APIENTRY *GetVariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); void (APIENTRY *GetVariantPointervEXT) (GLuint id, GLenum value, GLvoid* *data); void (APIENTRY *GetInvariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); void (APIENTRY *GetInvariantIntegervEXT) (GLuint id, GLenum value, GLint *data); void (APIENTRY *GetInvariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); void (APIENTRY *GetLocalConstantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); void (APIENTRY *GetLocalConstantIntegervEXT) (GLuint id, GLenum value, GLint *data); void (APIENTRY *GetLocalConstantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); void (APIENTRY *VertexStream1sATI) (GLenum stream, GLshort x); void (APIENTRY *VertexStream1svATI) (GLenum stream, const GLshort *coords); void (APIENTRY *VertexStream1iATI) (GLenum stream, GLint x); void (APIENTRY *VertexStream1ivATI) (GLenum stream, const GLint *coords); void (APIENTRY *VertexStream1fATI) (GLenum stream, GLfloat x); void (APIENTRY *VertexStream1fvATI) (GLenum stream, const GLfloat *coords); void (APIENTRY *VertexStream1dATI) (GLenum stream, GLdouble x); void (APIENTRY *VertexStream1dvATI) (GLenum stream, const GLdouble *coords); void (APIENTRY *VertexStream2sATI) (GLenum stream, GLshort x, GLshort y); void (APIENTRY *VertexStream2svATI) (GLenum stream, const GLshort *coords); void (APIENTRY *VertexStream2iATI) (GLenum stream, GLint x, GLint y); void (APIENTRY *VertexStream2ivATI) (GLenum stream, const GLint *coords); void (APIENTRY *VertexStream2fATI) (GLenum stream, GLfloat x, GLfloat y); void (APIENTRY *VertexStream2fvATI) (GLenum stream, const GLfloat *coords); void (APIENTRY *VertexStream2dATI) (GLenum stream, GLdouble x, GLdouble y); void (APIENTRY *VertexStream2dvATI) (GLenum stream, const GLdouble *coords); void (APIENTRY *VertexStream3sATI) (GLenum stream, GLshort x, GLshort y, GLshort z); void (APIENTRY *VertexStream3svATI) (GLenum stream, const GLshort *coords); void (APIENTRY *VertexStream3iATI) (GLenum stream, GLint x, GLint y, GLint z); void (APIENTRY *VertexStream3ivATI) (GLenum stream, const GLint *coords); void (APIENTRY *VertexStream3fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); void (APIENTRY *VertexStream3fvATI) (GLenum stream, const GLfloat *coords); void (APIENTRY *VertexStream3dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); void (APIENTRY *VertexStream3dvATI) (GLenum stream, const GLdouble *coords); void (APIENTRY *VertexStream4sATI) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); void (APIENTRY *VertexStream4svATI) (GLenum stream, const GLshort *coords); void (APIENTRY *VertexStream4iATI) (GLenum stream, GLint x, GLint y, GLint z, GLint w); void (APIENTRY *VertexStream4ivATI) (GLenum stream, const GLint *coords); void (APIENTRY *VertexStream4fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *VertexStream4fvATI) (GLenum stream, const GLfloat *coords); void (APIENTRY *VertexStream4dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *VertexStream4dvATI) (GLenum stream, const GLdouble *coords); void (APIENTRY *NormalStream3bATI) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); void (APIENTRY *NormalStream3bvATI) (GLenum stream, const GLbyte *coords); void (APIENTRY *NormalStream3sATI) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); void (APIENTRY *NormalStream3svATI) (GLenum stream, const GLshort *coords); void (APIENTRY *NormalStream3iATI) (GLenum stream, GLint nx, GLint ny, GLint nz); void (APIENTRY *NormalStream3ivATI) (GLenum stream, const GLint *coords); void (APIENTRY *NormalStream3fATI) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); void (APIENTRY *NormalStream3fvATI) (GLenum stream, const GLfloat *coords); void (APIENTRY *NormalStream3dATI) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); void (APIENTRY *NormalStream3dvATI) (GLenum stream, const GLdouble *coords); void (APIENTRY *ClientActiveVertexStreamATI) (GLenum stream); void (APIENTRY *VertexBlendEnviATI) (GLenum pname, GLint param); void (APIENTRY *VertexBlendEnvfATI) (GLenum pname, GLfloat param); void (APIENTRY *ElementPointerATI) (GLenum type, const GLvoid *pointer); void (APIENTRY *DrawElementArrayATI) (GLenum mode, GLsizei count); void (APIENTRY *DrawRangeElementArrayATI) (GLenum mode, GLuint start, GLuint end, GLsizei count); void (APIENTRY *DrawMeshArraysSUN) (GLenum mode, GLint first, GLsizei count, GLsizei width); void (APIENTRY *GenOcclusionQueriesNV) (GLsizei n, GLuint *ids); void (APIENTRY *DeleteOcclusionQueriesNV) (GLsizei n, const GLuint *ids); GLboolean (APIENTRY *IsOcclusionQueryNV) (GLuint id); void (APIENTRY *BeginOcclusionQueryNV) (GLuint id); void (APIENTRY *EndOcclusionQueryNV) (void); void (APIENTRY *GetOcclusionQueryivNV) (GLuint id, GLenum pname, GLint *params); void (APIENTRY *GetOcclusionQueryuivNV) (GLuint id, GLenum pname, GLuint *params); void (APIENTRY *PointParameteriNV) (GLenum pname, GLint param); void (APIENTRY *PointParameterivNV) (GLenum pname, const GLint *params); void (APIENTRY *ActiveStencilFaceEXT) (GLenum face); void (APIENTRY *ElementPointerAPPLE) (GLenum type, const GLvoid *pointer); void (APIENTRY *DrawElementArrayAPPLE) (GLenum mode, GLint first, GLsizei count); void (APIENTRY *DrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); void (APIENTRY *MultiDrawElementArrayAPPLE) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); void (APIENTRY *MultiDrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); void (APIENTRY *GenFencesAPPLE) (GLsizei n, GLuint *fences); void (APIENTRY *DeleteFencesAPPLE) (GLsizei n, const GLuint *fences); void (APIENTRY *SetFenceAPPLE) (GLuint fence); GLboolean (APIENTRY *IsFenceAPPLE) (GLuint fence); GLboolean (APIENTRY *TestFenceAPPLE) (GLuint fence); void (APIENTRY *FinishFenceAPPLE) (GLuint fence); GLboolean (APIENTRY *TestObjectAPPLE) (GLenum object, GLuint name); void (APIENTRY *FinishObjectAPPLE) (GLenum object, GLint name); void (APIENTRY *BindVertexArrayAPPLE) (GLuint array); void (APIENTRY *DeleteVertexArraysAPPLE) (GLsizei n, const GLuint *arrays); void (APIENTRY *GenVertexArraysAPPLE) (GLsizei n, const GLuint *arrays); GLboolean (APIENTRY *IsVertexArrayAPPLE) (GLuint array); void (APIENTRY *VertexArrayRangeAPPLE) (GLsizei length, GLvoid *pointer); void (APIENTRY *FlushVertexArrayRangeAPPLE) (GLsizei length, GLvoid *pointer); void (APIENTRY *VertexArrayParameteriAPPLE) (GLenum pname, GLint param); void (APIENTRY *DrawBuffersATI) (GLsizei n, const GLenum *bufs); void (APIENTRY *ProgramNamedParameter4fNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void (APIENTRY *ProgramNamedParameter4dNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); void (APIENTRY *ProgramNamedParameter4fvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); void (APIENTRY *ProgramNamedParameter4dvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); void (APIENTRY *GetProgramNamedParameterfvNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); void (APIENTRY *GetProgramNamedParameterdvNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); void (APIENTRY *Vertex2hNV) (GLhalfNV x, GLhalfNV y); void (APIENTRY *Vertex2hvNV) (const GLhalfNV *v); void (APIENTRY *Vertex3hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z); void (APIENTRY *Vertex3hvNV) (const GLhalfNV *v); void (APIENTRY *Vertex4hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); void (APIENTRY *Vertex4hvNV) (const GLhalfNV *v); void (APIENTRY *Normal3hNV) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); void (APIENTRY *Normal3hvNV) (const GLhalfNV *v); void (APIENTRY *Color3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); void (APIENTRY *Color3hvNV) (const GLhalfNV *v); void (APIENTRY *Color4hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); void (APIENTRY *Color4hvNV) (const GLhalfNV *v); void (APIENTRY *TexCoord1hNV) (GLhalfNV s); void (APIENTRY *TexCoord1hvNV) (const GLhalfNV *v); void (APIENTRY *TexCoord2hNV) (GLhalfNV s, GLhalfNV t); void (APIENTRY *TexCoord2hvNV) (const GLhalfNV *v); void (APIENTRY *TexCoord3hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r); void (APIENTRY *TexCoord3hvNV) (const GLhalfNV *v); void (APIENTRY *TexCoord4hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); void (APIENTRY *TexCoord4hvNV) (const GLhalfNV *v); void (APIENTRY *MultiTexCoord1hNV) (GLenum target, GLhalfNV s); void (APIENTRY *MultiTexCoord1hvNV) (GLenum target, const GLhalfNV *v); void (APIENTRY *MultiTexCoord2hNV) (GLenum target, GLhalfNV s, GLhalfNV t); void (APIENTRY *MultiTexCoord2hvNV) (GLenum target, const GLhalfNV *v); void (APIENTRY *MultiTexCoord3hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); void (APIENTRY *MultiTexCoord3hvNV) (GLenum target, const GLhalfNV *v); void (APIENTRY *MultiTexCoord4hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); void (APIENTRY *MultiTexCoord4hvNV) (GLenum target, const GLhalfNV *v); void (APIENTRY *FogCoordhNV) (GLhalfNV fog); void (APIENTRY *FogCoordhvNV) (const GLhalfNV *fog); void (APIENTRY *SecondaryColor3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); void (APIENTRY *SecondaryColor3hvNV) (const GLhalfNV *v); void (APIENTRY *VertexWeighthNV) (GLhalfNV weight); void (APIENTRY *VertexWeighthvNV) (const GLhalfNV *weight); void (APIENTRY *VertexAttrib1hNV) (GLuint index, GLhalfNV x); void (APIENTRY *VertexAttrib1hvNV) (GLuint index, const GLhalfNV *v); void (APIENTRY *VertexAttrib2hNV) (GLuint index, GLhalfNV x, GLhalfNV y); void (APIENTRY *VertexAttrib2hvNV) (GLuint index, const GLhalfNV *v); void (APIENTRY *VertexAttrib3hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); void (APIENTRY *VertexAttrib3hvNV) (GLuint index, const GLhalfNV *v); void (APIENTRY *VertexAttrib4hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); void (APIENTRY *VertexAttrib4hvNV) (GLuint index, const GLhalfNV *v); void (APIENTRY *VertexAttribs1hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); void (APIENTRY *VertexAttribs2hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); void (APIENTRY *VertexAttribs3hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); void (APIENTRY *VertexAttribs4hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); void (APIENTRY *PixelDataRangeNV) (GLenum target, GLsizei length, GLvoid *pointer); void (APIENTRY *FlushPixelDataRangeNV) (GLenum target); void (APIENTRY *PrimitiveRestartNV) (void); void (APIENTRY *PrimitiveRestartIndexNV) (GLuint index); GLvoid* (APIENTRY *MapObjectBufferATI) (GLuint buffer); void (APIENTRY *UnmapObjectBufferATI) (GLuint buffer); void (APIENTRY *StencilOpSeparateATI) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); void (APIENTRY *StencilFuncSeparateATI) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); void (APIENTRY *VertexAttribArrayObjectATI) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); void (APIENTRY *GetVertexAttribArrayObjectfvATI) (GLuint index, GLenum pname, GLfloat *params); void (APIENTRY *GetVertexAttribArrayObjectivATI) (GLuint index, GLenum pname, GLint *params); void (APIENTRY *DepthBoundsEXT) (GLclampd zmin, GLclampd zmax); void (APIENTRY *BlendEquationSeparateEXT) (GLenum modeRGB, GLenum modeAlpha); void (APIENTRY *AddSwapHintRectWIN) (GLint x, GLint y, GLsizei width, GLsizei height); #ifdef _WIN32 HANDLE (WINAPI *CreateBufferRegionARB) (HDC hDC, int iLayerPlane, UINT uType); VOID (WINAPI *DeleteBufferRegionARB) (HANDLE hRegion); BOOL (WINAPI *SaveBufferRegionARB) (HANDLE hRegion, int x, int y, int width, int height); BOOL (WINAPI *RestoreBufferRegionARB) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); const (WINAPI *GetExtensionsStringARB) (HDC hdc); BOOL (WINAPI *GetPixelFormatAttribivARB) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); BOOL (WINAPI *GetPixelFormatAttribfvARB) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); BOOL (WINAPI *ChoosePixelFormatARB) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); BOOL (WINAPI *MakeContextCurrentARB) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); HDC (WINAPI *GetCurrentReadDCARB) (void); HPBUFFERARB (WINAPI *CreatePbufferARB) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); HDC (WINAPI *GetPbufferDCARB) (HPBUFFERARB hPbuffer); int (WINAPI *ReleasePbufferDCARB) (HPBUFFERARB hPbuffer, HDC hDC); BOOL (WINAPI *DestroyPbufferARB) (HPBUFFERARB hPbuffer); BOOL (WINAPI *QueryPbufferARB) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); BOOL (WINAPI *BindTexImageARB) (HPBUFFERARB hPbuffer, int iBuffer); BOOL (WINAPI *ReleaseTexImageARB) (HPBUFFERARB hPbuffer, int iBuffer); BOOL (WINAPI *SetPbufferAttribARB) (HPBUFFERARB hPbuffer, const int *piAttribList); GLboolean (WINAPI *CreateDisplayColorTableEXT) (GLushort id); GLboolean (WINAPI *LoadDisplayColorTableEXT) (const GLushort *table, GLuint length); GLboolean (WINAPI *BindDisplayColorTableEXT) (GLushort id); VOID (WINAPI *DestroyDisplayColorTableEXT) (GLushort id); const (WINAPI *GetExtensionsStringEXT) (void); BOOL (WINAPI *MakeContextCurrentEXT) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); HDC (WINAPI *GetCurrentReadDCEXT) (void); HPBUFFEREXT (WINAPI *CreatePbufferEXT) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); HDC (WINAPI *GetPbufferDCEXT) (HPBUFFEREXT hPbuffer); int (WINAPI *ReleasePbufferDCEXT) (HPBUFFEREXT hPbuffer, HDC hDC); BOOL (WINAPI *DestroyPbufferEXT) (HPBUFFEREXT hPbuffer); BOOL (WINAPI *QueryPbufferEXT) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); BOOL (WINAPI *GetPixelFormatAttribivEXT) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); BOOL (WINAPI *GetPixelFormatAttribfvEXT) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); BOOL (WINAPI *ChoosePixelFormatEXT) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); BOOL (WINAPI *SwapIntervalEXT) (int interval); int (WINAPI *GetSwapIntervalEXT) (void); void* (WINAPI *AllocateMemoryNV) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); void (WINAPI *FreeMemoryNV) (void); BOOL (WINAPI *GetSyncValuesOML) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); BOOL (WINAPI *GetMscRateOML) (HDC hdc, INT32 *numerator, INT32 *denominator); INT64 (WINAPI *SwapBuffersMscOML) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); INT64 (WINAPI *SwapLayerBuffersMscOML) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); BOOL (WINAPI *WaitForMscOML) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); BOOL (WINAPI *WaitForSbcOML) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); BOOL (WINAPI *GetDigitalVideoParametersI3D) (HDC hDC, int iAttribute, int *piValue); BOOL (WINAPI *SetDigitalVideoParametersI3D) (HDC hDC, int iAttribute, const int *piValue); BOOL (WINAPI *GetGammaTableParametersI3D) (HDC hDC, int iAttribute, int *piValue); BOOL (WINAPI *SetGammaTableParametersI3D) (HDC hDC, int iAttribute, const int *piValue); BOOL (WINAPI *GetGammaTableI3D) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); BOOL (WINAPI *SetGammaTableI3D) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); BOOL (WINAPI *EnableGenlockI3D) (HDC hDC); BOOL (WINAPI *DisableGenlockI3D) (HDC hDC); BOOL (WINAPI *IsEnabledGenlockI3D) (HDC hDC, BOOL *pFlag); BOOL (WINAPI *GenlockSourceI3D) (HDC hDC, UINT uSource); BOOL (WINAPI *GetGenlockSourceI3D) (HDC hDC, UINT *uSource); BOOL (WINAPI *GenlockSourceEdgeI3D) (HDC hDC, UINT uEdge); BOOL (WINAPI *GetGenlockSourceEdgeI3D) (HDC hDC, UINT *uEdge); BOOL (WINAPI *GenlockSampleRateI3D) (HDC hDC, UINT uRate); BOOL (WINAPI *GetGenlockSampleRateI3D) (HDC hDC, UINT *uRate); BOOL (WINAPI *GenlockSourceDelayI3D) (HDC hDC, UINT uDelay); BOOL (WINAPI *GetGenlockSourceDelayI3D) (HDC hDC, UINT *uDelay); BOOL (WINAPI *QueryGenlockMaxSourceDelayI3D) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); LPVOID (WINAPI *CreateImageBufferI3D) (HDC hDC, DWORD dwSize, UINT uFlags); BOOL (WINAPI *DestroyImageBufferI3D) (HDC hDC, LPVOID pAddress); BOOL (WINAPI *AssociateImageBufferEventsI3D) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); BOOL (WINAPI *ReleaseImageBufferEventsI3D) (HDC hDC, const LPVOID *pAddress, UINT count); BOOL (WINAPI *EnableFrameLockI3D) (void); BOOL (WINAPI *DisableFrameLockI3D) (void); BOOL (WINAPI *IsEnabledFrameLockI3D) (BOOL *pFlag); BOOL (WINAPI *QueryFrameLockMasterI3D) (BOOL *pFlag); BOOL (WINAPI *GetFrameUsageI3D) (float *pUsage); BOOL (WINAPI *BeginFrameTrackingI3D) (void); BOOL (WINAPI *EndFrameTrackingI3D) (void); BOOL (WINAPI *QueryFrameTrackingI3D) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #endif /* _WIN32 */ } _GLextensionProcs; #define glBlendColor (_GET_TLS_PROCTABLE()->BlendColor) #define glBlendEquation (_GET_TLS_PROCTABLE()->BlendEquation) #define glDrawRangeElements (_GET_TLS_PROCTABLE()->DrawRangeElements) #define glColorTable (_GET_TLS_PROCTABLE()->ColorTable) #define glColorTableParameterfv (_GET_TLS_PROCTABLE()->ColorTableParameterfv) #define glColorTableParameteriv (_GET_TLS_PROCTABLE()->ColorTableParameteriv) #define glCopyColorTable (_GET_TLS_PROCTABLE()->CopyColorTable) #define glGetColorTable (_GET_TLS_PROCTABLE()->GetColorTable) #define glGetColorTableParameterfv (_GET_TLS_PROCTABLE()->GetColorTableParameterfv) #define glGetColorTableParameteriv (_GET_TLS_PROCTABLE()->GetColorTableParameteriv) #define glColorSubTable (_GET_TLS_PROCTABLE()->ColorSubTable) #define glCopyColorSubTable (_GET_TLS_PROCTABLE()->CopyColorSubTable) #define glConvolutionFilter1D (_GET_TLS_PROCTABLE()->ConvolutionFilter1D) #define glConvolutionFilter2D (_GET_TLS_PROCTABLE()->ConvolutionFilter2D) #define glConvolutionParameterf (_GET_TLS_PROCTABLE()->ConvolutionParameterf) #define glConvolutionParameterfv (_GET_TLS_PROCTABLE()->ConvolutionParameterfv) #define glConvolutionParameteri (_GET_TLS_PROCTABLE()->ConvolutionParameteri) #define glConvolutionParameteriv (_GET_TLS_PROCTABLE()->ConvolutionParameteriv) #define glCopyConvolutionFilter1D (_GET_TLS_PROCTABLE()->CopyConvolutionFilter1D) #define glCopyConvolutionFilter2D (_GET_TLS_PROCTABLE()->CopyConvolutionFilter2D) #define glGetConvolutionFilter (_GET_TLS_PROCTABLE()->GetConvolutionFilter) #define glGetConvolutionParameterfv (_GET_TLS_PROCTABLE()->GetConvolutionParameterfv) #define glGetConvolutionParameteriv (_GET_TLS_PROCTABLE()->GetConvolutionParameteriv) #define glGetSeparableFilter (_GET_TLS_PROCTABLE()->GetSeparableFilter) #define glSeparableFilter2D (_GET_TLS_PROCTABLE()->SeparableFilter2D) #define glGetHistogram (_GET_TLS_PROCTABLE()->GetHistogram) #define glGetHistogramParameterfv (_GET_TLS_PROCTABLE()->GetHistogramParameterfv) #define glGetHistogramParameteriv (_GET_TLS_PROCTABLE()->GetHistogramParameteriv) #define glGetMinmax (_GET_TLS_PROCTABLE()->GetMinmax) #define glGetMinmaxParameterfv (_GET_TLS_PROCTABLE()->GetMinmaxParameterfv) #define glGetMinmaxParameteriv (_GET_TLS_PROCTABLE()->GetMinmaxParameteriv) #define glHistogram (_GET_TLS_PROCTABLE()->Histogram) #define glMinmax (_GET_TLS_PROCTABLE()->Minmax) #define glResetHistogram (_GET_TLS_PROCTABLE()->ResetHistogram) #define glResetMinmax (_GET_TLS_PROCTABLE()->ResetMinmax) #define glTexImage3D (_GET_TLS_PROCTABLE()->TexImage3D) #define glTexSubImage3D (_GET_TLS_PROCTABLE()->TexSubImage3D) #define glCopyTexSubImage3D (_GET_TLS_PROCTABLE()->CopyTexSubImage3D) #define glActiveTexture (_GET_TLS_PROCTABLE()->ActiveTexture) #define glClientActiveTexture (_GET_TLS_PROCTABLE()->ClientActiveTexture) #define glMultiTexCoord1d (_GET_TLS_PROCTABLE()->MultiTexCoord1d) #define glMultiTexCoord1dv (_GET_TLS_PROCTABLE()->MultiTexCoord1dv) #define glMultiTexCoord1f (_GET_TLS_PROCTABLE()->MultiTexCoord1f) #define glMultiTexCoord1fv (_GET_TLS_PROCTABLE()->MultiTexCoord1fv) #define glMultiTexCoord1i (_GET_TLS_PROCTABLE()->MultiTexCoord1i) #define glMultiTexCoord1iv (_GET_TLS_PROCTABLE()->MultiTexCoord1iv) #define glMultiTexCoord1s (_GET_TLS_PROCTABLE()->MultiTexCoord1s) #define glMultiTexCoord1sv (_GET_TLS_PROCTABLE()->MultiTexCoord1sv) #define glMultiTexCoord2d (_GET_TLS_PROCTABLE()->MultiTexCoord2d) #define glMultiTexCoord2dv (_GET_TLS_PROCTABLE()->MultiTexCoord2dv) #define glMultiTexCoord2f (_GET_TLS_PROCTABLE()->MultiTexCoord2f) #define glMultiTexCoord2fv (_GET_TLS_PROCTABLE()->MultiTexCoord2fv) #define glMultiTexCoord2i (_GET_TLS_PROCTABLE()->MultiTexCoord2i) #define glMultiTexCoord2iv (_GET_TLS_PROCTABLE()->MultiTexCoord2iv) #define glMultiTexCoord2s (_GET_TLS_PROCTABLE()->MultiTexCoord2s) #define glMultiTexCoord2sv (_GET_TLS_PROCTABLE()->MultiTexCoord2sv) #define glMultiTexCoord3d (_GET_TLS_PROCTABLE()->MultiTexCoord3d) #define glMultiTexCoord3dv (_GET_TLS_PROCTABLE()->MultiTexCoord3dv) #define glMultiTexCoord3f (_GET_TLS_PROCTABLE()->MultiTexCoord3f) #define glMultiTexCoord3fv (_GET_TLS_PROCTABLE()->MultiTexCoord3fv) #define glMultiTexCoord3i (_GET_TLS_PROCTABLE()->MultiTexCoord3i) #define glMultiTexCoord3iv (_GET_TLS_PROCTABLE()->MultiTexCoord3iv) #define glMultiTexCoord3s (_GET_TLS_PROCTABLE()->MultiTexCoord3s) #define glMultiTexCoord3sv (_GET_TLS_PROCTABLE()->MultiTexCoord3sv) #define glMultiTexCoord4d (_GET_TLS_PROCTABLE()->MultiTexCoord4d) #define glMultiTexCoord4dv (_GET_TLS_PROCTABLE()->MultiTexCoord4dv) #define glMultiTexCoord4f (_GET_TLS_PROCTABLE()->MultiTexCoord4f) #define glMultiTexCoord4fv (_GET_TLS_PROCTABLE()->MultiTexCoord4fv) #define glMultiTexCoord4i (_GET_TLS_PROCTABLE()->MultiTexCoord4i) #define glMultiTexCoord4iv (_GET_TLS_PROCTABLE()->MultiTexCoord4iv) #define glMultiTexCoord4s (_GET_TLS_PROCTABLE()->MultiTexCoord4s) #define glMultiTexCoord4sv (_GET_TLS_PROCTABLE()->MultiTexCoord4sv) #define glLoadTransposeMatrixf (_GET_TLS_PROCTABLE()->LoadTransposeMatrixf) #define glLoadTransposeMatrixd (_GET_TLS_PROCTABLE()->LoadTransposeMatrixd) #define glMultTransposeMatrixf (_GET_TLS_PROCTABLE()->MultTransposeMatrixf) #define glMultTransposeMatrixd (_GET_TLS_PROCTABLE()->MultTransposeMatrixd) #define glSampleCoverage (_GET_TLS_PROCTABLE()->SampleCoverage) #define glCompressedTexImage3D (_GET_TLS_PROCTABLE()->CompressedTexImage3D) #define glCompressedTexImage2D (_GET_TLS_PROCTABLE()->CompressedTexImage2D) #define glCompressedTexImage1D (_GET_TLS_PROCTABLE()->CompressedTexImage1D) #define glCompressedTexSubImage3D (_GET_TLS_PROCTABLE()->CompressedTexSubImage3D) #define glCompressedTexSubImage2D (_GET_TLS_PROCTABLE()->CompressedTexSubImage2D) #define glCompressedTexSubImage1D (_GET_TLS_PROCTABLE()->CompressedTexSubImage1D) #define glGetCompressedTexImage (_GET_TLS_PROCTABLE()->GetCompressedTexImage) #define glBlendFuncSeparate (_GET_TLS_PROCTABLE()->BlendFuncSeparate) #define glFogCoordf (_GET_TLS_PROCTABLE()->FogCoordf) #define glFogCoordfv (_GET_TLS_PROCTABLE()->FogCoordfv) #define glFogCoordd (_GET_TLS_PROCTABLE()->FogCoordd) #define glFogCoorddv (_GET_TLS_PROCTABLE()->FogCoorddv) #define glFogCoordPointer (_GET_TLS_PROCTABLE()->FogCoordPointer) #define glMultiDrawArrays (_GET_TLS_PROCTABLE()->MultiDrawArrays) #define glMultiDrawElements (_GET_TLS_PROCTABLE()->MultiDrawElements) #define glPointParameterf (_GET_TLS_PROCTABLE()->PointParameterf) #define glPointParameterfv (_GET_TLS_PROCTABLE()->PointParameterfv) #define glPointParameteri (_GET_TLS_PROCTABLE()->PointParameteri) #define glPointParameteriv (_GET_TLS_PROCTABLE()->PointParameteriv) #define glSecondaryColor3b (_GET_TLS_PROCTABLE()->SecondaryColor3b) #define glSecondaryColor3bv (_GET_TLS_PROCTABLE()->SecondaryColor3bv) #define glSecondaryColor3d (_GET_TLS_PROCTABLE()->SecondaryColor3d) #define glSecondaryColor3dv (_GET_TLS_PROCTABLE()->SecondaryColor3dv) #define glSecondaryColor3f (_GET_TLS_PROCTABLE()->SecondaryColor3f) #define glSecondaryColor3fv (_GET_TLS_PROCTABLE()->SecondaryColor3fv) #define glSecondaryColor3i (_GET_TLS_PROCTABLE()->SecondaryColor3i) #define glSecondaryColor3iv (_GET_TLS_PROCTABLE()->SecondaryColor3iv) #define glSecondaryColor3s (_GET_TLS_PROCTABLE()->SecondaryColor3s) #define glSecondaryColor3sv (_GET_TLS_PROCTABLE()->SecondaryColor3sv) #define glSecondaryColor3ub (_GET_TLS_PROCTABLE()->SecondaryColor3ub) #define glSecondaryColor3ubv (_GET_TLS_PROCTABLE()->SecondaryColor3ubv) #define glSecondaryColor3ui (_GET_TLS_PROCTABLE()->SecondaryColor3ui) #define glSecondaryColor3uiv (_GET_TLS_PROCTABLE()->SecondaryColor3uiv) #define glSecondaryColor3us (_GET_TLS_PROCTABLE()->SecondaryColor3us) #define glSecondaryColor3usv (_GET_TLS_PROCTABLE()->SecondaryColor3usv) #define glSecondaryColorPointer (_GET_TLS_PROCTABLE()->SecondaryColorPointer) #define glWindowPos2d (_GET_TLS_PROCTABLE()->WindowPos2d) #define glWindowPos2dv (_GET_TLS_PROCTABLE()->WindowPos2dv) #define glWindowPos2f (_GET_TLS_PROCTABLE()->WindowPos2f) #define glWindowPos2fv (_GET_TLS_PROCTABLE()->WindowPos2fv) #define glWindowPos2i (_GET_TLS_PROCTABLE()->WindowPos2i) #define glWindowPos2iv (_GET_TLS_PROCTABLE()->WindowPos2iv) #define glWindowPos2s (_GET_TLS_PROCTABLE()->WindowPos2s) #define glWindowPos2sv (_GET_TLS_PROCTABLE()->WindowPos2sv) #define glWindowPos3d (_GET_TLS_PROCTABLE()->WindowPos3d) #define glWindowPos3dv (_GET_TLS_PROCTABLE()->WindowPos3dv) #define glWindowPos3f (_GET_TLS_PROCTABLE()->WindowPos3f) #define glWindowPos3fv (_GET_TLS_PROCTABLE()->WindowPos3fv) #define glWindowPos3i (_GET_TLS_PROCTABLE()->WindowPos3i) #define glWindowPos3iv (_GET_TLS_PROCTABLE()->WindowPos3iv) #define glWindowPos3s (_GET_TLS_PROCTABLE()->WindowPos3s) #define glWindowPos3sv (_GET_TLS_PROCTABLE()->WindowPos3sv) #define glGenQueries (_GET_TLS_PROCTABLE()->GenQueries) #define glDeleteQueries (_GET_TLS_PROCTABLE()->DeleteQueries) #define glIsQuery (_GET_TLS_PROCTABLE()->IsQuery) #define glBeginQuery (_GET_TLS_PROCTABLE()->BeginQuery) #define glEndQuery (_GET_TLS_PROCTABLE()->EndQuery) #define glGetQueryiv (_GET_TLS_PROCTABLE()->GetQueryiv) #define glGetQueryObjectiv (_GET_TLS_PROCTABLE()->GetQueryObjectiv) #define glGetQueryObjectuiv (_GET_TLS_PROCTABLE()->GetQueryObjectuiv) #define glBindBuffer (_GET_TLS_PROCTABLE()->BindBuffer) #define glDeleteBuffers (_GET_TLS_PROCTABLE()->DeleteBuffers) #define glGenBuffers (_GET_TLS_PROCTABLE()->GenBuffers) #define glIsBuffer (_GET_TLS_PROCTABLE()->IsBuffer) #define glBufferData (_GET_TLS_PROCTABLE()->BufferData) #define glBufferSubData (_GET_TLS_PROCTABLE()->BufferSubData) #define glGetBufferSubData (_GET_TLS_PROCTABLE()->GetBufferSubData) #define glMapBuffer (_GET_TLS_PROCTABLE()->MapBuffer) #define glUnmapBuffer (_GET_TLS_PROCTABLE()->UnmapBuffer) #define glGetBufferParameteriv (_GET_TLS_PROCTABLE()->GetBufferParameteriv) #define glGetBufferPointerv (_GET_TLS_PROCTABLE()->GetBufferPointerv) #define glActiveTextureARB (_GET_TLS_PROCTABLE()->ActiveTextureARB) #define glClientActiveTextureARB (_GET_TLS_PROCTABLE()->ClientActiveTextureARB) #define glMultiTexCoord1dARB (_GET_TLS_PROCTABLE()->MultiTexCoord1dARB) #define glMultiTexCoord1dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord1dvARB) #define glMultiTexCoord1fARB (_GET_TLS_PROCTABLE()->MultiTexCoord1fARB) #define glMultiTexCoord1fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord1fvARB) #define glMultiTexCoord1iARB (_GET_TLS_PROCTABLE()->MultiTexCoord1iARB) #define glMultiTexCoord1ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord1ivARB) #define glMultiTexCoord1sARB (_GET_TLS_PROCTABLE()->MultiTexCoord1sARB) #define glMultiTexCoord1svARB (_GET_TLS_PROCTABLE()->MultiTexCoord1svARB) #define glMultiTexCoord2dARB (_GET_TLS_PROCTABLE()->MultiTexCoord2dARB) #define glMultiTexCoord2dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord2dvARB) #define glMultiTexCoord2fARB (_GET_TLS_PROCTABLE()->MultiTexCoord2fARB) #define glMultiTexCoord2fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord2fvARB) #define glMultiTexCoord2iARB (_GET_TLS_PROCTABLE()->MultiTexCoord2iARB) #define glMultiTexCoord2ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord2ivARB) #define glMultiTexCoord2sARB (_GET_TLS_PROCTABLE()->MultiTexCoord2sARB) #define glMultiTexCoord2svARB (_GET_TLS_PROCTABLE()->MultiTexCoord2svARB) #define glMultiTexCoord3dARB (_GET_TLS_PROCTABLE()->MultiTexCoord3dARB) #define glMultiTexCoord3dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord3dvARB) #define glMultiTexCoord3fARB (_GET_TLS_PROCTABLE()->MultiTexCoord3fARB) #define glMultiTexCoord3fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord3fvARB) #define glMultiTexCoord3iARB (_GET_TLS_PROCTABLE()->MultiTexCoord3iARB) #define glMultiTexCoord3ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord3ivARB) #define glMultiTexCoord3sARB (_GET_TLS_PROCTABLE()->MultiTexCoord3sARB) #define glMultiTexCoord3svARB (_GET_TLS_PROCTABLE()->MultiTexCoord3svARB) #define glMultiTexCoord4dARB (_GET_TLS_PROCTABLE()->MultiTexCoord4dARB) #define glMultiTexCoord4dvARB (_GET_TLS_PROCTABLE()->MultiTexCoord4dvARB) #define glMultiTexCoord4fARB (_GET_TLS_PROCTABLE()->MultiTexCoord4fARB) #define glMultiTexCoord4fvARB (_GET_TLS_PROCTABLE()->MultiTexCoord4fvARB) #define glMultiTexCoord4iARB (_GET_TLS_PROCTABLE()->MultiTexCoord4iARB) #define glMultiTexCoord4ivARB (_GET_TLS_PROCTABLE()->MultiTexCoord4ivARB) #define glMultiTexCoord4sARB (_GET_TLS_PROCTABLE()->MultiTexCoord4sARB) #define glMultiTexCoord4svARB (_GET_TLS_PROCTABLE()->MultiTexCoord4svARB) #define glLoadTransposeMatrixfARB (_GET_TLS_PROCTABLE()->LoadTransposeMatrixfARB) #define glLoadTransposeMatrixdARB (_GET_TLS_PROCTABLE()->LoadTransposeMatrixdARB) #define glMultTransposeMatrixfARB (_GET_TLS_PROCTABLE()->MultTransposeMatrixfARB) #define glMultTransposeMatrixdARB (_GET_TLS_PROCTABLE()->MultTransposeMatrixdARB) #define glSampleCoverageARB (_GET_TLS_PROCTABLE()->SampleCoverageARB) #define glCompressedTexImage3DARB (_GET_TLS_PROCTABLE()->CompressedTexImage3DARB) #define glCompressedTexImage2DARB (_GET_TLS_PROCTABLE()->CompressedTexImage2DARB) #define glCompressedTexImage1DARB (_GET_TLS_PROCTABLE()->CompressedTexImage1DARB) #define glCompressedTexSubImage3DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage3DARB) #define glCompressedTexSubImage2DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage2DARB) #define glCompressedTexSubImage1DARB (_GET_TLS_PROCTABLE()->CompressedTexSubImage1DARB) #define glGetCompressedTexImageARB (_GET_TLS_PROCTABLE()->GetCompressedTexImageARB) #define glPointParameterfARB (_GET_TLS_PROCTABLE()->PointParameterfARB) #define glPointParameterfvARB (_GET_TLS_PROCTABLE()->PointParameterfvARB) #define glWeightbvARB (_GET_TLS_PROCTABLE()->WeightbvARB) #define glWeightsvARB (_GET_TLS_PROCTABLE()->WeightsvARB) #define glWeightivARB (_GET_TLS_PROCTABLE()->WeightivARB) #define glWeightfvARB (_GET_TLS_PROCTABLE()->WeightfvARB) #define glWeightdvARB (_GET_TLS_PROCTABLE()->WeightdvARB) #define glWeightubvARB (_GET_TLS_PROCTABLE()->WeightubvARB) #define glWeightusvARB (_GET_TLS_PROCTABLE()->WeightusvARB) #define glWeightuivARB (_GET_TLS_PROCTABLE()->WeightuivARB) #define glWeightPointerARB (_GET_TLS_PROCTABLE()->WeightPointerARB) #define glVertexBlendARB (_GET_TLS_PROCTABLE()->VertexBlendARB) #define glCurrentPaletteMatrixARB (_GET_TLS_PROCTABLE()->CurrentPaletteMatrixARB) #define glMatrixIndexubvARB (_GET_TLS_PROCTABLE()->MatrixIndexubvARB) #define glMatrixIndexusvARB (_GET_TLS_PROCTABLE()->MatrixIndexusvARB) #define glMatrixIndexuivARB (_GET_TLS_PROCTABLE()->MatrixIndexuivARB) #define glMatrixIndexPointerARB (_GET_TLS_PROCTABLE()->MatrixIndexPointerARB) #define glWindowPos2dARB (_GET_TLS_PROCTABLE()->WindowPos2dARB) #define glWindowPos2dvARB (_GET_TLS_PROCTABLE()->WindowPos2dvARB) #define glWindowPos2fARB (_GET_TLS_PROCTABLE()->WindowPos2fARB) #define glWindowPos2fvARB (_GET_TLS_PROCTABLE()->WindowPos2fvARB) #define glWindowPos2iARB (_GET_TLS_PROCTABLE()->WindowPos2iARB) #define glWindowPos2ivARB (_GET_TLS_PROCTABLE()->WindowPos2ivARB) #define glWindowPos2sARB (_GET_TLS_PROCTABLE()->WindowPos2sARB) #define glWindowPos2svARB (_GET_TLS_PROCTABLE()->WindowPos2svARB) #define glWindowPos3dARB (_GET_TLS_PROCTABLE()->WindowPos3dARB) #define glWindowPos3dvARB (_GET_TLS_PROCTABLE()->WindowPos3dvARB) #define glWindowPos3fARB (_GET_TLS_PROCTABLE()->WindowPos3fARB) #define glWindowPos3fvARB (_GET_TLS_PROCTABLE()->WindowPos3fvARB) #define glWindowPos3iARB (_GET_TLS_PROCTABLE()->WindowPos3iARB) #define glWindowPos3ivARB (_GET_TLS_PROCTABLE()->WindowPos3ivARB) #define glWindowPos3sARB (_GET_TLS_PROCTABLE()->WindowPos3sARB) #define glWindowPos3svARB (_GET_TLS_PROCTABLE()->WindowPos3svARB) #define glVertexAttrib1dARB (_GET_TLS_PROCTABLE()->VertexAttrib1dARB) #define glVertexAttrib1dvARB (_GET_TLS_PROCTABLE()->VertexAttrib1dvARB) #define glVertexAttrib1fARB (_GET_TLS_PROCTABLE()->VertexAttrib1fARB) #define glVertexAttrib1fvARB (_GET_TLS_PROCTABLE()->VertexAttrib1fvARB) #define glVertexAttrib1sARB (_GET_TLS_PROCTABLE()->VertexAttrib1sARB) #define glVertexAttrib1svARB (_GET_TLS_PROCTABLE()->VertexAttrib1svARB) #define glVertexAttrib2dARB (_GET_TLS_PROCTABLE()->VertexAttrib2dARB) #define glVertexAttrib2dvARB (_GET_TLS_PROCTABLE()->VertexAttrib2dvARB) #define glVertexAttrib2fARB (_GET_TLS_PROCTABLE()->VertexAttrib2fARB) #define glVertexAttrib2fvARB (_GET_TLS_PROCTABLE()->VertexAttrib2fvARB) #define glVertexAttrib2sARB (_GET_TLS_PROCTABLE()->VertexAttrib2sARB) #define glVertexAttrib2svARB (_GET_TLS_PROCTABLE()->VertexAttrib2svARB) #define glVertexAttrib3dARB (_GET_TLS_PROCTABLE()->VertexAttrib3dARB) #define glVertexAttrib3dvARB (_GET_TLS_PROCTABLE()->VertexAttrib3dvARB) #define glVertexAttrib3fARB (_GET_TLS_PROCTABLE()->VertexAttrib3fARB) #define glVertexAttrib3fvARB (_GET_TLS_PROCTABLE()->VertexAttrib3fvARB) #define glVertexAttrib3sARB (_GET_TLS_PROCTABLE()->VertexAttrib3sARB) #define glVertexAttrib3svARB (_GET_TLS_PROCTABLE()->VertexAttrib3svARB) #define glVertexAttrib4NbvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NbvARB) #define glVertexAttrib4NivARB (_GET_TLS_PROCTABLE()->VertexAttrib4NivARB) #define glVertexAttrib4NsvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NsvARB) #define glVertexAttrib4NubARB (_GET_TLS_PROCTABLE()->VertexAttrib4NubARB) #define glVertexAttrib4NubvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NubvARB) #define glVertexAttrib4NuivARB (_GET_TLS_PROCTABLE()->VertexAttrib4NuivARB) #define glVertexAttrib4NusvARB (_GET_TLS_PROCTABLE()->VertexAttrib4NusvARB) #define glVertexAttrib4bvARB (_GET_TLS_PROCTABLE()->VertexAttrib4bvARB) #define glVertexAttrib4dARB (_GET_TLS_PROCTABLE()->VertexAttrib4dARB) #define glVertexAttrib4dvARB (_GET_TLS_PROCTABLE()->VertexAttrib4dvARB) #define glVertexAttrib4fARB (_GET_TLS_PROCTABLE()->VertexAttrib4fARB) #define glVertexAttrib4fvARB (_GET_TLS_PROCTABLE()->VertexAttrib4fvARB) #define glVertexAttrib4ivARB (_GET_TLS_PROCTABLE()->VertexAttrib4ivARB) #define glVertexAttrib4sARB (_GET_TLS_PROCTABLE()->VertexAttrib4sARB) #define glVertexAttrib4svARB (_GET_TLS_PROCTABLE()->VertexAttrib4svARB) #define glVertexAttrib4ubvARB (_GET_TLS_PROCTABLE()->VertexAttrib4ubvARB) #define glVertexAttrib4uivARB (_GET_TLS_PROCTABLE()->VertexAttrib4uivARB) #define glVertexAttrib4usvARB (_GET_TLS_PROCTABLE()->VertexAttrib4usvARB) #define glVertexAttribPointerARB (_GET_TLS_PROCTABLE()->VertexAttribPointerARB) #define glEnableVertexAttribArrayARB (_GET_TLS_PROCTABLE()->EnableVertexAttribArrayARB) #define glDisableVertexAttribArrayARB (_GET_TLS_PROCTABLE()->DisableVertexAttribArrayARB) #define glProgramStringARB (_GET_TLS_PROCTABLE()->ProgramStringARB) #define glBindProgramARB (_GET_TLS_PROCTABLE()->BindProgramARB) #define glDeleteProgramsARB (_GET_TLS_PROCTABLE()->DeleteProgramsARB) #define glGenProgramsARB (_GET_TLS_PROCTABLE()->GenProgramsARB) #define glProgramEnvParameter4dARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4dARB) #define glProgramEnvParameter4dvARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4dvARB) #define glProgramEnvParameter4fARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4fARB) #define glProgramEnvParameter4fvARB (_GET_TLS_PROCTABLE()->ProgramEnvParameter4fvARB) #define glProgramLocalParameter4dARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4dARB) #define glProgramLocalParameter4dvARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4dvARB) #define glProgramLocalParameter4fARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4fARB) #define glProgramLocalParameter4fvARB (_GET_TLS_PROCTABLE()->ProgramLocalParameter4fvARB) #define glGetProgramEnvParameterdvARB (_GET_TLS_PROCTABLE()->GetProgramEnvParameterdvARB) #define glGetProgramEnvParameterfvARB (_GET_TLS_PROCTABLE()->GetProgramEnvParameterfvARB) #define glGetProgramLocalParameterdvARB (_GET_TLS_PROCTABLE()->GetProgramLocalParameterdvARB) #define glGetProgramLocalParameterfvARB (_GET_TLS_PROCTABLE()->GetProgramLocalParameterfvARB) #define glGetProgramivARB (_GET_TLS_PROCTABLE()->GetProgramivARB) #define glGetProgramStringARB (_GET_TLS_PROCTABLE()->GetProgramStringARB) #define glGetVertexAttribdvARB (_GET_TLS_PROCTABLE()->GetVertexAttribdvARB) #define glGetVertexAttribfvARB (_GET_TLS_PROCTABLE()->GetVertexAttribfvARB) #define glGetVertexAttribivARB (_GET_TLS_PROCTABLE()->GetVertexAttribivARB) #define glGetVertexAttribPointervARB (_GET_TLS_PROCTABLE()->GetVertexAttribPointervARB) #define glIsProgramARB (_GET_TLS_PROCTABLE()->IsProgramARB) #define glBindBufferARB (_GET_TLS_PROCTABLE()->BindBufferARB) #define glDeleteBuffersARB (_GET_TLS_PROCTABLE()->DeleteBuffersARB) #define glGenBuffersARB (_GET_TLS_PROCTABLE()->GenBuffersARB) #define glIsBufferARB (_GET_TLS_PROCTABLE()->IsBufferARB) #define glBufferDataARB (_GET_TLS_PROCTABLE()->BufferDataARB) #define glBufferSubDataARB (_GET_TLS_PROCTABLE()->BufferSubDataARB) #define glGetBufferSubDataARB (_GET_TLS_PROCTABLE()->GetBufferSubDataARB) #define glMapBufferARB (_GET_TLS_PROCTABLE()->MapBufferARB) #define glUnmapBufferARB (_GET_TLS_PROCTABLE()->UnmapBufferARB) #define glGetBufferParameterivARB (_GET_TLS_PROCTABLE()->GetBufferParameterivARB) #define glGetBufferPointervARB (_GET_TLS_PROCTABLE()->GetBufferPointervARB) #define glGenQueriesARB (_GET_TLS_PROCTABLE()->GenQueriesARB) #define glDeleteQueriesARB (_GET_TLS_PROCTABLE()->DeleteQueriesARB) #define glIsQueryARB (_GET_TLS_PROCTABLE()->IsQueryARB) #define glBeginQueryARB (_GET_TLS_PROCTABLE()->BeginQueryARB) #define glEndQueryARB (_GET_TLS_PROCTABLE()->EndQueryARB) #define glGetQueryivARB (_GET_TLS_PROCTABLE()->GetQueryivARB) #define glGetQueryObjectivARB (_GET_TLS_PROCTABLE()->GetQueryObjectivARB) #define glGetQueryObjectuivARB (_GET_TLS_PROCTABLE()->GetQueryObjectuivARB) #define glDeleteObjectARB (_GET_TLS_PROCTABLE()->DeleteObjectARB) #define glGetHandleARB (_GET_TLS_PROCTABLE()->GetHandleARB) #define glDetachObjectARB (_GET_TLS_PROCTABLE()->DetachObjectARB) #define glCreateShaderObjectARB (_GET_TLS_PROCTABLE()->CreateShaderObjectARB) #define glShaderSourceARB (_GET_TLS_PROCTABLE()->ShaderSourceARB) #define glCompileShaderARB (_GET_TLS_PROCTABLE()->CompileShaderARB) #define glCreateProgramObjectARB (_GET_TLS_PROCTABLE()->CreateProgramObjectARB) #define glAttachObjectARB (_GET_TLS_PROCTABLE()->AttachObjectARB) #define glLinkProgramARB (_GET_TLS_PROCTABLE()->LinkProgramARB) #define glUseProgramObjectARB (_GET_TLS_PROCTABLE()->UseProgramObjectARB) #define glValidateProgramARB (_GET_TLS_PROCTABLE()->ValidateProgramARB) #define glUniform1fARB (_GET_TLS_PROCTABLE()->Uniform1fARB) #define glUniform2fARB (_GET_TLS_PROCTABLE()->Uniform2fARB) #define glUniform3fARB (_GET_TLS_PROCTABLE()->Uniform3fARB) #define glUniform4fARB (_GET_TLS_PROCTABLE()->Uniform4fARB) #define glUniform1iARB (_GET_TLS_PROCTABLE()->Uniform1iARB) #define glUniform2iARB (_GET_TLS_PROCTABLE()->Uniform2iARB) #define glUniform3iARB (_GET_TLS_PROCTABLE()->Uniform3iARB) #define glUniform4iARB (_GET_TLS_PROCTABLE()->Uniform4iARB) #define glUniform1fvARB (_GET_TLS_PROCTABLE()->Uniform1fvARB) #define glUniform2fvARB (_GET_TLS_PROCTABLE()->Uniform2fvARB) #define glUniform3fvARB (_GET_TLS_PROCTABLE()->Uniform3fvARB) #define glUniform4fvARB (_GET_TLS_PROCTABLE()->Uniform4fvARB) #define glUniform1ivARB (_GET_TLS_PROCTABLE()->Uniform1ivARB) #define glUniform2ivARB (_GET_TLS_PROCTABLE()->Uniform2ivARB) #define glUniform3ivARB (_GET_TLS_PROCTABLE()->Uniform3ivARB) #define glUniform4ivARB (_GET_TLS_PROCTABLE()->Uniform4ivARB) #define glUniformMatrix2fvARB (_GET_TLS_PROCTABLE()->UniformMatrix2fvARB) #define glUniformMatrix3fvARB (_GET_TLS_PROCTABLE()->UniformMatrix3fvARB) #define glUniformMatrix4fvARB (_GET_TLS_PROCTABLE()->UniformMatrix4fvARB) #define glGetObjectParameterfvARB (_GET_TLS_PROCTABLE()->GetObjectParameterfvARB) #define glGetObjectParameterivARB (_GET_TLS_PROCTABLE()->GetObjectParameterivARB) #define glGetInfoLogARB (_GET_TLS_PROCTABLE()->GetInfoLogARB) #define glGetAttachedObjectsARB (_GET_TLS_PROCTABLE()->GetAttachedObjectsARB) #define glGetUniformLocationARB (_GET_TLS_PROCTABLE()->GetUniformLocationARB) #define glGetActiveUniformARB (_GET_TLS_PROCTABLE()->GetActiveUniformARB) #define glGetUniformfvARB (_GET_TLS_PROCTABLE()->GetUniformfvARB) #define glGetUniformivARB (_GET_TLS_PROCTABLE()->GetUniformivARB) #define glGetShaderSourceARB (_GET_TLS_PROCTABLE()->GetShaderSourceARB) #define glBindAttribLocationARB (_GET_TLS_PROCTABLE()->BindAttribLocationARB) #define glGetActiveAttribARB (_GET_TLS_PROCTABLE()->GetActiveAttribARB) #define glGetAttribLocationARB (_GET_TLS_PROCTABLE()->GetAttribLocationARB) #define glBlendColorEXT (_GET_TLS_PROCTABLE()->BlendColorEXT) #define glPolygonOffsetEXT (_GET_TLS_PROCTABLE()->PolygonOffsetEXT) #define glTexImage3DEXT (_GET_TLS_PROCTABLE()->TexImage3DEXT) #define glTexSubImage3DEXT (_GET_TLS_PROCTABLE()->TexSubImage3DEXT) #define glGetTexFilterFuncSGIS (_GET_TLS_PROCTABLE()->GetTexFilterFuncSGIS) #define glTexFilterFuncSGIS (_GET_TLS_PROCTABLE()->TexFilterFuncSGIS) #define glTexSubImage1DEXT (_GET_TLS_PROCTABLE()->TexSubImage1DEXT) #define glTexSubImage2DEXT (_GET_TLS_PROCTABLE()->TexSubImage2DEXT) #define glCopyTexImage1DEXT (_GET_TLS_PROCTABLE()->CopyTexImage1DEXT) #define glCopyTexImage2DEXT (_GET_TLS_PROCTABLE()->CopyTexImage2DEXT) #define glCopyTexSubImage1DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage1DEXT) #define glCopyTexSubImage2DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage2DEXT) #define glCopyTexSubImage3DEXT (_GET_TLS_PROCTABLE()->CopyTexSubImage3DEXT) #define glGetHistogramEXT (_GET_TLS_PROCTABLE()->GetHistogramEXT) #define glGetHistogramParameterfvEXT (_GET_TLS_PROCTABLE()->GetHistogramParameterfvEXT) #define glGetHistogramParameterivEXT (_GET_TLS_PROCTABLE()->GetHistogramParameterivEXT) #define glGetMinmaxEXT (_GET_TLS_PROCTABLE()->GetMinmaxEXT) #define glGetMinmaxParameterfvEXT (_GET_TLS_PROCTABLE()->GetMinmaxParameterfvEXT) #define glGetMinmaxParameterivEXT (_GET_TLS_PROCTABLE()->GetMinmaxParameterivEXT) #define glHistogramEXT (_GET_TLS_PROCTABLE()->HistogramEXT) #define glMinmaxEXT (_GET_TLS_PROCTABLE()->MinmaxEXT) #define glResetHistogramEXT (_GET_TLS_PROCTABLE()->ResetHistogramEXT) #define glResetMinmaxEXT (_GET_TLS_PROCTABLE()->ResetMinmaxEXT) #define glConvolutionFilter1DEXT (_GET_TLS_PROCTABLE()->ConvolutionFilter1DEXT) #define glConvolutionFilter2DEXT (_GET_TLS_PROCTABLE()->ConvolutionFilter2DEXT) #define glConvolutionParameterfEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterfEXT) #define glConvolutionParameterfvEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterfvEXT) #define glConvolutionParameteriEXT (_GET_TLS_PROCTABLE()->ConvolutionParameteriEXT) #define glConvolutionParameterivEXT (_GET_TLS_PROCTABLE()->ConvolutionParameterivEXT) #define glCopyConvolutionFilter1DEXT (_GET_TLS_PROCTABLE()->CopyConvolutionFilter1DEXT) #define glCopyConvolutionFilter2DEXT (_GET_TLS_PROCTABLE()->CopyConvolutionFilter2DEXT) #define glGetConvolutionFilterEXT (_GET_TLS_PROCTABLE()->GetConvolutionFilterEXT) #define glGetConvolutionParameterfvEXT (_GET_TLS_PROCTABLE()->GetConvolutionParameterfvEXT) #define glGetConvolutionParameterivEXT (_GET_TLS_PROCTABLE()->GetConvolutionParameterivEXT) #define glGetSeparableFilterEXT (_GET_TLS_PROCTABLE()->GetSeparableFilterEXT) #define glSeparableFilter2DEXT (_GET_TLS_PROCTABLE()->SeparableFilter2DEXT) #define glColorTableSGI (_GET_TLS_PROCTABLE()->ColorTableSGI) #define glColorTableParameterfvSGI (_GET_TLS_PROCTABLE()->ColorTableParameterfvSGI) #define glColorTableParameterivSGI (_GET_TLS_PROCTABLE()->ColorTableParameterivSGI) #define glCopyColorTableSGI (_GET_TLS_PROCTABLE()->CopyColorTableSGI) #define glGetColorTableSGI (_GET_TLS_PROCTABLE()->GetColorTableSGI) #define glGetColorTableParameterfvSGI (_GET_TLS_PROCTABLE()->GetColorTableParameterfvSGI) #define glGetColorTableParameterivSGI (_GET_TLS_PROCTABLE()->GetColorTableParameterivSGI) #define glPixelTexGenSGIX (_GET_TLS_PROCTABLE()->PixelTexGenSGIX) #define glPixelTexGenParameteriSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameteriSGIS) #define glPixelTexGenParameterivSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterivSGIS) #define glPixelTexGenParameterfSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterfSGIS) #define glPixelTexGenParameterfvSGIS (_GET_TLS_PROCTABLE()->PixelTexGenParameterfvSGIS) #define glGetPixelTexGenParameterivSGIS (_GET_TLS_PROCTABLE()->GetPixelTexGenParameterivSGIS) #define glGetPixelTexGenParameterfvSGIS (_GET_TLS_PROCTABLE()->GetPixelTexGenParameterfvSGIS) #define glTexImage4DSGIS (_GET_TLS_PROCTABLE()->TexImage4DSGIS) #define glTexSubImage4DSGIS (_GET_TLS_PROCTABLE()->TexSubImage4DSGIS) #define glAreTexturesResidentEXT (_GET_TLS_PROCTABLE()->AreTexturesResidentEXT) #define glBindTextureEXT (_GET_TLS_PROCTABLE()->BindTextureEXT) #define glDeleteTexturesEXT (_GET_TLS_PROCTABLE()->DeleteTexturesEXT) #define glGenTexturesEXT (_GET_TLS_PROCTABLE()->GenTexturesEXT) #define glIsTextureEXT (_GET_TLS_PROCTABLE()->IsTextureEXT) #define glPrioritizeTexturesEXT (_GET_TLS_PROCTABLE()->PrioritizeTexturesEXT) #define glDetailTexFuncSGIS (_GET_TLS_PROCTABLE()->DetailTexFuncSGIS) #define glGetDetailTexFuncSGIS (_GET_TLS_PROCTABLE()->GetDetailTexFuncSGIS) #define glSharpenTexFuncSGIS (_GET_TLS_PROCTABLE()->SharpenTexFuncSGIS) #define glGetSharpenTexFuncSGIS (_GET_TLS_PROCTABLE()->GetSharpenTexFuncSGIS) #define glSampleMaskSGIS (_GET_TLS_PROCTABLE()->SampleMaskSGIS) #define glSamplePatternSGIS (_GET_TLS_PROCTABLE()->SamplePatternSGIS) #define glArrayElementEXT (_GET_TLS_PROCTABLE()->ArrayElementEXT) #define glColorPointerEXT (_GET_TLS_PROCTABLE()->ColorPointerEXT) #define glDrawArraysEXT (_GET_TLS_PROCTABLE()->DrawArraysEXT) #define glEdgeFlagPointerEXT (_GET_TLS_PROCTABLE()->EdgeFlagPointerEXT) #define glGetPointervEXT (_GET_TLS_PROCTABLE()->GetPointervEXT) #define glIndexPointerEXT (_GET_TLS_PROCTABLE()->IndexPointerEXT) #define glNormalPointerEXT (_GET_TLS_PROCTABLE()->NormalPointerEXT) #define glTexCoordPointerEXT (_GET_TLS_PROCTABLE()->TexCoordPointerEXT) #define glVertexPointerEXT (_GET_TLS_PROCTABLE()->VertexPointerEXT) #define glBlendEquationEXT (_GET_TLS_PROCTABLE()->BlendEquationEXT) #define glSpriteParameterfSGIX (_GET_TLS_PROCTABLE()->SpriteParameterfSGIX) #define glSpriteParameterfvSGIX (_GET_TLS_PROCTABLE()->SpriteParameterfvSGIX) #define glSpriteParameteriSGIX (_GET_TLS_PROCTABLE()->SpriteParameteriSGIX) #define glSpriteParameterivSGIX (_GET_TLS_PROCTABLE()->SpriteParameterivSGIX) #define glPointParameterfEXT (_GET_TLS_PROCTABLE()->PointParameterfEXT) #define glPointParameterfvEXT (_GET_TLS_PROCTABLE()->PointParameterfvEXT) #define glPointParameterfSGIS (_GET_TLS_PROCTABLE()->PointParameterfSGIS) #define glPointParameterfvSGIS (_GET_TLS_PROCTABLE()->PointParameterfvSGIS) #define glGetInstrumentsSGIX (_GET_TLS_PROCTABLE()->GetInstrumentsSGIX) #define glInstrumentsBufferSGIX (_GET_TLS_PROCTABLE()->InstrumentsBufferSGIX) #define glPollInstrumentsSGIX (_GET_TLS_PROCTABLE()->PollInstrumentsSGIX) #define glReadInstrumentsSGIX (_GET_TLS_PROCTABLE()->ReadInstrumentsSGIX) #define glStartInstrumentsSGIX (_GET_TLS_PROCTABLE()->StartInstrumentsSGIX) #define glStopInstrumentsSGIX (_GET_TLS_PROCTABLE()->StopInstrumentsSGIX) #define glFrameZoomSGIX (_GET_TLS_PROCTABLE()->FrameZoomSGIX) #define glTagSampleBufferSGIX (_GET_TLS_PROCTABLE()->TagSampleBufferSGIX) #define glDeformationMap3dSGIX (_GET_TLS_PROCTABLE()->DeformationMap3dSGIX) #define glDeformationMap3fSGIX (_GET_TLS_PROCTABLE()->DeformationMap3fSGIX) #define glDeformSGIX (_GET_TLS_PROCTABLE()->DeformSGIX) #define glLoadIdentityDeformationMapSGIX (_GET_TLS_PROCTABLE()->LoadIdentityDeformationMapSGIX) #define glReferencePlaneSGIX (_GET_TLS_PROCTABLE()->ReferencePlaneSGIX) #define glFlushRasterSGIX (_GET_TLS_PROCTABLE()->FlushRasterSGIX) #define glFogFuncSGIS (_GET_TLS_PROCTABLE()->FogFuncSGIS) #define glGetFogFuncSGIS (_GET_TLS_PROCTABLE()->GetFogFuncSGIS) #define glImageTransformParameteriHP (_GET_TLS_PROCTABLE()->ImageTransformParameteriHP) #define glImageTransformParameterfHP (_GET_TLS_PROCTABLE()->ImageTransformParameterfHP) #define glImageTransformParameterivHP (_GET_TLS_PROCTABLE()->ImageTransformParameterivHP) #define glImageTransformParameterfvHP (_GET_TLS_PROCTABLE()->ImageTransformParameterfvHP) #define glGetImageTransformParameterivHP (_GET_TLS_PROCTABLE()->GetImageTransformParameterivHP) #define glGetImageTransformParameterfvHP (_GET_TLS_PROCTABLE()->GetImageTransformParameterfvHP) #define glColorSubTableEXT (_GET_TLS_PROCTABLE()->ColorSubTableEXT) #define glCopyColorSubTableEXT (_GET_TLS_PROCTABLE()->CopyColorSubTableEXT) #define glHintPGI (_GET_TLS_PROCTABLE()->HintPGI) #define glColorTableEXT (_GET_TLS_PROCTABLE()->ColorTableEXT) #define glGetColorTableEXT (_GET_TLS_PROCTABLE()->GetColorTableEXT) #define glGetColorTableParameterivEXT (_GET_TLS_PROCTABLE()->GetColorTableParameterivEXT) #define glGetColorTableParameterfvEXT (_GET_TLS_PROCTABLE()->GetColorTableParameterfvEXT) #define glGetListParameterfvSGIX (_GET_TLS_PROCTABLE()->GetListParameterfvSGIX) #define glGetListParameterivSGIX (_GET_TLS_PROCTABLE()->GetListParameterivSGIX) #define glListParameterfSGIX (_GET_TLS_PROCTABLE()->ListParameterfSGIX) #define glListParameterfvSGIX (_GET_TLS_PROCTABLE()->ListParameterfvSGIX) #define glListParameteriSGIX (_GET_TLS_PROCTABLE()->ListParameteriSGIX) #define glListParameterivSGIX (_GET_TLS_PROCTABLE()->ListParameterivSGIX) #define glIndexMaterialEXT (_GET_TLS_PROCTABLE()->IndexMaterialEXT) #define glIndexFuncEXT (_GET_TLS_PROCTABLE()->IndexFuncEXT) #define glLockArraysEXT (_GET_TLS_PROCTABLE()->LockArraysEXT) #define glUnlockArraysEXT (_GET_TLS_PROCTABLE()->UnlockArraysEXT) #define glCullParameterdvEXT (_GET_TLS_PROCTABLE()->CullParameterdvEXT) #define glCullParameterfvEXT (_GET_TLS_PROCTABLE()->CullParameterfvEXT) #define glFragmentColorMaterialSGIX (_GET_TLS_PROCTABLE()->FragmentColorMaterialSGIX) #define glFragmentLightfSGIX (_GET_TLS_PROCTABLE()->FragmentLightfSGIX) #define glFragmentLightfvSGIX (_GET_TLS_PROCTABLE()->FragmentLightfvSGIX) #define glFragmentLightiSGIX (_GET_TLS_PROCTABLE()->FragmentLightiSGIX) #define glFragmentLightivSGIX (_GET_TLS_PROCTABLE()->FragmentLightivSGIX) #define glFragmentLightModelfSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelfSGIX) #define glFragmentLightModelfvSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelfvSGIX) #define glFragmentLightModeliSGIX (_GET_TLS_PROCTABLE()->FragmentLightModeliSGIX) #define glFragmentLightModelivSGIX (_GET_TLS_PROCTABLE()->FragmentLightModelivSGIX) #define glFragmentMaterialfSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialfSGIX) #define glFragmentMaterialfvSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialfvSGIX) #define glFragmentMaterialiSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialiSGIX) #define glFragmentMaterialivSGIX (_GET_TLS_PROCTABLE()->FragmentMaterialivSGIX) #define glGetFragmentLightfvSGIX (_GET_TLS_PROCTABLE()->GetFragmentLightfvSGIX) #define glGetFragmentLightivSGIX (_GET_TLS_PROCTABLE()->GetFragmentLightivSGIX) #define glGetFragmentMaterialfvSGIX (_GET_TLS_PROCTABLE()->GetFragmentMaterialfvSGIX) #define glGetFragmentMaterialivSGIX (_GET_TLS_PROCTABLE()->GetFragmentMaterialivSGIX) #define glLightEnviSGIX (_GET_TLS_PROCTABLE()->LightEnviSGIX) #define glDrawRangeElementsEXT (_GET_TLS_PROCTABLE()->DrawRangeElementsEXT) #define glApplyTextureEXT (_GET_TLS_PROCTABLE()->ApplyTextureEXT) #define glTextureLightEXT (_GET_TLS_PROCTABLE()->TextureLightEXT) #define glTextureMaterialEXT (_GET_TLS_PROCTABLE()->TextureMaterialEXT) #define glAsyncMarkerSGIX (_GET_TLS_PROCTABLE()->AsyncMarkerSGIX) #define glFinishAsyncSGIX (_GET_TLS_PROCTABLE()->FinishAsyncSGIX) #define glPollAsyncSGIX (_GET_TLS_PROCTABLE()->PollAsyncSGIX) #define glGenAsyncMarkersSGIX (_GET_TLS_PROCTABLE()->GenAsyncMarkersSGIX) #define glDeleteAsyncMarkersSGIX (_GET_TLS_PROCTABLE()->DeleteAsyncMarkersSGIX) #define glIsAsyncMarkerSGIX (_GET_TLS_PROCTABLE()->IsAsyncMarkerSGIX) #define glVertexPointervINTEL (_GET_TLS_PROCTABLE()->VertexPointervINTEL) #define glNormalPointervINTEL (_GET_TLS_PROCTABLE()->NormalPointervINTEL) #define glColorPointervINTEL (_GET_TLS_PROCTABLE()->ColorPointervINTEL) #define glTexCoordPointervINTEL (_GET_TLS_PROCTABLE()->TexCoordPointervINTEL) #define glPixelTransformParameteriEXT (_GET_TLS_PROCTABLE()->PixelTransformParameteriEXT) #define glPixelTransformParameterfEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterfEXT) #define glPixelTransformParameterivEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterivEXT) #define glPixelTransformParameterfvEXT (_GET_TLS_PROCTABLE()->PixelTransformParameterfvEXT) #define glSecondaryColor3bEXT (_GET_TLS_PROCTABLE()->SecondaryColor3bEXT) #define glSecondaryColor3bvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3bvEXT) #define glSecondaryColor3dEXT (_GET_TLS_PROCTABLE()->SecondaryColor3dEXT) #define glSecondaryColor3dvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3dvEXT) #define glSecondaryColor3fEXT (_GET_TLS_PROCTABLE()->SecondaryColor3fEXT) #define glSecondaryColor3fvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3fvEXT) #define glSecondaryColor3iEXT (_GET_TLS_PROCTABLE()->SecondaryColor3iEXT) #define glSecondaryColor3ivEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ivEXT) #define glSecondaryColor3sEXT (_GET_TLS_PROCTABLE()->SecondaryColor3sEXT) #define glSecondaryColor3svEXT (_GET_TLS_PROCTABLE()->SecondaryColor3svEXT) #define glSecondaryColor3ubEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ubEXT) #define glSecondaryColor3ubvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3ubvEXT) #define glSecondaryColor3uiEXT (_GET_TLS_PROCTABLE()->SecondaryColor3uiEXT) #define glSecondaryColor3uivEXT (_GET_TLS_PROCTABLE()->SecondaryColor3uivEXT) #define glSecondaryColor3usEXT (_GET_TLS_PROCTABLE()->SecondaryColor3usEXT) #define glSecondaryColor3usvEXT (_GET_TLS_PROCTABLE()->SecondaryColor3usvEXT) #define glSecondaryColorPointerEXT (_GET_TLS_PROCTABLE()->SecondaryColorPointerEXT) #define glTextureNormalEXT (_GET_TLS_PROCTABLE()->TextureNormalEXT) #define glMultiDrawArraysEXT (_GET_TLS_PROCTABLE()->MultiDrawArraysEXT) #define glMultiDrawElementsEXT (_GET_TLS_PROCTABLE()->MultiDrawElementsEXT) #define glFogCoordfEXT (_GET_TLS_PROCTABLE()->FogCoordfEXT) #define glFogCoordfvEXT (_GET_TLS_PROCTABLE()->FogCoordfvEXT) #define glFogCoorddEXT (_GET_TLS_PROCTABLE()->FogCoorddEXT) #define glFogCoorddvEXT (_GET_TLS_PROCTABLE()->FogCoorddvEXT) #define glFogCoordPointerEXT (_GET_TLS_PROCTABLE()->FogCoordPointerEXT) #define glTangent3bEXT (_GET_TLS_PROCTABLE()->Tangent3bEXT) #define glTangent3bvEXT (_GET_TLS_PROCTABLE()->Tangent3bvEXT) #define glTangent3dEXT (_GET_TLS_PROCTABLE()->Tangent3dEXT) #define glTangent3dvEXT (_GET_TLS_PROCTABLE()->Tangent3dvEXT) #define glTangent3fEXT (_GET_TLS_PROCTABLE()->Tangent3fEXT) #define glTangent3fvEXT (_GET_TLS_PROCTABLE()->Tangent3fvEXT) #define glTangent3iEXT (_GET_TLS_PROCTABLE()->Tangent3iEXT) #define glTangent3ivEXT (_GET_TLS_PROCTABLE()->Tangent3ivEXT) #define glTangent3sEXT (_GET_TLS_PROCTABLE()->Tangent3sEXT) #define glTangent3svEXT (_GET_TLS_PROCTABLE()->Tangent3svEXT) #define glBinormal3bEXT (_GET_TLS_PROCTABLE()->Binormal3bEXT) #define glBinormal3bvEXT (_GET_TLS_PROCTABLE()->Binormal3bvEXT) #define glBinormal3dEXT (_GET_TLS_PROCTABLE()->Binormal3dEXT) #define glBinormal3dvEXT (_GET_TLS_PROCTABLE()->Binormal3dvEXT) #define glBinormal3fEXT (_GET_TLS_PROCTABLE()->Binormal3fEXT) #define glBinormal3fvEXT (_GET_TLS_PROCTABLE()->Binormal3fvEXT) #define glBinormal3iEXT (_GET_TLS_PROCTABLE()->Binormal3iEXT) #define glBinormal3ivEXT (_GET_TLS_PROCTABLE()->Binormal3ivEXT) #define glBinormal3sEXT (_GET_TLS_PROCTABLE()->Binormal3sEXT) #define glBinormal3svEXT (_GET_TLS_PROCTABLE()->Binormal3svEXT) #define glTangentPointerEXT (_GET_TLS_PROCTABLE()->TangentPointerEXT) #define glBinormalPointerEXT (_GET_TLS_PROCTABLE()->BinormalPointerEXT) #define glFinishTextureSUNX (_GET_TLS_PROCTABLE()->FinishTextureSUNX) #define glGlobalAlphaFactorbSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorbSUN) #define glGlobalAlphaFactorsSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorsSUN) #define glGlobalAlphaFactoriSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactoriSUN) #define glGlobalAlphaFactorfSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorfSUN) #define glGlobalAlphaFactordSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactordSUN) #define glGlobalAlphaFactorubSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorubSUN) #define glGlobalAlphaFactorusSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactorusSUN) #define glGlobalAlphaFactoruiSUN (_GET_TLS_PROCTABLE()->GlobalAlphaFactoruiSUN) #define glReplacementCodeuiSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiSUN) #define glReplacementCodeusSUN (_GET_TLS_PROCTABLE()->ReplacementCodeusSUN) #define glReplacementCodeubSUN (_GET_TLS_PROCTABLE()->ReplacementCodeubSUN) #define glReplacementCodeuivSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuivSUN) #define glReplacementCodeusvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeusvSUN) #define glReplacementCodeubvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeubvSUN) #define glReplacementCodePointerSUN (_GET_TLS_PROCTABLE()->ReplacementCodePointerSUN) #define glColor4ubVertex2fSUN (_GET_TLS_PROCTABLE()->Color4ubVertex2fSUN) #define glColor4ubVertex2fvSUN (_GET_TLS_PROCTABLE()->Color4ubVertex2fvSUN) #define glColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->Color4ubVertex3fSUN) #define glColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->Color4ubVertex3fvSUN) #define glColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->Color3fVertex3fSUN) #define glColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Color3fVertex3fvSUN) #define glNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->Normal3fVertex3fSUN) #define glNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Normal3fVertex3fvSUN) #define glColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->Color4fNormal3fVertex3fSUN) #define glColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->Color4fNormal3fVertex3fvSUN) #define glTexCoord2fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fVertex3fSUN) #define glTexCoord2fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fVertex3fvSUN) #define glTexCoord4fVertex4fSUN (_GET_TLS_PROCTABLE()->TexCoord4fVertex4fSUN) #define glTexCoord4fVertex4fvSUN (_GET_TLS_PROCTABLE()->TexCoord4fVertex4fvSUN) #define glTexCoord2fColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4ubVertex3fSUN) #define glTexCoord2fColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4ubVertex3fvSUN) #define glTexCoord2fColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor3fVertex3fSUN) #define glTexCoord2fColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor3fVertex3fvSUN) #define glTexCoord2fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fNormal3fVertex3fSUN) #define glTexCoord2fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fNormal3fVertex3fvSUN) #define glTexCoord2fColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4fNormal3fVertex3fSUN) #define glTexCoord2fColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->TexCoord2fColor4fNormal3fVertex3fvSUN) #define glTexCoord4fColor4fNormal3fVertex4fSUN (_GET_TLS_PROCTABLE()->TexCoord4fColor4fNormal3fVertex4fSUN) #define glTexCoord4fColor4fNormal3fVertex4fvSUN (_GET_TLS_PROCTABLE()->TexCoord4fColor4fNormal3fVertex4fvSUN) #define glReplacementCodeuiVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiVertex3fSUN) #define glReplacementCodeuiVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiVertex3fvSUN) #define glReplacementCodeuiColor4ubVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4ubVertex3fSUN) #define glReplacementCodeuiColor4ubVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4ubVertex3fvSUN) #define glReplacementCodeuiColor3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor3fVertex3fSUN) #define glReplacementCodeuiColor3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor3fVertex3fvSUN) #define glReplacementCodeuiNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiNormal3fVertex3fSUN) #define glReplacementCodeuiNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiNormal3fVertex3fvSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiColor4fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fVertex3fSUN) #define glReplacementCodeuiTexCoord2fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (_GET_TLS_PROCTABLE()->ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) #define glBlendFuncSeparateEXT (_GET_TLS_PROCTABLE()->BlendFuncSeparateEXT) #define glBlendFuncSeparateINGR (_GET_TLS_PROCTABLE()->BlendFuncSeparateINGR) #define glVertexWeightfEXT (_GET_TLS_PROCTABLE()->VertexWeightfEXT) #define glVertexWeightfvEXT (_GET_TLS_PROCTABLE()->VertexWeightfvEXT) #define glVertexWeightPointerEXT (_GET_TLS_PROCTABLE()->VertexWeightPointerEXT) #define glFlushVertexArrayRangeNV (_GET_TLS_PROCTABLE()->FlushVertexArrayRangeNV) #define glVertexArrayRangeNV (_GET_TLS_PROCTABLE()->VertexArrayRangeNV) #define glCombinerParameterfvNV (_GET_TLS_PROCTABLE()->CombinerParameterfvNV) #define glCombinerParameterfNV (_GET_TLS_PROCTABLE()->CombinerParameterfNV) #define glCombinerParameterivNV (_GET_TLS_PROCTABLE()->CombinerParameterivNV) #define glCombinerParameteriNV (_GET_TLS_PROCTABLE()->CombinerParameteriNV) #define glCombinerInputNV (_GET_TLS_PROCTABLE()->CombinerInputNV) #define glCombinerOutputNV (_GET_TLS_PROCTABLE()->CombinerOutputNV) #define glFinalCombinerInputNV (_GET_TLS_PROCTABLE()->FinalCombinerInputNV) #define glGetCombinerInputParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerInputParameterfvNV) #define glGetCombinerInputParameterivNV (_GET_TLS_PROCTABLE()->GetCombinerInputParameterivNV) #define glGetCombinerOutputParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerOutputParameterfvNV) #define glGetCombinerOutputParameterivNV (_GET_TLS_PROCTABLE()->GetCombinerOutputParameterivNV) #define glGetFinalCombinerInputParameterfvNV (_GET_TLS_PROCTABLE()->GetFinalCombinerInputParameterfvNV) #define glGetFinalCombinerInputParameterivNV (_GET_TLS_PROCTABLE()->GetFinalCombinerInputParameterivNV) #define glResizeBuffersMESA (_GET_TLS_PROCTABLE()->ResizeBuffersMESA) #define glWindowPos2dMESA (_GET_TLS_PROCTABLE()->WindowPos2dMESA) #define glWindowPos2dvMESA (_GET_TLS_PROCTABLE()->WindowPos2dvMESA) #define glWindowPos2fMESA (_GET_TLS_PROCTABLE()->WindowPos2fMESA) #define glWindowPos2fvMESA (_GET_TLS_PROCTABLE()->WindowPos2fvMESA) #define glWindowPos2iMESA (_GET_TLS_PROCTABLE()->WindowPos2iMESA) #define glWindowPos2ivMESA (_GET_TLS_PROCTABLE()->WindowPos2ivMESA) #define glWindowPos2sMESA (_GET_TLS_PROCTABLE()->WindowPos2sMESA) #define glWindowPos2svMESA (_GET_TLS_PROCTABLE()->WindowPos2svMESA) #define glWindowPos3dMESA (_GET_TLS_PROCTABLE()->WindowPos3dMESA) #define glWindowPos3dvMESA (_GET_TLS_PROCTABLE()->WindowPos3dvMESA) #define glWindowPos3fMESA (_GET_TLS_PROCTABLE()->WindowPos3fMESA) #define glWindowPos3fvMESA (_GET_TLS_PROCTABLE()->WindowPos3fvMESA) #define glWindowPos3iMESA (_GET_TLS_PROCTABLE()->WindowPos3iMESA) #define glWindowPos3ivMESA (_GET_TLS_PROCTABLE()->WindowPos3ivMESA) #define glWindowPos3sMESA (_GET_TLS_PROCTABLE()->WindowPos3sMESA) #define glWindowPos3svMESA (_GET_TLS_PROCTABLE()->WindowPos3svMESA) #define glWindowPos4dMESA (_GET_TLS_PROCTABLE()->WindowPos4dMESA) #define glWindowPos4dvMESA (_GET_TLS_PROCTABLE()->WindowPos4dvMESA) #define glWindowPos4fMESA (_GET_TLS_PROCTABLE()->WindowPos4fMESA) #define glWindowPos4fvMESA (_GET_TLS_PROCTABLE()->WindowPos4fvMESA) #define glWindowPos4iMESA (_GET_TLS_PROCTABLE()->WindowPos4iMESA) #define glWindowPos4ivMESA (_GET_TLS_PROCTABLE()->WindowPos4ivMESA) #define glWindowPos4sMESA (_GET_TLS_PROCTABLE()->WindowPos4sMESA) #define glWindowPos4svMESA (_GET_TLS_PROCTABLE()->WindowPos4svMESA) #define glMultiModeDrawArraysIBM (_GET_TLS_PROCTABLE()->MultiModeDrawArraysIBM) #define glMultiModeDrawElementsIBM (_GET_TLS_PROCTABLE()->MultiModeDrawElementsIBM) #define glColorPointerListIBM (_GET_TLS_PROCTABLE()->ColorPointerListIBM) #define glSecondaryColorPointerListIBM (_GET_TLS_PROCTABLE()->SecondaryColorPointerListIBM) #define glEdgeFlagPointerListIBM (_GET_TLS_PROCTABLE()->EdgeFlagPointerListIBM) #define glFogCoordPointerListIBM (_GET_TLS_PROCTABLE()->FogCoordPointerListIBM) #define glIndexPointerListIBM (_GET_TLS_PROCTABLE()->IndexPointerListIBM) #define glNormalPointerListIBM (_GET_TLS_PROCTABLE()->NormalPointerListIBM) #define glTexCoordPointerListIBM (_GET_TLS_PROCTABLE()->TexCoordPointerListIBM) #define glVertexPointerListIBM (_GET_TLS_PROCTABLE()->VertexPointerListIBM) #define glTbufferMask3DFX (_GET_TLS_PROCTABLE()->TbufferMask3DFX) #define glSampleMaskEXT (_GET_TLS_PROCTABLE()->SampleMaskEXT) #define glSamplePatternEXT (_GET_TLS_PROCTABLE()->SamplePatternEXT) #define glTextureColorMaskSGIS (_GET_TLS_PROCTABLE()->TextureColorMaskSGIS) #define glIglooInterfaceSGIX (_GET_TLS_PROCTABLE()->IglooInterfaceSGIX) #define glDeleteFencesNV (_GET_TLS_PROCTABLE()->DeleteFencesNV) #define glGenFencesNV (_GET_TLS_PROCTABLE()->GenFencesNV) #define glIsFenceNV (_GET_TLS_PROCTABLE()->IsFenceNV) #define glTestFenceNV (_GET_TLS_PROCTABLE()->TestFenceNV) #define glGetFenceivNV (_GET_TLS_PROCTABLE()->GetFenceivNV) #define glFinishFenceNV (_GET_TLS_PROCTABLE()->FinishFenceNV) #define glSetFenceNV (_GET_TLS_PROCTABLE()->SetFenceNV) #define glMapControlPointsNV (_GET_TLS_PROCTABLE()->MapControlPointsNV) #define glMapParameterivNV (_GET_TLS_PROCTABLE()->MapParameterivNV) #define glMapParameterfvNV (_GET_TLS_PROCTABLE()->MapParameterfvNV) #define glGetMapControlPointsNV (_GET_TLS_PROCTABLE()->GetMapControlPointsNV) #define glGetMapParameterivNV (_GET_TLS_PROCTABLE()->GetMapParameterivNV) #define glGetMapParameterfvNV (_GET_TLS_PROCTABLE()->GetMapParameterfvNV) #define glGetMapAttribParameterivNV (_GET_TLS_PROCTABLE()->GetMapAttribParameterivNV) #define glGetMapAttribParameterfvNV (_GET_TLS_PROCTABLE()->GetMapAttribParameterfvNV) #define glEvalMapsNV (_GET_TLS_PROCTABLE()->EvalMapsNV) #define glCombinerStageParameterfvNV (_GET_TLS_PROCTABLE()->CombinerStageParameterfvNV) #define glGetCombinerStageParameterfvNV (_GET_TLS_PROCTABLE()->GetCombinerStageParameterfvNV) #define glAreProgramsResidentNV (_GET_TLS_PROCTABLE()->AreProgramsResidentNV) #define glBindProgramNV (_GET_TLS_PROCTABLE()->BindProgramNV) #define glDeleteProgramsNV (_GET_TLS_PROCTABLE()->DeleteProgramsNV) #define glExecuteProgramNV (_GET_TLS_PROCTABLE()->ExecuteProgramNV) #define glGenProgramsNV (_GET_TLS_PROCTABLE()->GenProgramsNV) #define glGetProgramParameterdvNV (_GET_TLS_PROCTABLE()->GetProgramParameterdvNV) #define glGetProgramParameterfvNV (_GET_TLS_PROCTABLE()->GetProgramParameterfvNV) #define glGetProgramivNV (_GET_TLS_PROCTABLE()->GetProgramivNV) #define glGetProgramStringNV (_GET_TLS_PROCTABLE()->GetProgramStringNV) #define glGetTrackMatrixivNV (_GET_TLS_PROCTABLE()->GetTrackMatrixivNV) #define glGetVertexAttribdvNV (_GET_TLS_PROCTABLE()->GetVertexAttribdvNV) #define glGetVertexAttribfvNV (_GET_TLS_PROCTABLE()->GetVertexAttribfvNV) #define glGetVertexAttribivNV (_GET_TLS_PROCTABLE()->GetVertexAttribivNV) #define glGetVertexAttribPointervNV (_GET_TLS_PROCTABLE()->GetVertexAttribPointervNV) #define glIsProgramNV (_GET_TLS_PROCTABLE()->IsProgramNV) #define glLoadProgramNV (_GET_TLS_PROCTABLE()->LoadProgramNV) #define glProgramParameter4dNV (_GET_TLS_PROCTABLE()->ProgramParameter4dNV) #define glProgramParameter4dvNV (_GET_TLS_PROCTABLE()->ProgramParameter4dvNV) #define glProgramParameter4fNV (_GET_TLS_PROCTABLE()->ProgramParameter4fNV) #define glProgramParameter4fvNV (_GET_TLS_PROCTABLE()->ProgramParameter4fvNV) #define glProgramParameters4dvNV (_GET_TLS_PROCTABLE()->ProgramParameters4dvNV) #define glProgramParameters4fvNV (_GET_TLS_PROCTABLE()->ProgramParameters4fvNV) #define glRequestResidentProgramsNV (_GET_TLS_PROCTABLE()->RequestResidentProgramsNV) #define glTrackMatrixNV (_GET_TLS_PROCTABLE()->TrackMatrixNV) #define glVertexAttribPointerNV (_GET_TLS_PROCTABLE()->VertexAttribPointerNV) #define glVertexAttrib1dNV (_GET_TLS_PROCTABLE()->VertexAttrib1dNV) #define glVertexAttrib1dvNV (_GET_TLS_PROCTABLE()->VertexAttrib1dvNV) #define glVertexAttrib1fNV (_GET_TLS_PROCTABLE()->VertexAttrib1fNV) #define glVertexAttrib1fvNV (_GET_TLS_PROCTABLE()->VertexAttrib1fvNV) #define glVertexAttrib1sNV (_GET_TLS_PROCTABLE()->VertexAttrib1sNV) #define glVertexAttrib1svNV (_GET_TLS_PROCTABLE()->VertexAttrib1svNV) #define glVertexAttrib2dNV (_GET_TLS_PROCTABLE()->VertexAttrib2dNV) #define glVertexAttrib2dvNV (_GET_TLS_PROCTABLE()->VertexAttrib2dvNV) #define glVertexAttrib2fNV (_GET_TLS_PROCTABLE()->VertexAttrib2fNV) #define glVertexAttrib2fvNV (_GET_TLS_PROCTABLE()->VertexAttrib2fvNV) #define glVertexAttrib2sNV (_GET_TLS_PROCTABLE()->VertexAttrib2sNV) #define glVertexAttrib2svNV (_GET_TLS_PROCTABLE()->VertexAttrib2svNV) #define glVertexAttrib3dNV (_GET_TLS_PROCTABLE()->VertexAttrib3dNV) #define glVertexAttrib3dvNV (_GET_TLS_PROCTABLE()->VertexAttrib3dvNV) #define glVertexAttrib3fNV (_GET_TLS_PROCTABLE()->VertexAttrib3fNV) #define glVertexAttrib3fvNV (_GET_TLS_PROCTABLE()->VertexAttrib3fvNV) #define glVertexAttrib3sNV (_GET_TLS_PROCTABLE()->VertexAttrib3sNV) #define glVertexAttrib3svNV (_GET_TLS_PROCTABLE()->VertexAttrib3svNV) #define glVertexAttrib4dNV (_GET_TLS_PROCTABLE()->VertexAttrib4dNV) #define glVertexAttrib4dvNV (_GET_TLS_PROCTABLE()->VertexAttrib4dvNV) #define glVertexAttrib4fNV (_GET_TLS_PROCTABLE()->VertexAttrib4fNV) #define glVertexAttrib4fvNV (_GET_TLS_PROCTABLE()->VertexAttrib4fvNV) #define glVertexAttrib4sNV (_GET_TLS_PROCTABLE()->VertexAttrib4sNV) #define glVertexAttrib4svNV (_GET_TLS_PROCTABLE()->VertexAttrib4svNV) #define glVertexAttrib4ubNV (_GET_TLS_PROCTABLE()->VertexAttrib4ubNV) #define glVertexAttrib4ubvNV (_GET_TLS_PROCTABLE()->VertexAttrib4ubvNV) #define glVertexAttribs1dvNV (_GET_TLS_PROCTABLE()->VertexAttribs1dvNV) #define glVertexAttribs1fvNV (_GET_TLS_PROCTABLE()->VertexAttribs1fvNV) #define glVertexAttribs1svNV (_GET_TLS_PROCTABLE()->VertexAttribs1svNV) #define glVertexAttribs2dvNV (_GET_TLS_PROCTABLE()->VertexAttribs2dvNV) #define glVertexAttribs2fvNV (_GET_TLS_PROCTABLE()->VertexAttribs2fvNV) #define glVertexAttribs2svNV (_GET_TLS_PROCTABLE()->VertexAttribs2svNV) #define glVertexAttribs3dvNV (_GET_TLS_PROCTABLE()->VertexAttribs3dvNV) #define glVertexAttribs3fvNV (_GET_TLS_PROCTABLE()->VertexAttribs3fvNV) #define glVertexAttribs3svNV (_GET_TLS_PROCTABLE()->VertexAttribs3svNV) #define glVertexAttribs4dvNV (_GET_TLS_PROCTABLE()->VertexAttribs4dvNV) #define glVertexAttribs4fvNV (_GET_TLS_PROCTABLE()->VertexAttribs4fvNV) #define glVertexAttribs4svNV (_GET_TLS_PROCTABLE()->VertexAttribs4svNV) #define glVertexAttribs4ubvNV (_GET_TLS_PROCTABLE()->VertexAttribs4ubvNV) #define glTexBumpParameterivATI (_GET_TLS_PROCTABLE()->TexBumpParameterivATI) #define glTexBumpParameterfvATI (_GET_TLS_PROCTABLE()->TexBumpParameterfvATI) #define glGetTexBumpParameterivATI (_GET_TLS_PROCTABLE()->GetTexBumpParameterivATI) #define glGetTexBumpParameterfvATI (_GET_TLS_PROCTABLE()->GetTexBumpParameterfvATI) #define glGenFragmentShadersATI (_GET_TLS_PROCTABLE()->GenFragmentShadersATI) #define glBindFragmentShaderATI (_GET_TLS_PROCTABLE()->BindFragmentShaderATI) #define glDeleteFragmentShaderATI (_GET_TLS_PROCTABLE()->DeleteFragmentShaderATI) #define glBeginFragmentShaderATI (_GET_TLS_PROCTABLE()->BeginFragmentShaderATI) #define glEndFragmentShaderATI (_GET_TLS_PROCTABLE()->EndFragmentShaderATI) #define glPassTexCoordATI (_GET_TLS_PROCTABLE()->PassTexCoordATI) #define glSampleMapATI (_GET_TLS_PROCTABLE()->SampleMapATI) #define glColorFragmentOp1ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp1ATI) #define glColorFragmentOp2ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp2ATI) #define glColorFragmentOp3ATI (_GET_TLS_PROCTABLE()->ColorFragmentOp3ATI) #define glAlphaFragmentOp1ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp1ATI) #define glAlphaFragmentOp2ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp2ATI) #define glAlphaFragmentOp3ATI (_GET_TLS_PROCTABLE()->AlphaFragmentOp3ATI) #define glSetFragmentShaderConstantATI (_GET_TLS_PROCTABLE()->SetFragmentShaderConstantATI) #define glPNTrianglesiATI (_GET_TLS_PROCTABLE()->PNTrianglesiATI) #define glPNTrianglesfATI (_GET_TLS_PROCTABLE()->PNTrianglesfATI) #define glNewObjectBufferATI (_GET_TLS_PROCTABLE()->NewObjectBufferATI) #define glIsObjectBufferATI (_GET_TLS_PROCTABLE()->IsObjectBufferATI) #define glUpdateObjectBufferATI (_GET_TLS_PROCTABLE()->UpdateObjectBufferATI) #define glGetObjectBufferfvATI (_GET_TLS_PROCTABLE()->GetObjectBufferfvATI) #define glGetObjectBufferivATI (_GET_TLS_PROCTABLE()->GetObjectBufferivATI) #define glFreeObjectBufferATI (_GET_TLS_PROCTABLE()->FreeObjectBufferATI) #define glArrayObjectATI (_GET_TLS_PROCTABLE()->ArrayObjectATI) #define glGetArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetArrayObjectfvATI) #define glGetArrayObjectivATI (_GET_TLS_PROCTABLE()->GetArrayObjectivATI) #define glVariantArrayObjectATI (_GET_TLS_PROCTABLE()->VariantArrayObjectATI) #define glGetVariantArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetVariantArrayObjectfvATI) #define glGetVariantArrayObjectivATI (_GET_TLS_PROCTABLE()->GetVariantArrayObjectivATI) #define glBeginVertexShaderEXT (_GET_TLS_PROCTABLE()->BeginVertexShaderEXT) #define glEndVertexShaderEXT (_GET_TLS_PROCTABLE()->EndVertexShaderEXT) #define glBindVertexShaderEXT (_GET_TLS_PROCTABLE()->BindVertexShaderEXT) #define glGenVertexShadersEXT (_GET_TLS_PROCTABLE()->GenVertexShadersEXT) #define glDeleteVertexShaderEXT (_GET_TLS_PROCTABLE()->DeleteVertexShaderEXT) #define glShaderOp1EXT (_GET_TLS_PROCTABLE()->ShaderOp1EXT) #define glShaderOp2EXT (_GET_TLS_PROCTABLE()->ShaderOp2EXT) #define glShaderOp3EXT (_GET_TLS_PROCTABLE()->ShaderOp3EXT) #define glSwizzleEXT (_GET_TLS_PROCTABLE()->SwizzleEXT) #define glWriteMaskEXT (_GET_TLS_PROCTABLE()->WriteMaskEXT) #define glInsertComponentEXT (_GET_TLS_PROCTABLE()->InsertComponentEXT) #define glExtractComponentEXT (_GET_TLS_PROCTABLE()->ExtractComponentEXT) #define glGenSymbolsEXT (_GET_TLS_PROCTABLE()->GenSymbolsEXT) #define glSetInvariantEXT (_GET_TLS_PROCTABLE()->SetInvariantEXT) #define glSetLocalConstantEXT (_GET_TLS_PROCTABLE()->SetLocalConstantEXT) #define glVariantbvEXT (_GET_TLS_PROCTABLE()->VariantbvEXT) #define glVariantsvEXT (_GET_TLS_PROCTABLE()->VariantsvEXT) #define glVariantivEXT (_GET_TLS_PROCTABLE()->VariantivEXT) #define glVariantfvEXT (_GET_TLS_PROCTABLE()->VariantfvEXT) #define glVariantdvEXT (_GET_TLS_PROCTABLE()->VariantdvEXT) #define glVariantubvEXT (_GET_TLS_PROCTABLE()->VariantubvEXT) #define glVariantusvEXT (_GET_TLS_PROCTABLE()->VariantusvEXT) #define glVariantuivEXT (_GET_TLS_PROCTABLE()->VariantuivEXT) #define glVariantPointerEXT (_GET_TLS_PROCTABLE()->VariantPointerEXT) #define glEnableVariantClientStateEXT (_GET_TLS_PROCTABLE()->EnableVariantClientStateEXT) #define glDisableVariantClientStateEXT (_GET_TLS_PROCTABLE()->DisableVariantClientStateEXT) #define glBindLightParameterEXT (_GET_TLS_PROCTABLE()->BindLightParameterEXT) #define glBindMaterialParameterEXT (_GET_TLS_PROCTABLE()->BindMaterialParameterEXT) #define glBindTexGenParameterEXT (_GET_TLS_PROCTABLE()->BindTexGenParameterEXT) #define glBindTextureUnitParameterEXT (_GET_TLS_PROCTABLE()->BindTextureUnitParameterEXT) #define glBindParameterEXT (_GET_TLS_PROCTABLE()->BindParameterEXT) #define glIsVariantEnabledEXT (_GET_TLS_PROCTABLE()->IsVariantEnabledEXT) #define glGetVariantBooleanvEXT (_GET_TLS_PROCTABLE()->GetVariantBooleanvEXT) #define glGetVariantIntegervEXT (_GET_TLS_PROCTABLE()->GetVariantIntegervEXT) #define glGetVariantFloatvEXT (_GET_TLS_PROCTABLE()->GetVariantFloatvEXT) #define glGetVariantPointervEXT (_GET_TLS_PROCTABLE()->GetVariantPointervEXT) #define glGetInvariantBooleanvEXT (_GET_TLS_PROCTABLE()->GetInvariantBooleanvEXT) #define glGetInvariantIntegervEXT (_GET_TLS_PROCTABLE()->GetInvariantIntegervEXT) #define glGetInvariantFloatvEXT (_GET_TLS_PROCTABLE()->GetInvariantFloatvEXT) #define glGetLocalConstantBooleanvEXT (_GET_TLS_PROCTABLE()->GetLocalConstantBooleanvEXT) #define glGetLocalConstantIntegervEXT (_GET_TLS_PROCTABLE()->GetLocalConstantIntegervEXT) #define glGetLocalConstantFloatvEXT (_GET_TLS_PROCTABLE()->GetLocalConstantFloatvEXT) #define glVertexStream1sATI (_GET_TLS_PROCTABLE()->VertexStream1sATI) #define glVertexStream1svATI (_GET_TLS_PROCTABLE()->VertexStream1svATI) #define glVertexStream1iATI (_GET_TLS_PROCTABLE()->VertexStream1iATI) #define glVertexStream1ivATI (_GET_TLS_PROCTABLE()->VertexStream1ivATI) #define glVertexStream1fATI (_GET_TLS_PROCTABLE()->VertexStream1fATI) #define glVertexStream1fvATI (_GET_TLS_PROCTABLE()->VertexStream1fvATI) #define glVertexStream1dATI (_GET_TLS_PROCTABLE()->VertexStream1dATI) #define glVertexStream1dvATI (_GET_TLS_PROCTABLE()->VertexStream1dvATI) #define glVertexStream2sATI (_GET_TLS_PROCTABLE()->VertexStream2sATI) #define glVertexStream2svATI (_GET_TLS_PROCTABLE()->VertexStream2svATI) #define glVertexStream2iATI (_GET_TLS_PROCTABLE()->VertexStream2iATI) #define glVertexStream2ivATI (_GET_TLS_PROCTABLE()->VertexStream2ivATI) #define glVertexStream2fATI (_GET_TLS_PROCTABLE()->VertexStream2fATI) #define glVertexStream2fvATI (_GET_TLS_PROCTABLE()->VertexStream2fvATI) #define glVertexStream2dATI (_GET_TLS_PROCTABLE()->VertexStream2dATI) #define glVertexStream2dvATI (_GET_TLS_PROCTABLE()->VertexStream2dvATI) #define glVertexStream3sATI (_GET_TLS_PROCTABLE()->VertexStream3sATI) #define glVertexStream3svATI (_GET_TLS_PROCTABLE()->VertexStream3svATI) #define glVertexStream3iATI (_GET_TLS_PROCTABLE()->VertexStream3iATI) #define glVertexStream3ivATI (_GET_TLS_PROCTABLE()->VertexStream3ivATI) #define glVertexStream3fATI (_GET_TLS_PROCTABLE()->VertexStream3fATI) #define glVertexStream3fvATI (_GET_TLS_PROCTABLE()->VertexStream3fvATI) #define glVertexStream3dATI (_GET_TLS_PROCTABLE()->VertexStream3dATI) #define glVertexStream3dvATI (_GET_TLS_PROCTABLE()->VertexStream3dvATI) #define glVertexStream4sATI (_GET_TLS_PROCTABLE()->VertexStream4sATI) #define glVertexStream4svATI (_GET_TLS_PROCTABLE()->VertexStream4svATI) #define glVertexStream4iATI (_GET_TLS_PROCTABLE()->VertexStream4iATI) #define glVertexStream4ivATI (_GET_TLS_PROCTABLE()->VertexStream4ivATI) #define glVertexStream4fATI (_GET_TLS_PROCTABLE()->VertexStream4fATI) #define glVertexStream4fvATI (_GET_TLS_PROCTABLE()->VertexStream4fvATI) #define glVertexStream4dATI (_GET_TLS_PROCTABLE()->VertexStream4dATI) #define glVertexStream4dvATI (_GET_TLS_PROCTABLE()->VertexStream4dvATI) #define glNormalStream3bATI (_GET_TLS_PROCTABLE()->NormalStream3bATI) #define glNormalStream3bvATI (_GET_TLS_PROCTABLE()->NormalStream3bvATI) #define glNormalStream3sATI (_GET_TLS_PROCTABLE()->NormalStream3sATI) #define glNormalStream3svATI (_GET_TLS_PROCTABLE()->NormalStream3svATI) #define glNormalStream3iATI (_GET_TLS_PROCTABLE()->NormalStream3iATI) #define glNormalStream3ivATI (_GET_TLS_PROCTABLE()->NormalStream3ivATI) #define glNormalStream3fATI (_GET_TLS_PROCTABLE()->NormalStream3fATI) #define glNormalStream3fvATI (_GET_TLS_PROCTABLE()->NormalStream3fvATI) #define glNormalStream3dATI (_GET_TLS_PROCTABLE()->NormalStream3dATI) #define glNormalStream3dvATI (_GET_TLS_PROCTABLE()->NormalStream3dvATI) #define glClientActiveVertexStreamATI (_GET_TLS_PROCTABLE()->ClientActiveVertexStreamATI) #define glVertexBlendEnviATI (_GET_TLS_PROCTABLE()->VertexBlendEnviATI) #define glVertexBlendEnvfATI (_GET_TLS_PROCTABLE()->VertexBlendEnvfATI) #define glElementPointerATI (_GET_TLS_PROCTABLE()->ElementPointerATI) #define glDrawElementArrayATI (_GET_TLS_PROCTABLE()->DrawElementArrayATI) #define glDrawRangeElementArrayATI (_GET_TLS_PROCTABLE()->DrawRangeElementArrayATI) #define glDrawMeshArraysSUN (_GET_TLS_PROCTABLE()->DrawMeshArraysSUN) #define glGenOcclusionQueriesNV (_GET_TLS_PROCTABLE()->GenOcclusionQueriesNV) #define glDeleteOcclusionQueriesNV (_GET_TLS_PROCTABLE()->DeleteOcclusionQueriesNV) #define glIsOcclusionQueryNV (_GET_TLS_PROCTABLE()->IsOcclusionQueryNV) #define glBeginOcclusionQueryNV (_GET_TLS_PROCTABLE()->BeginOcclusionQueryNV) #define glEndOcclusionQueryNV (_GET_TLS_PROCTABLE()->EndOcclusionQueryNV) #define glGetOcclusionQueryivNV (_GET_TLS_PROCTABLE()->GetOcclusionQueryivNV) #define glGetOcclusionQueryuivNV (_GET_TLS_PROCTABLE()->GetOcclusionQueryuivNV) #define glPointParameteriNV (_GET_TLS_PROCTABLE()->PointParameteriNV) #define glPointParameterivNV (_GET_TLS_PROCTABLE()->PointParameterivNV) #define glActiveStencilFaceEXT (_GET_TLS_PROCTABLE()->ActiveStencilFaceEXT) #define glElementPointerAPPLE (_GET_TLS_PROCTABLE()->ElementPointerAPPLE) #define glDrawElementArrayAPPLE (_GET_TLS_PROCTABLE()->DrawElementArrayAPPLE) #define glDrawRangeElementArrayAPPLE (_GET_TLS_PROCTABLE()->DrawRangeElementArrayAPPLE) #define glMultiDrawElementArrayAPPLE (_GET_TLS_PROCTABLE()->MultiDrawElementArrayAPPLE) #define glMultiDrawRangeElementArrayAPPLE (_GET_TLS_PROCTABLE()->MultiDrawRangeElementArrayAPPLE) #define glGenFencesAPPLE (_GET_TLS_PROCTABLE()->GenFencesAPPLE) #define glDeleteFencesAPPLE (_GET_TLS_PROCTABLE()->DeleteFencesAPPLE) #define glSetFenceAPPLE (_GET_TLS_PROCTABLE()->SetFenceAPPLE) #define glIsFenceAPPLE (_GET_TLS_PROCTABLE()->IsFenceAPPLE) #define glTestFenceAPPLE (_GET_TLS_PROCTABLE()->TestFenceAPPLE) #define glFinishFenceAPPLE (_GET_TLS_PROCTABLE()->FinishFenceAPPLE) #define glTestObjectAPPLE (_GET_TLS_PROCTABLE()->TestObjectAPPLE) #define glFinishObjectAPPLE (_GET_TLS_PROCTABLE()->FinishObjectAPPLE) #define glBindVertexArrayAPPLE (_GET_TLS_PROCTABLE()->BindVertexArrayAPPLE) #define glDeleteVertexArraysAPPLE (_GET_TLS_PROCTABLE()->DeleteVertexArraysAPPLE) #define glGenVertexArraysAPPLE (_GET_TLS_PROCTABLE()->GenVertexArraysAPPLE) #define glIsVertexArrayAPPLE (_GET_TLS_PROCTABLE()->IsVertexArrayAPPLE) #define glVertexArrayRangeAPPLE (_GET_TLS_PROCTABLE()->VertexArrayRangeAPPLE) #define glFlushVertexArrayRangeAPPLE (_GET_TLS_PROCTABLE()->FlushVertexArrayRangeAPPLE) #define glVertexArrayParameteriAPPLE (_GET_TLS_PROCTABLE()->VertexArrayParameteriAPPLE) #define glDrawBuffersATI (_GET_TLS_PROCTABLE()->DrawBuffersATI) #define glProgramNamedParameter4fNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4fNV) #define glProgramNamedParameter4dNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4dNV) #define glProgramNamedParameter4fvNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4fvNV) #define glProgramNamedParameter4dvNV (_GET_TLS_PROCTABLE()->ProgramNamedParameter4dvNV) #define glGetProgramNamedParameterfvNV (_GET_TLS_PROCTABLE()->GetProgramNamedParameterfvNV) #define glGetProgramNamedParameterdvNV (_GET_TLS_PROCTABLE()->GetProgramNamedParameterdvNV) #define glVertex2hNV (_GET_TLS_PROCTABLE()->Vertex2hNV) #define glVertex2hvNV (_GET_TLS_PROCTABLE()->Vertex2hvNV) #define glVertex3hNV (_GET_TLS_PROCTABLE()->Vertex3hNV) #define glVertex3hvNV (_GET_TLS_PROCTABLE()->Vertex3hvNV) #define glVertex4hNV (_GET_TLS_PROCTABLE()->Vertex4hNV) #define glVertex4hvNV (_GET_TLS_PROCTABLE()->Vertex4hvNV) #define glNormal3hNV (_GET_TLS_PROCTABLE()->Normal3hNV) #define glNormal3hvNV (_GET_TLS_PROCTABLE()->Normal3hvNV) #define glColor3hNV (_GET_TLS_PROCTABLE()->Color3hNV) #define glColor3hvNV (_GET_TLS_PROCTABLE()->Color3hvNV) #define glColor4hNV (_GET_TLS_PROCTABLE()->Color4hNV) #define glColor4hvNV (_GET_TLS_PROCTABLE()->Color4hvNV) #define glTexCoord1hNV (_GET_TLS_PROCTABLE()->TexCoord1hNV) #define glTexCoord1hvNV (_GET_TLS_PROCTABLE()->TexCoord1hvNV) #define glTexCoord2hNV (_GET_TLS_PROCTABLE()->TexCoord2hNV) #define glTexCoord2hvNV (_GET_TLS_PROCTABLE()->TexCoord2hvNV) #define glTexCoord3hNV (_GET_TLS_PROCTABLE()->TexCoord3hNV) #define glTexCoord3hvNV (_GET_TLS_PROCTABLE()->TexCoord3hvNV) #define glTexCoord4hNV (_GET_TLS_PROCTABLE()->TexCoord4hNV) #define glTexCoord4hvNV (_GET_TLS_PROCTABLE()->TexCoord4hvNV) #define glMultiTexCoord1hNV (_GET_TLS_PROCTABLE()->MultiTexCoord1hNV) #define glMultiTexCoord1hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord1hvNV) #define glMultiTexCoord2hNV (_GET_TLS_PROCTABLE()->MultiTexCoord2hNV) #define glMultiTexCoord2hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord2hvNV) #define glMultiTexCoord3hNV (_GET_TLS_PROCTABLE()->MultiTexCoord3hNV) #define glMultiTexCoord3hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord3hvNV) #define glMultiTexCoord4hNV (_GET_TLS_PROCTABLE()->MultiTexCoord4hNV) #define glMultiTexCoord4hvNV (_GET_TLS_PROCTABLE()->MultiTexCoord4hvNV) #define glFogCoordhNV (_GET_TLS_PROCTABLE()->FogCoordhNV) #define glFogCoordhvNV (_GET_TLS_PROCTABLE()->FogCoordhvNV) #define glSecondaryColor3hNV (_GET_TLS_PROCTABLE()->SecondaryColor3hNV) #define glSecondaryColor3hvNV (_GET_TLS_PROCTABLE()->SecondaryColor3hvNV) #define glVertexWeighthNV (_GET_TLS_PROCTABLE()->VertexWeighthNV) #define glVertexWeighthvNV (_GET_TLS_PROCTABLE()->VertexWeighthvNV) #define glVertexAttrib1hNV (_GET_TLS_PROCTABLE()->VertexAttrib1hNV) #define glVertexAttrib1hvNV (_GET_TLS_PROCTABLE()->VertexAttrib1hvNV) #define glVertexAttrib2hNV (_GET_TLS_PROCTABLE()->VertexAttrib2hNV) #define glVertexAttrib2hvNV (_GET_TLS_PROCTABLE()->VertexAttrib2hvNV) #define glVertexAttrib3hNV (_GET_TLS_PROCTABLE()->VertexAttrib3hNV) #define glVertexAttrib3hvNV (_GET_TLS_PROCTABLE()->VertexAttrib3hvNV) #define glVertexAttrib4hNV (_GET_TLS_PROCTABLE()->VertexAttrib4hNV) #define glVertexAttrib4hvNV (_GET_TLS_PROCTABLE()->VertexAttrib4hvNV) #define glVertexAttribs1hvNV (_GET_TLS_PROCTABLE()->VertexAttribs1hvNV) #define glVertexAttribs2hvNV (_GET_TLS_PROCTABLE()->VertexAttribs2hvNV) #define glVertexAttribs3hvNV (_GET_TLS_PROCTABLE()->VertexAttribs3hvNV) #define glVertexAttribs4hvNV (_GET_TLS_PROCTABLE()->VertexAttribs4hvNV) #define glPixelDataRangeNV (_GET_TLS_PROCTABLE()->PixelDataRangeNV) #define glFlushPixelDataRangeNV (_GET_TLS_PROCTABLE()->FlushPixelDataRangeNV) #define glPrimitiveRestartNV (_GET_TLS_PROCTABLE()->PrimitiveRestartNV) #define glPrimitiveRestartIndexNV (_GET_TLS_PROCTABLE()->PrimitiveRestartIndexNV) #define glMapObjectBufferATI (_GET_TLS_PROCTABLE()->MapObjectBufferATI) #define glUnmapObjectBufferATI (_GET_TLS_PROCTABLE()->UnmapObjectBufferATI) #define glStencilOpSeparateATI (_GET_TLS_PROCTABLE()->StencilOpSeparateATI) #define glStencilFuncSeparateATI (_GET_TLS_PROCTABLE()->StencilFuncSeparateATI) #define glVertexAttribArrayObjectATI (_GET_TLS_PROCTABLE()->VertexAttribArrayObjectATI) #define glGetVertexAttribArrayObjectfvATI (_GET_TLS_PROCTABLE()->GetVertexAttribArrayObjectfvATI) #define glGetVertexAttribArrayObjectivATI (_GET_TLS_PROCTABLE()->GetVertexAttribArrayObjectivATI) #define glDepthBoundsEXT (_GET_TLS_PROCTABLE()->DepthBoundsEXT) #define glBlendEquationSeparateEXT (_GET_TLS_PROCTABLE()->BlendEquationSeparateEXT) #define glAddSwapHintRectWIN (_GET_TLS_PROCTABLE()->AddSwapHintRectWIN) #ifdef _WIN32 #define wglCreateBufferRegionARB (_GET_TLS_PROCTABLE()->CreateBufferRegionARB) #define wglDeleteBufferRegionARB (_GET_TLS_PROCTABLE()->DeleteBufferRegionARB) #define wglSaveBufferRegionARB (_GET_TLS_PROCTABLE()->SaveBufferRegionARB) #define wglRestoreBufferRegionARB (_GET_TLS_PROCTABLE()->RestoreBufferRegionARB) #define wglGetExtensionsStringARB (_GET_TLS_PROCTABLE()->GetExtensionsStringARB) #define wglGetPixelFormatAttribivARB (_GET_TLS_PROCTABLE()->GetPixelFormatAttribivARB) #define wglGetPixelFormatAttribfvARB (_GET_TLS_PROCTABLE()->GetPixelFormatAttribfvARB) #define wglChoosePixelFormatARB (_GET_TLS_PROCTABLE()->ChoosePixelFormatARB) #define wglMakeContextCurrentARB (_GET_TLS_PROCTABLE()->MakeContextCurrentARB) #define wglGetCurrentReadDCARB (_GET_TLS_PROCTABLE()->GetCurrentReadDCARB) #define wglCreatePbufferARB (_GET_TLS_PROCTABLE()->CreatePbufferARB) #define wglGetPbufferDCARB (_GET_TLS_PROCTABLE()->GetPbufferDCARB) #define wglReleasePbufferDCARB (_GET_TLS_PROCTABLE()->ReleasePbufferDCARB) #define wglDestroyPbufferARB (_GET_TLS_PROCTABLE()->DestroyPbufferARB) #define wglQueryPbufferARB (_GET_TLS_PROCTABLE()->QueryPbufferARB) #define wglBindTexImageARB (_GET_TLS_PROCTABLE()->BindTexImageARB) #define wglReleaseTexImageARB (_GET_TLS_PROCTABLE()->ReleaseTexImageARB) #define wglSetPbufferAttribARB (_GET_TLS_PROCTABLE()->SetPbufferAttribARB) #define wglCreateDisplayColorTableEXT (_GET_TLS_PROCTABLE()->CreateDisplayColorTableEXT) #define wglLoadDisplayColorTableEXT (_GET_TLS_PROCTABLE()->LoadDisplayColorTableEXT) #define wglBindDisplayColorTableEXT (_GET_TLS_PROCTABLE()->BindDisplayColorTableEXT) #define wglDestroyDisplayColorTableEXT (_GET_TLS_PROCTABLE()->DestroyDisplayColorTableEXT) #define wglGetExtensionsStringEXT (_GET_TLS_PROCTABLE()->GetExtensionsStringEXT) #define wglMakeContextCurrentEXT (_GET_TLS_PROCTABLE()->MakeContextCurrentEXT) #define wglGetCurrentReadDCEXT (_GET_TLS_PROCTABLE()->GetCurrentReadDCEXT) #define wglCreatePbufferEXT (_GET_TLS_PROCTABLE()->CreatePbufferEXT) #define wglGetPbufferDCEXT (_GET_TLS_PROCTABLE()->GetPbufferDCEXT) #define wglReleasePbufferDCEXT (_GET_TLS_PROCTABLE()->ReleasePbufferDCEXT) #define wglDestroyPbufferEXT (_GET_TLS_PROCTABLE()->DestroyPbufferEXT) #define wglQueryPbufferEXT (_GET_TLS_PROCTABLE()->QueryPbufferEXT) #define wglGetPixelFormatAttribivEXT (_GET_TLS_PROCTABLE()->GetPixelFormatAttribivEXT) #define wglGetPixelFormatAttribfvEXT (_GET_TLS_PROCTABLE()->GetPixelFormatAttribfvEXT) #define wglChoosePixelFormatEXT (_GET_TLS_PROCTABLE()->ChoosePixelFormatEXT) #define wglSwapIntervalEXT (_GET_TLS_PROCTABLE()->SwapIntervalEXT) #define wglGetSwapIntervalEXT (_GET_TLS_PROCTABLE()->GetSwapIntervalEXT) #define wglAllocateMemoryNV (_GET_TLS_PROCTABLE()->AllocateMemoryNV) #define wglFreeMemoryNV (_GET_TLS_PROCTABLE()->FreeMemoryNV) #define wglGetSyncValuesOML (_GET_TLS_PROCTABLE()->GetSyncValuesOML) #define wglGetMscRateOML (_GET_TLS_PROCTABLE()->GetMscRateOML) #define wglSwapBuffersMscOML (_GET_TLS_PROCTABLE()->SwapBuffersMscOML) #define wglSwapLayerBuffersMscOML (_GET_TLS_PROCTABLE()->SwapLayerBuffersMscOML) #define wglWaitForMscOML (_GET_TLS_PROCTABLE()->WaitForMscOML) #define wglWaitForSbcOML (_GET_TLS_PROCTABLE()->WaitForSbcOML) #define wglGetDigitalVideoParametersI3D (_GET_TLS_PROCTABLE()->GetDigitalVideoParametersI3D) #define wglSetDigitalVideoParametersI3D (_GET_TLS_PROCTABLE()->SetDigitalVideoParametersI3D) #define wglGetGammaTableParametersI3D (_GET_TLS_PROCTABLE()->GetGammaTableParametersI3D) #define wglSetGammaTableParametersI3D (_GET_TLS_PROCTABLE()->SetGammaTableParametersI3D) #define wglGetGammaTableI3D (_GET_TLS_PROCTABLE()->GetGammaTableI3D) #define wglSetGammaTableI3D (_GET_TLS_PROCTABLE()->SetGammaTableI3D) #define wglEnableGenlockI3D (_GET_TLS_PROCTABLE()->EnableGenlockI3D) #define wglDisableGenlockI3D (_GET_TLS_PROCTABLE()->DisableGenlockI3D) #define wglIsEnabledGenlockI3D (_GET_TLS_PROCTABLE()->IsEnabledGenlockI3D) #define wglGenlockSourceI3D (_GET_TLS_PROCTABLE()->GenlockSourceI3D) #define wglGetGenlockSourceI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceI3D) #define wglGenlockSourceEdgeI3D (_GET_TLS_PROCTABLE()->GenlockSourceEdgeI3D) #define wglGetGenlockSourceEdgeI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceEdgeI3D) #define wglGenlockSampleRateI3D (_GET_TLS_PROCTABLE()->GenlockSampleRateI3D) #define wglGetGenlockSampleRateI3D (_GET_TLS_PROCTABLE()->GetGenlockSampleRateI3D) #define wglGenlockSourceDelayI3D (_GET_TLS_PROCTABLE()->GenlockSourceDelayI3D) #define wglGetGenlockSourceDelayI3D (_GET_TLS_PROCTABLE()->GetGenlockSourceDelayI3D) #define wglQueryGenlockMaxSourceDelayI3D (_GET_TLS_PROCTABLE()->QueryGenlockMaxSourceDelayI3D) #define wglCreateImageBufferI3D (_GET_TLS_PROCTABLE()->CreateImageBufferI3D) #define wglDestroyImageBufferI3D (_GET_TLS_PROCTABLE()->DestroyImageBufferI3D) #define wglAssociateImageBufferEventsI3D (_GET_TLS_PROCTABLE()->AssociateImageBufferEventsI3D) #define wglReleaseImageBufferEventsI3D (_GET_TLS_PROCTABLE()->ReleaseImageBufferEventsI3D) #define wglEnableFrameLockI3D (_GET_TLS_PROCTABLE()->EnableFrameLockI3D) #define wglDisableFrameLockI3D (_GET_TLS_PROCTABLE()->DisableFrameLockI3D) #define wglIsEnabledFrameLockI3D (_GET_TLS_PROCTABLE()->IsEnabledFrameLockI3D) #define wglQueryFrameLockMasterI3D (_GET_TLS_PROCTABLE()->QueryFrameLockMasterI3D) #define wglGetFrameUsageI3D (_GET_TLS_PROCTABLE()->GetFrameUsageI3D) #define wglBeginFrameTrackingI3D (_GET_TLS_PROCTABLE()->BeginFrameTrackingI3D) #define wglEndFrameTrackingI3D (_GET_TLS_PROCTABLE()->EndFrameTrackingI3D) #define wglQueryFrameTrackingI3D (_GET_TLS_PROCTABLE()->QueryFrameTrackingI3D) #endif /* _WIN32 */ #ifndef _APP_PROCTABLE /* * Applications can replace the following function with its own function * for accessing thread local proc/context dependent proc table. * The following default function works for most applications which * are using the same device for all their contexts - even if * the contexts are on different threads. */ static _inline _GLextensionProcs *_GET_TLS_PROCTABLE(void) { extern _GLextensionProcs _extensionProcs; return (&_extensionProcs); } #else /* * Application should replace this compiled function with * an inlined function for maximum performance. */ extern _GLextensionProcs *_GET_TLS_PROCTABLE(void); #endif /* * Provide an initialization function for the application * to initialize its own proc tables in case the application * needs to use multiple proc tables. */ static _inline void _InitExtensionProcs(_GLextensionProcs *appProcs) { extern _GLextensionProcs _extensionProcs; *appProcs = _extensionProcs; } #ifdef __cplusplus } #endif #endif /* _GLPROCS_H_ */ rgl/src/ext/GLsdk/GL/gl.h0000644000176000001440000023474412262026246014556 0ustar ripleyusers#ifndef __gl_h_ #define __gl_h_ #ifdef __cplusplus extern "C" { #endif /* ** The contents of this file are subject to the GLX Public License Version 1.0 ** (the "License"). You may not use this file except in compliance with the ** License. You may obtain a copy of the License at Silicon Graphics, Inc., ** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043 ** or at http://www.sgi.com/software/opensource/glx/license.html. ** ** Software distributed under the License is distributed on an "AS IS" ** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY ** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR ** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific ** language governing rights and limitations under the License. ** ** The Original Software is GLX version 1.2 source code, released February, ** 1999. The developer of the Original Software is Silicon Graphics, Inc. ** Those portions of the Subject Software created by Silicon Graphics, Inc. ** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. */ #ifndef _WIN32 #define WINGDIAPI #define APIENTRY #endif typedef unsigned int GLenum; typedef unsigned char GLboolean; typedef unsigned int GLbitfield; typedef signed char GLbyte; typedef short GLshort; typedef int GLint; typedef int GLsizei; typedef unsigned char GLubyte; typedef unsigned short GLushort; typedef unsigned int GLuint; typedef float GLfloat; typedef float GLclampf; typedef double GLdouble; typedef double GLclampd; typedef void GLvoid; /*************************************************************/ /* Version */ #define GL_VERSION_1_1 1 #define GL_VERSION_1_2 1 /* Extensions */ #define GL_ARB_imaging 1 #define GL_ARB_multitexture 1 /* AccumOp */ #define GL_ACCUM 0x0100 #define GL_LOAD 0x0101 #define GL_RETURN 0x0102 #define GL_MULT 0x0103 #define GL_ADD 0x0104 /* AlphaFunction */ #define GL_NEVER 0x0200 #define GL_LESS 0x0201 #define GL_EQUAL 0x0202 #define GL_LEQUAL 0x0203 #define GL_GREATER 0x0204 #define GL_NOTEQUAL 0x0205 #define GL_GEQUAL 0x0206 #define GL_ALWAYS 0x0207 /* AttribMask */ #define GL_CURRENT_BIT 0x00000001 #define GL_POINT_BIT 0x00000002 #define GL_LINE_BIT 0x00000004 #define GL_POLYGON_BIT 0x00000008 #define GL_POLYGON_STIPPLE_BIT 0x00000010 #define GL_PIXEL_MODE_BIT 0x00000020 #define GL_LIGHTING_BIT 0x00000040 #define GL_FOG_BIT 0x00000080 #define GL_DEPTH_BUFFER_BIT 0x00000100 #define GL_ACCUM_BUFFER_BIT 0x00000200 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_VIEWPORT_BIT 0x00000800 #define GL_TRANSFORM_BIT 0x00001000 #define GL_ENABLE_BIT 0x00002000 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_HINT_BIT 0x00008000 #define GL_EVAL_BIT 0x00010000 #define GL_LIST_BIT 0x00020000 #define GL_TEXTURE_BIT 0x00040000 #define GL_SCISSOR_BIT 0x00080000 #define GL_ALL_ATTRIB_BITS 0x000fffff /* BeginMode */ #define GL_POINTS 0x0000 #define GL_LINES 0x0001 #define GL_LINE_LOOP 0x0002 #define GL_LINE_STRIP 0x0003 #define GL_TRIANGLES 0x0004 #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_FAN 0x0006 #define GL_QUADS 0x0007 #define GL_QUAD_STRIP 0x0008 #define GL_POLYGON 0x0009 /* BlendEquationMode */ /* GL_LOGIC_OP */ /* GL_FUNC_ADD */ /* GL_MIN */ /* GL_MAX */ /* GL_FUNC_SUBTRACT */ /* GL_FUNC_REVERSE_SUBTRACT */ /* BlendingFactorDest */ #define GL_ZERO 0 #define GL_ONE 1 #define GL_SRC_COLOR 0x0300 #define GL_ONE_MINUS_SRC_COLOR 0x0301 #define GL_SRC_ALPHA 0x0302 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_DST_ALPHA 0x0304 #define GL_ONE_MINUS_DST_ALPHA 0x0305 /* GL_CONSTANT_COLOR */ /* GL_ONE_MINUS_CONSTANT_COLOR */ /* GL_CONSTANT_ALPHA */ /* GL_ONE_MINUS_CONSTANT_ALPHA */ /* BlendingFactorSrc */ /* GL_ZERO */ /* GL_ONE */ #define GL_DST_COLOR 0x0306 #define GL_ONE_MINUS_DST_COLOR 0x0307 #define GL_SRC_ALPHA_SATURATE 0x0308 /* GL_SRC_ALPHA */ /* GL_ONE_MINUS_SRC_ALPHA */ /* GL_DST_ALPHA */ /* GL_ONE_MINUS_DST_ALPHA */ /* GL_CONSTANT_COLOR */ /* GL_ONE_MINUS_CONSTANT_COLOR */ /* GL_CONSTANT_ALPHA */ /* GL_ONE_MINUS_CONSTANT_ALPHA */ /* Boolean */ #define GL_TRUE 1 #define GL_FALSE 0 /* ClearBufferMask */ /* GL_COLOR_BUFFER_BIT */ /* GL_ACCUM_BUFFER_BIT */ /* GL_STENCIL_BUFFER_BIT */ /* GL_DEPTH_BUFFER_BIT */ /* ClientArrayType */ /* GL_VERTEX_ARRAY */ /* GL_NORMAL_ARRAY */ /* GL_COLOR_ARRAY */ /* GL_INDEX_ARRAY */ /* GL_TEXTURE_COORD_ARRAY */ /* GL_EDGE_FLAG_ARRAY */ /* ClipPlaneName */ #define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE1 0x3001 #define GL_CLIP_PLANE2 0x3002 #define GL_CLIP_PLANE3 0x3003 #define GL_CLIP_PLANE4 0x3004 #define GL_CLIP_PLANE5 0x3005 /* ColorMaterialFace */ /* GL_FRONT */ /* GL_BACK */ /* GL_FRONT_AND_BACK */ /* ColorMaterialParameter */ /* GL_AMBIENT */ /* GL_DIFFUSE */ /* GL_SPECULAR */ /* GL_EMISSION */ /* GL_AMBIENT_AND_DIFFUSE */ /* ColorPointerType */ /* GL_BYTE */ /* GL_UNSIGNED_BYTE */ /* GL_SHORT */ /* GL_UNSIGNED_SHORT */ /* GL_INT */ /* GL_UNSIGNED_INT */ /* GL_FLOAT */ /* GL_DOUBLE */ /* ColorTableParameterPName */ /* GL_COLOR_TABLE_SCALE */ /* GL_COLOR_TABLE_BIAS */ /* ColorTableTarget */ /* GL_COLOR_TABLE */ /* GL_POST_CONVOLUTION_COLOR_TABLE */ /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ /* GL_PROXY_COLOR_TABLE */ /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */ /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */ /* ConvolutionBorderMode */ /* GL_REDUCE */ /* GL_IGNORE_BORDER */ /* GL_CONSTANT_BORDER */ /* ConvolutionParameter */ /* GL_CONVOLUTION_BORDER_MODE */ /* GL_CONVOLUTION_FILTER_SCALE */ /* GL_CONVOLUTION_FILTER_BIAS */ /* ConvolutionTarget */ /* GL_CONVOLUTION_1D */ /* GL_CONVOLUTION_2D */ /* CullFaceMode */ /* GL_FRONT */ /* GL_BACK */ /* GL_FRONT_AND_BACK */ /* DataType */ #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 #define GL_UNSIGNED_SHORT 0x1403 #define GL_INT 0x1404 #define GL_UNSIGNED_INT 0x1405 #define GL_FLOAT 0x1406 #define GL_2_BYTES 0x1407 #define GL_3_BYTES 0x1408 #define GL_4_BYTES 0x1409 #define GL_DOUBLE 0x140A /* DepthFunction */ /* GL_NEVER */ /* GL_LESS */ /* GL_EQUAL */ /* GL_LEQUAL */ /* GL_GREATER */ /* GL_NOTEQUAL */ /* GL_GEQUAL */ /* GL_ALWAYS */ /* DrawBufferMode */ #define GL_NONE 0 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 #define GL_LEFT 0x0406 #define GL_RIGHT 0x0407 #define GL_FRONT_AND_BACK 0x0408 #define GL_AUX0 0x0409 #define GL_AUX1 0x040A #define GL_AUX2 0x040B #define GL_AUX3 0x040C /* Enable */ /* GL_FOG */ /* GL_LIGHTING */ /* GL_TEXTURE_1D */ /* GL_TEXTURE_2D */ /* GL_LINE_STIPPLE */ /* GL_POLYGON_STIPPLE */ /* GL_CULL_FACE */ /* GL_ALPHA_TEST */ /* GL_BLEND */ /* GL_INDEX_LOGIC_OP */ /* GL_COLOR_LOGIC_OP */ /* GL_DITHER */ /* GL_STENCIL_TEST */ /* GL_DEPTH_TEST */ /* GL_CLIP_PLANE0 */ /* GL_CLIP_PLANE1 */ /* GL_CLIP_PLANE2 */ /* GL_CLIP_PLANE3 */ /* GL_CLIP_PLANE4 */ /* GL_CLIP_PLANE5 */ /* GL_LIGHT0 */ /* GL_LIGHT1 */ /* GL_LIGHT2 */ /* GL_LIGHT3 */ /* GL_LIGHT4 */ /* GL_LIGHT5 */ /* GL_LIGHT6 */ /* GL_LIGHT7 */ /* GL_TEXTURE_GEN_S */ /* GL_TEXTURE_GEN_T */ /* GL_TEXTURE_GEN_R */ /* GL_TEXTURE_GEN_Q */ /* GL_MAP1_VERTEX_3 */ /* GL_MAP1_VERTEX_4 */ /* GL_MAP1_COLOR_4 */ /* GL_MAP1_INDEX */ /* GL_MAP1_NORMAL */ /* GL_MAP1_TEXTURE_COORD_1 */ /* GL_MAP1_TEXTURE_COORD_2 */ /* GL_MAP1_TEXTURE_COORD_3 */ /* GL_MAP1_TEXTURE_COORD_4 */ /* GL_MAP2_VERTEX_3 */ /* GL_MAP2_VERTEX_4 */ /* GL_MAP2_COLOR_4 */ /* GL_MAP2_INDEX */ /* GL_MAP2_NORMAL */ /* GL_MAP2_TEXTURE_COORD_1 */ /* GL_MAP2_TEXTURE_COORD_2 */ /* GL_MAP2_TEXTURE_COORD_3 */ /* GL_MAP2_TEXTURE_COORD_4 */ /* GL_POINT_SMOOTH */ /* GL_LINE_SMOOTH */ /* GL_POLYGON_SMOOTH */ /* GL_SCISSOR_TEST */ /* GL_COLOR_MATERIAL */ /* GL_NORMALIZE */ /* GL_AUTO_NORMAL */ /* GL_VERTEX_ARRAY */ /* GL_NORMAL_ARRAY */ /* GL_COLOR_ARRAY */ /* GL_INDEX_ARRAY */ /* GL_TEXTURE_COORD_ARRAY */ /* GL_EDGE_FLAG_ARRAY */ /* GL_POLYGON_OFFSET_POINT */ /* GL_POLYGON_OFFSET_LINE */ /* GL_POLYGON_OFFSET_FILL */ /* GL_COLOR_TABLE */ /* GL_POST_CONVOLUTION_COLOR_TABLE */ /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ /* GL_CONVOLUTION_1D */ /* GL_CONVOLUTION_2D */ /* GL_SEPARABLE_2D */ /* GL_HISTOGRAM */ /* GL_MINMAX */ /* GL_RESCALE_NORMAL */ /* GL_TEXTURE_3D */ /* ErrorCode */ #define GL_NO_ERROR 0 #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_VALUE 0x0501 #define GL_INVALID_OPERATION 0x0502 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 #define GL_OUT_OF_MEMORY 0x0505 /* GL_TABLE_TOO_LARGE */ /* FeedBackMode */ #define GL_2D 0x0600 #define GL_3D 0x0601 #define GL_3D_COLOR 0x0602 #define GL_3D_COLOR_TEXTURE 0x0603 #define GL_4D_COLOR_TEXTURE 0x0604 /* FeedBackToken */ #define GL_PASS_THROUGH_TOKEN 0x0700 #define GL_POINT_TOKEN 0x0701 #define GL_LINE_TOKEN 0x0702 #define GL_POLYGON_TOKEN 0x0703 #define GL_BITMAP_TOKEN 0x0704 #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_LINE_RESET_TOKEN 0x0707 /* FogMode */ /* GL_LINEAR */ #define GL_EXP 0x0800 #define GL_EXP2 0x0801 /* FogParameter */ /* GL_FOG_COLOR */ /* GL_FOG_DENSITY */ /* GL_FOG_END */ /* GL_FOG_INDEX */ /* GL_FOG_MODE */ /* GL_FOG_START */ /* FrontFaceDirection */ #define GL_CW 0x0900 #define GL_CCW 0x0901 /* GetColorTableParameterPName */ /* GL_COLOR_TABLE_SCALE */ /* GL_COLOR_TABLE_BIAS */ /* GL_COLOR_TABLE_FORMAT */ /* GL_COLOR_TABLE_WIDTH */ /* GL_COLOR_TABLE_RED_SIZE */ /* GL_COLOR_TABLE_GREEN_SIZE */ /* GL_COLOR_TABLE_BLUE_SIZE */ /* GL_COLOR_TABLE_ALPHA_SIZE */ /* GL_COLOR_TABLE_LUMINANCE_SIZE */ /* GL_COLOR_TABLE_INTENSITY_SIZE */ /* GetConvolutionParameterPName */ /* GL_CONVOLUTION_BORDER_COLOR */ /* GL_CONVOLUTION_BORDER_MODE */ /* GL_CONVOLUTION_FILTER_SCALE */ /* GL_CONVOLUTION_FILTER_BIAS */ /* GL_CONVOLUTION_FORMAT */ /* GL_CONVOLUTION_WIDTH */ /* GL_CONVOLUTION_HEIGHT */ /* GL_MAX_CONVOLUTION_WIDTH */ /* GL_MAX_CONVOLUTION_HEIGHT */ /* GetHistogramParameterPName */ /* GL_HISTOGRAM_WIDTH */ /* GL_HISTOGRAM_FORMAT */ /* GL_HISTOGRAM_RED_SIZE */ /* GL_HISTOGRAM_GREEN_SIZE */ /* GL_HISTOGRAM_BLUE_SIZE */ /* GL_HISTOGRAM_ALPHA_SIZE */ /* GL_HISTOGRAM_LUMINANCE_SIZE */ /* GL_HISTOGRAM_SINK */ /* GetMapTarget */ #define GL_COEFF 0x0A00 #define GL_ORDER 0x0A01 #define GL_DOMAIN 0x0A02 /* GetMinmaxParameterPName */ /* GL_MINMAX_FORMAT */ /* GL_MINMAX_SINK */ /* GetPixelMap */ /* GL_PIXEL_MAP_I_TO_I */ /* GL_PIXEL_MAP_S_TO_S */ /* GL_PIXEL_MAP_I_TO_R */ /* GL_PIXEL_MAP_I_TO_G */ /* GL_PIXEL_MAP_I_TO_B */ /* GL_PIXEL_MAP_I_TO_A */ /* GL_PIXEL_MAP_R_TO_R */ /* GL_PIXEL_MAP_G_TO_G */ /* GL_PIXEL_MAP_B_TO_B */ /* GL_PIXEL_MAP_A_TO_A */ /* GetPointerTarget */ /* GL_VERTEX_ARRAY_POINTER */ /* GL_NORMAL_ARRAY_POINTER */ /* GL_COLOR_ARRAY_POINTER */ /* GL_INDEX_ARRAY_POINTER */ /* GL_TEXTURE_COORD_ARRAY_POINTER */ /* GL_EDGE_FLAG_ARRAY_POINTER */ /* GetTarget */ #define GL_CURRENT_COLOR 0x0B00 #define GL_CURRENT_INDEX 0x0B01 #define GL_CURRENT_NORMAL 0x0B02 #define GL_CURRENT_TEXTURE_COORDS 0x0B03 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_POINT_SMOOTH 0x0B10 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SIZE_GRANULARITY 0x0B13 #define GL_LINE_SMOOTH 0x0B20 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_STIPPLE 0x0B24 #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_LINE_STIPPLE_REPEAT 0x0B26 /* GL_SMOOTH_POINT_SIZE_RANGE */ /* GL_SMOOTH_POINT_SIZE_GRANULARITY */ /* GL_SMOOTH_LINE_WIDTH_RANGE */ /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */ /* GL_ALIASED_POINT_SIZE_RANGE */ /* GL_ALIASED_LINE_WIDTH_RANGE */ #define GL_LIST_MODE 0x0B30 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_LIST_BASE 0x0B32 #define GL_LIST_INDEX 0x0B33 #define GL_POLYGON_MODE 0x0B40 #define GL_POLYGON_SMOOTH 0x0B41 #define GL_POLYGON_STIPPLE 0x0B42 #define GL_EDGE_FLAG 0x0B43 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_FRONT_FACE 0x0B46 #define GL_LIGHTING 0x0B50 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 #define GL_SHADE_MODEL 0x0B54 #define GL_COLOR_MATERIAL_FACE 0x0B55 #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_COLOR_MATERIAL 0x0B57 #define GL_FOG 0x0B60 #define GL_FOG_INDEX 0x0B61 #define GL_FOG_DENSITY 0x0B62 #define GL_FOG_START 0x0B63 #define GL_FOG_END 0x0B64 #define GL_FOG_MODE 0x0B65 #define GL_FOG_COLOR 0x0B66 #define GL_DEPTH_RANGE 0x0B70 #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_FUNC 0x0B74 #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_CLEAR_VALUE 0x0B91 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_MATRIX_MODE 0x0BA0 #define GL_NORMALIZE 0x0BA1 #define GL_VIEWPORT 0x0BA2 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_PROJECTION_STACK_DEPTH 0x0BA4 #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_TEXTURE_MATRIX 0x0BA8 #define GL_ATTRIB_STACK_DEPTH 0x0BB0 #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 #define GL_ALPHA_TEST 0x0BC0 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_ALPHA_TEST_REF 0x0BC2 #define GL_DITHER 0x0BD0 #define GL_BLEND_DST 0x0BE0 #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND 0x0BE2 #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_INDEX_LOGIC_OP 0x0BF1 #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_AUX_BUFFERS 0x0C00 #define GL_DRAW_BUFFER 0x0C01 #define GL_READ_BUFFER 0x0C02 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_INDEX_CLEAR_VALUE 0x0C20 #define GL_INDEX_WRITEMASK 0x0C21 #define GL_COLOR_CLEAR_VALUE 0x0C22 #define GL_COLOR_WRITEMASK 0x0C23 #define GL_INDEX_MODE 0x0C30 #define GL_RGBA_MODE 0x0C31 #define GL_DOUBLEBUFFER 0x0C32 #define GL_STEREO 0x0C33 #define GL_RENDER_MODE 0x0C40 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 #define GL_POINT_SMOOTH_HINT 0x0C51 #define GL_LINE_SMOOTH_HINT 0x0C52 #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_FOG_HINT 0x0C54 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_PIXEL_MAP_I_TO_I 0x0C70 #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_PIXEL_MAP_I_TO_R 0x0C72 #define GL_PIXEL_MAP_I_TO_G 0x0C73 #define GL_PIXEL_MAP_I_TO_B 0x0C74 #define GL_PIXEL_MAP_I_TO_A 0x0C75 #define GL_PIXEL_MAP_R_TO_R 0x0C76 #define GL_PIXEL_MAP_G_TO_G 0x0C77 #define GL_PIXEL_MAP_B_TO_B 0x0C78 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_UNPACK_SWAP_BYTES 0x0CF0 #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_ALIGNMENT 0x0CF5 #define GL_PACK_SWAP_BYTES 0x0D00 #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_ALIGNMENT 0x0D05 #define GL_MAP_COLOR 0x0D10 #define GL_MAP_STENCIL 0x0D11 #define GL_INDEX_SHIFT 0x0D12 #define GL_INDEX_OFFSET 0x0D13 #define GL_RED_SCALE 0x0D14 #define GL_RED_BIAS 0x0D15 #define GL_ZOOM_X 0x0D16 #define GL_ZOOM_Y 0x0D17 #define GL_GREEN_SCALE 0x0D18 #define GL_GREEN_BIAS 0x0D19 #define GL_BLUE_SCALE 0x0D1A #define GL_BLUE_BIAS 0x0D1B #define GL_ALPHA_SCALE 0x0D1C #define GL_ALPHA_BIAS 0x0D1D #define GL_DEPTH_SCALE 0x0D1E #define GL_DEPTH_BIAS 0x0D1F #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_LIGHTS 0x0D31 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 #define GL_MAX_VIEWPORT_DIMS 0x0D3A #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B #define GL_SUBPIXEL_BITS 0x0D50 #define GL_INDEX_BITS 0x0D51 #define GL_RED_BITS 0x0D52 #define GL_GREEN_BITS 0x0D53 #define GL_BLUE_BITS 0x0D54 #define GL_ALPHA_BITS 0x0D55 #define GL_DEPTH_BITS 0x0D56 #define GL_STENCIL_BITS 0x0D57 #define GL_ACCUM_RED_BITS 0x0D58 #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_ACCUM_BLUE_BITS 0x0D5A #define GL_ACCUM_ALPHA_BITS 0x0D5B #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_AUTO_NORMAL 0x0D80 #define GL_MAP1_COLOR_4 0x0D90 #define GL_MAP1_INDEX 0x0D91 #define GL_MAP1_NORMAL 0x0D92 #define GL_MAP1_TEXTURE_COORD_1 0x0D93 #define GL_MAP1_TEXTURE_COORD_2 0x0D94 #define GL_MAP1_TEXTURE_COORD_3 0x0D95 #define GL_MAP1_TEXTURE_COORD_4 0x0D96 #define GL_MAP1_VERTEX_3 0x0D97 #define GL_MAP1_VERTEX_4 0x0D98 #define GL_MAP2_COLOR_4 0x0DB0 #define GL_MAP2_INDEX 0x0DB1 #define GL_MAP2_NORMAL 0x0DB2 #define GL_MAP2_TEXTURE_COORD_1 0x0DB3 #define GL_MAP2_TEXTURE_COORD_2 0x0DB4 #define GL_MAP2_TEXTURE_COORD_3 0x0DB5 #define GL_MAP2_TEXTURE_COORD_4 0x0DB6 #define GL_MAP2_VERTEX_3 0x0DB7 #define GL_MAP2_VERTEX_4 0x0DB8 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_MAP1_GRID_SEGMENTS 0x0DD1 #define GL_MAP2_GRID_DOMAIN 0x0DD2 #define GL_MAP2_GRID_SEGMENTS 0x0DD3 #define GL_TEXTURE_1D 0x0DE0 #define GL_TEXTURE_2D 0x0DE1 #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_SELECTION_BUFFER_SIZE 0x0DF4 /* GL_TEXTURE_BINDING_1D */ /* GL_TEXTURE_BINDING_2D */ /* GL_TEXTURE_BINDING_3D */ /* GL_VERTEX_ARRAY */ /* GL_NORMAL_ARRAY */ /* GL_COLOR_ARRAY */ /* GL_INDEX_ARRAY */ /* GL_TEXTURE_COORD_ARRAY */ /* GL_EDGE_FLAG_ARRAY */ /* GL_VERTEX_ARRAY_SIZE */ /* GL_VERTEX_ARRAY_TYPE */ /* GL_VERTEX_ARRAY_STRIDE */ /* GL_NORMAL_ARRAY_TYPE */ /* GL_NORMAL_ARRAY_STRIDE */ /* GL_COLOR_ARRAY_SIZE */ /* GL_COLOR_ARRAY_TYPE */ /* GL_COLOR_ARRAY_STRIDE */ /* GL_INDEX_ARRAY_TYPE */ /* GL_INDEX_ARRAY_STRIDE */ /* GL_TEXTURE_COORD_ARRAY_SIZE */ /* GL_TEXTURE_COORD_ARRAY_TYPE */ /* GL_TEXTURE_COORD_ARRAY_STRIDE */ /* GL_EDGE_FLAG_ARRAY_STRIDE */ /* GL_POLYGON_OFFSET_FACTOR */ /* GL_POLYGON_OFFSET_UNITS */ /* GL_COLOR_TABLE */ /* GL_POST_CONVOLUTION_COLOR_TABLE */ /* GL_POST_COLOR_MATRIX_COLOR_TABLE */ /* GL_CONVOLUTION_1D */ /* GL_CONVOLUTION_2D */ /* GL_SEPARABLE_2D */ /* GL_POST_CONVOLUTION_RED_SCALE */ /* GL_POST_CONVOLUTION_GREEN_SCALE */ /* GL_POST_CONVOLUTION_BLUE_SCALE */ /* GL_POST_CONVOLUTION_ALPHA_SCALE */ /* GL_POST_CONVOLUTION_RED_BIAS */ /* GL_POST_CONVOLUTION_GREEN_BIAS */ /* GL_POST_CONVOLUTION_BLUE_BIAS */ /* GL_POST_CONVOLUTION_ALPHA_BIAS */ /* GL_COLOR_MATRIX */ /* GL_COLOR_MATRIX_STACK_DEPTH */ /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */ /* GL_POST_COLOR_MATRIX_RED_SCALE */ /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ /* GL_POST_COLOR_MATRIX_RED_BIAS */ /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ /* GL_HISTOGRAM */ /* GL_MINMAX */ /* GL_MAX_ELEMENTS_VERTICES */ /* GL_MAX_ELEMENTS_INDICES */ /* GL_RESCALE_NORMAL */ /* GL_LIGHT_MODEL_COLOR_CONTROL */ /* GL_PACK_SKIP_IMAGES */ /* GL_PACK_IMAGE_HEIGHT */ /* GL_UNPACK_SKIP_IMAGES */ /* GL_UNPACK_IMAGE_HEIGHT */ /* GL_TEXTURE_3D */ /* GL_MAX_3D_TEXTURE_SIZE */ /* GL_BLEND_COLOR */ /* GL_BLEND_EQUATION */ /* GL_ACTIVE_TEXTURE_ARB */ /* GL_CLIENT_ACTIVE_TEXTURE_ARB */ /* GL_MAX_TEXTURE_UNITS_ARB */ /* GetTextureParameter */ /* GL_TEXTURE_MAG_FILTER */ /* GL_TEXTURE_MIN_FILTER */ /* GL_TEXTURE_WRAP_S */ /* GL_TEXTURE_WRAP_T */ #define GL_TEXTURE_WIDTH 0x1000 #define GL_TEXTURE_HEIGHT 0x1001 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_BORDER 0x1005 /* GL_TEXTURE_RED_SIZE */ /* GL_TEXTURE_GREEN_SIZE */ /* GL_TEXTURE_BLUE_SIZE */ /* GL_TEXTURE_ALPHA_SIZE */ /* GL_TEXTURE_LUMINANCE_SIZE */ /* GL_TEXTURE_INTENSITY_SIZE */ /* GL_TEXTURE_PRIORITY */ /* GL_TEXTURE_RESIDENT */ /* GL_TEXTURE_DEPTH */ /* GL_TEXTURE_WRAP_R */ /* GL_TEXTURE_MIN_LOD */ /* GL_TEXTURE_MAX_LOD */ /* GL_TEXTURE_BASE_LEVEL */ /* GL_TEXTURE_MAX_LEVEL */ /* HintMode */ #define GL_DONT_CARE 0x1100 #define GL_FASTEST 0x1101 #define GL_NICEST 0x1102 /* HintTarget */ /* GL_PERSPECTIVE_CORRECTION_HINT */ /* GL_POINT_SMOOTH_HINT */ /* GL_LINE_SMOOTH_HINT */ /* GL_POLYGON_SMOOTH_HINT */ /* GL_FOG_HINT */ /* HistogramTarget */ /* GL_HISTOGRAM */ /* GL_PROXY_HISTOGRAM */ /* IndexPointerType */ /* GL_SHORT */ /* GL_INT */ /* GL_FLOAT */ /* GL_DOUBLE */ /* LightModelColorControl */ /* GL_SINGLE_COLOR */ /* GL_SEPARATE_SPECULAR_COLOR */ /* LightModelParameter */ /* GL_LIGHT_MODEL_AMBIENT */ /* GL_LIGHT_MODEL_LOCAL_VIEWER */ /* GL_LIGHT_MODEL_TWO_SIDE */ /* GL_LIGHT_MODEL_COLOR_CONTROL */ /* LightName */ #define GL_LIGHT0 0x4000 #define GL_LIGHT1 0x4001 #define GL_LIGHT2 0x4002 #define GL_LIGHT3 0x4003 #define GL_LIGHT4 0x4004 #define GL_LIGHT5 0x4005 #define GL_LIGHT6 0x4006 #define GL_LIGHT7 0x4007 /* LightParameter */ #define GL_AMBIENT 0x1200 #define GL_DIFFUSE 0x1201 #define GL_SPECULAR 0x1202 #define GL_POSITION 0x1203 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 #define GL_SPOT_CUTOFF 0x1206 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_LINEAR_ATTENUATION 0x1208 #define GL_QUADRATIC_ATTENUATION 0x1209 /* InterleavedArrays */ /* GL_V2F */ /* GL_V3F */ /* GL_C4UB_V2F */ /* GL_C4UB_V3F */ /* GL_C3F_V3F */ /* GL_N3F_V3F */ /* GL_C4F_N3F_V3F */ /* GL_T2F_V3F */ /* GL_T4F_V4F */ /* GL_T2F_C4UB_V3F */ /* GL_T2F_C3F_V3F */ /* GL_T2F_N3F_V3F */ /* GL_T2F_C4F_N3F_V3F */ /* GL_T4F_C4F_N3F_V4F */ /* ListMode */ #define GL_COMPILE 0x1300 #define GL_COMPILE_AND_EXECUTE 0x1301 /* ListNameType */ /* GL_BYTE */ /* GL_UNSIGNED_BYTE */ /* GL_SHORT */ /* GL_UNSIGNED_SHORT */ /* GL_INT */ /* GL_UNSIGNED_INT */ /* GL_FLOAT */ /* GL_2_BYTES */ /* GL_3_BYTES */ /* GL_4_BYTES */ /* LogicOp */ #define GL_CLEAR 0x1500 #define GL_AND 0x1501 #define GL_AND_REVERSE 0x1502 #define GL_COPY 0x1503 #define GL_AND_INVERTED 0x1504 #define GL_NOOP 0x1505 #define GL_XOR 0x1506 #define GL_OR 0x1507 #define GL_NOR 0x1508 #define GL_EQUIV 0x1509 #define GL_INVERT 0x150A #define GL_OR_REVERSE 0x150B #define GL_COPY_INVERTED 0x150C #define GL_OR_INVERTED 0x150D #define GL_NAND 0x150E #define GL_SET 0x150F /* MapTarget */ /* GL_MAP1_COLOR_4 */ /* GL_MAP1_INDEX */ /* GL_MAP1_NORMAL */ /* GL_MAP1_TEXTURE_COORD_1 */ /* GL_MAP1_TEXTURE_COORD_2 */ /* GL_MAP1_TEXTURE_COORD_3 */ /* GL_MAP1_TEXTURE_COORD_4 */ /* GL_MAP1_VERTEX_3 */ /* GL_MAP1_VERTEX_4 */ /* GL_MAP2_COLOR_4 */ /* GL_MAP2_INDEX */ /* GL_MAP2_NORMAL */ /* GL_MAP2_TEXTURE_COORD_1 */ /* GL_MAP2_TEXTURE_COORD_2 */ /* GL_MAP2_TEXTURE_COORD_3 */ /* GL_MAP2_TEXTURE_COORD_4 */ /* GL_MAP2_VERTEX_3 */ /* GL_MAP2_VERTEX_4 */ /* MaterialFace */ /* GL_FRONT */ /* GL_BACK */ /* GL_FRONT_AND_BACK */ /* MaterialParameter */ #define GL_EMISSION 0x1600 #define GL_SHININESS 0x1601 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_COLOR_INDEXES 0x1603 /* GL_AMBIENT */ /* GL_DIFFUSE */ /* GL_SPECULAR */ /* MatrixMode */ #define GL_MODELVIEW 0x1700 #define GL_PROJECTION 0x1701 #define GL_TEXTURE 0x1702 /* MeshMode1 */ /* GL_POINT */ /* GL_LINE */ /* MeshMode2 */ /* GL_POINT */ /* GL_LINE */ /* GL_FILL */ /* MinmaxTarget */ /* GL_MINMAX */ /* NormalPointerType */ /* GL_BYTE */ /* GL_SHORT */ /* GL_INT */ /* GL_FLOAT */ /* GL_DOUBLE */ /* PixelCopyType */ #define GL_COLOR 0x1800 #define GL_DEPTH 0x1801 #define GL_STENCIL 0x1802 /* PixelFormat */ #define GL_COLOR_INDEX 0x1900 #define GL_STENCIL_INDEX 0x1901 #define GL_DEPTH_COMPONENT 0x1902 #define GL_RED 0x1903 #define GL_GREEN 0x1904 #define GL_BLUE 0x1905 #define GL_ALPHA 0x1906 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE_ALPHA 0x190A /* GL_ABGR */ /* PixelInternalFormat */ /* GL_ALPHA4 */ /* GL_ALPHA8 */ /* GL_ALPHA12 */ /* GL_ALPHA16 */ /* GL_LUMINANCE4 */ /* GL_LUMINANCE8 */ /* GL_LUMINANCE12 */ /* GL_LUMINANCE16 */ /* GL_LUMINANCE4_ALPHA4 */ /* GL_LUMINANCE6_ALPHA2 */ /* GL_LUMINANCE8_ALPHA8 */ /* GL_LUMINANCE12_ALPHA4 */ /* GL_LUMINANCE12_ALPHA12 */ /* GL_LUMINANCE16_ALPHA16 */ /* GL_INTENSITY */ /* GL_INTENSITY4 */ /* GL_INTENSITY8 */ /* GL_INTENSITY12 */ /* GL_INTENSITY16 */ /* GL_R3_G3_B2 */ /* GL_RGB4 */ /* GL_RGB5 */ /* GL_RGB8 */ /* GL_RGB10 */ /* GL_RGB12 */ /* GL_RGB16 */ /* GL_RGBA2 */ /* GL_RGBA4 */ /* GL_RGB5_A1 */ /* GL_RGBA8 */ /* GL_RGB10_A2 */ /* GL_RGBA12 */ /* GL_RGBA16 */ /* PixelMap */ /* GL_PIXEL_MAP_I_TO_I */ /* GL_PIXEL_MAP_S_TO_S */ /* GL_PIXEL_MAP_I_TO_R */ /* GL_PIXEL_MAP_I_TO_G */ /* GL_PIXEL_MAP_I_TO_B */ /* GL_PIXEL_MAP_I_TO_A */ /* GL_PIXEL_MAP_R_TO_R */ /* GL_PIXEL_MAP_G_TO_G */ /* GL_PIXEL_MAP_B_TO_B */ /* GL_PIXEL_MAP_A_TO_A */ /* PixelStore */ /* GL_UNPACK_SWAP_BYTES */ /* GL_UNPACK_LSB_FIRST */ /* GL_UNPACK_ROW_LENGTH */ /* GL_UNPACK_SKIP_ROWS */ /* GL_UNPACK_SKIP_PIXELS */ /* GL_UNPACK_ALIGNMENT */ /* GL_PACK_SWAP_BYTES */ /* GL_PACK_LSB_FIRST */ /* GL_PACK_ROW_LENGTH */ /* GL_PACK_SKIP_ROWS */ /* GL_PACK_SKIP_PIXELS */ /* GL_PACK_ALIGNMENT */ /* GL_PACK_SKIP_IMAGES */ /* GL_PACK_IMAGE_HEIGHT */ /* GL_UNPACK_SKIP_IMAGES */ /* GL_UNPACK_IMAGE_HEIGHT */ /* PixelTransfer */ /* GL_MAP_COLOR */ /* GL_MAP_STENCIL */ /* GL_INDEX_SHIFT */ /* GL_INDEX_OFFSET */ /* GL_RED_SCALE */ /* GL_RED_BIAS */ /* GL_GREEN_SCALE */ /* GL_GREEN_BIAS */ /* GL_BLUE_SCALE */ /* GL_BLUE_BIAS */ /* GL_ALPHA_SCALE */ /* GL_ALPHA_BIAS */ /* GL_DEPTH_SCALE */ /* GL_DEPTH_BIAS */ /* GL_POST_CONVOLUTION_RED_SCALE */ /* GL_POST_CONVOLUTION_GREEN_SCALE */ /* GL_POST_CONVOLUTION_BLUE_SCALE */ /* GL_POST_CONVOLUTION_ALPHA_SCALE */ /* GL_POST_CONVOLUTION_RED_BIAS */ /* GL_POST_CONVOLUTION_GREEN_BIAS */ /* GL_POST_CONVOLUTION_BLUE_BIAS */ /* GL_POST_CONVOLUTION_ALPHA_BIAS */ /* GL_POST_COLOR_MATRIX_RED_SCALE */ /* GL_POST_COLOR_MATRIX_GREEN_SCALE */ /* GL_POST_COLOR_MATRIX_BLUE_SCALE */ /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */ /* GL_POST_COLOR_MATRIX_RED_BIAS */ /* GL_POST_COLOR_MATRIX_GREEN_BIAS */ /* GL_POST_COLOR_MATRIX_BLUE_BIAS */ /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */ /* PixelType */ #define GL_BITMAP 0x1A00 /* GL_BYTE */ /* GL_UNSIGNED_BYTE */ /* GL_SHORT */ /* GL_UNSIGNED_SHORT */ /* GL_INT */ /* GL_UNSIGNED_INT */ /* GL_FLOAT */ /* GL_BGR */ /* GL_BGRA */ /* GL_UNSIGNED_BYTE_3_3_2 */ /* GL_UNSIGNED_SHORT_4_4_4_4 */ /* GL_UNSIGNED_SHORT_5_5_5_1 */ /* GL_UNSIGNED_INT_8_8_8_8 */ /* GL_UNSIGNED_INT_10_10_10_2 */ /* GL_UNSIGNED_SHORT_5_6_5 */ /* GL_UNSIGNED_BYTE_2_3_3_REV */ /* GL_UNSIGNED_SHORT_5_6_5_REV */ /* GL_UNSIGNED_SHORT_4_4_4_4_REV */ /* GL_UNSIGNED_SHORT_1_5_5_5_REV */ /* GL_UNSIGNED_INT_8_8_8_8_REV */ /* GL_UNSIGNED_INT_2_10_10_10_REV */ /* PolygonMode */ #define GL_POINT 0x1B00 #define GL_LINE 0x1B01 #define GL_FILL 0x1B02 /* ReadBufferMode */ /* GL_FRONT_LEFT */ /* GL_FRONT_RIGHT */ /* GL_BACK_LEFT */ /* GL_BACK_RIGHT */ /* GL_FRONT */ /* GL_BACK */ /* GL_LEFT */ /* GL_RIGHT */ /* GL_AUX0 */ /* GL_AUX1 */ /* GL_AUX2 */ /* GL_AUX3 */ /* RenderingMode */ #define GL_RENDER 0x1C00 #define GL_FEEDBACK 0x1C01 #define GL_SELECT 0x1C02 /* SeparableTarget */ /* GL_SEPARABLE_2D */ /* ShadingModel */ #define GL_FLAT 0x1D00 #define GL_SMOOTH 0x1D01 /* StencilFunction */ /* GL_NEVER */ /* GL_LESS */ /* GL_EQUAL */ /* GL_LEQUAL */ /* GL_GREATER */ /* GL_NOTEQUAL */ /* GL_GEQUAL */ /* GL_ALWAYS */ /* StencilOp */ /* GL_ZERO */ #define GL_KEEP 0x1E00 #define GL_REPLACE 0x1E01 #define GL_INCR 0x1E02 #define GL_DECR 0x1E03 /* GL_INVERT */ /* StringName */ #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 #define GL_EXTENSIONS 0x1F03 /* TextureCoordName */ #define GL_S 0x2000 #define GL_T 0x2001 #define GL_R 0x2002 #define GL_Q 0x2003 /* TexCoordPointerType */ /* GL_SHORT */ /* GL_INT */ /* GL_FLOAT */ /* GL_DOUBLE */ /* TextureEnvMode */ #define GL_MODULATE 0x2100 #define GL_DECAL 0x2101 /* GL_BLEND */ /* GL_REPLACE */ /* TextureEnvParameter */ #define GL_TEXTURE_ENV_MODE 0x2200 #define GL_TEXTURE_ENV_COLOR 0x2201 /* TextureEnvTarget */ #define GL_TEXTURE_ENV 0x2300 /* TextureGenMode */ #define GL_EYE_LINEAR 0x2400 #define GL_OBJECT_LINEAR 0x2401 #define GL_SPHERE_MAP 0x2402 /* TextureGenParameter */ #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_OBJECT_PLANE 0x2501 #define GL_EYE_PLANE 0x2502 /* TextureMagFilter */ #define GL_NEAREST 0x2600 #define GL_LINEAR 0x2601 /* TextureMinFilter */ /* GL_NEAREST */ /* GL_LINEAR */ #define GL_NEAREST_MIPMAP_NEAREST 0x2700 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 /* TextureParameterName */ #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 /* GL_TEXTURE_BORDER_COLOR */ /* GL_TEXTURE_PRIORITY */ /* GL_TEXTURE_WRAP_R */ /* GL_TEXTURE_MIN_LOD */ /* GL_TEXTURE_MAX_LOD */ /* GL_TEXTURE_BASE_LEVEL */ /* GL_TEXTURE_MAX_LEVEL */ /* TextureTarget */ /* GL_TEXTURE_1D */ /* GL_TEXTURE_2D */ /* GL_PROXY_TEXTURE_1D */ /* GL_PROXY_TEXTURE_2D */ /* GL_TEXTURE_3D */ /* GL_PROXY_TEXTURE_3D */ /* TextureUnit */ /* GL_TEXTURE0_ARB */ /* GL_TEXTURE1_ARB */ /* GL_TEXTURE2_ARB */ /* GL_TEXTURE3_ARB */ /* GL_TEXTURE4_ARB */ /* GL_TEXTURE5_ARB */ /* GL_TEXTURE6_ARB */ /* GL_TEXTURE7_ARB */ /* GL_TEXTURE8_ARB */ /* GL_TEXTURE9_ARB */ /* GL_TEXTURE10_ARB */ /* GL_TEXTURE11_ARB */ /* GL_TEXTURE12_ARB */ /* GL_TEXTURE13_ARB */ /* GL_TEXTURE14_ARB */ /* GL_TEXTURE15_ARB */ /* GL_TEXTURE16_ARB */ /* GL_TEXTURE17_ARB */ /* GL_TEXTURE18_ARB */ /* GL_TEXTURE19_ARB */ /* GL_TEXTURE20_ARB */ /* GL_TEXTURE21_ARB */ /* GL_TEXTURE22_ARB */ /* GL_TEXTURE23_ARB */ /* GL_TEXTURE24_ARB */ /* GL_TEXTURE25_ARB */ /* GL_TEXTURE26_ARB */ /* GL_TEXTURE27_ARB */ /* GL_TEXTURE28_ARB */ /* GL_TEXTURE29_ARB */ /* GL_TEXTURE30_ARB */ /* GL_TEXTURE31_ARB */ /* TextureWrapMode */ #define GL_CLAMP 0x2900 #define GL_REPEAT 0x2901 /* GL_CLAMP_TO_EDGE */ /* VertexPointerType */ /* GL_SHORT */ /* GL_INT */ /* GL_FLOAT */ /* GL_DOUBLE */ /* ClientAttribMask */ #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff /* polygon_offset */ #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_POLYGON_OFFSET_UNITS 0x2A00 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 #define GL_POLYGON_OFFSET_FILL 0x8037 /* texture */ #define GL_ALPHA4 0x803B #define GL_ALPHA8 0x803C #define GL_ALPHA12 0x803D #define GL_ALPHA16 0x803E #define GL_LUMINANCE4 0x803F #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE12 0x8041 #define GL_LUMINANCE16 0x8042 #define GL_LUMINANCE4_ALPHA4 0x8043 #define GL_LUMINANCE6_ALPHA2 0x8044 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_LUMINANCE12_ALPHA4 0x8046 #define GL_LUMINANCE12_ALPHA12 0x8047 #define GL_LUMINANCE16_ALPHA16 0x8048 #define GL_INTENSITY 0x8049 #define GL_INTENSITY4 0x804A #define GL_INTENSITY8 0x804B #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D #define GL_R3_G3_B2 0x2A10 #define GL_RGB4 0x804F #define GL_RGB5 0x8050 #define GL_RGB8 0x8051 #define GL_RGB10 0x8052 #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 #define GL_RGBA2 0x8055 #define GL_RGBA4 0x8056 #define GL_RGB5_A1 0x8057 #define GL_RGBA8 0x8058 #define GL_RGB10_A2 0x8059 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_ALPHA_SIZE 0x805F #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 #define GL_TEXTURE_INTENSITY_SIZE 0x8061 #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_2D 0x8064 /* texture_object */ #define GL_TEXTURE_PRIORITY 0x8066 #define GL_TEXTURE_RESIDENT 0x8067 #define GL_TEXTURE_BINDING_1D 0x8068 #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_TEXTURE_BINDING_3D 0x806A /* vertex_array */ #define GL_VERTEX_ARRAY 0x8074 #define GL_NORMAL_ARRAY 0x8075 #define GL_COLOR_ARRAY 0x8076 #define GL_INDEX_ARRAY 0x8077 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_EDGE_FLAG_ARRAY 0x8079 #define GL_VERTEX_ARRAY_SIZE 0x807A #define GL_VERTEX_ARRAY_TYPE 0x807B #define GL_VERTEX_ARRAY_STRIDE 0x807C #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_NORMAL_ARRAY_STRIDE 0x807F #define GL_COLOR_ARRAY_SIZE 0x8081 #define GL_COLOR_ARRAY_TYPE 0x8082 #define GL_COLOR_ARRAY_STRIDE 0x8083 #define GL_INDEX_ARRAY_TYPE 0x8085 #define GL_INDEX_ARRAY_STRIDE 0x8086 #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_VERTEX_ARRAY_POINTER 0x808E #define GL_NORMAL_ARRAY_POINTER 0x808F #define GL_COLOR_ARRAY_POINTER 0x8090 #define GL_INDEX_ARRAY_POINTER 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 #define GL_C3F_V3F 0x2A24 #define GL_N3F_V3F 0x2A25 #define GL_C4F_N3F_V3F 0x2A26 #define GL_T2F_V3F 0x2A27 #define GL_T4F_V4F 0x2A28 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_N3F_V3F 0x2A2B #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_T4F_C4F_N3F_V4F 0x2A2D /* bgra */ #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 /* blend_color */ #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_BLEND_COLOR 0x8005 /* blend_minmax */ #define GL_FUNC_ADD 0x8006 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 /* blend_subtract */ #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B /* color_matrix */ #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB /* color_table */ #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF /* convolution */ #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_CONSTANT_BORDER 0x8151 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 /* draw_range_elements */ #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 /* histogram */ #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 /* packed_pixels */ #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 /* rescale_normal */ #define GL_RESCALE_NORMAL 0x803A /* separate_specular_color */ #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA /* texture3D */ #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 /* texture_edge_clamp */ #define GL_CLAMP_TO_EDGE 0x812F /* texture_lod */ #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D /* GetTarget1_2 */ #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E /* multitexture */ #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 /* Extensions */ #define GL_EXT_abgr 1 #define GL_EXT_blend_color 1 #define GL_EXT_blend_minmax 1 #define GL_EXT_blend_subtract 1 #define GL_EXT_texture_env_combine 1 #define GL_EXT_texture_env_add 1 /* EXT_abgr */ #define GL_ABGR_EXT 0x8000 /* EXT_blend_color */ #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 /* EXT_blend_minmax */ #define GL_FUNC_ADD_EXT 0x8006 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_BLEND_EQUATION_EXT 0x8009 /* EXT_blend_subtract */ #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B /* EXT_texture_env_combine */ #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A /* For compatibility with OpenGL v1.0 */ #define GL_LOGIC_OP GL_INDEX_LOGIC_OP #define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT /*************************************************************/ WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value); WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref); WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); WINGDIAPI void APIENTRY glArrayElement (GLint i); WINGDIAPI void APIENTRY glBegin (GLenum mode); WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); WINGDIAPI void APIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); WINGDIAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); WINGDIAPI void APIENTRY glCallList (GLuint list); WINGDIAPI void APIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); WINGDIAPI void APIENTRY glClear (GLbitfield mask); WINGDIAPI void APIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); WINGDIAPI void APIENTRY glClearDepth (GLclampd depth); WINGDIAPI void APIENTRY glClearIndex (GLfloat c); WINGDIAPI void APIENTRY glClearStencil (GLint s); WINGDIAPI void APIENTRY glClipPlane (GLenum plane, const GLdouble *equation); WINGDIAPI void APIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); WINGDIAPI void APIENTRY glColor3bv (const GLbyte *v); WINGDIAPI void APIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); WINGDIAPI void APIENTRY glColor3dv (const GLdouble *v); WINGDIAPI void APIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); WINGDIAPI void APIENTRY glColor3fv (const GLfloat *v); WINGDIAPI void APIENTRY glColor3i (GLint red, GLint green, GLint blue); WINGDIAPI void APIENTRY glColor3iv (const GLint *v); WINGDIAPI void APIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); WINGDIAPI void APIENTRY glColor3sv (const GLshort *v); WINGDIAPI void APIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); WINGDIAPI void APIENTRY glColor3ubv (const GLubyte *v); WINGDIAPI void APIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); WINGDIAPI void APIENTRY glColor3uiv (const GLuint *v); WINGDIAPI void APIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); WINGDIAPI void APIENTRY glColor3usv (const GLushort *v); WINGDIAPI void APIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); WINGDIAPI void APIENTRY glColor4bv (const GLbyte *v); WINGDIAPI void APIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); WINGDIAPI void APIENTRY glColor4dv (const GLdouble *v); WINGDIAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); WINGDIAPI void APIENTRY glColor4fv (const GLfloat *v); WINGDIAPI void APIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); WINGDIAPI void APIENTRY glColor4iv (const GLint *v); WINGDIAPI void APIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); WINGDIAPI void APIENTRY glColor4sv (const GLshort *v); WINGDIAPI void APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); WINGDIAPI void APIENTRY glColor4ubv (const GLubyte *v); WINGDIAPI void APIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); WINGDIAPI void APIENTRY glColor4uiv (const GLuint *v); WINGDIAPI void APIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); WINGDIAPI void APIENTRY glColor4usv (const GLushort *v); WINGDIAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); WINGDIAPI void APIENTRY glColorMaterial (GLenum face, GLenum mode); WINGDIAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); WINGDIAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); WINGDIAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); WINGDIAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); WINGDIAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); WINGDIAPI void APIENTRY glCullFace (GLenum mode); WINGDIAPI void APIENTRY glDeleteLists (GLuint list, GLsizei range); WINGDIAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); WINGDIAPI void APIENTRY glDepthFunc (GLenum func); WINGDIAPI void APIENTRY glDepthMask (GLboolean flag); WINGDIAPI void APIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); WINGDIAPI void APIENTRY glDisable (GLenum cap); WINGDIAPI void APIENTRY glDisableClientState (GLenum array); WINGDIAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); WINGDIAPI void APIENTRY glDrawBuffer (GLenum mode); WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); WINGDIAPI void APIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); WINGDIAPI void APIENTRY glEdgeFlag (GLboolean flag); WINGDIAPI void APIENTRY glEdgeFlagPointer (GLsizei stride, const GLboolean *pointer); WINGDIAPI void APIENTRY glEdgeFlagv (const GLboolean *flag); WINGDIAPI void APIENTRY glEnable (GLenum cap); WINGDIAPI void APIENTRY glEnableClientState (GLenum array); WINGDIAPI void APIENTRY glEnd (void); WINGDIAPI void APIENTRY glEndList (void); WINGDIAPI void APIENTRY glEvalCoord1d (GLdouble u); WINGDIAPI void APIENTRY glEvalCoord1dv (const GLdouble *u); WINGDIAPI void APIENTRY glEvalCoord1f (GLfloat u); WINGDIAPI void APIENTRY glEvalCoord1fv (const GLfloat *u); WINGDIAPI void APIENTRY glEvalCoord2d (GLdouble u, GLdouble v); WINGDIAPI void APIENTRY glEvalCoord2dv (const GLdouble *u); WINGDIAPI void APIENTRY glEvalCoord2f (GLfloat u, GLfloat v); WINGDIAPI void APIENTRY glEvalCoord2fv (const GLfloat *u); WINGDIAPI void APIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); WINGDIAPI void APIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); WINGDIAPI void APIENTRY glEvalPoint1 (GLint i); WINGDIAPI void APIENTRY glEvalPoint2 (GLint i, GLint j); WINGDIAPI void APIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); WINGDIAPI void APIENTRY glFinish (void); WINGDIAPI void APIENTRY glFlush (void); WINGDIAPI void APIENTRY glFogf (GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glFogi (GLenum pname, GLint param); WINGDIAPI void APIENTRY glFogiv (GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glFrontFace (GLenum mode); WINGDIAPI void APIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); WINGDIAPI GLuint APIENTRY glGenLists (GLsizei range); WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); WINGDIAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params); WINGDIAPI void APIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); WINGDIAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params); WINGDIAPI GLenum APIENTRY glGetError (void); WINGDIAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); WINGDIAPI void APIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); WINGDIAPI void APIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); WINGDIAPI void APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); WINGDIAPI void APIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); WINGDIAPI void APIENTRY glGetPixelMapusv (GLenum map, GLushort *values); WINGDIAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params); WINGDIAPI void APIENTRY glGetPolygonStipple (GLubyte *mask); WINGDIAPI const GLubyte * APIENTRY glGetString (GLenum name); WINGDIAPI void APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); WINGDIAPI void APIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); WINGDIAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); WINGDIAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); WINGDIAPI void APIENTRY glHint (GLenum target, GLenum mode); WINGDIAPI void APIENTRY glIndexMask (GLuint mask); WINGDIAPI void APIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glIndexd (GLdouble c); WINGDIAPI void APIENTRY glIndexdv (const GLdouble *c); WINGDIAPI void APIENTRY glIndexf (GLfloat c); WINGDIAPI void APIENTRY glIndexfv (const GLfloat *c); WINGDIAPI void APIENTRY glIndexi (GLint c); WINGDIAPI void APIENTRY glIndexiv (const GLint *c); WINGDIAPI void APIENTRY glIndexs (GLshort c); WINGDIAPI void APIENTRY glIndexsv (const GLshort *c); WINGDIAPI void APIENTRY glIndexub (GLubyte c); WINGDIAPI void APIENTRY glIndexubv (const GLubyte *c); WINGDIAPI void APIENTRY glInitNames (void); WINGDIAPI void APIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); WINGDIAPI GLboolean APIENTRY glIsEnabled (GLenum cap); WINGDIAPI GLboolean APIENTRY glIsList (GLuint list); WINGDIAPI GLboolean APIENTRY glIsTexture (GLuint texture); WINGDIAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glLightModeli (GLenum pname, GLint param); WINGDIAPI void APIENTRY glLightModeliv (GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glLighti (GLenum light, GLenum pname, GLint param); WINGDIAPI void APIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glLineStipple (GLint factor, GLushort pattern); WINGDIAPI void APIENTRY glLineWidth (GLfloat width); WINGDIAPI void APIENTRY glListBase (GLuint base); WINGDIAPI void APIENTRY glLoadIdentity (void); WINGDIAPI void APIENTRY glLoadMatrixd (const GLdouble *m); WINGDIAPI void APIENTRY glLoadMatrixf (const GLfloat *m); WINGDIAPI void APIENTRY glLoadName (GLuint name); WINGDIAPI void APIENTRY glLogicOp (GLenum opcode); WINGDIAPI void APIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); WINGDIAPI void APIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); WINGDIAPI void APIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); WINGDIAPI void APIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); WINGDIAPI void APIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); WINGDIAPI void APIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); WINGDIAPI void APIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); WINGDIAPI void APIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); WINGDIAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glMateriali (GLenum face, GLenum pname, GLint param); WINGDIAPI void APIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glMatrixMode (GLenum mode); WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m); WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m); WINGDIAPI void APIENTRY glNewList (GLuint list, GLenum mode); WINGDIAPI void APIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); WINGDIAPI void APIENTRY glNormal3bv (const GLbyte *v); WINGDIAPI void APIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); WINGDIAPI void APIENTRY glNormal3dv (const GLdouble *v); WINGDIAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); WINGDIAPI void APIENTRY glNormal3fv (const GLfloat *v); WINGDIAPI void APIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); WINGDIAPI void APIENTRY glNormal3iv (const GLint *v); WINGDIAPI void APIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); WINGDIAPI void APIENTRY glNormal3sv (const GLshort *v); WINGDIAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); WINGDIAPI void APIENTRY glPassThrough (GLfloat token); WINGDIAPI void APIENTRY glPixelMapfv (GLenum map, GLint mapsize, const GLfloat *values); WINGDIAPI void APIENTRY glPixelMapuiv (GLenum map, GLint mapsize, const GLuint *values); WINGDIAPI void APIENTRY glPixelMapusv (GLenum map, GLint mapsize, const GLushort *values); WINGDIAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); WINGDIAPI void APIENTRY glPixelTransferf (GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glPixelTransferi (GLenum pname, GLint param); WINGDIAPI void APIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); WINGDIAPI void APIENTRY glPointSize (GLfloat size); WINGDIAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); WINGDIAPI void APIENTRY glPolygonStipple (const GLubyte *mask); WINGDIAPI void APIENTRY glPopAttrib (void); WINGDIAPI void APIENTRY glPopClientAttrib (void); WINGDIAPI void APIENTRY glPopMatrix (void); WINGDIAPI void APIENTRY glPopName (void); WINGDIAPI void APIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); WINGDIAPI void APIENTRY glPushAttrib (GLbitfield mask); WINGDIAPI void APIENTRY glPushClientAttrib (GLbitfield mask); WINGDIAPI void APIENTRY glPushMatrix (void); WINGDIAPI void APIENTRY glPushName (GLuint name); WINGDIAPI void APIENTRY glRasterPos2d (GLdouble x, GLdouble y); WINGDIAPI void APIENTRY glRasterPos2dv (const GLdouble *v); WINGDIAPI void APIENTRY glRasterPos2f (GLfloat x, GLfloat y); WINGDIAPI void APIENTRY glRasterPos2fv (const GLfloat *v); WINGDIAPI void APIENTRY glRasterPos2i (GLint x, GLint y); WINGDIAPI void APIENTRY glRasterPos2iv (const GLint *v); WINGDIAPI void APIENTRY glRasterPos2s (GLshort x, GLshort y); WINGDIAPI void APIENTRY glRasterPos2sv (const GLshort *v); WINGDIAPI void APIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glRasterPos3dv (const GLdouble *v); WINGDIAPI void APIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glRasterPos3fv (const GLfloat *v); WINGDIAPI void APIENTRY glRasterPos3i (GLint x, GLint y, GLint z); WINGDIAPI void APIENTRY glRasterPos3iv (const GLint *v); WINGDIAPI void APIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); WINGDIAPI void APIENTRY glRasterPos3sv (const GLshort *v); WINGDIAPI void APIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); WINGDIAPI void APIENTRY glRasterPos4dv (const GLdouble *v); WINGDIAPI void APIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); WINGDIAPI void APIENTRY glRasterPos4fv (const GLfloat *v); WINGDIAPI void APIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); WINGDIAPI void APIENTRY glRasterPos4iv (const GLint *v); WINGDIAPI void APIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); WINGDIAPI void APIENTRY glRasterPos4sv (const GLshort *v); WINGDIAPI void APIENTRY glReadBuffer (GLenum mode); WINGDIAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); WINGDIAPI void APIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); WINGDIAPI void APIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); WINGDIAPI void APIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); WINGDIAPI void APIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); WINGDIAPI void APIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); WINGDIAPI void APIENTRY glRectiv (const GLint *v1, const GLint *v2); WINGDIAPI void APIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); WINGDIAPI void APIENTRY glRectsv (const GLshort *v1, const GLshort *v2); WINGDIAPI GLint APIENTRY glRenderMode (GLenum mode); WINGDIAPI void APIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); WINGDIAPI void APIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); WINGDIAPI void APIENTRY glShadeModel (GLenum mode); WINGDIAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); WINGDIAPI void APIENTRY glStencilMask (GLuint mask); WINGDIAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); WINGDIAPI void APIENTRY glTexCoord1d (GLdouble s); WINGDIAPI void APIENTRY glTexCoord1dv (const GLdouble *v); WINGDIAPI void APIENTRY glTexCoord1f (GLfloat s); WINGDIAPI void APIENTRY glTexCoord1fv (const GLfloat *v); WINGDIAPI void APIENTRY glTexCoord1i (GLint s); WINGDIAPI void APIENTRY glTexCoord1iv (const GLint *v); WINGDIAPI void APIENTRY glTexCoord1s (GLshort s); WINGDIAPI void APIENTRY glTexCoord1sv (const GLshort *v); WINGDIAPI void APIENTRY glTexCoord2d (GLdouble s, GLdouble t); WINGDIAPI void APIENTRY glTexCoord2dv (const GLdouble *v); WINGDIAPI void APIENTRY glTexCoord2f (GLfloat s, GLfloat t); WINGDIAPI void APIENTRY glTexCoord2fv (const GLfloat *v); WINGDIAPI void APIENTRY glTexCoord2i (GLint s, GLint t); WINGDIAPI void APIENTRY glTexCoord2iv (const GLint *v); WINGDIAPI void APIENTRY glTexCoord2s (GLshort s, GLshort t); WINGDIAPI void APIENTRY glTexCoord2sv (const GLshort *v); WINGDIAPI void APIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); WINGDIAPI void APIENTRY glTexCoord3dv (const GLdouble *v); WINGDIAPI void APIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); WINGDIAPI void APIENTRY glTexCoord3fv (const GLfloat *v); WINGDIAPI void APIENTRY glTexCoord3i (GLint s, GLint t, GLint r); WINGDIAPI void APIENTRY glTexCoord3iv (const GLint *v); WINGDIAPI void APIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); WINGDIAPI void APIENTRY glTexCoord3sv (const GLshort *v); WINGDIAPI void APIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); WINGDIAPI void APIENTRY glTexCoord4dv (const GLdouble *v); WINGDIAPI void APIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); WINGDIAPI void APIENTRY glTexCoord4fv (const GLfloat *v); WINGDIAPI void APIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); WINGDIAPI void APIENTRY glTexCoord4iv (const GLint *v); WINGDIAPI void APIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); WINGDIAPI void APIENTRY glTexCoord4sv (const GLshort *v); WINGDIAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); WINGDIAPI void APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); WINGDIAPI void APIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); WINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); WINGDIAPI void APIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); WINGDIAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); WINGDIAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); WINGDIAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); WINGDIAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); WINGDIAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); WINGDIAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y); WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y); WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y); WINGDIAPI void APIENTRY glVertex2iv (const GLint *v); WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y); WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v); WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z); WINGDIAPI void APIENTRY glVertex3iv (const GLint *v); WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v); WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); WINGDIAPI void APIENTRY glVertex4iv (const GLint *v); WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v); WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); #ifdef __cplusplus } #endif #endif /* __gl_h_ */ rgl/src/ext/GLsdk/GL/glext.h0000644000176000001440000112000112262026246015254 0ustar ripleyusers#ifndef __glext_h_ #define __glext_h_ #ifdef __cplusplus extern "C" { #endif /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #define WIN32_LEAN_AND_MEAN 1 #include #endif #ifndef APIENTRY #define APIENTRY #endif #ifndef APIENTRYP #define APIENTRYP APIENTRY * #endif #ifndef GLAPI #define GLAPI extern #endif /*************************************************************/ /* Header file version number, required by OpenGL ABI for Linux */ /* glext.h last updated 2004/2/23 */ /* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ #define GL_GLEXT_VERSION 22 #ifndef GL_VERSION_1_2 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_RESCALE_NORMAL 0x803A #define GL_TEXTURE_BINDING_3D 0x806A #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_CLAMP_TO_EDGE 0x812F #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E #endif #ifndef GL_ARB_imaging #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_BLEND_COLOR 0x8005 #define GL_FUNC_ADD 0x8006 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_BLEND_EQUATION 0x8009 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_CONSTANT_BORDER 0x8151 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 #endif #ifndef GL_VERSION_1_3 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_MULTISAMPLE_BIT 0x20000000 #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_CLAMP_TO_BORDER 0x812D #define GL_CLAMP_TO_BORDER_SGIS 0x812D #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_SUBTRACT 0x84E7 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF #endif #ifndef GL_VERSION_1_4 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_MIRRORED_REPEAT 0x8370 #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E #endif #ifndef GL_VERSION_1_5 #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 #define GL_CURRENT_QUERY 0x8865 #define GL_QUERY_RESULT 0x8866 #define GL_QUERY_RESULT_AVAILABLE 0x8867 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_READ_ONLY 0x88B8 #define GL_WRITE_ONLY 0x88B9 #define GL_READ_WRITE 0x88BA #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_READ 0x88E1 #define GL_STREAM_COPY 0x88E2 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 #define GL_STATIC_COPY 0x88E6 #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_COPY 0x88EA #define GL_SAMPLES_PASSED 0x8914 #define GL_FOG_COORD_SOURCE GL_FOG_COORDINATE_SOURCE #define GL_FOG_COORD GL_FOG_COORDINATE #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING #define GL_SRC0_RGB GL_SOURCE0_RGB #define GL_SRC1_RGB GL_SOURCE1_RGB #define GL_SRC2_RGB GL_SOURCE2_RGB #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA #endif #ifndef GL_ARB_multitexture #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 #endif #ifndef GL_ARB_transpose_matrix #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 #endif #ifndef GL_ARB_multisample #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 #endif #ifndef GL_ARB_texture_env_add #endif #ifndef GL_ARB_texture_cube_map #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #endif #ifndef GL_ARB_texture_compression #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 #endif #ifndef GL_ARB_texture_border_clamp #define GL_CLAMP_TO_BORDER_ARB 0x812D #endif #ifndef GL_ARB_point_parameters #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 #endif #ifndef GL_ARB_vertex_blend #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F #endif #ifndef GL_ARB_matrix_palette #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 #endif #ifndef GL_ARB_texture_env_combine #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_SUBTRACT_ARB 0x84E7 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #endif #ifndef GL_ARB_texture_env_crossbar #endif #ifndef GL_ARB_texture_env_dot3 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #endif #ifndef GL_ARB_texture_mirrored_repeat #define GL_MIRRORED_REPEAT_ARB 0x8370 #endif #ifndef GL_ARB_depth_texture #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #endif #ifndef GL_ARB_shadow #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #endif #ifndef GL_ARB_shadow_ambient #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #endif #ifndef GL_ARB_window_pos #endif #ifndef GL_ARB_vertex_program #define GL_COLOR_SUM_ARB 0x8458 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF #endif #ifndef GL_ARB_fragment_program #define GL_FRAGMENT_PROGRAM_ARB 0x8804 #define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 #define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A #define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D #define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 #endif #ifndef GL_ARB_vertex_buffer_object #define GL_BUFFER_SIZE_ARB 0x8764 #define GL_BUFFER_USAGE_ARB 0x8765 #define GL_ARRAY_BUFFER_ARB 0x8892 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F #define GL_READ_ONLY_ARB 0x88B8 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_READ_WRITE_ARB 0x88BA #define GL_BUFFER_ACCESS_ARB 0x88BB #define GL_BUFFER_MAPPED_ARB 0x88BC #define GL_BUFFER_MAP_POINTER_ARB 0x88BD #define GL_STREAM_DRAW_ARB 0x88E0 #define GL_STREAM_READ_ARB 0x88E1 #define GL_STREAM_COPY_ARB 0x88E2 #define GL_STATIC_DRAW_ARB 0x88E4 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STATIC_COPY_ARB 0x88E6 #define GL_DYNAMIC_DRAW_ARB 0x88E8 #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA #endif #ifndef GL_ARB_occlusion_query #define GL_QUERY_COUNTER_BITS_ARB 0x8864 #define GL_CURRENT_QUERY_ARB 0x8865 #define GL_QUERY_RESULT_ARB 0x8866 #define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 #define GL_SAMPLES_PASSED_ARB 0x8914 #endif #ifndef GL_ARB_shader_objects #define GL_PROGRAM_OBJECT_ARB 0x8B40 #define GL_SHADER_OBJECT_ARB 0x8B48 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_SUBTYPE_ARB 0x8B4F #define GL_FLOAT_VEC2_ARB 0x8B50 #define GL_FLOAT_VEC3_ARB 0x8B51 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_INT_VEC2_ARB 0x8B53 #define GL_INT_VEC3_ARB 0x8B54 #define GL_INT_VEC4_ARB 0x8B55 #define GL_BOOL_ARB 0x8B56 #define GL_BOOL_VEC2_ARB 0x8B57 #define GL_BOOL_VEC3_ARB 0x8B58 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_FLOAT_MAT2_ARB 0x8B5A #define GL_FLOAT_MAT3_ARB 0x8B5B #define GL_FLOAT_MAT4_ARB 0x8B5C #define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 #define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 #define GL_OBJECT_LINK_STATUS_ARB 0x8B82 #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 #define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 #define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 #define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 #endif #ifndef GL_ARB_vertex_shader #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A #endif #ifndef GL_ARB_fragment_shader #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 #endif #ifndef GL_ARB_shading_language_100 #endif #ifndef GL_ARB_texture_non_power_of_two #endif #ifndef GL_ARB_point_sprite #define GL_POINT_SPRITE_ARB 0x8861 #define GL_COORD_REPLACE_ARB 0x8862 #endif #ifndef GL_ARB_fragment_program_shadow #endif #ifndef GL_EXT_abgr #define GL_ABGR_EXT 0x8000 #endif #ifndef GL_EXT_blend_color #define GL_CONSTANT_COLOR_EXT 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 #define GL_CONSTANT_ALPHA_EXT 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 #define GL_BLEND_COLOR_EXT 0x8005 #endif #ifndef GL_EXT_polygon_offset #define GL_POLYGON_OFFSET_EXT 0x8037 #define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 #define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 #endif #ifndef GL_EXT_texture #define GL_ALPHA4_EXT 0x803B #define GL_ALPHA8_EXT 0x803C #define GL_ALPHA12_EXT 0x803D #define GL_ALPHA16_EXT 0x803E #define GL_LUMINANCE4_EXT 0x803F #define GL_LUMINANCE8_EXT 0x8040 #define GL_LUMINANCE12_EXT 0x8041 #define GL_LUMINANCE16_EXT 0x8042 #define GL_LUMINANCE4_ALPHA4_EXT 0x8043 #define GL_LUMINANCE6_ALPHA2_EXT 0x8044 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045 #define GL_LUMINANCE12_ALPHA4_EXT 0x8046 #define GL_LUMINANCE12_ALPHA12_EXT 0x8047 #define GL_LUMINANCE16_ALPHA16_EXT 0x8048 #define GL_INTENSITY_EXT 0x8049 #define GL_INTENSITY4_EXT 0x804A #define GL_INTENSITY8_EXT 0x804B #define GL_INTENSITY12_EXT 0x804C #define GL_INTENSITY16_EXT 0x804D #define GL_RGB2_EXT 0x804E #define GL_RGB4_EXT 0x804F #define GL_RGB5_EXT 0x8050 #define GL_RGB8_EXT 0x8051 #define GL_RGB10_EXT 0x8052 #define GL_RGB12_EXT 0x8053 #define GL_RGB16_EXT 0x8054 #define GL_RGBA2_EXT 0x8055 #define GL_RGBA4_EXT 0x8056 #define GL_RGB5_A1_EXT 0x8057 #define GL_RGBA8_EXT 0x8058 #define GL_RGB10_A2_EXT 0x8059 #define GL_RGBA12_EXT 0x805A #define GL_RGBA16_EXT 0x805B #define GL_TEXTURE_RED_SIZE_EXT 0x805C #define GL_TEXTURE_GREEN_SIZE_EXT 0x805D #define GL_TEXTURE_BLUE_SIZE_EXT 0x805E #define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F #define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 #define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 #define GL_REPLACE_EXT 0x8062 #define GL_PROXY_TEXTURE_1D_EXT 0x8063 #define GL_PROXY_TEXTURE_2D_EXT 0x8064 #define GL_TEXTURE_TOO_LARGE_EXT 0x8065 #endif #ifndef GL_EXT_texture3D #define GL_PACK_SKIP_IMAGES_EXT 0x806B #define GL_PACK_IMAGE_HEIGHT_EXT 0x806C #define GL_UNPACK_SKIP_IMAGES_EXT 0x806D #define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E #define GL_TEXTURE_3D_EXT 0x806F #define GL_PROXY_TEXTURE_3D_EXT 0x8070 #define GL_TEXTURE_DEPTH_EXT 0x8071 #define GL_TEXTURE_WRAP_R_EXT 0x8072 #define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 #endif #ifndef GL_SGIS_texture_filter4 #define GL_FILTER4_SGIS 0x8146 #define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 #endif #ifndef GL_EXT_subtexture #endif #ifndef GL_EXT_copy_texture #endif #ifndef GL_EXT_histogram #define GL_HISTOGRAM_EXT 0x8024 #define GL_PROXY_HISTOGRAM_EXT 0x8025 #define GL_HISTOGRAM_WIDTH_EXT 0x8026 #define GL_HISTOGRAM_FORMAT_EXT 0x8027 #define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 #define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 #define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A #define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C #define GL_HISTOGRAM_SINK_EXT 0x802D #define GL_MINMAX_EXT 0x802E #define GL_MINMAX_FORMAT_EXT 0x802F #define GL_MINMAX_SINK_EXT 0x8030 #define GL_TABLE_TOO_LARGE_EXT 0x8031 #endif #ifndef GL_EXT_convolution #define GL_CONVOLUTION_1D_EXT 0x8010 #define GL_CONVOLUTION_2D_EXT 0x8011 #define GL_SEPARABLE_2D_EXT 0x8012 #define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 #define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 #define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 #define GL_REDUCE_EXT 0x8016 #define GL_CONVOLUTION_FORMAT_EXT 0x8017 #define GL_CONVOLUTION_WIDTH_EXT 0x8018 #define GL_CONVOLUTION_HEIGHT_EXT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A #define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F #define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 #endif #ifndef GL_SGI_color_matrix #define GL_COLOR_MATRIX_SGI 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB #endif #ifndef GL_SGI_color_table #define GL_COLOR_TABLE_SGI 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 #define GL_PROXY_COLOR_TABLE_SGI 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 #define GL_COLOR_TABLE_SCALE_SGI 0x80D6 #define GL_COLOR_TABLE_BIAS_SGI 0x80D7 #define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 #define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 #define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF #endif #ifndef GL_SGIS_pixel_texture #define GL_PIXEL_TEXTURE_SGIS 0x8353 #define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 #define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 #define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 #endif #ifndef GL_SGIX_pixel_texture #define GL_PIXEL_TEX_GEN_SGIX 0x8139 #define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B #endif #ifndef GL_SGIS_texture4D #define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 #define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 #define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 #define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 #define GL_TEXTURE_4D_SGIS 0x8134 #define GL_PROXY_TEXTURE_4D_SGIS 0x8135 #define GL_TEXTURE_4DSIZE_SGIS 0x8136 #define GL_TEXTURE_WRAP_Q_SGIS 0x8137 #define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 #define GL_TEXTURE_4D_BINDING_SGIS 0x814F #endif #ifndef GL_SGI_texture_color_table #define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC #define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD #endif #ifndef GL_EXT_cmyka #define GL_CMYK_EXT 0x800C #define GL_CMYKA_EXT 0x800D #define GL_PACK_CMYK_HINT_EXT 0x800E #define GL_UNPACK_CMYK_HINT_EXT 0x800F #endif #ifndef GL_EXT_texture_object #define GL_TEXTURE_PRIORITY_EXT 0x8066 #define GL_TEXTURE_RESIDENT_EXT 0x8067 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D_BINDING_EXT 0x8069 #define GL_TEXTURE_3D_BINDING_EXT 0x806A #endif #ifndef GL_SGIS_detail_texture #define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 #define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 #define GL_LINEAR_DETAIL_SGIS 0x8097 #define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 #define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 #define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A #define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B #define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C #endif #ifndef GL_SGIS_sharpen_texture #define GL_LINEAR_SHARPEN_SGIS 0x80AD #define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE #define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF #define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 #endif #ifndef GL_EXT_packed_pixels #define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 #define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 #define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 #endif #ifndef GL_SGIS_texture_lod #define GL_TEXTURE_MIN_LOD_SGIS 0x813A #define GL_TEXTURE_MAX_LOD_SGIS 0x813B #define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C #define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D #endif #ifndef GL_SGIS_multisample #define GL_MULTISAMPLE_SGIS 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F #define GL_SAMPLE_MASK_SGIS 0x80A0 #define GL_1PASS_SGIS 0x80A1 #define GL_2PASS_0_SGIS 0x80A2 #define GL_2PASS_1_SGIS 0x80A3 #define GL_4PASS_0_SGIS 0x80A4 #define GL_4PASS_1_SGIS 0x80A5 #define GL_4PASS_2_SGIS 0x80A6 #define GL_4PASS_3_SGIS 0x80A7 #define GL_SAMPLE_BUFFERS_SGIS 0x80A8 #define GL_SAMPLES_SGIS 0x80A9 #define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA #define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB #define GL_SAMPLE_PATTERN_SGIS 0x80AC #endif #ifndef GL_EXT_rescale_normal #define GL_RESCALE_NORMAL_EXT 0x803A #endif #ifndef GL_EXT_vertex_array #define GL_VERTEX_ARRAY_EXT 0x8074 #define GL_NORMAL_ARRAY_EXT 0x8075 #define GL_COLOR_ARRAY_EXT 0x8076 #define GL_INDEX_ARRAY_EXT 0x8077 #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 #define GL_VERTEX_ARRAY_SIZE_EXT 0x807A #define GL_VERTEX_ARRAY_TYPE_EXT 0x807B #define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_COLOR_ARRAY_SIZE_EXT 0x8081 #define GL_COLOR_ARRAY_TYPE_EXT 0x8082 #define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_INDEX_ARRAY_TYPE_EXT 0x8085 #define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_VERTEX_ARRAY_POINTER_EXT 0x808E #define GL_NORMAL_ARRAY_POINTER_EXT 0x808F #define GL_COLOR_ARRAY_POINTER_EXT 0x8090 #define GL_INDEX_ARRAY_POINTER_EXT 0x8091 #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 #endif #ifndef GL_EXT_misc_attribute #endif #ifndef GL_SGIS_generate_mipmap #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #endif #ifndef GL_SGIX_clipmap #define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 #define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 #define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 #define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 #define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 #define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 #define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 #define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 #define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 #define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D #define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E #define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F #endif #ifndef GL_SGIX_shadow #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #endif #ifndef GL_SGIS_texture_edge_clamp #define GL_CLAMP_TO_EDGE_SGIS 0x812F #endif #ifndef GL_EXT_blend_minmax #define GL_FUNC_ADD_EXT 0x8006 #define GL_MIN_EXT 0x8007 #define GL_MAX_EXT 0x8008 #define GL_BLEND_EQUATION_EXT 0x8009 #endif #ifndef GL_EXT_blend_subtract #define GL_FUNC_SUBTRACT_EXT 0x800A #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #endif #ifndef GL_EXT_blend_logic_op #endif #ifndef GL_SGIX_interlace #define GL_INTERLACE_SGIX 0x8094 #endif #ifndef GL_SGIX_pixel_tiles #define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E #define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F #define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 #define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 #define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 #define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 #define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 #define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 #endif #ifndef GL_SGIS_texture_select #define GL_DUAL_ALPHA4_SGIS 0x8110 #define GL_DUAL_ALPHA8_SGIS 0x8111 #define GL_DUAL_ALPHA12_SGIS 0x8112 #define GL_DUAL_ALPHA16_SGIS 0x8113 #define GL_DUAL_LUMINANCE4_SGIS 0x8114 #define GL_DUAL_LUMINANCE8_SGIS 0x8115 #define GL_DUAL_LUMINANCE12_SGIS 0x8116 #define GL_DUAL_LUMINANCE16_SGIS 0x8117 #define GL_DUAL_INTENSITY4_SGIS 0x8118 #define GL_DUAL_INTENSITY8_SGIS 0x8119 #define GL_DUAL_INTENSITY12_SGIS 0x811A #define GL_DUAL_INTENSITY16_SGIS 0x811B #define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C #define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D #define GL_QUAD_ALPHA4_SGIS 0x811E #define GL_QUAD_ALPHA8_SGIS 0x811F #define GL_QUAD_LUMINANCE4_SGIS 0x8120 #define GL_QUAD_LUMINANCE8_SGIS 0x8121 #define GL_QUAD_INTENSITY4_SGIS 0x8122 #define GL_QUAD_INTENSITY8_SGIS 0x8123 #define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 #define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 #endif #ifndef GL_SGIX_sprite #define GL_SPRITE_SGIX 0x8148 #define GL_SPRITE_MODE_SGIX 0x8149 #define GL_SPRITE_AXIS_SGIX 0x814A #define GL_SPRITE_TRANSLATION_SGIX 0x814B #define GL_SPRITE_AXIAL_SGIX 0x814C #define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D #define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E #endif #ifndef GL_SGIX_texture_multi_buffer #define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E #endif #ifndef GL_EXT_point_parameters #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 #endif #ifndef GL_SGIS_point_parameters #define GL_POINT_SIZE_MIN_SGIS 0x8126 #define GL_POINT_SIZE_MAX_SGIS 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 #define GL_DISTANCE_ATTENUATION_SGIS 0x8129 #endif #ifndef GL_SGIX_instruments #define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 #define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 #endif #ifndef GL_SGIX_texture_scale_bias #define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 #define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A #define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B #define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C #endif #ifndef GL_SGIX_framezoom #define GL_FRAMEZOOM_SGIX 0x818B #define GL_FRAMEZOOM_FACTOR_SGIX 0x818C #define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D #endif #ifndef GL_SGIX_tag_sample_buffer #endif #ifndef GL_FfdMaskSGIX #define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 #define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 #endif #ifndef GL_SGIX_polynomial_ffd #define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 #define GL_TEXTURE_DEFORMATION_SGIX 0x8195 #define GL_DEFORMATIONS_MASK_SGIX 0x8196 #define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 #endif #ifndef GL_SGIX_reference_plane #define GL_REFERENCE_PLANE_SGIX 0x817D #define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E #endif #ifndef GL_SGIX_flush_raster #endif #ifndef GL_SGIX_depth_texture #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #endif #ifndef GL_SGIS_fog_function #define GL_FOG_FUNC_SGIS 0x812A #define GL_FOG_FUNC_POINTS_SGIS 0x812B #define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C #endif #ifndef GL_SGIX_fog_offset #define GL_FOG_OFFSET_SGIX 0x8198 #define GL_FOG_OFFSET_VALUE_SGIX 0x8199 #endif #ifndef GL_HP_image_transform #define GL_IMAGE_SCALE_X_HP 0x8155 #define GL_IMAGE_SCALE_Y_HP 0x8156 #define GL_IMAGE_TRANSLATE_X_HP 0x8157 #define GL_IMAGE_TRANSLATE_Y_HP 0x8158 #define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 #define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A #define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B #define GL_IMAGE_MAG_FILTER_HP 0x815C #define GL_IMAGE_MIN_FILTER_HP 0x815D #define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E #define GL_CUBIC_HP 0x815F #define GL_AVERAGE_HP 0x8160 #define GL_IMAGE_TRANSFORM_2D_HP 0x8161 #define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 #define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 #endif #ifndef GL_HP_convolution_border_modes #define GL_IGNORE_BORDER_HP 0x8150 #define GL_CONSTANT_BORDER_HP 0x8151 #define GL_REPLICATE_BORDER_HP 0x8153 #define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 #endif #ifndef GL_INGR_palette_buffer #endif #ifndef GL_SGIX_texture_add_env #define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE #endif #ifndef GL_EXT_color_subtable #endif #ifndef GL_PGI_vertex_hints #define GL_VERTEX_DATA_HINT_PGI 0x1A22A #define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B #define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C #define GL_MAX_VERTEX_HINT_PGI 0x1A22D #define GL_COLOR3_BIT_PGI 0x00010000 #define GL_COLOR4_BIT_PGI 0x00020000 #define GL_EDGEFLAG_BIT_PGI 0x00040000 #define GL_INDEX_BIT_PGI 0x00080000 #define GL_MAT_AMBIENT_BIT_PGI 0x00100000 #define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 #define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 #define GL_MAT_EMISSION_BIT_PGI 0x00800000 #define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 #define GL_MAT_SHININESS_BIT_PGI 0x02000000 #define GL_MAT_SPECULAR_BIT_PGI 0x04000000 #define GL_NORMAL_BIT_PGI 0x08000000 #define GL_TEXCOORD1_BIT_PGI 0x10000000 #define GL_TEXCOORD2_BIT_PGI 0x20000000 #define GL_TEXCOORD3_BIT_PGI 0x40000000 #define GL_TEXCOORD4_BIT_PGI 0x80000000 #define GL_VERTEX23_BIT_PGI 0x00000004 #define GL_VERTEX4_BIT_PGI 0x00000008 #endif #ifndef GL_PGI_misc_hints #define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 #define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD #define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE #define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 #define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 #define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 #define GL_ALWAYS_FAST_HINT_PGI 0x1A20C #define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D #define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E #define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F #define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 #define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 #define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 #define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 #define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 #define GL_FULL_STIPPLE_HINT_PGI 0x1A219 #define GL_CLIP_NEAR_HINT_PGI 0x1A220 #define GL_CLIP_FAR_HINT_PGI 0x1A221 #define GL_WIDE_LINE_HINT_PGI 0x1A222 #define GL_BACK_NORMALS_HINT_PGI 0x1A223 #endif #ifndef GL_EXT_paletted_texture #define GL_COLOR_INDEX1_EXT 0x80E2 #define GL_COLOR_INDEX2_EXT 0x80E3 #define GL_COLOR_INDEX4_EXT 0x80E4 #define GL_COLOR_INDEX8_EXT 0x80E5 #define GL_COLOR_INDEX12_EXT 0x80E6 #define GL_COLOR_INDEX16_EXT 0x80E7 #define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED #endif #ifndef GL_EXT_clip_volume_hint #define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 #endif #ifndef GL_SGIX_list_priority #define GL_LIST_PRIORITY_SGIX 0x8182 #endif #ifndef GL_SGIX_ir_instrument1 #define GL_IR_INSTRUMENT1_SGIX 0x817F #endif #ifndef GL_SGIX_calligraphic_fragment #define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 #endif #ifndef GL_SGIX_texture_lod_bias #define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E #define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F #define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 #endif #ifndef GL_SGIX_shadow_ambient #define GL_SHADOW_AMBIENT_SGIX 0x80BF #endif #ifndef GL_EXT_index_texture #endif #ifndef GL_EXT_index_material #define GL_INDEX_MATERIAL_EXT 0x81B8 #define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 #define GL_INDEX_MATERIAL_FACE_EXT 0x81BA #endif #ifndef GL_EXT_index_func #define GL_INDEX_TEST_EXT 0x81B5 #define GL_INDEX_TEST_FUNC_EXT 0x81B6 #define GL_INDEX_TEST_REF_EXT 0x81B7 #endif #ifndef GL_EXT_index_array_formats #define GL_IUI_V2F_EXT 0x81AD #define GL_IUI_V3F_EXT 0x81AE #define GL_IUI_N3F_V2F_EXT 0x81AF #define GL_IUI_N3F_V3F_EXT 0x81B0 #define GL_T2F_IUI_V2F_EXT 0x81B1 #define GL_T2F_IUI_V3F_EXT 0x81B2 #define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 #define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 #endif #ifndef GL_EXT_compiled_vertex_array #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 #endif #ifndef GL_EXT_cull_vertex #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC #endif #ifndef GL_SGIX_ycrcb #define GL_YCRCB_422_SGIX 0x81BB #define GL_YCRCB_444_SGIX 0x81BC #endif #ifndef GL_SGIX_fragment_lighting #define GL_FRAGMENT_LIGHTING_SGIX 0x8400 #define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 #define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 #define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 #define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 #define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 #define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 #define GL_LIGHT_ENV_MODE_SGIX 0x8407 #define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 #define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 #define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A #define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B #define GL_FRAGMENT_LIGHT0_SGIX 0x840C #define GL_FRAGMENT_LIGHT1_SGIX 0x840D #define GL_FRAGMENT_LIGHT2_SGIX 0x840E #define GL_FRAGMENT_LIGHT3_SGIX 0x840F #define GL_FRAGMENT_LIGHT4_SGIX 0x8410 #define GL_FRAGMENT_LIGHT5_SGIX 0x8411 #define GL_FRAGMENT_LIGHT6_SGIX 0x8412 #define GL_FRAGMENT_LIGHT7_SGIX 0x8413 #endif #ifndef GL_IBM_rasterpos_clip #define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 #endif #ifndef GL_HP_texture_lighting #define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 #define GL_TEXTURE_POST_SPECULAR_HP 0x8168 #define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 #endif #ifndef GL_EXT_draw_range_elements #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 #endif #ifndef GL_WIN_phong_shading #define GL_PHONG_WIN 0x80EA #define GL_PHONG_HINT_WIN 0x80EB #endif #ifndef GL_WIN_specular_fog #define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC #endif #ifndef GL_EXT_light_texture #define GL_FRAGMENT_MATERIAL_EXT 0x8349 #define GL_FRAGMENT_NORMAL_EXT 0x834A #define GL_FRAGMENT_COLOR_EXT 0x834C #define GL_ATTENUATION_EXT 0x834D #define GL_SHADOW_ATTENUATION_EXT 0x834E #define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F #define GL_TEXTURE_LIGHT_EXT 0x8350 #define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 #define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 /* reuse GL_FRAGMENT_DEPTH_EXT */ #endif #ifndef GL_SGIX_blend_alpha_minmax #define GL_ALPHA_MIN_SGIX 0x8320 #define GL_ALPHA_MAX_SGIX 0x8321 #endif #ifndef GL_SGIX_impact_pixel_texture #define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX 0x8184 #define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX 0x8185 #define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX 0x8186 #define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX 0x8187 #define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX 0x8188 #define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX 0x8189 #define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX 0x818A #endif #ifndef GL_EXT_bgra #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #endif #ifndef GL_SGIX_async #define GL_ASYNC_MARKER_SGIX 0x8329 #endif #ifndef GL_SGIX_async_pixel #define GL_ASYNC_TEX_IMAGE_SGIX 0x835C #define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D #define GL_ASYNC_READ_PIXELS_SGIX 0x835E #define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F #define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 #define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 #endif #ifndef GL_SGIX_async_histogram #define GL_ASYNC_HISTOGRAM_SGIX 0x832C #define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D #endif #ifndef GL_INTEL_texture_scissor #endif #ifndef GL_INTEL_parallel_arrays #define GL_PARALLEL_ARRAYS_INTEL 0x83F4 #define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 #define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 #define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 #define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 #endif #ifndef GL_HP_occlusion_test #define GL_OCCLUSION_TEST_HP 0x8165 #define GL_OCCLUSION_TEST_RESULT_HP 0x8166 #endif #ifndef GL_EXT_pixel_transform #define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 #define GL_PIXEL_MAG_FILTER_EXT 0x8331 #define GL_PIXEL_MIN_FILTER_EXT 0x8332 #define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 #define GL_CUBIC_EXT 0x8334 #define GL_AVERAGE_EXT 0x8335 #define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 #define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 #define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 #endif #ifndef GL_EXT_pixel_transform_color_table #endif #ifndef GL_EXT_shared_texture_palette #define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB #endif #ifndef GL_EXT_separate_specular_color #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #endif #ifndef GL_EXT_secondary_color #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E #endif #ifndef GL_EXT_texture_perturb_normal #define GL_PERTURB_EXT 0x85AE #define GL_TEXTURE_NORMAL_EXT 0x85AF #endif #ifndef GL_EXT_multi_draw_arrays #endif #ifndef GL_EXT_fog_coord #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 #endif #ifndef GL_REND_screen_coordinates #define GL_SCREEN_COORDINATES_REND 0x8490 #define GL_INVERTED_SCREEN_W_REND 0x8491 #endif #ifndef GL_EXT_coordinate_frame #define GL_TANGENT_ARRAY_EXT 0x8439 #define GL_BINORMAL_ARRAY_EXT 0x843A #define GL_CURRENT_TANGENT_EXT 0x843B #define GL_CURRENT_BINORMAL_EXT 0x843C #define GL_TANGENT_ARRAY_TYPE_EXT 0x843E #define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F #define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 #define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 #define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 #define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 #define GL_MAP1_TANGENT_EXT 0x8444 #define GL_MAP2_TANGENT_EXT 0x8445 #define GL_MAP1_BINORMAL_EXT 0x8446 #define GL_MAP2_BINORMAL_EXT 0x8447 #endif #ifndef GL_EXT_texture_env_combine #define GL_COMBINE_EXT 0x8570 #define GL_COMBINE_RGB_EXT 0x8571 #define GL_COMBINE_ALPHA_EXT 0x8572 #define GL_RGB_SCALE_EXT 0x8573 #define GL_ADD_SIGNED_EXT 0x8574 #define GL_INTERPOLATE_EXT 0x8575 #define GL_CONSTANT_EXT 0x8576 #define GL_PRIMARY_COLOR_EXT 0x8577 #define GL_PREVIOUS_EXT 0x8578 #define GL_SOURCE0_RGB_EXT 0x8580 #define GL_SOURCE1_RGB_EXT 0x8581 #define GL_SOURCE2_RGB_EXT 0x8582 #define GL_SOURCE0_ALPHA_EXT 0x8588 #define GL_SOURCE1_ALPHA_EXT 0x8589 #define GL_SOURCE2_ALPHA_EXT 0x858A #define GL_OPERAND0_RGB_EXT 0x8590 #define GL_OPERAND1_RGB_EXT 0x8591 #define GL_OPERAND2_RGB_EXT 0x8592 #define GL_OPERAND0_ALPHA_EXT 0x8598 #define GL_OPERAND1_ALPHA_EXT 0x8599 #define GL_OPERAND2_ALPHA_EXT 0x859A #endif #ifndef GL_APPLE_specular_vector #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 #endif #ifndef GL_APPLE_transform_hint #define GL_TRANSFORM_HINT_APPLE 0x85B1 #endif #ifndef GL_SGIX_fog_scale #define GL_FOG_SCALE_SGIX 0x81FC #define GL_FOG_SCALE_VALUE_SGIX 0x81FD #endif #ifndef GL_SUNX_constant_data #define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 #define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 #endif #ifndef GL_SUN_global_alpha #define GL_GLOBAL_ALPHA_SUN 0x81D9 #define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA #endif #ifndef GL_SUN_triangle_list #define GL_RESTART_SUN 0x0001 #define GL_REPLACE_MIDDLE_SUN 0x0002 #define GL_REPLACE_OLDEST_SUN 0x0003 #define GL_TRIANGLE_LIST_SUN 0x81D7 #define GL_REPLACEMENT_CODE_SUN 0x81D8 #define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 #define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 #define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 #define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 #define GL_R1UI_V3F_SUN 0x85C4 #define GL_R1UI_C4UB_V3F_SUN 0x85C5 #define GL_R1UI_C3F_V3F_SUN 0x85C6 #define GL_R1UI_N3F_V3F_SUN 0x85C7 #define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 #define GL_R1UI_T2F_V3F_SUN 0x85C9 #define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA #define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB #endif #ifndef GL_SUN_vertex #endif #ifndef GL_EXT_blend_func_separate #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB #endif #ifndef GL_INGR_color_clamp #define GL_RED_MIN_CLAMP_INGR 0x8560 #define GL_GREEN_MIN_CLAMP_INGR 0x8561 #define GL_BLUE_MIN_CLAMP_INGR 0x8562 #define GL_ALPHA_MIN_CLAMP_INGR 0x8563 #define GL_RED_MAX_CLAMP_INGR 0x8564 #define GL_GREEN_MAX_CLAMP_INGR 0x8565 #define GL_BLUE_MAX_CLAMP_INGR 0x8566 #define GL_ALPHA_MAX_CLAMP_INGR 0x8567 #endif #ifndef GL_INGR_interlace_read #define GL_INTERLACE_READ_INGR 0x8568 #endif #ifndef GL_EXT_stencil_wrap #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #endif #ifndef GL_EXT_422_pixels #define GL_422_EXT 0x80CC #define GL_422_REV_EXT 0x80CD #define GL_422_AVERAGE_EXT 0x80CE #define GL_422_REV_AVERAGE_EXT 0x80CF #endif #ifndef GL_NV_texgen_reflection #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #endif #ifndef GL_EXT_texture_cube_map #define GL_NORMAL_MAP_EXT 0x8511 #define GL_REFLECTION_MAP_EXT 0x8512 #define GL_TEXTURE_CUBE_MAP_EXT 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C #endif #ifndef GL_SUN_convolution_border_modes #define GL_WRAP_BORDER_SUN 0x81D4 #endif #ifndef GL_EXT_texture_env_add #endif #ifndef GL_EXT_texture_lod_bias #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #endif #ifndef GL_EXT_texture_filter_anisotropic #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #endif #ifndef GL_EXT_vertex_weighting #define GL_MODELVIEW0_STACK_DEPTH_EXT GL_MODELVIEW_STACK_DEPTH #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW0_MATRIX_EXT GL_MODELVIEW_MATRIX #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW0_EXT GL_MODELVIEW #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 #endif #ifndef GL_NV_light_max_exponent #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif #ifndef GL_NV_vertex_array_range #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 #endif #ifndef GL_NV_register_combiners #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_DISCARD_NV 0x8530 #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_MAX_GENERAL_COMBINERS_NV 0x854D #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 /* reuse GL_TEXTURE0_ARB */ /* reuse GL_TEXTURE1_ARB */ /* reuse GL_ZERO */ /* reuse GL_NONE */ /* reuse GL_FOG */ #endif #ifndef GL_NV_fog_distance #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C /* reuse GL_EYE_PLANE */ #endif #ifndef GL_NV_texgen_emboss #define GL_EMBOSS_LIGHT_NV 0x855D #define GL_EMBOSS_CONSTANT_NV 0x855E #define GL_EMBOSS_MAP_NV 0x855F #endif #ifndef GL_NV_blend_square #endif #ifndef GL_NV_texture_env_combine4 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #endif #ifndef GL_MESA_resize_buffers #endif #ifndef GL_MESA_window_pos #endif #ifndef GL_EXT_texture_compression_s3tc #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #endif #ifndef GL_IBM_cull_vertex #define GL_CULL_VERTEX_IBM 103050 #endif #ifndef GL_IBM_multimode_draw_arrays #endif #ifndef GL_IBM_vertex_array_lists #define GL_VERTEX_ARRAY_LIST_IBM 103070 #define GL_NORMAL_ARRAY_LIST_IBM 103071 #define GL_COLOR_ARRAY_LIST_IBM 103072 #define GL_INDEX_ARRAY_LIST_IBM 103073 #define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 #define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 #define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 #define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 #define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 #define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 #define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 #define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 #define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 #define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 #define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 #define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 #endif #ifndef GL_SGIX_subsample #define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 #define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 #define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 #define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 #define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 #endif #ifndef GL_SGIX_ycrcb_subsample #endif #ifndef GL_SGIX_ycrcba #define GL_YCRCB_SGIX 0x8318 #define GL_YCRCBA_SGIX 0x8319 #endif #ifndef GL_SGI_depth_pass_instrument #define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 #define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 #define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 #endif #ifndef GL_3DFX_texture_compression_FXT1 #define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 #define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 #endif #ifndef GL_3DFX_multisample #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 #endif #ifndef GL_3DFX_tbuffer #endif #ifndef GL_EXT_multisample #define GL_MULTISAMPLE_EXT 0x809D #define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #define GL_SAMPLE_MASK_EXT 0x80A0 #define GL_1PASS_EXT 0x80A1 #define GL_2PASS_0_EXT 0x80A2 #define GL_2PASS_1_EXT 0x80A3 #define GL_4PASS_0_EXT 0x80A4 #define GL_4PASS_1_EXT 0x80A5 #define GL_4PASS_2_EXT 0x80A6 #define GL_4PASS_3_EXT 0x80A7 #define GL_SAMPLE_BUFFERS_EXT 0x80A8 #define GL_SAMPLES_EXT 0x80A9 #define GL_SAMPLE_MASK_VALUE_EXT 0x80AA #define GL_SAMPLE_MASK_INVERT_EXT 0x80AB #define GL_SAMPLE_PATTERN_EXT 0x80AC #define GL_MULTISAMPLE_BIT_EXT 0x20000000 #endif #ifndef GL_SGIX_vertex_preclip #define GL_VERTEX_PRECLIP_SGIX 0x83EE #define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF #endif #ifndef GL_SGIX_convolution_accuracy #define GL_CONVOLUTION_HINT_SGIX 0x8316 #endif #ifndef GL_SGIX_resample #define GL_PACK_RESAMPLE_SGIX 0x842C #define GL_UNPACK_RESAMPLE_SGIX 0x842D #define GL_RESAMPLE_REPLICATE_SGIX 0x842E #define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F #define GL_RESAMPLE_DECIMATE_SGIX 0x8430 #endif #ifndef GL_SGIS_point_line_texgen #define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 #define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 #define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 #define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 #define GL_EYE_POINT_SGIS 0x81F4 #define GL_OBJECT_POINT_SGIS 0x81F5 #define GL_EYE_LINE_SGIS 0x81F6 #define GL_OBJECT_LINE_SGIS 0x81F7 #endif #ifndef GL_SGIS_texture_color_mask #define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF #endif #ifndef GL_EXT_texture_env_dot3 #define GL_DOT3_RGB_EXT 0x8740 #define GL_DOT3_RGBA_EXT 0x8741 #endif #ifndef GL_ATI_texture_mirror_once #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #endif #ifndef GL_NV_fence #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 #endif #ifndef GL_IBM_texture_mirrored_repeat #define GL_MIRRORED_REPEAT_IBM 0x8370 #endif #ifndef GL_NV_evaluators #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 #endif #ifndef GL_NV_packed_depth_stencil #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #endif #ifndef GL_NV_register_combiners2 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 #endif #ifndef GL_NV_texture_compression_vtc #endif #ifndef GL_NV_texture_rectangle #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #endif #ifndef GL_NV_texture_shader #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV #define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV #define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #endif #ifndef GL_NV_texture_shader2 #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #endif #ifndef GL_NV_vertex_array_range2 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #endif #ifndef GL_NV_vertex_program #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F #endif #ifndef GL_SGIX_texture_coordinate_clamp #define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 #define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A #define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B #endif #ifndef GL_SGIX_scalebias_hint #define GL_SCALEBIAS_HINT_SGIX 0x8322 #endif #ifndef GL_OML_interlace #define GL_INTERLACE_OML 0x8980 #define GL_INTERLACE_READ_OML 0x8981 #endif #ifndef GL_OML_subsample #define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 #define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 #endif #ifndef GL_OML_resample #define GL_PACK_RESAMPLE_OML 0x8984 #define GL_UNPACK_RESAMPLE_OML 0x8985 #define GL_RESAMPLE_REPLICATE_OML 0x8986 #define GL_RESAMPLE_ZERO_FILL_OML 0x8987 #define GL_RESAMPLE_AVERAGE_OML 0x8988 #define GL_RESAMPLE_DECIMATE_OML 0x8989 #endif #ifndef GL_NV_copy_depth_to_color #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #endif #ifndef GL_ATI_envmap_bumpmap #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C #endif #ifndef GL_ATI_fragment_shader #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_REG_6_ATI 0x8927 #define GL_REG_7_ATI 0x8928 #define GL_REG_8_ATI 0x8929 #define GL_REG_9_ATI 0x892A #define GL_REG_10_ATI 0x892B #define GL_REG_11_ATI 0x892C #define GL_REG_12_ATI 0x892D #define GL_REG_13_ATI 0x892E #define GL_REG_14_ATI 0x892F #define GL_REG_15_ATI 0x8930 #define GL_REG_16_ATI 0x8931 #define GL_REG_17_ATI 0x8932 #define GL_REG_18_ATI 0x8933 #define GL_REG_19_ATI 0x8934 #define GL_REG_20_ATI 0x8935 #define GL_REG_21_ATI 0x8936 #define GL_REG_22_ATI 0x8937 #define GL_REG_23_ATI 0x8938 #define GL_REG_24_ATI 0x8939 #define GL_REG_25_ATI 0x893A #define GL_REG_26_ATI 0x893B #define GL_REG_27_ATI 0x893C #define GL_REG_28_ATI 0x893D #define GL_REG_29_ATI 0x893E #define GL_REG_30_ATI 0x893F #define GL_REG_31_ATI 0x8940 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_CON_8_ATI 0x8949 #define GL_CON_9_ATI 0x894A #define GL_CON_10_ATI 0x894B #define GL_CON_11_ATI 0x894C #define GL_CON_12_ATI 0x894D #define GL_CON_13_ATI 0x894E #define GL_CON_14_ATI 0x894F #define GL_CON_15_ATI 0x8950 #define GL_CON_16_ATI 0x8951 #define GL_CON_17_ATI 0x8952 #define GL_CON_18_ATI 0x8953 #define GL_CON_19_ATI 0x8954 #define GL_CON_20_ATI 0x8955 #define GL_CON_21_ATI 0x8956 #define GL_CON_22_ATI 0x8957 #define GL_CON_23_ATI 0x8958 #define GL_CON_24_ATI 0x8959 #define GL_CON_25_ATI 0x895A #define GL_CON_26_ATI 0x895B #define GL_CON_27_ATI 0x895C #define GL_CON_28_ATI 0x895D #define GL_CON_29_ATI 0x895E #define GL_CON_30_ATI 0x895F #define GL_CON_31_ATI 0x8960 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B #define GL_RED_BIT_ATI 0x00000001 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_2X_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_COMP_BIT_ATI 0x00000002 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 #endif #ifndef GL_ATI_pn_triangles #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 #endif #ifndef GL_ATI_vertex_array_object #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 #endif #ifndef GL_EXT_vertex_shader #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED #endif #ifndef GL_ATI_vertex_streams #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_STREAM0_ATI 0x876C #define GL_VERTEX_STREAM1_ATI 0x876D #define GL_VERTEX_STREAM2_ATI 0x876E #define GL_VERTEX_STREAM3_ATI 0x876F #define GL_VERTEX_STREAM4_ATI 0x8770 #define GL_VERTEX_STREAM5_ATI 0x8771 #define GL_VERTEX_STREAM6_ATI 0x8772 #define GL_VERTEX_STREAM7_ATI 0x8773 #define GL_VERTEX_SOURCE_ATI 0x8774 #endif #ifndef GL_ATI_element_array #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A #endif #ifndef GL_SUN_mesh_array #define GL_QUAD_MESH_SUN 0x8614 #define GL_TRIANGLE_MESH_SUN 0x8615 #endif #ifndef GL_SUN_slice_accum #define GL_SLICE_ACCUM_SUN 0x85CC #endif #ifndef GL_NV_multisample_filter_hint #define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 #endif #ifndef GL_NV_depth_clamp #define GL_DEPTH_CLAMP_NV 0x864F #endif #ifndef GL_NV_occlusion_query #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 #endif #ifndef GL_NV_point_sprite #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 #endif #ifndef GL_NV_texture_shader3 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #endif #ifndef GL_NV_vertex_program1_1 #endif #ifndef GL_EXT_shadow_funcs #endif #ifndef GL_EXT_stencil_two_side #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 #endif #ifndef GL_ATI_text_fragment_shader #define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 #endif #ifndef GL_APPLE_client_storage #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 #endif #ifndef GL_APPLE_element_array #define GL_ELEMENT_ARRAY_APPLE 0x8768 #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769 #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A #endif #ifndef GL_APPLE_fence #define GL_DRAW_PIXELS_APPLE 0x8A0A #define GL_FENCE_APPLE 0x8A0B #endif #ifndef GL_APPLE_vertex_array_object #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 #endif #ifndef GL_APPLE_vertex_array_range #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 #define GL_STORAGE_CACHED_APPLE 0x85BE #define GL_STORAGE_SHARED_APPLE 0x85BF #endif #ifndef GL_APPLE_ycbcr_422 #define GL_YCBCR_422_APPLE 0x85B9 #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB #endif #ifndef GL_S3_s3tc #define GL_RGB_S3TC 0x83A0 #define GL_RGB4_S3TC 0x83A1 #define GL_RGBA_S3TC 0x83A2 #define GL_RGBA4_S3TC 0x83A3 #endif #ifndef GL_ATI_draw_buffers #define GL_MAX_DRAW_BUFFERS_ATI 0x8824 #define GL_DRAW_BUFFER0_ATI 0x8825 #define GL_DRAW_BUFFER1_ATI 0x8826 #define GL_DRAW_BUFFER2_ATI 0x8827 #define GL_DRAW_BUFFER3_ATI 0x8828 #define GL_DRAW_BUFFER4_ATI 0x8829 #define GL_DRAW_BUFFER5_ATI 0x882A #define GL_DRAW_BUFFER6_ATI 0x882B #define GL_DRAW_BUFFER7_ATI 0x882C #define GL_DRAW_BUFFER8_ATI 0x882D #define GL_DRAW_BUFFER9_ATI 0x882E #define GL_DRAW_BUFFER10_ATI 0x882F #define GL_DRAW_BUFFER11_ATI 0x8830 #define GL_DRAW_BUFFER12_ATI 0x8831 #define GL_DRAW_BUFFER13_ATI 0x8832 #define GL_DRAW_BUFFER14_ATI 0x8833 #define GL_DRAW_BUFFER15_ATI 0x8834 #endif #ifndef GL_ATI_texture_env_combine3 #define GL_MODULATE_ADD_ATI 0x8744 #define GL_MODULATE_SIGNED_ADD_ATI 0x8745 #define GL_MODULATE_SUBTRACT_ATI 0x8746 #endif #ifndef GL_ATI_texture_float #define GL_RGBA_FLOAT32_ATI 0x8814 #define GL_RGB_FLOAT32_ATI 0x8815 #define GL_ALPHA_FLOAT32_ATI 0x8816 #define GL_INTENSITY_FLOAT32_ATI 0x8817 #define GL_LUMINANCE_FLOAT32_ATI 0x8818 #define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 #define GL_RGBA_FLOAT16_ATI 0x881A #define GL_RGB_FLOAT16_ATI 0x881B #define GL_ALPHA_FLOAT16_ATI 0x881C #define GL_INTENSITY_FLOAT16_ATI 0x881D #define GL_LUMINANCE_FLOAT16_ATI 0x881E #define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F #endif #ifndef GL_NV_float_buffer #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #endif #ifndef GL_NV_fragment_program #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 #endif #ifndef GL_NV_half_float #define GL_HALF_FLOAT_NV 0x140B #endif #ifndef GL_NV_pixel_data_range #define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 #define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 #define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A #define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B #define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C #define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D #endif #ifndef GL_NV_primitive_restart #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 #endif #ifndef GL_NV_texture_expand_normal #define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F #endif #ifndef GL_NV_vertex_program2 #endif #ifndef GL_ATI_map_object_buffer #endif #ifndef GL_ATI_separate_stencil #define GL_STENCIL_BACK_FUNC_ATI 0x8800 #define GL_STENCIL_BACK_FAIL_ATI 0x8801 #define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 #define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 #endif #ifndef GL_ATI_vertex_attrib_array_object #endif #ifndef GL_EXT_depth_bounds_test #define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 #define GL_DEPTH_BOUNDS_EXT 0x8891 #endif #ifndef GL_EXT_texture_mirror_clamp #define GL_MIRROR_CLAMP_EXT 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 #define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 #endif #ifndef GL_EXT_blend_equation_separate #define GL_BLEND_EQUATION_RGB_EXT GL_BLEND_EQUATION #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D #endif #ifndef GL_MESA_pack_invert #define GL_PACK_INVERT_MESA 0x8758 #endif #ifndef GL_MESA_ycbcr_texture #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA #define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB #define GL_YCBCR_MESA 0x8757 #endif /*************************************************************/ #include #ifndef GL_VERSION_1_5 /* GL types for handling large vertex buffer objects */ typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; #endif #ifndef GL_ARB_vertex_buffer_object /* GL types for handling large vertex buffer objects */ typedef ptrdiff_t GLintptrARB; typedef ptrdiff_t GLsizeiptrARB; #endif #ifndef GL_ARB_shader_objects /* GL types for handling shader object handles and characters */ typedef char GLcharARB; /* native character */ typedef unsigned int GLhandleARB; /* shader object handle */ #endif #ifndef GL_NV_half_float /* GL type for representing NVIDIA "half" floating point type in host memory */ typedef unsigned short GLhalfNV; #endif #ifndef GL_VERSION_1_2 #define GL_VERSION_1_2 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendColor (GLclampf, GLclampf, GLclampf, GLclampf); GLAPI void APIENTRY glBlendEquation (GLenum); GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); GLAPI void APIENTRY glColorTable (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glColorTableParameterfv (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glColorTableParameteriv (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glCopyColorTable (GLenum, GLenum, GLint, GLint, GLsizei); GLAPI void APIENTRY glGetColorTable (GLenum, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetColorTableParameterfv (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetColorTableParameteriv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glColorSubTable (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glCopyColorSubTable (GLenum, GLsizei, GLint, GLint, GLsizei); GLAPI void APIENTRY glConvolutionFilter1D (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glConvolutionFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glConvolutionParameterf (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glConvolutionParameterfv (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glConvolutionParameteri (GLenum, GLenum, GLint); GLAPI void APIENTRY glConvolutionParameteriv (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum, GLenum, GLint, GLint, GLsizei); GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); GLAPI void APIENTRY glGetConvolutionFilter (GLenum, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetSeparableFilter (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); GLAPI void APIENTRY glSeparableFilter2D (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); GLAPI void APIENTRY glGetHistogram (GLenum, GLboolean, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetHistogramParameterfv (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetHistogramParameteriv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetMinmax (GLenum, GLboolean, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glHistogram (GLenum, GLsizei, GLenum, GLboolean); GLAPI void APIENTRY glMinmax (GLenum, GLenum, GLboolean); GLAPI void APIENTRY glResetHistogram (GLenum); GLAPI void APIENTRY glResetMinmax (GLenum); GLAPI void APIENTRY glTexImage3D (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glCopyTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTexture (GLenum); GLAPI void APIENTRY glClientActiveTexture (GLenum); GLAPI void APIENTRY glMultiTexCoord1d (GLenum, GLdouble); GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord1f (GLenum, GLfloat); GLAPI void APIENTRY glMultiTexCoord1fv (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord1i (GLenum, GLint); GLAPI void APIENTRY glMultiTexCoord1iv (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord1s (GLenum, GLshort); GLAPI void APIENTRY glMultiTexCoord1sv (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord2d (GLenum, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord2dv (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord2f (GLenum, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord2fv (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord2i (GLenum, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord2iv (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord2s (GLenum, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord2sv (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord3d (GLenum, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord3dv (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord3f (GLenum, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord3fv (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord3i (GLenum, GLint, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord3iv (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord3s (GLenum, GLshort, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord3sv (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord4d (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord4dv (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord4f (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord4fv (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord4i (GLenum, GLint, GLint, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord4iv (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord4s (GLenum, GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord4sv (GLenum, const GLshort *); GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *); GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *); GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *); GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *); GLAPI void APIENTRY glSampleCoverage (GLclampf, GLboolean); GLAPI void APIENTRY glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glGetCompressedTexImage (GLenum, GLint, GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); #endif #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparate (GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glFogCoordf (GLfloat); GLAPI void APIENTRY glFogCoordfv (const GLfloat *); GLAPI void APIENTRY glFogCoordd (GLdouble); GLAPI void APIENTRY glFogCoorddv (const GLdouble *); GLAPI void APIENTRY glFogCoordPointer (GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glMultiDrawArrays (GLenum, GLint *, GLsizei *, GLsizei); GLAPI void APIENTRY glMultiDrawElements (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); GLAPI void APIENTRY glPointParameterf (GLenum, GLfloat); GLAPI void APIENTRY glPointParameterfv (GLenum, const GLfloat *); GLAPI void APIENTRY glPointParameteri (GLenum, GLint); GLAPI void APIENTRY glPointParameteriv (GLenum, const GLint *); GLAPI void APIENTRY glSecondaryColor3b (GLbyte, GLbyte, GLbyte); GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *); GLAPI void APIENTRY glSecondaryColor3d (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *); GLAPI void APIENTRY glSecondaryColor3f (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *); GLAPI void APIENTRY glSecondaryColor3i (GLint, GLint, GLint); GLAPI void APIENTRY glSecondaryColor3iv (const GLint *); GLAPI void APIENTRY glSecondaryColor3s (GLshort, GLshort, GLshort); GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *); GLAPI void APIENTRY glSecondaryColor3ub (GLubyte, GLubyte, GLubyte); GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *); GLAPI void APIENTRY glSecondaryColor3ui (GLuint, GLuint, GLuint); GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *); GLAPI void APIENTRY glSecondaryColor3us (GLushort, GLushort, GLushort); GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *); GLAPI void APIENTRY glSecondaryColorPointer (GLint, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glWindowPos2d (GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos2dv (const GLdouble *); GLAPI void APIENTRY glWindowPos2f (GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos2fv (const GLfloat *); GLAPI void APIENTRY glWindowPos2i (GLint, GLint); GLAPI void APIENTRY glWindowPos2iv (const GLint *); GLAPI void APIENTRY glWindowPos2s (GLshort, GLshort); GLAPI void APIENTRY glWindowPos2sv (const GLshort *); GLAPI void APIENTRY glWindowPos3d (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos3dv (const GLdouble *); GLAPI void APIENTRY glWindowPos3f (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos3fv (const GLfloat *); GLAPI void APIENTRY glWindowPos3i (GLint, GLint, GLint); GLAPI void APIENTRY glWindowPos3iv (const GLint *); GLAPI void APIENTRY glWindowPos3s (GLshort, GLshort, GLshort); GLAPI void APIENTRY glWindowPos3sv (const GLshort *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); #endif #ifndef GL_VERSION_1_5 #define GL_VERSION_1_5 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenQueries (GLsizei, GLuint *); GLAPI void APIENTRY glDeleteQueries (GLsizei, const GLuint *); GLAPI GLboolean APIENTRY glIsQuery (GLuint); GLAPI void APIENTRY glBeginQuery (GLenum, GLuint); GLAPI void APIENTRY glEndQuery (GLenum); GLAPI void APIENTRY glGetQueryiv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetQueryObjectiv (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetQueryObjectuiv (GLuint, GLenum, GLuint *); GLAPI void APIENTRY glBindBuffer (GLenum, GLuint); GLAPI void APIENTRY glDeleteBuffers (GLsizei, const GLuint *); GLAPI void APIENTRY glGenBuffers (GLsizei, GLuint *); GLAPI GLboolean APIENTRY glIsBuffer (GLuint); GLAPI void APIENTRY glBufferData (GLenum, GLsizeiptr, const GLvoid *, GLenum); GLAPI void APIENTRY glBufferSubData (GLenum, GLintptr, GLsizeiptr, const GLvoid *); GLAPI void APIENTRY glGetBufferSubData (GLenum, GLintptr, GLsizeiptr, GLvoid *); GLAPI GLvoid* APIENTRY glMapBuffer (GLenum, GLenum); GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum); GLAPI void APIENTRY glGetBufferParameteriv (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetBufferPointerv (GLenum, GLenum, GLvoid* *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); #endif #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveTextureARB (GLenum); GLAPI void APIENTRY glClientActiveTextureARB (GLenum); GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum, GLdouble); GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum, GLfloat); GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum, GLint); GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum, GLshort); GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum, GLint, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum, GLshort, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum, const GLshort *); GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum, const GLdouble *); GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum, const GLfloat *); GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum, GLint, GLint, GLint, GLint); GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum, const GLint *); GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum, GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum, const GLshort *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); #endif #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *); GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *); GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *); GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); #endif #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleCoverageARB (GLclampf, GLboolean); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); #endif #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #endif #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #endif #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum, GLint, GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); #endif #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #endif #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfARB (GLenum, GLfloat); GLAPI void APIENTRY glPointParameterfvARB (GLenum, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); #endif #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWeightbvARB (GLint, const GLbyte *); GLAPI void APIENTRY glWeightsvARB (GLint, const GLshort *); GLAPI void APIENTRY glWeightivARB (GLint, const GLint *); GLAPI void APIENTRY glWeightfvARB (GLint, const GLfloat *); GLAPI void APIENTRY glWeightdvARB (GLint, const GLdouble *); GLAPI void APIENTRY glWeightubvARB (GLint, const GLubyte *); GLAPI void APIENTRY glWeightusvARB (GLint, const GLushort *); GLAPI void APIENTRY glWeightuivARB (GLint, const GLuint *); GLAPI void APIENTRY glWeightPointerARB (GLint, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glVertexBlendARB (GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); #endif #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint); GLAPI void APIENTRY glMatrixIndexubvARB (GLint, const GLubyte *); GLAPI void APIENTRY glMatrixIndexusvARB (GLint, const GLushort *); GLAPI void APIENTRY glMatrixIndexuivARB (GLint, const GLuint *); GLAPI void APIENTRY glMatrixIndexPointerARB (GLint, GLenum, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #endif #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #endif #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #endif #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #endif #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #endif #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #endif #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #endif #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWindowPos2dARB (GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *); GLAPI void APIENTRY glWindowPos2fARB (GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *); GLAPI void APIENTRY glWindowPos2iARB (GLint, GLint); GLAPI void APIENTRY glWindowPos2ivARB (const GLint *); GLAPI void APIENTRY glWindowPos2sARB (GLshort, GLshort); GLAPI void APIENTRY glWindowPos2svARB (const GLshort *); GLAPI void APIENTRY glWindowPos3dARB (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *); GLAPI void APIENTRY glWindowPos3fARB (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *); GLAPI void APIENTRY glWindowPos3iARB (GLint, GLint, GLint); GLAPI void APIENTRY glWindowPos3ivARB (const GLint *); GLAPI void APIENTRY glWindowPos3sARB (GLshort, GLshort, GLshort); GLAPI void APIENTRY glWindowPos3svARB (const GLshort *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); #endif #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttrib1dARB (GLuint, GLdouble); GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib1fARB (GLuint, GLfloat); GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib1sARB (GLuint, GLshort); GLAPI void APIENTRY glVertexAttrib1svARB (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib2dARB (GLuint, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib2fARB (GLuint, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib2sARB (GLuint, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib2svARB (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib3dARB (GLuint, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib3fARB (GLuint, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib3sARB (GLuint, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib3svARB (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint, const GLbyte *); GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint, const GLint *); GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint, const GLubyte *); GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint, const GLuint *); GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint, const GLushort *); GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint, const GLbyte *); GLAPI void APIENTRY glVertexAttrib4dARB (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib4fARB (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint, const GLint *); GLAPI void APIENTRY glVertexAttrib4sARB (GLuint, GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib4svARB (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint, const GLubyte *); GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint, const GLuint *); GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint, const GLushort *); GLAPI void APIENTRY glVertexAttribPointerARB (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid *); GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint); GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint); GLAPI void APIENTRY glProgramStringARB (GLenum, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glBindProgramARB (GLenum, GLuint); GLAPI void APIENTRY glDeleteProgramsARB (GLsizei, const GLuint *); GLAPI void APIENTRY glGenProgramsARB (GLsizei, GLuint *); GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum, GLuint, const GLdouble *); GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum, GLuint, const GLfloat *); GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum, GLuint, const GLdouble *); GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum, GLuint, const GLfloat *); GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum, GLuint, GLdouble *); GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum, GLuint, GLfloat *); GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum, GLuint, GLdouble *); GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum, GLuint, GLfloat *); GLAPI void APIENTRY glGetProgramivARB (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetProgramStringARB (GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint, GLenum, GLdouble *); GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetVertexAttribivARB (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint, GLenum, GLvoid* *); GLAPI GLboolean APIENTRY glIsProgramARB (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); #endif #ifndef GL_ARB_fragment_program #define GL_ARB_fragment_program 1 /* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ #endif #ifndef GL_ARB_vertex_buffer_object #define GL_ARB_vertex_buffer_object 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindBufferARB (GLenum, GLuint); GLAPI void APIENTRY glDeleteBuffersARB (GLsizei, const GLuint *); GLAPI void APIENTRY glGenBuffersARB (GLsizei, GLuint *); GLAPI GLboolean APIENTRY glIsBufferARB (GLuint); GLAPI void APIENTRY glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum); GLAPI void APIENTRY glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *); GLAPI void APIENTRY glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *); GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum, GLenum); GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum); GLAPI void APIENTRY glGetBufferParameterivARB (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); #endif #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenQueriesARB (GLsizei, GLuint *); GLAPI void APIENTRY glDeleteQueriesARB (GLsizei, const GLuint *); GLAPI GLboolean APIENTRY glIsQueryARB (GLuint); GLAPI void APIENTRY glBeginQueryARB (GLenum, GLuint); GLAPI void APIENTRY glEndQueryARB (GLenum); GLAPI void APIENTRY glGetQueryivARB (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetQueryObjectivARB (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint, GLenum, GLuint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); #endif #ifndef GL_ARB_shader_objects #define GL_ARB_shader_objects 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB); GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum); GLAPI void APIENTRY glDetachObjectARB (GLhandleARB, GLhandleARB); GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum); GLAPI void APIENTRY glShaderSourceARB (GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); GLAPI void APIENTRY glCompileShaderARB (GLhandleARB); GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); GLAPI void APIENTRY glAttachObjectARB (GLhandleARB, GLhandleARB); GLAPI void APIENTRY glLinkProgramARB (GLhandleARB); GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB); GLAPI void APIENTRY glValidateProgramARB (GLhandleARB); GLAPI void APIENTRY glUniform1fARB (GLint, GLfloat); GLAPI void APIENTRY glUniform2fARB (GLint, GLfloat, GLfloat); GLAPI void APIENTRY glUniform3fARB (GLint, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glUniform4fARB (GLint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glUniform1iARB (GLint, GLint); GLAPI void APIENTRY glUniform2iARB (GLint, GLint, GLint); GLAPI void APIENTRY glUniform3iARB (GLint, GLint, GLint, GLint); GLAPI void APIENTRY glUniform4iARB (GLint, GLint, GLint, GLint, GLint); GLAPI void APIENTRY glUniform1fvARB (GLint, GLsizei, const GLfloat *); GLAPI void APIENTRY glUniform2fvARB (GLint, GLsizei, const GLfloat *); GLAPI void APIENTRY glUniform3fvARB (GLint, GLsizei, const GLfloat *); GLAPI void APIENTRY glUniform4fvARB (GLint, GLsizei, const GLfloat *); GLAPI void APIENTRY glUniform1ivARB (GLint, GLsizei, const GLint *); GLAPI void APIENTRY glUniform2ivARB (GLint, GLsizei, const GLint *); GLAPI void APIENTRY glUniform3ivARB (GLint, GLsizei, const GLint *); GLAPI void APIENTRY glUniform4ivARB (GLint, GLsizei, const GLint *); GLAPI void APIENTRY glUniformMatrix2fvARB (GLint, GLsizei, GLboolean, const GLfloat *); GLAPI void APIENTRY glUniformMatrix3fvARB (GLint, GLsizei, GLboolean, const GLfloat *); GLAPI void APIENTRY glUniformMatrix4fvARB (GLint, GLsizei, GLboolean, const GLfloat *); GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB, GLenum, GLfloat *); GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB, GLenum, GLint *); GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB, GLsizei, GLsizei *, GLhandleARB *); GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB, const GLcharARB *); GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB, GLint, GLfloat *); GLAPI void APIENTRY glGetUniformivARB (GLhandleARB, GLint, GLint *); GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB, GLsizei, GLsizei *, GLcharARB *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); #endif #ifndef GL_ARB_vertex_shader #define GL_ARB_vertex_shader 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB, GLuint, const GLcharARB *); GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLcharARB *); GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB, const GLcharARB *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); #endif #ifndef GL_ARB_fragment_shader #define GL_ARB_fragment_shader 1 #endif #ifndef GL_ARB_shading_language_100 #define GL_ARB_shading_language_100 1 #endif #ifndef GL_ARB_texture_non_power_of_two #define GL_ARB_texture_non_power_of_two 1 #endif #ifndef GL_ARB_point_sprite #define GL_ARB_point_sprite 1 #endif #ifndef GL_ARB_fragment_program_shadow #define GL_ARB_fragment_program_shadow 1 #endif #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #endif #ifndef GL_EXT_blend_color #define GL_EXT_blend_color 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendColorEXT (GLclampf, GLclampf, GLclampf, GLclampf); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); #endif #ifndef GL_EXT_polygon_offset #define GL_EXT_polygon_offset 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat, GLfloat); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); #endif #ifndef GL_EXT_texture #define GL_EXT_texture 1 #endif #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexImage3DEXT (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); #endif #ifndef GL_SGIS_texture_filter4 #define GL_SGIS_texture_filter4 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum, GLenum, GLsizei, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif #ifndef GL_EXT_subtexture #define GL_EXT_subtexture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexSubImage1DEXT (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); #endif #ifndef GL_EXT_copy_texture #define GL_EXT_copy_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum, GLint, GLint, GLint, GLint, GLsizei); GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif #ifndef GL_EXT_histogram #define GL_EXT_histogram 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetHistogramEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetMinmaxEXT (GLenum, GLboolean, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum, GLenum, GLint *); GLAPI void APIENTRY glHistogramEXT (GLenum, GLsizei, GLenum, GLboolean); GLAPI void APIENTRY glMinmaxEXT (GLenum, GLenum, GLboolean); GLAPI void APIENTRY glResetHistogramEXT (GLenum); GLAPI void APIENTRY glResetMinmaxEXT (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); #endif #ifndef GL_EXT_convolution #define GL_EXT_convolution 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum, GLenum, GLint); GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum, GLenum, GLint, GLint, GLsizei); GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum, GLenum, GLenum, GLvoid *, GLvoid *, GLvoid *); GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); #endif #ifndef GL_EXT_color_matrix #define GL_EXT_color_matrix 1 #endif #ifndef GL_SGI_color_table #define GL_SGI_color_table 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorTableSGI (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glColorTableParameterivSGI (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glCopyColorTableSGI (GLenum, GLenum, GLint, GLint, GLsizei); GLAPI void APIENTRY glGetColorTableSGI (GLenum, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum, GLenum, GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); #endif #ifndef GL_SGIX_pixel_texture #define GL_SGIX_pixel_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTexGenSGIX (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #endif #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum, GLint); GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum, const GLint *); GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum, GLfloat); GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum, const GLfloat *); GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum, GLint *); GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); #endif #ifndef GL_SGIS_texture4D #define GL_SGIS_texture4D 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexImage4DSGIS (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); #endif #ifndef GL_SGI_texture_color_table #define GL_SGI_texture_color_table 1 #endif #ifndef GL_EXT_cmyka #define GL_EXT_cmyka 1 #endif #ifndef GL_EXT_texture_object #define GL_EXT_texture_object 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei, const GLuint *, GLboolean *); GLAPI void APIENTRY glBindTextureEXT (GLenum, GLuint); GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei, const GLuint *); GLAPI void APIENTRY glGenTexturesEXT (GLsizei, GLuint *); GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint); GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei, const GLuint *, const GLclampf *); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); #endif #ifndef GL_SGIS_detail_texture #define GL_SGIS_detail_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum, GLsizei, const GLfloat *); GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #endif #ifndef GL_SGIS_sharpen_texture #define GL_SGIS_sharpen_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum, GLsizei, const GLfloat *); GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #endif #ifndef GL_EXT_packed_pixels #define GL_EXT_packed_pixels 1 #endif #ifndef GL_SGIS_texture_lod #define GL_SGIS_texture_lod 1 #endif #ifndef GL_SGIS_multisample #define GL_SGIS_multisample 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleMaskSGIS (GLclampf, GLboolean); GLAPI void APIENTRY glSamplePatternSGIS (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); #endif #ifndef GL_EXT_rescale_normal #define GL_EXT_rescale_normal 1 #endif #ifndef GL_EXT_vertex_array #define GL_EXT_vertex_array 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glArrayElementEXT (GLint); GLAPI void APIENTRY glColorPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); GLAPI void APIENTRY glDrawArraysEXT (GLenum, GLint, GLsizei); GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei, GLsizei, const GLboolean *); GLAPI void APIENTRY glGetPointervEXT (GLenum, GLvoid* *); GLAPI void APIENTRY glIndexPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); GLAPI void APIENTRY glNormalPointerEXT (GLenum, GLsizei, GLsizei, const GLvoid *); GLAPI void APIENTRY glTexCoordPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); GLAPI void APIENTRY glVertexPointerEXT (GLint, GLenum, GLsizei, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); #endif #ifndef GL_EXT_misc_attribute #define GL_EXT_misc_attribute 1 #endif #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #endif #ifndef GL_SGIX_clipmap #define GL_SGIX_clipmap 1 #endif #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #endif #ifndef GL_SGIS_texture_edge_clamp #define GL_SGIS_texture_edge_clamp 1 #endif #ifndef GL_SGIS_texture_border_clamp #define GL_SGIS_texture_border_clamp 1 #endif #ifndef GL_EXT_blend_minmax #define GL_EXT_blend_minmax 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationEXT (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); #endif #ifndef GL_EXT_blend_subtract #define GL_EXT_blend_subtract 1 #endif #ifndef GL_EXT_blend_logic_op #define GL_EXT_blend_logic_op 1 #endif #ifndef GL_SGIX_interlace #define GL_SGIX_interlace 1 #endif #ifndef GL_SGIX_pixel_tiles #define GL_SGIX_pixel_tiles 1 #endif #ifndef GL_SGIX_texture_select #define GL_SGIX_texture_select 1 #endif #ifndef GL_SGIX_sprite #define GL_SGIX_sprite 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum, GLfloat); GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum, const GLfloat *); GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum, GLint); GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum, const GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); #endif #ifndef GL_SGIX_texture_multi_buffer #define GL_SGIX_texture_multi_buffer 1 #endif #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfEXT (GLenum, GLfloat); GLAPI void APIENTRY glPointParameterfvEXT (GLenum, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); #endif #ifndef GL_SGIS_point_parameters #define GL_SGIS_point_parameters 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfSGIS (GLenum, GLfloat); GLAPI void APIENTRY glPointParameterfvSGIS (GLenum, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #endif #ifndef GL_SGIX_instruments #define GL_SGIX_instruments 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei, GLint *); GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *); GLAPI void APIENTRY glReadInstrumentsSGIX (GLint); GLAPI void APIENTRY glStartInstrumentsSGIX (void); GLAPI void APIENTRY glStopInstrumentsSGIX (GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); #endif #ifndef GL_SGIX_texture_scale_bias #define GL_SGIX_texture_scale_bias 1 #endif #ifndef GL_SGIX_framezoom #define GL_SGIX_framezoom 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFrameZoomSGIX (GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #endif #ifndef GL_SGIX_tag_sample_buffer #define GL_SGIX_tag_sample_buffer 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTagSampleBufferSGIX (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #endif #ifndef GL_SGIX_polynomial_ffd #define GL_SGIX_polynomial_ffd 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble *); GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat *); GLAPI void APIENTRY glDeformSGIX (GLbitfield); GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #endif #ifndef GL_SGIX_reference_plane #define GL_SGIX_reference_plane 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #endif #ifndef GL_SGIX_flush_raster #define GL_SGIX_flush_raster 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushRasterSGIX (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); #endif #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #endif #ifndef GL_SGIS_fog_function #define GL_SGIS_fog_function 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFogFuncSGIS (GLsizei, const GLfloat *); GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); #endif #ifndef GL_SGIX_fog_offset #define GL_SGIX_fog_offset 1 #endif #ifndef GL_HP_image_transform #define GL_HP_image_transform 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glImageTransformParameteriHP (GLenum, GLenum, GLint); GLAPI void APIENTRY glImageTransformParameterfHP (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glImageTransformParameterivHP (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum, GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); #endif #ifndef GL_HP_convolution_border_modes #define GL_HP_convolution_border_modes 1 #endif #ifndef GL_SGIX_texture_add_env #define GL_SGIX_texture_add_env 1 #endif #ifndef GL_EXT_color_subtable #define GL_EXT_color_subtable 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorSubTableEXT (GLenum, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum, GLsizei, GLint, GLint, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); #endif #ifndef GL_PGI_vertex_hints #define GL_PGI_vertex_hints 1 #endif #ifndef GL_PGI_misc_hints #define GL_PGI_misc_hints 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glHintPGI (GLenum, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); #endif #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorTableEXT (GLenum, GLenum, GLsizei, GLenum, GLenum, const GLvoid *); GLAPI void APIENTRY glGetColorTableEXT (GLenum, GLenum, GLenum, GLvoid *); GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum, GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); #endif #ifndef GL_EXT_clip_volume_hint #define GL_EXT_clip_volume_hint 1 #endif #ifndef GL_SGIX_list_priority #define GL_SGIX_list_priority 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetListParameterivSGIX (GLuint, GLenum, GLint *); GLAPI void APIENTRY glListParameterfSGIX (GLuint, GLenum, GLfloat); GLAPI void APIENTRY glListParameterfvSGIX (GLuint, GLenum, const GLfloat *); GLAPI void APIENTRY glListParameteriSGIX (GLuint, GLenum, GLint); GLAPI void APIENTRY glListParameterivSGIX (GLuint, GLenum, const GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); #endif #ifndef GL_SGIX_ir_instrument1 #define GL_SGIX_ir_instrument1 1 #endif #ifndef GL_SGIX_calligraphic_fragment #define GL_SGIX_calligraphic_fragment 1 #endif #ifndef GL_SGIX_texture_lod_bias #define GL_SGIX_texture_lod_bias 1 #endif #ifndef GL_SGIX_shadow_ambient #define GL_SGIX_shadow_ambient 1 #endif #ifndef GL_EXT_index_texture #define GL_EXT_index_texture 1 #endif #ifndef GL_EXT_index_material #define GL_EXT_index_material 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIndexMaterialEXT (GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); #endif #ifndef GL_EXT_index_func #define GL_EXT_index_func 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIndexFuncEXT (GLenum, GLclampf); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); #endif #ifndef GL_EXT_index_array_formats #define GL_EXT_index_array_formats 1 #endif #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glLockArraysEXT (GLint, GLsizei); GLAPI void APIENTRY glUnlockArraysEXT (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); #endif #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCullParameterdvEXT (GLenum, GLdouble *); GLAPI void APIENTRY glCullParameterfvEXT (GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); #endif #ifndef GL_SGIX_ycrcb #define GL_SGIX_ycrcb 1 #endif #ifndef GL_SGIX_fragment_lighting #define GL_SGIX_fragment_lighting 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum, GLenum); GLAPI void APIENTRY glFragmentLightfSGIX (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glFragmentLightiSGIX (GLenum, GLenum, GLint); GLAPI void APIENTRY glFragmentLightivSGIX (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum, GLfloat); GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum, const GLfloat *); GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum, GLint); GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum, const GLint *); GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum, GLenum, GLint); GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum, GLenum, GLint *); GLAPI void APIENTRY glLightEnviSGIX (GLenum, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); #endif #ifndef GL_IBM_rasterpos_clip #define GL_IBM_rasterpos_clip 1 #endif #ifndef GL_HP_texture_lighting #define GL_HP_texture_lighting 1 #endif #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); #endif #ifndef GL_WIN_phong_shading #define GL_WIN_phong_shading 1 #endif #ifndef GL_WIN_specular_fog #define GL_WIN_specular_fog 1 #endif #ifndef GL_EXT_light_texture #define GL_EXT_light_texture 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glApplyTextureEXT (GLenum); GLAPI void APIENTRY glTextureLightEXT (GLenum); GLAPI void APIENTRY glTextureMaterialEXT (GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); #endif #ifndef GL_SGIX_blend_alpha_minmax #define GL_SGIX_blend_alpha_minmax 1 #endif #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #endif #ifndef GL_SGIX_async #define GL_SGIX_async 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint); GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *); GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *); GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei); GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint, GLsizei); GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); #endif #ifndef GL_SGIX_async_pixel #define GL_SGIX_async_pixel 1 #endif #ifndef GL_SGIX_async_histogram #define GL_SGIX_async_histogram 1 #endif #ifndef GL_INTEL_parallel_arrays #define GL_INTEL_parallel_arrays 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexPointervINTEL (GLint, GLenum, const GLvoid* *); GLAPI void APIENTRY glNormalPointervINTEL (GLenum, const GLvoid* *); GLAPI void APIENTRY glColorPointervINTEL (GLint, GLenum, const GLvoid* *); GLAPI void APIENTRY glTexCoordPointervINTEL (GLint, GLenum, const GLvoid* *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); #endif #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #endif #ifndef GL_EXT_pixel_transform #define GL_EXT_pixel_transform 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum, GLenum, GLint); GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum, GLenum, GLfloat); GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum, GLenum, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); #endif #ifndef GL_EXT_pixel_transform_color_table #define GL_EXT_pixel_transform_color_table 1 #endif #ifndef GL_EXT_shared_texture_palette #define GL_EXT_shared_texture_palette 1 #endif #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #endif #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte, GLbyte, GLbyte); GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *); GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *); GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *); GLAPI void APIENTRY glSecondaryColor3iEXT (GLint, GLint, GLint); GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *); GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort, GLshort, GLshort); GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *); GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte, GLubyte, GLubyte); GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *); GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint, GLuint, GLuint); GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *); GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort, GLushort, GLushort); GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *); GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint, GLenum, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif #ifndef GL_EXT_texture_perturb_normal #define GL_EXT_texture_perturb_normal 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureNormalEXT (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); #endif #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); #endif #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFogCoordfEXT (GLfloat); GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *); GLAPI void APIENTRY glFogCoorddEXT (GLdouble); GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *); GLAPI void APIENTRY glFogCoordPointerEXT (GLenum, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); #endif #ifndef GL_REND_screen_coordinates #define GL_REND_screen_coordinates 1 #endif #ifndef GL_EXT_coordinate_frame #define GL_EXT_coordinate_frame 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTangent3bEXT (GLbyte, GLbyte, GLbyte); GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *); GLAPI void APIENTRY glTangent3dEXT (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *); GLAPI void APIENTRY glTangent3fEXT (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *); GLAPI void APIENTRY glTangent3iEXT (GLint, GLint, GLint); GLAPI void APIENTRY glTangent3ivEXT (const GLint *); GLAPI void APIENTRY glTangent3sEXT (GLshort, GLshort, GLshort); GLAPI void APIENTRY glTangent3svEXT (const GLshort *); GLAPI void APIENTRY glBinormal3bEXT (GLbyte, GLbyte, GLbyte); GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *); GLAPI void APIENTRY glBinormal3dEXT (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *); GLAPI void APIENTRY glBinormal3fEXT (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *); GLAPI void APIENTRY glBinormal3iEXT (GLint, GLint, GLint); GLAPI void APIENTRY glBinormal3ivEXT (const GLint *); GLAPI void APIENTRY glBinormal3sEXT (GLshort, GLshort, GLshort); GLAPI void APIENTRY glBinormal3svEXT (const GLshort *); GLAPI void APIENTRY glTangentPointerEXT (GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glBinormalPointerEXT (GLenum, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); #endif #ifndef GL_EXT_texture_env_combine #define GL_EXT_texture_env_combine 1 #endif #ifndef GL_APPLE_specular_vector #define GL_APPLE_specular_vector 1 #endif #ifndef GL_APPLE_transform_hint #define GL_APPLE_transform_hint 1 #endif #ifndef GL_SGIX_fog_scale #define GL_SGIX_fog_scale 1 #endif #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFinishTextureSUNX (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #endif #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte); GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort); GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint); GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat); GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble); GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte); GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort); GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); #endif #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint); GLAPI void APIENTRY glReplacementCodeusSUN (GLushort); GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte); GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *); GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *); GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *); GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum, GLsizei, const GLvoid* *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); #endif #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat); GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *, const GLfloat *); GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *, const GLfloat *); GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *, const GLfloat *); GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *); GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat, GLfloat, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *, const GLubyte *, const GLfloat *); GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint, GLubyte, GLubyte, GLubyte, GLubyte, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *, const GLubyte *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *, const GLfloat *, const GLfloat *, const GLfloat *, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #endif #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum, GLenum, GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif #ifndef GL_INGR_blend_func_separate #define GL_INGR_blend_func_separate 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum, GLenum, GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #endif #ifndef GL_INGR_color_clamp #define GL_INGR_color_clamp 1 #endif #ifndef GL_INGR_interlace_read #define GL_INGR_interlace_read 1 #endif #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #endif #ifndef GL_EXT_422_pixels #define GL_EXT_422_pixels 1 #endif #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #endif #ifndef GL_SUN_convolution_border_modes #define GL_SUN_convolution_border_modes 1 #endif #ifndef GL_EXT_texture_env_add #define GL_EXT_texture_env_add 1 #endif #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #endif #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #endif #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexWeightfEXT (GLfloat); GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *); GLAPI void APIENTRY glVertexWeightPointerEXT (GLsizei, GLenum, GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); #endif #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #endif #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); #endif #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCombinerParameterfvNV (GLenum, const GLfloat *); GLAPI void APIENTRY glCombinerParameterfNV (GLenum, GLfloat); GLAPI void APIENTRY glCombinerParameterivNV (GLenum, const GLint *); GLAPI void APIENTRY glCombinerParameteriNV (GLenum, GLint); GLAPI void APIENTRY glCombinerInputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glCombinerOutputNV (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); GLAPI void APIENTRY glFinalCombinerInputNV (GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum, GLenum, GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum, GLenum, GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum, GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum, GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum, GLenum, GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); #endif #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #endif #ifndef GL_NV_texgen_emboss #define GL_NV_texgen_emboss 1 #endif #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #endif #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #endif #ifndef GL_MESA_resize_buffers #define GL_MESA_resize_buffers 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glResizeBuffersMESA (void); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); #endif #ifndef GL_MESA_window_pos #define GL_MESA_window_pos 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glWindowPos2dMESA (GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *); GLAPI void APIENTRY glWindowPos2fMESA (GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *); GLAPI void APIENTRY glWindowPos2iMESA (GLint, GLint); GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *); GLAPI void APIENTRY glWindowPos2sMESA (GLshort, GLshort); GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *); GLAPI void APIENTRY glWindowPos3dMESA (GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *); GLAPI void APIENTRY glWindowPos3fMESA (GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *); GLAPI void APIENTRY glWindowPos3iMESA (GLint, GLint, GLint); GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *); GLAPI void APIENTRY glWindowPos3sMESA (GLshort, GLshort, GLshort); GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *); GLAPI void APIENTRY glWindowPos4dMESA (GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *); GLAPI void APIENTRY glWindowPos4fMESA (GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *); GLAPI void APIENTRY glWindowPos4iMESA (GLint, GLint, GLint, GLint); GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *); GLAPI void APIENTRY glWindowPos4sMESA (GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); #endif #ifndef GL_IBM_cull_vertex #define GL_IBM_cull_vertex 1 #endif #ifndef GL_IBM_multimode_draw_arrays #define GL_IBM_multimode_draw_arrays 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *, const GLint *, const GLsizei *, GLsizei, GLint); GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *, const GLsizei *, GLenum, const GLvoid* const *, GLsizei, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); #endif #ifndef GL_IBM_vertex_array_lists #define GL_IBM_vertex_array_lists 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint, const GLboolean* *, GLint); GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glIndexPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glNormalPointerListIBM (GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glTexCoordPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); GLAPI void APIENTRY glVertexPointerListIBM (GLint, GLenum, GLint, const GLvoid* *, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); #endif #ifndef GL_SGIX_subsample #define GL_SGIX_subsample 1 #endif #ifndef GL_SGIX_ycrcba #define GL_SGIX_ycrcba 1 #endif #ifndef GL_SGIX_ycrcb_subsample #define GL_SGIX_ycrcb_subsample 1 #endif #ifndef GL_SGIX_depth_pass_instrument #define GL_SGIX_depth_pass_instrument 1 #endif #ifndef GL_3DFX_texture_compression_FXT1 #define GL_3DFX_texture_compression_FXT1 1 #endif #ifndef GL_3DFX_multisample #define GL_3DFX_multisample 1 #endif #ifndef GL_3DFX_tbuffer #define GL_3DFX_tbuffer 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTbufferMask3DFX (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); #endif #ifndef GL_EXT_multisample #define GL_EXT_multisample 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glSampleMaskEXT (GLclampf, GLboolean); GLAPI void APIENTRY glSamplePatternEXT (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); #endif #ifndef GL_SGIX_vertex_preclip #define GL_SGIX_vertex_preclip 1 #endif #ifndef GL_SGIX_convolution_accuracy #define GL_SGIX_convolution_accuracy 1 #endif #ifndef GL_SGIX_resample #define GL_SGIX_resample 1 #endif #ifndef GL_SGIS_point_line_texgen #define GL_SGIS_point_line_texgen 1 #endif #ifndef GL_SGIS_texture_color_mask #define GL_SGIS_texture_color_mask 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean, GLboolean, GLboolean, GLboolean); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif #ifndef GL_SGIX_igloo_interface #define GL_SGIX_igloo_interface 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum, const GLvoid *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); #endif #ifndef GL_EXT_texture_env_dot3 #define GL_EXT_texture_env_dot3 1 #endif #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #endif #ifndef GL_NV_fence #define GL_NV_fence 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); GLAPI void APIENTRY glGenFencesNV (GLsizei, GLuint *); GLAPI GLboolean APIENTRY glIsFenceNV (GLuint); GLAPI GLboolean APIENTRY glTestFenceNV (GLuint); GLAPI void APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); GLAPI void APIENTRY glFinishFenceNV (GLuint); GLAPI void APIENTRY glSetFenceNV (GLuint, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); #endif #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const GLvoid *); GLAPI void APIENTRY glMapParameterivNV (GLenum, GLenum, const GLint *); GLAPI void APIENTRY glMapParameterfvNV (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glGetMapControlPointsNV (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, GLvoid *); GLAPI void APIENTRY glGetMapParameterivNV (GLenum, GLenum, GLint *); GLAPI void APIENTRY glGetMapParameterfvNV (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum, GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glEvalMapsNV (GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); #endif #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #endif #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum, GLenum, const GLfloat *); GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum, GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); #endif #ifndef GL_NV_texture_compression_vtc #define GL_NV_texture_compression_vtc 1 #endif #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #endif #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #endif #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 #endif #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #endif #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei, const GLuint *, GLboolean *); GLAPI void APIENTRY glBindProgramNV (GLenum, GLuint); GLAPI void APIENTRY glDeleteProgramsNV (GLsizei, const GLuint *); GLAPI void APIENTRY glExecuteProgramNV (GLenum, GLuint, const GLfloat *); GLAPI void APIENTRY glGenProgramsNV (GLsizei, GLuint *); GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum, GLuint, GLenum, GLdouble *); GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum, GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetProgramivNV (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetProgramStringNV (GLuint, GLenum, GLubyte *); GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum, GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint, GLenum, GLdouble *); GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetVertexAttribivNV (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint, GLenum, GLvoid* *); GLAPI GLboolean APIENTRY glIsProgramNV (GLuint); GLAPI void APIENTRY glLoadProgramNV (GLenum, GLuint, GLsizei, const GLubyte *); GLAPI void APIENTRY glProgramParameter4dNV (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glProgramParameter4dvNV (GLenum, GLuint, const GLdouble *); GLAPI void APIENTRY glProgramParameter4fNV (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glProgramParameter4fvNV (GLenum, GLuint, const GLfloat *); GLAPI void APIENTRY glProgramParameters4dvNV (GLenum, GLuint, GLuint, const GLdouble *); GLAPI void APIENTRY glProgramParameters4fvNV (GLenum, GLuint, GLuint, const GLfloat *); GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei, const GLuint *); GLAPI void APIENTRY glTrackMatrixNV (GLenum, GLuint, GLenum, GLenum); GLAPI void APIENTRY glVertexAttribPointerNV (GLuint, GLint, GLenum, GLsizei, const GLvoid *); GLAPI void APIENTRY glVertexAttrib1dNV (GLuint, GLdouble); GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib1fNV (GLuint, GLfloat); GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib1sNV (GLuint, GLshort); GLAPI void APIENTRY glVertexAttrib1svNV (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib2dNV (GLuint, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib2fNV (GLuint, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib2sNV (GLuint, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib2svNV (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib3dNV (GLuint, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib3fNV (GLuint, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib3sNV (GLuint, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib3svNV (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib4dNV (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint, const GLdouble *); GLAPI void APIENTRY glVertexAttrib4fNV (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint, const GLfloat *); GLAPI void APIENTRY glVertexAttrib4sNV (GLuint, GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexAttrib4svNV (GLuint, const GLshort *); GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint, const GLubyte *); GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint, GLsizei, const GLdouble *); GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint, GLsizei, const GLfloat *); GLAPI void APIENTRY glVertexAttribs1svNV (GLuint, GLsizei, const GLshort *); GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint, GLsizei, const GLdouble *); GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint, GLsizei, const GLfloat *); GLAPI void APIENTRY glVertexAttribs2svNV (GLuint, GLsizei, const GLshort *); GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint, GLsizei, const GLdouble *); GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint, GLsizei, const GLfloat *); GLAPI void APIENTRY glVertexAttribs3svNV (GLuint, GLsizei, const GLshort *); GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint, GLsizei, const GLdouble *); GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint, GLsizei, const GLfloat *); GLAPI void APIENTRY glVertexAttribs4svNV (GLuint, GLsizei, const GLshort *); GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint, GLsizei, const GLubyte *); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble *v); typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat *v); typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); #endif #ifndef GL_SGIX_texture_coordinate_clamp #define GL_SGIX_texture_coordinate_clamp 1 #endif #ifndef GL_SGIX_scalebias_hint #define GL_SGIX_scalebias_hint 1 #endif #ifndef GL_OML_interlace #define GL_OML_interlace 1 #endif #ifndef GL_OML_subsample #define GL_OML_subsample 1 #endif #ifndef GL_OML_resample #define GL_OML_resample 1 #endif #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #endif #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glTexBumpParameterivATI (GLenum, const GLint *); GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum, GLint *); GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); #endif #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint); GLAPI void APIENTRY glBindFragmentShaderATI (GLuint); GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint); GLAPI void APIENTRY glBeginFragmentShaderATI (void); GLAPI void APIENTRY glEndFragmentShaderATI (void); GLAPI void APIENTRY glPassTexCoordATI (GLuint, GLuint, GLenum); GLAPI void APIENTRY glSampleMapATI (GLuint, GLuint, GLenum); GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint, const GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); #endif #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPNTrianglesiATI (GLenum, GLint); GLAPI void APIENTRY glPNTrianglesfATI (GLenum, GLfloat); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); #endif #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei, const GLvoid *, GLenum); GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint); GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint, GLuint, GLsizei, const GLvoid *, GLenum); GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetObjectBufferivATI (GLuint, GLenum, GLint *); GLAPI void APIENTRY glFreeObjectBufferATI (GLuint); GLAPI void APIENTRY glArrayObjectATI (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum, GLenum, GLfloat *); GLAPI void APIENTRY glGetArrayObjectivATI (GLenum, GLenum, GLint *); GLAPI void APIENTRY glVariantArrayObjectATI (GLuint, GLenum, GLsizei, GLuint, GLuint); GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint, GLenum, GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); #endif #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBeginVertexShaderEXT (void); GLAPI void APIENTRY glEndVertexShaderEXT (void); GLAPI void APIENTRY glBindVertexShaderEXT (GLuint); GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint); GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint); GLAPI void APIENTRY glShaderOp1EXT (GLenum, GLuint, GLuint); GLAPI void APIENTRY glShaderOp2EXT (GLenum, GLuint, GLuint, GLuint); GLAPI void APIENTRY glShaderOp3EXT (GLenum, GLuint, GLuint, GLuint, GLuint); GLAPI void APIENTRY glSwizzleEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glWriteMaskEXT (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glInsertComponentEXT (GLuint, GLuint, GLuint); GLAPI void APIENTRY glExtractComponentEXT (GLuint, GLuint, GLuint); GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum, GLenum, GLenum, GLuint); GLAPI void APIENTRY glSetInvariantEXT (GLuint, GLenum, const GLvoid *); GLAPI void APIENTRY glSetLocalConstantEXT (GLuint, GLenum, const GLvoid *); GLAPI void APIENTRY glVariantbvEXT (GLuint, const GLbyte *); GLAPI void APIENTRY glVariantsvEXT (GLuint, const GLshort *); GLAPI void APIENTRY glVariantivEXT (GLuint, const GLint *); GLAPI void APIENTRY glVariantfvEXT (GLuint, const GLfloat *); GLAPI void APIENTRY glVariantdvEXT (GLuint, const GLdouble *); GLAPI void APIENTRY glVariantubvEXT (GLuint, const GLubyte *); GLAPI void APIENTRY glVariantusvEXT (GLuint, const GLushort *); GLAPI void APIENTRY glVariantuivEXT (GLuint, const GLuint *); GLAPI void APIENTRY glVariantPointerEXT (GLuint, GLenum, GLuint, const GLvoid *); GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint); GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint); GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum, GLenum); GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum, GLenum); GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum, GLenum, GLenum); GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum, GLenum); GLAPI GLuint APIENTRY glBindParameterEXT (GLenum); GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint, GLenum); GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint, GLenum, GLboolean *); GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetVariantPointervEXT (GLuint, GLenum, GLvoid* *); GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint, GLenum, GLboolean *); GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint, GLenum, GLboolean *); GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint, GLenum, GLfloat *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); #endif #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexStream1sATI (GLenum, GLshort); GLAPI void APIENTRY glVertexStream1svATI (GLenum, const GLshort *); GLAPI void APIENTRY glVertexStream1iATI (GLenum, GLint); GLAPI void APIENTRY glVertexStream1ivATI (GLenum, const GLint *); GLAPI void APIENTRY glVertexStream1fATI (GLenum, GLfloat); GLAPI void APIENTRY glVertexStream1fvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glVertexStream1dATI (GLenum, GLdouble); GLAPI void APIENTRY glVertexStream1dvATI (GLenum, const GLdouble *); GLAPI void APIENTRY glVertexStream2sATI (GLenum, GLshort, GLshort); GLAPI void APIENTRY glVertexStream2svATI (GLenum, const GLshort *); GLAPI void APIENTRY glVertexStream2iATI (GLenum, GLint, GLint); GLAPI void APIENTRY glVertexStream2ivATI (GLenum, const GLint *); GLAPI void APIENTRY glVertexStream2fATI (GLenum, GLfloat, GLfloat); GLAPI void APIENTRY glVertexStream2fvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glVertexStream2dATI (GLenum, GLdouble, GLdouble); GLAPI void APIENTRY glVertexStream2dvATI (GLenum, const GLdouble *); GLAPI void APIENTRY glVertexStream3sATI (GLenum, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexStream3svATI (GLenum, const GLshort *); GLAPI void APIENTRY glVertexStream3iATI (GLenum, GLint, GLint, GLint); GLAPI void APIENTRY glVertexStream3ivATI (GLenum, const GLint *); GLAPI void APIENTRY glVertexStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexStream3fvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glVertexStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexStream3dvATI (GLenum, const GLdouble *); GLAPI void APIENTRY glVertexStream4sATI (GLenum, GLshort, GLshort, GLshort, GLshort); GLAPI void APIENTRY glVertexStream4svATI (GLenum, const GLshort *); GLAPI void APIENTRY glVertexStream4iATI (GLenum, GLint, GLint, GLint, GLint); GLAPI void APIENTRY glVertexStream4ivATI (GLenum, const GLint *); GLAPI void APIENTRY glVertexStream4fATI (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glVertexStream4fvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glVertexStream4dATI (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glVertexStream4dvATI (GLenum, const GLdouble *); GLAPI void APIENTRY glNormalStream3bATI (GLenum, GLbyte, GLbyte, GLbyte); GLAPI void APIENTRY glNormalStream3bvATI (GLenum, const GLbyte *); GLAPI void APIENTRY glNormalStream3sATI (GLenum, GLshort, GLshort, GLshort); GLAPI void APIENTRY glNormalStream3svATI (GLenum, const GLshort *); GLAPI void APIENTRY glNormalStream3iATI (GLenum, GLint, GLint, GLint); GLAPI void APIENTRY glNormalStream3ivATI (GLenum, const GLint *); GLAPI void APIENTRY glNormalStream3fATI (GLenum, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glNormalStream3fvATI (GLenum, const GLfloat *); GLAPI void APIENTRY glNormalStream3dATI (GLenum, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glNormalStream3dvATI (GLenum, const GLdouble *); GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum); GLAPI void APIENTRY glVertexBlendEnviATI (GLenum, GLint); GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum, GLfloat); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); #endif #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glElementPointerATI (GLenum, const GLvoid *); GLAPI void APIENTRY glDrawElementArrayATI (GLenum, GLsizei); GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum, GLuint, GLuint, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); #endif #ifndef GL_SUN_mesh_array #define GL_SUN_mesh_array 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum, GLint, GLsizei, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); #endif #ifndef GL_SUN_slice_accum #define GL_SUN_slice_accum 1 #endif #ifndef GL_NV_multisample_filter_hint #define GL_NV_multisample_filter_hint 1 #endif #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #endif #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei, GLuint *); GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei, const GLuint *); GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint); GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint); GLAPI void APIENTRY glEndOcclusionQueryNV (void); GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint, GLenum, GLint *); GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint, GLenum, GLuint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); #endif #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameteriNV (GLenum, GLint); GLAPI void APIENTRY glPointParameterivNV (GLenum, const GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); #endif #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #endif #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 1 #endif #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #endif #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); #endif #ifndef GL_ATI_text_fragment_shader #define GL_ATI_text_fragment_shader 1 #endif #ifndef GL_APPLE_client_storage #define GL_APPLE_client_storage 1 #endif #ifndef GL_APPLE_element_array #define GL_APPLE_element_array 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glElementPointerAPPLE (GLenum, const GLvoid *); GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum, GLint, GLsizei); GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, GLint, GLsizei); GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum, const GLint *, const GLsizei *, GLsizei); GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum, GLuint, GLuint, const GLint *, const GLsizei *, GLsizei); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); #endif #ifndef GL_APPLE_fence #define GL_APPLE_fence 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGenFencesAPPLE (GLsizei, GLuint *); GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei, const GLuint *); GLAPI void APIENTRY glSetFenceAPPLE (GLuint); GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint); GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint); GLAPI void APIENTRY glFinishFenceAPPLE (GLuint); GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum, GLuint); GLAPI void APIENTRY glFinishObjectAPPLE (GLenum, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); #endif #ifndef GL_APPLE_vertex_array_object #define GL_APPLE_vertex_array_object 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint); GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei, const GLuint *); GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei, const GLuint *); GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); #endif #ifndef GL_APPLE_vertex_array_range #define GL_APPLE_vertex_array_range 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei, GLvoid *); GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei, GLvoid *); GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum, GLint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); #endif #ifndef GL_APPLE_ycbcr_422 #define GL_APPLE_ycbcr_422 1 #endif #ifndef GL_S3_s3tc #define GL_S3_s3tc 1 #endif #ifndef GL_ATI_draw_buffers #define GL_ATI_draw_buffers 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDrawBuffersATI (GLsizei, const GLenum *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); #endif #ifndef GL_ATI_texture_env_combine3 #define GL_ATI_texture_env_combine3 1 #endif #ifndef GL_ATI_texture_float #define GL_ATI_texture_float 1 #endif #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #endif #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 /* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint, GLsizei, const GLubyte *, GLfloat, GLfloat, GLfloat, GLfloat); GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint, GLsizei, const GLubyte *, GLdouble, GLdouble, GLdouble, GLdouble); GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint, GLsizei, const GLubyte *, const GLfloat *); GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint, GLsizei, const GLubyte *, const GLdouble *); GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint, GLsizei, const GLubyte *, GLfloat *); GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint, GLsizei, const GLubyte *, GLdouble *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #endif #ifndef GL_NV_half_float #define GL_NV_half_float 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertex2hNV (GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *); GLAPI void APIENTRY glVertex3hNV (GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *); GLAPI void APIENTRY glVertex4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *); GLAPI void APIENTRY glNormal3hNV (GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *); GLAPI void APIENTRY glColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *); GLAPI void APIENTRY glColor4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *); GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV); GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *); GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV, GLhalfNV); GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *); GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *); GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *); GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum, GLhalfNV); GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum, const GLhalfNV *); GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum, const GLhalfNV *); GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum, const GLhalfNV *); GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum, const GLhalfNV *); GLAPI void APIENTRY glFogCoordhNV (GLhalfNV); GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *); GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *); GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV); GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *); GLAPI void APIENTRY glVertexAttrib1hNV (GLuint, GLhalfNV); GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint, const GLhalfNV *); GLAPI void APIENTRY glVertexAttrib2hNV (GLuint, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint, const GLhalfNV *); GLAPI void APIENTRY glVertexAttrib3hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint, const GLhalfNV *); GLAPI void APIENTRY glVertexAttrib4hNV (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint, const GLhalfNV *); GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint, GLsizei, const GLhalfNV *); GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint, GLsizei, const GLhalfNV *); GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint, GLsizei, const GLhalfNV *); GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint, GLsizei, const GLhalfNV *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); #endif #ifndef GL_NV_pixel_data_range #define GL_NV_pixel_data_range 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelDataRangeNV (GLenum, GLsizei, GLvoid *); GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid *pointer); typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); #endif #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPrimitiveRestartNV (void); GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); #endif #ifndef GL_NV_texture_expand_normal #define GL_NV_texture_expand_normal 1 #endif #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #endif #ifndef GL_ATI_map_object_buffer #define GL_ATI_map_object_buffer 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint); GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); #endif #ifndef GL_ATI_separate_stencil #define GL_ATI_separate_stencil 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glStencilOpSeparateATI (GLenum, GLenum, GLenum, GLenum); GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum, GLenum, GLint, GLuint); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); #endif #ifndef GL_ATI_vertex_attrib_array_object #define GL_ATI_vertex_attrib_array_object 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint, GLenum, GLfloat *); GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint, GLenum, GLint *); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); #endif #ifndef GL_EXT_depth_bounds_test #define GL_EXT_depth_bounds_test 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glDepthBoundsEXT (GLclampd, GLclampd); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); #endif #ifndef GL_EXT_texture_mirror_clamp #define GL_EXT_texture_mirror_clamp 1 #endif #ifndef GL_EXT_blend_equation_separate #define GL_EXT_blend_equation_separate 1 #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum, GLenum); #endif /* GL_GLEXT_PROTOTYPES */ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); #endif #ifndef GL_MESA_pack_invert #define GL_MESA_pack_invert 1 #endif #ifndef GL_MESA_ycbcr_texture #define GL_MESA_ycbcr_texture 1 #endif #ifndef GL_WIN_swap_hint #define GL_WIN_swap_hint 1 extern void APIENTRY glAddSwapHintRectWIN (GLint, GLint, GLsizei, GLsizei); typedef void (APIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); #endif #ifdef __cplusplus } #endif #endif rgl/src/ext/GLsdk/GL/wglext.h0000644000176000001440000006472712262026246015470 0ustar ripleyusers#ifndef __wglext_h_ #define __wglext_h_ #ifdef __cplusplus extern "C" { #endif /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #define WIN32_LEAN_AND_MEAN 1 #include #endif #ifndef APIENTRY #define APIENTRY #endif #ifndef APIENTRYP #define APIENTRYP APIENTRY * #endif #ifndef GLAPI #define GLAPI extern #endif /*************************************************************/ /* Header file version number */ /* wglext.h last updated 2002/03/22 */ /* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ #define WGL_WGLEXT_VERSION 4 #ifndef WGL_ARB_buffer_region #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 #endif #ifndef WGL_ARB_multisample #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #endif #ifndef WGL_ARB_extensions_string #endif #ifndef WGL_ARB_pixel_format #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #endif #ifndef WGL_ARB_make_current_read #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 #endif #ifndef WGL_ARB_pbuffer #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 #endif #ifndef WGL_ARB_render_texture #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 #endif #ifndef WGL_EXT_make_current_read #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 #endif #ifndef WGL_EXT_pixel_format #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 #define WGL_DRAW_TO_WINDOW_EXT 0x2001 #define WGL_DRAW_TO_BITMAP_EXT 0x2002 #define WGL_ACCELERATION_EXT 0x2003 #define WGL_NEED_PALETTE_EXT 0x2004 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 #define WGL_SWAP_METHOD_EXT 0x2007 #define WGL_NUMBER_OVERLAYS_EXT 0x2008 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009 #define WGL_TRANSPARENT_EXT 0x200A #define WGL_TRANSPARENT_VALUE_EXT 0x200B #define WGL_SHARE_DEPTH_EXT 0x200C #define WGL_SHARE_STENCIL_EXT 0x200D #define WGL_SHARE_ACCUM_EXT 0x200E #define WGL_SUPPORT_GDI_EXT 0x200F #define WGL_SUPPORT_OPENGL_EXT 0x2010 #define WGL_DOUBLE_BUFFER_EXT 0x2011 #define WGL_STEREO_EXT 0x2012 #define WGL_PIXEL_TYPE_EXT 0x2013 #define WGL_COLOR_BITS_EXT 0x2014 #define WGL_RED_BITS_EXT 0x2015 #define WGL_RED_SHIFT_EXT 0x2016 #define WGL_GREEN_BITS_EXT 0x2017 #define WGL_GREEN_SHIFT_EXT 0x2018 #define WGL_BLUE_BITS_EXT 0x2019 #define WGL_BLUE_SHIFT_EXT 0x201A #define WGL_ALPHA_BITS_EXT 0x201B #define WGL_ALPHA_SHIFT_EXT 0x201C #define WGL_ACCUM_BITS_EXT 0x201D #define WGL_ACCUM_RED_BITS_EXT 0x201E #define WGL_ACCUM_GREEN_BITS_EXT 0x201F #define WGL_ACCUM_BLUE_BITS_EXT 0x2020 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 #define WGL_DEPTH_BITS_EXT 0x2022 #define WGL_STENCIL_BITS_EXT 0x2023 #define WGL_AUX_BUFFERS_EXT 0x2024 #define WGL_NO_ACCELERATION_EXT 0x2025 #define WGL_GENERIC_ACCELERATION_EXT 0x2026 #define WGL_FULL_ACCELERATION_EXT 0x2027 #define WGL_SWAP_EXCHANGE_EXT 0x2028 #define WGL_SWAP_COPY_EXT 0x2029 #define WGL_SWAP_UNDEFINED_EXT 0x202A #define WGL_TYPE_RGBA_EXT 0x202B #define WGL_TYPE_COLORINDEX_EXT 0x202C #endif #ifndef WGL_EXT_pbuffer #define WGL_DRAW_TO_PBUFFER_EXT 0x202D #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 #define WGL_PBUFFER_LARGEST_EXT 0x2033 #define WGL_PBUFFER_WIDTH_EXT 0x2034 #define WGL_PBUFFER_HEIGHT_EXT 0x2035 #endif #ifndef WGL_EXT_depth_float #define WGL_DEPTH_FLOAT_EXT 0x2040 #endif #ifndef WGL_3DFX_multisample #define WGL_SAMPLE_BUFFERS_3DFX 0x2060 #define WGL_SAMPLES_3DFX 0x2061 #endif #ifndef WGL_EXT_multisample #define WGL_SAMPLE_BUFFERS_EXT 0x2041 #define WGL_SAMPLES_EXT 0x2042 #endif #ifndef WGL_I3D_digital_video_control #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 #endif #ifndef WGL_I3D_gamma #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F #endif #ifndef WGL_I3D_genlock #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 #define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 #define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 #define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C #endif #ifndef WGL_I3D_image_buffer #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 #endif #ifndef WGL_I3D_swap_frame_lock #endif #ifndef WGL_NV_render_depth_texture #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define WGL_DEPTH_COMPONENT_NV 0x20A7 #endif #ifndef WGL_NV_render_texture_rectangle #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #endif #ifndef WGL_NV_float_buffer #define WGL_FLOAT_COMPONENTS_NV 0x20B0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #endif /*************************************************************/ #ifndef WGL_ARB_pbuffer DECLARE_HANDLE(HPBUFFERARB); #endif #ifndef WGL_EXT_pbuffer DECLARE_HANDLE(HPBUFFEREXT); #endif #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #ifdef WGL_WGLEXT_PROTOTYPES extern HANDLE WINAPI wglCreateBufferRegionARB (HDC, int, UINT); extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE); extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE, int, int, int, int); extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE, int, int, int, int, int, int); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); #endif #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #endif #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 #ifdef WGL_WGLEXT_PROTOTYPES extern const char * WINAPI wglGetExtensionsStringARB (HDC); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); #endif #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC, int, int, UINT, const int *, int *); extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC, int, int, UINT, const int *, FLOAT *); extern BOOL WINAPI wglChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); #endif #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglMakeContextCurrentARB (HDC, HDC, HGLRC); extern HDC WINAPI wglGetCurrentReadDCARB (void); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); #endif #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #ifdef WGL_WGLEXT_PROTOTYPES extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC, int, int, int, const int *); extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB); extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB, HDC); extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB); extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB, int, int *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); #endif #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglBindTexImageARB (HPBUFFERARB, int); extern BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB, int); extern BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB, const int *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); #endif #ifndef WGL_EXT_display_color_table #define WGL_EXT_display_color_table 1 #ifdef WGL_WGLEXT_PROTOTYPES extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort); extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *, GLuint); extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort); extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); #endif #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 #ifdef WGL_WGLEXT_PROTOTYPES extern const char * WINAPI wglGetExtensionsStringEXT (void); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); #endif #ifndef WGL_EXT_make_current_read #define WGL_EXT_make_current_read 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglMakeContextCurrentEXT (HDC, HDC, HGLRC); extern HDC WINAPI wglGetCurrentReadDCEXT (void); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); #endif #ifndef WGL_EXT_pbuffer #define WGL_EXT_pbuffer 1 #ifdef WGL_WGLEXT_PROTOTYPES extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC, int, int, int, const int *); extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT); extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT, HDC); extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT); extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT, int, int *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); #endif #ifndef WGL_EXT_pixel_format #define WGL_EXT_pixel_format 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC, int, int, UINT, int *, int *); extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC, int, int, UINT, int *, FLOAT *); extern BOOL WINAPI wglChoosePixelFormatEXT (HDC, const int *, const FLOAT *, UINT, int *, UINT *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); #endif #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglSwapIntervalEXT (int); extern int WINAPI wglGetSwapIntervalEXT (void); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); #endif #ifndef WGL_EXT_depth_float #define WGL_EXT_depth_float 1 #endif #ifndef WGL_NV_vertex_array_range #define WGL_NV_vertex_array_range 1 #ifdef WGL_WGLEXT_PROTOTYPES extern void* WINAPI wglAllocateMemoryNV (GLsizei, GLfloat, GLfloat, GLfloat); extern void WINAPI wglFreeMemoryNV (void *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); #endif #ifndef WGL_3DFX_multisample #define WGL_3DFX_multisample 1 #endif #ifndef WGL_EXT_multisample #define WGL_EXT_multisample 1 #endif #ifndef WGL_OML_sync_control #define WGL_OML_sync_control 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetSyncValuesOML (HDC, INT64 *, INT64 *, INT64 *); extern BOOL WINAPI wglGetMscRateOML (HDC, INT32 *, INT32 *); extern INT64 WINAPI wglSwapBuffersMscOML (HDC, INT64, INT64, INT64); extern INT64 WINAPI wglSwapLayerBuffersMscOML (HDC, int, INT64, INT64, INT64); extern BOOL WINAPI wglWaitForMscOML (HDC, INT64, INT64, INT64, INT64 *, INT64 *, INT64 *); extern BOOL WINAPI wglWaitForSbcOML (HDC, INT64, INT64 *, INT64 *, INT64 *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator); typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); #endif #ifndef WGL_I3D_digital_video_control #define WGL_I3D_digital_video_control 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC, int, int *); extern BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC, int, const int *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); #endif #ifndef WGL_I3D_gamma #define WGL_I3D_gamma 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetGammaTableParametersI3D (HDC, int, int *); extern BOOL WINAPI wglSetGammaTableParametersI3D (HDC, int, const int *); extern BOOL WINAPI wglGetGammaTableI3D (HDC, int, USHORT *, USHORT *, USHORT *); extern BOOL WINAPI wglSetGammaTableI3D (HDC, int, const USHORT *, const USHORT *, const USHORT *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); #endif #ifndef WGL_I3D_genlock #define WGL_I3D_genlock 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglEnableGenlockI3D (HDC); extern BOOL WINAPI wglDisableGenlockI3D (HDC); extern BOOL WINAPI wglIsEnabledGenlockI3D (HDC, BOOL *); extern BOOL WINAPI wglGenlockSourceI3D (HDC, UINT); extern BOOL WINAPI wglGetGenlockSourceI3D (HDC, UINT *); extern BOOL WINAPI wglGenlockSourceEdgeI3D (HDC, UINT); extern BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC, UINT *); extern BOOL WINAPI wglGenlockSampleRateI3D (HDC, UINT); extern BOOL WINAPI wglGetGenlockSampleRateI3D (HDC, UINT *); extern BOOL WINAPI wglGenlockSourceDelayI3D (HDC, UINT); extern BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC, UINT *); extern BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC, UINT *, UINT *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge); typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay); typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); #endif #ifndef WGL_I3D_image_buffer #define WGL_I3D_image_buffer 1 #ifdef WGL_WGLEXT_PROTOTYPES extern LPVOID WINAPI wglCreateImageBufferI3D (HDC, DWORD, UINT); extern BOOL WINAPI wglDestroyImageBufferI3D (HDC, LPVOID); extern BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC, const HANDLE *, const LPVOID *, const DWORD *, UINT); extern BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC, const LPVOID *, UINT); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count); #endif #ifndef WGL_I3D_swap_frame_lock #define WGL_I3D_swap_frame_lock 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglEnableFrameLockI3D (void); extern BOOL WINAPI wglDisableFrameLockI3D (void); extern BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *); extern BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag); typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag); #endif #ifndef WGL_I3D_swap_frame_usage #define WGL_I3D_swap_frame_usage 1 #ifdef WGL_WGLEXT_PROTOTYPES extern BOOL WINAPI wglGetFrameUsageI3D (float *); extern BOOL WINAPI wglBeginFrameTrackingI3D (void); extern BOOL WINAPI wglEndFrameTrackingI3D (void); extern BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *, DWORD *, float *); #endif /* WGL_WGLEXT_PROTOTYPES */ typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage); typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #endif #ifdef __cplusplus } #endif #endif rgl/src/ext/GLsdk/GL/glprocs.c0000644000176000001440000125250712262026246015616 0ustar ripleyusers/* ** GLprocs utility for getting function addresses for OpenGL(R) 1.2, ** OpenGL 1.3, OpenGL 1.4, OpenGL 1.5 and OpenGL extension functions. ** ** Version: 1.1 ** ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. ** ** Initial version of glprocs.{c,h} contributed by Intel(R) Corporation. */ #include #include #ifdef _WIN32 #include #include "gl.h" /* Include local "gl.h". Don't include vc32 . */ #include "glprocs.h" #else /* GLX */ #include #include #include #define wglGetProcAddress glXGetProcAddressARB #endif #define _ASSERT(a) assert(a) static void APIENTRY InitBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendColor"); if (extproc == NULL) { _ASSERT(0); return; } glBlendColor = extproc; glBlendColor(red, green, blue, alpha); } static void APIENTRY InitBlendEquation (GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendEquation"); if (extproc == NULL) { _ASSERT(0); return; } glBlendEquation = extproc; glBlendEquation(mode); } static void APIENTRY InitDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawRangeElements"); if (extproc == NULL) { _ASSERT(0); return; } glDrawRangeElements = extproc; glDrawRangeElements(mode, start, end, count, type, indices); } static void APIENTRY InitColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTable"); if (extproc == NULL) { _ASSERT(0); return; } glColorTable = extproc; glColorTable(target, internalformat, width, format, type, table); } static void APIENTRY InitColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableParameterfv = extproc; glColorTableParameterfv(target, pname, params); } static void APIENTRY InitColorTableParameteriv (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableParameteriv = extproc; glColorTableParameteriv(target, pname, params); } static void APIENTRY InitCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyColorTable"); if (extproc == NULL) { _ASSERT(0); return; } glCopyColorTable = extproc; glCopyColorTable(target, internalformat, x, y, width); } static void APIENTRY InitGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTable"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTable = extproc; glGetColorTable(target, format, type, table); } static void APIENTRY InitGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameterfv = extproc; glGetColorTableParameterfv(target, pname, params); } static void APIENTRY InitGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameteriv = extproc; glGetColorTableParameteriv(target, pname, params); } static void APIENTRY InitColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glColorSubTable"); if (extproc == NULL) { _ASSERT(0); return; } glColorSubTable = extproc; glColorSubTable(target, start, count, format, type, data); } static void APIENTRY InitCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyColorSubTable"); if (extproc == NULL) { _ASSERT(0); return; } glCopyColorSubTable = extproc; glCopyColorSubTable(target, start, x, y, width); } static void APIENTRY InitConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionFilter1D"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionFilter1D = extproc; glConvolutionFilter1D(target, internalformat, width, format, type, image); } static void APIENTRY InitConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionFilter2D"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionFilter2D = extproc; glConvolutionFilter2D(target, internalformat, width, height, format, type, image); } static void APIENTRY InitConvolutionParameterf (GLenum target, GLenum pname, GLfloat params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameterf"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameterf = extproc; glConvolutionParameterf(target, pname, params); } static void APIENTRY InitConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameterfv = extproc; glConvolutionParameterfv(target, pname, params); } static void APIENTRY InitConvolutionParameteri (GLenum target, GLenum pname, GLint params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameteri"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameteri = extproc; glConvolutionParameteri(target, pname, params); } static void APIENTRY InitConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameteriv = extproc; glConvolutionParameteriv(target, pname, params); } static void APIENTRY InitCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyConvolutionFilter1D"); if (extproc == NULL) { _ASSERT(0); return; } glCopyConvolutionFilter1D = extproc; glCopyConvolutionFilter1D(target, internalformat, x, y, width); } static void APIENTRY InitCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyConvolutionFilter2D"); if (extproc == NULL) { _ASSERT(0); return; } glCopyConvolutionFilter2D = extproc; glCopyConvolutionFilter2D(target, internalformat, x, y, width, height); } static void APIENTRY InitGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionFilter"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionFilter = extproc; glGetConvolutionFilter(target, format, type, image); } static void APIENTRY InitGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionParameterfv = extproc; glGetConvolutionParameterfv(target, pname, params); } static void APIENTRY InitGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionParameteriv = extproc; glGetConvolutionParameteriv(target, pname, params); } static void APIENTRY InitGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span) { void *extproc; extproc = (void *) wglGetProcAddress("glGetSeparableFilter"); if (extproc == NULL) { _ASSERT(0); return; } glGetSeparableFilter = extproc; glGetSeparableFilter(target, format, type, row, column, span); } static void APIENTRY InitSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column) { void *extproc; extproc = (void *) wglGetProcAddress("glSeparableFilter2D"); if (extproc == NULL) { _ASSERT(0); return; } glSeparableFilter2D = extproc; glSeparableFilter2D(target, internalformat, width, height, format, type, row, column); } static void APIENTRY InitGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogram"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogram = extproc; glGetHistogram(target, reset, format, type, values); } static void APIENTRY InitGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogramParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogramParameterfv = extproc; glGetHistogramParameterfv(target, pname, params); } static void APIENTRY InitGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogramParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogramParameteriv = extproc; glGetHistogramParameteriv(target, pname, params); } static void APIENTRY InitGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmax"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmax = extproc; glGetMinmax(target, reset, format, type, values); } static void APIENTRY InitGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmaxParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmaxParameterfv = extproc; glGetMinmaxParameterfv(target, pname, params); } static void APIENTRY InitGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmaxParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmaxParameteriv = extproc; glGetMinmaxParameteriv(target, pname, params); } static void APIENTRY InitHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { void *extproc; extproc = (void *) wglGetProcAddress("glHistogram"); if (extproc == NULL) { _ASSERT(0); return; } glHistogram = extproc; glHistogram(target, width, internalformat, sink); } static void APIENTRY InitMinmax (GLenum target, GLenum internalformat, GLboolean sink) { void *extproc; extproc = (void *) wglGetProcAddress("glMinmax"); if (extproc == NULL) { _ASSERT(0); return; } glMinmax = extproc; glMinmax(target, internalformat, sink); } static void APIENTRY InitResetHistogram (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glResetHistogram"); if (extproc == NULL) { _ASSERT(0); return; } glResetHistogram = extproc; glResetHistogram(target); } static void APIENTRY InitResetMinmax (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glResetMinmax"); if (extproc == NULL) { _ASSERT(0); return; } glResetMinmax = extproc; glResetMinmax(target); } static void APIENTRY InitTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexImage3D"); if (extproc == NULL) { _ASSERT(0); return; } glTexImage3D = extproc; glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); } static void APIENTRY InitTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexSubImage3D"); if (extproc == NULL) { _ASSERT(0); return; } glTexSubImage3D = extproc; glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } static void APIENTRY InitCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexSubImage3D"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexSubImage3D = extproc; glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); } static void APIENTRY InitActiveTexture (GLenum texture) { void *extproc; extproc = (void *) wglGetProcAddress("glActiveTexture"); if (extproc == NULL) { _ASSERT(0); return; } glActiveTexture = extproc; glActiveTexture(texture); } static void APIENTRY InitClientActiveTexture (GLenum texture) { void *extproc; extproc = (void *) wglGetProcAddress("glClientActiveTexture"); if (extproc == NULL) { _ASSERT(0); return; } glClientActiveTexture = extproc; glClientActiveTexture(texture); } static void APIENTRY InitMultiTexCoord1d (GLenum target, GLdouble s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1d"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1d = extproc; glMultiTexCoord1d(target, s); } static void APIENTRY InitMultiTexCoord1dv (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1dv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1dv = extproc; glMultiTexCoord1dv(target, v); } static void APIENTRY InitMultiTexCoord1f (GLenum target, GLfloat s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1f"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1f = extproc; glMultiTexCoord1f(target, s); } static void APIENTRY InitMultiTexCoord1fv (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1fv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1fv = extproc; glMultiTexCoord1fv(target, v); } static void APIENTRY InitMultiTexCoord1i (GLenum target, GLint s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1i"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1i = extproc; glMultiTexCoord1i(target, s); } static void APIENTRY InitMultiTexCoord1iv (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1iv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1iv = extproc; glMultiTexCoord1iv(target, v); } static void APIENTRY InitMultiTexCoord1s (GLenum target, GLshort s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1s"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1s = extproc; glMultiTexCoord1s(target, s); } static void APIENTRY InitMultiTexCoord1sv (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1sv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1sv = extproc; glMultiTexCoord1sv(target, v); } static void APIENTRY InitMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2d"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2d = extproc; glMultiTexCoord2d(target, s, t); } static void APIENTRY InitMultiTexCoord2dv (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2dv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2dv = extproc; glMultiTexCoord2dv(target, v); } static void APIENTRY InitMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2f"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2f = extproc; glMultiTexCoord2f(target, s, t); } static void APIENTRY InitMultiTexCoord2fv (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2fv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2fv = extproc; glMultiTexCoord2fv(target, v); } static void APIENTRY InitMultiTexCoord2i (GLenum target, GLint s, GLint t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2i"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2i = extproc; glMultiTexCoord2i(target, s, t); } static void APIENTRY InitMultiTexCoord2iv (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2iv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2iv = extproc; glMultiTexCoord2iv(target, v); } static void APIENTRY InitMultiTexCoord2s (GLenum target, GLshort s, GLshort t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2s"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2s = extproc; glMultiTexCoord2s(target, s, t); } static void APIENTRY InitMultiTexCoord2sv (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2sv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2sv = extproc; glMultiTexCoord2sv(target, v); } static void APIENTRY InitMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3d"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3d = extproc; glMultiTexCoord3d(target, s, t, r); } static void APIENTRY InitMultiTexCoord3dv (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3dv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3dv = extproc; glMultiTexCoord3dv(target, v); } static void APIENTRY InitMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3f"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3f = extproc; glMultiTexCoord3f(target, s, t, r); } static void APIENTRY InitMultiTexCoord3fv (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3fv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3fv = extproc; glMultiTexCoord3fv(target, v); } static void APIENTRY InitMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3i"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3i = extproc; glMultiTexCoord3i(target, s, t, r); } static void APIENTRY InitMultiTexCoord3iv (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3iv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3iv = extproc; glMultiTexCoord3iv(target, v); } static void APIENTRY InitMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3s"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3s = extproc; glMultiTexCoord3s(target, s, t, r); } static void APIENTRY InitMultiTexCoord3sv (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3sv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3sv = extproc; glMultiTexCoord3sv(target, v); } static void APIENTRY InitMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4d"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4d = extproc; glMultiTexCoord4d(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4dv (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4dv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4dv = extproc; glMultiTexCoord4dv(target, v); } static void APIENTRY InitMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4f"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4f = extproc; glMultiTexCoord4f(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4fv (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4fv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4fv = extproc; glMultiTexCoord4fv(target, v); } static void APIENTRY InitMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4i"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4i = extproc; glMultiTexCoord4i(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4iv (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4iv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4iv = extproc; glMultiTexCoord4iv(target, v); } static void APIENTRY InitMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4s"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4s = extproc; glMultiTexCoord4s(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4sv (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4sv"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4sv = extproc; glMultiTexCoord4sv(target, v); } static void APIENTRY InitLoadTransposeMatrixf (const GLfloat *m) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadTransposeMatrixf"); if (extproc == NULL) { _ASSERT(0); return; } glLoadTransposeMatrixf = extproc; glLoadTransposeMatrixf(m); } static void APIENTRY InitLoadTransposeMatrixd (const GLdouble *m) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadTransposeMatrixd"); if (extproc == NULL) { _ASSERT(0); return; } glLoadTransposeMatrixd = extproc; glLoadTransposeMatrixd(m); } static void APIENTRY InitMultTransposeMatrixf (const GLfloat *m) { void *extproc; extproc = (void *) wglGetProcAddress("glMultTransposeMatrixf"); if (extproc == NULL) { _ASSERT(0); return; } glMultTransposeMatrixf = extproc; glMultTransposeMatrixf(m); } static void APIENTRY InitMultTransposeMatrixd (const GLdouble *m) { void *extproc; extproc = (void *) wglGetProcAddress("glMultTransposeMatrixd"); if (extproc == NULL) { _ASSERT(0); return; } glMultTransposeMatrixd = extproc; glMultTransposeMatrixd(m); } static void APIENTRY InitSampleCoverage (GLclampf value, GLboolean invert) { void *extproc; extproc = (void *) wglGetProcAddress("glSampleCoverage"); if (extproc == NULL) { _ASSERT(0); return; } glSampleCoverage = extproc; glSampleCoverage(value, invert); } static void APIENTRY InitCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage3D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage3D = extproc; glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); } static void APIENTRY InitCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage2D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage2D = extproc; glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); } static void APIENTRY InitCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage1D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage1D = extproc; glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); } static void APIENTRY InitCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage3D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage3D = extproc; glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } static void APIENTRY InitCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage2D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage2D = extproc; glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); } static void APIENTRY InitCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage1D"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage1D = extproc; glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); } static void APIENTRY InitGetCompressedTexImage (GLenum target, GLint level, GLvoid *img) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCompressedTexImage"); if (extproc == NULL) { _ASSERT(0); return; } glGetCompressedTexImage = extproc; glGetCompressedTexImage(target, level, img); } static void APIENTRY InitBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendFuncSeparate"); if (extproc == NULL) { _ASSERT(0); return; } glBlendFuncSeparate = extproc; glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } static void APIENTRY InitFogCoordf (GLfloat coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordf"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordf = extproc; glFogCoordf(coord); } static void APIENTRY InitFogCoordfv (const GLfloat *coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordfv"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordfv = extproc; glFogCoordfv(coord); } static void APIENTRY InitFogCoordd (GLdouble coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordd"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordd = extproc; glFogCoordd(coord); } static void APIENTRY InitFogCoorddv (const GLdouble *coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoorddv"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoorddv = extproc; glFogCoorddv(coord); } static void APIENTRY InitFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordPointer"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordPointer = extproc; glFogCoordPointer(type, stride, pointer); } static void APIENTRY InitMultiDrawArrays (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawArrays"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawArrays = extproc; glMultiDrawArrays(mode, first, count, primcount); } static void APIENTRY InitMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawElements"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawElements = extproc; glMultiDrawElements(mode, count, type, indices, primcount); } static void APIENTRY InitPointParameterf (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterf"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterf = extproc; glPointParameterf(pname, param); } static void APIENTRY InitPointParameterfv (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfv"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfv = extproc; glPointParameterfv(pname, params); } static void APIENTRY InitPointParameteri (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameteri"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameteri = extproc; glPointParameteri(pname, param); } static void APIENTRY InitPointParameteriv (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameteriv = extproc; glPointParameteriv(pname, params); } static void APIENTRY InitSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3b"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3b = extproc; glSecondaryColor3b(red, green, blue); } static void APIENTRY InitSecondaryColor3bv (const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3bv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3bv = extproc; glSecondaryColor3bv(v); } static void APIENTRY InitSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3d"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3d = extproc; glSecondaryColor3d(red, green, blue); } static void APIENTRY InitSecondaryColor3dv (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3dv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3dv = extproc; glSecondaryColor3dv(v); } static void APIENTRY InitSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3f"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3f = extproc; glSecondaryColor3f(red, green, blue); } static void APIENTRY InitSecondaryColor3fv (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3fv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3fv = extproc; glSecondaryColor3fv(v); } static void APIENTRY InitSecondaryColor3i (GLint red, GLint green, GLint blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3i"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3i = extproc; glSecondaryColor3i(red, green, blue); } static void APIENTRY InitSecondaryColor3iv (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3iv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3iv = extproc; glSecondaryColor3iv(v); } static void APIENTRY InitSecondaryColor3s (GLshort red, GLshort green, GLshort blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3s"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3s = extproc; glSecondaryColor3s(red, green, blue); } static void APIENTRY InitSecondaryColor3sv (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3sv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3sv = extproc; glSecondaryColor3sv(v); } static void APIENTRY InitSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ub"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ub = extproc; glSecondaryColor3ub(red, green, blue); } static void APIENTRY InitSecondaryColor3ubv (const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ubv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ubv = extproc; glSecondaryColor3ubv(v); } static void APIENTRY InitSecondaryColor3ui (GLuint red, GLuint green, GLuint blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ui"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ui = extproc; glSecondaryColor3ui(red, green, blue); } static void APIENTRY InitSecondaryColor3uiv (const GLuint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3uiv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3uiv = extproc; glSecondaryColor3uiv(v); } static void APIENTRY InitSecondaryColor3us (GLushort red, GLushort green, GLushort blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3us"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3us = extproc; glSecondaryColor3us(red, green, blue); } static void APIENTRY InitSecondaryColor3usv (const GLushort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3usv"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3usv = extproc; glSecondaryColor3usv(v); } static void APIENTRY InitSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColorPointer"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColorPointer = extproc; glSecondaryColorPointer(size, type, stride, pointer); } static void APIENTRY InitWindowPos2d (GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2d"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2d = extproc; glWindowPos2d(x, y); } static void APIENTRY InitWindowPos2dv (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2dv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2dv = extproc; glWindowPos2dv(v); } static void APIENTRY InitWindowPos2f (GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2f"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2f = extproc; glWindowPos2f(x, y); } static void APIENTRY InitWindowPos2fv (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2fv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2fv = extproc; glWindowPos2fv(v); } static void APIENTRY InitWindowPos2i (GLint x, GLint y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2i"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2i = extproc; glWindowPos2i(x, y); } static void APIENTRY InitWindowPos2iv (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2iv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2iv = extproc; glWindowPos2iv(v); } static void APIENTRY InitWindowPos2s (GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2s"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2s = extproc; glWindowPos2s(x, y); } static void APIENTRY InitWindowPos2sv (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2sv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2sv = extproc; glWindowPos2sv(v); } static void APIENTRY InitWindowPos3d (GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3d"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3d = extproc; glWindowPos3d(x, y, z); } static void APIENTRY InitWindowPos3dv (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3dv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3dv = extproc; glWindowPos3dv(v); } static void APIENTRY InitWindowPos3f (GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3f"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3f = extproc; glWindowPos3f(x, y, z); } static void APIENTRY InitWindowPos3fv (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3fv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3fv = extproc; glWindowPos3fv(v); } static void APIENTRY InitWindowPos3i (GLint x, GLint y, GLint z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3i"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3i = extproc; glWindowPos3i(x, y, z); } static void APIENTRY InitWindowPos3iv (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3iv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3iv = extproc; glWindowPos3iv(v); } static void APIENTRY InitWindowPos3s (GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3s"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3s = extproc; glWindowPos3s(x, y, z); } static void APIENTRY InitWindowPos3sv (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3sv"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3sv = extproc; glWindowPos3sv(v); } static void APIENTRY InitGenQueries (GLsizei n, GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glGenQueries"); if (extproc == NULL) { _ASSERT(0); return; } glGenQueries = extproc; glGenQueries(n, ids); } static void APIENTRY InitDeleteQueries (GLsizei n, const GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteQueries"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteQueries = extproc; glDeleteQueries(n, ids); } static GLboolean APIENTRY InitIsQuery (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glIsQuery"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsQuery = extproc; return glIsQuery(id); } static void APIENTRY InitBeginQuery (GLenum target, GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBeginQuery"); if (extproc == NULL) { _ASSERT(0); return; } glBeginQuery = extproc; glBeginQuery(target, id); } static void APIENTRY InitEndQuery (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glEndQuery"); if (extproc == NULL) { _ASSERT(0); return; } glEndQuery = extproc; glEndQuery(target); } static void APIENTRY InitGetQueryiv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryiv"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryiv = extproc; glGetQueryiv(target, pname, params); } static void APIENTRY InitGetQueryObjectiv (GLuint id, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryObjectiv"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryObjectiv = extproc; glGetQueryObjectiv(id, pname, params); } static void APIENTRY InitGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryObjectuiv"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryObjectuiv = extproc; glGetQueryObjectuiv(id, pname, params); } static void APIENTRY InitBindBuffer (GLenum target, GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glBindBuffer"); if (extproc == NULL) { _ASSERT(0); return; } glBindBuffer = extproc; glBindBuffer(target, buffer); } static void APIENTRY InitDeleteBuffers (GLsizei n, const GLuint *buffers) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteBuffers"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteBuffers = extproc; glDeleteBuffers(n, buffers); } static void APIENTRY InitGenBuffers (GLsizei n, GLuint *buffers) { void *extproc; extproc = (void *) wglGetProcAddress("glGenBuffers"); if (extproc == NULL) { _ASSERT(0); return; } glGenBuffers = extproc; glGenBuffers(n, buffers); } static GLboolean APIENTRY InitIsBuffer (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glIsBuffer"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsBuffer = extproc; return glIsBuffer(buffer); } static void APIENTRY InitBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) { void *extproc; extproc = (void *) wglGetProcAddress("glBufferData"); if (extproc == NULL) { _ASSERT(0); return; } glBufferData = extproc; glBufferData(target, size, data, usage); } static void APIENTRY InitBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glBufferSubData"); if (extproc == NULL) { _ASSERT(0); return; } glBufferSubData = extproc; glBufferSubData(target, offset, size, data); } static void APIENTRY InitGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferSubData"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferSubData = extproc; glGetBufferSubData(target, offset, size, data); } static GLvoid* APIENTRY InitMapBuffer (GLenum target, GLenum access) { void *extproc; extproc = (void *) wglGetProcAddress("glMapBuffer"); if (extproc == NULL) { _ASSERT(0); return 0; } glMapBuffer = extproc; return glMapBuffer(target, access); } static GLboolean APIENTRY InitUnmapBuffer (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glUnmapBuffer"); if (extproc == NULL) { _ASSERT(0); return 0; } glUnmapBuffer = extproc; return glUnmapBuffer(target); } static void APIENTRY InitGetBufferParameteriv (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferParameteriv"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferParameteriv = extproc; glGetBufferParameteriv(target, pname, params); } static void APIENTRY InitGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferPointerv"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferPointerv = extproc; glGetBufferPointerv(target, pname, params); } static void APIENTRY InitActiveTextureARB (GLenum texture) { void *extproc; extproc = (void *) wglGetProcAddress("glActiveTextureARB"); if (extproc == NULL) { _ASSERT(0); return; } glActiveTextureARB = extproc; glActiveTextureARB(texture); } static void APIENTRY InitClientActiveTextureARB (GLenum texture) { void *extproc; extproc = (void *) wglGetProcAddress("glClientActiveTextureARB"); if (extproc == NULL) { _ASSERT(0); return; } glClientActiveTextureARB = extproc; glClientActiveTextureARB(texture); } static void APIENTRY InitMultiTexCoord1dARB (GLenum target, GLdouble s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1dARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1dARB = extproc; glMultiTexCoord1dARB(target, s); } static void APIENTRY InitMultiTexCoord1dvARB (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1dvARB = extproc; glMultiTexCoord1dvARB(target, v); } static void APIENTRY InitMultiTexCoord1fARB (GLenum target, GLfloat s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1fARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1fARB = extproc; glMultiTexCoord1fARB(target, s); } static void APIENTRY InitMultiTexCoord1fvARB (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1fvARB = extproc; glMultiTexCoord1fvARB(target, v); } static void APIENTRY InitMultiTexCoord1iARB (GLenum target, GLint s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1iARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1iARB = extproc; glMultiTexCoord1iARB(target, s); } static void APIENTRY InitMultiTexCoord1ivARB (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1ivARB = extproc; glMultiTexCoord1ivARB(target, v); } static void APIENTRY InitMultiTexCoord1sARB (GLenum target, GLshort s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1sARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1sARB = extproc; glMultiTexCoord1sARB(target, s); } static void APIENTRY InitMultiTexCoord1svARB (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1svARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1svARB = extproc; glMultiTexCoord1svARB(target, v); } static void APIENTRY InitMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2dARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2dARB = extproc; glMultiTexCoord2dARB(target, s, t); } static void APIENTRY InitMultiTexCoord2dvARB (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2dvARB = extproc; glMultiTexCoord2dvARB(target, v); } static void APIENTRY InitMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2fARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2fARB = extproc; glMultiTexCoord2fARB(target, s, t); } static void APIENTRY InitMultiTexCoord2fvARB (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2fvARB = extproc; glMultiTexCoord2fvARB(target, v); } static void APIENTRY InitMultiTexCoord2iARB (GLenum target, GLint s, GLint t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2iARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2iARB = extproc; glMultiTexCoord2iARB(target, s, t); } static void APIENTRY InitMultiTexCoord2ivARB (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2ivARB = extproc; glMultiTexCoord2ivARB(target, v); } static void APIENTRY InitMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2sARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2sARB = extproc; glMultiTexCoord2sARB(target, s, t); } static void APIENTRY InitMultiTexCoord2svARB (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2svARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2svARB = extproc; glMultiTexCoord2svARB(target, v); } static void APIENTRY InitMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3dARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3dARB = extproc; glMultiTexCoord3dARB(target, s, t, r); } static void APIENTRY InitMultiTexCoord3dvARB (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3dvARB = extproc; glMultiTexCoord3dvARB(target, v); } static void APIENTRY InitMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3fARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3fARB = extproc; glMultiTexCoord3fARB(target, s, t, r); } static void APIENTRY InitMultiTexCoord3fvARB (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3fvARB = extproc; glMultiTexCoord3fvARB(target, v); } static void APIENTRY InitMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3iARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3iARB = extproc; glMultiTexCoord3iARB(target, s, t, r); } static void APIENTRY InitMultiTexCoord3ivARB (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3ivARB = extproc; glMultiTexCoord3ivARB(target, v); } static void APIENTRY InitMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3sARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3sARB = extproc; glMultiTexCoord3sARB(target, s, t, r); } static void APIENTRY InitMultiTexCoord3svARB (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3svARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3svARB = extproc; glMultiTexCoord3svARB(target, v); } static void APIENTRY InitMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4dARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4dARB = extproc; glMultiTexCoord4dARB(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4dvARB (GLenum target, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4dvARB = extproc; glMultiTexCoord4dvARB(target, v); } static void APIENTRY InitMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4fARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4fARB = extproc; glMultiTexCoord4fARB(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4fvARB (GLenum target, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4fvARB = extproc; glMultiTexCoord4fvARB(target, v); } static void APIENTRY InitMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4iARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4iARB = extproc; glMultiTexCoord4iARB(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4ivARB (GLenum target, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4ivARB = extproc; glMultiTexCoord4ivARB(target, v); } static void APIENTRY InitMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4sARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4sARB = extproc; glMultiTexCoord4sARB(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4svARB (GLenum target, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4svARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4svARB = extproc; glMultiTexCoord4svARB(target, v); } static void APIENTRY InitLoadTransposeMatrixfARB (const GLfloat *m) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadTransposeMatrixfARB"); if (extproc == NULL) { _ASSERT(0); return; } glLoadTransposeMatrixfARB = extproc; glLoadTransposeMatrixfARB(m); } static void APIENTRY InitLoadTransposeMatrixdARB (const GLdouble *m) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadTransposeMatrixdARB"); if (extproc == NULL) { _ASSERT(0); return; } glLoadTransposeMatrixdARB = extproc; glLoadTransposeMatrixdARB(m); } static void APIENTRY InitMultTransposeMatrixfARB (const GLfloat *m) { void *extproc; extproc = (void *) wglGetProcAddress("glMultTransposeMatrixfARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultTransposeMatrixfARB = extproc; glMultTransposeMatrixfARB(m); } static void APIENTRY InitMultTransposeMatrixdARB (const GLdouble *m) { void *extproc; extproc = (void *) wglGetProcAddress("glMultTransposeMatrixdARB"); if (extproc == NULL) { _ASSERT(0); return; } glMultTransposeMatrixdARB = extproc; glMultTransposeMatrixdARB(m); } static void APIENTRY InitSampleCoverageARB (GLclampf value, GLboolean invert) { void *extproc; extproc = (void *) wglGetProcAddress("glSampleCoverageARB"); if (extproc == NULL) { _ASSERT(0); return; } glSampleCoverageARB = extproc; glSampleCoverageARB(value, invert); } static void APIENTRY InitCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage3DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage3DARB = extproc; glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data); } static void APIENTRY InitCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage2DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage2DARB = extproc; glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data); } static void APIENTRY InitCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexImage1DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexImage1DARB = extproc; glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data); } static void APIENTRY InitCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage3DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage3DARB = extproc; glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } static void APIENTRY InitCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage2DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage2DARB = extproc; glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data); } static void APIENTRY InitCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glCompressedTexSubImage1DARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompressedTexSubImage1DARB = extproc; glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data); } static void APIENTRY InitGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCompressedTexImageARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetCompressedTexImageARB = extproc; glGetCompressedTexImageARB(target, level, img); } static void APIENTRY InitPointParameterfARB (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfARB"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfARB = extproc; glPointParameterfARB(pname, param); } static void APIENTRY InitPointParameterfvARB (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfvARB = extproc; glPointParameterfvARB(pname, params); } static void APIENTRY InitWeightbvARB (GLint size, const GLbyte *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightbvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightbvARB = extproc; glWeightbvARB(size, weights); } static void APIENTRY InitWeightsvARB (GLint size, const GLshort *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightsvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightsvARB = extproc; glWeightsvARB(size, weights); } static void APIENTRY InitWeightivARB (GLint size, const GLint *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightivARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightivARB = extproc; glWeightivARB(size, weights); } static void APIENTRY InitWeightfvARB (GLint size, const GLfloat *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightfvARB = extproc; glWeightfvARB(size, weights); } static void APIENTRY InitWeightdvARB (GLint size, const GLdouble *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightdvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightdvARB = extproc; glWeightdvARB(size, weights); } static void APIENTRY InitWeightubvARB (GLint size, const GLubyte *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightubvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightubvARB = extproc; glWeightubvARB(size, weights); } static void APIENTRY InitWeightusvARB (GLint size, const GLushort *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightusvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightusvARB = extproc; glWeightusvARB(size, weights); } static void APIENTRY InitWeightuivARB (GLint size, const GLuint *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightuivARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightuivARB = extproc; glWeightuivARB(size, weights); } static void APIENTRY InitWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glWeightPointerARB"); if (extproc == NULL) { _ASSERT(0); return; } glWeightPointerARB = extproc; glWeightPointerARB(size, type, stride, pointer); } static void APIENTRY InitVertexBlendARB (GLint count) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexBlendARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexBlendARB = extproc; glVertexBlendARB(count); } static void APIENTRY InitCurrentPaletteMatrixARB (GLint index) { void *extproc; extproc = (void *) wglGetProcAddress("glCurrentPaletteMatrixARB"); if (extproc == NULL) { _ASSERT(0); return; } glCurrentPaletteMatrixARB = extproc; glCurrentPaletteMatrixARB(index); } static void APIENTRY InitMatrixIndexubvARB (GLint size, const GLubyte *indices) { void *extproc; extproc = (void *) wglGetProcAddress("glMatrixIndexubvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMatrixIndexubvARB = extproc; glMatrixIndexubvARB(size, indices); } static void APIENTRY InitMatrixIndexusvARB (GLint size, const GLushort *indices) { void *extproc; extproc = (void *) wglGetProcAddress("glMatrixIndexusvARB"); if (extproc == NULL) { _ASSERT(0); return; } glMatrixIndexusvARB = extproc; glMatrixIndexusvARB(size, indices); } static void APIENTRY InitMatrixIndexuivARB (GLint size, const GLuint *indices) { void *extproc; extproc = (void *) wglGetProcAddress("glMatrixIndexuivARB"); if (extproc == NULL) { _ASSERT(0); return; } glMatrixIndexuivARB = extproc; glMatrixIndexuivARB(size, indices); } static void APIENTRY InitMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glMatrixIndexPointerARB"); if (extproc == NULL) { _ASSERT(0); return; } glMatrixIndexPointerARB = extproc; glMatrixIndexPointerARB(size, type, stride, pointer); } static void APIENTRY InitWindowPos2dARB (GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2dARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2dARB = extproc; glWindowPos2dARB(x, y); } static void APIENTRY InitWindowPos2dvARB (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2dvARB = extproc; glWindowPos2dvARB(v); } static void APIENTRY InitWindowPos2fARB (GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2fARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2fARB = extproc; glWindowPos2fARB(x, y); } static void APIENTRY InitWindowPos2fvARB (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2fvARB = extproc; glWindowPos2fvARB(v); } static void APIENTRY InitWindowPos2iARB (GLint x, GLint y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2iARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2iARB = extproc; glWindowPos2iARB(x, y); } static void APIENTRY InitWindowPos2ivARB (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2ivARB = extproc; glWindowPos2ivARB(v); } static void APIENTRY InitWindowPos2sARB (GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2sARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2sARB = extproc; glWindowPos2sARB(x, y); } static void APIENTRY InitWindowPos2svARB (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2svARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2svARB = extproc; glWindowPos2svARB(v); } static void APIENTRY InitWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3dARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3dARB = extproc; glWindowPos3dARB(x, y, z); } static void APIENTRY InitWindowPos3dvARB (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3dvARB = extproc; glWindowPos3dvARB(v); } static void APIENTRY InitWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3fARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3fARB = extproc; glWindowPos3fARB(x, y, z); } static void APIENTRY InitWindowPos3fvARB (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3fvARB = extproc; glWindowPos3fvARB(v); } static void APIENTRY InitWindowPos3iARB (GLint x, GLint y, GLint z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3iARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3iARB = extproc; glWindowPos3iARB(x, y, z); } static void APIENTRY InitWindowPos3ivARB (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3ivARB = extproc; glWindowPos3ivARB(v); } static void APIENTRY InitWindowPos3sARB (GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3sARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3sARB = extproc; glWindowPos3sARB(x, y, z); } static void APIENTRY InitWindowPos3svARB (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3svARB"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3svARB = extproc; glWindowPos3svARB(v); } static void APIENTRY InitVertexAttrib1dARB (GLuint index, GLdouble x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1dARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1dARB = extproc; glVertexAttrib1dARB(index, x); } static void APIENTRY InitVertexAttrib1dvARB (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1dvARB = extproc; glVertexAttrib1dvARB(index, v); } static void APIENTRY InitVertexAttrib1fARB (GLuint index, GLfloat x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1fARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1fARB = extproc; glVertexAttrib1fARB(index, x); } static void APIENTRY InitVertexAttrib1fvARB (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1fvARB = extproc; glVertexAttrib1fvARB(index, v); } static void APIENTRY InitVertexAttrib1sARB (GLuint index, GLshort x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1sARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1sARB = extproc; glVertexAttrib1sARB(index, x); } static void APIENTRY InitVertexAttrib1svARB (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1svARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1svARB = extproc; glVertexAttrib1svARB(index, v); } static void APIENTRY InitVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2dARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2dARB = extproc; glVertexAttrib2dARB(index, x, y); } static void APIENTRY InitVertexAttrib2dvARB (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2dvARB = extproc; glVertexAttrib2dvARB(index, v); } static void APIENTRY InitVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2fARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2fARB = extproc; glVertexAttrib2fARB(index, x, y); } static void APIENTRY InitVertexAttrib2fvARB (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2fvARB = extproc; glVertexAttrib2fvARB(index, v); } static void APIENTRY InitVertexAttrib2sARB (GLuint index, GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2sARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2sARB = extproc; glVertexAttrib2sARB(index, x, y); } static void APIENTRY InitVertexAttrib2svARB (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2svARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2svARB = extproc; glVertexAttrib2svARB(index, v); } static void APIENTRY InitVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3dARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3dARB = extproc; glVertexAttrib3dARB(index, x, y, z); } static void APIENTRY InitVertexAttrib3dvARB (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3dvARB = extproc; glVertexAttrib3dvARB(index, v); } static void APIENTRY InitVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3fARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3fARB = extproc; glVertexAttrib3fARB(index, x, y, z); } static void APIENTRY InitVertexAttrib3fvARB (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3fvARB = extproc; glVertexAttrib3fvARB(index, v); } static void APIENTRY InitVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3sARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3sARB = extproc; glVertexAttrib3sARB(index, x, y, z); } static void APIENTRY InitVertexAttrib3svARB (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3svARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3svARB = extproc; glVertexAttrib3svARB(index, v); } static void APIENTRY InitVertexAttrib4NbvARB (GLuint index, const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NbvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NbvARB = extproc; glVertexAttrib4NbvARB(index, v); } static void APIENTRY InitVertexAttrib4NivARB (GLuint index, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NivARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NivARB = extproc; glVertexAttrib4NivARB(index, v); } static void APIENTRY InitVertexAttrib4NsvARB (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NsvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NsvARB = extproc; glVertexAttrib4NsvARB(index, v); } static void APIENTRY InitVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NubARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NubARB = extproc; glVertexAttrib4NubARB(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4NubvARB (GLuint index, const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NubvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NubvARB = extproc; glVertexAttrib4NubvARB(index, v); } static void APIENTRY InitVertexAttrib4NuivARB (GLuint index, const GLuint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NuivARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NuivARB = extproc; glVertexAttrib4NuivARB(index, v); } static void APIENTRY InitVertexAttrib4NusvARB (GLuint index, const GLushort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4NusvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4NusvARB = extproc; glVertexAttrib4NusvARB(index, v); } static void APIENTRY InitVertexAttrib4bvARB (GLuint index, const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4bvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4bvARB = extproc; glVertexAttrib4bvARB(index, v); } static void APIENTRY InitVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4dARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4dARB = extproc; glVertexAttrib4dARB(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4dvARB (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4dvARB = extproc; glVertexAttrib4dvARB(index, v); } static void APIENTRY InitVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4fARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4fARB = extproc; glVertexAttrib4fARB(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4fvARB (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4fvARB = extproc; glVertexAttrib4fvARB(index, v); } static void APIENTRY InitVertexAttrib4ivARB (GLuint index, const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4ivARB = extproc; glVertexAttrib4ivARB(index, v); } static void APIENTRY InitVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4sARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4sARB = extproc; glVertexAttrib4sARB(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4svARB (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4svARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4svARB = extproc; glVertexAttrib4svARB(index, v); } static void APIENTRY InitVertexAttrib4ubvARB (GLuint index, const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4ubvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4ubvARB = extproc; glVertexAttrib4ubvARB(index, v); } static void APIENTRY InitVertexAttrib4uivARB (GLuint index, const GLuint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4uivARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4uivARB = extproc; glVertexAttrib4uivARB(index, v); } static void APIENTRY InitVertexAttrib4usvARB (GLuint index, const GLushort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4usvARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4usvARB = extproc; glVertexAttrib4usvARB(index, v); } static void APIENTRY InitVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribPointerARB"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribPointerARB = extproc; glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); } static void APIENTRY InitEnableVertexAttribArrayARB (GLuint index) { void *extproc; extproc = (void *) wglGetProcAddress("glEnableVertexAttribArrayARB"); if (extproc == NULL) { _ASSERT(0); return; } glEnableVertexAttribArrayARB = extproc; glEnableVertexAttribArrayARB(index); } static void APIENTRY InitDisableVertexAttribArrayARB (GLuint index) { void *extproc; extproc = (void *) wglGetProcAddress("glDisableVertexAttribArrayARB"); if (extproc == NULL) { _ASSERT(0); return; } glDisableVertexAttribArrayARB = extproc; glDisableVertexAttribArrayARB(index); } static void APIENTRY InitProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramStringARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramStringARB = extproc; glProgramStringARB(target, format, len, string); } static void APIENTRY InitBindProgramARB (GLenum target, GLuint program) { void *extproc; extproc = (void *) wglGetProcAddress("glBindProgramARB"); if (extproc == NULL) { _ASSERT(0); return; } glBindProgramARB = extproc; glBindProgramARB(target, program); } static void APIENTRY InitDeleteProgramsARB (GLsizei n, const GLuint *programs) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteProgramsARB"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteProgramsARB = extproc; glDeleteProgramsARB(n, programs); } static void APIENTRY InitGenProgramsARB (GLsizei n, GLuint *programs) { void *extproc; extproc = (void *) wglGetProcAddress("glGenProgramsARB"); if (extproc == NULL) { _ASSERT(0); return; } glGenProgramsARB = extproc; glGenProgramsARB(n, programs); } static void APIENTRY InitProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramEnvParameter4dARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramEnvParameter4dARB = extproc; glProgramEnvParameter4dARB(target, index, x, y, z, w); } static void APIENTRY InitProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramEnvParameter4dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramEnvParameter4dvARB = extproc; glProgramEnvParameter4dvARB(target, index, params); } static void APIENTRY InitProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramEnvParameter4fARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramEnvParameter4fARB = extproc; glProgramEnvParameter4fARB(target, index, x, y, z, w); } static void APIENTRY InitProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramEnvParameter4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramEnvParameter4fvARB = extproc; glProgramEnvParameter4fvARB(target, index, params); } static void APIENTRY InitProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramLocalParameter4dARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramLocalParameter4dARB = extproc; glProgramLocalParameter4dARB(target, index, x, y, z, w); } static void APIENTRY InitProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramLocalParameter4dvARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramLocalParameter4dvARB = extproc; glProgramLocalParameter4dvARB(target, index, params); } static void APIENTRY InitProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramLocalParameter4fARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramLocalParameter4fARB = extproc; glProgramLocalParameter4fARB(target, index, x, y, z, w); } static void APIENTRY InitProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramLocalParameter4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glProgramLocalParameter4fvARB = extproc; glProgramLocalParameter4fvARB(target, index, params); } static void APIENTRY InitGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramEnvParameterdvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramEnvParameterdvARB = extproc; glGetProgramEnvParameterdvARB(target, index, params); } static void APIENTRY InitGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramEnvParameterfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramEnvParameterfvARB = extproc; glGetProgramEnvParameterfvARB(target, index, params); } static void APIENTRY InitGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramLocalParameterdvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramLocalParameterdvARB = extproc; glGetProgramLocalParameterdvARB(target, index, params); } static void APIENTRY InitGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramLocalParameterfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramLocalParameterfvARB = extproc; glGetProgramLocalParameterfvARB(target, index, params); } static void APIENTRY InitGetProgramivARB (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramivARB = extproc; glGetProgramivARB(target, pname, params); } static void APIENTRY InitGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramStringARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramStringARB = extproc; glGetProgramStringARB(target, pname, string); } static void APIENTRY InitGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribdvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribdvARB = extproc; glGetVertexAttribdvARB(index, pname, params); } static void APIENTRY InitGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribfvARB = extproc; glGetVertexAttribfvARB(index, pname, params); } static void APIENTRY InitGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribivARB = extproc; glGetVertexAttribivARB(index, pname, params); } static void APIENTRY InitGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribPointervARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribPointervARB = extproc; glGetVertexAttribPointervARB(index, pname, pointer); } static GLboolean APIENTRY InitIsProgramARB (GLuint program) { void *extproc; extproc = (void *) wglGetProcAddress("glIsProgramARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsProgramARB = extproc; return glIsProgramARB(program); } static void APIENTRY InitBindBufferARB (GLenum target, GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glBindBufferARB"); if (extproc == NULL) { _ASSERT(0); return; } glBindBufferARB = extproc; glBindBufferARB(target, buffer); } static void APIENTRY InitDeleteBuffersARB (GLsizei n, const GLuint *buffers) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteBuffersARB"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteBuffersARB = extproc; glDeleteBuffersARB(n, buffers); } static void APIENTRY InitGenBuffersARB (GLsizei n, GLuint *buffers) { void *extproc; extproc = (void *) wglGetProcAddress("glGenBuffersARB"); if (extproc == NULL) { _ASSERT(0); return; } glGenBuffersARB = extproc; glGenBuffersARB(n, buffers); } static GLboolean APIENTRY InitIsBufferARB (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glIsBufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsBufferARB = extproc; return glIsBufferARB(buffer); } static void APIENTRY InitBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage) { void *extproc; extproc = (void *) wglGetProcAddress("glBufferDataARB"); if (extproc == NULL) { _ASSERT(0); return; } glBufferDataARB = extproc; glBufferDataARB(target, size, data, usage); } static void APIENTRY InitBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glBufferSubDataARB"); if (extproc == NULL) { _ASSERT(0); return; } glBufferSubDataARB = extproc; glBufferSubDataARB(target, offset, size, data); } static void APIENTRY InitGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferSubDataARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferSubDataARB = extproc; glGetBufferSubDataARB(target, offset, size, data); } static GLvoid* APIENTRY InitMapBufferARB (GLenum target, GLenum access) { void *extproc; extproc = (void *) wglGetProcAddress("glMapBufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glMapBufferARB = extproc; return glMapBufferARB(target, access); } static GLboolean APIENTRY InitUnmapBufferARB (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glUnmapBufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glUnmapBufferARB = extproc; return glUnmapBufferARB(target); } static void APIENTRY InitGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferParameterivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferParameterivARB = extproc; glGetBufferParameterivARB(target, pname, params); } static void APIENTRY InitGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetBufferPointervARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetBufferPointervARB = extproc; glGetBufferPointervARB(target, pname, params); } static void APIENTRY InitGenQueriesARB (GLsizei n, GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glGenQueriesARB"); if (extproc == NULL) { _ASSERT(0); return; } glGenQueriesARB = extproc; glGenQueriesARB(n, ids); } static void APIENTRY InitDeleteQueriesARB (GLsizei n, const GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteQueriesARB"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteQueriesARB = extproc; glDeleteQueriesARB(n, ids); } static GLboolean APIENTRY InitIsQueryARB (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glIsQueryARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsQueryARB = extproc; return glIsQueryARB(id); } static void APIENTRY InitBeginQueryARB (GLenum target, GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBeginQueryARB"); if (extproc == NULL) { _ASSERT(0); return; } glBeginQueryARB = extproc; glBeginQueryARB(target, id); } static void APIENTRY InitEndQueryARB (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glEndQueryARB"); if (extproc == NULL) { _ASSERT(0); return; } glEndQueryARB = extproc; glEndQueryARB(target); } static void APIENTRY InitGetQueryivARB (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryivARB = extproc; glGetQueryivARB(target, pname, params); } static void APIENTRY InitGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryObjectivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryObjectivARB = extproc; glGetQueryObjectivARB(id, pname, params); } static void APIENTRY InitGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetQueryObjectuivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetQueryObjectuivARB = extproc; glGetQueryObjectuivARB(id, pname, params); } static void APIENTRY InitDeleteObjectARB (GLhandleARB obj) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteObjectARB"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteObjectARB = extproc; glDeleteObjectARB(obj); } static GLhandleARB APIENTRY InitGetHandleARB (GLenum pname) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHandleARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glGetHandleARB = extproc; return glGetHandleARB(pname); } static void APIENTRY InitDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj) { void *extproc; extproc = (void *) wglGetProcAddress("glDetachObjectARB"); if (extproc == NULL) { _ASSERT(0); return; } glDetachObjectARB = extproc; glDetachObjectARB(containerObj, attachedObj); } static GLhandleARB APIENTRY InitCreateShaderObjectARB (GLenum shaderType) { void *extproc; extproc = (void *) wglGetProcAddress("glCreateShaderObjectARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glCreateShaderObjectARB = extproc; return glCreateShaderObjectARB(shaderType); } static void APIENTRY InitShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length) { void *extproc; extproc = (void *) wglGetProcAddress("glShaderSourceARB"); if (extproc == NULL) { _ASSERT(0); return; } glShaderSourceARB = extproc; glShaderSourceARB(shaderObj, count, string, length); } static void APIENTRY InitCompileShaderARB (GLhandleARB shaderObj) { void *extproc; extproc = (void *) wglGetProcAddress("glCompileShaderARB"); if (extproc == NULL) { _ASSERT(0); return; } glCompileShaderARB = extproc; glCompileShaderARB(shaderObj); } static GLhandleARB APIENTRY InitCreateProgramObjectARB (void) { void *extproc; extproc = (void *) wglGetProcAddress("glCreateProgramObjectARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glCreateProgramObjectARB = extproc; return glCreateProgramObjectARB(); } static void APIENTRY InitAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj) { void *extproc; extproc = (void *) wglGetProcAddress("glAttachObjectARB"); if (extproc == NULL) { _ASSERT(0); return; } glAttachObjectARB = extproc; glAttachObjectARB(containerObj, obj); } static void APIENTRY InitLinkProgramARB (GLhandleARB programObj) { void *extproc; extproc = (void *) wglGetProcAddress("glLinkProgramARB"); if (extproc == NULL) { _ASSERT(0); return; } glLinkProgramARB = extproc; glLinkProgramARB(programObj); } static void APIENTRY InitUseProgramObjectARB (GLhandleARB programObj) { void *extproc; extproc = (void *) wglGetProcAddress("glUseProgramObjectARB"); if (extproc == NULL) { _ASSERT(0); return; } glUseProgramObjectARB = extproc; glUseProgramObjectARB(programObj); } static void APIENTRY InitValidateProgramARB (GLhandleARB programObj) { void *extproc; extproc = (void *) wglGetProcAddress("glValidateProgramARB"); if (extproc == NULL) { _ASSERT(0); return; } glValidateProgramARB = extproc; glValidateProgramARB(programObj); } static void APIENTRY InitUniform1fARB (GLint location, GLfloat v0) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform1fARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform1fARB = extproc; glUniform1fARB(location, v0); } static void APIENTRY InitUniform2fARB (GLint location, GLfloat v0, GLfloat v1) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform2fARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform2fARB = extproc; glUniform2fARB(location, v0, v1); } static void APIENTRY InitUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform3fARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform3fARB = extproc; glUniform3fARB(location, v0, v1, v2); } static void APIENTRY InitUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform4fARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform4fARB = extproc; glUniform4fARB(location, v0, v1, v2, v3); } static void APIENTRY InitUniform1iARB (GLint location, GLint v0) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform1iARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform1iARB = extproc; glUniform1iARB(location, v0); } static void APIENTRY InitUniform2iARB (GLint location, GLint v0, GLint v1) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform2iARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform2iARB = extproc; glUniform2iARB(location, v0, v1); } static void APIENTRY InitUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform3iARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform3iARB = extproc; glUniform3iARB(location, v0, v1, v2); } static void APIENTRY InitUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform4iARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform4iARB = extproc; glUniform4iARB(location, v0, v1, v2, v3); } static void APIENTRY InitUniform1fvARB (GLint location, GLsizei count, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform1fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform1fvARB = extproc; glUniform1fvARB(location, count, value); } static void APIENTRY InitUniform2fvARB (GLint location, GLsizei count, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform2fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform2fvARB = extproc; glUniform2fvARB(location, count, value); } static void APIENTRY InitUniform3fvARB (GLint location, GLsizei count, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform3fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform3fvARB = extproc; glUniform3fvARB(location, count, value); } static void APIENTRY InitUniform4fvARB (GLint location, GLsizei count, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform4fvARB = extproc; glUniform4fvARB(location, count, value); } static void APIENTRY InitUniform1ivARB (GLint location, GLsizei count, const GLint *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform1ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform1ivARB = extproc; glUniform1ivARB(location, count, value); } static void APIENTRY InitUniform2ivARB (GLint location, GLsizei count, const GLint *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform2ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform2ivARB = extproc; glUniform2ivARB(location, count, value); } static void APIENTRY InitUniform3ivARB (GLint location, GLsizei count, const GLint *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform3ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform3ivARB = extproc; glUniform3ivARB(location, count, value); } static void APIENTRY InitUniform4ivARB (GLint location, GLsizei count, const GLint *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniform4ivARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniform4ivARB = extproc; glUniform4ivARB(location, count, value); } static void APIENTRY InitUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniformMatrix2fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniformMatrix2fvARB = extproc; glUniformMatrix2fvARB(location, count, transpose, value); } static void APIENTRY InitUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniformMatrix3fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniformMatrix3fvARB = extproc; glUniformMatrix3fvARB(location, count, transpose, value); } static void APIENTRY InitUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glUniformMatrix4fvARB"); if (extproc == NULL) { _ASSERT(0); return; } glUniformMatrix4fvARB = extproc; glUniformMatrix4fvARB(location, count, transpose, value); } static void APIENTRY InitGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetObjectParameterfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetObjectParameterfvARB = extproc; glGetObjectParameterfvARB(obj, pname, params); } static void APIENTRY InitGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetObjectParameterivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetObjectParameterivARB = extproc; glGetObjectParameterivARB(obj, pname, params); } static void APIENTRY InitGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog) { void *extproc; extproc = (void *) wglGetProcAddress("glGetInfoLogARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetInfoLogARB = extproc; glGetInfoLogARB(obj, maxLength, length, infoLog); } static void APIENTRY InitGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj) { void *extproc; extproc = (void *) wglGetProcAddress("glGetAttachedObjectsARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetAttachedObjectsARB = extproc; glGetAttachedObjectsARB(containerObj, maxCount, count, obj); } static GLint APIENTRY InitGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name) { void *extproc; extproc = (void *) wglGetProcAddress("glGetUniformLocationARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glGetUniformLocationARB = extproc; return glGetUniformLocationARB(programObj, name); } static void APIENTRY InitGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name) { void *extproc; extproc = (void *) wglGetProcAddress("glGetActiveUniformARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetActiveUniformARB = extproc; glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name); } static void APIENTRY InitGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetUniformfvARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetUniformfvARB = extproc; glGetUniformfvARB(programObj, location, params); } static void APIENTRY InitGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetUniformivARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetUniformivARB = extproc; glGetUniformivARB(programObj, location, params); } static void APIENTRY InitGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source) { void *extproc; extproc = (void *) wglGetProcAddress("glGetShaderSourceARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetShaderSourceARB = extproc; glGetShaderSourceARB(obj, maxLength, length, source); } static void APIENTRY InitBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name) { void *extproc; extproc = (void *) wglGetProcAddress("glBindAttribLocationARB"); if (extproc == NULL) { _ASSERT(0); return; } glBindAttribLocationARB = extproc; glBindAttribLocationARB(programObj, index, name); } static void APIENTRY InitGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name) { void *extproc; extproc = (void *) wglGetProcAddress("glGetActiveAttribARB"); if (extproc == NULL) { _ASSERT(0); return; } glGetActiveAttribARB = extproc; glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name); } static GLint APIENTRY InitGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name) { void *extproc; extproc = (void *) wglGetProcAddress("glGetAttribLocationARB"); if (extproc == NULL) { _ASSERT(0); return 0; } glGetAttribLocationARB = extproc; return glGetAttribLocationARB(programObj, name); } static void APIENTRY InitBlendColorEXT (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendColorEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBlendColorEXT = extproc; glBlendColorEXT(red, green, blue, alpha); } static void APIENTRY InitPolygonOffsetEXT (GLfloat factor, GLfloat bias) { void *extproc; extproc = (void *) wglGetProcAddress("glPolygonOffsetEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPolygonOffsetEXT = extproc; glPolygonOffsetEXT(factor, bias); } static void APIENTRY InitTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexImage3DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTexImage3DEXT = extproc; glTexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels); } static void APIENTRY InitTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexSubImage3DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTexSubImage3DEXT = extproc; glTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } static void APIENTRY InitGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glGetTexFilterFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetTexFilterFuncSGIS = extproc; glGetTexFilterFuncSGIS(target, filter, weights); } static void APIENTRY InitTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights) { void *extproc; extproc = (void *) wglGetProcAddress("glTexFilterFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glTexFilterFuncSGIS = extproc; glTexFilterFuncSGIS(target, filter, n, weights); } static void APIENTRY InitTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexSubImage1DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTexSubImage1DEXT = extproc; glTexSubImage1DEXT(target, level, xoffset, width, format, type, pixels); } static void APIENTRY InitTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexSubImage2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTexSubImage2DEXT = extproc; glTexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels); } static void APIENTRY InitCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexImage1DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexImage1DEXT = extproc; glCopyTexImage1DEXT(target, level, internalformat, x, y, width, border); } static void APIENTRY InitCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexImage2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexImage2DEXT = extproc; glCopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border); } static void APIENTRY InitCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexSubImage1DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexSubImage1DEXT = extproc; glCopyTexSubImage1DEXT(target, level, xoffset, x, y, width); } static void APIENTRY InitCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexSubImage2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexSubImage2DEXT = extproc; glCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height); } static void APIENTRY InitCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyTexSubImage3DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyTexSubImage3DEXT = extproc; glCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height); } static void APIENTRY InitGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogramEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogramEXT = extproc; glGetHistogramEXT(target, reset, format, type, values); } static void APIENTRY InitGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogramParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogramParameterfvEXT = extproc; glGetHistogramParameterfvEXT(target, pname, params); } static void APIENTRY InitGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetHistogramParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetHistogramParameterivEXT = extproc; glGetHistogramParameterivEXT(target, pname, params); } static void APIENTRY InitGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmaxEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmaxEXT = extproc; glGetMinmaxEXT(target, reset, format, type, values); } static void APIENTRY InitGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmaxParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmaxParameterfvEXT = extproc; glGetMinmaxParameterfvEXT(target, pname, params); } static void APIENTRY InitGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMinmaxParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetMinmaxParameterivEXT = extproc; glGetMinmaxParameterivEXT(target, pname, params); } static void APIENTRY InitHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { void *extproc; extproc = (void *) wglGetProcAddress("glHistogramEXT"); if (extproc == NULL) { _ASSERT(0); return; } glHistogramEXT = extproc; glHistogramEXT(target, width, internalformat, sink); } static void APIENTRY InitMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink) { void *extproc; extproc = (void *) wglGetProcAddress("glMinmaxEXT"); if (extproc == NULL) { _ASSERT(0); return; } glMinmaxEXT = extproc; glMinmaxEXT(target, internalformat, sink); } static void APIENTRY InitResetHistogramEXT (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glResetHistogramEXT"); if (extproc == NULL) { _ASSERT(0); return; } glResetHistogramEXT = extproc; glResetHistogramEXT(target); } static void APIENTRY InitResetMinmaxEXT (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glResetMinmaxEXT"); if (extproc == NULL) { _ASSERT(0); return; } glResetMinmaxEXT = extproc; glResetMinmaxEXT(target); } static void APIENTRY InitConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionFilter1DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionFilter1DEXT = extproc; glConvolutionFilter1DEXT(target, internalformat, width, format, type, image); } static void APIENTRY InitConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionFilter2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionFilter2DEXT = extproc; glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image); } static void APIENTRY InitConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameterfEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameterfEXT = extproc; glConvolutionParameterfEXT(target, pname, params); } static void APIENTRY InitConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameterfvEXT = extproc; glConvolutionParameterfvEXT(target, pname, params); } static void APIENTRY InitConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameteriEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameteriEXT = extproc; glConvolutionParameteriEXT(target, pname, params); } static void APIENTRY InitConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glConvolutionParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glConvolutionParameterivEXT = extproc; glConvolutionParameterivEXT(target, pname, params); } static void APIENTRY InitCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyConvolutionFilter1DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyConvolutionFilter1DEXT = extproc; glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width); } static void APIENTRY InitCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyConvolutionFilter2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyConvolutionFilter2DEXT = extproc; glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height); } static void APIENTRY InitGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionFilterEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionFilterEXT = extproc; glGetConvolutionFilterEXT(target, format, type, image); } static void APIENTRY InitGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionParameterfvEXT = extproc; glGetConvolutionParameterfvEXT(target, pname, params); } static void APIENTRY InitGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetConvolutionParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetConvolutionParameterivEXT = extproc; glGetConvolutionParameterivEXT(target, pname, params); } static void APIENTRY InitGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span) { void *extproc; extproc = (void *) wglGetProcAddress("glGetSeparableFilterEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetSeparableFilterEXT = extproc; glGetSeparableFilterEXT(target, format, type, row, column, span); } static void APIENTRY InitSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column) { void *extproc; extproc = (void *) wglGetProcAddress("glSeparableFilter2DEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSeparableFilter2DEXT = extproc; glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column); } static void APIENTRY InitColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableSGI"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableSGI = extproc; glColorTableSGI(target, internalformat, width, format, type, table); } static void APIENTRY InitColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableParameterfvSGI"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableParameterfvSGI = extproc; glColorTableParameterfvSGI(target, pname, params); } static void APIENTRY InitColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableParameterivSGI"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableParameterivSGI = extproc; glColorTableParameterivSGI(target, pname, params); } static void APIENTRY InitCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyColorTableSGI"); if (extproc == NULL) { _ASSERT(0); return; } glCopyColorTableSGI = extproc; glCopyColorTableSGI(target, internalformat, x, y, width); } static void APIENTRY InitGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableSGI"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableSGI = extproc; glGetColorTableSGI(target, format, type, table); } static void APIENTRY InitGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameterfvSGI"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameterfvSGI = extproc; glGetColorTableParameterfvSGI(target, pname, params); } static void APIENTRY InitGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameterivSGI"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameterivSGI = extproc; glGetColorTableParameterivSGI(target, pname, params); } static void APIENTRY InitPixelTexGenSGIX (GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTexGenSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTexGenSGIX = extproc; glPixelTexGenSGIX(mode); } static void APIENTRY InitPixelTexGenParameteriSGIS (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTexGenParameteriSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTexGenParameteriSGIS = extproc; glPixelTexGenParameteriSGIS(pname, param); } static void APIENTRY InitPixelTexGenParameterivSGIS (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTexGenParameterivSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTexGenParameterivSGIS = extproc; glPixelTexGenParameterivSGIS(pname, params); } static void APIENTRY InitPixelTexGenParameterfSGIS (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTexGenParameterfSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTexGenParameterfSGIS = extproc; glPixelTexGenParameterfSGIS(pname, param); } static void APIENTRY InitPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTexGenParameterfvSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTexGenParameterfvSGIS = extproc; glPixelTexGenParameterfvSGIS(pname, params); } static void APIENTRY InitGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetPixelTexGenParameterivSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetPixelTexGenParameterivSGIS = extproc; glGetPixelTexGenParameterivSGIS(pname, params); } static void APIENTRY InitGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetPixelTexGenParameterfvSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetPixelTexGenParameterfvSGIS = extproc; glGetPixelTexGenParameterfvSGIS(pname, params); } static void APIENTRY InitTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexImage4DSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glTexImage4DSGIS = extproc; glTexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels); } static void APIENTRY InitTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels) { void *extproc; extproc = (void *) wglGetProcAddress("glTexSubImage4DSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glTexSubImage4DSGIS = extproc; glTexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels); } static GLboolean APIENTRY InitAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences) { void *extproc; extproc = (void *) wglGetProcAddress("glAreTexturesResidentEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glAreTexturesResidentEXT = extproc; return glAreTexturesResidentEXT(n, textures, residences); } static void APIENTRY InitBindTextureEXT (GLenum target, GLuint texture) { void *extproc; extproc = (void *) wglGetProcAddress("glBindTextureEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBindTextureEXT = extproc; glBindTextureEXT(target, texture); } static void APIENTRY InitDeleteTexturesEXT (GLsizei n, const GLuint *textures) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteTexturesEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteTexturesEXT = extproc; glDeleteTexturesEXT(n, textures); } static void APIENTRY InitGenTexturesEXT (GLsizei n, GLuint *textures) { void *extproc; extproc = (void *) wglGetProcAddress("glGenTexturesEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGenTexturesEXT = extproc; glGenTexturesEXT(n, textures); } static GLboolean APIENTRY InitIsTextureEXT (GLuint texture) { void *extproc; extproc = (void *) wglGetProcAddress("glIsTextureEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsTextureEXT = extproc; return glIsTextureEXT(texture); } static void APIENTRY InitPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities) { void *extproc; extproc = (void *) wglGetProcAddress("glPrioritizeTexturesEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPrioritizeTexturesEXT = extproc; glPrioritizeTexturesEXT(n, textures, priorities); } static void APIENTRY InitDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glDetailTexFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glDetailTexFuncSGIS = extproc; glDetailTexFuncSGIS(target, n, points); } static void APIENTRY InitGetDetailTexFuncSGIS (GLenum target, GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glGetDetailTexFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetDetailTexFuncSGIS = extproc; glGetDetailTexFuncSGIS(target, points); } static void APIENTRY InitSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glSharpenTexFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glSharpenTexFuncSGIS = extproc; glSharpenTexFuncSGIS(target, n, points); } static void APIENTRY InitGetSharpenTexFuncSGIS (GLenum target, GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glGetSharpenTexFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetSharpenTexFuncSGIS = extproc; glGetSharpenTexFuncSGIS(target, points); } static void APIENTRY InitSampleMaskSGIS (GLclampf value, GLboolean invert) { void *extproc; extproc = (void *) wglGetProcAddress("glSampleMaskSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glSampleMaskSGIS = extproc; glSampleMaskSGIS(value, invert); } static void APIENTRY InitSamplePatternSGIS (GLenum pattern) { void *extproc; extproc = (void *) wglGetProcAddress("glSamplePatternSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glSamplePatternSGIS = extproc; glSamplePatternSGIS(pattern); } static void APIENTRY InitArrayElementEXT (GLint i) { void *extproc; extproc = (void *) wglGetProcAddress("glArrayElementEXT"); if (extproc == NULL) { _ASSERT(0); return; } glArrayElementEXT = extproc; glArrayElementEXT(i); } static void APIENTRY InitColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glColorPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glColorPointerEXT = extproc; glColorPointerEXT(size, type, stride, count, pointer); } static void APIENTRY InitDrawArraysEXT (GLenum mode, GLint first, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawArraysEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDrawArraysEXT = extproc; glDrawArraysEXT(mode, first, count); } static void APIENTRY InitEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glEdgeFlagPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glEdgeFlagPointerEXT = extproc; glEdgeFlagPointerEXT(stride, count, pointer); } static void APIENTRY InitGetPointervEXT (GLenum pname, GLvoid* *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetPointervEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetPointervEXT = extproc; glGetPointervEXT(pname, params); } static void APIENTRY InitIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glIndexPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glIndexPointerEXT = extproc; glIndexPointerEXT(type, stride, count, pointer); } static void APIENTRY InitNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glNormalPointerEXT = extproc; glNormalPointerEXT(type, stride, count, pointer); } static void APIENTRY InitTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoordPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoordPointerEXT = extproc; glTexCoordPointerEXT(size, type, stride, count, pointer); } static void APIENTRY InitVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVertexPointerEXT = extproc; glVertexPointerEXT(size, type, stride, count, pointer); } static void APIENTRY InitBlendEquationEXT (GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendEquationEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBlendEquationEXT = extproc; glBlendEquationEXT(mode); } static void APIENTRY InitSpriteParameterfSGIX (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glSpriteParameterfSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glSpriteParameterfSGIX = extproc; glSpriteParameterfSGIX(pname, param); } static void APIENTRY InitSpriteParameterfvSGIX (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glSpriteParameterfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glSpriteParameterfvSGIX = extproc; glSpriteParameterfvSGIX(pname, params); } static void APIENTRY InitSpriteParameteriSGIX (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glSpriteParameteriSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glSpriteParameteriSGIX = extproc; glSpriteParameteriSGIX(pname, param); } static void APIENTRY InitSpriteParameterivSGIX (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glSpriteParameterivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glSpriteParameterivSGIX = extproc; glSpriteParameterivSGIX(pname, params); } static void APIENTRY InitPointParameterfEXT (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfEXT = extproc; glPointParameterfEXT(pname, param); } static void APIENTRY InitPointParameterfvEXT (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfvEXT = extproc; glPointParameterfvEXT(pname, params); } static void APIENTRY InitPointParameterfSGIS (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfSGIS = extproc; glPointParameterfSGIS(pname, param); } static void APIENTRY InitPointParameterfvSGIS (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterfvSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterfvSGIS = extproc; glPointParameterfvSGIS(pname, params); } static GLint APIENTRY InitGetInstrumentsSGIX (void) { void *extproc; extproc = (void *) wglGetProcAddress("glGetInstrumentsSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glGetInstrumentsSGIX = extproc; return glGetInstrumentsSGIX(); } static void APIENTRY InitInstrumentsBufferSGIX (GLsizei size, GLint *buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glInstrumentsBufferSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glInstrumentsBufferSGIX = extproc; glInstrumentsBufferSGIX(size, buffer); } static GLint APIENTRY InitPollInstrumentsSGIX (GLint *marker_p) { void *extproc; extproc = (void *) wglGetProcAddress("glPollInstrumentsSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glPollInstrumentsSGIX = extproc; return glPollInstrumentsSGIX(marker_p); } static void APIENTRY InitReadInstrumentsSGIX (GLint marker) { void *extproc; extproc = (void *) wglGetProcAddress("glReadInstrumentsSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glReadInstrumentsSGIX = extproc; glReadInstrumentsSGIX(marker); } static void APIENTRY InitStartInstrumentsSGIX (void) { void *extproc; extproc = (void *) wglGetProcAddress("glStartInstrumentsSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glStartInstrumentsSGIX = extproc; glStartInstrumentsSGIX(); } static void APIENTRY InitStopInstrumentsSGIX (GLint marker) { void *extproc; extproc = (void *) wglGetProcAddress("glStopInstrumentsSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glStopInstrumentsSGIX = extproc; glStopInstrumentsSGIX(marker); } static void APIENTRY InitFrameZoomSGIX (GLint factor) { void *extproc; extproc = (void *) wglGetProcAddress("glFrameZoomSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFrameZoomSGIX = extproc; glFrameZoomSGIX(factor); } static void APIENTRY InitTagSampleBufferSGIX (void) { void *extproc; extproc = (void *) wglGetProcAddress("glTagSampleBufferSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glTagSampleBufferSGIX = extproc; glTagSampleBufferSGIX(); } static void APIENTRY InitDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points) { void *extproc; extproc = (void *) wglGetProcAddress("glDeformationMap3dSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glDeformationMap3dSGIX = extproc; glDeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points); } static void APIENTRY InitDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glDeformationMap3fSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glDeformationMap3fSGIX = extproc; glDeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points); } static void APIENTRY InitDeformSGIX (GLbitfield mask) { void *extproc; extproc = (void *) wglGetProcAddress("glDeformSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glDeformSGIX = extproc; glDeformSGIX(mask); } static void APIENTRY InitLoadIdentityDeformationMapSGIX (GLbitfield mask) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadIdentityDeformationMapSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glLoadIdentityDeformationMapSGIX = extproc; glLoadIdentityDeformationMapSGIX(mask); } static void APIENTRY InitReferencePlaneSGIX (const GLdouble *equation) { void *extproc; extproc = (void *) wglGetProcAddress("glReferencePlaneSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glReferencePlaneSGIX = extproc; glReferencePlaneSGIX(equation); } static void APIENTRY InitFlushRasterSGIX (void) { void *extproc; extproc = (void *) wglGetProcAddress("glFlushRasterSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFlushRasterSGIX = extproc; glFlushRasterSGIX(); } static void APIENTRY InitFogFuncSGIS (GLsizei n, const GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glFogFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glFogFuncSGIS = extproc; glFogFuncSGIS(n, points); } static void APIENTRY InitGetFogFuncSGIS (GLfloat *points) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFogFuncSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glGetFogFuncSGIS = extproc; glGetFogFuncSGIS(points); } static void APIENTRY InitImageTransformParameteriHP (GLenum target, GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glImageTransformParameteriHP"); if (extproc == NULL) { _ASSERT(0); return; } glImageTransformParameteriHP = extproc; glImageTransformParameteriHP(target, pname, param); } static void APIENTRY InitImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glImageTransformParameterfHP"); if (extproc == NULL) { _ASSERT(0); return; } glImageTransformParameterfHP = extproc; glImageTransformParameterfHP(target, pname, param); } static void APIENTRY InitImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glImageTransformParameterivHP"); if (extproc == NULL) { _ASSERT(0); return; } glImageTransformParameterivHP = extproc; glImageTransformParameterivHP(target, pname, params); } static void APIENTRY InitImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glImageTransformParameterfvHP"); if (extproc == NULL) { _ASSERT(0); return; } glImageTransformParameterfvHP = extproc; glImageTransformParameterfvHP(target, pname, params); } static void APIENTRY InitGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetImageTransformParameterivHP"); if (extproc == NULL) { _ASSERT(0); return; } glGetImageTransformParameterivHP = extproc; glGetImageTransformParameterivHP(target, pname, params); } static void APIENTRY InitGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetImageTransformParameterfvHP"); if (extproc == NULL) { _ASSERT(0); return; } glGetImageTransformParameterfvHP = extproc; glGetImageTransformParameterfvHP(target, pname, params); } static void APIENTRY InitColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glColorSubTableEXT"); if (extproc == NULL) { _ASSERT(0); return; } glColorSubTableEXT = extproc; glColorSubTableEXT(target, start, count, format, type, data); } static void APIENTRY InitCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glCopyColorSubTableEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCopyColorSubTableEXT = extproc; glCopyColorSubTableEXT(target, start, x, y, width); } static void APIENTRY InitHintPGI (GLenum target, GLint mode) { void *extproc; extproc = (void *) wglGetProcAddress("glHintPGI"); if (extproc == NULL) { _ASSERT(0); return; } glHintPGI = extproc; glHintPGI(target, mode); } static void APIENTRY InitColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table) { void *extproc; extproc = (void *) wglGetProcAddress("glColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return; } glColorTableEXT = extproc; glColorTableEXT(target, internalFormat, width, format, type, table); } static void APIENTRY InitGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableEXT = extproc; glGetColorTableEXT(target, format, type, data); } static void APIENTRY InitGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameterivEXT = extproc; glGetColorTableParameterivEXT(target, pname, params); } static void APIENTRY InitGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetColorTableParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetColorTableParameterfvEXT = extproc; glGetColorTableParameterfvEXT(target, pname, params); } static void APIENTRY InitGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetListParameterfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetListParameterfvSGIX = extproc; glGetListParameterfvSGIX(list, pname, params); } static void APIENTRY InitGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetListParameterivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetListParameterivSGIX = extproc; glGetListParameterivSGIX(list, pname, params); } static void APIENTRY InitListParameterfSGIX (GLuint list, GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glListParameterfSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glListParameterfSGIX = extproc; glListParameterfSGIX(list, pname, param); } static void APIENTRY InitListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glListParameterfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glListParameterfvSGIX = extproc; glListParameterfvSGIX(list, pname, params); } static void APIENTRY InitListParameteriSGIX (GLuint list, GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glListParameteriSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glListParameteriSGIX = extproc; glListParameteriSGIX(list, pname, param); } static void APIENTRY InitListParameterivSGIX (GLuint list, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glListParameterivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glListParameterivSGIX = extproc; glListParameterivSGIX(list, pname, params); } static void APIENTRY InitIndexMaterialEXT (GLenum face, GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glIndexMaterialEXT"); if (extproc == NULL) { _ASSERT(0); return; } glIndexMaterialEXT = extproc; glIndexMaterialEXT(face, mode); } static void APIENTRY InitIndexFuncEXT (GLenum func, GLclampf ref) { void *extproc; extproc = (void *) wglGetProcAddress("glIndexFuncEXT"); if (extproc == NULL) { _ASSERT(0); return; } glIndexFuncEXT = extproc; glIndexFuncEXT(func, ref); } static void APIENTRY InitLockArraysEXT (GLint first, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glLockArraysEXT"); if (extproc == NULL) { _ASSERT(0); return; } glLockArraysEXT = extproc; glLockArraysEXT(first, count); } static void APIENTRY InitUnlockArraysEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("glUnlockArraysEXT"); if (extproc == NULL) { _ASSERT(0); return; } glUnlockArraysEXT = extproc; glUnlockArraysEXT(); } static void APIENTRY InitCullParameterdvEXT (GLenum pname, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glCullParameterdvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCullParameterdvEXT = extproc; glCullParameterdvEXT(pname, params); } static void APIENTRY InitCullParameterfvEXT (GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glCullParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glCullParameterfvEXT = extproc; glCullParameterfvEXT(pname, params); } static void APIENTRY InitFragmentColorMaterialSGIX (GLenum face, GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentColorMaterialSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentColorMaterialSGIX = extproc; glFragmentColorMaterialSGIX(face, mode); } static void APIENTRY InitFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightfSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightfSGIX = extproc; glFragmentLightfSGIX(light, pname, param); } static void APIENTRY InitFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightfvSGIX = extproc; glFragmentLightfvSGIX(light, pname, params); } static void APIENTRY InitFragmentLightiSGIX (GLenum light, GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightiSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightiSGIX = extproc; glFragmentLightiSGIX(light, pname, param); } static void APIENTRY InitFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightivSGIX = extproc; glFragmentLightivSGIX(light, pname, params); } static void APIENTRY InitFragmentLightModelfSGIX (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightModelfSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightModelfSGIX = extproc; glFragmentLightModelfSGIX(pname, param); } static void APIENTRY InitFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightModelfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightModelfvSGIX = extproc; glFragmentLightModelfvSGIX(pname, params); } static void APIENTRY InitFragmentLightModeliSGIX (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightModeliSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightModeliSGIX = extproc; glFragmentLightModeliSGIX(pname, param); } static void APIENTRY InitFragmentLightModelivSGIX (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentLightModelivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentLightModelivSGIX = extproc; glFragmentLightModelivSGIX(pname, params); } static void APIENTRY InitFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentMaterialfSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentMaterialfSGIX = extproc; glFragmentMaterialfSGIX(face, pname, param); } static void APIENTRY InitFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentMaterialfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentMaterialfvSGIX = extproc; glFragmentMaterialfvSGIX(face, pname, params); } static void APIENTRY InitFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentMaterialiSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentMaterialiSGIX = extproc; glFragmentMaterialiSGIX(face, pname, param); } static void APIENTRY InitFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glFragmentMaterialivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glFragmentMaterialivSGIX = extproc; glFragmentMaterialivSGIX(face, pname, params); } static void APIENTRY InitGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFragmentLightfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetFragmentLightfvSGIX = extproc; glGetFragmentLightfvSGIX(light, pname, params); } static void APIENTRY InitGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFragmentLightivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetFragmentLightivSGIX = extproc; glGetFragmentLightivSGIX(light, pname, params); } static void APIENTRY InitGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFragmentMaterialfvSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetFragmentMaterialfvSGIX = extproc; glGetFragmentMaterialfvSGIX(face, pname, params); } static void APIENTRY InitGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFragmentMaterialivSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glGetFragmentMaterialivSGIX = extproc; glGetFragmentMaterialivSGIX(face, pname, params); } static void APIENTRY InitLightEnviSGIX (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glLightEnviSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glLightEnviSGIX = extproc; glLightEnviSGIX(pname, param); } static void APIENTRY InitDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawRangeElementsEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDrawRangeElementsEXT = extproc; glDrawRangeElementsEXT(mode, start, end, count, type, indices); } static void APIENTRY InitApplyTextureEXT (GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glApplyTextureEXT"); if (extproc == NULL) { _ASSERT(0); return; } glApplyTextureEXT = extproc; glApplyTextureEXT(mode); } static void APIENTRY InitTextureLightEXT (GLenum pname) { void *extproc; extproc = (void *) wglGetProcAddress("glTextureLightEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTextureLightEXT = extproc; glTextureLightEXT(pname); } static void APIENTRY InitTextureMaterialEXT (GLenum face, GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glTextureMaterialEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTextureMaterialEXT = extproc; glTextureMaterialEXT(face, mode); } static void APIENTRY InitAsyncMarkerSGIX (GLuint marker) { void *extproc; extproc = (void *) wglGetProcAddress("glAsyncMarkerSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glAsyncMarkerSGIX = extproc; glAsyncMarkerSGIX(marker); } static GLint APIENTRY InitFinishAsyncSGIX (GLuint *markerp) { void *extproc; extproc = (void *) wglGetProcAddress("glFinishAsyncSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glFinishAsyncSGIX = extproc; return glFinishAsyncSGIX(markerp); } static GLint APIENTRY InitPollAsyncSGIX (GLuint *markerp) { void *extproc; extproc = (void *) wglGetProcAddress("glPollAsyncSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glPollAsyncSGIX = extproc; return glPollAsyncSGIX(markerp); } static GLuint APIENTRY InitGenAsyncMarkersSGIX (GLsizei range) { void *extproc; extproc = (void *) wglGetProcAddress("glGenAsyncMarkersSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glGenAsyncMarkersSGIX = extproc; return glGenAsyncMarkersSGIX(range); } static void APIENTRY InitDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteAsyncMarkersSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteAsyncMarkersSGIX = extproc; glDeleteAsyncMarkersSGIX(marker, range); } static GLboolean APIENTRY InitIsAsyncMarkerSGIX (GLuint marker) { void *extproc; extproc = (void *) wglGetProcAddress("glIsAsyncMarkerSGIX"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsAsyncMarkerSGIX = extproc; return glIsAsyncMarkerSGIX(marker); } static void APIENTRY InitVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexPointervINTEL"); if (extproc == NULL) { _ASSERT(0); return; } glVertexPointervINTEL = extproc; glVertexPointervINTEL(size, type, pointer); } static void APIENTRY InitNormalPointervINTEL (GLenum type, const GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalPointervINTEL"); if (extproc == NULL) { _ASSERT(0); return; } glNormalPointervINTEL = extproc; glNormalPointervINTEL(type, pointer); } static void APIENTRY InitColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glColorPointervINTEL"); if (extproc == NULL) { _ASSERT(0); return; } glColorPointervINTEL = extproc; glColorPointervINTEL(size, type, pointer); } static void APIENTRY InitTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoordPointervINTEL"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoordPointervINTEL = extproc; glTexCoordPointervINTEL(size, type, pointer); } static void APIENTRY InitPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTransformParameteriEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTransformParameteriEXT = extproc; glPixelTransformParameteriEXT(target, pname, param); } static void APIENTRY InitPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTransformParameterfEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTransformParameterfEXT = extproc; glPixelTransformParameterfEXT(target, pname, param); } static void APIENTRY InitPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTransformParameterivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTransformParameterivEXT = extproc; glPixelTransformParameterivEXT(target, pname, params); } static void APIENTRY InitPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelTransformParameterfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glPixelTransformParameterfvEXT = extproc; glPixelTransformParameterfvEXT(target, pname, params); } static void APIENTRY InitSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3bEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3bEXT = extproc; glSecondaryColor3bEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3bvEXT (const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3bvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3bvEXT = extproc; glSecondaryColor3bvEXT(v); } static void APIENTRY InitSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3dEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3dEXT = extproc; glSecondaryColor3dEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3dvEXT (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3dvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3dvEXT = extproc; glSecondaryColor3dvEXT(v); } static void APIENTRY InitSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3fEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3fEXT = extproc; glSecondaryColor3fEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3fvEXT (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3fvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3fvEXT = extproc; glSecondaryColor3fvEXT(v); } static void APIENTRY InitSecondaryColor3iEXT (GLint red, GLint green, GLint blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3iEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3iEXT = extproc; glSecondaryColor3iEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3ivEXT (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ivEXT = extproc; glSecondaryColor3ivEXT(v); } static void APIENTRY InitSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3sEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3sEXT = extproc; glSecondaryColor3sEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3svEXT (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3svEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3svEXT = extproc; glSecondaryColor3svEXT(v); } static void APIENTRY InitSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ubEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ubEXT = extproc; glSecondaryColor3ubEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3ubvEXT (const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3ubvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3ubvEXT = extproc; glSecondaryColor3ubvEXT(v); } static void APIENTRY InitSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3uiEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3uiEXT = extproc; glSecondaryColor3uiEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3uivEXT (const GLuint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3uivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3uivEXT = extproc; glSecondaryColor3uivEXT(v); } static void APIENTRY InitSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3usEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3usEXT = extproc; glSecondaryColor3usEXT(red, green, blue); } static void APIENTRY InitSecondaryColor3usvEXT (const GLushort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3usvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3usvEXT = extproc; glSecondaryColor3usvEXT(v); } static void APIENTRY InitSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColorPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColorPointerEXT = extproc; glSecondaryColorPointerEXT(size, type, stride, pointer); } static void APIENTRY InitTextureNormalEXT (GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glTextureNormalEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTextureNormalEXT = extproc; glTextureNormalEXT(mode); } static void APIENTRY InitMultiDrawArraysEXT (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawArraysEXT"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawArraysEXT = extproc; glMultiDrawArraysEXT(mode, first, count, primcount); } static void APIENTRY InitMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawElementsEXT"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawElementsEXT = extproc; glMultiDrawElementsEXT(mode, count, type, indices, primcount); } static void APIENTRY InitFogCoordfEXT (GLfloat coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordfEXT"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordfEXT = extproc; glFogCoordfEXT(coord); } static void APIENTRY InitFogCoordfvEXT (const GLfloat *coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordfvEXT = extproc; glFogCoordfvEXT(coord); } static void APIENTRY InitFogCoorddEXT (GLdouble coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoorddEXT"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoorddEXT = extproc; glFogCoorddEXT(coord); } static void APIENTRY InitFogCoorddvEXT (const GLdouble *coord) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoorddvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoorddvEXT = extproc; glFogCoorddvEXT(coord); } static void APIENTRY InitFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordPointerEXT = extproc; glFogCoordPointerEXT(type, stride, pointer); } static void APIENTRY InitTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3bEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3bEXT = extproc; glTangent3bEXT(tx, ty, tz); } static void APIENTRY InitTangent3bvEXT (const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3bvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3bvEXT = extproc; glTangent3bvEXT(v); } static void APIENTRY InitTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3dEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3dEXT = extproc; glTangent3dEXT(tx, ty, tz); } static void APIENTRY InitTangent3dvEXT (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3dvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3dvEXT = extproc; glTangent3dvEXT(v); } static void APIENTRY InitTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3fEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3fEXT = extproc; glTangent3fEXT(tx, ty, tz); } static void APIENTRY InitTangent3fvEXT (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3fvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3fvEXT = extproc; glTangent3fvEXT(v); } static void APIENTRY InitTangent3iEXT (GLint tx, GLint ty, GLint tz) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3iEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3iEXT = extproc; glTangent3iEXT(tx, ty, tz); } static void APIENTRY InitTangent3ivEXT (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3ivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3ivEXT = extproc; glTangent3ivEXT(v); } static void APIENTRY InitTangent3sEXT (GLshort tx, GLshort ty, GLshort tz) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3sEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3sEXT = extproc; glTangent3sEXT(tx, ty, tz); } static void APIENTRY InitTangent3svEXT (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTangent3svEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangent3svEXT = extproc; glTangent3svEXT(v); } static void APIENTRY InitBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3bEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3bEXT = extproc; glBinormal3bEXT(bx, by, bz); } static void APIENTRY InitBinormal3bvEXT (const GLbyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3bvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3bvEXT = extproc; glBinormal3bvEXT(v); } static void APIENTRY InitBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3dEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3dEXT = extproc; glBinormal3dEXT(bx, by, bz); } static void APIENTRY InitBinormal3dvEXT (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3dvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3dvEXT = extproc; glBinormal3dvEXT(v); } static void APIENTRY InitBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3fEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3fEXT = extproc; glBinormal3fEXT(bx, by, bz); } static void APIENTRY InitBinormal3fvEXT (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3fvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3fvEXT = extproc; glBinormal3fvEXT(v); } static void APIENTRY InitBinormal3iEXT (GLint bx, GLint by, GLint bz) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3iEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3iEXT = extproc; glBinormal3iEXT(bx, by, bz); } static void APIENTRY InitBinormal3ivEXT (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3ivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3ivEXT = extproc; glBinormal3ivEXT(v); } static void APIENTRY InitBinormal3sEXT (GLshort bx, GLshort by, GLshort bz) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3sEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3sEXT = extproc; glBinormal3sEXT(bx, by, bz); } static void APIENTRY InitBinormal3svEXT (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormal3svEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormal3svEXT = extproc; glBinormal3svEXT(v); } static void APIENTRY InitTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glTangentPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glTangentPointerEXT = extproc; glTangentPointerEXT(type, stride, pointer); } static void APIENTRY InitBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glBinormalPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBinormalPointerEXT = extproc; glBinormalPointerEXT(type, stride, pointer); } static void APIENTRY InitFinishTextureSUNX (void) { void *extproc; extproc = (void *) wglGetProcAddress("glFinishTextureSUNX"); if (extproc == NULL) { _ASSERT(0); return; } glFinishTextureSUNX = extproc; glFinishTextureSUNX(); } static void APIENTRY InitGlobalAlphaFactorbSUN (GLbyte factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactorbSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactorbSUN = extproc; glGlobalAlphaFactorbSUN(factor); } static void APIENTRY InitGlobalAlphaFactorsSUN (GLshort factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactorsSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactorsSUN = extproc; glGlobalAlphaFactorsSUN(factor); } static void APIENTRY InitGlobalAlphaFactoriSUN (GLint factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactoriSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactoriSUN = extproc; glGlobalAlphaFactoriSUN(factor); } static void APIENTRY InitGlobalAlphaFactorfSUN (GLfloat factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactorfSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactorfSUN = extproc; glGlobalAlphaFactorfSUN(factor); } static void APIENTRY InitGlobalAlphaFactordSUN (GLdouble factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactordSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactordSUN = extproc; glGlobalAlphaFactordSUN(factor); } static void APIENTRY InitGlobalAlphaFactorubSUN (GLubyte factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactorubSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactorubSUN = extproc; glGlobalAlphaFactorubSUN(factor); } static void APIENTRY InitGlobalAlphaFactorusSUN (GLushort factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactorusSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactorusSUN = extproc; glGlobalAlphaFactorusSUN(factor); } static void APIENTRY InitGlobalAlphaFactoruiSUN (GLuint factor) { void *extproc; extproc = (void *) wglGetProcAddress("glGlobalAlphaFactoruiSUN"); if (extproc == NULL) { _ASSERT(0); return; } glGlobalAlphaFactoruiSUN = extproc; glGlobalAlphaFactoruiSUN(factor); } static void APIENTRY InitReplacementCodeuiSUN (GLuint code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiSUN = extproc; glReplacementCodeuiSUN(code); } static void APIENTRY InitReplacementCodeusSUN (GLushort code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeusSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeusSUN = extproc; glReplacementCodeusSUN(code); } static void APIENTRY InitReplacementCodeubSUN (GLubyte code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeubSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeubSUN = extproc; glReplacementCodeubSUN(code); } static void APIENTRY InitReplacementCodeuivSUN (const GLuint *code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuivSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuivSUN = extproc; glReplacementCodeuivSUN(code); } static void APIENTRY InitReplacementCodeusvSUN (const GLushort *code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeusvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeusvSUN = extproc; glReplacementCodeusvSUN(code); } static void APIENTRY InitReplacementCodeubvSUN (const GLubyte *code) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeubvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeubvSUN = extproc; glReplacementCodeubvSUN(code); } static void APIENTRY InitReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodePointerSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodePointerSUN = extproc; glReplacementCodePointerSUN(type, stride, pointer); } static void APIENTRY InitColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4ubVertex2fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4ubVertex2fSUN = extproc; glColor4ubVertex2fSUN(r, g, b, a, x, y); } static void APIENTRY InitColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4ubVertex2fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4ubVertex2fvSUN = extproc; glColor4ubVertex2fvSUN(c, v); } static void APIENTRY InitColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4ubVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4ubVertex3fSUN = extproc; glColor4ubVertex3fSUN(r, g, b, a, x, y, z); } static void APIENTRY InitColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4ubVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4ubVertex3fvSUN = extproc; glColor4ubVertex3fvSUN(c, v); } static void APIENTRY InitColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glColor3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor3fVertex3fSUN = extproc; glColor3fVertex3fSUN(r, g, b, x, y, z); } static void APIENTRY InitColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor3fVertex3fvSUN = extproc; glColor3fVertex3fvSUN(c, v); } static void APIENTRY InitNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glNormal3fVertex3fSUN = extproc; glNormal3fVertex3fSUN(nx, ny, nz, x, y, z); } static void APIENTRY InitNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glNormal3fVertex3fvSUN = extproc; glNormal3fVertex3fvSUN(n, v); } static void APIENTRY InitColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4fNormal3fVertex3fSUN = extproc; glColor4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z); } static void APIENTRY InitColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glColor4fNormal3fVertex3fvSUN = extproc; glColor4fNormal3fVertex3fvSUN(c, n, v); } static void APIENTRY InitTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fVertex3fSUN = extproc; glTexCoord2fVertex3fSUN(s, t, x, y, z); } static void APIENTRY InitTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fVertex3fvSUN = extproc; glTexCoord2fVertex3fvSUN(tc, v); } static void APIENTRY InitTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4fVertex4fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4fVertex4fSUN = extproc; glTexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w); } static void APIENTRY InitTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4fVertex4fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4fVertex4fvSUN = extproc; glTexCoord4fVertex4fvSUN(tc, v); } static void APIENTRY InitTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor4ubVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor4ubVertex3fSUN = extproc; glTexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z); } static void APIENTRY InitTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor4ubVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor4ubVertex3fvSUN = extproc; glTexCoord2fColor4ubVertex3fvSUN(tc, c, v); } static void APIENTRY InitTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor3fVertex3fSUN = extproc; glTexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z); } static void APIENTRY InitTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor3fVertex3fvSUN = extproc; glTexCoord2fColor3fVertex3fvSUN(tc, c, v); } static void APIENTRY InitTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fNormal3fVertex3fSUN = extproc; glTexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z); } static void APIENTRY InitTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fNormal3fVertex3fvSUN = extproc; glTexCoord2fNormal3fVertex3fvSUN(tc, n, v); } static void APIENTRY InitTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor4fNormal3fVertex3fSUN = extproc; glTexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z); } static void APIENTRY InitTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2fColor4fNormal3fVertex3fvSUN = extproc; glTexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v); } static void APIENTRY InitTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4fColor4fNormal3fVertex4fSUN = extproc; glTexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w); } static void APIENTRY InitTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4fColor4fNormal3fVertex4fvSUN = extproc; glTexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v); } static void APIENTRY InitReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiVertex3fSUN = extproc; glReplacementCodeuiVertex3fSUN(rc, x, y, z); } static void APIENTRY InitReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiVertex3fvSUN = extproc; glReplacementCodeuiVertex3fvSUN(rc, v); } static void APIENTRY InitReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor4ubVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor4ubVertex3fSUN = extproc; glReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z); } static void APIENTRY InitReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor4ubVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor4ubVertex3fvSUN = extproc; glReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v); } static void APIENTRY InitReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor3fVertex3fSUN = extproc; glReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z); } static void APIENTRY InitReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor3fVertex3fvSUN = extproc; glReplacementCodeuiColor3fVertex3fvSUN(rc, c, v); } static void APIENTRY InitReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiNormal3fVertex3fSUN = extproc; glReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z); } static void APIENTRY InitReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiNormal3fVertex3fvSUN = extproc; glReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v); } static void APIENTRY InitReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor4fNormal3fVertex3fSUN = extproc; glReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z); } static void APIENTRY InitReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiColor4fNormal3fVertex3fvSUN = extproc; glReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v); } static void APIENTRY InitReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fVertex3fSUN = extproc; glReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z); } static void APIENTRY InitReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fVertex3fvSUN = extproc; glReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v); } static void APIENTRY InitReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = extproc; glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z); } static void APIENTRY InitReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = extproc; glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v); } static void APIENTRY InitReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = extproc; glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z); } static void APIENTRY InitReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"); if (extproc == NULL) { _ASSERT(0); return; } glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = extproc; glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v); } static void APIENTRY InitBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendFuncSeparateEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBlendFuncSeparateEXT = extproc; glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } static void APIENTRY InitBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendFuncSeparateINGR"); if (extproc == NULL) { _ASSERT(0); return; } glBlendFuncSeparateINGR = extproc; glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } static void APIENTRY InitVertexWeightfEXT (GLfloat weight) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexWeightfEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVertexWeightfEXT = extproc; glVertexWeightfEXT(weight); } static void APIENTRY InitVertexWeightfvEXT (const GLfloat *weight) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexWeightfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVertexWeightfvEXT = extproc; glVertexWeightfvEXT(weight); } static void APIENTRY InitVertexWeightPointerEXT (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexWeightPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVertexWeightPointerEXT = extproc; glVertexWeightPointerEXT(size, type, stride, pointer); } static void APIENTRY InitFlushVertexArrayRangeNV (void) { void *extproc; extproc = (void *) wglGetProcAddress("glFlushVertexArrayRangeNV"); if (extproc == NULL) { _ASSERT(0); return; } glFlushVertexArrayRangeNV = extproc; glFlushVertexArrayRangeNV(); } static void APIENTRY InitVertexArrayRangeNV (GLsizei length, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexArrayRangeNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexArrayRangeNV = extproc; glVertexArrayRangeNV(length, pointer); } static void APIENTRY InitCombinerParameterfvNV (GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerParameterfvNV = extproc; glCombinerParameterfvNV(pname, params); } static void APIENTRY InitCombinerParameterfNV (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerParameterfNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerParameterfNV = extproc; glCombinerParameterfNV(pname, param); } static void APIENTRY InitCombinerParameterivNV (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerParameterivNV = extproc; glCombinerParameterivNV(pname, params); } static void APIENTRY InitCombinerParameteriNV (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerParameteriNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerParameteriNV = extproc; glCombinerParameteriNV(pname, param); } static void APIENTRY InitCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerInputNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerInputNV = extproc; glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage); } static void APIENTRY InitCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerOutputNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerOutputNV = extproc; glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum); } static void APIENTRY InitFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { void *extproc; extproc = (void *) wglGetProcAddress("glFinalCombinerInputNV"); if (extproc == NULL) { _ASSERT(0); return; } glFinalCombinerInputNV = extproc; glFinalCombinerInputNV(variable, input, mapping, componentUsage); } static void APIENTRY InitGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCombinerInputParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetCombinerInputParameterfvNV = extproc; glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params); } static void APIENTRY InitGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCombinerInputParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetCombinerInputParameterivNV = extproc; glGetCombinerInputParameterivNV(stage, portion, variable, pname, params); } static void APIENTRY InitGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCombinerOutputParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetCombinerOutputParameterfvNV = extproc; glGetCombinerOutputParameterfvNV(stage, portion, pname, params); } static void APIENTRY InitGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCombinerOutputParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetCombinerOutputParameterivNV = extproc; glGetCombinerOutputParameterivNV(stage, portion, pname, params); } static void APIENTRY InitGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFinalCombinerInputParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetFinalCombinerInputParameterfvNV = extproc; glGetFinalCombinerInputParameterfvNV(variable, pname, params); } static void APIENTRY InitGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFinalCombinerInputParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetFinalCombinerInputParameterivNV = extproc; glGetFinalCombinerInputParameterivNV(variable, pname, params); } static void APIENTRY InitResizeBuffersMESA (void) { void *extproc; extproc = (void *) wglGetProcAddress("glResizeBuffersMESA"); if (extproc == NULL) { _ASSERT(0); return; } glResizeBuffersMESA = extproc; glResizeBuffersMESA(); } static void APIENTRY InitWindowPos2dMESA (GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2dMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2dMESA = extproc; glWindowPos2dMESA(x, y); } static void APIENTRY InitWindowPos2dvMESA (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2dvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2dvMESA = extproc; glWindowPos2dvMESA(v); } static void APIENTRY InitWindowPos2fMESA (GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2fMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2fMESA = extproc; glWindowPos2fMESA(x, y); } static void APIENTRY InitWindowPos2fvMESA (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2fvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2fvMESA = extproc; glWindowPos2fvMESA(v); } static void APIENTRY InitWindowPos2iMESA (GLint x, GLint y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2iMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2iMESA = extproc; glWindowPos2iMESA(x, y); } static void APIENTRY InitWindowPos2ivMESA (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2ivMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2ivMESA = extproc; glWindowPos2ivMESA(v); } static void APIENTRY InitWindowPos2sMESA (GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2sMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2sMESA = extproc; glWindowPos2sMESA(x, y); } static void APIENTRY InitWindowPos2svMESA (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos2svMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos2svMESA = extproc; glWindowPos2svMESA(v); } static void APIENTRY InitWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3dMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3dMESA = extproc; glWindowPos3dMESA(x, y, z); } static void APIENTRY InitWindowPos3dvMESA (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3dvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3dvMESA = extproc; glWindowPos3dvMESA(v); } static void APIENTRY InitWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3fMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3fMESA = extproc; glWindowPos3fMESA(x, y, z); } static void APIENTRY InitWindowPos3fvMESA (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3fvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3fvMESA = extproc; glWindowPos3fvMESA(v); } static void APIENTRY InitWindowPos3iMESA (GLint x, GLint y, GLint z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3iMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3iMESA = extproc; glWindowPos3iMESA(x, y, z); } static void APIENTRY InitWindowPos3ivMESA (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3ivMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3ivMESA = extproc; glWindowPos3ivMESA(v); } static void APIENTRY InitWindowPos3sMESA (GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3sMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3sMESA = extproc; glWindowPos3sMESA(x, y, z); } static void APIENTRY InitWindowPos3svMESA (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos3svMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos3svMESA = extproc; glWindowPos3svMESA(v); } static void APIENTRY InitWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4dMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4dMESA = extproc; glWindowPos4dMESA(x, y, z, w); } static void APIENTRY InitWindowPos4dvMESA (const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4dvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4dvMESA = extproc; glWindowPos4dvMESA(v); } static void APIENTRY InitWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4fMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4fMESA = extproc; glWindowPos4fMESA(x, y, z, w); } static void APIENTRY InitWindowPos4fvMESA (const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4fvMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4fvMESA = extproc; glWindowPos4fvMESA(v); } static void APIENTRY InitWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4iMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4iMESA = extproc; glWindowPos4iMESA(x, y, z, w); } static void APIENTRY InitWindowPos4ivMESA (const GLint *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4ivMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4ivMESA = extproc; glWindowPos4ivMESA(v); } static void APIENTRY InitWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4sMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4sMESA = extproc; glWindowPos4sMESA(x, y, z, w); } static void APIENTRY InitWindowPos4svMESA (const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glWindowPos4svMESA"); if (extproc == NULL) { _ASSERT(0); return; } glWindowPos4svMESA = extproc; glWindowPos4svMESA(v); } static void APIENTRY InitMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiModeDrawArraysIBM"); if (extproc == NULL) { _ASSERT(0); return; } glMultiModeDrawArraysIBM = extproc; glMultiModeDrawArraysIBM(mode, first, count, primcount, modestride); } static void APIENTRY InitMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiModeDrawElementsIBM"); if (extproc == NULL) { _ASSERT(0); return; } glMultiModeDrawElementsIBM = extproc; glMultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride); } static void APIENTRY InitColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glColorPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glColorPointerListIBM = extproc; glColorPointerListIBM(size, type, stride, pointer, ptrstride); } static void APIENTRY InitSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColorPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColorPointerListIBM = extproc; glSecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride); } static void APIENTRY InitEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glEdgeFlagPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glEdgeFlagPointerListIBM = extproc; glEdgeFlagPointerListIBM(stride, pointer, ptrstride); } static void APIENTRY InitFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordPointerListIBM = extproc; glFogCoordPointerListIBM(type, stride, pointer, ptrstride); } static void APIENTRY InitIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glIndexPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glIndexPointerListIBM = extproc; glIndexPointerListIBM(type, stride, pointer, ptrstride); } static void APIENTRY InitNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glNormalPointerListIBM = extproc; glNormalPointerListIBM(type, stride, pointer, ptrstride); } static void APIENTRY InitTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoordPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoordPointerListIBM = extproc; glTexCoordPointerListIBM(size, type, stride, pointer, ptrstride); } static void APIENTRY InitVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexPointerListIBM"); if (extproc == NULL) { _ASSERT(0); return; } glVertexPointerListIBM = extproc; glVertexPointerListIBM(size, type, stride, pointer, ptrstride); } static void APIENTRY InitTbufferMask3DFX (GLuint mask) { void *extproc; extproc = (void *) wglGetProcAddress("glTbufferMask3DFX"); if (extproc == NULL) { _ASSERT(0); return; } glTbufferMask3DFX = extproc; glTbufferMask3DFX(mask); } static void APIENTRY InitSampleMaskEXT (GLclampf value, GLboolean invert) { void *extproc; extproc = (void *) wglGetProcAddress("glSampleMaskEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSampleMaskEXT = extproc; glSampleMaskEXT(value, invert); } static void APIENTRY InitSamplePatternEXT (GLenum pattern) { void *extproc; extproc = (void *) wglGetProcAddress("glSamplePatternEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSamplePatternEXT = extproc; glSamplePatternEXT(pattern); } static void APIENTRY InitTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { void *extproc; extproc = (void *) wglGetProcAddress("glTextureColorMaskSGIS"); if (extproc == NULL) { _ASSERT(0); return; } glTextureColorMaskSGIS = extproc; glTextureColorMaskSGIS(red, green, blue, alpha); } static void APIENTRY InitIglooInterfaceSGIX (GLenum pname, const GLvoid *params) { void *extproc; extproc = (void *) wglGetProcAddress("glIglooInterfaceSGIX"); if (extproc == NULL) { _ASSERT(0); return; } glIglooInterfaceSGIX = extproc; glIglooInterfaceSGIX(pname, params); } static void APIENTRY InitDeleteFencesNV (GLsizei n, const GLuint *fences) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteFencesNV"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteFencesNV = extproc; glDeleteFencesNV(n, fences); } static void APIENTRY InitGenFencesNV (GLsizei n, GLuint *fences) { void *extproc; extproc = (void *) wglGetProcAddress("glGenFencesNV"); if (extproc == NULL) { _ASSERT(0); return; } glGenFencesNV = extproc; glGenFencesNV(n, fences); } static GLboolean APIENTRY InitIsFenceNV (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glIsFenceNV"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsFenceNV = extproc; return glIsFenceNV(fence); } static GLboolean APIENTRY InitTestFenceNV (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glTestFenceNV"); if (extproc == NULL) { _ASSERT(0); return 0; } glTestFenceNV = extproc; return glTestFenceNV(fence); } static void APIENTRY InitGetFenceivNV (GLuint fence, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetFenceivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetFenceivNV = extproc; glGetFenceivNV(fence, pname, params); } static void APIENTRY InitFinishFenceNV (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glFinishFenceNV"); if (extproc == NULL) { _ASSERT(0); return; } glFinishFenceNV = extproc; glFinishFenceNV(fence); } static void APIENTRY InitSetFenceNV (GLuint fence, GLenum condition) { void *extproc; extproc = (void *) wglGetProcAddress("glSetFenceNV"); if (extproc == NULL) { _ASSERT(0); return; } glSetFenceNV = extproc; glSetFenceNV(fence, condition); } static void APIENTRY InitMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points) { void *extproc; extproc = (void *) wglGetProcAddress("glMapControlPointsNV"); if (extproc == NULL) { _ASSERT(0); return; } glMapControlPointsNV = extproc; glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points); } static void APIENTRY InitMapParameterivNV (GLenum target, GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glMapParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glMapParameterivNV = extproc; glMapParameterivNV(target, pname, params); } static void APIENTRY InitMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glMapParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glMapParameterfvNV = extproc; glMapParameterfvNV(target, pname, params); } static void APIENTRY InitGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMapControlPointsNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetMapControlPointsNV = extproc; glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points); } static void APIENTRY InitGetMapParameterivNV (GLenum target, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMapParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetMapParameterivNV = extproc; glGetMapParameterivNV(target, pname, params); } static void APIENTRY InitGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMapParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetMapParameterfvNV = extproc; glGetMapParameterfvNV(target, pname, params); } static void APIENTRY InitGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMapAttribParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetMapAttribParameterivNV = extproc; glGetMapAttribParameterivNV(target, index, pname, params); } static void APIENTRY InitGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetMapAttribParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetMapAttribParameterfvNV = extproc; glGetMapAttribParameterfvNV(target, index, pname, params); } static void APIENTRY InitEvalMapsNV (GLenum target, GLenum mode) { void *extproc; extproc = (void *) wglGetProcAddress("glEvalMapsNV"); if (extproc == NULL) { _ASSERT(0); return; } glEvalMapsNV = extproc; glEvalMapsNV(target, mode); } static void APIENTRY InitCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glCombinerStageParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glCombinerStageParameterfvNV = extproc; glCombinerStageParameterfvNV(stage, pname, params); } static void APIENTRY InitGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetCombinerStageParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetCombinerStageParameterfvNV = extproc; glGetCombinerStageParameterfvNV(stage, pname, params); } static GLboolean APIENTRY InitAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences) { void *extproc; extproc = (void *) wglGetProcAddress("glAreProgramsResidentNV"); if (extproc == NULL) { _ASSERT(0); return 0; } glAreProgramsResidentNV = extproc; return glAreProgramsResidentNV(n, programs, residences); } static void APIENTRY InitBindProgramNV (GLenum target, GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBindProgramNV"); if (extproc == NULL) { _ASSERT(0); return; } glBindProgramNV = extproc; glBindProgramNV(target, id); } static void APIENTRY InitDeleteProgramsNV (GLsizei n, const GLuint *programs) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteProgramsNV"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteProgramsNV = extproc; glDeleteProgramsNV(n, programs); } static void APIENTRY InitExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glExecuteProgramNV"); if (extproc == NULL) { _ASSERT(0); return; } glExecuteProgramNV = extproc; glExecuteProgramNV(target, id, params); } static void APIENTRY InitGenProgramsNV (GLsizei n, GLuint *programs) { void *extproc; extproc = (void *) wglGetProcAddress("glGenProgramsNV"); if (extproc == NULL) { _ASSERT(0); return; } glGenProgramsNV = extproc; glGenProgramsNV(n, programs); } static void APIENTRY InitGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramParameterdvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramParameterdvNV = extproc; glGetProgramParameterdvNV(target, index, pname, params); } static void APIENTRY InitGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramParameterfvNV = extproc; glGetProgramParameterfvNV(target, index, pname, params); } static void APIENTRY InitGetProgramivNV (GLuint id, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramivNV = extproc; glGetProgramivNV(id, pname, params); } static void APIENTRY InitGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramStringNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramStringNV = extproc; glGetProgramStringNV(id, pname, program); } static void APIENTRY InitGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetTrackMatrixivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetTrackMatrixivNV = extproc; glGetTrackMatrixivNV(target, address, pname, params); } static void APIENTRY InitGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribdvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribdvNV = extproc; glGetVertexAttribdvNV(index, pname, params); } static void APIENTRY InitGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribfvNV = extproc; glGetVertexAttribfvNV(index, pname, params); } static void APIENTRY InitGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribivNV = extproc; glGetVertexAttribivNV(index, pname, params); } static void APIENTRY InitGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribPointervNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribPointervNV = extproc; glGetVertexAttribPointervNV(index, pname, pointer); } static GLboolean APIENTRY InitIsProgramNV (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glIsProgramNV"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsProgramNV = extproc; return glIsProgramNV(id); } static void APIENTRY InitLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program) { void *extproc; extproc = (void *) wglGetProcAddress("glLoadProgramNV"); if (extproc == NULL) { _ASSERT(0); return; } glLoadProgramNV = extproc; glLoadProgramNV(target, id, len, program); } static void APIENTRY InitProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameter4dNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameter4dNV = extproc; glProgramParameter4dNV(target, index, x, y, z, w); } static void APIENTRY InitProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameter4dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameter4dvNV = extproc; glProgramParameter4dvNV(target, index, v); } static void APIENTRY InitProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameter4fNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameter4fNV = extproc; glProgramParameter4fNV(target, index, x, y, z, w); } static void APIENTRY InitProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameter4fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameter4fvNV = extproc; glProgramParameter4fvNV(target, index, v); } static void APIENTRY InitProgramParameters4dvNV (GLenum target, GLuint index, GLuint count, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameters4dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameters4dvNV = extproc; glProgramParameters4dvNV(target, index, count, v); } static void APIENTRY InitProgramParameters4fvNV (GLenum target, GLuint index, GLuint count, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramParameters4fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramParameters4fvNV = extproc; glProgramParameters4fvNV(target, index, count, v); } static void APIENTRY InitRequestResidentProgramsNV (GLsizei n, const GLuint *programs) { void *extproc; extproc = (void *) wglGetProcAddress("glRequestResidentProgramsNV"); if (extproc == NULL) { _ASSERT(0); return; } glRequestResidentProgramsNV = extproc; glRequestResidentProgramsNV(n, programs); } static void APIENTRY InitTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform) { void *extproc; extproc = (void *) wglGetProcAddress("glTrackMatrixNV"); if (extproc == NULL) { _ASSERT(0); return; } glTrackMatrixNV = extproc; glTrackMatrixNV(target, address, matrix, transform); } static void APIENTRY InitVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribPointerNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribPointerNV = extproc; glVertexAttribPointerNV(index, fsize, type, stride, pointer); } static void APIENTRY InitVertexAttrib1dNV (GLuint index, GLdouble x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1dNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1dNV = extproc; glVertexAttrib1dNV(index, x); } static void APIENTRY InitVertexAttrib1dvNV (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1dvNV = extproc; glVertexAttrib1dvNV(index, v); } static void APIENTRY InitVertexAttrib1fNV (GLuint index, GLfloat x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1fNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1fNV = extproc; glVertexAttrib1fNV(index, x); } static void APIENTRY InitVertexAttrib1fvNV (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1fvNV = extproc; glVertexAttrib1fvNV(index, v); } static void APIENTRY InitVertexAttrib1sNV (GLuint index, GLshort x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1sNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1sNV = extproc; glVertexAttrib1sNV(index, x); } static void APIENTRY InitVertexAttrib1svNV (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1svNV = extproc; glVertexAttrib1svNV(index, v); } static void APIENTRY InitVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2dNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2dNV = extproc; glVertexAttrib2dNV(index, x, y); } static void APIENTRY InitVertexAttrib2dvNV (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2dvNV = extproc; glVertexAttrib2dvNV(index, v); } static void APIENTRY InitVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2fNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2fNV = extproc; glVertexAttrib2fNV(index, x, y); } static void APIENTRY InitVertexAttrib2fvNV (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2fvNV = extproc; glVertexAttrib2fvNV(index, v); } static void APIENTRY InitVertexAttrib2sNV (GLuint index, GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2sNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2sNV = extproc; glVertexAttrib2sNV(index, x, y); } static void APIENTRY InitVertexAttrib2svNV (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2svNV = extproc; glVertexAttrib2svNV(index, v); } static void APIENTRY InitVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3dNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3dNV = extproc; glVertexAttrib3dNV(index, x, y, z); } static void APIENTRY InitVertexAttrib3dvNV (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3dvNV = extproc; glVertexAttrib3dvNV(index, v); } static void APIENTRY InitVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3fNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3fNV = extproc; glVertexAttrib3fNV(index, x, y, z); } static void APIENTRY InitVertexAttrib3fvNV (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3fvNV = extproc; glVertexAttrib3fvNV(index, v); } static void APIENTRY InitVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3sNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3sNV = extproc; glVertexAttrib3sNV(index, x, y, z); } static void APIENTRY InitVertexAttrib3svNV (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3svNV = extproc; glVertexAttrib3svNV(index, v); } static void APIENTRY InitVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4dNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4dNV = extproc; glVertexAttrib4dNV(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4dvNV (GLuint index, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4dvNV = extproc; glVertexAttrib4dvNV(index, v); } static void APIENTRY InitVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4fNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4fNV = extproc; glVertexAttrib4fNV(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4fvNV (GLuint index, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4fvNV = extproc; glVertexAttrib4fvNV(index, v); } static void APIENTRY InitVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4sNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4sNV = extproc; glVertexAttrib4sNV(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4svNV (GLuint index, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4svNV = extproc; glVertexAttrib4svNV(index, v); } static void APIENTRY InitVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4ubNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4ubNV = extproc; glVertexAttrib4ubNV(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4ubvNV (GLuint index, const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4ubvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4ubvNV = extproc; glVertexAttrib4ubvNV(index, v); } static void APIENTRY InitVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs1dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs1dvNV = extproc; glVertexAttribs1dvNV(index, count, v); } static void APIENTRY InitVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs1fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs1fvNV = extproc; glVertexAttribs1fvNV(index, count, v); } static void APIENTRY InitVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs1svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs1svNV = extproc; glVertexAttribs1svNV(index, count, v); } static void APIENTRY InitVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs2dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs2dvNV = extproc; glVertexAttribs2dvNV(index, count, v); } static void APIENTRY InitVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs2fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs2fvNV = extproc; glVertexAttribs2fvNV(index, count, v); } static void APIENTRY InitVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs2svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs2svNV = extproc; glVertexAttribs2svNV(index, count, v); } static void APIENTRY InitVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs3dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs3dvNV = extproc; glVertexAttribs3dvNV(index, count, v); } static void APIENTRY InitVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs3fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs3fvNV = extproc; glVertexAttribs3fvNV(index, count, v); } static void APIENTRY InitVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs3svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs3svNV = extproc; glVertexAttribs3svNV(index, count, v); } static void APIENTRY InitVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs4dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs4dvNV = extproc; glVertexAttribs4dvNV(index, count, v); } static void APIENTRY InitVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs4fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs4fvNV = extproc; glVertexAttribs4fvNV(index, count, v); } static void APIENTRY InitVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs4svNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs4svNV = extproc; glVertexAttribs4svNV(index, count, v); } static void APIENTRY InitVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs4ubvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs4ubvNV = extproc; glVertexAttribs4ubvNV(index, count, v); } static void APIENTRY InitTexBumpParameterivATI (GLenum pname, const GLint *param) { void *extproc; extproc = (void *) wglGetProcAddress("glTexBumpParameterivATI"); if (extproc == NULL) { _ASSERT(0); return; } glTexBumpParameterivATI = extproc; glTexBumpParameterivATI(pname, param); } static void APIENTRY InitTexBumpParameterfvATI (GLenum pname, const GLfloat *param) { void *extproc; extproc = (void *) wglGetProcAddress("glTexBumpParameterfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glTexBumpParameterfvATI = extproc; glTexBumpParameterfvATI(pname, param); } static void APIENTRY InitGetTexBumpParameterivATI (GLenum pname, GLint *param) { void *extproc; extproc = (void *) wglGetProcAddress("glGetTexBumpParameterivATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetTexBumpParameterivATI = extproc; glGetTexBumpParameterivATI(pname, param); } static void APIENTRY InitGetTexBumpParameterfvATI (GLenum pname, GLfloat *param) { void *extproc; extproc = (void *) wglGetProcAddress("glGetTexBumpParameterfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetTexBumpParameterfvATI = extproc; glGetTexBumpParameterfvATI(pname, param); } static GLuint APIENTRY InitGenFragmentShadersATI (GLuint range) { void *extproc; extproc = (void *) wglGetProcAddress("glGenFragmentShadersATI"); if (extproc == NULL) { _ASSERT(0); return 0; } glGenFragmentShadersATI = extproc; return glGenFragmentShadersATI(range); } static void APIENTRY InitBindFragmentShaderATI (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBindFragmentShaderATI"); if (extproc == NULL) { _ASSERT(0); return; } glBindFragmentShaderATI = extproc; glBindFragmentShaderATI(id); } static void APIENTRY InitDeleteFragmentShaderATI (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteFragmentShaderATI"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteFragmentShaderATI = extproc; glDeleteFragmentShaderATI(id); } static void APIENTRY InitBeginFragmentShaderATI (void) { void *extproc; extproc = (void *) wglGetProcAddress("glBeginFragmentShaderATI"); if (extproc == NULL) { _ASSERT(0); return; } glBeginFragmentShaderATI = extproc; glBeginFragmentShaderATI(); } static void APIENTRY InitEndFragmentShaderATI (void) { void *extproc; extproc = (void *) wglGetProcAddress("glEndFragmentShaderATI"); if (extproc == NULL) { _ASSERT(0); return; } glEndFragmentShaderATI = extproc; glEndFragmentShaderATI(); } static void APIENTRY InitPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle) { void *extproc; extproc = (void *) wglGetProcAddress("glPassTexCoordATI"); if (extproc == NULL) { _ASSERT(0); return; } glPassTexCoordATI = extproc; glPassTexCoordATI(dst, coord, swizzle); } static void APIENTRY InitSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle) { void *extproc; extproc = (void *) wglGetProcAddress("glSampleMapATI"); if (extproc == NULL) { _ASSERT(0); return; } glSampleMapATI = extproc; glSampleMapATI(dst, interp, swizzle); } static void APIENTRY InitColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glColorFragmentOp1ATI"); if (extproc == NULL) { _ASSERT(0); return; } glColorFragmentOp1ATI = extproc; glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod); } static void APIENTRY InitColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glColorFragmentOp2ATI"); if (extproc == NULL) { _ASSERT(0); return; } glColorFragmentOp2ATI = extproc; glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } static void APIENTRY InitColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glColorFragmentOp3ATI"); if (extproc == NULL) { _ASSERT(0); return; } glColorFragmentOp3ATI = extproc; glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } static void APIENTRY InitAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glAlphaFragmentOp1ATI"); if (extproc == NULL) { _ASSERT(0); return; } glAlphaFragmentOp1ATI = extproc; glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod); } static void APIENTRY InitAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glAlphaFragmentOp2ATI"); if (extproc == NULL) { _ASSERT(0); return; } glAlphaFragmentOp2ATI = extproc; glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } static void APIENTRY InitAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { void *extproc; extproc = (void *) wglGetProcAddress("glAlphaFragmentOp3ATI"); if (extproc == NULL) { _ASSERT(0); return; } glAlphaFragmentOp3ATI = extproc; glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } static void APIENTRY InitSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value) { void *extproc; extproc = (void *) wglGetProcAddress("glSetFragmentShaderConstantATI"); if (extproc == NULL) { _ASSERT(0); return; } glSetFragmentShaderConstantATI = extproc; glSetFragmentShaderConstantATI(dst, value); } static void APIENTRY InitPNTrianglesiATI (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glPNTrianglesiATI"); if (extproc == NULL) { _ASSERT(0); return; } glPNTrianglesiATI = extproc; glPNTrianglesiATI(pname, param); } static void APIENTRY InitPNTrianglesfATI (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glPNTrianglesfATI"); if (extproc == NULL) { _ASSERT(0); return; } glPNTrianglesfATI = extproc; glPNTrianglesfATI(pname, param); } static GLuint APIENTRY InitNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage) { void *extproc; extproc = (void *) wglGetProcAddress("glNewObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return 0; } glNewObjectBufferATI = extproc; return glNewObjectBufferATI(size, pointer, usage); } static GLboolean APIENTRY InitIsObjectBufferATI (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glIsObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsObjectBufferATI = extproc; return glIsObjectBufferATI(buffer); } static void APIENTRY InitUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve) { void *extproc; extproc = (void *) wglGetProcAddress("glUpdateObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return; } glUpdateObjectBufferATI = extproc; glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve); } static void APIENTRY InitGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetObjectBufferfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetObjectBufferfvATI = extproc; glGetObjectBufferfvATI(buffer, pname, params); } static void APIENTRY InitGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetObjectBufferivATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetObjectBufferivATI = extproc; glGetObjectBufferivATI(buffer, pname, params); } static void APIENTRY InitFreeObjectBufferATI (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glFreeObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return; } glFreeObjectBufferATI = extproc; glFreeObjectBufferATI(buffer); } static void APIENTRY InitArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { void *extproc; extproc = (void *) wglGetProcAddress("glArrayObjectATI"); if (extproc == NULL) { _ASSERT(0); return; } glArrayObjectATI = extproc; glArrayObjectATI(array, size, type, stride, buffer, offset); } static void APIENTRY InitGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetArrayObjectfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetArrayObjectfvATI = extproc; glGetArrayObjectfvATI(array, pname, params); } static void APIENTRY InitGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetArrayObjectivATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetArrayObjectivATI = extproc; glGetArrayObjectivATI(array, pname, params); } static void APIENTRY InitVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantArrayObjectATI"); if (extproc == NULL) { _ASSERT(0); return; } glVariantArrayObjectATI = extproc; glVariantArrayObjectATI(id, type, stride, buffer, offset); } static void APIENTRY InitGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantArrayObjectfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantArrayObjectfvATI = extproc; glGetVariantArrayObjectfvATI(id, pname, params); } static void APIENTRY InitGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantArrayObjectivATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantArrayObjectivATI = extproc; glGetVariantArrayObjectivATI(id, pname, params); } static void APIENTRY InitBeginVertexShaderEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("glBeginVertexShaderEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBeginVertexShaderEXT = extproc; glBeginVertexShaderEXT(); } static void APIENTRY InitEndVertexShaderEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("glEndVertexShaderEXT"); if (extproc == NULL) { _ASSERT(0); return; } glEndVertexShaderEXT = extproc; glEndVertexShaderEXT(); } static void APIENTRY InitBindVertexShaderEXT (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBindVertexShaderEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBindVertexShaderEXT = extproc; glBindVertexShaderEXT(id); } static GLuint APIENTRY InitGenVertexShadersEXT (GLuint range) { void *extproc; extproc = (void *) wglGetProcAddress("glGenVertexShadersEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glGenVertexShadersEXT = extproc; return glGenVertexShadersEXT(range); } static void APIENTRY InitDeleteVertexShaderEXT (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteVertexShaderEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteVertexShaderEXT = extproc; glDeleteVertexShaderEXT(id); } static void APIENTRY InitShaderOp1EXT (GLenum op, GLuint res, GLuint arg1) { void *extproc; extproc = (void *) wglGetProcAddress("glShaderOp1EXT"); if (extproc == NULL) { _ASSERT(0); return; } glShaderOp1EXT = extproc; glShaderOp1EXT(op, res, arg1); } static void APIENTRY InitShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2) { void *extproc; extproc = (void *) wglGetProcAddress("glShaderOp2EXT"); if (extproc == NULL) { _ASSERT(0); return; } glShaderOp2EXT = extproc; glShaderOp2EXT(op, res, arg1, arg2); } static void APIENTRY InitShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) { void *extproc; extproc = (void *) wglGetProcAddress("glShaderOp3EXT"); if (extproc == NULL) { _ASSERT(0); return; } glShaderOp3EXT = extproc; glShaderOp3EXT(op, res, arg1, arg2, arg3); } static void APIENTRY InitSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { void *extproc; extproc = (void *) wglGetProcAddress("glSwizzleEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSwizzleEXT = extproc; glSwizzleEXT(res, in, outX, outY, outZ, outW); } static void APIENTRY InitWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { void *extproc; extproc = (void *) wglGetProcAddress("glWriteMaskEXT"); if (extproc == NULL) { _ASSERT(0); return; } glWriteMaskEXT = extproc; glWriteMaskEXT(res, in, outX, outY, outZ, outW); } static void APIENTRY InitInsertComponentEXT (GLuint res, GLuint src, GLuint num) { void *extproc; extproc = (void *) wglGetProcAddress("glInsertComponentEXT"); if (extproc == NULL) { _ASSERT(0); return; } glInsertComponentEXT = extproc; glInsertComponentEXT(res, src, num); } static void APIENTRY InitExtractComponentEXT (GLuint res, GLuint src, GLuint num) { void *extproc; extproc = (void *) wglGetProcAddress("glExtractComponentEXT"); if (extproc == NULL) { _ASSERT(0); return; } glExtractComponentEXT = extproc; glExtractComponentEXT(res, src, num); } static GLuint APIENTRY InitGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components) { void *extproc; extproc = (void *) wglGetProcAddress("glGenSymbolsEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glGenSymbolsEXT = extproc; return glGenSymbolsEXT(datatype, storagetype, range, components); } static void APIENTRY InitSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glSetInvariantEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSetInvariantEXT = extproc; glSetInvariantEXT(id, type, addr); } static void APIENTRY InitSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glSetLocalConstantEXT"); if (extproc == NULL) { _ASSERT(0); return; } glSetLocalConstantEXT = extproc; glSetLocalConstantEXT(id, type, addr); } static void APIENTRY InitVariantbvEXT (GLuint id, const GLbyte *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantbvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantbvEXT = extproc; glVariantbvEXT(id, addr); } static void APIENTRY InitVariantsvEXT (GLuint id, const GLshort *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantsvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantsvEXT = extproc; glVariantsvEXT(id, addr); } static void APIENTRY InitVariantivEXT (GLuint id, const GLint *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantivEXT = extproc; glVariantivEXT(id, addr); } static void APIENTRY InitVariantfvEXT (GLuint id, const GLfloat *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantfvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantfvEXT = extproc; glVariantfvEXT(id, addr); } static void APIENTRY InitVariantdvEXT (GLuint id, const GLdouble *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantdvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantdvEXT = extproc; glVariantdvEXT(id, addr); } static void APIENTRY InitVariantubvEXT (GLuint id, const GLubyte *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantubvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantubvEXT = extproc; glVariantubvEXT(id, addr); } static void APIENTRY InitVariantusvEXT (GLuint id, const GLushort *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantusvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantusvEXT = extproc; glVariantusvEXT(id, addr); } static void APIENTRY InitVariantuivEXT (GLuint id, const GLuint *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantuivEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantuivEXT = extproc; glVariantuivEXT(id, addr); } static void APIENTRY InitVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr) { void *extproc; extproc = (void *) wglGetProcAddress("glVariantPointerEXT"); if (extproc == NULL) { _ASSERT(0); return; } glVariantPointerEXT = extproc; glVariantPointerEXT(id, type, stride, addr); } static void APIENTRY InitEnableVariantClientStateEXT (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glEnableVariantClientStateEXT"); if (extproc == NULL) { _ASSERT(0); return; } glEnableVariantClientStateEXT = extproc; glEnableVariantClientStateEXT(id); } static void APIENTRY InitDisableVariantClientStateEXT (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glDisableVariantClientStateEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDisableVariantClientStateEXT = extproc; glDisableVariantClientStateEXT(id); } static GLuint APIENTRY InitBindLightParameterEXT (GLenum light, GLenum value) { void *extproc; extproc = (void *) wglGetProcAddress("glBindLightParameterEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glBindLightParameterEXT = extproc; return glBindLightParameterEXT(light, value); } static GLuint APIENTRY InitBindMaterialParameterEXT (GLenum face, GLenum value) { void *extproc; extproc = (void *) wglGetProcAddress("glBindMaterialParameterEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glBindMaterialParameterEXT = extproc; return glBindMaterialParameterEXT(face, value); } static GLuint APIENTRY InitBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value) { void *extproc; extproc = (void *) wglGetProcAddress("glBindTexGenParameterEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glBindTexGenParameterEXT = extproc; return glBindTexGenParameterEXT(unit, coord, value); } static GLuint APIENTRY InitBindTextureUnitParameterEXT (GLenum unit, GLenum value) { void *extproc; extproc = (void *) wglGetProcAddress("glBindTextureUnitParameterEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glBindTextureUnitParameterEXT = extproc; return glBindTextureUnitParameterEXT(unit, value); } static GLuint APIENTRY InitBindParameterEXT (GLenum value) { void *extproc; extproc = (void *) wglGetProcAddress("glBindParameterEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glBindParameterEXT = extproc; return glBindParameterEXT(value); } static GLboolean APIENTRY InitIsVariantEnabledEXT (GLuint id, GLenum cap) { void *extproc; extproc = (void *) wglGetProcAddress("glIsVariantEnabledEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsVariantEnabledEXT = extproc; return glIsVariantEnabledEXT(id, cap); } static void APIENTRY InitGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantBooleanvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantBooleanvEXT = extproc; glGetVariantBooleanvEXT(id, value, data); } static void APIENTRY InitGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantIntegervEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantIntegervEXT = extproc; glGetVariantIntegervEXT(id, value, data); } static void APIENTRY InitGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantFloatvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantFloatvEXT = extproc; glGetVariantFloatvEXT(id, value, data); } static void APIENTRY InitGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVariantPointervEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetVariantPointervEXT = extproc; glGetVariantPointervEXT(id, value, data); } static void APIENTRY InitGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetInvariantBooleanvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetInvariantBooleanvEXT = extproc; glGetInvariantBooleanvEXT(id, value, data); } static void APIENTRY InitGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetInvariantIntegervEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetInvariantIntegervEXT = extproc; glGetInvariantIntegervEXT(id, value, data); } static void APIENTRY InitGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetInvariantFloatvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetInvariantFloatvEXT = extproc; glGetInvariantFloatvEXT(id, value, data); } static void APIENTRY InitGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetLocalConstantBooleanvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetLocalConstantBooleanvEXT = extproc; glGetLocalConstantBooleanvEXT(id, value, data); } static void APIENTRY InitGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetLocalConstantIntegervEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetLocalConstantIntegervEXT = extproc; glGetLocalConstantIntegervEXT(id, value, data); } static void APIENTRY InitGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { void *extproc; extproc = (void *) wglGetProcAddress("glGetLocalConstantFloatvEXT"); if (extproc == NULL) { _ASSERT(0); return; } glGetLocalConstantFloatvEXT = extproc; glGetLocalConstantFloatvEXT(id, value, data); } static void APIENTRY InitVertexStream1sATI (GLenum stream, GLshort x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1sATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1sATI = extproc; glVertexStream1sATI(stream, x); } static void APIENTRY InitVertexStream1svATI (GLenum stream, const GLshort *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1svATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1svATI = extproc; glVertexStream1svATI(stream, coords); } static void APIENTRY InitVertexStream1iATI (GLenum stream, GLint x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1iATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1iATI = extproc; glVertexStream1iATI(stream, x); } static void APIENTRY InitVertexStream1ivATI (GLenum stream, const GLint *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1ivATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1ivATI = extproc; glVertexStream1ivATI(stream, coords); } static void APIENTRY InitVertexStream1fATI (GLenum stream, GLfloat x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1fATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1fATI = extproc; glVertexStream1fATI(stream, x); } static void APIENTRY InitVertexStream1fvATI (GLenum stream, const GLfloat *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1fvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1fvATI = extproc; glVertexStream1fvATI(stream, coords); } static void APIENTRY InitVertexStream1dATI (GLenum stream, GLdouble x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1dATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1dATI = extproc; glVertexStream1dATI(stream, x); } static void APIENTRY InitVertexStream1dvATI (GLenum stream, const GLdouble *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream1dvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream1dvATI = extproc; glVertexStream1dvATI(stream, coords); } static void APIENTRY InitVertexStream2sATI (GLenum stream, GLshort x, GLshort y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2sATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2sATI = extproc; glVertexStream2sATI(stream, x, y); } static void APIENTRY InitVertexStream2svATI (GLenum stream, const GLshort *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2svATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2svATI = extproc; glVertexStream2svATI(stream, coords); } static void APIENTRY InitVertexStream2iATI (GLenum stream, GLint x, GLint y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2iATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2iATI = extproc; glVertexStream2iATI(stream, x, y); } static void APIENTRY InitVertexStream2ivATI (GLenum stream, const GLint *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2ivATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2ivATI = extproc; glVertexStream2ivATI(stream, coords); } static void APIENTRY InitVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2fATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2fATI = extproc; glVertexStream2fATI(stream, x, y); } static void APIENTRY InitVertexStream2fvATI (GLenum stream, const GLfloat *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2fvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2fvATI = extproc; glVertexStream2fvATI(stream, coords); } static void APIENTRY InitVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2dATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2dATI = extproc; glVertexStream2dATI(stream, x, y); } static void APIENTRY InitVertexStream2dvATI (GLenum stream, const GLdouble *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream2dvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream2dvATI = extproc; glVertexStream2dvATI(stream, coords); } static void APIENTRY InitVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3sATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3sATI = extproc; glVertexStream3sATI(stream, x, y, z); } static void APIENTRY InitVertexStream3svATI (GLenum stream, const GLshort *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3svATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3svATI = extproc; glVertexStream3svATI(stream, coords); } static void APIENTRY InitVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3iATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3iATI = extproc; glVertexStream3iATI(stream, x, y, z); } static void APIENTRY InitVertexStream3ivATI (GLenum stream, const GLint *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3ivATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3ivATI = extproc; glVertexStream3ivATI(stream, coords); } static void APIENTRY InitVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3fATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3fATI = extproc; glVertexStream3fATI(stream, x, y, z); } static void APIENTRY InitVertexStream3fvATI (GLenum stream, const GLfloat *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3fvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3fvATI = extproc; glVertexStream3fvATI(stream, coords); } static void APIENTRY InitVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3dATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3dATI = extproc; glVertexStream3dATI(stream, x, y, z); } static void APIENTRY InitVertexStream3dvATI (GLenum stream, const GLdouble *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream3dvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream3dvATI = extproc; glVertexStream3dvATI(stream, coords); } static void APIENTRY InitVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4sATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4sATI = extproc; glVertexStream4sATI(stream, x, y, z, w); } static void APIENTRY InitVertexStream4svATI (GLenum stream, const GLshort *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4svATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4svATI = extproc; glVertexStream4svATI(stream, coords); } static void APIENTRY InitVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4iATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4iATI = extproc; glVertexStream4iATI(stream, x, y, z, w); } static void APIENTRY InitVertexStream4ivATI (GLenum stream, const GLint *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4ivATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4ivATI = extproc; glVertexStream4ivATI(stream, coords); } static void APIENTRY InitVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4fATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4fATI = extproc; glVertexStream4fATI(stream, x, y, z, w); } static void APIENTRY InitVertexStream4fvATI (GLenum stream, const GLfloat *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4fvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4fvATI = extproc; glVertexStream4fvATI(stream, coords); } static void APIENTRY InitVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4dATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4dATI = extproc; glVertexStream4dATI(stream, x, y, z, w); } static void APIENTRY InitVertexStream4dvATI (GLenum stream, const GLdouble *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexStream4dvATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexStream4dvATI = extproc; glVertexStream4dvATI(stream, coords); } static void APIENTRY InitNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3bATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3bATI = extproc; glNormalStream3bATI(stream, nx, ny, nz); } static void APIENTRY InitNormalStream3bvATI (GLenum stream, const GLbyte *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3bvATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3bvATI = extproc; glNormalStream3bvATI(stream, coords); } static void APIENTRY InitNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3sATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3sATI = extproc; glNormalStream3sATI(stream, nx, ny, nz); } static void APIENTRY InitNormalStream3svATI (GLenum stream, const GLshort *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3svATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3svATI = extproc; glNormalStream3svATI(stream, coords); } static void APIENTRY InitNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3iATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3iATI = extproc; glNormalStream3iATI(stream, nx, ny, nz); } static void APIENTRY InitNormalStream3ivATI (GLenum stream, const GLint *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3ivATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3ivATI = extproc; glNormalStream3ivATI(stream, coords); } static void APIENTRY InitNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3fATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3fATI = extproc; glNormalStream3fATI(stream, nx, ny, nz); } static void APIENTRY InitNormalStream3fvATI (GLenum stream, const GLfloat *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3fvATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3fvATI = extproc; glNormalStream3fvATI(stream, coords); } static void APIENTRY InitNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3dATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3dATI = extproc; glNormalStream3dATI(stream, nx, ny, nz); } static void APIENTRY InitNormalStream3dvATI (GLenum stream, const GLdouble *coords) { void *extproc; extproc = (void *) wglGetProcAddress("glNormalStream3dvATI"); if (extproc == NULL) { _ASSERT(0); return; } glNormalStream3dvATI = extproc; glNormalStream3dvATI(stream, coords); } static void APIENTRY InitClientActiveVertexStreamATI (GLenum stream) { void *extproc; extproc = (void *) wglGetProcAddress("glClientActiveVertexStreamATI"); if (extproc == NULL) { _ASSERT(0); return; } glClientActiveVertexStreamATI = extproc; glClientActiveVertexStreamATI(stream); } static void APIENTRY InitVertexBlendEnviATI (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexBlendEnviATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexBlendEnviATI = extproc; glVertexBlendEnviATI(pname, param); } static void APIENTRY InitVertexBlendEnvfATI (GLenum pname, GLfloat param) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexBlendEnvfATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexBlendEnvfATI = extproc; glVertexBlendEnvfATI(pname, param); } static void APIENTRY InitElementPointerATI (GLenum type, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glElementPointerATI"); if (extproc == NULL) { _ASSERT(0); return; } glElementPointerATI = extproc; glElementPointerATI(type, pointer); } static void APIENTRY InitDrawElementArrayATI (GLenum mode, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawElementArrayATI"); if (extproc == NULL) { _ASSERT(0); return; } glDrawElementArrayATI = extproc; glDrawElementArrayATI(mode, count); } static void APIENTRY InitDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawRangeElementArrayATI"); if (extproc == NULL) { _ASSERT(0); return; } glDrawRangeElementArrayATI = extproc; glDrawRangeElementArrayATI(mode, start, end, count); } static void APIENTRY InitDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawMeshArraysSUN"); if (extproc == NULL) { _ASSERT(0); return; } glDrawMeshArraysSUN = extproc; glDrawMeshArraysSUN(mode, first, count, width); } static void APIENTRY InitGenOcclusionQueriesNV (GLsizei n, GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glGenOcclusionQueriesNV"); if (extproc == NULL) { _ASSERT(0); return; } glGenOcclusionQueriesNV = extproc; glGenOcclusionQueriesNV(n, ids); } static void APIENTRY InitDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteOcclusionQueriesNV"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteOcclusionQueriesNV = extproc; glDeleteOcclusionQueriesNV(n, ids); } static GLboolean APIENTRY InitIsOcclusionQueryNV (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glIsOcclusionQueryNV"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsOcclusionQueryNV = extproc; return glIsOcclusionQueryNV(id); } static void APIENTRY InitBeginOcclusionQueryNV (GLuint id) { void *extproc; extproc = (void *) wglGetProcAddress("glBeginOcclusionQueryNV"); if (extproc == NULL) { _ASSERT(0); return; } glBeginOcclusionQueryNV = extproc; glBeginOcclusionQueryNV(id); } static void APIENTRY InitEndOcclusionQueryNV (void) { void *extproc; extproc = (void *) wglGetProcAddress("glEndOcclusionQueryNV"); if (extproc == NULL) { _ASSERT(0); return; } glEndOcclusionQueryNV = extproc; glEndOcclusionQueryNV(); } static void APIENTRY InitGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetOcclusionQueryivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetOcclusionQueryivNV = extproc; glGetOcclusionQueryivNV(id, pname, params); } static void APIENTRY InitGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetOcclusionQueryuivNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetOcclusionQueryuivNV = extproc; glGetOcclusionQueryuivNV(id, pname, params); } static void APIENTRY InitPointParameteriNV (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameteriNV"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameteriNV = extproc; glPointParameteriNV(pname, param); } static void APIENTRY InitPointParameterivNV (GLenum pname, const GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glPointParameterivNV"); if (extproc == NULL) { _ASSERT(0); return; } glPointParameterivNV = extproc; glPointParameterivNV(pname, params); } static void APIENTRY InitActiveStencilFaceEXT (GLenum face) { void *extproc; extproc = (void *) wglGetProcAddress("glActiveStencilFaceEXT"); if (extproc == NULL) { _ASSERT(0); return; } glActiveStencilFaceEXT = extproc; glActiveStencilFaceEXT(face); } static void APIENTRY InitElementPointerAPPLE (GLenum type, const GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glElementPointerAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glElementPointerAPPLE = extproc; glElementPointerAPPLE(type, pointer); } static void APIENTRY InitDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawElementArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glDrawElementArrayAPPLE = extproc; glDrawElementArrayAPPLE(mode, first, count); } static void APIENTRY InitDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawRangeElementArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glDrawRangeElementArrayAPPLE = extproc; glDrawRangeElementArrayAPPLE(mode, start, end, first, count); } static void APIENTRY InitMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawElementArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawElementArrayAPPLE = extproc; glMultiDrawElementArrayAPPLE(mode, first, count, primcount); } static void APIENTRY InitMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiDrawRangeElementArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glMultiDrawRangeElementArrayAPPLE = extproc; glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount); } static void APIENTRY InitGenFencesAPPLE (GLsizei n, GLuint *fences) { void *extproc; extproc = (void *) wglGetProcAddress("glGenFencesAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glGenFencesAPPLE = extproc; glGenFencesAPPLE(n, fences); } static void APIENTRY InitDeleteFencesAPPLE (GLsizei n, const GLuint *fences) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteFencesAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteFencesAPPLE = extproc; glDeleteFencesAPPLE(n, fences); } static void APIENTRY InitSetFenceAPPLE (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glSetFenceAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glSetFenceAPPLE = extproc; glSetFenceAPPLE(fence); } static GLboolean APIENTRY InitIsFenceAPPLE (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glIsFenceAPPLE"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsFenceAPPLE = extproc; return glIsFenceAPPLE(fence); } static GLboolean APIENTRY InitTestFenceAPPLE (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glTestFenceAPPLE"); if (extproc == NULL) { _ASSERT(0); return 0; } glTestFenceAPPLE = extproc; return glTestFenceAPPLE(fence); } static void APIENTRY InitFinishFenceAPPLE (GLuint fence) { void *extproc; extproc = (void *) wglGetProcAddress("glFinishFenceAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glFinishFenceAPPLE = extproc; glFinishFenceAPPLE(fence); } static GLboolean APIENTRY InitTestObjectAPPLE (GLenum object, GLuint name) { void *extproc; extproc = (void *) wglGetProcAddress("glTestObjectAPPLE"); if (extproc == NULL) { _ASSERT(0); return 0; } glTestObjectAPPLE = extproc; return glTestObjectAPPLE(object, name); } static void APIENTRY InitFinishObjectAPPLE (GLenum object, GLint name) { void *extproc; extproc = (void *) wglGetProcAddress("glFinishObjectAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glFinishObjectAPPLE = extproc; glFinishObjectAPPLE(object, name); } static void APIENTRY InitBindVertexArrayAPPLE (GLuint array) { void *extproc; extproc = (void *) wglGetProcAddress("glBindVertexArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glBindVertexArrayAPPLE = extproc; glBindVertexArrayAPPLE(array); } static void APIENTRY InitDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays) { void *extproc; extproc = (void *) wglGetProcAddress("glDeleteVertexArraysAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glDeleteVertexArraysAPPLE = extproc; glDeleteVertexArraysAPPLE(n, arrays); } static void APIENTRY InitGenVertexArraysAPPLE (GLsizei n, const GLuint *arrays) { void *extproc; extproc = (void *) wglGetProcAddress("glGenVertexArraysAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glGenVertexArraysAPPLE = extproc; glGenVertexArraysAPPLE(n, arrays); } static GLboolean APIENTRY InitIsVertexArrayAPPLE (GLuint array) { void *extproc; extproc = (void *) wglGetProcAddress("glIsVertexArrayAPPLE"); if (extproc == NULL) { _ASSERT(0); return 0; } glIsVertexArrayAPPLE = extproc; return glIsVertexArrayAPPLE(array); } static void APIENTRY InitVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexArrayRangeAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glVertexArrayRangeAPPLE = extproc; glVertexArrayRangeAPPLE(length, pointer); } static void APIENTRY InitFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glFlushVertexArrayRangeAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glFlushVertexArrayRangeAPPLE = extproc; glFlushVertexArrayRangeAPPLE(length, pointer); } static void APIENTRY InitVertexArrayParameteriAPPLE (GLenum pname, GLint param) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexArrayParameteriAPPLE"); if (extproc == NULL) { _ASSERT(0); return; } glVertexArrayParameteriAPPLE = extproc; glVertexArrayParameteriAPPLE(pname, param); } static void APIENTRY InitDrawBuffersATI (GLsizei n, const GLenum *bufs) { void *extproc; extproc = (void *) wglGetProcAddress("glDrawBuffersATI"); if (extproc == NULL) { _ASSERT(0); return; } glDrawBuffersATI = extproc; glDrawBuffersATI(n, bufs); } static void APIENTRY InitProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramNamedParameter4fNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramNamedParameter4fNV = extproc; glProgramNamedParameter4fNV(id, len, name, x, y, z, w); } static void APIENTRY InitProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramNamedParameter4dNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramNamedParameter4dNV = extproc; glProgramNamedParameter4dNV(id, len, name, x, y, z, w); } static void APIENTRY InitProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramNamedParameter4fvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramNamedParameter4fvNV = extproc; glProgramNamedParameter4fvNV(id, len, name, v); } static void APIENTRY InitProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v) { void *extproc; extproc = (void *) wglGetProcAddress("glProgramNamedParameter4dvNV"); if (extproc == NULL) { _ASSERT(0); return; } glProgramNamedParameter4dvNV = extproc; glProgramNamedParameter4dvNV(id, len, name, v); } static void APIENTRY InitGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramNamedParameterfvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramNamedParameterfvNV = extproc; glGetProgramNamedParameterfvNV(id, len, name, params); } static void APIENTRY InitGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetProgramNamedParameterdvNV"); if (extproc == NULL) { _ASSERT(0); return; } glGetProgramNamedParameterdvNV = extproc; glGetProgramNamedParameterdvNV(id, len, name, params); } static void APIENTRY InitVertex2hNV (GLhalfNV x, GLhalfNV y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex2hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex2hNV = extproc; glVertex2hNV(x, y); } static void APIENTRY InitVertex2hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex2hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex2hvNV = extproc; glVertex2hvNV(v); } static void APIENTRY InitVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex3hNV = extproc; glVertex3hNV(x, y, z); } static void APIENTRY InitVertex3hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex3hvNV = extproc; glVertex3hvNV(v); } static void APIENTRY InitVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex4hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex4hNV = extproc; glVertex4hNV(x, y, z, w); } static void APIENTRY InitVertex4hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertex4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertex4hvNV = extproc; glVertex4hvNV(v); } static void APIENTRY InitNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) { void *extproc; extproc = (void *) wglGetProcAddress("glNormal3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glNormal3hNV = extproc; glNormal3hNV(nx, ny, nz); } static void APIENTRY InitNormal3hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glNormal3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glNormal3hvNV = extproc; glNormal3hvNV(v); } static void APIENTRY InitColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue) { void *extproc; extproc = (void *) wglGetProcAddress("glColor3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glColor3hNV = extproc; glColor3hNV(red, green, blue); } static void APIENTRY InitColor3hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glColor3hvNV = extproc; glColor3hvNV(v); } static void APIENTRY InitColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4hNV"); if (extproc == NULL) { _ASSERT(0); return; } glColor4hNV = extproc; glColor4hNV(red, green, blue, alpha); } static void APIENTRY InitColor4hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glColor4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glColor4hvNV = extproc; glColor4hvNV(v); } static void APIENTRY InitTexCoord1hNV (GLhalfNV s) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord1hNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord1hNV = extproc; glTexCoord1hNV(s); } static void APIENTRY InitTexCoord1hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord1hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord1hvNV = extproc; glTexCoord1hvNV(v); } static void APIENTRY InitTexCoord2hNV (GLhalfNV s, GLhalfNV t) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2hNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2hNV = extproc; glTexCoord2hNV(s, t); } static void APIENTRY InitTexCoord2hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord2hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord2hvNV = extproc; glTexCoord2hvNV(v); } static void APIENTRY InitTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord3hNV = extproc; glTexCoord3hNV(s, t, r); } static void APIENTRY InitTexCoord3hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord3hvNV = extproc; glTexCoord3hvNV(v); } static void APIENTRY InitTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4hNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4hNV = extproc; glTexCoord4hNV(s, t, r, q); } static void APIENTRY InitTexCoord4hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glTexCoord4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glTexCoord4hvNV = extproc; glTexCoord4hvNV(v); } static void APIENTRY InitMultiTexCoord1hNV (GLenum target, GLhalfNV s) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1hNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1hNV = extproc; glMultiTexCoord1hNV(target, s); } static void APIENTRY InitMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord1hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord1hvNV = extproc; glMultiTexCoord1hvNV(target, v); } static void APIENTRY InitMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2hNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2hNV = extproc; glMultiTexCoord2hNV(target, s, t); } static void APIENTRY InitMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord2hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord2hvNV = extproc; glMultiTexCoord2hvNV(target, v); } static void APIENTRY InitMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3hNV = extproc; glMultiTexCoord3hNV(target, s, t, r); } static void APIENTRY InitMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord3hvNV = extproc; glMultiTexCoord3hvNV(target, v); } static void APIENTRY InitMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4hNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4hNV = extproc; glMultiTexCoord4hNV(target, s, t, r, q); } static void APIENTRY InitMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glMultiTexCoord4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glMultiTexCoord4hvNV = extproc; glMultiTexCoord4hvNV(target, v); } static void APIENTRY InitFogCoordhNV (GLhalfNV fog) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordhNV"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordhNV = extproc; glFogCoordhNV(fog); } static void APIENTRY InitFogCoordhvNV (const GLhalfNV *fog) { void *extproc; extproc = (void *) wglGetProcAddress("glFogCoordhvNV"); if (extproc == NULL) { _ASSERT(0); return; } glFogCoordhvNV = extproc; glFogCoordhvNV(fog); } static void APIENTRY InitSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3hNV = extproc; glSecondaryColor3hNV(red, green, blue); } static void APIENTRY InitSecondaryColor3hvNV (const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glSecondaryColor3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glSecondaryColor3hvNV = extproc; glSecondaryColor3hvNV(v); } static void APIENTRY InitVertexWeighthNV (GLhalfNV weight) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexWeighthNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexWeighthNV = extproc; glVertexWeighthNV(weight); } static void APIENTRY InitVertexWeighthvNV (const GLhalfNV *weight) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexWeighthvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexWeighthvNV = extproc; glVertexWeighthvNV(weight); } static void APIENTRY InitVertexAttrib1hNV (GLuint index, GLhalfNV x) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1hNV = extproc; glVertexAttrib1hNV(index, x); } static void APIENTRY InitVertexAttrib1hvNV (GLuint index, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib1hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib1hvNV = extproc; glVertexAttrib1hvNV(index, v); } static void APIENTRY InitVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2hNV = extproc; glVertexAttrib2hNV(index, x, y); } static void APIENTRY InitVertexAttrib2hvNV (GLuint index, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib2hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib2hvNV = extproc; glVertexAttrib2hvNV(index, v); } static void APIENTRY InitVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3hNV = extproc; glVertexAttrib3hNV(index, x, y, z); } static void APIENTRY InitVertexAttrib3hvNV (GLuint index, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib3hvNV = extproc; glVertexAttrib3hvNV(index, v); } static void APIENTRY InitVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4hNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4hNV = extproc; glVertexAttrib4hNV(index, x, y, z, w); } static void APIENTRY InitVertexAttrib4hvNV (GLuint index, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttrib4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttrib4hvNV = extproc; glVertexAttrib4hvNV(index, v); } static void APIENTRY InitVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs1hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs1hvNV = extproc; glVertexAttribs1hvNV(index, n, v); } static void APIENTRY InitVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs2hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs2hvNV = extproc; glVertexAttribs2hvNV(index, n, v); } static void APIENTRY InitVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs3hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs3hvNV = extproc; glVertexAttribs3hvNV(index, n, v); } static void APIENTRY InitVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribs4hvNV"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribs4hvNV = extproc; glVertexAttribs4hvNV(index, n, v); } static void APIENTRY InitPixelDataRangeNV (GLenum target, GLsizei length, GLvoid *pointer) { void *extproc; extproc = (void *) wglGetProcAddress("glPixelDataRangeNV"); if (extproc == NULL) { _ASSERT(0); return; } glPixelDataRangeNV = extproc; glPixelDataRangeNV(target, length, pointer); } static void APIENTRY InitFlushPixelDataRangeNV (GLenum target) { void *extproc; extproc = (void *) wglGetProcAddress("glFlushPixelDataRangeNV"); if (extproc == NULL) { _ASSERT(0); return; } glFlushPixelDataRangeNV = extproc; glFlushPixelDataRangeNV(target); } static void APIENTRY InitPrimitiveRestartNV (void) { void *extproc; extproc = (void *) wglGetProcAddress("glPrimitiveRestartNV"); if (extproc == NULL) { _ASSERT(0); return; } glPrimitiveRestartNV = extproc; glPrimitiveRestartNV(); } static void APIENTRY InitPrimitiveRestartIndexNV (GLuint index) { void *extproc; extproc = (void *) wglGetProcAddress("glPrimitiveRestartIndexNV"); if (extproc == NULL) { _ASSERT(0); return; } glPrimitiveRestartIndexNV = extproc; glPrimitiveRestartIndexNV(index); } static GLvoid* APIENTRY InitMapObjectBufferATI (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glMapObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return 0; } glMapObjectBufferATI = extproc; return glMapObjectBufferATI(buffer); } static void APIENTRY InitUnmapObjectBufferATI (GLuint buffer) { void *extproc; extproc = (void *) wglGetProcAddress("glUnmapObjectBufferATI"); if (extproc == NULL) { _ASSERT(0); return; } glUnmapObjectBufferATI = extproc; glUnmapObjectBufferATI(buffer); } static void APIENTRY InitStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { void *extproc; extproc = (void *) wglGetProcAddress("glStencilOpSeparateATI"); if (extproc == NULL) { _ASSERT(0); return; } glStencilOpSeparateATI = extproc; glStencilOpSeparateATI(face, sfail, dpfail, dppass); } static void APIENTRY InitStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) { void *extproc; extproc = (void *) wglGetProcAddress("glStencilFuncSeparateATI"); if (extproc == NULL) { _ASSERT(0); return; } glStencilFuncSeparateATI = extproc; glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask); } static void APIENTRY InitVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) { void *extproc; extproc = (void *) wglGetProcAddress("glVertexAttribArrayObjectATI"); if (extproc == NULL) { _ASSERT(0); return; } glVertexAttribArrayObjectATI = extproc; glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset); } static void APIENTRY InitGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribArrayObjectfvATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribArrayObjectfvATI = extproc; glGetVertexAttribArrayObjectfvATI(index, pname, params); } static void APIENTRY InitGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params) { void *extproc; extproc = (void *) wglGetProcAddress("glGetVertexAttribArrayObjectivATI"); if (extproc == NULL) { _ASSERT(0); return; } glGetVertexAttribArrayObjectivATI = extproc; glGetVertexAttribArrayObjectivATI(index, pname, params); } static void APIENTRY InitDepthBoundsEXT (GLclampd zmin, GLclampd zmax) { void *extproc; extproc = (void *) wglGetProcAddress("glDepthBoundsEXT"); if (extproc == NULL) { _ASSERT(0); return; } glDepthBoundsEXT = extproc; glDepthBoundsEXT(zmin, zmax); } static void APIENTRY InitBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha) { void *extproc; extproc = (void *) wglGetProcAddress("glBlendEquationSeparateEXT"); if (extproc == NULL) { _ASSERT(0); return; } glBlendEquationSeparateEXT = extproc; glBlendEquationSeparateEXT(modeRGB, modeAlpha); } static void APIENTRY InitAddSwapHintRectWIN (GLint x, GLint y, GLsizei width, GLsizei height) { void *extproc; extproc = (void *) wglGetProcAddress("glAddSwapHintRectWIN"); if (extproc == NULL) { _ASSERT(0); return; } glAddSwapHintRectWIN = extproc; glAddSwapHintRectWIN(x, y, width, height); } #ifdef _WIN32 static HANDLE WINAPI InitCreateBufferRegionARB (HDC hDC, int iLayerPlane, UINT uType) { void *extproc; extproc = (void *) wglGetProcAddress("wglCreateBufferRegionARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglCreateBufferRegionARB = extproc; return wglCreateBufferRegionARB(hDC, iLayerPlane, uType); } static VOID WINAPI InitDeleteBufferRegionARB (HANDLE hRegion) { void *extproc; extproc = (void *) wglGetProcAddress("wglDeleteBufferRegionARB"); if (extproc == NULL) { _ASSERT(0); return; } wglDeleteBufferRegionARB = extproc; wglDeleteBufferRegionARB(hRegion); } static BOOL WINAPI InitSaveBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height) { void *extproc; extproc = (void *) wglGetProcAddress("wglSaveBufferRegionARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSaveBufferRegionARB = extproc; return wglSaveBufferRegionARB(hRegion, x, y, width, height); } static BOOL WINAPI InitRestoreBufferRegionARB (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc) { void *extproc; extproc = (void *) wglGetProcAddress("wglRestoreBufferRegionARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglRestoreBufferRegionARB = extproc; return wglRestoreBufferRegionARB(hRegion, x, y, width, height, xSrc, ySrc); } static const WINAPI InitGetExtensionsStringARB (HDC hdc) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetExtensionsStringARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetExtensionsStringARB = extproc; return wglGetExtensionsStringARB(hdc); } static BOOL WINAPI InitGetPixelFormatAttribivARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPixelFormatAttribivARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPixelFormatAttribivARB = extproc; return wglGetPixelFormatAttribivARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); } static BOOL WINAPI InitGetPixelFormatAttribfvARB (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPixelFormatAttribfvARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPixelFormatAttribfvARB = extproc; return wglGetPixelFormatAttribfvARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); } static BOOL WINAPI InitChoosePixelFormatARB (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats) { void *extproc; extproc = (void *) wglGetProcAddress("wglChoosePixelFormatARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglChoosePixelFormatARB = extproc; return wglChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); } static BOOL WINAPI InitMakeContextCurrentARB (HDC hDrawDC, HDC hReadDC, HGLRC hglrc) { void *extproc; extproc = (void *) wglGetProcAddress("wglMakeContextCurrentARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglMakeContextCurrentARB = extproc; return wglMakeContextCurrentARB(hDrawDC, hReadDC, hglrc); } static HDC WINAPI InitGetCurrentReadDCARB (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetCurrentReadDCARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetCurrentReadDCARB = extproc; return wglGetCurrentReadDCARB(); } static HPBUFFERARB WINAPI InitCreatePbufferARB (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList) { void *extproc; extproc = (void *) wglGetProcAddress("wglCreatePbufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglCreatePbufferARB = extproc; return wglCreatePbufferARB(hDC, iPixelFormat, iWidth, iHeight, piAttribList); } static HDC WINAPI InitGetPbufferDCARB (HPBUFFERARB hPbuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPbufferDCARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPbufferDCARB = extproc; return wglGetPbufferDCARB(hPbuffer); } static int WINAPI InitReleasePbufferDCARB (HPBUFFERARB hPbuffer, HDC hDC) { void *extproc; extproc = (void *) wglGetProcAddress("wglReleasePbufferDCARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglReleasePbufferDCARB = extproc; return wglReleasePbufferDCARB(hPbuffer, hDC); } static BOOL WINAPI InitDestroyPbufferARB (HPBUFFERARB hPbuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglDestroyPbufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglDestroyPbufferARB = extproc; return wglDestroyPbufferARB(hPbuffer); } static BOOL WINAPI InitQueryPbufferARB (HPBUFFERARB hPbuffer, int iAttribute, int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglQueryPbufferARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglQueryPbufferARB = extproc; return wglQueryPbufferARB(hPbuffer, iAttribute, piValue); } static BOOL WINAPI InitBindTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglBindTexImageARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglBindTexImageARB = extproc; return wglBindTexImageARB(hPbuffer, iBuffer); } static BOOL WINAPI InitReleaseTexImageARB (HPBUFFERARB hPbuffer, int iBuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglReleaseTexImageARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglReleaseTexImageARB = extproc; return wglReleaseTexImageARB(hPbuffer, iBuffer); } static BOOL WINAPI InitSetPbufferAttribARB (HPBUFFERARB hPbuffer, const int *piAttribList) { void *extproc; extproc = (void *) wglGetProcAddress("wglSetPbufferAttribARB"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSetPbufferAttribARB = extproc; return wglSetPbufferAttribARB(hPbuffer, piAttribList); } static GLboolean WINAPI InitCreateDisplayColorTableEXT (GLushort id) { void *extproc; extproc = (void *) wglGetProcAddress("wglCreateDisplayColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglCreateDisplayColorTableEXT = extproc; return wglCreateDisplayColorTableEXT(id); } static GLboolean WINAPI InitLoadDisplayColorTableEXT (const GLushort *table, GLuint length) { void *extproc; extproc = (void *) wglGetProcAddress("wglLoadDisplayColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglLoadDisplayColorTableEXT = extproc; return wglLoadDisplayColorTableEXT(table, length); } static GLboolean WINAPI InitBindDisplayColorTableEXT (GLushort id) { void *extproc; extproc = (void *) wglGetProcAddress("wglBindDisplayColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglBindDisplayColorTableEXT = extproc; return wglBindDisplayColorTableEXT(id); } static VOID WINAPI InitDestroyDisplayColorTableEXT (GLushort id) { void *extproc; extproc = (void *) wglGetProcAddress("wglDestroyDisplayColorTableEXT"); if (extproc == NULL) { _ASSERT(0); return; } wglDestroyDisplayColorTableEXT = extproc; wglDestroyDisplayColorTableEXT(id); } static const WINAPI InitGetExtensionsStringEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetExtensionsStringEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetExtensionsStringEXT = extproc; return wglGetExtensionsStringEXT(); } static BOOL WINAPI InitMakeContextCurrentEXT (HDC hDrawDC, HDC hReadDC, HGLRC hglrc) { void *extproc; extproc = (void *) wglGetProcAddress("wglMakeContextCurrentEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglMakeContextCurrentEXT = extproc; return wglMakeContextCurrentEXT(hDrawDC, hReadDC, hglrc); } static HDC WINAPI InitGetCurrentReadDCEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetCurrentReadDCEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetCurrentReadDCEXT = extproc; return wglGetCurrentReadDCEXT(); } static HPBUFFEREXT WINAPI InitCreatePbufferEXT (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList) { void *extproc; extproc = (void *) wglGetProcAddress("wglCreatePbufferEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglCreatePbufferEXT = extproc; return wglCreatePbufferEXT(hDC, iPixelFormat, iWidth, iHeight, piAttribList); } static HDC WINAPI InitGetPbufferDCEXT (HPBUFFEREXT hPbuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPbufferDCEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPbufferDCEXT = extproc; return wglGetPbufferDCEXT(hPbuffer); } static int WINAPI InitReleasePbufferDCEXT (HPBUFFEREXT hPbuffer, HDC hDC) { void *extproc; extproc = (void *) wglGetProcAddress("wglReleasePbufferDCEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglReleasePbufferDCEXT = extproc; return wglReleasePbufferDCEXT(hPbuffer, hDC); } static BOOL WINAPI InitDestroyPbufferEXT (HPBUFFEREXT hPbuffer) { void *extproc; extproc = (void *) wglGetProcAddress("wglDestroyPbufferEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglDestroyPbufferEXT = extproc; return wglDestroyPbufferEXT(hPbuffer); } static BOOL WINAPI InitQueryPbufferEXT (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglQueryPbufferEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglQueryPbufferEXT = extproc; return wglQueryPbufferEXT(hPbuffer, iAttribute, piValue); } static BOOL WINAPI InitGetPixelFormatAttribivEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPixelFormatAttribivEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPixelFormatAttribivEXT = extproc; return wglGetPixelFormatAttribivEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); } static BOOL WINAPI InitGetPixelFormatAttribfvEXT (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetPixelFormatAttribfvEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetPixelFormatAttribfvEXT = extproc; return wglGetPixelFormatAttribfvEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); } static BOOL WINAPI InitChoosePixelFormatEXT (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats) { void *extproc; extproc = (void *) wglGetProcAddress("wglChoosePixelFormatEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglChoosePixelFormatEXT = extproc; return wglChoosePixelFormatEXT(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); } static BOOL WINAPI InitSwapIntervalEXT (int interval) { void *extproc; extproc = (void *) wglGetProcAddress("wglSwapIntervalEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSwapIntervalEXT = extproc; return wglSwapIntervalEXT(interval); } static int WINAPI InitGetSwapIntervalEXT (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetSwapIntervalEXT"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetSwapIntervalEXT = extproc; return wglGetSwapIntervalEXT(); } static void* WINAPI InitAllocateMemoryNV (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority) { void *extproc; extproc = (void *) wglGetProcAddress("wglAllocateMemoryNV"); if (extproc == NULL) { _ASSERT(0); return 0; } wglAllocateMemoryNV = extproc; return wglAllocateMemoryNV(size, readfreq, writefreq, priority); } static void WINAPI InitFreeMemoryNV (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglFreeMemoryNV"); if (extproc == NULL) { _ASSERT(0); return; } wglFreeMemoryNV = extproc; wglFreeMemoryNV(); } static BOOL WINAPI InitGetSyncValuesOML (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetSyncValuesOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetSyncValuesOML = extproc; return wglGetSyncValuesOML(hdc, ust, msc, sbc); } static BOOL WINAPI InitGetMscRateOML (HDC hdc, INT32 *numerator, INT32 *denominator) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetMscRateOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetMscRateOML = extproc; return wglGetMscRateOML(hdc, numerator, denominator); } static INT64 WINAPI InitSwapBuffersMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder) { void *extproc; extproc = (void *) wglGetProcAddress("wglSwapBuffersMscOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSwapBuffersMscOML = extproc; return wglSwapBuffersMscOML(hdc, target_msc, divisor, remainder); } static INT64 WINAPI InitSwapLayerBuffersMscOML (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder) { void *extproc; extproc = (void *) wglGetProcAddress("wglSwapLayerBuffersMscOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSwapLayerBuffersMscOML = extproc; return wglSwapLayerBuffersMscOML(hdc, fuPlanes, target_msc, divisor, remainder); } static BOOL WINAPI InitWaitForMscOML (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc) { void *extproc; extproc = (void *) wglGetProcAddress("wglWaitForMscOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglWaitForMscOML = extproc; return wglWaitForMscOML(hdc, target_msc, divisor, remainder, ust, msc, sbc); } static BOOL WINAPI InitWaitForSbcOML (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc) { void *extproc; extproc = (void *) wglGetProcAddress("wglWaitForSbcOML"); if (extproc == NULL) { _ASSERT(0); return 0; } wglWaitForSbcOML = extproc; return wglWaitForSbcOML(hdc, target_sbc, ust, msc, sbc); } static BOOL WINAPI InitGetDigitalVideoParametersI3D (HDC hDC, int iAttribute, int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetDigitalVideoParametersI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetDigitalVideoParametersI3D = extproc; return wglGetDigitalVideoParametersI3D(hDC, iAttribute, piValue); } static BOOL WINAPI InitSetDigitalVideoParametersI3D (HDC hDC, int iAttribute, const int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglSetDigitalVideoParametersI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSetDigitalVideoParametersI3D = extproc; return wglSetDigitalVideoParametersI3D(hDC, iAttribute, piValue); } static BOOL WINAPI InitGetGammaTableParametersI3D (HDC hDC, int iAttribute, int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGammaTableParametersI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGammaTableParametersI3D = extproc; return wglGetGammaTableParametersI3D(hDC, iAttribute, piValue); } static BOOL WINAPI InitSetGammaTableParametersI3D (HDC hDC, int iAttribute, const int *piValue) { void *extproc; extproc = (void *) wglGetProcAddress("wglSetGammaTableParametersI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSetGammaTableParametersI3D = extproc; return wglSetGammaTableParametersI3D(hDC, iAttribute, piValue); } static BOOL WINAPI InitGetGammaTableI3D (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGammaTableI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGammaTableI3D = extproc; return wglGetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); } static BOOL WINAPI InitSetGammaTableI3D (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue) { void *extproc; extproc = (void *) wglGetProcAddress("wglSetGammaTableI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglSetGammaTableI3D = extproc; return wglSetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); } static BOOL WINAPI InitEnableGenlockI3D (HDC hDC) { void *extproc; extproc = (void *) wglGetProcAddress("wglEnableGenlockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglEnableGenlockI3D = extproc; return wglEnableGenlockI3D(hDC); } static BOOL WINAPI InitDisableGenlockI3D (HDC hDC) { void *extproc; extproc = (void *) wglGetProcAddress("wglDisableGenlockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglDisableGenlockI3D = extproc; return wglDisableGenlockI3D(hDC); } static BOOL WINAPI InitIsEnabledGenlockI3D (HDC hDC, BOOL *pFlag) { void *extproc; extproc = (void *) wglGetProcAddress("wglIsEnabledGenlockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglIsEnabledGenlockI3D = extproc; return wglIsEnabledGenlockI3D(hDC, pFlag); } static BOOL WINAPI InitGenlockSourceI3D (HDC hDC, UINT uSource) { void *extproc; extproc = (void *) wglGetProcAddress("wglGenlockSourceI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGenlockSourceI3D = extproc; return wglGenlockSourceI3D(hDC, uSource); } static BOOL WINAPI InitGetGenlockSourceI3D (HDC hDC, UINT *uSource) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGenlockSourceI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGenlockSourceI3D = extproc; return wglGetGenlockSourceI3D(hDC, uSource); } static BOOL WINAPI InitGenlockSourceEdgeI3D (HDC hDC, UINT uEdge) { void *extproc; extproc = (void *) wglGetProcAddress("wglGenlockSourceEdgeI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGenlockSourceEdgeI3D = extproc; return wglGenlockSourceEdgeI3D(hDC, uEdge); } static BOOL WINAPI InitGetGenlockSourceEdgeI3D (HDC hDC, UINT *uEdge) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGenlockSourceEdgeI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGenlockSourceEdgeI3D = extproc; return wglGetGenlockSourceEdgeI3D(hDC, uEdge); } static BOOL WINAPI InitGenlockSampleRateI3D (HDC hDC, UINT uRate) { void *extproc; extproc = (void *) wglGetProcAddress("wglGenlockSampleRateI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGenlockSampleRateI3D = extproc; return wglGenlockSampleRateI3D(hDC, uRate); } static BOOL WINAPI InitGetGenlockSampleRateI3D (HDC hDC, UINT *uRate) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGenlockSampleRateI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGenlockSampleRateI3D = extproc; return wglGetGenlockSampleRateI3D(hDC, uRate); } static BOOL WINAPI InitGenlockSourceDelayI3D (HDC hDC, UINT uDelay) { void *extproc; extproc = (void *) wglGetProcAddress("wglGenlockSourceDelayI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGenlockSourceDelayI3D = extproc; return wglGenlockSourceDelayI3D(hDC, uDelay); } static BOOL WINAPI InitGetGenlockSourceDelayI3D (HDC hDC, UINT *uDelay) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetGenlockSourceDelayI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetGenlockSourceDelayI3D = extproc; return wglGetGenlockSourceDelayI3D(hDC, uDelay); } static BOOL WINAPI InitQueryGenlockMaxSourceDelayI3D (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay) { void *extproc; extproc = (void *) wglGetProcAddress("wglQueryGenlockMaxSourceDelayI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglQueryGenlockMaxSourceDelayI3D = extproc; return wglQueryGenlockMaxSourceDelayI3D(hDC, uMaxLineDelay, uMaxPixelDelay); } static LPVOID WINAPI InitCreateImageBufferI3D (HDC hDC, DWORD dwSize, UINT uFlags) { void *extproc; extproc = (void *) wglGetProcAddress("wglCreateImageBufferI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglCreateImageBufferI3D = extproc; return wglCreateImageBufferI3D(hDC, dwSize, uFlags); } static BOOL WINAPI InitDestroyImageBufferI3D (HDC hDC, LPVOID pAddress) { void *extproc; extproc = (void *) wglGetProcAddress("wglDestroyImageBufferI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglDestroyImageBufferI3D = extproc; return wglDestroyImageBufferI3D(hDC, pAddress); } static BOOL WINAPI InitAssociateImageBufferEventsI3D (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count) { void *extproc; extproc = (void *) wglGetProcAddress("wglAssociateImageBufferEventsI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglAssociateImageBufferEventsI3D = extproc; return wglAssociateImageBufferEventsI3D(hDC, pEvent, pAddress, pSize, count); } static BOOL WINAPI InitReleaseImageBufferEventsI3D (HDC hDC, const LPVOID *pAddress, UINT count) { void *extproc; extproc = (void *) wglGetProcAddress("wglReleaseImageBufferEventsI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglReleaseImageBufferEventsI3D = extproc; return wglReleaseImageBufferEventsI3D(hDC, pAddress, count); } static BOOL WINAPI InitEnableFrameLockI3D (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglEnableFrameLockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglEnableFrameLockI3D = extproc; return wglEnableFrameLockI3D(); } static BOOL WINAPI InitDisableFrameLockI3D (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglDisableFrameLockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglDisableFrameLockI3D = extproc; return wglDisableFrameLockI3D(); } static BOOL WINAPI InitIsEnabledFrameLockI3D (BOOL *pFlag) { void *extproc; extproc = (void *) wglGetProcAddress("wglIsEnabledFrameLockI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglIsEnabledFrameLockI3D = extproc; return wglIsEnabledFrameLockI3D(pFlag); } static BOOL WINAPI InitQueryFrameLockMasterI3D (BOOL *pFlag) { void *extproc; extproc = (void *) wglGetProcAddress("wglQueryFrameLockMasterI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglQueryFrameLockMasterI3D = extproc; return wglQueryFrameLockMasterI3D(pFlag); } static BOOL WINAPI InitGetFrameUsageI3D (float *pUsage) { void *extproc; extproc = (void *) wglGetProcAddress("wglGetFrameUsageI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglGetFrameUsageI3D = extproc; return wglGetFrameUsageI3D(pUsage); } static BOOL WINAPI InitBeginFrameTrackingI3D (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglBeginFrameTrackingI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglBeginFrameTrackingI3D = extproc; return wglBeginFrameTrackingI3D(); } static BOOL WINAPI InitEndFrameTrackingI3D (void) { void *extproc; extproc = (void *) wglGetProcAddress("wglEndFrameTrackingI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglEndFrameTrackingI3D = extproc; return wglEndFrameTrackingI3D(); } static BOOL WINAPI InitQueryFrameTrackingI3D (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage) { void *extproc; extproc = (void *) wglGetProcAddress("wglQueryFrameTrackingI3D"); if (extproc == NULL) { _ASSERT(0); return 0; } wglQueryFrameTrackingI3D = extproc; return wglQueryFrameTrackingI3D(pFrameCount, pMissedFrames, pLastMissedUsage); } #endif /* _WIN32 */ _GLextensionProcs _extensionProcs = { InitBlendColor, InitBlendEquation, InitDrawRangeElements, InitColorTable, InitColorTableParameterfv, InitColorTableParameteriv, InitCopyColorTable, InitGetColorTable, InitGetColorTableParameterfv, InitGetColorTableParameteriv, InitColorSubTable, InitCopyColorSubTable, InitConvolutionFilter1D, InitConvolutionFilter2D, InitConvolutionParameterf, InitConvolutionParameterfv, InitConvolutionParameteri, InitConvolutionParameteriv, InitCopyConvolutionFilter1D, InitCopyConvolutionFilter2D, InitGetConvolutionFilter, InitGetConvolutionParameterfv, InitGetConvolutionParameteriv, InitGetSeparableFilter, InitSeparableFilter2D, InitGetHistogram, InitGetHistogramParameterfv, InitGetHistogramParameteriv, InitGetMinmax, InitGetMinmaxParameterfv, InitGetMinmaxParameteriv, InitHistogram, InitMinmax, InitResetHistogram, InitResetMinmax, InitTexImage3D, InitTexSubImage3D, InitCopyTexSubImage3D, InitActiveTexture, InitClientActiveTexture, InitMultiTexCoord1d, InitMultiTexCoord1dv, InitMultiTexCoord1f, InitMultiTexCoord1fv, InitMultiTexCoord1i, InitMultiTexCoord1iv, InitMultiTexCoord1s, InitMultiTexCoord1sv, InitMultiTexCoord2d, InitMultiTexCoord2dv, InitMultiTexCoord2f, InitMultiTexCoord2fv, InitMultiTexCoord2i, InitMultiTexCoord2iv, InitMultiTexCoord2s, InitMultiTexCoord2sv, InitMultiTexCoord3d, InitMultiTexCoord3dv, InitMultiTexCoord3f, InitMultiTexCoord3fv, InitMultiTexCoord3i, InitMultiTexCoord3iv, InitMultiTexCoord3s, InitMultiTexCoord3sv, InitMultiTexCoord4d, InitMultiTexCoord4dv, InitMultiTexCoord4f, InitMultiTexCoord4fv, InitMultiTexCoord4i, InitMultiTexCoord4iv, InitMultiTexCoord4s, InitMultiTexCoord4sv, InitLoadTransposeMatrixf, InitLoadTransposeMatrixd, InitMultTransposeMatrixf, InitMultTransposeMatrixd, InitSampleCoverage, InitCompressedTexImage3D, InitCompressedTexImage2D, InitCompressedTexImage1D, InitCompressedTexSubImage3D, InitCompressedTexSubImage2D, InitCompressedTexSubImage1D, InitGetCompressedTexImage, InitBlendFuncSeparate, InitFogCoordf, InitFogCoordfv, InitFogCoordd, InitFogCoorddv, InitFogCoordPointer, InitMultiDrawArrays, InitMultiDrawElements, InitPointParameterf, InitPointParameterfv, InitPointParameteri, InitPointParameteriv, InitSecondaryColor3b, InitSecondaryColor3bv, InitSecondaryColor3d, InitSecondaryColor3dv, InitSecondaryColor3f, InitSecondaryColor3fv, InitSecondaryColor3i, InitSecondaryColor3iv, InitSecondaryColor3s, InitSecondaryColor3sv, InitSecondaryColor3ub, InitSecondaryColor3ubv, InitSecondaryColor3ui, InitSecondaryColor3uiv, InitSecondaryColor3us, InitSecondaryColor3usv, InitSecondaryColorPointer, InitWindowPos2d, InitWindowPos2dv, InitWindowPos2f, InitWindowPos2fv, InitWindowPos2i, InitWindowPos2iv, InitWindowPos2s, InitWindowPos2sv, InitWindowPos3d, InitWindowPos3dv, InitWindowPos3f, InitWindowPos3fv, InitWindowPos3i, InitWindowPos3iv, InitWindowPos3s, InitWindowPos3sv, InitGenQueries, InitDeleteQueries, InitIsQuery, InitBeginQuery, InitEndQuery, InitGetQueryiv, InitGetQueryObjectiv, InitGetQueryObjectuiv, InitBindBuffer, InitDeleteBuffers, InitGenBuffers, InitIsBuffer, InitBufferData, InitBufferSubData, InitGetBufferSubData, InitMapBuffer, InitUnmapBuffer, InitGetBufferParameteriv, InitGetBufferPointerv, InitActiveTextureARB, InitClientActiveTextureARB, InitMultiTexCoord1dARB, InitMultiTexCoord1dvARB, InitMultiTexCoord1fARB, InitMultiTexCoord1fvARB, InitMultiTexCoord1iARB, InitMultiTexCoord1ivARB, InitMultiTexCoord1sARB, InitMultiTexCoord1svARB, InitMultiTexCoord2dARB, InitMultiTexCoord2dvARB, InitMultiTexCoord2fARB, InitMultiTexCoord2fvARB, InitMultiTexCoord2iARB, InitMultiTexCoord2ivARB, InitMultiTexCoord2sARB, InitMultiTexCoord2svARB, InitMultiTexCoord3dARB, InitMultiTexCoord3dvARB, InitMultiTexCoord3fARB, InitMultiTexCoord3fvARB, InitMultiTexCoord3iARB, InitMultiTexCoord3ivARB, InitMultiTexCoord3sARB, InitMultiTexCoord3svARB, InitMultiTexCoord4dARB, InitMultiTexCoord4dvARB, InitMultiTexCoord4fARB, InitMultiTexCoord4fvARB, InitMultiTexCoord4iARB, InitMultiTexCoord4ivARB, InitMultiTexCoord4sARB, InitMultiTexCoord4svARB, InitLoadTransposeMatrixfARB, InitLoadTransposeMatrixdARB, InitMultTransposeMatrixfARB, InitMultTransposeMatrixdARB, InitSampleCoverageARB, InitCompressedTexImage3DARB, InitCompressedTexImage2DARB, InitCompressedTexImage1DARB, InitCompressedTexSubImage3DARB, InitCompressedTexSubImage2DARB, InitCompressedTexSubImage1DARB, InitGetCompressedTexImageARB, InitPointParameterfARB, InitPointParameterfvARB, InitWeightbvARB, InitWeightsvARB, InitWeightivARB, InitWeightfvARB, InitWeightdvARB, InitWeightubvARB, InitWeightusvARB, InitWeightuivARB, InitWeightPointerARB, InitVertexBlendARB, InitCurrentPaletteMatrixARB, InitMatrixIndexubvARB, InitMatrixIndexusvARB, InitMatrixIndexuivARB, InitMatrixIndexPointerARB, InitWindowPos2dARB, InitWindowPos2dvARB, InitWindowPos2fARB, InitWindowPos2fvARB, InitWindowPos2iARB, InitWindowPos2ivARB, InitWindowPos2sARB, InitWindowPos2svARB, InitWindowPos3dARB, InitWindowPos3dvARB, InitWindowPos3fARB, InitWindowPos3fvARB, InitWindowPos3iARB, InitWindowPos3ivARB, InitWindowPos3sARB, InitWindowPos3svARB, InitVertexAttrib1dARB, InitVertexAttrib1dvARB, InitVertexAttrib1fARB, InitVertexAttrib1fvARB, InitVertexAttrib1sARB, InitVertexAttrib1svARB, InitVertexAttrib2dARB, InitVertexAttrib2dvARB, InitVertexAttrib2fARB, InitVertexAttrib2fvARB, InitVertexAttrib2sARB, InitVertexAttrib2svARB, InitVertexAttrib3dARB, InitVertexAttrib3dvARB, InitVertexAttrib3fARB, InitVertexAttrib3fvARB, InitVertexAttrib3sARB, InitVertexAttrib3svARB, InitVertexAttrib4NbvARB, InitVertexAttrib4NivARB, InitVertexAttrib4NsvARB, InitVertexAttrib4NubARB, InitVertexAttrib4NubvARB, InitVertexAttrib4NuivARB, InitVertexAttrib4NusvARB, InitVertexAttrib4bvARB, InitVertexAttrib4dARB, InitVertexAttrib4dvARB, InitVertexAttrib4fARB, InitVertexAttrib4fvARB, InitVertexAttrib4ivARB, InitVertexAttrib4sARB, InitVertexAttrib4svARB, InitVertexAttrib4ubvARB, InitVertexAttrib4uivARB, InitVertexAttrib4usvARB, InitVertexAttribPointerARB, InitEnableVertexAttribArrayARB, InitDisableVertexAttribArrayARB, InitProgramStringARB, InitBindProgramARB, InitDeleteProgramsARB, InitGenProgramsARB, InitProgramEnvParameter4dARB, InitProgramEnvParameter4dvARB, InitProgramEnvParameter4fARB, InitProgramEnvParameter4fvARB, InitProgramLocalParameter4dARB, InitProgramLocalParameter4dvARB, InitProgramLocalParameter4fARB, InitProgramLocalParameter4fvARB, InitGetProgramEnvParameterdvARB, InitGetProgramEnvParameterfvARB, InitGetProgramLocalParameterdvARB, InitGetProgramLocalParameterfvARB, InitGetProgramivARB, InitGetProgramStringARB, InitGetVertexAttribdvARB, InitGetVertexAttribfvARB, InitGetVertexAttribivARB, InitGetVertexAttribPointervARB, InitIsProgramARB, InitBindBufferARB, InitDeleteBuffersARB, InitGenBuffersARB, InitIsBufferARB, InitBufferDataARB, InitBufferSubDataARB, InitGetBufferSubDataARB, InitMapBufferARB, InitUnmapBufferARB, InitGetBufferParameterivARB, InitGetBufferPointervARB, InitGenQueriesARB, InitDeleteQueriesARB, InitIsQueryARB, InitBeginQueryARB, InitEndQueryARB, InitGetQueryivARB, InitGetQueryObjectivARB, InitGetQueryObjectuivARB, InitDeleteObjectARB, InitGetHandleARB, InitDetachObjectARB, InitCreateShaderObjectARB, InitShaderSourceARB, InitCompileShaderARB, InitCreateProgramObjectARB, InitAttachObjectARB, InitLinkProgramARB, InitUseProgramObjectARB, InitValidateProgramARB, InitUniform1fARB, InitUniform2fARB, InitUniform3fARB, InitUniform4fARB, InitUniform1iARB, InitUniform2iARB, InitUniform3iARB, InitUniform4iARB, InitUniform1fvARB, InitUniform2fvARB, InitUniform3fvARB, InitUniform4fvARB, InitUniform1ivARB, InitUniform2ivARB, InitUniform3ivARB, InitUniform4ivARB, InitUniformMatrix2fvARB, InitUniformMatrix3fvARB, InitUniformMatrix4fvARB, InitGetObjectParameterfvARB, InitGetObjectParameterivARB, InitGetInfoLogARB, InitGetAttachedObjectsARB, InitGetUniformLocationARB, InitGetActiveUniformARB, InitGetUniformfvARB, InitGetUniformivARB, InitGetShaderSourceARB, InitBindAttribLocationARB, InitGetActiveAttribARB, InitGetAttribLocationARB, InitBlendColorEXT, InitPolygonOffsetEXT, InitTexImage3DEXT, InitTexSubImage3DEXT, InitGetTexFilterFuncSGIS, InitTexFilterFuncSGIS, InitTexSubImage1DEXT, InitTexSubImage2DEXT, InitCopyTexImage1DEXT, InitCopyTexImage2DEXT, InitCopyTexSubImage1DEXT, InitCopyTexSubImage2DEXT, InitCopyTexSubImage3DEXT, InitGetHistogramEXT, InitGetHistogramParameterfvEXT, InitGetHistogramParameterivEXT, InitGetMinmaxEXT, InitGetMinmaxParameterfvEXT, InitGetMinmaxParameterivEXT, InitHistogramEXT, InitMinmaxEXT, InitResetHistogramEXT, InitResetMinmaxEXT, InitConvolutionFilter1DEXT, InitConvolutionFilter2DEXT, InitConvolutionParameterfEXT, InitConvolutionParameterfvEXT, InitConvolutionParameteriEXT, InitConvolutionParameterivEXT, InitCopyConvolutionFilter1DEXT, InitCopyConvolutionFilter2DEXT, InitGetConvolutionFilterEXT, InitGetConvolutionParameterfvEXT, InitGetConvolutionParameterivEXT, InitGetSeparableFilterEXT, InitSeparableFilter2DEXT, InitColorTableSGI, InitColorTableParameterfvSGI, InitColorTableParameterivSGI, InitCopyColorTableSGI, InitGetColorTableSGI, InitGetColorTableParameterfvSGI, InitGetColorTableParameterivSGI, InitPixelTexGenSGIX, InitPixelTexGenParameteriSGIS, InitPixelTexGenParameterivSGIS, InitPixelTexGenParameterfSGIS, InitPixelTexGenParameterfvSGIS, InitGetPixelTexGenParameterivSGIS, InitGetPixelTexGenParameterfvSGIS, InitTexImage4DSGIS, InitTexSubImage4DSGIS, InitAreTexturesResidentEXT, InitBindTextureEXT, InitDeleteTexturesEXT, InitGenTexturesEXT, InitIsTextureEXT, InitPrioritizeTexturesEXT, InitDetailTexFuncSGIS, InitGetDetailTexFuncSGIS, InitSharpenTexFuncSGIS, InitGetSharpenTexFuncSGIS, InitSampleMaskSGIS, InitSamplePatternSGIS, InitArrayElementEXT, InitColorPointerEXT, InitDrawArraysEXT, InitEdgeFlagPointerEXT, InitGetPointervEXT, InitIndexPointerEXT, InitNormalPointerEXT, InitTexCoordPointerEXT, InitVertexPointerEXT, InitBlendEquationEXT, InitSpriteParameterfSGIX, InitSpriteParameterfvSGIX, InitSpriteParameteriSGIX, InitSpriteParameterivSGIX, InitPointParameterfEXT, InitPointParameterfvEXT, InitPointParameterfSGIS, InitPointParameterfvSGIS, InitGetInstrumentsSGIX, InitInstrumentsBufferSGIX, InitPollInstrumentsSGIX, InitReadInstrumentsSGIX, InitStartInstrumentsSGIX, InitStopInstrumentsSGIX, InitFrameZoomSGIX, InitTagSampleBufferSGIX, InitDeformationMap3dSGIX, InitDeformationMap3fSGIX, InitDeformSGIX, InitLoadIdentityDeformationMapSGIX, InitReferencePlaneSGIX, InitFlushRasterSGIX, InitFogFuncSGIS, InitGetFogFuncSGIS, InitImageTransformParameteriHP, InitImageTransformParameterfHP, InitImageTransformParameterivHP, InitImageTransformParameterfvHP, InitGetImageTransformParameterivHP, InitGetImageTransformParameterfvHP, InitColorSubTableEXT, InitCopyColorSubTableEXT, InitHintPGI, InitColorTableEXT, InitGetColorTableEXT, InitGetColorTableParameterivEXT, InitGetColorTableParameterfvEXT, InitGetListParameterfvSGIX, InitGetListParameterivSGIX, InitListParameterfSGIX, InitListParameterfvSGIX, InitListParameteriSGIX, InitListParameterivSGIX, InitIndexMaterialEXT, InitIndexFuncEXT, InitLockArraysEXT, InitUnlockArraysEXT, InitCullParameterdvEXT, InitCullParameterfvEXT, InitFragmentColorMaterialSGIX, InitFragmentLightfSGIX, InitFragmentLightfvSGIX, InitFragmentLightiSGIX, InitFragmentLightivSGIX, InitFragmentLightModelfSGIX, InitFragmentLightModelfvSGIX, InitFragmentLightModeliSGIX, InitFragmentLightModelivSGIX, InitFragmentMaterialfSGIX, InitFragmentMaterialfvSGIX, InitFragmentMaterialiSGIX, InitFragmentMaterialivSGIX, InitGetFragmentLightfvSGIX, InitGetFragmentLightivSGIX, InitGetFragmentMaterialfvSGIX, InitGetFragmentMaterialivSGIX, InitLightEnviSGIX, InitDrawRangeElementsEXT, InitApplyTextureEXT, InitTextureLightEXT, InitTextureMaterialEXT, InitAsyncMarkerSGIX, InitFinishAsyncSGIX, InitPollAsyncSGIX, InitGenAsyncMarkersSGIX, InitDeleteAsyncMarkersSGIX, InitIsAsyncMarkerSGIX, InitVertexPointervINTEL, InitNormalPointervINTEL, InitColorPointervINTEL, InitTexCoordPointervINTEL, InitPixelTransformParameteriEXT, InitPixelTransformParameterfEXT, InitPixelTransformParameterivEXT, InitPixelTransformParameterfvEXT, InitSecondaryColor3bEXT, InitSecondaryColor3bvEXT, InitSecondaryColor3dEXT, InitSecondaryColor3dvEXT, InitSecondaryColor3fEXT, InitSecondaryColor3fvEXT, InitSecondaryColor3iEXT, InitSecondaryColor3ivEXT, InitSecondaryColor3sEXT, InitSecondaryColor3svEXT, InitSecondaryColor3ubEXT, InitSecondaryColor3ubvEXT, InitSecondaryColor3uiEXT, InitSecondaryColor3uivEXT, InitSecondaryColor3usEXT, InitSecondaryColor3usvEXT, InitSecondaryColorPointerEXT, InitTextureNormalEXT, InitMultiDrawArraysEXT, InitMultiDrawElementsEXT, InitFogCoordfEXT, InitFogCoordfvEXT, InitFogCoorddEXT, InitFogCoorddvEXT, InitFogCoordPointerEXT, InitTangent3bEXT, InitTangent3bvEXT, InitTangent3dEXT, InitTangent3dvEXT, InitTangent3fEXT, InitTangent3fvEXT, InitTangent3iEXT, InitTangent3ivEXT, InitTangent3sEXT, InitTangent3svEXT, InitBinormal3bEXT, InitBinormal3bvEXT, InitBinormal3dEXT, InitBinormal3dvEXT, InitBinormal3fEXT, InitBinormal3fvEXT, InitBinormal3iEXT, InitBinormal3ivEXT, InitBinormal3sEXT, InitBinormal3svEXT, InitTangentPointerEXT, InitBinormalPointerEXT, InitFinishTextureSUNX, InitGlobalAlphaFactorbSUN, InitGlobalAlphaFactorsSUN, InitGlobalAlphaFactoriSUN, InitGlobalAlphaFactorfSUN, InitGlobalAlphaFactordSUN, InitGlobalAlphaFactorubSUN, InitGlobalAlphaFactorusSUN, InitGlobalAlphaFactoruiSUN, InitReplacementCodeuiSUN, InitReplacementCodeusSUN, InitReplacementCodeubSUN, InitReplacementCodeuivSUN, InitReplacementCodeusvSUN, InitReplacementCodeubvSUN, InitReplacementCodePointerSUN, InitColor4ubVertex2fSUN, InitColor4ubVertex2fvSUN, InitColor4ubVertex3fSUN, InitColor4ubVertex3fvSUN, InitColor3fVertex3fSUN, InitColor3fVertex3fvSUN, InitNormal3fVertex3fSUN, InitNormal3fVertex3fvSUN, InitColor4fNormal3fVertex3fSUN, InitColor4fNormal3fVertex3fvSUN, InitTexCoord2fVertex3fSUN, InitTexCoord2fVertex3fvSUN, InitTexCoord4fVertex4fSUN, InitTexCoord4fVertex4fvSUN, InitTexCoord2fColor4ubVertex3fSUN, InitTexCoord2fColor4ubVertex3fvSUN, InitTexCoord2fColor3fVertex3fSUN, InitTexCoord2fColor3fVertex3fvSUN, InitTexCoord2fNormal3fVertex3fSUN, InitTexCoord2fNormal3fVertex3fvSUN, InitTexCoord2fColor4fNormal3fVertex3fSUN, InitTexCoord2fColor4fNormal3fVertex3fvSUN, InitTexCoord4fColor4fNormal3fVertex4fSUN, InitTexCoord4fColor4fNormal3fVertex4fvSUN, InitReplacementCodeuiVertex3fSUN, InitReplacementCodeuiVertex3fvSUN, InitReplacementCodeuiColor4ubVertex3fSUN, InitReplacementCodeuiColor4ubVertex3fvSUN, InitReplacementCodeuiColor3fVertex3fSUN, InitReplacementCodeuiColor3fVertex3fvSUN, InitReplacementCodeuiNormal3fVertex3fSUN, InitReplacementCodeuiNormal3fVertex3fvSUN, InitReplacementCodeuiColor4fNormal3fVertex3fSUN, InitReplacementCodeuiColor4fNormal3fVertex3fvSUN, InitReplacementCodeuiTexCoord2fVertex3fSUN, InitReplacementCodeuiTexCoord2fVertex3fvSUN, InitReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, InitReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, InitReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, InitReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, InitBlendFuncSeparateEXT, InitBlendFuncSeparateINGR, InitVertexWeightfEXT, InitVertexWeightfvEXT, InitVertexWeightPointerEXT, InitFlushVertexArrayRangeNV, InitVertexArrayRangeNV, InitCombinerParameterfvNV, InitCombinerParameterfNV, InitCombinerParameterivNV, InitCombinerParameteriNV, InitCombinerInputNV, InitCombinerOutputNV, InitFinalCombinerInputNV, InitGetCombinerInputParameterfvNV, InitGetCombinerInputParameterivNV, InitGetCombinerOutputParameterfvNV, InitGetCombinerOutputParameterivNV, InitGetFinalCombinerInputParameterfvNV, InitGetFinalCombinerInputParameterivNV, InitResizeBuffersMESA, InitWindowPos2dMESA, InitWindowPos2dvMESA, InitWindowPos2fMESA, InitWindowPos2fvMESA, InitWindowPos2iMESA, InitWindowPos2ivMESA, InitWindowPos2sMESA, InitWindowPos2svMESA, InitWindowPos3dMESA, InitWindowPos3dvMESA, InitWindowPos3fMESA, InitWindowPos3fvMESA, InitWindowPos3iMESA, InitWindowPos3ivMESA, InitWindowPos3sMESA, InitWindowPos3svMESA, InitWindowPos4dMESA, InitWindowPos4dvMESA, InitWindowPos4fMESA, InitWindowPos4fvMESA, InitWindowPos4iMESA, InitWindowPos4ivMESA, InitWindowPos4sMESA, InitWindowPos4svMESA, InitMultiModeDrawArraysIBM, InitMultiModeDrawElementsIBM, InitColorPointerListIBM, InitSecondaryColorPointerListIBM, InitEdgeFlagPointerListIBM, InitFogCoordPointerListIBM, InitIndexPointerListIBM, InitNormalPointerListIBM, InitTexCoordPointerListIBM, InitVertexPointerListIBM, InitTbufferMask3DFX, InitSampleMaskEXT, InitSamplePatternEXT, InitTextureColorMaskSGIS, InitIglooInterfaceSGIX, InitDeleteFencesNV, InitGenFencesNV, InitIsFenceNV, InitTestFenceNV, InitGetFenceivNV, InitFinishFenceNV, InitSetFenceNV, InitMapControlPointsNV, InitMapParameterivNV, InitMapParameterfvNV, InitGetMapControlPointsNV, InitGetMapParameterivNV, InitGetMapParameterfvNV, InitGetMapAttribParameterivNV, InitGetMapAttribParameterfvNV, InitEvalMapsNV, InitCombinerStageParameterfvNV, InitGetCombinerStageParameterfvNV, InitAreProgramsResidentNV, InitBindProgramNV, InitDeleteProgramsNV, InitExecuteProgramNV, InitGenProgramsNV, InitGetProgramParameterdvNV, InitGetProgramParameterfvNV, InitGetProgramivNV, InitGetProgramStringNV, InitGetTrackMatrixivNV, InitGetVertexAttribdvNV, InitGetVertexAttribfvNV, InitGetVertexAttribivNV, InitGetVertexAttribPointervNV, InitIsProgramNV, InitLoadProgramNV, InitProgramParameter4dNV, InitProgramParameter4dvNV, InitProgramParameter4fNV, InitProgramParameter4fvNV, InitProgramParameters4dvNV, InitProgramParameters4fvNV, InitRequestResidentProgramsNV, InitTrackMatrixNV, InitVertexAttribPointerNV, InitVertexAttrib1dNV, InitVertexAttrib1dvNV, InitVertexAttrib1fNV, InitVertexAttrib1fvNV, InitVertexAttrib1sNV, InitVertexAttrib1svNV, InitVertexAttrib2dNV, InitVertexAttrib2dvNV, InitVertexAttrib2fNV, InitVertexAttrib2fvNV, InitVertexAttrib2sNV, InitVertexAttrib2svNV, InitVertexAttrib3dNV, InitVertexAttrib3dvNV, InitVertexAttrib3fNV, InitVertexAttrib3fvNV, InitVertexAttrib3sNV, InitVertexAttrib3svNV, InitVertexAttrib4dNV, InitVertexAttrib4dvNV, InitVertexAttrib4fNV, InitVertexAttrib4fvNV, InitVertexAttrib4sNV, InitVertexAttrib4svNV, InitVertexAttrib4ubNV, InitVertexAttrib4ubvNV, InitVertexAttribs1dvNV, InitVertexAttribs1fvNV, InitVertexAttribs1svNV, InitVertexAttribs2dvNV, InitVertexAttribs2fvNV, InitVertexAttribs2svNV, InitVertexAttribs3dvNV, InitVertexAttribs3fvNV, InitVertexAttribs3svNV, InitVertexAttribs4dvNV, InitVertexAttribs4fvNV, InitVertexAttribs4svNV, InitVertexAttribs4ubvNV, InitTexBumpParameterivATI, InitTexBumpParameterfvATI, InitGetTexBumpParameterivATI, InitGetTexBumpParameterfvATI, InitGenFragmentShadersATI, InitBindFragmentShaderATI, InitDeleteFragmentShaderATI, InitBeginFragmentShaderATI, InitEndFragmentShaderATI, InitPassTexCoordATI, InitSampleMapATI, InitColorFragmentOp1ATI, InitColorFragmentOp2ATI, InitColorFragmentOp3ATI, InitAlphaFragmentOp1ATI, InitAlphaFragmentOp2ATI, InitAlphaFragmentOp3ATI, InitSetFragmentShaderConstantATI, InitPNTrianglesiATI, InitPNTrianglesfATI, InitNewObjectBufferATI, InitIsObjectBufferATI, InitUpdateObjectBufferATI, InitGetObjectBufferfvATI, InitGetObjectBufferivATI, InitFreeObjectBufferATI, InitArrayObjectATI, InitGetArrayObjectfvATI, InitGetArrayObjectivATI, InitVariantArrayObjectATI, InitGetVariantArrayObjectfvATI, InitGetVariantArrayObjectivATI, InitBeginVertexShaderEXT, InitEndVertexShaderEXT, InitBindVertexShaderEXT, InitGenVertexShadersEXT, InitDeleteVertexShaderEXT, InitShaderOp1EXT, InitShaderOp2EXT, InitShaderOp3EXT, InitSwizzleEXT, InitWriteMaskEXT, InitInsertComponentEXT, InitExtractComponentEXT, InitGenSymbolsEXT, InitSetInvariantEXT, InitSetLocalConstantEXT, InitVariantbvEXT, InitVariantsvEXT, InitVariantivEXT, InitVariantfvEXT, InitVariantdvEXT, InitVariantubvEXT, InitVariantusvEXT, InitVariantuivEXT, InitVariantPointerEXT, InitEnableVariantClientStateEXT, InitDisableVariantClientStateEXT, InitBindLightParameterEXT, InitBindMaterialParameterEXT, InitBindTexGenParameterEXT, InitBindTextureUnitParameterEXT, InitBindParameterEXT, InitIsVariantEnabledEXT, InitGetVariantBooleanvEXT, InitGetVariantIntegervEXT, InitGetVariantFloatvEXT, InitGetVariantPointervEXT, InitGetInvariantBooleanvEXT, InitGetInvariantIntegervEXT, InitGetInvariantFloatvEXT, InitGetLocalConstantBooleanvEXT, InitGetLocalConstantIntegervEXT, InitGetLocalConstantFloatvEXT, InitVertexStream1sATI, InitVertexStream1svATI, InitVertexStream1iATI, InitVertexStream1ivATI, InitVertexStream1fATI, InitVertexStream1fvATI, InitVertexStream1dATI, InitVertexStream1dvATI, InitVertexStream2sATI, InitVertexStream2svATI, InitVertexStream2iATI, InitVertexStream2ivATI, InitVertexStream2fATI, InitVertexStream2fvATI, InitVertexStream2dATI, InitVertexStream2dvATI, InitVertexStream3sATI, InitVertexStream3svATI, InitVertexStream3iATI, InitVertexStream3ivATI, InitVertexStream3fATI, InitVertexStream3fvATI, InitVertexStream3dATI, InitVertexStream3dvATI, InitVertexStream4sATI, InitVertexStream4svATI, InitVertexStream4iATI, InitVertexStream4ivATI, InitVertexStream4fATI, InitVertexStream4fvATI, InitVertexStream4dATI, InitVertexStream4dvATI, InitNormalStream3bATI, InitNormalStream3bvATI, InitNormalStream3sATI, InitNormalStream3svATI, InitNormalStream3iATI, InitNormalStream3ivATI, InitNormalStream3fATI, InitNormalStream3fvATI, InitNormalStream3dATI, InitNormalStream3dvATI, InitClientActiveVertexStreamATI, InitVertexBlendEnviATI, InitVertexBlendEnvfATI, InitElementPointerATI, InitDrawElementArrayATI, InitDrawRangeElementArrayATI, InitDrawMeshArraysSUN, InitGenOcclusionQueriesNV, InitDeleteOcclusionQueriesNV, InitIsOcclusionQueryNV, InitBeginOcclusionQueryNV, InitEndOcclusionQueryNV, InitGetOcclusionQueryivNV, InitGetOcclusionQueryuivNV, InitPointParameteriNV, InitPointParameterivNV, InitActiveStencilFaceEXT, InitElementPointerAPPLE, InitDrawElementArrayAPPLE, InitDrawRangeElementArrayAPPLE, InitMultiDrawElementArrayAPPLE, InitMultiDrawRangeElementArrayAPPLE, InitGenFencesAPPLE, InitDeleteFencesAPPLE, InitSetFenceAPPLE, InitIsFenceAPPLE, InitTestFenceAPPLE, InitFinishFenceAPPLE, InitTestObjectAPPLE, InitFinishObjectAPPLE, InitBindVertexArrayAPPLE, InitDeleteVertexArraysAPPLE, InitGenVertexArraysAPPLE, InitIsVertexArrayAPPLE, InitVertexArrayRangeAPPLE, InitFlushVertexArrayRangeAPPLE, InitVertexArrayParameteriAPPLE, InitDrawBuffersATI, InitProgramNamedParameter4fNV, InitProgramNamedParameter4dNV, InitProgramNamedParameter4fvNV, InitProgramNamedParameter4dvNV, InitGetProgramNamedParameterfvNV, InitGetProgramNamedParameterdvNV, InitVertex2hNV, InitVertex2hvNV, InitVertex3hNV, InitVertex3hvNV, InitVertex4hNV, InitVertex4hvNV, InitNormal3hNV, InitNormal3hvNV, InitColor3hNV, InitColor3hvNV, InitColor4hNV, InitColor4hvNV, InitTexCoord1hNV, InitTexCoord1hvNV, InitTexCoord2hNV, InitTexCoord2hvNV, InitTexCoord3hNV, InitTexCoord3hvNV, InitTexCoord4hNV, InitTexCoord4hvNV, InitMultiTexCoord1hNV, InitMultiTexCoord1hvNV, InitMultiTexCoord2hNV, InitMultiTexCoord2hvNV, InitMultiTexCoord3hNV, InitMultiTexCoord3hvNV, InitMultiTexCoord4hNV, InitMultiTexCoord4hvNV, InitFogCoordhNV, InitFogCoordhvNV, InitSecondaryColor3hNV, InitSecondaryColor3hvNV, InitVertexWeighthNV, InitVertexWeighthvNV, InitVertexAttrib1hNV, InitVertexAttrib1hvNV, InitVertexAttrib2hNV, InitVertexAttrib2hvNV, InitVertexAttrib3hNV, InitVertexAttrib3hvNV, InitVertexAttrib4hNV, InitVertexAttrib4hvNV, InitVertexAttribs1hvNV, InitVertexAttribs2hvNV, InitVertexAttribs3hvNV, InitVertexAttribs4hvNV, InitPixelDataRangeNV, InitFlushPixelDataRangeNV, InitPrimitiveRestartNV, InitPrimitiveRestartIndexNV, InitMapObjectBufferATI, InitUnmapObjectBufferATI, InitStencilOpSeparateATI, InitStencilFuncSeparateATI, InitVertexAttribArrayObjectATI, InitGetVertexAttribArrayObjectfvATI, InitGetVertexAttribArrayObjectivATI, InitDepthBoundsEXT, InitBlendEquationSeparateEXT, InitAddSwapHintRectWIN, #ifdef _WIN32 InitCreateBufferRegionARB, InitDeleteBufferRegionARB, InitSaveBufferRegionARB, InitRestoreBufferRegionARB, InitGetExtensionsStringARB, InitGetPixelFormatAttribivARB, InitGetPixelFormatAttribfvARB, InitChoosePixelFormatARB, InitMakeContextCurrentARB, InitGetCurrentReadDCARB, InitCreatePbufferARB, InitGetPbufferDCARB, InitReleasePbufferDCARB, InitDestroyPbufferARB, InitQueryPbufferARB, InitBindTexImageARB, InitReleaseTexImageARB, InitSetPbufferAttribARB, InitCreateDisplayColorTableEXT, InitLoadDisplayColorTableEXT, InitBindDisplayColorTableEXT, InitDestroyDisplayColorTableEXT, InitGetExtensionsStringEXT, InitMakeContextCurrentEXT, InitGetCurrentReadDCEXT, InitCreatePbufferEXT, InitGetPbufferDCEXT, InitReleasePbufferDCEXT, InitDestroyPbufferEXT, InitQueryPbufferEXT, InitGetPixelFormatAttribivEXT, InitGetPixelFormatAttribfvEXT, InitChoosePixelFormatEXT, InitSwapIntervalEXT, InitGetSwapIntervalEXT, InitAllocateMemoryNV, InitFreeMemoryNV, InitGetSyncValuesOML, InitGetMscRateOML, InitSwapBuffersMscOML, InitSwapLayerBuffersMscOML, InitWaitForMscOML, InitWaitForSbcOML, InitGetDigitalVideoParametersI3D, InitSetDigitalVideoParametersI3D, InitGetGammaTableParametersI3D, InitSetGammaTableParametersI3D, InitGetGammaTableI3D, InitSetGammaTableI3D, InitEnableGenlockI3D, InitDisableGenlockI3D, InitIsEnabledGenlockI3D, InitGenlockSourceI3D, InitGetGenlockSourceI3D, InitGenlockSourceEdgeI3D, InitGetGenlockSourceEdgeI3D, InitGenlockSampleRateI3D, InitGetGenlockSampleRateI3D, InitGenlockSourceDelayI3D, InitGetGenlockSourceDelayI3D, InitQueryGenlockMaxSourceDelayI3D, InitCreateImageBufferI3D, InitDestroyImageBufferI3D, InitAssociateImageBufferEventsI3D, InitReleaseImageBufferEventsI3D, InitEnableFrameLockI3D, InitDisableFrameLockI3D, InitIsEnabledFrameLockI3D, InitQueryFrameLockMasterI3D, InitGetFrameUsageI3D, InitBeginFrameTrackingI3D, InitEndFrameTrackingI3D, InitQueryFrameTrackingI3D, #endif /* _WIN32 */ }; rgl/src/ext/GLsdk/README0000644000176000001440000000754511664440315014360 0ustar ripleyusersThe currently shipping OpenGL32.DLL from Microsoft only has entry points for OpenGL 1.1. If an application wants to use OpenGL {1.2, 1.3, 1.4, 1.5} functions, it has to use wglGetProcAddress() in order to obtain the entry points from the driver. The files in this distribution enable the application pretend that there is full support for OpenGL {1.2/1.3/1.4/1.5} if the underlying implementation supports OpenGL {1.2/1.3/1.4/1.5}. A useful feature of the framework is that it provides a safety layer by initializing each function to a "default" initialization function with matching arguments and return type. On debug builds, the initialization function adds an ASSERT to catch unwitting usage of NULL function pointers by the application. The framework is also readily usable for multi-context and multi-threaded applications, including application code that demonstrates how to achieve this. Additionally, this distribution provides full support for all the extension entry points in glext.h and wglext.h. In order to use this scheme, the application needs to do the following: ===================================================================== For applications that do not create rendering contexts on different devices (e.g. multi-display with different vendors supporting the two displays): 1. Include "glprocs.h" in addition to including "gl.h" 2. Compile "glprocs.c" and ensure that glprocs.obj is linked with the application code. 3. Call OpenGL{1.2,1.3,1.4,1.5} and extension procs after verifying that the implementation has support for the underlying feature. Example: if (supports12) { glDrawRangeElements (.....) } NOTE: The application can call "glGetString(GL_VERSION)" to determine the version of OpenGL supported on a particular implementation. ===================================================================== For aplications that create rendering contexts on different devices, the application has to perform the following additional steps: 1. Allocate memory for _GLextensionProcs in the application data structures for each device. Example: typedef struct { appType appData; _GLextensionProcs extensionProcs; } ContextData; ContextData cdev1, cdev2; 2. Initialize the extension procs. _InitExtensionProcs (&cdev1.extensionProcs); _InitExtensionProcs (&cdev2.extensionProcs); 3. Provide a mechanism for accessing the current device. Example: ContextData *currentContextData; static _inline _GLextensionProcs *_GET_TLS_PROCTABLE(void) { return (¤tContxtData->extensionProcs); } Another Example (when the two different devices are being used on two different contexts): static _inline _GLextensionProcs *_GET_TLS_PROCTABLE(void) { ContextData *tla = GetThreadSpecificData(); return (&tla->extensionProcs); } (NOTE: Aplication has to replace this function in glprocs.h with its own customized function). ===================================================================== This distribution additionally contains the following: Windows Demo Source: -------------------- windemo: demogl.{c|h} - sample initialization, rendering functions and a sample data structure for tracking per-window data (useful for apps. with multiple windows). Makefile:Builds all the demos (singlewin, multiwin, and multithread) singlewin: demo.c: Shows how to use the SDK for an application with a single window. Makefile: Builds the singlewin sample (demo.exe). multiwin: demo.c: Shows how to use the SDK for an application with two windows Makefile: Builds the multiwin sample (demo.exe) multithread: demo.c: Shows how to use the SDK for a multi-threaded application. Makefile: Builds the multithread sample (demo.exe). GLX Demo Source: -------------------- glxdemo: GLX demo similar to the singlewin Windows demo. rgl/src/ext/GLsdk/glxdemo/0000755000176000001440000000000012100313500015101 5ustar ripleyusersrgl/src/ext/GLsdk/glxdemo/Makefile0000644000176000001440000000051112262026246016557 0ustar ripleyusersCC = gcc CFLAGS = -c -g -Wall -I/usr/include -I.. LIBS = -L/usr/lib -lGL demo: demo.o glprocs.o $(CC) demo.o glprocs.o $(LIBS) -o $@ demo.o: demo.c ../GL/glprocs.h $(CC) $(CFLAGS) demo.c glprocs.o: glprocs.c ../GL/glprocs.h $(CC) $(CFLAGS) glprocs.c glprocs.c: ln -s ../GL/glprocs.c . clean: rm -f *.o demo glprocs.c rgl/src/ext/GLsdk/glxdemo/demo.c0000644000176000001440000002440512262026246016217 0ustar ripleyusers/* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ #include #include #include #include #include #include #include #include #include "GL/glprocs.h" /* * Define a structure keeping all application data on a per window * basis. */ typedef struct { /* Intialized data */ char *windowTitle; int xpos; int ypos; int width; /* Size of client region */ int height; int pfdFlags; /* Flags for selecting pixel format descriptor */ /* Computed data */ int hasMultitexture; /* Supports multi-texture */ int hasWinSwapHint; /* Supports WinSwapHint */ int spin; /* Rotation angle of triangle per window */ int texid; /* Texture id per window */ Display *display; GLXContext context; Window window; /* If we are using multiple renderers in a single process or on * multiple threads, we must keep our function table for * OpenGL 1.2, OpenGL 1.3 and extension functions */ #ifdef _APP_PROCTABLE _GLextensionProcs extensionProcs; #endif } WindowData; /* Using strstr for extension search can result in false positives because of substring matches. Since extension names in the extension string are separated by spaces, this can be fixed simply by looking for a space OR the end-of-string character immediately following the extension we're looking for (by skipping ahead 'len' characters). */ static GLboolean IsExtensionSupported(const GLubyte *extensionStr, const GLubyte *checkExtension) { const GLubyte *s; GLint len; s = extensionStr; len = strlen (checkExtension); while ((s = strstr (s, checkExtension)) != NULL) { s += len; if ((*s == ' ') || (*s == '\0')) { return (GL_TRUE); } } return (GL_FALSE); } /* * Initialize the OpenGL context - create textures, check the extensions * supported by the driver etc. */ static void InitializeOpenGL(WindowData *pwdata) { const GLubyte *extstrGL; GLubyte image[] = { 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, }; /* Setup the extensions */ extstrGL = glGetString(GL_EXTENSIONS); /* Check for multi-texture extension. */ if (GL_TRUE == IsExtensionSupported (extstrGL, "GL_ARB_multitexture")) { pwdata->hasMultitexture = GL_TRUE; /* Multi-texturing is supported. Create a texture for unit1 and * bind it in MODULATE mode. */ /* ========================================================== * ========================================================== * Use an extension function without doing anything special! * OpenGL 1.2, OpenGL 1.3 procs can be used similarly - as * long we ensure it is supported - just as we have done * for multi-texturing here. * ========================================================== * ========================================================== */ glActiveTextureARB (GL_TEXTURE1_ARB); /* Use unit1 */ glGenTextures (1, &pwdata->texid); glBindTexture (GL_TEXTURE_2D, pwdata->texid); /* Bound on unit 1 */ glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable (GL_TEXTURE_2D); } } static void DrawScene(WindowData *pwdata) { /* Render a triangle - multi-textured if ARB_multitexture is supported. */ glClearColor (0.0, 0.0, 0.0, 0.0); /* BLACK */ glClear (GL_COLOR_BUFFER_BIT); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glRotatef (pwdata->spin, 0.0, 0.0, 1.0); pwdata->spin += 2; if (pwdata->spin >= 360) { pwdata->spin = 0; } if (pwdata->hasMultitexture) { /* * ========================================================== * ========================================================== * Use an extension function without doing anything special! * OpenGL 1.2, OpenGL 1.3 procs can be used similarly - as * long we ensure it is supported - just as we have done * for MultiTexCoord here. * ========================================================== * ========================================================== */ glBegin( GL_POLYGON ); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 0.0, 0.0); glColor3f (1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 0.0); glColor3f (0.0, 1.0, 0.0); glVertex3f(0.5, 0.0, 0.0); glMultiTexCoord2fARB (GL_TEXTURE1_ARB, 1.0, 1.0); glColor3f (0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glEnd(); } else { glBegin( GL_POLYGON ); glColor3f (1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glColor3f (0.0, 1.0, 0.0); glVertex3f(0.5, 0.0, 0.0); glColor3f (0.0, 0.0, 1.0); glVertex3f(0.5, 0.5, 0.0); glEnd(); } glXSwapBuffers(pwdata->display, pwdata->window); } /* * Create an RGB OpenGL window. * Return the window and context handles. */ static void MakeWindow( Display *dpy, const char *name, int x, int y, int width, int height, WindowData *winData ) { int attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None }; int scrnum; XSetWindowAttributes attr; unsigned long mask; Window root; Window win; GLXContext ctx; XVisualInfo *visinfo; scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); visinfo = glXChooseVisual( dpy, scrnum, attrib ); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow( dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr ); /* set hints and properties */ { XSizeHints sizehints; sizehints.x = x; sizehints.y = y; sizehints.width = width; sizehints.height = height; sizehints.flags = USSize | USPosition; XSetNormalHints(dpy, win, &sizehints); XSetStandardProperties(dpy, win, name, name, None, (char **)NULL, 0, &sizehints); } ctx = glXCreateContext( dpy, visinfo, NULL, True ); if (!ctx) { printf("Error: glXCreateContext failed\n"); exit(1); } XFree(visinfo); winData->display = dpy; winData->window = win; winData->context = ctx; } static void EventLoop(WindowData *winData) { while (1) { static long mask = StructureNotifyMask | ExposureMask | KeyPressMask; XEvent event; while (XCheckWindowEvent(winData->display, winData->window, mask, &event)) { if (event.xany.window == winData->window) { switch (event.type) { case Expose: DrawScene(winData); break; case ConfigureNotify: glViewport(0, 0, event.xconfigure.width, event.xconfigure.height); break; case KeyPress: { char buffer[10]; int r; r = XLookupString(&event.xkey, buffer, sizeof(buffer), NULL, NULL); if (buffer[0] == 27) { /* escape */ return; } } } } } DrawScene(winData); } } int main(int argc, char *argv[]) { Display *dpy; WindowData winData; dpy = XOpenDisplay(NULL); if (!dpy) { printf("Error: couldn't open default display.\n"); return -1; } MakeWindow(dpy, "glprocs test", 0, 0, 300, 300, &winData); XMapWindow(dpy, winData.window); glXMakeCurrent(dpy, winData.window, winData.context); InitializeOpenGL(&winData); EventLoop(&winData); glXDestroyContext(dpy, winData.context); XDestroyWindow(dpy, winData.window); XCloseDisplay(dpy); return 0; } rgl/src/ext/ftgl/0000755000176000001440000000000012100313501013373 5ustar ripleyusersrgl/src/ext/ftgl/FTGlyphContainer.cpp0000644000176000001440000000635212262026246017305 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTGlyphContainer.h" #include "FTFace.h" #include "FTCharmap.h" FTGlyphContainer::FTGlyphContainer(FTFace* f) : face(f), err(0) { glyphs.push_back(NULL); charMap = new FTCharmap(face); } FTGlyphContainer::~FTGlyphContainer() { GlyphVector::iterator it; for(it = glyphs.begin(); it != glyphs.end(); ++it) { delete *it; } glyphs.clear(); delete charMap; } bool FTGlyphContainer::CharMap(FT_Encoding encoding) { bool result = charMap->CharMap(encoding); err = charMap->Error(); return result; } unsigned int FTGlyphContainer::FontIndex(const unsigned int charCode) const { return charMap->FontIndex(charCode); } void FTGlyphContainer::Add(FTGlyph* tempGlyph, const unsigned int charCode) { charMap->InsertIndex(charCode, glyphs.size()); glyphs.push_back(tempGlyph); } const FTGlyph* const FTGlyphContainer::Glyph(const unsigned int charCode) const { unsigned int index = charMap->GlyphListIndex(charCode); return glyphs[index]; } FTBBox FTGlyphContainer::BBox(const unsigned int charCode) const { return Glyph(charCode)->BBox(); } float FTGlyphContainer::Advance(const unsigned int charCode, const unsigned int nextCharCode) { unsigned int left = charMap->FontIndex(charCode); unsigned int right = charMap->FontIndex(nextCharCode); return face->KernAdvance(left, right).Xf() + Glyph(charCode)->Advance(); } FTPoint FTGlyphContainer::Render(const unsigned int charCode, const unsigned int nextCharCode, FTPoint penPosition, int renderMode) { unsigned int left = charMap->FontIndex(charCode); unsigned int right = charMap->FontIndex(nextCharCode); FTPoint kernAdvance = face->KernAdvance(left, right); if(!face->Error()) { unsigned int index = charMap->GlyphListIndex(charCode); kernAdvance += glyphs[index]->Render(penPosition, renderMode); } return kernAdvance; } rgl/src/ext/ftgl/FTCharmap.cpp0000644000176000001440000000527312262026246015733 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTFace.h" #include "FTCharmap.h" FTCharmap::FTCharmap(FTFace* face) : ftFace(*(face->Face())), err(0) { if(!ftFace->charmap) { if(!ftFace->num_charmaps) { // This face doesn't even have one charmap! err = 0x96; // Invalid_CharMap_Format return; } err = FT_Set_Charmap(ftFace, ftFace->charmaps[0]); } ftEncoding = ftFace->charmap->encoding; for(unsigned int i = 0; i < FTCharmap::MAX_PRECOMPUTED; i++) { charIndexCache[i] = FT_Get_Char_Index(ftFace, i); } } FTCharmap::~FTCharmap() { charMap.clear(); } bool FTCharmap::CharMap(FT_Encoding encoding) { if(ftEncoding == encoding) { err = 0; return true; } err = FT_Select_Charmap(ftFace, encoding); if(!err) { ftEncoding = encoding; charMap.clear(); } return !err; } unsigned int FTCharmap::GlyphListIndex(const unsigned int characterCode) { return charMap.find(characterCode); } unsigned int FTCharmap::FontIndex(const unsigned int characterCode) { if(characterCode < FTCharmap::MAX_PRECOMPUTED) { return charIndexCache[characterCode]; } return FT_Get_Char_Index(ftFace, characterCode); } void FTCharmap::InsertIndex(const unsigned int characterCode, const size_t containerIndex) { charMap.insert(characterCode, static_cast(containerIndex)); } rgl/src/ext/ftgl/FTList.h0000644000176000001440000000630212262026246014732 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTList__ #define __FTList__ #include "FTGL/ftgl.h" /** * Provides a non-STL alternative to the STL list */ template class FTList { public: typedef FT_LIST_ITEM_TYPE value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; /** * Constructor */ FTList() : listSize(0), tail(0) { tail = NULL; head = new Node; } /** * Destructor */ ~FTList() { Node* next; for(Node *walk = head; walk; walk = next) { next = walk->next; delete walk; } } /** * Get the number of items in the list */ size_type size() const { return listSize; } /** * Add an item to the end of the list */ void push_back(const value_type& item) { Node* node = new Node(item); if(head->next == NULL) { head->next = node; } if(tail) { tail->next = node; } tail = node; ++listSize; } /** * Get the item at the front of the list */ reference front() const { return head->next->payload; } /** * Get the item at the end of the list */ reference back() const { return tail->payload; } private: struct Node { Node() : next(NULL) {} Node(const value_type& item) : next(NULL) { payload = item; } Node* next; value_type payload; }; size_type listSize; Node* head; Node* tail; }; #endif // __FTList__ rgl/src/ext/ftgl/FTVectoriser.cpp0000644000176000001440000002106412262026246016501 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTInternals.h" #include "FTVectoriser.h" #ifndef CALLBACK #define CALLBACK #endif #if defined __APPLE_CC__ && __APPLE_CC__ < 5465 typedef GLvoid (*GLUTesselatorFunction) (...); #elif defined WIN32 && !defined __CYGWIN__ typedef GLvoid (CALLBACK *GLUTesselatorFunction) (); #else typedef GLvoid (*GLUTesselatorFunction) (); #endif void CALLBACK ftglError(GLenum errCode, FTMesh* mesh) { mesh->Error(errCode); } void CALLBACK ftglVertex(void* data, FTMesh* mesh) { FTGL_DOUBLE* vertex = static_cast(data); mesh->AddPoint(vertex[0], vertex[1], vertex[2]); } void CALLBACK ftglCombine(FTGL_DOUBLE coords[3], void* vertex_data[4], GLfloat weight[4], void** outData, FTMesh* mesh) { const FTGL_DOUBLE* vertex = static_cast(coords); *outData = const_cast(mesh->Combine(vertex[0], vertex[1], vertex[2])); } void CALLBACK ftglBegin(GLenum type, FTMesh* mesh) { mesh->Begin(type); } void CALLBACK ftglEnd(FTMesh* mesh) { mesh->End(); } FTMesh::FTMesh() : currentTesselation(0), err(0) { tesselationList.reserve(16); } FTMesh::~FTMesh() { for(size_t t = 0; t < tesselationList.size(); ++t) { delete tesselationList[t]; } tesselationList.clear(); } void FTMesh::AddPoint(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) { currentTesselation->AddPoint(x, y, z); } const FTGL_DOUBLE* FTMesh::Combine(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) { tempPointList.push_back(FTPoint(x, y,z)); return static_cast(tempPointList.back()); } void FTMesh::Begin(GLenum meshType) { currentTesselation = new FTTesselation(meshType); } void FTMesh::End() { tesselationList.push_back(currentTesselation); } const FTTesselation* const FTMesh::Tesselation(size_t index) const { return (index < tesselationList.size()) ? tesselationList[index] : NULL; } FTVectoriser::FTVectoriser(const FT_GlyphSlot glyph) : contourList(0), mesh(0), ftContourCount(0), contourFlag(0) { if(glyph) { outline = glyph->outline; ftContourCount = outline.n_contours; contourList = 0; contourFlag = outline.flags; ProcessContours(); } } FTVectoriser::~FTVectoriser() { for(size_t c = 0; c < ContourCount(); ++c) { delete contourList[c]; } delete [] contourList; delete mesh; } void FTVectoriser::ProcessContours() { short contourLength = 0; short startIndex = 0; short endIndex = 0; contourList = new FTContour*[ftContourCount]; for(int i = 0; i < ftContourCount; ++i) { FT_Vector* pointList = &outline.points[startIndex]; char* tagList = &outline.tags[startIndex]; endIndex = outline.contours[i]; contourLength = (endIndex - startIndex) + 1; FTContour* contour = new FTContour(pointList, tagList, contourLength); contourList[i] = contour; startIndex = endIndex + 1; } // Compute each contour's parity. FIXME: see if FT_Outline_Get_Orientation // can do it for us. for(int i = 0; i < ftContourCount; i++) { FTContour *c1 = contourList[i]; // 1. Find the leftmost point. FTPoint leftmost(65536.0, 0.0); for(size_t n = 0; n < c1->PointCount(); n++) { FTPoint p = c1->Point(n); if(p.X() < leftmost.X()) { leftmost = p; } } // 2. Count how many other contours we cross when going further to // the left. int parity = 0; for(int j = 0; j < ftContourCount; j++) { if(j == i) { continue; } FTContour *c2 = contourList[j]; for(size_t n = 0; n < c2->PointCount(); n++) { FTPoint p1 = c2->Point(n); FTPoint p2 = c2->Point((n + 1) % c2->PointCount()); /* FIXME: combinations of >= > <= and < do not seem stable */ if((p1.Y() < leftmost.Y() && p2.Y() < leftmost.Y()) || (p1.Y() >= leftmost.Y() && p2.Y() >= leftmost.Y()) || (p1.X() > leftmost.X() && p2.X() > leftmost.X())) { continue; } else if(p1.X() < leftmost.X() && p2.X() < leftmost.X()) { parity++; } else { FTPoint a = p1 - leftmost; FTPoint b = p2 - leftmost; if(b.X() * a.Y() > b.Y() * a.X()) { parity++; } } } } // 3. Make sure the glyph has the proper parity. c1->SetParity(parity); } } size_t FTVectoriser::PointCount() { size_t s = 0; for(size_t c = 0; c < ContourCount(); ++c) { s += contourList[c]->PointCount(); } return s; } const FTContour* const FTVectoriser::Contour(size_t index) const { return (index < ContourCount()) ? contourList[index] : NULL; } void FTVectoriser::MakeMesh(FTGL_DOUBLE zNormal, int outsetType, float outsetSize) { if(mesh) { delete mesh; } mesh = new FTMesh; GLUtesselator* tobj = gluNewTess(); gluTessCallback(tobj, GLU_TESS_BEGIN_DATA, (GLUTesselatorFunction)ftglBegin); gluTessCallback(tobj, GLU_TESS_VERTEX_DATA, (GLUTesselatorFunction)ftglVertex); gluTessCallback(tobj, GLU_TESS_COMBINE_DATA, (GLUTesselatorFunction)ftglCombine); gluTessCallback(tobj, GLU_TESS_END_DATA, (GLUTesselatorFunction)ftglEnd); gluTessCallback(tobj, GLU_TESS_ERROR_DATA, (GLUTesselatorFunction)ftglError); if(contourFlag & ft_outline_even_odd_fill) // ft_outline_reverse_fill { gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); } else { gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO); } gluTessProperty(tobj, GLU_TESS_TOLERANCE, 0); gluTessNormal(tobj, 0.0f, 0.0f, zNormal); gluTessBeginPolygon(tobj, mesh); for(size_t c = 0; c < ContourCount(); ++c) { /* Build the */ switch(outsetType) { case 1 : contourList[c]->buildFrontOutset(outsetSize); break; case 2 : contourList[c]->buildBackOutset(outsetSize); break; } const FTContour* contour = contourList[c]; gluTessBeginContour(tobj); for(size_t p = 0; p < contour->PointCount(); ++p) { const FTGL_DOUBLE* d; switch(outsetType) { case 1: d = contour->FrontPoint(p); break; case 2: d = contour->BackPoint(p); break; case 0: default: d = contour->Point(p); break; } // XXX: gluTessVertex doesn't modify the data but does not // specify "const" in its prototype, so we cannot cast to // a const type. gluTessVertex(tobj, (GLdouble *)d, (GLvoid *)d); } gluTessEndContour(tobj); } gluTessEndPolygon(tobj); gluDeleteTess(tobj); } rgl/src/ext/ftgl/FTGlyph/0000755000176000001440000000000012100313501014710 5ustar ripleyusersrgl/src/ext/ftgl/FTGlyph/FTPolygonGlyph.cpp0000644000176000001440000000754412262026246020333 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTPolygonGlyphImpl.h" #include "FTVectoriser.h" // // FTGLPolyGlyph // FTPolygonGlyph::FTPolygonGlyph(FT_GlyphSlot glyph, float outset, bool useDisplayList) : FTGlyph(new FTPolygonGlyphImpl(glyph, outset, useDisplayList)) {} FTPolygonGlyph::~FTPolygonGlyph() {} const FTPoint& FTPolygonGlyph::Render(const FTPoint& pen, int renderMode) { FTPolygonGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLPolyGlyphImpl // FTPolygonGlyphImpl::FTPolygonGlyphImpl(FT_GlyphSlot glyph, float _outset, bool useDisplayList) : FTGlyphImpl(glyph), glList(0) { if(ft_glyph_format_outline != glyph->format) { err = 0x14; // Invalid_Outline return; } vectoriser = new FTVectoriser(glyph); if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) { delete vectoriser; vectoriser = NULL; return; } hscale = glyph->face->size->metrics.x_ppem * 64; vscale = glyph->face->size->metrics.y_ppem * 64; outset = _outset; if(useDisplayList) { glList = glGenLists(1); glNewList(glList, GL_COMPILE); DoRender(); glEndList(); delete vectoriser; vectoriser = NULL; } } FTPolygonGlyphImpl::~FTPolygonGlyphImpl() { if(glList) { glDeleteLists(glList, 1); } else if(vectoriser) { delete vectoriser; } } const FTPoint& FTPolygonGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); if(glList) { glCallList(glList); } else if(vectoriser) { DoRender(); } glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); return advance; } void FTPolygonGlyphImpl::DoRender() { vectoriser->MakeMesh(1.0, 1, outset); const FTMesh *mesh = vectoriser->GetMesh(); for(unsigned int t = 0; t < mesh->TesselationCount(); ++t) { const FTTesselation* subMesh = mesh->Tesselation(t); unsigned int polygonType = subMesh->PolygonType(); glBegin(polygonType); for(unsigned int i = 0; i < subMesh->PointCount(); ++i) { FTPoint point = subMesh->Point(i); glTexCoord2f(point.Xf() / hscale, point.Yf() / vscale); glVertex3f(point.Xf() / 64.0f, point.Yf() / 64.0f, 0.0f); } glEnd(); } } rgl/src/ext/ftgl/FTGlyph/FTBitmapGlyphImpl.h0000644000176000001440000000414112262026246020375 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTBitmapGlyphImpl__ #define __FTBitmapGlyphImpl__ #include "FTGlyphImpl.h" class FTBitmapGlyphImpl : public FTGlyphImpl { friend class FTBitmapGlyph; protected: FTBitmapGlyphImpl(FT_GlyphSlot glyph); virtual ~FTBitmapGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * The width of the glyph 'image' */ unsigned int destWidth; /** * The height of the glyph 'image' */ unsigned int destHeight; /** * The pitch of the glyph 'image' */ unsigned int destPitch; /** * Vector from the pen position to the topleft corner of the bitmap */ FTPoint pos; /** * Pointer to the 'image' data */ unsigned char* data; }; #endif // __FTBitmapGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTPixmapGlyphImpl.h0000644000176000001440000000375512262026246020431 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTPixmapGlyphImpl__ #define __FTPixmapGlyphImpl__ #include "FTGlyphImpl.h" class FTPixmapGlyphImpl : public FTGlyphImpl { friend class FTPixmapGlyph; protected: FTPixmapGlyphImpl(FT_GlyphSlot glyph); virtual ~FTPixmapGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * The width of the glyph 'image' */ int destWidth; /** * The height of the glyph 'image' */ int destHeight; /** * Vector from the pen position to the topleft corner of the pixmap */ FTPoint pos; /** * Pointer to the 'image' data */ unsigned char* data; }; #endif // __FTPixmapGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTOutlineGlyph.cpp0000644000176000001440000000732612262026246020321 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTOutlineGlyphImpl.h" #include "FTVectoriser.h" // // FTGLOutlineGlyph // FTOutlineGlyph::FTOutlineGlyph(FT_GlyphSlot glyph, float outset, bool useDisplayList) : FTGlyph(new FTOutlineGlyphImpl(glyph, outset, useDisplayList)) {} FTOutlineGlyph::~FTOutlineGlyph() {} const FTPoint& FTOutlineGlyph::Render(const FTPoint& pen, int renderMode) { FTOutlineGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLOutlineGlyphImpl // FTOutlineGlyphImpl::FTOutlineGlyphImpl(FT_GlyphSlot glyph, float _outset, bool useDisplayList) : FTGlyphImpl(glyph), glList(0) { if(ft_glyph_format_outline != glyph->format) { err = 0x14; // Invalid_Outline return; } vectoriser = new FTVectoriser(glyph); if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) { delete vectoriser; vectoriser = NULL; return; } outset = _outset; if(useDisplayList) { glList = glGenLists(1); glNewList(glList, GL_COMPILE); DoRender(); glEndList(); delete vectoriser; vectoriser = NULL; } } FTOutlineGlyphImpl::~FTOutlineGlyphImpl() { if(glList) { glDeleteLists(glList, 1); } else if(vectoriser) { delete vectoriser; } } const FTPoint& FTOutlineGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); if(glList) { glCallList(glList); } else if(vectoriser) { DoRender(); } glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); return advance; } void FTOutlineGlyphImpl::DoRender() { for(unsigned int c = 0; c < vectoriser->ContourCount(); ++c) { const FTContour* contour = vectoriser->Contour(c); glBegin(GL_LINE_LOOP); for(unsigned int i = 0; i < contour->PointCount(); ++i) { FTPoint point = FTPoint(contour->Point(i).X() + contour->Outset(i).X() * outset, contour->Point(i).Y() + contour->Outset(i).Y() * outset, 0); glVertex2f(point.Xf() / 64.0f, point.Yf() / 64.0f); } glEnd(); } } rgl/src/ext/ftgl/FTGlyph/FTGlyphGlue.cpp0000644000176000001440000001473412262026246017577 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" static const FTPoint static_ftpoint; static const FTBBox static_ftbbox; FTGL_BEGIN_C_DECLS #define C_TOR(cname, cargs, cxxname, cxxarg, cxxtype) \ FTGLglyph* cname cargs \ { \ cxxname *g = new cxxname cxxarg; \ if(g->Error()) \ { \ delete g; \ return NULL; \ } \ FTGLglyph *ftgl = (FTGLglyph *)malloc(sizeof(FTGLglyph)); \ ftgl->ptr = g; \ ftgl->type = cxxtype; \ return ftgl; \ } // FTBitmapGlyph::FTBitmapGlyph(); C_TOR(ftglCreateBitmapGlyph, (FT_GlyphSlot glyph), FTBitmapGlyph, (glyph), GLYPH_BITMAP); // FTBufferGlyph::FTBufferGlyph(); // FIXME: not implemented // FTExtrudeGlyph::FTExtrudeGlyph(); C_TOR(ftglCreateExtrudeGlyph, (FT_GlyphSlot glyph, float depth, float frontOutset, float backOutset, int useDisplayList), FTExtrudeGlyph, (glyph, depth, frontOutset, backOutset, (useDisplayList != 0)), GLYPH_EXTRUDE); // FTOutlineGlyph::FTOutlineGlyph(); C_TOR(ftglCreateOutlineGlyph, (FT_GlyphSlot glyph, float outset, int useDisplayList), FTOutlineGlyph, (glyph, outset, (useDisplayList != 0)), GLYPH_OUTLINE); // FTPixmapGlyph::FTPixmapGlyph(); C_TOR(ftglCreatePixmapGlyph, (FT_GlyphSlot glyph), FTPixmapGlyph, (glyph), GLYPH_PIXMAP); // FTPolygonGlyph::FTPolygonGlyph(); C_TOR(ftglCreatePolygonGlyph, (FT_GlyphSlot glyph, float outset, int useDisplayList), FTPolygonGlyph, (glyph, outset, (useDisplayList != 0)), GLYPH_POLYGON); // FTTextureGlyph::FTTextureGlyph(); C_TOR(ftglCreateTextureGlyph, (FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height), FTTextureGlyph, (glyph, id, xOffset, yOffset, width, height), GLYPH_TEXTURE); // FTCustomGlyph::FTCustomGlyph(); class FTCustomGlyph : public FTGlyph { public: FTCustomGlyph(FTGLglyph *base, void *p, void (*render) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, int, FTGL_DOUBLE *, FTGL_DOUBLE *), void (*destroy) (FTGLglyph *, void *)) : FTGlyph((FT_GlyphSlot)0), baseGlyph(base), data(p), renderCallback(render), destroyCallback(destroy) {} ~FTCustomGlyph() { destroyCallback(baseGlyph, data); } float Advance() const { return baseGlyph->ptr->Advance(); } const FTPoint& Render(const FTPoint& pen, int renderMode) { FTGL_DOUBLE advancex, advancey; renderCallback(baseGlyph, data, pen.X(), pen.Y(), renderMode, &advancex, &advancey); advance = FTPoint(advancex, advancey); return advance; } const FTBBox& BBox() const { return baseGlyph->ptr->BBox(); } FT_Error Error() const { return baseGlyph->ptr->Error(); } private: FTPoint advance; FTGLglyph *baseGlyph; void *data; void (*renderCallback) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, int, FTGL_DOUBLE *, FTGL_DOUBLE *); void (*destroyCallback) (FTGLglyph *, void *); }; C_TOR(ftglCreateCustomGlyph, (FTGLglyph *base, void *data, void (*renderCallback) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, int, FTGL_DOUBLE *, FTGL_DOUBLE *), void (*destroyCallback) (FTGLglyph *, void *)), FTCustomGlyph, (base, data, renderCallback, destroyCallback), GLYPH_CUSTOM); #define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ cret cname cargs \ { \ if(!g || !g->ptr) \ { \ fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ cxxerr; \ } \ return g->ptr->cxxname cxxarg; \ } // FTGlyph::~FTGlyph(); void ftglDestroyGlyph(FTGLglyph *g) { if(!g || !g->ptr) { fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); return; } delete g->ptr; free(g); } // const FTPoint& FTGlyph::Render(const FTPoint& pen, int renderMode); extern "C++" { C_FUN(static const FTPoint&, _ftglRenderGlyph, (FTGLglyph *g, const FTPoint& pen, int renderMode), return static_ftpoint, Render, (pen, renderMode)); } void ftglRenderGlyph(FTGLglyph *g, FTGL_DOUBLE penx, FTGL_DOUBLE peny, int renderMode, FTGL_DOUBLE *advancex, FTGL_DOUBLE *advancey) { FTPoint pen(penx, peny); FTPoint ret = _ftglRenderGlyph(g, pen, renderMode); *advancex = ret.X(); *advancey = ret.Y(); } // float FTGlyph::Advance() const; C_FUN(float, ftglGetGlyphAdvance, (FTGLglyph *g), return 0.0, Advance, ()); // const FTBBox& FTGlyph::BBox() const; extern "C++" { C_FUN(static const FTBBox&, _ftglGetGlyphBBox, (FTGLglyph *g), return static_ftbbox, BBox, ()); } void ftglGetGlyphBBox(FTGLglyph *g, float bounds[6]) { FTBBox ret = _ftglGetGlyphBBox(g); FTPoint lower = ret.Lower(), upper = ret.Upper(); bounds[0] = lower.Xf(); bounds[1] = lower.Yf(); bounds[2] = lower.Zf(); bounds[3] = upper.Xf(); bounds[4] = upper.Yf(); bounds[5] = upper.Zf(); } // FT_Error FTGlyph::Error() const; C_FUN(FT_Error, ftglGetGlyphError, (FTGLglyph *g), return -1, Error, ()); FTGL_END_C_DECLS rgl/src/ext/ftgl/FTGlyph/FTBitmapGlyph.cpp0000644000176000001440000000640512262026246020113 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTBitmapGlyphImpl.h" // // FTGLBitmapGlyph // FTBitmapGlyph::FTBitmapGlyph(FT_GlyphSlot glyph) : FTGlyph(new FTBitmapGlyphImpl(glyph)) {} FTBitmapGlyph::~FTBitmapGlyph() {} const FTPoint& FTBitmapGlyph::Render(const FTPoint& pen, int renderMode) { FTBitmapGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLBitmapGlyphImpl // FTBitmapGlyphImpl::FTBitmapGlyphImpl(FT_GlyphSlot glyph) : FTGlyphImpl(glyph), destWidth(0), destHeight(0), data(0) { err = FT_Render_Glyph(glyph, FT_RENDER_MODE_MONO); if(err || ft_glyph_format_bitmap != glyph->format) { return; } FT_Bitmap bitmap = glyph->bitmap; unsigned int srcWidth = bitmap.width; unsigned int srcHeight = bitmap.rows; unsigned int srcPitch = bitmap.pitch; destWidth = srcWidth; destHeight = srcHeight; destPitch = srcPitch; if(destWidth && destHeight) { data = new unsigned char[destPitch * destHeight]; unsigned char* dest = data + ((destHeight - 1) * destPitch); unsigned char* src = bitmap.buffer; for(unsigned int y = 0; y < srcHeight; ++y) { memcpy(dest, src, srcPitch); dest -= destPitch; src += srcPitch; } } pos = FTPoint(glyph->bitmap_left, static_cast(srcHeight) - glyph->bitmap_top, 0.0); } FTBitmapGlyphImpl::~FTBitmapGlyphImpl() { delete [] data; } const FTPoint& FTBitmapGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { if(data) { float dx, dy; dx = pen.Xf() + pos.Xf(); dy = pen.Yf() - pos.Yf(); glBitmap(0, 0, 0.0f, 0.0f, dx, dy, (const GLubyte*)0); glPixelStorei(GL_UNPACK_ROW_LENGTH, destPitch * 8); glBitmap(destWidth, destHeight, 0.0f, 0.0, 0.0, 0.0, (const GLubyte*)data); glBitmap(0, 0, 0.0f, 0.0f, -dx, -dy, (const GLubyte*)0); } return advance; } rgl/src/ext/ftgl/FTGlyph/FTExtrudeGlyph.cpp0000644000176000001440000001631312262026246020316 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTExtrudeGlyphImpl.h" #include "FTVectoriser.h" // // FTGLExtrudeGlyph // FTExtrudeGlyph::FTExtrudeGlyph(FT_GlyphSlot glyph, float depth, float frontOutset, float backOutset, bool useDisplayList) : FTGlyph(new FTExtrudeGlyphImpl(glyph, depth, frontOutset, backOutset, useDisplayList)) {} FTExtrudeGlyph::~FTExtrudeGlyph() {} const FTPoint& FTExtrudeGlyph::Render(const FTPoint& pen, int renderMode) { FTExtrudeGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLExtrudeGlyphImpl // FTExtrudeGlyphImpl::FTExtrudeGlyphImpl(FT_GlyphSlot glyph, float _depth, float _frontOutset, float _backOutset, bool useDisplayList) : FTGlyphImpl(glyph), vectoriser(0), glList(0) { bBox.SetDepth(-_depth); if(ft_glyph_format_outline != glyph->format) { err = 0x14; // Invalid_Outline return; } vectoriser = new FTVectoriser(glyph); if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) { delete vectoriser; vectoriser = NULL; return; } hscale = glyph->face->size->metrics.x_ppem * 64; vscale = glyph->face->size->metrics.y_ppem * 64; depth = _depth; frontOutset = _frontOutset; backOutset = _backOutset; if(useDisplayList) { glList = glGenLists(3); /* Front face */ glNewList(glList + 0, GL_COMPILE); RenderFront(); glEndList(); /* Back face */ glNewList(glList + 1, GL_COMPILE); RenderBack(); glEndList(); /* Side face */ glNewList(glList + 2, GL_COMPILE); RenderSide(); glEndList(); delete vectoriser; vectoriser = NULL; } } FTExtrudeGlyphImpl::~FTExtrudeGlyphImpl() { if(glList) { glDeleteLists(glList, 3); } else if(vectoriser) { delete vectoriser; } } const FTPoint& FTExtrudeGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); if(glList) { if(renderMode & FTGL::RENDER_FRONT) glCallList(glList + 0); if(renderMode & FTGL::RENDER_BACK) glCallList(glList + 1); if(renderMode & FTGL::RENDER_SIDE) glCallList(glList + 2); } else if(vectoriser) { if(renderMode & FTGL::RENDER_FRONT) RenderFront(); if(renderMode & FTGL::RENDER_BACK) RenderBack(); if(renderMode & FTGL::RENDER_SIDE) RenderSide(); } glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); return advance; } void FTExtrudeGlyphImpl::RenderFront() { vectoriser->MakeMesh(1.0, 1, frontOutset); glNormal3d(0.0, 0.0, 1.0); const FTMesh *mesh = vectoriser->GetMesh(); for(unsigned int j = 0; j < mesh->TesselationCount(); ++j) { const FTTesselation* subMesh = mesh->Tesselation(j); unsigned int polygonType = subMesh->PolygonType(); glBegin(polygonType); for(unsigned int i = 0; i < subMesh->PointCount(); ++i) { FTPoint pt = subMesh->Point(i); glTexCoord2f(pt.Xf() / hscale, pt.Yf() / vscale); glVertex3f(pt.Xf() / 64.0f, pt.Yf() / 64.0f, 0.0f); } glEnd(); } } void FTExtrudeGlyphImpl::RenderBack() { vectoriser->MakeMesh(-1.0, 2, backOutset); glNormal3d(0.0, 0.0, -1.0); const FTMesh *mesh = vectoriser->GetMesh(); for(unsigned int j = 0; j < mesh->TesselationCount(); ++j) { const FTTesselation* subMesh = mesh->Tesselation(j); unsigned int polygonType = subMesh->PolygonType(); glBegin(polygonType); for(unsigned int i = 0; i < subMesh->PointCount(); ++i) { FTPoint pt = subMesh->Point(i); glTexCoord2f(subMesh->Point(i).Xf() / hscale, subMesh->Point(i).Yf() / vscale); glVertex3f(subMesh->Point(i).Xf() / 64.0f, subMesh->Point(i).Yf() / 64.0f, -depth); } glEnd(); } } void FTExtrudeGlyphImpl::RenderSide() { int contourFlag = vectoriser->ContourFlag(); for(size_t c = 0; c < vectoriser->ContourCount(); ++c) { const FTContour* contour = vectoriser->Contour(c); size_t n = contour->PointCount(); if(n < 2) { continue; } glBegin(GL_QUAD_STRIP); for(size_t j = 0; j <= n; ++j) { size_t cur = (j == n) ? 0 : j; size_t next = (cur == n - 1) ? 0 : cur + 1; FTPoint frontPt = contour->FrontPoint(cur); FTPoint nextPt = contour->FrontPoint(next); FTPoint backPt = contour->BackPoint(cur); FTPoint normal = FTPoint(0.f, 0.f, 1.f) ^ (frontPt - nextPt); if(normal != FTPoint(0.0f, 0.0f, 0.0f)) { glNormal3dv(static_cast(normal.Normalise())); } glTexCoord2f(frontPt.Xf() / hscale, frontPt.Yf() / vscale); if(contourFlag & ft_outline_reverse_fill) { glVertex3f(backPt.Xf() / 64.0f, backPt.Yf() / 64.0f, 0.0f); glVertex3f(frontPt.Xf() / 64.0f, frontPt.Yf() / 64.0f, -depth); } else { glVertex3f(backPt.Xf() / 64.0f, backPt.Yf() / 64.0f, -depth); glVertex3f(frontPt.Xf() / 64.0f, frontPt.Yf() / 64.0f, 0.0f); } } glEnd(); } } rgl/src/ext/ftgl/FTGlyph/FTPolygonGlyphImpl.h0000644000176000001440000000377212262026246020621 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTPolygonGlyphImpl__ #define __FTPolygonGlyphImpl__ #include "FTGlyphImpl.h" class FTVectoriser; class FTPolygonGlyphImpl : public FTGlyphImpl { friend class FTPolygonGlyph; public: FTPolygonGlyphImpl(FT_GlyphSlot glyph, float outset, bool useDisplayList); virtual ~FTPolygonGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * Private rendering method. */ void DoRender(); /** * Private rendering variables. */ unsigned int hscale, vscale; FTVectoriser *vectoriser; float outset; /** * OpenGL display list */ GLuint glList; }; #endif // __FTPolygonGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTGlyphImpl.h0000644000176000001440000000354012262026246017242 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTGlyphImpl__ #define __FTGlyphImpl__ #include "FTGL/ftgl.h" class FTGlyphImpl { friend class FTGlyph; protected: FTGlyphImpl(FT_GlyphSlot glyph, bool useDisplayList = true); virtual ~FTGlyphImpl(); float Advance() const; const FTBBox& BBox() const; FT_Error Error() const; /** * The advance distance for this glyph */ FTPoint advance; /** * The bounding box of this glyph. */ FTBBox bBox; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTTextureGlyph.cpp0000644000176000001440000001034612262026246020336 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTTextureGlyphImpl.h" // // FTGLTextureGlyph // FTTextureGlyph::FTTextureGlyph(FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height) : FTGlyph(new FTTextureGlyphImpl(glyph, id, xOffset, yOffset, width, height)) {} FTTextureGlyph::~FTTextureGlyph() {} const FTPoint& FTTextureGlyph::Render(const FTPoint& pen, int renderMode) { FTTextureGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLTextureGlyphImpl // GLint FTTextureGlyphImpl::activeTextureID = 0; FTTextureGlyphImpl::FTTextureGlyphImpl(FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height) : FTGlyphImpl(glyph), destWidth(0), destHeight(0), glTextureID(id) { /* FIXME: need to propagate the render mode all the way down to * here in order to get FT_RENDER_MODE_MONO aliased fonts. */ err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); if(err || glyph->format != ft_glyph_format_bitmap) { return; } FT_Bitmap bitmap = glyph->bitmap; destWidth = bitmap.width; destHeight = bitmap.rows; if(destWidth && destHeight) { glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBindTexture(GL_TEXTURE_2D, glTextureID); glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, destWidth, destHeight, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer); glPopClientAttrib(); } // 0 // +----+ // | | // | | // | | // +----+ // 1 uv[0].X(static_cast(xOffset) / static_cast(width)); uv[0].Y(static_cast(yOffset) / static_cast(height)); uv[1].X(static_cast(xOffset + destWidth) / static_cast(width)); uv[1].Y(static_cast(yOffset + destHeight) / static_cast(height)); corner = FTPoint(glyph->bitmap_left, glyph->bitmap_top); } FTTextureGlyphImpl::~FTTextureGlyphImpl() {} const FTPoint& FTTextureGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { float dx, dy; if(activeTextureID != glTextureID) { glBindTexture(GL_TEXTURE_2D, (GLuint)glTextureID); activeTextureID = glTextureID; } dx = floor(pen.Xf() + corner.Xf()); dy = floor(pen.Yf() + corner.Yf()); glBegin(GL_QUADS); glTexCoord2f(uv[0].Xf(), uv[0].Yf()); glVertex2f(dx, dy); glTexCoord2f(uv[0].Xf(), uv[1].Yf()); glVertex2f(dx, dy - destHeight); glTexCoord2f(uv[1].Xf(), uv[1].Yf()); glVertex2f(dx + destWidth, dy - destHeight); glTexCoord2f(uv[1].Xf(), uv[0].Yf()); glVertex2f(dx + destWidth, dy); glEnd(); return advance; } rgl/src/ext/ftgl/FTGlyph/FTTextureGlyphImpl.h0000644000176000001440000000537712262026246020635 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTTextureGlyphImpl__ #define __FTTextureGlyphImpl__ #include "FTGlyphImpl.h" class FTTextureGlyphImpl : public FTGlyphImpl { friend class FTTextureGlyph; friend class FTTextureFontImpl; protected: FTTextureGlyphImpl(FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height); virtual ~FTTextureGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * Reset the currently active texture to zero to get into a known * state before drawing a string. This is to get round possible * threading issues. */ static void ResetActiveTexture() { activeTextureID = 0; } /** * The width of the glyph 'image' */ int destWidth; /** * The height of the glyph 'image' */ int destHeight; /** * Vector from the pen position to the topleft corner of the pixmap */ FTPoint corner; /** * The texture co-ords of this glyph within the texture. */ FTPoint uv[2]; /** * The texture index that this glyph is contained in. */ int glTextureID; /** * The texture index of the currently active texture * * We keep track of the currently active texture to try to reduce the * number of texture bind operations. */ static GLint activeTextureID; }; #endif // __FTTextureGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTBufferGlyph.cpp0000644000176000001440000000625712262026246020115 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTBufferGlyphImpl.h" // // FTGLBufferGlyph // FTBufferGlyph::FTBufferGlyph(FT_GlyphSlot glyph, FTBuffer *buffer) : FTGlyph(new FTBufferGlyphImpl(glyph, buffer)) {} FTBufferGlyph::~FTBufferGlyph() {} const FTPoint& FTBufferGlyph::Render(const FTPoint& pen, int renderMode) { FTBufferGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLBufferGlyphImpl // FTBufferGlyphImpl::FTBufferGlyphImpl(FT_GlyphSlot glyph, FTBuffer *p) : FTGlyphImpl(glyph), has_bitmap(false), buffer(p) { err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); if(err || glyph->format != ft_glyph_format_bitmap) { return; } bitmap = glyph->bitmap; pixels = new unsigned char[bitmap.pitch * bitmap.rows]; memcpy(pixels, bitmap.buffer, bitmap.pitch * bitmap.rows); if(bitmap.width && bitmap.rows) { has_bitmap = true; corner = FTPoint(glyph->bitmap_left, glyph->bitmap_top); } } FTBufferGlyphImpl::~FTBufferGlyphImpl() { delete[] pixels; } const FTPoint& FTBufferGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { if(has_bitmap) { FTPoint pos(buffer->Pos() + pen + corner); int dx = (int)(pos.Xf() + 0.5f); int dy = buffer->Height() - (int)(pos.Yf() + 0.5f); unsigned char * dest = buffer->Pixels() + dx + dy * buffer->Width(); for(int y = 0; y < bitmap.rows; y++) { // FIXME: change the loop bounds instead of doing this test if(y + dy < 0 || y + dy >= buffer->Height()) continue; for(int x = 0; x < bitmap.width; x++) { if(x + dx < 0 || x + dx >= buffer->Width()) continue; unsigned char p = pixels[y * bitmap.pitch + x]; if(p) { dest[y * buffer->Width() + x] = p; } } } } return advance; } rgl/src/ext/ftgl/FTGlyph/FTOutlineGlyphImpl.h0000644000176000001440000000403012262026246020575 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTOutlineGlyphImpl__ #define __FTOutlineGlyphImpl__ #include "FTGlyphImpl.h" class FTVectoriser; class FTOutlineGlyphImpl : public FTGlyphImpl { friend class FTOutlineGlyph; protected: FTOutlineGlyphImpl(FT_GlyphSlot glyph, float outset, bool useDisplayList); virtual ~FTOutlineGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * Private rendering method. */ void DoRender(); /** * Private rendering variables. */ FTVectoriser *vectoriser; /** * Private rendering variables. */ float outset; /** * OpenGL display list */ GLuint glList; }; #endif // __FTOutlineGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTExtrudeGlyphImpl.h0000644000176000001440000000420112262026246020576 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTExtrudeGlyphImpl__ #define __FTExtrudeGlyphImpl__ #include "FTGlyphImpl.h" class FTVectoriser; class FTExtrudeGlyphImpl : public FTGlyphImpl { friend class FTExtrudeGlyph; protected: FTExtrudeGlyphImpl(FT_GlyphSlot glyph, float depth, float frontOutset, float backOutset, bool useDisplayList); virtual ~FTExtrudeGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: /** * Private rendering methods. */ void RenderFront(); void RenderBack(); void RenderSide(); /** * Private rendering variables. */ unsigned int hscale, vscale; float depth; float frontOutset, backOutset; FTVectoriser *vectoriser; /** * OpenGL display list */ GLuint glList; }; #endif // __FTExtrudeGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTGlyph.cpp0000644000176000001440000000423412262026246016754 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTGlyphImpl.h" // // FTGlyph // FTGlyph::FTGlyph(FT_GlyphSlot glyph) { impl = new FTGlyphImpl(glyph); } FTGlyph::FTGlyph(FTGlyphImpl *pImpl) { impl = pImpl; } FTGlyph::~FTGlyph() { delete impl; } float FTGlyph::Advance() const { return impl->Advance(); } const FTBBox& FTGlyph::BBox() const { return impl->BBox(); } FT_Error FTGlyph::Error() const { return impl->Error(); } // // FTGlyphImpl // FTGlyphImpl::FTGlyphImpl(FT_GlyphSlot glyph, bool useList) : err(0) { if(glyph) { bBox = FTBBox(glyph); advance = FTPoint(glyph->advance.x / 64.0f, glyph->advance.y / 64.0f); } } FTGlyphImpl::~FTGlyphImpl() {} float FTGlyphImpl::Advance() const { return advance.Xf(); } const FTBBox& FTGlyphImpl::BBox() const { return bBox; } FT_Error FTGlyphImpl::Error() const { return err; } rgl/src/ext/ftgl/FTGlyph/FTBufferGlyphImpl.h0000644000176000001440000000326212262026246020375 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTBufferGlyphImpl__ #define __FTBufferGlyphImpl__ #include "FTGlyphImpl.h" class FTBufferGlyphImpl : public FTGlyphImpl { friend class FTBufferGlyph; protected: FTBufferGlyphImpl(FT_GlyphSlot glyph, FTBuffer *p); virtual ~FTBufferGlyphImpl(); virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); private: bool has_bitmap; FT_Bitmap bitmap; unsigned char *pixels; FTPoint corner; FTBuffer *buffer; }; #endif // __FTBufferGlyphImpl__ rgl/src/ext/ftgl/FTGlyph/FTPixmapGlyph.cpp0000644000176000001440000000676712262026246020150 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTPixmapGlyphImpl.h" // // FTGLPixmapGlyph // FTPixmapGlyph::FTPixmapGlyph(FT_GlyphSlot glyph) : FTGlyph(new FTPixmapGlyphImpl(glyph)) {} FTPixmapGlyph::~FTPixmapGlyph() {} const FTPoint& FTPixmapGlyph::Render(const FTPoint& pen, int renderMode) { FTPixmapGlyphImpl *myimpl = dynamic_cast(impl); return myimpl->RenderImpl(pen, renderMode); } // // FTGLPixmapGlyphImpl // FTPixmapGlyphImpl::FTPixmapGlyphImpl(FT_GlyphSlot glyph) : FTGlyphImpl(glyph), destWidth(0), destHeight(0), data(0) { err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); if(err || ft_glyph_format_bitmap != glyph->format) { return; } FT_Bitmap bitmap = glyph->bitmap; //check the pixel mode //ft_pixel_mode_grays int srcWidth = bitmap.width; int srcHeight = bitmap.rows; destWidth = srcWidth; destHeight = srcHeight; if(destWidth && destHeight) { data = new unsigned char[destWidth * destHeight * 2]; unsigned char* src = bitmap.buffer; unsigned char* dest = data + ((destHeight - 1) * destWidth * 2); size_t destStep = destWidth * 2 * 2; for(int y = 0; y < srcHeight; ++y) { for(int x = 0; x < srcWidth; ++x) { *dest++ = static_cast(255); *dest++ = *src++; } dest -= destStep; } destHeight = srcHeight; } pos.X(glyph->bitmap_left); pos.Y(srcHeight - glyph->bitmap_top); } FTPixmapGlyphImpl::~FTPixmapGlyphImpl() { delete [] data; } const FTPoint& FTPixmapGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) { if(data) { float dx, dy; dx = floor(pen.Xf() + pos.Xf()); dy = floor(pen.Yf() - pos.Yf()); glBitmap(0, 0, 0.0f, 0.0f, dx, dy, (const GLubyte*)0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_ALIGNMENT, 2); glDrawPixels(destWidth, destHeight, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, (const GLvoid*)data); glBitmap(0, 0, 0.0f, 0.0f, -dx, -dy, (const GLubyte*)0); } return advance; } rgl/src/ext/ftgl/FTLayout/0000755000176000001440000000000012100313501015102 5ustar ripleyusersrgl/src/ext/ftgl/FTLayout/FTSimpleLayoutImpl.h0000644000176000001440000002311312262026246020776 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTSimpleLayoutImpl__ #define __FTSimpleLayoutImpl__ #include "FTLayoutImpl.h" class FTFont; class FTSimpleLayoutImpl : public FTLayoutImpl { friend class FTSimpleLayout; protected: FTSimpleLayoutImpl(); virtual ~FTSimpleLayoutImpl() {}; virtual FTBBox BBox(const char* string, const int len, FTPoint position); virtual FTBBox BBox(const wchar_t* string, const int len, FTPoint position); virtual void Render(const char *string, const int len, FTPoint position, int renderMode); virtual void Render(const wchar_t *string, const int len, FTPoint position, int renderMode); /** * Render a string of characters and distribute extra space amongst * the whitespace regions of the string. * * @param string A buffer of wchar_t characters to output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param extraSpace The amount of extra space to distribute amongst * the characters. */ virtual void RenderSpace(const char *string, const int len, FTPoint position, int renderMode, const float extraSpace); /** * Render a string of characters and distribute extra space amongst * the whitespace regions of the string. * * @param string A buffer of wchar_t characters to output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param extraSpace The amount of extra space to distribute amongst * the characters. */ virtual void RenderSpace(const wchar_t *string, const int len, FTPoint position, int renderMode, const float extraSpace); private: /** * Either render a string of characters and wrap lines * longer than a threshold or compute the bounds * of a string of characters when wrapped. The functionality * of this method is exposed by the BBoxWrapped and * RenderWrapped methods. * * @param buf A char string to output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param bounds A pointer to a bounds object. If non null * the bounds of the text when laid out * will be stored in bounds. If null the * text will be rendered. */ virtual void WrapText(const char *buf, const int len, FTPoint position, int renderMode, FTBBox *bounds); /** * Either render a string of characters and wrap lines * longer than a threshold or compute the bounds * of a string of characters when wrapped. The functionality * of this method is exposed by the BBoxWrapped and * RenderWrapped methods. * * @param buf A wchar_t style string to output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param bounds A pointer to a bounds object. If non null * the bounds of the text when laid out * will be stored in bounds. If null the * text will be rendered. */ virtual void WrapText(const wchar_t *buf, const int len, FTPoint position, int renderMode, FTBBox *bounds); /** * A helper method used by WrapText to either output the text or * compute it's bounds. * * @param buf A pointer to an array of character data. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param RemainingWidth The amount of extra space left on the line. * @param bounds A pointer to a bounds object. If non null the * bounds will be initialized or expanded by the * bounds of the line. If null the text will be * rendered. If the bounds are invalid (lower > upper) * they will be initialized. Otherwise they * will be expanded. */ void OutputWrapped(const char *buf, const int len, FTPoint position, int renderMode, const float RemainingWidth, FTBBox *bounds); /** * A helper method used by WrapText to either output the text or * compute it's bounds. * * @param buf A pointer to an array of character data. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered. * @param position TODO * @param renderMode Render mode to display * @param RemainingWidth The amount of extra space left on the line. * @param bounds A pointer to a bounds object. If non null the * bounds will be initialized or expanded by the * bounds of the line. If null the text will be * rendered. If the bounds are invalid (lower > upper) * they will be initialized. Otherwise they * will be expanded. */ void OutputWrapped(const wchar_t *buf, const int len, FTPoint position, int renderMode, const float RemainingWidth, FTBBox *bounds); /** * The font to use for rendering the text. The font is * referenced by this but will not be disposed of when this * is deleted. */ FTFont *currentFont; /** * The maximum line length for formatting text. */ float lineLength; /** * The text alignment mode used to distribute * space within a line or rendered text. */ FTGL::TextAlignment alignment; /** * The height of each line of text expressed as * a percentage of the font's line height. */ float lineSpacing; /* Internal generic BBox() implementation */ template inline FTBBox BBoxI(const T* string, const int len, FTPoint position); /* Internal generic Render() implementation */ template inline void RenderI(const T* string, const int len, FTPoint position, int renderMode); /* Internal generic RenderSpace() implementation */ template inline void RenderSpaceI(const T* string, const int len, FTPoint position, int renderMode, const float extraSpace); /* Internal generic WrapText() implementation */ template void WrapTextI(const T* buf, const int len, FTPoint position, int renderMode, FTBBox *bounds); /* Internal generic OutputWrapped() implementation */ template void OutputWrappedI(const T* buf, const int len, FTPoint position, int renderMode, const float RemainingWidth, FTBBox *bounds); }; #endif // __FTSimpleLayoutImpl__ rgl/src/ext/ftgl/FTLayout/FTLayoutGlue.cpp0000644000176000001440000001255112262026246020156 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTInternals.h" static const FTBBox static_ftbbox; FTGL_BEGIN_C_DECLS #define C_TOR(cname, cargs, cxxname, cxxarg, cxxtype) \ FTGLlayout* cname cargs \ { \ cxxname *l = new cxxname cxxarg; \ if(l->Error()) \ { \ delete l; \ return NULL; \ } \ FTGLlayout *ftgl = (FTGLlayout *)malloc(sizeof(FTGLlayout)); \ ftgl->ptr = l; \ ftgl->type = cxxtype; \ return ftgl; \ } // FTSimpleLayout::FTSimpleLayout(); C_TOR(ftglCreateSimpleLayout, (), FTSimpleLayout, (), LAYOUT_SIMPLE); #define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ cret cname cargs \ { \ if(!l || !l->ptr) \ { \ fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ cxxerr; \ } \ return l->ptr->cxxname cxxarg; \ } // FTLayout::~FTLayout(); void ftglDestroyLayout(FTGLlayout *l) { if(!l || !l->ptr) { fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); return; } delete l->ptr; free(l); } // virtual FTBBox FTLayout::BBox(const char* string) extern "C++" { C_FUN(static FTBBox, _ftgGetlLayoutBBox, (FTGLlayout *l, const char *s), return static_ftbbox, BBox, (s)); } void ftgGetlLayoutBBox(FTGLlayout *l, const char * s, float c[6]) { FTBBox ret = _ftgGetlLayoutBBox(l, s); FTPoint lower = ret.Lower(), upper = ret.Upper(); c[0] = lower.Xf(); c[1] = lower.Yf(); c[2] = lower.Zf(); c[3] = upper.Xf(); c[4] = upper.Yf(); c[5] = upper.Zf(); } // virtual void FTLayout::Render(const char* string, int renderMode); C_FUN(void, ftglRenderLayout, (FTGLlayout *l, const char *s, int r), return, Render, (s, r)); // FT_Error FTLayout::Error() const; C_FUN(FT_Error, ftglGetLayoutError, (FTGLlayout *l), return -1, Error, ()); // void FTSimpleLayout::SetFont(FTFont *fontInit) void ftglSetLayoutFont(FTGLlayout *l, FTGLfont *font) { if(!l || !l->ptr) { fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); return; } if(l->type != FTGL::LAYOUT_SIMPLE) { fprintf(stderr, "FTGL warning: %s not implemented for %d\n", __FUNCTION__, l->type); } l->font = font; return dynamic_cast(l->ptr)->SetFont(font->ptr); } // FTFont *FTSimpleLayout::GetFont() FTGLfont *ftglGetLayoutFont(FTGLlayout *l) { if(!l || !l->ptr) { fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); return NULL; } if(l->type != FTGL::LAYOUT_SIMPLE) { fprintf(stderr, "FTGL warning: %s not implemented for %d\n", __FUNCTION__, l->type); } return l->font; } #undef C_FUN #define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ cret cname cargs \ { \ if(!l || !l->ptr) \ { \ fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ cxxerr; \ } \ if(l->type != FTGL::LAYOUT_SIMPLE) \ { \ fprintf(stderr, "FTGL warning: %s not implemented for %d\n", \ __FUNCTION__, l->type); \ cxxerr; \ } \ return dynamic_cast(l->ptr)->cxxname cxxarg; \ } // void FTSimpleLayout::SetLineLength(const float LineLength); C_FUN(void, ftglSetLayoutLineLength, (FTGLlayout *l, const float length), return, SetLineLength, (length)); // float FTSimpleLayout::GetLineLength() const C_FUN(float, ftglGetLayoutLineLength, (FTGLlayout *l), return 0.0f, GetLineLength, ()); // void FTSimpleLayout::SetAlignment(const TextAlignment Alignment) C_FUN(void, ftglSetLayoutAlignment, (FTGLlayout *l, const int a), return, SetAlignment, ((FTGL::TextAlignment)a)); // TextAlignment FTSimpleLayout::GetAlignment() const C_FUN(int, ftglGetLayoutAlignement, (FTGLlayout *l), return FTGL::ALIGN_LEFT, GetAlignment, ()); // void FTSimpleLayout::SetLineSpacing(const float LineSpacing) C_FUN(void, ftglSetLayoutLineSpacing, (FTGLlayout *l, const float f), return, SetLineSpacing, (f)); FTGL_END_C_DECLS rgl/src/ext/ftgl/FTLayout/FTLayoutImpl.h0000644000176000001440000000324112262026246017624 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTLayoutImpl__ #define __FTLayoutImpl__ #include "FTSize.h" #include "FTGlyphContainer.h" class FTLayoutImpl { friend class FTLayout; protected: FTLayoutImpl(); virtual ~FTLayoutImpl(); protected: /** * Current pen or cursor position; */ FTPoint pen; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTLayoutImpl__ rgl/src/ext/ftgl/FTLayout/FTSimpleLayout.cpp0000644000176000001440000003411412262026246020512 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include #include "FTInternals.h" #include "FTUnicode.h" #include "FTGlyphContainer.h" #include "FTSimpleLayoutImpl.h" // // FTSimpleLayout // FTSimpleLayout::FTSimpleLayout() : FTLayout(new FTSimpleLayoutImpl()) {} FTSimpleLayout::~FTSimpleLayout() {} FTBBox FTSimpleLayout::BBox(const char *string, const int len, FTPoint pos) { return dynamic_cast(impl)->BBox(string, len, pos); } FTBBox FTSimpleLayout::BBox(const wchar_t *string, const int len, FTPoint pos) { return dynamic_cast(impl)->BBox(string, len, pos); } void FTSimpleLayout::Render(const char *string, const int len, FTPoint pos, int renderMode) { return dynamic_cast(impl)->Render(string, len, pos, renderMode); } void FTSimpleLayout::Render(const wchar_t* string, const int len, FTPoint pos, int renderMode) { return dynamic_cast(impl)->Render(string, len, pos, renderMode); } void FTSimpleLayout::SetFont(FTFont *fontInit) { dynamic_cast(impl)->currentFont = fontInit; } FTFont *FTSimpleLayout::GetFont() { return dynamic_cast(impl)->currentFont; } void FTSimpleLayout::SetLineLength(const float LineLength) { dynamic_cast(impl)->lineLength = LineLength; } float FTSimpleLayout::GetLineLength() const { return dynamic_cast(impl)->lineLength; } void FTSimpleLayout::SetAlignment(const FTGL::TextAlignment Alignment) { dynamic_cast(impl)->alignment = Alignment; } FTGL::TextAlignment FTSimpleLayout::GetAlignment() const { return dynamic_cast(impl)->alignment; } void FTSimpleLayout::SetLineSpacing(const float LineSpacing) { dynamic_cast(impl)->lineSpacing = LineSpacing; } float FTSimpleLayout::GetLineSpacing() const { return dynamic_cast(impl)->lineSpacing; } // // FTSimpleLayoutImpl // FTSimpleLayoutImpl::FTSimpleLayoutImpl() { currentFont = NULL; lineLength = 100.0f; alignment = FTGL::ALIGN_LEFT; lineSpacing = 1.0f; } template inline FTBBox FTSimpleLayoutImpl::BBoxI(const T* string, const int len, FTPoint position) { FTBBox tmp; WrapText(string, len, position, 0, &tmp); return tmp; } FTBBox FTSimpleLayoutImpl::BBox(const char *string, const int len, FTPoint position) { return BBoxI(string, len, position); } FTBBox FTSimpleLayoutImpl::BBox(const wchar_t *string, const int len, FTPoint position) { return BBoxI(string, len, position); } template inline void FTSimpleLayoutImpl::RenderI(const T *string, const int len, FTPoint position, int renderMode) { pen = FTPoint(0.0f, 0.0f); WrapText(string, len, position, renderMode, NULL); } void FTSimpleLayoutImpl::Render(const char *string, const int len, FTPoint position, int renderMode) { RenderI(string, len, position, renderMode); } void FTSimpleLayoutImpl::Render(const wchar_t* string, const int len, FTPoint position, int renderMode) { RenderI(string, len, position, renderMode); } template inline void FTSimpleLayoutImpl::WrapTextI(const T *buf, const int len, FTPoint position, int renderMode, FTBBox *bounds) { FTUnicodeStringItr breakItr(buf); // points to the last break character FTUnicodeStringItr lineStart(buf); // points to the line start float nextStart = 0.0; // total width of the current line float breakWidth = 0.0; // width of the line up to the last word break float currentWidth = 0.0; // width of all characters on the current line float prevWidth; // width of all characters but the current glyph float wordLength = 0.0; // length of the block since the last break char int charCount = 0; // number of characters so far on the line int breakCharCount = 0; // number of characters before the breakItr float glyphWidth, advance; FTBBox glyphBounds; // Reset the pen position pen.Y(0); // If we have bounds mark them invalid if(bounds) { bounds->Invalidate(); } // Scan the input for all characters that need output FTUnicodeStringItr prevItr(buf); for (FTUnicodeStringItr itr(buf); *itr; prevItr = itr++, charCount++) { // Find the width of the current glyph glyphBounds = currentFont->BBox(itr.getBufferFromHere(), 1); glyphWidth = glyphBounds.Upper().Xf() - glyphBounds.Lower().Xf(); advance = currentFont->Advance(itr.getBufferFromHere(), 1); prevWidth = currentWidth; // Compute the width of all glyphs up to the end of buf[i] currentWidth = nextStart + glyphWidth; // Compute the position of the next glyph nextStart += advance; // See if the current character is a space, a break or a regular character if((currentWidth > lineLength) || (*itr == '\n')) { // A non whitespace character has exceeded the line length. Or a // newline character has forced a line break. Output the last // line and start a new line after the break character. // If we have not yet found a break, break on the last character if(breakItr == lineStart || (*itr == '\n')) { // Break on the previous character breakItr = prevItr; breakCharCount = charCount - 1; breakWidth = prevWidth; // None of the previous words will be carried to the next line wordLength = 0; // If the current character is a newline discard its advance if(*itr == '\n') advance = 0; } float remainingWidth = lineLength - breakWidth; // Render the current substring FTUnicodeStringItr breakChar = breakItr; // move past the break character and don't count it on the next line either ++breakChar; --charCount; // If the break character is a newline do not render it if(*breakChar == '\n') { ++breakChar; --charCount; } OutputWrapped(lineStart.getBufferFromHere(), breakCharCount, //breakItr.getBufferFromHere() - lineStart.getBufferFromHere(), position, renderMode, remainingWidth, bounds); // Store the start of the next line lineStart = breakChar; // TODO: Is Height() the right value here? pen -= FTPoint(0, currentFont->LineHeight() * lineSpacing); // The current width is the width since the last break nextStart = wordLength + advance; wordLength += advance; currentWidth = wordLength + advance; // Reset the safe break for the next line breakItr = lineStart; charCount -= breakCharCount; } else if(iswspace(*itr)) { // This is the last word break position wordLength = 0; breakItr = itr; breakCharCount = charCount; // Check to see if this is the first whitespace character in a run if(buf == itr.getBufferFromHere() || !iswspace(*prevItr)) { // Record the width of the start of the block breakWidth = currentWidth; } } else { wordLength += advance; } } float remainingWidth = lineLength - currentWidth; // Render any remaining text on the last line // Disable justification for the last row if(alignment == FTGL::ALIGN_JUSTIFY) { alignment = FTGL::ALIGN_LEFT; OutputWrapped(lineStart.getBufferFromHere(), -1, position, renderMode, remainingWidth, bounds); alignment = FTGL::ALIGN_JUSTIFY; } else { OutputWrapped(lineStart.getBufferFromHere(), -1, position, renderMode, remainingWidth, bounds); } } void FTSimpleLayoutImpl::WrapText(const char *buf, const int len, FTPoint position, int renderMode, FTBBox *bounds) { WrapTextI(buf, len, position, renderMode, bounds); } void FTSimpleLayoutImpl::WrapText(const wchar_t* buf, const int len, FTPoint position, int renderMode, FTBBox *bounds) { WrapTextI(buf, len, position, renderMode, bounds); } template inline void FTSimpleLayoutImpl::OutputWrappedI(const T *buf, const int len, FTPoint position, int renderMode, const float remaining, FTBBox *bounds) { float distributeWidth = 0.0; // Align the text according as specified by Alignment switch (alignment) { case FTGL::ALIGN_LEFT: pen.X(0); break; case FTGL::ALIGN_CENTER: pen.X(remaining / 2); break; case FTGL::ALIGN_RIGHT: pen.X(remaining); break; case FTGL::ALIGN_JUSTIFY: pen.X(0); distributeWidth = remaining; break; } // If we have bounds expand them by the line's bounds, otherwise render // the line. if(bounds) { FTBBox temp = currentFont->BBox(buf, len); // Add the extra space to the upper x dimension temp = FTBBox(temp.Lower() + pen, temp.Upper() + pen + FTPoint(distributeWidth, 0)); // See if this is the first area to be added to the bounds if(bounds->IsValid()) { *bounds |= temp; } else { *bounds = temp; } } else { RenderSpace(buf, len, position, renderMode, distributeWidth); } } void FTSimpleLayoutImpl::OutputWrapped(const char *buf, const int len, FTPoint position, int renderMode, const float remaining, FTBBox *bounds) { OutputWrappedI(buf, len, position, renderMode, remaining, bounds); } void FTSimpleLayoutImpl::OutputWrapped(const wchar_t *buf, const int len, FTPoint position, int renderMode, const float remaining, FTBBox *bounds) { OutputWrappedI(buf, len, position, renderMode, remaining, bounds); } template inline void FTSimpleLayoutImpl::RenderSpaceI(const T *string, const int len, FTPoint position, int renderMode, const float extraSpace) { float space = 0.0; // If there is space to distribute, count the number of spaces if(extraSpace > 0.0) { int numSpaces = 0; // Count the number of space blocks in the input FTUnicodeStringItr prevItr(string), itr(string); for(int i = 0; ((len < 0) && *itr) || ((len >= 0) && (i <= len)); ++i, prevItr = itr++) { // If this is the end of a space block, increment the counter if((i > 0) && !iswspace(*itr) && iswspace(*prevItr)) { numSpaces++; } } space = extraSpace/numSpaces; } // Output all characters of the string FTUnicodeStringItr prevItr(string), itr(string); for(int i = 0; ((len < 0) && *itr) || ((len >= 0) && (i <= len)); ++i, prevItr = itr++) { // If this is the end of a space block, distribute the extra space // inside it if((i > 0) && !iswspace(*itr) && iswspace(*prevItr)) { pen += FTPoint(space, 0); } pen = currentFont->Render(itr.getBufferFromHere(), 1, pen, FTPoint(), renderMode); } } void FTSimpleLayoutImpl::RenderSpace(const char *string, const int len, FTPoint position, int renderMode, const float extraSpace) { RenderSpaceI(string, len, position, renderMode, extraSpace); } void FTSimpleLayoutImpl::RenderSpace(const wchar_t *string, const int len, FTPoint position, int renderMode, const float extraSpace) { RenderSpaceI(string, len, position, renderMode, extraSpace); } rgl/src/ext/ftgl/FTLayout/FTLayout.cpp0000644000176000001440000000325512262026246017342 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "../FTFont/FTFontImpl.h" #include "./FTLayoutImpl.h" // // FTLayout // FTLayout::FTLayout() { impl = new FTLayoutImpl(); } FTLayout::FTLayout(FTLayoutImpl *pImpl) { impl = pImpl; } FTLayout::~FTLayout() { delete impl; } FT_Error FTLayout::Error() const { return impl->err; } // // FTLayoutImpl // FTLayoutImpl::FTLayoutImpl() : err(0) { ; } FTLayoutImpl::~FTLayoutImpl() { ; } rgl/src/ext/ftgl/FTVector.h0000644000176000001440000001163712262026246015270 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTVector__ #define __FTVector__ #include "FTGL/ftgl.h" /** * Provides a non-STL alternative to the STL vector */ template class FTVector { public: typedef FT_VECTOR_ITEM_TYPE value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef value_type* iterator; typedef const value_type* const_iterator; typedef size_t size_type; FTVector() { Capacity = Size = 0; Items = 0; } virtual ~FTVector() { clear(); } FTVector& operator =(const FTVector& v) { reserve(v.capacity()); iterator ptr = begin(); const_iterator vbegin = v.begin(); const_iterator vend = v.end(); while(vbegin != vend) { *ptr++ = *vbegin++; } Size = v.size(); return *this; } size_type size() const { return Size; } size_type capacity() const { return Capacity; } iterator begin() { return Items; } const_iterator begin() const { return Items; } iterator end() { return begin() + size(); } const_iterator end() const { return begin() + size(); } bool empty() const { return size() == 0; } reference operator [](size_type pos) { return(*(begin() + pos)); } const_reference operator [](size_type pos) const { return *(begin() + pos); } void clear() { if(Capacity) { delete [] Items; Capacity = Size = 0; Items = 0; } } void reserve(size_type n) { if(capacity() < n) { expand(n); } } void push_back(const value_type& x) { if(size() == capacity()) { expand(); } (*this)[size()] = x; ++Size; } void resize(size_type n, value_type x) { if(n == size()) { return; } reserve(n); iterator ibegin, iend; if(n >= Size) { ibegin = this->end(); iend = this->begin() + n; } else { ibegin = this->begin() + n; iend = this->end(); } while(ibegin != iend) { *ibegin++ = x; } Size = n; } private: void expand(size_type capacity_hint = 0) { size_type new_capacity = (capacity() == 0) ? 256 : capacity() * 2; if(capacity_hint) { while(new_capacity < capacity_hint) { new_capacity *= 2; } } value_type *new_items = new value_type[new_capacity]; iterator ibegin = this->begin(); iterator iend = this->end(); value_type *ptr = new_items; while(ibegin != iend) { *ptr++ = *ibegin++; } if(Capacity) { delete [] Items; } Items = new_items; Capacity = new_capacity; } size_type Capacity; size_type Size; value_type* Items; }; #endif // __FTVector__ rgl/src/ext/ftgl/FTSize.cpp0000644000176000001440000000560712262026246015273 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTSize.h" FTSize::FTSize() : ftFace(0), ftSize(0), size(0), xResolution(0), yResolution(0), err(0) {} FTSize::~FTSize() {} bool FTSize::CharSize(FT_Face* face, unsigned int pointSize, unsigned int xRes, unsigned int yRes) { if(size != pointSize || xResolution != xRes || yResolution != yRes) { err = FT_Set_Char_Size(*face, 0L, pointSize * 64, xResolution, yResolution); if(!err) { ftFace = face; size = pointSize; xResolution = xRes; yResolution = yRes; ftSize = (*ftFace)->size; } } return !err; } unsigned int FTSize::CharSize() const { return size; } float FTSize::Ascender() const { return ftSize == 0 ? 0.0f : static_cast(ftSize->metrics.ascender) / 64.0f; } float FTSize::Descender() const { return ftSize == 0 ? 0.0f : static_cast(ftSize->metrics.descender) / 64.0f; } float FTSize::Height() const { if(0 == ftSize) { return 0.0f; } if(FT_IS_SCALABLE((*ftFace))) { return ((*ftFace)->bbox.yMax - (*ftFace)->bbox.yMin) * ((float)ftSize->metrics.y_ppem / (float)(*ftFace)->units_per_EM); } else { return static_cast(ftSize->metrics.height) / 64.0f; } } float FTSize::Width() const { if(0 == ftSize) { return 0.0f; } if(FT_IS_SCALABLE((*ftFace))) { return ((*ftFace)->bbox.xMax - (*ftFace)->bbox.xMin) * (static_cast(ftSize->metrics.x_ppem) / static_cast((*ftFace)->units_per_EM)); } else { return static_cast(ftSize->metrics.max_advance) / 64.0f; } } float FTSize::Underline() const { return 0.0f; } rgl/src/ext/ftgl/FTVectoriser.h0000644000176000001440000001722712262026246016154 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTVectoriser__ #define __FTVectoriser__ #include "FTGL/ftgl.h" #include "FTContour.h" #include "FTList.h" #include "FTVector.h" #ifndef CALLBACK #define CALLBACK #endif /** * FTTesselation captures points that are output by OpenGL's gluTesselator. */ class FTTesselation { public: /** * Default constructor */ FTTesselation(GLenum m) : meshType(m) { pointList.reserve(128); } /** * Destructor */ ~FTTesselation() { pointList.clear(); } /** * Add a point to the mesh. */ void AddPoint(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z) { pointList.push_back(FTPoint(x, y, z)); } /** * The number of points in this mesh */ size_t PointCount() const { return pointList.size(); } /** * */ const FTPoint& Point(unsigned int index) const { return pointList[index]; } /** * Return the OpenGL polygon type. */ GLenum PolygonType() const { return meshType; } private: /** * Points generated by gluTesselator. */ typedef FTVector PointVector; PointVector pointList; /** * OpenGL primitive type from gluTesselator. */ GLenum meshType; }; /** * FTMesh is a container of FTTesselation's that make up a polygon glyph */ class FTMesh { typedef FTVector TesselationVector; typedef FTList PointList; public: /** * Default constructor */ FTMesh(); /** * Destructor */ ~FTMesh(); /** * Add a point to the mesh */ void AddPoint(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z); /** * Create a combine point for the gluTesselator */ const FTGL_DOUBLE* Combine(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z); /** * Begin a new polygon */ void Begin(GLenum meshType); /** * End a polygon */ void End(); /** * Record a gluTesselation error */ void Error(GLenum e) { err = e; } /** * The number of tesselations in the mesh */ size_t TesselationCount() const { return tesselationList.size(); } /** * Get a tesselation by index */ const FTTesselation* const Tesselation(size_t index) const; /** * Return the temporary point list. For testing only. */ const PointList& TempPointList() const { return tempPointList; } /** * Get the GL ERROR returned by the glu tesselator */ GLenum Error() const { return err; } private: /** * The current sub mesh that we are constructing. */ FTTesselation* currentTesselation; /** * Holds each sub mesh that comprises this glyph. */ TesselationVector tesselationList; /** * Holds extra points created by gluTesselator. See ftglCombine. */ PointList tempPointList; /** * GL ERROR returned by the glu tesselator */ GLenum err; }; const FTGL_DOUBLE FTGL_FRONT_FACING = 1.0; const FTGL_DOUBLE FTGL_BACK_FACING = -1.0; /** * FTVectoriser class is a helper class that converts font outlines into * point data. * * @see FTExtrudeGlyph * @see FTOutlineGlyph * @see FTPolygonGlyph * @see FTContour * @see FTPoint * */ class FTVectoriser { public: /** * Constructor * * @param glyph The freetype glyph to be processed */ FTVectoriser(const FT_GlyphSlot glyph); /** * Destructor */ virtual ~FTVectoriser(); /** * Build an FTMesh from the vector outline data. * * @param zNormal The direction of the z axis of the normal * for this mesh * FIXME: change the following for a constant * @param outsetType Specify the outset type contour * 0 : Original * 1 : Front * 2 : Back * @param outsetSize Specify the outset size contour */ void MakeMesh(FTGL_DOUBLE zNormal = FTGL_FRONT_FACING, int outsetType = 0, float outsetSize = 0.0f); /** * Get the current mesh. */ const FTMesh* const GetMesh() const { return mesh; } /** * Get the total count of points in this outline * * @return the number of points */ size_t PointCount(); /** * Get the count of contours in this outline * * @return the number of contours */ size_t ContourCount() const { return ftContourCount; } /** * Return a contour at index * * @return the number of contours */ const FTContour* const Contour(size_t index) const; /** * Get the number of points in a specific contour in this outline * * @param c The contour index * @return the number of points in contour[c] */ size_t ContourSize(int c) const { return contourList[c]->PointCount(); } /** * Get the flag for the tesselation rule for this outline * * @return The contour flag */ int ContourFlag() const { return contourFlag; } private: /** * Process the freetype outline data into contours of points * * @param front front outset distance * @param back back outset distance */ void ProcessContours(); /** * The list of contours in the glyph */ FTContour** contourList; /** * A Mesh for tesselations */ FTMesh* mesh; /** * The number of contours reported by Freetype */ short ftContourCount; /** * A flag indicating the tesselation rule for the glyph */ int contourFlag; /** * A Freetype outline */ FT_Outline outline; }; #endif // __FTVectoriser__ rgl/src/ext/ftgl/FTBuffer.cpp0000644000176000001440000000324212262026246015563 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" FTBuffer::FTBuffer() : width(0), height(0), pixels(0), pos(FTPoint()) { } FTBuffer::~FTBuffer() { if(pixels) { delete[] pixels; } } void FTBuffer::Size(int w, int h) { if(w == width && h == height) { return; } if(w * h != width * height) { if(pixels) { delete[] pixels; } pixels = new unsigned char[w * h]; } memset(pixels, 0, w * h); width = w; height = h; } rgl/src/ext/ftgl/config.h0000644000176000001440000000050612262026246015032 0ustar ripleyusers/* In rgl, we don't run the FTGL configure script, and we don't have RTTI. It appears as though the configure script is not needed for the subset we use (except we need config.h, hence this file), and we can use static_casts in place of dynamic_casts, hence the define below. */ #define dynamic_cast static_cast rgl/src/ext/ftgl/FTUnicode.h0000644000176000001440000001773412262026246015420 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Daniel Remenak * * Portions derived from ConvertUTF.c Copyright (C) 2001-2004 Unicode, Inc * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTUnicode__ #define __FTUnicode__ /** * Provides a way to easily walk multibyte unicode strings in the various * Unicode encodings (UTF-8, UTF-16, UTF-32, UCS-2, and UCS-4). Encodings * with elements larger than one byte must already be in the correct endian * order for the current architecture. */ template class FTUnicodeStringItr { public: /** * Constructor. Also reads the first character and stores it. * * @param string The buffer to iterate. No copy is made. */ FTUnicodeStringItr(const T* string) : curPos(string), nextPos(string) { (*this)++; }; /** * Pre-increment operator. Reads the next unicode character and sets * the state appropriately. * Note - not protected against overruns. */ FTUnicodeStringItr& operator++() { curPos = nextPos; // unicode handling switch (sizeof(T)) { case 1: // UTF-8 // get this character readUTF8(); break; case 2: // UTF-16 readUTF16(); break; case 4: // UTF-32 // fall through default: // error condition really, but give it a shot anyway curChar = *nextPos++; } return *this; } /** * Post-increment operator. Reads the next character and sets * the state appropriately. * Note - not protected against overruns. */ FTUnicodeStringItr operator++(int) { FTUnicodeStringItr temp = *this; ++*this; return temp; } /** * Equality operator. Two FTUnicodeStringItrs are considered equal * if they have the same current buffer and buffer position. */ bool operator==(const FTUnicodeStringItr& right) const { if (curPos == right.getBufferFromHere()) return true; return false; } /** * Dereference operator. * * @return The unicode codepoint of the character currently pointed * to by the FTUnicodeStringItr. */ unsigned int operator*() const { return curChar; } /** * Buffer-fetching getter. You can use this to retreive the buffer * starting at the currently-iterated character for functions which * require a Unicode string as input. */ const T* getBufferFromHere() const { return curPos; } private: /** * Helper function for reading a single UTF8 character from the string. * Updates internal state appropriately. */ void readUTF8(); /** * Helper function for reading a single UTF16 character from the string. * Updates internal state appropriately. */ void readUTF16(); /** * The buffer position of the first element in the current character. */ const T* curPos; /** * The character stored at the current buffer position (prefetched on * increment, so there's no penalty for dereferencing more than once). */ unsigned int curChar; /** * The buffer position of the first element in the next character. */ const T* nextPos; // unicode magic numbers static const char utf8bytes[256]; static const unsigned long offsetsFromUTF8[6]; static const unsigned long highSurrogateStart; static const unsigned long highSurrogateEnd; static const unsigned long lowSurrogateStart; static const unsigned long lowSurrogateEnd; static const unsigned long highSurrogateShift; static const unsigned long lowSurrogateBase; }; /* The first character in a UTF8 sequence indicates how many bytes * to read (among other things) */ template const char FTUnicodeStringItr::utf8bytes[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6 }; /* Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */ template const unsigned long FTUnicodeStringItr::offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; // get a UTF8 character; leave the tracking pointer at the start of the // next character // not protected against invalid UTF8 template inline void FTUnicodeStringItr::readUTF8() { unsigned int ch = 0; unsigned int extraBytesToRead = utf8bytes[(unsigned char)(*nextPos)]; // falls through switch (extraBytesToRead) { case 6: ch += *nextPos++; ch <<= 6; /* remember, illegal UTF-8 */ case 5: ch += *nextPos++; ch <<= 6; /* remember, illegal UTF-8 */ case 4: ch += *nextPos++; ch <<= 6; case 3: ch += *nextPos++; ch <<= 6; case 2: ch += *nextPos++; ch <<= 6; case 1: ch += *nextPos++; } ch -= offsetsFromUTF8[extraBytesToRead-1]; curChar = ch; } // Magic numbers for UTF-16 conversions template const unsigned long FTUnicodeStringItr::highSurrogateStart = 0xD800; template const unsigned long FTUnicodeStringItr::highSurrogateEnd = 0xDBFF; template const unsigned long FTUnicodeStringItr::lowSurrogateStart = 0xDC00; template const unsigned long FTUnicodeStringItr::lowSurrogateEnd = 0xDFFF; template const unsigned long FTUnicodeStringItr::highSurrogateShift = 10; template const unsigned long FTUnicodeStringItr::lowSurrogateBase = 0x0010000UL; template inline void FTUnicodeStringItr::readUTF16() { unsigned int ch = *nextPos++; // if we have the first half of the surrogate pair if (ch >= highSurrogateStart && ch <= highSurrogateEnd) { unsigned int ch2 = *curPos; // complete the surrogate pair if (ch2 >= lowSurrogateStart && ch2 <= lowSurrogateEnd) { ch = ((ch - highSurrogateStart) << highSurrogateShift) + (ch2 - lowSurrogateStart) + lowSurrogateBase; ++nextPos; } } curChar = ch; } #endif rgl/src/ext/ftgl/FTCharToGlyphIndexMap.h0000644000176000001440000001143212262026246017631 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTCharToGlyphIndexMap__ #define __FTCharToGlyphIndexMap__ #include #include "FTGL/ftgl.h" /** * Provides a non-STL alternative to the STL map * which maps character codes to glyph indices inside FTCharmap. * * Implementation: * - NumberOfBuckets buckets are considered. * - Each bucket has BucketSize entries. * - When the glyph index for the character code C has to be stored, the * bucket this character belongs to is found using 'C div BucketSize'. * If this bucket has not been allocated yet, do it now. * The entry in the bucked is found using 'C mod BucketSize'. * If it is set to IndexNotFound, then the glyph entry has not been set. * - Try to mimic the calls made to the STL map API. * * Caveats: * - The glyph index is now a signed long instead of unsigned long, so * the special value IndexNotFound (= -1) can be used to specify that the * glyph index has not been stored yet. */ class FTCharToGlyphIndexMap { public: typedef unsigned long CharacterCode; typedef signed long GlyphIndex; enum { NumberOfBuckets = 256, BucketSize = 256, IndexNotFound = -1 }; FTCharToGlyphIndexMap() { this->Indices = 0; } virtual ~FTCharToGlyphIndexMap() { if(this->Indices) { // Free all buckets this->clear(); // Free main structure delete [] this->Indices; this->Indices = 0; } } void clear() { if(this->Indices) { for(int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++) { if(this->Indices[i]) { delete [] this->Indices[i]; this->Indices[i] = 0; } } } } const GlyphIndex find(CharacterCode c) { if(!this->Indices) { return 0; } // Find position of char code in buckets div_t pos = div(c, FTCharToGlyphIndexMap::BucketSize); if(!this->Indices[pos.quot]) { return 0; } const FTCharToGlyphIndexMap::GlyphIndex *ptr = &this->Indices[pos.quot][pos.rem]; if(*ptr == FTCharToGlyphIndexMap::IndexNotFound) { return 0; } return *ptr; } void insert(CharacterCode c, GlyphIndex g) { if(!this->Indices) { this->Indices = new GlyphIndex* [FTCharToGlyphIndexMap::NumberOfBuckets]; for(int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++) { this->Indices[i] = 0; } } // Find position of char code in buckets div_t pos = div(c, FTCharToGlyphIndexMap::BucketSize); // Allocate bucket if does not exist yet if(!this->Indices[pos.quot]) { this->Indices[pos.quot] = new GlyphIndex [FTCharToGlyphIndexMap::BucketSize]; for(int i = 0; i < FTCharToGlyphIndexMap::BucketSize; i++) { this->Indices[pos.quot][i] = FTCharToGlyphIndexMap::IndexNotFound; } } this->Indices[pos.quot][pos.rem] = g; } private: GlyphIndex** Indices; }; #endif // __FTCharToGlyphIndexMap__ rgl/src/ext/ftgl/FTLibrary.h0000644000176000001440000000750112262026246015425 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTLibrary__ #define __FTLibrary__ #include #include FT_FREETYPE_H //#include FT_CACHE_H #include "FTGL/ftgl.h" /** * FTLibrary class is the global accessor for the Freetype library. * * This class encapsulates the Freetype Library. This is a singleton class * and ensures that only one FT_Library is in existence at any one time. * All constructors are private therefore clients cannot create or * instantiate this class themselves and must access it's methods via the * static FTLibrary::Instance() function. * * Just because this class returns a valid FTLibrary object * doesn't mean that the Freetype Library has been successfully initialised. * Clients should check for errors. You can initialse the library AND check * for errors using the following code... * err = FTLibrary::Instance().Error(); * * @see "Freetype 2 Documentation" * */ class FTLibrary { public: /** * Global acces point to the single FTLibrary object. * * @return The global FTLibrary object. */ static const FTLibrary& Instance(); /** * Gets a pointer to the native Freetype library. * * @return A handle to a FreeType library instance. */ const FT_Library* const GetLibrary() const { return library; } /** * Queries the library for errors. * * @return The current error code. */ FT_Error Error() const { return err; } /** * Destructor * * Disposes of the Freetype library */ ~FTLibrary(); private: /** * Default constructors. * * Made private to stop clients creating there own FTLibrary * objects. */ FTLibrary(); FTLibrary(const FT_Library&){} FTLibrary& operator=(const FT_Library&) { return *this; } /** * Initialises the Freetype library * * Even though this function indicates success via the return value, * clients can't see this so must check the error codes. This function * is only ever called by the default c_stor * * @return true if the Freetype library was * successfully initialised, false * otherwise. */ bool Initialise(); /** * Freetype library handle. */ FT_Library* library; // FTC_Manager* manager; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTLibrary__ rgl/src/ext/ftgl/FTSize.h0000644000176000001440000001126712262026246014737 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTSize__ #define __FTSize__ #include #include FT_FREETYPE_H #include "FTGL/ftgl.h" /** * FTSize class provides an abstraction layer for the Freetype Size. * * @see "Freetype 2 Documentation" * */ class FTSize { public: /** * Default Constructor */ FTSize(); /** * Destructor */ virtual ~FTSize(); /** * Sets the char size for the current face. * * This doesn't guarantee that the size was set correctly. Clients * should check errors. If an error does occur the size object isn't modified. * * @param face Parent face for this size object * @param point_size the face size in points (1/72 inch) * @param x_resolution the horizontal resolution of the target device. * @param y_resolution the vertical resolution of the target device. * @return true if the size has been set. Clients should check Error() for more information if this function returns false() */ bool CharSize(FT_Face* face, unsigned int point_size, unsigned int x_resolution, unsigned int y_resolution); /** * get the char size for the current face. * * @return The char size in points */ unsigned int CharSize() const; /** * Gets the global ascender height for the face in pixels. * * @return Ascender height */ float Ascender() const; /** * Gets the global descender height for the face in pixels. * * @return Ascender height */ float Descender() const; /** * Gets the global face height for the face. * * If the face is scalable this returns the height of the global * bounding box which ensures that any glyph will be less than or * equal to this height. If the font isn't scalable there is no * guarantee that glyphs will not be taller than this value. * * @return height in pixels. */ float Height() const; /** * Gets the global face width for the face. * * If the face is scalable this returns the width of the global * bounding box which ensures that any glyph will be less than or * equal to this width. If the font isn't scalable this value is * the max_advance for the face. * * @return width in pixels. */ float Width() const; /** * Gets the underline position for the face. * * @return underline position in pixels */ float Underline() const; /** * Queries for errors. * * @return The current error code. */ FT_Error Error() const { return err; } private: /** * The current Freetype face that this FTSize object relates to. */ FT_Face* ftFace; /** * The Freetype size. */ FT_Size ftSize; /** * The size in points. */ unsigned int size; /** * The horizontal resolution. */ unsigned int xResolution; /** * The vertical resolution. */ unsigned int yResolution; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTSize__ rgl/src/ext/ftgl/FTFace.cpp0000644000176000001440000001337212262026246015215 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTFace.h" #include "FTLibrary.h" #include FT_TRUETYPE_TABLES_H FTFace::FTFace(const char* fontFilePath, bool precomputeKerning) : numGlyphs(0), fontEncodingList(0), kerningCache(0), err(0) { const FT_Long DEFAULT_FACE_INDEX = 0; ftFace = new FT_Face; err = FT_New_Face(*FTLibrary::Instance().GetLibrary(), fontFilePath, DEFAULT_FACE_INDEX, ftFace); if(err) { delete ftFace; ftFace = 0; return; } numGlyphs = (*ftFace)->num_glyphs; hasKerningTable = (FT_HAS_KERNING((*ftFace)) != 0); if(hasKerningTable && precomputeKerning) { BuildKerningCache(); } } FTFace::FTFace(const unsigned char *pBufferBytes, size_t bufferSizeInBytes, bool precomputeKerning) : numGlyphs(0), fontEncodingList(0), kerningCache(0), err(0) { const FT_Long DEFAULT_FACE_INDEX = 0; ftFace = new FT_Face; err = FT_New_Memory_Face(*FTLibrary::Instance().GetLibrary(), (FT_Byte const *)pBufferBytes, (FT_Long)bufferSizeInBytes, DEFAULT_FACE_INDEX, ftFace); if(err) { delete ftFace; ftFace = 0; return; } numGlyphs = (*ftFace)->num_glyphs; hasKerningTable = (FT_HAS_KERNING((*ftFace)) != 0); if(hasKerningTable && precomputeKerning) { BuildKerningCache(); } } FTFace::~FTFace() { if(kerningCache) { delete[] kerningCache; } if(ftFace) { FT_Done_Face(*ftFace); delete ftFace; ftFace = 0; } } bool FTFace::Attach(const char* fontFilePath) { err = FT_Attach_File(*ftFace, fontFilePath); return !err; } bool FTFace::Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) { FT_Open_Args open; open.flags = FT_OPEN_MEMORY; open.memory_base = (FT_Byte const *)pBufferBytes; open.memory_size = (FT_Long)bufferSizeInBytes; err = FT_Attach_Stream(*ftFace, &open); return !err; } const FTSize& FTFace::Size(const unsigned int size, const unsigned int res) { charSize.CharSize(ftFace, size, res, res); err = charSize.Error(); return charSize; } unsigned int FTFace::CharMapCount() const { return (*ftFace)->num_charmaps; } FT_Encoding* FTFace::CharMapList() { if(0 == fontEncodingList) { fontEncodingList = new FT_Encoding[CharMapCount()]; for(size_t i = 0; i < CharMapCount(); ++i) { fontEncodingList[i] = (*ftFace)->charmaps[i]->encoding; } } return fontEncodingList; } FTPoint FTFace::KernAdvance(unsigned int index1, unsigned int index2) { float x, y; if(!hasKerningTable || !index1 || !index2) { return FTPoint(0.0f, 0.0f); } if(kerningCache && index1 < FTFace::MAX_PRECOMPUTED && index2 < FTFace::MAX_PRECOMPUTED) { x = kerningCache[2 * (index2 * FTFace::MAX_PRECOMPUTED + index1)]; y = kerningCache[2 * (index2 * FTFace::MAX_PRECOMPUTED + index1) + 1]; return FTPoint(x, y); } FT_Vector kernAdvance; kernAdvance.x = kernAdvance.y = 0; err = FT_Get_Kerning(*ftFace, index1, index2, ft_kerning_unfitted, &kernAdvance); if(err) { return FTPoint(0.0f, 0.0f); } x = static_cast(kernAdvance.x) / 64.0f; y = static_cast(kernAdvance.y) / 64.0f; return FTPoint(x, y); } FT_GlyphSlot FTFace::Glyph(unsigned int index, FT_Int load_flags) { err = FT_Load_Glyph(*ftFace, index, load_flags); if(err) { return NULL; } return (*ftFace)->glyph; } void FTFace::BuildKerningCache() { FT_Vector kernAdvance; kernAdvance.x = 0; kernAdvance.y = 0; kerningCache = new float[FTFace::MAX_PRECOMPUTED * FTFace::MAX_PRECOMPUTED * 2]; for(unsigned int j = 0; j < FTFace::MAX_PRECOMPUTED; j++) { for(unsigned int i = 0; i < FTFace::MAX_PRECOMPUTED; i++) { err = FT_Get_Kerning(*ftFace, i, j, ft_kerning_unfitted, &kernAdvance); if(err) { delete[] kerningCache; kerningCache = NULL; return; } kerningCache[2 * (j * FTFace::MAX_PRECOMPUTED + i)] = static_cast(kernAdvance.x) / 64.0f; kerningCache[2 * (j * FTFace::MAX_PRECOMPUTED + i) + 1] = static_cast(kernAdvance.y) / 64.0f; } } } rgl/src/ext/ftgl/FTLibrary.cpp0000644000176000001440000000404412262026246015757 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTLibrary.h" const FTLibrary& FTLibrary::Instance() { static FTLibrary ftlib; return ftlib; } FTLibrary::~FTLibrary() { if(library != 0) { FT_Done_FreeType(*library); delete library; library= 0; } // if(manager != 0) // { // FTC_Manager_Done(manager); // // delete manager; // manager= 0; // } } FTLibrary::FTLibrary() : library(0), err(0) { Initialise(); } bool FTLibrary::Initialise() { if(library != 0) return true; library = new FT_Library; err = FT_Init_FreeType(library); if(err) { delete library; library = 0; return false; } // FTC_Manager* manager; // // if(FTC_Manager_New(lib, 0, 0, 0, my_face_requester, 0, manager) // { // delete manager; // manager= 0; // return false; // } return true; } rgl/src/ext/ftgl/FTGL/0000755000176000001440000000000012100313501014127 5ustar ripleyusersrgl/src/ext/ftgl/FTGL/FTPixmapGlyph.h0000644000176000001440000000472612262026246017025 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTPixmapGlyph__ #define __FTPixmapGlyph__ #ifdef __cplusplus /** * FTPixmapGlyph is a specialisation of FTGlyph for creating pixmaps. */ class FTGL_EXPORT FTPixmapGlyph : public FTGlyph { public: /** * Constructor * * @param glyph The Freetype glyph to be processed */ FTPixmapGlyph(FT_GlyphSlot glyph); /** * Destructor */ virtual ~FTPixmapGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating pixmaps. * * @param glyph The Freetype glyph to be processed * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreatePixmapGlyph(FT_GlyphSlot glyph); FTGL_END_C_DECLS #endif // __FTPixmapGlyph__ rgl/src/ext/ftgl/FTGL/FTGLBitmapFont.h0000644000176000001440000000606312262026246017045 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTBitmapFont__ #define __FTBitmapFont__ #ifdef __cplusplus /** * FTBitmapFont is a specialisation of the FTFont class for handling * Bitmap fonts * * @see FTFont */ class FTGL_EXPORT FTBitmapFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTBitmapFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTBitmapFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTBitmapFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLBitmapFont FTBitmapFont #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling bitmap fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreateBitmapFont(const char *file); FTGL_END_C_DECLS #endif // __FTBitmapFont__ rgl/src/ext/ftgl/FTGL/FTBufferFont.h0000644000176000001440000000563412262026246016622 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning Please use instead of . # include #endif #ifndef __FTBufferFont__ #define __FTBufferFont__ #ifdef __cplusplus /** * FTBufferFont is a specialisation of the FTFont class for handling * memory buffer fonts. * * @see FTFont */ class FTGL_EXPORT FTBufferFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTBufferFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTBufferFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTBufferFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling memory buffer fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreateBufferFont(const char *file); FTGL_END_C_DECLS #endif // __FTBufferFont__ rgl/src/ext/ftgl/FTGL/FTBufferGlyph.h0000644000176000001440000000426212262026246016773 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning Please use instead of . # include #endif #ifndef __FTBufferGlyph__ #define __FTBufferGlyph__ #ifdef __cplusplus /** * FTBufferGlyph is a specialisation of FTGlyph for memory buffer rendering. */ class FTGL_EXPORT FTBufferGlyph : public FTGlyph { public: /** * Constructor * * @param glyph The Freetype glyph to be processed * @param buffer An FTBuffer object in which to render the glyph. */ FTBufferGlyph(FT_GlyphSlot glyph, FTBuffer *buffer); /** * Destructor */ virtual ~FTBufferGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #endif //__cplusplus #endif // __FTBufferGlyph__ rgl/src/ext/ftgl/FTGL/FTGLTextureFont.h0000644000176000001440000000612612262026246017271 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTTextureFont__ #define __FTTextureFont__ #ifdef __cplusplus /** * FTTextureFont is a specialisation of the FTFont class for handling * Texture mapped fonts * * @see FTFont */ class FTGL_EXPORT FTTextureFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTTextureFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTTextureFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ virtual ~FTTextureFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLTextureFont FTTextureFont #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling texture-mapped fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreateTextureFont(const char *file); FTGL_END_C_DECLS #endif // __FTTextureFont__ rgl/src/ext/ftgl/FTGL/FTTextureGlyph.h0000644000176000001440000000677712262026246017237 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTTextureGlyph__ #define __FTTextureGlyph__ #ifdef __cplusplus /** * FTTextureGlyph is a specialisation of FTGlyph for creating texture * glyphs. */ class FTGL_EXPORT FTTextureGlyph : public FTGlyph { public: /** * Constructor * * @param glyph The Freetype glyph to be processed * @param id The id of the texture that this glyph will be * drawn in * @param xOffset The x offset into the parent texture to draw * this glyph * @param yOffset The y offset into the parent texture to draw * this glyph * @param width The width of the parent texture * @param height The height (number of rows) of the parent texture */ FTTextureGlyph(FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height); /** * Destructor */ virtual ~FTTextureGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating pixmaps. * * @param glyph The Freetype glyph to be processed. * @param id The id of the texture that this glyph will be drawn in. * @param xOffset The x offset into the parent texture to draw this glyph. * @param yOffset The y offset into the parent texture to draw this glyph. * @param width The width of the parent texture. * @param height The height (number of rows) of the parent texture. * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreateTextureGlyph(FT_GlyphSlot glyph, int id, int xOffset, int yOffset, int width, int height); FTGL_END_C_DECLS #endif // __FTTextureGlyph__ rgl/src/ext/ftgl/FTGL/FTBuffer.h0000644000176000001440000000637312262026246015774 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning Please use instead of . # include #endif #ifndef __FTBuffer__ #define __FTBuffer__ #ifdef __cplusplus /** * FTBuffer is a helper class for pixel buffers. * * It provides the interface between FTBufferFont and FTBufferGlyph to * optimise rendering operations. * * @see FTBufferGlyph * @see FTBufferFont */ class FTGL_EXPORT FTBuffer { public: /** * Default constructor. */ FTBuffer(); /** * Destructor */ ~FTBuffer(); /** * Get the pen's position in the buffer. * * @return The pen's position as an FTPoint object. */ inline FTPoint Pos() const { return pos; } /** * Set the pen's position in the buffer. * * @param arg An FTPoint object with the desired pen's position. */ inline void Pos(FTPoint arg) { pos = arg; } /** * Set the buffer's size. * * @param w The buffer's desired width, in pixels. * @param h The buffer's desired height, in pixels. */ void Size(int w, int h); /** * Get the buffer's width. * * @return The buffer's width, in pixels. */ inline int Width() const { return width; } /** * Get the buffer's height. * * @return The buffer's height, in pixels. */ inline int Height() const { return height; } /** * Get the buffer's direct pixel buffer. * * @return A read-write pointer to the buffer's pixels. */ inline unsigned char *Pixels() const { return pixels; } private: /** * Buffer's width and height. */ int width, height; /** * Buffer's pixel buffer. */ unsigned char *pixels; /** * Buffer's internal pen position. */ FTPoint pos; }; #endif //__cplusplus #endif // __FTBuffer__ rgl/src/ext/ftgl/FTGL/FTPoint.h0000644000176000001440000001702412262026246015647 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTPoint__ #define __FTPoint__ #ifdef __cplusplus /** * FTPoint class is a basic 3-dimensional point or vector. */ class FTGL_EXPORT FTPoint { public: /** * Default constructor. Point is set to zero. */ inline FTPoint() { values[0] = 0; values[1] = 0; values[2] = 0; } /** * Constructor. Z coordinate is set to zero if unspecified. * * @param x First component * @param y Second component * @param z Third component */ inline FTPoint(const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z = 0) { values[0] = x; values[1] = y; values[2] = z; } /** * Constructor. This converts an FT_Vector to an FTPoint * * @param ft_vector A freetype vector */ inline FTPoint(const FT_Vector& ft_vector) { values[0] = ft_vector.x; values[1] = ft_vector.y; values[2] = 0; } /** * Normalise a point's coordinates. If the coordinates are zero, * the point is left untouched. * * @return A vector of norm one. */ FTPoint Normalise(); /** * Operator += In Place Addition. * * @param point * @return this plus point. */ inline FTPoint& operator += (const FTPoint& point) { values[0] += point.values[0]; values[1] += point.values[1]; values[2] += point.values[2]; return *this; } /** * Operator + * * @param point * @return this plus point. */ inline FTPoint operator + (const FTPoint& point) const { FTPoint temp; temp.values[0] = values[0] + point.values[0]; temp.values[1] = values[1] + point.values[1]; temp.values[2] = values[2] + point.values[2]; return temp; } /** * Operator -= In Place Substraction. * * @param point * @return this minus point. */ inline FTPoint& operator -= (const FTPoint& point) { values[0] -= point.values[0]; values[1] -= point.values[1]; values[2] -= point.values[2]; return *this; } /** * Operator - * * @param point * @return this minus point. */ inline FTPoint operator - (const FTPoint& point) const { FTPoint temp; temp.values[0] = values[0] - point.values[0]; temp.values[1] = values[1] - point.values[1]; temp.values[2] = values[2] - point.values[2]; return temp; } /** * Operator * Scalar multiplication * * @param multiplier * @return this multiplied by multiplier. */ inline FTPoint operator * (double multiplier) const { FTPoint temp; temp.values[0] = values[0] * multiplier; temp.values[1] = values[1] * multiplier; temp.values[2] = values[2] * multiplier; return temp; } /** * Operator * Scalar multiplication * * @param point * @param multiplier * @return multiplier multiplied by point. */ inline friend FTPoint operator * (double multiplier, FTPoint& point) { return point * multiplier; } /** * Operator * Scalar product * * @param a First vector. * @param b Second vector. * @return a.b scalar product. */ inline friend double operator * (FTPoint &a, FTPoint& b) { return a.values[0] * b.values[0] + a.values[1] * b.values[1] + a.values[2] * b.values[2]; } /** * Operator ^ Vector product * * @param point Second point * @return this vector point. */ inline FTPoint operator ^ (const FTPoint& point) { FTPoint temp; temp.values[0] = values[1] * point.values[2] - values[2] * point.values[1]; temp.values[1] = values[2] * point.values[0] - values[0] * point.values[2]; temp.values[2] = values[0] * point.values[1] - values[1] * point.values[0]; return temp; } /** * Operator == Tests for equality * * @param a * @param b * @return true if a & b are equal */ friend bool operator == (const FTPoint &a, const FTPoint &b); /** * Operator != Tests for non equality * * @param a * @param b * @return true if a & b are not equal */ friend bool operator != (const FTPoint &a, const FTPoint &b); /** * Cast to FTGL_DOUBLE* */ inline operator const FTGL_DOUBLE*() const { return values; } /** * Setters */ inline void X(FTGL_DOUBLE x) { values[0] = x; }; inline void Y(FTGL_DOUBLE y) { values[1] = y; }; inline void Z(FTGL_DOUBLE z) { values[2] = z; }; /** * Getters */ inline FTGL_DOUBLE X() const { return values[0]; }; inline FTGL_DOUBLE Y() const { return values[1]; }; inline FTGL_DOUBLE Z() const { return values[2]; }; inline FTGL_FLOAT Xf() const { return static_cast(values[0]); }; inline FTGL_FLOAT Yf() const { return static_cast(values[1]); }; inline FTGL_FLOAT Zf() const { return static_cast(values[2]); }; private: /** * The point data */ FTGL_DOUBLE values[3]; }; #endif //__cplusplus #endif // __FTPoint__ rgl/src/ext/ftgl/FTGL/FTPolyGlyph.h0000644000176000001440000000651112262026246016504 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTPolygonGlyph__ #define __FTPolygonGlyph__ #ifdef __cplusplus /** * FTPolygonGlyph is a specialisation of FTGlyph for creating tessellated * polygon glyphs. */ class FTGL_EXPORT FTPolygonGlyph : public FTGlyph { public: /** * Constructor. Sets the Error to Invalid_Outline if the glyphs * isn't an outline. * * @param glyph The Freetype glyph to be processed * @param outset The outset distance * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. */ FTPolygonGlyph(FT_GlyphSlot glyph, float outset, bool useDisplayList); /** * Destructor */ virtual ~FTPolygonGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #define FTPolyGlyph FTPolygonGlyph #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating tessellated * polygon glyphs. * * @param glyph The Freetype glyph to be processed * @param outset outset contour size * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreatePolygonGlyph(FT_GlyphSlot glyph, float outset, int useDisplayList); FTGL_END_C_DECLS #endif // __FTPolygonGlyph__ rgl/src/ext/ftgl/FTGL/FTGlyph.h0000644000176000001440000001414112262026246015636 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTGlyph__ #define __FTGlyph__ #ifdef __cplusplus class FTGlyphImpl; /** * FTGlyph is the base class for FTGL glyphs. * * It provides the interface between Freetype glyphs and their openGL * renderable counterparts. This is an abstract class and derived classes * must implement the Render function. * * @see FTBBox * @see FTPoint */ class FTGL_EXPORT FTGlyph { protected: /** * Create a glyph. * * @param glyph The Freetype glyph to be processed */ FTGlyph(FT_GlyphSlot glyph); private: /** * Internal FTGL FTGlyph constructor. For private use only. * * @param pImpl Internal implementation object. Will be destroyed * upon FTGlyph deletion. */ FTGlyph(FTGlyphImpl *pImpl); /* Allow our internal subclasses to access the private constructor */ friend class FTBitmapGlyph; friend class FTBufferGlyph; friend class FTExtrudeGlyph; friend class FTOutlineGlyph; friend class FTPixmapGlyph; friend class FTPolygonGlyph; friend class FTTextureGlyph; public: /** * Destructor */ virtual ~FTGlyph(); /** * Renders this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode) = 0; /** * Return the advance width for this glyph. * * @return advance width. */ virtual float Advance() const; /** * Return the bounding box for this glyph. * * @return bounding box. */ virtual const FTBBox& BBox() const; /** * Queries for errors. * * @return The current error code. */ virtual FT_Error Error() const; private: /** * Internal FTGL FTGlyph implementation object. For private use only. */ FTGlyphImpl *impl; }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * FTGLglyph is the base class for FTGL glyphs. * * It provides the interface between Freetype glyphs and their openGL * renderable counterparts. This is an abstract class and derived classes * must implement the ftglRenderGlyph() function. */ struct _FTGLGlyph; typedef struct _FTGLglyph FTGLglyph; /** * Create a custom FTGL glyph object. * FIXME: maybe get rid of "base" and have advanceCallback etc. functions * * @param base The base FTGLglyph* to subclass. * @param data A pointer to private data that will be passed to callbacks. * @param renderCallback A rendering callback function. * @param destroyCallback A callback function to be called upon destruction. * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreateCustomGlyph(FTGLglyph *base, void *data, void (*renderCallback) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, int, FTGL_DOUBLE *, FTGL_DOUBLE *), void (*destroyCallback) (FTGLglyph *, void *)); /** * Destroy an FTGL glyph object. * * @param glyph An FTGLglyph* object. */ FTGL_EXPORT void ftglDestroyGlyph(FTGLglyph *glyph); /** * Render a glyph at the current pen position and compute the corresponding * advance. * * @param glyph An FTGLglyph* object. * @param penx The current pen's X position. * @param peny The current pen's Y position. * @param renderMode Render mode to display * @param advancex A pointer to an FTGL_DOUBLE where to write the advance's X * component. * @param advancey A pointer to an FTGL_DOUBLE where to write the advance's Y * component. */ FTGL_EXPORT void ftglRenderGlyph(FTGLglyph *glyph, FTGL_DOUBLE penx, FTGL_DOUBLE peny, int renderMode, FTGL_DOUBLE *advancex, FTGL_DOUBLE *advancey); /** * Return the advance for a glyph. * * @param glyph An FTGLglyph* object. * @return The advance's X component. */ FTGL_EXPORT float ftglGetGlyphAdvance(FTGLglyph *glyph); /** * Return the bounding box for a glyph. * * @param glyph An FTGLglyph* object. * @param bounds An array of 6 float values where the bounding box's lower * left near and upper right far 3D coordinates will be stored. */ FTGL_EXPORT void ftglGetGlyphBBox(FTGLglyph *glyph, float bounds[6]); /** * Query a glyph for errors. * * @param glyph An FTGLglyph* object. * @return The current error code. */ FTGL_EXPORT FT_Error ftglGetGlyphError(FTGLglyph* glyph); FTGL_END_C_DECLS #endif // __FTGlyph__ rgl/src/ext/ftgl/FTGL/FTOutlineGlyph.h0000644000176000001440000000635112262026246017202 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTOutlineGlyph__ #define __FTOutlineGlyph__ #ifdef __cplusplus /** * FTOutlineGlyph is a specialisation of FTGlyph for creating outlines. */ class FTGL_EXPORT FTOutlineGlyph : public FTGlyph { public: /** * Constructor. Sets the Error to Invalid_Outline if the glyphs isn't * an outline. * * @param glyph The Freetype glyph to be processed * @param outset outset distance * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. */ FTOutlineGlyph(FT_GlyphSlot glyph, float outset, bool useDisplayList); /** * Destructor */ virtual ~FTOutlineGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating outlines. * * @param glyph The Freetype glyph to be processed * @param outset outset contour size * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreateOutlineGlyph(FT_GlyphSlot glyph, float outset, int useDisplayList); FTGL_END_C_DECLS #endif // __FTOutlineGlyph__ rgl/src/ext/ftgl/FTGL/FTGLPixmapFont.h0000644000176000001440000000611612262026246017066 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTPixmapFont__ #define __FTPixmapFont__ #ifdef __cplusplus /** * FTPixmapFont is a specialisation of the FTFont class for handling * Pixmap (Grey Scale) fonts * * @see FTFont */ class FTGL_EXPORT FTPixmapFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTPixmapFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTPixmapFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTPixmapFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLPixmapFont FTPixmapFont #endif // __cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling pixmap (grey scale) fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreatePixmapFont(const char *file); FTGL_END_C_DECLS #endif // __FTPixmapFont__ rgl/src/ext/ftgl/FTGL/FTLayout.h0000644000176000001440000001454512262026246016040 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTLayout__ #define __FTLayout__ #ifdef __cplusplus class FTLayoutImpl; /** * FTLayout is the interface for layout managers that render text. * * Specific layout manager classes are derived from this class. This class * is abstract and deriving classes must implement the protected * Render methods to render formatted text and * BBox methods to determine the bounding box of output text. * * @see FTFont * @see FTBBox */ class FTGL_EXPORT FTLayout { protected: FTLayout(); private: /** * Internal FTGL FTLayout constructor. For private use only. * * @param pImpl Internal implementation object. Will be destroyed * upon FTLayout deletion. */ FTLayout(FTLayoutImpl *pImpl); /* Allow our internal subclasses to access the private constructor */ friend class FTSimpleLayout; public: /** * Destructor */ virtual ~FTLayout(); /** * Get the bounding box for a formatted string. * * @param string A char string. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const char* string, const int len = -1, FTPoint position = FTPoint()) = 0; /** * Get the bounding box for a formatted string. * * @param string A wchar_t string. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const wchar_t* string, const int len = -1, FTPoint position = FTPoint()) = 0; /** * Render a string of characters. * * @param string 'C' style string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param renderMode Render mode to display (optional) */ virtual void Render(const char *string, const int len = -1, FTPoint position = FTPoint(), int renderMode = FTGL::RENDER_ALL) = 0; /** * Render a string of characters. * * @param string wchar_t string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param renderMode Render mode to display (optional) */ virtual void Render(const wchar_t *string, const int len = -1, FTPoint position = FTPoint(), int renderMode = FTGL::RENDER_ALL) = 0; /** * Queries the Layout for errors. * * @return The current error code. */ virtual FT_Error Error() const; private: /** * Internal FTGL FTLayout implementation object. For private use only. */ FTLayoutImpl *impl; }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * FTGLlayout is the interface for layout managers that render text. */ struct _FTGLlayout; typedef struct _FTGLlayout FTGLlayout; /** * Destroy an FTGL layout object. * * @param layout An FTGLlayout* object. */ FTGL_EXPORT void ftglDestroyLayout(FTGLlayout* layout); /** * Get the bounding box for a string. * * @param layout An FTGLlayout* object. * @param string A char buffer * @param bounds An array of 6 float values where the bounding box's lower * left near and upper right far 3D coordinates will be stored. */ FTGL_EXPORT void ftglGetLayoutBBox(FTGLlayout *layout, const char* string, float bounds[6]); /** * Render a string of characters. * * @param layout An FTGLlayout* object. * @param string Char string to be output. * @param mode Render mode to display. */ FTGL_EXPORT void ftglRenderLayout(FTGLlayout *layout, const char *string, int mode); /** * Query a layout for errors. * * @param layout An FTGLlayout* object. * @return The current error code. */ FTGL_EXPORT FT_Error ftglGetLayoutError(FTGLlayout* layout); FTGL_END_C_DECLS #endif /* __FTLayout__ */ rgl/src/ext/ftgl/FTGL/FTSimpleLayout.h0000644000176000001440000001472012262026246017205 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTSimpleLayout__ #define __FTSimpleLayout__ #ifdef __cplusplus class FTFont; /** * FTSimpleLayout is a specialisation of FTLayout for simple text boxes. * * This class has basic support for text wrapping, left, right and centered * alignment, and text justification. * * @see FTLayout */ class FTGL_EXPORT FTSimpleLayout : public FTLayout { public: /** * Initializes line spacing to 1.0, alignment to * ALIGN_LEFT and wrap to 100.0 */ FTSimpleLayout(); /** * Destructor */ ~FTSimpleLayout(); /** * Get the bounding box for a formatted string. * * @param string A char string. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const char* string, const int len = -1, FTPoint position = FTPoint()); /** * Get the bounding box for a formatted string. * * @param string A wchar_t string. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const wchar_t* string, const int len = -1, FTPoint position = FTPoint()); /** * Render a string of characters. * * @param string 'C' style string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param renderMode Render mode to display (optional) */ virtual void Render(const char *string, const int len = -1, FTPoint position = FTPoint(), int renderMode = FTGL::RENDER_ALL); /** * Render a string of characters. * * @param string wchar_t string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param renderMode Render mode to display (optional) */ virtual void Render(const wchar_t *string, const int len = -1, FTPoint position = FTPoint(), int renderMode = FTGL::RENDER_ALL); /** * Set the font to use for rendering the text. * * @param fontInit A pointer to the new font. The font is * referenced by this but will not be * disposed of when this is deleted. */ void SetFont(FTFont *fontInit); /** * @return The current font. */ FTFont *GetFont(); /** * The maximum line length for formatting text. * * @param LineLength The new line length. */ void SetLineLength(const float LineLength); /** * @return The current line length. */ float GetLineLength() const; /** * The text alignment mode used to distribute * space within a line or rendered text. * * @param Alignment The new alignment mode. */ void SetAlignment(const FTGL::TextAlignment Alignment); /** * @return The text alignment mode. */ FTGL::TextAlignment GetAlignment() const; /** * Sets the line height. * * @param LineSpacing The height of each line of text expressed as * a percentage of the current fonts line height. */ void SetLineSpacing(const float LineSpacing); /** * @return The line spacing. */ float GetLineSpacing() const; }; #endif //__cplusplus FTGL_BEGIN_C_DECLS FTGL_EXPORT FTGLlayout *ftglCreateSimpleLayout(void); FTGL_EXPORT void ftglSetLayoutFont(FTGLlayout *, FTGLfont*); FTGL_EXPORT FTGLfont *ftglGetLayoutFont(FTGLlayout *); FTGL_EXPORT void ftglSetLayoutLineLength(FTGLlayout *, const float); FTGL_EXPORT float ftglGetLayoutLineLength(FTGLlayout *); FTGL_EXPORT void ftglSetLayoutAlignment(FTGLlayout *, const int); FTGL_EXPORT int ftglGetLayoutAlignement(FTGLlayout *); FTGL_EXPORT void ftglSetLayoutLineSpacing(FTGLlayout *, const float); FTGL_EXPORT float ftglGetLayoutLineSpacing(FTGLlayout *); FTGL_END_C_DECLS #endif /* __FTSimpleLayout__ */ rgl/src/ext/ftgl/FTGL/FTGLPolygonFont.h0000644000176000001440000000614412262026246017260 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTPolygonFont__ #define __FTPolygonFont__ #ifdef __cplusplus /** * FTPolygonFont is a specialisation of the FTFont class for handling * tesselated Polygon Mesh fonts * * @see FTFont */ class FTGL_EXPORT FTPolygonFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTPolygonFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTPolygonFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTPolygonFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLPolygonFont FTPolygonFont #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling tesselated polygon * mesh fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreatePolygonFont(const char *file); FTGL_END_C_DECLS #endif // __FTPolygonFont__ rgl/src/ext/ftgl/FTGL/ftgl.h0000644000176000001440000001017712262026246015262 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ #define __ftgl__ /* We need the Freetype headers */ #include #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_OUTLINE_H /* Floating point types used by the library */ typedef double FTGL_DOUBLE; typedef float FTGL_FLOAT; /* Macros used to declare C-linkage types and symbols */ #ifdef __cplusplus # define FTGL_BEGIN_C_DECLS extern "C" { namespace FTGL { # define FTGL_END_C_DECLS } } #else # define FTGL_BEGIN_C_DECLS # define FTGL_END_C_DECLS #endif #ifdef __cplusplus namespace FTGL { typedef enum { RENDER_FRONT = 0x0001, RENDER_BACK = 0x0002, RENDER_SIDE = 0x0004, RENDER_ALL = 0xffff } RenderMode; typedef enum { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2, ALIGN_JUSTIFY = 3 } TextAlignment; } #else # define FTGL_RENDER_FRONT 0x0001 # define FTGL_RENDER_BACK 0x0002 # define FTGL_RENDER_SIDE 0x0004 # define FTGL_RENDER_ALL 0xffff # define FTGL_ALIGN_LEFT 0 # define FTGL_ALIGN_CENTER 1 # define FTGL_ALIGN_RIGHT 2 # define FTGL_ALIGN_JUSTIFY 3 #endif // Compiler-specific conditional compilation #ifdef _MSC_VER // MS Visual C++ // Disable various warning. // 4786: template name too long #pragma warning(disable : 4251) #pragma warning(disable : 4275) #pragma warning(disable : 4786) // The following definitions control how symbols are exported. // If the target is a static library ensure that FTGL_LIBRARY_STATIC // is defined. If building a dynamic library (ie DLL) ensure the // FTGL_LIBRARY macro is defined, as it will mark symbols for // export. If compiling a project to _use_ the _dynamic_ library // version of the library, no definition is required. #ifdef FTGL_LIBRARY_STATIC // static lib - no special export required # define FTGL_EXPORT #elif FTGL_LIBRARY // dynamic lib - must export/import symbols appropriately. # define FTGL_EXPORT __declspec(dllexport) #else # define FTGL_EXPORT __declspec(dllimport) #endif #else // Compiler that is not MS Visual C++. // Ensure that the export symbol is defined (and blank) #define FTGL_EXPORT #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif // __ftgl__ rgl/src/ext/ftgl/FTGL/FTGLExtrdFont.h0000644000176000001440000000617712262026246016725 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTExtrudeFont__ #define __FTExtrudeFont__ #ifdef __cplusplus /** * FTExtrudeFont is a specialisation of the FTFont class for handling * extruded Polygon fonts * * @see FTFont * @see FTPolygonFont */ class FTGL_EXPORT FTExtrudeFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTExtrudeFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTExtrudeFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTExtrudeFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLExtrdFont FTExtrudeFont #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling extruded poygon fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont * @see ftglCreatePolygonFont */ FTGL_EXPORT FTGLfont *ftglCreateExtrudeFont(const char *file); FTGL_END_C_DECLS #endif // __FTExtrudeFont__ rgl/src/ext/ftgl/FTGL/FTFont.h0000644000176000001440000004730312262026246015467 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTFont__ #define __FTFont__ #ifdef __cplusplus class FTFontImpl; /** * FTFont is the public interface for the FTGL library. * * Specific font classes are derived from this class. It uses the helper * classes FTFace and FTSize to access the Freetype library. This class * is abstract and deriving classes must implement the protected * MakeGlyph function to create glyphs of the * appropriate type. * * It is good practice after using these functions to test the error * code returned. FT_Error Error(). Check the freetype file * fterrdef.h for error definitions. * * @see FTFace * @see FTSize */ class FTGL_EXPORT FTFont { protected: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTFont(char const *fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); private: /* Allow our internal subclasses to access the private constructor */ friend class FTBitmapFont; friend class FTBufferFont; friend class FTExtrudeFont; friend class FTOutlineFont; friend class FTPixmapFont; friend class FTPolygonFont; friend class FTTextureFont; /** * Internal FTGL FTFont constructor. For private use only. * * @param pImpl Internal implementation object. Will be destroyed * upon FTFont deletion. */ FTFont(FTFontImpl *pImpl); public: virtual ~FTFont(); /** * Attach auxilliary file to font e.g font metrics. * * Note: not all font formats implement this function. * * @param fontFilePath auxilliary font file path. * @return true if file has been attached * successfully. */ virtual bool Attach(const char* fontFilePath); /** * Attach auxilliary data to font e.g font metrics, from memory. * * Note: not all font formats implement this function. * * @param pBufferBytes the in-memory buffer. * @param bufferSizeInBytes the length of the buffer in bytes. * @return true if file has been attached * successfully. */ virtual bool Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Set the glyph loading flags. By default, fonts use the most * sensible flags when loading a font's glyph using FT_Load_Glyph(). * This function allows to override the default flags. * * @param flags The glyph loading flags. */ virtual void GlyphLoadFlags(FT_Int flags); /** * Set the character map for the face. * * @param encoding Freetype enumerate for char map code. * @return true if charmap was valid and * set correctly. */ virtual bool CharMap(FT_Encoding encoding); /** * Get the number of character maps in this face. * * @return character map count. */ virtual unsigned int CharMapCount() const; /** * Get a list of character maps in this face. * * @return pointer to the first encoding. */ virtual FT_Encoding* CharMapList(); /** * Set the char size for the current face. * * @param size the face size in points (1/72 inch) * @param res the resolution of the target device. * @return true if size was set correctly */ virtual bool FaceSize(const unsigned int size, const unsigned int res = 72); /** * Get the current face size in points (1/72 inch). * * @return face size */ virtual unsigned int FaceSize() const; /** * Set the extrusion distance for the font. Only implemented by * FTExtrudeFont * * @param depth The extrusion distance. */ virtual void Depth(float depth); /** * Set the outset distance for the font. Only implemented by * FTOutlineFont, FTPolygonFont and FTExtrudeFont * * @param outset The outset distance. */ virtual void Outset(float outset); /** * Set the front and back outset distances for the font. Only * implemented by FTExtrudeFont * * @param front The front outset distance. * @param back The back outset distance. */ virtual void Outset(float front, float back); /** * Enable or disable the use of Display Lists inside FTGL * * @param useList true turns ON display lists. * false turns OFF display lists. */ virtual void UseDisplayList(bool useList); /** * Get the global ascender height for the face. * * @return Ascender height */ virtual float Ascender() const; /** * Gets the global descender height for the face. * * @return Descender height */ virtual float Descender() const; /** * Gets the line spacing for the font. * * @return Line height */ virtual float LineHeight() const; /** * Get the bounding box for a string. * * @param string A char buffer. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param spacing A displacement vector to add after each character * has been checked (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const char *string, const int len = -1, FTPoint position = FTPoint(), FTPoint spacing = FTPoint()); /** * Get the bounding box for a string (deprecated). * * @param string A char buffer. * @param llx Lower left near x coordinate. * @param lly Lower left near y coordinate. * @param llz Lower left near z coordinate. * @param urx Upper right far x coordinate. * @param ury Upper right far y coordinate. * @param urz Upper right far z coordinate. */ void BBox(const char* string, float& llx, float& lly, float& llz, float& urx, float& ury, float& urz) { FTBBox b = BBox(string); llx = b.Lower().Xf(); lly = b.Lower().Yf(); llz = b.Lower().Zf(); urx = b.Upper().Xf(); ury = b.Upper().Yf(); urz = b.Upper().Zf(); } /** * Get the bounding box for a string. * * @param string A wchar_t buffer. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param spacing A displacement vector to add after each character * has been checked (optional). * @return The corresponding bounding box. */ virtual FTBBox BBox(const wchar_t *string, const int len = -1, FTPoint position = FTPoint(), FTPoint spacing = FTPoint()); /** * Get the bounding box for a string (deprecated). * * @param string A wchar_t buffer. * @param llx Lower left near x coordinate. * @param lly Lower left near y coordinate. * @param llz Lower left near z coordinate. * @param urx Upper right far x coordinate. * @param ury Upper right far y coordinate. * @param urz Upper right far z coordinate. */ void BBox(const wchar_t* string, float& llx, float& lly, float& llz, float& urx, float& ury, float& urz) { FTBBox b = BBox(string); llx = b.Lower().Xf(); lly = b.Lower().Yf(); llz = b.Lower().Zf(); urx = b.Upper().Xf(); ury = b.Upper().Yf(); urz = b.Upper().Zf(); } /** * Get the advance for a string. * * @param string 'C' style string to be checked. * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param spacing A displacement vector to add after each character * has been checked (optional). * @return The string's advance width. */ virtual float Advance(const char* string, const int len = -1, FTPoint spacing = FTPoint()); /** * Get the advance for a string. * * @param string A wchar_t string * @param len The length of the string. If < 0 then all characters * will be checked until a null character is encountered * (optional). * @param spacing A displacement vector to add after each character * has been checked (optional). * @return The string's advance width. */ virtual float Advance(const wchar_t* string, const int len = -1, FTPoint spacing = FTPoint()); /** * Render a string of characters. * * @param string 'C' style string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param spacing A displacement vector to add after each character * has been displayed (optional). * @param renderMode Render mode to use for display (optional). * @return The new pen position after the last character was output. */ virtual FTPoint Render(const char* string, const int len = -1, FTPoint position = FTPoint(), FTPoint spacing = FTPoint(), int renderMode = FTGL::RENDER_ALL); /** * Render a string of characters * * @param string wchar_t string to be output. * @param len The length of the string. If < 0 then all characters * will be displayed until a null character is encountered * (optional). * @param position The pen position of the first character (optional). * @param spacing A displacement vector to add after each character * has been displayed (optional). * @param renderMode Render mode to use for display (optional). * @return The new pen position after the last character was output. */ virtual FTPoint Render(const wchar_t *string, const int len = -1, FTPoint position = FTPoint(), FTPoint spacing = FTPoint(), int renderMode = FTGL::RENDER_ALL); /** * Queries the Font for errors. * * @return The current error code. */ virtual FT_Error Error() const; protected: /* Allow impl to access MakeGlyph */ friend class FTFontImpl; /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot) = 0; private: /** * Internal FTGL FTFont implementation object. For private use only. */ FTFontImpl *impl; }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * FTGLfont is the public interface for the FTGL library. * * It is good practice after using these functions to test the error * code returned. FT_Error Error(). Check the freetype file * fterrdef.h for error definitions. */ struct _FTGLFont; typedef struct _FTGLfont FTGLfont; /** * Create a custom FTGL font object. * * @param fontFilePath The font file name. * @param data A pointer to private data that will be passed to callbacks. * @param makeglyphCallback A glyph-making callback function. * @return An FTGLfont* object. */ FTGL_EXPORT FTGLfont *ftglCreateCustomFont(char const *fontFilePath, void *data, FTGLglyph * (*makeglyphCallback) (FT_GlyphSlot, void *)); /** * Destroy an FTGL font object. * * @param font An FTGLfont* object. */ FTGL_EXPORT void ftglDestroyFont(FTGLfont* font); /** * Attach auxilliary file to font e.g. font metrics. * * Note: not all font formats implement this function. * * @param font An FTGLfont* object. * @param path Auxilliary font file path. * @return 1 if file has been attached successfully. */ FTGL_EXPORT int ftglAttachFile(FTGLfont* font, const char* path); /** * Attach auxilliary data to font, e.g. font metrics, from memory. * * Note: not all font formats implement this function. * * @param font An FTGLfont* object. * @param data The in-memory buffer. * @param size The length of the buffer in bytes. * @return 1 if file has been attached successfully. */ FTGL_EXPORT int ftglAttachData(FTGLfont* font, const unsigned char * data, size_t size); /** * Set the character map for the face. * * @param font An FTGLfont* object. * @param encoding Freetype enumerate for char map code. * @return 1 if charmap was valid and set correctly. */ FTGL_EXPORT int ftglSetFontCharMap(FTGLfont* font, FT_Encoding encoding); /** * Get the number of character maps in this face. * * @param font An FTGLfont* object. * @return character map count. */ FTGL_EXPORT unsigned int ftglGetFontCharMapCount(FTGLfont* font); /** * Get a list of character maps in this face. * * @param font An FTGLfont* object. * @return pointer to the first encoding. */ FTGL_EXPORT FT_Encoding* ftglGetFontCharMapList(FTGLfont* font); /** * Set the char size for the current face. * * @param font An FTGLfont* object. * @param size The face size in points (1/72 inch). * @param res The resolution of the target device, or 0 to use the default * value of 72. * @return 1 if size was set correctly. */ FTGL_EXPORT int ftglSetFontFaceSize(FTGLfont* font, unsigned int size, unsigned int res); /** * Get the current face size in points (1/72 inch). * * @param font An FTGLfont* object. * @return face size */ FTGL_EXPORT unsigned int ftglGetFontFaceSize(FTGLfont* font); /** * Set the extrusion distance for the font. Only implemented by * FTExtrudeFont. * * @param font An FTGLfont* object. * @param depth The extrusion distance. */ FTGL_EXPORT void ftglSetFontDepth(FTGLfont* font, float depth); /** * Set the outset distance for the font. Only FTOutlineFont, FTPolygonFont * and FTExtrudeFont implement front outset. Only FTExtrudeFont implements * back outset. * * @param font An FTGLfont* object. * @param front The front outset distance. * @param back The back outset distance. */ FTGL_EXPORT void ftglSetFontOutset(FTGLfont* font, float front, float back); /** * Enable or disable the use of Display Lists inside FTGL. * * @param font An FTGLfont* object. * @param useList 1 turns ON display lists. * 0 turns OFF display lists. */ FTGL_EXPORT void ftglSetFontDisplayList(FTGLfont* font, int useList); /** * Get the global ascender height for the face. * * @param font An FTGLfont* object. * @return Ascender height */ FTGL_EXPORT float ftglGetFontAscender(FTGLfont* font); /** * Gets the global descender height for the face. * * @param font An FTGLfont* object. * @return Descender height */ FTGL_EXPORT float ftglGetFontDescender(FTGLfont* font); /** * Gets the line spacing for the font. * * @param font An FTGLfont* object. * @return Line height */ FTGL_EXPORT float ftglGetFontLineHeight(FTGLfont* font); /** * Get the bounding box for a string. * * @param font An FTGLfont* object. * @param string A char buffer * @param len The length of the string. If < 0 then all characters will be * checked until a null character is encountered (optional). * @param bounds An array of 6 float values where the bounding box's lower * left near and upper right far 3D coordinates will be stored. */ FTGL_EXPORT void ftglGetFontBBox(FTGLfont* font, const char *string, int len, float bounds[6]); /** * Get the advance width for a string. * * @param font An FTGLfont* object. * @param string A char string. * @return Advance width */ FTGL_EXPORT float ftglGetFontAdvance(FTGLfont* font, const char *string); /** * Render a string of characters. * * @param font An FTGLfont* object. * @param string Char string to be output. * @param mode Render mode to display. */ FTGL_EXPORT void ftglRenderFont(FTGLfont* font, const char *string, int mode); /** * Query a font for errors. * * @param font An FTGLfont* object. * @return The current error code. */ FTGL_EXPORT FT_Error ftglGetFontError(FTGLfont* font); FTGL_END_C_DECLS #endif // __FTFont__ rgl/src/ext/ftgl/FTGL/FTBitmapGlyph.h0000644000176000001440000000472512262026246017002 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTBitmapGlyph__ #define __FTBitmapGlyph__ #ifdef __cplusplus /** * FTBitmapGlyph is a specialisation of FTGlyph for creating bitmaps. */ class FTGL_EXPORT FTBitmapGlyph : public FTGlyph { public: /** * Constructor * * @param glyph The Freetype glyph to be processed */ FTBitmapGlyph(FT_GlyphSlot glyph); /** * Destructor */ virtual ~FTBitmapGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating bitmaps. * * @param glyph The Freetype glyph to be processed * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreateBitmapGlyph(FT_GlyphSlot glyph); FTGL_END_C_DECLS #endif // __FTBitmapGlyph__ rgl/src/ext/ftgl/FTGL/FTBBox.h0000644000176000001440000001177712262026246015421 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTBBox__ #define __FTBBox__ #ifdef __cplusplus /** * FTBBox is a convenience class for handling bounding boxes. */ class FTGL_EXPORT FTBBox { public: /** * Default constructor. Bounding box is set to zero. */ FTBBox() : lower(0.0f, 0.0f, 0.0f), upper(0.0f, 0.0f, 0.0f) {} /** * Constructor. */ FTBBox(float lx, float ly, float lz, float ux, float uy, float uz) : lower(lx, ly, lz), upper(ux, uy, uz) {} /** * Constructor. */ FTBBox(FTPoint l, FTPoint u) : lower(l), upper(u) {} /** * Constructor. Extracts a bounding box from a freetype glyph. Uses * the control box for the glyph. FT_Glyph_Get_CBox() * * @param glyph A freetype glyph */ FTBBox(FT_GlyphSlot glyph) : lower(0.0f, 0.0f, 0.0f), upper(0.0f, 0.0f, 0.0f) { FT_BBox bbox; FT_Outline_Get_CBox(&(glyph->outline), &bbox); lower.X(static_cast(bbox.xMin) / 64.0f); lower.Y(static_cast(bbox.yMin) / 64.0f); lower.Z(0.0f); upper.X(static_cast(bbox.xMax) / 64.0f); upper.Y(static_cast(bbox.yMax) / 64.0f); upper.Z(0.0f); } /** * Destructor */ ~FTBBox() {} /** * Mark the bounds invalid by setting all lower dimensions greater * than the upper dimensions. */ void Invalidate() { lower = FTPoint(1.0f, 1.0f, 1.0f); upper = FTPoint(-1.0f, -1.0f, -1.0f); } /** * Determines if this bounding box is valid. * * @return True if all lower values are <= the corresponding * upper values. */ bool IsValid() { return lower.X() <= upper.X() && lower.Y() <= upper.Y() && lower.Z() <= upper.Z(); } /** * Move the Bounding Box by a vector. * * @param vector The vector to move the bbox in 3D space. */ FTBBox& operator += (const FTPoint vector) { lower += vector; upper += vector; return *this; } /** * Combine two bounding boxes. The result is the smallest bounding * box containing the two original boxes. * * @param bbox The bounding box to merge with the second one. */ FTBBox& operator |= (const FTBBox& bbox) { if(bbox.lower.X() < lower.X()) lower.X(bbox.lower.X()); if(bbox.lower.Y() < lower.Y()) lower.Y(bbox.lower.Y()); if(bbox.lower.Z() < lower.Z()) lower.Z(bbox.lower.Z()); if(bbox.upper.X() > upper.X()) upper.X(bbox.upper.X()); if(bbox.upper.Y() > upper.Y()) upper.Y(bbox.upper.Y()); if(bbox.upper.Z() > upper.Z()) upper.Z(bbox.upper.Z()); return *this; } void SetDepth(float depth) { if(depth > 0) upper.Z(lower.Z() + depth); else lower.Z(upper.Z() + depth); } inline FTPoint const Upper() const { return upper; } inline FTPoint const Lower() const { return lower; } private: /** * The bounds of the box */ FTPoint lower, upper; }; #endif //__cplusplus #endif // __FTBBox__ rgl/src/ext/ftgl/FTGL/FTExtrdGlyph.h0000644000176000001440000000727512262026246016657 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTExtrudeGlyph__ #define __FTExtrudeGlyph__ #ifdef __cplusplus /** * FTExtrudeGlyph is a specialisation of FTGlyph for creating tessellated * extruded polygon glyphs. */ class FTGL_EXPORT FTExtrudeGlyph : public FTGlyph { public: /** * Constructor. Sets the Error to Invalid_Outline if the glyph isn't * an outline. * * @param glyph The Freetype glyph to be processed * @param depth The distance along the z axis to extrude the glyph * @param frontOutset outset contour size * @param backOutset outset contour size * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. */ FTExtrudeGlyph(FT_GlyphSlot glyph, float depth, float frontOutset, float backOutset, bool useDisplayList); /** * Destructor */ virtual ~FTExtrudeGlyph(); /** * Render this glyph at the current pen position. * * @param pen The current pen position. * @param renderMode Render mode to display * @return The advance distance for this glyph. */ virtual const FTPoint& Render(const FTPoint& pen, int renderMode); }; #define FTExtrdGlyph FTExtrudeGlyph #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialisation of FTGLglyph for creating tessellated * extruded polygon glyphs. * * @param glyph The Freetype glyph to be processed * @param depth The distance along the z axis to extrude the glyph * @param frontOutset outset contour size * @param backOutset outset contour size * @param useDisplayList Enable or disable the use of Display Lists * for this glyph * true turns ON display lists. * false turns OFF display lists. * @return An FTGLglyph* object. */ FTGL_EXPORT FTGLglyph *ftglCreateExtrudeGlyph(FT_GlyphSlot glyph, float depth, float frontOutset, float backOutset, int useDisplayList); FTGL_END_C_DECLS #endif // __FTExtrudeGlyph__ rgl/src/ext/ftgl/FTGL/FTGLOutlineFont.h0000644000176000001440000000611512262026246017246 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Sean Morrison * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __ftgl__ # warning This header is deprecated. Please use from now. # include #endif #ifndef __FTOutlineFont__ #define __FTOutlineFont__ #ifdef __cplusplus /** * FTOutlineFont is a specialisation of the FTFont class for handling * Vector Outline fonts * * @see FTFont */ class FTGL_EXPORT FTOutlineFont : public FTFont { public: /** * Open and read a font file. Sets Error flag. * * @param fontFilePath font file path. */ FTOutlineFont(const char* fontFilePath); /** * Open and read a font from a buffer in memory. Sets Error flag. * The buffer is owned by the client and is NOT copied by FTGL. The * pointer must be valid while using FTGL. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTOutlineFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Destructor */ ~FTOutlineFont(); protected: /** * Construct a glyph of the correct type. * * Clients must override the function and return their specialised * FTGlyph. * * @param slot A FreeType glyph slot. * @return An FT****Glyph or null on failure. */ virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot); }; #define FTGLOutlineFont FTOutlineFont #endif //__cplusplus FTGL_BEGIN_C_DECLS /** * Create a specialised FTGLfont object for handling vector outline fonts. * * @param file The font file name. * @return An FTGLfont* object. * * @see FTGLfont */ FTGL_EXPORT FTGLfont *ftglCreateOutlineFont(const char *file); FTGL_END_C_DECLS #endif // __FTOutlineFont__ rgl/src/ext/ftgl/FTContour.cpp0000644000176000001440000001625312262026246016011 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * Copyright (c) 2008 Éric Beets * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTContour.h" #include static const unsigned int BEZIER_STEPS = 5; void FTContour::AddPoint(FTPoint point) { if(pointList.empty() || (point != pointList[pointList.size() - 1] && point != pointList[0])) { pointList.push_back(point); } } void FTContour::AddOutsetPoint(FTPoint point) { outsetPointList.push_back(point); } void FTContour::AddFrontPoint(FTPoint point) { frontPointList.push_back(point); } void FTContour::AddBackPoint(FTPoint point) { backPointList.push_back(point); } void FTContour::evaluateQuadraticCurve(FTPoint A, FTPoint B, FTPoint C) { for(unsigned int i = 1; i < BEZIER_STEPS; i++) { float t = static_cast(i) / BEZIER_STEPS; FTPoint U = (1.0f - t) * A + t * B; FTPoint V = (1.0f - t) * B + t * C; AddPoint((1.0f - t) * U + t * V); } } void FTContour::evaluateCubicCurve(FTPoint A, FTPoint B, FTPoint C, FTPoint D) { for(unsigned int i = 0; i < BEZIER_STEPS; i++) { float t = static_cast(i) / BEZIER_STEPS; FTPoint U = (1.0f - t) * A + t * B; FTPoint V = (1.0f - t) * B + t * C; FTPoint W = (1.0f - t) * C + t * D; FTPoint M = (1.0f - t) * U + t * V; FTPoint N = (1.0f - t) * V + t * W; AddPoint((1.0f - t) * M + t * N); } } // This function is a bit tricky. Given a path ABC, it returns the // coordinates of the outset point facing B on the left at a distance // of 64.0. // M // - - - - - - X // ^ / ' // | 64.0 / ' // X---->-----X ==> X--v-------X ' // A B \ A B \ .>' // \ \<' 64.0 // \ \ . // \ \ . // C X C X // FTPoint FTContour::ComputeOutsetPoint(FTPoint A, FTPoint B, FTPoint C) { /* Build the rotation matrix from 'ba' vector */ FTPoint ba = (A - B).Normalise(); FTPoint bc = C - B; /* Rotate bc to the left */ FTPoint tmp(bc.X() * -ba.X() + bc.Y() * -ba.Y(), bc.X() * ba.Y() + bc.Y() * -ba.X()); /* Compute the vector bisecting 'abc' */ FTGL_DOUBLE norm = sqrt(tmp.X() * tmp.X() + tmp.Y() * tmp.Y()); FTGL_DOUBLE dist = 64.0 * sqrt((norm - tmp.X()) / (norm + tmp.X())); tmp.X(tmp.Y() < 0.0 ? dist : -dist); tmp.Y(64.0); /* Rotate the new bc to the right */ return FTPoint(tmp.X() * -ba.X() + tmp.Y() * ba.Y(), tmp.X() * -ba.Y() + tmp.Y() * -ba.X()); } void FTContour::SetParity(int parity) { size_t size = PointCount(); FTPoint vOutset; if(((parity & 1) && clockwise) || (!(parity & 1) && !clockwise)) { // Contour orientation is wrong! We must reverse all points. // FIXME: could it be worth writing FTVector::reverse() for this? for(size_t i = 0; i < size / 2; i++) { FTPoint tmp = pointList[i]; pointList[i] = pointList[size - 1 - i]; pointList[size - 1 -i] = tmp; } clockwise = !clockwise; } for(size_t i = 0; i < size; i++) { size_t prev, cur, next; prev = (i + size - 1) % size; cur = i; next = (i + size + 1) % size; vOutset = ComputeOutsetPoint(Point(prev), Point(cur), Point(next)); AddOutsetPoint(vOutset); } } FTContour::FTContour(FT_Vector* contour, char* tags, unsigned int n) { FTPoint prev, cur(contour[(n - 1) % n]), next(contour[0]); FTPoint a, b = next - cur; double olddir, dir = atan2((next - cur).Y(), (next - cur).X()); double angle = 0.0; // See http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-6.html // for a full description of FreeType tags. for(unsigned int i = 0; i < n; i++) { prev = cur; cur = next; next = FTPoint(contour[(i + 1) % n]); olddir = dir; dir = atan2((next - cur).Y(), (next - cur).X()); // Compute our path's new direction. double t = dir - olddir; if(t < -M_PI) t += 2 * M_PI; if(t > M_PI) t -= 2 * M_PI; angle += t; // Only process point tags we know. if(n < 2 || FT_CURVE_TAG(tags[i]) == FT_Curve_Tag_On) { AddPoint(cur); } else if(FT_CURVE_TAG(tags[i]) == FT_Curve_Tag_Conic) { FTPoint prev2 = prev, next2 = next; // Previous point is either the real previous point (an "on" // point), or the midpoint between the current one and the // previous "conic off" point. if(FT_CURVE_TAG(tags[(i - 1 + n) % n]) == FT_Curve_Tag_Conic) { prev2 = (cur + prev) * 0.5; AddPoint(prev2); } // Next point is either the real next point or the midpoint. if(FT_CURVE_TAG(tags[(i + 1) % n]) == FT_Curve_Tag_Conic) { next2 = (cur + next) * 0.5; } evaluateQuadraticCurve(prev2, cur, next2); } else if(FT_CURVE_TAG(tags[i]) == FT_Curve_Tag_Cubic && FT_CURVE_TAG(tags[(i + 1) % n]) == FT_Curve_Tag_Cubic) { evaluateCubicCurve(prev, cur, next, FTPoint(contour[(i + 2) % n])); } } // If final angle is positive (+2PI), it's an anti-clockwise contour, // otherwise (-2PI) it's clockwise. clockwise = (angle < 0.0); } void FTContour::buildFrontOutset(float outset) { for(size_t i = 0; i < PointCount(); ++i) { AddFrontPoint(Point(i) + Outset(i) * outset); } } void FTContour::buildBackOutset(float outset) { for(size_t i = 0; i < PointCount(); ++i) { AddBackPoint(Point(i) + Outset(i) * outset); } } rgl/src/ext/ftgl/FTFont/0000755000176000001440000000000012100313501014533 5ustar ripleyusersrgl/src/ext/ftgl/FTFont/FTBitmapFont.cpp0000644000176000001440000000577712262026246017574 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTBitmapFontImpl.h" // // FTBitmapFont // FTBitmapFont::FTBitmapFont(char const *fontFilePath) : FTFont(new FTBitmapFontImpl(this, fontFilePath)) {} FTBitmapFont::FTBitmapFont(unsigned char const *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTBitmapFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTBitmapFont::~FTBitmapFont() {} FTGlyph* FTBitmapFont::MakeGlyph(FT_GlyphSlot ftGlyph) { return new FTBitmapGlyph(ftGlyph); } // // FTBitmapFontImpl // template inline FTPoint FTBitmapFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { // Protect GL_BLEND glPushAttrib(GL_COLOR_BUFFER_BIT); // Protect glPixelStorei() calls (also in FTBitmapGlyphImpl::RenderImpl) glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDisable(GL_BLEND); FTPoint tmp = FTFontImpl::Render(string, len, position, spacing, renderMode); glPopClientAttrib(); glPopAttrib(); return tmp; } FTPoint FTBitmapFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } FTPoint FTBitmapFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } rgl/src/ext/ftgl/FTFont/FTFontGlue.cpp0000644000176000001440000001701012262026246017233 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTInternals.h" static const FTPoint static_ftpoint; static const FTBBox static_ftbbox; FTGL_BEGIN_C_DECLS #define C_TOR(cname, cargs, cxxname, cxxarg, cxxtype) \ FTGLfont* cname cargs \ { \ cxxname *f = new cxxname cxxarg; \ if(f->Error()) \ { \ delete f; \ return NULL; \ } \ FTGLfont *ftgl = (FTGLfont *)malloc(sizeof(FTGLfont)); \ ftgl->ptr = f; \ ftgl->type = cxxtype; \ return ftgl; \ } // FTBitmapFont::FTBitmapFont(); C_TOR(ftglCreateBitmapFont, (const char *fontname), FTBitmapFont, (fontname), FONT_BITMAP); // FTBufferFont::FTBufferFont(); C_TOR(ftglCreateBufferFont, (const char *fontname), FTBufferFont, (fontname), FONT_BUFFER); // FTExtrudeFont::FTExtrudeFont(); C_TOR(ftglCreateExtrudeFont, (const char *fontname), FTExtrudeFont, (fontname), FONT_EXTRUDE); // FTOutlineFont::FTOutlineFont(); C_TOR(ftglCreateOutlineFont, (const char *fontname), FTOutlineFont, (fontname), FONT_OUTLINE); // FTPixmapFont::FTPixmapFont(); C_TOR(ftglCreatePixmapFont, (const char *fontname), FTPixmapFont, (fontname), FONT_PIXMAP); // FTPolygonFont::FTPolygonFont(); C_TOR(ftglCreatePolygonFont, (const char *fontname), FTPolygonFont, (fontname), FONT_POLYGON); // FTTextureFont::FTTextureFont(); C_TOR(ftglCreateTextureFont, (const char *fontname), FTTextureFont, (fontname), FONT_TEXTURE); // FTCustomFont::FTCustomFont(); class FTCustomFont : public FTFont { public: FTCustomFont(char const *fontFilePath, void *p, FTGLglyph * (*makeglyph) (FT_GlyphSlot, void *)) : FTFont(fontFilePath), data(p), makeglyphCallback(makeglyph) {} ~FTCustomFont() {} FTGlyph* MakeGlyph(FT_GlyphSlot slot) { FTGLglyph *g = makeglyphCallback(slot, data); FTGlyph *glyph = g->ptr; // XXX: we no longer need g, and no one will free it for us. Not // very elegant, and we need to make sure no one else will try to // use it. free(g); return glyph; } private: void *data; FTGLglyph *(*makeglyphCallback) (FT_GlyphSlot, void *); }; C_TOR(ftglCreateCustomFont, (char const *fontFilePath, void *data, FTGLglyph * (*makeglyphCallback) (FT_GlyphSlot, void *)), FTCustomFont, (fontFilePath, data, makeglyphCallback), FONT_CUSTOM); #define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ cret cname cargs \ { \ if(!f || !f->ptr) \ { \ fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ cxxerr; \ } \ return f->ptr->cxxname cxxarg; \ } // FTFont::~FTFont(); void ftglDestroyFont(FTGLfont *f) { if(!f || !f->ptr) { fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); return; } delete f->ptr; free(f); } // bool FTFont::Attach(const char* fontFilePath); C_FUN(int, ftglAttachFile, (FTGLfont *f, const char* path), return 0, Attach, (path)); // bool FTFont::Attach(const unsigned char *pBufferBytes, // size_t bufferSizeInBytes); C_FUN(int, ftglAttachData, (FTGLfont *f, const unsigned char *p, size_t s), return 0, Attach, (p, s)); // void FTFont::GlyphLoadFlags(FT_Int flags); C_FUN(void, ftglSetFontGlyphLoadFlags, (FTGLfont *f, FT_Int flags), return, GlyphLoadFlags, (flags)); // bool FTFont::CharMap(FT_Encoding encoding); C_FUN(int, ftglSetFontCharMap, (FTGLfont *f, FT_Encoding enc), return 0, CharMap, (enc)); // unsigned int FTFont::CharMapCount(); C_FUN(unsigned int, ftglGetFontCharMapCount, (FTGLfont *f), return 0, CharMapCount, ()); // FT_Encoding* FTFont::CharMapList(); C_FUN(FT_Encoding *, ftglGetFontCharMapList, (FTGLfont* f), return NULL, CharMapList, ()); // virtual bool FTFont::FaceSize(const unsigned int size, // const unsigned int res = 72); C_FUN(int, ftglSetFontFaceSize, (FTGLfont *f, unsigned int s, unsigned int r), return 0, FaceSize, (s, r > 0 ? r : 72)); // unsigned int FTFont::FaceSize() const; // XXX: need to call FaceSize() as FTFont::FaceSize() because of FTGLTexture C_FUN(unsigned int, ftglGetFontFaceSize, (FTGLfont *f), return 0, FTFont::FaceSize, ()); // virtual void FTFont::Depth(float depth); C_FUN(void, ftglSetFontDepth, (FTGLfont *f, float d), return, Depth, (d)); // virtual void FTFont::Outset(float front, float back); C_FUN(void, ftglSetFontOutset, (FTGLfont *f, float front, float back), return, FTFont::Outset, (front, back)); // void FTFont::UseDisplayList(bool useList); C_FUN(void, ftglSetFontDisplayList, (FTGLfont *f, int l), return, UseDisplayList, (l != 0)); // float FTFont::Ascender() const; C_FUN(float, ftglGetFontAscender, (FTGLfont *f), return 0.f, Ascender, ()); // float FTFont::Descender() const; C_FUN(float, ftglGetFontDescender, (FTGLfont *f), return 0.f, Descender, ()); // float FTFont::LineHeight() const; C_FUN(float, ftglGetFontLineHeight, (FTGLfont *f), return 0.f, LineHeight, ()); // void FTFont::BBox(const char* string, float& llx, float& lly, float& llz, // float& urx, float& ury, float& urz); extern "C++" { C_FUN(static FTBBox, _ftglGetFontBBox, (FTGLfont *f, char const *s, int len), return static_ftbbox, BBox, (s, len)); } void ftglGetFontBBox(FTGLfont *f, const char* s, int len, float c[6]) { FTBBox ret = _ftglGetFontBBox(f, s, len); FTPoint lower = ret.Lower(), upper = ret.Upper(); c[0] = lower.Xf(); c[1] = lower.Yf(); c[2] = lower.Zf(); c[3] = upper.Xf(); c[4] = upper.Yf(); c[5] = upper.Zf(); } // float FTFont::Advance(const char* string); C_FUN(float, ftglGetFontAdvance, (FTGLfont *f, char const *s), return 0.0, Advance, (s)); // virtual void Render(const char* string, int renderMode); extern "C++" { C_FUN(static FTPoint, _ftglRenderFont, (FTGLfont *f, char const *s, int len, FTPoint pos, FTPoint spacing, int mode), return static_ftpoint, Render, (s, len, pos, spacing, mode)); } void ftglRenderFont(FTGLfont *f, const char *s, int mode) { _ftglRenderFont(f, s, -1, FTPoint(), FTPoint(), mode); } // FT_Error FTFont::Error() const; C_FUN(FT_Error, ftglGetFontError, (FTGLfont *f), return -1, Error, ()); FTGL_END_C_DECLS rgl/src/ext/ftgl/FTFont/FTBufferFont.cpp0000644000176000001440000002265112262026246017557 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTBufferFontImpl.h" // // FTBufferFont // FTBufferFont::FTBufferFont(char const *fontFilePath) : FTFont(new FTBufferFontImpl(this, fontFilePath)) {} FTBufferFont::FTBufferFont(unsigned char const *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTBufferFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTBufferFont::~FTBufferFont() {} FTGlyph* FTBufferFont::MakeGlyph(FT_GlyphSlot ftGlyph) { FTBufferFontImpl *myimpl = dynamic_cast(impl); if(!myimpl) { return NULL; } return myimpl->MakeGlyphImpl(ftGlyph); } // // FTBufferFontImpl // FTBufferFontImpl::FTBufferFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath), buffer(new FTBuffer()) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; glGenTextures(BUFFER_CACHE_SIZE, idCache); for(int i = 0; i < BUFFER_CACHE_SIZE; i++) { stringCache[i] = NULL; glBindTexture(GL_TEXTURE_2D, idCache[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } lastString = 0; } FTBufferFontImpl::FTBufferFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), buffer(new FTBuffer()) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; glGenTextures(BUFFER_CACHE_SIZE, idCache); for(int i = 0; i < BUFFER_CACHE_SIZE; i++) { stringCache[i] = NULL; glBindTexture(GL_TEXTURE_2D, idCache[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } lastString = 0; } FTBufferFontImpl::~FTBufferFontImpl() { glDeleteTextures(BUFFER_CACHE_SIZE, idCache); for(int i = 0; i < BUFFER_CACHE_SIZE; i++) { if(stringCache[i]) { free(stringCache[i]); } } delete buffer; } FTGlyph* FTBufferFontImpl::MakeGlyphImpl(FT_GlyphSlot ftGlyph) { return new FTBufferGlyph(ftGlyph, buffer); } bool FTBufferFontImpl::FaceSize(const unsigned int size, const unsigned int res) { for(int i = 0; i < BUFFER_CACHE_SIZE; i++) { if(stringCache[i]) { free(stringCache[i]); stringCache[i] = NULL; } } return FTFontImpl::FaceSize(size, res); } static inline GLuint NextPowerOf2(GLuint in) { in -= 1; in |= in >> 16; in |= in >> 8; in |= in >> 4; in |= in >> 2; in |= in >> 1; return in + 1; } inline int StringCompare(void const *a, char const *b, int len) { return len < 0 ? strcmp((char const *)a, b) : strncmp((char const *)a, b, len); } inline int StringCompare(void const *a, wchar_t const *b, int len) { return len < 0 ? wcscmp((wchar_t const *)a, b) : wcsncmp((wchar_t const *)a, b, len); } inline char *StringCopy(char const *s, int len) { if(len < 0) { return strdup(s); } else { #ifdef HAVE_STRNDUP return strndup(s, len); #else char *s2 = (char*)malloc(len + 1); memcpy(s2, s, len); s2[len] = 0; return s2; #endif } } inline wchar_t *StringCopy(wchar_t const *s, int len) { if(len < 0) { #if defined HAVE_WCSDUP return wcsdup(s); #else len = (int)wcslen(s); #endif } wchar_t *s2 = (wchar_t *)malloc((len + 1) * sizeof(wchar_t)); memcpy(s2, s, len * sizeof(wchar_t)); s2[len] = 0; return s2; } template inline FTPoint FTBufferFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { const float padding = 3.0f; int width, height, texWidth, texHeight; int cacheIndex = -1; bool inCache = false; // Protect blending functions, GL_BLEND and GL_TEXTURE_2D glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT); // Protect glPixelStorei() calls glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE // Search whether the string is already in a texture we uploaded for(int n = 0; n < BUFFER_CACHE_SIZE; n++) { int i = (lastString + n + BUFFER_CACHE_SIZE) % BUFFER_CACHE_SIZE; if(stringCache[i] && !StringCompare(stringCache[i], string, len)) { cacheIndex = i; inCache = true; break; } } // If the string was not found, we need to put it in the cache and compute // its new bounding box. if(!inCache) { // FIXME: this cache is not very efficient. We should first expire // strings that are not used very often. cacheIndex = lastString; lastString = (lastString + 1) % BUFFER_CACHE_SIZE; if(stringCache[cacheIndex]) { free(stringCache[cacheIndex]); } // FIXME: only the first N bytes are copied; we want the first N chars. stringCache[cacheIndex] = StringCopy(string, len); bboxCache[cacheIndex] = BBox(string, len, FTPoint(), spacing); } FTBBox bbox = bboxCache[cacheIndex]; width = static_cast(bbox.Upper().X() - bbox.Lower().X() + padding + padding + 0.5); height = static_cast(bbox.Upper().Y() - bbox.Lower().Y() + padding + padding + 0.5); texWidth = NextPowerOf2(width); texHeight = NextPowerOf2(height); glBindTexture(GL_TEXTURE_2D, idCache[cacheIndex]); // If the string was not found, we need to render the text in a new // texture buffer, then upload it to the OpenGL layer. if(!inCache) { buffer->Size(texWidth, texHeight); buffer->Pos(FTPoint(padding, padding) - bbox.Lower()); advanceCache[cacheIndex] = FTFontImpl::Render(string, len, FTPoint(), spacing, renderMode); glBindTexture(GL_TEXTURE_2D, idCache[cacheIndex]); glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* TODO: use glTexSubImage2D later? */ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texWidth, texHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, (GLvoid *)buffer->Pixels()); buffer->Size(0, 0); } FTPoint low = position + bbox.Lower(); FTPoint up = position + bbox.Upper(); glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, 1.0f); glTexCoord2f(padding / texWidth, (texHeight - height + padding) / texHeight); glVertex2f(low.Xf(), up.Yf()); glTexCoord2f(padding / texWidth, (texHeight - padding) / texHeight); glVertex2f(low.Xf(), low.Yf()); glTexCoord2f((width - padding) / texWidth, (texHeight - padding) / texHeight); glVertex2f(up.Xf(), low.Yf()); glTexCoord2f((width - padding) / texWidth, (texHeight - height + padding) / texHeight); glVertex2f(up.Xf(), up.Yf()); glEnd(); glPopClientAttrib(); glPopAttrib(); return position + advanceCache[cacheIndex]; } FTPoint FTBufferFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } FTPoint FTBufferFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } rgl/src/ext/ftgl/FTFont/FTBitmapFontImpl.h0000644000176000001440000000447612262026246020056 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTBitmapFontImpl__ #define __FTBitmapFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTBitmapFontImpl : public FTFontImpl { friend class FTBitmapFont; protected: FTBitmapFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath) {}; FTBitmapFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes) {}; virtual FTPoint Render(const char *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint position, FTPoint spacing, int renderMode); private: /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); }; #endif // __FTBitmapFontImpl__ rgl/src/ext/ftgl/FTFont/FTPolygonFont.cpp0000644000176000001440000000471712262026246020000 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTPolygonFontImpl.h" // // FTPolygonFont // FTPolygonFont::FTPolygonFont(char const *fontFilePath) : FTFont(new FTPolygonFontImpl(this, fontFilePath)) {} FTPolygonFont::FTPolygonFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTPolygonFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTPolygonFont::~FTPolygonFont() {} FTGlyph* FTPolygonFont::MakeGlyph(FT_GlyphSlot ftGlyph) { FTPolygonFontImpl *myimpl = dynamic_cast(impl); if(!myimpl) { return NULL; } return new FTPolygonGlyph(ftGlyph, myimpl->outset, myimpl->useDisplayLists); } // // FTPolygonFontImpl // FTPolygonFontImpl::FTPolygonFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath), outset(0.0f) { load_flags = FT_LOAD_NO_HINTING; } FTPolygonFontImpl::FTPolygonFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), outset(0.0f) { load_flags = FT_LOAD_NO_HINTING; } rgl/src/ext/ftgl/FTFont/FTFontImpl.h0000644000176000001440000001135312262026246016711 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTFontImpl__ #define __FTFontImpl__ #include "FTGL/ftgl.h" #include "FTFace.h" class FTGlyphContainer; class FTGlyph; class FTFontImpl { friend class FTFont; protected: FTFontImpl(FTFont *ftFont, char const *fontFilePath); FTFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); virtual ~FTFontImpl(); virtual bool Attach(const char* fontFilePath); virtual bool Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); virtual void GlyphLoadFlags(FT_Int flags); virtual bool CharMap(FT_Encoding encoding); virtual unsigned int CharMapCount() const; virtual FT_Encoding* CharMapList(); virtual void UseDisplayList(bool useList); virtual float Ascender() const; virtual float Descender() const; virtual float LineHeight() const; virtual bool FaceSize(const unsigned int size, const unsigned int res); virtual unsigned int FaceSize() const; virtual void Depth(float depth); virtual void Outset(float outset); virtual void Outset(float front, float back); virtual FTBBox BBox(const char *s, const int len, FTPoint, FTPoint); virtual FTBBox BBox(const wchar_t *s, const int len, FTPoint, FTPoint); virtual float Advance(const char *s, const int len, FTPoint); virtual float Advance(const wchar_t *s, const int len, FTPoint); virtual FTPoint Render(const char *s, const int len, FTPoint, FTPoint, int); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint, FTPoint, int); /** * Current face object */ FTFace face; /** * Current size object */ FTSize charSize; /** * Flag to enable or disable the use of Display Lists inside FTGL * true turns ON display lists. * false turns OFF display lists. */ bool useDisplayLists; /** * The default glyph loading flags. */ FT_Int load_flags; /** * Current error code. Zero means no error. */ FT_Error err; private: /** * A link back to the interface of which we are the implementation. */ FTFont *intf; /** * Check that the glyph at chr exist. If not load it. * * @param chr character index * @return true if the glyph can be created. */ bool CheckGlyph(const unsigned int chr); /** * An object that holds a list of glyphs */ FTGlyphContainer* glyphList; /** * Current pen or cursor position; */ FTPoint pen; /* Internal generic BBox() implementation */ template inline FTBBox BBoxI(const T *s, const int len, FTPoint position, FTPoint spacing); /* Internal generic Advance() implementation */ template inline float AdvanceI(const T *s, const int len, FTPoint spacing); /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); }; #endif // __FTFontImpl__ rgl/src/ext/ftgl/FTFont/FTExtrudeFontImpl.h0000644000176000001440000000510512262026246020250 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTExtrudeFontImpl__ #define __FTExtrudeFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTExtrudeFontImpl : public FTFontImpl { friend class FTExtrudeFont; protected: FTExtrudeFontImpl(FTFont *ftFont, const char* fontFilePath); FTExtrudeFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Set the extrusion distance for the font. * * @param d The extrusion distance. */ virtual void Depth(float d) { depth = d; } /** * Set the outset distance for the font. Only implemented by * FTOutlineFont, FTPolygonFont and FTExtrudeFont * * @param o The outset distance. */ virtual void Outset(float o) { front = back = o; } /** * Set the outset distance for the font. Only implemented by * FTExtrudeFont * * @param f The front outset distance. * @param b The back outset distance. */ virtual void Outset(float f, float b) { front = f; back = b; } private: /** * The extrusion distance for the font. */ float depth; /** * The outset distance (front and back) for the font. */ float front, back; }; #endif // __FTExtrudeFontImpl__ rgl/src/ext/ftgl/FTFont/FTFont.cpp0000644000176000001440000002601712262026246016425 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTInternals.h" #include "FTUnicode.h" #include "FTFontImpl.h" #include "FTBitmapFontImpl.h" #include "FTExtrudeFontImpl.h" #include "FTOutlineFontImpl.h" #include "FTPixmapFontImpl.h" #include "FTPolygonFontImpl.h" #include "FTTextureFontImpl.h" #include "FTGlyphContainer.h" #include "FTFace.h" // // FTFont // FTFont::FTFont(char const *fontFilePath) { impl = new FTFontImpl(this, fontFilePath); } FTFont::FTFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) { impl = new FTFontImpl(this, pBufferBytes, bufferSizeInBytes); } FTFont::FTFont(FTFontImpl *pImpl) { impl = pImpl; } FTFont::~FTFont() { delete impl; } bool FTFont::Attach(const char* fontFilePath) { return impl->Attach(fontFilePath); } bool FTFont::Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) { return impl->Attach(pBufferBytes, bufferSizeInBytes); } bool FTFont::FaceSize(const unsigned int size, const unsigned int res) { return impl->FaceSize(size, res); } unsigned int FTFont::FaceSize() const { return impl->FaceSize(); } void FTFont::Depth(float depth) { return impl->Depth(depth); } void FTFont::Outset(float outset) { return impl->Outset(outset); } void FTFont::Outset(float front, float back) { return impl->Outset(front, back); } void FTFont::GlyphLoadFlags(FT_Int flags) { return impl->GlyphLoadFlags(flags); } bool FTFont::CharMap(FT_Encoding encoding) { return impl->CharMap(encoding); } unsigned int FTFont::CharMapCount() const { return impl->CharMapCount(); } FT_Encoding* FTFont::CharMapList() { return impl->CharMapList(); } void FTFont::UseDisplayList(bool useList) { return impl->UseDisplayList(useList); } float FTFont::Ascender() const { return impl->Ascender(); } float FTFont::Descender() const { return impl->Descender(); } float FTFont::LineHeight() const { return impl->LineHeight(); } FTPoint FTFont::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return impl->Render(string, len, position, spacing, renderMode); } FTPoint FTFont::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return impl->Render(string, len, position, spacing, renderMode); } float FTFont::Advance(const char * string, const int len, FTPoint spacing) { return impl->Advance(string, len, spacing); } float FTFont::Advance(const wchar_t * string, const int len, FTPoint spacing) { return impl->Advance(string, len, spacing); } FTBBox FTFont::BBox(const char *string, const int len, FTPoint position, FTPoint spacing) { return impl->BBox(string, len, position, spacing); } FTBBox FTFont::BBox(const wchar_t *string, const int len, FTPoint position, FTPoint spacing) { return impl->BBox(string, len, position, spacing); } FT_Error FTFont::Error() const { return impl->err; } // // FTFontImpl // FTFontImpl::FTFontImpl(FTFont *ftFont, char const *fontFilePath) : face(fontFilePath), useDisplayLists(true), load_flags(FT_LOAD_DEFAULT), intf(ftFont), glyphList(0) { err = face.Error(); if(err == 0) { glyphList = new FTGlyphContainer(&face); } } FTFontImpl::FTFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : face(pBufferBytes, bufferSizeInBytes), useDisplayLists(true), load_flags(FT_LOAD_DEFAULT), intf(ftFont), glyphList(0) { err = face.Error(); if(err == 0) { glyphList = new FTGlyphContainer(&face); } } FTFontImpl::~FTFontImpl() { if(glyphList) { delete glyphList; } } bool FTFontImpl::Attach(const char* fontFilePath) { if(!face.Attach(fontFilePath)) { err = face.Error(); return false; } err = 0; return true; } bool FTFontImpl::Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) { if(!face.Attach(pBufferBytes, bufferSizeInBytes)) { err = face.Error(); return false; } err = 0; return true; } bool FTFontImpl::FaceSize(const unsigned int size, const unsigned int res) { if(glyphList != NULL) { delete glyphList; glyphList = NULL; } charSize = face.Size(size, res); err = face.Error(); if(err != 0) { return false; } glyphList = new FTGlyphContainer(&face); return true; } unsigned int FTFontImpl::FaceSize() const { return charSize.CharSize(); } void FTFontImpl::Depth(float depth) { ; } void FTFontImpl::Outset(float outset) { ; } void FTFontImpl::Outset(float front, float back) { ; } void FTFontImpl::GlyphLoadFlags(FT_Int flags) { load_flags = flags; } bool FTFontImpl::CharMap(FT_Encoding encoding) { bool result = glyphList->CharMap(encoding); err = glyphList->Error(); return result; } unsigned int FTFontImpl::CharMapCount() const { return face.CharMapCount(); } FT_Encoding* FTFontImpl::CharMapList() { return face.CharMapList(); } void FTFontImpl::UseDisplayList(bool useList) { useDisplayLists = useList; } float FTFontImpl::Ascender() const { return charSize.Ascender(); } float FTFontImpl::Descender() const { return charSize.Descender(); } float FTFontImpl::LineHeight() const { return charSize.Height(); } template inline FTBBox FTFontImpl::BBoxI(const T* string, const int len, FTPoint position, FTPoint spacing) { FTBBox totalBBox; /* Only compute the bounds if string is non-empty. */ if(string && ('\0' != string[0])) { // for multibyte - we can't rely on sizeof(T) == character FTUnicodeStringItr ustr(string); unsigned int thisChar = *ustr++; unsigned int nextChar = *ustr; if(CheckGlyph(thisChar)) { totalBBox = glyphList->BBox(thisChar); totalBBox += position; position += FTPoint(glyphList->Advance(thisChar, nextChar), 0.0); } /* Expand totalBox by each glyph in string */ for(int i = 1; (len < 0 && *ustr) || (len >= 0 && i < len); i++) { thisChar = *ustr++; nextChar = *ustr; if(CheckGlyph(thisChar)) { position += spacing; FTBBox tempBBox = glyphList->BBox(thisChar); tempBBox += position; totalBBox |= tempBBox; position += FTPoint(glyphList->Advance(thisChar, nextChar), 0.0); } } } return totalBBox; } FTBBox FTFontImpl::BBox(const char *string, const int len, FTPoint position, FTPoint spacing) { /* The chars need to be unsigned because they are cast to int later */ return BBoxI((const unsigned char *)string, len, position, spacing); } FTBBox FTFontImpl::BBox(const wchar_t *string, const int len, FTPoint position, FTPoint spacing) { return BBoxI(string, len, position, spacing); } template inline float FTFontImpl::AdvanceI(const T* string, const int len, FTPoint spacing) { float advance = 0.0f; FTUnicodeStringItr ustr(string); for(int i = 0; (len < 0 && *ustr) || (len >= 0 && i < len); i++) { unsigned int thisChar = *ustr++; unsigned int nextChar = *ustr; if(CheckGlyph(thisChar)) { advance += glyphList->Advance(thisChar, nextChar); } if(nextChar) { advance += spacing.Xf(); } } return advance; } float FTFontImpl::Advance(const char* string, const int len, FTPoint spacing) { /* The chars need to be unsigned because they are cast to int later */ return AdvanceI((const unsigned char *)string, len, spacing); } float FTFontImpl::Advance(const wchar_t* string, const int len, FTPoint spacing) { return AdvanceI(string, len, spacing); } template inline FTPoint FTFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { // for multibyte - we can't rely on sizeof(T) == character FTUnicodeStringItr ustr(string); for(int i = 0; (len < 0 && *ustr) || (len >= 0 && i < len); i++) { unsigned int thisChar = *ustr++; unsigned int nextChar = *ustr; if(CheckGlyph(thisChar)) { position += glyphList->Render(thisChar, nextChar, position, renderMode); } if(nextChar) { position += spacing; } } return position; } FTPoint FTFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI((const unsigned char *)string, len, position, spacing, renderMode); } FTPoint FTFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } bool FTFontImpl::CheckGlyph(const unsigned int characterCode) { if(glyphList->Glyph(characterCode)) { return true; } unsigned int glyphIndex = glyphList->FontIndex(characterCode); FT_GlyphSlot ftSlot = face.Glyph(glyphIndex, load_flags); if(!ftSlot) { err = face.Error(); return false; } FTGlyph* tempGlyph = intf->MakeGlyph(ftSlot); if(!tempGlyph) { if(0 == err) { err = 0x13; } return false; } glyphList->Add(tempGlyph, characterCode); return true; } rgl/src/ext/ftgl/FTFont/FTBufferFontImpl.h0000644000176000001440000000541212262026246020042 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTBufferFontImpl__ #define __FTBufferFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTBuffer; class FTBufferFontImpl : public FTFontImpl { friend class FTBufferFont; protected: FTBufferFontImpl(FTFont *ftFont, const char* fontFilePath); FTBufferFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); virtual ~FTBufferFontImpl(); virtual FTPoint Render(const char *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual bool FaceSize(const unsigned int size, const unsigned int res); private: /** * Create an FTBufferGlyph object for the base class. */ FTGlyph* MakeGlyphImpl(FT_GlyphSlot ftGlyph); /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); /* Pixel buffer */ FTBuffer *buffer; static const int BUFFER_CACHE_SIZE = 16; /* Texture IDs */ GLuint idCache[BUFFER_CACHE_SIZE]; void *stringCache[BUFFER_CACHE_SIZE]; FTBBox bboxCache[BUFFER_CACHE_SIZE]; FTPoint advanceCache[BUFFER_CACHE_SIZE]; int lastString; }; #endif // __FTBufferFontImpl__ rgl/src/ext/ftgl/FTFont/FTTextureFont.cpp0000644000176000001440000001644712262026246020014 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include // For memset #include "FTGL/ftgl.h" #include "FTInternals.h" #include "../FTGlyph/FTTextureGlyphImpl.h" #include "./FTTextureFontImpl.h" // // FTTextureFont // FTTextureFont::FTTextureFont(char const *fontFilePath) : FTFont(new FTTextureFontImpl(this, fontFilePath)) {} FTTextureFont::FTTextureFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTTextureFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTTextureFont::~FTTextureFont() {} FTGlyph* FTTextureFont::MakeGlyph(FT_GlyphSlot ftGlyph) { FTTextureFontImpl *myimpl = dynamic_cast(impl); if(!myimpl) { return NULL; } return myimpl->MakeGlyphImpl(ftGlyph); } // // FTTextureFontImpl // static inline GLuint NextPowerOf2(GLuint in) { in -= 1; in |= in >> 16; in |= in >> 8; in |= in >> 4; in |= in >> 2; in |= in >> 1; return in + 1; } FTTextureFontImpl::FTTextureFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath), maximumGLTextureSize(0), textureWidth(0), textureHeight(0), glyphHeight(0), glyphWidth(0), padding(3), xOffset(0), yOffset(0) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; remGlyphs = numGlyphs = face.GlyphCount(); } FTTextureFontImpl::FTTextureFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), maximumGLTextureSize(0), textureWidth(0), textureHeight(0), glyphHeight(0), glyphWidth(0), padding(3), xOffset(0), yOffset(0) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; remGlyphs = numGlyphs = face.GlyphCount(); } FTTextureFontImpl::~FTTextureFontImpl() { if(textureIDList.size()) { glDeleteTextures((GLsizei)textureIDList.size(), (const GLuint*)&textureIDList[0]); } } FTGlyph* FTTextureFontImpl::MakeGlyphImpl(FT_GlyphSlot ftGlyph) { glyphHeight = static_cast(charSize.Height() + 0.5); glyphWidth = static_cast(charSize.Width() + 0.5); if(glyphHeight < 1) glyphHeight = 1; if(glyphWidth < 1) glyphWidth = 1; if(textureIDList.empty()) { textureIDList.push_back(CreateTexture()); xOffset = yOffset = padding; } if(xOffset > (textureWidth - glyphWidth)) { xOffset = padding; yOffset += glyphHeight; if(yOffset > (textureHeight - glyphHeight)) { textureIDList.push_back(CreateTexture()); yOffset = padding; } } FTTextureGlyph* tempGlyph = new FTTextureGlyph(ftGlyph, textureIDList[textureIDList.size() - 1], xOffset, yOffset, textureWidth, textureHeight); xOffset += static_cast(tempGlyph->BBox().Upper().X() - tempGlyph->BBox().Lower().X() + padding + 0.5); --remGlyphs; return tempGlyph; } void FTTextureFontImpl::CalculateTextureSize() { if(!maximumGLTextureSize) { maximumGLTextureSize = 1024; glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&maximumGLTextureSize); assert(maximumGLTextureSize); // If you hit this then you have an invalid OpenGL context. } textureWidth = NextPowerOf2((remGlyphs * glyphWidth) + (padding * 2)); textureWidth = textureWidth > maximumGLTextureSize ? maximumGLTextureSize : textureWidth; int h = static_cast((textureWidth - (padding * 2)) / glyphWidth + 0.5); textureHeight = NextPowerOf2(((numGlyphs / h) + 1) * glyphHeight); textureHeight = textureHeight > maximumGLTextureSize ? maximumGLTextureSize : textureHeight; } GLuint FTTextureFontImpl::CreateTexture() { CalculateTextureSize(); int totalMemory = textureWidth * textureHeight; unsigned char* textureMemory = new unsigned char[totalMemory]; memset(textureMemory, 0, totalMemory); GLuint textID; glGenTextures(1, (GLuint*)&textID); glBindTexture(GL_TEXTURE_2D, textID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, textureWidth, textureHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, textureMemory); delete [] textureMemory; return textID; } bool FTTextureFontImpl::FaceSize(const unsigned int size, const unsigned int res) { if(!textureIDList.empty()) { glDeleteTextures((GLsizei)textureIDList.size(), (const GLuint*)&textureIDList[0]); textureIDList.clear(); remGlyphs = numGlyphs = face.GlyphCount(); } return FTFontImpl::FaceSize(size, res); } template inline FTPoint FTTextureFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { // Protect GL_TEXTURE_2D, GL_BLEND and blending functions glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE glEnable(GL_TEXTURE_2D); FTTextureGlyphImpl::ResetActiveTexture(); FTPoint tmp = FTFontImpl::Render(string, len, position, spacing, renderMode); glPopAttrib(); return tmp; } FTPoint FTTextureFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } FTPoint FTTextureFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } rgl/src/ext/ftgl/FTFont/FTPixmapFont.cpp0000644000176000001440000000770712262026246017611 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTPixmapFontImpl.h" // // FTPixmapFont // FTPixmapFont::FTPixmapFont(char const *fontFilePath) : FTFont(new FTPixmapFontImpl(this, fontFilePath)) {} FTPixmapFont::FTPixmapFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTPixmapFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTPixmapFont::~FTPixmapFont() {} FTGlyph* FTPixmapFont::MakeGlyph(FT_GlyphSlot ftGlyph) { return new FTPixmapGlyph(ftGlyph); } // // FTPixmapFontImpl // FTPixmapFontImpl::FTPixmapFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; } FTPixmapFontImpl::FTPixmapFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes) { load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; } template inline FTPoint FTPixmapFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { // Protect GL_TEXTURE_2D and GL_BLEND, glPixelTransferf(), and blending // functions. glPushAttrib(GL_ENABLE_BIT | GL_PIXEL_MODE_BIT | GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT); // Protect glPixelStorei() calls (made by FTPixmapGlyphImpl::RenderImpl). glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); // Needed on OSX glPolygonMode(GL_FRONT, GL_FILL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_TEXTURE_2D); GLfloat ftglColour[4]; glGetFloatv(GL_CURRENT_RASTER_COLOR, ftglColour); glPixelTransferf(GL_RED_SCALE, ftglColour[0]); glPixelTransferf(GL_GREEN_SCALE, ftglColour[1]); glPixelTransferf(GL_BLUE_SCALE, ftglColour[2]); glPixelTransferf(GL_ALPHA_SCALE, ftglColour[3]); FTPoint tmp = FTFontImpl::Render(string, len, position, spacing, renderMode); glPopClientAttrib(); glPopAttrib(); return tmp; } FTPoint FTPixmapFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } FTPoint FTPixmapFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } rgl/src/ext/ftgl/FTFont/FTOutlineFont.cpp0000644000176000001440000000733212262026246017764 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTOutlineFontImpl.h" // // FTOutlineFont // FTOutlineFont::FTOutlineFont(char const *fontFilePath) : FTFont(new FTOutlineFontImpl(this, fontFilePath)) {} FTOutlineFont::FTOutlineFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTOutlineFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTOutlineFont::~FTOutlineFont() {} FTGlyph* FTOutlineFont::MakeGlyph(FT_GlyphSlot ftGlyph) { FTOutlineFontImpl *myimpl = dynamic_cast(impl); if(!myimpl) { return NULL; } return new FTOutlineGlyph(ftGlyph, myimpl->outset, myimpl->useDisplayLists); } // // FTOutlineFontImpl // FTOutlineFontImpl::FTOutlineFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath), outset(0.0f) { load_flags = FT_LOAD_NO_HINTING; } FTOutlineFontImpl::FTOutlineFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), outset(0.0f) { load_flags = FT_LOAD_NO_HINTING; } template inline FTPoint FTOutlineFontImpl::RenderI(const T* string, const int len, FTPoint position, FTPoint spacing, int renderMode) { // Protect GL_TEXTURE_2D, glHint(), GL_LINE_SMOOTH and blending functions glPushAttrib(GL_ENABLE_BIT | GL_HINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT); glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE FTPoint tmp = FTFontImpl::Render(string, len, position, spacing, renderMode); glPopAttrib(); return tmp; } FTPoint FTOutlineFontImpl::Render(const char * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } FTPoint FTOutlineFontImpl::Render(const wchar_t * string, const int len, FTPoint position, FTPoint spacing, int renderMode) { return RenderI(string, len, position, spacing, renderMode); } rgl/src/ext/ftgl/FTFont/FTPixmapFontImpl.h0000644000176000001440000000430712262026246020071 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTPixmapFontImpl__ #define __FTPixmapFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTPixmapFontImpl : public FTFontImpl { friend class FTPixmapFont; protected: FTPixmapFontImpl(FTFont *ftFont, const char* fontFilePath); FTPixmapFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); virtual FTPoint Render(const char *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint position, FTPoint spacing, int renderMode); private: /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); }; #endif // __FTPixmapFontImpl__ rgl/src/ext/ftgl/FTFont/FTExtrudeFont.cpp0000644000176000001440000000503312262026246017761 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include "FTGL/ftgl.h" #include "FTInternals.h" #include "FTExtrudeFontImpl.h" // // FTExtrudeFont // FTExtrudeFont::FTExtrudeFont(char const *fontFilePath) : FTFont(new FTExtrudeFontImpl(this, fontFilePath)) {} FTExtrudeFont::FTExtrudeFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFont(new FTExtrudeFontImpl(this, pBufferBytes, bufferSizeInBytes)) {} FTExtrudeFont::~FTExtrudeFont() {} FTGlyph* FTExtrudeFont::MakeGlyph(FT_GlyphSlot ftGlyph) { FTExtrudeFontImpl *myimpl = dynamic_cast(impl); if(!myimpl) { return NULL; } return new FTExtrudeGlyph(ftGlyph, myimpl->depth, myimpl->front, myimpl->back, myimpl->useDisplayLists); } // // FTExtrudeFontImpl // FTExtrudeFontImpl::FTExtrudeFontImpl(FTFont *ftFont, const char* fontFilePath) : FTFontImpl(ftFont, fontFilePath), depth(0.0f), front(0.0f), back(0.0f) { load_flags = FT_LOAD_NO_HINTING; } FTExtrudeFontImpl::FTExtrudeFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), depth(0.0f), front(0.0f), back(0.0f) { load_flags = FT_LOAD_NO_HINTING; } rgl/src/ext/ftgl/FTFont/FTOutlineFontImpl.h0000644000176000001440000000506012262026246020247 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTOutlineFontImpl__ #define __FTOutlineFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTOutlineFontImpl : public FTFontImpl { friend class FTOutlineFont; protected: FTOutlineFontImpl(FTFont *ftFont, const char* fontFilePath); FTOutlineFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Set the outset distance for the font. Only implemented by * FTOutlineFont, FTPolygonFont and FTExtrudeFont * * @param outset The outset distance. */ virtual void Outset(float o) { outset = o; } virtual FTPoint Render(const char *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint position, FTPoint spacing, int renderMode); private: /** * The outset distance for the font. */ float outset; /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); }; #endif // __FTOutlineFontImpl__ rgl/src/ext/ftgl/FTFont/FTPolygonFontImpl.h0000644000176000001440000000400212262026246020252 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTPolygonFontImpl__ #define __FTPolygonFontImpl__ #include "FTFontImpl.h" class FTGlyph; class FTPolygonFontImpl : public FTFontImpl { friend class FTPolygonFont; protected: FTPolygonFontImpl(FTFont *ftFont, const char* fontFilePath); FTPolygonFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Set the outset distance for the font. Only implemented by * FTOutlineFont, FTPolygonFont and FTExtrudeFont * * @param depth The outset distance. */ virtual void Outset(float o) { outset = o; } private: /** * The outset distance (front and back) for the font. */ float outset; }; #endif // __FTPolygonFontImpl__ rgl/src/ext/ftgl/FTFont/FTTextureFontImpl.h0000644000176000001440000001100512262026246020264 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTTextureFontImpl__ #define __FTTextureFontImpl__ #include "FTFontImpl.h" #include "FTVector.h" class FTTextureGlyph; class FTTextureFontImpl : public FTFontImpl { friend class FTTextureFont; protected: FTTextureFontImpl(FTFont *ftFont, const char* fontFilePath); FTTextureFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, size_t bufferSizeInBytes); virtual ~FTTextureFontImpl(); /** * Set the char size for the current face. * * @param size the face size in points (1/72 inch) * @param res the resolution of the target device. * @return true if size was set correctly */ virtual bool FaceSize(const unsigned int size, const unsigned int res = 72); virtual FTPoint Render(const char *s, const int len, FTPoint position, FTPoint spacing, int renderMode); virtual FTPoint Render(const wchar_t *s, const int len, FTPoint position, FTPoint spacing, int renderMode); private: /** * Create an FTTextureGlyph object for the base class. */ FTGlyph* MakeGlyphImpl(FT_GlyphSlot ftGlyph); /** * Get the size of a block of memory required to layout the glyphs * * Calculates a width and height based on the glyph sizes and the * number of glyphs. It over estimates. */ inline void CalculateTextureSize(); /** * Creates a 'blank' OpenGL texture object. * * The format is GL_ALPHA and the params are * GL_TEXTURE_WRAP_S = GL_CLAMP * GL_TEXTURE_WRAP_T = GL_CLAMP * GL_TEXTURE_MAG_FILTER = GL_LINEAR * GL_TEXTURE_MIN_FILTER = GL_LINEAR * Note that mipmapping is NOT used */ inline GLuint CreateTexture(); /** * The maximum texture dimension on this OpenGL implemetation */ GLsizei maximumGLTextureSize; /** * The minimum texture width required to hold the glyphs */ GLsizei textureWidth; /** * The minimum texture height required to hold the glyphs */ GLsizei textureHeight; /** *An array of texture ids */ FTVector textureIDList; /** * The max height for glyphs in the current font */ int glyphHeight; /** * The max width for glyphs in the current font */ int glyphWidth; /** * A value to be added to the height and width to ensure that * glyphs don't overlap in the texture */ unsigned int padding; /** * */ unsigned int numGlyphs; /** */ unsigned int remGlyphs; /** */ int xOffset; /** */ int yOffset; /* Internal generic Render() implementation */ template inline FTPoint RenderI(const T *s, const int len, FTPoint position, FTPoint spacing, int mode); }; #endif // __FTTextureFontImpl__ rgl/src/ext/ftgl/FTPoint.cpp0000644000176000001440000000363212262026246015446 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "config.h" #include #include "FTGL/ftgl.h" bool operator == (const FTPoint &a, const FTPoint &b) { return((a.values[0] == b.values[0]) && (a.values[1] == b.values[1]) && (a.values[2] == b.values[2])); } bool operator != (const FTPoint &a, const FTPoint &b) { return((a.values[0] != b.values[0]) || (a.values[1] != b.values[1]) || (a.values[2] != b.values[2])); } FTPoint FTPoint::Normalise() { double norm = sqrt(values[0] * values[0] + values[1] * values[1] + values[2] * values[2]); if(norm == 0.0) { return *this; } FTPoint temp(values[0] / norm, values[1] / norm, values[2] / norm); return temp; } rgl/src/ext/ftgl/FTFace.h0000644000176000001440000001223512262026246014657 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTFace__ #define __FTFace__ #include #include FT_FREETYPE_H #include FT_GLYPH_H #include "FTGL/ftgl.h" #include "FTSize.h" /** * FTFace class provides an abstraction layer for the Freetype Face. * * @see "Freetype 2 Documentation" * */ class FTFace { public: /** * Opens and reads a face file. Error is set. * * @param fontFilePath font file path. */ FTFace(const char* fontFilePath, bool precomputeKerning = true); /** * Read face data from an in-memory buffer. Error is set. * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes */ FTFace(const unsigned char *pBufferBytes, size_t bufferSizeInBytes, bool precomputeKerning = true); /** * Destructor * * Disposes of the current Freetype Face. */ virtual ~FTFace(); /** * Attach auxilliary file to font (e.g., font metrics). * * @param fontFilePath auxilliary font file path. * @return true if file has opened * successfully. */ bool Attach(const char* fontFilePath); /** * Attach auxilliary data to font (e.g., font metrics) from memory * * @param pBufferBytes the in-memory buffer * @param bufferSizeInBytes the length of the buffer in bytes * @return true if file has opened * successfully. */ bool Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes); /** * Get the freetype face object.. * * @return pointer to an FT_Face. */ FT_Face* Face() const { return ftFace; } /** * Sets the char size for the current face. * * This doesn't guarantee that the size was set correctly. Clients * should check errors. * * @param size the face size in points (1/72 inch) * @param res the resolution of the target device. * @return FTSize object */ const FTSize& Size(const unsigned int size, const unsigned int res); /** * Get the number of character maps in this face. * * @return character map count. */ unsigned int CharMapCount() const; /** * Get a list of character maps in this face. * * @return pointer to the first encoding. */ FT_Encoding* CharMapList(); /** * Gets the kerning vector between two glyphs */ FTPoint KernAdvance(unsigned int index1, unsigned int index2); /** * Loads and creates a Freetype glyph. */ FT_GlyphSlot Glyph(unsigned int index, FT_Int load_flags); /** * Gets the number of glyphs in the current face. */ unsigned int GlyphCount() const { return numGlyphs; } /** * Queries for errors. * * @return The current error code. */ FT_Error Error() const { return err; } private: /** * The Freetype face */ FT_Face* ftFace; /** * The size object associated with this face */ FTSize charSize; /** * The number of glyphs in this face */ int numGlyphs; FT_Encoding* fontEncodingList; /** * This face has kerning tables */ bool hasKerningTable; /** * If this face has kerning tables, we can cache them. */ void BuildKerningCache(); static const unsigned int MAX_PRECOMPUTED = 128; float *kerningCache; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTFace__ rgl/src/ext/ftgl/FTGlyphContainer.h0000644000176000001440000001151512262026246016747 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTGlyphContainer__ #define __FTGlyphContainer__ #include #include FT_FREETYPE_H #include FT_GLYPH_H #include "FTGL/ftgl.h" #include "FTVector.h" class FTFace; class FTGlyph; class FTCharmap; /** * FTGlyphContainer holds the post processed FTGlyph objects. * * @see FTGlyph */ class FTGlyphContainer { typedef FTVector GlyphVector; public: /** * Constructor * * @param face The Freetype face */ FTGlyphContainer(FTFace* face); /** * Destructor */ ~FTGlyphContainer(); /** * Sets the character map for the face. * * @param encoding the Freetype encoding symbol. See above. * @return true if charmap was valid * and set correctly */ bool CharMap(FT_Encoding encoding); /** * Get the font index of the input character. * * @param characterCode The character code of the requested glyph in the * current encoding eg apple roman. * @return The font index for the character. */ unsigned int FontIndex(const unsigned int characterCode) const; /** * Adds a glyph to this glyph list. * * @param glyph The FTGlyph to be inserted into the container * @param characterCode The char code of the glyph NOT the glyph index. */ void Add(FTGlyph* glyph, const unsigned int characterCode); /** * Get a glyph from the glyph list * * @param characterCode The char code of the glyph NOT the glyph index * @return An FTGlyph or null is it hasn't been * loaded. */ const FTGlyph* const Glyph(const unsigned int characterCode) const; /** * Get the bounding box for a character. * @param characterCode The char code of the glyph NOT the glyph index */ FTBBox BBox(const unsigned int characterCode) const; /** * Returns the kerned advance width for a glyph. * * @param characterCode glyph index of the character * @param nextCharacterCode the next glyph in a string * @return advance width */ float Advance(const unsigned int characterCode, const unsigned int nextCharacterCode); /** * Renders a character * @param characterCode the glyph to be Rendered * @param nextCharacterCode the next glyph in the string. Used for kerning. * @param penPosition the position to Render the glyph * @param renderMode Render mode to display * @return The distance to advance the pen position after Rendering */ FTPoint Render(const unsigned int characterCode, const unsigned int nextCharacterCode, FTPoint penPosition, int renderMode); /** * Queries the Font for errors. * * @return The current error code. */ FT_Error Error() const { return err; } private: /** * The FTGL face */ FTFace* face; /** * The Character Map object associated with the current face */ FTCharmap* charMap; /** * A structure to hold the glyphs */ GlyphVector glyphs; /** * Current error code. Zero means no error. */ FT_Error err; }; #endif // __FTGlyphContainer__ rgl/src/ext/ftgl/FTCharmap.h0000644000176000001440000001220312262026246015367 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTCharmap__ #define __FTCharmap__ #include #include FT_FREETYPE_H #include FT_GLYPH_H #include "FTGL/ftgl.h" #include "FTCharToGlyphIndexMap.h" /** * FTCharmap takes care of specifying the encoding for a font and mapping * character codes to glyph indices. * * It doesn't preprocess all indices, only on an as needed basis. This may * seem like a performance penalty but it is quicker than using the 'raw' * freetype calls and will save significant amounts of memory when dealing * with unicode encoding * * @see "Freetype 2 Documentation" * */ class FTFace; class FTCharmap { public: /** * Constructor */ FTCharmap(FTFace* face); /** * Destructor */ virtual ~FTCharmap(); /** * Queries for the current character map code. * * @return The current character map code. */ FT_Encoding Encoding() const { return ftEncoding; } /** * Sets the character map for the face. If an error occurs the object is not modified. * Valid encodings as at Freetype 2.0.4 * ft_encoding_none * ft_encoding_symbol * ft_encoding_unicode * ft_encoding_latin_2 * ft_encoding_sjis * ft_encoding_gb2312 * ft_encoding_big5 * ft_encoding_wansung * ft_encoding_johab * ft_encoding_adobe_standard * ft_encoding_adobe_expert * ft_encoding_adobe_custom * ft_encoding_apple_roman * * @param encoding the Freetype encoding symbol. See above. * @return true if charmap was valid and set * correctly. */ bool CharMap(FT_Encoding encoding); /** * Get the FTGlyphContainer index of the input character. * * @param characterCode The character code of the requested glyph in * the current encoding eg apple roman. * @return The FTGlyphContainer index for the character or zero * if it wasn't found */ unsigned int GlyphListIndex(const unsigned int characterCode); /** * Get the font glyph index of the input character. * * @param characterCode The character code of the requested glyph in * the current encoding eg apple roman. * @return The glyph index for the character. */ unsigned int FontIndex(const unsigned int characterCode); /** * Set the FTGlyphContainer index of the character code. * * @param characterCode The character code of the requested glyph in * the current encoding eg apple roman. * @param containerIndex The index into the FTGlyphContainer of the * character code. */ void InsertIndex(const unsigned int characterCode, const size_t containerIndex); /** * Queries for errors. * * @return The current error code. Zero means no error. */ FT_Error Error() const { return err; } private: /** * Current character map code. */ FT_Encoding ftEncoding; /** * The current Freetype face. */ const FT_Face ftFace; /** * A structure that maps glyph indices to character codes * * < character code, face glyph index> */ typedef FTCharToGlyphIndexMap CharacterMap; CharacterMap charMap; /** * Precomputed font indices. */ static const unsigned int MAX_PRECOMPUTED = 128; unsigned int charIndexCache[MAX_PRECOMPUTED]; /** * Current error code. */ FT_Error err; }; #endif // __FTCharmap__ rgl/src/ext/ftgl/FTContour.h0000644000176000001440000001431512262026246015453 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTContour__ #define __FTContour__ #include "FTGL/ftgl.h" #include "FTVector.h" /** * FTContour class is a container of points that describe a vector font * outline. It is used as a container for the output of the bezier curve * evaluator in FTVectoriser. * * @see FTOutlineGlyph * @see FTPolygonGlyph * @see FTPoint */ class FTContour { public: /** * Constructor * * @param contour * @param pointTags * @param numberOfPoints */ FTContour(FT_Vector* contour, char* pointTags, unsigned int numberOfPoints); /** * Destructor */ ~FTContour() { pointList.clear(); outsetPointList.clear(); frontPointList.clear(); backPointList.clear(); } /** * Return a point at index. * * @param index of the point in the curve. * @return const point reference */ const FTPoint& Point(size_t index) const { return pointList[index]; } /** * Return a point at index. * * @param index of the point in the outset curve. * @return const point reference */ const FTPoint& Outset(size_t index) const { return outsetPointList[index]; } /** * Return a point at index of the front outset contour. * * @param index of the point in the curve. * @return const point reference */ const FTPoint& FrontPoint(size_t index) const { if(frontPointList.size() == 0) return Point(index); return frontPointList[index]; } /** * Return a point at index of the back outset contour. * * @param index of the point in the curve. * @return const point reference */ const FTPoint& BackPoint(size_t index) const { if(backPointList.size() == 0) return Point(index); return backPointList[index]; } /** * How many points define this contour * * @return the number of points in this contour */ size_t PointCount() const { return pointList.size(); } /** * Make sure the glyph has the proper parity and create the front/back * outset contour. * * @param parity The contour's parity within the glyph. */ void SetParity(int parity); // FIXME: this should probably go away. void buildFrontOutset(float outset); void buildBackOutset(float outset); private: /** * Add a point to this contour. This function tests for duplicate * points. * * @param point The point to be added to the contour. */ inline void AddPoint(FTPoint point); /** * Add a point to this contour. This function tests for duplicate * points. * * @param point The point to be added to the contour. */ inline void AddOutsetPoint(FTPoint point); /* * Add a point to this outset contour. This function tests for duplicate * points. * * @param point The point to be added to the contour outset. */ inline void AddFrontPoint(FTPoint point); inline void AddBackPoint(FTPoint point); /** * De Casteljau (bezier) algorithm contributed by Jed Soane * Evaluates a quadratic or conic (second degree) curve */ inline void evaluateQuadraticCurve(FTPoint, FTPoint, FTPoint); /** * De Casteljau (bezier) algorithm contributed by Jed Soane * Evaluates a cubic (third degree) curve */ inline void evaluateCubicCurve(FTPoint, FTPoint, FTPoint, FTPoint); /** * Compute the vector norm */ inline FTGL_DOUBLE NormVector(const FTPoint &v); /** * Compute a rotation matrix from a vector */ inline void RotationMatrix(const FTPoint &a, const FTPoint &b, FTGL_DOUBLE *matRot, FTGL_DOUBLE *invRot); /** * Matrix and vector multiplication */ inline void MultMatrixVect(FTGL_DOUBLE *mat, FTPoint &v); /** * Compute the vector bisecting from a vector 'v' and a distance 'd' */ inline void ComputeBisec(FTPoint &v); /** * Compute the outset point coordinates */ inline FTPoint ComputeOutsetPoint(FTPoint a, FTPoint b, FTPoint c); /** * The list of points in this contour */ typedef FTVector PointVector; PointVector pointList; PointVector outsetPointList; PointVector frontPointList; PointVector backPointList; /** * Is this contour clockwise or anti-clockwise? */ bool clockwise; }; #endif // __FTContour__ rgl/src/ext/ftgl/FTInternals.h0000644000176000001440000000661012262026246015760 0ustar ripleyusers/* * FTGL - OpenGL font library * * Copyright (c) 2001-2004 Henry Maddocks * Copyright (c) 2008 Éric Beets * Copyright (c) 2008 Sam Hocevar * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTINTERNALS_H__ #define __FTINTERNALS_H__ #include "FTGL/ftgl.h" #include #include // Fixes for deprecated identifiers in 2.1.5 #ifndef FT_OPEN_MEMORY #define FT_OPEN_MEMORY (FT_Open_Flags)1 #endif #ifndef FT_RENDER_MODE_MONO #define FT_RENDER_MODE_MONO ft_render_mode_mono #endif #ifndef FT_RENDER_MODE_NORMAL #define FT_RENDER_MODE_NORMAL ft_render_mode_normal #endif #ifdef WIN32 // Under windows avoid including is overrated. // Sure, it can be avoided and "name space pollution" can be // avoided, but why? It really doesn't make that much difference // these days. #define WIN32_LEAN_AND_MEAN #include #ifndef __gl_h_ #include #include #endif #else // Non windows platforms - don't require nonsense as seen above :-) #ifndef __gl_h_ #ifdef SDL_main #include "SDL_opengl.h" #elif __APPLE_CC__ #include #include #else #include #if defined (__sun__) && !defined (__sparc__) #include #else #include #endif #endif #endif // Required for compatibility with glext.h style function definitions of // OpenGL extensions, such as in src/osg/Point.cpp. #ifndef APIENTRY #define APIENTRY #endif #endif FTGL_BEGIN_C_DECLS typedef enum { GLYPH_CUSTOM, GLYPH_BITMAP, GLYPH_BUFFER, GLYPH_PIXMAP, GLYPH_OUTLINE, GLYPH_POLYGON, GLYPH_EXTRUDE, GLYPH_TEXTURE, } GlyphType; struct _FTGLglyph { FTGlyph *ptr; FTGL::GlyphType type; }; typedef enum { FONT_CUSTOM, FONT_BITMAP, FONT_BUFFER, FONT_PIXMAP, FONT_OUTLINE, FONT_POLYGON, FONT_EXTRUDE, FONT_TEXTURE, } FontType; struct _FTGLfont { FTFont *ptr; FTGL::FontType type; }; typedef enum { LAYOUT_SIMPLE, } LayoutType; struct _FTGLlayout { FTLayout *ptr; FTGLfont *font; FTGL::LayoutType type; }; FTGL_END_C_DECLS #endif //__FTINTERNALS_H__ rgl/src/api.h0000644000176000001440000001210512262026246012600 0ustar ripleyusers#ifndef RGL_API_H #define RGL_API_H #include "R.h" #include namespace rgl { #ifdef __cplusplus extern "C" { #endif /* // RGL API IMPLEMENTATION // // // C API FUNCTION DESIGN // rgl_ ( successptr , ... ) // // PARAMETERS // successptr // [0] function success status */ /* library service */ void rgl_quit (int* successptr); /* device management */ void rgl_dev_open (int* successptr, int* useNULL); void rgl_dev_close (int* successptr); SEXP rgl_dev_getcurrent(void); SEXP rgl_dev_list (void); void rgl_dev_setcurrent(int* successptr, int* idata); void rgl_dev_bringtotop(int* successptr, int* stay); /* device services */ void rgl_snapshot (int* successptr, int* idata, char** cdata); void rgl_pixels(int* successptr, int* ll, int* size, int* component, float* result); void rgl_postscript (int* successptr, int* idata, char** cdata); /* scene management */ void rgl_clear (int* successptr, int* idata); void rgl_pop (int* successptr, int* idata); void rgl_id_count (int* type, int* count); void rgl_ids (int* type, int* ids, char** types); void rgl_attrib_count (int* id, int* attrib, int* count); void rgl_attrib (int* id, int* attrib, int* first, int* count, double* result); void rgl_text_attrib (int* id, int* attrib, int* first, int* count, char** result); void rgl_material (int* successptr, int* idata, char** cdata, double* ddata); void rgl_getcolorcount(int* count); void rgl_getmaterial (int* successptr, int *id, int* idata, char** cdata, double* ddata); void rgl_light (int* successptr, int* idata, double* ddata ); void rgl_viewpoint(int* successptr, int* idata, double* ddata); void rgl_bg (int* successptr, int* idata); void rgl_bbox (int* successptr, int* idata, double* ddata, double* xat, char** xtext, double* yat, char** ytext, double* zat, char** ztext); void rgl_primitive(int* successptr, int* idata, double* vertex, double* normals, double* texcoords); void rgl_texts (int* successptr, int* idata, double* adj, char** text, double* vertex, int* nfonts, char** family, int* style, double* cex, int* useFreeType); void rgl_spheres (int* successptr, int* idata, double* vertex, double* radius); void rgl_planes (int* successptr, int* idata, double* normals, double* offsets); void rgl_clipplanes(int* successptr, int* idata, double* normals, double* offsets); void rgl_abclines (int* successptr, int* idata, double* bases, double* directions); void rgl_surface (int* successptr, int* idata, double* x, double* z, double* y, double* normal_x, double* normal_z, double* normal_y, double* texture_s, double* texture_t, int* coords, int* orientation, int* flags); void rgl_sprites (int* successptr, int* idata, double* vertex, double* radius, int* shapes, double* userMatrix); void rgl_user2window(int* successptr, int* idata, double* point, double* pixel, double* model, double* proj, int* view); void rgl_window2user(int* successptr, int* idata, double* point, double* pixel, double* model, double* proj, int* view); void rgl_locator(int* successptr, double* locations); void rgl_getMouseMode(int* successptr, int* button, int* mode); void rgl_setMouseMode(int* successptr, int* button, int* mode); void rgl_selectstate(int* successptr, int* selectstate, double* locations); void rgl_setselectstate(int* successptr, int *idata); void rgl_getUserMatrix(int* successptr, double* userMatrix); void rgl_setUserMatrix(int* successptr, double* userMatrix); void rgl_getScale(int* successptr, double* scale); void rgl_setScale(int* successptr, double* scale); void rgl_getZoom(int* successptr, double* zoom); void rgl_setZoom(int* successptr, double* zoom); void rgl_getFOV(int* successptr, double* fov); void rgl_setFOV(int* successptr, double* fov); void rgl_getModelMatrix(int* successptr, double* modelMatrix); void rgl_getProjMatrix(int* successptr, double* projMatrix); void rgl_getIgnoreExtent(int* successptr, int* ignoreExtent); void rgl_setIgnoreExtent(int* successptr, int* ignoreExtent); void rgl_getSkipRedraw(int* successptr, int* skipRedraw); void rgl_setSkipRedraw(int* successptr, int* skipRedraw); void rgl_getViewport(int* successptr, int* viewport); void rgl_getBoundingbox(int* successptr, double* bboxvec); void rgl_getWindowRect(int* successptr, int* rect); void rgl_setWindowRect(int* successptr, int* rect); SEXP rgl_setMouseCallbacks(SEXP button, SEXP begin, SEXP update, SEXP end); SEXP rgl_par3d(SEXP args); /* not for users: does not maintain consistency */ void rgl_setPosition(double* position); void rgl_getPosition(double* position); /* These functions are related to the API, but only accessed internally */ char* rgl_getFamily(); bool rgl_setFamily(const char *family); int rgl_getFont(); bool rgl_setFont(int font); double rgl_getCex(); bool rgl_setCex(double cex); int rgl_getUseFreeType(); bool rgl_setUseFreeType(bool useFreeType); char* rgl_getFontname(); int rgl_getAntialias(); int rgl_getMaxClipPlanes(); #ifdef __cplusplus } #endif } // namespace rgl #endif /* RGL_API_H */ rgl/src/PlaneSet.hpp0000644000176000001440000000207112262005307014076 0ustar ripleyusers#ifndef PLANESET_HPP #define PLANESET_HPP #include "scene.h" #include "geom.hpp" #include "Shape.hpp" #include "PrimitiveSet.hpp" #include namespace rgl { class PlaneSet : public TriangleSet { private: /* Use parametrization ax + by + cz + d = 0 */ int nPlanes; ARRAY normal; /* (a,b,c) */ ARRAY offset; /* d */ public: PlaneSet(Material& in_material, int in_nnormal, double* in_normal, int in_noffset, double* in_offset); // ~PlaneSet(); /** * tell type. **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "planes", buflen); }; /** * overload to update triangles first. */ virtual AABox& getBoundingBox(Scene* scene); /** * overload to update triangles first. */ virtual void renderBegin(RenderContext* renderContext); /** * update mesh */ void updateTriangles(const AABox& sceneBBox); /** * update then get attributes */ void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); }; } // namespace rgl #endif // PLANESET_HPP rgl/src/ABCLineSet.hpp0000644000176000001440000000204412262005307014234 0ustar ripleyusers#ifndef ABCLINESET_HPP #define ABCLINESET_HPP #include "scene.h" #include "geom.hpp" #include "Shape.hpp" #include "PrimitiveSet.hpp" #include namespace rgl { class ABCLineSet : public LineSet { private: /* Use parametrization (x,y,z) + s*(a,b,c) */ int nLines; ARRAY base; /* (x,y,z) */ ARRAY direction; /* (a,b,c) */ public: ABCLineSet(Material& in_material, int in_nbase, double* in_base, int in_ndir, double* in_dir); /** * tell type. **/ virtual void getShapeName(char* buffer, int buflen) { strncpy(buffer, "abclines", buflen); }; /** * overload to update segments first. */ virtual AABox& getBoundingBox(Scene* scene); /** * overload to update segments first. */ virtual void renderBegin(RenderContext* renderContext); /** * update mesh */ void updateSegments(const AABox& sceneBBox); /** * update then get attributes */ void getAttribute(AABox& bbox, AttribID attrib, int first, int count, double* result); }; } // namespace rgl #endif // PLANESET_HPP rgl/src/Viewpoint.cpp0000644000176000001440000001120212262026246014343 0ustar ripleyusers#include "Viewpoint.hpp" #include "opengl.hpp" using namespace rgl; ////////////////////////////////////////////////////////////////////////////// // // CLASS // Viewpoint // Viewpoint::Viewpoint(PolarCoord in_position, float in_fov, float in_zoom, Vec3 in_scale, bool in_interactive) : SceneNode(VIEWPOINT), fov(in_fov), zoom(in_zoom), interactive(in_interactive) { scale = in_scale; setPosition(in_position); clearMouseMatrix(); } PolarCoord& Viewpoint::getPosition() { return position; } Viewpoint::Viewpoint(double* in_userMatrix, float in_fov, float in_zoom, Vec3 in_scale, bool in_interactive) : SceneNode(VIEWPOINT), position( PolarCoord(0.0f, 0.0f) ), fov(in_fov), zoom(in_zoom), interactive(in_interactive) { for (int i=0; i<16; i++) { userMatrix[i] = in_userMatrix[i]; } scale = in_scale; scaleChanged = true; clearMouseMatrix(); } void Viewpoint::setPosition(const PolarCoord& in_position) { Matrix4x4 M,N; M.setRotate(0, in_position.phi); N.setRotate(1, -in_position.theta); M = M * N; M.getData((double*)userMatrix); position = in_position; } void Viewpoint::clearMouseMatrix() { Matrix4x4 M; M.setIdentity(); M.getData((double*)mouseMatrix); } float Viewpoint::getZoom() const { return zoom; } void Viewpoint::setZoom(const float in_zoom) { zoom = in_zoom; } bool Viewpoint::isInteractive() const { return interactive; } void Viewpoint::setFOV(const float in_fov) { fov = clamp(in_fov, 0.0, 179.0 ); } float Viewpoint::getFOV() const { return fov; } void Viewpoint::setupFrustum(RenderContext* rctx, const Sphere& viewSphere) { frustum.enclose(viewSphere.radius, fov, rctx->rect.width, rctx->rect.height); // zoom frustum.left *= zoom; frustum.right *= zoom; frustum.bottom *= zoom; frustum.top *= zoom; } void Viewpoint::setupOrientation(RenderContext* rctx) const { glMultMatrixd(mouseMatrix); glMultMatrixd(userMatrix); } void Viewpoint::setupTransformation(RenderContext* rctx, const Sphere& viewSphere) { // projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (frustum.ortho) { glOrtho(frustum.left, frustum.right, frustum.bottom, frustum.top, frustum.znear, frustum.zfar); } else { glFrustum(frustum.left, frustum.right, frustum.bottom, frustum.top, frustum.znear, frustum.zfar); } // modelview glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef( 0.0f, 0.0f, -frustum.distance ); setupOrientation(rctx); glScaled(scale.x, scale.y, scale.z); glTranslatef( -viewSphere.center.x, -viewSphere.center.y, -viewSphere.center.z ); } void Viewpoint::updateMouseMatrix(Vec3 dragStart, Vec3 dragCurrent) { Vec3 axis = dragStart.cross(dragCurrent); float angle = dragStart.angle(dragCurrent); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if (axis.getLength() > 0) glRotatef((GLfloat)angle, (GLfloat)axis.x, (GLfloat)axis.y, (GLfloat)axis.z); glGetDoublev(GL_MODELVIEW_MATRIX,mouseMatrix); glPopMatrix(); } void Viewpoint::updateMouseMatrix(PolarCoord newpos) { Matrix4x4 M,N; M.setRotate(0, newpos.phi); N.setRotate(1, -newpos.theta); M = M * N; M.getData((double*)mouseMatrix); } void Viewpoint::mouseOneAxis(Vertex dragStart,Vertex dragCurrent,Vertex axis) { float angle = math::rad2deg(dragCurrent.x-dragStart.x); Matrix4x4 M((double *)userMatrix); Vec4 v = M * Vec4(axis.x, axis.y, axis.z); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glRotatef((GLfloat)angle, (GLfloat)v.x/v.w, (GLfloat)v.y/v.w, (GLfloat)v.z/v.w); glGetDoublev(GL_MODELVIEW_MATRIX,mouseMatrix); glPopMatrix(); } void Viewpoint::mergeMouseMatrix() { Matrix4x4 M((double *)userMatrix), N((double *)mouseMatrix); M = N * M; M.getData((double *)userMatrix); N.setIdentity(); N.getData((double *)mouseMatrix); } void Viewpoint::getUserMatrix(double* dest) { for(int i=0; i<16;i++) dest[i] = userMatrix[i]; } void Viewpoint::setUserMatrix(double* src) { for(int i=0; i<16;i++) userMatrix[i] = src[i]; } void Viewpoint::getScale(double* dest) { dest[0] = scale.x; dest[1] = scale.y; dest[2] = scale.z; } void Viewpoint::setScale(double* src) { scale.x = src[0]; scale.y = src[1]; scale.z = src[2]; scaleChanged = true; } void Viewpoint::getPosition(double* dest) { dest[0] = position.theta; dest[1] = position.phi; } void Viewpoint::setPosition(double* src) { position.theta = src[0]; position.phi = src[1]; } Vertex Viewpoint::getCOP(const Sphere& viewSphere) const { return viewSphere.center + ( position.vector() * frustum.distance * 2.0f ); } rgl/NAMESPACE0000644000176000001440000000520712262005640012306 0ustar ripleyusersexport(.check3d, abclines3d, addNormals, asEuclidean, asHomogeneous, aspect3d, axes3d, axis3d, box3d, bbox3d, bg3d, clear3d, clipplanes3d, cube3d, cuboctahedron3d, cylinder3d, decorate3d, dodecahedron3d, dot3d, ellipse3d, extrude3d, grid3d, icosahedron3d, identify3d, identityMatrix, light3d, lines3d, material3d, movie3d, mtext3d, octahedron3d, oh3d, open3d, par3d, par3dinterp, particles3d, persp3d, planes3d, play3d, plot3d, points3d, polygon3d, pop3d, qmesh3d, quads3d, readSTL, rgl.abclines, rgl.bbox, rgl.bg, rgl.bringtotop, rgl.clear, rgl.close, rgl.cur, rgl.ids, rgl.init, rgl.light, rgl.lines, rgl.linestrips, rgl.clipplanes, rgl.material, rgl.open, rgl.pixels, rgl.planes, rgl.points, rgl.pop, rgl.postscript, rgl.primitive, rgl.projection, rgl.quads, rgl.quit, rgl.Sweave, rgl.Sweave.off, rgl.select, rgl.select3d, rgl.set, rgl.snapshot, rgl.spheres, rgl.sprites, rgl.surface, rgl.texts, rgl.triangles, rgl.user2window, rgl.attrib, rgl.attrib.count, rgl.dev.list, rgl.useNULL, rgl.viewpoint, rgl.window2user, rglFonts, r3dDefaults, rotate3d, rotationMatrix, scale3d, scaleMatrix, scene3d, segments3d, select3d, selectpoints3d, rgl.setMouseCallbacks, shade3d, shapelist3d, snapshot3d, Sweave.snapshot, spheres3d, spin3d, sprites3d, subdivision3d, surface3d, terrain3d, tetrahedron3d, text3d, texts3d, title3d, triangulate, tmesh3d, transform3d, translate3d, translationMatrix, triangles3d, turn3d, view3d, wire3d, writeOBJ, writePLY, writeSTL, writeWebGL) if (.Platform$GUI == "AQUA") { useDynLib(aglrgl, .registration = TRUE, .fixes = "") } else { useDynLib(rgl, .registration = TRUE, .fixes = "") } S3method(dot3d, shapelist3d) S3method(wire3d, shapelist3d) S3method(shade3d, shapelist3d) S3method(translate3d, shapelist3d) S3method(rotate3d, shapelist3d) S3method(scale3d, shapelist3d) S3method(addNormals, shapelist3d) S3method(dot3d, mesh3d) S3method(translate3d, mesh3d) S3method(rotate3d, mesh3d) S3method(scale3d, mesh3d) S3method(wire3d, mesh3d) S3method(shade3d, mesh3d) S3method(subdivision3d, mesh3d) S3method(addNormals, mesh3d) S3method(plot3d, mesh3d) S3method(translate3d, default) S3method(rotate3d, default) S3method(scale3d, default) S3method(ellipse3d, default) S3method(ellipse3d, lm) S3method(ellipse3d, glm) S3method(ellipse3d, nls) S3method(plot3d, default) S3method(persp3d, default) S3method(plot3d, rglscene) S3method(plot3d, rglobject) S3method(plot3d, rglbboxdeco) S3method(plot3d, rglbackground) S3method(print, rglscene) S3method(print, rglobject) if(tools:::.OStype() == "windows") { import(utils) # only needed for getWindowsHandle } rgl/demo/0000755000176000001440000000000012171573711012017 5ustar ripleyusersrgl/demo/stereo.R0000644000176000001440000001231412171573711013444 0ustar ripleyusersrandomDot <- function(left, right, rightOffset=c(200, 0), n=3000, ...) { old <- rgl.cur() on.exit(rgl.set(old)) force(left) force(right) rgl.set(left) leftViewport <- par3d("viewport") leftSize <- leftViewport[3:4] leftProj <- rgl.projection() leftDepth <- rgl.pixels("depth") leftUR <- leftViewport[1:2] + leftSize - 1 rgl.set(right) rightViewport <- par3d("viewport") rightSize <- rightViewport[3:4] rightProj <- rgl.projection() rightDepth <- rgl.pixels("depth") rightUR <- rightViewport[1:2] + rightSize - 1 ll <- pmin(leftViewport[1:2], rightViewport[1:2]+rightOffset) size <- pmax(leftViewport[3:4], rightViewport[3:4]+rightOffset) pts <- matrix(c(sample(leftSize[1], n, replace=T), sample(leftSize[2], n, replace=T)), n, 2) # for debugging: # pts <-matrix(c(seq(1, size[1], len=n), seq(1, size[2], len=n)), n, 2) cols <- 1:n startpt <- pts startcols <- cols keep <- startpt[,1] < leftSize[1] & startpt[,2] < leftSize[2] pt <- startpt[keep,,drop=FALSE] cl <- startcols[keep] while (length(pt)) { depth <- leftDepth[pt] user <- rgl.window2user((pt[,1]-0.5)/leftSize[1], (pt[,2]-0.5)/leftSize[2], depth, projection=leftProj) win <- rgl.user2window(user, projection=rightProj) bkgd <- cbind((pt[,1] - 0.5)/rightSize[1], (pt[,2] - 0.5)/rightSize[2], 1) usewin <- rep(depth < 1, 3) rightPt <- structure(ifelse(usewin, win, bkgd), dim=dim(win)) rightPti <- round(cbind(rightSize[1]*rightPt[,1], rightSize[2]*rightPt[,2]) + 0.5) keep <- rightPti[,1] >= 1 & rightPti[,1] <= rightUR[1] & rightPti[,2] >= 1 & rightPti[,2] <= rightUR[2] rightPti <- rightPti[keep,,drop=FALSE] rightPt <- rightPt[keep,,drop=FALSE] cl <- cl[keep] keep <- TRUE | rightPt[,3] <= rightDepth[ rightPti ]+0.001 rightPti <- rightPti[keep,,drop=FALSE] cl <- cl[keep] pt <- cbind(rightPti[,1] + rightOffset[1], rightPti[,2] + rightOffset[2]) pts <- rbind(pts, pt) cols <- c(cols, cl) keep <- apply(pt, 1, min) >= 1 & pt[,1] <= leftUR[1] & pt[,2] <= leftUR[2] pt <- pt[keep,,drop=FALSE] cl <- cl[keep] } pt <- cbind(startpt[,1] - rightOffset[1], startpt[,2] - rightOffset[2]) keep <- pt[,1] > 1 & pt[,1] < rightSize[1] & pt[,2] > 1 & pt[,2] < rightSize[2] pt <- pt[ keep,,drop=FALSE ] cl <- startcols[ keep ] while (length(pt)) { depth <- rightDepth[pt] user <- rgl.window2user((pt[,1]-0.5)/rightSize[1], (pt[,2]-0.5)/rightSize[2], depth, projection=rightProj) win <- rgl.user2window(user, projection=leftProj) bkgd <- cbind((pt[,1] - 0.5)/leftSize[1], (pt[,2] - 0.5)/leftSize[2], 1) usewin <- rep(depth < 1, 3) leftPt <- structure(ifelse(usewin, win, bkgd), dim=dim(win)) leftPti <- round(cbind(leftSize[1]*leftPt[,1], leftSize[2]*leftPt[,2]) + 0.5) keep <- leftPti[,1] >= 1 & leftPti[,1] <= leftUR[1] & leftPti[,2] >= 1 & leftPti[,2] <= leftUR[2] leftPti <- leftPti[keep,,drop=FALSE] leftPt <- leftPt[keep,,drop=FALSE] cl <- cl[keep] keep <- TRUE | leftPt[,3] <= leftDepth[ leftPti ]+0.001 leftPti <- leftPti[keep,,drop=FALSE] cl <- cl[keep] pt <- leftPti pts <- rbind(pts, pt) cols <- c(cols, cl) pt <- cbind(pt[,1] - rightOffset[1], pt[,2] - rightOffset[2]) keep <- apply(pt, 1, min) >= 1 & pt[,1] <= rightUR[1] & pt[,2] <= rightUR[2] pt <- pt[keep,,drop=FALSE] cl <- cl[keep] } plot(pts, col = cols, pch=16, axes=F,cex=0.25+cols/n/2,xlab="",ylab="",...) rug((size[1] + c(-1,1)*rightOffset[1])/2, side=1) rug((size[1] + c(-1,1)*rightOffset[1])/2, side=3) rug((size[2] + c(-1,1)*rightOffset[2])/2, side=2) rug((size[2] + c(-1,1)*rightOffset[2])/2, side=4) } #red #cyan anaglyph <- function(left, right, leftColor = c(1,0,0), rightColor = c(0,1,1)) { old <- rgl.cur() on.exit(rgl.set(old)) force(left) force(right) rgl.set(left) vp <- par3d("viewport") leftPixels <- rgl.pixels(viewport=vp) leftPixels <- (leftPixels[,,1]+leftPixels[,,2]+leftPixels[,,3])/3 rgl.set(right) rightPixels <- rgl.pixels(viewport=vp) rightPixels <- (rightPixels[,,1]+rightPixels[,,2]+rightPixels[,,3])/3 red <- leftPixels*leftColor[1] + rightPixels*rightColor[1] green <- leftPixels*leftColor[2] + rightPixels*rightColor[2] blue <- leftPixels*leftColor[3] + rightPixels*rightColor[3] col <- rgb(pmin(red,1), pmin(green,1), pmin(blue,1)) colf <- factor(col) z <- as.numeric(colf) dim(z) <- dim(leftPixels) image(z,col=levels(colf),breaks=min(z):(max(z)+1) - 0.5, axes=FALSE) } if (!rgl.useNULL()) { source(system.file("demo/mouseCallbacks.R", package="rgl"), echo=FALSE ) # This version assumes the eyes diverge for the stereo view. # Reverse the two arguments for the cross-eyed view. dev.new(width=9, height=7) randomDot(rgl.cur()-1, rgl.cur()) # A red-cyan anaglyph (for 3D glasses). Use optional args to anaglyph for other glasses. dev.new() anaglyph(rgl.cur()-1, rgl.cur()) } else cat("Can't read pixels from a NULL device\n")rgl/demo/mouseCallbacks.R0000644000176000001440000002136411730236165015077 0ustar ripleyusersxprod <- function(a, b) c(a[2]*b[3] - a[3]*b[2], a[3]*b[1] - a[1]*b[3], a[1]*b[2] - a[2]*b[1]) vlen <- function(a) sqrt(sum(a^2)) angle <- function(a,b) { dot <- sum(a*b) acos(dot/vlen(a)/vlen(b)) } clamp <- function(x, min, max) pmin(pmax(x, min), max) mouseNone <- function(button = 1, dev = rgl.cur() ) { cur <- rgl.cur() for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = NULL, update = NULL, end = NULL) } rgl.set(cur) } mouseTrackball <- function(button = 1, dev = rgl.cur() ) { width <- height <- rotBase <- NULL userMatrix <- list() cur <- rgl.cur() screenToVector <- function(x, y) { radius <- max(width, height)/2 centre <- c(width, height)/2 pt <- (c(x, y) - centre)/radius len <- vlen(pt) if (len > 1.e-6) pt <- pt/len maxlen <- sqrt(2) angle <- (maxlen - len)/maxlen*pi/2 z <- sin(angle) len <- sqrt(1 - z^2) pt <- pt * len return (c(pt, z)) } trackballBegin <- function(x, y) { vp <- par3d("viewport") width <<- vp[3] height <<- vp[4] cur <<- rgl.cur() for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else userMatrix[[i]] <<- par3d("userMatrix") } rgl.set(cur, TRUE) rotBase <<- screenToVector(x, height - y) } trackballUpdate <- function(x,y) { rotCurrent <- screenToVector(x, height - y) angle <- angle(rotBase, rotCurrent) axis <- xprod(rotBase, rotCurrent) mouseMatrix <- rotationMatrix(angle, axis[1], axis[2], axis[3]) for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else par3d(userMatrix = mouseMatrix %*% userMatrix[[i]]) } rgl.set(cur, TRUE) } for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = trackballBegin, update = trackballUpdate, end = NULL) } rgl.set(cur, TRUE) } mouseXAxis<- function(button = 1, dev = rgl.cur() , left=TRUE) { mouseOneAxis(button, dev, axis=c(1,0,0), left=left) } mouseYAxis<- function(button = 1, dev = rgl.cur(), left = TRUE ) { mouseOneAxis(button, dev, axis=c(0,1,0), left=left) } mouseZAxis<- function(button = 1, dev = rgl.cur(), left=TRUE) { mouseOneAxis(button, dev, axis=c(0,0,1), left=left) } mouseOneAxis <- function(button = 1, dev = rgl.cur(), axis = c(1,0,0), left = TRUE ) { width <- height <- rotBase <- NULL userMatrix <- list() cur <- rgl.cur() screenToVector <- function(x, y) { radius <- max(width, height)/2 centre <- c(width, height)/2 pt <- (c(x, y) - centre)/radius len <- vlen(pt) if (len > 1.e-6) pt <- pt/len maxlen <- sqrt(2) angle <- (maxlen - len)/maxlen*pi/2 z <- sin(angle) len <- sqrt(1 - z^2) pt <- pt * len return (c(pt, z)) } oneAxisBegin <- function(x, y) { vp <- par3d("viewport") width <<- vp[3] height <<- vp[4] cur <<- rgl.cur() for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else userMatrix[[i]] <<- par3d("userMatrix") } rgl.set(cur, TRUE) rotBase <<- screenToVector(x, height/2) } oneAxisUpdate <- function(x,y) { rotCurrent <- screenToVector(x, height/2) angle <- rotCurrent[1] - rotBase[1] mouseMatrix <- rotationMatrix(angle, axis[1], axis[2], axis[3]) for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else { if (left) par3d(userMatrix = mouseMatrix %*% userMatrix[[i]]) else par3d(userMatrix = userMatrix[[i]] %*% mouseMatrix) } } rgl.set(cur, TRUE) } for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = oneAxisBegin, update = oneAxisUpdate, end = NULL) } rgl.set(cur, TRUE) } mousePolar <- function(button = 1, dev = rgl.cur()) { screenToPolar <- function(x,y) { r <- min(width, height)/2 dx <- clamp(x - width/2, -r, r) dy <- clamp(y - height/2, -r, r) return( asin( c(dx, -dy)/r ) ) } cur <- rgl.cur() width <- height <- dragBase <- dragCurrent <- NULL camBase <- list() polarBegin <- function(x, y) { vp <- par3d("viewport") width <<- vp[3] height <<- vp[4] dragBase <<- screenToPolar(x, y) cur <<- rgl.cur() for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else { m <- par3d("userMatrix") svd <- svd(m[1:3, 1:3]) m[1:3, 1:3] <- svd$u %*% t(svd$v) theta <- atan2(-m[1,3], m[1,1]) m <- m %*% rotationMatrix(theta, 0,1,0) svd <- svd(m[1:3, 1:3]) m[1:3,1:3] <- svd$u %*% t(svd$v) phi <- atan2(-m[2,3], m[3,3]) camBase[[i]] <<- c(theta, phi) } } rgl.set(cur, TRUE) } polarUpdate <- function(x,y) { dragCurrent <<- screenToPolar(x, y) for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else { newpos <- camBase[[i]] - ( dragCurrent - dragBase ) newpos[2] <- clamp(newpos[2], -pi/2, pi/2) mouseMatrix <- rotationMatrix(newpos[2], 1, 0, 0) %*% rotationMatrix(-newpos[1], 0, 1, 0) par3d(userMatrix = mouseMatrix) } } rgl.set(cur, TRUE) } for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = polarBegin, update = polarUpdate, end = NULL) } rgl.set(cur, TRUE) } # Set background colour based on x,y position in the window mouseBG <- function(button = 1, dev = rgl.cur(), init = "white", rate = cbind(c(1,0,1),c(0,1,1)), space = c("rgb", "hsv")) { cur <- rgl.cur() space <- match.arg(space) init <- col2rgb(init)/255 if (space == "hsv") init <- rgb2hsv(init*255) lambda0 <- lambda <- NULL bgBegin <- function(x, y) { lambda0 <<- c(x/width, 1-y/height) vp <- par3d("viewport") width <<- vp[3] height <<- vp[4] } bgUpdate <- function(x,y) { lambda <<- c(x/width, 1-y/height) - lambda0 color <- clamp(init + rate %*% lambda, 0, 1) x <- color[1] y <- color[2] z <- color[3] if (space == "rgb") color <- rgb(x,y,z) else color <- hsv(x,y,z) for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else bg3d(color=color) } rgl.set(cur, TRUE) } bgEnd <- function() { init <<- clamp(init + rate %*% lambda, 0, 1) } for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = bgBegin, update = bgUpdate, end = bgEnd) } rgl.set(cur, TRUE) } # Set time using an arbitrary par3dinterp function mouseInterp <- function(button = 1, dev = rgl.cur(), fn, init = 0, range = NULL, direction=c(1,0)) { cur <- rgl.cur() time <- init x0 <- width <- height <- NULL interpBegin <- function(x, y) { vp <- par3d("viewport") width <<- vp[3] height <<- vp[4] x0 <<- sum(direction*c(x,y)) } interpUpdate <- function(x,y) { time <<- init + (sum(direction*c(x,y)) - x0)/width if (!is.null(range)) time <<- clamp(time, range[1], range[2]) for (i in dev) { if (inherits(try(rgl.set(i, TRUE)), "try-error")) dev <<- dev[dev != i] else par3d(fn(time)) } rgl.set(cur, TRUE) } interpEnd <- function() { init <<- time } for (i in dev) { rgl.set(i, TRUE) rgl.setMouseCallbacks(button, begin = interpBegin, update = interpUpdate, end = interpEnd) } rgl.set(cur, TRUE) } mouseZoom <- function(button = 1, dev = rgl.cur()) mouseInterp(button,dev=dev,fn=par3dinterp(times=c(-4,4)/4, zoom=c(10^(-4),10^4),method="linear"), init=log10(par3d("zoom"))/4,range=c(-4,4)/4,direction=c(0,-1)) mouseFOV <- function(button = 1, dev = rgl.cur()) mouseInterp(button,dev=dev,fn=par3dinterp(times=c(1,179)/180, FOV=c(1,179),method="linear"), init=par3d("FOV")/180, range = c(1,179)/180, direction=c(0,1)) # Synchronize mouse control of two windows for stereo view example(surface3d, echo = FALSE) par3d(windowRect= c(0,32,512,544), userMatrix = rotationMatrix(5*pi/180, 0,1,0) %*% par3d("userMatrix") ) w1 <- rgl.cur() example(surface3d, echo = FALSE) par3d(windowRect = c(512,32,1024,544)) w2 <- rgl.cur() mouseTrackball(dev=c(w1,w2)) mouseZoom(2,dev=c(w1,w2)) mouseFOV(3,dev=c(w1,w2)) rgl/demo/lsystem.r0000644000176000001440000001126511064454435013710 0ustar ripleyusers# demo: lsystem.r # author: Daniel Adler # $Id: lsystem.r 491 2006-07-31 13:17:19Z dmurdoch $ # # geometry # deg2rad <- function( degree ) { return( degree*pi/180 ) } rotZ.m3x3 <- function( degree ) { kc <- cos(deg2rad(degree)) ks <- sin(deg2rad(degree)) return( matrix( c( kc, -ks, 0, ks, kc, 0, 0, 0, 1 ),ncol=3,byrow=T ) ) } rotX.m3x3 <- function( degree ) { kc <- cos(deg2rad(degree)) ks <- sin(deg2rad(degree)) return( matrix( c( 1, 0, 0, 0, kc, -ks, 0, ks, kc ),ncol=3,byrow=T ) ) } rotY.m3x3 <- function( degree ) { kc <- cos(deg2rad(degree)) ks <- sin(deg2rad(degree)) return( matrix( c( kc, 0, ks, 0, 1, 0, -ks, 0, kc ),ncol=3,byrow=T ) ) } rotZ <- function( v, degree ) { return ( rotZ.m3x3(degree) %*% v) } rotX <- function( v, degree ) { return ( rotX.m3x3(degree) %*% v) } rotY <- function( v, degree ) { return ( rotY.m3x3(degree) %*% v) } # # turtle graphics, rgl implementation: # turtle.init <- function(pos=c(0,0,0),head=0,pitch=90,roll=0,level=0) { rgl.clear("all") rgl.bg(color="black") rgl.light() return( list(pos=pos,head=head,pitch=pitch,roll=roll,level=level) ) } turtle.move <- function(turtle, steps, color) { rm <- rotX.m3x3(turtle$pitch) %*% rotY.m3x3(turtle$head) %*% rotZ.m3x3(turtle$roll) from <- as.vector( turtle$pos ) dir <- rm %*% c(0,0,-1) to <- from + dir * steps x <- c( from[1], to[1] ) y <- c( from[2], to[2] ) z <- c( from[3], to[3] ) rgl.lines(x,y,z,col=color,size=1.5,alpha=0.5) turtle$pos <- to return (turtle) } turtle.pitch <- function(turtle, degree) { turtle$pitch <- turtle$pitch + degree return(turtle) } turtle.head <- function(turtle, degree) { turtle$head <- turtle$head + degree return(turtle) } turtle.roll <- function(turtle, degree) { turtle$roll <- turtle$roll + degree return(turtle) } # # l-system general # lsystem.code <- function( x ) substitute( x ) lsystem.gen <- function( x, grammar, levels=0 ) { code <- eval( substitute( substitute( REPLACE , grammar ), list(REPLACE=x) ) ) if (levels) return( lsystem.gen( code , grammar , levels-1 ) ) else return( code ) } # # l-system plot # lsystem.plot <- function( expr, level ) { turtle <- turtle.init(level=level) lsystem.eval( expr, turtle ) } lsystem.eval <- function( expr, turtle ) { if ( length(expr) == 3 ) { turtle <- lsystem.eval( expr[[2]], turtle ) turtle <- lsystem.eval( expr[[3]], turtle ) turtle <- lsystem.eval( expr[[1]], turtle ) } else if ( length(expr) == 2 ) { saved <- turtle turtle <- lsystem.eval( expr[[1]], turtle ) turtle <- lsystem.eval( expr[[2]], turtle ) turtle <- saved } else if ( length(expr) == 1 ) { if ( as.name(expr) == "stem" ) turtle <- turtle.move(turtle, 5, "brown") else if ( as.name(expr) == "short") turtle <- turtle.move(turtle, 5, "brown") else if ( as.name(expr) == "leaf" ) { rgl.spheres(turtle$pos[1],turtle$pos[2],turtle$pos[3],radius=0.1+turtle$level*0.3,color="green") rgl.sprites(turtle$pos[1],turtle$pos[2],turtle$pos[3],radius=0.5+turtle$level*0.3 ,color="green",texture=system.file("textures/particle.png",package="rgl"),textype="alpha",alpha=0.5) } else if ( as.name(expr) == "roll" ) turtle <- turtle.head(turtle, 60) else if ( as.name(expr) == "down" ) turtle <- turtle.pitch(turtle,10) else if ( as.name(expr) == "up" ) turtle <- turtle.pitch(turtle,-10) else if ( as.name(expr) == "left" ) turtle <- turtle.head(turtle, 1) else if ( as.name(expr) == "right") turtle <- turtle.head(turtle,-1.5) else if ( as.name(expr) == "turnleft") turtle <- turtle.head(turtle,20) else if ( as.name(expr) == "turnright") turtle <- turtle.head(turtle,-20) else if ( as.name(expr) == "turn") turtle <- turtle.roll(turtle,180) } return (turtle) } # # example # simple <- function (level=0) { grammar <- list( stem=lsystem.code( stem-(up-stem-leaf)-stem-(down-stem-leaf)-stem-leaf ) ) plant <- lsystem.gen(lsystem.code(stem), grammar, level ) lsystem.plot(plant,level) } rgl.demo.lsystem <- function (level=0) { gen <- list( stem=lsystem.code( stem-left-stem-branch( turnleft-down-short-turnleft-down-stem-leaf)-right-right-stem--branch( turnright-up-short-turnright-up-short-turnright-short-stem-leaf)-left-left-left-stem-branch( turnleft-down-short-turnright-down-stem-leaf )-branch( up-turnright-short-up-turnleft-up-stem-leaf ) ) ) plant <- lsystem.gen(lsystem.code(stem), gen, level ) lsystem.plot(plant,level) } rgl.open() rgl.demo.lsystem(level=1) rgl/demo/bivar.r0000644000176000001440000000177111064454435013314 0ustar ripleyusers# rgl demo: rgl-bivar.r # author: Daniel Adler # $Id: bivar.r 564 2007-02-22 09:56:01Z dmurdoch $ rgl.demo.bivar <- function() { require(MASS); # parameters: n<-50; ngrid<-40 # generate samples: set.seed(31415) x<-rnorm(n); y<-rnorm(n) # estimate non-parameteric density surface via kernel smoothing denobj<-kde2d(x, y, n=ngrid) den.z <-denobj$z # generate parametric density surface of a bivariate normal distribution xgrid <- denobj$x ygrid <- denobj$y bi.z <- dnorm(xgrid)%*%t(dnorm(ygrid)) # visualize: zscale<-20 # New window open3d() # clear scene: clear3d("all") # setup env: bg3d(color="#887777") light3d() # Draws the simulated data as spheres on the baseline spheres3d(x,y,rep(0,n),radius=0.1,color="#CCCCFF") # Draws non-parametric density surface3d(xgrid,ygrid,den.z*zscale,color="#FF2222",alpha=0.5) # Draws parametric density surface3d(xgrid,ygrid,bi.z*zscale,color="#CCCCFF",front="lines") } rgl.demo.bivar() rgl/demo/lollipop3d.R0000644000176000001440000001124011064454435014222 0ustar ripleyusers cone3d <- function(base,tip,rad,n=30,...) { degvec <- seq(0,2*pi,length=n) ax <- tip-base ## what do if ax[1]==0? if (ax[1]!=0) { p1 <- c(-ax[2]/ax[1],1,0) p1 <- p1/sqrt(sum(p1^2)) if (p1[1]!=0) { p2 <- c(-p1[2]/p1[1],1,0) p2[3] <- -sum(p2*ax) p2 <- p2/sqrt(sum(p2^2)) } else { p2 <- c(0,0,1) } } else if (ax[2]!=0) { p1 <- c(0,-ax[3]/ax[2],1) p1 <- p1/sqrt(sum(p1^2)) if (p1[1]!=0) { p2 <- c(0,-p1[3]/p1[2],1) p2[3] <- -sum(p2*ax) p2 <- p2/sqrt(sum(p2^2)) } else { p2 <- c(1,0,0) } } else { p1 <- c(0,1,0); p2 <- c(1,0,0) } ecoord2 <- function(theta) { base+rad*(cos(theta)*p1+sin(theta)*p2) } for (i in 1:(n-1)) { li <- ecoord2(degvec[i]) lj <- ecoord2(degvec[i+1]) triangles3d(c(li[1],lj[1],tip[1]),c(li[2],lj[2],tip[2]),c(li[3],lj[3],tip[3]),...) } } lollipop3d <- function(data.x,data.y,data.z,surf.fun,surf.n=50, xlim=range(data.x), ylim=range(data.y), zlim=range(data.z), asp=c(y=1,z=1), xlab=deparse(substitute(x)), ylab=deparse(substitute(y)), zlab=deparse(substitute(z)), alpha.surf=0.4, col.surf=fg,col.stem=c(fg,fg), col.pt="gray",type.surf="line",ptsize, lwd.stem=2,lit=TRUE,bg="white",fg="black", col.axes=fg,col.axlabs=fg, axis.arrow=TRUE,axis.labels=TRUE, box.col=bg, axes=c("lines","box")) { axes <- match.arg(axes) col.stem <- rep(col.stem,length=2) x.ticks <- pretty(xlim) x.ticks <- x.ticks[x.ticks>=min(xlim) & x.ticks<=max(xlim)] x.ticklabs <- if (axis.labels) as.character(x.ticks) else NULL y.ticks <- pretty(ylim) y.ticks <- y.ticks[y.ticks>=min(ylim) & y.ticks<=max(ylim)] y.ticklabs <- if (axis.labels) as.character(y.ticks) else NULL z.ticks <- pretty(zlim) z.ticks <- z.ticks[z.ticks>=min(zlim) & z.ticks<=max(zlim)] z.ticklabs <- if (axis.labels) as.character(z.ticks) else NULL if (!missing(surf.fun)) { surf.x <- seq(xlim[1],xlim[2],length=surf.n) surf.y <- seq(ylim[1],ylim[2],length=surf.n) surf.z <- outer(surf.x,surf.y,surf.fun) ## requires surf.fun be vectorized z.interc <- surf.fun(data.x,data.y) zdiff <- diff(range(c(surf.z,data.z))) } else { z.interc <- rep(min(data.z),length(data.x)) zdiff <- diff(range(data.z)) } xdiff <- diff(xlim) ydiff <- diff(ylim) y.adj <- if (asp[1]<=0) 1 else asp[1]*xdiff/ydiff data.y <- y.adj*data.y y.ticks <- y.adj*y.ticks ylim <- ylim*y.adj ydiff <- diff(ylim) z.adj <- if (asp[2]<=0) 1 else asp[2]*xdiff/zdiff data.z <- z.adj*data.z if (!missing(surf.fun)) { surf.y <- y.adj*surf.y surf.z <- z.adj*surf.z } z.interc <- z.adj*z.interc z.ticks <- z.adj*z.ticks zlim <- z.adj*zlim open3d() clear3d("all") light3d() bg3d(color=c(bg,fg)) if (!missing(surf.fun)) surface3d(surf.x,surf.y,surf.z,alpha=alpha.surf, front=type.surf,back=type.surf, col=col.surf,lit=lit) if (missing(ptsize)) ptsize <- 0.02*xdiff ## draw points spheres3d(data.x,data.y,data.z,r=ptsize,lit=lit,color=col.pt) ## draw lollipops apply(cbind(data.x,data.y,data.z,z.interc),1, function(X) { lines3d(x=rep(X[1],2), y=rep(X[2],2), z=c(X[3],X[4]), col=ifelse(X[3]>X[4],col.stem[1], col.stem[2]),lwd=lwd.stem) }) bbox <- par3d("bbox") if (axes=="box") { bbox3d(xat=x.ticks,xlab=x.ticklabs, yat=y.ticks,ylab=y.ticklabs, zat=z.ticks,zlab=z.ticklabs,lit=lit) } else if (axes=="lines") { ## set up axis lines bbox <- par3d("bbox") axis3d(edge="x",at=x.ticks,labels=x.ticklabs, col=col.axes,arrow=axis.arrow) axis3d(edge="y",at=y.ticks,labels=y.ticklabs, col=col.axes,arrow=axis.arrow) axis3d(edge="z",at=z.ticks,labels=z.ticklabs, col=col.axes,arrow=axis.arrow) box3d(col=col.axes) } decorate3d(xlab=xlab, ylab=ylab, zlab=zlab, box=FALSE, axes=FALSE, col=col.axlabs) } x <- 1:5 y <- x*10 z <- (x+y)/20 open3d() spheres3d(x,y,z) axes3d() set.seed(1001) x <- runif(30) y <- runif(30,max=2) dfun <- function(x,y) { 2*x+3*y+2*x*y+3*y^2 } z <- dfun(x,y)+rnorm(30,sd=0.5) ## lollipops only lollipop3d(x,y,z) ## lollipops plus theoretical surface lollipop3d(x,y,z,dfun,col.pt="red",col.stem=c("red","blue")) ## lollipops plus regression fit linmodel <- lm(z~x+y) dfun <- function(x,y) {predict(linmodel,newdata=data.frame(x=x,y=y))} lollipop3d(x,y,z,dfun,col.pt="red",col.stem=c("red","blue")) #### rgl/demo/shapes3d.R0000644000176000001440000000655012137551077013665 0ustar ripleyusers cone3d <- function(base=c(0,0,0),tip=c(0,0,1),rad=1,n=30,draw.base=TRUE,qmesh=FALSE, trans = par3d("userMatrix"), ...) { ax <- tip-base if (missing(trans) && !rgl.cur()) trans <- diag(4) ### is there a better way? if (ax[1]!=0) { p1 <- c(-ax[2]/ax[1],1,0) p1 <- p1/sqrt(sum(p1^2)) if (p1[1]!=0) { p2 <- c(-p1[2]/p1[1],1,0) p2[3] <- -sum(p2*ax) p2 <- p2/sqrt(sum(p2^2)) } else { p2 <- c(0,0,1) } } else if (ax[2]!=0) { p1 <- c(0,-ax[3]/ax[2],1) p1 <- p1/sqrt(sum(p1^2)) if (p1[1]!=0) { p2 <- c(0,-p1[3]/p1[2],1) p2[3] <- -sum(p2*ax) p2 <- p2/sqrt(sum(p2^2)) } else { p2 <- c(1,0,0) } } else { p1 <- c(0,1,0); p2 <- c(1,0,0) } degvec <- seq(0,2*pi,length=n+1)[-1] ecoord2 <- function(theta) { base+rad*(cos(theta)*p1+sin(theta)*p2) } i <- rbind(1:n,c(2:n,1),rep(n+1,n)) v <- cbind(sapply(degvec,ecoord2),tip) if (qmesh) ## minor kluge for quads -- draw tip twice i <- rbind(i,rep(n+1,n)) if (draw.base) { v <- cbind(v,base) i.x <- rbind(c(2:n,1),1:n,rep(n+2,n)) if (qmesh) ## add base twice i.x <- rbind(i.x,rep(n+2,n)) i <- cbind(i,i.x) } if (qmesh) v <- rbind(v,rep(1,ncol(v))) ## homogeneous if (!qmesh) triangles3d(v[1,i],v[2,i],v[3,i],...) else return(rotate3d(qmesh3d(v,i,material=...), matrix=trans)) } ellipsoid3d <- function(rx=1,ry=1,rz=1,n=30,ctr=c(0,0,0), qmesh=FALSE, trans = par3d("userMatrix"),...) { if (missing(trans) && !rgl.cur()) trans <- diag(4) degvec <- seq(0,pi,length=n) ecoord2 <- function(p) { c(rx*cos(p[1])*sin(p[2]),ry*sin(p[1])*sin(p[2]),rz*cos(p[2])) } v <- apply(expand.grid(2*degvec,degvec),1,ecoord2) if (qmesh) v <- rbind(v,rep(1,ncol(v))) ## homogeneous e <- expand.grid(1:(n-1),1:n) i1 <- apply(e,1,function(z)z[1]+n*(z[2]-1)) i2 <- i1+1 i3 <- (i1+n-1) %% n^2 + 1 i4 <- (i2+n-1) %% n^2 + 1 i <- rbind(i1,i2,i4,i3) if (!qmesh) quads3d(v[1,i],v[2,i],v[3,i],...) else return(rotate3d(qmesh3d(v,i,material=list(...)),matrix=trans)) } ############ open3d() ellipsoid3d(ctr=c(2,2,2),rx=3,ry=2,col="red",alpha=0.4) cone3d(base=c(-2,-2,-2),rad=0.5,tip=c(-3,0,-4),col="blue",front="lines",back="lines") shade3d(translate3d(cube3d(),3,-2,3,col="purple")) ### now with qmesh() open3d() q1 <- cone3d(qmesh=TRUE,trans=diag(4)) ## the "unit cone"; ## height=1,radius=1, base at (0,0,0) shade3d(q1) ## various transformations and rotations wire3d(translate3d(q1,3,0,0),col="green") wire3d(translate3d(scale3d(q1,1,1,2),6,0,0),col="green") dot3d(translate3d(q1,0,3,0),col="green") dot3d(translate3d(scale3d(q1,2,1,1),0,6,0),col="green") shade3d(translate3d(q1,0,0,3),col="red") shade3d(translate3d(rotate3d(scale3d(q1,1,1,2),pi/4,0,1,0),0,0,6),col="red") axes3d() open3d() s1 <- ellipsoid3d(qmesh=TRUE,trans=diag(4)) ## the "unit sphere"; ## radius=1, ctr at (0,0,0) shade3d(s1) ## various transformations and rotations wire3d(translate3d(s1,3,0,0),col="green") wire3d(translate3d(scale3d(s1,1,1,2),6,0,0),col="green") dot3d(translate3d(s1,0,3,0),col="green") dot3d(translate3d(scale3d(s1,2,1,1),0,6,0),col="green") shade3d(translate3d(s1,0,0,3),col="red") shade3d(translate3d(rotate3d(scale3d(s1,1,1,2),pi/4,0,1,0),0,0,6),col="red") axes3d() rgl/demo/rgl.r0000644000176000001440000000020311064454435012762 0ustar ripleyusers# all rgl demos demo(hist3d) demo(abundance) demo(regression) demo(lsystem) demo(subdivision) # requires MASS library demo(bivar) rgl/demo/00Index0000644000176000001440000000155611140564640013154 0ustar ripleyusersrgl RGL Demonstration hist3d 3D histogram using basic building blocks bivar Bivariate densities: kernel smoothing using rgl.surface and alpha-channel (requires MASS package) abundance Animal abundance, visualization of multi-dimension data using multiple techniques lsystem Plant modelling using a turtle and L-system subdivision Subdivision surfaces using generic meshes (preview of generic 3D interface) regression Bivariate regression envmap Environment mapping shapes3d 3D shape primitives (cones, ellipsoids, cubes), some taken from qmesh3d lollipop3d "Lollipop" plots (3D scatterplot with lines between points and a surface) flag play3d() function that waves a flag mouseCallbacks Standard mouse handlers implemented in R, for a stereo view stereo Stereo views using a random dot stereogram & an anaglyph rgl/demo/regression.r0000644000176000001440000000232211064454435014362 0ustar ripleyusers# demo: regression # author: Daniel Adler # $Id: regression.r 491 2006-07-31 13:17:19Z dmurdoch $ rgl.demo.regression <- function(n=100,xa=3,za=8,xb=0.02,zb=0.01,xlim=c(0,100),zlim=c(0,100)) { rgl.clear("all") rgl.bg(sphere = TRUE, color = c("black", "green"), lit = FALSE, size=2, alpha=0.2, back = "lines") rgl.light() rgl.bbox() x <- runif(n,min=xlim[1],max=xlim[2]) z <- runif(n,min=zlim[1],max=zlim[2]) ex <- rnorm(n,sd=3) ez <- rnorm(n,sd=2) esty <- (xa+xb*x) * (za+zb*z) + ex + ez rgl.spheres(x,esty,z,color="gray",radius=1.5,specular="green",texture=system.file("textures/bump_dust.png",package="rgl"),texmipmap=T, texminfilter="linear.mipmap.linear") regx <- seq(xlim[1],xlim[2],len=100) regz <- seq(zlim[1],zlim[2],len=100) regy <- (xa+regx*xb) %*% t(za+regz*zb) rgl.surface(regx,regz,regy,color="blue",alpha=0.5,shininess=128) # rgl.surface(regx,regz,regy,color="blue",front="lines",back="lines") lx <- c(xlim[1],xlim[2],xlim[2],xlim[1]) lz <- c(zlim[1],zlim[1],zlim[2],zlim[2]) f <- function(x,z) { return ( (xa+x*xb) * t(za+z*zb) ) } ly <- f(lx,lz) rgl.quads(lx,ly,lz,color="red",size=5,front="lines",back="lines",lit=F) } rgl.open() rgl.demo.regression() rgl/demo/abundance.r0000644000176000001440000000257711064454435014136 0ustar ripleyusers# RGL-Demo: animal abundance # Authors: Oleg Nenadic, Daniel Adler # $Id: abundance.r 564 2007-02-22 09:56:01Z dmurdoch $ rgl.demo.abundance <- function() { open3d() clear3d("all") # remove all shapes, lights, bounding-box, and restore viewpoint # Setup environment: bg3d(col="#cccccc") # setup background light3d() # setup head-light # Importing animal data (created with wisp) terrain<-dget(system.file("demodata/region.dat",package="rgl")) pop<-dget(system.file("demodata/population.dat",package="rgl")) # Define colors for terrain zlim <- range(terrain) zlen <- zlim[2] - zlim[1] + 1 colorlut <- terrain.colors(82) col1 <- colorlut[9*sqrt(3.6*(terrain-zlim[1])+2)] # Set color to (water-)blue for regions with zero 'altitude' col1[terrain==0]<-"#0000FF" # Add terrain surface shape (i.e. population density): surface3d( 1:100,seq(1,60,length=100),terrain, col=col1,spec="#000000", ambient="#333333", back="lines" ) # Define colors for simulated populations (males:blue, females:red): col2<-pop[,4] col2[col2==0]<-"#3333ff" col2[col2==1]<-"#ff3333" # Add simulated populations as sphere-set shape spheres3d( pop[,1], pop[,2], terrain[cbind( ceiling(pop[,1]),ceiling(pop[,2]*10/6) )]+0.5, radius=0.2*pop[,3], col=col2, alpha=(1-(pop[,5])/10 ) ) } rgl.demo.abundance() rgl/demo/envmap.r0000644000176000001440000000072211064454435013472 0ustar ripleyusers# RGL-Demo: environment mapping # Author: Daniel Adler # $Id$ rgl.demo.envmap <- function() { open3d() # Clear scene: clear3d("all") light3d() bg3d(sphere=T, color="white", back="filled" , texture=system.file("textures/refmap.png",package="rgl") ) data(volcano) surface3d( 10*1:nrow(volcano),10*1:ncol(volcano),5*volcano , texture=system.file("textures/refmap.png",package="rgl") , texenvmap=TRUE , color = "white" ) } rgl.demo.envmap() rgl/demo/subdivision.r0000644000176000001440000000141611064454435014543 0ustar ripleyusers# RGL-demo: subdivision surfaces # author: Daniel Adler # $Id: subdivision.r 568 2007-03-11 18:15:27Z dmurdoch $ rgl.demo.subdivision <- function() { # setup environment clear3d("all") view3d() bg3d(color="gray") light3d() # generate basic mesh obj <- oh3d() part <- function( level, tx, ... ) { shade3d( translate3d( obj, tx, 0, 0 ) , color="gray30", front="lines",alpha=0.5,back="lines", override=TRUE ) shade3d( translate3d( subdivision3d( obj, depth=level ), tx, 0, 0 ) , override=TRUE, ... ) } common <- c(alpha=0.5) part(0, -5.50, color="blue" , common ) part(1, -1.75, color="yellow" , common ) part(2, 1.75, color="red" , common ) part(3, 5.50, color="green" , common ) } open3d() rgl.demo.subdivision() rgl/demo/flag.R0000644000176000001440000000141112172230633013042 0ustar ripleyusers wave <- function(time) { x <- seq(0,2, len=100) wavefn <- function(x) x * sin(-5*time + 1.5 * (x/2) * 2*pi)/10 deriv <- function(x) (wavefn(x + 0.01) - wavefn(x - 0.01))/0.02 arclen <- cumsum(sqrt(1 + deriv(x)^2))*(x[2]-x[1]) keep <- arclen < 2 x <- x[keep] y <- matrix(wavefn(x), length(x),20) z <- matrix(seq(0,1, len=20), length(x), 20, byrow=TRUE) arclen <- arclen[keep] par3d(skipRedraw = TRUE) if (nrow(rgl.ids())) rgl.pop() surface3d(x,y,z, texture_s=matrix(arclen/2, length(x), 20), texture_t=z, col="white") c(list(skipRedraw = FALSE), spin(time)) } open3d() material3d(texture = system.file("textures","rgl2.png", package="rgl")) spin <- spin3d(rpm=6,axis=c(0,0,1)) if (!rgl.useNULL()) play3d(wave, 10) rgl/demo/hist3d.r0000644000176000001440000000707411064454435013411 0ustar ripleyusers ########## ### 3D HIST EXAMPLE: ########## ################################################################################ ##### Required functions 'binplot' and 'hist3d': binplot.3d<-function(x,y,z,alpha=1,topcol="#ff0000",sidecol="#aaaaaa") { save <- par3d(skipRedraw=TRUE) on.exit(par3d(save)) x1<-c(rep(c(x[1],x[2],x[2],x[1]),3),rep(x[1],4),rep(x[2],4)) z1<-c(rep(0,4),rep(c(0,0,z,z),4)) y1<-c(y[1],y[1],y[2],y[2],rep(y[1],4),rep(y[2],4),rep(c(y[1],y[2],y[2],y[1]),2)) x2<-c(rep(c(x[1],x[1],x[2],x[2]),2),rep(c(x[1],x[2],rep(x[1],3),rep(x[2],3)),2)) z2<-c(rep(c(0,z),4),rep(0,8),rep(z,8) ) y2<-c(rep(y[1],4),rep(y[2],4),rep(c(rep(y[1],3),rep(y[2],3),y[1],y[2]),2) ) rgl.quads(x1,z1,y1,col=rep(sidecol,each=4),alpha=alpha) rgl.quads(c(x[1],x[2],x[2],x[1]),rep(z,4),c(y[1],y[1],y[2],y[2]), col=rep(topcol,each=4),alpha=1) rgl.lines(x2,z2,y2,col="#000000") } hist3d<-function(x,y=NULL,nclass="auto",alpha=1,col="#ff0000",scale=10) { save <- par3d(skipRedraw=TRUE) on.exit(par3d(save)) xy <- xy.coords(x,y) x <- xy$x y <- xy$y n<-length(x) if (nclass == "auto") { nclass<-ceiling(sqrt(nclass.Sturges(x))) } breaks.x <- seq(min(x),max(x),length=(nclass+1)) breaks.y <- seq(min(y),max(y),length=(nclass+1)) z<-matrix(0,(nclass),(nclass)) for (i in 1:nclass) { for (j in 1:nclass) { z[i, j] <- (1/n)*sum(x < breaks.x[i+1] & y < breaks.y[j+1] & x >= breaks.x[i] & y >= breaks.y[j]) binplot.3d(c(breaks.x[i],breaks.x[i+1]),c(breaks.y[j],breaks.y[j+1]), scale*z[i,j],alpha=alpha,topcol=col) } } } ################################################################################ rgl.open() rgl.bg(color="gray") rgl.light() # Drawing a 'bin' for given coordinates: binplot.3d(c(-0.5,0.5),c(4.5,5.5),2,alpha=0.6) # Setting the viewpoint ('theta' and 'phi' have the same meaning as in persp): rgl.viewpoint(theta=40,phi=40) # Choosing a lightgrey background: rgl.bg(col="#cccccc") ##### QUADS FORMING BIN: # Waiting for user-input to create next scenery: # readline() rgl.open() # Defining transparency and colors: alpha<-0.7; topcol<-"#ff0000"; sidecol<-"#aaaaaa" # Setting up coordinates for the quads and adding them to the scene: y<-x<-c(-1,1) ; z<-4; of<-0.3 x12<-c(x[1],x[2],x[2],x[1]); x11<-rep(x[1],4); x22<-rep(x[2],4) z00<-rep(0,4); z0z<-c(0,0,z,z); zzz<-rep(z,4); y11<-rep(y[1],4) y1122<-c(y[1],y[1],y[2],y[2]); y12<-c(y[1],y[2],y[2],y[1]); y22<-rep(y[2],4) rgl.quads(c(x12,x12,x11-of,x12,x22+of,x12), c(z00-of,rep(z0z,4),zzz+of), c(y1122,y11-of,y12,y22+of,y12,y1122), col=rep(c(rep(sidecol,5),topcol),each=4),alpha=c(rep(alpha,5),1)) # Setting up coordinates for the border-lines of the quads and drawing them: yl1<-c(y[1],y[2],y[1],y[2]); yl2<-c(y[1]-of,y[1]-of) xl<-c(rep(x[1],8),rep(x[1]-of,8),rep(c(x[1],x[2]),8),rep(x[2],8),rep(x[2]+of,8)) zl<-c(0,z,0,z,z+of,z+of,-of,-of,0,0,z,z,0,z,0,z,rep(0,4),rep(z,4),rep(-of,4), rep(z+of,4),z+of,z+of,-of,-of,rep(c(0,z),4),0,0,z,z) yl<-c(yl2,y[2]+of,y[2]+of,rep(c(y[1],y[2]),4),y[1],y[1],y[2],y[2],yl2, rep(y[2]+of,4),yl2,y[2],y[2],rep(y[1],4),y[2],y[2],yl1,yl2,y[2]+of, y[2]+of,y[1],y[1],y[2],y[2],yl1) rgl.lines(xl,zl,yl,col="#000000") ##### COMPLETE HISTOGRAM: # Waiting for user-input to create next scenery: # readline() rgl.open() # Choosing a lightgrey background: rgl.bg(col="#cccccc") # Setting the rng to a fixed value: set.seed(1000) # Drawing a 3d histogramm of 2500 normaly distributed observations: hist3d(rnorm(2500),rnorm(2500),alpha=0.4,nclass=7,scale=30) rgl/R/0000755000176000001440000000000012262021452011263 5ustar ripleyusersrgl/R/plot3d.R0000644000176000001440000000633312043607205012623 0ustar ripleyusersplot3d <- function(x, ...) UseMethod("plot3d") plot3d.default <- function(x, y = NULL, z = NULL, xlab = NULL, ylab = NULL, zlab = NULL, type = 'p', col = material3d("color")[1], size = material3d("size"), lwd = material3d("lwd"), radius = avgscale*size/60, add = FALSE, aspect = !add, ...) { if (!add) clear3d() skip <- par3d(skipRedraw=TRUE) on.exit(par3d(skip)) xlabel <- if (!missing(x)) deparse(substitute(x)) ylabel <- if (!missing(y)) deparse(substitute(y)) zlabel <- if (!missing(z)) deparse(substitute(z)) xyz <- xyz.coords(x,y,z, xlab=xlabel, ylab=ylabel, zlab=zlabel, recycle=TRUE) x <- xyz$x y <- xyz$y z <- xyz$z if (is.null(xlab)) xlab <- xyz$xlab if (is.null(ylab)) ylab <- xyz$ylab if (is.null(zlab)) zlab <- xyz$zlab if (type == "s" && missing(radius)) { avgscale <- sqrt(sum(c(diff(range(x,na.rm=TRUE)), diff(range(y,na.rm=TRUE)), diff(range(z,na.rm=TRUE)))^2/3)) } result <- c( data=switch(type, p = points3d(x, y, z, color=col, size=size, ...), s = spheres3d(x, y, z, radius=radius, color=col, ...), l = lines3d(x, y, z, color=col, lwd=lwd, ...), h = segments3d(rep(x,rep(2,length(x))), rep(y,rep(2,length(y))), rbind(rep(0,length(z)),z), color = rep(col, rep(2,length(col))), lwd=lwd, ...), # this is a hack to plot invisible segments n = if (!add) segments3d(rep(range(x, na.rm=TRUE), c(2,2)), rep(range(y, na.rm=TRUE), c(2,2)), rep(range(z, na.rm=TRUE), c(2,2)))) ) if (!add) result <- c(result, decorate3d(xlab=xlab, ylab=ylab, zlab=zlab, aspect = aspect, ...)) invisible(result) } plot3d.mesh3d <- function(x, xlab = "x", ylab = "y", zlab = "z", type = c("shade", "wire", "dots"), add = FALSE, ...) { if (!add) clear3d() skip <- par3d(skipRedraw=TRUE) on.exit(par3d(skip)) if (missing(xlab) && !is.null(x$xlab)) xlab <- x$xlab if (missing(ylab) && !is.null(x$ylab)) ylab <- x$ylab if (missing(zlab) && !is.null(x$zlab)) zlab <- x$zlab result <- switch(match.arg(type), shade = shade3d(x, ...), wire = wire3d(x, ...), dots = dot3d(x, ...)) if (!add) result <- c(result, decorate3d(xlab = xlab, ylab = ylab, zlab = zlab, ...)) invisible(result) } decorate3d <- function(xlim = ranges$xlim, ylim = ranges$ylim, zlim = ranges$zlim, xlab = "x", ylab = "y", zlab = "z", box = TRUE, axes = TRUE, main = NULL, sub = NULL, top = TRUE, aspect = FALSE, expand = 1.03, ...) { if (is.logical(aspect)) { autoscale <- aspect aspect <- c(1,1,1) } else autoscale <- TRUE result <- numeric(0) ranges <- .getRanges() if (!missing(xlim) | !missing(ylim) | !missing(zlim)) { ind <- c(1,1,2,2) result <- c(result, strut=segments3d(xlim[ind], ylim[ind], zlim[ind])) } if (autoscale) aspect3d(aspect) if (axes) result <- c(result, axes=axes3d(box=box, expand=expand)) result <- c(result, title3d(xlab = xlab, ylab = ylab, zlab = zlab, main = main, sub = sub)) if (top) rgl.bringtotop() invisible(result) } rgl/R/rgl.bringtotop.R0000644000176000001440000000041512171477105014371 0ustar ripleyusers ## ## bring device to top ## ## rgl.bringtotop <- function(stay = FALSE) { if ((.Platform$OS.type != "windows") && stay) warning("stay not implemented") ret <- .C( rgl_dev_bringtotop, success=FALSE, as.logical(stay) ) if (! ret$success) stop("failed") } rgl/R/obj.R0000644000176000001440000002345512167430177012205 0ustar ripleyuserswriteOBJ <- function(con, pointRadius=0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, pointsAsPoints = FALSE, linesAsLines = FALSE, withNormals = TRUE, withTextures = TRUE, separateObjects = TRUE, ids = NULL) { writeHeader <- function() { ident <- paste(filename, " produced by RGL") cat("#", ident, "\n", file=con) } Vertices <- 0 Normals <- 0 Texcoords <- 0 writeData <- function(id) { vbase <- Vertices tbase <- Texcoords nbase <- Normals vertices <- rgl.attrib(id, "vertices") cat(paste("v", vertices[,1], vertices[,2], vertices[,3]), sep="\n", file=con) n <- nrow(vertices) Vertices <<- Vertices + n if (withTextures) { textures <- rgl.attrib(id, "texcoords") if (nrow(textures)) cat(paste("vt", textures[,1], textures[,2]), sep="\n", file=con) Texcoords <<- Texcoords + nrow(textures) } if (withNormals) { normals <- rgl.attrib(id, "normals") if (nrow(normals)) cat(paste("vn", normals[,1], normals[,2], normals[,3]), sep="\n", file=con) Normals <<- Normals + nrow(normals) } list(n=n, ntexcoords=if (withTextures) nrow(textures) else 0, nnormals=if (withNormals) nrow(normals) else 0, vbase=vbase, tbase=tbase, nbase=nbase) } refnum <- function(n) sprintf("%d", n) writeTriangles <- function(id) { if (separateObjects) cat("o triangles", id, "\n", sep="", file=con) x <- writeData(id) indices <- refnum(x$vbase + seq_len(x$n)) if (x$ntexcoords) indices <- paste0(indices, "/", refnum(x$tbase + seq_len(x$n))) if (x$nnormals) indices <- paste0(indices, if (!x$ntexcoords) "/", "/", refnum(x$nbase + seq_len(x$n))) indices <- matrix(indices, ncol=3, byrow=TRUE) cat(paste("f", indices[,1], indices[,2], indices[,3]), sep="\n", file=con) } writeQuads <- function(id) { if (separateObjects) cat("o quads", id, "\n", sep="", file=con) x <- writeData(id) indices <- refnum(x$vbase + seq_len(x$n)) if (x$ntexcoords) indices <- paste0(indices, "/", refnum(x$tbase + seq_len(x$n))) if (x$nnormals) indices <- paste0(indices, if (!x$ntexcoords) "/", "/", refnum(x$nbase + seq_len(x$n))) indices <- matrix(indices, ncol=4, byrow=TRUE) cat(paste("f", indices[,1], indices[,2], indices[,3], indices[,4]), sep="\n", file=con) } writeSurface <- function(id) { if (separateObjects) cat("o surface", id, "\n", sep="", file=con) x <- writeData(id) dims <- rgl.attrib(id, "dim") nx <- dims[1] nz <- dims[2] rows <- seq_len(nx) vertices <- matrix(character(0), ncol=3) for (i in seq_len(nz)[-nz]) { indices <- (i-1)*nx + c(rows[-nx],rows[-nx], rows[-1]+nx,rows[-nx]+nx, rows[-1],rows[-1]+nx) cindices <- refnum(x$vbase + indices) if (x$ntexcoords) cindices <- paste0(cindices, "/", refnum(x$tbase + indices)) if (x$nnormals) cindices <- paste0(cindices, if (!x$ntexcoords) "/", "/", refnum(x$nbase + indices)) vertices <- rbind(vertices, matrix(cindices, ncol=3)) } cat(paste("f", vertices[,1], vertices[,2], vertices[,3]), sep="\n", file=con) } writeMesh <- function(mesh, scale=1, offset=c(0,0,0)) { vertices <- asEuclidean(t(mesh$vb))*scale n <- nrow(vertices) vertices <- vertices + rep(offset, each=n) vbase <- Vertices cat(paste("v", vertices[,1], vertices[,2], vertices[,3]), sep="\n", file=con) Vertices <<- Vertices + n if (withTextures && length(textures <- mesh$texcoords)) { tbase <- Texcoords textures <- asEuclidean(t(textures)) cat(paste("vt", textures[,1], textures[,2]), sep="\n", file=con) Texcoords <<- Texcoords + nrow(textures) } else withTextures <- FALSE if (withNormals && length(normals <- mesh$normals)) { nbase <- Normals normals <- asEuclidean(t(normals)) cat(paste("vn", normals[,1], normals[,2], normals[,3]), sep="\n", file=con) Normals <<- Normals + nrow(normals) } else withNormals <- FALSE nt <- length(mesh$it)/3 nq <- length(mesh$ib)/4 if (nt) { indices <- t(mesh$it) cindices <- refnum(vbase + indices) if (withTextures) cindices <- paste0(cindices, "/", refnum(tbase + indices)) if (withNormals) cindices <- paste0(cindices, if (!withTextures) "/", "/", refnum(nbase + indices)) cindices <- matrix(cindices, ncol=3) cat(paste("f", cindices[,1], cindices[,2], cindices[,3]), sep="\n", file=con) } if (nq) { indices <- t(mesh$ib) cindices <- refnum(vbase + indices) if (withTextures) cindices <- paste0(cindices, "/", refnum(tbase + indices)) if (withNormals) cindices <- paste0(cindices, if (!withTextures) "/", "/", refnum(nbase + indices)) cindices <- matrix(cindices, ncol=4) cat(paste("f", cindices[,1], cindices[,2], cindices[,3], cindices[,4]), sep="\n", file=con) } } writeSpheres <- function(id) { if (separateObjects) cat("o sphere", id, "\n", sep="", file=con) vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) radii <- rgl.attrib(id, "radii") radii <- rep(radii, length.out=n) x <- subdivision3d(icosahedron3d(),3) r <- sqrt(x$vb[1,]^2 + x$vb[2,]^2 + x$vb[3,]^2) x$vb[4,] <- r x$normals <- x$vb for (i in seq_len(n)) writeMesh(x, radii[i], vertices[i,]) } avgScale <- function() { bbox <- par3d("bbox") ranges <- c(bbox[2]-bbox[1], bbox[4]-bbox[3], bbox[6]-bbox[5]) if (prod(ranges) == 0) 1 else exp(mean(log(ranges))) } writePoints <- function(id) { if (separateObjects) cat("o points", id, "\n", sep="", file=con) if (pointsAsPoints) { x <- writeData(id) cat("p", refnum(x$vbase + seq_len(x$n)), "\n", file=con) } else { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) radius <- pointRadius*avgScale() if (withNormals && is.null(pointShape$normals)) pointShape <- addNormals(pointShape) for (i in seq_len(n)) writeMesh(pointShape, radius, vertices[i,]) } } writeSegments <- function(id) { if (separateObjects) cat("o segments", id, "\n", sep="", file=con) if (linesAsLines) { x <- writeData(id) indices <- matrix(refnum(x$vbase + seq_len(x$n)), ncol=2, byrow=TRUE) cat(paste("l", indices[,1], indices[,2]), sep="\n", file=con) } else { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) n <- n/2 radius <- lineRadius*avgScale() for (i in seq_len(n)) { cyl <- cylinder3d( vertices[(2*i-1):(2*i),1:3], radius = radius, sides = lineSides, closed = -2 ) if (withNormals) cyl <- addNormals(cyl) writeMesh(cyl) } } } writeLines <- function(id) { if (separateObjects) cat("o lines", id, "\n", sep="", file=con) if (linesAsLines) { x <- writeData(id) indices <- refnum(x$vbase + seq_len(x$n)) cat("l", indices, "\n", file=con) } else { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) - 1 radius <- lineRadius*avgScale() for (i in seq_len(n)) { cyl <- cylinder3d( vertices[i:(i+1),], radius = radius, sides = lineSides, closed = -2 ) if (withNormals) cyl <- addNormals(cyl) writeMesh(cyl) } } } knowntypes <- c("triangles", "quads", #, "surface", "spheres", "points", "linestrip", "lines", "planes") # Execution starts here! if (is.character(con)) { con <- file(con, "w") on.exit(close(con)) } filename <- summary(con)$description if (NROW(bbox <- rgl.ids("bboxdeco")) && (is.null(ids) || bbox$id %in% ids)) { ids <- setdiff(ids, bbox$id) save <- par3d(skipRedraw = TRUE) bbox <- convertBBox(bbox$id) on.exit({ rgl.pop(id=bbox); par3d(save) }, add=TRUE) dobbox <- TRUE } else dobbox <- FALSE if (is.null(ids)) { ids <- rgl.ids() types <- as.character(ids$type) ids <- ids$id } else { if (dobbox) ids <- c(ids, bbox) allids <- rgl.ids() ind <- match(ids, allids$id) keep <- !is.na(ind) if (any(!keep)) warning("object(s) with id ", paste(ids[!keep], collapse=" "), " not found") ids <- ids[keep] types <- allids$type[ind[keep]] } unknowntypes <- setdiff(types, knowntypes) if (length(unknowntypes)) warning("Object type(s) ", paste("'", unknowntypes, "'", sep="", collapse=", "), " not handled.") keep <- types %in% knowntypes ids <- ids[keep] types <- types[keep] writeHeader() for (i in seq_along(ids)) switch(types[i], planes =, triangles = writeTriangles(ids[i]), quads = writeQuads(ids[i]), surface = writeSurface(ids[i]), spheres = writeSpheres(ids[i]), points = writePoints(ids[i]), lines = writeSegments(ids[i]), linestrip = writeLines(ids[i]) ) invisible(filename) } rgl/R/cylinder3d.R0000644000176000001440000001346412136474243013470 0ustar ripleyusersGramSchmidt <- function(v1, v2, v3, order=1:3) { A <- rbind(v1, v2, v3) A <- A[order,] v1 <- A[1,] v2 <- A[2,] v3 <- A[3,] if (isTRUE(all.equal(as.numeric(v1), c(0,0,0)))) v1 <- xprod(v2, v3) v1 <- normalize(v1) v2 <- v2 - sum(v2*v1)*v1 if (isTRUE(all.equal(as.numeric(v2), c(0,0,0)))) v2 <- xprod(v3, v1) v2 <- normalize(v2) v3 <- v3 - sum(v3*v1)*v1 - sum(v3*v2)*v2 if (isTRUE(all.equal(as.numeric(v3), c(0,0,0)))) v3 <- xprod(v1, v2) v3 <- normalize(v3) rbind(v1, v2, v3)[order(order),] } cylinder3d <- function(center, radius=1, twist=0, e1=NULL, e2=NULL, e3=NULL, sides=8, section=NULL, closed=0, debug=FALSE, keepVars=FALSE) { center <- as.matrix(as.data.frame(xyz.coords(center)[c("x", "y", "z")])) n <- nrow(center) if (closed > 0) { ind0 <- c(n-1-closed, n-closed, 1:n) ind1 <- c(n-closed, 1:n, 1+closed) ind2 <- c(1:n, 1+closed, 2+closed) } else { ind0 <- c(1, 1, 1:n) ind1 <- c(1, 1:n, n) ind2 <- c(1:n, n, n) } missings <- c(e1=is.null(e1), e2=is.null(e2), e3=is.null(e3)) fixup <- function(coord) { usable <- apply(coord, 1, function(v) all(is.finite(v)) & (veclen(v) > 0)) if (!any(usable) ) stop("No usable coordinate values in", deparse(substitute(coord))) firstgood <- min(which(usable)) inds <- 1:n if (firstgood > 1) { coord[inds[inds < firstgood],] <- coord[rep(firstgood,firstgood-1),] usable[1:firstgood] <- TRUE } for (i in 2:n) inds[i] <- ifelse(usable[i], inds[i], inds[i-1]) coord[inds,] } if (!is.null(e1)) { e1 <- as.matrix(as.data.frame(xyz.coords(e1)[c("x", "y", "z")])) e1 <- e1[rep(1:nrow(e1), len=n),] } else e1 <- (center[ind2,] - center[ind0,])[1:n,] # Fix up degenerate cases by repeating existing ones, or using arbitrary ones zeros <- rowSums(e1^2) == 0 if (all(zeros)) { e1[,1] <- 1 zeros <- FALSE } else if (any(zeros)) { e1[1,] <- e1[which(!zeros)[1],] zeros[1] <- FALSE if (any(zeros)) { zeros <- which(zeros) for (i in zeros) e1[i,] <- e1[i-1,] } } if (!is.null(e2)) { e2 <- as.matrix(as.data.frame(xyz.coords(e2)[c("x", "y", "z")])) e2 <- e2[rep(1:nrow(e2), len=n),] } else e2 <- (e1[ind2,] - e1[ind0,])[1:n,] # Fix up degenerate e2's similarly, then force different than e1 zeros <- rowSums(e2^2) == 0 if (all(zeros)) { e2[,2] <- 1 zeros <- FALSE } else if (any(zeros)) { e2[1,] <- e2[which(!zeros)[1],] zeros[1] <- FALSE if (any(zeros)) { zeros <- which(zeros) for (i in zeros) e2[i,] <- e2[i-1,] } } parallel <- sapply(1:n, function(i) all(xprod(e1[i,], e2[i,]) == 0)) if (any(parallel)) { # rotate in the xy plane e2[parallel,] <- cbind(-e2[parallel,2], e2[parallel,1], e2[parallel,3]) parallel <- sapply(1:n, function(i) all(xprod(e1[i,], e2[i,]) == 0)) if (any(parallel)) { # if any are still parallel, they must be the z axis e2[parallel,1] <- 1 e2[parallel,3] <- 0 } } if (!is.null(e3)) { e3 <- as.matrix(as.data.frame(xyz.coords(e3)[c("x", "y", "z")])) e3 <- e3[rep(1:nrow(e3), len=n),] } else { e3 <- matrix(NA_real_, n, 3) for (i in 1:n) e3[i,] <- xprod(e1[i,], e2[i,]) } for (i in 1:n) { A <- GramSchmidt(e1[i,], e2[i,], e3[i,], order=order(missings)) e1[i,] <- A[1,] e2[i,] <- A[2,] e3[i,] <- A[3,] } e1 <- fixup(e1) e2 <- fixup(e2) e3 <- fixup(e3) radius <- rep(radius, len=n) twist <- rep(twist, len=n) if (debug) { for (i in 1:n) { segments3d(rbind(center[i,],center[i,]+e3[i,]*radius[i]*1.5, center[i,],center[i,]+e2[i,]*radius[i]*1.5, center[i,],center[i,]+e1[i,]*radius[i]*1.5), col=rep(c("red", "green", "blue"), each=2)) text3d(center, texts=1:n) } } if (closed > 0) n <- n-closed+1 if (is.null(section)) { theta <- seq(0, 2*pi, len=sides+1)[-1] section <- cbind(cos(theta), sin(theta), 0) } else sides <- nrow(section) vertices <- matrix(0, 3, sides*n) indices <- matrix(0, 4, sides*(n-1)) if (ncol(section) == 2) section <- cbind(section, 0) for (i in 1:(n-1)) { transform <- rbind(e3[i,], e2[i,], e1[i,]) p <- rotate3d(section, twist[i], 0,0,1) p <- radius[i] * p %*% transform p[,1] <- p[,1] + center[i,"x"] p[,2] <- p[,2] + center[i,"y"] p[,3] <- p[,3] + center[i,"z"] vertices[,(i-1)*sides+1:sides] <- t(p) for (j in 1:sides) indices[, (i-1)*sides + j] <- (c(0,0,1,1) + j) %% sides + 1 + c((i-1)*sides, i*sides, i*sides, (i-1)*sides) } transform <- rbind(e3[n,], e2[n,], e1[n,]) p <- rotate3d(section, twist[n], 0,0,1) p <- radius[n] * p %*% transform p[,1] <- p[,1] + center[n,"x"] p[,2] <- p[,2] + center[n,"y"] p[,3] <- p[,3] + center[n,"z"] vertices[,(n-1)*sides+1:sides] <- t(p) # Add end cap at start if (closed < 0) { vertices <- cbind(vertices, center[1,]) triangles <- rbind(ncol(vertices), 1:sides, c(2:sides, 1)) } # Add end cap at end if (closed < -1) { vertices <- cbind(vertices, center[n,]) triangles <- cbind(triangles, rbind(ncol(vertices), c(2:sides, 1) + (n-1)*sides, 1:sides + (n-1)*sides)) } result <- qmesh3d(vertices, indices, homogeneous=FALSE) if (closed > 0) { # Look for repeated vertices, and edit the links nv <- ncol(result$vb) for (i in 1:sides) { dupe <- which(apply(result$vb[,(nv-sides+1):nv,drop=FALSE], 2, function(x) isTRUE(all.equal(x, result$vb[,i]))))+nv-sides for (j in dupe) { f <- result$ib == j result$ib[f] <- i } } } else if (closed < 0) result$it <- triangles if (keepVars) attr(result, "vars") <- environment() result } rgl/R/plugin.R0000644000176000001440000000027611064454445012724 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: plugin.R 376 2005-08-03 23:58:47Z dadler $ ## ## ## quit R plugin ## ## rgl.quit <- function() { unloadNamespace("rgl") } rgl/R/ellipse3d.R0000644000176000001440000000451112137551077013307 0ustar ripleyusersellipse3d <- function (x, ...) UseMethod("ellipse3d") ellipse3d.default <- function (x, scale = c(1, 1, 1), centre = c(0, 0, 0), level = 0.95, t = sqrt(qchisq(level, 3)), which = 1:3, subdivide = 3, smooth = TRUE, ...) { stopifnot(is.matrix(x)) cov <- x[which, which] chol <- chol(cov) sphere <- subdivision3d(cube3d(...), subdivide) norm <- sqrt( sphere$vb[1,]^2 + sphere$vb[2,]^2 + sphere$vb[3,]^2 ) for (i in 1:3) sphere$vb[i,] <- sphere$vb[i,]/norm sphere$vb[4,] <- 1 if (smooth) sphere$normals <- sphere$vb result <-scale3d(transform3d( sphere, chol), t,t,t) if (!missing(scale)) result <- scale3d(result, scale[1], scale[2], scale[3]) if (!missing(centre)) result <- translate3d(result, centre[1], centre[2], centre[3]) return(result) } ellipse3d.lm <- function (x, which = 1:3, level = 0.95, t = sqrt(3 * qf(level, 3, x$df.residual)), ...) { s <- summary(x) names <- names(x$coefficients[which]) structure(c(ellipse3d.default(s$sigma^2 * s$cov.unscaled[which, which], centre = x$coefficients[which], t = t, ...), xlab=names[1], ylab=names[2], zlab=names[3]), class="mesh3d") } ellipse3d.glm <- function (x, which = 1:3, level = 0.95, t, dispersion, ...) { s <- summary(x) est.disp <- missing(dispersion) & !(x$family$family %in% c('poisson','binomial')) if (missing(dispersion)) dispersion <- s$dispersion if (missing(t)) t <- ifelse(est.disp,sqrt(3 * qf(level, 3, s$df[2])), sqrt(qchisq(level, 3))) names <- names(x$coefficients[which]) structure(c(ellipse3d.default(dispersion * s$cov.unscaled[which, which], centre = x$coefficients[which], t = t, ...), xlab=names[1], ylab=names[2], zlab=names[3]), class="mesh3d") } ellipse3d.nls <- function (x, which = 1:3, level = 0.95, t = sqrt(3 * qf(level, 3, s$df[2])), ...) { s <- summary(x) names <- names(x$m$getPars()[which]) structure(c(ellipse3d.default(s$sigma^2 * s$cov.unscaled[which, which], centre = x$m$getPars()[which], t = t, ...), xlab=names[1], ylab=names[2], zlab=names[3]), class="mesh3d") } rgl/R/matrices.R0000644000176000001440000000511011064454445013225 0ustar ripleyusers# Functions for creating 4x4 graphics matrices identityMatrix <- function() diag(nrow=4) scaleMatrix <- function(x,y,z) diag(c(x,y,z,1)) translationMatrix <- function(x,y,z) { result <- diag(4) result[4,1:3] <- c(x,y,z) result } rotationMatrix <- function(angle,x,y,z,matrix) { if (missing(matrix)) { if (angle == 0) return(identityMatrix()) u <- c(x,y,z)/sqrt(x^2+y^2+z^2) cosa <- cos(angle) sina <- sin(angle) matrix <- (1-cosa)*outer(u,u) matrix <- matrix + diag(3)*cosa matrix[1,2] <- matrix[1,2] - sina*u[3] matrix[1,3] <- matrix[1,3] + sina*u[2] matrix[2,1] <- matrix[2,1] + sina*u[3] matrix[2,3] <- matrix[2,3] - sina*u[1] matrix[3,1] <- matrix[3,1] - sina*u[2] matrix[3,2] <- matrix[3,2] + sina*u[1] } if (identical(all.equal(dim(matrix), c(3,3)), TRUE)) matrix <- cbind(rbind(matrix,c(0,0,0)),c(0,0,0,1)) return(matrix) } # Coordinate conversions asHomogeneous <- function(x) { if (is.matrix(x) && dim(x)[2] == 3) return(cbind(x,1)) else if (length(x) == 3) return(c(x,1)) else stop("Object is not row vector(s)") } asEuclidean <- function(x) { if (is.matrix(x) && dim(x)[2] == 4) return(x[,1:3]/x[,4]) else if (length(x) == 4) return(c(x[1]/x[4],x[2]/x[4],x[3]/x[4])) else stop("Object is not row vectors(s)") } # Default implementations of transformations translate3d.default <- function(obj,x,y,z,...) { if (is.matrix(obj)) n <- dim(obj)[1] else n <- 1 if (length(obj) == 3 || (is.matrix(obj) && dim(obj)[2] == 3)) return(obj + cbind(rep(x,n), rep(y,n), rep(z,n))) else if (length(obj) == 4 || (is.matrix(obj) && dim(obj)[2] == 4)) return(obj %*% translationMatrix(x,y,z)) else stop("Unsupported object for translation") } scale3d.default <- function(obj,x,y,z,...){ if (is.matrix(obj)) n <- dim(obj)[1] else n <- 1 if (length(obj) == 3 || (is.matrix(obj) && dim(obj)[2] == 3)) return(obj * cbind(rep(x,n), rep(y,n), rep(z,n))) else if (length(obj) == 4 || (is.matrix(obj) && dim(obj)[2] == 4)) return(obj %*% scaleMatrix(x,y,z)) else stop("Unsupported object for scaling") } rotate3d.default <- function(obj,angle,x,y,z,matrix,...) { if (length(obj) == 3 || (is.matrix(obj) && dim(obj)[2] == 3)) return(asEuclidean(asHomogeneous(obj) %*% rotationMatrix(angle,x,y,z,matrix))) else if (length(obj) == 4 || (is.matrix(obj) && dim(obj)[2] == 4)) return(obj %*% rotationMatrix(angle,x,y,z,matrix)) else stop("Unsupported object for scaling") } rgl/R/turn3d.R0000644000176000001440000000337412167024724012645 0ustar ripleyusers turn3d <- function(x, y = NULL, n = 12, smooth = FALSE, ...) { xy <- xy.coords(x, y) x <- xy$x y <- zapsmall(xy$y) stopifnot(all(y >= 0)) len <- length(x) if (smooth) { nx <- -diff(y) nx <- c(nx, 0) + c(0, nx) ny <- diff(x) ny <- c(ny, 0) + c(0, ny) nlen <- sqrt(nx^2 + ny^2) nlen[nlen == 0] <- 1 nx <- nx/nlen ny <- ny/nlen normals <- matrix(nrow=4, ncol=0) } zero <- y == 0 vb <- matrix(nrow=4, ncol=0) ib <- matrix(nrow=4, ncol=0) it <- matrix(nrow=3, ncol=0) theta <- seq(0, 2*pi, len = n + 1)[-(n + 1)] for (i in 1:len) { vb <- cbind(vb, rbind(x[i], sin(theta)*y[i], cos(theta)*y[i], 1)) if (smooth) normals <- cbind(normals, rbind(nx[i], sin(theta)*ny[i], cos(theta)*ny[i], 1)) if (i > 1) { if (zero[i] && zero[i-1]) { # do nothing } else if (!zero[i] && zero[i-1]) { # draw triangles prev <- ncol(vb) - n - 0:(n-1) curr <- ncol(vb) - 0:(n-1) curr2 <- curr + 1 curr2[1] <- curr2[1] - n it <- cbind(it, rbind(prev, curr, curr2)) } else if (zero[i] && !zero[i-1]) { # other triangles prev <- ncol(vb) - n - 0:(n-1) curr <- ncol(vb) - 0:(n-1) prev2 <- prev + 1 prev2[1] <- prev2[1] - n it <- cbind(it, rbind(prev, curr, prev2)) } else { # quads prev <- ncol(vb) - n - 0:(n-1) prev2 <- prev + 1 prev2[1] <- prev2[1] - n curr <- ncol(vb) - 0:(n-1) curr2 <- curr + 1 curr2[1] <- curr2[1] - n ib <- cbind(ib, rbind(prev, curr, curr2, prev2)) } } } result <- tmesh3d(vb, it, normals=if(smooth) t(normals), ...) if (length(ib)) result$ib <- ib result } rgl/R/scene.R0000644000176000001440000004635012262005640012514 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: scene.R 987 2013-10-26 14:07:14Z murdoch $ ## ## ## ===[ SECTION: scene management ]=========================================== ## ## ## clear scene ## ## rgl.clear <- function( type = "shapes" ) { type <- rgl.enum.nodetype(type) viewpoint <- 4 %in% type material <- 5 %in% type type <- type[!(type %in% 4:6)] idata <- as.integer(c(length(type), type)) ret <- .C( rgl_clear, success = FALSE, idata ) if ( viewpoint ) rgl.viewpoint() if ( material ) rgl.material() if (! ret$success) stop("rgl_clear") } ## ## pop node ## ## rgl.pop <- function( type = "shapes", id = 0) { type <- rgl.enum.nodetype(type) save <- par3d(skipRedraw = TRUE) on.exit(par3d(save)) for (i in id) { idata <- as.integer(c(type, i)) ret <- .C( rgl_pop, success = FALSE, idata ) if (! ret$success) stop("pop failed for id ", i) } } rgl.ids <- function( type = "shapes" ) { type <- c(rgl.enum.nodetype(type), 0) count <- .C( rgl_id_count, as.integer(type), count = integer(1))$count as.data.frame( .C( rgl_ids, as.integer(type), id=integer(count), type=rep("",count) )[2:3] ) } rgl.attrib.count <- function( id, attrib ) { stopifnot(length(attrib) == 1) if (is.character(attrib)) attrib <- rgl.enum.attribtype(attrib) result <- integer(length(id)) for (i in seq_along(id)) result[i] <- .C( rgl_attrib_count, as.integer(id[i]), as.integer(attrib), count = integer(1))$count names(result) <- names(id) result } rgl.attrib <- function( id, attrib, first=1, last=rgl.attrib.count(id, attrib) ) { stopifnot(length(attrib) == 1 && length(id) == 1 && length(first) == 1) if (is.character(attrib)) attrib <- rgl.enum.attribtype(attrib) ncol <- c(vertices=3, normals=3, colors=4, texcoords=2, dim=2, texts=1, cex=1, adj=2, radii=1, centers=3, ids=1, usermatrix=4, types=1, flags=1)[attrib] count <- max(last - first + 1, 0) if (attrib %in% c(6, 13)) { # texts and types if (count) result <- .C (rgl_text_attrib, as.integer(id), as.integer(attrib), as.integer(first-1), as.integer(count), result = character(count*ncol))$result else result <- character(0) } else { if (count) result <- .C (rgl_attrib, as.integer(id), as.integer(attrib), as.integer(first-1), as.integer(count), result = numeric(count*ncol))$result else result <- numeric(0) } if (attrib == 14) result <- as.logical(result) result <- matrix(result, ncol=ncol, byrow=TRUE) colnames(result) <- list(c("x", "y", "z"), # vertices c("x", "y", "z"), # normals c("r", "g", "b", "a"), # colors c("s", "t"), # texcoords c("r", "c"), # dim c("text"), # texts c("cex"), # cex c("x", "y"), # adj "r", # radii c("x", "y", "z"), # centers "id", # ids c("x", "y", "z", "w"), # usermatrix "type", # types "flag" # flags )[[attrib]] if (attrib == 14) if (id %in% rgl.ids("lights")$id) rownames(result) <- c("viewpoint", "finite")[first:last] else if (id %in% rgl.ids("background")$id) rownames(result) <- c("sphere", "linear_fog", "exp_fog", "exp2_fog")[first:last] else if (id %in% rgl.ids("bboxdeco")$id) rownames(result) <- "draw_front"[first:last] result } ## ## ===[ SECTION: environment ]================================================ ## ## ## set viewpoint ## ## rgl.viewpoint <- function( theta = 0.0, phi = 15.0, fov = 60.0, zoom = 1.0, scale = par3d("scale"), interactive = TRUE, userMatrix ) { zoom <- rgl.clamp(zoom,0,Inf) phi <- rgl.clamp(phi,-90,90) fov <- rgl.clamp(fov,0,179) polar <- missing(userMatrix) if (polar) userMatrix <- diag(4) idata <- as.integer(c(interactive,polar)) ddata <- as.numeric(c(theta,phi,fov,zoom,scale,userMatrix[1:16])) ret <- .C( rgl_viewpoint, success = FALSE, idata, ddata ) if (! ret$success) stop("rgl_viewpoint") } ## ## set background ## ## rgl.bg <- function(sphere=FALSE, fogtype="none", color=c("black","white"), back="lines", ... ) { rgl.material( color=color, back=back, ... ) fogtype <- rgl.enum.fogtype(fogtype) idata <- as.integer(c(sphere,fogtype)) ret <- .C( rgl_bg, success = FALSE, idata ) if (! ret$success) stop("rgl_bg") } ## ## bbox ## ## rgl.bbox <- function( xat=NULL, xlab=NULL, xunit=0, xlen=5, yat=NULL, ylab=NULL, yunit=0, ylen=5, zat=NULL, zlab=NULL, zunit=0, zlen=5, marklen=15.0, marklen.rel=TRUE, expand=1, draw_front=FALSE, ...) { rgl.material( ... ) if (is.null(xat)) { xticks = 0; xlab = NULL; } else if (is.null(xlab)) { xlab = format(xat) } else xlab=rep(xlab,length.out=length(xat)) if (is.null(yat)) { yticks = 0; ylab = NULL; } else if (is.null(ylab)) { ylab = format(yat) } else ylab=rep(ylab,length.out=length(yat)) if (is.null(zat)) { zticks = 0; zlab = NULL; } else if (is.null(zlab)) { zlab = format(zat) } else zlab=rep(zlab,length.out=length(zat)) xticks <- length(xat) yticks <- length(yat) zticks <- length(zat) if (identical(xunit, "pretty")) xunit = -1; if (identical(yunit, "pretty")) yunit = -1; if (identical(zunit, "pretty")) zunit = -1; length(xticks) <- 1 length(yticks) <- 1 length(zticks) <- 1 length(xlen) <- 1 length(ylen) <- 1 length(zlen) <- 1 length(marklen.rel) <- 1 length(draw_front) <- 1 length(xunit) <- 1 length(yunit) <- 1 length(zunit) <- 1 length(marklen) <- 1 length(expand) <- 1 idata <- as.integer(c(xticks,yticks,zticks, xlen, ylen, zlen, marklen.rel, draw_front)) ddata <- as.numeric(c(xunit, yunit, zunit, marklen, expand)) ret <- .C( rgl_bbox, success = FALSE, idata, ddata, as.numeric(xat), as.character(xlab), as.numeric(yat), as.character(ylab), as.numeric(zat), as.character(zlab) ) if (! ret$success) stop("rgl_bbox") invisible(1) } ## ## set lights ## ## rgl.light <- function( theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", diffuse = "#FFFFFF", specular = "#FFFFFF", x = NULL, y = NULL, z = NULL) { ambient <- rgl.color(ambient) diffuse <- rgl.color(diffuse) specular <- rgl.color(specular) # if a complete set of x, y, z is given, the light source is assumed to be part of the scene, theta and phi are ignored # else the light source is infinitely far away and its direction is determined by theta, phi (default) if ( !is.null(x) ) { if ( !missing(theta) || !missing(phi) ) warning("theta and phi ignored when x is present") xyz <- xyz.coords(x,y,z) x <- xyz$x y <- xyz$y z <- xyz$z if (length(x) > 1) stop("a light can only be in one place at a time") finite.pos <- TRUE } else { if ( !is.null(y) || !is.null(z) ) warning("y and z ignored, spherical coordinates used") finite.pos <- FALSE x <- 0 y <- 0 z <- 0 } idata <- as.integer(c(viewpoint.rel, ambient, diffuse, specular, finite.pos)) ddata <- as.numeric(c(theta, phi, x, y, z)) ret <- .C( rgl_light, success = as.integer(FALSE), idata, ddata ) if (! ret$success) stop("too many lights. maximum is 8 sources per scene.") invisible(ret$success) } ## ## ===[ SECTION: shapes ]===================================================== ## ## ## add primitive ## ## rgl.primitive <- function( type, x, y=NULL, z=NULL, normals=NULL, texcoords=NULL, ... ) { rgl.material( ... ) type <- rgl.enum.primtype(type) xyz <- xyz.coords(x,y,z,recycle=TRUE) x <- xyz$x y <- xyz$y z <- xyz$z vertex <- rgl.vertex(x,y,z) nvertex <- rgl.nvertex(vertex) if (nvertex > 0) { perelement <- c(points=1, lines=2, triangles=3, quadrangles=4, linestrips=1)[type] if (nvertex %% perelement) stop("illegal number of vertices") idata <- as.integer( c(type, nvertex, !is.null(normals), !is.null(texcoords) ) ) if (is.null(normals)) normals <- 0 else { normals <- xyz.coords(normals, recycle=TRUE) x <- rep(normals$x, len=nvertex) y <- rep(normals$y, len=nvertex) z <- rep(normals$z, len=nvertex) normals <- rgl.vertex(x,y,z) } if (is.null(texcoords)) texcoords <- 0 else { texcoords <- xy.coords(texcoords, recycle=TRUE) s <- rep(texcoords$x, len=nvertex) t <- rep(texcoords$y, len=nvertex) texcoords <- rgl.texcoords(s,t) } ret <- .C( rgl_primitive, success = as.integer(FALSE), idata, as.numeric(vertex), as.numeric(normals), as.numeric(texcoords), NAOK = TRUE ); if (! ret$success) stop("rgl_primitive") invisible(ret$success) } } rgl.points <- function ( x, y=NULL, z=NULL, ... ) { rgl.primitive( "points", x, y, z, ... ) } rgl.lines <- function (x, y=NULL, z=NULL, ... ) { rgl.primitive( "lines", x, y, z, ... ) } rgl.triangles <- function (x, y=NULL, z=NULL, normals=NULL, texcoords=NULL, ... ) { rgl.primitive( "triangles", x, y, z, normals, texcoords, ... ) } rgl.quads <- function ( x, y=NULL, z=NULL, normals=NULL, texcoords=NULL, ... ) { rgl.primitive( "quadrangles", x, y, z, normals, texcoords, ... ) } rgl.linestrips<- function ( x, y=NULL, z=NULL, ... ) { rgl.primitive( "linestrips", x, y, z, ... ) } ## ## add surface ## ## # Utility function: # calculates the parity of a permutation of integers perm_parity <- function(p) { x <- seq_along(p) result <- 0 for (i in x) { if (x[i] != p[i]) { x[x==p[i]] <- x[i] result <- result+1 } } return(result %% 2) } rgl.surface <- function( x, z, y, coords=1:3, ..., normal_x=NULL, normal_y=NULL, normal_z=NULL, texture_s=NULL, texture_t=NULL) { rgl.material(...) flags <- rep(FALSE, 4) if (is.matrix(x)) { nx <- nrow(x) flags[1] <- TRUE if ( !identical( dim(x), dim(y) ) ) stop( "bad dimension for rows") } else nx <- length(x) if (is.matrix(z)) { nz <- ncol(z) flags[2] <- TRUE if ( !identical( dim(z), dim(y) ) ) stop( "bad dimension for cols") } else nz <- length(z) ny <- length(y) if ( nx*nz != ny) stop("y length != x rows * z cols") if ( nx < 2 ) stop("rows < 2") if ( nz < 2 ) stop("cols < 2") if ( length(coords) != 3 || !identical(all.equal(sort(coords), 1:3), TRUE) ) stop("coords must be a permutation of 1:3") nulls <- c(is.null(normal_x), is.null(normal_y), is.null(normal_z)) if (!all( nulls ) ) { if (any( nulls )) stop("All normals must be supplied") if ( !identical(dim(y), dim(normal_x)) || !identical(dim(y), dim(normal_y)) || !identical(dim(y), dim(normal_z)) ) stop("bad dimension for normals") flags[3] <- TRUE } nulls <- c(is.null(texture_s), is.null(texture_t)) if (!all( nulls ) ) { if (any( nulls )) stop("Both texture coordinates must be supplied") if ( !identical(dim(y), dim(texture_s)) || !identical(dim(y), dim(texture_t)) ) stop("bad dimensions for textures") flags[4] <- TRUE } idata <- as.integer( c( nx, nz ) ) parity <- (perm_parity(coords) + (x[2] < x[1]) + (z[2] < z[1]) ) %% 2 ret <- .C( rgl_surface, success = as.integer(FALSE), idata, as.numeric(x), as.numeric(z), as.numeric(y), as.numeric(normal_x), as.numeric(normal_z), as.numeric(normal_y), as.numeric(texture_s), as.numeric(texture_t), as.integer(coords), as.integer(parity), as.integer(flags), NAOK=TRUE ); if (! ret$success) stop("rgl_surface failed") invisible(ret$success) } ## ## add spheres ## rgl.spheres <- function( x, y=NULL, z=NULL, radius=1.0,...) { rgl.material(...) vertex <- rgl.vertex(x,y,z) nvertex <- rgl.nvertex(vertex) radius <- rgl.attr(radius, nvertex) nradius <- length(radius) if (!nradius) stop("no radius specified") idata <- as.integer( c( nvertex, nradius ) ) ret <- .C( rgl_spheres, success = as.integer(FALSE), idata, as.numeric(vertex), as.numeric(radius), NAOK=TRUE ) if (! ret$success) print("rgl_spheres failed") invisible(ret$success) } ## ## add planes ## rgl.planes <- function( a, b=NULL, c=NULL, d=0,...) { rgl.material(...) normals <- rgl.vertex(a, b, c) nnormals <- rgl.nvertex(normals) noffsets <- length(d) idata <- as.integer( c( nnormals, noffsets ) ) ret <- .C( rgl_planes, success = as.integer(FALSE), idata, as.numeric(normals), as.numeric(d), NAOK=TRUE ) if (! ret$success) print("rgl_planes failed") invisible(ret$success) } ## ## add clip planes ## rgl.clipplanes <- function( a, b=NULL, c=NULL, d=0) { normals <- rgl.vertex(a, b, c) nnormals <- rgl.nvertex(normals) noffsets <- length(d) idata <- as.integer( c( nnormals, noffsets ) ) ret <- .C( rgl_clipplanes, success = as.integer(FALSE), idata, as.numeric(normals), as.numeric(d), NAOK=TRUE ) if (! ret$success) print("rgl_planes failed") invisible(ret$success) } ## ## add abclines ## rgl.abclines <- function(x, y=NULL, z=NULL, a, b=NULL, c=NULL, ...) { rgl.material(...) bases <- rgl.vertex(x, y, z) nbases <- rgl.nvertex(bases) directions <- rgl.vertex(a, b, c) ndirs <- rgl.nvertex(directions) idata <- as.integer( c( nbases, ndirs ) ) ret <- .C( rgl_abclines, success = as.integer(FALSE), idata, as.numeric(bases), as.numeric(directions), NAOK=TRUE ) if (! ret$success) print("rgl_abclines failed") invisible(ret$success) } ## ## add texts ## rgl.texts <- function(x, y=NULL, z=NULL, text, adj = 0.5, justify, family=par3d("family"), font=par3d("font"), cex=par3d("cex"), useFreeType=par3d("useFreeType"), ... ) { rgl.material( ... ) if (!missing(justify)) { warning("justify is deprecated: please use adj instead") if (!missing(adj)) { warning("adj and justify both specified: justify ignored") } else adj <- switch(justify,left=0,center=0.5,right=1) } if (length(adj) == 0) adj = c(0.5, 0.5) if (length(adj) == 1) adj = c(adj, 0.5) if (length(adj) > 2) warning("Only the first two entries of adj are used") vertex <- rgl.vertex(x,y,z) nvertex <- rgl.nvertex(vertex) if (!length(text)) { if (nvertex) warning("No text to plot") return(invisible(integer(0))) } text <- rep(text, length.out=nvertex) idata <- as.integer(nvertex) nfonts <- max(length(family), length(font), length(cex)) family <- rep(family, len=nfonts) font <- rep(font, len=nfonts) cex <- rep(cex, len=nfonts) family[font == 5] <- "symbol" font <- ifelse( font < 0 | font > 4, 1, font) ret <- .C( rgl_texts, success = as.integer(FALSE), idata, as.double(adj), as.character(text), as.numeric(vertex), as.integer(nfonts), as.character(family), as.integer(font), as.numeric(cex), as.integer(useFreeType), NAOK=TRUE ) if (! ret$success) stop("rgl_texts failed") invisible(ret$success) } ## ## add sprites ## rgl.sprites <- function( x, y=NULL, z=NULL, radius=1.0, shapes=NULL, userMatrix=diag(4), ... ) { rgl.material(...) center <- rgl.vertex(x,y,z) ncenter <- rgl.nvertex(center) radius <- rgl.attr(radius, ncenter) nradius <- length(radius) if (!nradius) stop("no radius specified") if (length(shapes) && length(userMatrix) != 16) stop("invalid userMatrix") idata <- as.integer( c(ncenter,nradius,length(shapes)) ) ret <- .C( rgl_sprites, success = as.integer(FALSE), idata, as.numeric(center), as.numeric(radius), as.integer(shapes), as.numeric(userMatrix), NAOK=TRUE ) if (! ret$success) stop("rgl_sprites failed") invisible(ret$success) } ## ## convert user coordinate to window coordinate ## rgl.user2window <- function( x, y=NULL, z=NULL, projection = rgl.projection()) { xyz <- xyz.coords(x,y,z,recycle=TRUE) points <- rbind(xyz$x,xyz$y,xyz$z) idata <- as.integer(ncol(points)) ret <- .C( rgl_user2window, success = FALSE, idata, as.double(points), window=double(length(points)), model=as.double(projection$model), proj=as.double(projection$proj), view=as.integer(projection$view) ) if (! ret$success) stop("rgl_user2window failed") return(matrix(ret$window, ncol(points), 3, byrow = TRUE)) } ## ## convert window coordinate to user coordiante ## rgl.window2user <- function( x, y = NULL, z = 0, projection = rgl.projection()) { xyz <- xyz.coords(x,y,z,recycle=TRUE) window <- rbind(xyz$x,xyz$y,xyz$z) idata <- as.integer(ncol(window)) ret <- .C( rgl_window2user, success = FALSE, idata, point=double(length(window)), window, model=as.double(projection$model), proj=as.double(projection$proj), view=as.integer(projection$view) ) if (! ret$success) stop("rgl_window2user failed") return(matrix(ret$point, ncol(window), 3, byrow = TRUE)) } # Selectstate values msNONE <- 1 msCHANGING <- 2 msDONE <- 3 msABORT <- 4 rgl.selectstate <- function() { ret <- .C( rgl_selectstate, success = FALSE, state = as.integer(0), mouseposition = double(4) ) if (! ret$success) stop("rgl_selectstate") return(ret) } rgl.select <- function(button = c("left", "middle", "right")) { button <- match.arg(button) newhandler <- par3d("mouseMode") newhandler[button] <- "selecting" oldhandler <- par3d(mouseMode = newhandler) on.exit(par3d(mouseMode = oldhandler)) while ((result <- rgl.selectstate())$state < msDONE) Sys.sleep(0.1) rgl.setselectstate("none") if (result$state == msDONE) return(result$mouseposition) else return(NULL) } rgl.setselectstate <- function(state = "current") { state = rgl.enum(state, current=0, none = 1, middle = 2, done = 3, abort = 4) idata <- as.integer(c(state)) ret <- .C( rgl_setselectstate, success = FALSE, state = idata ) if (! ret$success) stop("rgl_setselectstate") c("none", "middle", "done", "abort")[ret$state] } rgl.projection <- function() { list(model = par3d("modelMatrix"), proj = par3d("projMatrix"), view = par3d("viewport")) } rgl.select3d <- function(button = c("left", "middle", "right")) { rect <- rgl.select(button = button) if (is.null(rect)) return(NULL) llx <- rect[1] lly <- rect[2] urx <- rect[3] ury <- rect[4] if ( llx > urx ){ temp <- llx llx <- urx urx <- temp } if ( lly > ury ){ temp <- lly lly <- ury ury <- temp } proj <- rgl.projection(); function(x,y=NULL,z=NULL) { pixel <- rgl.user2window(x,y,z,projection=proj) x <- pixel[,1] y <- pixel[,2] z <- pixel[,3] (llx <= x) & (x <= urx) & (lly <= y) & (y <= ury) & (0 <= z) & (z <= 1) } } rgl/R/webGL.R0000644000176000001440000013651512262006354012425 0ustar ripleyuserssubst <- function(strings, ..., digits=7) { substitutions <- list(...) names <- names(substitutions) if (is.null(names)) names <- rep("", length(substitutions)) for (i in seq_along(names)) { if ((n <- names[i]) == "") n <- as.character(sys.call()[[i+2]]) value <- substitutions[[i]] if (is.numeric(value)) value <- formatC(value, digits=digits, width=1) strings <- gsub(paste("%", n, "%", sep=""), value, strings) } strings } addDP <- function(value, digits=7) { if (is.numeric(value)) { value <- formatC(value, digits=digits, width=1) noDP <- !grepl("[.]", value) value[noDP] <- paste(value[noDP], ".", sep="") } value } inRows <- function(values, perrow, leadin = ' ', digits=7) { if (is.matrix(values)) values <- t(values) values <- c(values) if (is.numeric(values)) values <- formatC(values, digits=digits, width=1) len <- length(values) if (len %% perrow != 0) values <- c(values, rep("PADDING", perrow - len %% perrow)) values <- matrix(values, ncol=perrow, byrow=TRUE) lines <- paste(leadin, apply(values, 1, function(row) paste(row, collapse=", "))) lines[length(lines)] <- gsub(", PADDING", "", lines[length(lines)]) paste(lines, collapse=",\n") } convertBBox <- function(id) { verts <- rgl.attrib(id, "vertices") text <- rgl.attrib(id, "text") if (!length(text)) text <- rep("", NROW(verts)) mat <- rgl.getmaterial(id = id) if (length(mat$color) > 1) mat$color <- mat$color[2] # We ignore the "box" colour if(any(missing <- text == "")) text[missing] <- apply(verts[missing,], 1, function(row) format(row[!is.na(row)])) res <- integer(0) if (any(inds <- is.na(verts[,2]) & is.na(verts[,3]))) res <- c(res, do.call(axis3d, c(list(edge = "x", at = verts[inds, 1], labels = text[inds]), mat))) if (any(inds <- is.na(verts[,1]) & is.na(verts[,3]))) res <- c(res, do.call(axis3d, c(list(edge = "y", at = verts[inds, 2], labels = text[inds]), mat))) if (any(inds <- is.na(verts[,1]) & is.na(verts[,2]))) res <- c(res, do.call(axis3d, c(list(edge = "z", at = verts[inds, 3], labels = text[inds]), mat))) res <- c(res, do.call(box3d, mat)) res } writeWebGL <- function(dir="webGL", filename=file.path(dir, "index.html"), template = system.file(file.path("WebGL", "template.html"), package = "rgl"), prefix = "", snapshot = TRUE, font="Arial", width, height) { # Lots of utility functions and constants defined first; execution starts way down there... vec2vec3 <- function(vec) { vec <- addDP(vec) sprintf("vec3(%s, %s, %s)", vec[1], vec[2], vec[3]) } col2rgba <- function(col) as.numeric(col2rgb(col, alpha=TRUE))/255 col2vec3 <- function(col) vec2vec3(col2rgba(col)) vec2vec4 <- function(vec) { vec <- addDP(vec) sprintf("vec4(%s, %s, %s, %s)", vec[1], vec[2], vec[3], vec[4]) } header <- function() subst( ' ', prefix, snapshotimg) shaders <- function(id, type, flags) { mat <- rgl.getmaterial(id=id) is_lit <- flags["is_lit"] is_smooth <- flags["is_smooth"] has_texture <- flags["has_texture"] fixed_quads <- flags["fixed_quads"] sprites_3d <- flags["sprites_3d"] toplevel <- flags["toplevel"] if (has_texture) texture_format <- mat$textype if (is_lit) { lights <- rgl.ids("lights") if (is.na(lights$id[1])) { # no lights is_lit <- FALSE } else { lAmbient <- list() lDiffuse <- list() lSpecular <- list() lightxyz <- list() lighttype <- matrix(NA, length(lights$id), 2) colnames(lighttype) <- c("viewpoint", "finite") for (i in 1:length(lights$id)) { lightid <- lights$id[[i]] lightcols <- rgl.attrib(lightid, "colors") lAmbient[[i]] <- lightcols[1,] lDiffuse[[i]] <- lightcols[2,] lSpecular[[i]] <- lightcols[3,] lightxyz[[i]] <- rgl.attrib(lightid, "vertices") lighttype[i,] <- t(rgl.attrib(lightid, "flags")) } } } vertex <- subst( ' ', type, id) if (sprites_3d) return(c(vertex, ' ' )) vertex <- c(vertex, subst( ' ') # Important: in some implementations (e.g. ANGLE) declarations that involve computing must be local (inside main()), not global fragment <- c(subst( ' ' ) c(vertex, fragment) } scriptheader <- function() subst( ' ' footer <- function() subst('

%snapshotimg% You must enable Javascript to view this page properly.

', prefix, snapshotimg) getFlags <- function(id, type) { mat <- rgl.getmaterial(id=id) is_lit <- mat$lit && type %in% c("triangles", "quads", "surface", "planes", "spheres", "sprites") is_smooth <- mat$smooth && type %in% c("triangles", "quads", "surface", "planes", "spheres") has_texture <- !is.null(mat$texture) && length(rgl.attrib.count(id, "texcoords")) is_transparent <- any(rgl.attrib(id, "colors")[,"a"] < 1) depth_sort <- is_transparent && type %in% c("triangles", "quads", "surface", "spheres", "sprites", "text") sprites_3d <- type == "sprites" && rgl.attrib.count(id, "ids") is_indexed <- (depth_sort || type %in% c("quads", "surface", "text", "sprites")) && !sprites_3d fixed_quads <- type %in% c("text", "sprites") && !sprites_3d is_lines <- type %in% c("lines", "linestrip", "abclines") c(is_lit=is_lit, is_smooth=is_smooth, has_texture=has_texture, is_indexed=is_indexed, depth_sort=depth_sort, fixed_quads=fixed_quads, is_transparent=is_transparent, is_lines=is_lines, sprites_3d=sprites_3d) } knowntypes <- c("points", "linestrip", "lines", "triangles", "quads", "surface", "text", "abclines", "planes", "spheres", "sprites") # Execution starts here! # Do a few checks first if (!file.exists(dir)) dir.create(dir) if (!file.info(dir)$isdir) stop("'", dir, "' is not a directory.") file.copy(system.file(file.path("WebGL", "CanvasMatrix.js"), package = "rgl"), file.path(dir, "CanvasMatrix.js")) rect <- par3d("windowRect") rwidth <- rect[3] - rect[1] + 1 rheight <- rect[4] - rect[2] + 1 if (missing(width)) { if (missing(height)) { width <- rwidth height <- rheight } else width <- height * rwidth/rheight } else if (missing(height)) height <- width * rheight/rwidth if (snapshot) { snapshot3d(file.path(dir, paste(prefix, "snapshot.png", sep=""))) snapshotimg <- subst('%prefix%snapshot
', prefix, width) snapshotimg2 <- gsub('"', '\\\\\\\\"', snapshotimg) } else snapshotimg2 <- snapshotimg <- "" templatelines <- readLines(template) templatelines <- subst(templatelines, rglVersion = packageVersion("rgl")) target <- paste("%", prefix, "WebGL%", sep="") replace <- grep( target, templatelines, fixed=TRUE) if (length(replace) != 1) stop("template ", sQuote(template), " does not contain ", target) result <- c(templatelines[seq_len(replace-1)], header()) if (NROW(bbox <- rgl.ids("bboxdeco"))) { save <- par3d(skipRedraw = TRUE) temp <- convertBBox(bbox$id) on.exit({ rgl.pop(id=temp); par3d(save) }) } ids <- rgl.ids() types <- as.character(ids$type) ids <- ids$id flags <- getFlags(ids[1], types[1]) flags <- matrix(flags, nrow=length(ids), ncol=length(flags), dimnames = list(ids, names(flags)), byrow=TRUE) toplevel <- rep(TRUE, length(ids)) i <- 0 while (i < length(ids)) { i <- i + 1 flags[i,] <- getFlags(ids[i], types[i]) if (flags[i, "sprites_3d"]) { nsub <- rgl.attrib.count(ids[i], "ids") ids <- c(ids, rgl.attrib(ids[i], "ids")) toplevel <- c(toplevel, rep(FALSE, nsub)) types <- c(types, rgl.attrib(ids[i], "types")) flags <- rbind(flags, matrix(NA, nsub, NCOL(flags))) } } flags <- cbind(flags, toplevel=toplevel) unknowntypes <- setdiff(types, knowntypes) if (length(unknowntypes)) warning("Object type(s) ", paste("'", unknowntypes, "'", sep="", collapse=", "), " not handled.") keep <- types %in% knowntypes ids <- ids[keep] flags <- flags[keep,,drop=FALSE] toplevel <- toplevel[keep] types <- types[keep] texnums <- -1 scene_has_faces <- any(flags[,"is_lit"] & !flags[,"fixed_quads"]) scene_needs_sorting <- any(flags[,"depth_sort"]) for (i in seq_along(ids)) result <- c(result, shaders(ids[i], types[i], flags[i,])) result <- c(result, scriptheader(), setUser(), textureSupport, if ("text" %in% types) textSupport, if ("spheres" %in% types) sphereSupport()) for (i in seq_along(ids)) result <- c(result, init(ids[i], types[i], flags[i,])) result <- c(result, scriptMiddle()) for (i in seq_along(ids)) if (toplevel[i] && !flags[i,"is_transparent"]) result <- c(result, draw(ids[i], types[i], flags[i,])) has_transparency <- any(flags[,"is_transparent"]) if (has_transparency) { result <- c(result, doTransparent) for (i in seq_along(ids)) if (toplevel[i] && flags[i, "is_transparent"]) result <- c(result, draw(ids[i], types[i], flags[i,])) } result <- c(result, drawEnd, mouseHandlers(), scriptEnd, footer(), templatelines[replace + seq_len(length(templatelines)-replace)]) cat(result, file=filename, sep="\n") invisible(filename) } rgl/R/triangulate.R0000644000176000001440000002101512166636525013744 0ustar ripleyusers pointInPoly <- function(poly, pt) { # polygon is 2 x n, columns are vertices # point is 2 vector n <- ncol(poly) i1 <- seq_len(n) i2 <- i1 %% n + 1 x <- poly[1,i1] + (poly[1,i2] - poly[1,i1])*(pt[2] - poly[2,i1])/(poly[2,i2] - poly[2,i1]) crossings <- ((poly[2,i1] < pt[2]) & (pt[2] <= poly[2,i2]) | (poly[2,i2] < pt[2]) & (pt[2] <= poly[2,i1])) & pt[1] < x sum(crossings) %% 2 == 1 } intersectSegSeg <- function(seg1,seg2) { # do segments intersect? # both segments have endpoints as columns coeffs <- try(solve(cbind(seg1[,2]-seg1[,1], seg2[,1]-seg2[,2]), seg2[,1]-seg1[,1]), silent=TRUE) if (inherits(coeffs, "try-error")) return (FALSE) all(zapsmall(coeffs) >= 0) && all(zapsmall(1-coeffs) >= 0) } intersectTriSeg <- function(tri, seg) { # intersect a triangle with a segment # tri is 2 x 3, columns are vertices # seg is 2 x 2, columns are endpoints coeffs <- try(solve(rbind(tri,1), rbind(seg,1)), silent=TRUE) if (inherits(coeffs, "try-error")) return(TRUE) coeffs <- zapsmall(coeffs) if (any(apply(coeffs <= 0, 1, all))) return(FALSE) if (any(apply(coeffs > 0, 2, all))) return(TRUE) up <- coeffs[,1] < 0 dn <- coeffs[,2] < 0 # if (!any(up) || !any(dn)) return(TRUE) lb <- max( -coeffs[up,1]/(coeffs[up,2]-coeffs[up,1]) ) ub <- 1 - max( -coeffs[dn,2]/(coeffs[dn,1] - coeffs[dn,2]) ) lb <= ub } triangulateSimple <- function(x,y, random=TRUE, plot=FALSE, partial=NA) { n <- length(x) stopifnot(n == length(y)) stopifnot(n > 2) it <- matrix(NA_integer_, nrow=3, ncol=n-2) verts <- 1:n while((m <- length(verts)) > 3) { i1 <- 1:m i2 <- i1 %% m + 1 i3 <- i2 %% m + 1 theta3 <- atan2(y[verts[i3]]-y[verts[i1]], x[verts[i3]]-x[verts[i1]]) theta2 <- atan2(y[verts[i2]]-y[verts[i1]], x[verts[i2]]-x[verts[i1]]) # diff <- (theta3-theta2+4*pi) %% (2*pi) diff <- ( (theta3-theta2)/pi + 4 ) %% 2 convex <- which(diff < 1) if (random && length(convex) > 1) convex <- sample(convex) good <- FALSE # just in case none are convex for (k in convex) { i <- c(i1[k],i2[k],i3[k]) tri <- rbind(x[verts[i]], y[verts[i]]) good <- TRUE for (j in 2:(m-1)) { i4 <- (i1[k] + j - 1) %% m + 1 i5 <- (i1[k] + j) %% m + 1 j <- c(i4,i5) if (intersectTriSeg(tri, rbind(x[verts[j]], y[verts[j]]))) { good <- FALSE break } } if (good) { if (plot) polygon(x[verts[i]], y[verts[i]], col=m) it[, m-2] <- verts[i] verts <- verts[-i2[k]] break } } if (!good) break } if (!good) { if (is.na(partial)) { warning("triangulation is incomplete") partial <- TRUE } if (partial) it <- it[,seq_len(n-m)+m-2, drop=FALSE] else it <- NULL } else { if (plot) polygon(x[verts], y[verts], col=3) it[, 1] <- verts } it } triangulate <- function(x, y = NULL, random=TRUE, plot=FALSE, partial=NA) { xy <- xy.coords(x, y) nesting <- nestPolys(xy) verts <- nesting$verts nextvert <- rep(NA, length(x)) processInside <- function(v) { for (i in nesting$nesting[[v]]) processOutside(i) } processOutside <- function(fwd) { fwd1 <- verts[[fwd]] nextvert[fwd1] <<- c(fwd1[-1], fwd1[1]) reversed <- nesting$nesting[[fwd]] for (rev in reversed) { rev1 <- rev(verts[[rev]]) nextvert[rev1] <<- c(rev1[-1], rev1[1]) processInside(rev) done <- FALSE # we know at least one point of rev is in fwd, so merge them. # If this fails, the polygons are messed up. # We look for a segment from fwd to rev that intersects no other segments # in either loop. pairs <- expand.grid(seq_along(fwd1), seq_along(rev1)) if (random) pairs <- pairs[sample(nrow(pairs)),] for (p in 1:nrow(pairs)) { i <- fwd1[pairs[p,1]] j <- rev1[pairs[p,2]] seg <- cbind( c(x[i], y[i]), c(x[j], y[j]) ) clear <- TRUE for (q in seq_along(verts)) { i1 <- verts[[q]] if (!length(i1)) next i2 <- c(i1[-1], i1[1]) for (v in seq_along(i1)) if (length(intersect(c(i1[v], i2[v]), c(i,j))) == 0 && intersectSegSeg(seg, cbind( c(x[i1[v]], y[i1[v]]), c(x[i2[v]], y[i2[v]]) ))) { clear <- FALSE break } if (!clear) break } if (clear) { # Found a segment that doesn't intersect anything, so join the two polys i <- pairs[p,1] j <- pairs[p,2] ind <- c(fwd1[1:i], rev1[j:length(rev1)], rev1[1:j]) if (i < length(fwd1)) ind <- c(ind, fwd1[i:length(fwd1)]) verts[[fwd]] <<- fwd1 <- ind verts[[rev]] <<- integer(0) done <- TRUE break } } if (!done) stop("Cannot simplify polygon") } ind <- verts[[fwd]] tri <- triangulateSimple(x[ind], y[ind], random, plot, partial=FALSE) if (is.null(tri)) stop("Cannot triangulate polygon") # Convert back to original numbering dim <- dim(tri) tri <- ind[tri] dim(tri) <- dim # Put in place as triangulation of the forward poly subtri[[fwd]] <<- tri } subtri <- list() for (i in nesting$toplevel) processOutside(i) # Done all polys, now combine res <- matrix(nrow=3, ncol=0) for (i in seq_along(subtri)) res <- cbind(res, subtri[[i]]) attr(res, "nextvert") <- nextvert res } # Rewrite a complex polygon as a list of the individual parts, oriented correctly, # with attribute showing nesting nestPolys <- function(x,y = NULL) { xy <- xy.coords(x, y) x <- xy$x y <- xy$y n <- length(x) nas <- c(which(is.na(x) | is.na(y)), n + 1L) prev <- 0L verts <- list() for (i in seq_along(nas)) { verts[[i]] <- ind <- (prev + 1L):(nas[i] - 1L) tri <- triangulateSimple(x[ind], y[ind], random=TRUE, plot=FALSE, partial=FALSE) if (is.null(tri)) verts[[i]] <- rev(verts[[i]]) prev <- nas[i] } # nesting is a list of vectors # of poly numbers that are directly nested within the corresponding element of verts # The last one at length(verts)+1 lists polys not nested anywhere nesting <- rep(list(integer()), length(verts)+1) place <- function(new, toplevel) { placed <- FALSE contains <- integer() if (length(nesting[[toplevel]])) { newverts <- rbind(x[verts[[new]]], y[verts[[new]]]) for (j in nesting[[toplevel]]) { prev <- rbind(x[verts[[j]]], y[verts[[j]]]) if (pointInPoly(prev, newverts[,1])) { place(new, j) placed <- TRUE break } if (pointInPoly(newverts, prev[,1])) contains <- c(contains, j) } } if (!placed) { nesting[[toplevel]] <<- c(setdiff(nesting[[toplevel]], contains), new) nesting[[new]] <<- contains } } for (i in seq_along(verts)) { place(i, length(verts)+1) } list(verts=verts, nesting=nesting[-length(nesting)], toplevel=nesting[length(nesting)]) } extrude3d <- function(x,y = NULL, thickness=1, smooth=FALSE, ...) { it <- triangulate(x, y, partial=FALSE) nextvert <- attr(it, "nextvert") n <- length(x) res <- tmesh3d(rbind(c(x,x), c(y,y), c(rep(thickness,n), rep(0,n)), 1), cbind(it, it[c(1,3,2),]+n), ...) i1 <- 1:n i2 <- nextvert i3 <- i2 + n i4 <- i1 + n keep <- !is.na(nextvert) res$ib <- rbind(i4,i3,i2,i1)[,keep] if (smooth) { res$ib <- res$ib + ncol(res$vb) res$vb <- cbind(res$vb, res$vb) i3 <- nextvert[nextvert] diff <- cbind(x[i3] - x[i1], y[i3] - y[i1]) len <- sqrt(apply(diff^2, 1, sum)) diff <- diff/len res$normals <- cbind( rbind(0,0,c(rep(1, n), rep(-1, n))) ) res$normals <- cbind(res$normals, res$normals) i2 <- c(i2 + 2*n, i2 + 3*n) keep <- !is.na(i2) res$normals[,i2[keep]] <- rbind(rep(diff[,2], 2), -rep(diff[,1], 2), 0)[,keep] } res } polygon3d <- function(x, y = NULL, z = NULL, fill = TRUE, plot = TRUE, coords = 1:2, random = TRUE, ...) { xyz <- xyz.coords(x,y,z) if (!fill) { n <- length(xyz$x) nas <- with(xyz, c(which(is.na(x) | is.na(y) | is.na(z)), n + 1L)) prev <- 0L loop <- integer() for (i in seq_along(nas)) { loop <- c(loop, if (i > 1) NA, (prev + 1L):(nas[i] - 1L), prev + 1L) prev <- nas[i] } res <- cbind(xyz$x[loop], xyz$y[loop], xyz$z[loop]) if (plot) lines3d(res, ...) else res } else { cnames <- c("x", "y", "z") x <- xyz[[cnames[coords[1]]]] y <- xyz[[cnames[coords[2]]]] tri <- triangulate(x, y, random = random) shape <- tmesh3d(rbind(xyz$x, xyz$y, xyz$z, 1), indices = tri) if (plot) shade3d(shape, ...) else shape } } rgl/R/selectpoints3d.R0000644000176000001440000000345112136474342014366 0ustar ripleyusersselectpoints3d <- function(objects = rgl.ids()$id, value = TRUE, closest = TRUE, multiple = FALSE, ...) { if (value) result <- cbind(x = numeric(0), y = numeric(0), z = numeric(0)) else result <- cbind(id = integer(0), index = integer(0)) rdist <- I first <- TRUE while (first || is.function(multiple) || multiple) { f <- select3d(...) if (is.null(f)) break e <- environment(f) dist <- Inf prev <- nrow(result) for (id in objects) { verts <- rgl.attrib(id, "vertices") hits <- f(verts) if (any(hits)) dist <- 0 else if (closest && dist > 0 && nrow(verts)) { wincoords <- rgl.user2window(verts, projection = e$proj) wz <- wincoords[,3] keep <- (0 <= wz) && (wz <= 1) wincoords <- wincoords[keep,,drop=FALSE] if (!nrow(wincoords)) next wx <- wincoords[,1] xdist <- ifelse(wx < e$llx, (wx-e$llx)^2, ifelse(wx < e$urx, 0, (wx-e$urx)^2)) wy <- wincoords[,2] ydist <- ifelse(wy < e$lly, (wy-e$lly)^2, ifelse(wy < e$ury, 0, (wy-e$ury)^2)) dists <- xdist + ydist hits <- (dists < dist) & (dists == min(dists)) dist <- min(c(dist, dists)) } if (!any(hits)) next if (prev && nrow(result) > prev && rdist > dist) result <- result[seq_len(prev),,drop=FALSE] if (value) result <- rbind(result, verts[hits,]) else result <- rbind(result, cbind(id, which(hits))) if (is.function(multiple) && nrow(result) > prev && !multiple(result[(prev+1):nrow(result),,drop=FALSE])) break rdist <- dist first <- FALSE } if (value) result <- unique(result) } result } rgl/R/oh3d.R0000644000176000001440000000375611064454445012271 0ustar ripleyusers# # R 3d object : o3d # $Id: oh3d.R 394 2005-08-08 13:28:14Z dmurdoch $ # oh3d.vb <- c( -1.5, -1.5, -0.5, 1.0, # 1 -0.5, -1.5, -0.5, 1.0, # 2 0.5, -1.5, -0.5, 1.0, # 3 1.5, -1.5, -0.5, 1.0, # 4 -1.5, -0.5, -0.5, 1.0, # 5 -0.5, -0.5, -0.5, 1.0, # 6 0.5, -0.5, -0.5, 1.0, # 7 1.5, -0.5, -0.5, 1.0, # 8 -1.5, 0.5, -0.5, 1.0, # 9 -0.5, 0.5, -0.5, 1.0, # 10 0.5, 0.5, -0.5, 1.0, # 11 1.5, 0.5, -0.5, 1.0, # 12 -1.5, 1.5, -0.5, 1.0, # 13 -0.5, 1.5, -0.5, 1.0, # 14 0.5, 1.5, -0.5, 1.0, # 15 1.5, 1.5, -0.5, 1.0, # 16 -1.5, -1.5, 0.5, 1.0, # 17 -0.5, -1.5, 0.5, 1.0, # 18 0.5, -1.5, 0.5, 1.0, # 19 1.5, -1.5, 0.5, 1.0, # 20 -1.5, -0.5, 0.5, 1.0, # 21 -0.5, -0.5, 0.5, 1.0, # 22 0.5, -0.5, 0.5, 1.0, # 23 1.5, -0.5, 0.5, 1.0, # 24 -1.5, 0.5, 0.5, 1.0, # 25 -0.5, 0.5, 0.5, 1.0, # 26 0.5, 0.5, 0.5, 1.0, # 27 1.5, 0.5, 0.5, 1.0, # 28 -1.5, 1.5, 0.5, 1.0, # 29 -0.5, 1.5, 0.5, 1.0, # 30 0.5, 1.5, 0.5, 1.0, # 31 1.5, 1.5, 0.5, 1.0 # 32 ) oh3d.ib <- c( 1, 5, 6, 2, 2, 6, 7, 3, 3, 7, 8, 4, 5, 9, 10, 6, 7, 11, 12, 8, 9, 13, 14, 10, 10, 14, 15, 11, 11, 15, 16, 12, 17, 18, 22, 21, 18, 19, 23, 22, 19, 20, 24, 23, 21, 22, 26, 25, 23, 24, 28, 27, 25, 26, 30, 29, 26, 27, 31, 30, 27, 28, 32, 31, 1, 2, 18, 17, 2, 3, 19, 18, 3, 4, 20, 19, 6, 22, 23, 7, 10, 11, 27, 26, 13, 29, 30, 14, 14, 30, 31, 15, 15, 31, 32, 16, 17, 21, 5, 1, 21, 25, 9, 5, 25, 29, 13, 9, 4, 8, 24, 20, 8, 12, 28, 24, 12, 16, 32, 28, 6, 10, 26, 22, 7, 23, 27, 11 ) oh3d <- function( trans = identityMatrix(), ... ) { return(rotate3d(qmesh3d( oh3d.vb, oh3d.ib, material=list(...) ), matrix=trans)) } rgl/R/shapelist3d.R0000644000176000001440000000532611210104423013627 0ustar ripleyusersshapelist3d <- function(shapes,x=0,y=NULL,z=NULL,size=1,matrix=NULL,override=TRUE, ..., plot=TRUE) { # This function gets an element with recycling e <- function(x, i) x[[ (i-1) %% length(x) + 1 ]] xyz <- xyz.coords(x, y, z, recycle = TRUE) x <- xyz$x y <- xyz$y if (length(y) == 0) y <- 0 z <- xyz$z if (length(z) == 0) z <- 0 if (inherits(shapes, "shape3d")) shapes <- list(shapes) material <- list(...) if (!is.null(matrix)) { if (!is.list(matrix)) matrix <- list(matrix) len <- length(matrix) } else len <- 0 len <- max(len, length(x), length(shapes), length(size), length(override)) if (length(material)) len <- max(len, sapply(material, length)) result <- vector("list", len) class(result) <- c("shapelist3d", "shape3d") for (i in seq_len(len)) { if (is.null(matrix)) this <- e(shapes, i) else this <- rotate3d(e(shapes,i), matrix=e(matrix,i)) thissize <- e(size, i) this <- translate3d(scale3d(this, thissize, thissize, thissize), e(x,i), e(y,i), e(z,i)) thismaterial <- lapply(material, function(item) e(item,i)) if (!e(override,i)) thismaterial[names(this$material)] <- this$material this$material[names(thismaterial)] <- thismaterial result[[i]] <- this } if (plot) shade3d(result) invisible(result) } dot3d.shapelist3d <- function(x, override = TRUE, ...) { .check3d() save <- par3d(skipRedraw = TRUE) on.exit(par3d(save)) invisible(unlist(sapply( x, function(item) dot3d(item, override=override, ...) ) ) ) } wire3d.shapelist3d <- function(x, override = TRUE, ...) { .check3d() save <- par3d(skipRedraw = TRUE) on.exit(par3d(save)) invisible(unlist(sapply( x, function(item) wire3d(item, override=override, ...) ) ) ) } shade3d.shapelist3d <- function(x, override = TRUE, ...) { .check3d() save <- par3d(skipRedraw = TRUE) on.exit(par3d(save)) invisible(unlist(sapply( x, function(item) shade3d(item, override=override, ...) ) ) ) } translate3d.shapelist3d <- function ( obj, x, y, z, ... ) { structure(lapply( obj, function(item) translate3d(item, x, y, z, ...) ), class = class(obj)) } rotate3d.shapelist3d <- function ( obj,angle,x,y,z,matrix, ... ) { structure(lapply( obj, function(item) rotate3d(item, x,y,z,matrix,...) ), class = class(obj)) } scale3d.shapelist3d <- function ( obj, x, y, z, ... ) { structure(lapply( obj, function(item) scale3d(item, x,y,z,...) ), class = class(obj)) } addNormals.shapelist3d <- function ( x, ... ) { structure(lapply( x, function(item) addNormals(item, ...) ), class = class(x)) } rgl/R/par3d.R0000644000176000001440000000266212262005640012426 0ustar ripleyusers.Par3d <- c("antialias", "FOV", "ignoreExtent", "mouseMode", "modelMatrix", "projMatrix", "skipRedraw", "userMatrix", "scale", "viewport", "zoom", "bbox", "windowRect", "family", "font", "cex", "useFreeType", "fontname", "maxClipPlanes" ) .Par3d.readonly <- c( "antialias", "modelMatrix", "projMatrix", "viewport", "bbox", "fontname", "maxClipPlanes" ) par3d <- function (..., no.readonly = FALSE) { single <- FALSE args <- list(...) if (!length(args)) args <- as.list(if (no.readonly) .Par3d[-match(.Par3d.readonly, .Par3d)] else .Par3d) else { if (is.null(names(args)) && all(unlist(lapply(args, is.character)))) args <- as.list(unlist(args)) if (length(args) == 1) { if (is.list(args[[1]]) | is.null(args[[1]])) args <- args[[1]] else if(is.null(names(args))) single <- TRUE } } if ("userMatrix" %in% names(args)) { m <- args$userMatrix svd <- svd(m[1:3, 1:3]) m[1:3, 1:3] <- svd$u %*% t(svd$v) theta <- atan2(-m[1,3], m[1,1]) m <- m %*% rotationMatrix(theta, 0,1,0) svd <- svd(m[1:3, 1:3]) m[1:3,1:3] <- svd$u %*% t(svd$v) phi <- atan2(-m[2,3], m[3,3]) args$.position <- c(theta, phi)*180/pi } value <- if (single) .External(rgl_par3d, args)[[1]] else .External(rgl_par3d, args) if(!is.null(names(args))) invisible(value) else value } rgl/R/getscene.R0000644000176000001440000001764612262021452013221 0ustar ripleyusersscene3d <- function() { defaultmaterial <- material3d() matdiff <- function(mat) { for (m in names(mat)) { if (identical(mat[[m]], defaultmaterial[[m]])) mat[[m]] <- NULL } mat } inbbox <- function(x, bbox) { if (is.null(x)) return(TRUE) x <- x[apply(x, 1, function(row) all(!is.na(row))),,drop=FALSE] if (!nrow(x)) return(TRUE) all(bbox[1] <= x[,1]) && all(x[,1] <= bbox[2]) && all(bbox[3] <= x[,2]) && all(x[,2] <= bbox[4]) && all(bbox[5] <= x[,3]) && all(x[,3] <= bbox[6]) } getObject <- function(id, type) { result <- list(id=id, type=type) if (type != "light") result$material <- matdiff(rgl.getmaterial(id=id)) attribs <- c("vertices", "normals", "colors", "texcoords", "dim", "texts", "cex", "adj", "radii", "ids", "usermatrix", "types" ) for (a in attribs) if (rgl.attrib.count(id, a)) result[[a]] <- rgl.attrib(id, a) # FIXME: we should query the ignoreExtent field instead if (type != "light" && !inbbox(result$vertices, scenebbox)) result$ignoreExtent <- TRUE if (!is.null(result$ids)) { objlist <- vector("list", nrow(result$ids)) for (i in seq_len(nrow(result$ids))) objlist[[i]] <- getObject(result$ids[i,1], result$types[i,1]) result$objects <- objlist } if (type == "background") { flags <- rgl.attrib(id, "flags") result$sphere <- flags["sphere", 1] result$fogtype <- if (flags["linear_fog", 1]) "linear" else if (flags["exp_fog", 1]) "exp" else if (flags["exp2_fog", 1]) "exp2" else "none" } else if (type == "bboxdeco") { flags <- rgl.attrib(id, "flags") result$draw_front <- flags["draw_front", 1] } else if (type == "light") { flags <- rgl.attrib(id, "flags") result$viewpoint <- flags["viewpoint", 1] result$finite <- flags["finite", 1] } class(result) <- c(paste0("rgl", type), "rglobject") result } scenebbox <- par3d("bbox") result <- list() result$par3d <- par3d() result$material <- defaultmaterial obj <- rgl.ids("background") bg <- getObject(obj$id, "background") result$bg <- bg if (nrow(obj <- rgl.ids("bboxdeco"))) result$bbox <- getObject(obj$id, "bboxdeco") objs <- rgl.ids(c("shapes", "lights")) objlist <- vector("list", nrow(objs)) ids <- objs$id types <- as.character(objs$type) for (i in seq_len(nrow(objs))) objlist[[i]] <- getObject(ids[i], types[i]) result$objects <- objlist class(result) <- "rglscene" result } print.rglscene <- function(x, ...) { cat("RGL scene containing:\n") if (!is.null(x$par3d)) cat(" par3d:\tscene information\n") if (!is.null(x$material)) cat(" material:\tdefault material properties\n") if (!is.null(x$objects)) { cat(" objects:\tlist of", length(x$objects),"object(s):\n") cat(" \t", sapply(x$objects, function(obj) obj$type), "\n") } invisible(x) } print.rglobject <- function(x, ...) { cat("RGL object of type", x$type, "containing components\n") cat(" ") cat(names(x), sep=", ") cat("\n") } plot3d.rglscene <- function(x, add=FALSE, ...) { if (!add) { params <- getr3dDefaults() if (!is.null(x$material)) { if (is.null(params$material)) params$material <- list() params$material[names(x$material)] <- x$material } if (!is.null(x$bg)) { if (is.null(params$bg)) params$bg <- list() params$bg[names(params$material)] <- params$material params$bg[names(x$bg$material)] <- x$bg$material x$bg$material <- x$bg$id <- x$bg$type <- NULL params$bg[names(x$bg)] <- x$bg } if (!is.null(x$par3d)) { ind <- !(names(x$par3d) %in% .Par3d.readonly) params[names(x$par3d)[ind]] <- x$par3d[ind] } open3d(params = params) # Some older scenes might not have a light in them, so only clear if one is there for (i in seq_along(x$objects)) { obj <- x$objects[[i]] if (obj$type == "light") { clear3d("lights") break } } } results <- c() for (i in seq_along(x$objects)) { obj <- x$objects[[i]] results <- c(results, plot3d(obj)) } if (!is.null(obj <- x$bbox)) plot3d(obj) invisible(results) } plot3d.rglobject <- function(x, ...) { type <- x$type fn <- switch(type, points = points3d, lines = segments3d, linestrip = lines3d, triangles = triangles3d, quads = quads3d, text = texts3d, spheres = spheres3d, abclines = abclines3d, planes = planes3d, surface = surface3d, sprites = sprites3d, light = light3d, NULL) if (is.null(fn)) { warning("Object type ",type," not handled.") return() } if (!is.null(x$ignoreExtent)) { save <- par3d(ignoreExtent = x$ignoreExtent) on.exit(par3d(save)) } args <- list() args$x <- x$vertices args$normals <- x$normals args$texcoords <- x$texcoords args$texts <- x$texts args$cex <- x$cex args$adj <- x$adj args$radius <- x$radii switch(type, abclines = { odd <- seq_len(nrow(args$x)) %% 2 == 1 ends <- args$x[odd,,drop=FALSE] args$a <- args$x[!odd,,drop=FALSE] - ends args$x <- ends }, planes = { first <- seq_len(nrow(args$x)) %% 12 == 1 args$a <- args$normals[first,,drop=FALSE] pt <- args$x[first,,drop=FALSE] args$d <- numeric(sum(first)) for (i in seq_along(args$d)) args$d[i] <- -sum(args$a[i,]*pt[i,]) args$x <- NULL args$normals <- NULL }, surface = { dim <- x$dim args$y <- matrix(args$x[,2], dim[1], dim[2]) args$z <- matrix(args$x[,3], dim[1], dim[2]) args$x <- matrix(args$x[,1], dim[1], dim[2]) if (!is.null(args$normals)) { args$normal_x <- matrix(args$normals[,1], dim[1], dim[2]) args$normal_y <- matrix(args$normals[,2], dim[1], dim[2]) args$normal_z <- matrix(args$normals[,3], dim[1], dim[2]) args$normals <- NULL } if (!is.null(args$texcoords)) { args$texture_s <- matrix(args$texcoords[,1], dim[1], dim[2]) args$texture_t <- matrix(args$texcoords[,2], dim[1], dim[2]) args$texcoords <- NULL } }, sprites = { save2 <- par3d(skipRedraw = TRUE) on.exit(par3d(save2), add=TRUE) if (!is.null(x$objects)) { ids <- numeric(length(x$objects)) for (i in seq_along(ids)) ids[i] <- plot3d(x$objects[[i]]) args$shapes <- ids } args$userMatrix <- x$usermatrix }) mat <- x$material if (is.null(mat)) mat <- list() if (!is.null(col <- x$colors)) { mat$color <- rgb(col[,1], col[,2], col[,3]) mat$alpha <- col[,4] } if (type == "light") { if (!x$finite) { args$x <- NULL vx <- x$vertices[1] vy <- x$vertices[2] vz <- x$vertices[3] args$phi <- atan2(vy, sqrt(vx^2 + vz^2))*180/pi args$theta <- atan2(vx, vz)*180/pi } args$viewpoint.rel <- x$viewpoint args$ambient <- mat$color[1] args$diffuse <- mat$color[2] args$specular <- mat$color[3] } else args <- c(args, mat) do.call(fn, args) } plot3d.rglbboxdeco <- function(x, ...) { args <- list() v <- x$vertices t <- x$texts ind <- is.na(v[,2]) & is.na(v[,3]) if (any(ind)) { args$xat <- v[ind,1] if (!is.null(t)) args$xlab <- t[ind] else args$xlab <- signif(args$xat, 4) } ind <- is.na(v[,1]) & is.na(v[,3]) if (any(ind)) { args$yat <- v[ind,2] if (!is.null(t)) args$ylab <- t[ind] else args$ylab <- signif(args$yat, 4) } ind <- is.na(v[,1]) & is.na(v[,2]) if (any(ind)) { args$zat <- v[ind,3] if (!is.null(t)) args$zlab <- t[ind] else args$zlab <- signif(args$zat, 4) } args$draw_front <- x$draw_front args <- c(args, x$material) do.call("bbox3d", args) } plot3d.rglbackground <- function(x, ...) { args <- c(list(sphere = x$sphere, fogtype = x$fogtype), x$material) do.call("bg3d", args) } rgl/R/persp3d.R0000644000176000001440000000301411064454445012777 0ustar ripleyuserspersp3d <- function(x, ...) UseMethod("persp3d") persp3d.default <- function (x = seq(0, 1, len = nrow(z)), y = seq(0, 1, len = ncol(z)), z, xlim = range(x, na.rm = TRUE), ylim = range(y, na.rm = TRUE), zlim = range(z, na.rm = TRUE), xlab = NULL, ylab = NULL, zlab = NULL, add = FALSE, aspect = !add, ...) { if (!add) clear3d() skip <- par3d(skipRedraw=TRUE) on.exit(par3d(skip)) if (is.null(xlab)) xlab <- if (!missing(x)) deparse(substitute(x)) else "X" if (is.null(ylab)) ylab <- if (!missing(y)) deparse(substitute(y)) else "Y" if (is.null(zlab)) zlab <- if (!missing(z)) deparse(substitute(z)) else "Z" ## labcex is disregarded since we do NOT yet put ANY labels... if (missing(z)) { if (!missing(x)) { if (is.list(x)) { z <- x$z y <- x$y x <- x$x } else { z <- x x <- seq(0, 1, len = nrow(z)) } } else stop("no 'z' matrix specified") } else if (is.list(x)) { y <- x$y x <- x$x } if ( (!is.matrix(x) && any(diff(x) <= 0)) || (!is.matrix(y) && any(diff(y) <= 0))) stop("increasing 'x' and 'y' values expected") result <- c(surface=surface3d(x,y,z,...)) if (!add) result <- c(result, decorate3d(xlim = xlim, ylim = ylim, zlim = zlim, xlab = xlab, ylab = ylab, zlab = zlab, aspect = aspect, ...)) invisible(result) } rgl/R/addNormals.mesh3d.R0000644000176000001440000000261412164652021014662 0ustar ripleyusersaddNormals <- function(x, ...) UseMethod("addNormals") addNormals.mesh3d <- function(x, ...) { v <- x$vb # Make sure v is homogeneous with unit w if (nrow(v) == 3) v <- rbind(v, 1) else v <- t( t(v)/v[4,] ) normals <- v*0 v <- v[1:3,] if (length(x$it)) { it <- x$it for (i in 1:ncol(it)) { normal <- normalize(xprod( v[, it[1, i]] - v[, it[3, i]], v[, it[2, i]] - v[, it[1, i]])) for (j in 1:3) { if (sum(normals[1:3, it[j,i]]*normal) < 0) normals[, it[j,i]] <- normals[, it[j,i]] + c(-normal, 1) else normals[, it[j,i]] <- normals[, it[j,i]] + c(normal, 1) } } } if (length(x$ib)) { it <- x$ib for (i in 1:ncol(it)) { normal <- normalize(xprod( v[, it[1, i]] - v[, it[4, i]], v[, it[2, i]] - v[, it[1, i]])) for (j in 1:4) { if (sum(normals[1:3, it[j,i]]*normal) < 0) normals[, it[j,i]] <- normals[, it[j,i]] + c(-normal, 1) else normals[, it[j,i]] <- normals[, it[j,i]] + c(normal, 1) } } } normals <- t( t(normals)/normals[4,] ) x$normals <- normals x } veclen <- function(v) sqrt(sum(v^2)) normalize <- function(v) v/veclen(v) xprod <- function(v, w) c( v[2]*w[3] - v[3]*w[2], v[3]*w[1] - v[1]*w[3], v[1]*w[2] - v[2]*w[1] ) rgl/R/fonts.R0000644000176000001440000000412611064454445012555 0ustar ripleyusers# The rgl font database is only used when rgl is configured for freetype. # Usually this is not true in Windows, and the windowsFonts are used instead. # This code is closely modelled on the Quartz font database. .rglEnv <- new.env() assign(".rglFonts", list(), envir = .rglEnv) # Check that the font has the correct structure and information checkrglFont <- function(font) { if (!is.character(font) || length(font) != 4) stop("invalid rgl font: must be 4 filenames") font } setrglFonts <- function(fonts, fontNames) { fonts <- lapply(fonts, checkrglFont) fontDB <- get(".rglFonts", envir=.rglEnv) existingFonts <- fontNames %in% names(fontDB) if (sum(existingFonts) > 0) fontDB[fontNames[existingFonts]] <- fonts[existingFonts] if (sum(existingFonts) < length(fontNames)) fontDB <- c(fontDB, fonts[!existingFonts]) assign(".rglFonts", fontDB, envir=.rglEnv) } printFont <- function(font) { paste(font, "\n", sep="") } printFonts <- function(fonts) { cat(paste(names(fonts), ": ", unlist(lapply(fonts, printFont)), sep="", collapse="")) } # If no arguments spec'ed, return entire font database # If no named arguments spec'ed, all args should be font names # to get info on from the database # Else, must specify new fonts to enter into database (all # of which must be valid filenames and # all of which must be named args) rglFonts <- function(...) { ndots <- length(fonts <- list(...)) if (ndots==0) { get(".rglFonts", .rglEnv) } else { fontNames <- names(fonts) nnames <- length(fontNames) if (nnames == 0) { if (!all(sapply(fonts, is.character))) { stop(gettextf("invalid arguments in '%s' (must be font names)", "rglFonts"), domain = NA) } else { get(".rglFonts", .rglEnv)[unlist(fonts)] } } else { if (ndots != nnames) { stop(gettextf("invalid arguments in '%s' (need named args)", "rglFonts"), domain = NA) } setrglFonts(fonts, fontNames) } } } rglFont <- function(family) { checkrglFont(family) } rgl/R/mesh3d.R0000644000176000001440000001360212165640570012605 0ustar ripleyusers# # triangle mesh object # tmesh3d <- function( vertices, indices, homogeneous=TRUE, material=NULL, normals=NULL, texcoords=NULL) { if (homogeneous == TRUE) vrows <- 4 else vrows <- 3 nvertex <- length(vertices)/vrows if ( !is.null(normals) ) { normals <- xyz.coords(normals, recycle=TRUE) x <- rep(normals$x, len=nvertex) y <- rep(normals$y, len=nvertex) z <- rep(normals$z, len=nvertex) normals <- rgl.vertex(x,y,z) } if ( !is.null(texcoords) ) { texcoords <- xy.coords(texcoords, recycle=TRUE) x <- rep(texcoords$x, len=nvertex) y <- rep(texcoords$y, len=nvertex) texcoords <- rbind(x,y) } object <- list( vb=matrix(vertices,nrow=vrows), it=matrix(indices,nrow=3), primitivetype="triangle", material=material, normals=normals, texcoords=texcoords ) if (!homogeneous) object$vb <- rbind(object$vb, 1) class(object) <- c("mesh3d", "shape3d") return( object ) } # # R 3d object : quad mesh # qmesh3d <- function( vertices, indices, homogeneous=TRUE, material=NULL, normals=NULL, texcoords=NULL) { if (homogeneous == TRUE) vrows <- 4 else vrows <- 3 nvertex <- length(vertices)/vrows if ( !is.null(normals) ) { normals <- xyz.coords(normals, recycle=TRUE) x <- rep(normals$x, len=nvertex) y <- rep(normals$y, len=nvertex) z <- rep(normals$z, len=nvertex) normals <- rgl.vertex(x,y,z) } if ( !is.null(texcoords) ) { texcoords <- xy.coords(texcoords, recycle=TRUE) x <- rep(texcoords$x, len=nvertex) y <- rep(texcoords$y, len=nvertex) texcoords <- rbind(x,y) } object <- list( vb=matrix(vertices,nrow=vrows), ib=matrix(indices,nrow=4), primitivetype="quad", material=material, normals=normals, texcoords=texcoords ) if (!homogeneous) object$vb <- rbind(object$vb, 1) class(object) <- c("mesh3d", "shape3d") return( object ) } # rendering support dot3d.mesh3d <- function ( x, override = TRUE, ... ) { if ( override ) { material <- x$material if (is.null(material)) material <- list() material[names(list(...))] <- list(...) } else { material <- list(...) material[names(x$material)] <- x$material } do.call("points3d", args = c(list(x = x$vb[1,]/x$vb[4,], y = x$vb[2,]/x$vb[4,], z = x$vb[3,]/x$vb[4,]), material )) } dot3d.qmesh3d <- dot3d.mesh3d # for back-compatibility wire3d.mesh3d <- function ( x, override = TRUE, ... ) { if ( override ) { material <- x$material if (is.null(material)) material <- list() material[names(list(...))] <- list(...) } else { material <- list(...) material[names(x$material)] <- x$material } material["front"] <- "lines" material["back"] <- "lines" result <- integer(0) if (!is.null(x$it)) result <- c(triangles = do.call("triangles3d", args = c(list(x = x$vb[1,x$it]/x$vb[4,x$it], y = x$vb[2,x$it]/x$vb[4,x$it], z = x$vb[3,x$it]/x$vb[4,x$it]), material))) if (!is.null(x$ib)) result <- c(result, quads = do.call("quads3d", args = c(list(x = x$vb[1,x$ib]/x$vb[4,x$ib], y = x$vb[2,x$ib]/x$vb[4,x$ib], z = x$vb[3,x$ib]/x$vb[4,x$ib]), material))) invisible(result) } shade3d.mesh3d <- function ( x, override = TRUE, ... ) { if ( override ) { material <- x$material if (is.null(material)) material <- list() material[names(list(...))] <- list(...) } else { material <- list(...) material[names(x$material)] <- x$material } result <- integer(0) if (!is.null(x$it)) { args <- c(list(x = x$vb[1,x$it]/x$vb[4,x$it], y = x$vb[2,x$it]/x$vb[4,x$it], z = x$vb[3,x$it]/x$vb[4,x$it]), material) if (!is.null(x$normals)) args <- c(args, list(normals = t(x$normals[,x$it]))) if (!is.null(x$texcoords)) args <- c(args, list(texcoords = t(x$texcoords[,x$it]))) result <- c(triangles = do.call("triangles3d", args = args )) } if (!is.null(x$ib)) { args <- c(list(x = x$vb[1,x$ib]/x$vb[4,x$ib], y = x$vb[2,x$ib]/x$vb[4,x$ib], z = x$vb[3,x$ib]/x$vb[4,x$ib]), material) if (!is.null(x$normals)) args <- c(args, list(normals = t(x$normals[,x$ib]))) if (!is.null(x$texcoords)) args <- c(args, list(texcoords = t(x$texcoords[,x$ib]))) result <- c(result, quads = do.call("quads3d", args = args )) } invisible(result) } # transformation support translate3d.mesh3d <- function ( obj, x, y, z, ... ) { obj$vb <- t(translate3d(t(obj$vb), x, y, z)) return(obj) } rotate3d.mesh3d <- function ( obj,angle,x,y,z,matrix, ... ) { obj$vb <- t(rotate3d(t(obj$vb), angle, x, y, z, matrix)) if ( !is.null(obj$normals) ) { if ( missing(matrix) ) obj$normals <- rotate3d(t(obj$normals), angle, x, y, z) else { if (nrow(matrix) == 4) matrix[4,1:3] <- 0 if (ncol(matrix) == 4) matrix[1:3,4] <- 0 obj$normals <- rotate3d(t(obj$normals), angle, x, y, z, t(solve(matrix))) } obj$normals <- t( obj$normals/sqrt(apply(obj$normals^2, 1, sum)) ) } return(obj) } scale3d.mesh3d <- function ( obj, x, y, z, ... ) { obj$vb <- t(scale3d(t(obj$vb), x, y, z)) if ( !is.null(obj$normals) ) { obj$normals <- scale3d(t(obj$normals), 1/x, 1/y, 1/z) obj$normals <- t( obj$normals/sqrt(apply(obj$normals[,1:3]^2, 1, sum)) ) obj$normals[4,] <- 1 } return(obj) } # for back-compatibility translate3d.qmesh3d <- translate3d.mesh3d rotate3d.qmesh3d <- rotate3d.mesh3d scale3d.qmesh3d <- scale3d.mesh3d rgl/R/animate.R0000644000176000001440000001537412136474342013050 0ustar ripleyusers# These quaternion functions are adapted from the orientlib package # Convert an array of rotation matrices to a matrix of unit quaternions toQuaternions <- function(x) { nicesqrt <- function(x) sqrt(pmax(x,0)) q4 <- nicesqrt((1 + x[1,1,] + x[2,2,] + x[3,3,])/4) # may go negative by rounding zeros <- zapsmall(q4) == 0 q1 <- ifelse(!zeros, (x[2,3,] - x[3,2,])/4/q4, nicesqrt(-(x[2,2,]+x[3,3,])/2)) q2 <- ifelse(!zeros, (x[3,1,] - x[1,3,])/4/q4, ifelse(zapsmall(q1) != 0, x[1,2,]/2/q1, nicesqrt((1-x[3,3,])/2))) q3 <- ifelse(!zeros, (x[1,2,] - x[2,1,])/4/q4, ifelse(zapsmall(q1) != 0, x[1,3,]/2/q1, ifelse(zapsmall(q2) != 0, x[2,3,]/2/q2, 1))) cbind(q1, q2, q3, q4) } # Convert a single quaternion to a rotation matrix toRotmatrix <- function(x) { x <- x/sqrt(sum(x^2)) matrix(c(1-2*x[2]^2-2*x[3]^2, 2*x[1]*x[2]-2*x[3]*x[4], 2*x[1]*x[3]+2*x[2]*x[4], 2*x[1]*x[2]+2*x[3]*x[4], 1-2*x[1]^2-2*x[3]^2, 2*x[2]*x[3] - 2*x[4]*x[1], 2*x[1]*x[3] - 2*x[2]*x[4], 2*x[2]*x[3] + 2*x[1]*x[4], 1 - 2*x[1]^2 - 2*x[2]^2), 3,3) } par3dinterp <- function(times=NULL, userMatrix, scale, zoom, FOV, method=c("spline", "linear"), extrapolate = c("oscillate","cycle","constant", "natural")) { if (is.list(times)) { for (n in setdiff(names(times), "times")) assign(n, times[[n]]) if ("times" %in% names(times)) times <- times[["times"]] else times <- NULL } if (!missing(userMatrix) && is.list(userMatrix)) userMatrix <- do.call(cbind, userMatrix) if (!missing(scale) && is.list(scale)) scale <- do.call(rbind, scale) if (!missing(zoom) && is.list(zoom)) zoom <- unlist(zoom) if (!missing(FOV) && is.list(FOV)) FOV <- unlist(FOV) if (is.null(times)) { times <- if (!missing(userMatrix)) 0:(length(userMatrix)/16 - 1) else if (!missing(scale)) 0:(dim(scale)[1] - 1) else if (!missing(zoom)) 0:(length(zoom) - 1) else if (!missing(FOV)) 0:(length(FOV) - 1) } data <- matrix(0, length(times), 0) if (!missing(userMatrix)) { stopifnot( length(userMatrix) == 16*length(times) ) userMatrix <- array(userMatrix, c(4,4,length(times))) xlat <- ncol(data) + 1:4 data <- cbind(data, t(userMatrix[,4,])) persp <- ncol(data) + 1:3 data <- cbind(data, t(userMatrix[4,1:3,])) rot <- ncol(data) + 1:4 data <- cbind(data, toQuaternions(userMatrix[1:3,1:3,])) } else { xlat <- NULL } if (!missing(scale)) { stopifnot( dim(scale)[1] == length(times) ) sc <- ncol(data) + 1:3 data <- cbind(data, log(scale)) } else sc <- NULL if (!missing(zoom)) { stopifnot( length(zoom) == length(times) ) zm <- ncol(data) + 1 data <- cbind(data, log(zoom)) } else zm <- NULL if (!missing(FOV)) { stopifnot( length(FOV) == length(times) ) fov <- ncol(data) + 1 data <- cbind(data, FOV) } else fov <- NULL method <- match.arg(method) extrapolate <- match.arg(extrapolate) if (extrapolate == "oscillate") { n <- length(times) times <- c(times[-n], -rev(times) + 2*times[length(times)]) data <- rbind(data[-n,,drop=FALSE], data[n:1,,drop=FALSE]) n <- 2*n - 1 extrapolate <- "cycle" } else if (extrapolate == "natural" && method != "spline") stop("natural extrapolation only supported for spline method") if (method == "spline") { fns <- apply(data, 2, function(col) splinefun(times, col, method = ifelse(extrapolate == "cycle", "periodic", "natural"))) } else { fns <- apply(data, 2, function(col) approxfun(times, col, rule=2)) } mintime <- min(times) maxtime <- max(times) function(time) { stopifnot(rgl.cur() != 0) if (time < mintime || time > maxtime) { if (extrapolate == "constant") time <- ifelse(time < mintime, mintime, maxtime) else if (extrapolate == "cycle") time <- (time - mintime) %% (maxtime - mintime) + mintime } data <- sapply(fns, function(f) f(time)) result <- list() if (!is.null(xlat)) { userMatrix <- matrix(0, 4,4) userMatrix[,4] <- data[xlat] userMatrix[4,1:3] <- data[persp] userMatrix[1:3,1:3] <- toRotmatrix(data[rot]) result$userMatrix <- userMatrix } if (!is.null(sc)) result$scale <- exp(data[sc]) if (!is.null(zm)) result$zoom <- exp(data[zm]) if (!is.null(fov)) result$FOV <- data[fov] result } } spin3d <- function(axis = c(0, 0, 1), rpm = 5) { M <- par3d("userMatrix") function(time, base = M) list(userMatrix = rotate3d(base, time*rpm*pi/30, axis[1], axis[2], axis[3])) } play3d <- function(f, duration = Inf, dev = rgl.cur(), ..., startTime = 0) { # Don't want to start timing until args are known: they may be obtained # interactively force(f) force(duration) force(dev) start <- proc.time()[3] - startTime rgl.setselectstate("none") repeat { if(rgl.cur() != dev) rgl.set(dev) time <- proc.time()[3] - start if (time > duration || rgl.selectstate()$state == msABORT) return(invisible(NULL)) par3d(f(time, ...)) } } movie3d <- function(f, duration, dev = rgl.cur(), ..., fps=10, movie = "movie", frames = movie, dir = tempdir(), convert = TRUE, clean = TRUE, verbose=TRUE, top = TRUE, type = "gif", startTime = 0) { olddir <- setwd(dir) on.exit(setwd(olddir)) for (i in round(startTime*fps):(duration*fps)) { time <- i/fps if(rgl.cur() != dev) rgl.set(dev) par3d(f(time, ...)) filename <- sprintf("%s%03d.png",frames,i) if (verbose) { cat("Writing", filename, "\r") flush.console() } rgl.snapshot(filename=filename, fmt="png", top=top) } cat("\n") if (.Platform$OS.type == "windows") system <- shell if (is.logical(convert) && convert) { # Check for ImageMagick version <- system("convert --version", intern=TRUE) if (!length(grep("ImageMagick", version))) stop("ImageMagick not found") filename <- paste(movie, ".", type, sep="") if (verbose) cat("Will create: ", file.path(dir, filename), "\n") convert <- "convert -delay 1x%d %s*.png %s.%s" } if (is.character(convert)) { convert <- sprintf(convert, fps, frames, movie, type, duration, dir) if (verbose) { cat("Executing: ", convert, "\n") flush.console() } system(convert) if (clean) { if (verbose) cat("Deleting frames.\n") for (i in 0:(duration*fps)) { filename <- sprintf("%s%03d.png",frames,i) unlink(filename) } } } } rgl/R/stl.R0000644000176000001440000001611212142152415012212 0ustar ripleyuserswriteSTL <- function(con, ascii=FALSE, pointRadius=0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, ids = NULL) { writeHeader <- function() { ident <- paste(filename, " produced by RGL\n") if (ascii) cat("solid ", ident, file=con) else { padding <- paste(rep(" ", 80), collapse="") ident <- substr( paste("binary", ident, padding), 1, 80) writeChar(ident, con, nchars=80, useBytes=TRUE, eos=NULL) writeBin(0L, con, size=4, endian="little") } } triangles <- 0 writeTriangles <- function(vertices) { if (nrow(vertices) %% 3 != 0) stop("Need 3N vertices") n <- nrow(vertices) / 3 for (i in seq_len(n)) { vec0 <- vertices[3*i - 2,] vec1 <- vertices[3*i - 1,] vec2 <- vertices[3*i,] normal <- normalize(xprod(vec2-vec0, vec1-vec0)) if (ascii) { cat("facet normal ", normal, "\n", file=con) cat("outer loop\n", file=con) cat("vertex ", vec0, "\n", file=con) cat("vertex ", vec1, "\n", file=con) cat("vertex ", vec2, "\n", file=con) cat("endloop\n", file=con) cat("endfacet\n", file=con) } else { writeBin(c(normal, vec0, vec1, vec2), con, size=4, endian="little") writeBin(0L, con, size=2, endian="little") } } triangles <<- triangles + n } writeQuads <- function(vertices) { if (nrow(vertices) %% 4 != 0) stop("Need 4N vertices") n <- nrow(vertices) / 4 indices <- rep(seq_len(n)*4, each=6) - rep(c(3, 2, 1, 3, 1, 0), n) writeTriangles( vertices[indices,] ) } writeSurface <- function(id) { vertices <- rgl.attrib(id, "vertices") dims <- rgl.attrib(id, "dim") nx <- dims[1] nz <- dims[2] indices <- integer(0) for (j in seq_len(nx-1) - 1) { v1 <- j + nx*(seq_len(nz) - 1) + 1 indices <- c(indices, rbind(v1[-nz], v1[-nz]+1, v1[-1]+1, v1[-1])) } writeQuads(vertices[indices,]) } writeMesh <- function(mesh, scale=1, offset=c(0,0,0)) { vertices <- asEuclidean(t(mesh$vb))*scale vertices <- vertices + rep(offset, each=nrow(vertices)) nt <- length(mesh$it)/3 nq <- length(mesh$ib)/4 newverts <- matrix(NA, 3*nt+6*nq, 3) if (nt) newverts[1:(3*nt),] <- vertices[c(mesh$it),] if (nq) newverts[3*nt+1:(6*nq),] <- vertices[c(mesh$ib[1:3,], mesh$ib[c(1,3,4),]),] writeTriangles(newverts) } writeSpheres <- function(id) { vertices <- rgl.attrib(id, "vertices") radii <- rgl.attrib(id, "radii") n <- nrow(vertices) radii <- rep(radii, length.out=n) x <- subdivision3d(icosahedron3d(),3) r <- sqrt(x$vb[1,]^2 + x$vb[2,]^2 + x$vb[3,]^2) x$vb[4,] <- r for (i in seq_along(radii)) writeMesh(x, radii[i], vertices[i,]) } avgScale <- function() { bbox <- par3d("bbox") ranges <- c(bbox[2]-bbox[1], bbox[4]-bbox[3], bbox[6]-bbox[5]) if (prod(ranges) == 0) 1 else exp(mean(log(ranges))) } writePoints <- function(id) { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) radius <- pointRadius*avgScale() for (i in seq_len(n)) writeMesh(pointShape, radius, vertices[i,]) } writeSegments <- function(id) { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices)/2 radius <- lineRadius*avgScale() for (i in seq_len(n)) { cyl <- cylinder3d(vertices[(2*i-1):(2*i),], radius = radius, sides = lineSides, closed = -2) writeMesh(cyl) } } writeLines <- function(id) { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) - 1 radius <- lineRadius*avgScale() for (i in seq_len(n)) writeMesh( cylinder3d( vertices[i:(i+1),], radius = radius, sides = lineSides, closed = -2) ) } knowntypes <- c("triangles", "quads", "surface", "planes", "spheres", "points", "lines", "linestrip") # Execution starts here! if (is.character(con)) { con <- file(con, if (ascii) "w" else "wb") on.exit(close(con)) } filename <- summary(con)$description if (NROW(bbox <- rgl.ids("bboxdeco")) && (is.null(ids) || bbox$id %in% ids)) { ids <- setdiff(ids, bbox$id) save <- par3d(skipRedraw = TRUE) bbox <- convertBBox(bbox$id) on.exit({ rgl.pop(id=bbox); par3d(save) }, add=TRUE) dobbox <- TRUE } else dobbox <- FALSE if (is.null(ids)) { ids <- rgl.ids() types <- as.character(ids$type) ids <- ids$id } else { if (dobbox) ids <- c(ids, bbox) allids <- rgl.ids() ind <- match(ids, allids$id) keep <- !is.na(ind) if (any(!keep)) warning("object(s) with id ", paste(ids[!keep], collapse=" "), " not found") ids <- ids[keep] types <- allids$type[ind[keep]] } unknowntypes <- setdiff(types, knowntypes) if (length(unknowntypes)) warning("Object type(s) ", paste("'", unknowntypes, "'", sep="", collapse=", "), " not handled.") keep <- types %in% knowntypes ids <- ids[keep] types <- types[keep] writeHeader() for (i in seq_along(ids)) switch(types[i], planes =, triangles = writeTriangles(rgl.attrib(ids[i], "vertices")), quads = writeQuads(rgl.attrib(ids[i], "vertices")), surface = writeSurface(ids[i]), spheres = writeSpheres(ids[i]), points = writePoints(ids[i]), lines = writeSegments(ids[i]), linestrip = writeLines(ids[i]) ) if (!ascii) { seek(con, 80) writeBin(as.integer(triangles), con, size=4, endian="little") } invisible(filename) } readSTL <- function(con, ascii=FALSE, plot=TRUE, ...) { # Utility functions and constants defined first; execution starts way down there... triangles <- NULL readHeader <- function() { if (ascii) { ident <- readLines(con, 1) if (!grepl("^solid ", ident)) stop("this does not appear to be an ASCII STL file") } if (!ascii) { seek(con, 80) triangles <<- readBin(con, "integer", n=1, size=4, endian="little") } } readTriangles <- function(n) { if (ascii) { lines <- readLines(con) if (is.null(n)) n <- lines %/% 7 } vertices <- matrix(NA, 3*n, 3) if (!ascii) { for (i in seq_len(n)) { m <- matrix(readBin(con, "double", n=12, size=4, endian="little"), 4, 3, byrow=TRUE) vertices[3*i + c(-2,-1,0),] <- m[2:4,] count <- readBin(con, "integer", n=1, size=2, endian="little") } } vertices } # Execution starts here! if (ascii) stop("ASCII input not yet supported") if (is.character(con)) { con <- file(con, if (ascii) "rt" else "rb") on.exit(close(con)) } readHeader() vertices <- readTriangles(triangles) if (plot) triangles3d(vertices, ...) else vertices } rgl/R/grid3d.R0000644000176000001440000000373211064454445012602 0ustar ripleyusersgrid3d <- function (side, at = NULL, col="gray", lwd = 1, lty = 1, n = 5) { save <- par3d(skipRedraw = TRUE, ignoreExtent = TRUE) on.exit(par3d(save)) if (!missing(side) && length(side)>1) return(invisible(sapply(side,grid3d,at=at,col=col,lwd=lwd,lty=lty,n=n))) ranges <- .getRanges() side <- c(strsplit(side, '')[[1]], '-')[1:2] coord <- match(toupper(side[1]), c('X', 'Y', 'Z')) spos <- match(side[2],c('-','+')) sidenames <- c('x', 'y', 'z') sides <- 1:3 sides <- sides[-coord] if (is.null(at)) at <- list() else if (is.numeric(at)) { at <- list(x=at, y=at, z=at) at[[coord]] <- NULL } result <- c() for (cside in sides) { range <- ranges[[cside]] if (is.null(at1 <- at[[sidenames[cside]]])) at1 <- pretty(range, n) at1 <- at1[at1 >= range[1] & at1 <= range[2]] mpos1 <- matrix(rep(c(ranges$x[1],ranges$y[1],ranges$z[1]), each=length(at1)), ncol=3) mpos2 <- matrix(rep(c(ranges$x[2],ranges$y[2],ranges$z[2]), each=length(at1)), ncol=3) mpos1[,cside] <- mpos2[,cside] <- at1 if (is.null(at[[sidenames[coord]]])) mpos1[,coord] <- mpos2[,coord] <- ranges[c("x","y","z")][[coord]][spos] else { # may need to duplicate temp1 <- temp2 <- matrix(NA, nrow=0, ncol=3) planes <- at[[sidenames[coord]]] planes <- planes[planes >= ranges[[coord]][1] & planes <= ranges[[coord]][2]] for (at2 in planes) { mpos1[,coord] <- mpos2[,coord] <- at2 temp1 <- rbind(temp1, mpos1) temp2 <- rbind(temp2, mpos2) } mpos1 <- temp1 mpos2 <- temp2 } result[sidenames[cside]] <- segments3d(x=c(rbind(mpos1[,1],mpos2[,1])), y=c(rbind(mpos1[,2],mpos2[,2])), z=c(rbind(mpos1[,3],mpos2[,3])), lwd=lwd,color=col) } invisible(result) } rgl/R/internal.R0000644000176000001440000000431511064454445013240 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: internal.R 695 2008-08-07 19:52:59Z dmurdoch $ ## ## ## ===[ SECTION: internal ]=================================================== ## # # rgl.range # # ensure value x is between low and high # rgl.range <- function ( x, low, high ) { if (length(x) > 1) stop( deparse(substitute(x)), " must be a single numeric") if ( ( x < low ) || ( x > high ) ) stop( deparse(substitute(x)), " must be a numeric in the range [ ",low, ":", high , "]") } # # rgl.clamp # # clamp value if lower than low or higher than high # rgl.clamp <- function(value, low, high) { if (value < low) { warning( paste("value clamped to ",low) ); result <- low } else if (value > high) { warning( paste("value clamped to ",high) ); result <- high } else { result <- value } return (result); } ## ## types verification ## # # single field bool # rgl.bool <- function ( x ) { if (length(x) > 1) stop( deparse(substitute(x)), " must be a single boolean value") } # # single field numeric # rgl.numeric <- function ( x ) { if (length(x) > 1) stop( deparse(substitute(x)), " must be a single numeric value") } # # vertex data object # rgl.vertex <- function (x,y=NULL,z=NULL) { xyz <- xyz.coords(x,y,z,recycle=TRUE) return ( matrix( rbind(xyz$x,xyz$y,xyz$z), nrow=3, dimnames=list( c("x","y","z"), NULL ) ) ) } # # texture coordinate data object # rgl.texcoords <- function(s,t=NULL) { xy <- xy.coords(s, t, recycle=TRUE) return( matrix( rbind(xy$x, xy$y), nrow=2, dimnames=list( c("s", "t"), NULL ) ) ) } # # obtain number of vertices # rgl.nvertex <- function (vertex) { return ( ncol(vertex) ) } # # rgl.color - single field color # rgl.color <- function ( color ) { if (length(color) > 1) stop( deparse(substitute(color)), " must be a single color character string") else return (col2rgb(color)) } # # rgl.mcolor - multiple field colors # rgl.mcolor <- function ( colors ) { return ( col2rgb(colors) ) } # # if vattr > 1, recycle data # rgl.attr <- function (vattr, nvertex) { nvattr <- length(vattr) if ((nvattr > 1) && (nvattr != nvertex)) vattr <- rep(vattr,length.out=nvertex) return(vattr) } rgl/R/subdivision.mesh3d.R0000644000176000001440000001573112127602354015143 0ustar ripleyusers# # subdivision.mesh3d # # an *efficient* algorithm for subdivision of mesh3d objects # using addition operations and homogenous coordinates # by Daniel Adler # # $Id: subdivision.mesh3d.R 842 2012-03-02 02:21:09Z murdoch $ # edgemap <- function( size ) { data<-vector( mode="numeric", length=( size*(size+1) )/2 ) data[] <- -1 return(data) } edgeindex <- function( from, to, size, row=min(from,to), col=max(from,to) ) return( row*size - ( row*(row+1) )/2 - (size-col) ) divide.mesh3d <- function (mesh,vb=mesh$vb, ib=mesh$ib, it=mesh$it ) { nv <- dim(vb)[2] nq <- if (is.null(ib)) 0 else dim(ib)[2] nt <- if (is.null(it)) 0 else dim(it)[2] primout <- c() nvmax <- nv + nq + ( nv*(nv+1) )/2 outvb <- matrix(data=0,nrow=4,ncol=nvmax) # copy old points outvb[,1:nv] <- vb vcnt <- nv em <- edgemap( nv ) if (!is.null(mesh$normals)) { if (NROW(mesh$normals) == 4) mesh$normals <- t(asEuclidean(t(mesh$normals))) newnormals <- matrix(data=0,nrow=3,ncol=nvmax) newnormals[,1:nv] <- mesh$normals } else newnormals <- NULL if (!is.null(mesh$texcoords)) { newtexcoords <- matrix(data=0,nrow=2,ncol=nvmax) newtexcoords[,1:nv] <- mesh$texcoords } else newtexcoords <- NULL if (!is.null(newnormals) || !is.null(newtexcoords)) { newcount <- rep(0, nvmax) newcount[1:nv] <- 1 } result <- structure(list(material=mesh$material), class="mesh3d") if (nq) { newnq <- nq*4 outib <- matrix(nrow=4,ncol=newnq) vcnt <- vcnt + nq for (i in 1:nq ) { isurf <- nv + i for (j in 1:4 ) { iprev <- ib[((j+2)%%4) + 1, i] ithis <- ib[j,i] inext <- ib[ (j%%4) + 1, i] # get or alloc edge-point this->next mindex <- edgeindex(ithis, inext, nv) enext <- em[mindex] if (enext == -1) { vcnt <- vcnt + 1 enext <- vcnt em[mindex] <- enext } # get or alloc edge-point prev->this mindex <- edgeindex(iprev, ithis, nv) eprev <- em[mindex] if (eprev == -1) { vcnt <- vcnt + 1 eprev <- vcnt em[mindex] <- eprev } # gen grid outib[, (i-1)*4+j ] <- c( ithis, enext, isurf, eprev ) # calculate surface point outvb[,isurf] <- outvb[,isurf] + vb[,ithis] # calculate edge point outvb[,enext] <- outvb[,enext] + vb[,ithis] outvb[,eprev] <- outvb[,eprev] + vb[,ithis] if (!is.null(newnormals)) { thisnorm <- mesh$normals[,ithis] newnormals[,isurf] <- newnormals[,isurf] + thisnorm newnormals[,enext] <- newnormals[,enext] + thisnorm newnormals[,eprev] <- newnormals[,eprev] + thisnorm } if (!is.null(newtexcoords)) { thistexcoord <- mesh$texcoords[,ithis] newtexcoords[,isurf] <- newtexcoords[,isurf] + thistexcoord newtexcoords[,enext] <- newtexcoords[,enext] + thistexcoord newtexcoords[,eprev] <- newtexcoords[,eprev] + thistexcoord } if (!is.null(newnormals) || !is.null(newtexcoords)) { newcount[isurf] <- newcount[isurf] + 1 newcount[enext] <- newcount[enext] + 1 newcount[eprev] <- newcount[eprev] + 1 } } } primout <- "quad" result$ib <- outib } if (nt) { newnt <- nt*4 outit <- matrix(nrow=3,ncol=newnt) for (i in 1:nt ) { for (j in 1:3 ) { iprev <- it[((j+1)%%3) + 1, i] ithis <- it[j,i] inext <- it[ (j%%3) + 1, i] # get or alloc edge-point this->next mindex <- edgeindex(ithis, inext, nv) enext <- em[mindex] if (enext == -1) { vcnt <- vcnt + 1 enext <- vcnt em[mindex] <- enext } # get or alloc edge-point prev->this mindex <- edgeindex(iprev, ithis, nv) eprev <- em[mindex] if (eprev == -1) { vcnt <- vcnt + 1 eprev <- vcnt em[mindex] <- eprev } # gen grid outit[, (i-1)*4+j ] <- c( ithis, enext, eprev ) # calculate edge point outvb[,enext] <- outvb[,enext] + vb[,ithis] outvb[,eprev] <- outvb[,eprev] + vb[,ithis] if (!is.null(newnormals)) { thisnorm <- mesh$normals[,ithis] newnormals[,enext] <- newnormals[,enext] + thisnorm newnormals[,eprev] <- newnormals[,eprev] + thisnorm } if (!is.null(newtexcoords)) { thistexcoord <- mesh$texcoords[,ithis] newtexcoords[,enext] <- newtexcoords[,enext] + thistexcoord newtexcoords[,eprev] <- newtexcoords[,eprev] + thistexcoord } if (!is.null(newnormals) || !is.null(newtexcoords)) { newcount[enext] <- newcount[enext] + 1 newcount[eprev] <- newcount[eprev] + 1 } } # Now central triangle outit[, (i-1)*4+4 ] <- c( em[edgeindex(ithis, inext, nv)], em[edgeindex(inext, iprev, nv)], em[edgeindex(iprev, ithis, nv)] ) } primout <- c(primout, "triangle") result$it <- outit } if (!is.null(newnormals) || !is.null(newtexcoords)) newcount <- newcount[1:vcnt] if (!is.null(newnormals)) newnormals <- newnormals[, 1:vcnt]/rep(newcount, each=3) if (!is.null(newtexcoords)) newtexcoords <- newtexcoords[, 1:vcnt]/rep(newcount, each=2) result$vb <- outvb[,1:vcnt] result$normals <- newnormals result$texcoords <- newtexcoords result$primitivetype <- primout return ( result ) } normalize.mesh3d <- function (mesh) { mesh$vb[1,] <- mesh$vb[1,]/mesh$vb[4,] mesh$vb[2,] <- mesh$vb[2,]/mesh$vb[4,] mesh$vb[3,] <- mesh$vb[3,]/mesh$vb[4,] mesh$vb[4,] <- 1 return (mesh) } deform.mesh3d <- function( mesh, vb=mesh$vb, ib=mesh$ib, it=mesh$it ) { nv <- dim(vb)[2] nq <- if (is.null(ib)) 0 else dim(ib)[2] nt <- if (is.null(it)) 0 else dim(it)[2] out <- matrix(0, nrow=4, ncol=nv ) if (nq) { for ( i in 1:nq ) { for (j in 1:4 ) { iprev <- ib[((j+2)%%4) + 1, i] ithis <- ib[j,i] inext <- ib[ (j%%4) + 1, i] out[ ,ithis ] <- out[ , ithis ] + vb[,iprev] + vb[,ithis] + vb[,inext] } } mesh$vb <- out } if (nt) { for ( i in 1:nt ) { for (j in 1:3 ) { iprev <- it[((j+1)%%3) + 1, i] ithis <- it[j,i] inext <- it[ (j%%3) + 1, i] out[ ,ithis ] <- out[ , ithis ] + vb[,iprev] + vb[,ithis] + vb[,inext] } } mesh$vb <- out } return(mesh) } subdivision3d.mesh3d <- function(x,depth=1,normalize=FALSE,deform=TRUE,...) { mesh <- x if (depth) { mesh <- divide.mesh3d(mesh) if (normalize) mesh <- normalize.mesh3d(mesh) if (deform) mesh <- deform.mesh3d(mesh) mesh<-subdivision3d.mesh3d(mesh,depth-1,normalize,deform) } return(mesh) } rgl/R/r3d.rgl.R0000644000176000001440000002075512262005640012673 0ustar ripleyusers# # R3D rendering functions - rgl implementation # $Id: r3d.rgl.R 987 2013-10-26 14:07:14Z murdoch $ # # Node Management getr3dDefaults <- function() tryCatch(get("r3dDefaults", envir=.GlobalEnv), error = function(e) r3dDefaults) clear3d <- function(type = c("shapes", "bboxdeco", "material"), defaults=getr3dDefaults()) { .check3d() rgl.clear( type ) type <- rgl.enum.nodetype(type) if ( 4 %in% type ) { # viewpoint do.call("par3d", defaults[c("FOV", "userMatrix")]) } if ( 5 %in% type ) { # material if (length(defaults$material)) do.call("material3d", defaults$material) } } pop3d <- function(...) {.check3d(); rgl.pop(...)} # Environment .material3d <- c("color", "alpha", "lit", "ambient", "specular", "emission", "shininess", "smooth", "front", "back", "size", "lwd", "fog", "point_antialias", "line_antialias", "texture", "textype", "texmipmap", "texminfilter", "texmagfilter", "texenvmap", "depth_mask", "depth_test") .material3d.writeOnly <- character(0) # This function expands a list of arguments by putting # all entries from Params (i.e. the current settings by default) # in place for any entries that are not listed. # Unrecognized args are left in place. .fixMaterialArgs <- function(..., Params = material3d()) { f <- function(...) list(...) formals(f) <- c(Params, formals(f)) names <- as.list(names(Params)) names(names) <- names names <- lapply(names, as.name) b <- as.list(body(f)) body(f) <- as.call(c(b[1], names, b[-1])) f(...) } material3d <- function (...) { args <- list(...) argnames <- names(args) if (!length(args)) argnames <- .material3d else { if (is.null(names(args)) && all(unlist(lapply(args, is.character)))) { argnames <- unlist(args) args <- NULL } if (length(args) == 1) { if (is.list(args[[1]]) | is.null(args[[1]])) { args <- args[[1]] argnames <- names(args) } } } value <- rgl.getmaterial()[argnames] if (length(args)) { args <- do.call(".fixMaterialArgs", args) do.call("rgl.material", args) return(invisible(value)) } else if (length(argnames) == 1) return(value[[1]]) else return(value) } bg3d <- function(...) { .check3d(); save <- material3d(); on.exit(material3d(save)) new <- .fixMaterialArgs(sphere = FALSE, fogtype = "none", color = c("black", "white"), back = "lines", Params = save) do.call("rgl.bg", .fixMaterialArgs(..., Params = new)) } light3d <- function(theta=0,phi=15,x=NULL, ...) { .check3d() if (is.null(x)) rgl.light(theta=theta,phi=phi,x=x, ...) else rgl.light(x=x, ...) } view3d <- function(theta=0,phi=15,...) { .check3d() rgl.viewpoint(theta=theta,phi=phi,...) } bbox3d <- function(xat = NULL, yat = NULL, zat = NULL, xunit = "pretty", yunit = "pretty", zunit = "pretty", expand = 1.03, nticks = 5, draw_front = FALSE, ...) { .check3d(); save <- material3d(); on.exit(material3d(save)) ranges <- .getRanges(expand = expand) do.call("rgl.bbox", c(list(xat=xat, yat=yat, zat=zat, xunit=xunit, yunit=yunit, zunit=zunit, expand=expand, nticks=nticks, draw_front=draw_front), .fixMaterialArgs(..., Params = save))) } # Shapes points3d <- function(x,y=NULL,z=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.points", c(list(x=x,y=y,z=z), .fixMaterialArgs(..., Params = save))) } lines3d <- function(x,y=NULL,z=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.linestrips", c(list(x=x,y=y,z=z), .fixMaterialArgs(..., Params = save))) } segments3d <- function(x,y=NULL,z=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.lines", c(list(x=x,y=y,z=z), .fixMaterialArgs(..., Params = save))) } triangles3d <- function(x,y=NULL,z=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.triangles", c(list(x=x,y=y,z=z), .fixMaterialArgs(..., Params = save))) } quads3d <- function(x,y=NULL,z=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.quads", c(list(x=x,y=y,z=z), .fixMaterialArgs(..., Params = save))) } text3d <- function(x,y=NULL,z=NULL,texts,adj=0.5,justify,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) new <- .fixMaterialArgs(..., Params = save) if (!missing(justify)) new <- c(list(justify=justify), new) do.call("rgl.texts", c(list(x=x,y=y,z=z,text=texts,adj=adj),new)) } texts3d <- text3d spheres3d <- function(x,y=NULL,z=NULL,radius=1,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.spheres", c(list(x=x,y=y,z=z,radius=radius), .fixMaterialArgs(..., Params = save))) } planes3d <- function(a,b=NULL,c=NULL,d=0,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.planes", c(list(a=a,b=b,c=c,d=d), .fixMaterialArgs(..., Params = save))) } clipplanes3d <- function(a,b=NULL,c=NULL,d=0) { .check3d() rgl.clipplanes(a=a,b=b,c=c,d=d) } abclines3d <- function(x,y=NULL,z=NULL,a,b=NULL,c=NULL,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.abclines", c(list(x=x,y=y,z=z,a=a,b=b,c=c), .fixMaterialArgs(..., Params = save))) } sprites3d <- function(x,y=NULL,z=NULL,radius=1,shapes=NULL,userMatrix,...) { .check3d(); save <- material3d(); on.exit(material3d(save)) if (missing(userMatrix)) { userMatrix <- getr3dDefaults()$userMatrix if (is.null(userMatrix)) userMatrix <- diag(4) } savepar <- par3d(skipRedraw=TRUE, ignoreExtent=TRUE) on.exit(par3d(savepar), add=TRUE) force(shapes) par3d(ignoreExtent=savepar$ignoreExtent) do.call("rgl.sprites", c(list(x=x,y=y,z=z,radius=radius,shapes=shapes, userMatrix=userMatrix), .fixMaterialArgs(..., Params = save))) } terrain3d <- function(x,y=NULL,z=NULL,...,normal_x=NULL,normal_y=NULL,normal_z=NULL) { .check3d(); save <- material3d(); on.exit(material3d(save)) do.call("rgl.surface", c(list(x=x,y=z,z=y,coords=c(1,3,2), normal_x=normal_x,normal_y=normal_z,normal_z=normal_y), .fixMaterialArgs(..., Params = save))) } surface3d <- terrain3d # Interaction select3d <- function(...) {.check3d(); rgl.select3d(...)} # 3D Generic Object Rendering Attributes dot3d <- function(x,...) UseMethod("dot3d") wire3d <- function(x,...) UseMethod("wire3d") shade3d <- function(x,...) UseMethod("shade3d") # 3D Generic transformation translate3d <- function(obj,x,y,z,...) UseMethod("translate3d") scale3d <- function(obj,x,y,z,...) UseMethod("scale3d") rotate3d <- function(obj,angle,x,y,z,matrix,...) UseMethod("rotate3d") transform3d <- function(obj,matrix,...) rotate3d(obj, matrix=matrix, ...) subdivision3d <- function(x,...) UseMethod("subdivision3d") # 3D Custom shapes particles3d <- function(x,y=NULL,z=NULL,radius=1,...) sprites3d( x=x,y=y,z=z,radius=radius, lit=FALSE,alpha=0.2, textype="alpha", texture=system.file("textures/particle.png",package="rgl"), ... ) # r3d default settings for new windows r3dDefaults <- list(userMatrix = rotationMatrix(290*pi/180, 1, 0, 0), mouseMode = c("trackball", "zoom", "fov"), FOV = 30, bg = list(color="white"), family = "sans", material = list(color="black", fog=FALSE)) open3d <- function(..., params = getr3dDefaults(), useNULL = rgl.useNULL() ) { args <- list(...) if (!is.null(args$antialias) || !is.null(args$antialias <- r3dDefaults$antialias)) { saveopt <- options(rgl.antialias = args$antialias) on.exit(options(saveopt)) args$antialias <- NULL } rgl.open(useNULL) if (!is.null(args$material)) { params$material <- do.call(.fixMaterialArgs, c(args$material, Params=list(params$material))) args$material <- NULL } params[names(args)] <- args clear3d("material", defaults = params) params$material <- NULL if (!is.null(params$bg)) { do.call("bg3d", params$bg) params$bg <- NULL } do.call("par3d", params) return(rgl.cur()) } .check3d <- function() { if (result<-rgl.cur()) return(result) else return(open3d()) } snapshot3d <- function(...) rgl.snapshot(...) rgl/R/enum.R0000644000176000001440000000414612235527163012371 0ustar ripleyusers# enumerations rgl.enum <- function ( name, ..., multi = FALSE) { choices <- list( ... ) names <- attr(choices,"names") if (multi) pos <- pmatch( name, c(names, "all") ) else pos <- pmatch( name, names ) max <- length(names) if ( any( is.na(pos) ) ) stop("symbolic value must be chosen from ", list(names) ) else if ( (max+1) %in% pos ) pos <- seq_along(names) id <- unlist(choices[pos]) if ( length(id) > 1 && !multi ) stop("multiple choices not allowed") return( id ) } rgl.enum.nodetype <- function (type) rgl.enum( type, shapes=1, lights=2, bboxdeco=3, viewpoint=4, material=5, background=6, multi = TRUE ) rgl.enum.attribtype <- function (attrib) rgl.enum( attrib, vertices=1, normals=2, colors=3, texcoords=4, dim=5, texts=6, cex=7, adj=8, radii=9, centers=10, ids=11, usermatrix=12, types=13, flags=14 ) rgl.enum.pixfmt <- function (fmt) rgl.enum( fmt, png=0 ) rgl.enum.polymode <- function (mode) rgl.enum( mode, filled=1, lines=2, points=3, culled=4) rgl.enum.textype <- function (textype) rgl.enum( textype, alpha=1, luminance=2, luminance.alpha=3, rgb=4, rgba=5 ) rgl.enum.fogtype <- function (fogtype) rgl.enum (fogtype, none=1, linear=2, exp=3, exp2=4) rgl.enum.primtype <- function (primtype) rgl.enum( primtype, points=1, lines=2, triangles=3, quadrangles=4, linestrips=5 ) rgl.enum.halign <- function( halign) rgl.enum (halign, left=-1, center=0, right=1 ) rgl.enum.texminfilter <- function (minfiltertype) rgl.enum (minfiltertype, nearest=0, linear=1, nearest.mipmap.nearest=2, nearest.mipmap.linear=3, linear.mipmap.nearest=4, linear.mipmap.linear=5) rgl.enum.texmagfilter <- function (magfiltertype) rgl.enum (magfiltertype, nearest=0, linear=1) rgl.enum.gl2ps <- function (postscripttype) rgl.enum (postscripttype, ps=0, eps=1, tex=2, pdf=3, svg=4, pgf=5) rgl.enum.pixelcomponent <- function(component) rgl.enum(component, red=0, green=1, blue=2, alpha=3, depth=4, luminance=5) rgl.enum.depthtest <- function(depthtest) rgl.enum(depthtest, never=0, less=1, equal=2, lequal=3, greater=4, notequal=5, gequal=6, always= 7)rgl/R/solids3d.R0000644000176000001440000000722311153473075013150 0ustar ripleyusers# # R 3d object : cube3d # cube3d.vb <- c( -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ) cube3d.ib <- c( 1, 3, 4, 2, 3, 7, 8, 4, 2, 4, 8, 6, 1, 5, 7, 3, 1, 2, 6, 5, 5, 6, 8, 7 ) cube3d <- function( trans = identityMatrix(), ... ) { return( rotate3d( qmesh3d( cube3d.vb, cube3d.ib, material=list(...) ), matrix = trans) ) } # # tetrahedron # tetra3d.vb <- c( -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0 ) tetra3d.it <- c( 1, 2, 3, 3, 2, 4, 4, 2, 1, 1, 3, 4 ) tetrahedron3d <- function( trans = identityMatrix(), ... ) { return( rotate3d( tmesh3d( tetra3d.vb, tetra3d.it, material=list(...) ), matrix = trans) ) } # # octahedron # octa3d.vb <- c( -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0 ) octa3d.it <- c( 1,5,3, 1,3,6, 1,4,5, 1,6,4, 2,3,5, 2,6,3, 2,5,4, 2,4,6 ) octahedron3d <- function( trans = identityMatrix(), ... ) { return( rotate3d( tmesh3d( octa3d.vb, octa3d.it, material=list(...) ), matrix = trans) ) } # # icosahedron # phi <- (1+sqrt(5))/2 ico3d.vb <- c( 0, 1/phi, 1, 1, 0, 1/phi, -1, 1, 0, -1/phi, 1, 1, 0, -1/phi,-1, 1, 1/phi, 1, 0, 1, 1/phi, -1, 0, 1, -1/phi, 1, 0, 1, -1/phi, -1, 0, 1, 1, 0, 1/phi, 1, -1, 0, 1/phi, 1, 1, 0, -1/phi, 1, -1, 0, -1/phi, 1 ) ico3d.it <- c( 1, 3, 9, 1, 9, 5, 1, 5, 7, 1, 7, 10, 1, 10, 3, 4, 12, 2, 4, 2, 11, 4, 11, 6, 4, 6, 8, 4, 8, 12, 9, 3, 6, 5, 9, 11, 7, 5, 2, 10, 7, 12, 3, 10, 8, 2, 12, 7, 11, 2, 5, 6, 11, 9, 8, 6, 3, 12, 8, 10) icosahedron3d <- function( trans = identityMatrix(), ... ) { return( rotate3d( tmesh3d( ico3d.vb, ico3d.it, material=list(...) ), matrix = trans) ) } dodec3d.vb <- c( -1/phi, -1/phi, -1/phi, 1, 1/phi, -1/phi, -1/phi, 1, -1/phi, 1/phi, -1/phi, 1, 1/phi, 1/phi, -1/phi, 1, -1/phi, -1/phi, 1/phi, 1, 1/phi, -1/phi, 1/phi, 1, -1/phi, 1/phi, 1/phi, 1, 1/phi, 1/phi, 1/phi, 1, 0, -1/phi^2, 1, 1, 0, 1/phi^2, 1, 1, 0, -1/phi^2,-1, 1, 0, 1/phi^2,-1, 1, -1/phi^2, 1, 0, 1, 1/phi^2, 1, 0, 1, -1/phi^2,-1, 0, 1, 1/phi^2,-1, 0, 1, 1, 0,-1/phi^2, 1, 1, 0, 1/phi^2, 1, -1, 0,-1/phi^2, 1, -1, 0, 1/phi^2, 1 ) dodec3d.if <- c( 1, 11, 2, 16, 15, 1, 15, 5, 20, 19, 1, 19, 3, 12, 11, 2, 11, 12, 4, 17, 2, 17, 18, 6, 16, 3, 13, 14, 4, 12, 3, 19, 20, 7, 13, 4, 14, 8, 18, 17, 5, 9, 10, 7, 20, 5, 15, 16, 6, 9, 6, 18, 8,10, 9, 7, 10, 8,14, 13) dodecahedron3d <- function( trans = identityMatrix(), ...) { m <- matrix(dodec3d.if, 5, 12) return( rotate3d( tmesh3d( dodec3d.vb, c(m[c(1,2,3, 1,3,4, 1,4,5),]), material=list(...) ), matrix=trans) ) } cuboct3d.vb <- c( -1, -1, 0, 1, -1, 1, 0, 1, 1, -1, 0, 1, 1, 1, 0, 1, -1, 0,-1, 1, -1, 0, 1, 1, 1, 0,-1, 1, 1, 0, 1, 1, 0, -1,-1, 1, 0, -1, 1, 1, 0, 1,-1, 1, 0, 1, 1, 1) cuboct3d.ib <- c( 1, 6, 2, 5, 1, 9, 3, 10, 2, 12,4, 11, 3, 7, 4, 8, 5, 11, 7, 9, 6, 10, 8, 12) cuboct3d.it <- c( 1, 5, 9, 1, 10, 6, 2, 11, 5, 2, 6, 12, 3, 9, 7, 3, 8, 10, 4, 7, 11, 4, 12, 8) cuboctahedron3d <- function( trans = identityMatrix(), ...) { result <- rotate3d( qmesh3d( cuboct3d.vb, cuboct3d.ib, material=list(...) ), matrix = trans) result$it <- matrix(cuboct3d.it, nrow=3) result } rgl/R/ply.R0000644000176000001440000002456512207405272012233 0ustar ripleyuserswritePLY <- function(con, format=c("little_endian", "big_endian", "ascii"), pointRadius=0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, pointsAsEdges = FALSE, linesAsEdges = pointsAsEdges, withColors = TRUE, withNormals = !(pointsAsEdges || linesAsEdges), ids = NULL) { writeData <- function() { ident <- paste(filename, " produced by RGL\n") cat("ply\n", file=con) fmt <- switch(format, little_endian = "binary_little_endian", big_endian = "binary_big_endian", ascii = "ascii") cat("format", fmt, "1.0\n", file=con) cat("element vertex", nrow(Vertices), "\n", file=con) cat("property float x property float y property float z\n", file=con) if (withColors) cat("property float red property float green property float blue property float alpha\n", file=con) if (withNormals) cat("property float nx property float ny property float nz\n", file=con) cat("element face", nrow(Triangles)+nrow(Quads), "\n", file=con) cat("property list int int vertex_indices\n", file=con) if (nrow(Edges) > 0) { cat("element edge", nrow(Edges), "\n", file=con) cat("property int vertex1 property int vertex2\n", file=con) } cat("end_header\n", file=con) if (format == "ascii") { for (i in seq_len(nrow(Vertices))) cat(Vertices[i,], "\n", file=con) for (i in seq_len(nrow(Triangles))) cat("3", Triangles[i,], "\n", file=con) for (i in seq_len(nrow(Quads))) cat("4", Quads[i,], "\n", file=con) for (i in seq_len(nrow(Edges))) cat(Edges[i,], "\n", file=con) } else { endian <- if (format == "little_endian") "little" else "big" if (nrow(Vertices)) writeBin(as.numeric(t(Vertices)), con, size=4, endian=endian) if (nrow(Triangles)) writeBin(as.integer(t(cbind(3L, Triangles))), con, size=4, endian=endian) if (nrow(Quads)) writeBin(as.integer(t(cbind(4L, Quads))), con, size=4, endian=endian) if (nrow(Edges)) writeBin(as.integer(t(Edges)), con, size=4, endian=endian) } } Vertices <- matrix(0, 0, 3 + 4*withColors + 3*withNormals) Triangles <- matrix(1L, 0, 3) Quads <- matrix(1L, 0, 4) Edges <- matrix(1L, 0, 2) getVertices <- function(id) { vertices <- rgl.attrib(id, "vertices") if (withColors) { colors <- rgl.attrib(id, "colors") if (nrow(colors) == 1) colors <- colors[rep(1, nrow(vertices)),] } if (withNormals) { normals <- rgl.attrib(id, "normals") if (!nrow(normals)) normals <- 0*vertices } cbind(vertices, if (withColors) 255*colors, if (withNormals) normals) } writeTriangles <- function(id) { vertices <- getVertices(id) n <- nrow(vertices) base <- nrow(Vertices) Vertices <<- rbind(Vertices, vertices) Triangles <<- rbind(Triangles, matrix(base + seq_len(n) - 1, ncol=3, byrow=TRUE)) } writeQuads <- function(id) { vertices <- getVertices(id) n <- nrow(vertices) base <- nrow(Vertices) Vertices <<- rbind(Vertices, vertices) Quads <<- rbind(Quads, matrix(base + seq_len(n) - 1, ncol=4, byrow=TRUE)) } writeSurface <- function(id) { vertices <- getVertices(id) dims <- rgl.attrib(id, "dim") nx <- dims[1] nz <- dims[2] base <- nrow(Vertices) Vertices <<- rbind(Vertices, vertices) rows <- seq_len(nx) for (i in seq_len(nz)[-nz]) Triangles <<- rbind(Triangles, matrix(base + (i-1)*nx + c(rows[-nx],rows[-nx], rows[-1]+nx,rows[-nx]+nx, rows[-1],rows[-1]+nx) - 1, ncol=3)) } writeMesh <- function(mesh, scale=1, offset=c(0,0,0)) { vertices <- asEuclidean(t(mesh$vb))*scale vertices <- vertices + rep(offset, each=nrow(vertices)) if (withColors) { colors <- mesh$material$col if (!length(colors)) colors <- material3d("color") colors <- rep(colors, length=nrow(vertices)) colors <- t(col2rgb(colors, alpha=TRUE)) } if (withNormals) normals <- asEuclidean(t(mesh$normals)) base <- nrow(Vertices) Vertices <<- rbind(Vertices, cbind(vertices, if (withColors) colors, if (withNormals) normals)) nt <- length(mesh$it)/3 nq <- length(mesh$ib)/4 if (nt) Triangles <<- rbind(Triangles, t(mesh$it) - 1 + base) if (nq) Quads <<- rbind(Quads, t(mesh$ib) - 1 + base) } writeSpheres <- function(id) { vertices <- rgl.attrib(id, "vertices") n <- nrow(vertices) colors <- rgl.attrib(id, "colors") if (nrow(colors) == 1) colors <- colors[rep(1, n),] radii <- rgl.attrib(id, "radii") radii <- rep(radii, length.out=n) x <- subdivision3d(icosahedron3d(),3) r <- sqrt(x$vb[1,]^2 + x$vb[2,]^2 + x$vb[3,]^2) x$vb[4,] <- r x$normals <- x$vb for (i in seq_len(n)) { col <- colors[i,] x$material$col <- rgb(col[1], col[2], col[3], col[4], maxColorValue = 255) writeMesh(x, radii[i], vertices[i,]) } } avgScale <- function() { bbox <- par3d("bbox") ranges <- c(bbox[2]-bbox[1], bbox[4]-bbox[3], bbox[6]-bbox[5]) if (prod(ranges) == 0) 1 else exp(mean(log(ranges))) } writePoints <- function(id) { vertices <- getVertices(id) n <- nrow(vertices) if (pointsAsEdges) { if (withNormals) normals <- 0*vertices base <- nrow(Vertices) Vertices <<- rbind(Vertices, cbind(vertices, if (withColors) colors, if (withNormals) normals)) Edges <<- rbind(Edges, base + cbind(1:n, 1:n) - 1 ) } else { radius <- pointRadius*avgScale() if (withNormals && is.null(pointShape$normals)) pointShape <- addNormals(pointShape) for (i in seq_len(n)) { if (withColors) { col <- vertices[i,4:7] pointShape$material$col <- rgb(col[1], col[2], col[3], col[4], maxColorValue = 255) } writeMesh(pointShape, radius, vertices[i,1:3]) } } } writeSegments <- function(id) { vertices <- getVertices(id) if (withColors) { colors <- vertices[, 4:7, drop=FALSE] vertices <- vertices[, 1:3, drop=FALSE] } n <- nrow(vertices) n <- n/2 if (linesAsEdges) { base <- nrow(Vertices) Vertices <<- rbind(Vertices, vertices) Edges <<- rbind(Edges, base + cbind(2*(1:n) - 2, 2*(1:n) - 1) ) } else { radius <- lineRadius*avgScale() for (i in seq_len(n)) { cyl <- cylinder3d( vertices[(2*i-1):(2*i),1:3], radius = radius, sides = lineSides, closed = -2 ) if (withColors) { col1 <- colors[2*i-1,] col1 <- rgb(col1[1], col1[2], col1[3], col1[4], maxColorValue = 255) col2 <- colors[2*i,] col2 <- rgb(col2[1], col2[2], col2[3], col2[4], maxColorValue = 255) cyl$material$col <- c(rep(col1, lineSides), rep(col2, lineSides), col1, col2) } if (withNormals) cyl <- addNormals(cyl) writeMesh(cyl) } } } writeLines <- function(id) { vertices <- getVertices(id) if (linesAsEdges) { n <- nrow(vertices) base <- nrow(Vertices) Vertices <<- rbind(Vertices, vertices) Edges <<- rbind(Edges, base + cbind(1:(n-1), 2:n) - 1) } else { n <- nrow(vertices) - 1 radius <- lineRadius*avgScale() for (i in seq_len(n)) { cyl <- cylinder3d( vertices[i:(i+1),1:3], radius = radius, sides = lineSides, closed = -2 ) if (withColors) { colors <- vertices[i, 4:7] col1 <- colors[i,] col1 <- rgb(col1[1], col1[2], col1[3], col1[4], maxColorValue = 255) col2 <- colors[i+1,] col2 <- rgb(col2[1], col2[2], col2[3], col2[4], maxColorValue = 255) cyl$material$col <- c(rep(col1, lineSides), rep(col2, lineSides), col1, col2) } if (withNormals) cyl <- addNormals(cyl) writeMesh(cyl) } } } knowntypes <- c("triangles", "quads", "surface", "spheres", "linestrip", "lines", "planes", "points") # Execution starts here! format <- match.arg(format) if (is.character(con)) { con <- file(con, if (format=="ascii") "w" else "wb") on.exit(close(con)) } filename <- summary(con)$description if (NROW(bbox <- rgl.ids("bboxdeco")) && (is.null(ids) || bbox$id %in% ids)) { ids <- setdiff(ids, bbox$id) save <- par3d(skipRedraw = TRUE) bbox <- convertBBox(bbox$id) on.exit({ rgl.pop(id=bbox); par3d(save) }, add=TRUE) dobbox <- TRUE } else dobbox <- FALSE if (is.null(ids)) { ids <- rgl.ids() types <- as.character(ids$type) ids <- ids$id } else { if (dobbox) ids <- c(ids, bbox) allids <- rgl.ids() ind <- match(ids, allids$id) keep <- !is.na(ind) if (any(!keep)) warning("object(s) with id ", paste(ids[!keep], collapse=" "), " not found") ids <- ids[keep] types <- allids$type[ind[keep]] } unknowntypes <- setdiff(types, knowntypes) if (length(unknowntypes)) warning("Object type(s) ", paste("'", unknowntypes, "'", sep="", collapse=", "), " not handled.") keep <- types %in% knowntypes ids <- ids[keep] types <- types[keep] for (i in seq_along(ids)) switch(types[i], planes =, triangles = writeTriangles(ids[i]), quads = writeQuads(ids[i]), surface = writeSurface(ids[i]), spheres = writeSpheres(ids[i]), points = writePoints(ids[i]), lines = writeSegments(ids[i]), linestrip = writeLines(ids[i]) ) writeData() invisible(filename) } rgl/R/axes.R0000644000176000001440000001574512043607317012371 0ustar ripleyusers# This internal function returns a list with the following components: # xlim, ylim, zlim: the bounding box expanded so no coordinate has zero or negative extent # strut: a boolean indicating whether an expansion was done above # x, y, z: the box above expanded by a factor of expand .getRanges <- function(expand = 1.03, ranges=par3d('bbox')) { ranges <- list(xlim=ranges[1:2], ylim=ranges[3:4], zlim=ranges[5:6]) strut <- FALSE ranges <- lapply(ranges, function(r) { d <- diff(r) if (d > 0) return(r) strut <<- TRUE if (d < 0) return(c(0,1)) else if (r[1] == 0) return(c(-1, 1)) else return(r[1] + 0.4*abs(r[1])*c(-1,1)) }) ranges$strut <- strut ranges$x <- (ranges$xlim - mean(ranges$xlim))*expand + mean(ranges$xlim) ranges$y <- (ranges$ylim - mean(ranges$ylim))*expand + mean(ranges$ylim) ranges$z <- (ranges$zlim - mean(ranges$zlim))*expand + mean(ranges$zlim) ranges } axis3d <- function (edge, at = NULL, labels = TRUE, tick = TRUE, line = 0, pos = NULL, nticks = 5, ...) { save <- par3d(skipRedraw = TRUE, ignoreExtent = TRUE) on.exit(par3d(save)) ranges <- .getRanges() edge <- c(strsplit(edge, '')[[1]], '-', '-')[1:3] coord <- match(toupper(edge[1]), c('X', 'Y', 'Z')) # Put the sign in the appropriate entry of edge if (coord == 2) edge[1] <- edge[2] else if (coord == 3) edge[1:2] <- edge[2:3] range <- ranges[[coord]] if (is.null(at)) { at <- pretty(range, nticks) at <- at[at >= range[1] & at <= range[2]] } if (is.logical(labels)) { if (labels) labels <- format(at) else labels <- NA } mpos <- matrix(NA,3,length(at)) if (edge[1] == '+') mpos[1,] <- ranges$x[2] else mpos[1,] <- ranges$x[1] if (edge[2] == '+') mpos[2,] <- ranges$y[2] else mpos[2,] <- ranges$y[1] if (edge[3] == '+') mpos[3,] <- ranges$z[2] else mpos[3,] <- ranges$z[1] ticksize <- 0.05*(mpos[,1]-c(mean(ranges$x),mean(ranges$y),mean(ranges$z))) ticksize[coord] <- 0 if (!is.null(pos)) mpos <- matrix(pos,3,length(at)) mpos[coord,] <- at x <- c(mpos[1,1],mpos[1,length(at)]) y <- c(mpos[2,1],mpos[2,length(at)]) z <- c(mpos[3,1],mpos[3,length(at)]) if (tick) { x <- c(x,as.double(rbind(mpos[1,],mpos[1,]+ticksize[1]))) y <- c(y,as.double(rbind(mpos[2,],mpos[2,]+ticksize[2]))) z <- c(z,as.double(rbind(mpos[3,],mpos[3,]+ticksize[3]))) } result <- c(ticks=segments3d(x,y,z,...)) if (!all(is.na(labels))) result <- c(result, labels=text3d(mpos[1,]+3*ticksize[1], mpos[2,]+3*ticksize[2], mpos[3,]+3*ticksize[3], labels, ...)) invisible(result) } axes3d <- function(edges='bbox', labels=TRUE, tick=TRUE, nticks = 5, box = FALSE, expand = 1.03, ...) { save <- par3d(skipRedraw = TRUE, ignoreExtent = TRUE) on.exit(par3d(save)) if (identical(edges, 'bbox')) { result <- do.call('bbox3d', c(list(nticks=nticks, draw_front=box, expand=expand), .fixMaterialArgs(..., Params = list(front='lines', back='lines')))) } else { result <- numeric(0) for (e in edges) result <- c(result, axis3d(e,labels=labels,tick=tick,nticks=nticks, ...)) names(result) <- e } invisible(result) } box3d <- function(...) { save <- par3d(ignoreExtent = TRUE) on.exit(par3d(save)) result <- numeric(0) ranges <- .getRanges() if (ranges$strut) { par3d(ignoreExtent = FALSE) result <- c(result, strut=segments3d(rep(ranges$xlim, c(2,2)), rep(ranges$ylim, c(2,2)), rep(ranges$zlim, c(2,2)))) par3d(ignoreExtent = TRUE) } x <- c(rep(ranges$x[1],8),rep(ranges$x,4),rep(ranges$x[2],8)) y <- c(rep(ranges$y,2),rep(ranges$y,c(2,2)),rep(ranges$y,c(4,4)), rep(ranges$y,2),rep(ranges$y,c(2,2))) z <- c(rep(ranges$z,c(2,2)),rep(ranges$z,2),rep(rep(ranges$z,c(2,2)),2), rep(ranges$z,c(2,2)),rep(ranges$z,2)) invisible(c(result, lines=segments3d(x,y,z,...))) } mtext3d <- function(text, edge, line = 0, at = NULL, pos = NA, ...) { save <- par3d(ignoreExtent = TRUE) on.exit(par3d(save)) ranges <- .getRanges() edge <- c(strsplit(edge, '')[[1]], '-', '-')[1:3] coord <- match(toupper(edge[1]), c('X', 'Y', 'Z')) # Put the sign in the appropriate entry of edge if (coord == 2) edge[1] <- edge[2] else if (coord == 3) edge[1:2] <- edge[2:3] range <- ranges[[coord]] if (is.null(at)) at <- mean(range) newlen <- max(length(text),length(line),length(at)) text <- rep(text, len = newlen) line <- rep(line, len = newlen) at <- rep(at, len = newlen) if (all(is.na(pos))) { pos <- matrix(NA,3,length(at)) if (edge[1] == '+') pos[1,] <- ranges$x[2] else pos[1,] <- ranges$x[1] if (edge[2] == '+') pos[2,] <- ranges$y[2] else pos[2,] <- ranges$y[1] if (edge[3] == '+') pos[3,] <- ranges$z[2] else pos[3,] <- ranges$z[1] } else pos <- matrix(pos,3,length(at)) pos[coord,] <- at ticksize <- 0.05*(pos[,1]-c(mean(ranges$x),mean(ranges$y),mean(ranges$z))) ticksize[coord] <- 0 invisible(text3d(pos[1,]+3*ticksize[1]*line, pos[2,]+3*ticksize[2]*line, pos[3,]+3*ticksize[3]*line, text, ...)) } title3d <- function (main = NULL, sub = NULL, xlab = NULL, ylab = NULL, zlab = NULL, line = NA, ...) { save <- par3d(skipRedraw = TRUE, ignoreExtent = TRUE) on.exit(par3d(save)) result <- numeric(0) if (!is.null(main)) { aline <- ifelse(is.na(line), 2, line) result <- c(result, main=mtext3d(main, 'x++', line = aline, ...)) } if (!is.null(sub)) { aline <- ifelse(is.na(line), 3, line) result <- c(result, sub=mtext3d(sub, 'x', line = aline, ...)) } if (!is.null(xlab)) { aline <- ifelse(is.na(line), 2, line) result <- c(result, xlab=mtext3d(xlab, 'x', line = aline, ...)) } if (!is.null(ylab)) { aline <- ifelse(is.na(line), 2, line) result <- c(result, ylab=mtext3d(ylab, 'y', line = aline, ...)) } if (!is.null(zlab)) { aline <- ifelse(is.na(line), 2, line) result <- c(result, zlab=mtext3d(zlab, 'z', line = aline, ...)) } invisible(result) } rgl/R/callbacks.R0000644000176000001440000000024611064454445013342 0ustar ripleyusersrgl.setMouseCallbacks <- function(button, begin=NULL, update=NULL, end=NULL) { invisible(.Call(rgl_setMouseCallbacks, as.integer(button), begin, update, end)) } rgl/R/identify3d.R0000644000176000001440000000427312141445670013466 0ustar ripleyusersidentify3d <- function(x, y = NULL, z = NULL, labels = seq_along(x), n = length(x), plot = TRUE, adj = c(-0.1, 0.5), tolerance = 20, buttons = c("right", "middle")) { cat <- function(...) { base::cat(...) flush.console() } opar <- par3d("mouseMode") odisp <- rgl.cur() on.exit( { disp <- rgl.cur() if (odisp != disp) try(rgl.set(odisp), silent=TRUE) if (rgl.cur() == odisp) par3d(mouseMode = opar) try(rgl.set(disp), silent=TRUE) } ) xyz <- xyz.coords(x, y, z) x <- xyz$x y <- xyz$y z <- xyz$z if (length(x)==0) return(numeric()) force(labels) force(adj) buttons <- match.arg(buttons, c("left", "right", "middle"), several.ok = TRUE) cat("Use the", buttons[1], "button to select") if (length(buttons) > 1) cat(", the", buttons[2], "button to quit") cat(".\n") buttons <- c(left=1, right=2, middle=3)[buttons] selected <- c() select <- function(mousex, mousey) { disp <- rgl.cur() if (disp != odisp) { rgl.set(odisp) on.exit(rgl.set(disp)) } viewport <- par3d("viewport") winxyz <- rgl.user2window(xyz) winxyz[,1] <- winxyz[,1]*viewport[3] winxyz[,2] <- (1-winxyz[,2])*viewport[4] dist <- sqrt( (mousex-winxyz[,1])^2 + (mousey - winxyz[,2])^2 ) dist[winxyz[,3] < 0 | winxyz[,3] > 1] <- Inf sel <- which.min(dist) if (dist[sel] > tolerance) cat("warning: no point within tolerance\n") else if (sel %in% selected) cat("warning: nearest point already identified\n") else { selected <<- c(selected, sel) if (plot) text3d(x[sel], y[sel], z[sel], texts=labels[sel], adj=adj) } } doquit <- FALSE quit <- function(mousex, mousey) { doquit <<- TRUE } rgl.setMouseCallbacks(buttons[1], begin=select) if (length(buttons) > 1) rgl.setMouseCallbacks(buttons[2], begin=quit) while(!doquit && length(selected) < n) Sys.sleep(0.2) selected } rgl/R/material.R0000644000176000001440000001106112262005310013176 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: material.R 970 2013-09-16 01:18:23Z murdoch $ ## ## ## ===[ SECTION: generic appearance function ]================================ ## rgl.material <- function ( color = c("white"), alpha = c(1.0), lit = TRUE, ambient = "black", specular = "white", emission = "black", shininess = 50.0, smooth = TRUE, texture = NULL, textype = "rgb", texmipmap = FALSE, texminfilter = "linear", texmagfilter = "linear", texenvmap = FALSE, front = "fill", back = "fill", size = 3.0, lwd = 1.0, fog = TRUE, point_antialias = FALSE, line_antialias = FALSE, depth_mask = TRUE, depth_test = "less", ... ) { # solid or diffuse component color <- rgl.mcolor(color) if (length(color) < 1) stop("there must be at least one color") # light properties ambient <- rgl.color(ambient) specular <- rgl.color(specular) emission <- rgl.color(emission) # others rgl.bool(lit) rgl.bool(fog) rgl.bool(smooth) rgl.bool(point_antialias) rgl.bool(line_antialias) rgl.bool(depth_mask) rgl.clamp(shininess,0,128) rgl.numeric(size) rgl.numeric(lwd) depth_test <- rgl.enum.depthtest(depth_test) # side-dependant rendering front <- rgl.enum.polymode(front) back <- rgl.enum.polymode(back) # texture mapping rgl.bool(texmipmap) if (length(texture) > 1) stop("texture should be a single character string or NULL") if (is.null(texture)) texture <- "" textype <- rgl.enum.textype( textype ) texminfilter <- rgl.enum.texminfilter( texminfilter ) texmagfilter <- rgl.enum.texmagfilter( texmagfilter ) rgl.bool(texenvmap) # vector length ncolor <- dim(color)[2] nalpha <- length(alpha) # pack data idata <- as.integer( c( ncolor, lit, smooth, front, back, fog, textype, texmipmap, texminfilter, texmagfilter, nalpha, ambient, specular, emission, texenvmap, point_antialias, line_antialias, depth_mask, depth_test, color) ) cdata <- as.character(c( texture )) ddata <- as.numeric(c( shininess, size, lwd, alpha )) ret <- .C( rgl_material, success = FALSE, idata, cdata, ddata ) } rgl.getcolorcount <- function() .C( rgl_getcolorcount, count=integer(1) )$count rgl.getmaterial <- function(ncolors, id = NULL) { if (!length(id)) id <- 0L if (missing(ncolors)) ncolors <- if (id) rgl.attrib.count(id, "colors") else rgl.getcolorcount() idata <- rep(0, 25+3*ncolors) idata[1] <- ncolors idata[11] <- ncolors cdata <- paste(rep(" ", 512), collapse="") ddata <- rep(0, 3+ncolors) ret <- .C( rgl_getmaterial, success = FALSE, id = as.integer(id), idata = as.integer(idata), cdata = cdata, ddata = as.numeric(ddata) ) if (!ret$success) stop('rgl.getmaterial') polymodes <- c("filled", "lines", "points", "culled") textypes <- c("alpha", "luminance", "luminance.alpha", "rgb", "rgba") minfilters <- c("nearest", "linear", "nearest.mipmap.nearest", "nearest.mipmap.linear", "linear.mipmap.nearest", "linear.mipmap.linear") magfilters <- c("nearest", "linear") depthtests <- c("never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always") idata <- ret$idata ddata <- ret$ddata cdata <- ret$cdata list(color = rgb(idata[23 + 3*(1:idata[1])], idata[24 + 3*(1:idata[1])], idata[25 + 3*(1:idata[1])], maxColorValue = 255), alpha = if (idata[11]) ddata[seq(from=4, length=idata[11])] else 1, lit = idata[2] > 0, ambient = rgb(idata[12], idata[13], idata[14], maxColorValue = 255), specular = rgb(idata[15], idata[16], idata[17], maxColorValue = 255), emission = rgb(idata[18], idata[19], idata[20], maxColorValue = 255), shininess = ddata[1], smooth = idata[3] > 0, texture = if (cdata == "") NULL else cdata, textype = textypes[idata[7]], texmipmap = idata[8] == 1, texminfilter = minfilters[idata[9] + 1], texmagfilter = magfilters[idata[10] + 1], texenvmap = idata[21] == 1, front = polymodes[idata[4]], back = polymodes[idata[5]], size = ddata[2], lwd = ddata[3], fog = idata[6] > 0, point_antialias = idata[22] == 1, line_antialias = idata[23] == 1, depth_mask = idata[24] == 1, depth_test = depthtests[idata[25] + 1] ) } rgl/R/device.R0000644000176000001440000001166712171634317012671 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: device.R 947 2013-07-18 00:36:47Z murdoch $ ## ## ## ===[ SECTION: device management ]========================================== ## rgl.useNULL <- function() { opt <- getOption("rgl.useNULL", Sys.getenv("RGL_USE_NULL")) if (is.logical(opt)) return(opt) opt <- as.character(opt) if (!nchar(opt)) return(FALSE) opt <- pmatch(tolower(opt), c("yes", "true"), nomatch=3) c(TRUE, TRUE, FALSE)[opt] } ## ## open device ## ## rgl.open <- function(useNULL = rgl.useNULL()) { ret <- .C( rgl_dev_open, success=FALSE, useNULL=useNULL ) if (! ret$success) stop("rgl.open failed") } ## ## close device ## ## rgl.close <- function() { if (length(hook <- getHook("on.rgl.close"))) { if (is.list(hook)) hook <- hook[[1]] # test is for compatibility with R < 3.0.0 hook() } ret <- .C( rgl_dev_close, success=FALSE ) if (! ret$success) stop("no device opened.") } ## ## get current device ## ## rgl.cur <- function() { .Call( rgl_dev_getcurrent ) } ## ## get all devices ## ## rgl.dev.list <- function() { .Call( rgl_dev_list ) } ## ## set current device ## ## rgl.set <- function(which, silent = FALSE) { idata <- c( as.integer(which), as.integer(silent) ) ret <- .C( rgl_dev_setcurrent, success=FALSE, idata ) if (! ret$success) stop("no device opened with id", which) } ## ## export image ## ## rgl.snapshot <- function( filename, fmt="png", top=TRUE ) { if (top) rgl.bringtotop() idata <- as.integer(rgl.enum.pixfmt(fmt)) ret <- .C( rgl_snapshot, success=FALSE, idata, as.character(filename) ) if (! ret$success) warning("snapshot failed") } ## ## export postscript image ## ## rgl.postscript <- function( filename, fmt="eps", drawText=TRUE ) { idata <- as.integer(c(rgl.enum.gl2ps(fmt), as.logical(drawText))) ret <- .C( rgl_postscript, success=FALSE, idata, as.character(filename) ) if (! ret$success) warning("postscript conversion failed") } ## ## read image ## ## rgl.pixels <- function(component = c("red", "green", "blue"), viewport = par3d("viewport"), top=TRUE ) { if (top) rgl.bringtotop() compnum <- as.integer(sapply(component, rgl.enum.pixelcomponent)) stopifnot(length(viewport) == 4) ll <- as.integer(viewport[1:2]) size <- as.integer(viewport[3:4]) result <- array(NA_real_, dim=c(size[1], size[2], length(component))) dimnames(result) <- list(NULL, NULL, component) for (i in seq_along(compnum)) { ret <- .C( rgl_pixels, success=FALSE, ll, size, compnum[i], values = single(size[1]*size[2])) if (! ret$success) warning("Error reading component ", component[i]) result[,,i] <- ret$values } if (length(component) > 1) return(result) else return(result[,,1]) } ## ## Sweave device ## ## rgl.Sweave <- function(name, width, height, options, ...) { # The 2.13.0 release called dev.off(), not rgl.Sweave.off() if (getRversion() == "2.13.0" && version$status == "") { postscript(tempfile()) # make dev.off() happy if (length(getHook("on.rgl.close"))) rgl.Sweave.off() # to close the previous chunk } if (length(hook <- getHook("on.rgl.close"))) { if (is.list(hook)) hook <- hook[[1]] # test is for compatibility with R < 3.0.0 dev <- environment(hook)$dev rgl.set(dev) } else { wr <- c(0, 0, width*options$resolution, height*options$resolution) open3d(windowRect=wr) if (is.null(delay <- options$delay)) delay <- 0.1 Sys.sleep(as.numeric(delay)) wrnew <- par3d("windowRect") if (wr[3] - wr[1] != wrnew[3] - wrnew[1] || wr[4] - wr[2] != wrnew[4] - wrnew[2]) stop("rgl window creation error. Try reducing resolution, width or height.") dev <- rgl.cur() } snapshotDone <- FALSE stayOpen <- isTRUE(options$stayopen) type <- options$outputtype if (is.null(type)) type <- "png" setHook("on.rgl.close", action="replace", function(remove=TRUE) { prev.dev <- rgl.cur() on.exit(rgl.set(prev.dev)) if (!snapshotDone) { rgl.set(dev) switch(type, png = rgl.snapshot(filename=paste(name, "png", sep=".")), pdf = rgl.postscript(filename=paste(name, "pdf", sep="."), fmt="pdf"), eps = rgl.postscript(filename=paste(name, "eps", sep="."), fmt="eps"), stop("Unrecognized rgl outputtype: ", type) ) snapshotDone <<- TRUE } if (remove) setHook("on.rgl.close", action="replace", NULL) }) } rgl.Sweave.off <- function() { if (length(hook <- getHook("on.rgl.close"))) { if (is.list(hook)) hook <- hook[[1]] # test is for R pre-3.0.0 compatibility stayOpen <- environment(hook)$stayOpen if (stayOpen) hook(FALSE) else rgl.close() } } ## ## Sweave snapshot ## ## Sweave.snapshot <- function() { if (length(hook <- getHook("on.rgl.close"))) { if (is.list(hook)) hook <- hook[[1]] # test is for R pre-3.0.0 compatibility hook(remove = FALSE) } } rgl/R/zzz.R0000644000176000001440000000432312262005310012240 0ustar ripleyusers## ## R source file ## This file is part of rgl ## ## $Id: zzz.R 979 2013-10-06 14:54:36Z murdoch $ ## ## ## ===[ SECTION: package entry/exit point ]=================================== ## ## ## entry-point ## ## .onLoad <- function(lib, pkg) { # OS-specific initValue <- 0 onlyNULL <- rgl.useNULL() if ( .Platform$OS.type == "unix" ) { unixos <- system("uname",intern=TRUE) if ( unixos == "Darwin" ) { # For MacOS X we have to remove /usr/X11R6/lib from the DYLD_LIBRARY_PATH # because it would override Apple's OpenGL framework Sys.setenv("DYLD_LIBRARY_PATH"=gsub("/usr/X11R6/lib","",Sys.getenv("DYLD_LIBRARY_PATH"))) if ( .Platform$GUI == "AQUA" && file.exists(system.file("libs",.Platform$r_arch, "aglrgl.so", lib.loc=lib, package = pkg))) { initValue <- 1 } } } if ( .Platform$OS.type == "windows" && !onlyNULL) { frame <- getWindowsHandle("Frame") ## getWindowsHandle was numeric pre-2.6.0 if ( !is.null(frame) ) initValue <- getWindowsHandle("Console") } if (onlyNULL) { rglFonts(serif = rep("serif", 4), sans = rep("sans", 4), mono = rep("mono", 4), symbol = rep("symbol", 4)) } else if ( .Platform$OS.type == "windows" ) { rglFonts(serif = rglFont(c("times.ttf", "timesbd.ttf", "timesi.ttf", "timesbi.ttf")), sans = rglFont(c("arial.ttf", "arialbd.ttf", "ariali.ttf", "arialbi.ttf")), mono = rglFont(c("cour.ttf", "courbd.ttf", "couri.ttf", "courbi.ttf")), symbol = rglFont(rep("symbol.ttf", 4))) } else { rglFonts(serif = rep(system.file("fonts/FreeSerif.ttf", package="rgl"), 4), sans = rep(system.file("fonts/FreeSans.ttf", package="rgl"), 4), mono = rep(system.file("fonts/FreeMono.ttf", package="rgl"), 4), symbol = rep(system.file("fonts/FreeSerif.ttf", package="rgl"), 4)) } ret <- rgl.init(initValue, onlyNULL) if (!ret) { warning("error in rgl_init") } } rgl.init <- function(initValue = 0, onlyNULL = FALSE) .Call( rgl_init, initValue, onlyNULL, environment(rgl.init) ) ## ## exit-point ## ## .onUnload <- function(libpath) { # shutdown ret <- .C( rgl_quit, success=FALSE ) } rgl/R/aspect3d.R0000644000176000001440000000123712144263746013134 0ustar ripleyusersaspect3d <- function(x, y = NULL, z = NULL) { if (is.character(x) && pmatch(x, "iso") == 1) { scale <- c(1,1,1) } else { if (is.null(y)) { x <- rep(x, len=3) z <- x[3] y <- x[2] x <- x[1] } for (i in 1:5) { # To handle spheres, repeat this bbox <- .getRanges() scale <- c(diff(bbox$xlim), diff(bbox$ylim), diff(bbox$zlim)) scale <- ifelse(scale <= 0, 1, scale) avgscale <- sqrt(sum(scale^2)/3) scale <- c(x,y,z)*avgscale/scale oldscale <- par3d(scale = scale)$scale if (isTRUE(all.equal(scale, oldscale))) break } } par3d(scale = scale) } rgl/MD50000644000176000001440000004457412262033476011421 0ustar ripleyuserse73499cb89e0d6e97b8ba271c46739fd *COPYING 8e88b93f41c9cb0d460db421cb9aa903 *DESCRIPTION 5906c1f5f4acca52d1e91598e5e7bdae *NAMESPACE 924eeb2faa0ef90099ad9176b1cc5013 *R/addNormals.mesh3d.R 24205f22f8c6a012605bbba11b609686 *R/animate.R 853ac34ab3568c44d0326e6f89ccd68d *R/aspect3d.R df94371ac2c376befb4ddb0a6759af0f *R/axes.R f959c14c0a4cff75c4bd6a8590235c6b *R/callbacks.R d614a914d367d10d4718ad28e0c493fc *R/cylinder3d.R 0bc8d2f43aadf5e502bc417988b1b266 *R/device.R 5e855bf30c385ae3c1b662a862d3bb5a *R/ellipse3d.R 543d421e8e5fdf0128e0f77d262ee0d3 *R/enum.R 50ec73e5b7c3ef0296cf34708c272a9d *R/fonts.R 11aa7956b8577b5c1e6efeae506fbacb *R/getscene.R 482897346c21cde324d6c5b781120676 *R/grid3d.R a85c5a66d08b2c0f8ac98d49f365aae7 *R/identify3d.R 6d37abb99d2ac4c669721dab0eaad5b0 *R/internal.R 8b057bbbde990aff211072d24d349c8f *R/material.R 464210d6bb57f31a186614b6c32d9cb7 *R/matrices.R 31af712b88d88e5d3080745ccc36060a *R/mesh3d.R 164d11af4a03d1386a8b2452495d8e93 *R/obj.R e7329453008644d2c2a8a474cc029c99 *R/oh3d.R 3b6fd98988ffb351f1018a84c665c44f *R/par3d.R 0a20a3faf3b73ad087e9825030704f9d *R/persp3d.R 9aae183111d53b7c2ed5d9b51f1b1389 *R/plot3d.R af9a986f1752f610b392a47202f8cb59 *R/plugin.R b67f8e25f986db0a965df97b44ce8cb3 *R/ply.R 2b61a5d47c91413d8d9ba1e22821bda0 *R/r3d.rgl.R 63896d797aeddfe599f9358d058a3305 *R/rgl.bringtotop.R 945d6ade181060b150f1ceb1e045d965 *R/scene.R 06ca697fc07bde9e5d06d936bb4ad5e9 *R/selectpoints3d.R 9ebe73a8d97c1fa1423d646f41a4f57a *R/shapelist3d.R b8fcaff709d438c64fe31c712b04a30a *R/solids3d.R 39373193d00f694abd039bdc4475806c *R/stl.R cd2c25a71a00743e10700942991fd823 *R/subdivision.mesh3d.R 7483d1f9bc2e0ddc2ca49c7361051297 *R/triangulate.R 0e5f3a6cd94e403b978dfbf540fa89f2 *R/turn3d.R e9f78eb4f1eeeac93bbf2f66cf063155 *R/webGL.R 1382bde1c480ee5049f36704a366239a *R/zzz.R d0feda47b4171a619aeb46648abe76a3 *README a6a183397bea52041e6eebb1e2609eb2 *cleanup 18cb1f7e1f63e33ae313b31e31d2053a *configure 226dc3def90cef8e7f49db2cdec7ec3c *configure.ac 36bf264d1b25341628b7b220fb4515e1 *configure.win d86af288dff684f0ec416d0b74a9f1a0 *demo/00Index ae4a727a90b8e66e141906769a78404d *demo/abundance.r 3e3a22e0505c12b6af3c02ab0c31e40f *demo/bivar.r 88e4edcb3715776e731633a121078926 *demo/envmap.r 40e1921cf1b86dcb6eda1e8927d9bb28 *demo/flag.R 82060d1c5816aaf2f8bd19c81dd7d177 *demo/hist3d.r e0359e5a9fea398708925a890a856138 *demo/lollipop3d.R 61c0c8ffa3ea434e77eea052edb8b61a *demo/lsystem.r c176e81cceb3b96d51330119fe4a69bc *demo/mouseCallbacks.R e151f89d37172afa14164c3680e7629b *demo/regression.r 82b233c31f47cb4e09662d9054f48fc4 *demo/rgl.r 154cec7452c730564d63034357b897a0 *demo/shapes3d.R 13ef215dbb591bc9d82ad4831b04361a *demo/stereo.R 70324e9f3c6750f14dc5fdfe99003625 *demo/subdivision.r dfb6ec6acd66eca6683b9664c657552b *inst/NEWS feff7010f9f522214002265608f637ac *inst/WebGL/CanvasMatrix.js 268ceb2143fc28fba1d3d595a0f9ad6f *inst/WebGL/template.html 5bac46c36b13eac1302260ee06b16c0f *inst/demodata/population.dat 5544dce93555cfaced50ee41283e9e58 *inst/demodata/region.dat b4ef592c88333c7c509dd74fcd1912d9 *inst/fonts/FreeMono.ttf 867469f13ff81dec9adf2ae2f6ea2899 *inst/fonts/FreeSans.ttf dc0004a804503e126bc99998c7a1c677 *inst/fonts/FreeSerif.ttf 6bce8d2ca5c1408d884dbabdaa06b42e *inst/textures/bump_dust.png ee4e831c7898e173f4303810bb962e04 *inst/textures/nightfire.png 9bc95de401ad938293a31eeda3e634f9 *inst/textures/particle.png d0da68556f680ce0b2543bf7d528a3b8 *inst/textures/refmap.png d28cefd893c7df888fa432e7de20dd18 *inst/textures/rgl2.png 67de745a59476bacb0c1be2078313f08 *inst/textures/sunsleep.png 7080d7e4b8fce2d49ffb0b93313b973a *inst/textures/world.png 26c41afa7c4554201ad8735d6cf7b3ab *inst/textures/worldsmall.png f6c82921426759229787359697bb2e2d *man/3dobjects.Rd 10e22737868dc8ac95cdd9d061999be5 *man/abclines.Rd e4045a68fdeb0a86174efd86018d0edd *man/addNormals.Rd 704cb5abb00b913873267499102e50d7 *man/aspect3d.Rd cd55ad0a4c0c10a7c27d0e342e4ce598 *man/attributes.Rd 8aa601051076ece5336d8716fe50b5f1 *man/axes3d.Rd 86c49d02c29652a1cd9fb8aa3cd20b3c *man/bbox.Rd 4901789ff0e5ce6766ecacadab738a80 *man/bg.Rd 217a4ff853de1ac8f22bfe0abcb1c299 *man/callbacks.Rd 34c5f36aad0b8b1b335c7a18b7d43c03 *man/check3d.Rd 66289d3d8d8dff31a1b17247c45d535c *man/cylinder3d.Rd 0aaa50db1f44f384dfb37065447eca55 *man/ellipse3d.Rd dfabe3b97d8425462b795d76602996b0 *man/extrude3d.Rd bc60664d75d2adaa584e5c75d0af8a95 *man/grid3d.Rd 5f159afbec0bb90ff60255b74ff8e6ec *man/identify3d.Rd 23e3767c76330340ce4f9b29bb86125a *man/light.Rd 73e139149bc81b223075d06494c4126c *man/material.Rd 2d28e61be76fc365b0ea97745fc31410 *man/matrices.Rd d94a7eb1c891ec0813ce16f7e1a0893b *man/mesh3d.Rd a6864ae58eb16905927773cdf257898e *man/par3d.Rd 637a0bfbe6c8cb6f199909aaf2763ee8 *man/par3dinterp.Rd d85ccfc2a02095acee4abd5850f62699 *man/persp3d.Rd 2b36ad8348320e3f6c2d405e56483c5b *man/planes.Rd 9612a7c3abaf2b04d5fc8fe7a5077b4b *man/play3d.Rd 055583f794e145bd43e936520a2d01c2 *man/plot3d.Rd 3d221dcc72ea8cc5f53151b9fa1450fd *man/polygon3d.Rd 6f9cbc99e08e8f5c387ae7240fbe1749 *man/postscript.Rd 45c067f1232c39efe6f9d78290f93ebb *man/primitive.Rd bb9cbe91502a466018d7970af9d5e371 *man/r3d.Rd fdeb7528b8f3688ea4b53925b33bd8ba *man/readSTL.Rd b1564ffcac844d4b47f5f397c9933829 *man/rgl-internal.Rd af5464089b8078881b2828a8da898b97 *man/rgl-package.Rd 7ccb159587d606cf5937d92129b98e93 *man/rgl.Sweave.Rd be61d6a7b60885ea5d9ec21aa6672658 *man/rgl.bringtotop.Rd 2f766280271fe82bd8f089610e7dbc9c *man/rgl.pixels.Rd 4950beaac607cb06fdb40a96c98d7943 *man/rgl.select.Rd fb4a194f72781107fee21f315997467a *man/rgl.useNULL.Rd 2e6c57b9ca7de346eda82501d4a5f1b9 *man/rgl.user2window.Rd 2adeabe6c4329842920c9fc5b3f27485 *man/scene.Rd fcfff24f34922183b5f2778fefbc08f2 *man/scene3d.Rd f2137d8f6f45830534d08be4a297838e *man/select3d.Rd 97670b159b7665886e80b2e9b26d2958 *man/selectpoints3d.Rd 627f7ecd2399b6e94b0183824d6027b6 *man/shapelist3d.Rd 3f6720223d8252b3c21273fdb4c4eb23 *man/snapshot.Rd 247861351f7eb638415a48b7918dd57a *man/spheres.Rd 197a5b247c0854de5fb37c504e40d59e *man/spin3d.Rd a4a96640f1ed726123ff4c8875d4ee40 *man/sprites.Rd 5fefb3bf30774119241f8ea65aa6fdbc *man/subdivision3d.Rd 5b5b9017c12bc5321400068d275494ba *man/surface.Rd f78044b0bf5af11ff55f424ac29ab786 *man/surface3d.Rd dc9f2e15ef4020ce1afdc288637f7157 *man/texts.Rd fa1cf179be2b9e37770093ad5463f3a9 *man/triangulate.Rd 1ac030e13e8d3a75ff5ef869304d1aa3 *man/turn3d.Rd 2ddcca5994e138b8c438216361be8a4a *man/viewpoint.Rd 6f51a817d8a6f01f7660bb1ff7adebda *man/writeOBJ.Rd 3c5d65b98aaf186105d2c1b4d89b73e9 *man/writePLY.Rd 44867d44939dc48dc354a48728345fce *man/writeWebGL.Rd be3d67ffb354f2117d5bf66dd88c40b2 *src/ABCLineSet.cpp aa26d6627d9e83fdcc3ee1d41d64fc8c *src/ABCLineSet.hpp ba9aa97658a87b8062a1159f7295f1fa *src/BBoxDeco.cpp 639d0374fc7f47f2632e581437f97275 *src/BBoxDeco.hpp 97964c4854d13eedd65a66b948d882aa *src/Background.cpp 82ae228b5291e4dc02c9589f66a6e810 *src/Background.hpp 07787092d891d8e841598acf6a1b267e *src/COPYING.GL2PS c2c59ee43a5c6a8cf1240cfe28a5c479 *src/ClipPlane.cpp 7cd2e6137154500950459bd31c9710c7 *src/ClipPlane.hpp 2568dd18b95ee6f692fdaa98b95601af *src/Color.cpp 32aa78d166d10e60395f04873bd91fcc *src/Color.hpp 5b36991b01d7c4323c9663ccc3331391 *src/Device.hpp f05f7bfb9a1b82074b168bd2b942b7ae *src/DeviceManager.hpp 8351e228dbcb91c68405e55afbec506c *src/Disposable.cpp a03f1553ae491c2ad18cf0fcdf773d09 *src/Disposable.hpp e93c93ddbbc3107ce256150505d9001d *src/Light.cpp e1dba656a116e319839e6827750fffd2 *src/Light.hpp 8c5b3b8b9b9ab9248e0c188094826cd3 *src/LineSet.cpp e29e9bbf3e2db0be63c19d643adaedc3 *src/LineStripSet.cpp ae9401fe8940c21388ad28d3c8ff72a8 *src/Makevars.in d16cc6aefffa9e6665ab87809d8ba985 *src/Material.cpp 4c0c75afae858b81fdce428f4a5a2ed6 *src/Material.hpp 5fc8553b1b9e8d647f1ed3ca8d6ac43d *src/NULLgui.cpp 835ab4de970d4f398339c5f83dfd7580 *src/NULLgui.hpp 0588c53fb47c8a404a311086fa4e9dfa *src/PlaneSet.cpp 7add1127bde9d4d91c4ceacfc76701d1 *src/PlaneSet.hpp 4801fac60b1b6d7af832d6b4884877ca *src/PointSet.cpp e4411bf57bf9a4d7aa48d72927fd0999 *src/PrimitiveSet.cpp 3d3a4d1e5614752fa12c8a942fca33ba *src/PrimitiveSet.hpp 96ed41f766016335a32b8ae8d23d1124 *src/QuadSet.cpp a690ee6caf929116ca61fd2a97cd328e *src/R.h a6f63b2986a74ff63327aba6326a2e47 *src/RenderContext.cpp dd261b49d5a87798da09dadd43aef896 *src/RenderContext.hpp d09e5814d80aeff13d590a457777b288 *src/SceneNode.hpp d8436585667772884327ff65a0fdb5dd *src/Shape.cpp ef873604d69f7225961a6dc49fb84b57 *src/Shape.hpp ed024e54fe1f89073aadceee7288b554 *src/SphereMesh.cpp 87d979bd893becf1c273bbf2e03fa1a4 *src/SphereMesh.hpp d879226f6e0462f0b62de9911df86ce2 *src/SphereSet.cpp f7ec48e0c9fd6b171f59eb57203e73f1 *src/SphereSet.hpp 1b380eb7fdb72000eddef85d8b31c147 *src/SpriteSet.cpp 6a08b11f080f051a139bec251e95b11a *src/SpriteSet.hpp 832ce0209481da4ca248270bfc7f98ba *src/String.cpp 26a8a9eff2fb6eb4e9c93e5121d7c7af *src/String.hpp ffd3b06200da3ab8835fc9deb76191ba *src/Surface.cpp 430212d1be6aa57c7f417075b409e2ba *src/Surface.cpp.save df0be0afee84edd865af72889f326e77 *src/Surface.hpp 2a412165a0219a7e0fa40c1cfcd61f04 *src/TextSet.cpp 2ea1d7eadf4833a621cb1c0d5e0e6e98 *src/TextSet.hpp 736e135b489dbe7fa63230c666570289 *src/Texture.cpp e7872a3d3111f2228eb2db8f9410056b *src/Texture.hpp 70819097a9b310ce42933f3a5c02c779 *src/Viewpoint.cpp 3b3aa7be7caaec3ea8f251997a9f5559 *src/Viewpoint.hpp 3748cb2a33e6728ddca3635b1e8a1dfd *src/api.cpp 5d9230bff33fcef5ec537d201021aabe *src/api.h 68d217cb6743ffe6320d89f157223313 *src/assert.cpp 0e68374c29258e2b6fe6e88fa9b4958d *src/assert.hpp 559bc9e2fca45761389ce2f3140cec0c *src/build/autoconf/config.guess b65469e74491b977b8babd8f98f3c1e5 *src/build/autoconf/config.sub 6e5fe73723cd40a28adc5b7b5650c8d1 *src/build/autoconf/install-sh f9a1cdda300b6b50b4e8d4ca25cd73d0 *src/callbacks.cpp 71197f997e3ef5dd889f0ea812297caf *src/config.hpp d1af966ebe34606dcc973a2279715fa5 *src/device.cpp e84f26034f58eaee7a5177ad18b7263b *src/devicemanager.cpp c83c1ea7f7c9b201cdcf087fa83d10ff *src/ext/GLsdk/GL/gl.h b3a541f71a25364db3f2128ecceb23cb *src/ext/GLsdk/GL/glext.h 1d9b87c0753867872bde78597c327011 *src/ext/GLsdk/GL/glprocs.c 2f815b593663fa05c0b4218da5e859f5 *src/ext/GLsdk/GL/glprocs.h 7b7a17cf681ec55443208331ff7d2fa7 *src/ext/GLsdk/GL/wglext.h 02bd9b0a9a5faf1589190ac51176a1c5 *src/ext/GLsdk/README 3cdf0854d833c6aa64021c260776f3f7 *src/ext/GLsdk/glxdemo/Makefile a88d7c70039d75d1b7165b03c701c90e *src/ext/GLsdk/glxdemo/demo.c 3919e1e751b49ca79d26a389ea6075c5 *src/ext/GLsdk/windemo/Makefile 1a76796ea607f53471cf26be65754c87 *src/ext/GLsdk/windemo/README 65fc121bbc52e6a33984ba1d2a28344c *src/ext/GLsdk/windemo/demogl.c c08368f55d809f294f0f5b8f65fff152 *src/ext/GLsdk/windemo/demogl.h a196c678e345d99dbfb3f321568da889 *src/ext/GLsdk/windemo/multithread/Makefile cc539fdc60be6768b85a7e21a949d15e *src/ext/GLsdk/windemo/multithread/demo.c 8c37622620a17bbfe0ce031563efdc10 *src/ext/GLsdk/windemo/multiwin/Makefile ecbc58476e6d099e32553dcd1d8d54ea *src/ext/GLsdk/windemo/multiwin/demo.c 66476d12bb3ea2a99ac8c86e93188e11 *src/ext/GLsdk/windemo/singlewin/Makefile eecd615847d389422cc5d70cdba4b0bc *src/ext/GLsdk/windemo/singlewin/demo.c dadfdb1523fa7cb2b605ca739d3dc7d8 *src/ext/ftgl/FTBuffer.cpp d3b0979057aa114e783a4d00348b3cba *src/ext/ftgl/FTCharToGlyphIndexMap.h df82479f6d77110ec9421d05a72bc22d *src/ext/ftgl/FTCharmap.cpp fbb46155bc03c58b0954c9c87b8c5489 *src/ext/ftgl/FTCharmap.h 198a83b2cdc6c0c25dea814e9f87b287 *src/ext/ftgl/FTContour.cpp 0df22d6e2afed2fa2c74b56d170666e3 *src/ext/ftgl/FTContour.h e3b1d4b91f5336ad1afed4bef3f7e60e *src/ext/ftgl/FTFace.cpp bc923b13aab60fc0d8345ce265d5c4f7 *src/ext/ftgl/FTFace.h 6cee05988d95769959751a6bf982bcfa *src/ext/ftgl/FTFont/FTBitmapFont.cpp 46cd76f77454183b656f840846f7962a *src/ext/ftgl/FTFont/FTBitmapFontImpl.h 2a5ad552a3668fa622e598b74bcdf193 *src/ext/ftgl/FTFont/FTBufferFont.cpp e595560279739292d4040fc99ccb6f8d *src/ext/ftgl/FTFont/FTBufferFontImpl.h 11894243a0b819ff86e47a32849cdb45 *src/ext/ftgl/FTFont/FTExtrudeFont.cpp c763a223ea70cb3c58aa0e5148d36091 *src/ext/ftgl/FTFont/FTExtrudeFontImpl.h 9fe096169e2b693fb19392366db68da5 *src/ext/ftgl/FTFont/FTFont.cpp bda6bab0aef5e5df1db9aa5f96df4d3d *src/ext/ftgl/FTFont/FTFontGlue.cpp b8b501aceae7097953d3d3d07fb3f22d *src/ext/ftgl/FTFont/FTFontImpl.h 578c3ed55e2991b90210e1f297a06d6f *src/ext/ftgl/FTFont/FTOutlineFont.cpp b30eda21f61429fb0a4680465f516237 *src/ext/ftgl/FTFont/FTOutlineFontImpl.h 8ffaf4d3327d55283a9b7405e0a1c573 *src/ext/ftgl/FTFont/FTPixmapFont.cpp 26853060924597f8ca076ae7d8e95752 *src/ext/ftgl/FTFont/FTPixmapFontImpl.h 0f6d6e0fb2174d041b9f333a93ed1397 *src/ext/ftgl/FTFont/FTPolygonFont.cpp 8fafdbb2666a3cc723e85bd6d4a6794a *src/ext/ftgl/FTFont/FTPolygonFontImpl.h fc9401eb562bf9f32c8a8b3dbd0f795b *src/ext/ftgl/FTFont/FTTextureFont.cpp 516421d846a01598ea710a972aaae599 *src/ext/ftgl/FTFont/FTTextureFontImpl.h 230bab96d6d850f1d33f2f1ad784a412 *src/ext/ftgl/FTGL/FTBBox.h 9e4292443f1b1b93ca6b634bf6d987f0 *src/ext/ftgl/FTGL/FTBitmapGlyph.h f49bdff8007e603d0c82fdbda0c25d48 *src/ext/ftgl/FTGL/FTBuffer.h 8c0b36ace135d7a55a97fdb6b663247d *src/ext/ftgl/FTGL/FTBufferFont.h 9c8ee2aab0f0a76b4dccf143a046f965 *src/ext/ftgl/FTGL/FTBufferGlyph.h c6df401411611c571a953790afff6630 *src/ext/ftgl/FTGL/FTExtrdGlyph.h 692a9fd4365ff11955e38a2e8feb6879 *src/ext/ftgl/FTGL/FTFont.h b1bdead397ff26e465fff6589b5c9830 *src/ext/ftgl/FTGL/FTGLBitmapFont.h e8548d181850f96793834feacd1c2856 *src/ext/ftgl/FTGL/FTGLExtrdFont.h da4d60ccfe6af055f6c7f66d381c5899 *src/ext/ftgl/FTGL/FTGLOutlineFont.h c8df9ea475390e02159833be3bdacc99 *src/ext/ftgl/FTGL/FTGLPixmapFont.h 32ab997693e08eb0265e7195dfd439b8 *src/ext/ftgl/FTGL/FTGLPolygonFont.h 0a03a39be54e5ef204c401b82cb536b5 *src/ext/ftgl/FTGL/FTGLTextureFont.h ce03934d2e2cf4bb3b0762c8ca8d150a *src/ext/ftgl/FTGL/FTGlyph.h 0dafe4d5a2e125ab0a2edbc9bfd5936c *src/ext/ftgl/FTGL/FTLayout.h bc6155067c5c42eb06d1557df2e43cc2 *src/ext/ftgl/FTGL/FTOutlineGlyph.h ded998ac5c20d8811cfaa26eac09a650 *src/ext/ftgl/FTGL/FTPixmapGlyph.h 992eddbbab7dfbd8eb5c15d6b876f14b *src/ext/ftgl/FTGL/FTPoint.h 902a47c1182e16d9df04e047902d5ca1 *src/ext/ftgl/FTGL/FTPolyGlyph.h 45b3c3fc72525a97df8314986e4760ab *src/ext/ftgl/FTGL/FTSimpleLayout.h 4200c568f82b18dd5ea0c7b9ff30e9c6 *src/ext/ftgl/FTGL/FTTextureGlyph.h d8bdcc5af3624847c7309665736a3b8a *src/ext/ftgl/FTGL/ftgl.h c3c4abcfe56e325d430029e543fb4ce5 *src/ext/ftgl/FTGlyph/FTBitmapGlyph.cpp d2e52f923d89e7cfbe976b40037c088f *src/ext/ftgl/FTGlyph/FTBitmapGlyphImpl.h 15cf3dce400cfa43d856ff827df54a3f *src/ext/ftgl/FTGlyph/FTBufferGlyph.cpp 19af28d3ac6f2494166372082634f0a7 *src/ext/ftgl/FTGlyph/FTBufferGlyphImpl.h 71ac13971b76de3508eb17827cd89da5 *src/ext/ftgl/FTGlyph/FTExtrudeGlyph.cpp 21da928e25d0d370a2fac6af1b11e35d *src/ext/ftgl/FTGlyph/FTExtrudeGlyphImpl.h f017bd959547aaea736fc8a189eed2be *src/ext/ftgl/FTGlyph/FTGlyph.cpp 568762d22d490f4140723be8fcbb2a55 *src/ext/ftgl/FTGlyph/FTGlyphGlue.cpp 8a657973e2ce18aa4f4ab933acf9cb8c *src/ext/ftgl/FTGlyph/FTGlyphImpl.h 45cb930c3377addd0eb4b36d0030fb2f *src/ext/ftgl/FTGlyph/FTOutlineGlyph.cpp 653ea146597a007704711585ce3bb1cf *src/ext/ftgl/FTGlyph/FTOutlineGlyphImpl.h 05cab235511ef9770ca0baa336e9753c *src/ext/ftgl/FTGlyph/FTPixmapGlyph.cpp d03c8a2e4118633d05661a4e97e44c47 *src/ext/ftgl/FTGlyph/FTPixmapGlyphImpl.h 96a3b4a56383677889f9be218dccbf70 *src/ext/ftgl/FTGlyph/FTPolygonGlyph.cpp 64f85eb98e1341f73e2aa96a2bdffb41 *src/ext/ftgl/FTGlyph/FTPolygonGlyphImpl.h 2ae9cfe909e39faf9506958269f88b3b *src/ext/ftgl/FTGlyph/FTTextureGlyph.cpp eeedd5ced1be160b6ac16364d972c966 *src/ext/ftgl/FTGlyph/FTTextureGlyphImpl.h bde3d77f0b6fb23338977c08d94127dd *src/ext/ftgl/FTGlyphContainer.cpp 72518f956e4124f14a3e3c7e56598928 *src/ext/ftgl/FTGlyphContainer.h 2a5f62e07075f182e09b7b7997fd2cc2 *src/ext/ftgl/FTInternals.h e9bcef03564229b55c1f41e08b6deb29 *src/ext/ftgl/FTLayout/FTLayout.cpp 63e9ec812b2e00b1e30dd2edd9225e16 *src/ext/ftgl/FTLayout/FTLayoutGlue.cpp 923471cafec7828be0ac98e32654b0b7 *src/ext/ftgl/FTLayout/FTLayoutImpl.h bb750695c84dd48d2d7c9b1a55c2f78a *src/ext/ftgl/FTLayout/FTSimpleLayout.cpp 2162c22bf4ab0dcecfce8a01df52840a *src/ext/ftgl/FTLayout/FTSimpleLayoutImpl.h c78f3e6fc5d8f1101ab4dbf9c39c8b2e *src/ext/ftgl/FTLibrary.cpp c89dd7f824e02ccb8f1417d9c749d14a *src/ext/ftgl/FTLibrary.h 0bee532772a9a4e6731234ae4ad0e1dc *src/ext/ftgl/FTList.h 0ad28cf7cb22082364ed3f7a757dbeac *src/ext/ftgl/FTPoint.cpp b44e9272b2622955623953a4e4f1519a *src/ext/ftgl/FTSize.cpp df0140033dc56cd6e35b2eb604c9be88 *src/ext/ftgl/FTSize.h b59a5cfe0e1c5e0506198a98f76a177b *src/ext/ftgl/FTUnicode.h 66f64edb27e9343a06defee757372711 *src/ext/ftgl/FTVector.h 022e12e6d95b7cecad4c1d869e2e9e7f *src/ext/ftgl/FTVectoriser.cpp f628642b6af28e07c8fff0a9464ba650 *src/ext/ftgl/FTVectoriser.h 669126c660cd42496af6d02fe6a62741 *src/ext/ftgl/config.h a03882182b7fe9ac4375beef44e23a0c *src/fps.cpp e5aa79236fa82468d5e415401e5ddd0f *src/fps.h 1fdd71d5a6d05d33bf335c0c10283aba *src/ftgl.cpp 3c1fa2a268f3475bef85f64558812097 *src/geom.cpp 1212912376d6c609bb3dbc5e8e0448e3 *src/geom.hpp 47c89c2fbae62d65ca73308469721f08 *src/gl2ps.c c2df43358f9dc57b02321b60feca6637 *src/gl2ps.h 11c4ec1cd621afa3b8203875bf0175ca *src/glErrors.cpp 2755932b3525a35e2f862541b234e6e5 *src/glgui.cpp 7355d9ce33602d688f31205e71eb62f8 *src/glgui.hpp fff0cfda24179d57c394f773330b761b *src/gui.cpp 3d8b4fb0516746cf5fcfa2eafbb69ce3 *src/gui.hpp c48a61ff1d319c67088ff31f7cf6f064 *src/init.cpp 98b41399ac5f905f55cf3b051f7e7eae *src/init.hpp 8f2d61a8d353bc9a83083ac1017c690e *src/lib.hpp 326bc4dd707d36afedf0f89a6ddee60e *src/opengl.hpp b53af0b4412903d2c32381a001824dca *src/osx/osxgui.hpp befab2ece489c1f9a2b903d0314dfccf *src/osx/osxgui.mm 50cd2eb5ffb4abf236db336abc4b2175 *src/osx/osxlib.cpp 48df6e1a24f95ade626bae40058248d8 *src/par3d.cpp d8bd4ead3e7c41a0bd7038cc577386b7 *src/pixmap.cpp ed199f704c09955177657eb1a80319c6 *src/pixmap.h 43904f04311d5c024c3044177d37eb01 *src/pngpixmap.h 8e404ccf5d82bfec658d599160595c4e *src/pragma.h 92ea7a1b8a4633f4d0b1dfb3dfb60179 *src/pretty.c 28ba9504069a992227eec0a430d4803e *src/pretty.h 68f15826fa366a7aa5007fd9b120fdfb *src/render.cpp 971c780309c2336250dabd8a66c9754d *src/render.h d140e13b2a81bf64aca893a3de84c40f *src/rgl-win.def 409bafd73e8fbcd07b75dea7765acf8e *src/rglmath.cpp b5109063e2d40e59410f74e56eabdee3 *src/rglmath.h 453e6a2a3f538420c191ea6fe7fe7f98 *src/rglview.cpp 589a333b476fe8bc18cb3ece2f9ed5d1 *src/rglview.h 3fcb7ed4e6b3b9e76f63f4e943a8fc1c *src/scene.cpp 5b4fa6d68ad19cb4e0a6c1c5e2d3cd69 *src/scene.h 1d5d3cc76b12eab1f7be77c4e9564a39 *src/select.cpp f3fb1125c8e91830a0447f265c0d33e4 *src/select.h b1c1e5e8d4dc94c9f6e3967575fab332 *src/types.h d6d72e66a14efb480fa03453d18d2267 *src/win32gui.cpp eb709f12fe1784523c8f8144bc07da89 *src/win32gui.hpp 4dd6e7c0119244f2bfb267fe4a2e2553 *src/win32lib.cpp 2b0cc9b7f75cf06c215d7f8f70547b0d *src/x11gui.cpp 356447b406b0d0a138fb4bee3c55aa4d *src/x11gui.hpp 92eade7257b02ddb507b32069cc71259 *src/x11lib.cpp 69466e6e7e415d0fec5ed0f3a95934f6 *tests/demos.R rgl/README0000644000176000001440000001053412136745735011766 0ustar ripleyusersRGL - 3D visualization device system for R using OpenGL ======================================================= INTRODUCTION ------------ The RGL package is a visualization device system for R, using OpenGL as the rendering backend. An rgl device at its core is a real-time 3D engine written in C++. It provides an interactive viewpoint navigation facility (mouse + wheel support) and an R programming interface. LICENSE ------- The software is released under the GNU Public License. See "COPYING" textfile for details. FEATURES -------- - portable R Plug-in using OpenGL on MacOSX, Win32 and X11 - R programming interface - interactive viewpoint navigation - automatic data focus - geometry primitives: points, lines, triangles, quads, texts, point sprites - high-level geometry: surface, spheres - up to 8 light sources - alpha-blending (transparency) - side-dependant fill-mode rendering (dots,wired and filled) - texture-mapping with mipmapping and environment mapping support - environmental effects: fogging, background sphere - bounding box with axis ticks marks - undo operation: shapes and light-sources are managed on type stacks, where the top-most objects can be pop'ed, or any item specified by an identifier can be removed PLATFORMS --------- Mac OS X Windows 2000/XP/Vista Unix-derivatives BUILD TOOLS ----------- R recommended tools (gcc toolchain) REQUIREMENTS ------------ Windowing System (osx/carbon, unix/x11 or win32) OpenGL Library OpenGL Utility Library (GLU) Installation on Debian: ----------------------- aptitude install libgl1-mesa-dev libglu1-mesa-dev OPTIONS ------- libpng library version 1.0.4 or newer (pixmap import/export support) freetype library for resizable anti-aliased fonts BUILDING/INSTALLING FROM SOURCE PACKAGE --------------------------------------- The R build tool is the primary tool to build the RGL package. BUILDING ON MICROSOFT WINDOWS ----------------------------- Libpng support: Make sure bitmap dll has been built as described in the R Build Instructions for Windows. These two files are needed: %R_HOME%\src\gnuwin32\bitmap\libpng\libpng.a %R_HOME%\bin\Rzlib.dll (or %R_HOME%\src\extra\zlib\libz.a, in older R versions) Freetype support: You need to obtain a Windows build of the Freetype library, version 2.3.5 or better. A version is available at http://gnuwin32.sourceforge.net/packages/freetype.htm. Set the environment variable LIB_FREETYPE to give the full path to the install directory. BUILDING ON UNIX-STYLE OS (MacOS X, Linux, FreeBSD, ... ) --------------------------------------------------------- The build is controlled by an autoconf configure script. You provide the options through the R CMD build/INSTALL command e.g. $ R CMD INSTALL --configure-args="" rgl COMMON UNIX-STYLE OS OPTIONS ---------------------------- --with-gl-includes= GL C header files include path --with-gl-libraries= GL library linkage path --with-gl-prefix= GL library prefix (e.g. Mesa) --disable-libpng disable libpng support --with-libpng-prefix= force LibPNG library install prefix (e.g. /usr/local) --disable-libpng-config explicitly disable libpng-config --disable-libpng-dynamic use static libpng library You may find that your distro doesn't have all necessary development libraries installed: read the error messages for hints! This line has been reported to be sufficient on FC 5 or 6: yum install mesa-libGL-devel mesa-libGLU-devel libpng-devel MAC OS X OPTIONS ---------------- --disable-cocoa force a X11 port X11 WINDOWING SYSTEM OPTIONS ---------------------------- --x-includes= X11 C header files include path --x-libraries= X11 library linkage path FIRST DEMOS: LOADING LIBRARY AND RUNNING DEMONSTRATIONS ------------------------------------------------------- > library(rgl) > demo(rgl) CREDITS ------- Daniel Adler Duncan Murdoch Oleg Nenadic Simon Urbanek Ming Chen Albrecht Gebhardt Ben Bolker Gabor Csardi Adam Strzelecki Alexander Senger WEBSITE ------- http://rgl.neoscientists.org rgl/DESCRIPTION0000644000176000001440000000206512262033476012604 0ustar ripleyusersPackage: rgl Version: 0.93.996 Title: 3D visualization device system (OpenGL) Author: Daniel Adler , Duncan Murdoch , and others (see README) Maintainer: Duncan Murdoch Depends: R (>= 2.15.0),stats,grDevices Suggests: MASS Description: Provides medium to high level functions for 3D interactive graphics, including functions modelled on base graphics (plot3d(), etc.) as well as functions for constructing representations of geometric objects (cube3d(), etc.). Output may be on screen using OpenGL, or to various standard 3D file formats including WebGL, PLY, OBJ, STL as well as 2D image formats, including PNG, Postscript, SVG, PGF. License: GPL URL: https://r-forge.r-project.org/projects/rgl/ SystemRequirements: OpenGL, GLU Library, zlib (optional), libpng (>=1.2.9, optional), FreeType (optional) BugReports: https://r-forge.r-project.org/projects/rgl/ Packaged: 2014-01-04 15:45:42 UTC; murdoch NeedsCompilation: yes Repository: CRAN Date/Publication: 2014-01-04 17:30:54 rgl/configure0000755000176000001440000051073712262005306013006 0ustar ripleyusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS BUILD_AGL_TRUE AGLLIBS AGLCPPFLAGS CXXFLAGS HAVE_FREETYPE_CONFIG XMKMF EGREP GREP HAVE_LIBPNG_CONFIG F77_VISIBILITY C_VISIBILITY CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_cocoa enable_libpng enable_libpng_config enable_libpng_dynamic with_x with_gl_includes with_gl_libs with_gl_libname with_glu_libname enable_ftgl ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-cocoa use X11 instead of Mac OS X native Cocoa UI --disable-libpng compile without PNG image support --disable-libpng-config disable libpng-config test and configuration --disable-libpng-dynamic disable dynamic libpng linkage, force static version linkage (only with --enable-libpng-config) --disable-ftgl compile without FTGL font support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System --with-gl-includes=DIR specify location of OpenGL headers --with-gl-libs=DIR specify location of OpenGL libs --with-gl-libname=NAME specify Library name (defaults to "GL") --with-glu-libname=NAME specify GLU Library name (defaults to "GLU") Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in src/build/autoconf "$srcdir"/src/build/autoconf; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in src/build/autoconf \"$srcdir\"/src/build/autoconf" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ## pick up compiler as will be used by R CMD INSTALL/SHLIB if test -n "${R_HOME}"; then CC=`${R_HOME}/bin/R CMD config CC` CPP=`${R_HOME}/bin/R CMD config CPP` CFLAGS=`${R_HOME}/bin/R CMD config CFLAGS` CXX=`${R_HOME}/bin/R CMD config CXX` CXXFLAGS=`${R_HOME}/bin/R CMD config CXXFLAGS` fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((visibility())) is supported" >&5 $as_echo_n "checking whether __attribute__((visibility())) is supported... " >&6; } if ${r_cv_visibility_attribute+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.c <&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then if grep '\.hidden.*foo' conftest.s >/dev/null; then r_cv_visibility_attribute=yes fi fi rm -f conftest.cs fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_visibility_attribute" >&5 $as_echo "$r_cv_visibility_attribute" >&6; } if test $r_cv_visibility_attribute = yes; then $as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h fi ## test if visibility flag is accepted: NB Solaris compilers do and ignore, ## so only make use of this if HAVE_VISIBILITY_ATTRIBUTE is true. r_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -fvisibility=hidden" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -fvisibility" >&5 $as_echo_n "checking whether $CC accepts -fvisibility... " >&6; } if ${r_cv_prog_cc_vis+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : r_cv_prog_cc_vis=yes else r_cv_prog_cc_vis=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_cc_vis" >&5 $as_echo "$r_cv_prog_cc_vis" >&6; } CFLAGS=$r_save_CFLAGS if test "${r_cv_prog_cc_vis}" = yes; then if test "${r_cv_visibility_attribute}" = yes; then C_VISIBILITY="-fvisibility=hidden" fi fi ## Need to exclude Intel compilers, where this does not work. ## The flag is documented, and is effective but also hides ## unsatisfied references. We cannot test for GCC, as icc passes that test. case "${CC}" in ## Intel compiler: note that -c99 may have been appended *icc*) C_VISIBILITY= ;; esac ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu r_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS -fvisibility=hidden" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -fvisibility" >&5 $as_echo_n "checking whether $F77 accepts -fvisibility... " >&6; } if ${r_cv_prog_f77_vis+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : r_cv_prog_f77_vis=yes else r_cv_prog_f77_vis=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $r_cv_prog_f77_vis" >&5 $as_echo "$r_cv_prog_f77_vis" >&6; } FFLAGS=$r_save_FFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "${r_cv_prog_f77_vis}" = yes; then if test "${r_cv_visibility_attribute}" = yes; then F77_VISIBILITY="-fvisibility=hidden" fi fi ## need to exclude Intel compilers. case "${F77}" in ## Intel compiler *ifc|*ifort) F77_VISIBILITY= ;; esac # Check whether --enable-cocoa was given. if test "${enable_cocoa+set}" = set; then : enableval=$enable_cocoa; fi if test `uname` = "Darwin" ; then darwin="yes" ## we want the *build* cputype and not the host one. cmd=`echo $CC $CFLAGS | grep -E 'x86_64|ppc64|-m64'` if test -n "$cmd"; then have_64bit="yes" else have_64bit="no" fi else darwin="no" fi ## --- LibPNG ---------------------------------------------------------------- # Check whether --enable-libpng was given. if test "${enable_libpng+set}" = set; then : enableval=$enable_libpng; fi # Check whether --enable-libpng-config was given. if test "${enable_libpng_config+set}" = set; then : enableval=$enable_libpng_config; fi # Check whether --enable-libpng-dynamic was given. if test "${enable_libpng_dynamic+set}" = set; then : enableval=$enable_libpng_dynamic; fi if test "x$enable_libpng" != "xno"; then if test "x$enable_libpng_config" != "xno"; then # Extract the first word of "libpng-config", so it can be a program name with args. set dummy libpng-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVE_LIBPNG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVE_LIBPNG_CONFIG"; then ac_cv_prog_HAVE_LIBPNG_CONFIG="$HAVE_LIBPNG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_LIBPNG_CONFIG="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_LIBPNG_CONFIG" && ac_cv_prog_HAVE_LIBPNG_CONFIG="no" fi fi HAVE_LIBPNG_CONFIG=$ac_cv_prog_HAVE_LIBPNG_CONFIG if test -n "$HAVE_LIBPNG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_LIBPNG_CONFIG" >&5 $as_echo "$HAVE_LIBPNG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$HAVE_LIBPNG_CONFIG" = "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: using libpng-config" >&5 $as_echo "$as_me: using libpng-config" >&6;} CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H `libpng-config --I_opts`" if test "x$enable_libpng_dynamic" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: using libpng dynamic linkage" >&5 $as_echo "$as_me: using libpng dynamic linkage" >&6;} LIBS="${LIBS} `libpng-config --ldflags`" else { $as_echo "$as_me:${as_lineno-$LINENO}: using libpng static linkage" >&5 $as_echo "$as_me: using libpng static linkage" >&6;} LIBS="${LIBS} `libpng-config --static --L_opts`/libpng.a" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking libpng" >&5 $as_echo_n "checking libpng... " >&6; } save_LIBS="${LIBS}" save_CPPFLAGS="${CPPFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in png.h do : ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PNG_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_read_update_info in -lpng" >&5 $as_echo_n "checking for png_read_update_info in -lpng... " >&6; } if ${ac_cv_lib_png_png_read_update_info+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_read_update_info (); int main () { return png_read_update_info (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_read_update_info=yes else ac_cv_lib_png_png_read_update_info=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_read_update_info" >&5 $as_echo "$ac_cv_lib_png_png_read_update_info" >&6; } if test "x$ac_cv_lib_png_png_read_update_info" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPNG 1 _ACEOF LIBS="-lpng $LIBS" fi if test "${ac_cv_header_png_h}"; then if test "${ac_cv_lib_png_png_read_update_info}"; then CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H" LIBS="${LIBS} -lpng" { $as_echo "$as_me:${as_lineno-$LINENO}: libpng header and lib found" >&5 $as_echo "$as_me: libpng header and lib found" >&6;} if test "x$enable_libpng_dynamic" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: using libpng dynamic linkage" >&5 $as_echo "$as_me: using libpng dynamic linkage" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: using libpng static linkage" >&5 $as_echo "$as_me: using libpng static linkage" >&6;} fi else LIBS=${save_LIBS} CPPFLAGS=${save_CPPFLAGS} { $as_echo "$as_me:${as_lineno-$LINENO}: libpng header and lib not found" >&5 $as_echo "$as_me: libpng header and lib not found" >&6;} fi fi fi fi ## --- Darwin ---------------------------------------------------------------- if test x$darwin == "xyes" -a "x$enable_cocoa" != "xno" ; then AGLCPPFLAGS="${CPPFLAGS} -DRGL_USE_COCOA" AGLLIBS="${LIBS} -framework Cocoa" BUILD_AGL_TRUE="" else BUILD_AGL_TRUE="#" fi # ---[ X11 ]------------------------------------------------------------------ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test x$no_x = xyes ; then as_fn_error $? "X11 not found but required, configure aborted." "$LINENO" 5 fi if test -n "${x_includes}"; then CPPFLAGS="${CPPFLAGS} -I${x_includes}" fi if test -n "${x_libraries}"; then LIBS="${LIBS} -L${x_libraries} -lX11" else LIBS="${LIBS} -lX11" fi if test $darwin = yes; then CPPFLAGS="${CPPFLAGS} -DDarwin" # Apple's OpenGL is different from the X11 one - it must be loaded *before* X11 if test -e /System/Library/Frameworks/OpenGL.framework ; then CPPFLAGS="-I/System/Library/Frameworks/OpenGL.framework/Headers ${CPPFLAGS} -DNO_GL_PREFIX" # OSX 10.5 messes up X11; this works around it LIBS="-framework OpenGL -dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib ${LIBS}" fi # some X11 installations on OSX 10.5 feature -rpath which doesn't work when used in # conjunction with 10.4u SDK (and is redundant anyway since OS X always uses full paths) if test rpath`echo "${LIBS}" | sed -n 's/.*-Wl,-rpath,.*/Yes/p' 2>/dev/null` = rpathYes; then LIBS=`echo "${LIBS}" | sed 's:-Wl,-rpath,[^ ]*::'` AGLLIBS=`echo "${AGLLIBS}" | sed 's:-Wl,-rpath,[^ ]*::'` fi # X11 must come *after* the OpenGL stuff CPPFLAGS="${CPPFLAGS} -I/usr/X11R6/include" fi ## --- OpenGL ---------------------------------------------------------------- # Check whether --with-gl-includes was given. if test "${with_gl_includes+set}" = set; then : withval=$with_gl_includes; CPPFLAGS="${CPPFLAGS} -I${withval}" fi if test $darwin != yes; then for ac_header in GL/gl.h GL/glu.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_header_GL_gl_h" = xno; then as_fn_error $? "missing required header GL/gl.h" "$LINENO" 5 fi if test "x$ac_cv_header_GL_glu_h" = xno; then as_fn_error $? "missing required header GL/glu.h" "$LINENO" 5 fi fi # Check whether --with-gl-libs was given. if test "${with_gl_libs+set}" = set; then : withval=$with_gl_libs; LDFLAGS="${LDFLAGS} -L${withval}" L_LIB="-L${withval}" fi # Check whether --with-gl-libname was given. if test "${with_gl_libname+set}" = set; then : withval=$with_gl_libname; lGL=${withval} else lGL=GL fi as_ac_Lib=`$as_echo "ac_cv_lib_$lGL''_glEnd" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnd in -l$lGL" >&5 $as_echo_n "checking for glEnd in -l$lGL... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glEnd (); int main () { return glEnd (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_LIB$lGL" | $as_tr_cpp` 1 _ACEOF LIBS="-l$lGL $LIBS" fi this=`eval echo '${'$as_ac_Lib'}'` if test "x$this" != xyes; then as_fn_error $? "missing required library ${lGL}" "$LINENO" 5 fi # Check whether --with-glu-libname was given. if test "${with_glu_libname+set}" = set; then : withval=$with_glu_libname; lGLU=${withval} else lGLU=GLU fi as_ac_Lib=`$as_echo "ac_cv_lib_$lGLU''_gluProject" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluProject in -l$lGLU" >&5 $as_echo_n "checking for gluProject in -l$lGLU... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluProject (); int main () { return gluProject (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_LIB$lGLU" | $as_tr_cpp` 1 _ACEOF LIBS="-l$lGLU $LIBS" fi this=`eval echo '${'$as_ac_Lib'}'` if test "x$this" != xyes; then as_fn_error $? "missing required library ${lGLU}" "$LINENO" 5 fi if test x$L_LIB != x; then LIBS="${L_LIB} ${LIBS}" fi ## --- FTGL ------------------------------------------------------------------ # Check whether --enable-ftgl was given. if test "${enable_ftgl+set}" = set; then : enableval=$enable_ftgl; fi if test "x$enable_ftgl" != "xno"; then if test "x$darwin" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Darwin, so ensuring /usr/X11/bin is at the head of the PATH..." >&5 $as_echo "$as_me: Darwin, so ensuring /usr/X11/bin is at the head of the PATH..." >&6;} PATH=/usr/X11/bin:${PATH} fi # Extract the first word of "freetype-config", so it can be a program name with args. set dummy freetype-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HAVE_FREETYPE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAVE_FREETYPE_CONFIG"; then ac_cv_prog_HAVE_FREETYPE_CONFIG="$HAVE_FREETYPE_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_HAVE_FREETYPE_CONFIG="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HAVE_FREETYPE_CONFIG" && ac_cv_prog_HAVE_FREETYPE_CONFIG="no" fi fi HAVE_FREETYPE_CONFIG=$ac_cv_prog_HAVE_FREETYPE_CONFIG if test -n "$HAVE_FREETYPE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_FREETYPE_CONFIG" >&5 $as_echo "$HAVE_FREETYPE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$HAVE_FREETYPE_CONFIG" = "xyes"; then CPPFLAGS="${CPPFLAGS} -DHAVE_FREETYPE -Iext/ftgl `freetype-config --cflags`" LIBS="${LIBS} `freetype-config --libs`" AGLCPPFLAGS="${AGLCPPFLAGS} -DHAVE_FREETYPE -Iext/ftgl `freetype-config --cflags`" AGLLIBS="${AGLLIBS} `freetype-config --libs`" { $as_echo "$as_me:${as_lineno-$LINENO}: using Freetype and FTGL" >&5 $as_echo "$as_me: using Freetype and FTGL" >&6;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: compiling without FTGL support" >&5 $as_echo "$as_me: compiling without FTGL support" >&6;} fi ## --- Output ---------------------------------------------------------------- ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi rgl/man/0000755000176000001440000000000012262026222011635 5ustar ripleyusersrgl/man/mesh3d.Rd0000644000176000001440000001144111357613353013323 0ustar ripleyusers\name{mesh3d} \alias{shape3d} \alias{mesh3d} \alias{qmesh3d} \alias{tmesh3d} \alias{dot3d} \alias{dot3d.qmesh3d} % for back compatibility \alias{dot3d.mesh3d} \alias{wire3d} \alias{wire3d.qmesh3d} % for back compatibility \alias{wire3d.mesh3d} \alias{shade3d} \alias{shade3d.qmesh3d} % for back compatibility \alias{shade3d.mesh3d} \alias{cube3d} \alias{oh3d} \alias{tetrahedron3d} \alias{octahedron3d} \alias{icosahedron3d} \alias{dodecahedron3d} \alias{cuboctahedron3d} \title{3D Mesh objects} \description{ 3D triangle and quadrangle mesh object creation and a collection of sample objects. } \usage{ qmesh3d(vertices, indices, homogeneous = TRUE, material = NULL, normals = NULL, texcoords = NULL) tmesh3d(vertices, indices, homogeneous = TRUE, material = NULL, normals = NULL, texcoords = NULL) cube3d(trans = identityMatrix(), ...) tetrahedron3d(trans = identityMatrix(), ...) octahedron3d(trans = identityMatrix(), ...) icosahedron3d(trans = identityMatrix(), ...) dodecahedron3d(trans = identityMatrix(), ...) cuboctahedron3d(trans = identityMatrix(), ...) oh3d(trans = identityMatrix(), ...) # an 'o' object dot3d(x, ...) # draw dots at the vertices of an object \method{dot3d}{mesh3d}(x, override = TRUE, ...) wire3d(x, ...) # draw a wireframe object \method{wire3d}{mesh3d}(x, override = TRUE, ...) shade3d(x, ...) # draw a shaded object \method{shade3d}{mesh3d}(x, override = TRUE, ...) } \arguments{ \item{x}{a \code{mesh3d} object (class \code{qmesh3d} or \code{tmesh3d})} \item{vertices}{3- or 4-component vector of coordinates} \item{indices}{4-component vector of vertex indices} \item{homogeneous}{logical indicating if homogeneous (four component) coordinates are used.} \item{material}{material properties for later rendering} \item{normals}{normals at each vertex} \item{texcoords}{texture coordinates at each vertex} \item{trans}{transformation to apply to objects; see below for defaults} \item{...}{additional rendering parameters} \item{override}{should the parameters specified here override those stored in the object?} } \details{ These functions create and work with \code{mesh3d} objects, which consist of a matrix of vertex coordinates together with a matrix of indices indicating which vertex is part of which face. Such objects may have triangular faces, planar quadrilateral faces, or both. The sample objects optionally take a matrix transformation \code{trans} as an argument. This transformation is applied to all vertices of the default shape. The default is an identity transformation. The \code{"shape3d"} class is a general class for shapes that can be plotted by \code{dot3d}, \code{wire3d} or \code{shade3d}. The \code{"mesh3d"} class is a class of objects that form meshes: the vertices are in member \code{vb}, as a 3 or 4 by \code{n} matrix. Meshes with triangular faces will contain \code{it}, a \code{3 * n} matrix giving the indices of the vertices in each face. Quad meshes will have vertex indices in \code{ib}, a \code{4 * n} matrix. } \value{ \code{qmesh3d}, \code{cube3d}, \code{oh3d}, \code{tmesh3d}, \code{tetrahedron3d}, \code{octahedron3d}, \code{icosahedron3d} and \code{dodecahedron3d} return objects of class \code{c("mesh3d", "shape3d")}. The first three of these are quad meshes, the rest are triangle meshes. \code{dot3d}, \code{wire3d}, and \code{shade3d} are called for their side effect of drawing an object into the scene; they return an object ID (or vector of IDs, for some classes) invisibly. See \code{\link{rgl.primitive}} for a discussion of texture coordinates. } \examples{ # generate a quad mesh object vertices <- c( -1.0, -1.0, 0, 1.0, 1.0, -1.0, 0, 1.0, 1.0, 1.0, 0, 1.0, -1.0, 1.0, 0, 1.0 ) indices <- c( 1, 2, 3, 4 ) open3d() wire3d( qmesh3d(vertices,indices) ) # render 4 meshes vertically in the current view open3d() bg3d("gray") l0 <- oh3d(tran = par3d("userMatrix"), color = "green" ) shade3d( translate3d( l0, -6, 0, 0 )) l1 <- subdivision3d( l0 ) shade3d( translate3d( l1 , -2, 0, 0 ), color="red", override = FALSE ) l2 <- subdivision3d( l1 ) shade3d( translate3d( l2 , 2, 0, 0 ), color="red", override = TRUE ) l3 <- subdivision3d( l2 ) shade3d( translate3d( l3 , 6, 0, 0 ), color="red" ) # render all of the Platonic solids open3d() shade3d( translate3d( tetrahedron3d(col="red"), 0, 0, 0) ) shade3d( translate3d( cube3d(col="green"), 3, 0, 0) ) shade3d( translate3d( octahedron3d(col="blue"), 6, 0, 0) ) shade3d( translate3d( dodecahedron3d(col="cyan"), 9, 0, 0) ) shade3d( translate3d( icosahedron3d(col="magenta"), 12, 0, 0) ) } \seealso{ \code{\link{r3d}}, \code{\link{par3d}}, \code{\link{shapelist3d}} for multiple shapes } \keyword{dynamic} rgl/man/rgl-internal.Rd0000644000176000001440000000256112204542125014527 0ustar ripleyusers\name{rgl-internal} \title{Internal rgl functions and data} \alias{rgl.bool} \alias{rgl.numeric} \alias{rgl.range} \alias{rgl.vertex} \alias{rgl.nvertex} \alias{rgl.color} \alias{rgl.mcolor} \alias{rgl.clamp} \alias{rgl.attr} \alias{rgl.enum} \alias{rgl.enum.gl2ps} \alias{rgl.enum.nodetype} \alias{rgl.enum.pixfmt} \alias{rgl.enum.polymode} \alias{rgl.enum.textype} \alias{rgl.enum.fogtype} \alias{rgl.enum.primtype} \alias{rgl.enum.halign} \alias{rgl.enum.texmagfilter} \alias{rgl.enum.texminfilter} \alias{rgl.selectstate} \alias{rgl.setselectstate} \alias{edgemap} \alias{edgeindex} \alias{cube3d.ib} \alias{cube3d.vb} \alias{oh3d.ib} \alias{oh3d.vb} \alias{dev3d} \description{ internal rgl functions } \usage{ rgl.bool(x) rgl.numeric(x) rgl.range(x, low, high) rgl.vertex(x, y = NULL, z = NULL) rgl.nvertex(vertex) rgl.color(color) rgl.mcolor(colors) rgl.clamp(value, low, high) rgl.attr(vattr, nvertex) rgl.enum(name, ..., multi = FALSE) rgl.enum.gl2ps(postscripttype) rgl.enum.nodetype(type) rgl.enum.pixfmt(fmt) rgl.enum.polymode(mode) rgl.enum.textype(textype) rgl.enum.fogtype(fogtype) rgl.enum.primtype(primtype) rgl.enum.halign(halign) rgl.enum.texmagfilter(magfiltertype) rgl.enum.texminfilter(minfiltertype) rgl.selectstate() rgl.setselectstate(state) edgemap(size) edgeindex(from,to,size,row,col) } \details{ These are not to be called by the user. } \keyword{internal} rgl/man/cylinder3d.Rd0000644000176000001440000000775312165640570014212 0ustar ripleyusers\name{cylinder3d} \alias{cylinder3d} \title{ Create cylindrical or "tube" plots. } \description{ This function converts a description of a space curve into a \code{\link[=mesh3d]{"mesh3d"}} object forming a cylindrical tube around the curve. } \usage{ cylinder3d(center, radius = 1, twist = 0, e1 = NULL, e2 = NULL, e3 = NULL, sides = 8, section = NULL, closed = 0, debug = FALSE, keepVars = FALSE) } \arguments{ \item{center}{An n by 3 matrix whose columns are the x, y and z coordinates of the space curve.} \item{radius}{The radius of the cross-section of the tube at each point in the center.} \item{twist}{The amount by which the polygon forming the tube is twisted at each point.} \item{e1, e2, e3}{The Frenet coordinates to use at each point on the space curve.} \item{sides}{The number of sides in the polygon cross section.} \item{section}{The polygon cross section as a two-column matrix, or \code{NULL}.} \item{closed}{Whether to treat the first and last points of the space curve as identical, and close the curve, or put caps on the ends. See the Details.} \item{debug}{If \code{TRUE}, plot the local Frenet coordinates at each point.} \item{keepVars}{If \code{TRUE}, return the local variables in attribute \code{"vars"}.} } \details{ The number of points in the space curve is determined by the vector lengths in \code{center}, after using \code{\link{xyz.coords}} to convert it to a list. The other arguments \code{radius}, \code{twist}, \code{e1}, \code{e2}, and \code{e3} are extended to the same length. The \code{closed} argument controls how the ends of the cylinder are handled. If \code{closed > 0}, it represents the number of points of overlap in the coordinates. \code{closed == TRUE} is the same as \code{closed = 1}. Negative values indicate that caps should be put on the ends of the cylinder. If \code{closed == -1}, a cap will be put on the end corresponding to \code{center[1,]}. If \code{closed == -2}, caps will be put on both ends. If \code{section} is \code{NULL} (the default), a regular \code{sides}-sided polygon is used, and \code{radius} measures the distance from the center of the cylinder to each vertex. If not \code{NULL}, \code{sides} is ignored (and set internally to \code{nrow(section)}), and \code{radius} is used as a multiplier to the vertex coordinates. \code{twist} specifies the rotation of the polygon. Both \code{radius} and \code{twist} may be vectors, with values recycled to the number of rows in \code{center}, while \code{sides} and \code{section} are the same at every point along the curve. The three optional arguments \code{e1}, \code{e2}, and \code{e3} determine the local coordinate system used to create the vertices at each point in \code{center}. If missing, they are computed by simple numerical approximations. \code{e1} should be the tangent coordinate, giving the direction of the curve at the point. The cross-section of the polygon will be orthogonal to \code{e1}. \code{e2} defaults to an approximation to the normal or curvature vector; it is used as the image of the \code{y} axis of the polygon cross-section. \code{e3} defaults to an approximation to the binormal vector, to which the \code{x} axis of the polygon maps. The vectors are orthogonalized and normalized at each point. } \value{ A \code{\link[=mesh3d]{"mesh3d"}} object holding the cylinder, possibly with attribute \code{"vars"} containing the local environment of the function. } \author{ Duncan Murdoch } \examples{ # A trefoil knot open3d() theta <- seq(0, 2*pi, len=25) knot <- cylinder3d(cbind(sin(theta)+2*sin(2*theta), 2*sin(3*theta), cos(theta)-2*cos(2*theta)), e1=cbind(cos(theta)+4*cos(2*theta), 6*cos(3*theta), sin(theta)+4*sin(2*theta)), radius=0.8, closed=TRUE) shade3d(addNormals(subdivision3d(knot, depth=2)), col="green") } \keyword{ dynamic } rgl/man/plot3d.Rd0000644000176000001440000000646212043607530013345 0ustar ripleyusers\name{plot3d} \alias{plot3d} \alias{plot3d.default} \alias{plot3d.mesh3d} \alias{decorate3d} \title{3D Scatterplot} \description{ Draws a 3D scatterplot. } \usage{ plot3d(x, ...) \method{plot3d}{default}(x, y, z, xlab, ylab, zlab, type = "p", col, size, lwd, radius, add = FALSE, aspect = !add, ...) \method{plot3d}{mesh3d}(x, xlab = "x", ylab = "y", zlab = "z", type = c("shade", "wire", "dots"), add = FALSE, ...) decorate3d(xlim, ylim, zlim, xlab = "x", ylab = "y", zlab = "z", box = TRUE, axes = TRUE, main = NULL, sub = NULL, top = TRUE, aspect = FALSE, expand = 1.03, ...) } \arguments{ \item{x, y, z}{vectors of points to be plotted. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{xlab, ylab, zlab}{labels for the coordinates.} \item{type}{For the default method, a single character indicating the type of item to plot. Supported types are: 'p' for points, 's' for spheres, 'l' for lines, 'h' for line segments from \code{z=0}, and 'n' for nothing. For the \code{mesh3d} method, one of 'shade', 'wire', or 'dots'. Partial matching is used. } \item{col}{the colour to be used for plotted items.} \item{size}{the size for plotted points.} \item{lwd}{the line width for plotted items.} \item{radius}{the radius of spheres: see Details below.} \item{add}{whether to add the points to an existing plot.} \item{aspect}{either a logical indicating whether to adjust the aspect ratio, or a new ratio.} \item{expand}{how much to expand the box around the data, if it is drawn.} \item{\dots}{additional parameters which will be passed to \code{\link{par3d}}, \code{\link{material3d}} or \code{decorate3d}.} \item{xlim, ylim, zlim}{limits to use for the coordinates.} \item{box, axes}{whether to draw a box and axes.} \item{main, sub}{main title and subtitle.} \item{top}{whether to bring the window to the top when done.} } \value{ \code{plot3d} is called for the side effect of drawing the plot; a vector of object IDs is returned. \code{decorate3d} adds the usual decorations to a plot: labels, axes, etc. } \details{ \code{plot3d} is a partial 3D analogue of plot.default. Note that since \code{rgl} does not currently support clipping, all points will be plotted, and \code{xlim}, \code{ylim}, and \code{zlim} will only be used to increase the respective ranges. Missing values in the data are skipped, as in standard graphics. If \code{aspect} is \code{TRUE}, aspect ratios of \code{c(1,1,1)} are passed to \code{\link{aspect3d}}. If \code{FALSE}, no aspect adjustment is done. In other cases, the value is passed to \code{\link{aspect3d}}. With \code{type = "s"}, spheres are drawn centered at the specified locations. The radius may be controlled by \code{size} (specifying the size relative to the plot display, with the default \code{size=3} giving a radius about 1/20 of the plot region) or \code{radius} (specifying it on the data scale if an isometric aspect ratio is chosen, or on an average scale if not). } \author{ Duncan Murdoch } \seealso{ \code{\link{plot.default}}, \code{\link{open3d}}, \code{\link{par3d}}. } \examples{ open3d() x <- sort(rnorm(1000)) y <- rnorm(1000) z <- rnorm(1000) + atan2(x,y) plot3d(x, y, z, col=rainbow(1000)) } \keyword{dynamic} rgl/man/spheres.Rd0000644000176000001440000000301411554706737013616 0ustar ripleyusers\name{spheres} \alias{rgl.spheres} \alias{spheres3d} \title{add sphere set shape} \description{ Adds a sphere set shape node to the scene } \usage{ spheres3d(x, y = NULL, z = NULL, radius = 1, ...) rgl.spheres(x, y = NULL, z = NULL, radius, ...) } \arguments{ \item{x, y, z}{Numeric vector of point coordinates corresponding to the center of each sphere. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{radius}{Vector or single value defining the sphere radius/radii} \item{ ... }{Material properties. See \code{\link{rgl.material}} for details.} } \details{ If a non-isometric aspect ratio is chosen, these functions will still draw objects that appear to the viewer to be spheres. Use \code{\link{ellipse3d}} to draw shapes that are spherical in the data scale. When the scale is not isometric, the radius is measured in an average scale. In this case the bounding box calculation is iterative, since rescaling the plot changes the shape of the spheres in user-coordinate, which changes the bounding box. Versions of \code{rgl} prior to 0.92.802 did not do this iterative adjustment. If any coordinate or radius is \code{NA}, the sphere is not plotted. } \value{ A shape ID of the spheres object is returned. } \examples{ open3d() spheres3d(rnorm(10), rnorm(10), rnorm(10), radius=runif(10), color=rainbow(10)) } \seealso{ \code{\link{rgl.material}}, \code{\link{aspect3d}} for setting non-isometric scales } \keyword{dynamic} rgl/man/subdivision3d.Rd0000644000176000001440000000301211153473076014720 0ustar ripleyusers\name{subdivision3d} \alias{subdivision3d} \alias{subdivision3d.mesh3d} \alias{divide.mesh3d} \alias{normalize.mesh3d} \alias{deform.mesh3d} \title{generic subdivision surface method} \description{ The Subdivision surface algorithm divide and refine (deform) a given mesh recursively to certain degree (depth). The mesh3d algorithm consists of two stages: divide and deform. The divide step generates for each triangle or quad four new triangles or quads, the deform step drags the points (refinement step). } \usage{ subdivision3d( x, ...) \method{subdivision3d}{mesh3d}( x, depth=1, normalize=FALSE, deform=TRUE, ... ) divide.mesh3d(mesh, vb=mesh$vb, ib=mesh$ib, it=mesh$it ) normalize.mesh3d(mesh) deform.mesh3d(mesh,vb=mesh$vb,ib=mesh$ib,it=mesh$it ) } \arguments{ \item{x}{3d geometry mesh} \item{mesh}{3d geometry mesh} \item{depth}{recursion depth} \item{normalize}{normalize mesh3d coordinates after division if \code{deform} is \code{TRUE}} \item{deform}{deform mesh} \item{it}{indices for triangular faces} \item{ib}{indices for quad faces} \item{vb}{matrix of vertices: 4xn matrix (rows x,y,z,h) or equivalent vector, where h indicates scaling of each plotted quad} \item{...}{other arguments (unused)} } \details{ Generic subdivision surface method. Currently there exists an algorithm that can be applied on mesh3d objects. } \examples{ open3d() shade3d( subdivision3d( cube3d(), depth=3 ), color="red", alpha=0.5 ) } \seealso{ \code{\link{r3d}} \code{\link{mesh3d}} } \keyword{dynamic} rgl/man/rgl.pixels.Rd0000644000176000001440000000300711330552716014222 0ustar ripleyusers\name{rgl.pixels} \alias{rgl.pixels} \title{ Extract pixel information from window } \description{ This function extracts single components of the pixel information from the topmost window. } \usage{ rgl.pixels(component = c("red", "green", "blue"), viewport=par3d("viewport"), top = TRUE) } \arguments{ \item{component}{ Which component(s)? } \item{viewport}{ Lower left corner and size of desired region. } \item{top}{ Whether to bring window to top before reading. } } \details{ The possible components are \code{"red"}, \code{"green"}, \code{"blue"}, \code{"alpha"}, \code{"depth"}, and \code{"luminance"} (the sum of the three colours). All are scaled from 0 to 1. Note that the luminance is kept below 1 by truncating the sum; this is the definition used for the \code{GL_LUMINANCE} component in OpenGL. } \value{ A vector, matrix or array containing the desired components. If one component is requested, a vector or matrix will be returned depending on the size of block requested (length 1 dimensions are dropped); if more, an array, whose last dimension is the list of components. } \author{ Duncan Murdoch } \seealso{ \code{\link{rgl.snapshot}} to write a copy to a file, \code{demo("stereo")} for functions that make use of this to draw a random dot stereogram and an anaglyph. } \examples{ example(surface3d) depth <- rgl.pixels(component="depth") if (length(depth) && is.matrix(depth)) # Protect against empty or single pixel windows contour(depth) } \keyword{ dynamic } rgl/man/sprites.Rd0000644000176000001440000000540511764655372013645 0ustar ripleyusers\name{sprites} \alias{sprites3d} \alias{particles3d} \alias{rgl.sprites} \title{add sprite set shape} \description{ Adds a sprite set shape node to the scene. } \usage{ sprites3d(x, y = NULL, z = NULL, radius = 1, shapes = NULL, userMatrix, ...) particles3d(x, y = NULL, z = NULL, radius = 1, ...) rgl.sprites(x, y = NULL, z = NULL, radius = 1, shapes = NULL, userMatrix, ...) } \arguments{ \item{ x, y, z }{point coordinates. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{ radius }{vector or single value defining the sphere radius} \item{ shapes }{\code{NULL} for a simple square, or a vector of identifiers of shapes in the scene} \item{ userMatrix }{if \code{shape} is not \code{NULL}, the transformation matrix for the shapes} \item{ ... }{material properties when \code{shape == 0}, texture mapping is supported} } \details{ Simple sprites (used when \code{shapes} is \code{NULL}) are 1 by 1 squares that are directed towards the viewpoint. Their primary use is for fast (and faked) atmospherical effects, e.g. particles and clouds using alpha blended textures. Particles are Sprites using an alpha- blended particle texture giving the illusion of clouds and gasses. The centre of each square will be at the coordinates given by \code{x, y, z}. When \code{shapes} is not \code{NULL}, it should be a vector of identifers of objects to plot in the scene (e.g. as returned by plotting functions or by \code{\link{rgl.ids}}). These objects will be removed from the scene and duplicated as a sprite image in a constant orientation, as specified by \code{userMatrix}. The origin \code{0,0,0} will be plotted at the coordinates given by \code{x, y, z}. The \code{userMatrix} argument is ignored for \code{shapes=NULL}. For shapes, \code{sprites3d} defaults the matrix to \code{r3dDefaults$userMatrix} while \code{rgl.sprites} defaults it to an identity transformation. If any coordinate is \code{NA}, the sprite is not plotted. The id values of the shapes are retrieved using \code{rgl.attrib(id, "ids")}; the user matrix is retrieved using \code{rgl.attrib(id, "usermatrix")}. } \value{ These functions are called for the side effect of displaying the sprites. The shape ID of the displayed object is returned. } \examples{ open3d() particles3d( rnorm(100), rnorm(100), rnorm(100), color=rainbow(100) ) # is the same as sprites3d( rnorm(100), rnorm(100), rnorm(100), color=rainbow(100), lit=FALSE, alpha=.2, textype="alpha", texture=system.file("textures/particle.png", package="rgl") ) sprites3d( rnorm(10)+6, rnorm(10), rnorm(10), shape=shade3d(tetrahedron3d(), col="red") ) } \seealso{ \code{\link{rgl.material}} } \keyword{dynamic} rgl/man/rgl.bringtotop.Rd0000644000176000001440000000162211257014113015076 0ustar ripleyusers\name{rgl.bringtotop} \alias{rgl.bringtotop} \title{Assign focus to an RGL window } \description{ 'rgl.bringtotop' brings the current RGL window to the front of the window stack (and gives it focus).} \usage{ rgl.bringtotop(stay = FALSE) } \arguments{ \item{stay}{whether to make the window stay on top.} } \details{ If \code{stay} is \code{TRUE}, then the window will stay on top of normal windows. } \author{ Ming Chen/Duncan Murdoch } \note{not completely implemented for X11 graphics (stay not implemented; window managers such as KDE may block this action (set "Focus stealing prevention level" to None in Control Center/Window Behavior/Advanced)). Not currently implemented under OS/X.} #ifdef windows \seealso{\code{\link[grDevices]{bringToTop}}} #endif \examples{ rgl.open() rgl.points(rnorm(1000), rnorm(1000), rnorm(1000), color=heat.colors(1000)) rgl.bringtotop(stay = TRUE) } \keyword{ dynamic } rgl/man/viewpoint.Rd0000644000176000001440000000340411210104425014143 0ustar ripleyusers\name{viewpoint} \alias{rgl.viewpoint} \alias{view3d} \title{Set up viewpoint} \description{ Set the viewpoint orientation. } \usage{ view3d( theta = 0, phi = 15, ...) rgl.viewpoint( theta = 0, phi = 15, fov = 60, zoom = 1, scale = par3d("scale"), interactive = TRUE, userMatrix ) } \arguments{ \item{theta,phi}{polar coordinates} \item{...}{additional parameters to pass to \code{rgl.viewpoint}} \item{fov}{field-of-view angle in degrees} \item{zoom}{zoom factor} \item{scale}{real length 3 vector specifying the rescaling to apply to each axis} \item{interactive}{logical, specifying if interactive navigation is allowed} \item{userMatrix}{4x4 matrix specifying user point of view} } \details{ The viewpoint can be set in an orbit around the data model, using the polar coordinates \code{theta} and \code{phi}. Alternatively, it can be set in a completely general way using the 4x4 matrix \code{userMatrix}. If \code{userMatrix} is specified, \code{theta} and \code{phi} are ignored. The pointing device of your graphics user-interface can also be used to set the viewpoint interactively. With the pointing device the buttons are by default set as follows: \describe{ \item{left}{adjust viewpoint position} \item{middle}{adjust field of view angle} \item{right or wheel}{adjust zoom factor} } If the \code{fov} angle is set to 0, a parallel or orthogonal projection is used. Small non-zero values (e.g. 0.01 or less, but not 0.0) are likely to lead to rendering errors due to OpenGL limitations. } \seealso{\code{\link{par3d}}} \examples{ \dontrun{ # animated round trip tour for 10 seconds rgl.open() shade3d(oh3d(), color="red") start <- proc.time()[3] while ((i <- 36*(proc.time()[3]-start)) < 360) { rgl.viewpoint(i,i/4); } } } \keyword{dynamic} rgl/man/writePLY.Rd0000644000176000001440000000546612136474243013670 0ustar ripleyusers\name{writePLY} \alias{writePLY} \title{ Write Stanford PLY format files } \description{ This function writes PLY files. This is a simple file format that is commonly used in 3D printing. It does not represent text, only edges and polygons. The \code{writePLY} function does the necessary conversions. } \usage{ writePLY(con, format = c("little_endian", "big_endian", "ascii"), pointRadius = 0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, pointsAsEdges = FALSE, linesAsEdges = pointsAsEdges, withColors = TRUE, withNormals = !(pointsAsEdges || linesAsEdges), ids = NULL) } \arguments{ \item{con}{ A connection or filename. } \item{format}{ Which output format. Defaults to little-endian binary. } \item{pointRadius, lineRadius}{ The radius of points and lines relative to the overall scale of the figure, if they are converted to polyhedra. } \item{pointShape}{ A mesh shape to use for points if they are converted. It is scaled by the \code{pointRadius}. } \item{lineSides}{ Lines are rendered as cylinders with this many sides. } \item{pointsAsEdges, linesAsEdges}{ Whether to convert points and lines to \dQuote{Edge} records in the PLY output. } \item{withColors}{ Whether to output vertex colour information. } \item{withNormals}{ Whether to output vertex normals for smooth shading. } \item{ids}{ The identifiers (from \code{\link{rgl.ids}}) of the objects to write. If \code{NULL}, try to write everything. } } \details{ The current implementation only outputs triangles, quads, planes, spheres, points, line segments, line strips and surfaces. The defaults for \code{pointsAsEdges} and \code{linesAsEdges} have been chosen because Blender (\url{http://www.blender.org}) does not import lines, only polygons. If you are exporting to other software you may want to change them. Since the PLY format only allows one object per file, all RGL objects are combined into a single object when output. The output file is readable by Blender and Meshlab; the latter can write in a number of other formats, including U3D, suitable for import into a PDF document. } \value{ Invisibly returns the name of the connection to which the data was written. } \references{ The file format was found at \url{http://www.mathworks.com/matlabcentral/fx_files/5459/1/content/ply.htm} on November 10, 2012. } \author{ Duncan Murdoch } \seealso{ \code{\link{scene3d}} saves a copy of a scene to an R variable; \code{\link{writeWebGL}}, \code{\link{writeOBJ}} and \code{\link{writeSTL}} write the scene to a file in various other formats. } \examples{ filename <- tempfile(fileext=".ply") open3d() shade3d( icosahedron3d(col="magenta") ) writePLY(filename) } \keyword{ graphics } rgl/man/extrude3d.Rd0000644000176000001440000000272212207642331014042 0ustar ripleyusers\name{extrude3d} \alias{extrude3d} \title{ Generate extrusion mesh } \description{ Given a two-dimensional polygon, this generates a three-dimensional extrusion of the shape by triangulating the polygon and creating a cylinder with that shape as the end faces. } \usage{ extrude3d(x, y = NULL, thickness = 1, smooth = FALSE, ...) } \arguments{ \item{x, y}{ A polygon description in one of the forms supported by \code{\link{triangulate}}. } \item{thickness}{ The extrusion will have this thickness. } \item{smooth}{ logical; should normals be added so that the edges of the extrusion appear smooth? } \item{\dots}{ Other parameters to pass to \code{\link{tmesh3d}} when constructing the mesh. } } \details{ The extrusion is always constructed with the polygon in the xy plane at \code{z = 0} and another copy at \code{z = thickness}. Use the transformation functions (e.g. \code{\link{rotate3d}}) to obtain other orientations and placements. } \value{ A mesh object containing a triangulation of the polygon for each face, and quadrilaterals for the sides. } \author{ Duncan Murdoch } \seealso{ \code{\link{polygon3d}} for a simple polygon, \code{\link{triangulate}} for the triangulation, \code{\link{turn3d}} for a solid of rotation. } \examples{ x <- c(1:10, 10:1) y <- rev(c(rep(c(0,2), 5), rep(c(1.5,-0.5),5))) plot(x, y, type="n") polygon(x, y) open3d() shade3d( extrude3d(x, y), col = "red" ) } \keyword{ graphics } rgl/man/par3dinterp.Rd0000644000176000001440000000550311257014113014361 0ustar ripleyusers\name{par3dinterp} \alias{par3dinterp} \title{Interpolator for par3d parameters} \description{ Returns a function which interpolates \code{par3d} parameter values, suitable for use in animations. } \usage{ par3dinterp(times = NULL, userMatrix, scale, zoom, FOV, method = c("spline", "linear"), extrapolate = c("oscillate", "cycle", "constant", "natural")) } \arguments{ \item{times}{ Times at which values are recorded or a list; see below } \item{userMatrix}{ Values of \code{par3d("userMatrix")} } \item{scale}{ Values of \code{par3d("scale")} } \item{zoom}{ Values of \code{par3d("zoom")} } \item{FOV}{ Values of \code{par3d("FOV")} } \item{method}{ Method of interpolation } \item{extrapolate}{ How to extrapolate outside the time range } } \details{ This function is intended to be used in constructing animations. It produces a function that returns a list suitable to pass to \code{\link{par3d}}, to set the viewpoint at a given point in time. All of the parameters are optional. Only those \code{par3d} parameters that are specified will be returned. The input values other than \code{times} may each be specified as lists, giving the parameter value settings at a fixed time, or as matrices or arrays. If not lists, the following formats should be used: \code{userMatrix} can be a \code{4 x 4 x n} array, or a \code{4 x 4n} matrix; \code{scale} should be an \code{n x 3} matrix; \code{zoom} and \code{FOV} should be length \code{n} vectors. An alternative form of input is to put all of the above arguments into a list (i.e. a list of lists, or a list of arrays/matrices/vectors), and pass it as the first argument. This is the most convenient way to use this function with the \code{\link[tkrgl:tkrgl-package]{tkrgl}} function \code{\link[tkrgl]{par3dsave}}. Interpolation is by cubic spline or linear interpolation in an appropriate coordinate-wise fashion. Extrapolation may oscillate (repeat the sequence forward, backward, forward, etc.), cycle (repeat it forward), be constant (no repetition outside the specified time range), or be natural (linear on an appropriate scale). In the case of cycling, the first and last specified values should be equal, or the last one will be dropped. Natural extrapolation is only supported with spline interpolation. } \value{ A function is returned. The function takes one argument, and returns a list of \code{par3d} settings interpolated to that time. } \note{ Due to a bug in R (fixed in R 2.6.0), using \code{extrapolate} equal to \code{"oscillate"} will sometimes fail when only two points are given. } \author{Duncan Murdoch } \seealso{ \code{\link{play3d}} to play the animation. } \examples{ f <- par3dinterp( zoom = c(1,2,3,1) ) f(0) f(1) f(0.5) \dontrun{ play3d(f) } } \keyword{ dplot } rgl/man/postscript.Rd0000644000176000001440000000343312177136336014356 0ustar ripleyusers\name{rgl.postscript} \alias{rgl.postscript} \title{export screenshot} \description{ Saves the screenshot to a file in PostScript or other vector graphics format. } \usage{ rgl.postscript( filename, fmt="eps", drawText=TRUE ) } \arguments{ \item{filename}{full path to filename.} \item{fmt}{export format, currently supported: ps, eps, tex, pdf, svg, pgf } \item{drawText}{logical, whether to draw text} } \details{ Animations can be created in a loop modifying the scene and saving a screenshot to a file. (See example below) This function is a wrapper for the GL2PS library by Christophe Geuzaine, and has the same limitations as that library: not all OpenGL features are supported, and some are only supported in some formats. See the reference for full details. } \references{ GL2PS: an OpenGL to PostScript printing library by Christophe Geuzaine, \url{http://www.geuz.org/gl2ps/}, version 1.3.8. } \author{ Christophe Geuzaine / Albrecht Gebhardt } \examples{ x <- y <- seq(-10,10,length=20) z <- outer(x,y,function(x,y) x^2 + y^2) persp3d(x,y,z, col='lightblue') title3d("Using LaTeX text", col='red', line=3) rgl.postscript("persp3da.ps","ps",drawText=FALSE) rgl.postscript("persp3da.pdf","pdf",drawText=FALSE) rgl.postscript("persp3da.tex","tex") rgl.pop() title3d("Using ps/pdf text", col='red', line=3) rgl.postscript("persp3db.ps","ps") rgl.postscript("persp3db.pdf","pdf") rgl.postscript("persp3db.tex","tex",drawText=FALSE) \dontrun{ # # create a series of frames for an animation # rgl.open() shade3d(oh3d(), color="red") rgl.viewpoint(0,20) for (i in 1:45) { rgl.viewpoint(i,20) filename <- paste("pic",formatC(i,digits=1,flag="0"),".eps",sep="") rgl.postscript(filename, fmt="eps") } } } \seealso{ \code{\link{rgl.viewpoint}}, \code{\link{rgl.snapshot}} } \keyword{dynamic} rgl/man/triangulate.Rd0000644000176000001440000000531712166643460014465 0ustar ripleyusers\name{triangulate} \alias{triangulate} \title{ Triangulate a two-dimensional polygon. } \description{ This algorithm decomposes a general polygon into simple polygons and uses the \dQuote{ear-clipping} algorithm to triangulate it. Polygons with holes are supported. } \usage{ triangulate(x, y = NULL, random = TRUE, plot = FALSE, partial = NA) } \arguments{ \item{x, y}{ Coordinates of a two-dimensional polygon in a format supported by \code{\link{xy.coords}}. } \item{random}{ Whether to use a random or deterministic triangulation. } \item{plot}{ Whether to plot the triangulation; mainly for debugging purposes. } \item{partial}{ If the triangulation fails, should partial results be returned? } } \details{ The algorithm works as follows. First, it breaks the polygon into pieces separated by \code{NA} values in \code{x} or \code{y}. Each of these pieces should be a simple, non-self-intersecting polygon, separate from the other pieces. (Though some minor exceptions to this rule may work, none are guaranteed). The nesting of these pieces is determined. The \dQuote{outer} polygon(s) are then merged with the polygons that they immediately contain, and each of these pieces is triangulated using the ear-clipping algorithm. Finally, all the triangulated pieces are put together into one result. } \value{ A three-by-n array giving the indices of the vertices of each triangle. (No vertices are added; only the original vertices are used in the triangulation.) The array has an integer vector attribute \code{"nextvert"} with one entry per vertex, giving the index of the next vertex to proceed counter-clockwise around outer polygon boundaries, clockwise around inner boundaries. } \references{ See the Wikipedia article \dQuote{polygon triangulation} for a description of the ear-clipping algorithm. } \author{ Duncan Murdoch } \note{ Not all inputs will succeed, even when a triangulation is possible. Generally using \code{random = TRUE} will find a successful triangulation if one exists, but it may occasionally take more than one try. } \seealso{ \code{\link{extrude3d}} for a solid extrusion of a polygon, \code{\link{polygon3d}} for a flat display; both use \code{triangulate}. } \examples{ theta <- seq(0, 2*pi, len=25)[-25] theta <- c(theta, NA, theta, NA, theta, NA, theta, NA, theta) r <- c(rep(1.5, 24), NA, rep(0.5, 24), NA, rep(0.5, 24), NA, rep(0.3, 24), NA, rep(0.1, 24)) dx <- c(rep(0, 24), NA, rep(0.6, 24), NA, rep(-0.6, 24), NA, rep(-0.6, 24), NA, rep(-0.6, 24)) x <- r*cos(theta) + dx y <- r*sin(theta) plot(x,y,type="n") polygon(x,y) triangulate(x, y, plot=TRUE) open3d() polygon3d(x, y, x - y, col = "red") } \keyword{ graphics } rgl/man/surface3d.Rd0000644000176000001440000000477211064454445014030 0ustar ripleyusers\name{surface3d} \title{add height-field surface shape} \alias{surface3d} \alias{terrain3d} \description{ Adds a surface to the current scene. The surface is defined by a matrix defining the height of each grid point and two vectors defining the grid. } \usage{ surface3d(x, y, z, ..., normal_x=NULL, normal_y=NULL, normal_z=NULL) terrain3d(x, y, z, ..., normal_x=NULL, normal_y=NULL, normal_z=NULL) } \arguments{ \item{ x }{ values corresponding to rows of \code{z}, or matrix of x coordinates } \item{ y }{ values corresponding to the columns of \code{z}, or matrix of y coordinates } \item{ z }{ matrix of heights } \item{ ... }{Material and texture properties. See \code{\link{rgl.material}} for details.} \item{normal_x, normal_y, normal_z}{ matrices of the same dimension as \code{z} giving the coordinates of normals at each grid point} } \details{ Adds a surface mesh to the current scene. The surface is defined by the matrix of height values in \code{z}, with rows corresponding to the values in \code{x} and columns corresponding to the values in \code{y}. This is the same parametrization as used in \code{\link{persp}}. If the \code{x} or \code{y} argument is a matrix, then it must be of the same dimension as \code{z}, and the values in the matrix will be used for the corresponding coordinates. This is used to plot shapes such as cylinders where z is not a function of x and y. If the normals are not supplied, they will be calculated automatically based on neighbouring points. \code{surface3d} always draws the surface with the `front' upwards (i.e. towards higher \code{z} values). This can be used to render the top and bottom differently; see \code{\link{rgl.material}} and the example below. For more flexibility in defining the surface, use \code{\link{rgl.surface}}. \code{surface3d} and \code{terrain3d} are synonyms. } \examples{ # # volcano example taken from "persp" # data(volcano) z <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N) y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W) zlim <- range(y) zlen <- zlim[2] - zlim[1] + 1 colorlut <- terrain.colors(zlen) # height color lookup table col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point open3d() surface3d(x, y, z, color=col, back="lines") } \seealso{ \code{\link{rgl.material}}, \code{\link{rgl.surface}}. See \code{\link{persp3d}} for a higher level interface. } \keyword{dynamic} rgl/man/callbacks.Rd0000644000176000001440000000404111064454445014055 0ustar ripleyusers\name{rgl.setMouseCallbacks} \alias{rgl.setMouseCallbacks} \title{ User callbacks on mouse events } \description{ This function sets user callbacks on mouse events. } \usage{ rgl.setMouseCallbacks(button, begin = NULL, update = NULL, end = NULL) } \arguments{ \item{button}{ Which button? } \item{begin}{ Called when mouse down event occurs } \item{update}{ Called when mouse moves } \item{end}{ Called when mouse is released } } \details{ This function sets an event handler on mouse events that occur within the current rgl window. The \code{begin} and \code{update} events should be functions taking two arguments; these will be the mouse coordinates when the event occurs. The \code{end} event handler takes no arguments. Alternatively, the handlers may be set to \code{NULL}, the default value, in which case no action will occur. } \value{ This function is called for the side effect of setting the mouse event handlers. } \author{ Duncan Murdoch } \seealso{ \code{\link{par3d}} to set built-in handlers } \examples{ ## Not quite right --- this doesn't play well with rescaling pan3d <- function(button) { start <- list() begin <- function(x, y) { start$userMatrix <<- par3d("userMatrix") start$viewport <<- par3d("viewport") start$scale <<- par3d("scale") start$projection <<- rgl.projection() start$pos <<- rgl.window2user( x/start$viewport[3], 1 - y/start$viewport[4], 0.5, projection=start$projection) } update <- function(x, y) { xlat <- (rgl.window2user( x/start$viewport[3], 1 - y/start$viewport[4], 0.5, projection = start$projection) - start$pos)*start$scale mouseMatrix <- translationMatrix(xlat[1], xlat[2], xlat[3]) par3d(userMatrix = start$userMatrix \%*\% t(mouseMatrix) ) } rgl.setMouseCallbacks(button, begin, update) cat("Callbacks set on button", button, "of rgl device",rgl.cur(),"\n") } pan3d(3) } \keyword{ dynamic } rgl/man/writeOBJ.Rd0000644000176000001440000000577412136474243013640 0ustar ripleyusers\name{writeOBJ} \alias{writeOBJ} \title{ Write Wavefront OBJ format files } \description{ This function writes OBJ files. This is a file format that is commonly used in 3D graphics applications. It does not represent text, but does represent points, lines, polygons (and many other types that RGL doesn't support). } \usage{ writeOBJ(con, pointRadius = 0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, pointsAsPoints = FALSE, linesAsLines = FALSE, withNormals = TRUE, withTextures = TRUE, separateObjects = TRUE, ids = NULL) } \arguments{ \item{con}{ A connection or filename. } \item{pointRadius, lineRadius}{ The radius of points and lines relative to the overall scale of the figure, if they are converted to polyhedra. } \item{pointShape}{ A mesh shape to use for points if they are converted. It is scaled by the \code{pointRadius}. } \item{lineSides}{ Lines are rendered as cylinders with this many sides. } \item{pointsAsPoints, linesAsLines}{ Whether to convert points and lines to \dQuote{point} and \dQuote{line} records in the OBJ output. } \item{withNormals}{ Whether to output vertex normals for smooth shading. } \item{separateObjects}{ Whether to mark each RGL object as a separate object in the file. } \item{withTextures}{ Whether to output texture coordinates. } \item{ids}{ The identifiers (from \code{\link{rgl.ids}}) of the objects to write. If \code{NULL}, try to write everything. } } \details{ The current implementation only outputs triangles, quads, planes, spheres, points, line segments, line strips and surfaces. It does not output material properties such as colours, since the OBJ format does not support the per-vertex colours that RGL uses. The defaults for \code{pointsAsPoints} and \code{linesAsLines} have been chosen because Blender (\url{http://www.blender.org}) does not import points or lines, only polygons. If you are exporting to other software you may want to change them. If present, texture coordinates are output by default, but the textures themselves are not. Individual RGL objects are output as separate objects in the file when \code{separateObjects = TRUE}, the default. The output file should be readable by Blender and Meshlab; the latter can write in a number of other formats, including U3D, suitable for import into a PDF document. } \value{ Invisibly returns the name of the connection to which the data was written. } \references{ The file format was found at \url{http://www.martinreddy.net/gfx/3d/OBJ.spec} on November 11, 2012. } \author{ Duncan Murdoch } \seealso{ \code{\link{scene3d}} saves a copy of a scene to an R variable; \code{\link{writeWebGL}}, \code{\link{writePLY}} and \code{\link{writeSTL}} write the scene to a file in various other formats. } \examples{ filename <- tempfile(fileext=".obj") open3d() shade3d( icosahedron3d() ) writeOBJ(filename) } \keyword{ graphics } rgl/man/writeWebGL.Rd0000644000176000001440000001236712140064304014146 0ustar ripleyusers\name{writeWebGL} \alias{writeWebGL} \title{ Write scene to HTML. } \description{ Writes the current scene to a collection of files that contain WebGL code to reproduce it in a browser. } \usage{ writeWebGL(dir = "webGL", filename = file.path(dir, "index.html"), template = system.file(file.path("WebGL", "template.html"), package = "rgl"), prefix = "", snapshot = TRUE, font = "Arial", width, height) } \arguments{ \item{dir}{ Where to write the files. } \item{filename}{ The filename to use for the main file. } \item{template}{ The template web page to which to write the Javascript for the scene. See Details below. } \item{prefix}{ An optional prefix to use on global identifiers in the scene; use different prefixes for different scenes displayed on the same web page. If not blank, it should be a legal identifier in Javascript and HTML. } \item{snapshot}{ Whether to include a snapshot of the scene, to be displayed in browsers that don't support WebGL. } \item{font}{ The font to use for text. } \item{width, height}{ The (optional) width and height in pixels of the image to display. If omitted, the \code{par3d("windowRect")} dimensions will be used. } } \details{ This function writes out a web page containing Javascript that reconstructs the scene in WebGL. Use the \code{template} argument to give the filename of a web page that is to contain the code for the new scene. It should contain a single line containing \code{paste("\%", prefix, "WebGL\%")}, e.g. \code{\%WebGL\%} with the default empty prefix. That line will be replaced by the Javascript and other code necessary to reproduce the current scene. The template may also contain the string \code{"\%rglVersion\%"} which will be replaced with the current \pkg{rgl} version number. To put more than one scene into a web page, use different values of \code{prefix} for each. The prefix will be used in identifiers in both Javascript and HTML, so it is safest to start with a letter and only use alphanumeric characters. WebGL is a fairly new technology for displaying 3D scenes in browsers. Most current browsers support it to some extent, though it may not be enabled by default; see \url{http://get.webgl.org} for details. A major exception currently is Microsoft's Internet Explorer, though plugins are available. Currently \code{writeWebGL} has a number of known limitations, some of which will be gradually eliminated as development progresses: \itemize{ \item The bounding box decorations are fixed; labels do not move as they do within \R. \item User-defined mouse controls are not supported. \item No automatic movement (e.g. rotation via \code{\link{spin3d}}) is supported. \item Missing values are not handled properly. \item Polygons will only be rendered as filled; there is no support in WebGL for wireframe or point rendering. \item WebGL browsers generally do not support more than 65535 vertices per object. \code{writeWebGL} will print a warning if this limit is exceeded, but it is up to the user to break his scene into smaller objects. (And 65535 vertices may not be small enough!) } } \value{ The \code{filename} is returned. } \references{ \url{http://www.webgl.org} } \author{ Duncan Murdoch. } \note{ The output includes a binary copy of the CanvasMatrix Javascript library. Its source contains the following copyright notice: \preformatted{ /* * Copyright (C) 2009 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ } } \seealso{ \code{\link{scene3d}} saves a copy of a scene to an R variable; \code{\link{writePLY}}, \code{\link{writeOBJ}} and \code{\link{writeSTL}} write the scene to a file in various other formats. } \examples{ \donttest{ plot3d(rnorm(100), rnorm(100), rnorm(100), type="s", col="red") # This writes a copy into temporary directory 'webGL', and then displays it browseURL(paste("file://", writeWebGL(dir=file.path(tempdir(), "webGL"), width=500), sep="")) } } \keyword{ graphics } rgl/man/spin3d.Rd0000644000176000001440000000316712174052714013342 0ustar ripleyusers\name{spin3d} \alias{spin3d} \title{ Create a function to spin a scene at a fixed rate } \description{ This creates a function to use with \code{\link{play3d}} to spin an rgl scene at a fixed rate. } \usage{ spin3d(axis = c(0, 0, 1), rpm = 5) } \arguments{ \item{axis}{ The desired axis of rotation } \item{rpm}{ The rotation speed in rotations per minute } } \value{ A function with header \code{function(time, base=M)}, where \code{M} is the result of \code{par3d("userMatrix")} at the time the function is created. This function calculates and returns a list containing \code{userMatrix} updated by spinning the base matrix for \code{time} seconds at \code{rpm} revolutions per minute about the specified \code{axis}. } \author{ Duncan Murdoch } \seealso{ \code{\link{play3d}} to play the animation } \examples{ # Spin one object open3d() plot3d(oh3d(col="lightblue", alpha=0.5)) if (!rgl.useNULL()) play3d(spin3d(axis=c(1,0,0), rpm=20), duration=3) # Show spinning sprites, and rotate the whole view open3d() spriteid <- NULL spin1 <- spin3d(rpm=3 ) # the scene spinner spin2 <- spin3d(rpm=6 ) # the sprite spinner f <- function(time) { par3d(skipRedraw = TRUE) # stops intermediate redraws on.exit(par3d(skipRedraw=FALSE)) # redraw at the end rgl.pop(id=spriteid) # delete the old sprite cubeid <- shade3d(cube3d(), col="red") spriteid <<- sprites3d(0:1, 0:1, 0:1, shape=cubeid, userMatrix=spin2(time, base=spin1(time)$userMatrix)$userMatrix) spin1(time) } if (!rgl.useNULL()) play3d(f, duration=3) } \keyword{ dplot } rgl/man/abclines.Rd0000644000176000001440000000244711573375333013731 0ustar ripleyusers\name{abclines} \alias{rgl.abclines} \alias{abclines3d} \title{ Lines intersecting the bounding box } \description{ This adds mathematical lines to a scene. Their intersection with the current bounding box will be drawn. } \usage{ rgl.abclines(x, y = NULL, z = NULL, a, b = NULL, c = NULL, ...) abclines3d(x, y = NULL, z = NULL, a, b = NULL, c = NULL, ...) } \arguments{ \item{x,y,z}{ Coordinates of points through which each line passes. } \item{a,b,c}{ Coordinates of the direction vectors for the lines. } \item{...}{ Material properties. } } \details{ These functions draw the segment of a line that intersects the current bounding box of the scene using the parametrization \eqn{ (x,y,z) + (a,b,c) * s } where \eqn{s} is a real number. Any reasonable way of defining the coordinates \code{x,y,z} and \code{a,b,c} is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details. } \value{ A shape ID of the object is returned invisibly. } \seealso{ \code{\link{planes3d}}, \code{\link{rgl.planes}} for mathematical planes. \code{\link{segments3d}} draws sections of lines that do not adapt to the bounding box. } \examples{ plot3d(rnorm(100), rnorm(100), rnorm(100)) abclines3d(0,0,0, a=diag(3), col="gray") } \keyword{ dynamic } rgl/man/attributes.Rd0000644000176000001440000000444412136745735014341 0ustar ripleyusers\name{attributes} \alias{rgl.attrib.count} \alias{rgl.attrib} \title{ Get information about shapes } \description{ Retrieves information about the shapes in a scene. } \usage{ rgl.attrib.count(id, attrib) rgl.attrib(id, attrib, first = 1, last = rgl.attrib.count(id, attrib)) } \arguments{ \item{id}{ A shape identifier, as returned by \code{\link{rgl.ids}}. } \item{attrib}{ An attribute of a shape. Currently supported: one of \code{c("vertices", "normals", "colors", "texcoords", "dim", "texts", "cex", "adj", "radii", "centers", "ids", "usermatrix", "types", "flags" )}, or unique prefixes to one of those. } \item{first, last}{ Specify these to retrieve only those rows of the result. } } \details{ If the identifier is not found or is not a shape that has the given attribute, zero will be returned by \code{rgl.attrib.count}, and an empty matrix will be returned by \code{rgl.attrib}. The first four \code{attrib} names correspond to the usual OpenGL properties; \code{"dim"} is used just for surfaces, defining the rows and columns in the rectangular grid; \code{"cex"} and \code{"adj"} apply only to text objects. } \value{ \code{rgl.attrib.count} returns the count of the requested attribute. \code{rgl.attrib} returns the values of the attribute. Attributes are mostly real-valued, with the following sizes: \describe{ \item{vertices}{3 values, x, y, z} \item{normals}{3 values, x, y, z} \item{centers}{3 values, x, y, z} \item{colors}{4 values, r, g, b, a} \item{texcoords}{2 values, s, t} \item{dim}{2 values, r, c} \item{cex}{1 value} \item{adj}{2 values, x, y} \item{radii}{1 value, r} \item{ids}{1 value, id} \item{usermatrix}{4 values, x, y, z, w} \item{types}{1 value, type} \item{flags}{1 value, flag} } The \code{"texts"} and \code{"types"} attributes are character-valued; the flags attribute is logical valued, with named rows. These are returned as matrices with the row count equal to the count for the attribute, and the columns as listed above. } \author{ Duncan Murdoch } \seealso{ \code{\link{rgl.ids}} } \examples{ p <- plot3d(rnorm(100), rnorm(100), rnorm(100), type="s", col="red") rgl.attrib.count(p["data"], "vertices") rgl.attrib(p["data"], "vertices", last=10) } \keyword{ graphics } rgl/man/addNormals.Rd0000644000176000001440000000204111257014113014204 0ustar ripleyusers\name{addNormals} \alias{addNormals} \alias{addNormals.mesh3d} \alias{addNormals.shapelist3d} \title{ Add normal vectors to objects so they render more smoothly. } \description{ This generic function adds normals at each of the vertices of a polyhedron by averaging the normals of each incident face. This has the effect of making the surface of the object appear smooth rather than faceted when rendered. } \usage{ addNormals(x, ...) } \arguments{ \item{x}{An object to which to add normals.} \item{\dots}{Additional parameters which will be passed to the methods. Currently unused.} } \details{ Currently methods are supplied for \code{\link[=mesh3d]{"mesh3d"}} and \code{\link[=shapelist3d]{"shapelist3d"}} classes. } \value{ A new object of the same class as \code{x}, with normals added. } \author{ Duncan Murdoch } \examples{ open3d() y <- subdivision3d(tetrahedron3d(col="red"), depth=3) shade3d(y) # No normals y <- addNormals(y) shade3d(translate3d(y, x=1, y=0, z=0)) # With normals } \keyword{dynamic} rgl/man/scene3d.Rd0000644000176000001440000000720712262026222013456 0ustar ripleyusers\name{scene3d} \alias{scene3d} \alias{rglscene-class} \alias{rglobject-class} \alias{plot3d.rglscene} \alias{plot3d.rglobject} \alias{print.rglscene} \alias{print.rglobject} \title{ Saves the current scene to a variable, and displays such variables. } \description{ This function saves a large part of the RGL state associated with the current window to a variable. } \usage{ scene3d() \S3method{plot3d}{rglscene}(x, add=FALSE, ...) \S3method{plot3d}{rglobject}(x, ...) \S3method{print}{rglscene}(x, ...) \S3method{print}{rglobject}(x, ...) } \arguments{ \item{x}{An object of class \code{"rglscene"}} \item{add}{Whether to open a new window, or add to the existing one.} \item{...}{Additional parameters, currently ignored.} } \details{ The components saved are: the \code{\link{par3d}} settings, the \code{\link{material3d}} settings, the \code{\link{bg3d}} settings, the lights and the objects in the scene. In most cases, calling \code{\link{plot3d}} on that variable will duplicate the scene. (There are likely to be small differences, mostly internal, but some aspects of the scene are not currently available.) If textures are used, the name of the texture will be saved, rather than the contents of the texture file. Other than saving the code to recreate a scene, saving the result of \code{scene3d} to a file will allow it to be reproduced later most accurately. In roughly decreasing order of fidelity, \code{\link{writeWebGL}}, \code{\link{writePLY}}, \code{\link{writeOBJ}} and \code{\link{writeSTL}} write the scene to a file in formats readable by other software. } \value{ The \code{scene3d} function returns an object of class \code{"rglscene"}. This is a list with some or all of the components \item{par3d}{The results returned from a \code{\link{par3d}} call.} \item{material}{The results returned from a \code{\link{material3d}} call.} \item{bg}{A list containing some of the properties of the scene background.} \item{bbox}{A list containing some of the properties of the scene bounding box decoration.} \item{objects}{A list containing the RGL lights and objects in the scene.} The objects in the \code{objects} component are of class \code{"rglobject"}. They are lists containing some or all of the components \item{id}{The RGL identifier of the object in the original scene.} \item{type}{A character variable identifying the type of object.} \item{material}{Components of the material that differ from the scene material.} \item{vertices, normals, etc.}{Any of the attributes of the object retrievable by \code{\link{rgl.attrib}}.} \item{ignoreExtent}{A logical value indicating whether this object contributes to the bounding box. Currently this may differ from the object in the original scene.} \item{objects}{Sprites may contain other objects; they will be stored here as a list of \code{"rglobject"}s.} Lights in the scene are stored similarly, mixed into the \code{objects} list. The \code{plot3d} methods invisibly return a vector of RGL object ids that were plotted. The \code{print} methods invisibly return the object that was printed. } \author{ Duncan Murdoch } \seealso{ \code{\link{writeWebGL}}, \code{\link{writePLY}}, \code{\link{writeOBJ}} and \code{\link{writeSTL}} write the scene to a file in various formats. } \examples{ open3d() z <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N) y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W) persp3d(x, y, z, col = "green3", aspect="iso") s <- scene3d() # Make it bigger s$par3d$windowRect <- 1.5*s$par3d$windowRect # and draw it again plot3d(s) } \keyword{ graphics } rgl/man/play3d.Rd0000644000176000001440000001016012172230500013312 0ustar ripleyusers\name{play3d} \alias{play3d} \alias{movie3d} \title{ Play animation of rgl scene } \description{ \code{play3d} calls a function repeatedly, passing it the elapsed time in seconds, and using the result of the function to reset the viewpoint. \code{movie3d} does the same, but records each frame to a file to make a movie. } \usage{ play3d(f, duration = Inf, dev = rgl.cur(), ..., startTime = 0) movie3d(f, duration, dev = rgl.cur(), ..., fps = 10, movie = "movie", frames = movie, dir = tempdir(), convert = TRUE, clean = TRUE, verbose=TRUE, top = TRUE, type = "gif", startTime = 0) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{f}{ A function returning a list that may be passed to \code{\link{par3d}} } \item{duration}{ The duration of the animation } \item{dev}{ Which rgl device to select } \item{\dots}{ Additional parameters to pass to \code{f}. } \item{startTime}{ Initial time at which to start the animation } \item{fps}{ Number of frames per second } \item{movie}{ The base of the output filename, not including .gif } \item{frames}{ The base of the name for each frame } \item{dir}{ A directory in which to create temporary files for each frame of the movie } \item{convert}{ Whether to try to convert the frames to a single GIF movie, or a command to do so } \item{clean}{ If \code{convert} is \code{TRUE}, whether to delete the individual frames } \item{verbose}{ Whether to report the \code{convert} command and the output filename } \item{top}{ Whether to call \code{\link{rgl.bringtotop}} before each frame } \item{type}{ What type of movie to create. See Details. } } \details{ The function \code{f} will be called in a loop with the first argument being the \code{startTime} plus the time in seconds since the start (where the start is measured after all arguments have been evaluated). \code{play3d} is likely to place a high load on the CPU; if this is a problem, calls to \code{\link{Sys.sleep}} should be made within the function to release time to other processes. \code{play3d} will run for the specified \code{duration} (in seconds), but can be interrupted by pressing \code{ESC} while the rgl window has the focus. \code{movie3d} saves each frame to disk in a filename of the form \file{framesXXX.png}, where XXX is the frame number, starting from 0. If \code{convert} is \code{TRUE}, it uses ImageMagick to convert them to a single file, by default an animated GIF. The \code{type} argument will be passed to ImageMagick to use as a file extension to choose the file type. Alternatively, \code{convert} can be a template for a command to execute in the standard shell (wildcards are allowed). The template is converted to a command using \code{\link{sprintf}(convert, fps, frames, movie, type, dir, duration)}. For example, \code{code=TRUE} uses the template \code{"convert -delay 1x\%d \%s*.png \%s.\%s"}. All work is done in the directory \code{dir}, so paths should not be needed in the command. (Note that \code{\link{sprintf}} does not require all arguments to be used, and supports formats that use them in an arbitrary order.) The \code{top=TRUE} default is designed to work around an OpenGL limitation: in some implementations, \code{\link{rgl.snapshot}} will fail if the window is not topmost. } \value{ This function is called for the side effect of its repeated calls to \code{f}. It returns \code{NULL} invisibly. } \author{ Duncan Murdoch, based on code by Michael Friendly } \seealso{ \code{\link{spin3d}} and \code{\link{par3dinterp}} return functions suitable to use as \code{f}. See \code{demo(flag)} for an example that modifies the scene in \code{f}.} \examples{ open3d() plot3d( cube3d(col="green") ) M <- par3d("userMatrix") if (!rgl.useNULL()) play3d( par3dinterp( userMatrix=list(M, rotate3d(M, pi/2, 1, 0, 0), rotate3d(M, pi/2, 0, 1, 0) ) ), duration=4 ) \dontrun{ movie3d( spin3d(), duration=5 ) } } \keyword{ dplot } rgl/man/persp3d.Rd0000644000176000001440000001202512172230204013501 0ustar ripleyusers\name{persp3d} \alias{persp3d} \alias{persp3d.default} \title{ Surface plots } \description{ This function draws plots of surfaces over the x-y plane. \code{persp3d} is a generic function.} \usage{ persp3d(x, \dots) \method{persp3d}{default}(x = seq(0, 1, len = nrow(z)), y = seq(0, 1, len = ncol(z)), z, xlim = range(x, na.rm = TRUE), ylim = range(y, na.rm = TRUE), zlim = range(z, na.rm = TRUE), xlab = NULL, ylab = NULL, zlab = NULL, add = FALSE, aspect = !add, ...) } \arguments{ \item{x, y}{locations of grid lines at which the values in \code{z} are measured. These may be given as vectors or matrices. If vectors, they must be in ascending order. Either one or both may be matrices. If \code{x} is a \code{list}, its components \code{x$x} and \code{x$y} are used for \code{x} and \code{y}, respectively.} \item{z}{a matrix containing the values to be plotted. Note that \code{x} can be used instead of \code{z} for convenience.} \item{xlim, ylim, zlim}{x-, y- and z-limits. The plot is produced so that the rectangular volume defined by these limits is visible.} \item{xlab, ylab, zlab}{titles for the axes. N.B. These must be character strings; expressions are not accepted. Numbers will be coerced to character strings.} \item{add}{whether to add the points to an existing plot.} \item{aspect}{either a logical indicating whether to adjust the aspect ratio, or a new ratio} \item{\dots}{additional material parameters to be passed to \code{\link{surface3d}} and \code{\link{decorate3d}}.} } \details{ This is similar to \code{\link[graphics]{persp}} with user interaction. See \code{\link{plot3d}} for more general details. One difference from \code{\link[graphics]{persp}} is that colors are specified on each vertex, rather than on each facet of the surface. To emulate the \code{\link[graphics]{persp}} color handling, you need to do the following. First, convert the color vector to an \code{(nx-1)} by \code{(ny-1)} matrix; then add an extra row before row 1, and an extra column after the last column, to convert it to \code{nx} by \code{ny}. (These extra colors will not be used). For example, \code{col <- rbind(1, cbind(matrix(col, nx-1, ny-1), 1))}. Finally, call \code{persp3d} with material property \code{smooth = FALSE}. If the \code{x} or \code{y} argument is a matrix, then it must be of the same dimension as \code{z}, and the values in the matrix will be used for the corresponding coordinates. This is used to plot shapes such as spheres or cylinders where z is not a function of x and y. See the fourth and fifth examples below. } \value{ This function is called for the side effect of drawing the plot. A vector of shape IDs is returned. } \author{Duncan Murdoch} \seealso{\code{\link{plot3d}}, \code{\link{persp}}. The \code{\link[emdbook]{curve3d}} function in the \code{emdbook} package draws surface plots of functions.} \examples{ # (1) The Obligatory Mathematical surface. # Rotated sinc function. x <- seq(-10, 10, length= 30) y <- x f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r } z <- outer(x, y, f) z[is.na(z)] <- 1 open3d() bg3d("white") material3d(col="black") persp3d(x, y, z, aspect=c(1, 1, 0.5), col = "lightblue", xlab = "X", ylab = "Y", zlab = "Sinc( r )") # (2) Add to existing persp plot: xE <- c(-10,10); xy <- expand.grid(xE, xE) points3d(xy[,1], xy[,2], 6, col = "red") lines3d(x, y=10, z= 6 + sin(x), col = "green") phi <- seq(0, 2*pi, len = 201) r1 <- 7.725 # radius of 2nd maximum xr <- r1 * cos(phi) yr <- r1 * sin(phi) lines3d(xr,yr, f(xr,yr), col = "pink", lwd = 2) # (3) Visualizing a simple DEM model z <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N) y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W) open3d() bg3d("slategray") material3d(col="black") persp3d(x, y, z, col = "green3", aspect="iso", axes = FALSE, box = FALSE) # (4) A cylindrical plot z <- matrix(seq(0, 1, len=50), 50, 50) theta <- t(z) r <- 1 + exp( -pmin( (z - theta)^2, (z - theta - 1)^2, (z - theta + 1)^2 )/0.01 ) x <- r*cos(theta*2*pi) y <- r*sin(theta*2*pi) open3d() persp3d(x, y, z, col="red") # (5) A globe lat <- matrix(seq(90,-90, len=50)*pi/180, 50, 50, byrow=TRUE) long <- matrix(seq(-180, 180, len=50)*pi/180, 50, 50) r <- 6378.1 # radius of Earth in km x <- r*cos(lat)*cos(long) y <- r*cos(lat)*sin(long) z <- r*sin(lat) open3d() persp3d(x, y, z, col="white", texture=system.file("textures/worldsmall.png",package="rgl"), specular="black", axes=FALSE, box=FALSE, xlab="", ylab="", zlab="", normal_x=x, normal_y=y, normal_z=z) if (!rgl.useNULL()) play3d(spin3d(axis=c(0,0,1), rpm=8), duration=5) \dontrun{ # This looks much better, but is slow because the texture is very big persp3d(x, y, z, col="white", texture=system.file("textures/world.png",package="rgl"), specular="black", axes=FALSE, box=FALSE, xlab="", ylab="", zlab="", normal_x=x, normal_y=y, normal_z=z) } } \keyword{ dynamic } \keyword{ graphics } rgl/man/ellipse3d.Rd0000644000176000001440000000627612262005310014016 0ustar ripleyusers\name{ellipse3d} \alias{ellipse3d} \alias{ellipse3d.default} \alias{ellipse3d.lm} \alias{ellipse3d.glm} \alias{ellipse3d.nls} \title{ Make an ellipsoid } \description{ A generic function and several methods returning an ellipsoid or other outline of a confidence region for three parameters. } \usage{ ellipse3d(x, \dots) \method{ellipse3d}{default}(x, scale = c(1, 1, 1), centre = c(0, 0, 0), level = 0.95, t = sqrt(qchisq(level, 3)), which = 1:3, subdivide = 3, smooth = TRUE, ...) \method{ellipse3d}{lm}(x, which = 1:3, level = 0.95, t = sqrt(3 * qf(level, 3, x$df.residual)), ...) \method{ellipse3d}{glm}(x, which = 1:3, level = 0.95, t, dispersion, ...) \method{ellipse3d}{nls}(x, which = 1:3, level = 0.95, t = sqrt(3 * qf(level, 3, s$df[2])), ...) } \arguments{ \item{x}{ An object. In the default method the parameter \code{x} should be a square positive definite matrix at least 3x3 in size. It will be treated as the correlation or covariance of a multivariate normal distribution. } \item{\dots}{ Additional parameters to pass to the default method or to \code{\link{qmesh3d}}. } \item{scale}{ If \code{x} is a correlation matrix, then the standard deviations of each parameter can be given in the scale parameter. This defaults to \code{c(1, 1, 1)}, so no rescaling will be done. } \item{centre}{ The centre of the ellipse will be at this position. } \item{level}{ The confidence level of a simultaneous confidence region. The default is 0.95, for a 95\% region. This is used to control the size of the ellipsoid. } \item{t}{ The size of the ellipse may also be controlled by specifying the value of a t-statistic on its boundary. This defaults to the appropriate value for the confidence region. } \item{which}{ This parameter selects which variables from the object will be plotted. The default is the first 3. } \item{subdivide}{ This controls the number of subdivisions (see \code{\link{subdivision3d}}) used in constructing the ellipsoid. Higher numbers give a smoother shape. } \item{smooth}{ If \code{TRUE}, smooth interpolation of normals is used; if \code{FALSE}, a faceted ellipsoid will be displayed. } \item{dispersion}{ The value of dispersion to use. If specified, it is treated as fixed, and chi-square limits for \code{t} are used. If missing, it is taken from \code{summary(x)}. } } \value{ A \code{\link{mesh3d}} object representing the ellipsoid. } \examples{ # Plot a random sample and an ellipsoid of concentration corresponding to a 95\% # probability region for a # trivariate normal distribution with mean 0, unit variances and # correlation 0.8. if (requireNamespace("MASS")) { Sigma <- matrix(c(10,3,0,3,2,0,0,0,1), 3,3) Mean <- 1:3 x <- MASS::mvrnorm(1000, Mean, Sigma) open3d() plot3d(x, box=FALSE) plot3d( ellipse3d(Sigma, centre=Mean), col="green", alpha=0.5, add = TRUE) } # Plot the estimate and joint 90\% confidence region for the displacement and cylinder # count linear coefficients in the mtcars dataset data(mtcars) fit <- lm(mpg ~ disp + cyl , mtcars) open3d() plot3d(ellipse3d(fit, level = 0.90), col="blue", alpha=0.5, aspect=TRUE) } \keyword{dplot} rgl/man/select3d.Rd0000644000176000001440000000301512136474342013643 0ustar ripleyusers\name{select3d} \alias{select3d} \alias{rgl.select3d} \title{ Select a rectangle in an RGL scene } \description{ This function allows the user to use the mouse to select a region in an RGL scene. } \usage{ rgl.select3d(button = c("left", "middle", "right")) select3d(...) } \arguments{ \item{ button }{ Which button to use for selection.} \item{ ... }{ Button argument to pass to \code{rgl.select3d}} } \details{ This function selects 3-dimensional regions by allowing the user to use a mouse to draw a rectangle showing the projection of the region onto the screen. It returns a function which tests points for inclusion in the selected region. If the scene is later moved or rotated, the selected region will remain the same, no longer corresponding to a rectangle on the screen. } \value{ Returns a function \code{f(x,y,z)} which tests whether each of the points \code{(x,y,z)} is in the selected region, returning a logical vector. This function accepts input in a wide variety of formats as it uses \code{\link[grDevices]{xyz.coords}} to interpret its parameters. } \author{ Ming Chen / Duncan Murdoch } \seealso{ \code{\link{selectpoints3d}}, \code{\link{locator}} } \examples{ # Allow the user to select some points, and then redraw them # in a different color if (interactive()) { x <- rnorm(1000) y <- rnorm(1000) z <- rnorm(1000) open3d() points3d(x,y,z) f <- select3d() keep <- f(x,y,z) rgl.pop() points3d(x[keep],y[keep],z[keep],color='red') points3d(x[!keep],y[!keep],z[!keep]) } } \keyword{dynamic} rgl/man/readSTL.Rd0000644000176000001440000000545512136474243013445 0ustar ripleyusers\name{readSTL} \alias{readSTL} \alias{writeSTL} \title{ Read and write STL (stereolithography) format files } \description{ These functions read and write STL files. This is a simple file format that is commonly used in 3D printing. It does not represent text, only triangles. The \code{writeSTL} function converts some RGL object types to triangles. } \usage{ readSTL(con, ascii = FALSE, plot = TRUE, ...) writeSTL(con, ascii = FALSE, pointRadius=0.005, pointShape = icosahedron3d(), lineRadius = pointRadius, lineSides = 20, ids = NULL) } \arguments{ \item{con}{ A connection or filename. } \item{ascii}{ Whether to use the ASCII format or the binary format. } \item{plot}{ On reading, should the object be plotted? } \item{\dots}{ If plotting, other parameters to pass to \code{\link{triangles3d}} } \item{pointRadius, lineRadius}{ The radius of points and lines relative to the overall scale of the figure. } \item{pointShape}{ A mesh shape to use for points. It is scaled by the \code{pointRadius}. } \item{lineSides}{ Lines are rendered as cylinders with this many sides. } \item{ids}{ The identifiers (from \code{\link{rgl.ids}}) of the objects to write. If \code{NULL}, try to write everything. } } \details{ The current implementation is limited. For reading, it ignores normals and colour information. For writing, it only outputs triangles, quads, planes, spheres, points, line segments, line strips and surfaces, and does not write colour information. Lines and points are rendered in an isometric scale: if your data scales vary, they will look strange. Since the STL format only allows one object per file, all RGL objects are combined into a single object when output. The output file is readable by Blender and Meshlab; the latter can write in a number of other formats, including U3D, suitable for import into a PDF document. } \value{ \code{readSTL} invisibly returns the object id if \code{plot=TRUE}, or (visibly) a matrix of vertices of the triangles if not. \code{writeSTL} invisibly returns the name of the connection to which the data was written. } \references{ The file format was found on Wikipedia on October 25, 2012. I learned about the STL file format from David Smith's blog reporting on Ian Walker's \code{r2stl} function. } \author{ Duncan Murdoch } \seealso{ \code{\link{scene3d}} saves a copy of a scene to an R variable; \code{\link{writeWebGL}}, \code{\link{writePLY}}, \code{\link{writeOBJ}} and \code{\link{writeSTL}} write the scene to a file in various other formats. } \examples{ filename <- tempfile(fileext=".stl") open3d() shade3d( icosahedron3d(col="magenta") ) writeSTL(filename) open3d() readSTL(filename, col="red") } \keyword{ graphics } rgl/man/polygon3d.Rd0000644000176000001440000000442312172227523014054 0ustar ripleyusers\name{polygon3d} \alias{polygon3d} \title{ Triangulate and draw a polygon in three dimensions. } \description{ This function takes a description of a flat polygon in x, y and z coordinates, and draws it in three dimensions. } \usage{ polygon3d(x, y = NULL, z = NULL, fill = TRUE, plot = TRUE, coords = 1:2, random = TRUE, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x, y, z}{ Vertices of the polygon in a form accepted by \code{\link{xyz.coords}}. } \item{fill}{ logical; should the polygon be filled? } \item{plot}{ logical; should the polygon be displayed? } \item{coords}{ Which two coordinates (\code{x=1}, \code{y=2}, \code{z=3}) describe the polygon. } \item{random}{ Should a random triangulation be used? } \item{\dots}{ Other parameters to pass to \code{\link{lines3d}} or \code{\link{shade3d}} if \code{plot = TRUE}. } } \details{ The function triangulates the two dimensional polygon described by \code{coords}, then applies the triangulation to all three coordinates. No check is made that the polygon is actually all in one plane, but the results may be somewhat unpredictable (especially if \code{random = TRUE}) if it is not. Polygons need not be simple; use \code{NA} to indicate separate closed pieces. For \code{fill = FALSE} there are no other restrictions on the pieces, but for \code{fill = TRUE} the resulting two-dimensional polygon needs to be one that \code{\link{triangulate}} can handle. } \value{ If \code{plot = TRUE}, the id number of the lines (for \code{fill = FALSE}) or triangles (for \code{fill = TRUE}) that have been plotted. If \code{plot = FALSE}, then for \code{fill = FALSE}, a vector of indices into the XYZ matrix that could be used to draw the polygon. For \code{fill = TRUE}, a triangular mesh object representing the triangulation. } \author{ Duncan Murdoch } \seealso{ \code{\link{extrude3d}} for a solid extrusion of a polygon, \code{\link{triangulate}} for the triangulation. } \examples{ theta <- seq(0, 4*pi, len=50) r <- theta + 1 r <- c(r[-50], rev(theta*0.8) + 1) theta <- c(theta[-50], rev(theta)) x <- r*cos(theta) y <- r*sin(theta) plot(x,y,type="n") polygon(x, y) polygon3d(x, y, x+y, col = "blue") } \keyword{ graphics } rgl/man/planes.Rd0000644000176000001440000000431512262005640013412 0ustar ripleyusers\name{planes} \alias{rgl.planes} \alias{planes3d} \alias{rgl.clipplanes} \alias{clipplanes3d} \title{add planes} \description{ \code{planes3d} and \code{rgl.planes} add mathematical planes to a scene. Their intersection with the current bounding box will be drawn. \code{clipplanes3d} and \code{rgl.clipplanes} add clipping planes to a scene. } \usage{ planes3d(a, b = NULL, c = NULL, d = 0, ...) rgl.planes(a, b = NULL, c = NULL, d = 0, ...) clipplanes3d(a, b = NULL, c = NULL, d = 0) rgl.clipplanes(a, b = NULL, c = NULL, d = 0) } \arguments{ \item{a, b, c}{ Coordinates of the normal to the plane. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details. } \item{d}{ Coordinates of the "offset". See the details. } \item{\dots}{ Material properties. See \code{\link{rgl.material}} for details. } } \details{ \code{planes3d} and \code{rgl.planes} draw planes using the parametrization \eqn{a x + b y + c z + d = 0}. Multiple planes may be specified by giving multiple values for any of \code{a, b, c, d}; the other values will be recycled as necessary. \code{clipplanes3d} and \code{rgl.clipplanes} define clipping planes using the same equations. The number of clipping planes supported by the OpenGL driver is implementation dependent; use \code{par3d("maxClipPlanes")} to find the limit. } \note{ The clip plane code is experimental and currently only partially implemented, so is subject to change. } \value{ A shape ID of the planes object is returned invisibly. } \seealso{ \code{\link{abclines3d}}, \code{\link{rgl.abclines}} for mathematical lines. \code{\link{triangles3d}}, \code{\link{rgl.triangles}} or the corresponding functions for quadrilaterals may be used to draw sections of planes that do not adapt to the bounding box. } \examples{ # Show regression plane with z as dependent variable x <- rnorm(100) y <- rnorm(100) z <- 0.2*x - 0.3*y + rnorm(100, sd=0.3) fit <- lm(z ~ x + y) plot3d(x,y,z, type="s", col="red", size=1) coefs <- coef(fit) a <- coefs["x"] b <- coefs["y"] c <- -1 d <- coefs["(Intercept)"] planes3d(a, b, c, d, alpha=0.5) open3d() plot3d(x,y,z, type="s", col="red", size=1) clipplanes3d(a, b, c, d) } \keyword{dynamic} rgl/man/identify3d.Rd0000644000176000001440000000322112141272200014157 0ustar ripleyusers\name{identify3d} \alias{identify3d} \title{ Identify points in plot. } \description{ Identify points in a plot, similarly to the \code{\link{identify}} function in base graphics. } \usage{ identify3d(x, y = NULL, z = NULL, labels = seq_along(x), n = length(x), plot = TRUE, adj = c(-0.1, 0.5), tolerance = 20, buttons = c("right", "middle")) } \arguments{ \item{x, y, z}{coordinates of points in a scatter plot. Alternatively, any object which defines coordinates (see \code{\link{xyz.coords}}) can be given as \code{x}, and \code{y} and \code{z} left missing.} \item{labels}{an optional character vector giving labels for the points. Will be coerced using \code{\link{as.character}}, and recycled if necessary to the length of \code{x}.} \item{n}{the maximum number of points to be identified.} \item{plot}{logical: if \code{plot} is \code{TRUE}, the labels are printed near the points and if \code{FALSE} they are omitted.} \item{adj}{numeric vector to use as \code{adj} parameter to \code{\link{text3d}} when plotting the labels.} \item{tolerance}{the maximal distance (in pixels) for the pointer to be \sQuote{close enough} to a point.} \item{buttons}{a length 1 or 2 character vector giving the buttons to use for selection and quitting.} } \details{ If \code{buttons} is length 1, the user can quit by reaching \code{n} selections, or by hitting the escape key, but the result will be lost if escape is used. } \value{ A vector of selected indices. } \author{ Duncan Murdoch } \seealso{ \code{\link{identify}} for base graphics, \code{\link{select3d}} for selecting regions. } \keyword{ graphics } rgl/man/snapshot.Rd0000644000176000001440000000266311064454445014005 0ustar ripleyusers\name{rgl.snapshot} \alias{rgl.snapshot} \alias{snapshot3d} \title{export screenshot} \description{ Saves the screenshot as png file. } \usage{ rgl.snapshot( filename, fmt="png", top=TRUE ) snapshot3d( ... ) } \arguments{ \item{filename}{full path to filename.} \item{fmt}{image export format, currently supported: png } \item{top}{whether to call \code{\link{rgl.bringtotop}}} \item{...}{arguments to pass to \code{rgl.snapshot} } } \details{ Animations can be created in a loop modifying the scene and saving each screenshot to a file. Various graphics programs (e.g. ImageMagick) can put these together into a single animation. (See \code{\link{movie3d}} or the example below.) } \note{ On some systems, the snapshot will include content from other windows if they cover the active rgl window. Setting \code{top=TRUE} (the default) will use \code{\link{rgl.bringtotop}} before the snapshot to avoid this. (See \url{http://www.opengl.org/resources/faq/technical/rasterization.htm#rast0070} for more details.) } \seealso{\code{\link{movie3d}}, \code{\link{rgl.viewpoint}}} \examples{ \dontrun{ # # create animation # shade3d(oh3d(), color="red") rgl.bringtotop() rgl.viewpoint(0,20) setwd(tempdir()) for (i in 1:45) { rgl.viewpoint(i,20) filename <- paste("pic",formatC(i,digits=1,flag="0"),".png",sep="") rgl.snapshot(filename) } ## Now run ImageMagick command: ## convert -delay 10 *.png -loop 0 pic.gif } } \keyword{dynamic} rgl/man/texts.Rd0000644000176000001440000001423312176205331013302 0ustar ripleyusers\name{texts} \alias{rgl.texts} \alias{text3d} \alias{texts3d} \alias{rglFonts} \title{add text} \description{ Adds text to the scene. The text is positioned in 3D space. Text is always oriented towards the camera. } \usage{ rgl.texts(x, y = NULL, z = NULL, text, adj = 0.5, justify, family = par3d("family"), font = par3d("font"), cex = par3d("cex"), useFreeType=par3d("useFreeType"), ...) text3d(x, y = NULL, z = NULL, texts, adj = 0.5, justify, ...) texts3d(x, y = NULL, z = NULL, texts, adj = 0.5, justify, ...) rglFonts(...) } \arguments{ \item{x, y, z}{point coordinates. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{text}{text character vector to draw} \item{texts}{text character vector to draw} \item{adj}{ one value specifying the horizontal adjustment, or two, specifying horizontal and vertical adjustment respectively. }. \item{justify}{(deprecated, please use adj instead) character string specifying the horizontal adjustment; options are \code{"left"}, \code{"right"}, \code{"center"}. } \item{ family }{A device-independent font family name, or "" } \item{ font }{A numeric font number from 1 to 5 } \item{ cex }{A numeric character expansion value } \item{ useFreeType }{logical. Should FreeType be used to draw text? (See details below.)} \item{ ... }{In \code{rgl.texts}, material properties; see \code{\link{rgl.material}} for details. In \code{rglFonts}, device dependent font definitions for use with FreeType. In the other functions, additional parameters to pass to \code{rgl.texts}.} } \details{ The \code{adj} parameter determines the position of the text relative to the specified coordinate. Use \code{adj = c(0,0)} to place the left bottom corner at \code{(x,y,z)}, \code{adj = c(0.5, 0.5)} to center the text there, and \code{adj = c(1,1)} to put the right top corner there. The optional second coordinate for vertical adjustment defaults to \code{0.5}. Placement is done using the "advance" of the string and the "ascent" of the font relative to the baseline, when these metrics are known. \code{text3d} and \code{texts3d} draw text using the \link{r3d} conventions. These are synonyms; the former is singular to be consistent with the classic 2-D graphics functions, and the latter is plural to be consistent with all the other graphics primitives. Take your choice! If any coordinate or text is \code{NA}, that text is not plotted. } \section{Fonts}{ Fonts are specified using the \code{family}, \code{font}, \code{cex}, and \code{useFreeType} arguments. Defaults for the currently active device may be set using \code{\link{par3d}}, or for future devices using \code{\link{r3dDefaults}}. The \code{family} specification is the same as for standard graphics, i.e. families \code{c("serif", "sans", "mono", "symbol")} are normally available, but users may add additional families. \code{font} numbers are restricted to the range 1 to 4 for standard, bold, italic and bold italic respectively; with font 5 recoded as family \code{"symbol"} font 1. Using an unrecognized value for \code{"family"} will result in the system standard font as used in rgl up to version 0.76. That font is not resizable and \code{font} values are ignored. If \code{useFreeType} is \code{TRUE}, then rgl will use the FreeType anti-aliased fonts for drawing. This is generally desirable, and it is the default if rgl was built to support FreeType. FreeType fonts are specified using the \code{rglFonts} function. This function takes a vector of four filenames of TrueType font files which will be used for the four styles regular, bold, italic and bold italic. The vector is passed with a name to be used as the family name, e.g. \code{rglFonts(sans = c("/path/to/FreeSans.ttf", ...}. In order to limit the file size, \code{rgl} ships with just 3 font files, for regular versions of the \code{serif}, \code{sans} and \code{mono} families. Additional free font files are available from the Amaya project at \url{http://dev.w3.org/cvsweb/Amaya/fonts/}. See the example below for how to specify a full set of fonts. Full pathnames should normally be used to specify font files. If relative paths are used, they are interpreted differently by platform. Currently Windows fonts are looked for in the Windows fonts folder, while other platforms use the current working directory. If FreeType fonts are not used, then bitmapped fonts will be used instead. On Windows these will be based on the fonts specified using the #ifdef windows \code{\link{windowsFonts}} #endif #ifndef windows \code{windowsFonts} #endif function, and are resizable. Other platforms will use the default bitmapped font which is not resizable. Currently MacOSX does not support bitmapped fonts in the Cocoa display used by \command{R.app}. Bitmapped fonts have a limited number of characters supported; if any unsupported characters are used, an error will be thrown. } \value{ The text drawing functions return the object ID of the text object i invisibly. \code{rglFonts} returns the current set of font definitions. } \examples{ open3d() famnum <- rep(1:4, 8) family <- c("serif", "sans", "mono", "symbol")[famnum] font <- rep(rep(1:4, each=4), 2) cex <- rep(1:2, each=16) text3d(font, cex, famnum, text=paste(family, font),adj = 0.5, color="blue", family=family, font=font, cex=cex) \dontrun{ # These FreeType fonts are available from the Amaya project, and are not shipped # with rgl. You would normally install them to the rgl/fonts directory # and use fully qualified pathnames, e.g. # system.file("fonts/FreeSerif.ttf", package= "rgl") rglFonts(serif=c("FreeSerif.ttf","FreeSerifBold.ttf","FreeSerifItalic.ttf", "FreeSerifBoldItalic.ttf"), sans =c("FreeSans.ttf", "FreeSansBold.ttf", "FreeSansOblique.ttf", "FreeSansBoldOblique.ttf"), mono =c("FreeMono.ttf", "FreeMonoBold.ttf", "FreeMonoOblique.ttf", "FreeMonoBoldOblique.ttf"), symbol=c("ESSTIX10.TTF", "ESSTIX12.TTF", "ESSTIX9_.TTF", "ESSTIX11.TTF")) } } \seealso{ \code{\link{r3d}} } \keyword{dynamic} rgl/man/rgl.Sweave.Rd0000644000176000001440000001115011555031415014143 0ustar ripleyusers\name{rgl.Sweave} \alias{rgl.Sweave} \alias{rgl.Sweave.off} \alias{Sweave.snapshot} \title{ Integrating \code{rgl} with \code{Sweave} } \description{ As of \R 2.13.0, it is possible to include \code{rgl} graphics into a \link{Sweave} document. These functions support that integration. } \usage{ Sweave.snapshot() rgl.Sweave(name, width, height, options, ...) rgl.Sweave.off() } \arguments{ \item{name, width, height, options, ...}{ These arguments are passed by \code{\link{Sweave}} to \code{rgl.Sweave} when it opens the device. } } \details{ The \code{rgl.Sweave} function is not normally called by the user. The user specifies it as the graphics driver when opening the code chunk, e.g. by using \preformatted{<>=} When the \code{rgl} device is closed at the end of the code chunk, \code{rgl.Sweave.off()} will be called automatically. It will save a snapshot of the last image (by default in \file{.png} format) for inclusion in the Sweave document and (by default) close the device. Alternatively, the \code{Sweave.snapshot()} function can be called to save the image before the end of the chunk. Only one snapshot will be taken per chunk. Several chunk options are used by the \code{rgl.Sweave} device: \describe{ \item{stayopen}{(default \code{FALSE}). If \code{TRUE} then the \code{rgl} device will \emph{not} be closed at the end of the chunk, instead a call to \code{Sweave.snapshot()} will be used if it has not been called explicitly. Subsequent chunks can add to the scene.} \item{outputtype}{(default \code{png}). The output may be specified as \code{outputtype=pdf} or \code{outputtype=eps} instead, in which case the \code{\link{rgl.postscript}} function will be used to write output in the specified format. Note that \code{\link{rgl.postscript}} has limitations and does not always render scenes correctly.} \item{delay}{(default 0.1). After creating the display window, \code{\link{Sys.sleep}} will be called to delay this many seconds, to allow the display system to initialize. This is needed in X11 systems which open the display asynchronously. If the default time is too short, \code{rgl.Sweave} may falsely report that the window is too large to open.} } } \note{ We recommend turning off all other graphics drivers in a chunk that uses \code{grdevice=rgl.Sweave}. The \code{rgl} functions do not write to a standard graphics device. } \note{ It is possible to use this driver in \R version 2.13.0, but there are problems because there is no automatic call to \code{rgl.Sweave.off()} at the end of a chunk, because the chunk is always run at least twice in that version of \R, and because custom string options are not supported. An explicit call to \code{rgl.Sweave.off()} as the last line of the code chunk is recommended, though efforts are made to do the right thing if this is omitted. Some other notes that apply to \R version 2.13.0: \itemize{ \item Calling \code{rgl.close()} within the chunk should work. \item If neither \code{rgl.Sweave.off()} nor \code{rgl.close()} is called and a new chunk with \code{grdevice=rgl.Sweave} is opened, a call to \code{rgl.Sweave.off()} will be inserted. However, the last chunk with \code{grdevice=rgl.Sweave} will not be automatically closed. \item Running \code{Sweave()} within \R is likely to leave a number of open \code{rgl} device windows. \item It is not possible to specify the output type using the \code{outputtype} chunk option. Snapshots will always be saved in \file{.png} format. } Most of these problems are fixed in later versions of \R, including 2.13.0-patched. Within the \R 2.13.x series, it is recommended to use the \code{figs.only=TRUE, pdf=FALSE} options (and leave the other graphics drivers at their default \code{FALSE} settings), which cause the code in the chunk to be run only once. } \note{ The \code{rgl} package relies on your graphics hardware to render OpenGL scenes, and the default \file{.png} output copies a bitmap from the hardware device. All such devices have limitations on the size of the bitmap, but they do not always signal these limitations in a way that \code{rgl} will detect. If you find that images are not being produced properly, try reducing the size using the \code{resolution}, \code{width} or \code{height} chunk options. } \value{ These functions are called for their side effects. } \author{ Duncan Murdoch } \seealso{ \code{\link{RweaveLatex}} for a description of alternate graphics drivers in Sweave, and standard options that can be used in code chunks. } \keyword{ utilities } rgl/man/par3d.Rd0000644000176000001440000002457712262021452013154 0ustar ripleyusers\name{par3d} \alias{par3d} \alias{open3d} \alias{r3dDefaults} \alias{getr3dDefaults} \concept{antialias} \concept{bbox} \concept{cex} \concept{family} \concept{font} \concept{fontname} \concept{FOV} \concept{ignoreExtent} \concept{maxClipPlanes} \concept{modelMatrix} \concept{mouseMode} \concept{projMatrix} \concept{scale} \concept{skipRedraw} \concept{useFreeType} \concept{userMatrix} \concept{viewport} \concept{windowRect} \concept{zoom} \title{Set or Query RGL Parameters} \description{ \code{par3d} can be used to set or query graphical parameters in rgl. Parameters can be set by specifying them as arguments to \code{par3d} in \code{tag = value} form, or by passing them as a list of tagged values. } \usage{ par3d(\dots, no.readonly = FALSE) open3d(\dots, params=getr3dDefaults(), useNULL = rgl.useNULL()) getr3dDefaults() } \arguments{ \item{\dots}{arguments in \code{tag = value} form, or a list of tagged values. The tags must come from the graphical parameters described below.} \item{no.readonly}{logical; if \code{TRUE} and there are no other arguments, only those parameters which can be set by a subsequent \code{par3d()} call are returned.} \item{params}{a list of graphical parameters} \item{useNULL}{whether to use the null graphics device} } \details{ Parameters are queried by giving one or more character vectors to \code{par3d}. \code{par3d()} (no arguments) or \code{par3d(no.readonly=TRUE)} is used to get \emph{all} the graphical parameters (as a named list). \emph{\bold{R.O.}} indicates \emph{\bold{read-only arguments}}: These may only be used in queries, i.e., they do \emph{not} set anything. \code{open3d} opens a new rgl device, and sets the parameters as requested. The \code{r3dDefaults} list returned by the \code{getr3dDefaults} function will be used as default values for parameters. As installed this sets the point of view to 'world coordinates' (i.e. x running from left to right, y from front to back, z from bottom to top), the \code{mouseMode} to \code{(zAxis, zoom, fov)}, and the field of view to 30 degrees. Users may create their own variable named \code{r3dDefaults} in the global environment and it will override the installed one. If there is a \code{bg} element in the list or the arguments, it should be a list of arguments to pass to the \code{\link{bg3d}} function to set the background. The arguments to \code{open3d} may include \code{material}, a list of material properties as in \code{\link{r3dDefaults}}, but note that high level functions such as \code{\link{plot3d}} normally use the \code{r3dDefaults} values in preference to this setting. If \code{useNULL} is \code{TRUE}, \pkg{rgl} will use a \dQuote{null} device. This device records objects as they are plotted, but displays nothing. It is intended for use with \code{\link{writeWebGL}} and similar functions. } \value{ When parameters are set, their former values are returned in an invisible named list. Such a list can be passed as an argument to \code{par3d} to restore the parameter values. Use \code{par3d(no.readonly = TRUE)} for the full list of parameters that can be restored. When just one parameter is queried, its value is returned directly. When two or more parameters are queried, the result is a list of values, with the list names giving the parameters. Note the inconsistency: setting one parameter returns a list, but querying one parameter returns an object. } \section{Parameters}{ \describe{ \item{\code{antialias}}{\emph{\bold{R.O.}} in \code{par3d}, may be set in \code{open3d}. The (requested) number of hardware antialiasing planes to use (with multisample antialiasing). The OpenGL driver may not support the requested number, in which case \code{par3d("antialias")} will report what was actually set. } \item{\code{cex}}{real. The default size for text.} \item{\code{family}}{character. The default device independent family name; see \code{\link{text3d}}.} \item{\code{font}}{integer. The default font number (from 1 to 5; see \code{\link{text3d}}.} \item{\code{useFreeType}}{logical. Should FreeType fonts be used?} \item{\code{fontname}}{\emph{\bold{R.O.}}; the system-dependent name of the current font.} \item{\code{FOV}}{real. The field of view, from 0 to 179 degrees. This controls the degree of parallax in the perspective view. Isometric perspective corresponds to \code{FOV=0}.} \item{\code{ignoreExtent}}{logical. Set to \code{TRUE} so that subsequently plotted objects will be ignored in calculating the bounding box of the scene.} \item{\code{maxClipPlanes}}{\emph{\bold{R.O.}}; an integer giving the maximum number of clip planes that can be defined in the current system.} \item{\code{modelMatrix}}{\emph{\bold{R.O.}}; a 4 by 4 matrix describing the position of the user data.} \item{\code{mouseMode}}{character. A vector of 3 strings describing what the 3 mouse buttons do. Partial matching is used. Possible values for \code{mouseMode} are \describe{ \item{\code{"none"}}{No action for this button.} \item{\code{"trackball"}}{Mouse acts as a virtual trackball, rotating the scene.} \item{\code{"xAxis"}}{Similar to \code{"trackball"}, but restricted to X axis rotation.} \item{\code{"yAxis"}}{Y axis rotation.} \item{\code{"zAxis"}}{Z axis rotation.} \item{\code{"polar"}}{Mouse rotates the scene by moving in polar coordinates.} \item{\code{"selecting"}}{Mouse is used for selection. This is not normally set by the user, but is used internally by the \code{\link{select3d}} function.} \item{\code{"zoom"}}{Mouse is used to zoom the display.} \item{\code{"fov"}}{Mouse changes the field of view of the display.} \item{\code{"user"}}{Used when a user handler is set by \code{\link{rgl.setMouseCallbacks}}.} } } \item{\code{projMatrix}}{\emph{\bold{R.O.}}; a 4 by 4 matrix describing the current projection of the scene.} \item{\code{scale}}{real. A vector of 3 values indicating the amount by which to rescale each axis before display. Set by \code{\link{aspect3d}}.} \item{\code{skipRedraw}}{whether to update the display. Set to \code{TRUE} to suspend updating while making multiple changes to the scene. See \code{demo(hist3d)} for an example.} \item{\code{userMatrix}}{a 4 by 4 matrix describing user actions to display the scene.} \item{\code{viewport}}{\emph{\bold{R.O.}}; real. A vector giving the dimensions of the window in pixels.} \item{\code{zoom}}{real. A positive value indicating the current magnification of the scene.} \item{\code{bbox}}{\emph{\bold{R.O.}}; real. A vector of six values indicating the current values of the bounding box of the scene (xmin, xmax, ymin, ymax, zmin, zmax)} \item{\code{windowRect}}{integer. A vector of four values indicating the left, top, right and bottom of the displayed window (in pixels).} } } \note{ The \code{"xAxis"}, \code{"yAxis"} and \code{"zAxis"} mouse modes rotate relative to the coordinate system of the data, regardless of the current orientation of the scene. When multiple parameters are set, they are set in the order given. In some cases this may lead to warnings and ignored values; for example, some font families only support \code{cex = 1}, so changing both \code{cex} and \code{family} needs to be done in the right order. For example, when using the \code{"bitmap"} family on Windows, \code{par3d(family = "sans", cex = 2)} will work, but \code{par3d(cex = 2, family = "sans")} will leave \code{cex} at 1 (with a warning that the \code{"bitmap"} family only supports that size). } \section{Rendering}{ The parameters returned by \code{par3d} are sufficient to determine where rgl would render a point on the screen. Given a column vector \code{(x,y,z)}, it performs the equivalent of the following operations: \enumerate{ \item It converts the point to homogeneous coordinates by appending \code{w=1}, giving the vector \code{v = (x,y,z,1)}. \item It calculates the \code{M = par3d("modelMatrix")} as a product from right to left of the following matrices: \itemize{ \item A matrix to translate the centre of the bounding box to the origin. \item A matrix to rescale according to \code{par3d("scale")}. \item The \code{par3d("userMatrix")} as set by the user. \item A matrix which may be set by mouse movements. \item A matrix to translate the origin to the centre of the viewing region. } \item It multiplies the point by \code{M} giving \code{u = M \%*\% v}. Using this location and information on the normals (which have been similarly transformed), it performs lighting calculations. \item It obtains the projection matrix \code{P = par3d("projMatrix")} and multiplies the point by it giving \code{P \%*\% u = (x2, y2, z2, w2)}. \item It converts back to Euclidean coordinates by dividing the first 3 coordinates by \code{w2}. \item The new value \code{z2/w2} represents the depth into the scene of the point. Depending on what has already been plotted, this depth might be obscured, in which case nothing more is plotted. \item If the point is not culled due to depth, the \code{x2} and \code{y2} values are used to determine the point in the image. The \code{par3d("viewport")} values are used to translate from the range \code{(-1, 1)} to pixel locations, and the point is plotted. \item If hardware antialiasing is enabled, then the whole process is repeated multiple times (at least conceptually) with different locations in each pixel sampled to determine what is plotted there, and then the images are combined into what is displayed. } See ?\link{matrices} for more information on homogeneous and Euclidean coordinates. Note that many of these calculations are done on the graphics card using single precision; you will likely see signs of rounding error if your scene requires more than 4 or 5 digit precision to distinguish values in any coordinate. } \seealso{ \code{\link{rgl.viewpoint}} to set \code{FOV} and \code{zoom}. \code{\link{rgl.useNULL}} for default usage of null device. } \references{ OpenGL Architecture Review Board (1997). OpenGL Programming Guide. Addison-Wesley. } \examples{ r3dDefaults open3d() shade3d(cube3d(color=rep(rainbow(6),rep(4,6)))) save <- par3d(userMatrix = rotationMatrix(90*pi/180, 1,0,0)) save par3d("userMatrix") par3d(save) par3d("userMatrix") } \keyword{dynamic} rgl/man/r3d.Rd0000644000176000001440000000763211225116322012623 0ustar ripleyusers\name{r3d} \alias{r3d} \title{Generic 3D interface} \description{Generic 3D interface for 3D rendering and computational geometry.} \details{ R3d is a design for an interface for 3d rendering and computation without dependency on a specific rendering implementation. R3d includes a collection of 3D objects and geometry algorithms. All r3d interface functions are named \code{*3d}. They represent generic functions that delegate to implementation functions. The interface can be grouped into 8 categories: Scene Management, Primitive Shapes, High-level Shapes, Geometry Objects, Visualization, Interaction, Transformation, Subdivision. The rendering interface gives an abstraction to the underlying rendering model. It can be grouped into four categories: \describe{ \item{Scene Management:}{A 3D scene consists of shapes, lights and background environment.} \item{Primitive Shapes:}{Generic primitive 3D graphics shapes such as points, lines, triangles, quadrangles and texts.} \item{High-level Shapes:}{Generic high-level 3D graphics shapes such as spheres, sprites and terrain.} \item{Interaction:}{Generic interface to select points in 3D space using the pointer device.} } In this package we include an implementation of r3d using the underlying \code{rgl.*} functions. 3D computation is supported through the use of object structures that live entirely in R. \describe{ \item{Geometry Objects:}{Geometry and mesh objects allow to define high-level geometry for computational purpose such as triangle or quadrangle meshes (see \code{\link{mesh3d}}.} \item{Transformation:}{Generic interface to transform 3d objects.} \item{Visualization:}{Generic rendering of 3d objects such as dotted, wired or shaded.} \item{Computation:}{Generic subdivision of 3d objects.} } At present, there are two main practical differences between the r3d functions and the \code{rgl.*} functions is that the r3d functions call \code{\link{open3d}} if there is no device open, and the \code{rgl.*} functions call \code{\link{rgl.open}}. By default \code{\link{open3d}} sets the initial orientation of the coordinate system in 'world coordinates', i.e. a right-handed coordinate system in which the x-axis increases from left to right, the y-axis increases with depth into the scene, and the z-axis increases from bottom to top of the screen. \code{rgl.*} functions, on the other hand, use a right-handed coordinate system similar to that used in OpenGL. The x-axis matches that of r3d, but the y-axis increases from bottom to top, and the z-axis decreases with depth into the scene. Since the user can manipulate the scene, either system can be rotated into the other one. The r3d functions also preserve the \code{rgl.material} setting across calls (except for texture elements, in the current implementation), whereas the \code{rgl.*} functions leave it as set by the last call. The example code below illustrates the two coordinate systems. } \seealso{ \code{\link{points3d}} \code{\link{lines3d}} \code{\link{segments3d}} \code{\link{triangles3d}} \code{\link{quads3d}} \code{\link{text3d}} \code{\link{spheres3d}} \code{\link{sprites3d}} \code{\link{terrain3d}} \code{\link{select3d}} \code{\link{dot3d}} \code{\link{wire3d}} \code{\link{shade3d}} \code{\link{transform3d}} \code{\link{rotate3d}} \code{\link{subdivision3d}} \code{\link{mesh3d}} \code{\link{cube3d}} \code{\link{rgl}} } \examples{ x <- c(0,1,0,0) y <- c(0,0,1,0) z <- c(0,0,0,1) labels <- c("Origin", "X", "Y", "Z") i <- c(1,2,1,3,1,4) # rgl.* interface rgl.open() rgl.texts(x,y,z,labels) rgl.texts(1,1,1,"rgl.* coordinates") rgl.lines(x[i],y[i],z[i]) # *3d interface open3d() text3d(x,y,z,labels) text3d(1,1,1,"*3d coordinates") segments3d(x[i],y[i],z[i]) } \keyword{dynamic} rgl/man/3dobjects.Rd0000644000176000001440000000637211064454445014027 0ustar ripleyusers\name{points3d} \alias{points3d} \alias{lines3d} \alias{segments3d} \alias{triangles3d} \alias{quads3d} \title{add primitive set shape} \description{ Adds a shape node to the current scene } \usage{ points3d(x, y = NULL, z = NULL, ...) lines3d(x, y = NULL, z = NULL, ...) segments3d(x, y = NULL, z = NULL, ...) triangles3d(x, y = NULL, z = NULL, ...) quads3d(x, y = NULL, z = NULL, ...) } \arguments{ \item{x, y, z}{coordinates. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{ ... }{Material properties (see \code{\link{rgl.material}}), normals and texture coordinates (see \code{\link{rgl.primitive}}).} } \details{ The functions \code{points3d}, \code{lines3d}, \code{segments3d}, \code{triangles3d} and \code{quads3d} add points, joined lines, line segments, filled triangles or quadrilaterals to the plots. They correspond to the OpenGL types \code{GL_POINTS, GL_LINE_STRIP, GL_LINES, GL_TRIANGLES} and \code{GL_QUADS} respectively. Points are taken in pairs by \code{segments3d}, triplets as the vertices of the triangles, and quadruplets for the quadrilaterals. Colours are applied vertex by vertex; if different at each end of a line segment, or each vertex of a polygon, the colours are blended over the extent of the object. Quadrilaterals must be entirely in one plane and convex, or the results are undefined. These functions call the lower level functions \code{\link{rgl.points}}, \code{\link{rgl.linestrips}}, and so on, and are provided for convenience. The appearance of the new objects are defined by the material properties. See \code{\link{rgl.material}} for details. The two principal differences between the \code{rgl.*} functions and the \code{*3d} functions are that the former set all unspecified material properties to defaults, whereas the latter use current values as defaults; the former make persistent changes to material properties with each call, whereas the latter make temporary changes only for the duration of the call. } \value{ Each function returns the integer object ID of the shape that was added to the scene. These can be passed to \code{\link{rgl.pop}} to remove the object from the scene. } \author{ Ming Chen and Duncan Murdoch } \examples{ # Show 12 random vertices in various ways. M <- matrix(rnorm(36), 3, 12, dimnames=list(c('x','y','z'), rep(LETTERS[1:4], 3))) # Force 4-tuples to be convex in planes so that quads3d works. for (i in c(1,5,9)) { quad <- as.data.frame(M[,i+0:3]) coeffs <- runif(2,0,3) if (mean(coeffs) < 1) coeffs <- coeffs + 1 - mean(coeffs) quad$C <- with(quad, coeffs[1]*(B-A) + coeffs[2]*(D-A) + A) M[,i+0:3] <- as.matrix(quad) } open3d() # Rows of M are x, y, z coords; transpose to plot M <- t(M) shift <- matrix(c(-3,3,0), 12, 3, byrow=TRUE) points3d(M) lines3d(M + shift) segments3d(M + 2*shift) triangles3d(M + 3*shift, col='red') quads3d(M + 4*shift, col='green') text3d(M + 5*shift, texts=1:12) # Add labels shift <- outer(0:5, shift[1,]) shift[,1] <- shift[,1] + 3 text3d(shift, texts = c('points3d','lines3d','segments3d', 'triangles3d', 'quads3d','text3d'), adj = 0) rgl.bringtotop() } \keyword{dynamic} rgl/man/bbox.Rd0000644000176000001440000000552411557452012013072 0ustar ripleyusers\name{rgl.bbox} \alias{rgl.bbox} \alias{bbox3d} \title{Set up Bounding Box decoration} \description{ Set up the bounding box decoration. } \usage{ rgl.bbox( xat=NULL, xlab=NULL, xunit=0, xlen=5, yat=NULL, ylab=NULL, yunit=0, ylen=5, zat=NULL, zlab=NULL, zunit=0, zlen=5, marklen=15.0, marklen.rel=TRUE, expand=1, draw_front=FALSE, ...) bbox3d(xat=NULL, yat=NULL, zat=NULL, xunit="pretty", yunit="pretty", zunit="pretty", expand=1.03, nticks=5, draw_front=FALSE, ...) } \arguments{ \item{xat,yat,zat}{vector specifying the tickmark positions} \item{xlab,ylab,zlab}{character vector specifying the tickmark labeling} \item{xunit,yunit,zunit}{value specifying the tick mark base for uniform tick mark layout} \item{xlen,ylen,zlen}{value specifying the number of tickmarks} \item{marklen}{value specifying the length of the tickmarks} \item{marklen.rel}{logical, if TRUE tick mark length is calculated using 1/\code{marklen} * axis length, otherwise tick mark length is \code{marklen} in coordinate space} \item{expand}{value specifying how much to expand the bounding box around the data} \item{nticks}{suggested number of ticks to use on axes} \item{draw_front}{draw the front faces of the bounding box} \item{ ... }{Material properties (or other \code{rgl.bbox} parameters in the case of \code{bbox3d}). See \code{\link{rgl.material}} for details.} } \details{ Four different types of tick mark layouts are possible. If \code{at} is not \code{NULL}, the ticks are set up at custom positions. If \code{unit} is numeric but not zero, it defines the tick mark base. If it is \code{"pretty"} (the default in \code{bbox3d}), ticks are set at \code{\link{pretty}} locations. If \code{length} is not zero, it specifies the number of ticks that are automatically specified. The first colour specifies the bounding box, while the second one specifies the tick mark and font colour. \code{bbox3d} defaults to \code{\link{pretty}} locations for the axis labels and a slightly larger box, whereas \code{rgl.bbox} covers the exact range. \code{\link{axes3d}} offers more flexibility in the specification of the axes, but they are static, unlike those drawn by \code{\link{rgl.bbox}} and \code{\link{bbox3d}}. } \value{ This function is called for the side effect of setting the bounding box decoration. A shape ID is returned to allow \code{\link{rgl.pop}} to delete it. } \examples{ rgl.open() rgl.points(rnorm(100), rnorm(100), rnorm(100)) rgl.bbox(color=c("#333377","white"), emission="#333377", specular="#3333FF", shininess=5, alpha=0.8 ) open3d() points3d(rnorm(100), rnorm(100), rnorm(100)) bbox3d(color=c("#333377","black"), emission="#333377", specular="#3333FF", shininess=5, alpha=0.8) } \seealso{ \code{\link{rgl.material}}, \code{\link{axes3d}} } \keyword{dynamic} rgl/man/light.Rd0000644000176000001440000000462012136745735013256 0ustar ripleyusers\name{light} \alias{rgl.light} \alias{light3d} \title{add light source} \description{ add a light source to the scene. } \usage{ light3d(theta = 0, phi = 15, x = NULL, ...) rgl.light( theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", diffuse = "#FFFFFF", specular = "#FFFFFF", x = NULL, y = NULL, z = NULL) } \arguments{ \item{theta, phi}{polar coordinates, used by default} \item{viewpoint.rel}{logical, if TRUE light is a viewpoint light that is positioned relative to the current viewpoint} \item{ambient, diffuse, specular }{ light color values used for lighting calculation } \item{x, y, z}{cartesian coordinates, optional} \item{...}{generic arguments passed through to RGL-specific (or other) functions} } \details{ Up to 8 light sources are supported. They are positioned either in world space or relative to the camera. By providing polar coordinates to theta and phi a directional light source is used. If numerical values are given to x, y and z, a point-like light source with finite distance to the objects in the scene is set up. If \code{x} is non-null, \code{\link{xyz.coords}} will be used to form the location values, so all three coordinates can be specified in \code{x}. } \value{ This function is called for the side effect of adding a light. A light ID is returned to allow \code{\link{rgl.pop}} to remove it. } \seealso{ \code{\link{rgl.clear}} \code{\link{rgl.pop}} } \examples{ # # a lightsource moving through the scene # data(volcano) z <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(z)) # 10 meter spacing (S to N) y <- 10 * (1:ncol(z)) # 10 meter spacing (E to W) zlim <- range(z) zlen <- zlim[2] - zlim[1] + 1 colorlut <- terrain.colors(zlen) # height color lookup table col <- colorlut[ z-zlim[1]+1 ] # assign colors to heights for each point open3d() bg3d("gray50") surface3d(x, y, z, color=col, back="lines") r <- max(y)-mean(y) lightid <- spheres3d(1,1,1,alpha=0) for (a in seq(-pi, pi, length.out=100)) { save <- par3d(skipRedraw=TRUE) clear3d(type = "lights") rgl.pop(id = lightid) xyz <- matrix(c(r*sin(a)+mean(x), r*cos(a) + mean(y), max(z)), ncol=3) light3d(x = xyz, diffuse = "gray75", specular = "gray75", viewpoint.rel = FALSE) light3d(diffuse="gray10", specular="gray25") lightid <- spheres3d(xyz, emission="white", radius=4) par3d(save) Sys.sleep(0.02) } } \keyword{dynamic} rgl/man/check3d.Rd0000644000176000001440000000052712204542012013430 0ustar ripleyusers\name{.check3d} \alias{.check3d} \title{ Check for an open rgl window. } \description{ Mostly for internal use, this function returns the current device number if one exists, or opens a new device and returns that. } \usage{ .check3d() } \value{ The device number of an rgl device. } \author{ Duncan Murdoch } \seealso{ \code{\link{open3d}} } rgl/man/rgl.user2window.Rd0000644000176000001440000000361711064454445015221 0ustar ripleyusers\name{rgl.user2window} \alias{rgl.user2window} \alias{rgl.window2user} \alias{rgl.projection} \title{ Convert between rgl user and window coordinates } \description{ This function converts from 3-dimensional user coordinates to 3-dimensional window coordinates. } \usage{ rgl.user2window(x, y = NULL, z = NULL, projection = rgl.projection()) rgl.window2user(x, y = NULL, z = 0, projection = rgl.projection()) rgl.projection() } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x, y, z}{Input coordinates. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{projection}{The rgl projection to use } } \details{ These functions convert between user coordinates and window coordinates. Window coordinates run from 0 to 1 in X, Y, and Z. X runs from 0 on the left to 1 on the right; Y runs from 0 at the bottom to 1 at the top; Z runs from 0 foremost to 1 in the background. \code{rgl} does not currently display vertices plotted outside of this range, but in normal circumstances will automatically resize the display to show them. In the example below this has been suppressed. } \value{ The coordinate conversion functions produce a matrix with columns corresponding to the X, Y, and Z coordinates. \code{rgl.projection()} returns a list containing the model matrix, projection matrix and viewport. See \code{\link{par3d}} for more details. } \author{ Ming Chen / Duncan Murdoch} \seealso{\code{\link{select3d}} } \examples{ open3d() points3d(rnorm(100), rnorm(100), rnorm(100)) if (interactive() || !.Platform$OS=="unix") { # Calculate a square in the middle of the display and plot it square <- rgl.window2user(c(0.25, 0.25, 0.75, 0.75, 0.25), c(0.25, 0.75, 0.75, 0.25, 0.25), 0.5) par3d(ignoreExtent = TRUE) lines3d(square) par3d(ignoreExtent = FALSE) } } \keyword{ dynamic } rgl/man/rgl-package.Rd0000644000176000001440000000771712171604465014327 0ustar ripleyusers\name{rgl-package} \title{3D visualization device system} \alias{rgl-package} \alias{rgl} \alias{rgl.open} \alias{rgl.close} \alias{rgl.cur} \alias{rgl.set} \alias{rgl.quit} \alias{rgl.init} \alias{rgl.antialias} \alias{rgl.dev.list} \description{ 3D real-time rendering system. } \usage{ # Low level rgl.* interface rgl.open(useNULL = rgl.useNULL()) # open new device rgl.close() # close current device rgl.cur() # returns active device ID rgl.dev.list() # returns all device IDs rgl.set(which, silent=FALSE) # set device as active rgl.quit() # shutdown rgl device system rgl.init(initValue=0, onlyNULL=FALSE) # re-initialize rgl } \arguments{ \item{useNULL}{whether to open the \dQuote{null} device} \item{which}{device ID} \item{silent}{whether to suppress update of window titles} \item{initValue}{value for internal use only} \item{onlyNULL}{only initialize the null (no display) device} } \details{ RGL is a 3D real-time rendering device driver system for R. Multiple devices are managed at a time, where one has the current focus that receives instructions from the R command-line. The device design is oriented towards the R device metaphor. If you send scene management instructions, and there's no device open, it will be opened automatically. Opened devices automatically get the current device focus. The focus may be changed by using \code{rgl.set()}. \code{rgl.quit()} shuts down the rgl subsystem and all open devices, detaches the package including the shared library and additional system libraries. The \code{rgl.open()} function attempts to open a new RGL window. If the \code{"rgl.antialias"} option is set, it will be used to select the requested antialiasing. (See \code{\link{open3d}} for more description of antialiasing and an alternative way to set the value.) If \code{useNULL} is \code{TRUE}, \pkg{rgl} will use a \dQuote{null} device. This device records objects as they are plotted, but displays nothing. It is intended for use with \code{\link{writeWebGL}} and similar functions. If \code{rgl.open()} fails (e.g. because X windows is not running, or its \code{DISPLAY} variable is not set properly), then you can retry the initialization by calling \code{rgl.init()}. Do not do this when windows have already been successfully opened: they will be orphaned, with no way to remove them other than closing R. In fact, it's probably a good idea not to do this at all: quitting R and restarting it is a better solution. This package also includes a higher level interface which is described in the \link{r3d} help topic. That interface is designed to act more like classic 2D R graphics. We recommend that you avoid mixing \code{rgl.*} and \code{*3d} calls. See the first example below to display the ChangeLog. } \value{ \code{rgl.open}, \code{rgl.close} and \code{rgl.set} are called for their side effects and return no useful value. Similarly \code{rgl.init} and \code{rgl.quit} are not designed to return useful values; in fact, users shouldn't call them at all! \code{rgl.cur} returns the currently active devices, or \code{0} if none is active; \code{rgl.dev.list} returns a vector of all open devices. Both functions name the items according to the type of device: \code{null} for a hidden null device, \code{wgl} for a Windows device, \code{glX} for an X windows device, and \code{NSopenGL} for a Cocoa device on OSX. } \examples{ file.show(system.file("NEWS", package="rgl")) example(surface3d) example(plot3d) } \seealso{ \link{r3d}, \code{\link{rgl.clear}}, \code{\link{rgl.pop}}, \code{\link{rgl.viewpoint}}, \code{\link{rgl.light}}, \code{\link{rgl.bg}}, \code{\link{rgl.bbox}}, \code{\link{rgl.points}}, \code{\link{rgl.lines}}, \code{\link{rgl.triangles}}, \code{\link{rgl.quads}}, \code{\link{rgl.texts}}, \code{\link{rgl.surface}}, \code{\link{rgl.spheres}}, \code{\link{rgl.sprites}}, \code{\link{rgl.snapshot}}, \code{\link{rgl.useNULL}} } \keyword{dynamic} rgl/man/axes3d.Rd0000644000176000001440000000662012165640570013331 0ustar ripleyusers\name{axes3d} \alias{axes3d} \alias{axis3d} \alias{mtext3d} \alias{title3d} \alias{box3d} \title{ Draw boxes, axes and other text outside the data } \description{ These functions draw axes, boxes and text outside the range of the data. \code{axes3d}, \code{box3d} and \code{title3d} are the higher level functions; normally the others need not be called directly by users. } \usage{ axes3d(edges = "bbox", labels = TRUE, tick = TRUE, nticks = 5, box=FALSE, expand = 1.03, ...) box3d(...) title3d(main = NULL, sub = NULL, xlab = NULL, ylab = NULL, zlab = NULL, line = NA, ...) axis3d(edge, at = NULL, labels = TRUE, tick = TRUE, line = 0, pos = NULL, nticks = 5, ...) mtext3d(text, edge, line = 0, at = NULL, pos = NA, ...) } \arguments{ \item{edges}{ a code to describe which edge(s) of the box to use; see Details below } \item{labels}{ whether to label the axes, or (for \code{axis3d}) the labels to use} \item{tick}{ whether to use tick marks } \item{nticks}{ suggested number of ticks } \item{box}{ draw the full box if \code{"bbox"} axes are used } \item{expand}{ how much to expand the box around the data } \item{main}{ the main title for the plot } \item{sub}{ the subtitle for the plot } \item{xlab, ylab, zlab}{ the axis labels for the plot } \item{line}{ the ``line'' of the plot margin to draw the label on } \item{edge, pos}{ the position at which to draw the axis or text } \item{text}{ the text to draw } \item{at}{ the value of a coordinate at which to draw the axis } \item{\dots}{ additional parameters which are passed to \code{\link{bbox3d}} or \code{\link{material3d}} } } \details{ The rectangular prism holding the 3D plot has 12 edges. They are identified using 3 character strings. The first character (`x', `y', or `z') selects the direction of the axis. The next two characters are each `-' or `+', selecting the lower or upper end of one of the other coordinates. If only one or two characters are given, the remaining characters default to `-'. For example \code{edge = 'x+'} draws an x-axis at the high level of y and the low level of z. By default, \code{axes3d} uses the \code{\link{bbox3d}} function to draw the axes. The labels will move so that they do not obscure the data. Alternatively, a vector of arguments as described above may be used, in which case fixed axes are drawn using \code{axis3d}. If \code{pos} is a numeric vector of length 3, \code{edge} determines the direction of the axis and the tick marks, and the values of the other two coordinates in \code{pos} determine the position. See the examples. } \value{ These functions are called for their side effects. They return the object IDs of objects added to the scene. } \author{ Duncan Murdoch } \seealso{\code{\link{axis}}, \code{\link{box}}, \code{title}, \code{mtext}, \link{bbox3d}} \examples{ open3d() points3d(rnorm(10),rnorm(10),rnorm(10)) # First add standard axes axes3d() # and one in the middle (the NA will be ignored, a number would # do as well) axis3d('x',pos=c(NA, 0, 0)) # add titles title3d('main','sub','xlab','ylab','zlab') rgl.bringtotop() open3d() points3d(rnorm(10),rnorm(10),rnorm(10)) # Use fixed axes axes3d(c('x','y','z')) # Put 4 x-axes on the plot axes3d(c('x--','x-+','x+-','x++')) axis3d('x',pos=c(NA, 0, 0)) title3d('main','sub','xlab','ylab','zlab') } \keyword{dynamic}%-- one or more ... rgl/man/material.Rd0000644000176000001440000001347111506074324013736 0ustar ripleyusers\name{rgl.material} \alias{rgl.material} \alias{material3d} \title{Generic Appearance setup} \description{ Set material properties for geometry appearance. } \usage{ rgl.material( color = c("white"), alpha = c(1.0), lit = TRUE, ambient = "black", specular = "white", emission = "black", shininess = 50.0, smooth = TRUE, texture = NULL, textype = "rgb", texmipmap = FALSE, texminfilter = "linear", texmagfilter = "linear", texenvmap = FALSE, front = "fill", back = "fill", size = 3.0, lwd = 1.0, fog = TRUE, point_antialias = FALSE, line_antialias = FALSE, depth_mask = TRUE, depth_test = "less", ... ) material3d(...) } \arguments{ \item{color}{ vector of R color characters. Represents the diffuse component in case of lighting calculation (lit = TRUE), otherwise it describes the solid color characteristics. } \item{lit}{ logical, specifying if lighting calculation should take place on geometry } \item{ambient, specular, emission, shininess}{ properties for lighting calculation. ambient, specular, emission are R color character string values; shininess represents a numerical. } \item{alpha}{ vector of alpha values between 0.0 (fully transparent) .. 1.0 (opaque). } \item{smooth}{ logical, specifying whether Gouraud shading (smooth) or flat shading should be used. } \item{texture}{ path to a texture image file. Supported formats: png. } \item{textype}{ specifies what is defined with the pixmap \describe{ \item{"alpha"}{alpha values} \item{"luminance"}{luminance} \item{"luminance.alpha"}{luminance and alpha} \item{"rgb"}{color} \item{"rgba"}{color and alpha texture} } } \item{texmipmap}{ Logical, specifies if the texture should be mipmapped. } \item{texmagfilter}{ specifies the magnification filtering type (sorted by ascending quality): \describe{ \item{"nearest"}{texel nearest to the center of the pixel} \item{"linear"}{weighted linear average of a 2x2 array of texels} } } \item{texminfilter}{ specifies the minification filtering type (sorted by ascending quality): \describe{ \item{"nearest"}{texel nearest to the center of the pixel} \item{"linear"}{weighted linear average of a 2x2 array of texels} \item{"nearest.mipmap.nearest"}{low quality mipmapping} \item{"nearest.mipmap.linear"}{medium quality mipmapping} \item{"linear.mipmap.nearest"}{medium quality mipmapping} \item{"linear.mipmap.linear"}{high quality mipmapping} } } \item{texenvmap}{ logical, specifies if auto-generated texture coordinates for environment-mapping should be performed on geometry. } \item{front, back}{ Determines the polygon mode for the specified side: \describe{ \item{"fill"}{filled polygon} \item{"line"}{wireframed polygon} \item{"points"}{point polygon} \item{"cull"}{culled (hidden) polygon} } } \item{size}{ numeric, specifying the size of points in pixels } \item{lwd}{ numeric, specifying the line width in pixels } \item{fog}{logical, specifying if fog effect should be applied on the corresponding shape} \item{point_antialias, line_antialias}{logical, specifying if points and lines should be antialiased} \item{depth_mask}{logical, specifying whether the object's depth should be stored.} \item{depth_test}{Determines which depth test is used to see if this object is visible, depending on its apparent depth in the scene compared to the stored depth. Possible values are \code{"never"}, \code{"less"} (the default), \code{"equal"}, \code{"lequal"} (less than or equal), \code{"greater"}, \code{"notequal"}, \code{"gequal"} (greater than or equal), \code{"always"}.} \item{...}{Any of the arguments above; see Details below.} } \details{ Only one side at a time can be culled. \code{material3d} is an alternate interface to the material properties, modelled after \code{\link{par3d}}: rather than setting defaults for parameters that are not specified, they will be left unchanged. \code{material3d} may also be used to query the material properties; see the examples below. The current implementation does not return parameters for textures. If \code{point_antialias} is \code{TRUE}, points will be drawn as circles; otherwise, they will be drawn as squares. Lines tend to appear heavier with \code{line_antialias==TRUE}. The \code{material} member of the \code{\link{r3dDefaults}} list may be used to set default values for material properties. The \code{...} parameter to \code{rgl.material} is ignored. } \value{ \code{rgl.material()} is called for the side effect of setting the material properties. It returns a value invisibly which is not intended for use by the user. Users should use \code{material3d()} to query material properties. It returns values similarly to \code{\link{par3d}} as follows: When setting properties, it returns the previous values in a named list. A named list is also returned when more than one value is queried. When a single value is queried it is returned directly. } \seealso{ \code{\link{rgl.primitive}}, \code{\link{rgl.bbox}}, \code{\link{rgl.bg}}, \code{\link{rgl.light}} } \examples{ save <- material3d("color") material3d(color="red") material3d("color") material3d(color=save) # this illustrates the effect of depth_test x <- c(1:3); xmid <- mean(x) y <- c(2,1,3); ymid <- mean(y) z <- 1 open3d() tests <- c("never", "less", "equal", "lequal", "greater", "notequal", "gequal", "always") for (i in 1:8) { triangles3d(x,y,z+i, col=heat.colors(8)[i]) texts3d(xmid,ymid,z+i, paste(i, tests[i], sep=". "), depth_test=tests[i]) } } \keyword{dynamic} rgl/man/matrices.Rd0000644000176000001440000000730411153473076013752 0ustar ripleyusers\name{matrices} \alias{matrices} \alias{identityMatrix} \alias{scaleMatrix} \alias{translationMatrix} \alias{rotationMatrix} \alias{scale3d} \alias{translate3d} \alias{rotate3d} \alias{transform3d} \alias{asHomogeneous} \alias{asEuclidean} \title{Work with homogeneous coordinates } \description{ These functions construct 4x4 matrices for transformations in the homogeneous coordinate system used by OpenGL, and translate vectors between homogeneous and Euclidean coordinates. } \usage{ identityMatrix() scaleMatrix(x, y, z) translationMatrix(x, y, z) rotationMatrix(angle, x, y, z, matrix) asHomogeneous(x) asEuclidean(x) scale3d(obj, x, y, z, ...) translate3d(obj, x, y, z, ...) rotate3d(obj, angle, x, y, z, matrix, ...) transform3d(obj, matrix, ...) } \arguments{ \item{x, y, z, angle, matrix}{See details} \item{obj}{An object to be transformed} \item{...}{Additional parameters to be passed to methods} } \details{ OpenGL uses homogeneous coordinates to handle perspective and affine transformations. The homogeneous point \code{(x, y, z, w)} corresponds to the Euclidean point \code{(x/w, y/w, z/w)}. The matrices produced by the functions \code{scaleMatrix}, \code{translationMatrix}, and \code{rotationMatrix} are to be left-multiplied by a row vector of homogeneous coordinates; alternatively, the transpose of the result can be right-multiplied by a column vector. The generic functions \code{scale3d}, \code{translate3d} and \code{rotate3d} apply these transformations to the \code{obj} argument. The \code{transform3d} function is a synonym for \code{rotate3d(obj, matrix=matrix)}. By default, it is assumed that \code{obj} is a row vector (or a matrix of row vectors) which will be multiplied on the right by the corresponding matrix, but users may write methods for these generics which operate differently. Methods are supplied for \code{\link{mesh3d}} objects. To compose transformations, use matrix multiplication. The effect is to apply the matrix on the left first, followed by the one on the right. \code{identityMatrix} returns an identity matrix. \code{scaleMatrix} scales each coordinate by the given factor. In Euclidean coordinates, \code{(u, v, w)} is transformed to \code{(x*u, y*v, z*w)}. \code{translationMatrix} translates each coordinate by the given translation, i.e. \code{(u,v,w)} is transformed to \code{(u+x,v+y,w+z)}. \code{rotationMatrix} can be called in three ways. With arguments \code{angle, x, y, z} it represents a rotation of \code{angle} radians about the axis \code{x, y, z}. If \code{matrix} is a 3x3 rotation matrix, it will be converted into the corresponding matrix in 4x4 homogeneous coordinates. Finally, if a 4x4 matrix is given, it will be returned unchanged. (The latter behaviour is used to allow \code{transform3d} to act like a generic function, even though it is not.) Use \code{asHomogeneous(x)} to convert the Euclidean vector \code{x} to homogeneous coordinates, and \code{asEuclidean(x)} for the reverse transformation. } \value{ \code{identityMatrix}, \code{scaleMatrix}, \code{translationMatrix}, and \code{rotationMatrix} produce a 4x4 matrix representing the requested transformation in homogeneous coordinates. \code{scale3d}, \code{translate3d} and \code{rotate3d} transform the object and produce a new object of the same class. } \author{ Duncan Murdoch } \seealso{\code{\link{par3d}} for a description of how rgl uses matrices in rendering.} \examples{ # A 90 degree rotation about the x axis: rotationMatrix(pi/2, 1, 0, 0) # Find what happens when you rotate (2,0,0) by 45 degrees about the y axis: x <- asHomogeneous(c(2,0,0)) y <- x %*% rotationMatrix(pi/4, 0, 1, 0) asEuclidean(y) # or more simply... rotate3d(c(2,0,0), pi/4, 0, 1, 0) } \keyword{ dynamic } rgl/man/grid3d.Rd0000644000176000001440000000456611562560461013325 0ustar ripleyusers\name{grid3d} \alias{grid3d} \title{Add a grid to a 3D plot } \description{ This function adds a reference grid to an RGL plot. } \usage{ grid3d(side, at = NULL, col = "gray", lwd = 1, lty = 1, n = 5) } \arguments{ \item{side}{ Where to put the grid; see the Details section. } \item{at}{ How to draw the grid; see the Details section. } \item{col}{ The color of the grid lines. } \item{lwd}{ The line width of the grid lines. } \item{lty}{ The line type of the grid lines. } \item{n}{ Suggested number of grid lines; see the Details section. } } \details{ This function is similar to \code{\link{grid}} in classic graphics, except that it draws a 3D grid in the plot. The grid is drawn in a plane perpendicular to the coordinate axes. The first letter of the \code{side} argument specifies the direction of the plane: \code{"x"}, \code{"y"} or \code{"z"} (or uppercase versions) to specify the coordinate which is constant on the plane. If \code{at = NULL} (the default), the grid is drawn at the limit of the box around the data. If the second letter of the \code{side} argument is \code{"-"} or is not present, it is the lower limit; if \code{"+"} then at the upper limit. The grid lines are drawn at values chosen by \code{\link{pretty}} with \code{n} suggested locations. The default locations should match those chosen by \code{\link{axis3d}} with \code{nticks = n}. If \code{at} is a numeric vector, the grid lines are drawn at those values. If \code{at} is a list, then the \code{"x"} component is used to specify the x location, the \code{"y"} component specifies the y location, and the \code{"z"} component specifies the z location. Missing components are handled using the default as for \code{at = NULL}. Multiple grids may be drawn by specifying multiple values for \code{side} or for the component of \code{at} that specifies the grid location. } \note{ If the scene is resized, the grid will not be resized; use \code{\link{abclines3d}} to draw grid lines that will automatically resize. } \value{ A vector or matrix of object ids is returned invisibly. } \author{ Ben Bolker and Duncan Murdoch } \seealso{ \code{\link{axis3d}} } \examples{ x <- 1:10 y <- 1:10 z <- matrix(outer(x-5,y-5) + rnorm(100), 10, 10) open3d() persp3d(x, y, z, col="red", alpha=0.7, aspect=c(1,1,0.5)) grid3d(c("x", "y+", "z")) } \keyword{ dynamic } rgl/man/selectpoints3d.Rd0000644000176000001440000000501212136474342015077 0ustar ripleyusers\name{selectpoints3d} \alias{selectpoints3d} \title{ Select points from a scene } \description{ This function uses the \code{\link{select3d}} function to allow the user to choose a point or region in the scene, then reports on all the vertices in or near that selection. } \usage{ selectpoints3d(objects = rgl.ids()$id, value = TRUE, closest = TRUE, multiple = FALSE, ...) } \arguments{ \item{objects}{ A vector of object id values to use for the search. } \item{value}{ If \code{TRUE}, return the coordinates of the points; otherwise, return their indices. } \item{closest}{ If \code{TRUE}, return the points closest to the selection of no points are exactly within it. } \item{multiple}{ If \code{TRUE} or a function, do multiple selections. See the Details below. } \item{\dots}{ Other parameters to pass to \code{\link{select3d}}. } } \details{ The \code{multiple} argument may be a logical value or a function. If logical, it controls whether multiple selections will be performed. If \code{multiple} is \code{FALSE}, a single selection will be performed; it might contain multiple points. If \code{TRUE}, multiple selections will occur and the results will be combined into a single matrix. If \code{multiple} is a function, it should take a single argument. This function will be called with the argument set to the newly selected points. It should return a logical value, \code{TRUE} to indicate that selection should continue, \code{FALSE} to indicate that it should stop. In either case, if multiple selections are being performed, the \code{ESC} key will stop the process. } \value{ If \code{value} is \code{TRUE}, a 3-column matrix giving the coordinates of the selected points. All rows in the matrix will be unique even if multiple vertices have the same coordinates. If \code{value} is \code{FALSE}, a 2-column matrix containing columns: \item{id}{The object id containing the point.} \item{index}{The index of the point within \code{\link{rgl.attrib}(id, "vertices")}. If multiple points have the same coordinates, all indices will be returned.} } \author{ Duncan Murdoch } \seealso{ \code{\link{select3d}} to return a selection function. } \examples{ \donttest{ ids <- plot3d( rnorm(20), rnorm(20), rnorm(20) ) # Click near a point to select it and put a sphere there selectpoints3d(ids["data"], multiple = function(x) { spheres3d(x, color = "red", alpha = 0.3, radius = 0.2) TRUE }) } } \keyword{ graphics } rgl/man/surface.Rd0000644000176000001440000000654511064454445013601 0ustar ripleyusers\name{rgl.surface} \title{add height-field surface shape} \alias{rgl.surface} \description{ Adds a surface to the current scene. The surface is defined by a matrix defining the height of each grid point and two vectors defining the grid. } \usage{ rgl.surface(x, z, y, coords=1:3, ..., normal_x=NULL, normal_y=NULL, normal_z=NULL, texture_s=NULL, texture_t=NULL) } \arguments{ \item{ x }{ values corresponding to rows of \code{y}, or matrix of x coordinates } \item{ y }{ matrix of height values } \item{ z }{ values corresponding to columns of \code{y}, or matrix of z coordinates } \item{ coords }{ See details } \item{ ... }{Material and texture properties. See \code{\link{rgl.material}} for details.} \item{normal_x, normal_y, normal_z}{ matrices of the same dimension as \code{y} giving the coordinates of normals at each grid point} \item{texture_s, texture_t}{ matrices of the same dimension as \code{z} giving the coordinates within the current texture of each grid point} } \details{ Adds a surface mesh to the current scene. The surface is defined by the matrix of height values in \code{y}, with rows corresponding to the values in \code{x} and columns corresponding to the values in \code{z}. The \code{coords} parameter can be used to change the geometric interpretation of \code{x}, \code{y}, and \code{z}. The first entry of \code{coords} indicates which coordinate (\code{1=X}, \code{2=Y}, \code{3=Z}) corresponds to the \code{x} parameter. Similarly the second entry corresponds to the \code{y} parameter, and the third entry to the \code{z} parameter. In this way surfaces may be defined over any coordinate plane. If the normals are not supplied, they will be calculated automatically based on neighbouring points. Texture coordinates run from 0 to 1 over each dimension of the texture bitmap. If texture coordinates are not supplied, they will be calculated to render the texture exactly once over the grid. Values greater than 1 can be used to repeat the texture over the surface. \code{rgl.surface} always draws the surface with the `front' upwards (i.e. towards higher \code{y} values). This can be used to render the top and bottom differently; see \code{\link{rgl.material}} and the example below. If the \code{x} or \code{z} argument is a matrix, then it must be of the same dimension as \code{y}, and the values in the matrix will be used for the corresponding coordinates. This is used to plot shapes such as cylinders where y is not a function of x and z. \code{NA} values in the height matrix are not drawn. } \value{ The object ID of the displayed surface is returned invisibly. } \examples{ # # volcano example taken from "persp" # data(volcano) y <- 2 * volcano # Exaggerate the relief x <- 10 * (1:nrow(y)) # 10 meter spacing (S to N) z <- 10 * (1:ncol(y)) # 10 meter spacing (E to W) ylim <- range(y) ylen <- ylim[2] - ylim[1] + 1 colorlut <- terrain.colors(ylen) # height color lookup table col <- colorlut[ y-ylim[1]+1 ] # assign colors to heights for each point rgl.open() rgl.surface(x, z, y, color=col, back="lines") } \seealso{ \code{\link{rgl.material}}, \code{\link{surface3d}}, \code{\link{terrain3d}}. See \code{\link{persp3d}} for a higher level interface. } \keyword{dynamic} rgl/man/rgl.select.Rd0000644000176000001440000000123712204537663014205 0ustar ripleyusers\name{rgl.select} \alias{rgl.select} \title{ Switch to select mode, and return the mouse position selected. } \description{ Mostly for internal use, this function temporarily installs a handler on a button of the mouse that will return the mouse coordinates of one click and drag rectangle. } \usage{ rgl.select(button = c("left", "middle", "right")) } \arguments{ \item{button}{ Which button to use? } } \value{ A vector of four coordinates: the X and Y coordinates of the start and end of the dragged rectangle. } \author{ Duncan Murdoch } \seealso{ \code{\link{rgl.select3d}}, a version that allows the selection region to be used to select points in the scene. } rgl/man/rgl.useNULL.Rd0000644000176000001440000000114612171573711014211 0ustar ripleyusers\name{rgl.useNULL} \alias{rgl.useNULL} \title{ Report default use of null device. } \description{ This function checks the \code{"rgl.useNULL"} option if present, or the \env{RGL_USE_NULL} environment variable if it is not. If the value is \code{TRUE} or a string which matches \dQuote{yes} or \dQuote{true} in a case-insensitive test, \code{TRUE} is returned. } \usage{ rgl.useNULL() } \value{ A logical value indicating the current default for use of the null device. } \author{ Duncan Murdoch } \seealso{ \code{\link{open3d}} and \code{\link{rgl.open}}. } \examples{ rgl.useNULL() } rgl/man/shapelist3d.Rd0000644000176000001440000000352411153473075014365 0ustar ripleyusers\name{shapelist3d} \alias{shapelist3d} \title{ Create and plot a list of shapes } \description{ These functions create and plot a list of shapes. } \usage{ shapelist3d(shapes, x = 0, y = NULL, z = NULL, size = 1, matrix = NULL, override = TRUE, ..., plot = TRUE) } \arguments{ \item{shapes}{ A single \code{shape3d} object, or a list of them. } \item{x, y, z}{ Translation(s) to apply } \item{size}{ Scaling(s) to apply } \item{matrix}{ A single matrix transformation, or a list of them. } \item{override}{ Whether the material properties should override the ones in the shapes. } \item{\dots}{ Material properties to apply. } \item{plot}{ Whether to plot the result. } } \details{ \code{shapelist3d} is a quick way to create a complex object made up of simpler ones. Each of the arguments \code{shapes} through \code{override} may be a vector of values (a list in the case of \code{shapes} or \code{matrix}). All values will be recycled to produce a list of shapes as long as the longest of them. The \code{\link{xyz.coords}} function will be used to process the \code{x}, \code{y} and \code{z} arguments, so a matrix may be used as \code{x} to specify all three. If a vector is used for \code{x} but \code{y} or \code{z} is missing, default values of \code{0} will be used. The \code{"shapelist3d"} class is simply a list of \code{"shape3d"} objects. Methods for \code{\link{dot3d}}, \code{\link{wire3d}}, \code{\link{shade3d}}, \code{\link{translate3d}}, \code{\link{scale3d}}, and \code{\link{rotate3d}} are defined for these objects. } \value{ An object of class \code{c("shapelist3d", "shape3d")}. } \author{ Duncan Murdoch } \seealso{ \code{\link{mesh3d}} } \examples{ shapelist3d(icosahedron3d(), x=rnorm(10), y=rnorm(10), z=rnorm(10), col=1:5, size=0.3) } \keyword{ dynamic } rgl/man/primitive.Rd0000644000176000001440000000520511064454445014151 0ustar ripleyusers\name{rgl.primitive} \alias{rgl.primitive} \alias{rgl.points} \alias{rgl.lines} \alias{rgl.linestrips} \alias{rgl.triangles} \alias{rgl.quads} \title{add primitive set shape} \description{ Adds a shape node to the current scene } \usage{ rgl.points(x, y = NULL, z = NULL, ... ) rgl.lines(x, y = NULL, z = NULL, ... ) rgl.linestrips(x, y = NULL, z = NULL, ...) rgl.triangles(x, y = NULL, z = NULL, normals=NULL, texcoords=NULL, ... ) rgl.quads(x, y = NULL, z = NULL, normals=NULL, texcoords=NULL, ... ) } \arguments{ \item{x, y, z}{coordinates. Any reasonable way of defining the coordinates is acceptable. See the function \code{\link[grDevices]{xyz.coords}} for details.} \item{normals}{Normals at each point.} \item{texcoords}{Texture coordinates at each point.} \item{ ... }{Material properties. See \code{\link{rgl.material}} for details.} } \details{ Adds a shape node to the scene. The appearance is defined by the material properties. See \code{\link{rgl.material}} for details. For triangles and quads, the normals at each vertex may be specified using \code{normals}. These may be given in any way that would be acceptable as a single argument to \code{\link[grDevices]{xyz.coords}}. These need not match the actual normals to the polygon: curved surfaces can be simulated by using other choices of normals. Texture coordinates may also be specified. These may be given in any way that would be acceptable as a single argument to \code{\link[grDevices]{xy.coords}}, and are interpreted in terms of the bitmap specified as the material texture, with \code{(0,0)} at the lower left, \code{(1,1)} at the upper right. The texture is used to modulate the colour of the polygon. These are the lower level functions called by \code{\link{points3d}}, \code{\link{lines3d}}, etc. The two principal differences between the \code{rgl.*} functions and the \code{*3d} functions are that the former set all unspecified material properties to defaults, whereas the latter use current values as defaults; the former make persistent changes to material properties with each call, whereas the latter make temporary changes only for the duration of the call. } \value{ Each primitive function returns the integer object ID of the shape that was added to the scene. These can be passed to \code{\link{rgl.pop}} to remove the object from the scene. } \examples{ rgl.open() rgl.points(rnorm(1000), rnorm(1000), rnorm(1000), color=heat.colors(1000)) } \seealso{ \code{\link{rgl.material}}, \code{\link{rgl.spheres}}, \code{\link{rgl.texts}}, \code{\link{rgl.surface}}, \code{\link{rgl.sprites}} } \keyword{dynamic} rgl/man/scene.Rd0000644000176000001440000000456311726502220013232 0ustar ripleyusers\name{scene} \alias{rgl.clear} \alias{rgl.pop} \alias{clear3d} \alias{pop3d} \alias{rgl.ids} \title{scene management} \description{ Clear shapes, lights, bbox } \usage{ clear3d( type = c("shapes", "bboxdeco", "material"), defaults ) rgl.clear( type = "shapes" ) pop3d( ... ) rgl.pop( type = "shapes", id = 0 ) rgl.ids( type = "shapes" ) } \arguments{ \item{type}{Select subtype(s): \describe{ \item{"shapes"}{shape stack} \item{"lights"}{light stack} \item{"bboxdeco"}{bounding box} \item{"viewpoint"}{viewpoint} \item{"material"}{material properties} \item{"background"}{scene background} \item{"all"}{all of the above} } } \item{defaults}{default values to use after clearing} \item{id}{vector of ID numbers of items to remove} \item{...}{generic arguments passed through to RGL-specific (or other) functions} } \details{ RGL holds two stacks. One is for shapes and the other is for lights. \code{clear3d} and \code{rgl.clear} clear the specified stack, or restore the defaults for the bounding box (not visible) or viewpoint. By default with \code{id=0} \code{rgl.pop} removes the top-most (last added) node on the shape stack. The \code{id} argument may be used to specify arbitrary item(s) to remove from the specified stack. \code{rgl.clear} and \code{clear3d} may also be used to clear material properties back to their defaults. \code{clear3d} has an optional \code{defaults} argument, which defaults to \code{\link{r3dDefaults}}. Only the \code{materials} component of this argument is currently used by \code{clear3d}. \code{rgl.ids} returns a dataframe containing the IDs in the currently active rgl window, along with an indicator of their type. For convenience, \code{type="shapes"} and \code{id=1} signifies the bounding box. Note that clearing the light stack leaves the scene in darkness; it should normally be followed by a call to \code{\link{rgl.light}} or \code{\link{light3d}}. } \seealso{ \code{\link{rgl}}, \code{\link{rgl.bbox}}, \code{\link{rgl.light}}, \code{\link{open3d}} to open a new window. } \examples{ x <- rnorm(100) y <- rnorm(100) z <- rnorm(100) p <- plot3d(x, y, z, type='s') rgl.ids() lines3d(x, y, z) rgl.ids() if (interactive()) { readline("Hit enter to change spheres") rgl.pop(id = p["data"]) spheres3d(x, y, z, col="red", radius=1/5) box3d() } } \keyword{dynamic} rgl/man/turn3d.Rd0000644000176000001440000000156112167025471013357 0ustar ripleyusers\name{turn3d} \alias{turn3d} \title{ Create a solid of rotation from a two-dimensional curve. } \description{ This function \dQuote{turns} the curve (as on a lathe) to form a solid of rotation along the x axis. } \usage{ turn3d(x, y = NULL, n = 12, smooth = FALSE, ...) } \arguments{ \item{x, y}{ Points on the curve, in a form suitable for \code{\link{xy.coords}}. The \code{y} values must be non-negative. } \item{n}{ How many steps in the rotation? } \item{smooth}{ logical; whether to add normals for a smooth appearance. } \item{...}{ Additional parameters to pass to \code{\link{tmesh3d}}. } } \value{ A mesh object containing triangles and/or quadrilaterals. } \author{ Fang He and Duncan Murdoch } \seealso{ \code{\link{extrude3d}} } \examples{ x <- 1:10 y <- rnorm(10)^2 shade3d(turn3d(x, y), col = "green") } \keyword{ graphics } rgl/man/bg.Rd0000644000176000001440000000273211064454445012533 0ustar ripleyusers\name{bg} \alias{rgl.bg} \alias{bg3d} \title{Set up Background} \description{ Setup the background environment of the scene. } \usage{ bg3d(...) rgl.bg( sphere = FALSE, fogtype = "none", color=c("black","white"), back="lines", ...) } \arguments{ \item{fogtype}{fog type: \describe{ \item{"none"}{no fog} \item{"linear"}{linear fog function} \item{"exp"}{exponential fog function} \item{"exp2"}{squared exponential fog function} } } \item{sphere}{ logical, if true, an environmental sphere geometry is used for the background decoration. } \item{color}{ Primary color is used for background clearing and as fog color. Secondary color is used for background sphere geometry. See \code{\link{rgl.material}} for details. } \item{back}{ Specifies the fill style of the sphere geometry. See \code{\link{rgl.material}} for details. } \item{ ... }{Material properties. See \code{\link{rgl.material}} for details.} } \details{ If sphere is set to TRUE, an environmental sphere enclosing the whole scene is drawn. } \examples{ rgl.open() # a simple white background bg3d("white") # the holo-globe (inspired by star trek): rgl.bg(sphere=TRUE, color=c("black","green"), lit=FALSE, back="lines" ) # an environmental sphere with a nice texture. rgl.bg(sphere=TRUE, texture=system.file("textures/sunsleep.png", package="rgl"), back="filled" ) } \seealso{ \code{\link{rgl.material}} } \keyword{dynamic} rgl/man/aspect3d.Rd0000644000176000001440000000237611064454445013655 0ustar ripleyusers\name{aspect3d} \alias{aspect3d} \title{Set the aspect ratios of the current plot} \description{ This function sets the apparent ratios of the x, y, and z axes of the current bounding box. } \usage{ aspect3d(x, y = NULL, z = NULL) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{The ratio for the x axis, or all three ratios, or \code{"iso"} } \item{y}{The ratio for the y axis } \item{z}{The ratio for the z axis } } \details{ If the ratios are all 1, the bounding box will be displayed as a cube approximately filling the display. Values may be set larger or smaller as desired. Aspect \code{"iso"} signifies that the coordinates should all be displayed at the same scale, i.e. the bounding box should not be rescaled. (This corresponds to the default display before \code{aspect3d} has been called.) Partial matches to \code{"iso"} are allowed. \code{aspect3d} works by modifying \code{par3d("scale")}. } \value{ The previous value of the scale is returned invisibly. } \author{Duncan Murdoch} \seealso{\code{\link{plot3d}}, \code{\link{par3d}}} \examples{ x <- rnorm(100) y <- rnorm(100)*2 z <- rnorm(100)*3 open3d() plot3d(x, y, z) aspect3d(1,1,0.5) open3d() plot3d(x, y, z) aspect3d("iso") } \keyword{dynamic} rgl/configure.win0000644000176000001440000000534512262005310013564 0ustar ripleyusers# # png pixmap support # test zlib and libpng libraries are available # echo " configure.win32..." # --- win32 base configuration ----------------------------------------------- CPPFLAGS= CXXFLAGS="-fno-exceptions -fno-rtti" LIBS="-lgdi32 -lopengl32 -lglu32" # --- for pre 2.9.0 compatibility if test -z "$R_PACKAGE_DIR" ; then R_PACKAGE_DIR=${DPKG} fi # --- libpng ----------------------------------------------------------------- echo -n " checking for zlib..." if [ -e "${R_HOME}/bin${R_ARCH_BIN}/Rzlib.dll" ]; then CPPFLAGS="${CPPFLAGS} -I${R_HOME}/include " LIBS="$LIBS -L${R_HOME}/bin${R_ARCH_BIN} -lRzlib " havezlib=yes elif [ -e "${R_HOME}/src/extra/zlib/libz.a" ]; then CPPFLAGS="${CPPFLAGS} -I${R_HOME}/src/extra/zlib " LIBS="$LIBS -L${R_HOME}/src/extra/zlib -lz" havezlib=yes else havezlib=no fi echo ${havezlib} if [ "${havezlib}" = "yes" ]; then echo -n " checking for libpng..." if [ -n "${HAVE_PNG}" ]; then echo "yes" CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H " LIBS="$LIBS -lpng " elif [ -e "${R_HOME}/src/gnuwin32/bitmap/libpng/libpng.a" ]; then echo "yes" CPPFLAGS="${CPPFLAGS} -DHAVE_PNG_H -I${R_HOME}/src/gnuwin32/bitmap/libpng " LIBS="$LIBS -L${R_HOME}/src/gnuwin32/bitmap/libpng -lpng " else echo "no" fi else echo " libpng requires zlib, so not installed." fi # --- freetype and ftgl ------------------------------------------------------ if [ "${havezlib}" = "yes" ]; then echo -n " checking for freetype..." if [ -n "$LIB_FREETYPE" ]; then echo "yes, LIB_FREETYPE=$LIB_FREETYPE" mkdir -p $R_PACKAGE_DIR/libs${R_ARCH} cp $LIB_FREETYPE/bin${R_ARCH_BIN}/freetype6.dll $R_PACKAGE_DIR/libs${R_ARCH} if [ -e "${R_HOME}/bin${R_ARCH_BIN}/Rzlib.dll" ]; then cp ${R_HOME}/bin${R_ARCH_BIN}/Rzlib.dll $R_PACKAGE_DIR/libs${R_ARCH}/zlib1.dll else echo " Note: freetype may require zlib1.dll" fi CPPFLAGS="${CPPFLAGS} -Iext/ftgl -I${LIB_FREETYPE}/include -I${LIB_FREETYPE}/include/freetype2 -DHAVE_FREETYPE" LIBS="$LIBS -L$R_PACKAGE_DIR/libs${R_ARCH} -lfreetype6 " else echo "no, LIB_FREETYPE undefined" fi else echo " freetype requires zlib, so not installed." fi # --- dump configuration ----------------------------------------------------- # Debugging code removed -- cat was hanging on WinBuilder #cat <src/Makevars rgl/cleanup0000755000176000001440000000017212262005306012437 0ustar ripleyusers#! /bin/sh rm -f config.* src/Makevars src/Makedeps src/*.o src/osx/*.o src/*.so src/*.dll rm -rf src/AGL autom4te.cache