This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

last egcs ss internal error



Hi,

i've got internal compiler error - 
all 0825, 0828 and 0901 have this problem.

the interesting thing is that if i 
change rExt on line 27828 from
2.0 to something like 2.0001
i have no egcs errors.

jor-el ~/work/Project/tmp$ c++ -c TestToroid.cc
TestToroid.C: In function `static void
TRandAngles3D<TRandUniform<TIMWC1616RandUnifo
rm> >::sample(class TVector3D<double> &)':
TestToroid.C:149: Internal compiler error.
TestToroid.C:149: Please submit a full bug report to
`egcs-bugs@cygnus.com'.

jor-el ~/work/Project/tmp$ c++ -v
Reading specs from
/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2
.90.04/specs
gcc version egcs-2.90.04 970901 (gcc2-970802 experimental)

jor-el ~/work/Project/tmp$ uname -a
SunOS jor-el 5.5.1 Generic_103640-08 sun4u sparc SUNW,Ultra-2


regards

OK

# 1 "TestToroid.C"
# 1 "/home/room1/kriol/work/Project/config/sparc-sun-solaris-gcc/configuration.h" 1















# 1 "TestToroid.C" 2
# 1 "/home/room1/kriol/local/include/g++/stdexcept" 1 3
 
 

 
 
 
 
 

 
 
 
 

 
 
 

 
 
 
 
 

 
 





#pragma interface "stdexcept"


# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/exception" 1 3 4
 
 




#pragma interface "exception"

extern "C++" {





class exception {
public:
  exception () { }
  virtual ~exception () { }
  virtual const char* what () const;
};

class bad_exception : public exception {
public:
  bad_exception () { }
  virtual ~bad_exception () { }
};

typedef void (*terminate_handler) ();
typedef void (*unexpected_handler) ();

terminate_handler set_terminate (terminate_handler);
void terminate (void);
unexpected_handler set_unexpected (unexpected_handler);
void unexpected (void);
bool uncaught_exception ();
}  






# 35 "/home/room1/kriol/local/include/g++/stdexcept" 2 3

# 1 "/home/room1/kriol/local/include/g++/string" 1 3
 




# 1 "/home/room1/kriol/local/include/g++/std/bastring.h" 1 3
 
 

 
 
 
 
 

 
 
 
 

 
 
 

 
 
 
 
 

 
 





#pragma interface


# 1 "/home/room1/kriol/local/include/g++/cstddef" 1 3
 
 



# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4






 







 

 




 


 





 


# 61 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4


 





 


















 





 

 





















typedef int ptrdiff_t;









 




 

 
































typedef unsigned int size_t;


















 




 



























 














































typedef unsigned int  wint_t;




 

# 302 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4




 













 







# 6 "/home/room1/kriol/local/include/g++/cstddef" 2 3


# 35 "/home/room1/kriol/local/include/g++/std/bastring.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/std/straits.h" 1 3
 
 

 
 
 
 
 

 
 
 
 

 
 
 

 
 
 
 
 

 
 





 
#pragma interface "std/straits.h"




extern "C++" {
template <class charT>
struct string_char_traits {
  typedef charT char_type;  

   

  static void assign (char_type& c1, const char_type& c2)
    { c1 = c2; }
  static bool eq (const char_type& c1, const char_type& c2)
    { return (c1 == c2); }
  static bool ne (const char_type& c1, const char_type& c2)
    { return !(c1 == c2); }
  static bool lt (const char_type& c1, const char_type& c2)
    { return (c1 < c2); }
  static char_type eos () { return char_type(); }  
  static bool is_del(char_type a) { return 0; }
   
  
   

  static int compare (const char_type* s1, const char_type* s2, size_t n)
    {
      size_t i;
      for (i = 0; i < n; ++i)
	if (ne (s1[i], s2[i]))
	  return lt (s1[i], s2[i]) ? -1 : 1;

      return 0;
    }
    
  static size_t length (const char_type* s)
    {
      size_t l = 0;
      while (ne (*s++, eos ()))
	++l;
      return l;
    }

  static char_type* copy (char_type* s1, const char_type* s2, size_t n)
    {
      for (; n--; )
	assign (s1[n], s2[n]);
      return s1;
    }

  static char_type* move (char_type* s1, const char_type* s2, size_t n)
    {
      char_type a[n];
      size_t i;
      for (i = 0; i < n; ++i)
	assign (a[i], s2[i]);
      for (i = 0; i < n; ++i)
	assign (s1[i], a[i]);
      return s1;
    }

  static char_type* set (char_type* s1, const char_type& c, size_t n)
    {
      for (; n--; )
	assign (s1[n], c);
      return s1;
    }
};

class istream;
class ostream;
# 1 "/home/room1/kriol/local/include/g++/cctype" 1 3
 
 



# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/ctype.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)ctype.h	1.19	95/01/28 SMI"	

# 1 "/usr/include/sys/feature_tests.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)feature_tests.h	1.7	94/12/06 SMI"


extern "C" {


 












}



# 13 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/ctype.h" 2 3 4



extern "C" {













extern int isalnum(int);
extern int isalpha(int);
extern int iscntrl(int);
extern int isdigit(int);
extern int isgraph(int);
extern int islower(int);
extern int isprint(int);
extern int ispunct(int);
extern int isspace(int);
extern int isupper(int);
extern int isxdigit(int);
extern int tolower(int);
extern int toupper(int);




extern int isascii(int);
extern int toascii(int);
extern int _tolower(int);
extern int _toupper(int);



extern unsigned char	__ctype[];

 

































# 114 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/ctype.h" 3 4



}



# 6 "/home/room1/kriol/local/include/g++/cctype" 2 3


# 105 "/home/room1/kriol/local/include/g++/std/straits.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/cstring" 1 3
 
 




# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/string.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)string.h	1.17	95/08/28 SMI"	




extern "C" {













extern void *memcpy(void *, const void *, size_t);
extern void *memmove(void *, const void *, size_t);
extern char *strcpy(char *, const char *);
extern char *strncpy(char *, const char *, size_t);

extern char *strcat(char *, const char *);
extern char *strncat(char *, const char *, size_t);

extern int memcmp(const void *, const void *, size_t);
extern int strcmp(const char *, const char *);
extern int strcoll(const char *, const char *);
extern int strncmp(const char *, const char *, size_t);
extern size_t strxfrm(char *, const char *, size_t);

extern void *memchr(const void *, int, size_t);
extern char *strchr(const char *, int);
extern size_t strcspn(const char *, const char *);
extern char *strpbrk(const char *, const char *);
extern char *strrchr(const char *, int);
extern size_t strspn(const char *, const char *);
extern char *strstr(const char *, const char *);
extern char *strtok(char *, const char *);


extern char *strtok_r(char *, const char *, char **);

extern void *memset(void *, int, size_t);
extern char *strerror(int);
extern size_t strlen(const char *);




extern void *memccpy(void *, const void *, int, size_t);






extern char *strdup(const char *);
extern char *strsignal(int);
extern int ffs(const int);
extern int strcasecmp(const char *, const char *);
extern int strncasecmp(const char *, const char *, size_t);



# 119 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/string.h" 3 4



}



# 7 "/home/room1/kriol/local/include/g++/cstring" 2 3


# 94 "/home/room1/kriol/local/include/g++/cstring" 3



# 106 "/home/room1/kriol/local/include/g++/std/straits.h" 2 3


struct string_char_traits <char> {
  typedef char char_type;

  static void assign (char_type& c1, const char_type& c2)
    { c1 = c2; }
  static bool eq (const char_type & c1, const char_type& c2)
    { return (c1 == c2); }
  static bool ne (const char_type& c1, const char_type& c2)
    { return (c1 != c2); }
  static bool lt (const char_type& c1, const char_type& c2)
    { return (c1 < c2); }
  static char_type eos () { return 0; }
  static bool is_del(char_type a) { return ((__ctype + 1)[ a ] & 010 ) ; }

  static int compare (const char_type* s1, const char_type* s2, size_t n)
    { return memcmp (s1, s2, n); }
  static size_t length (const char_type* s)
    { return strlen (s); }
  static char_type* copy (char_type* s1, const char_type* s2, size_t n)
    { return (char_type*) memcpy (s1, s2, n); }
  static char_type* move (char_type* s1, const char_type* s2, size_t n)
    { return (char_type*) memmove (s1, s2, n); }
  static char_type* set (char_type* s1, const char_type& c, size_t n)
    { return (char_type*) memset (s1, c, n); }
};

# 159 "/home/room1/kriol/local/include/g++/std/straits.h" 3

}  

# 36 "/home/room1/kriol/local/include/g++/std/bastring.h" 2 3


# 46 "/home/room1/kriol/local/include/g++/std/bastring.h" 3


# 1 "/home/room1/kriol/local/include/g++/cassert" 1 3
 
 



# 1 "/home/room1/kriol/local/sparc-sun-solaris2.5.1/include/assert.h" 1 3 4
 








# 19 "/home/room1/kriol/local/sparc-sun-solaris2.5.1/include/assert.h" 3 4




 

extern "C" {
extern void __eprintf (const char *, const char *, unsigned, const char *)
    __attribute__ ((noreturn));
}












# 52 "/home/room1/kriol/local/sparc-sun-solaris2.5.1/include/assert.h" 3 4



# 6 "/home/room1/kriol/local/include/g++/cassert" 2 3


# 48 "/home/room1/kriol/local/include/g++/std/bastring.h" 2 3






extern "C++" {
class istream; class ostream;

# 1 "/home/room1/kriol/local/include/g++/iterator" 1 3
 
 



# 1 "/home/room1/kriol/local/include/g++/iterator.h" 1 3
 




























# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4
# 327 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4

# 30 "/home/room1/kriol/local/include/g++/iterator.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/iostream.h" 1 3
 

























#pragma interface



# 1 "/home/room1/kriol/local/include/g++/streambuf.h" 1 3
 


























#pragma interface


   



extern "C" {
# 1 "/home/room1/kriol/local/include/g++/libio.h" 1 3
 























 




# 1 "/home/room1/kriol/local/sparc-sun-solaris2.5.1/include/_G_config.h" 1 3 4
  









typedef          int   _G_int8_t __attribute__((__mode__(__QI__)));
typedef unsigned int  _G_uint8_t __attribute__((__mode__(__QI__)));
typedef          int  _G_int16_t __attribute__((__mode__(__HI__)));
typedef unsigned int _G_uint16_t __attribute__((__mode__(__HI__)));
typedef          int  _G_int32_t __attribute__((__mode__(__SI__)));
typedef unsigned int _G_uint32_t __attribute__((__mode__(__SI__)));
typedef          int  _G_int64_t __attribute__((__mode__(__DI__)));
typedef unsigned int _G_uint64_t __attribute__((__mode__(__DI__)));
__extension__ typedef long long _G_llong;
__extension__ typedef unsigned long long _G_ullong;







typedef long _G_clock_t;
typedef unsigned long _G_dev_t;
typedef long _G_fpos_t;
typedef long _G_gid_t;
typedef unsigned long _G_ino_t;
typedef unsigned long _G_mode_t;
typedef unsigned long _G_nlink_t;
typedef long _G_off_t;
typedef long _G_pid_t;



typedef int _G_ptrdiff_t;
typedef int   _G_sigset_t;



typedef unsigned int _G_size_t;
typedef long _G_time_t;
typedef long _G_uid_t;
typedef long int _G_wchar_t;















typedef int _G_ssize_t;
typedef unsigned int _G_wint_t;
typedef void * _G_va_list;














# 30 "/home/room1/kriol/local/include/g++/libio.h" 2 3













# 51 "/home/room1/kriol/local/include/g++/libio.h" 3














 























# 99 "/home/room1/kriol/local/include/g++/libio.h" 3











 























 

















 

struct _IO_jump_t;  struct _IO_FILE;

struct _IO_marker {
  struct _IO_marker *_next;
  struct _IO_FILE *_sbuf;
   

   
  int _pos;
# 172 "/home/room1/kriol/local/include/g++/libio.h" 3

};

struct _IO_FILE {



  int	     _flags;



   
   
  char* _IO_read_ptr;	 
  char* _IO_read_end;	 
  char* _IO_read_base;	 
  char* _IO_write_base;	 
  char* _IO_write_ptr;	 
  char* _IO_write_end;	 
  char* _IO_buf_base;	 
  char* _IO_buf_end;	 
   
  char *_IO_save_base;  
  char *_IO_backup_base;   
  char *_IO_save_end;  

  struct _IO_marker *_markers;
  
  struct _IO_FILE *_chain;
  
  int _fileno;
  int _blksize;
  _G_off_t  _offset;
  

   
  unsigned short _cur_column;
  char _unused;
  char _shortbuf[1];
  
   
};





struct _IO_FILE_plus;
extern struct _IO_FILE_plus _IO_stdin_, _IO_stdout_, _IO_stderr_;





extern "C" {


extern int __underflow  (_IO_FILE*)  ;
extern int __uflow  (_IO_FILE*)  ;
extern int __overflow  (_IO_FILE*, int)  ;

















 



extern int _IO_vfscanf  (_IO_FILE*, const char*, _G_va_list , int*)  ;
extern int _IO_vfprintf  (_IO_FILE*, const char*, _G_va_list )  ;
extern _G_ssize_t  _IO_padn  (_IO_FILE *, int, _G_ssize_t )  ;
extern _G_size_t  _IO_sgetn  (_IO_FILE *, void*, _G_size_t )  ;

extern _G_fpos_t  _IO_seekoff  (_IO_FILE*, _G_off_t , int, int)  ;
extern _G_fpos_t  _IO_seekpos  (_IO_FILE*, _G_fpos_t , int)  ;

extern void _IO_free_backup_area  (_IO_FILE*)  ;


}



# 36 "/home/room1/kriol/local/include/g++/streambuf.h" 2 3

}
 






















extern "C++" {
class istream;  
class ostream; class streambuf;

 



typedef _G_off_t  streamoff;
typedef _G_fpos_t  streampos;
typedef _G_ssize_t  streamsize;

typedef unsigned long __fmtflags;
typedef unsigned char __iostate;

struct _ios_fields
{  
    streambuf *_strbuf;
    ostream* _tie;
    int _width;
    __fmtflags _flags;
    short  _fill;
    __iostate _state;
    __iostate _exceptions;
    int _precision;

    void *_arrays;  
};















# 115 "/home/room1/kriol/local/include/g++/streambuf.h" 3


class ios : public _ios_fields {
  ios& operator=(ios&);   
  ios (const ios&);  
  public:
    typedef __fmtflags fmtflags;
    typedef int iostate;
    typedef int openmode;
    typedef int streamsize;
    enum io_state {
	goodbit = 0 ,
	eofbit = 1 ,
	failbit = 2 ,
	badbit = 4  };
    enum open_mode {
	in = 1 ,
	out = 2 ,
	ate = 4 ,
	app = 8 ,
	trunc = 16 ,
	nocreate = 32 ,
	noreplace = 64 ,
	bin = 128 ,  
	binary = 128  };
    enum seek_dir { beg, cur, end};
     
     
    enum { skipws= 01 ,
	   left= 02 , right= 04 , internal= 010 ,
	   dec= 020 , oct= 040 , hex= 0100 ,
	   showbase= 0200 , showpoint= 0400 ,
	   uppercase= 01000 , showpos= 02000 ,
	   scientific= 04000 , fixed= 010000 ,
	   unitbuf= 020000 , stdio= 040000 



	   };
    enum {  
	basefield=dec+oct+hex,
	floatfield = scientific+fixed,
	adjustfield = left+right+internal
    };

# 168 "/home/room1/kriol/local/include/g++/streambuf.h" 3


    ostream* tie() const { return _tie; }
    ostream* tie(ostream* val) { ostream* save=_tie; _tie=val; return save; }

     
    short  fill() const { return (short )_fill; }
    short  fill(short  newf)
	{short  oldf = (short )_fill; _fill = (char)newf; return oldf;}
    fmtflags flags() const { return _flags; }
    fmtflags flags(fmtflags new_val) {
	fmtflags old_val = _flags; _flags = new_val; return old_val; }
    int precision() const { return _precision; }
    int precision(int newp) {
	unsigned short oldp = _precision; _precision = (unsigned short)newp;
	return oldp; }
    fmtflags setf(fmtflags val) {
	fmtflags oldbits = _flags;
	_flags |= val; return oldbits; }
    fmtflags setf(fmtflags val, fmtflags mask) {
	fmtflags oldbits = _flags;
	_flags = (_flags & ~mask) | (val & mask); return oldbits; }
    fmtflags unsetf(fmtflags mask) {
	fmtflags oldbits = _flags;
	_flags &= ~mask; return oldbits; }
    int width() const { return _width; }
    int width(int val) { int save = _width; _width = val; return save; }




    void _throw_failure() const { }

    void clear(iostate state = 0) {
	_state = _strbuf ? state : state|badbit;
	if (_state & _exceptions) _throw_failure(); }
    void set(iostate flag) { _state |= flag;
	if (_state & _exceptions) _throw_failure(); }
    void setstate(iostate flag) { _state |= flag;  
	if (_state & _exceptions) _throw_failure(); }
    int good() const { return _state == 0; }
    int eof() const { return _state & ios::eofbit; }
    int fail() const { return _state & (ios::badbit|ios::failbit); }
    int bad() const { return _state & ios::badbit; }
    iostate rdstate() const { return _state; }
    operator void*() const { return fail() ? (void*)0 : (void*)(-1); }
    int operator!() const { return fail(); }
    iostate exceptions() const { return _exceptions; }
    void exceptions(iostate enable) {
	_exceptions = enable;
	if (_state & _exceptions) _throw_failure(); }

    streambuf* rdbuf() const { return _strbuf; }
    streambuf* rdbuf(streambuf *_s) {
      streambuf *_old = _strbuf; _strbuf = _s; clear (); return _old; }

    static int sync_with_stdio(int on);
    static void sync_with_stdio() { sync_with_stdio(1); }
    static fmtflags bitalloc();
    static int xalloc();
    void*& pword(int);
    void* pword(int) const;
    long& iword(int);
    long iword(int) const;









     
    class Init {
    public:
      Init () { }
    };

  protected:
    inline ios(streambuf* sb = 0, ostream* tie_to = 0);
    inline virtual ~ios();
    inline void init(streambuf* sb, ostream* tie = 0);
};




typedef ios::seek_dir _seek_dir;


 
 
 
 
 

 
 
class streammarker : private _IO_marker {
    friend class streambuf;
    void set_offset(int offset) { _pos = offset; }
  public:
    streammarker(streambuf *sb);
    ~streammarker();
    int saving() { return  1; }
    int delta(streammarker&);
    int delta();
};

struct streambuf : public _IO_FILE {  
    friend class ios;
    friend class istream;
    friend class ostream;
    friend class streammarker;
    const void *&_vtable() { return *(const void**)((_IO_FILE*)this + 1); }
  protected:
    static streambuf* _list_all;  
    _IO_FILE*& xchain() { return _chain; }
    void _un_link();
    void _link_in();
    char* gptr() const
      { return _flags  & 0x100  ? _IO_save_base : _IO_read_ptr; }
    char* pptr() const { return _IO_write_ptr; }
    char* egptr() const
      { return _flags  & 0x100  ? _IO_save_end : _IO_read_end; }
    char* epptr() const { return _IO_write_end; }
    char* pbase() const { return _IO_write_base; }
    char* eback() const
      { return _flags  & 0x100  ? _IO_save_base : _IO_read_base;}
    char* base() const { return _IO_buf_base; }
    char* ebuf() const { return _IO_buf_end; }
    int blen() const { return _IO_buf_end - _IO_buf_base; }
    void xput_char(char c) { *_IO_write_ptr++ = c; }
    int xflags() { return _flags ; }
    int xflags(int f) {int fl = _flags ; _flags  = f; return fl;}
    void xsetflags(int f) { _flags  |= f; }
    void xsetflags(int f, int mask)
      { _flags  = (_flags  & ~mask) | (f & mask); }
    void gbump(int n)
      { _flags  & 0x100  ? (_IO_save_base+=n):(_IO_read_ptr+=n);}
    void pbump(int n) { _IO_write_ptr += n; }
    void setb(char* b, char* eb, int a=0);
    void setp(char* p, char* ep)
      { _IO_write_base=_IO_write_ptr=p; _IO_write_end=ep; }
    void setg(char* eb, char* g, char *eg) {
      if (_flags  & 0x100 ) _IO_free_backup_area(this); 
      _IO_read_base = eb; _IO_read_ptr = g; _IO_read_end = eg; }
    char *shortbuf() { return _shortbuf; }

    int in_backup() { return _flags & 0x100 ; }
     
    char *Gbase() { return in_backup() ? _IO_save_base : _IO_read_base; }
     
    char *eGptr() { return in_backup() ? _IO_save_end : _IO_read_end; }
     
    char *Bbase() { return in_backup() ? _IO_read_base : _IO_save_base; }
    char *Bptr() { return _IO_backup_base; }
     
    char *eBptr() { return in_backup() ? _IO_read_end : _IO_save_end; }
    char *Nbase() { return _IO_save_base; }
    char *eNptr() { return _IO_save_end; }
    int have_backup() { return _IO_save_base != __null ; }
    int have_markers() { return _markers != __null ; }
    void free_backup_area();
    void unsave_markers();  
    int put_mode() { return _flags & 0x800 ; }
    int switch_to_get_mode();
    
    streambuf(int flags=0);
  public:
    static int flush_all();
    static void flush_all_linebuffered();  
    virtual ~streambuf();
    virtual int overflow(int c = (-1) );  
    virtual int underflow();  
    virtual int uflow();  
    virtual int pbackfail(int c);
 
    virtual streamsize xsputn(const char* s, streamsize n);
    virtual streamsize xsgetn(char* s, streamsize n);
    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);
    virtual streampos seekpos(streampos pos, int mode = ios::in|ios::out);

    streampos pubseekoff(streamoff o, _seek_dir d, int mode=ios::in|ios::out)
      { return _IO_seekoff (this, o, d, mode); }
    streampos pubseekpos(streampos pos, int mode = ios::in|ios::out)
      { return _IO_seekpos (this, pos, mode); }
    streampos sseekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);
    streampos sseekpos(streampos pos, int mode = ios::in|ios::out);
    virtual streambuf* setbuf(char* p, int len);
    virtual int sync();
    virtual int doallocate();

    int seekmark(streammarker& mark, int delta = 0);
    int sputbackc(char c);
    int sungetc();
    int unbuffered() { return _flags & 2  ? 1 : 0; }
    int linebuffered() { return _flags & 0x200  ? 1 : 0; }
    void unbuffered(int i)
	{ if (i) _flags |= 2 ; else _flags &= ~2 ; }
    void linebuffered(int i)
	{ if (i) _flags |= 0x200 ; else _flags &= ~0x200 ; }
    int allocate() {  
	if (base() || unbuffered()) return 0;
	else return doallocate(); }
     
    void allocbuf() { if (base() == __null ) doallocbuf(); }
    void doallocbuf();
    int in_avail() { return _IO_read_end - _IO_read_ptr; }
    int out_waiting() { return _IO_write_ptr - _IO_write_base; }
    streamsize sputn(const char* s, streamsize n) { return xsputn(s, n); }
    streamsize padn(char pad, streamsize n) { return _IO_padn(this, pad, n); }
    streamsize sgetn(char* s, streamsize n) { return _IO_sgetn(this, s, n); }
    int ignore(int);
    int get_column();
    int set_column(int);
    long sgetline(char* buf, _G_size_t  n, char delim, int putback_delim);
    int sputc(int c) { return (((  this )->_IO_write_ptr >= (  this )->_IO_write_end) ? __overflow(  this , (unsigned char)( c )) : (unsigned char)(*(  this )->_IO_write_ptr++ = ( c ))) ; }
    int sbumpc() { return (( this )->_IO_read_ptr >= ( this )->_IO_read_end ? __uflow( this ) : *(unsigned char*)( this )->_IO_read_ptr++) ; }
    int sgetc() { return (( this )->_IO_read_ptr >= ( this )->_IO_read_end && __underflow( this ) == (-1)  ? (-1)  : *(unsigned char*)( this )->_IO_read_ptr) ; }
    int snextc() {
	if (_IO_read_ptr >= _IO_read_end && __underflow(this) == (-1) )
	  return (-1) ;
	else return _IO_read_ptr++, sgetc(); }
    void stossc() { if (_IO_read_ptr < _IO_read_end) _IO_read_ptr++; }
    int vscan(char const *fmt0, _G_va_list  ap, ios* stream = __null );
    int scan(char const *fmt0 ...);
    int vform(char const *fmt0, _G_va_list  ap);
    int form(char const *fmt0 ...);




    virtual streamsize sys_read(char* buf, streamsize size);
    virtual streamsize sys_write(const char*, streamsize);
    virtual streampos sys_seek(streamoff, _seek_dir);
    virtual int sys_close();
    virtual int sys_stat(void*);  
};

 
 

class filebuf : public streambuf {
  protected:
    void init();
  public:
    static const int openprot;  
    filebuf();
    filebuf(int fd);
    filebuf(int fd, char* p, int len);



    ~filebuf();
    filebuf* attach(int fd);
    filebuf* open(const char *filename, const char *mode);
    filebuf* open(const char *filename, ios::openmode mode, int prot = 0664);
    virtual int underflow();
    virtual int overflow(int c = (-1) );
    int is_open() const { return _fileno >= 0; }
    int fd() const { return is_open() ? _fileno : (-1) ; }
    filebuf* close();
    virtual int doallocate();
    virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out);
    virtual streambuf* setbuf(char* p, int len);
    streamsize xsputn(const char* s, streamsize n);
    streamsize xsgetn(char* s, streamsize n);
    virtual int sync();
  protected:  
 
    int is_reading() { return eback() != egptr(); }
    char* cur_ptr() { return is_reading() ?  gptr() : pptr(); }
     
    char* file_ptr() { return eGptr(); }
     
    virtual streamsize sys_read(char* buf, streamsize size);
    virtual streampos sys_seek(streamoff, _seek_dir);
    virtual streamsize sys_write(const char*, streamsize);
    virtual int sys_stat(void*);  
    virtual int sys_close();




};

inline void ios::init(streambuf* sb, ostream* tie_to) {
		_state = sb ? ios::goodbit : ios::badbit; _exceptions=0;
		_strbuf=sb; _tie = tie_to; _width=0; _fill=' ';

		_flags=ios::skipws|ios::dec;



		_precision=6; _arrays = 0; }

inline ios::ios(streambuf* sb, ostream* tie_to) { init(sb, tie_to); }

inline ios::~ios() {



    if (_arrays) delete [] _arrays;
}
}  

# 31 "/home/room1/kriol/local/include/g++/iostream.h" 2 3


extern "C++" {
class istream; class ostream;
typedef ios& (*__manip)(ios&);
typedef istream& (*__imanip)(istream&);
typedef ostream& (*__omanip)(ostream&);

extern istream& ws(istream& ins);
extern ostream& flush(ostream& outs);
extern ostream& endl(ostream& outs);
extern ostream& ends(ostream& outs);

class ostream : virtual public ios
{
     
    void do_osfx();
  public:
    ostream() { }
    ostream(streambuf* sb, ostream* tied= __null );
    int opfx() {
	if (!good()) return 0; else { if (_tie) _tie->flush(); return 1;} }
    void osfx() { if (flags() & (ios::unitbuf|ios::stdio))
		      do_osfx(); }
    ostream& flush();
    ostream& put(char c) { _strbuf->sputc(c); return *this; }





    ostream& write(const char *s, streamsize n);
    ostream& write(const unsigned char *s, streamsize n)
      { return write((const char*)s, n);}
    ostream& write(const signed char *s, streamsize n)
      { return write((const char*)s, n);}
    ostream& write(const void *s, streamsize n)
      { return write((const char*)s, n);}
    ostream& seekp(streampos);
    ostream& seekp(streamoff, _seek_dir);
    streampos tellp();
    ostream& form(const char *format ...);
    ostream& vform(const char *format, _G_va_list  args);

    ostream& operator<<(char c);
    ostream& operator<<(unsigned char c) { return (*this) << (char)c; }
    ostream& operator<<(signed char c) { return (*this) << (char)c; }
    ostream& operator<<(const char *s);
    ostream& operator<<(const unsigned char *s)
	{ return (*this) << (const char*)s; }
    ostream& operator<<(const signed char *s)
	{ return (*this) << (const char*)s; }
    ostream& operator<<(const void *p);
    ostream& operator<<(int n);
    ostream& operator<<(unsigned int n);
    ostream& operator<<(long n);
    ostream& operator<<(unsigned long n);

    __extension__ ostream& operator<<(long long n);
    __extension__ ostream& operator<<(unsigned long long n);

    ostream& operator<<(short n) {return operator<<((int)n);}
    ostream& operator<<(unsigned short n) {return operator<<((unsigned int)n);}

    ostream& operator<<(bool b) { return operator<<((int)b); }

    ostream& operator<<(double n);
    ostream& operator<<(float n) { return operator<<((double)n); }
    ostream& operator<<(long double n) { return operator<<((double)n); }
    ostream& operator<<(__omanip func) { return (*func)(*this); }
    ostream& operator<<(__manip func) {(*func)(*this); return *this;}
    ostream& operator<<(streambuf*);



};

class istream : virtual public ios
{
     
protected:
    _G_size_t  _gcount;

    int _skip_ws();
  public:
    istream(): _gcount (0) { }
    istream(streambuf* sb, ostream*tied= __null );
    istream& get(char* ptr, int len, char delim = '\n');
    istream& get(unsigned char* ptr, int len, char delim = '\n')
	{ return get((char*)ptr, len, delim); }
    istream& get(char& c);
    istream& get(unsigned char& c) { return get((char&)c); }
    istream& getline(char* ptr, int len, char delim = '\n');
    istream& getline(unsigned char* ptr, int len, char delim = '\n')
	{ return getline((char*)ptr, len, delim); }
    istream& get(signed char& c)  { return get((char&)c); }
    istream& get(signed char* ptr, int len, char delim = '\n')
	{ return get((char*)ptr, len, delim); }
    istream& getline(signed char* ptr, int len, char delim = '\n')
	{ return getline((char*)ptr, len, delim); }
    istream& read(char *ptr, streamsize n);
    istream& read(unsigned char *ptr, streamsize n)
      { return read((char*)ptr, n); }
    istream& read(signed char *ptr, streamsize n)
      { return read((char*)ptr, n); }
    istream& read(void *ptr, streamsize n)
      { return read((char*)ptr, n); }
    istream& get(streambuf& sb, char delim = '\n');
    istream& gets(char **s, char delim = '\n');
    int ipfx(int need = 0) {
	if (!good()) { set(ios::failbit); return 0; }
	else {
	  if (_tie && (need == 0 || rdbuf()->in_avail() < need)) _tie->flush();
	  if (!need && (flags() & ios::skipws)) return _skip_ws();
	  else return 1;
	}
    }
    int ipfx0() {  
	if (!good()) { set(ios::failbit); return 0; }
	else {
	  if (_tie) _tie->flush();
	  if (flags() & ios::skipws) return _skip_ws();
	  else return 1;
	}
    }
    int ipfx1() {  
	if (!good()) { set(ios::failbit); return 0; }
	else {
	  if (_tie && rdbuf()->in_avail() == 0) _tie->flush();
	  return 1;
	}
    }
    void isfx() { }
    int get() { if (!ipfx1()) return (-1) ;
		else { int ch = _strbuf->sbumpc();
		       if (ch == (-1) ) set(ios::eofbit);
		       return ch;
		     } }
    int peek();
    _G_size_t  gcount() { return _gcount; }
    istream& ignore(int n=1, int delim = (-1) );
    int sync ();
    istream& seekg(streampos);
    istream& seekg(streamoff, _seek_dir);
    streampos tellg();
    istream& putback(char ch) {
	if (good() && _strbuf->sputbackc(ch) == (-1) ) clear(ios::badbit);
	return *this;}
    istream& unget() {
	if (good() && _strbuf->sungetc() == (-1) ) clear(ios::badbit);
	return *this;}
    istream& scan(const char *format ...);
    istream& vscan(const char *format, _G_va_list  args);






    istream& operator>>(char*);
    istream& operator>>(unsigned char* p) { return operator>>((char*)p); }
    istream& operator>>(signed char*p) { return operator>>((char*)p); }
    istream& operator>>(char& c);
    istream& operator>>(unsigned char& c) {return operator>>((char&)c);}
    istream& operator>>(signed char& c) {return operator>>((char&)c);}
    istream& operator>>(int&);
    istream& operator>>(long&);

    __extension__ istream& operator>>(long long&);
    __extension__ istream& operator>>(unsigned long long&);

    istream& operator>>(short&);
    istream& operator>>(unsigned int&);
    istream& operator>>(unsigned long&);
    istream& operator>>(unsigned short&);

    istream& operator>>(bool&);

    istream& operator>>(float&);
    istream& operator>>(double&);
    istream& operator>>(long double&);
    istream& operator>>( __manip func) {(*func)(*this); return *this;}
    istream& operator>>(__imanip func) { return (*func)(*this); }
    istream& operator>>(streambuf*);
};

class iostream : public istream, public ostream
{
  public:
    iostream() { }
    iostream(streambuf* sb, ostream*tied= __null );
};

class _IO_istream_withassign : public istream {
public:
  _IO_istream_withassign& operator=(istream&);
  _IO_istream_withassign& operator=(_IO_istream_withassign& rhs)
    { return operator= (static_cast<istream&> (rhs)); }
};

class _IO_ostream_withassign : public ostream {
public:
  _IO_ostream_withassign& operator=(ostream&);
  _IO_ostream_withassign& operator=(_IO_ostream_withassign& rhs)
    { return operator= (static_cast<ostream&> (rhs)); }
};

extern _IO_istream_withassign cin;
 
extern _IO_ostream_withassign cout, cerr;

extern _IO_ostream_withassign clog



;

struct Iostream_init { } ;   

inline ios& dec(ios& i)
{ i.setf(ios::dec, ios::dec|ios::hex|ios::oct); return i; }
inline ios& hex(ios& i)
{ i.setf(ios::hex, ios::dec|ios::hex|ios::oct); return i; }
inline ios& oct(ios& i)
{ i.setf(ios::oct, ios::dec|ios::hex|ios::oct); return i; }
}  


# 31 "/home/room1/kriol/local/include/g++/iterator.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/function.h" 1 3
 




























# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4
# 327 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4

# 30 "/home/room1/kriol/local/include/g++/function.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/stl_config.h" 1 3
 




























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

# 82 "/home/room1/kriol/local/include/g++/stl_config.h" 3





























# 129 "/home/room1/kriol/local/include/g++/stl_config.h" 3


# 142 "/home/room1/kriol/local/include/g++/stl_config.h" 3






























# 31 "/home/room1/kriol/local/include/g++/function.h" 2 3


template <class T>
inline bool operator!=(const T& x, const T& y) {
    return !(x == y);
}

template <class T>
inline bool operator>(const T& x, const T& y) {
    return y < x;
}

template <class T>
inline bool operator<=(const T& x, const T& y) {
    return !(y < x);
}

template <class T>
inline bool operator>=(const T& x, const T& y) {
    return !(x < y);
}

template <class Arg, class Result>
struct unary_function {
    typedef Arg argument_type;
    typedef Result result_type;
};

template <class Arg1, class Arg2, class Result>
struct binary_function {
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};      

template <class T>
struct plus : public binary_function<T, T, T> {
    T operator()(const T& x, const T& y) const { return x + y; }
};

template <class T>
struct minus : public binary_function<T, T, T> {
    T operator()(const T& x, const T& y) const { return x - y; }
};

template <class T>
struct multiplies : public binary_function<T, T, T> {
    T operator()(const T& x, const T& y) const { return x * y; }
};

template <class T>
struct divides : public binary_function<T, T, T> {
    T operator()(const T& x, const T& y) const { return x / y; }
};

template <class T> inline T identity_element(plus<T>) { return T(0); }

template <class T> inline T identity_element(multiplies<T>) { return T(1); }

template <class T>
struct modulus : public binary_function<T, T, T> {
    T operator()(const T& x, const T& y) const { return x % y; }
};

template <class T>
struct negate : public unary_function<T, T> {
    T operator()(const T& x) const { return -x; }
};

template <class T>
struct equal_to : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x == y; }
};

template <class T>
struct not_equal_to : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x != y; }
};

template <class T>
struct greater : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x > y; }
};

template <class T>
struct less : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x < y; }
};

template <class T>
struct greater_equal : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x >= y; }
};

template <class T>
struct less_equal : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x <= y; }
};

template <class T>
struct logical_and : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x && y; }
};

template <class T>
struct logical_or : public binary_function<T, T, bool> {
    bool operator()(const T& x, const T& y) const { return x || y; }
};

template <class T>
struct logical_not : public unary_function<T, bool> {
    bool operator()(const T& x) const { return !x; }
};

template <class Predicate>
class unary_negate
  : public unary_function<typename Predicate::argument_type, bool> {
protected:
    Predicate pred;
public:
    explicit unary_negate(const Predicate& x) : pred(x) {}
    bool operator()(const argument_type& x) const { return !pred(x); }
};

template <class Predicate>
inline unary_negate<Predicate> not1(const Predicate& pred) {
  return unary_negate<Predicate>(pred);
}

template <class Predicate> 
class binary_negate 
    : public binary_function<typename Predicate::first_argument_type,
			     typename Predicate::second_argument_type,
                             bool> {
protected:
    Predicate pred;
public:
    explicit binary_negate(const Predicate& x) : pred(x) {}
    bool operator()(const first_argument_type& x, 
		    const second_argument_type& y) const {
	return !pred(x, y); 
    }
};

template <class Predicate>
inline binary_negate<Predicate> not2(const Predicate& pred) {
  return binary_negate<Predicate>(pred);
}

template <class Operation> 
class binder1st
  : public unary_function<typename Operation::second_argument_type,
                          typename Operation::result_type> {
protected:
    Operation op;
    typename Operation::first_argument_type value;
public:
    binder1st(const Operation& x,
              const typename Operation::first_argument_type& y)
      : op(x), value(y) {}
    result_type operator()(const argument_type& x) const {
	return op(value, x); 
    }
};

template <class Operation, class T>
inline binder1st<Operation> bind1st(const Operation& op, const T& x) {
  typedef typename Operation::first_argument_type arg1_type;
  return binder1st<Operation>(op, arg1_type(x));
}

template <class Operation> 
class binder2nd
  : public unary_function<typename Operation::first_argument_type,
			  typename Operation::result_type> {
protected:
    Operation op;
    typename Operation::second_argument_type value;
public:
    binder2nd(const Operation& x,
              const typename Operation::second_argument_type& y) 
	: op(x), value(y) {}
    result_type operator()(const argument_type& x) const {
	return op(x, value); 
    }
};

template <class Operation, class T>
inline binder2nd<Operation> bind2nd(const Operation& op, const T& x) {
  typedef typename Operation::second_argument_type arg2_type;
  return binder2nd<Operation>(op, arg2_type(x));
}

template <class Operation1, class Operation2>
class unary_compose : public unary_function<typename Operation2::argument_type,
                                            typename Operation1::result_type> {
protected:
    Operation1 op1;
    Operation2 op2;
public:
    unary_compose(const Operation1& x, const Operation2& y) : op1(x), op2(y) {}
    result_type operator()(const argument_type& x) const {
	return op1(op2(x));
    }
};

template <class Operation1, class Operation2>
inline unary_compose<Operation1, Operation2> compose1(const Operation1& op1, 
                                                      const Operation2& op2) {
  return unary_compose<Operation1, Operation2>(op1, op2);
}

template <class Operation1, class Operation2, class Operation3>
class binary_compose
  : public unary_function<typename Operation2::argument_type,
                          typename Operation1::result_type> {
protected:
    Operation1 op1;
    Operation2 op2;
    Operation3 op3;
public:
    binary_compose(const Operation1& x, const Operation2& y, 
		   const Operation3& z) : op1(x), op2(y), op3(z) { }
    result_type operator()(const argument_type& x) const {
	return op1(op2(x), op3(x));
    }
};

template <class Operation1, class Operation2, class Operation3>
inline binary_compose<Operation1, Operation2, Operation3> 
compose2(const Operation1& op1, const Operation2& op2, const Operation3& op3) {
  return binary_compose<Operation1, Operation2, Operation3>(op1, op2, op3);
}

template <class Arg, class Result>
class pointer_to_unary_function : public unary_function<Arg, Result> {
protected:
    Result (*ptr)(Arg);
public:
    pointer_to_unary_function() {}
    explicit pointer_to_unary_function(Result (*x)(Arg)) : ptr(x) {}
    Result operator()(Arg x) const { return ptr(x); }
};

template <class Arg, class Result>
inline pointer_to_unary_function<Arg, Result> ptr_fun(Result (*x)(Arg)) {
  return pointer_to_unary_function<Arg, Result>(x);
}

template <class Arg1, class Arg2, class Result>
class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> {
protected:
    Result (*ptr)(Arg1, Arg2);
public:
    pointer_to_binary_function() {}
    explicit pointer_to_binary_function(Result (*x)(Arg1, Arg2)) : ptr(x) {}
    Result operator()(Arg1 x, Arg2 y) const { return ptr(x, y); }
};

template <class Arg1, class Arg2, class Result>
inline pointer_to_binary_function<Arg1, Arg2, Result> 
ptr_fun(Result (*x)(Arg1, Arg2)) {
  return pointer_to_binary_function<Arg1, Arg2, Result>(x);
}

template <class T>
struct identity : public unary_function<T, T> {
    const T& operator()(const T& x) const { return x; }
};

template <class Pair>
struct select1st : public unary_function<Pair, typename Pair::first_type> {
  const typename Pair::first_type& operator()(const Pair& x) const
  {
    return x.first;
  }
};

template <class Pair>
struct select2nd : public unary_function<Pair, typename Pair::second_type> {
  const typename Pair::second_type& operator()(const Pair& x) const
  {
    return x.second;
  }
};

template <class Arg1, class Arg2>
struct project1st : public binary_function<Arg1, Arg2, Arg1> {
  Arg1 operator()(const Arg1& x, const Arg2&) const { return x; }
};

template <class Arg1, class Arg2>
struct project2nd : public binary_function<Arg1, Arg2, Arg2> {
  Arg2 operator()(const Arg1&, const Arg2& y) const { return y; }
};

template <class Result>
struct constant_void_fun
{
  typedef Result result_type;
  result_type val;
  constant_void_fun(const result_type& v) : val(v) {}
  const result_type& operator()() const { return val; }
};  


template <class Result, class Argument = Result>



struct constant_unary_fun : public unary_function<Argument, Result> {
  result_type val;
  constant_unary_fun(const result_type& v) : val(v) {}
  const result_type& operator()(const argument_type&) const { return val; }
};


template <class Result, class Arg1 = Result, class Arg2 = Arg1>



struct constant_binary_fun : public binary_function<Arg1, Arg2, Result> {
  result_type val;
  constant_binary_fun(const result_type& v) : val(v) {}
  const result_type& operator()(const first_argument_type&, 
                                const second_argument_type&) const {
    return val;
  }
};

template <class Result>
inline constant_void_fun<Result> constant0(const Result& val)
{
  return constant_void_fun<Result>(val);
}

template <class Result>
inline constant_unary_fun<Result,Result> constant1(const Result& val)
{
  return constant_unary_fun<Result,Result>(val);
}

template <class Result>
inline constant_binary_fun<Result,Result,Result> constant2(const Result& val)
{
  return constant_binary_fun<Result,Result,Result>(val);
}

 
class subtractive_rng : public unary_function<unsigned int, unsigned int> {
private:
  unsigned int table[55];
  size_t index1;
  size_t index2;
public:
  unsigned int operator()(unsigned int limit) {
    index1 = (index1 + 1) % 55;
    index2 = (index2 + 1) % 55;
    table[index1] = table[index1] - table[index2];
    return table[index1] % limit;
  }

  void initialize(unsigned int seed)
  {
    unsigned int k = 1;
    table[54] = seed;
    size_t i;
    for (i = 0; i < 54; i++) {
        size_t ii = (21 * (i + 1) % 55) - 1;
        table[ii] = k;
        k = seed - k;
        seed = table[ii];
    }
    for (int loop = 0; loop < 4; loop++) {
        for (i = 0; i < 55; i++)
            table[i] = table[i] - table[(1 + i + 30) % 55];
    }
    index1 = 0;
    index2 = 31;
  }

  subtractive_rng(unsigned int seed) { initialize(seed); }
  subtractive_rng() { initialize(161803398u); }
};


 

 
 
 
 
 
 
 

 
 
 
 
 
 
 
 

 
 
 
 


template <class S, class T>
class mem_fun_t : public unary_function<T*, S> {
public:
  explicit mem_fun_t(S (T::*pf)()) : f(pf) {}
  S operator()(T* p) const { return (p->*f)(); }
private:
  S (T::*f)();
};

template <class S, class T>
class const_mem_fun_t : public unary_function<const T*, S> {
public:
  explicit const_mem_fun_t(S (T::*pf)() const) : f(pf) {}
  S operator()(const T* p) const { return (p->*f)(); }
private:
  S (T::*f)() const;
};


template <class S, class T>
class mem_fun_ref_t : public unary_function<T, S> {
public:
  explicit mem_fun_ref_t(S (T::*pf)()) : f(pf) {}
  S operator()(T& r) const { return (r.*f)(); }
private:
  S (T::*f)();
};

template <class S, class T>
class const_mem_fun_ref_t : public unary_function<T, S> {
public:
  explicit const_mem_fun_ref_t(S (T::*pf)() const) : f(pf) {}
  S operator()(const T& r) const { return (r.*f)(); }
private:
  S (T::*f)() const;
};

template <class S, class T, class A>
class mem_fun1_t : public binary_function<T*, A, S> {
public:
  explicit mem_fun1_t(S (T::*pf)(A)) : f(pf) {}
  S operator()(T* p, A x) const { return (p->*f)(x); }
private:
  S (T::*f)(A);
};

template <class S, class T, class A>
class const_mem_fun1_t : public binary_function<const T*, A, S> {
public:
  explicit const_mem_fun1_t(S (T::*pf)(A) const) : f(pf) {}
  S operator()(const T* p, A x) const { return (p->*f)(x); }
private:
  S (T::*f)(A) const;
};

template <class S, class T, class A>
class mem_fun1_ref_t : public binary_function<T, A, S> {
public:
  explicit mem_fun1_ref_t(S (T::*pf)(A)) : f(pf) {}
  S operator()(T& r, A x) const { return (r.*f)(x); }
private:
  S (T::*f)(A);
};

template <class S, class T, class A>
class const_mem_fun1_ref_t : public binary_function<T, A, S> {
public:
  explicit const_mem_fun1_ref_t(S (T::*pf)(A) const) : f(pf) {}
  S operator()(const T& r, A x) const { return (r.*f)(x); }
private:
  S (T::*f)(A) const;
};



template <class T>
class mem_fun_t<void, T> : public unary_function<T*, void> {
public:
  explicit mem_fun_t(void (T::*pf)()) : f(pf) {}
  void operator()(T* p) const { (p->*f)(); }
private:
  void (T::*f)();
};

template <class T>
class const_mem_fun_t<void, T> : public unary_function<const T*, void> {
public:
  explicit const_mem_fun_t(void (T::*pf)() const) : f(pf) {}
  void operator()(const T* p) const { (p->*f)(); }
private:
  void (T::*f)() const;
};

template <class T>
class mem_fun_ref_t<void, T> : public unary_function<T, void> {
public:
  explicit mem_fun_ref_t(void (T::*pf)()) : f(pf) {}
  void operator()(T& r) const { (r.*f)(); }
private:
  void (T::*f)();
};

template <class T>
class const_mem_fun_ref_t<void, T> : public unary_function<T, void> {
public:
  explicit const_mem_fun_ref_t(void (T::*pf)() const) : f(pf) {}
  void operator()(const T& r) const { (r.*f)(); }
private:
  void (T::*f)() const;
};

template <class T, class A>
class mem_fun1_t<void, T, A> : public binary_function<T*, A, void> {
public:
  explicit mem_fun1_t(void (T::*pf)(A)) : f(pf) {}
  void operator()(T* p, A x) const { (p->*f)(x); }
private:
  void (T::*f)(A);
};

template <class T, class A>
class const_mem_fun1_t<void, T, A> : public binary_function<const T*, A, void> {
public:
  explicit const_mem_fun1_t(void (T::*pf)(A) const) : f(pf) {}
  void operator()(const T* p, A x) const { (p->*f)(x); }
private:
  void (T::*f)(A) const;
};

template <class T, class A>
class mem_fun1_ref_t<void, T, A> : public binary_function<T, A, void> {
public:
  explicit mem_fun1_ref_t(void (T::*pf)(A)) : f(pf) {}
  void operator()(T& r, A x) const { (r.*f)(x); }
private:
  void (T::*f)(A);
};

template <class T, class A>
class const_mem_fun1_ref_t<void, T, A> : public binary_function<T, A, void> {
public:
  explicit const_mem_fun1_ref_t(void (T::*pf)(A) const) : f(pf) {}
  void operator()(const T& r, A x) const { (r.*f)(x); }
private:
  void (T::*f)(A) const;
};



 
 

template <class S, class T>
inline mem_fun_t<S,T> mem_fun(S (T::*f)()) { 
  return mem_fun_t<S,T>(f);
}

template <class S, class T>
inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const) {
  return const_mem_fun_t<S,T>(f);
}

template <class S, class T>
inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()) { 
  return mem_fun_ref_t<S,T>(f);
}

template <class S, class T>
inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const) {
  return const_mem_fun_ref_t<S,T>(f);
}

template <class S, class T, class A>
inline mem_fun1_t<S,T,A> mem_fun1(S (T::*f)(A)) { 
  return mem_fun1_t<S,T,A>(f);
}

template <class S, class T, class A>
inline const_mem_fun1_t<S,T,A> mem_fun1(S (T::*f)(A) const) {
  return const_mem_fun1_t<S,T,A>(f);
}

template <class S, class T, class A>
inline mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A)) { 
  return mem_fun1_ref_t<S,T,A>(f);
}

template <class S, class T, class A>
inline const_mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A) const) {
  return const_mem_fun1_ref_t<S,T,A>(f);
}


# 32 "/home/room1/kriol/local/include/g++/iterator.h" 2 3


struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag {};
struct bidirectional_iterator_tag {};
struct random_access_iterator_tag {};

template <class T, class Distance> struct input_iterator {
  typedef input_iterator_tag iterator_category;
  typedef T                  value_type;
  typedef Distance           difference_type;
  typedef T*                 pointer;
  typedef T&                 reference;
};

struct output_iterator {
  typedef output_iterator_tag iterator_category;
};

template <class T, class Distance> struct forward_iterator {
  typedef forward_iterator_tag iterator_category;
  typedef T                    value_type;
  typedef Distance             difference_type;
  typedef T*                   pointer;
  typedef T&                   reference;
};


template <class T, class Distance> struct bidirectional_iterator {
  typedef bidirectional_iterator_tag iterator_category;
  typedef T                          value_type;
  typedef Distance                   difference_type;
  typedef T*                         pointer;
  typedef T&                         reference;
};

template <class T, class Distance> struct random_access_iterator {
  typedef random_access_iterator_tag iterator_category;
  typedef T                          value_type;
  typedef Distance                   difference_type;
  typedef T*                         pointer;
  typedef T&                         reference;
};

# 87 "/home/room1/kriol/local/include/g++/iterator.h" 3




template <class Iterator>
struct iterator_traits {
  typedef typename Iterator::iterator_category iterator_category;
  typedef typename Iterator::value_type        value_type;
  typedef typename Iterator::difference_type   difference_type;
  typedef typename Iterator::pointer           pointer;
  typedef typename Iterator::reference         reference;
};

template <class T>
struct iterator_traits<T*> {
  typedef random_access_iterator_tag iterator_category;
  typedef T                          value_type;
  typedef ptrdiff_t                  difference_type;
  typedef T*                         pointer;
  typedef T&                         reference;
};



template <class T, class Distance> 
inline input_iterator_tag 
iterator_category(const input_iterator<T, Distance>&) {
    return input_iterator_tag();
}

inline output_iterator_tag iterator_category(const output_iterator&) {
    return output_iterator_tag();
}

template <class T, class Distance> 
inline forward_iterator_tag
iterator_category(const forward_iterator<T, Distance>&) {
    return forward_iterator_tag();
}

template <class T, class Distance> 
inline bidirectional_iterator_tag
iterator_category(const bidirectional_iterator<T, Distance>&) {
    return bidirectional_iterator_tag();
}

template <class T, class Distance> 
inline random_access_iterator_tag
iterator_category(const random_access_iterator<T, Distance>&) {
    return random_access_iterator_tag();
}

template <class T>
inline random_access_iterator_tag iterator_category(const T*) {
    return random_access_iterator_tag();
}

template <class T, class Distance> 
inline T* value_type(const input_iterator<T, Distance>&) {
    return (T*)(0); 
}

template <class T, class Distance> 
inline T* value_type(const forward_iterator<T, Distance>&) {
    return (T*)(0);
}

template <class T, class Distance> 
inline T* value_type(const bidirectional_iterator<T, Distance>&) {
    return (T*)(0);
}

template <class T, class Distance> 
inline T* value_type(const random_access_iterator<T, Distance>&) {
    return (T*)(0);
}

template <class T>
inline T* value_type(const T*) { return (T*)(0); }

template <class T, class Distance> 
inline Distance* distance_type(const input_iterator<T, Distance>&) {
    return (Distance*)(0);
}

template <class T, class Distance> 
inline Distance* distance_type(const forward_iterator<T, Distance>&) {
    return (Distance*)(0);
}

template <class T, class Distance> 
inline Distance* 
distance_type(const bidirectional_iterator<T, Distance>&) {
    return (Distance*)(0);
}

template <class T, class Distance> 
inline Distance* 
distance_type(const random_access_iterator<T, Distance>&) {
    return (Distance*)(0);
}

template <class T>
inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(0); }

template <class Container>
class back_insert_iterator {
protected:
    Container* container;
public:
    typedef output_iterator_tag iterator_category;

    explicit back_insert_iterator(Container& x) : container(&x) {}
    back_insert_iterator<Container>&
    operator=(const typename Container::value_type& value) { 
        container->push_back(value);
        return *this;
    }
    back_insert_iterator<Container>& operator*() { return *this; }
    back_insert_iterator<Container>& operator++() { return *this; }
    back_insert_iterator<Container>& operator++(int) { return *this; }
};

template <class Container>
inline output_iterator_tag
iterator_category(const back_insert_iterator<Container>&)
{
  return output_iterator_tag();
}

template <class Container>
inline back_insert_iterator<Container> back_inserter(Container& x) {
  return back_insert_iterator<Container>(x);
}

template <class Container>
class front_insert_iterator {
protected:
    Container* container;
public:
    typedef output_iterator_tag iterator_category;

    explicit front_insert_iterator(Container& x) : container(&x) {}
    front_insert_iterator<Container>&
    operator=(const typename Container::value_type& value) { 
        container->push_front(value);
        return *this;
    }
    front_insert_iterator<Container>& operator*() { return *this; }
    front_insert_iterator<Container>& operator++() { return *this; }
    front_insert_iterator<Container>& operator++(int) { return *this; }
};

template <class Container>
inline output_iterator_tag
iterator_category(const front_insert_iterator<Container>&)
{
  return output_iterator_tag();
}

template <class Container>
inline front_insert_iterator<Container> front_inserter(Container& x) {
  return front_insert_iterator<Container>(x);
}

template <class Container>
class insert_iterator {
protected:
    Container* container;
    typename Container::iterator iter;
public:
    typedef output_iterator_tag iterator_category;

    insert_iterator(Container& x, typename Container::iterator i) 
        : container(&x), iter(i) {}
    insert_iterator<Container>&
    operator=(const typename Container::value_type& value) { 
        iter = container->insert(iter, value);
        ++iter;
        return *this;
    }
    insert_iterator<Container>& operator*() { return *this; }
    insert_iterator<Container>& operator++() { return *this; }
    insert_iterator<Container>& operator++(int) { return *this; }
};

template <class Container>
inline output_iterator_tag
iterator_category(const insert_iterator<Container>&)
{
  return output_iterator_tag();
}

template <class Container, class Iterator>
inline insert_iterator<Container> inserter(Container& x, Iterator i) {
  typedef typename Container::iterator iter;
  return insert_iterator<Container>(x, iter(i));
}


template <class BidirectionalIterator, class T, class Reference = T&, 
          class Distance = ptrdiff_t> 




class reverse_bidirectional_iterator {
    typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
                                           Distance> self;
    friend bool operator==(const self& x, const self& y);
protected:
    BidirectionalIterator current;
public:
    typedef bidirectional_iterator_tag iterator_category;
    typedef T                          value_type;
    typedef Distance                   difference_type;
    typedef T*                         pointer;
    typedef Reference                  reference;

    reverse_bidirectional_iterator() {}
    explicit reverse_bidirectional_iterator(BidirectionalIterator x)
      : current(x) {}
    BidirectionalIterator base() { return current; }
    Reference operator*() const {
        BidirectionalIterator tmp = current;
        return *--tmp;
    }
    self& operator++() {
        --current;
        return *this;
    }
    self operator++(int) {
        self tmp = *this;
        --current;
        return tmp;
    }
    self& operator--() {
        ++current;
        return *this;
    }
    self operator--(int) {
        self tmp = *this;
        ++current;
        return tmp;
    }
};


template <class BidirectionalIterator, class T, class Reference, 
          class Distance>
inline bidirectional_iterator_tag
iterator_category(const reverse_bidirectional_iterator<BidirectionalIterator,
                                                       T,
                                                       Reference, Distance>&) {
  return bidirectional_iterator_tag();
}

template <class BidirectionalIterator, class T, class Reference, 
          class Distance>
inline T*
value_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
                                               Reference, Distance>&) {
  return (T*) 0;
}

template <class BidirectionalIterator, class T, class Reference, 
          class Distance>
inline Distance*
distance_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
                                                  Reference, Distance>&) {
  return (Distance*) 0;
}

template <class BidirectionalIterator, class T, class Reference,
          class Distance>
inline bool operator==(
    const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
                                         Distance>& x, 
    const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
                                         Distance>& y) {
    return x.current == y.current;
}


template <class RandomAccessIterator, class T, class Reference = T&,
          class Distance = ptrdiff_t> 




class reverse_iterator {
    typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance>
        self;
    friend bool operator==(const self& x, const self& y);
    friend bool operator<(const self& x, const self& y);
    friend Distance operator-(const self& x, const self& y);
    friend self operator+(Distance n, const self& x);
protected:
    RandomAccessIterator current;
public:
    typedef random_access_iterator_tag iterator_category;
    typedef T                          value_type;
    typedef Distance                   difference_type;
    typedef T*                         pointer;
    typedef Reference                  reference;

    reverse_iterator() {}
    explicit reverse_iterator(RandomAccessIterator x) : current(x) {}
    RandomAccessIterator base() { return current; }
    Reference operator*() const { return *(current - 1); }
    self& operator++() {
        --current;
        return *this;
    }
    self operator++(int) {
        self tmp = *this;
        --current;
        return tmp;
    }
    self& operator--() {
        ++current;
        return *this;
    }
    self operator--(int) {
        self tmp = *this;
        ++current;
        return tmp;
    }
    self operator+(Distance n) const {
        return self(current - n);
    }
    self& operator+=(Distance n) {
        current -= n;
        return *this;
    }
    self operator-(Distance n) const {
        return self(current + n);
    }
    self& operator-=(Distance n) {
        current += n;
        return *this;
    }
    Reference operator[](Distance n) { return *(*this + n); }
};

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline random_access_iterator_tag
iterator_category(const reverse_iterator<RandomAccessIterator, T,
                                         Reference, Distance>&) {
  return random_access_iterator_tag();
}

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline T* value_type(const reverse_iterator<RandomAccessIterator, T,
                                            Reference, Distance>&) {
  return (T*) 0;
}

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline Distance* distance_type(const reverse_iterator<RandomAccessIterator, T,
                                                      Reference, Distance>&) {
  return (Distance*) 0;
}


template <class RandomAccessIterator, class T, class Reference, class Distance>
inline bool operator==(const reverse_iterator<RandomAccessIterator, T,
                                              Reference, Distance>& x, 
                       const reverse_iterator<RandomAccessIterator, T,
                                              Reference, Distance>& y) {
    return x.current == y.current;
}

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline bool operator<(const reverse_iterator<RandomAccessIterator, T,
                                             Reference, Distance>& x, 
                      const reverse_iterator<RandomAccessIterator, T,
                                             Reference, Distance>& y) {
    return y.current < x.current;
}

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline Distance operator-(const reverse_iterator<RandomAccessIterator, T,
                                                 Reference, Distance>& x, 
                          const reverse_iterator<RandomAccessIterator, T,
                                                 Reference, Distance>& y) {
    return y.current - x.current;
}

template <class RandomAccessIterator, class T, class Reference, class Distance>
inline reverse_iterator<RandomAccessIterator, T, Reference, Distance> 
operator+(Distance n,
          const reverse_iterator<RandomAccessIterator, T, Reference,
                                 Distance>& x) {
    return reverse_iterator<RandomAccessIterator, T, Reference, Distance>
        (x.current - n);
}


template <class ForwardIterator, class T>
class raw_storage_iterator {
protected:
    ForwardIterator iter;
public:
    typedef output_iterator_tag iterator_category;

    explicit raw_storage_iterator(ForwardIterator x) : iter(x) {}
    raw_storage_iterator<ForwardIterator, T>& operator*() { return *this; }
    raw_storage_iterator<ForwardIterator, T>& operator=(const T& element) {
        construct(&*iter, element);
        return *this;
    }        
    raw_storage_iterator<ForwardIterator, T>& operator++() {
        ++iter;
        return *this;
    }
    raw_storage_iterator<ForwardIterator, T> operator++(int) {
        raw_storage_iterator<ForwardIterator, T> tmp = *this;
        ++iter;
        return tmp;
    }
};

template <class ForwardIterator, class T>
inline output_iterator_tag
iterator_category(const raw_storage_iterator<ForwardIterator, T>&)
{
  return output_iterator_tag();
}

template <class T, class Distance = ptrdiff_t> 
class istream_iterator {
friend bool operator==(const istream_iterator<T, Distance>& x,
                       const istream_iterator<T, Distance>& y);
protected:
    istream* stream;
    T value;
    bool end_marker;
    void read() {
        end_marker = (*stream) ? true : false;
        if (end_marker) *stream >> value;
        end_marker = (*stream) ? true : false;
    }
public:
    typedef input_iterator_tag iterator_category;
    typedef T                  value_type;
    typedef Distance           difference_type;
    typedef T*                 pointer;
    typedef T&                 reference;

    istream_iterator() : stream(&cin), end_marker(false) {}
    istream_iterator(istream& s) : stream(&s) { read(); }
    const T& operator*() const { return value; }
    istream_iterator<T, Distance>& operator++() { 
        read(); 
        return *this;
    }
    istream_iterator<T, Distance> operator++(int)  {
        istream_iterator<T, Distance> tmp = *this;
        read();
        return tmp;
    }
};

template <class T, class Distance>
inline input_iterator_tag 
iterator_category(const istream_iterator<T, Distance>&) {
  return input_iterator_tag();
}

template <class T, class Distance>
inline T* value_type(const istream_iterator<T, Distance>&) { return (T*) 0; }

template <class T, class Distance>
inline Distance* distance_type(const istream_iterator<T, Distance>&) {
  return (Distance*) 0;
}

template <class T, class Distance>
bool operator==(const istream_iterator<T, Distance>& x,
                const istream_iterator<T, Distance>& y) {
    return x.stream == y.stream && x.end_marker == y.end_marker ||
        x.end_marker == false && y.end_marker == false;
}

template <class T>
class ostream_iterator {
protected:
    ostream* stream;
    const char* string;
public:
    typedef output_iterator_tag iterator_category;

    ostream_iterator(ostream& s) : stream(&s), string(0) {}
    ostream_iterator(ostream& s, const char* c) : stream(&s), string(c)  {}
    ostream_iterator<T>& operator=(const T& value) { 
        *stream << value;
        if (string) *stream << string;
        return *this;
    }
    ostream_iterator<T>& operator*() { return *this; }
    ostream_iterator<T>& operator++() { return *this; } 
    ostream_iterator<T>& operator++(int) { return *this; } 
};

template <class T>
inline output_iterator_tag 
iterator_category(const ostream_iterator<T>&) {
  return output_iterator_tag();
}


# 6 "/home/room1/kriol/local/include/g++/iterator" 2 3


# 57 "/home/room1/kriol/local/include/g++/std/bastring.h" 2 3


template <class charT, class traits = string_char_traits<charT> >
class basic_string
{
private:
  struct Rep {
    size_t len, res, ref;
    bool selfish;

    charT* data () { return reinterpret_cast<charT *>(this + 1); }
    charT& operator[] (size_t s) { return data () [s]; }
    charT* grab () { if (selfish) return clone (); ++ref; return data (); }
    void release () { if (--ref == 0) delete this; }

    inline static void * operator new (size_t, size_t);
    inline static Rep* create (size_t);
    charT* clone ();

    inline void copy (size_t, const charT *, size_t);
    inline void move (size_t, const charT *, size_t);
    inline void set  (size_t, const charT,   size_t);

# 92 "/home/room1/kriol/local/include/g++/std/bastring.h" 3

    inline static bool excess_slop (size_t, size_t);
    inline static size_t frob_size (size_t);


  private:
    Rep &operator= (const Rep &);
  };

public:
 
  typedef traits traits_type;
  typedef charT value_type;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;
  typedef charT& reference;
  typedef const charT& const_reference;
  typedef charT* pointer;
  typedef const charT* const_pointer;
  typedef pointer iterator;
  typedef const_pointer const_iterator;
  typedef reverse_iterator<iterator, value_type,
                           reference, difference_type> reverse_iterator;
  typedef reverse_iterator<const_iterator, value_type, const_reference,
                           difference_type> const_reverse_iterator;
  static const size_type npos = static_cast<size_type>(-1);

private:
  Rep *rep () const { return reinterpret_cast<Rep *>(dat) - 1; }
  void repup (Rep *p) { rep ()->release (); dat = p->data (); }

public:
  const charT* data () const
    { return rep ()->data(); }
  size_type length () const
    { return rep ()->len; }
  size_type size () const
    { return rep ()->len; }
  size_type capacity () const
    { return rep ()->res; }
  size_type max_size () const
    { return (npos - 1)/sizeof (charT); }		 
  bool empty () const
    { return size () == 0; }

 
  basic_string& operator= (const basic_string& str)
    {
      if (&str != this) { rep ()->release (); dat = str.rep ()->grab (); }
      return *this;
    }

  explicit basic_string (): dat (nilRep.grab ()) { }
  basic_string (const basic_string& str): dat (str.rep ()->grab ()) { }
  basic_string (const basic_string& str, size_type pos, size_type n = npos)
    : dat (nilRep.grab ()) { assign (str, pos, n); }
  basic_string (const charT* s, size_type n)
    : dat (nilRep.grab ()) { assign (s, n); }
  basic_string (const charT* s)
    : dat (nilRep.grab ()) { assign (s); }
  basic_string (size_type n, charT c)
    : dat (nilRep.grab ()) { assign (n, c); }





  basic_string(const_iterator begin, const_iterator end)
    : dat (nilRep.grab ()) { assign (begin, end); }


  ~basic_string ()
    { rep ()->release (); }

  void swap (basic_string &s) { charT *d = dat; dat = s.dat; s.dat = d; }

  basic_string& append (const basic_string& str, size_type pos = 0,
			size_type n = npos)
    { return replace (length (), 0, str, pos, n); }
  basic_string& append (const charT* s, size_type n)
    { return replace (length (), 0, s, n); }
  basic_string& append (const charT* s)
    { return append (s, traits::length (s)); }
  basic_string& append (size_type n, charT c)
    { return replace (length (), 0, n, c); }




  basic_string& append(const_iterator first, const_iterator last)
    { return replace (length (), 0, first, last - first); }


  basic_string& assign (const basic_string& str, size_type pos = 0,
			size_type n = npos)
    { return replace (0, npos, str, pos, n); }
  basic_string& assign (const charT* s, size_type n)
    { return replace (0, npos, s, n); }
  basic_string& assign (const charT* s)
    { return assign (s, traits::length (s)); }
  basic_string& assign (size_type n, charT c)
    { return replace (0, npos, n, c); }




  basic_string& assign(const_iterator first, const_iterator last)
    { return replace (0, npos, first, last - first); }


  basic_string& operator= (const charT* s)
    { return assign (s); }
  basic_string& operator= (charT c)
    { return assign (1, c); }

  basic_string& operator+= (const basic_string& rhs)
    { return append (rhs); }
  basic_string& operator+= (const charT* s)
    { return append (s); }
  basic_string& operator+= (charT c)
    { return append (1, c); }

  basic_string& insert (size_type pos1, const basic_string& str,
			size_type pos2 = 0, size_type n = npos)
    { return replace (pos1, 0, str, pos2, n); }
  basic_string& insert (size_type pos, const charT* s, size_type n)
    { return replace (pos, 0, s, n); }
  basic_string& insert (size_type pos, const charT* s)
    { return insert (pos, s, traits::length (s)); }
  basic_string& insert (size_type pos, size_type n, charT c)
    { return replace (pos, 0, n, c); }
  iterator insert(iterator p, charT c)
    { size_type pos = p - begin (); insert (pos, 1, c); return pos +begin (); }
  iterator insert(iterator p, size_type n, charT c)
    { size_type pos = p - begin (); insert (pos, n, c); return pos +begin (); }




  void insert(iterator p, const_iterator first, const_iterator last)
    { size_type pos = p - begin(); insert (pos, first, last - first); }


  basic_string& remove (size_type pos = 0, size_type n = npos)
    { return replace (pos, n, (size_type)0, (charT)0); }
  basic_string& remove (iterator pos)
    { return replace (pos - begin (), 1, (size_type)0, (charT)0); }
  basic_string& remove (iterator first, iterator last)
    { return replace (first - begin (), last - first, (size_type)0, (charT)0);}

  basic_string& replace (size_type pos1, size_type n1, const basic_string& str,
			 size_type pos2 = 0, size_type n2 = npos);
  basic_string& replace (size_type pos, size_type n1, const charT* s,
			 size_type n2);
  basic_string& replace (size_type pos, size_type n1, const charT* s)
    { return replace (pos, n1, s, traits::length (s)); }
  basic_string& replace (size_type pos, size_type n1, size_type n2, charT c);
  basic_string& replace (size_type pos, size_type n, charT c)
    { return replace (pos, n, 1, c); }
  basic_string& replace (iterator i1, iterator i2, const basic_string& str)
    { return replace (i1 - begin (), i2 - i1, str); }
  basic_string& replace (iterator i1, iterator i2, const charT* s, size_type n)
    { return replace (i1 - begin (), i2 - i1, s, n); }
  basic_string& replace (iterator i1, iterator i2, const charT* s)
    { return replace (i1 - begin (), i2 - i1, s); }
  basic_string& replace (iterator i1, iterator i2, size_type n, charT c)
    { return replace (i1 - begin (), i2 - i1, n, c); }





  basic_string& replace(iterator i1, iterator i2,
			const_iterator j1, const_iterator j2)
    { return replace (i1, i2, j1, j2 - j1); }


private:
  static charT eos () { return traits::eos (); }
  void unique () { if (rep ()->ref > 1) alloc (capacity (), true); }
  void selfish () { unique (); rep ()->selfish = true; }

public:
  charT operator[] (size_type pos) const
    {
      if (pos == length ())
	return eos ();
      return data ()[pos];
    }

  reference operator[] (size_type pos)
    { unique (); return (*rep ())[pos]; }

  reference at (size_type pos)
    {
      ((void) (( !( pos >= length () ) ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "/home/room1/kriol/local/include/g++/std/bastring.h" ,   287 ,  "!(pos >= length ())" ), 0) ))  ;
      return (*this)[pos];
    }
  const_reference at (size_type pos) const
    {
      ((void) (( !( pos >= length () ) ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "/home/room1/kriol/local/include/g++/std/bastring.h" ,   292 ,  "!(pos >= length ())" ), 0) ))  ;
      return data ()[pos];
    }

private:
  void terminate () const
    { traits::assign ((*rep ())[length ()], eos ()); }

public:
  const charT* c_str () const
    { terminate (); return data (); }
  void resize (size_type n, charT c);
  void resize (size_type n)
    { resize (n, eos ()); }
  void reserve (size_type) { }

  size_type copy (charT* s, size_type n, size_type pos = 0);

  size_type find (const basic_string& str, size_type pos = 0) const
    { return find (str.data(), pos, str.length()); }
  size_type find (const charT* s, size_type pos, size_type n) const;
  size_type find (const charT* s, size_type pos = 0) const
    { return find (s, pos, traits::length (s)); }
  size_type find (charT c, size_type pos = 0) const;

  size_type rfind (const basic_string& str, size_type pos = npos) const
    { return rfind (str.data(), pos, str.length()); }
  size_type rfind (const charT* s, size_type pos, size_type n) const;
  size_type rfind (const charT* s, size_type pos = npos) const
    { return rfind (s, pos, traits::length (s)); }
  size_type rfind (charT c, size_type pos = npos) const;

  size_type find_first_of (const basic_string& str, size_type pos = 0) const
    { return find_first_of (str.data(), pos, str.length()); }
  size_type find_first_of (const charT* s, size_type pos, size_type n) const;
  size_type find_first_of (const charT* s, size_type pos = 0) const
    { return find_first_of (s, pos, traits::length (s)); }
  size_type find_first_of (charT c, size_type pos = 0) const
    { return find (c, pos); }

  size_type find_last_of (const basic_string& str, size_type pos = npos) const
    { return find_last_of (str.data(), pos, str.length()); }
  size_type find_last_of (const charT* s, size_type pos, size_type n) const;
  size_type find_last_of (const charT* s, size_type pos = npos) const
    { return find_last_of (s, pos, traits::length (s)); }
  size_type find_last_of (charT c, size_type pos = npos) const
    { return rfind (c, pos); }

  size_type find_first_not_of (const basic_string& str, size_type pos = 0) const
    { return find_first_not_of (str.data(), pos, str.length()); }
  size_type find_first_not_of (const charT* s, size_type pos, size_type n) const;
  size_type find_first_not_of (const charT* s, size_type pos = 0) const
    { return find_first_not_of (s, pos, traits::length (s)); }
  size_type find_first_not_of (charT c, size_type pos = 0) const;

  size_type find_last_not_of (const basic_string& str, size_type pos = npos) const
    { return find_last_not_of (str.data(), pos, str.length()); }
  size_type find_last_not_of (const charT* s, size_type pos, size_type n) const;
  size_type find_last_not_of (const charT* s, size_type pos = npos) const
    { return find_last_not_of (s, pos, traits::length (s)); }
  size_type find_last_not_of (charT c, size_type pos = npos) const;

  basic_string substr (size_type pos = 0, size_type n = npos) const
    { return basic_string (*this, pos, n); }

  int compare (const basic_string& str, size_type pos = 0, size_type n = npos) const;
   
  int compare (const charT* s, size_type pos, size_type n) const;
  int compare (const charT* s, size_type pos = 0) const
    { return compare (s, pos, traits::length (s)); }

  iterator begin () { selfish (); return &(*this)[0]; }
  iterator end () { selfish (); return &(*this)[length ()]; }
  const_iterator begin () const { return &(*rep ())[0]; }
  const_iterator end () const { return &(*rep ())[length ()]; }

  reverse_iterator       rbegin() { return reverse_iterator (end ()); }
  const_reverse_iterator rbegin() const
    { return const_reverse_iterator (end ()); }
  reverse_iterator       rend() { return reverse_iterator (begin ()); }
  const_reverse_iterator rend() const
    { return const_reverse_iterator (begin ()); }

private:
  void alloc (size_type size, bool save);
  static size_type _find (const charT* ptr, charT c, size_type xpos, size_type len);
  inline bool check_realloc (size_type s) const;

  static Rep nilRep;
  charT *dat;
};

template <class charT, class traits>
inline basic_string <charT, traits>
operator+ (const basic_string <charT, traits>& lhs,
	   const basic_string <charT, traits>& rhs)
{
  basic_string <charT, traits> str (lhs);
  str.append (rhs);
  return str;
}

template <class charT, class traits>
inline basic_string <charT, traits>
operator+ (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  basic_string <charT, traits> str (lhs);
  str.append (rhs);
  return str;
}

template <class charT, class traits>
inline basic_string <charT, traits>
operator+ (charT lhs, const basic_string <charT, traits>& rhs)
{
  basic_string <charT, traits> str (1, lhs);
  str.append (rhs);
  return str;
}

template <class charT, class traits>
inline basic_string <charT, traits>
operator+ (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  basic_string <charT, traits> str (lhs);
  str.append (rhs);
  return str;
}

template <class charT, class traits>
inline basic_string <charT, traits>
operator+ (const basic_string <charT, traits>& lhs, charT rhs)
{
  basic_string <charT, traits> str (lhs);
  str.append (1, rhs);
  return str;
}

template <class charT, class traits>
inline bool
operator== (const basic_string <charT, traits>& lhs,
	    const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) == 0);
}

template <class charT, class traits>
inline bool
operator== (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) == 0);
}

template <class charT, class traits>
inline bool
operator== (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) == 0);
}

template <class charT, class traits>
inline bool
operator!= (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) != 0);
}

template <class charT, class traits>
inline bool
operator!= (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) != 0);
}

template <class charT, class traits>
inline bool
operator< (const basic_string <charT, traits>& lhs,
	    const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) < 0);
}

template <class charT, class traits>
inline bool
operator< (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) > 0);
}

template <class charT, class traits>
inline bool
operator< (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) < 0);
}

template <class charT, class traits>
inline bool
operator> (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) < 0);
}

template <class charT, class traits>
inline bool
operator> (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) > 0);
}

template <class charT, class traits>
inline bool
operator<= (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) >= 0);
}

template <class charT, class traits>
inline bool
operator<= (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) <= 0);
}

template <class charT, class traits>
inline bool
operator>= (const charT* lhs, const basic_string <charT, traits>& rhs)
{
  return (rhs.compare (lhs) <= 0);
}

template <class charT, class traits>
inline bool
operator>= (const basic_string <charT, traits>& lhs, const charT* rhs)
{
  return (lhs.compare (rhs) >= 0);
}

template <class charT, class traits>
inline bool
operator!= (const basic_string <charT, traits>& lhs,
	    const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) != 0);
}

template <class charT, class traits>
inline bool
operator> (const basic_string <charT, traits>& lhs,
	   const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) > 0);
}

template <class charT, class traits>
inline bool
operator<= (const basic_string <charT, traits>& lhs,
	    const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) <= 0);
}

template <class charT, class traits>
inline bool
operator>= (const basic_string <charT, traits>& lhs,
	    const basic_string <charT, traits>& rhs)
{
  return (lhs.compare (rhs) >= 0);
}

class istream; class ostream;
template <class charT, class traits> istream&
operator>> (istream&, basic_string <charT, traits>&);
template <class charT, class traits> ostream&
operator<< (ostream&, const basic_string <charT, traits>&);
template <class charT, class traits> istream&
getline (istream&, basic_string <charT, traits>&, charT delim = '\n');

}  


# 6 "/home/room1/kriol/local/include/g++/string" 2 3


extern "C++" {
typedef basic_string <char> string;
 
}  


# 36 "/home/room1/kriol/local/include/g++/stdexcept" 2 3


extern "C++" {

class logic_error : public exception {
  string _what;
public:
  logic_error(const string& what_arg): _what (what_arg) { }
  virtual const char* what () const { return _what.c_str (); }
};

class domain_error : public logic_error {
public:
  domain_error (const string& what_arg): logic_error (what_arg) { }
};

class invalid_argument : public logic_error {
public:
  invalid_argument (const string& what_arg): logic_error (what_arg) { }
};

class length_error : public logic_error {
public:
  length_error (const string& what_arg): logic_error (what_arg) { }
};

class out_of_range : public logic_error {
public:
  out_of_range (const string& what_arg): logic_error (what_arg) { }
};

class runtime_error : public exception {
  string _what;
public:
  runtime_error(const string& what_arg): _what (what_arg) { }
  virtual const char* what () const { return _what.c_str (); }
protected:
  runtime_error(): exception () { }
};

class range_error : public runtime_error {
public:
  range_error (const string& what_arg): runtime_error (what_arg) { }
};

class overflow_error : public runtime_error {
public:
  overflow_error (const string& what_arg): runtime_error (what_arg) { }
};

class underflow_error : public runtime_error {
public:
  underflow_error (const string& what_arg): runtime_error (what_arg) { }
};

}  


# 1 "TestToroid.C" 2

# 1 "/home/room1/kriol/local/include/iostream" 1 3
 







# 2 "TestToroid.C" 2


# 1 "/home/room1/kriol/local/include/GL/gl.h" 1 3
 

 




















 






















































extern "C" {





 











 





typedef enum {
	 
	GL_FALSE			= 0,
	GL_TRUE				= 1,

	 
	GL_BYTE				= 0x1400,
	GL_UNSIGNED_BYTE		= 0x1401,
	GL_SHORT			= 0x1402,
	GL_UNSIGNED_SHORT		= 0x1403,
	GL_INT				= 0x1404,
	GL_UNSIGNED_INT			= 0x1405,
	GL_FLOAT			= 0x1406,
	GL_DOUBLE			= 0x140A,
	GL_2_BYTES			= 0x1407,
	GL_3_BYTES			= 0x1408,
	GL_4_BYTES			= 0x1409,

	 
	GL_LINES			= 0x0001,
	GL_POINTS			= 0x0000,
	GL_LINE_STRIP			= 0x0003,
	GL_LINE_LOOP			= 0x0002,
	GL_TRIANGLES			= 0x0004,
	GL_TRIANGLE_STRIP		= 0x0005,
	GL_TRIANGLE_FAN			= 0x0006,
	GL_QUADS			= 0x0007,
	GL_QUAD_STRIP			= 0x0008,
	GL_POLYGON			= 0x0009,
	GL_EDGE_FLAG			= 0x0B43,

	 
	GL_VERTEX_ARRAY			= 0x8074,
	GL_NORMAL_ARRAY			= 0x8075,
	GL_COLOR_ARRAY			= 0x8076,
	GL_INDEX_ARRAY			= 0x8077,
	GL_TEXTURE_COORD_ARRAY		= 0x8078,
	GL_EDGE_FLAG_ARRAY		= 0x8079,
	GL_VERTEX_ARRAY_SIZE		= 0x807A,
	GL_VERTEX_ARRAY_TYPE		= 0x807B,
	GL_VERTEX_ARRAY_STRIDE		= 0x807C,
	GL_NORMAL_ARRAY_TYPE		= 0x807E,
	GL_NORMAL_ARRAY_STRIDE		= 0x807F,
	GL_COLOR_ARRAY_SIZE		= 0x8081,
	GL_COLOR_ARRAY_TYPE		= 0x8082,
	GL_COLOR_ARRAY_STRIDE		= 0x8083,
	GL_INDEX_ARRAY_TYPE		= 0x8085,
	GL_INDEX_ARRAY_STRIDE		= 0x8086,
	GL_TEXTURE_COORD_ARRAY_SIZE	= 0x8088,
	GL_TEXTURE_COORD_ARRAY_TYPE	= 0x8089,
	GL_TEXTURE_COORD_ARRAY_STRIDE	= 0x808A,
	GL_EDGE_FLAG_ARRAY_STRIDE	= 0x808C,
	GL_VERTEX_ARRAY_POINTER		= 0x808E,
	GL_NORMAL_ARRAY_POINTER		= 0x808F,
	GL_COLOR_ARRAY_POINTER		= 0x8090,
	GL_INDEX_ARRAY_POINTER		= 0x8091,
	GL_TEXTURE_COORD_ARRAY_POINTER	= 0x8092,
	GL_EDGE_FLAG_ARRAY_POINTER	= 0x8093,
        GL_V2F				= 0x2A20,
	GL_V3F				= 0x2A21,
	GL_C4UB_V2F			= 0x2A22,
	GL_C4UB_V3F			= 0x2A23,
	GL_C3F_V3F			= 0x2A24,
	GL_N3F_V3F			= 0x2A25,
	GL_C4F_N3F_V3F			= 0x2A26,
	GL_T2F_V3F			= 0x2A27,
	GL_T4F_V4F			= 0x2A28,
	GL_T2F_C4UB_V3F			= 0x2A29,
	GL_T2F_C3F_V3F			= 0x2A2A,
	GL_T2F_N3F_V3F			= 0x2A2B,
	GL_T2F_C4F_N3F_V3F		= 0x2A2C,
	GL_T4F_C4F_N3F_V4F		= 0x2A2D,

	 
	GL_MATRIX_MODE			= 0x0BA0,
	GL_MODELVIEW			= 0x1700,
	GL_PROJECTION			= 0x1701,
	GL_TEXTURE			= 0x1702,

	 
	GL_POINT_SMOOTH			= 0x0B10,
	GL_POINT_SIZE			= 0x0B11,
	GL_POINT_SIZE_GRANULARITY 	= 0x0B13,
	GL_POINT_SIZE_RANGE		= 0x0B12,

	 
	GL_LINE_SMOOTH			= 0x0B20,
	GL_LINE_STIPPLE			= 0x0B24,
	GL_LINE_STIPPLE_PATTERN		= 0x0B25,
	GL_LINE_STIPPLE_REPEAT		= 0x0B26,
	GL_LINE_WIDTH			= 0x0B21,
	GL_LINE_WIDTH_GRANULARITY	= 0x0B23,
	GL_LINE_WIDTH_RANGE		= 0x0B22,

	 
	GL_POINT			= 0x1B00,
	GL_LINE				= 0x1B01,
	GL_FILL				= 0x1B02,
	GL_CCW				= 0x0901,
	GL_CW				= 0x0900,
	GL_FRONT			= 0x0404,
	GL_BACK				= 0x0405,
	GL_CULL_FACE			= 0x0B44,
	GL_CULL_FACE_MODE		= 0x0B45,
	GL_POLYGON_SMOOTH		= 0x0B41,
	GL_POLYGON_STIPPLE		= 0x0B42,
	GL_FRONT_FACE			= 0x0B46,
	GL_POLYGON_MODE			= 0x0B40,
	GL_POLYGON_OFFSET_FACTOR	= 0x8038,
	GL_POLYGON_OFFSET_UNITS		= 0x2A00,
	GL_POLYGON_OFFSET_POINT		= 0x2A01,
	GL_POLYGON_OFFSET_LINE		= 0x2A02,
	GL_POLYGON_OFFSET_FILL		= 0x8037,

	 
	GL_COMPILE			= 0x1300,
	GL_COMPILE_AND_EXECUTE		= 0x1301,
	GL_LIST_BASE			= 0x0B32,
	GL_LIST_INDEX			= 0x0B33,
	GL_LIST_MODE			= 0x0B30,

	 
	GL_NEVER			= 0x0200,
	GL_LESS				= 0x0201,
	GL_GEQUAL			= 0x0206,
	GL_LEQUAL			= 0x0203,
	GL_GREATER			= 0x0204,
	GL_NOTEQUAL			= 0x0205,
	GL_EQUAL			= 0x0202,
	GL_ALWAYS			= 0x0207,
	GL_DEPTH_TEST			= 0x0B71,
	GL_DEPTH_BITS			= 0x0D56,
	GL_DEPTH_CLEAR_VALUE		= 0x0B73,
	GL_DEPTH_FUNC			= 0x0B74,
	GL_DEPTH_RANGE			= 0x0B70,
	GL_DEPTH_WRITEMASK		= 0x0B72,
	GL_DEPTH_COMPONENT		= 0x1902,

	 
	GL_LIGHTING			= 0x0B50,
	GL_LIGHT0			= 0x4000,
	GL_LIGHT1			= 0x4001,
	GL_LIGHT2			= 0x4002,
	GL_LIGHT3			= 0x4003,
	GL_LIGHT4			= 0x4004,
	GL_LIGHT5			= 0x4005,
	GL_LIGHT6			= 0x4006,
	GL_LIGHT7			= 0x4007,
	GL_SPOT_EXPONENT		= 0x1205,
	GL_SPOT_CUTOFF			= 0x1206,
	GL_CONSTANT_ATTENUATION		= 0x1207,
	GL_LINEAR_ATTENUATION		= 0x1208,
	GL_QUADRATIC_ATTENUATION	= 0x1209,
	GL_AMBIENT			= 0x1200,
	GL_DIFFUSE			= 0x1201,
	GL_SPECULAR			= 0x1202,
	GL_SHININESS			= 0x1601,
	GL_EMISSION			= 0x1600,
	GL_POSITION			= 0x1203,
	GL_SPOT_DIRECTION		= 0x1204,
	GL_AMBIENT_AND_DIFFUSE		= 0x1602,
	GL_COLOR_INDEXES		= 0x1603,
	GL_LIGHT_MODEL_TWO_SIDE		= 0x0B52,
	GL_LIGHT_MODEL_LOCAL_VIEWER	= 0x0B51,
	GL_LIGHT_MODEL_AMBIENT		= 0x0B53,
	GL_FRONT_AND_BACK		= 0x0408,
	GL_SHADE_MODEL			= 0x0B54,
	GL_FLAT				= 0x1D00,
	GL_SMOOTH			= 0x1D01,
	GL_COLOR_MATERIAL		= 0x0B57,
	GL_COLOR_MATERIAL_FACE		= 0x0B55,
	GL_COLOR_MATERIAL_PARAMETER	= 0x0B56,
	GL_NORMALIZE			= 0x0BA1,

	 
	GL_CLIP_PLANE0			= 0x3000,
	GL_CLIP_PLANE1			= 0x3001,
	GL_CLIP_PLANE2			= 0x3002,
	GL_CLIP_PLANE3			= 0x3003,
	GL_CLIP_PLANE4			= 0x3004,
	GL_CLIP_PLANE5			= 0x3005,

	 
	GL_ACCUM_RED_BITS		= 0x0D58,
	GL_ACCUM_GREEN_BITS		= 0x0D59,
	GL_ACCUM_BLUE_BITS		= 0x0D5A,
	GL_ACCUM_ALPHA_BITS		= 0x0D5B,
	GL_ACCUM_CLEAR_VALUE		= 0x0B80,
	GL_ACCUM			= 0x0100,
	GL_ADD				= 0x0104,
	GL_LOAD				= 0x0101,
	GL_MULT				= 0x0103,
	GL_RETURN			= 0x0102,

	 
	GL_ALPHA_TEST			= 0x0BC0,
	GL_ALPHA_TEST_REF		= 0x0BC2,
	GL_ALPHA_TEST_FUNC		= 0x0BC1,

	 
	GL_BLEND			= 0x0BE2,
	GL_BLEND_SRC			= 0x0BE1,
	GL_BLEND_DST			= 0x0BE0,
	GL_ZERO				= 0,
	GL_ONE				= 1,
	GL_SRC_COLOR			= 0x0300,
	GL_ONE_MINUS_SRC_COLOR		= 0x0301,
	GL_DST_COLOR			= 0x0306,
	GL_ONE_MINUS_DST_COLOR		= 0x0307,
	GL_SRC_ALPHA			= 0x0302,
	GL_ONE_MINUS_SRC_ALPHA		= 0x0303,
	GL_DST_ALPHA			= 0x0304,
	GL_ONE_MINUS_DST_ALPHA		= 0x0305,
	GL_SRC_ALPHA_SATURATE		= 0x0308,
	GL_CONSTANT_COLOR		= 0x8001,
	GL_ONE_MINUS_CONSTANT_COLOR	= 0x8002,
	GL_CONSTANT_ALPHA		= 0x8003,
	GL_ONE_MINUS_CONSTANT_ALPHA	= 0x8004,

	 
	GL_FEEDBACK			= 0x1C01,
	GL_RENDER			= 0x1C00,
	GL_SELECT			= 0x1C02,

	 
	GL_2D				= 0x0600,
	GL_3D				= 0x0601,
	GL_3D_COLOR			= 0x0602,
	GL_3D_COLOR_TEXTURE		= 0x0603,
	GL_4D_COLOR_TEXTURE		= 0x0604,
	GL_POINT_TOKEN			= 0x0701,
	GL_LINE_TOKEN			= 0x0702,
	GL_LINE_RESET_TOKEN		= 0x0707,
	GL_POLYGON_TOKEN		= 0x0703,
	GL_BITMAP_TOKEN			= 0x0704,
	GL_DRAW_PIXEL_TOKEN		= 0x0705,
	GL_COPY_PIXEL_TOKEN		= 0x0706,
	GL_PASS_THROUGH_TOKEN		= 0x0700,
	GL_FEEDBACK_BUFFER_POINTER	= 0x0DF0,
	GL_FEEDBACK_BUFFER_SIZE		= 0x0DF1,
	GL_FEEDBACK_BUFFER_TYPE		= 0x0DF2,


	 
	GL_FOG				= 0x0B60,
	GL_FOG_MODE			= 0x0B65,
	GL_FOG_DENSITY			= 0x0B62,
	GL_FOG_COLOR			= 0x0B66,
	GL_FOG_INDEX			= 0x0B61,
	GL_FOG_START			= 0x0B63,
	GL_FOG_END			= 0x0B64,
	GL_LINEAR			= 0x2601,
	GL_EXP				= 0x0800,
	GL_EXP2				= 0x0801,

	 
	GL_LOGIC_OP			= 0x0BF1,
	GL_INDEX_LOGIC_OP		= 0x0BF1,
	GL_COLOR_LOGIC_OP		= 0x0BF2,
	GL_LOGIC_OP_MODE		= 0x0BF0,
	GL_CLEAR			= 0x1500,
	GL_SET				= 0x150F,
	GL_COPY				= 0x1503,
	GL_COPY_INVERTED		= 0x150C,
	GL_NOOP				= 0x1505,
	GL_INVERT			= 0x150A,
	GL_AND				= 0x1501,
	GL_NAND				= 0x150E,
	GL_OR				= 0x1507,
	GL_NOR				= 0x1508,
	GL_XOR				= 0x1506,
	GL_EQUIV			= 0x1509,
	GL_AND_REVERSE			= 0x1502,
	GL_AND_INVERTED			= 0x1504,
	GL_OR_REVERSE			= 0x150B,
	GL_OR_INVERTED			= 0x150D,

	 
	GL_STENCIL_TEST			= 0x0B90,
	GL_STENCIL_WRITEMASK		= 0x0B98,
	GL_STENCIL_BITS			= 0x0D57,
	GL_STENCIL_FUNC			= 0x0B92,
	GL_STENCIL_VALUE_MASK		= 0x0B93,
	GL_STENCIL_REF			= 0x0B97,
	GL_STENCIL_FAIL			= 0x0B94,
	GL_STENCIL_PASS_DEPTH_PASS	= 0x0B96,
	GL_STENCIL_PASS_DEPTH_FAIL	= 0x0B95,
	GL_STENCIL_CLEAR_VALUE		= 0x0B91,
	GL_STENCIL_INDEX		= 0x1901,
	GL_KEEP				= 0x1E00,
	GL_REPLACE			= 0x1E01,
	GL_INCR				= 0x1E02,
	GL_DECR				= 0x1E03,

	 
	GL_NONE				= 0,
	GL_LEFT				= 0x0406,
	GL_RIGHT			= 0x0407,
	 
	 
	 
	GL_FRONT_LEFT			= 0x0400,
	GL_FRONT_RIGHT			= 0x0401,
	GL_BACK_LEFT			= 0x0402,
	GL_BACK_RIGHT			= 0x0403,
	GL_AUX0				= 0x0409,
	GL_AUX1				= 0x040A,
	GL_AUX2				= 0x040B,
	GL_AUX3				= 0x040C,
	GL_COLOR_INDEX			= 0x1900,
	GL_RED				= 0x1903,
	GL_GREEN			= 0x1904,
	GL_BLUE				= 0x1905,
	GL_ALPHA			= 0x1906,
	GL_LUMINANCE			= 0x1909,
	GL_LUMINANCE_ALPHA		= 0x190A,
	GL_ALPHA_BITS			= 0x0D55,
	GL_RED_BITS			= 0x0D52,
	GL_GREEN_BITS			= 0x0D53,
	GL_BLUE_BITS			= 0x0D54,
	GL_INDEX_BITS			= 0x0D51,
	GL_SUBPIXEL_BITS		= 0x0D50,
	GL_AUX_BUFFERS			= 0x0C00,
	GL_READ_BUFFER			= 0x0C02,
	GL_DRAW_BUFFER			= 0x0C01,
	GL_DOUBLEBUFFER			= 0x0C32,
	GL_STEREO			= 0x0C33,
	GL_BITMAP			= 0x1A00,
	GL_COLOR			= 0x1800,
	GL_DEPTH			= 0x1801,
	GL_STENCIL			= 0x1802,
	GL_DITHER			= 0x0BD0,
	GL_RGB				= 0x1907,
	GL_RGBA				= 0x1908,

	 
	GL_MAX_LIST_NESTING		= 0x0B31,
	GL_MAX_ATTRIB_STACK_DEPTH	= 0x0D35,
	GL_MAX_MODELVIEW_STACK_DEPTH	= 0x0D36,
	GL_MAX_NAME_STACK_DEPTH		= 0x0D37,
	GL_MAX_PROJECTION_STACK_DEPTH	= 0x0D38,
	GL_MAX_TEXTURE_STACK_DEPTH	= 0x0D39,
	GL_MAX_EVAL_ORDER		= 0x0D30,
	GL_MAX_LIGHTS			= 0x0D31,
	GL_MAX_CLIP_PLANES		= 0x0D32,
	GL_MAX_TEXTURE_SIZE		= 0x0D33,
	GL_MAX_PIXEL_MAP_TABLE		= 0x0D34,
	GL_MAX_VIEWPORT_DIMS		= 0x0D3A,
	GL_MAX_CLIENT_ATTRIB_STACK_DEPTH= 0x0D3B,

	 
	GL_ATTRIB_STACK_DEPTH		= 0x0BB0,
	GL_CLIENT_ATTRIB_STACK_DEPTH	= 0x0BB1,
	GL_COLOR_CLEAR_VALUE		= 0x0C22,
	GL_COLOR_WRITEMASK		= 0x0C23,
	GL_CURRENT_INDEX		= 0x0B01,
	GL_CURRENT_COLOR		= 0x0B00,
	GL_CURRENT_NORMAL		= 0x0B02,
	GL_CURRENT_RASTER_COLOR		= 0x0B04,
	GL_CURRENT_RASTER_DISTANCE	= 0x0B09,
	GL_CURRENT_RASTER_INDEX		= 0x0B05,
	GL_CURRENT_RASTER_POSITION	= 0x0B07,
	GL_CURRENT_RASTER_TEXTURE_COORDS = 0x0B06,
	GL_CURRENT_RASTER_POSITION_VALID = 0x0B08,
	GL_CURRENT_TEXTURE_COORDS	= 0x0B03,
	GL_INDEX_CLEAR_VALUE		= 0x0C20,
	GL_INDEX_MODE			= 0x0C30,
	GL_INDEX_WRITEMASK		= 0x0C21,
	GL_MODELVIEW_MATRIX		= 0x0BA6,
	GL_MODELVIEW_STACK_DEPTH	= 0x0BA3,
	GL_NAME_STACK_DEPTH		= 0x0D70,
	GL_PROJECTION_MATRIX		= 0x0BA7,
	GL_PROJECTION_STACK_DEPTH	= 0x0BA4,
	GL_RENDER_MODE			= 0x0C40,
	GL_RGBA_MODE			= 0x0C31,
	GL_TEXTURE_MATRIX		= 0x0BA8,
	GL_TEXTURE_STACK_DEPTH		= 0x0BA5,
	GL_VIEWPORT			= 0x0BA2,


	 
	GL_AUTO_NORMAL			= 0x0D80,
	GL_MAP1_COLOR_4			= 0x0D90,
	GL_MAP1_GRID_DOMAIN		= 0x0DD0,
	GL_MAP1_GRID_SEGMENTS		= 0x0DD1,
	GL_MAP1_INDEX			= 0x0D91,
	GL_MAP1_NORMAL			= 0x0D92,
	GL_MAP1_TEXTURE_COORD_1		= 0x0D93,
	GL_MAP1_TEXTURE_COORD_2		= 0x0D94,
	GL_MAP1_TEXTURE_COORD_3		= 0x0D95,
	GL_MAP1_TEXTURE_COORD_4		= 0x0D96,
	GL_MAP1_VERTEX_3		= 0x0D97,
	GL_MAP1_VERTEX_4		= 0x0D98,
	GL_MAP2_COLOR_4			= 0x0DB0,
	GL_MAP2_GRID_DOMAIN		= 0x0DD2,
	GL_MAP2_GRID_SEGMENTS		= 0x0DD3,
	GL_MAP2_INDEX			= 0x0DB1,
	GL_MAP2_NORMAL			= 0x0DB2,
	GL_MAP2_TEXTURE_COORD_1		= 0x0DB3,
	GL_MAP2_TEXTURE_COORD_2		= 0x0DB4,
	GL_MAP2_TEXTURE_COORD_3		= 0x0DB5,
	GL_MAP2_TEXTURE_COORD_4		= 0x0DB6,
	GL_MAP2_VERTEX_3		= 0x0DB7,
	GL_MAP2_VERTEX_4		= 0x0DB8,
	GL_COEFF			= 0x0A00,
	GL_DOMAIN			= 0x0A02,
	GL_ORDER			= 0x0A01,

	 
	GL_FOG_HINT			= 0x0C54,
	GL_LINE_SMOOTH_HINT		= 0x0C52,
	GL_PERSPECTIVE_CORRECTION_HINT	= 0x0C50,
	GL_POINT_SMOOTH_HINT		= 0x0C51,
	GL_POLYGON_SMOOTH_HINT		= 0x0C53,
	GL_DONT_CARE			= 0x1100,
	GL_FASTEST			= 0x1101,
	GL_NICEST			= 0x1102,

	 
	GL_SCISSOR_TEST			= 0x0C11,
	GL_SCISSOR_BOX			= 0x0C10,

	 
	GL_MAP_COLOR			= 0x0D10,
	GL_MAP_STENCIL			= 0x0D11,
	GL_INDEX_SHIFT			= 0x0D12,
	GL_INDEX_OFFSET			= 0x0D13,
	GL_RED_SCALE			= 0x0D14,
	GL_RED_BIAS			= 0x0D15,
	GL_GREEN_SCALE			= 0x0D18,
	GL_GREEN_BIAS			= 0x0D19,
	GL_BLUE_SCALE			= 0x0D1A,
	GL_BLUE_BIAS			= 0x0D1B,
	GL_ALPHA_SCALE			= 0x0D1C,
	GL_ALPHA_BIAS			= 0x0D1D,
	GL_DEPTH_SCALE			= 0x0D1E,
	GL_DEPTH_BIAS			= 0x0D1F,
	GL_PIXEL_MAP_S_TO_S_SIZE	= 0x0CB1,
	GL_PIXEL_MAP_I_TO_I_SIZE	= 0x0CB0,
	GL_PIXEL_MAP_I_TO_R_SIZE	= 0x0CB2,
	GL_PIXEL_MAP_I_TO_G_SIZE	= 0x0CB3,
	GL_PIXEL_MAP_I_TO_B_SIZE	= 0x0CB4,
	GL_PIXEL_MAP_I_TO_A_SIZE	= 0x0CB5,
	GL_PIXEL_MAP_R_TO_R_SIZE	= 0x0CB6,
	GL_PIXEL_MAP_G_TO_G_SIZE	= 0x0CB7,
	GL_PIXEL_MAP_B_TO_B_SIZE	= 0x0CB8,
	GL_PIXEL_MAP_A_TO_A_SIZE	= 0x0CB9,
	GL_PIXEL_MAP_S_TO_S		= 0x0C71,
	GL_PIXEL_MAP_I_TO_I		= 0x0C70,
	GL_PIXEL_MAP_I_TO_R		= 0x0C72,
	GL_PIXEL_MAP_I_TO_G		= 0x0C73,
	GL_PIXEL_MAP_I_TO_B		= 0x0C74,
	GL_PIXEL_MAP_I_TO_A		= 0x0C75,
	GL_PIXEL_MAP_R_TO_R		= 0x0C76,
	GL_PIXEL_MAP_G_TO_G		= 0x0C77,
	GL_PIXEL_MAP_B_TO_B		= 0x0C78,
	GL_PIXEL_MAP_A_TO_A		= 0x0C79,
	GL_PACK_ALIGNMENT		= 0x0D05,
	GL_PACK_LSB_FIRST		= 0x0D01,
	GL_PACK_ROW_LENGTH		= 0x0D02,
	GL_PACK_SKIP_PIXELS		= 0x0D04,
	GL_PACK_SKIP_ROWS		= 0x0D03,
	GL_PACK_SWAP_BYTES		= 0x0D00,
	GL_UNPACK_ALIGNMENT		= 0x0CF5,
	GL_UNPACK_LSB_FIRST		= 0x0CF1,
	GL_UNPACK_ROW_LENGTH		= 0x0CF2,
	GL_UNPACK_SKIP_PIXELS		= 0x0CF4,
	GL_UNPACK_SKIP_ROWS		= 0x0CF3,
	GL_UNPACK_SWAP_BYTES		= 0x0CF0,
	GL_ZOOM_X			= 0x0D16,
	GL_ZOOM_Y			= 0x0D17,

	 
	GL_TEXTURE_ENV			= 0x2300,
	GL_TEXTURE_ENV_MODE		= 0x2200,
	GL_TEXTURE_1D			= 0x0DE0,
	GL_TEXTURE_2D			= 0x0DE1,
	GL_TEXTURE_WRAP_S		= 0x2802,
	GL_TEXTURE_WRAP_T		= 0x2803,
	GL_TEXTURE_MAG_FILTER		= 0x2800,
	GL_TEXTURE_MIN_FILTER		= 0x2801,
	GL_TEXTURE_ENV_COLOR		= 0x2201,
	GL_TEXTURE_GEN_S		= 0x0C60,
	GL_TEXTURE_GEN_T		= 0x0C61,
	GL_TEXTURE_GEN_MODE		= 0x2500,
	GL_TEXTURE_BORDER_COLOR		= 0x1004,
	GL_TEXTURE_WIDTH		= 0x1000,
	GL_TEXTURE_HEIGHT		= 0x1001,
	GL_TEXTURE_BORDER		= 0x1005,
	GL_TEXTURE_COMPONENTS		= 0x1003,
	GL_TEXTURE_RED_SIZE		= 0x805C,
	GL_TEXTURE_GREEN_SIZE		= 0x805D,
	GL_TEXTURE_BLUE_SIZE		= 0x805E,
	GL_TEXTURE_ALPHA_SIZE		= 0x805F,
	GL_TEXTURE_LUMINANCE_SIZE	= 0x8060,
	GL_TEXTURE_INTENSITY_SIZE	= 0x8061,
	GL_NEAREST_MIPMAP_NEAREST	= 0x2700,
	GL_NEAREST_MIPMAP_LINEAR	= 0x2702,
	GL_LINEAR_MIPMAP_NEAREST	= 0x2701,
	GL_LINEAR_MIPMAP_LINEAR		= 0x2703,
	GL_OBJECT_LINEAR		= 0x2401,
	GL_OBJECT_PLANE			= 0x2501,
	GL_EYE_LINEAR			= 0x2400,
	GL_EYE_PLANE			= 0x2502,
	GL_SPHERE_MAP			= 0x2402,
	GL_DECAL			= 0x2101,
	GL_MODULATE			= 0x2100,
	GL_NEAREST			= 0x2600,
	GL_REPEAT			= 0x2901,
	GL_CLAMP			= 0x2900,
	GL_S				= 0x2000,
	GL_T				= 0x2001,
	GL_R				= 0x2002,
	GL_Q				= 0x2003,
	GL_TEXTURE_GEN_R		= 0x0C62,
	GL_TEXTURE_GEN_Q		= 0x0C63,

	GL_PROXY_TEXTURE_1D		= 0x8063,
	GL_PROXY_TEXTURE_2D		= 0x8064,
	GL_TEXTURE_PRIORITY		= 0x8066,
	GL_TEXTURE_RESIDENT		= 0x8067,
	GL_TEXTURE_BINDING_1D		= 0x8068,
	GL_TEXTURE_BINDING_2D		= 0x8069,

	 
	GL_ALPHA4			= 0x803B,
	GL_ALPHA8			= 0x803C,
	GL_ALPHA12			= 0x803D,
	GL_ALPHA16			= 0x803E,
	GL_LUMINANCE4			= 0x803F,
	GL_LUMINANCE8			= 0x8040,
	GL_LUMINANCE12			= 0x8041,
	GL_LUMINANCE16			= 0x8042,
	GL_LUMINANCE4_ALPHA4		= 0x8043,
	GL_LUMINANCE6_ALPHA2		= 0x8044,
	GL_LUMINANCE8_ALPHA8		= 0x8045,
	GL_LUMINANCE12_ALPHA4		= 0x8046,
	GL_LUMINANCE12_ALPHA12		= 0x8047,
	GL_LUMINANCE16_ALPHA16		= 0x8048,
	GL_INTENSITY			= 0x8049,
	GL_INTENSITY4			= 0x804A,
	GL_INTENSITY8			= 0x804B,
	GL_INTENSITY12			= 0x804C,
	GL_INTENSITY16			= 0x804D,
	GL_R3_G3_B2			= 0x2A10,
	GL_RGB4				= 0x804F,
	GL_RGB5				= 0x8050,
	GL_RGB8				= 0x8051,
	GL_RGB10			= 0x8052,
	GL_RGB12			= 0x8053,
	GL_RGB16			= 0x8054,
	GL_RGBA2			= 0x8055,
	GL_RGBA4			= 0x8056,
	GL_RGB5_A1			= 0x8057,
	GL_RGBA8			= 0x8058,
	GL_RGB10_A2			= 0x8059,
	GL_RGBA12			= 0x805A,
	GL_RGBA16			= 0x805B,

	 
	GL_VENDOR			= 0x1F00,
	GL_RENDERER			= 0x1F01,
	GL_VERSION			= 0x1F02,
	GL_EXTENSIONS			= 0x1F03,

	 
	GL_INVALID_VALUE		= 0x0501,
	GL_INVALID_ENUM			= 0x0500,
	GL_INVALID_OPERATION		= 0x0502,
	GL_STACK_OVERFLOW		= 0x0503,
	GL_STACK_UNDERFLOW		= 0x0504,
	GL_OUT_OF_MEMORY		= 0x0505,

	 


         
	GL_CONSTANT_COLOR_EXT		= 0x8001,
	GL_ONE_MINUS_CONSTANT_COLOR_EXT	= 0x8002,
	GL_CONSTANT_ALPHA_EXT		= 0x8003,
	GL_ONE_MINUS_CONSTANT_ALPHA_EXT	= 0x8004,
	GL_BLEND_EQUATION_EXT		= 0x8009,
	GL_MIN_EXT			= 0x8007,
	GL_MAX_EXT			= 0x8008,
	GL_FUNC_ADD_EXT			= 0x8006,
	GL_FUNC_SUBTRACT_EXT		= 0x800A,
	GL_FUNC_REVERSE_SUBTRACT_EXT	= 0x800B,
	GL_BLEND_COLOR_EXT		= 0x8005,

	 
        GL_POLYGON_OFFSET_EXT           = 0x8037,
        GL_POLYGON_OFFSET_FACTOR_EXT    = 0x8038,
        GL_POLYGON_OFFSET_BIAS_EXT      = 0x8039,

	 
	GL_VERTEX_ARRAY_EXT		= 0x8074,
	GL_NORMAL_ARRAY_EXT		= 0x8075,
	GL_COLOR_ARRAY_EXT		= 0x8076,
	GL_INDEX_ARRAY_EXT		= 0x8077,
	GL_TEXTURE_COORD_ARRAY_EXT	= 0x8078,
	GL_EDGE_FLAG_ARRAY_EXT		= 0x8079,
	GL_VERTEX_ARRAY_SIZE_EXT	= 0x807A,
	GL_VERTEX_ARRAY_TYPE_EXT	= 0x807B,
	GL_VERTEX_ARRAY_STRIDE_EXT	= 0x807C,
	GL_VERTEX_ARRAY_COUNT_EXT	= 0x807D,
	GL_NORMAL_ARRAY_TYPE_EXT	= 0x807E,
	GL_NORMAL_ARRAY_STRIDE_EXT	= 0x807F,
	GL_NORMAL_ARRAY_COUNT_EXT	= 0x8080,
	GL_COLOR_ARRAY_SIZE_EXT		= 0x8081,
	GL_COLOR_ARRAY_TYPE_EXT		= 0x8082,
	GL_COLOR_ARRAY_STRIDE_EXT	= 0x8083,
	GL_COLOR_ARRAY_COUNT_EXT	= 0x8084,
	GL_INDEX_ARRAY_TYPE_EXT		= 0x8085,
	GL_INDEX_ARRAY_STRIDE_EXT	= 0x8086,
	GL_INDEX_ARRAY_COUNT_EXT	= 0x8087,
	GL_TEXTURE_COORD_ARRAY_SIZE_EXT	= 0x8088,
	GL_TEXTURE_COORD_ARRAY_TYPE_EXT	= 0x8089,
	GL_TEXTURE_COORD_ARRAY_STRIDE_EXT= 0x808A,
	GL_TEXTURE_COORD_ARRAY_COUNT_EXT= 0x808B,
	GL_EDGE_FLAG_ARRAY_STRIDE_EXT	= 0x808C,
	GL_EDGE_FLAG_ARRAY_COUNT_EXT	= 0x808D,
	GL_VERTEX_ARRAY_POINTER_EXT	= 0x808E,
	GL_NORMAL_ARRAY_POINTER_EXT	= 0x808F,
	GL_COLOR_ARRAY_POINTER_EXT	= 0x8090,
	GL_INDEX_ARRAY_POINTER_EXT	= 0x8091,
	GL_TEXTURE_COORD_ARRAY_POINTER_EXT= 0x8092,
	GL_EDGE_FLAG_ARRAY_POINTER_EXT	= 0x8093,

	 
	GL_TEXTURE_PRIORITY_EXT		= 0x8066,
	GL_TEXTURE_RESIDENT_EXT		= 0x8067,
	GL_TEXTURE_1D_BINDING_EXT	= 0x8068,
	GL_TEXTURE_2D_BINDING_EXT	= 0x8069,

	 
	GL_PACK_SKIP_IMAGES_EXT		= 0x806B,
	GL_PACK_IMAGE_HEIGHT_EXT	= 0x806C,
	GL_UNPACK_SKIP_IMAGES_EXT	= 0x806D,
	GL_UNPACK_IMAGE_HEIGHT_EXT	= 0x806E,
	GL_TEXTURE_3D_EXT		= 0x806F,
	GL_PROXY_TEXTURE_3D_EXT		= 0x8070,
	GL_TEXTURE_DEPTH_EXT		= 0x8071,
	GL_TEXTURE_WRAP_R_EXT		= 0x8072,
	GL_MAX_3D_TEXTURE_SIZE_EXT	= 0x8073,
	GL_TEXTURE_3D_BINDING_EXT	= 0x806A

}





   
  GLenum;



 




enum {
	GL_CURRENT_BIT		= 0x00000001,
	GL_POINT_BIT		= 0x00000002,
	GL_LINE_BIT		= 0x00000004,
	GL_POLYGON_BIT		= 0x00000008,
	GL_POLYGON_STIPPLE_BIT	= 0x00000010,
	GL_PIXEL_MODE_BIT	= 0x00000020,
	GL_LIGHTING_BIT		= 0x00000040,
	GL_FOG_BIT		= 0x00000080,
	GL_DEPTH_BUFFER_BIT	= 0x00000100,
	GL_ACCUM_BUFFER_BIT	= 0x00000200,
	GL_STENCIL_BUFFER_BIT	= 0x00000400,
	GL_VIEWPORT_BIT		= 0x00000800,
	GL_TRANSFORM_BIT	= 0x00001000,
	GL_ENABLE_BIT		= 0x00002000,
	GL_COLOR_BUFFER_BIT	= 0x00004000,
	GL_HINT_BIT		= 0x00008000,
	GL_EVAL_BIT		= 0x00010000,
	GL_LIST_BIT		= 0x00020000,
	GL_TEXTURE_BIT		= 0x00040000,
	GL_SCISSOR_BIT		= 0x00080000,
	GL_ALL_ATTRIB_BITS	= 0x000fffff
};


enum {
	GL_CLIENT_PIXEL_STORE_BIT	= 0x00000001,
	GL_CLIENT_VERTEX_ARRAY_BIT	= 0x00000002,
	GL_CLIENT_ALL_ATTRIB_BITS	= 0x0000FFFF
};



typedef unsigned int GLbitfield;







 





 
 
typedef void		GLvoid;
typedef unsigned char	GLboolean;
typedef signed char	GLbyte;		 
typedef short		GLshort;	 
typedef int		GLint;		 
typedef unsigned char	GLubyte;	 
typedef unsigned short	GLushort;	 
typedef unsigned int	GLuint;		 
typedef int		GLsizei;	 
typedef float		GLfloat;	 
typedef float		GLclampf;	 
typedef double		GLdouble;	 
typedef double		GLclampd;	 








 



extern void glClearIndex( GLfloat c );

extern void glClearColor( GLclampf red,
			  GLclampf green,
			  GLclampf blue,
			  GLclampf alpha );

extern void glClear( GLbitfield mask );

extern void glIndexMask( GLuint mask );

extern void glColorMask( GLboolean red, GLboolean green,
			 GLboolean blue, GLboolean alpha );

extern void glAlphaFunc( GLenum func, GLclampf ref );

extern void glBlendFunc( GLenum sfactor, GLenum dfactor );

extern void glLogicOp( GLenum opcode );

extern void glCullFace( GLenum mode );

extern void glFrontFace( GLenum mode );

extern void glPointSize( GLfloat size );

extern void glLineWidth( GLfloat width );

extern void glLineStipple( GLint factor, GLushort pattern );

extern void glPolygonMode( GLenum face, GLenum mode );

extern void glPolygonOffset( GLfloat factor, GLfloat units );

extern void glPolygonStipple( const GLubyte *mask );

extern void glGetPolygonStipple( GLubyte *mask );

extern void glEdgeFlag( GLboolean flag );

extern void glEdgeFlagv( const GLboolean *flag );

extern void glScissor( GLint x, GLint y, GLsizei width, GLsizei height);

extern void glClipPlane( GLenum plane, const GLdouble *equation );

extern void glGetClipPlane( GLenum plane, GLdouble *equation );

extern void glDrawBuffer( GLenum mode );

extern void glReadBuffer( GLenum mode );

extern void glEnable( GLenum cap );

extern void glDisable( GLenum cap );

extern GLboolean glIsEnabled( GLenum cap );


extern void glEnableClientState( GLenum cap );   

extern void glDisableClientState( GLenum cap );   


extern void glGetBooleanv( GLenum pname, GLboolean *params );

extern void glGetDoublev( GLenum pname, GLdouble *params );

extern void glGetFloatv( GLenum pname, GLfloat *params );

extern void glGetIntegerv( GLenum pname, GLint *params );


extern void glPushAttrib( GLbitfield mask );

extern void glPopAttrib( void );


extern void glPushClientAttrib( GLbitfield mask );

extern void glPopClientAttrib( void );


extern GLint glRenderMode( GLenum mode );

extern GLenum glGetError( void );

extern const GLubyte *glGetString( GLenum name );

extern void glFinish( void );

extern void glFlush( void );

extern void glHint( GLenum target, GLenum mode );



 



extern void glClearDepth( GLclampd depth );

extern void glDepthFunc( GLenum func );

extern void glDepthMask( GLboolean flag );

extern void glDepthRange( GLclampd near_val, GLclampd far_val );


 



extern void glClearAccum( GLfloat red, GLfloat green,
			  GLfloat blue, GLfloat alpha );

extern void glAccum( GLenum op, GLfloat value );



 



extern void glMatrixMode( GLenum mode );

extern void glOrtho( GLdouble left, GLdouble right,
		     GLdouble bottom, GLdouble top,
		     GLdouble near_val, GLdouble far_val );

extern void glFrustum( GLdouble left, GLdouble right,
		       GLdouble bottom, GLdouble top,
		       GLdouble near_val, GLdouble far_val );

extern void glViewport( GLint x, GLint y, GLsizei width, GLsizei height );

extern void glPushMatrix( void );

extern void glPopMatrix( void );

extern void glLoadIdentity( void );

extern void glLoadMatrixd( const GLdouble *m );
extern void glLoadMatrixf( const GLfloat *m );

extern void glMultMatrixd( const GLdouble *m );
extern void glMultMatrixf( const GLfloat *m );

extern void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z );
extern void glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z );

extern void glScaled( GLdouble x, GLdouble y, GLdouble z );
extern void glScalef( GLfloat x, GLfloat y, GLfloat z );

extern void glTranslated( GLdouble x, GLdouble y, GLdouble z );
extern void glTranslatef( GLfloat x, GLfloat y, GLfloat z );



 



extern GLboolean glIsList( GLuint list );

extern void glDeleteLists( GLuint list, GLsizei range );

extern GLuint glGenLists( GLsizei range );

extern void glNewList( GLuint list, GLenum mode );

extern void glEndList( void );

extern void glCallList( GLuint list );

extern void glCallLists( GLsizei n, GLenum type, const GLvoid *lists );

extern void glListBase( GLuint base );



 



extern void glBegin( GLenum mode );

extern void glEnd( void );


extern void glVertex2d( GLdouble x, GLdouble y );
extern void glVertex2f( GLfloat x, GLfloat y );
extern void glVertex2i( GLint x, GLint y );
extern void glVertex2s( GLshort x, GLshort y );

extern void glVertex3d( GLdouble x, GLdouble y, GLdouble z );
extern void glVertex3f( GLfloat x, GLfloat y, GLfloat z );
extern void glVertex3i( GLint x, GLint y, GLint z );
extern void glVertex3s( GLshort x, GLshort y, GLshort z );

extern void glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );
extern void glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
extern void glVertex4i( GLint x, GLint y, GLint z, GLint w );
extern void glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w );

extern void glVertex2dv( const GLdouble *v );
extern void glVertex2fv( const GLfloat *v );
extern void glVertex2iv( const GLint *v );
extern void glVertex2sv( const GLshort *v );

extern void glVertex3dv( const GLdouble *v );
extern void glVertex3fv( const GLfloat *v );
extern void glVertex3iv( const GLint *v );
extern void glVertex3sv( const GLshort *v );

extern void glVertex4dv( const GLdouble *v );
extern void glVertex4fv( const GLfloat *v );
extern void glVertex4iv( const GLint *v );
extern void glVertex4sv( const GLshort *v );


extern void glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz );
extern void glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz );
extern void glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz );
extern void glNormal3i( GLint nx, GLint ny, GLint nz );
extern void glNormal3s( GLshort nx, GLshort ny, GLshort nz );

extern void glNormal3bv( const GLbyte *v );
extern void glNormal3dv( const GLdouble *v );
extern void glNormal3fv( const GLfloat *v );
extern void glNormal3iv( const GLint *v );
extern void glNormal3sv( const GLshort *v );


extern void glIndexd( GLdouble c );
extern void glIndexf( GLfloat c );
extern void glIndexi( GLint c );
extern void glIndexs( GLshort c );
extern void glIndexub( GLubyte c );   

extern void glIndexdv( const GLdouble *c );
extern void glIndexfv( const GLfloat *c );
extern void glIndexiv( const GLint *c );
extern void glIndexsv( const GLshort *c );
extern void glIndexubv( const GLubyte *c );   

extern void glColor3b( GLbyte red, GLbyte green, GLbyte blue );
extern void glColor3d( GLdouble red, GLdouble green, GLdouble blue );
extern void glColor3f( GLfloat red, GLfloat green, GLfloat blue );
extern void glColor3i( GLint red, GLint green, GLint blue );
extern void glColor3s( GLshort red, GLshort green, GLshort blue );
extern void glColor3ub( GLubyte red, GLubyte green, GLubyte blue );
extern void glColor3ui( GLuint red, GLuint green, GLuint blue );
extern void glColor3us( GLushort red, GLushort green, GLushort blue );

extern void glColor4b( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha );
extern void glColor4d( GLdouble red, GLdouble green,
		       GLdouble blue, GLdouble alpha );
extern void glColor4f( GLfloat red, GLfloat green,
		       GLfloat blue, GLfloat alpha );
extern void glColor4i( GLint red, GLint green, GLint blue, GLint alpha );
extern void glColor4s( GLshort red, GLshort green,
		       GLshort blue, GLshort alpha );
extern void glColor4ub( GLubyte red, GLubyte green,
			GLubyte blue, GLubyte alpha );
extern void glColor4ui( GLuint red, GLuint green, GLuint blue, GLuint alpha );
extern void glColor4us( GLushort red, GLushort green,
			GLushort blue, GLushort alpha );


extern void glColor3bv( const GLbyte *v );
extern void glColor3dv( const GLdouble *v );
extern void glColor3fv( const GLfloat *v );
extern void glColor3iv( const GLint *v );
extern void glColor3sv( const GLshort *v );
extern void glColor3ubv( const GLubyte *v );
extern void glColor3uiv( const GLuint *v );
extern void glColor3usv( const GLushort *v );

extern void glColor4bv( const GLbyte *v );
extern void glColor4dv( const GLdouble *v );
extern void glColor4fv( const GLfloat *v );
extern void glColor4iv( const GLint *v );
extern void glColor4sv( const GLshort *v );
extern void glColor4ubv( const GLubyte *v );
extern void glColor4uiv( const GLuint *v );
extern void glColor4usv( const GLushort *v );


extern void glTexCoord1d( GLdouble s );
extern void glTexCoord1f( GLfloat s );
extern void glTexCoord1i( GLint s );
extern void glTexCoord1s( GLshort s );

extern void glTexCoord2d( GLdouble s, GLdouble t );
extern void glTexCoord2f( GLfloat s, GLfloat t );
extern void glTexCoord2i( GLint s, GLint t );
extern void glTexCoord2s( GLshort s, GLshort t );

extern void glTexCoord3d( GLdouble s, GLdouble t, GLdouble r );
extern void glTexCoord3f( GLfloat s, GLfloat t, GLfloat r );
extern void glTexCoord3i( GLint s, GLint t, GLint r );
extern void glTexCoord3s( GLshort s, GLshort t, GLshort r );

extern void glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q );
extern void glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q );
extern void glTexCoord4i( GLint s, GLint t, GLint r, GLint q );
extern void glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q );

extern void glTexCoord1dv( const GLdouble *v );
extern void glTexCoord1fv( const GLfloat *v );
extern void glTexCoord1iv( const GLint *v );
extern void glTexCoord1sv( const GLshort *v );

extern void glTexCoord2dv( const GLdouble *v );
extern void glTexCoord2fv( const GLfloat *v );
extern void glTexCoord2iv( const GLint *v );
extern void glTexCoord2sv( const GLshort *v );

extern void glTexCoord3dv( const GLdouble *v );
extern void glTexCoord3fv( const GLfloat *v );
extern void glTexCoord3iv( const GLint *v );
extern void glTexCoord3sv( const GLshort *v );

extern void glTexCoord4dv( const GLdouble *v );
extern void glTexCoord4fv( const GLfloat *v );
extern void glTexCoord4iv( const GLint *v );
extern void glTexCoord4sv( const GLshort *v );


extern void glRasterPos2d( GLdouble x, GLdouble y );
extern void glRasterPos2f( GLfloat x, GLfloat y );
extern void glRasterPos2i( GLint x, GLint y );
extern void glRasterPos2s( GLshort x, GLshort y );

extern void glRasterPos3d( GLdouble x, GLdouble y, GLdouble z );
extern void glRasterPos3f( GLfloat x, GLfloat y, GLfloat z );
extern void glRasterPos3i( GLint x, GLint y, GLint z );
extern void glRasterPos3s( GLshort x, GLshort y, GLshort z );

extern void glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w );
extern void glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
extern void glRasterPos4i( GLint x, GLint y, GLint z, GLint w );
extern void glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w );

extern void glRasterPos2dv( const GLdouble *v );
extern void glRasterPos2fv( const GLfloat *v );
extern void glRasterPos2iv( const GLint *v );
extern void glRasterPos2sv( const GLshort *v );

extern void glRasterPos3dv( const GLdouble *v );
extern void glRasterPos3fv( const GLfloat *v );
extern void glRasterPos3iv( const GLint *v );
extern void glRasterPos3sv( const GLshort *v );

extern void glRasterPos4dv( const GLdouble *v );
extern void glRasterPos4fv( const GLfloat *v );
extern void glRasterPos4iv( const GLint *v );
extern void glRasterPos4sv( const GLshort *v );


extern void glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 );
extern void glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 );
extern void glRecti( GLint x1, GLint y1, GLint x2, GLint y2 );
extern void glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 );


extern void glRectdv( const GLdouble *v1, const GLdouble *v2 );
extern void glRectfv( const GLfloat *v1, const GLfloat *v2 );
extern void glRectiv( const GLint *v1, const GLint *v2 );
extern void glRectsv( const GLshort *v1, const GLshort *v2 );



 



extern void glVertexPointer( GLint size, GLenum type, GLsizei stride,
                             const GLvoid *ptr );

extern void glNormalPointer( GLenum type, GLsizei stride,
                             const GLvoid *ptr );

extern void glColorPointer( GLint size, GLenum type, GLsizei stride,
                            const GLvoid *ptr );

extern void glIndexPointer( GLenum type, GLsizei stride, const GLvoid *ptr );

extern void glTexCoordPointer( GLint size, GLenum type, GLsizei stride,
                               const GLvoid *ptr );

extern void glEdgeFlagPointer( GLsizei stride, const GLboolean *ptr );

extern void glGetPointerv( GLenum pname, void **params );

extern void glArrayElement( GLint i );

extern void glDrawArrays( GLenum mode, GLint first, GLsizei count );

extern void glDrawElements( GLenum mode, GLsizei count,
                            GLenum type, const GLvoid *indices );

extern void glInterleavedArrays( GLenum format, GLsizei stride,
                                 const GLvoid *pointer );


 



extern void glShadeModel( GLenum mode );

extern void glLightf( GLenum light, GLenum pname, GLfloat param );
extern void glLighti( GLenum light, GLenum pname, GLint param );
extern void glLightfv( GLenum light, GLenum pname, const GLfloat *params );
extern void glLightiv( GLenum light, GLenum pname, const GLint *params );

extern void glGetLightfv( GLenum light, GLenum pname, GLfloat *params );
extern void glGetLightiv( GLenum light, GLenum pname, GLint *params );

extern void glLightModelf( GLenum pname, GLfloat param );
extern void glLightModeli( GLenum pname, GLint param );
extern void glLightModelfv( GLenum pname, const GLfloat *params );
extern void glLightModeliv( GLenum pname, const GLint *params );

extern void glMaterialf( GLenum face, GLenum pname, GLfloat param );
extern void glMateriali( GLenum face, GLenum pname, GLint param );
extern void glMaterialfv( GLenum face, GLenum pname, const GLfloat *params );
extern void glMaterialiv( GLenum face, GLenum pname, const GLint *params );

extern void glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params );
extern void glGetMaterialiv( GLenum face, GLenum pname, GLint *params );

extern void glColorMaterial( GLenum face, GLenum mode );




 



extern void glPixelZoom( GLfloat xfactor, GLfloat yfactor );

extern void glPixelStoref( GLenum pname, GLfloat param );
extern void glPixelStorei( GLenum pname, GLint param );

extern void glPixelTransferf( GLenum pname, GLfloat param );
extern void glPixelTransferi( GLenum pname, GLint param );

extern void glPixelMapfv( GLenum map, GLint mapsize, const GLfloat *values );
extern void glPixelMapuiv( GLenum map, GLint mapsize, const GLuint *values );
extern void glPixelMapusv( GLenum map, GLint mapsize, const GLushort *values );

extern void glGetPixelMapfv( GLenum map, GLfloat *values );
extern void glGetPixelMapuiv( GLenum map, GLuint *values );
extern void glGetPixelMapusv( GLenum map, GLushort *values );

extern void glBitmap( GLsizei width, GLsizei height,
		      GLfloat xorig, GLfloat yorig,
		      GLfloat xmove, GLfloat ymove,
		      const GLubyte *bitmap );

extern void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
			  GLenum format, GLenum type, GLvoid *pixels );

extern void glDrawPixels( GLsizei width, GLsizei height,
			  GLenum format, GLenum type, const GLvoid *pixels );

extern void glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height,
			  GLenum type );



 



extern void glStencilFunc( GLenum func, GLint ref, GLuint mask );

extern void glStencilMask( GLuint mask );

extern void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass );

extern void glClearStencil( GLint s );



 



extern void glTexGend( GLenum coord, GLenum pname, GLdouble param );
extern void glTexGenf( GLenum coord, GLenum pname, GLfloat param );
extern void glTexGeni( GLenum coord, GLenum pname, GLint param );

extern void glTexGendv( GLenum coord, GLenum pname, const GLdouble *params );
extern void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params );
extern void glTexGeniv( GLenum coord, GLenum pname, const GLint *params );

extern void glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params );
extern void glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params );
extern void glGetTexGeniv( GLenum coord, GLenum pname, GLint *params );


extern void glTexEnvf( GLenum target, GLenum pname, GLfloat param );
extern void glTexEnvi( GLenum target, GLenum pname, GLint param );

extern void glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params );
extern void glTexEnviv( GLenum target, GLenum pname, const GLint *params );

extern void glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params );
extern void glGetTexEnviv( GLenum target, GLenum pname, GLint *params );


extern void glTexParameterf( GLenum target, GLenum pname, GLfloat param );
extern void glTexParameteri( GLenum target, GLenum pname, GLint param );

extern void glTexParameterfv( GLenum target, GLenum pname,
			      const GLfloat *params );
extern void glTexParameteriv( GLenum target, GLenum pname,
			      const GLint *params );

extern void glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params);
extern void glGetTexParameteriv( GLenum target, GLenum pname, GLint *params );

extern void glGetTexLevelParameterfv( GLenum target, GLint level,
				      GLenum pname, GLfloat *params );
extern void glGetTexLevelParameteriv( GLenum target, GLint level,
				      GLenum pname, GLint *params );


extern void glTexImage1D( GLenum target, GLint level, GLint components,
			  GLsizei width, GLint border,
			  GLenum format, GLenum type, const GLvoid *pixels );

extern void glTexImage2D( GLenum target, GLint level, GLint components,
			  GLsizei width, GLsizei height, GLint border,
			  GLenum format, GLenum type, const GLvoid *pixels );

extern void glGetTexImage( GLenum target, GLint level, GLenum format,
			   GLenum type, GLvoid *pixels );



 

extern void glGenTextures( GLsizei n, GLuint *textures );

extern void glDeleteTextures( GLsizei n, const GLuint *textures);

extern void glBindTexture( GLenum target, GLuint texture );

extern void glPrioritizeTextures( GLsizei n, const GLuint *textures,
                                  const GLclampf *priorities );

extern GLboolean glAreTexturesResident( GLsizei n,
                                      	const GLuint *textures,
                                        GLboolean *residences );

extern GLboolean glIsTexture( GLuint texture );


extern void glTexSubImage1D( GLenum target, GLint level, GLint xoffset,
                             GLsizei width, GLenum format,
                             GLenum type, const GLvoid *pixels );


extern void glTexSubImage2D( GLenum target, GLint level,
                             GLint xoffset, GLint yoffset,
                             GLsizei width, GLsizei height,
                             GLenum format, GLenum type,
                             const GLvoid *pixels );


extern void glCopyTexImage1D( GLenum target, GLint level,
                              GLenum internalformat,
                              GLint x, GLint y,
                              GLsizei width, GLint border );


extern void glCopyTexImage2D( GLenum target, GLint level,
                              GLenum internalformat,
                              GLint x, GLint y,
                              GLsizei width, GLsizei height, GLint border );


extern void glCopyTexSubImage1D( GLenum target, GLint level,
                                 GLint xoffset, GLint x, GLint y,
                                 GLsizei width );


extern void glCopyTexSubImage2D( GLenum target, GLint level,
                                 GLint xoffset, GLint yoffset,
                                 GLint x, GLint y,
                                 GLsizei width, GLsizei height );




 



extern void glMap1d( GLenum target, GLdouble u1, GLdouble u2, GLint stride,
		     GLint order, const GLdouble *points );
extern void glMap1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride,
		     GLint order, const GLfloat *points );

extern void glMap2d( GLenum target,
		     GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
		     GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
		     const GLdouble *points );
extern void glMap2f( GLenum target,
		     GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
		     GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
		     const GLfloat *points );

extern void glGetMapdv( GLenum target, GLenum query, GLdouble *v );
extern void glGetMapfv( GLenum target, GLenum query, GLfloat *v );
extern void glGetMapiv( GLenum target, GLenum query, GLint *v );

extern void glEvalCoord1d( GLdouble u );
extern void glEvalCoord1f( GLfloat u );

extern void glEvalCoord1dv( const GLdouble *u );
extern void glEvalCoord1fv( const GLfloat *u );

extern void glEvalCoord2d( GLdouble u, GLdouble v );
extern void glEvalCoord2f( GLfloat u, GLfloat v );

extern void glEvalCoord2dv( const GLdouble *u );
extern void glEvalCoord2fv( const GLfloat *u );

extern void glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 );
extern void glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 );

extern void glMapGrid2d( GLint un, GLdouble u1, GLdouble u2,
			 GLint vn, GLdouble v1, GLdouble v2 );
extern void glMapGrid2f( GLint un, GLfloat u1, GLfloat u2,
			 GLint vn, GLfloat v1, GLfloat v2 );

extern void glEvalPoint1( GLint i );

extern void glEvalPoint2( GLint i, GLint j );

extern void glEvalMesh1( GLenum mode, GLint i1, GLint i2 );

extern void glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );



 



extern void glFogf( GLenum pname, GLfloat param );

extern void glFogi( GLenum pname, GLint param );

extern void glFogfv( GLenum pname, const GLfloat *params );

extern void glFogiv( GLenum pname, const GLint *params );



 



extern void glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer );

extern void glPassThrough( GLfloat token );

extern void glSelectBuffer( GLsizei size, GLuint *buffer );

extern void glInitNames( void );

extern void glLoadName( GLuint name );

extern void glPushName( GLuint name );

extern void glPopName( void );



 



 
extern void glBlendEquationEXT( GLenum mode );



 
extern void glBlendColorEXT( GLclampf red, GLclampf green,
			     GLclampf blue, GLclampf alpha );



 
extern void glPolygonOffsetEXT( GLfloat factor, GLfloat bias );



 

extern void glVertexPointerEXT( GLint size, GLenum type, GLsizei stride,
                             	GLsizei count, const GLvoid *ptr );

extern void glNormalPointerEXT( GLenum type, GLsizei stride,
				GLsizei count, const GLvoid *ptr );

extern void glColorPointerEXT( GLint size, GLenum type, GLsizei stride,
                               GLsizei count, const GLvoid *ptr );

extern void glIndexPointerEXT( GLenum type, GLsizei stride,
			       GLsizei count, const GLvoid *ptr );

extern void glTexCoordPointerEXT( GLint size, GLenum type, GLsizei stride,
                                  GLsizei count, const GLvoid *ptr );

extern void glEdgeFlagPointerEXT( GLsizei stride,
				  GLsizei count,  const GLboolean *ptr );

extern void glGetPointervEXT( GLenum pname, void **params );

extern void glArrayElementEXT( GLint i );

extern void glDrawArraysEXT( GLenum mode, GLint first, GLsizei count );



 

extern void glGenTexturesEXT( GLsizei n, GLuint *textures );

extern void glDeleteTexturesEXT( GLsizei n, const GLuint *textures);

extern void glBindTextureEXT( GLenum target, GLuint texture );

extern void glPrioritizeTexturesEXT( GLsizei n, const GLuint *textures,
                                     const GLclampf *priorities );

extern GLboolean glAreTexturesResidentEXT( GLsizei n,
                                           const GLuint *textures,
                                           GLboolean *residences );

extern GLboolean glIsTextureEXT( GLuint texture );



 

extern void glTexImage3DEXT( GLenum target, GLint level, GLenum internalformat,
                             GLsizei width, GLsizei height, GLsizei depth,
                             GLint border, GLenum format, GLenum type, 
                             const GLvoid *pixels );
 
extern void glTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, 
                                GLint yoffset, GLint zoffset, GLsizei width, 
                                GLsizei height, GLsizei depth, GLenum format,
                                GLenum type, const GLvoid *pixels );

extern void glCopyTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset,
                                    GLint yoffset, GLint zoffset, 
                                    GLint x, GLint y, GLsizei width, 
                                    GLsizei height );


 

extern void glWindowPos2iMESA( GLint x, GLint y );
extern void glWindowPos2sMESA( GLshort x, GLshort y );
extern void glWindowPos2fMESA( GLfloat x, GLfloat y );
extern void glWindowPos2dMESA( GLdouble x, GLdouble y );

extern void glWindowPos2ivMESA( const GLint *p );
extern void glWindowPos2svMESA( const GLshort *p );
extern void glWindowPos2fvMESA( const GLfloat *p );
extern void glWindowPos2dvMESA( const GLdouble *p );

extern void glWindowPos3iMESA( GLint x, GLint y, GLint z );
extern void glWindowPos3sMESA( GLshort x, GLshort y, GLshort z );
extern void glWindowPos3fMESA( GLfloat x, GLfloat y, GLfloat z );
extern void glWindowPos3dMESA( GLdouble x, GLdouble y, GLdouble z );

extern void glWindowPos3ivMESA( const GLint *p );
extern void glWindowPos3svMESA( const GLshort *p );
extern void glWindowPos3fvMESA( const GLfloat *p );
extern void glWindowPos3dvMESA( const GLdouble *p );

extern void glWindowPos4iMESA( GLint x, GLint y, GLint z, GLint w );
extern void glWindowPos4sMESA( GLshort x, GLshort y, GLshort z, GLshort w );
extern void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w );
extern void glWindowPos4dMESA( GLdouble x, GLdouble y, GLdouble z, GLdouble w);

extern void glWindowPos4ivMESA( const GLint *p );
extern void glWindowPos4svMESA( const GLshort *p );
extern void glWindowPos4fvMESA( const GLfloat *p );
extern void glWindowPos4dvMESA( const GLdouble *p );


 

extern void glResizeBuffersMESA();








 
















}



# 4 "TestToroid.C" 2

# 1 "/home/room1/kriol/local/include/GL/glu.h" 1 3
 

 




















 





























extern "C" {













enum {
	 
	GLU_SMOOTH	= 100000,
	GLU_FLAT	= 100001,
	GLU_NONE	= 100002,

	 
	GLU_POINT	= 100010,
	GLU_LINE	= 100011,
	GLU_FILL	= 100012,
	GLU_SILHOUETTE	= 100013,

	 
	GLU_OUTSIDE	= 100020,
	GLU_INSIDE	= 100021,

	 
	GLU_BEGIN	= 100100,
	GLU_VERTEX	= 100101,
	GLU_END		= 100102,
	GLU_ERROR	= 100103,
	GLU_EDGE_FLAG	= 100104,

	 
	GLU_CW		= 100120,
	GLU_CCW		= 100121,
	GLU_INTERIOR	= 100122,
	GLU_EXTERIOR	= 100123,
	GLU_UNKNOWN	= 100124,

	 
	GLU_TESS_ERROR1	= 100151,   
	GLU_TESS_ERROR2 = 100152,   
	GLU_TESS_ERROR3 = 100153,   
	GLU_TESS_ERROR4 = 100154,   
	GLU_TESS_ERROR5 = 100155,   
	GLU_TESS_ERROR6 = 100156,   
	GLU_TESS_ERROR7 = 100157,   
	GLU_TESS_ERROR8 = 100158,   
	GLU_TESS_ERROR9 = 100159,   

	 
	GLU_AUTO_LOAD_MATRIX	= 100200,
	GLU_CULLING		= 100201,
	GLU_PARAMETRIC_TOLERANCE= 100202,
	GLU_SAMPLING_TOLERANCE	= 100203,
	GLU_DISPLAY_MODE	= 100204,
	GLU_SAMPLING_METHOD	= 100205,
	GLU_U_STEP		= 100206,
	GLU_V_STEP		= 100207,

	GLU_PATH_LENGTH		= 100215,
	GLU_PARAMETRIC_ERROR	= 100216,
	GLU_DOMAIN_DISTANCE	= 100217,

	GLU_MAP1_TRIM_2		= 100210,
	GLU_MAP1_TRIM_3		= 100211,

	GLU_OUTLINE_POLYGON	= 100240,
	GLU_OUTLINE_PATCH	= 100241,

	GLU_NURBS_ERROR1  = 100251,    
	GLU_NURBS_ERROR2  = 100252,    
	GLU_NURBS_ERROR3  = 100253,    
	GLU_NURBS_ERROR4  = 100254,    
	GLU_NURBS_ERROR5  = 100255,    
	GLU_NURBS_ERROR6  = 100256,    
	GLU_NURBS_ERROR7  = 100257,    
	GLU_NURBS_ERROR8  = 100258,    
	GLU_NURBS_ERROR9  = 100259,    
	GLU_NURBS_ERROR10 = 100260,    
	GLU_NURBS_ERROR11 = 100261,    
	GLU_NURBS_ERROR12 = 100262,    
	GLU_NURBS_ERROR13 = 100263,    
	GLU_NURBS_ERROR14 = 100264,    
	GLU_NURBS_ERROR15 = 100265,    
	GLU_NURBS_ERROR16 = 100266,    
	GLU_NURBS_ERROR17 = 100267,    
	GLU_NURBS_ERROR18 = 100268,    
	GLU_NURBS_ERROR19 = 100269,    
	GLU_NURBS_ERROR20 = 100270,    
	GLU_NURBS_ERROR21 = 100271,    
	GLU_NURBS_ERROR22 = 100272,    
	GLU_NURBS_ERROR23 = 100273,    
	GLU_NURBS_ERROR24 = 100274,    
	GLU_NURBS_ERROR25 = 100275,    
	GLU_NURBS_ERROR26 = 100276,    
	GLU_NURBS_ERROR27 = 100277,    
	GLU_NURBS_ERROR28 = 100278,    
	GLU_NURBS_ERROR29 = 100279,    
	GLU_NURBS_ERROR30 = 100280,    
	GLU_NURBS_ERROR31 = 100281,    
	GLU_NURBS_ERROR32 = 100282,    
	GLU_NURBS_ERROR33 = 100283,    
	GLU_NURBS_ERROR34 = 100284,    
	GLU_NURBS_ERROR35 = 100285,    
	GLU_NURBS_ERROR36 = 100286,    
	GLU_NURBS_ERROR37 = 100287,    

	 
	GLU_INVALID_ENUM		= 100900,
	GLU_INVALID_VALUE		= 100901,
	GLU_OUT_OF_MEMORY		= 100902,
	GLU_INCOMPATIBLE_GL_VERSION	= 100903,

	 
	GLU_VERSION	= 100800,
	GLU_EXTENSIONS	= 100801
};


 


typedef struct GLUquadricObj GLUquadricObj;

typedef struct GLUtriangulatorObj GLUtriangulatorObj;

typedef struct GLUnurbsObj GLUnurbsObj;








 





extern void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
		       GLdouble centerx, GLdouble centery, GLdouble centerz,
		       GLdouble upx, GLdouble upy, GLdouble upz );


extern void gluOrtho2D( GLdouble left, GLdouble right,
		        GLdouble bottom, GLdouble top );


extern void gluPerspective( GLdouble fovy, GLdouble aspect,
			    GLdouble zNear, GLdouble zFar );


extern void gluPickMatrix( GLdouble x, GLdouble y,
			   GLdouble width, GLdouble height,
			   GLint viewport[4] );

extern GLint gluProject( GLdouble objx, GLdouble objy, GLdouble objz,
                         const GLdouble modelMatrix[16],
                         const GLdouble projMatrix[16],
                         const GLint viewport[4],
                         GLdouble *winx, GLdouble *winy, GLdouble *winz );

extern GLint gluUnProject( GLdouble winx, GLdouble winy, GLdouble winz,
                           const GLdouble modelMatrix[16],
                           const GLdouble projMatrix[16],
                           const GLint viewport[4],
                           GLdouble *objx, GLdouble *objy, GLdouble *objz );

extern const GLubyte* gluErrorString( GLenum errorCode );



 





extern GLint gluScaleImage( GLenum format,
                            GLint widthin, GLint heightin,
                            GLenum typein, const void *datain,
                            GLint widthout, GLint heightout,
                            GLenum typeout, void *dataout );

extern GLint gluBuild1DMipmaps( GLenum target, GLint components,
			        GLint width, GLenum format,
			        GLenum type, const void *data );

extern GLint gluBuild2DMipmaps( GLenum target, GLint components,
                                GLint width, GLint height, GLenum format,
                                GLenum type, const void *data );



 





extern GLUquadricObj *gluNewQuadric( void );

extern void gluDeleteQuadric( GLUquadricObj *state );

extern void gluQuadricDrawStyle( GLUquadricObj *quadObject,
				 GLenum drawStyle );

extern void gluQuadricOrientation( GLUquadricObj *quadObject,
				   GLenum orientation );

extern void gluQuadricNormals( GLUquadricObj *quadObject, GLenum normals );

extern void gluQuadricTexture( GLUquadricObj *quadObject,
			       GLboolean textureCoords );

extern void gluQuadricCallback( GLUquadricObj *qobj,
			        GLenum which, void (*fn)() );

extern void gluCylinder( GLUquadricObj *qobj,
			 GLdouble baseRadius,
			 GLdouble topRadius,
			 GLdouble height,
			 GLint slices, GLint stacks );

extern void gluSphere( GLUquadricObj *qobj,
		       GLdouble radius, GLint slices, GLint stacks );

extern void gluDisk( GLUquadricObj *qobj,
		     GLdouble innerRadius, GLdouble outerRadius,
		     GLint slices, GLint loops );

extern void gluPartialDisk( GLUquadricObj *qobj, GLdouble innerRadius,
			    GLdouble outerRadius, GLint slices, GLint loops,
			    GLdouble startAngle, GLdouble sweepAngle );



 





extern GLUnurbsObj *gluNewNurbsRenderer( void );

extern void gluDeleteNurbsRenderer( GLUnurbsObj *nobj );

extern void gluLoadSamplingMatrices( GLUnurbsObj *nobj,
				     const GLfloat modelMatrix[16],
				     const GLfloat projMatrix[16],
				     const GLint viewport[4] );

extern void gluNurbsProperty( GLUnurbsObj *nobj, GLenum property,
			      GLfloat value );

extern void gluGetNurbsProperty( GLUnurbsObj *nobj, GLenum property,
				 GLfloat *value );

extern void gluBeginCurve( GLUnurbsObj *nobj );

extern void gluEndCurve( GLUnurbsObj * nobj );

extern void gluNurbsCurve( GLUnurbsObj *nobj, GLint nknots, GLfloat *knot,
			   GLint stride, GLfloat *ctlarray, GLint order,
			   GLenum type );

extern void gluBeginSurface( GLUnurbsObj *nobj );

extern void gluEndSurface( GLUnurbsObj * nobj );

extern void gluNurbsSurface( GLUnurbsObj *nobj,
			     GLint sknot_count, GLfloat *sknot,
			     GLint tknot_count, GLfloat *tknot,
			     GLint s_stride, GLint t_stride,
			     GLfloat *ctlarray,
			     GLint sorder, GLint torder,
        	             GLenum type );

extern void gluBeginTrim( GLUnurbsObj *nobj );

extern void gluEndTrim( GLUnurbsObj *nobj );

extern void gluPwlCurve( GLUnurbsObj *nobj, GLint count, GLfloat *array,
			 GLint stride, GLenum type );

extern void gluNurbsCallback( GLUnurbsObj *nobj, GLenum which, void (*fn)() );



 





extern GLUtriangulatorObj* gluNewTess( void );

extern void gluTessCallback( GLUtriangulatorObj *tobj, GLenum which,
			      void (*fn)() );

extern void gluDeleteTess( GLUtriangulatorObj *tobj );

extern void gluBeginPolygon( GLUtriangulatorObj *tobj );

extern void gluEndPolygon( GLUtriangulatorObj *tobj );

extern void gluNextContour( GLUtriangulatorObj *tobj, GLenum type );

extern void gluTessVertex( GLUtriangulatorObj *tobj, GLdouble v[3],
			   void *data );



 





extern const GLubyte* gluGetString( GLenum name );








}




# 5 "TestToroid.C" 2

# 1 "/home/room1/kriol/local/include/glaux.h" 1 3
 

 




















 









extern "C" {




# 1 "/usr/local/ap/X11R6/include/X11/Xlib.h" 1 3
 
 



























 




















# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)types.h	1.38	95/11/14 SMI"


# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/isa_defs.h" 1 3 4
 






#pragma ident	"@(#)isa_defs.h	1.7	94/10/26 SMI"

 













































































































extern "C" {



 






# 211 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/isa_defs.h" 3 4


 






 



















 







 







}



# 14 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 2 3 4


 


# 1 "/usr/include/sys/machtypes.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)machtypes.h	1.9	94/11/05 SMI"




extern "C" {


 








typedef struct  _physadr_t { int r[1]; } *physadr_t;

typedef	struct	_label_t { int	val[2]; } label_t;



typedef	unsigned char	lock_t;		 


}



# 19 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 2 3 4



extern "C" {


 

typedef	unsigned char	uchar_t;
typedef	unsigned short	ushort_t;
typedef	unsigned int	uint_t;
typedef	unsigned long	ulong_t;

typedef	char *		caddr_t;	 
typedef	long		daddr_t;	 
typedef	long		off_t;		 
typedef	short		cnt_t;		 

typedef	ulong_t		paddr_t;	 
typedef	uchar_t		use_t;		 
typedef	short		sysid_t;
typedef	short		index_t;




typedef enum { B_FALSE, B_TRUE } boolean_t;


 








 
typedef union {
	double	_d;
	long	_l[2];
} longlong_t;
typedef union {
	double		_d;
	unsigned long	_l[2];
} u_longlong_t;





typedef	longlong_t	offset_t;
typedef	longlong_t	diskaddr_t;

 





# 88 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 3 4



typedef union {
	offset_t	_f;	 
	struct {
		long _u;	 
		off_t _l;	 
	} _p;
} lloff_t;


# 108 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 3 4



typedef union {
	diskaddr_t	_f;	 
	struct {
		long _u;	 
		daddr_t _l;	 
	} _p;
} lldaddr_t;


typedef ulong_t k_fltset_t;	 

 







typedef long		id_t;		 
					 
					 
					 
					 


 

typedef ulong_t	major_t;	 
typedef ulong_t	minor_t;	 


 

typedef short	pri_t;

 










typedef	ushort_t o_mode_t;		 
typedef short	o_dev_t;		 
typedef	ushort_t o_uid_t;		 
typedef	o_uid_t	o_gid_t;		 
typedef	short	o_nlink_t;		 
typedef short	o_pid_t;		 
typedef ushort_t o_ino_t;		 


 

typedef	int	key_t;			 
typedef	ulong_t	mode_t;			 



typedef	long	uid_t;			 


typedef	uid_t	gid_t;			 
typedef	ulong_t nlink_t;		 
typedef ulong_t	dev_t;			 
typedef ulong_t	ino_t;			 
typedef long	pid_t;			 











typedef int	ssize_t;	 
				 




typedef	long		time_t;	 




typedef	long		clock_t;  




typedef	int	clockid_t;	 




typedef	int	timer_t;	 





typedef	unsigned char	unchar;
typedef	unsigned short	ushort;
typedef	unsigned int	uint;
typedef	unsigned long	ulong;

# 237 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 3 4





 












 




typedef	long	hostid_t;

 







typedef unsigned char	u_char;
typedef unsigned short	u_short;
typedef unsigned int	u_int;
typedef unsigned long	u_long;
typedef struct _quad { long val[2]; } quad;	 


 



# 1 "/usr/include/sys/select.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)select.h	1.10	92/07/14 SMI"	


# 1 "/usr/include/sys/time.h" 1 3 4
 
 

 
 
 

 





 







#pragma ident	"@(#)time.h	2.47	95/08/24 SMI"	



 





extern "C" {






struct timeval {
	long	tv_sec;		 
	long	tv_usec;	 
};

struct timezone {
	int	tz_minuteswest;	 
	int	tz_dsttime;	 
};





}


 




# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 1 3 4
 
 

 
 
 

# 305 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 3 4

# 61 "/usr/include/sys/time.h" 2 3 4




extern "C" {

















 














 









struct	itimerval {
	struct	timeval it_interval;	 
	struct	timeval it_value;	 
};


 

















 

















 






typedef struct  timespec {		 
	time_t		tv_sec;		 
	long		tv_nsec;	 
} timespec_t;

typedef struct timespec timestruc_t;	 

# 172 "/usr/include/sys/time.h" 3 4


 









 




typedef struct itimerspec {		 
	struct timespec	it_interval;	 
	struct timespec	it_value;	 
} itimerspec_t;


 


typedef	longlong_t	hrtime_t;

# 236 "/usr/include/sys/time.h" 3 4





int adjtime(struct timeval *, struct timeval *);
int getitimer(int, struct itimerval *);
int setitimer(int, const struct itimerval *, struct itimerval *);

 

















int gettimeofday(struct timeval *, void *);
int settimeofday(struct timeval *, void *);


hrtime_t	gethrtime(void);
hrtime_t	gethrvtime(void);
# 278 "/usr/include/sys/time.h" 3 4


# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 1 3 4
 
 
 



 
 
 




#pragma ident	"@(#)time.h	1.23	95/08/28 SMI"	




extern "C" {





























struct	tm {	 
	int	tm_sec;
	int	tm_min;
	int	tm_hour;
	int	tm_mday;
	int	tm_mon;
	int	tm_year;
	int	tm_wday;
	int	tm_yday;
	int	tm_isdst;
};



extern clock_t clock(void);
extern double difftime(time_t, time_t);
extern time_t mktime(struct tm *);
extern time_t time(time_t *);
extern char *asctime(const struct tm *);
extern char *ctime(const time_t *);
extern struct tm *gmtime(const time_t *);
extern struct tm *localtime(const time_t *);
extern size_t strftime(char *, size_t, const char *, const struct tm *);



extern struct tm *gmtime_r(const time_t *, struct tm *);
extern struct tm *localtime_r(const time_t *, struct tm *);





extern char *strptime(const char *, const char *, struct tm *);






# 1 "/usr/include/sys/time.h" 1 3 4
 
 

 
 
 

 





 




# 290 "/usr/include/sys/time.h" 3 4

# 89 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 2 3 4

# 1 "/usr/include/sys/siginfo.h" 1 3 4
 
 
 



 
 
 




#pragma ident	"@(#)siginfo.h	1.36	95/08/24 SMI"	




extern "C" {




union sigval {
	int	sival_int;	 
	void	*sival_ptr;	 
};

struct sigevent {
	int		sigev_notify;	 
	union {
		int	_sigev_signo;	 
		void	(*_sigev_notify_function)(union sigval);
	} _sigev_un;
	union sigval	sigev_value;	 
	int		_sigev_pad1;
	void		*_sigev_notify_attributes;
	int		_sigev_pad2;
};


 




 


















 




# 1 "/usr/include/sys/machsig.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)machsig.h	1.10	94/11/05 SMI"
 




extern "C" {


 



 









 













 






 













 







 











}



# 71 "/usr/include/sys/siginfo.h" 2 3 4


 







 











 











 















 


# 1 "/usr/include/sys/time.h" 1 3 4
 
 

 
 
 

 





 




# 290 "/usr/include/sys/time.h" 3 4

# 124 "/usr/include/sys/siginfo.h" 2 3 4


typedef struct

	 
	siginfo

			{

	int	si_signo;			 
	int 	si_code;			 
	int	si_errno;			 

	union {

		int	_pad[((128  / sizeof (int)) - 3) ];		 

		struct {			 
			pid_t	_pid;		 
			union {
				struct {
					uid_t	_uid;
					union sigval	_value;
				} _kill;
				struct {
					clock_t _utime;
					int	_status;
					clock_t _stime;
				} _cld;
			} _pdata;
		} _proc;

		struct {	 
			caddr_t	_addr;		 
			int	_trapno;	 
		} _fault;

		struct {			 
		 
			int	_fd;		 
			long	_band;
		} _file;

		struct {			 
			caddr_t	_faddr;		 
			timestruc_t _tstamp;	 
			short	_syscall;	 
			char	_nsysarg;	 
			char	_fault;		 
			long	_sysarg[8];	 
			long	_mstate[17];	 
		} _prof;

	} _data;

} siginfo_t;

 






typedef struct k_siginfo {

	int	si_signo;			 
	int 	si_code;			 
	int	si_errno;			 

	union {
		struct {			 
			pid_t	_pid;		 
			union {
				struct {
					uid_t	_uid;
					union sigval	_value;
				} _kill;
				struct {
					clock_t _utime;
					int	_status;
					clock_t _stime;
				} _cld;
			} _pdata;
		} _proc;

		struct {	 
			caddr_t	_addr;		 
			int	_trapno;	 
		} _fault;

		struct {			 
		 
			int	_fd;		 
			long	_band;
		} _file;

		struct {			 
			caddr_t	_faddr;		 
			timestruc_t _tstamp;	 
			short	_syscall;	 
			char	_nsysarg;	 
			char	_fault;		 
			 
			 
			 
		} _prof;

	} _data;

} k_siginfo_t;

typedef struct sigqueue {
	struct sigqueue	*sq_next;
	k_siginfo_t	sq_info;
	void		(*sq_func)(struct sigqueue *);  
	void		*sq_backptr;	 
					 
} sigqueue_t;

 


























}



# 90 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 2 3 4

extern int clock_getres(clockid_t, struct timespec *);
extern int clock_gettime(clockid_t, struct timespec *);
extern int clock_settime(clockid_t, const struct timespec *);

extern int timer_create(clockid_t, struct sigevent *, timer_t *);
extern int timer_delete(timer_t);
extern int timer_getoverrun(timer_t);
extern int timer_gettime(timer_t, struct itimerspec *);
extern int timer_settime(timer_t, int, const struct itimerspec *,
		struct itimerspec *);
extern int nanosleep(const struct timespec *, struct timespec *);





extern void tzset(void);

extern char *tzname[2];


extern long _sysconf(int);	 

				 




extern long timezone;
extern int daylight;




# 138 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 3 4


# 171 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 3 4


 







# 204 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 3 4


extern char *asctime_r(const struct tm *, char *, int);
extern char *ctime_r(const time_t *, char *, int);



# 247 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/time.h" 3 4





}



# 280 "/usr/include/sys/time.h" 2 3 4







}



# 14 "/usr/include/sys/select.h" 2 3 4




extern "C" {


 













typedef	long	fd_mask;





typedef	struct fd_set {
	fd_mask	fds_bits[((( 1024  )+((  (sizeof (fd_mask) * 8 )  )-1))/(  (sizeof (fd_mask) * 8 )  )) ];
} fd_set;


















extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);






}



# 281 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/types.h" 2 3 4




 












 



}



# 51 "/usr/local/ap/X11R6/include/X11/Xlib.h" 2 3




# 1 "/usr/local/ap/X11R6/include/X11/X.h" 1 3
 



 




 

















































 

 





typedef unsigned long XID;
typedef unsigned long Mask;
typedef unsigned long Atom;
typedef unsigned long VisualID;
typedef unsigned long Time;









typedef XID Window;
typedef XID Drawable;
typedef XID Font;
typedef XID Pixmap;
typedef XID Cursor;
typedef XID Colormap;
typedef XID GContext;
typedef XID KeySym;

typedef unsigned char KeyCode;

 






























 



 





























 







































 











 












 











 









 







		       
 










 





 




 





 




 




 




 







 










 





 














# 345 "/usr/local/ap/X11R6/include/X11/X.h" 3











 



 
 




 

















 










 













 



 





 





 




 





 







 




 





 



 


















 





 






 





 






 




 




 






 




 





 




 



























 



 






 



 





 



 





 





 



 





 










 


















 














 




 



 




 




 











 





# 55 "/usr/local/ap/X11R6/include/X11/Xlib.h" 2 3


 
# 1 "/usr/local/ap/X11R6/include/X11/Xfuncproto.h" 1 3
 
 


























 



























































# 58 "/usr/local/ap/X11R6/include/X11/Xlib.h" 2 3

# 1 "/usr/local/ap/X11R6/include/X11/Xosdefs.h" 1 3
 































 








































  









































# 59 "/usr/local/ap/X11R6/include/X11/Xlib.h" 2 3









# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4
# 327 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4

# 68 "/usr/local/ap/X11R6/include/X11/Xlib.h" 2 3






typedef char *XPointer;













































 






















 


typedef struct _XExtData {
	int number;		 
	struct _XExtData *next;	 
	int (*free_private)();	 
	XPointer private_data;	 
} XExtData;

 


typedef struct {		 
	int extension;		 
	int major_opcode;	 
	int first_event;	 
	int first_error;	 
} XExtCodes;

 



typedef struct {
    int depth;
    int bits_per_pixel;
    int scanline_pad;
} XPixmapFormatValues;


 


typedef struct {
	int function;		 
	unsigned long plane_mask; 
	unsigned long foreground; 
	unsigned long background; 
	int line_width;		 
	int line_style;	 	 
	int cap_style;	  	 

	int join_style;	 	 
	int fill_style;	 	 

	int fill_rule;	  	 
	int arc_mode;		 
	Pixmap tile;		 
	Pixmap stipple;		 
	int ts_x_origin;	 
	int ts_y_origin;
        Font font;	         
	int subwindow_mode;      
	int  graphics_exposures; 
	int clip_x_origin;	 
	int clip_y_origin;
	Pixmap clip_mask;	 
	int dash_offset;	 
	char dashes;
} XGCValues;

 




typedef struct _XGC







*GC;

 


typedef struct {
	XExtData *ext_data;	 
	VisualID visualid;	 

	int c_class;		 



	unsigned long red_mask, green_mask, blue_mask;	 
	int bits_per_rgb;	 
	int map_entries;	 
} Visual;

 

	
typedef struct {
	int depth;		 
	int nvisuals;		 
	Visual *visuals;	 
} Depth;

 





struct _XDisplay;		 

typedef struct {
	XExtData *ext_data;	 
	struct _XDisplay *display; 
	Window root;		 
	int width, height;	 
	int mwidth, mheight;	 
	int ndepths;		 
	Depth *depths;		 
	int root_depth;		 
	Visual *root_visual;	 
	GC default_gc;		 
	Colormap cmap;		 
	unsigned long white_pixel;
	unsigned long black_pixel;	 
	int max_maps, min_maps;	 
	int backing_store;	 
	int  save_unders;	
	long root_input_mask;	 
} Screen;

 


typedef struct {
	XExtData *ext_data;	 
	int depth;		 
	int bits_per_pixel;	 
	int scanline_pad;	 
} ScreenFormat;

 


typedef struct {
    Pixmap background_pixmap;	 
    unsigned long background_pixel;	 
    Pixmap border_pixmap;	 
    unsigned long border_pixel;	 
    int bit_gravity;		 
    int win_gravity;		 
    int backing_store;		 
    unsigned long backing_planes; 
    unsigned long backing_pixel; 
    int  save_under;		 
    long event_mask;		 
    long do_not_propagate_mask;	 
    int  override_redirect;	 
    Colormap colormap;		 
    Cursor cursor;		 
} XSetWindowAttributes;

typedef struct {
    int x, y;			 
    int width, height;		 
    int border_width;		 
    int depth;          	 
    Visual *visual;		 
    Window root;        	 

    int c_class;		 



    int bit_gravity;		 
    int win_gravity;		 
    int backing_store;		 
    unsigned long backing_planes; 
    unsigned long backing_pixel; 
    int  save_under;		 
    Colormap colormap;		 
    int  map_installed;		 
    int map_state;		 
    long all_event_masks;	 
    long your_event_mask;	 
    long do_not_propagate_mask;  
    int  override_redirect;	 
    Screen *screen;		 
} XWindowAttributes;

 




typedef struct {
	int family;		 
	int length;		 
	char *address;		 
} XHostAddress;

 


typedef struct _XImage {
    int width, height;		 
    int xoffset;		 
    int format;			 
    char *data;			 
    int byte_order;		 
    int bitmap_unit;		 
    int bitmap_bit_order;	 
    int bitmap_pad;		 
    int depth;			 
    int bytes_per_line;		 
    int bits_per_pixel;		 
    unsigned long red_mask;	 
    unsigned long green_mask;
    unsigned long blue_mask;
    XPointer obdata;		 
    struct funcs {		 
	struct _XImage *(*create_image)();

	int (*destroy_image)        (struct _XImage *);
	unsigned long (*get_pixel)  (struct _XImage *, int, int);
	int (*put_pixel)            (struct _XImage *, int, int, unsigned long);
	struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int);
	int (*add_pixel)            (struct _XImage *, long);







	} f;
} XImage;

 


typedef struct {
    int x, y;
    int width, height;
    int border_width;
    Window sibling;
    int stack_mode;
} XWindowChanges;

 


typedef struct {
	unsigned long pixel;
	unsigned short red, green, blue;
	char flags;   
	char pad;
} XColor;

 




typedef struct {
    short x1, y1, x2, y2;
} XSegment;

typedef struct {
    short x, y;
} XPoint;
    
typedef struct {
    short x, y;
    unsigned short width, height;
} XRectangle;
    
typedef struct {
    short x, y;
    unsigned short width, height;
    short angle1, angle2;
} XArc;


 

typedef struct {
        int key_click_percent;
        int bell_percent;
        int bell_pitch;
        int bell_duration;
        int led;
        int led_mode;
        int key;
        int auto_repeat_mode;    
} XKeyboardControl;

 

typedef struct {
        int key_click_percent;
	int bell_percent;
	unsigned int bell_pitch, bell_duration;
	unsigned long led_mask;
	int global_auto_repeat;
	char auto_repeats[32];
} XKeyboardState;

 

typedef struct {
        Time time;
	short x, y;
} XTimeCoord;

 

typedef struct {
 	int max_keypermod;	 
 	KeyCode *modifiermap;	 
} XModifierKeymap;


 





typedef struct _XDisplay Display;


struct _XPrivate;		 
struct _XrmHashBucketRec;

typedef struct 



{
	XExtData *ext_data;	 
	struct _XPrivate *private1;
	int fd;			 
	int private2;
	int proto_major_version; 
	int proto_minor_version; 
	char *vendor;		 
        XID private3;
	XID private4;
	XID private5;
	int private6;
	XID (*resource_alloc)(); 
	int byte_order;		 
	int bitmap_unit;	 
	int bitmap_pad;		 
	int bitmap_bit_order;	 
	int nformats;		 
	ScreenFormat *pixmap_format;	 
	int private8;
	int release;		 
	struct _XPrivate *private9, *private10;
	int qlen;		 
	unsigned long last_request_read;  
	unsigned long request;	 
	XPointer private11;
	XPointer private12;
	XPointer private13;
	XPointer private14;
	unsigned max_request_size;  
	struct _XrmHashBucketRec *db;
	int (*private15)();
	char *display_name;	 
	int default_screen;	 
	int nscreens;		 
	Screen *screens;	 
	unsigned long motion_buffer;	 
	unsigned long private16;
	int min_keycode;	 
	int max_keycode;	 
	XPointer private17;
	XPointer private18;
	int private19;
	char *xdefaults;	 
	 
}



*_XPrivDisplay;





 


typedef struct {
	int type;		 
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;	         
	Window root;	         
	Window subwindow;	 
	Time time;		 
	int x, y;		 
	int x_root, y_root;	 
	unsigned int state;	 
	unsigned int keycode;	 
	int  same_screen;	 
} XKeyEvent;
typedef XKeyEvent XKeyPressedEvent;
typedef XKeyEvent XKeyReleasedEvent;

typedef struct {
	int type;		 
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;	         
	Window root;	         
	Window subwindow;	 
	Time time;		 
	int x, y;		 
	int x_root, y_root;	 
	unsigned int state;	 
	unsigned int button;	 
	int  same_screen;	 
} XButtonEvent;
typedef XButtonEvent XButtonPressedEvent;
typedef XButtonEvent XButtonReleasedEvent;

typedef struct {
	int type;		 
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;	         
	Window root;	         
	Window subwindow;	 
	Time time;		 
	int x, y;		 
	int x_root, y_root;	 
	unsigned int state;	 
	char is_hint;		 
	int  same_screen;	 
} XMotionEvent;
typedef XMotionEvent XPointerMovedEvent;

typedef struct {
	int type;		 
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;	         
	Window root;	         
	Window subwindow;	 
	Time time;		 
	int x, y;		 
	int x_root, y_root;	 
	int mode;		 
	int detail;
	 



	int  same_screen;	 
	int  focus;		 
	unsigned int state;	 
} XCrossingEvent;
typedef XCrossingEvent XEnterWindowEvent;
typedef XCrossingEvent XLeaveWindowEvent;

typedef struct {
	int type;		 
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;		 
	int mode;		 
	int detail;
	 




} XFocusChangeEvent;
typedef XFocusChangeEvent XFocusInEvent;
typedef XFocusChangeEvent XFocusOutEvent;

 
typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	char key_vector[32];
} XKeymapEvent;	

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	int x, y;
	int width, height;
	int count;		 
} XExposeEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Drawable drawable;
	int x, y;
	int width, height;
	int count;		 
	int major_code;		 
	int minor_code;		 
} XGraphicsExposeEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Drawable drawable;
	int major_code;		 
	int minor_code;		 
} XNoExposeEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	int state;		 
} XVisibilityEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window parent;		 
	Window window;		 
	int x, y;		 
	int width, height;	 
	int border_width;	 
	int  override_redirect;	 
} XCreateWindowEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
} XDestroyWindowEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	int  from_configure;
} XUnmapEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	int  override_redirect;	 
} XMapEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window parent;
	Window window;
} XMapRequestEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	Window parent;
	int x, y;
	int  override_redirect;
} XReparentEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	int x, y;
	int width, height;
	int border_width;
	Window above;
	int  override_redirect;
} XConfigureEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	int x, y;
} XGravityEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	int width, height;
} XResizeRequestEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window parent;
	Window window;
	int x, y;
	int width, height;
	int border_width;
	Window above;
	int detail;		 
	unsigned long value_mask;
} XConfigureRequestEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window event;
	Window window;
	int place;		 
} XCirculateEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window parent;
	Window window;
	int place;		 
} XCirculateRequestEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	Atom atom;
	Time time;
	int state;		 
} XPropertyEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	Atom selection;
	Time time;
} XSelectionClearEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window owner;
	Window requestor;
	Atom selection;
	Atom target;
	Atom property;
	Time time;
} XSelectionRequestEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window requestor;
	Atom selection;
	Atom target;
	Atom property;		 
	Time time;
} XSelectionEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	Colormap colormap;	 

	int  c_new;		 



	int state;		 
} XColormapEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;
	Atom message_type;
	int format;
	union {
		char b[20];
		short s[10];
		long l[5];
		} data;
} XClientMessageEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display;	 
	Window window;		 
	int request;		 

	int first_keycode;	 
	int count;		 
} XMappingEvent;

typedef struct {
	int type;
	Display *display;	 
	XID resourceid;		 
	unsigned long serial;	 
	unsigned char error_code;	 
	unsigned char request_code;	 
	unsigned char minor_code;	 
} XErrorEvent;

typedef struct {
	int type;
	unsigned long serial;	 
	int  send_event;	 
	Display *display; 
	Window window;	 
} XAnyEvent;

 



typedef union _XEvent {
        int type;		 
	XAnyEvent xany;
	XKeyEvent xkey;
	XButtonEvent xbutton;
	XMotionEvent xmotion;
	XCrossingEvent xcrossing;
	XFocusChangeEvent xfocus;
	XExposeEvent xexpose;
	XGraphicsExposeEvent xgraphicsexpose;
	XNoExposeEvent xnoexpose;
	XVisibilityEvent xvisibility;
	XCreateWindowEvent xcreatewindow;
	XDestroyWindowEvent xdestroywindow;
	XUnmapEvent xunmap;
	XMapEvent xmap;
	XMapRequestEvent xmaprequest;
	XReparentEvent xreparent;
	XConfigureEvent xconfigure;
	XGravityEvent xgravity;
	XResizeRequestEvent xresizerequest;
	XConfigureRequestEvent xconfigurerequest;
	XCirculateEvent xcirculate;
	XCirculateRequestEvent xcirculaterequest;
	XPropertyEvent xproperty;
	XSelectionClearEvent xselectionclear;
	XSelectionRequestEvent xselectionrequest;
	XSelectionEvent xselection;
	XColormapEvent xcolormap;
	XClientMessageEvent xclient;
	XMappingEvent xmapping;
	XErrorEvent xerror;
	XKeymapEvent xkeymap;
	long pad[24];
} XEvent;




 


typedef struct {
    short	lbearing;	 
    short	rbearing;	 
    short	width;		 
    short	ascent;		 
    short	descent;	 
    unsigned short attributes;	 
} XCharStruct;

 



typedef struct {
    Atom name;
    unsigned long card32;
} XFontProp;

typedef struct {
    XExtData	*ext_data;	 
    Font        fid;             
    unsigned	direction;	 
    unsigned	min_char_or_byte2; 
    unsigned	max_char_or_byte2; 
    unsigned	min_byte1;	 
    unsigned	max_byte1;	 
    int 	all_chars_exist; 
    unsigned	default_char;	 
    int         n_properties;    
    XFontProp	*properties;	 
    XCharStruct	min_bounds;	 
    XCharStruct	max_bounds;	 
    XCharStruct	*per_char;	 
    int		ascent;		 
    int		descent;	 
} XFontStruct;

 


typedef struct {
    char *chars;		 
    int nchars;			 
    int delta;			 
    Font font;			 
} XTextItem;

typedef struct {		 
    unsigned char byte1;
    unsigned char byte2;
} XChar2b;

typedef struct {
    XChar2b *chars;		 
    int nchars;			 
    int delta;			 
    Font font;			 
} XTextItem16;


typedef union { Display *display;
		GC gc;
		Visual *visual;
		Screen *screen;
		ScreenFormat *pixmap_format;
		XFontStruct *font; } XEDataObject;

typedef struct {
    XRectangle      max_ink_extent;
    XRectangle      max_logical_extent;
} XFontSetExtents;

typedef void (*XOMProc)();

typedef struct _XOM *XOM;
typedef struct _XOC *XOC, *XFontSet;

typedef struct {
    char           *chars;
    int             nchars;
    int             delta;
    XFontSet        font_set;
} XmbTextItem;

typedef struct {
    wchar_t        *chars;
    int             nchars;
    int             delta;
    XFontSet        font_set;
} XwcTextItem;












typedef struct {
    int charset_count;
    char **charset_list;
} XOMCharSetList;

typedef enum {
    XOMOrientation_LTR_TTB,
    XOMOrientation_RTL_TTB,
    XOMOrientation_TTB_LTR,
    XOMOrientation_TTB_RTL,
    XOMOrientation_Context
} XOrientation;

typedef struct {
    int num_orientation;
    XOrientation *orientation;	 
} XOMOrientation;

typedef struct {
    int num_font;
    XFontStruct **font_struct_list;
    char **font_name_list;
} XOMFontInfo;

typedef void (*XIMProc)();

typedef struct _XIM *XIM;
typedef struct _XIC *XIC;

typedef unsigned long XIMStyle;

typedef struct {
    unsigned short count_styles;
    XIMStyle *supported_styles;
} XIMStyles;






























































typedef void *XVaNestedList;




typedef struct {
    XPointer client_data;
    XIMProc callback;
} XIMCallback;

typedef unsigned long XIMFeedback;











typedef struct _XIMText {
    unsigned short length;
    XIMFeedback *feedback;
    int  encoding_is_wchar; 
    union {
	char *multi_byte;
	wchar_t *wide_char;
    } string; 
} XIMText;

typedef	unsigned long	 XIMPreeditState;





typedef	struct	_XIMPreeditStateNotifyCallbackStruct {
    XIMPreeditState state;
} XIMPreeditStateNotifyCallbackStruct;

typedef	unsigned long	 XIMResetState;




typedef unsigned long XIMStringConversionFeedback;








typedef struct _XIMStringConversionText {
    unsigned short length;
    XIMStringConversionFeedback *feedback;
    int  encoding_is_wchar; 
    union {
	char *mbs;
	wchar_t *wcs;
    } string; 
} XIMStringConversionText;

typedef	unsigned short	XIMStringConversionPosition;

typedef	unsigned short	XIMStringConversionType;






typedef	unsigned short	XIMStringConversionOperation;




typedef enum {
    XIMForwardChar, XIMBackwardChar,
    XIMForwardWord, XIMBackwardWord,
    XIMCaretUp, XIMCaretDown,
    XIMNextLine, XIMPreviousLine,
    XIMLineStart, XIMLineEnd, 
    XIMAbsolutePosition,
    XIMDontChange
} XIMCaretDirection;

typedef struct _XIMStringConversionCallbackStruct {
    XIMStringConversionPosition position;
    XIMCaretDirection direction;
    XIMStringConversionOperation operation;
    unsigned short factor;
    XIMStringConversionText *text;
} XIMStringConversionCallbackStruct;

typedef struct _XIMPreeditDrawCallbackStruct {
    int caret;		 
    int chg_first;	 
    int chg_length;	 
    XIMText *text;
} XIMPreeditDrawCallbackStruct;

typedef enum {
    XIMIsInvisible,	  
    XIMIsPrimary,	 
    XIMIsSecondary	 
} XIMCaretStyle;

typedef struct _XIMPreeditCaretCallbackStruct {
    int position;		  
    XIMCaretDirection direction;  
    XIMCaretStyle style;	  
} XIMPreeditCaretCallbackStruct;

typedef enum {
    XIMTextType,
    XIMBitmapType
} XIMStatusDataType;
	
typedef struct _XIMStatusDrawCallbackStruct {
    XIMStatusDataType type;
    union {
	XIMText *text;
	Pixmap  bitmap;
    } data;
} XIMStatusDrawCallbackStruct;

typedef struct _XIMHotKeyTrigger {
    KeySym	 keysym;
    int		 modifier;
    int		 modifier_mask;
} XIMHotKeyTrigger;

typedef struct _XIMHotKeyTriggers {
    int			 num_hot_key;
    XIMHotKeyTrigger	*key;
} XIMHotKeyTriggers;

typedef	unsigned long	 XIMHotKeyState;




typedef struct {
    unsigned short count_values;
    char **supported_values;
} XIMValuesList;

extern "C" { 





extern int _Xdebug;

extern XFontStruct *XLoadQueryFont(

    Display*		 ,
    const  char*	 

);

extern XFontStruct *XQueryFont(

    Display*		 ,
    XID			 

);


extern XTimeCoord *XGetMotionEvents(

    Display*		 ,
    Window		 ,
    Time		 ,
    Time		 ,
    int*		 

);

extern XModifierKeymap *XDeleteModifiermapEntry(

    XModifierKeymap*	 ,

    unsigned int	 ,



    int			 

);

extern XModifierKeymap	*XGetModifierMapping(

    Display*		 

);

extern XModifierKeymap	*XInsertModifiermapEntry(

    XModifierKeymap*	 ,

    unsigned int	 ,



    int			     

);

extern XModifierKeymap *XNewModifiermap(

    int			 

);

extern XImage *XCreateImage(

    Display*		 ,
    Visual*		 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    char*		 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 

);
extern int  XInitImage(

    XImage*		 

);
extern XImage *XGetImage(

    Display*		 ,
    Drawable		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned long	 ,
    int			 

);
extern XImage *XGetSubImage(

    Display*		 ,
    Drawable		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned long	 ,
    int			 ,
    XImage*		 ,
    int			 ,
    int			 

);

 


extern Display *XOpenDisplay(

    const  char*	 

);

extern void XrmInitialize(

    void

);

extern char *XFetchBytes(

    Display*		 ,
    int*		 

);
extern char *XFetchBuffer(

    Display*		 ,
    int*		 ,
    int			 

);
extern char *XGetAtomName(

    Display*		 ,
    Atom		 

);
extern int  XGetAtomNames(

    Display*		 ,
    Atom*		 ,
    int			 ,
    char**		 

);
extern char *XGetDefault(

    Display*		 ,
    const  char*	 ,
    const  char*	 		  

);
extern char *XDisplayName(

    const  char*	 

);
extern char *XKeysymToString(

    KeySym		 

);

extern int (*XSynchronize(

    Display*		 ,
    int 		 

))();
extern int (*XSetAfterFunction(

    Display*		 ,
    int (*) (

	     Display*	 

            )		 

))();
extern Atom XInternAtom(

    Display*		 ,
    const  char*	 ,
    int 		 		 

);
extern int  XInternAtoms(

    Display*		 ,
    char**		 ,
    int			 ,
    int 		 ,
    Atom*		 

);
extern Colormap XCopyColormapAndFree(

    Display*		 ,
    Colormap		 

);
extern Colormap XCreateColormap(

    Display*		 ,
    Window		 ,
    Visual*		 ,
    int			 			 

);
extern Cursor XCreatePixmapCursor(

    Display*		 ,
    Pixmap		 ,
    Pixmap		 ,
    XColor*		 ,
    XColor*		 ,
    unsigned int	 ,
    unsigned int	 			   

);
extern Cursor XCreateGlyphCursor(

    Display*		 ,
    Font		 ,
    Font		 ,
    unsigned int	 ,
    unsigned int	 ,
    XColor*		 ,
    XColor*		 

);
extern Cursor XCreateFontCursor(

    Display*		 ,
    unsigned int	 

);
extern Font XLoadFont(

    Display*		 ,
    const  char*	 

);
extern GC XCreateGC(

    Display*		 ,
    Drawable		 ,
    unsigned long	 ,
    XGCValues*		 

);
extern GContext XGContextFromGC(

    GC			 

);
extern void XFlushGC(

    Display*		 ,
    GC			 

);
extern Pixmap XCreatePixmap(

    Display*		 ,
    Drawable		 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int	 		        

);
extern Pixmap XCreateBitmapFromData(

    Display*		 ,
    Drawable		 ,
    const  char*	 ,
    unsigned int	 ,
    unsigned int	 

);
extern Pixmap XCreatePixmapFromBitmapData(

    Display*		 ,
    Drawable		 ,
    char*		 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned long	 ,
    unsigned long	 ,
    unsigned int	 

);
extern Window XCreateSimpleWindow(

    Display*		 ,
    Window		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned long	 ,
    unsigned long	 

);
extern Window XGetSelectionOwner(

    Display*		 ,
    Atom		 

);
extern Window XCreateWindow(

    Display*		 ,
    Window		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    unsigned int	 ,
    Visual*		 ,
    unsigned long	 ,
    XSetWindowAttributes*	 

); 
extern Colormap *XListInstalledColormaps(

    Display*		 ,
    Window		 ,
    int*		 

);
extern char **XListFonts(

    Display*		 ,
    const  char*	 ,
    int			 ,
    int*		 

);
extern char **XListFontsWithInfo(

    Display*		 ,
    const  char*	 ,
    int			 ,
    int*		 ,
    XFontStruct**	 

);
extern char **XGetFontPath(

    Display*		 ,
    int*		 

);
extern char **XListExtensions(

    Display*		 ,
    int*		 

);
extern Atom *XListProperties(

    Display*		 ,
    Window		 ,
    int*		 

);
extern XHostAddress *XListHosts(

    Display*		 ,
    int*		 ,
    int *		 

);
extern KeySym XKeycodeToKeysym(

    Display*		 ,

    unsigned int	 ,



    int			 

);
extern KeySym XLookupKeysym(

    XKeyEvent*		 ,
    int			 

);
extern KeySym *XGetKeyboardMapping(

    Display*		 ,

    unsigned int	 ,



    int			 ,
    int*		 

);
extern KeySym XStringToKeysym(

    const  char*	 

);
extern long XMaxRequestSize(

    Display*		 

);
extern long XExtendedMaxRequestSize(

    Display*		 

);
extern char *XResourceManagerString(

    Display*		 

);
extern char *XScreenResourceString(

	Screen*		 

);
extern unsigned long XDisplayMotionBufferSize(

    Display*		 

);
extern VisualID XVisualIDFromVisual(

    Visual*		 

);

 

extern int  XInitThreads(

    void

);

extern void XLockDisplay(

    Display*		 

);

extern void XUnlockDisplay(

    Display*		 

);

 

extern XExtCodes *XInitExtension(

    Display*		 ,
    const  char*	 

);

extern XExtCodes *XAddExtension(

    Display*		 

);
extern XExtData *XFindOnExtensionList(

    XExtData**		 ,
    int			 

);
extern XExtData **XEHeadOfExtensionList(

    XEDataObject	 

);

 
extern Window XRootWindow(

    Display*		 ,
    int			 

);
extern Window XDefaultRootWindow(

    Display*		 

);
extern Window XRootWindowOfScreen(

    Screen*		 

);
extern Visual *XDefaultVisual(

    Display*		 ,
    int			 

);
extern Visual *XDefaultVisualOfScreen(

    Screen*		 

);
extern GC XDefaultGC(

    Display*		 ,
    int			 

);
extern GC XDefaultGCOfScreen(

    Screen*		 

);
extern unsigned long XBlackPixel(

    Display*		 ,
    int			 

);
extern unsigned long XWhitePixel(

    Display*		 ,
    int			 

);
extern unsigned long XAllPlanes(

    void

);
extern unsigned long XBlackPixelOfScreen(

    Screen*		 

);
extern unsigned long XWhitePixelOfScreen(

    Screen*		 

);
extern unsigned long XNextRequest(

    Display*		 

);
extern unsigned long XLastKnownRequestProcessed(

    Display*		 

);
extern char *XServerVendor(

    Display*		 

);
extern char *XDisplayString(

    Display*		 

);
extern Colormap XDefaultColormap(

    Display*		 ,
    int			 

);
extern Colormap XDefaultColormapOfScreen(

    Screen*		 

);
extern Display *XDisplayOfScreen(

    Screen*		 

);
extern Screen *XScreenOfDisplay(

    Display*		 ,
    int			 

);
extern Screen *XDefaultScreenOfDisplay(

    Display*		 

);
extern long XEventMaskOfScreen(

    Screen*		 

);

extern int XScreenNumberOfScreen(

    Screen*		 

);

typedef int (*XErrorHandler) (	     

    Display*		 ,
    XErrorEvent*	 

);

extern XErrorHandler XSetErrorHandler (

    XErrorHandler	 

);


typedef int (*XIOErrorHandler) (     

    Display*		 

);

extern XIOErrorHandler XSetIOErrorHandler (

    XIOErrorHandler	 

);


extern XPixmapFormatValues *XListPixmapFormats(

    Display*		 ,
    int*		 

);
extern int *XListDepths(

    Display*		 ,
    int			 ,
    int*		 

);

 
 
extern int  XReconfigureWMWindow(

    Display*		 ,
    Window		 ,
    int			 ,
    unsigned int	 ,
    XWindowChanges*	 

);

extern int  XGetWMProtocols(

    Display*		 ,
    Window		 ,
    Atom**		 ,
    int*		 

);
extern int  XSetWMProtocols(

    Display*		 ,
    Window		 ,
    Atom*		 ,
    int			 

);
extern int  XIconifyWindow(

    Display*		 ,
    Window		 ,
    int			 

);
extern int  XWithdrawWindow(

    Display*		 ,
    Window		 ,
    int			 

);
extern int  XGetCommand(

    Display*		 ,
    Window		 ,
    char***		 ,
    int*		 

);
extern int  XGetWMColormapWindows(

    Display*		 ,
    Window		 ,
    Window**		 ,
    int*		 

);
extern int  XSetWMColormapWindows(

    Display*		 ,
    Window		 ,
    Window*		 ,
    int			 

);
extern void XFreeStringList(

    char**		 

);
extern XSetTransientForHint(

    Display*		 ,
    Window		 ,
    Window		 

);

 

extern XActivateScreenSaver(

    Display*		 

);

extern XAddHost(

    Display*		 ,
    XHostAddress*	 

);

extern XAddHosts(

    Display*		 ,
    XHostAddress*	 ,
    int			     

);

extern XAddToExtensionList(

    struct _XExtData**	 ,
    XExtData*		 

);

extern XAddToSaveSet(

    Display*		 ,
    Window		 

);

extern int  XAllocColor(

    Display*		 ,
    Colormap		 ,
    XColor*		 

);

extern int  XAllocColorCells(

    Display*		 ,
    Colormap		 ,
    int 	         ,
    unsigned long*	 ,
    unsigned int	 ,
    unsigned long*	 ,
    unsigned int 	 

);

extern int  XAllocColorPlanes(

    Display*		 ,
    Colormap		 ,
    int 		 ,
    unsigned long*	 ,
    int			 ,
    int			 ,
    int			 ,
    int			 ,
    unsigned long*	 ,
    unsigned long*	 ,
    unsigned long*	 

);

extern int  XAllocNamedColor(

    Display*		 ,
    Colormap		 ,
    const  char*	 ,
    XColor*		 ,
    XColor*		 

);

extern XAllowEvents(

    Display*		 ,
    int			 ,
    Time		 

);

extern XAutoRepeatOff(

    Display*		 

);

extern XAutoRepeatOn(

    Display*		 

);

extern XBell(

    Display*		 ,
    int			 

);

extern int XBitmapBitOrder(

    Display*		 

);

extern int XBitmapPad(

    Display*		 

);

extern int XBitmapUnit(

    Display*		 

);

extern int XCellsOfScreen(

    Screen*		 

);

extern XChangeActivePointerGrab(

    Display*		 ,
    unsigned int	 ,
    Cursor		 ,
    Time		 

);

extern XChangeGC(

    Display*		 ,
    GC			 ,
    unsigned long	 ,
    XGCValues*		 

);

extern XChangeKeyboardControl(

    Display*		 ,
    unsigned long	 ,
    XKeyboardControl*	 

);

extern XChangeKeyboardMapping(

    Display*		 ,
    int			 ,
    int			 ,
    KeySym*		 ,
    int			 

);

extern XChangePointerControl(

    Display*		 ,
    int 		 ,
    int 		 ,
    int			 ,
    int			 ,
    int			 

);

extern XChangeProperty(

    Display*		 ,
    Window		 ,
    Atom		 ,
    Atom		 ,
    int			 ,
    int			 ,
    const  unsigned char*	 ,
    int			 

);

extern XChangeSaveSet(

    Display*		 ,
    Window		 ,
    int			 

);

extern XChangeWindowAttributes(

    Display*		 ,
    Window		 ,
    unsigned long	 ,
    XSetWindowAttributes*  

);

extern int  XCheckIfEvent(

    Display*		 ,
    XEvent*		 ,
    int  (*) (

	       Display*			 ,
               XEvent*			 ,
               XPointer			 

             )		 ,
    XPointer		 

);

extern int  XCheckMaskEvent(

    Display*		 ,
    long		 ,
    XEvent*		 

);

extern int  XCheckTypedEvent(

    Display*		 ,
    int			 ,
    XEvent*		 

);

extern int  XCheckTypedWindowEvent(

    Display*		 ,
    Window		 ,
    int			 ,
    XEvent*		 

);

extern int  XCheckWindowEvent(

    Display*		 ,
    Window		 ,
    long		 ,
    XEvent*		 

);

extern XCirculateSubwindows(

    Display*		 ,
    Window		 ,
    int			 

);

extern XCirculateSubwindowsDown(

    Display*		 ,
    Window		 

);

extern XCirculateSubwindowsUp(

    Display*		 ,
    Window		 

);

extern XClearArea(

    Display*		 ,
    Window		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int 		 

);

extern XClearWindow(

    Display*		 ,
    Window		 

);

extern XCloseDisplay(

    Display*		 

);

extern XConfigureWindow(

    Display*		 ,
    Window		 ,
    unsigned int	 ,
    XWindowChanges*	 		 

);

extern int XConnectionNumber(

    Display*		 

);

extern XConvertSelection(

    Display*		 ,
    Atom		 ,
    Atom 		 ,
    Atom		 ,
    Window		 ,
    Time		 

);

extern XCopyArea(

    Display*		 ,
    Drawable		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 

);

extern XCopyGC(

    Display*		 ,
    GC			 ,
    unsigned long	 ,
    GC			 

);

extern XCopyPlane(

    Display*		 ,
    Drawable		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    unsigned long	 

);

extern int XDefaultDepth(

    Display*		 ,
    int			 

);

extern int XDefaultDepthOfScreen(

    Screen*		 

);

extern int XDefaultScreen(

    Display*		 

);

extern XDefineCursor(

    Display*		 ,
    Window		 ,
    Cursor		 

);

extern XDeleteProperty(

    Display*		 ,
    Window		 ,
    Atom		 

);

extern XDestroyWindow(

    Display*		 ,
    Window		 

);

extern XDestroySubwindows(

    Display*		 ,
    Window		 

);

extern int XDoesBackingStore(

    Screen*		     

);

extern int  XDoesSaveUnders(

    Screen*		 

);

extern XDisableAccessControl(

    Display*		 

);


extern int XDisplayCells(

    Display*		 ,
    int			 

);

extern int XDisplayHeight(

    Display*		 ,
    int			 

);

extern int XDisplayHeightMM(

    Display*		 ,
    int			 

);

extern XDisplayKeycodes(

    Display*		 ,
    int*		 ,
    int*		 

);

extern int XDisplayPlanes(

    Display*		 ,
    int			 

);

extern int XDisplayWidth(

    Display*		 ,
    int			 

);

extern int XDisplayWidthMM(

    Display*		 ,
    int			 

);

extern XDrawArc(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 

);

extern XDrawArcs(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XArc*		 ,
    int			 

);

extern XDrawImageString(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  char*	 ,
    int			 

);

extern XDrawImageString16(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  XChar2b*	 ,
    int			 

);

extern XDrawLine(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    int			 ,
    int			 

);

extern XDrawLines(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XPoint*		 ,
    int			 ,
    int			 

);

extern XDrawPoint(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 

);

extern XDrawPoints(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XPoint*		 ,
    int			 ,
    int			 

);

extern XDrawRectangle(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 

);

extern XDrawRectangles(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XRectangle*		 ,
    int			 

);

extern XDrawSegments(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XSegment*		 ,
    int			 

);

extern XDrawString(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  char*	 ,
    int			 

);

extern XDrawString16(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  XChar2b*	 ,
    int			 

);

extern XDrawText(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    XTextItem*		 ,
    int			 

);

extern XDrawText16(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    XTextItem16*	 ,
    int			 

);

extern XEnableAccessControl(

    Display*		 

);

extern int XEventsQueued(

    Display*		 ,
    int			 

);

extern int  XFetchName(

    Display*		 ,
    Window		 ,
    char**		 

);

extern XFillArc(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 

);

extern XFillArcs(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XArc*		 ,
    int			 

);

extern XFillPolygon(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XPoint*		 ,
    int			 ,
    int			 ,
    int			 

);

extern XFillRectangle(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 

);

extern XFillRectangles(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XRectangle*		 ,
    int			 

);

extern XFlush(

    Display*		 

);

extern XForceScreenSaver(

    Display*		 ,
    int			 

);

extern XFree(

    void*		 

);

extern XFreeColormap(

    Display*		 ,
    Colormap		 

);

extern XFreeColors(

    Display*		 ,
    Colormap		 ,
    unsigned long*	 ,
    int			 ,
    unsigned long	 

);

extern XFreeCursor(

    Display*		 ,
    Cursor		 

);

extern XFreeExtensionList(

    char**		     

);

extern XFreeFont(

    Display*		 ,
    XFontStruct*	 

);

extern XFreeFontInfo(

    char**		 ,
    XFontStruct*	 ,
    int			 

);

extern XFreeFontNames(

    char**		 

);

extern XFreeFontPath(

    char**		 

);

extern XFreeGC(

    Display*		 ,
    GC			 

);

extern XFreeModifiermap(

    XModifierKeymap*	 

);

extern XFreePixmap(

    Display*		 ,
    Pixmap		 

);

extern int XGeometry(

    Display*		 ,
    int			 ,
    const  char*	 ,
    const  char*	 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    int*		 ,
    int*		 ,
    int*		 ,
    int*		 

);

extern XGetErrorDatabaseText(

    Display*		 ,
    const  char*	 ,
    const  char*	 ,
    const  char*	 ,
    char*		 ,
    int			 

);

extern XGetErrorText(

    Display*		 ,
    int			 ,
    char*		 ,
    int			 

);

extern int  XGetFontProperty(

    XFontStruct*	 ,
    Atom		 ,
    unsigned long*	 

);

extern int  XGetGCValues(

    Display*		 ,
    GC			 ,
    unsigned long	 ,
    XGCValues*		 

);

extern int  XGetGeometry(

    Display*		 ,
    Drawable		 ,
    Window*		 ,
    int*		 ,
    int*		 ,
    unsigned int*	 ,
    unsigned int*	 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern int  XGetIconName(

    Display*		 ,
    Window		 ,
    char**		 

);

extern XGetInputFocus(

    Display*		 ,
    Window*		 ,
    int*		 

);

extern XGetKeyboardControl(

    Display*		 ,
    XKeyboardState*	 

);

extern XGetPointerControl(

    Display*		 ,
    int*		 ,
    int*		 ,
    int*		 

);

extern int XGetPointerMapping(

    Display*		 ,
    unsigned char*	 ,
    int			 

);

extern XGetScreenSaver(

    Display*		 ,
    int*		 ,
    int*		 ,
    int*		 ,
    int*		 

);

extern int  XGetTransientForHint(

    Display*		 ,
    Window		 ,
    Window*		 

);

extern int XGetWindowProperty(

    Display*		 ,
    Window		 ,
    Atom		 ,
    long		 ,
    long		 ,
    int 		 ,
    Atom		 ,
    Atom*		 ,
    int*		 ,
    unsigned long*	 ,
    unsigned long*	 ,
    unsigned char**	 

);

extern int  XGetWindowAttributes(

    Display*		 ,
    Window		 ,
    XWindowAttributes*	 

);

extern XGrabButton(

    Display*		 ,
    unsigned int	 ,
    unsigned int	 ,
    Window		 ,
    int 		 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    Window		 ,
    Cursor		 

);

extern XGrabKey(

    Display*		 ,
    int			 ,
    unsigned int	 ,
    Window		 ,
    int 		 ,
    int			 ,
    int			 

);

extern int XGrabKeyboard(

    Display*		 ,
    Window		 ,
    int 		 ,
    int			 ,
    int			 ,
    Time		 

);

extern int XGrabPointer(

    Display*		 ,
    Window		 ,
    int 		 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    Window		 ,
    Cursor		 ,
    Time		 

);

extern XGrabServer(

    Display*		 

);

extern int XHeightMMOfScreen(

    Screen*		 

);

extern int XHeightOfScreen(

    Screen*		 

);

extern XIfEvent(

    Display*		 ,
    XEvent*		 ,
    int  (*) (

	       Display*			 ,
               XEvent*			 ,
               XPointer			 

             )		 ,
    XPointer		 

);

extern int XImageByteOrder(

    Display*		 

);

extern XInstallColormap(

    Display*		 ,
    Colormap		 

);

extern KeyCode XKeysymToKeycode(

    Display*		 ,
    KeySym		 

);

extern XKillClient(

    Display*		 ,
    XID			 

);

extern int  XLookupColor(

    Display*		 ,
    Colormap		 ,
    const  char*	 ,
    XColor*		 ,
    XColor*		 

);

extern XLowerWindow(

    Display*		 ,
    Window		 

);

extern XMapRaised(

    Display*		 ,
    Window		 

);

extern XMapSubwindows(

    Display*		 ,
    Window		 

);

extern XMapWindow(

    Display*		 ,
    Window		 

);

extern XMaskEvent(

    Display*		 ,
    long		 ,
    XEvent*		 

);

extern int XMaxCmapsOfScreen(

    Screen*		 

);

extern int XMinCmapsOfScreen(

    Screen*		 

);

extern XMoveResizeWindow(

    Display*		 ,
    Window		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 

);

extern XMoveWindow(

    Display*		 ,
    Window		 ,
    int			 ,
    int			 

);

extern XNextEvent(

    Display*		 ,
    XEvent*		 

);

extern XNoOp(

    Display*		 

);

extern int  XParseColor(

    Display*		 ,
    Colormap		 ,
    const  char*	 ,
    XColor*		 

);

extern int XParseGeometry(

    const  char*	 ,
    int*		 ,
    int*		 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern XPeekEvent(

    Display*		 ,
    XEvent*		 

);

extern XPeekIfEvent(

    Display*		 ,
    XEvent*		 ,
    int  (*) (

	       Display*		 ,
               XEvent*		 ,
               XPointer		 

             )		 ,
    XPointer		 

);

extern int XPending(

    Display*		 

);

extern int XPlanesOfScreen(

    Screen*		 
    

);

extern int XProtocolRevision(

    Display*		 

);

extern int XProtocolVersion(

    Display*		 

);


extern XPutBackEvent(

    Display*		 ,
    XEvent*		 

);

extern XPutImage(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    XImage*		 ,
    int			 ,
    int			 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 	  

);

extern int XQLength(

    Display*		 

);

extern int  XQueryBestCursor(

    Display*		 ,
    Drawable		 ,
    unsigned int         ,
    unsigned int	 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern int  XQueryBestSize(

    Display*		 ,
    int			 ,
    Drawable		 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern int  XQueryBestStipple(

    Display*		 ,
    Drawable		 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern int  XQueryBestTile(

    Display*		 ,
    Drawable		 ,
    unsigned int	 ,
    unsigned int	 ,
    unsigned int*	 ,
    unsigned int*	 

);

extern XQueryColor(

    Display*		 ,
    Colormap		 ,
    XColor*		 

);

extern XQueryColors(

    Display*		 ,
    Colormap		 ,
    XColor*		 ,
    int			 

);

extern int  XQueryExtension(

    Display*		 ,
    const  char*	 ,
    int*		 ,
    int*		 ,
    int*		 

);

extern XQueryKeymap(

    Display*		 ,
    char [32]		 

);

extern int  XQueryPointer(

    Display*		 ,
    Window		 ,
    Window*		 ,
    Window*		 ,
    int*		 ,
    int*		 ,
    int*		 ,
    int*		 ,
    unsigned int*        

);

extern XQueryTextExtents(

    Display*		 ,
    XID			 ,
    const  char*	 ,
    int			 ,
    int*		 ,
    int*		 ,
    int*		 ,
    XCharStruct*	     

);

extern XQueryTextExtents16(

    Display*		 ,
    XID			 ,
    const  XChar2b*	 ,
    int			 ,
    int*		 ,
    int*		 ,
    int*		 ,
    XCharStruct*	 

);

extern int  XQueryTree(

    Display*		 ,
    Window		 ,
    Window*		 ,
    Window*		 ,
    Window**		 ,
    unsigned int*	 

);

extern XRaiseWindow(

    Display*		 ,
    Window		 

);

extern int XReadBitmapFile(

    Display*		 ,
    Drawable 		 ,
    const  char*	 ,
    unsigned int*	 ,
    unsigned int*	 ,
    Pixmap*		 ,
    int*		 ,
    int*		 

);

extern int XReadBitmapFileData(

    const  char*	 ,
    unsigned int*	 ,
    unsigned int*	 ,
    unsigned char**	 ,
    int*		 ,
    int*		 

);

extern XRebindKeysym(

    Display*		 ,
    KeySym		 ,
    KeySym*		 ,
    int			 ,
    const  unsigned char*	 ,
    int			 

);

extern XRecolorCursor(

    Display*		 ,
    Cursor		 ,
    XColor*		 ,
    XColor*		 

);

extern XRefreshKeyboardMapping(

    XMappingEvent*	     

);

extern XRemoveFromSaveSet(

    Display*		 ,
    Window		 

);

extern XRemoveHost(

    Display*		 ,
    XHostAddress*	 

);

extern XRemoveHosts(

    Display*		 ,
    XHostAddress*	 ,
    int			 

);

extern XReparentWindow(

    Display*		 ,
    Window		 ,
    Window		 ,
    int			 ,
    int			 

);

extern XResetScreenSaver(

    Display*		 

);

extern XResizeWindow(

    Display*		 ,
    Window		 ,
    unsigned int	 ,
    unsigned int	 

);

extern XRestackWindows(

    Display*		 ,
    Window*		 ,
    int			 

);

extern XRotateBuffers(

    Display*		 ,
    int			 

);

extern XRotateWindowProperties(

    Display*		 ,
    Window		 ,
    Atom*		 ,
    int			 ,
    int			 

);

extern int XScreenCount(

    Display*		 

);

extern XSelectInput(

    Display*		 ,
    Window		 ,
    long		 

);

extern int  XSendEvent(

    Display*		 ,
    Window		 ,
    int 		 ,
    long		 ,
    XEvent*		 

);

extern XSetAccessControl(

    Display*		 ,
    int			 

);

extern XSetArcMode(

    Display*		 ,
    GC			 ,
    int			 

);

extern XSetBackground(

    Display*		 ,
    GC			 ,
    unsigned long	 

);

extern XSetClipMask(

    Display*		 ,
    GC			 ,
    Pixmap		 

);

extern XSetClipOrigin(

    Display*		 ,
    GC			 ,
    int			 ,
    int			 

);

extern XSetClipRectangles(

    Display*		 ,
    GC			 ,
    int			 ,
    int			 ,
    XRectangle*		 ,
    int			 ,
    int			 

);

extern XSetCloseDownMode(

    Display*		 ,
    int			 

);

extern XSetCommand(

    Display*		 ,
    Window		 ,
    char**		 ,
    int			 

);

extern XSetDashes(

    Display*		 ,
    GC			 ,
    int			 ,
    const  char*	 ,
    int			 

);

extern XSetFillRule(

    Display*		 ,
    GC			 ,
    int			 

);

extern XSetFillStyle(

    Display*		 ,
    GC			 ,
    int			 

);

extern XSetFont(

    Display*		 ,
    GC			 ,
    Font		 

);

extern XSetFontPath(

    Display*		 ,
    char**		 ,
    int			 	     

);

extern XSetForeground(

    Display*		 ,
    GC			 ,
    unsigned long	 

);

extern XSetFunction(

    Display*		 ,
    GC			 ,
    int			 

);

extern XSetGraphicsExposures(

    Display*		 ,
    GC			 ,
    int 		 

);

extern XSetIconName(

    Display*		 ,
    Window		 ,
    const  char*	 

);

extern XSetInputFocus(

    Display*		 ,
    Window		 ,
    int			 ,
    Time		 

);

extern XSetLineAttributes(

    Display*		 ,
    GC			 ,
    unsigned int	 ,
    int			 ,
    int			 ,
    int			 

);

extern int XSetModifierMapping(

    Display*		 ,
    XModifierKeymap*	 

);

extern XSetPlaneMask(

    Display*		 ,
    GC			 ,
    unsigned long	 

);

extern int XSetPointerMapping(

    Display*		 ,
    const  unsigned char*	 ,
    int			 

);

extern XSetScreenSaver(

    Display*		 ,
    int			 ,
    int			 ,
    int			 ,
    int			 

);

extern XSetSelectionOwner(

    Display*		 ,
    Atom	         ,
    Window		 ,
    Time		 

);

extern XSetState(

    Display*		 ,
    GC			 ,
    unsigned long 	 ,
    unsigned long	 ,
    int			 ,
    unsigned long	 

);

extern XSetStipple(

    Display*		 ,
    GC			 ,
    Pixmap		 

);

extern XSetSubwindowMode(

    Display*		 ,
    GC			 ,
    int			 

);

extern XSetTSOrigin(

    Display*		 ,
    GC			 ,
    int			 ,
    int			 

);

extern XSetTile(

    Display*		 ,
    GC			 ,
    Pixmap		 

);

extern XSetWindowBackground(

    Display*		 ,
    Window		 ,
    unsigned long	 

);

extern XSetWindowBackgroundPixmap(

    Display*		 ,
    Window		 ,
    Pixmap		 

);

extern XSetWindowBorder(

    Display*		 ,
    Window		 ,
    unsigned long	 

);

extern XSetWindowBorderPixmap(

    Display*		 ,
    Window		 ,
    Pixmap		 

);

extern XSetWindowBorderWidth(

    Display*		 ,
    Window		 ,
    unsigned int	 

);

extern XSetWindowColormap(

    Display*		 ,
    Window		 ,
    Colormap		 

);

extern XStoreBuffer(

    Display*		 ,
    const  char*	 ,
    int			 ,
    int			 

);

extern XStoreBytes(

    Display*		 ,
    const  char*	 ,
    int			 

);

extern XStoreColor(

    Display*		 ,
    Colormap		 ,
    XColor*		 

);

extern XStoreColors(

    Display*		 ,
    Colormap		 ,
    XColor*		 ,
    int			 

);

extern XStoreName(

    Display*		 ,
    Window		 ,
    const  char*	 

);

extern XStoreNamedColor(

    Display*		 ,
    Colormap		 ,
    const  char*	 ,
    unsigned long	 ,
    int			 

);

extern XSync(

    Display*		 ,
    int 		 

);

extern XTextExtents(

    XFontStruct*	 ,
    const  char*	 ,
    int			 ,
    int*		 ,
    int*		 ,
    int*		 ,
    XCharStruct*	 

);

extern XTextExtents16(

    XFontStruct*	 ,
    const  XChar2b*	 ,
    int			 ,
    int*		 ,
    int*		 ,
    int*		 ,
    XCharStruct*	 

);

extern int XTextWidth(

    XFontStruct*	 ,
    const  char*	 ,
    int			 

);

extern int XTextWidth16(

    XFontStruct*	 ,
    const  XChar2b*	 ,
    int			 

);

extern int  XTranslateCoordinates(

    Display*		 ,
    Window		 ,
    Window		 ,
    int			 ,
    int			 ,
    int*		 ,
    int*		 ,
    Window*		 

);

extern XUndefineCursor(

    Display*		 ,
    Window		 

);

extern XUngrabButton(

    Display*		 ,
    unsigned int	 ,
    unsigned int	 ,
    Window		 

);

extern XUngrabKey(

    Display*		 ,
    int			 ,
    unsigned int	 ,
    Window		 

);

extern XUngrabKeyboard(

    Display*		 ,
    Time		 

);

extern XUngrabPointer(

    Display*		 ,
    Time		 

);

extern XUngrabServer(

    Display*		 

);

extern XUninstallColormap(

    Display*		 ,
    Colormap		 

);

extern XUnloadFont(

    Display*		 ,
    Font		 

);

extern XUnmapSubwindows(

    Display*		 ,
    Window		 

);

extern XUnmapWindow(

    Display*		 ,
    Window		 

);

extern int XVendorRelease(

    Display*		 

);

extern XWarpPointer(

    Display*		 ,
    Window		 ,
    Window		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 	     

);

extern int XWidthMMOfScreen(

    Screen*		 

);

extern int XWidthOfScreen(

    Screen*		 

);

extern XWindowEvent(

    Display*		 ,
    Window		 ,
    long		 ,
    XEvent*		 

);

extern int XWriteBitmapFile(

    Display*		 ,
    const  char*	 ,
    Pixmap		 ,
    unsigned int	 ,
    unsigned int	 ,
    int			 ,
    int			 		     

);

extern int  XSupportsLocale(

    void

);

extern char *XSetLocaleModifiers(

    const  char*	 

);

extern XOM XOpenOM(

    Display*			 ,
    struct _XrmHashBucketRec*	 ,
    const  char*		 ,
    const  char*		 

);

extern int  XCloseOM(

    XOM			 

);

extern char *XSetOMValues(

    XOM			 ,
    ...

);

extern char *XGetOMValues(

    XOM			 ,
    ...

);

extern Display *XDisplayOfOM(

    XOM			 

);

extern char *XLocaleOfOM(

    XOM			 

);

extern XOC XCreateOC(

    XOM			 ,
    ...

);

extern void XDestroyOC(

    XOC			 

);

extern XOM XOMOfOC(

    XOC			 

);

extern char *XSetOCValues(

    XOC			 ,
    ...

);

extern char *XGetOCValues(

    XOC			 ,
    ...

);

extern XFontSet XCreateFontSet(

    Display*		 ,
    const  char*	 ,
    char***		 ,
    int*		 ,
    char**		 

);

extern void XFreeFontSet(

    Display*		 ,
    XFontSet		 

);

extern int XFontsOfFontSet(

    XFontSet		 ,
    XFontStruct***	 ,
    char***		 

);

extern char *XBaseFontNameListOfFontSet(

    XFontSet		 

);

extern char *XLocaleOfFontSet(

    XFontSet		 

);

extern int  XContextDependentDrawing(

    XFontSet		 

);

extern int  XDirectionalDependentDrawing(

    XFontSet		 

);

extern int  XContextualDrawing(

    XFontSet		 

);

extern XFontSetExtents *XExtentsOfFontSet(

    XFontSet		 

);

extern int XmbTextEscapement(

    XFontSet		 ,
    const  char*	 ,
    int			 

);

extern int XwcTextEscapement(

    XFontSet		 ,
    const  wchar_t*	 ,
    int			 

);

extern int XmbTextExtents(

    XFontSet		 ,
    const  char*	 ,
    int			 ,
    XRectangle*		 ,
    XRectangle*		 

);

extern int XwcTextExtents(

    XFontSet		 ,
    const  wchar_t*	 ,
    int			 ,
    XRectangle*		 ,
    XRectangle*		 

);

extern int  XmbTextPerCharExtents(

    XFontSet		 ,
    const  char*	 ,
    int			 ,
    XRectangle*		 ,
    XRectangle*		 ,
    int			 ,
    int*		 ,
    XRectangle*		 ,
    XRectangle*		 

);

extern int  XwcTextPerCharExtents(

    XFontSet		 ,
    const  wchar_t*	 ,
    int			 ,
    XRectangle*		 ,
    XRectangle*		 ,
    int			 ,
    int*		 ,
    XRectangle*		 ,
    XRectangle*		 

);

extern void XmbDrawText(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    XmbTextItem*	 ,
    int			 

);

extern void XwcDrawText(

    Display*		 ,
    Drawable		 ,
    GC			 ,
    int			 ,
    int			 ,
    XwcTextItem*	 ,
    int			 

);

extern void XmbDrawString(

    Display*		 ,
    Drawable		 ,
    XFontSet		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  char*	 ,
    int			 

);

extern void XwcDrawString(

    Display*		 ,
    Drawable		 ,
    XFontSet		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  wchar_t*	 ,
    int			 

);

extern void XmbDrawImageString(

    Display*		 ,
    Drawable		 ,
    XFontSet		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  char*	 ,
    int			 

);

extern void XwcDrawImageString(

    Display*		 ,
    Drawable		 ,
    XFontSet		 ,
    GC			 ,
    int			 ,
    int			 ,
    const  wchar_t*	 ,
    int			 

);

extern XIM XOpenIM(

    Display*			 ,
    struct _XrmHashBucketRec*	 ,
    char*			 ,
    char*			 

);

extern int  XCloseIM(

    XIM  

);

extern char *XGetIMValues(

    XIM  , ...

);

extern Display *XDisplayOfIM(

    XIM  

);

extern char *XLocaleOfIM(

    XIM  

);

extern XIC XCreateIC(

    XIM  , ...

);

extern void XDestroyIC(

    XIC  

);

extern void XSetICFocus(

    XIC  

);

extern void XUnsetICFocus(

    XIC  

);

extern wchar_t *XwcResetIC(

    XIC  

);

extern char *XmbResetIC(

    XIC  

);

extern char *XSetICValues(

    XIC  , ...

);

extern char *XGetICValues(

    XIC  , ...

);

extern XIM XIMOfIC(

    XIC  

);

extern int  XFilterEvent(

    XEvent*	 ,
    Window	 

);

extern int XmbLookupString(

    XIC			 ,
    XKeyPressedEvent*	 ,
    char*		 ,
    int			 ,
    KeySym*		 ,
    int *		 

);

extern int XwcLookupString(

    XIC			 ,
    XKeyPressedEvent*	 ,
    wchar_t*		 ,
    int			 ,
    KeySym*		 ,
    int *		 

);

extern XVaNestedList XVaCreateNestedList(

    int  , ...

);

 

extern int  XRegisterIMInstantiateCallback(

    Display*			 ,
    struct _XrmHashBucketRec*	 ,
    char*			 ,
    char*			 ,
    XIMProc			 ,
    XPointer*			 

);

extern int  XUnregisterIMInstantiateCallback(

    Display*			 ,
    struct _XrmHashBucketRec*	 ,
    char*			 ,
    char*			 ,
    XIMProc			 ,
    XPointer*			 

);

typedef void (*XConnectionWatchProc)(

    Display*			 ,
    XPointer			 ,
    int				 ,
    int 			 ,	  
    XPointer*			   

);
    

extern int  XInternalConnectionNumbers(

    Display*			 ,
    int**			 ,
    int*			 

);

extern void XProcessInternalConnection(

    Display*			 ,
    int				 

);

extern int  XAddConnectionWatch(

    Display*			 ,
    XConnectionWatchProc	 ,
    XPointer			 

);

extern void XRemoveConnectionWatch(

    Display*			 ,
    XConnectionWatchProc	 ,
    XPointer			 

);

} 


# 39 "/home/room1/kriol/local/include/glaux.h" 2 3

# 1 "/usr/local/ap/X11R6/include/X11/Xutil.h" 1 3
 

 


















































 

 












 



typedef struct {
    	long flags;	 
	int x, y;		 
	int width, height;	 
	int min_width, min_height;
	int max_width, max_height;
    	int width_inc, height_inc;
	struct {
		int x;	 
		int y;	 
	} min_aspect, max_aspect;
	int base_width, base_height;		 
	int win_gravity;			 
} XSizeHints;

 




 












 




typedef struct {
	long flags;	 
	int  input;	 

	int initial_state;	 
	Pixmap icon_pixmap;	 
	Window icon_window; 	 
	int icon_x, icon_y; 	 
	Pixmap icon_mask;	 
	XID window_group;	 
	 
} XWMHints;

 












 




 





			 


 



typedef struct {
    unsigned char *value;		 
    Atom encoding;			 
    int format;				 
    unsigned long nitems;		 
} XTextProperty;





typedef enum {
    XStringStyle,		 
    XCompoundTextStyle,		 
    XTextStyle,			 
    XStdICCTextStyle		 
} XICCEncodingStyle;

typedef struct {
	int min_width, min_height;
	int max_width, max_height;
	int width_inc, height_inc;
} XIconSize;

typedef struct {
	char *res_name;
	char *res_class;
} XClassHint;

 














 


typedef struct _XComposeStatus {
    XPointer compose_ptr;	 
    int chars_matched;		 
} XComposeStatus;

 
























 


typedef struct _XRegion *Region; 

 
 



 

 




typedef struct {
  Visual *visual;
  VisualID visualid;
  int screen;
  int depth;

  int c_class;					 



  unsigned long red_mask;
  unsigned long green_mask;
  unsigned long blue_mask;
  int colormap_size;
  int bits_per_rgb;
} XVisualInfo;













 



typedef struct {
	Colormap colormap;
	unsigned long red_max;
	unsigned long red_mult;
	unsigned long green_max;
	unsigned long green_mult;
	unsigned long blue_max;
	unsigned long blue_mult;
	unsigned long base_pixel;
	VisualID visualid;		 
	XID killid;			 
} XStandardColormap;




 







 






 





typedef int XContext;




extern "C" { 

 

extern XClassHint *XAllocClassHint (

    void

);

extern XIconSize *XAllocIconSize (

    void

);

extern XSizeHints *XAllocSizeHints (

    void

);

extern XStandardColormap *XAllocStandardColormap (

    void

);

extern XWMHints *XAllocWMHints (

    void

);

extern XClipBox(

    Region		 ,
    XRectangle*		 

);

extern Region XCreateRegion(

    void

);

extern char *XDefaultString(

    void

);

extern int XDeleteContext(

    Display*		 ,
    XID			 ,
    XContext		 

);

extern XDestroyRegion(

    Region		 

);

extern XEmptyRegion(

    Region		 

);

extern XEqualRegion(

    Region		 ,
    Region		 

);

extern int XFindContext(

    Display*		 ,
    XID			 ,
    XContext		 ,
    XPointer*		 

);

extern int  XGetClassHint(

    Display*		 ,
    Window		 ,
    XClassHint*		 

);

extern int  XGetIconSizes(

    Display*		 ,
    Window		 ,
    XIconSize**		 ,
    int*		 

);

extern int  XGetNormalHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 

);

extern int  XGetRGBColormaps(

    Display*		 ,
    Window		 ,
    XStandardColormap**  ,
    int*		 ,
    Atom		 

);

extern int  XGetSizeHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 ,
    Atom		 

);

extern int  XGetStandardColormap(

    Display*		 ,
    Window		 ,
    XStandardColormap*	 ,
    Atom		 			    

);

extern int  XGetTextProperty(

    Display*		 ,
    Window		 ,
    XTextProperty*	 ,
    Atom		 

);

extern XVisualInfo *XGetVisualInfo(

    Display*		 ,
    long		 ,
    XVisualInfo*	 ,
    int*		 

);

extern int  XGetWMClientMachine(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern XWMHints *XGetWMHints(

    Display*		 ,
    Window		 		      

);

extern int  XGetWMIconName(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern int  XGetWMName(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern int  XGetWMNormalHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 ,
    long*		  

);

extern int  XGetWMSizeHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 ,
    long*		 ,
    Atom		 

);

extern int  XGetZoomHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 

);

extern XIntersectRegion(

    Region		 ,
    Region		 ,
    Region		 

);

extern void XConvertCase(

    KeySym		 ,
    KeySym*		 ,
    KeySym*		 

);

extern int XLookupString(

    XKeyEvent*		 ,
    char*		 ,
    int			 ,
    KeySym*		 ,
    XComposeStatus*	 

);

extern int  XMatchVisualInfo(

    Display*		 ,
    int			 ,
    int			 ,
    int			 ,
    XVisualInfo*	 

);

extern XOffsetRegion(

    Region		 ,
    int			 ,
    int			 

);

extern int  XPointInRegion(

    Region		 ,
    int			 ,
    int			 

);

extern Region XPolygonRegion(

    XPoint*		 ,
    int			 ,
    int			 

);

extern int XRectInRegion(

    Region		 ,
    int			 ,
    int			 ,
    unsigned int	 ,
    unsigned int	 

);

extern int XSaveContext(

    Display*		 ,
    XID			 ,
    XContext		 ,
    const  char*	 

);

extern XSetClassHint(

    Display*		 ,
    Window		 ,
    XClassHint*		 

);

extern XSetIconSizes(

    Display*		 ,
    Window		 ,
    XIconSize*		 ,
    int			     

);

extern XSetNormalHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 

);

extern void XSetRGBColormaps(

    Display*		 ,
    Window		 ,
    XStandardColormap*	 ,
    int			 ,
    Atom		 

);

extern XSetSizeHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 ,
    Atom		 

);

extern XSetStandardProperties(

    Display*		 ,
    Window		 ,
    const  char*	 ,
    const  char*	 ,
    Pixmap		 ,
    char**		 ,
    int			 ,
    XSizeHints*		 

);

extern void XSetTextProperty(

    Display*		 ,
    Window		 ,
    XTextProperty*	 ,
    Atom		 

);

extern void XSetWMClientMachine(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern XSetWMHints(

    Display*		 ,
    Window		 ,
    XWMHints*		 

);

extern void XSetWMIconName(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern void XSetWMName(

    Display*		 ,
    Window		 ,
    XTextProperty*	 

);

extern void XSetWMNormalHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 

);

extern void XSetWMProperties(

    Display*		 ,
    Window		 ,
    XTextProperty*	 ,
    XTextProperty*	 ,
    char**		 ,
    int			 ,
    XSizeHints*		 ,
    XWMHints*		 ,
    XClassHint*		 

);

extern void XmbSetWMProperties(

    Display*		 ,
    Window		 ,
    const  char*	 ,
    const  char*	 ,
    char**		 ,
    int			 ,
    XSizeHints*		 ,
    XWMHints*		 ,
    XClassHint*		 

);

extern void XSetWMSizeHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 ,
    Atom		 

);

extern XSetRegion(

    Display*		 ,
    GC			 ,
    Region		 

);

extern void XSetStandardColormap(

    Display*		 ,
    Window		 ,
    XStandardColormap*	 ,
    Atom		 

);

extern XSetZoomHints(

    Display*		 ,
    Window		 ,
    XSizeHints*		 

);

extern XShrinkRegion(

    Region		 ,
    int			 ,
    int			 

);

extern int  XStringListToTextProperty(

    char**		 ,
    int			 ,
    XTextProperty*	 

);

extern XSubtractRegion(

    Region		 ,
    Region		 ,
    Region		 

);

extern int XmbTextListToTextProperty(

    Display*		 ,
    char**		 ,
    int			 ,
    XICCEncodingStyle	 ,
    XTextProperty*	 

);

extern int XwcTextListToTextProperty(

    Display*		 ,
    wchar_t**		 ,
    int			 ,
    XICCEncodingStyle	 ,
    XTextProperty*	 

);

extern void XwcFreeStringList(

    wchar_t**		 

);

extern int  XTextPropertyToStringList(

    XTextProperty*	 ,
    char***		 ,
    int*		 

);

extern int XmbTextPropertyToTextList(

    Display*		 ,
    XTextProperty*	 ,
    char***		 ,
    int*		 

);

extern int XwcTextPropertyToTextList(

    Display*		 ,
    XTextProperty*	 ,
    wchar_t***		 ,
    int*		 

);

extern XUnionRectWithRegion(

    XRectangle*		 ,
    Region		 ,
    Region		 

);

extern XUnionRegion(

    Region		 ,
    Region		 ,
    Region		 

);

extern int XWMGeometry(

    Display*		 ,
    int			 ,
    const  char*	 ,
    const  char*	 ,
    unsigned int	 ,
    XSizeHints*		 ,
    int*		 ,
    int*		 ,
    int*		 ,
    int*		 ,
    int*		 

);

extern XXorRegion(

    Region		 ,
    Region		 ,
    Region		 

);

} 


# 40 "/home/room1/kriol/local/include/glaux.h" 2 3










 


















 














 



enum {
    AUX_USE_ID = 1,
    AUX_EXACT_MATCH,
    AUX_MINIMUM_CRITERIA
};






 



typedef struct _AUX_EVENTREC {
    GLint event;
    GLint data[4];
} AUX_EVENTREC;

 










 










 








 








































































 








 



enum {
    AUX_BLACK = 0,



    AUX_RED,

    AUX_GREEN,
    AUX_YELLOW,
    AUX_BLUE,
    AUX_MAGENTA,
    AUX_CYAN,
    AUX_WHITE
};




   extern float auxRGBMap[8][3];





 



typedef struct _AUX_RGBImageRec {
    GLint sizeX, sizeY;
    unsigned char *data;
} AUX_RGBImageRec;

 







extern void auxInitDisplayMode(GLbitfield);
extern void auxInitPosition(int, int, int, int);
extern GLenum auxInitWindow(char *);
extern void auxCloseWindow(void);
extern void auxQuit(void);
extern void auxSwapBuffers(void);


extern Display *auxXDisplay(void);
extern Window auxXWindow(void);


extern void auxMainLoop(void (*)());
extern void auxExposeFunc(void (*)(int, int));
extern void auxReshapeFunc(void (*)(int, int));
extern void auxIdleFunc(void (*)());
extern void auxKeyFunc(int, void (*)());
extern void auxMouseFunc(int, int, void (*)(AUX_EVENTREC *));

extern void auxDeleteMouseFunc( int, int , void (*)(AUX_EVENTREC *));

extern int auxGetColorMapSize(void);
extern void auxGetMouseLoc(int *, int *);
extern void auxSetOneColor(int, float, float, float);
extern void auxSetFogRamp(int, int);
extern void auxSetGreyRamp(void);
extern void auxSetRGBMap(int, float *);

extern AUX_RGBImageRec *auxRGBImageLoad(char *);

extern void auxCreateFont(void);
extern void auxDrawStr(char *);

extern void auxWireSphere(GLdouble);
extern void auxSolidSphere(GLdouble);
extern void auxWireCube(GLdouble);
extern void auxSolidCube(GLdouble);
extern void auxWireBox(GLdouble, GLdouble, GLdouble);
extern void auxSolidBox(GLdouble, GLdouble, GLdouble);
extern void auxWireTorus(GLdouble, GLdouble);
extern void auxSolidTorus(GLdouble, GLdouble);
extern void auxWireCylinder(GLdouble, GLdouble);
extern void auxSolidCylinder(GLdouble, GLdouble);
extern void auxWireIcosahedron(GLdouble);
extern void auxSolidIcosahedron(GLdouble);
extern void auxWireOctahedron(GLdouble);
extern void auxSolidOctahedron(GLdouble);
extern void auxWireTetrahedron(GLdouble);
extern void auxSolidTetrahedron(GLdouble);
extern void auxWireDodecahedron(GLdouble);
extern void auxSolidDodecahedron(GLdouble);
extern void auxWireCone(GLdouble, GLdouble);
extern void auxSolidCone(GLdouble, GLdouble);
extern void auxWireTeapot(GLdouble);
extern void auxSolidTeapot(GLdouble);

 
extern void auxInitDisplayModePolicy( GLenum type );
extern GLenum auxGetDisplayModePolicy( void );
extern GLenum auxInitDisplayModeID( GLint id );
extern GLint auxGetDisplayModeID( void );
extern GLenum auxGetDisplayMode( void );

extern void auxGetScreenSize( GLint *width, GLint *height );

extern void auxAnimation( GLint flag );






}




# 6 "TestToroid.C" 2


# 1 "/home/room1/kriol/work/Project/include/typedefs.H" 1 3
 








typedef char           char_t;
typedef int            int_t;

typedef unsigned int   uint_t;
typedef long           long_t;


typedef bool           bool_t;


typedef float          float_t;
typedef double         double_t;






# 8 "TestToroid.C" 2

# 1 "../include/ToroidV.H" 1
 





# 1 "../include/Toroid.H" 1
 












# 1 "../include/Shape.H" 1
 








# 1 "/home/room1/kriol/work/Project/include/Trace.H" 1 3
 





    









# 10 "../include/Shape.H" 2



template <class numT> class TVector3D;
template <class numT> class TTransformation;
template <class numT> class TExtent;

enum EPosStatus { eIn = 1, eOut = -1, eSurface = 0 };

template <class numT>
class VShape {
  public:

        
        
        
  
    VShape( const string& sName );
    VShape( const VShape<numT>& theShape );

    virtual ~VShape();
    
        
        
        

    VShape<numT>& operator = ( const VShape<numT>& theShape );

        
        
        

    const string&            sName( void ) const;

        
        
        

    virtual TExtent<numT>    calcExtent( const TTransformation<numT>& ) const = 0;

        
        
        
        

    virtual numT             dDistanceIn( const TVector3D<numT>& pos ) const = 0;

        
        
        
        
        
    
    virtual numT             dDistanceIn( const TVector3D<numT>& pos,
                                          const TVector3D<numT>& dir ) const = 0;
  
        
        
        
        
    
    virtual numT             dDistanceOut( const TVector3D<numT>& pos ) const = 0;
    
        
        
        
        
    
    virtual numT             dDistanceOut( const TVector3D<numT>& pos,
                                           const TVector3D<numT>& dir ) const = 0;
    virtual EPosStatus       eWhere( const TVector3D<numT>& pos ) const = 0;
  
  protected:
    string      sName_;
};

 
 
 

    
    
    
  
template <class numT> inline
VShape<numT>::VShape( const string& sName ):
  sName_( sName ) {     
    ((void)0) ;
}

template <class numT> inline
VShape<numT>::VShape( const VShape<numT>& theShape ):
  sName_( theShape.sName_ ) {
    ((void)0) ;
}

    
    
    

template <class numT> inline VShape<numT>&
VShape<numT>::operator = ( const VShape<numT>& theShape ) {

  ((void)0) ;
  
  ((void) ((  this != &theShape  ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "../include/Shape.H" ,   115 ,  "this != &theShape" ), 0) )) ;
    
  sName_ = theShape.sName_;
  
  return (*this);
}

    
    
    

template <class numT> inline const string&
VShape<numT>::sName( void ) const {
  return  sName_;
}


# 1 "../include/Shape.iC" 1
 

    
    
    

template <class numT>
VShape<numT>::~VShape() {
  ((void)0) ;
}
# 132 "../include/Shape.H" 2




# 14 "../include/Toroid.H" 2




# 1 "/home/room1/kriol/work/Project/include/num_traits.H" 1 3
 




# 1 "/home/room1/kriol/local/include/g++/cmath" 1 3
 
 




# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/math.h" 1 3 4
 







extern "C" {


#pragma ident	"@(#)math.h	2.5	95/02/07"















 


typedef union _h_val {
  	unsigned long _i[2];
	double _d;
} _h_val;


extern const _h_val __huge_val;










 
















extern int signgam;




 


enum version {libm_ieee = -1, c_issue_4, ansi_1, strict_ansi};


extern const enum version _lib_version;







struct __math_exception  {



	int type;
	char *name;
	double arg1;
	double arg2;
	double retval;
};




























 


extern double acos  (double)  ;
extern double asin  (double)  ;
extern double atan  (double)  ;
extern double atan2  (double, double)  ;
extern double cos  (double)  ;
extern double sin  (double)  ;
extern double tan  (double)  ;

extern double cosh  (double)  ;
extern double sinh  (double)  ;
extern double tanh  (double)  ;

extern double exp  (double)  ;
extern double frexp  (double, int *)  ;
extern double ldexp  (double, int)  ;
extern double log  (double)  ;
extern double log10  (double)  ;
extern double modf  (double, double *)  ;

extern double pow  (double, double)  ;
extern double sqrt  (double)  ;

extern double ceil  (double)  ;
extern double fabs  (double)  ;
extern double floor  (double)  ;
extern double fmod  (double, double)  ;



 


extern double erf  (double)  ;
extern double erfc  (double)  ;
extern double gamma  (double)  ;
extern double hypot  (double, double)  ;
extern int isnan  (double)  ;
extern double j0  (double)  ;
extern double j1  (double)  ;
extern double jn  (int, double)  ;
extern double lgamma  (double)  ;
extern double y0  (double)  ;
extern double y1  (double)  ;
extern double yn  (int, double)  ;



 


extern double acosh  (double)  ;
extern double asinh  (double)  ;
extern double atanh  (double)  ;
extern double cbrt  (double)  ;
extern double logb  (double)  ;
extern double nextafter  (double, double)  ;
extern double remainder  (double, double)  ;
extern double scalb  (double, double)  ;

 


extern double expm1  (double)  ;
extern int ilogb  (double)  ;
extern double log1p  (double)  ;
extern double rint  (double)  ;



 





extern int matherr  (struct __math_exception  *)  ;




 


extern double significand  (double)  ;

 


extern double copysign  (double, double)  ;
extern double scalbn  (double, int)  ;

 








 


extern float modff  (float, float *)  ;

# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/floatingpoint.h" 1 3 4
 
 

 
 
 





extern "C" {


#pragma ident	"@(#)floatingpoint.h	2.4 94/06/09"

 




 










# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdio.h" 1 3 4
 
 

 
 
 

 






#pragma ident	"@(#)stdio.h	1.39	95/12/04 SMI"	


# 1 "/usr/include/sys/va_list.h" 1 3 4
 







#pragma ident	"@(#)va_list.h	1.6	96/01/26 SMI"

 










extern "C" {


# 41 "/usr/include/sys/va_list.h" 3 4



typedef void *__va_list;







}



# 18 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdio.h" 2 3 4



extern "C" {







typedef long	fpos_t;












 










 



















# 81 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdio.h" 3 4




















































typedef struct	 
{




	int		_cnt;	 
	unsigned char	*_ptr;	 

	unsigned char	*_base;	 
	unsigned char	_flag;	 
	unsigned char	_file;	 
} FILE;


extern FILE		__iob[20 ];



extern FILE		*_lastbuf;
extern unsigned char	*_bufendtab[];

extern unsigned char	 _sibuf[], _sobuf[];




extern int	remove(const char *);
extern int	rename(const char *, const char *);
extern FILE	*tmpfile(void);
extern char	*tmpnam(char *);

extern char	*tmpnam_r(char *);

extern int	fclose(FILE *);
extern int	fflush(FILE *);
extern FILE	*fopen(const char *, const char *);
extern FILE	*freopen(const char *, const char *, FILE *);
extern void	setbuf(FILE *, char *);
extern int	setvbuf(FILE *, char *, int, size_t);
 
extern int	fprintf(FILE *, const char *, ...);
 
extern int	fscanf(FILE *, const char *, ...);
 
extern int	printf(const char *, ...);
 
extern int	scanf(const char *, ...);
 
extern int	sprintf(char *, const char *, ...);
 
extern int	sscanf(const char *, const char *, ...);
extern int	vfprintf(FILE *, const char *, __va_list);
extern int	vprintf(const char *, __va_list);
extern int	vsprintf(char *, const char *, __va_list);
extern int	fgetc(FILE *);
extern char	*fgets(char *, int, FILE *);
extern int	fputc(int, FILE *);
extern int	fputs(const char *, FILE *);
extern int	getc(FILE *);
extern int	getchar(void);
extern char	*gets(char *);
extern int	putc(int, FILE *);
extern int	putchar(int);
extern int	puts(const char *);
extern int	ungetc(int, FILE *);
extern size_t	fread(void *, size_t, size_t, FILE *);
extern size_t	fwrite(const void *, size_t, size_t, FILE *);
extern int	fgetpos(FILE *, fpos_t *);
extern int	fseek(FILE *, long, int);
extern int	fsetpos(FILE *, const fpos_t *);
extern long	ftell(FILE *);
extern void	rewind(FILE *);
extern void	clearerr(FILE *);
extern int	feof(FILE *);
extern int	ferror(FILE *);
extern void	perror(const char *);

extern int	__filbuf(FILE *);
extern int	__flsbuf(int, FILE *);

 





extern FILE	*fdopen(int, const char *);
extern char	*ctermid(char *);
extern int	fileno(FILE *);



 




extern void	flockfile(FILE *);
extern int	ftrylockfile(FILE *);
extern void	funlockfile(FILE *);
extern int	getc_unlocked(FILE *);
extern int	getchar_unlocked(void);
extern int	putc_unlocked(int, FILE *);
extern int	putchar_unlocked(int);



 




extern FILE	*popen(const char *, const char *);
extern char	*cuserid(char *);
extern char	*tempnam(const char *, const char *);
extern int	getopt(int, char *const *, const char *);

extern int	getsubopt(char **, char *const *, char **);

extern char	*optarg;
extern int	optind, opterr, optopt;
extern int	getw(FILE *);
extern int	putw(int, FILE *);
extern int	pclose(FILE *);



# 343 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdio.h" 3 4


 
























































}



# 33 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/floatingpoint.h" 2 3 4


# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/ieeefp.h" 1 3 4
 






#pragma ident	"@(#)ieeefp.h	2.7 94/11/09"


extern "C" {


 



enum fp_direction_type {	 
	fp_nearest	= 0,
	fp_tozero	= 1,
	fp_positive	= 2,
	fp_negative	= 3
};

enum fp_precision_type {	 
	fp_extended	= 0,
	fp_single	= 1,
	fp_double	= 2,
	fp_precision_3	= 3
};

enum fp_exception_type {	 
	fp_inexact	= 0,
	fp_division	= 1,
	fp_underflow	= 2,
	fp_overflow	= 3,
	fp_invalid	= 4
};

enum fp_trap_enable_type {	 
	fp_trap_inexact	= 0,
	fp_trap_division	= 1,
	fp_trap_underflow	= 2,
	fp_trap_overflow	= 3,
	fp_trap_invalid	= 4
};


# 81 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/ieeefp.h" 3 4


# 122 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/ieeefp.h" 3 4


enum fp_class_type {		 
	fp_zero		= 0,
	fp_subnormal	= 1,
	fp_normal	= 2,
	fp_infinity   	= 3,
	fp_quiet	= 4,
	fp_signaling	= 5
};


}



# 35 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/floatingpoint.h" 2 3 4














typedef int sigfpe_code_type;	 

typedef void (*sigfpe_handler_type)();	 





extern sigfpe_handler_type sigfpe  (sigfpe_code_type, sigfpe_handler_type)  ;

 


typedef float single;			



typedef unsigned extended[3];


typedef long double quadruple;	 

typedef unsigned fp_exception_field_type;
				 



 




typedef char decimal_string[512 ];	
				 

typedef struct {
	enum fp_class_type fpclass;
	int	sign;
	int	exponent;
	decimal_string ds;	 


	int	more;		 


	int 	ndigits;	 


} decimal_record;

enum decimal_form {
	fixed_form,		 


	floating_form		 

};

typedef struct {
	enum fp_direction_type rd;	
				 
	enum decimal_form df;	 

	int ndigits;		 
} decimal_mode;

enum decimal_string_form {	 
	invalid_form,		 
	whitespace_form,	 
	fixed_int_form,		 
	fixed_intdot_form,	 
	fixed_dotfrac_form,	 
	fixed_intdotfrac_form,	 
	floating_int_form,	 	
	floating_intdot_form,	 
	floating_dotfrac_form,	 
	floating_intdotfrac_form, 
	inf_form,		 
	infinity_form,		 
	nan_form,		 
	nanstring_form		 
};

extern void single_to_decimal  (single *, decimal_mode *, decimal_record *,
				fp_exception_field_type *)  ;
extern void double_to_decimal  (double *, decimal_mode *, decimal_record *,
				fp_exception_field_type *)  ;
extern void extended_to_decimal  (extended *, decimal_mode *,
				decimal_record *, fp_exception_field_type *)  ;
extern void quadruple_to_decimal  (quadruple *, decimal_mode *,
				decimal_record *, fp_exception_field_type *)  ;

extern void decimal_to_single  (single *, decimal_mode *, decimal_record *,
				fp_exception_field_type *)  ;
extern void decimal_to_double  (double *, decimal_mode *, decimal_record *,
				fp_exception_field_type *)  ;
extern void decimal_to_extended  (extended *, decimal_mode *,
				decimal_record *, fp_exception_field_type *)  ;
extern void decimal_to_quadruple  (quadruple *, decimal_mode *,
				decimal_record *, fp_exception_field_type *)  ;

extern void string_to_decimal  (char **, int, int, decimal_record *,
				enum decimal_string_form *, char **)  ;
extern void func_to_decimal  (char **, int, int, decimal_record *,
				enum decimal_string_form *, char **,
				int (*)(void), int *, int (*)(int))  ;
extern void file_to_decimal  (char **, int, int, decimal_record *,
				enum decimal_string_form *, char **,
				FILE *, int *)  ;

extern char *seconvert  (single *, int, int *, int *, char *)  ;
extern char *sfconvert  (single *, int, int *, int *, char *)  ;
extern char *sgconvert  (single *, int, int, char *)  ;
extern char *econvert  (double, int, int *, int *, char *)  ;
extern char *fconvert  (double, int, int *, int *, char *)  ;
extern char *gconvert  (double, int, int, char *)  ;
extern char *qeconvert  (quadruple *, int, int *, int *, char *)  ;
extern char *qfconvert  (quadruple *, int, int *, int *, char *)  ;
extern char *qgconvert  (quadruple *, int, int, char *)  ;

extern char *ecvt  (double, int, int *, int *)  ;
extern char *fcvt  (double, int, int *, int *)  ;
extern char *gcvt  (double, int, char *)  ;

 



extern double atof  (const char *)  ;
extern double strtod  (const char *, char **)  ;


}



# 230 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/math.h" 2 3 4





}



# 7 "/home/room1/kriol/local/include/g++/cmath" 2 3



#pragma interface "cmath"


extern "C++" {
# 38 "/home/room1/kriol/local/include/g++/cmath" 3


inline float  abs (float  x) { return fabs (x); }

inline double abs (double x) { return fabs (x); }


# 71 "/home/room1/kriol/local/include/g++/cmath" 3

inline long double abs (long double x) { return fabs (x); }

}  


# 6 "/home/room1/kriol/work/Project/include/num_traits.H" 2 3


template <class numT> struct num_traits {
 
  static const numT epsilon;
  static const numT epsilon_2;
  static const numT maximum;

     
     
     


     
     
     
  
  static inline bool eq( const numT& one ) {
    return ( ( ::fabs(one) < epsilon) );
  }

  static inline bool eq_2( const numT& one ) {
    return ( ( ::fabs(one) < epsilon_2) );
  }
  
  static inline bool eqi( const numT& one ) {
    return ( ( ::fabs(one) <= epsilon) );
  }
  
  static inline bool eqi_2( const numT& one ) {
    return ( ( ::fabs(one) <= epsilon_2) );
  }
  
     
     
     
  
  static inline bool ne( const numT& one ) {
    return ( ( ::fabs(one) > epsilon) );
  }
  
  static inline bool ne_2( const numT& one ) {
    return ( ( ::fabs(one) > epsilon_2) );
  }
  
  static inline bool nei( const numT& one ) {
    return ( ( ::fabs(one) >= epsilon) );
  }
  
  static inline bool nei_2( const numT& one ) {
    return ( ( ::fabs(one) >= epsilon_2) );
  }
  
     
     
     
  
  static inline bool gt( const numT& one ) {
    return ( (one) > epsilon );
  }
  
  static inline bool gt_2( const numT& one ) {
    return ( (one) > epsilon_2 );
  }
  
  static inline bool gti( const numT& one ) {
    return ( (one) >= epsilon );
  }
  
  static inline bool gti_2( const numT& one ) {
    return ( (one) >= epsilon_2 );
  }
  
     
     
     

  static inline bool ge( const numT& one ) {
    return ( (one) > -epsilon );
  }
  
  static inline bool ge_2( const numT& one) {
    return ( (one) > -epsilon_2 );
  }
  
  static inline bool gei( const numT& one ) {
    return ( (one) >= -epsilon );
  }

  static inline bool gei_2( const numT& one ) {
    return ( (one) >= -epsilon_2 );
  }

     
     
     

  static inline bool lt( const numT& one ) {
    return ( (one) < -epsilon );
  }
  
  static inline bool lt_2( const numT& one ) {
    return ( (one) < -epsilon_2 );
  }
  
  static inline bool lti( const numT& one ) {
    return ( (one) <= -epsilon );
  }
  
  static inline bool lti_2( const numT& one ) {
    return ( (one) <= -epsilon_2 );
  }  

     
     
     

  static inline bool le( const numT& one ) {
    return ( (one) < epsilon );
  }
  
  static inline bool le_2( const numT& one ) {
    return ( (one) < epsilon_2 );
  }
  
  static inline bool lei( const numT& one ) {
    return ( (one) <= epsilon );
  }
  
  static inline bool lei_2( const numT& one ) {
    return ( (one) <= epsilon_2 );
  }
  
     
     
     

  
     
     
     

  static inline bool eq( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) < epsilon) );
  }
  
  static inline bool eq_2( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) < epsilon_2) );
  }
  
  static inline bool eqi( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) <= epsilon) );
  }
  
  static inline bool eqi_2( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) <= epsilon_2) );
  }

     
     
     

  static inline bool ne( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) > epsilon ) );
  }
  
  static inline bool ne_2( const numT& one, const numT& two ) {
    return ( ( ::fabs(one - two) > epsilon_2 ) );
  }
  
  static inline bool nei( const numT& one, const numT& two ) {
    return ( (::fabs(one - two) >= epsilon) );
  }
  
  static inline bool nei_2( const numT& one, const numT& two ) {
    return ( (::fabs(one - two) >= epsilon_2) );
  }
  
     
     
     

  static inline bool gt( const numT& one, const numT& two ) {
    return ( (one - two) > epsilon );
  }
  
  static inline bool gt_2( const numT& one, const numT& two ) {
    return ( (one - two) > epsilon_2 );
  }
  
  static inline bool gti( const numT& one, const numT& two ) {
    return ( (one - two) >= epsilon );
  }
  
  static inline bool gti_2( const numT& one, const numT& two ) {
    return ( (one - two) >= epsilon_2 );
  }
  
     
     
     
  
  static inline bool ge( const numT& one, const numT& two ) {
    return ( (one - two) > -epsilon );
  }
  
  static inline bool ge_2( const numT& one, const numT& two ) {
    return ( (one - two) > -epsilon_2 );
  }
  
  static inline bool gei( const numT& one, const numT& two ) {
    return ( (one - two) >= -epsilon );
  }
  
  static inline bool gei_2( const numT& one, const numT& two ) {
    return ( (one - two) >= -epsilon_2 );
  }
  
     
     
     
  
  static inline bool lt( const numT& one, const numT& two ) {
    return ( (one - two) < -epsilon );
  }
  
  static inline bool lt_2( const numT& one, const numT& two ) {
    return ( (one - two) < -epsilon_2 );
  }
  
  static inline bool lti( const numT& one, const numT& two ) {
    return ( (one - two) <= -epsilon );
  }
  
  static inline bool lti_2( const numT& one, const numT& two ) {
    return ( (one - two) <= -epsilon_2 );
  }
  
     
     
     
  
  static inline bool le( const numT& one, const numT& two ) {
    return ( (one - two) < epsilon );
  }
  
  static inline bool le_2( const numT& one, const numT& two ) {
    return ( (one - two) < epsilon_2 );
  }
  
  static inline bool lei( const numT& one, const numT& two ) {
    return ( (one - two) <= epsilon );
  }
  
  static inline bool lei_2( const numT& one, const numT& two ) {
    return ( (one - two) <= epsilon_2 );
  }
};


# 18 "../include/Toroid.H" 2



template <class numT> class TExtent;

template <class numT, class traits = num_traits<numT> >
class TToroid: public VShape<numT> {
    
  public:
  
        
        
        
  
    TToroid( const string& sName, numT dRadiusTor, numT dRadius );
    TToroid( const TToroid< numT, traits >& theToroid );

    virtual ~TToroid();
  
        
        
        
  
    TToroid< numT, traits >& operator=( const TToroid< numT, traits >& theToroid );

        
        
        
  
    numT dRadiusTor( void ) const;  
    numT dRadius( void ) const;
  
    virtual TExtent<numT> calcExtent( const TTransformation<numT>& ) const;
  
    virtual numT dDistanceIn(  const TVector3D<numT>& pos ) const;
    virtual numT dDistanceIn(  const TVector3D<numT>& pos,
                               const TVector3D<numT>& dir ) const;
  
    virtual numT dDistanceOut( const TVector3D<numT>& pos ) const;
    virtual numT dDistanceOut( const TVector3D<numT>& pos,
                               const TVector3D<numT>& dir ) const;
 
    virtual EPosStatus eWhere( const TVector3D<numT>& pos ) const;
  
    friend ostream& operator << ( ostream& os, const TToroid< numT, traits >& );
    
  private:
    
    numT dRadiusTor_;
    numT dRadius_ ;
};


 
 
 

    
    
    
  
template <class numT, class traits> inline numT
TToroid<numT,traits>::dRadiusTor( void ) const {
  return dRadiusTor_;
}
  
template <class numT, class traits> inline numT
TToroid<numT,traits>::dRadius( void ) const {
  return dRadius_;
}


# 1 "../include/Toroid.iC" 1
 


# 1 "/home/room1/kriol/local/include/g++/algorithm" 1 3
 
 



# 1 "/home/room1/kriol/local/include/g++/algo.h" 1 3
 




























# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdlib.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)stdlib.h	1.27	95/08/28 SMI"	





# 1 "/usr/include/sys/wait.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)wait.h	1.15	94/11/05 SMI"	







# 1 "/usr/include/sys/procset.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)procset.h	1.15	93/05/05 SMI"	


extern "C" {


 










 




typedef enum idtype {
	P_PID,		 
	P_PPID,		 
	P_PGID,		 
			 
	P_SID,		 
	P_CID,		 
	P_UID,		 
	P_GID,		 
	P_ALL,		 
	P_LWPID		 
} idtype_t;


 




typedef enum idop {
	POP_DIFF,	 
			 
			 
	POP_AND,	 
			 
			 
	POP_OR,		 
			 
			 
	POP_XOR		 
			 
			 
} idop_t;


 




typedef struct procset {
	idop_t		p_op;	 
				 
				 
				 

	idtype_t	p_lidtype;
				 
				 
	id_t		p_lid;	 

	idtype_t	p_ridtype;
				 
				 
	id_t		p_rid;	 
} procset_t;


 










# 127 "/usr/include/sys/procset.h" 3 4



}



# 19 "/usr/include/sys/wait.h" 2 3 4




extern "C" {


 


















 

































extern pid_t wait(int *);
extern pid_t waitpid(pid_t, int *, int);

extern int waitid(idtype_t, id_t, siginfo_t *, int);


# 93 "/usr/include/sys/wait.h" 3 4




}



# 17 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdlib.h" 2 3 4




extern "C" {


typedef	struct {
	int	quot;
	int	rem;
} div_t;

typedef struct {
	long	quot;
	long	rem;
} ldiv_t;







































extern unsigned char	__ctype[];



extern double atof(const char *);
extern int atoi(const char *);
extern long int atol(const char *);
extern double strtod(const char *, char **);
extern long int strtol(const char *, char **, int);
extern unsigned long int strtoul(const char *, char **, int);

extern int rand(void);
extern void srand(unsigned int);


extern int rand_r(unsigned int *);


extern void *calloc(size_t, size_t);
extern void free(void *);
extern void *malloc(size_t);
extern void *realloc(void *, size_t);

extern void abort(void);
extern int atexit(void (*)(void));
extern void exit(int);
extern char *getenv(const char *);
extern int system(const char *);

extern void *bsearch(const void *, const void *, size_t, size_t,
	int (*)(const void *, const void *));
extern void qsort(void *, size_t, size_t,
	int (*)(const void *, const void *));

extern int abs(int);
extern div_t div(int, int);
extern long int labs(long);
extern ldiv_t ldiv(long, long);

extern int mbtowc(wchar_t *, const char *, size_t);
extern int mblen(const char *, size_t);
extern int wctomb(char *, wchar_t);

extern size_t mbstowcs(wchar_t *, const char *, size_t);
extern size_t wcstombs(char *, const wchar_t *, size_t);





extern double drand48(void);
extern double erand48(unsigned short *);
extern long jrand48(unsigned short *);
extern void lcong48(unsigned short *);
extern long lrand48(void);
extern long mrand48(void);
extern long nrand48(unsigned short *);
extern unsigned short *seed48(unsigned short *);
extern void srand48(long);
extern int putenv(const char *);
extern void setkey(const char *);






extern void swab(const char *, char *, int);





extern long a64l(const char *);
extern int dup2(int, int);
extern char *ecvt(double, int, int *, int *);
extern char *fcvt(double, int, int *, int *);
extern char *qecvt(long double, int, int *, int *);
extern char *qfcvt(long double, int, int *, int *);
extern char *qgcvt(long double, int, char *);
extern char *getcwd(char *, size_t);
extern char *getlogin(void);
extern int getopt(int, char *const *, const char *);
extern int getsubopt(char **, char *const *, char **);
extern char *optarg;
extern int optind, opterr, optopt;
extern char *getpass(const char *);
extern int getpw(uid_t, char *);
extern char *gcvt(double, int, char *);
extern int isatty(int);
extern char *l64a(long);
extern void *memalign(size_t, size_t);
extern char *mktemp(char *);
extern char *realpath(char *, char *);
extern char *ttyname(int);
extern int ttyslot(void);
extern void *valloc(size_t);
extern char *ptsname(int);
extern int  grantpt(int);
extern int  unlockpt(int);

# 181 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdlib.h" 3 4




# 282 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stdlib.h" 3 4



}



# 30 "/home/room1/kriol/local/include/g++/algo.h" 2 3

# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 1 3 4
 


 





 
# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/syslimits.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)limits.h	1.29	96/01/11 SMI"	





extern "C" {


 


































 



























 




























 






 































				 
















						 



						 


















 








































 








 




# 1 "/usr/include/sys/unistd.h" 1 3 4
 









 








#pragma ident	"@(#)unistd.h	1.24	95/08/24 SMI"	




extern "C" {


 

 








 




 




 



























 




















 


 






	 















 




















 





 

 









 




































}



# 246 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/syslimits.h" 2 3 4

extern long _sysconf(int);	 





}



# 11 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 2 3 4





 



 



 




 





 



 












 





 



 








 



 













 



# 106 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 3 4




 









# 31 "/home/room1/kriol/local/include/g++/algo.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/algobase.h" 1 3
 





























# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 1 3 4
 


 

# 113 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 3 4







# 31 "/home/room1/kriol/local/include/g++/algobase.h" 2 3


# 1 "/home/room1/kriol/local/include/g++/pair.h" 1 3
 






























template <class T1, class T2>
struct pair {
    typedef T1 first_type;
    typedef T2 second_type;

    T1 first;
    T2 second;
    pair() : first(T1()), second(T2()) {}
    pair(const T1& a, const T2& b) : first(a), second(b) {}


    template <class U1, class U2>
    pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}

};

template <class T1, class T2>
inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
    return x.first == y.first && x.second == y.second; 
}

template <class T1, class T2>
inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
    return x.first < y.first || (!(y.first < x.first) && x.second < y.second); 
}

template <class T1, class T2>
inline pair<T1, T2> make_pair(const T1& x, const T2& y) {
    return pair<T1, T2>(x, y);
}


# 33 "/home/room1/kriol/local/include/g++/algobase.h" 2 3


# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/new.h" 1 3 4
 




# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/new" 1 3 4
 
 




#pragma interface "new"
# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4
# 327 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4

# 8 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/new" 2 3 4



extern "C++" {





  class bad_alloc : public exception {
  public:
    virtual const char* what() const throw() { return "bad_alloc"; }
  };

  struct nothrow_t {};
  extern const nothrow_t nothrow;
  typedef void (*new_handler)();
  extern "C" new_handler set_new_handler (new_handler);





 
extern new_handler __new_handler;
extern "C" void __default_new_handler (void);

 
void *operator new (size_t);
void *operator new (size_t, const nothrow_t&) throw();
void *operator new[] (size_t);
void *operator new[] (size_t, const nothrow_t&) throw();
void operator delete (void *) throw();
void operator delete[] (void *) throw();

 
inline void *operator new(size_t, void *place) throw() { return place; }
inline void *operator new[](size_t, void *place) throw() { return place; }
}  


# 6 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/new.h" 2 3 4








# 35 "/home/room1/kriol/local/include/g++/algobase.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/type_traits.h" 1 3
 


















 































struct __true_type {
};

struct __false_type {
};

template <class type>
struct __type_traits { 
   typedef __true_type     this_dummy_member_must_be_first;
                    





    








 

   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};



 
 
 

struct __type_traits<char> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<signed char> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<unsigned char> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<short> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<unsigned short> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<int> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<unsigned int> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<long> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<unsigned long> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<float> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<double> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

struct __type_traits<long double> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};



template <class T>
struct __type_traits<T*> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

# 224 "/home/room1/kriol/local/include/g++/type_traits.h" 3




# 36 "/home/room1/kriol/local/include/g++/algobase.h" 2 3


template <class ForwardIterator1, class ForwardIterator2, class T>
inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) {
    T tmp = *a;
    *a = *b;
    *b = tmp;
}

template <class ForwardIterator1, class ForwardIterator2>
inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
    __iter_swap(a, b, value_type(a));
}

template <class T>
inline void swap(T& a, T& b) {
    T tmp = a;
    a = b;
    b = tmp;
}





template <class T>
inline const T& min(const T& a, const T& b) {
    return b < a ? b : a;
}

template <class T>
inline const T& max(const T& a, const T& b) {
    return  a < b ? b : a;
}



template <class T, class Compare>
inline const T& min(const T& a, const T& b, Compare comp) {
    return comp(b, a) ? b : a;
}

template <class T, class Compare>
inline const T& max(const T& a, const T& b, Compare comp) {
    return comp(a, b) ? b : a;
}

template <class InputIterator, class Distance>
inline void __distance(InputIterator first, InputIterator last, Distance& n, 
                       input_iterator_tag) {
    while (first != last) { ++first; ++n; }
}

template <class ForwardIterator, class Distance>
inline void __distance(ForwardIterator first, ForwardIterator last,
                       Distance& n, 
                       forward_iterator_tag) {
    while (first != last) { ++first; ++n; }
}

template <class BidirectionalIterator, class Distance>
inline void __distance(BidirectionalIterator first, BidirectionalIterator last,
                       Distance& n, bidirectional_iterator_tag) {
    while (first != last) { ++first; ++n; }
}

template <class RandomAccessIterator, class Distance>
inline void __distance(RandomAccessIterator first, RandomAccessIterator last, 
		       Distance& n, random_access_iterator_tag) {
    n += last - first;
}

template <class InputIterator, class Distance>
inline void distance(InputIterator first, InputIterator last, Distance& n) {
    __distance(first, last, n, iterator_category(first));
}



template <class InputIterator>
inline iterator_traits<InputIterator>::difference_type
__distance(InputIterator first, InputIterator last, input_iterator_tag) {
  iterator_traits<InputIterator>::difference_type n = 0;
  while (first != last) {
    ++first; ++n;
  }
  return n;
}

template <class ForwardIterator>
inline iterator_traits<ForwardIterator>::difference_type
__distance(ForwardIterator first, ForwardIterator last, forward_iterator_tag) {
  return __distance(first, last, input_iterator_tag());
}

template <class BidirectionalIterator>
inline iterator_traits<BidirectionalIterator>::difference_type
__distance(BidirectionalIterator first, BidirectionalIterator last,
           bidirectional_iterator_tag) {
  return __distance(first, last, input_iterator_tag());
}

template <class RandomAccessIterator>
inline iterator_traits<RandomAccessIterator>::difference_type
__distance(RandomAccessIterator first, RandomAccessIterator last,
           random_access_iterator_tag) {
  return last - first;
}

template <class InputIterator>
inline iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last) {
  return __distance(first, last,
                    iterator_traits<InputIterator>::iterator_category());
}



template <class InputIterator, class Distance>
inline void __advance(InputIterator& i, Distance n, input_iterator_tag) {
    while (n--) ++i;
}

template <class ForwardIterator, class Distance>
inline void __advance(ForwardIterator& i, Distance n, forward_iterator_tag) {
    while (n--) ++i;
}





template <class BidirectionalIterator, class Distance>
inline void __advance(BidirectionalIterator& i, Distance n, 
                      bidirectional_iterator_tag) {
    if (n >= 0)
	while (n--) ++i;
    else
	while (n++) --i;
}





template <class RandomAccessIterator, class Distance>
inline void __advance(RandomAccessIterator& i, Distance n, 
		      random_access_iterator_tag) {
    i += n;
}

template <class InputIterator, class Distance>
inline void advance(InputIterator& i, Distance n) {
    __advance(i, n, iterator_category(i));
}

template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
                             OutputIterator result, input_iterator_tag)
{
  for ( ; first != last; ++result, ++first)
    *result = *first;
  return result;
}

template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
                             OutputIterator result, forward_iterator_tag)
{
  return __copy(first, last, result, input_iterator_tag());
}

template <class InputIterator, class OutputIterator>
inline OutputIterator __copy(InputIterator first, InputIterator last,
                             OutputIterator result, bidirectional_iterator_tag)
{
  return __copy(first, last, result, input_iterator_tag());
}

template <class RandomAccessIterator, class OutputIterator, class Distance>
inline OutputIterator
__copy_d(RandomAccessIterator first, RandomAccessIterator last,
         OutputIterator result, Distance*)
{
  for (Distance n = last - first; n > 0; --n, ++result, ++first) 
    *result = *first;
  return result;
}

template <class RandomAccessIterator, class OutputIterator>
inline OutputIterator 
__copy(RandomAccessIterator first, RandomAccessIterator last,
       OutputIterator result, random_access_iterator_tag)
{
  return __copy_d(first, last, result, distance_type(first));
}

template <class InputIterator, class OutputIterator>
struct __copy_dispatch
{
  OutputIterator operator()(InputIterator first, InputIterator last,
                            OutputIterator result) {
    return __copy(first, last, result, iterator_category(first));
  }
};



template <class T>
inline T* __copy_t(const T* first, const T* last, T* result, __true_type) {
  memmove(result, first, sizeof(T) * (last - first));
  return result + (last - first);
}

template <class T>
inline T* __copy_t(const T* first, const T* last, T* result, __false_type) {
  return __copy_d(first, last, result, (ptrdiff_t*) 0);
}

template <class T>
struct __copy_dispatch<T*, T*>
{
  T* operator()(T* first, T* last, T* result) {
    return __copy_t(first, last, result,
                    __type_traits<T>::has_trivial_assignment_operator());
  }
};

template <class T>
struct __copy_dispatch<const T*, T*>
{
  T* operator()(const T* first, const T* last, T* result) {
    return __copy_t(first, last, result, 
                    __type_traits<T>::has_trivial_assignment_operator());
  }
};



template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last,
                           OutputIterator result)
{
  return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}

inline char* copy(const char* first, const char* last, char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

inline wchar_t* copy(const wchar_t* first, const wchar_t* last,
                     wchar_t* result) {
  memmove(result, first, sizeof(wchar_t) * (last - first));
  return result + (last - first);
}

template <class BidirectionalIterator1, class BidirectionalIterator2>
inline BidirectionalIterator2 __copy_backward(BidirectionalIterator1 first, 
                                              BidirectionalIterator1 last, 
                                              BidirectionalIterator2 result) {
  while (first != last) *--result = *--last;
  return result;
}


template <class BidirectionalIterator1, class BidirectionalIterator2>
struct __copy_backward_dispatch
{
  BidirectionalIterator2 operator()(BidirectionalIterator1 first, 
                                    BidirectionalIterator1 last, 
                                    BidirectionalIterator2 result) {
    return __copy_backward(first, last, result);
  }
};



template <class T>
inline T* __copy_backward_t(const T* first, const T* last, T* result,
                            __true_type) {
  const ptrdiff_t N = last - first;
  memmove(result - N, first, sizeof(T) * N);
  return result - N;
}

template <class T>
inline T* __copy_backward_t(const T* first, const T* last, T* result,
                            __false_type) {
  return __copy_backward(first, last, result);
}

template <class T>
struct __copy_backward_dispatch<T*, T*>
{
  T* operator()(T* first, T* last, T* result) {
    return
      __copy_backward_t(first, last, result,
                        __type_traits<T>::has_trivial_assignment_operator());
  }
};

template <class T>
struct __copy_backward_dispatch<const T*, T*>
{
  T* operator()(const T* first, const T* last, T* result) {
    return
      __copy_backward_t(first, last, result,
                        __type_traits<T>::has_trivial_assignment_operator());
  }
};



template <class BidirectionalIterator1, class BidirectionalIterator2>
inline BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, 
                                            BidirectionalIterator1 last, 
                                            BidirectionalIterator2 result) {
  return __copy_backward_dispatch<BidirectionalIterator1, 
                                  BidirectionalIterator2>()(first, last, 
                                                            result);
}

template <class InputIterator, class Size, class OutputIterator>
OutputIterator __copy_n(InputIterator first, Size count,
                        OutputIterator result,
                        input_iterator_tag) {
  for ( ; count > 0; --count, ++first, ++result)
    *result = *first;
  return result;
}

template <class ForwardIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(ForwardIterator first, Size count,
                               OutputIterator result,
                               forward_iterator_tag) {
  return __copy_n(first, count, result, input_iterator_tag());
}

template <class BidirectionalIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(BidirectionalIterator first, Size count,
                               OutputIterator result,
                               bidirectional_iterator_tag) {
  return __copy_n(first, count, result, input_iterator_tag());
}

template <class RandomAccessIterator, class Size, class OutputIterator>
inline OutputIterator __copy_n(RandomAccessIterator first, Size count,
                               OutputIterator result,
                               random_access_iterator_tag) {
  return copy(first, first + count, result);
}

template <class InputIterator, class Size, class OutputIterator>
inline OutputIterator copy_n(InputIterator first, Size count,
                             OutputIterator result) {
  return __copy_n(first, count, result, iterator_category(first));
}

template <class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last, const T& value) {
  for ( ; first != last; ++first)
    *first = value;
}

template <class OutputIterator, class Size, class T>
OutputIterator fill_n(OutputIterator first, Size n, const T& value) {
  for ( ; n > 0; --n, ++first)
    *first = value;
  return first;
}

template <class InputIterator1, class InputIterator2>
pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
					      InputIterator1 last1,
					      InputIterator2 first2) {
    while (first1 != last1 && *first1 == *first2) {
	++first1;
	++first2;
    }
    return pair<InputIterator1, InputIterator2>(first1, first2);
}

template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
					      InputIterator1 last1,
					      InputIterator2 first2,
					      BinaryPredicate binary_pred) {
    while (first1 != last1 && binary_pred(*first1, *first2)) {
	++first1;
	++first2;
    }
    return pair<InputIterator1, InputIterator2>(first1, first2);
}

template <class InputIterator1, class InputIterator2>
inline bool equal(InputIterator1 first1, InputIterator1 last1,
		  InputIterator2 first2) {
  for ( ; first1 != last1; ++first1, ++first2)
    if (*first1 != *first2)
      return false;
  return true;
}

template <class InputIterator1, class InputIterator2, class BinaryPredicate>
inline bool equal(InputIterator1 first1, InputIterator1 last1,
		  InputIterator2 first2, BinaryPredicate binary_pred) {
  for ( ; first1 != last1; ++first1, ++first2)
    if (!binary_pred(*first1, *first2))
      return false;
  return true;
}

template <class InputIterator1, class InputIterator2>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
			     InputIterator2 first2, InputIterator2 last2) {
  for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) {
    if (*first1 < *first2)
      return true;
    if (*first2 < *first1)
      return false;
  }
  return first1 == last1 && first2 != last2;
}

template <class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
			     InputIterator2 first2, InputIterator2 last2,
			     Compare comp) {
  for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) {
    if (comp(*first1, *first2))
      return true;
    if (comp(*first2, *first1))
      return false;
  }
  return first1 == last1 && first2 != last2;
}

inline bool 
lexicographical_compare(const unsigned char* first1,
                        const unsigned char* last1,
                        const unsigned char* first2,
                        const unsigned char* last2)
{
  const size_t len1 = last1 - first1;
  const size_t len2 = last2 - first2;
  const int result = memcmp(first1, first2, min(len1, len2));
  return result != 0 ? result < 0 : len1 < len2;
}

inline bool lexicographical_compare(const char* first1, const char* last1,
                                    const char* first2, const char* last2)
{

  return lexicographical_compare((const signed char*) first1,
                                 (const signed char*) last1,
                                 (const signed char*) first2,
                                 (const signed char*) last2);






}

template <class InputIterator1, class InputIterator2>
int lexicographical_compare_3way(InputIterator1 first1, InputIterator1 last1,
                                 InputIterator2 first2, InputIterator2 last2)
{
    while (first1 != last1 && first2 != last2) {
        if (*first1 < *first2) return -1;
        if (*first2 < *first1) return 1;
	++first1; ++first2;
    }
    if (first2 == last2) {
	return !(first1 == last1);
    } else {
        return -1;
    }
}

inline int
lexicographical_compare_3way(const unsigned char* first1,
                             const unsigned char* last1,
                             const unsigned char* first2,
                             const unsigned char* last2)
{
  const int len1 = last1 - first1;
  const int len2 = last2 - first2;
  const int result = memcmp(first1, first2, min(len1, len2));
  return result == 0 ?  len1 - len2 : result;
}

inline int lexicographical_compare_3way(const char* first1, const char* last1,
                                        const char* first2, const char* last2)
{

  return lexicographical_compare_3way(
				(const signed char*) first1,
                                (const signed char*) last1,
                                (const signed char*) first2,
                                (const signed char*) last2);






}

template <class T>
inline void destroy(T* pointer) {
    pointer->~T();
}

template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
    new (p) T1(value);
}

template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
  for ( ; first < last; ++first)
    destroy(&*first);
}

template <class ForwardIterator> 
inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {
}

template <class ForwardIterator, class T>
inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {
  __destroy_aux(first, last, __type_traits<T>::has_trivial_destructor());
}

template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {
  __destroy(first, last, value_type(first));
}

inline void destroy(char*, char*) {}
inline void destroy(wchar_t*, wchar_t*) {}

 
 
template <class InputIterator, class ForwardIterator>
inline ForwardIterator 
__uninitialized_copy_aux(InputIterator first, InputIterator last,
                         ForwardIterator result,
                         __true_type) {
  return copy(first, last, result);
}

template <class InputIterator, class ForwardIterator>
ForwardIterator 
__uninitialized_copy_aux(InputIterator first, InputIterator last,
                         ForwardIterator result,
                         __false_type) {
  ForwardIterator cur = result;

  try {

    for ( ; first != last; ++first, ++cur)
      construct(&*cur, *first);
    return cur;

  }
  catch(...) {
    destroy(result, cur);
    throw;
  }

}


template <class InputIterator, class ForwardIterator, class T>
inline ForwardIterator
__uninitialized_copy(InputIterator first, InputIterator last,
                     ForwardIterator result, T*) {
  return __uninitialized_copy_aux(first, last, result,
                                  __type_traits<T>::is_POD_type());
}

template <class InputIterator, class ForwardIterator>
inline ForwardIterator
  uninitialized_copy(InputIterator first, InputIterator last,
                     ForwardIterator result) {
  return __uninitialized_copy(first, last, result, value_type(result));
}

inline char* uninitialized_copy(const char* first, const char* last,
                                char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last,
                                   wchar_t* result) {
  memmove(result, first, sizeof(wchar_t) * (last - first));
  return result + (last - first);
}

template <class InputIterator, class Size, class ForwardIterator>
ForwardIterator __uninitialized_copy_n(InputIterator first, Size count,
                                       ForwardIterator result,
                                       input_iterator_tag) {
  ForwardIterator cur = result;

  try {

    for ( ; count > 0 ; --count, ++first, ++cur) 
      construct(&*cur, *first);
    return cur;

  }
  catch(...) {
    destroy(result, cur);
    throw;
  }

}

template <class ForwardIterator1, class Size, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_n(ForwardIterator1 first, Size count,
                       ForwardIterator result,
                       forward_iterator_tag) {
  return __uninitialized_copy_n(first, count, result, input_iterator_tag());
}

template <class BidirectionalIterator, class Size, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_n(BidirectionalIterator first, Size count,
                       ForwardIterator result,
                       bidirectional_iterator_tag) {
  return __uninitialized_copy_n(first, count, result, input_iterator_tag());
}

template <class RandomAccessIterator, class Size, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_n(RandomAccessIterator first, Size count,
                       ForwardIterator result,
                       random_access_iterator_tag) {
  return uninitialized_copy(first, first + count, result);
}

template <class InputIterator, class Size, class ForwardIterator>
inline ForwardIterator uninitialized_copy_n(InputIterator first, Size count,
                                            ForwardIterator result) {
  return __uninitialized_copy_n(first, count, result,
                                iterator_category(first));
}

 
 
template <class ForwardIterator, class T>
inline void
__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
                         const T& x, __true_type)
{
  fill(first, last, x);
}

template <class ForwardIterator, class T>
void
__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
                         const T& x, __false_type)
{
  ForwardIterator cur = first;

  try {

    for ( ; cur != last; ++cur)
      construct(&*cur, x);

  }
  catch(...) {
    destroy(first, cur);
    throw;
  }

}

template <class ForwardIterator, class T, class T1>
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, 
                                 const T& x, T1*) {
  __uninitialized_fill_aux(first, last, x,
                           __type_traits<T1>::is_POD_type());
}

template <class ForwardIterator, class T>
inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, 
                               const T& x) {
  __uninitialized_fill(first, last, x, value_type(first));
}

 
 
template <class ForwardIterator, class Size, class T>
inline ForwardIterator
__uninitialized_fill_n_aux(ForwardIterator first, Size n,
                           const T& x, __true_type) {
  return fill_n(first, n, x);
}

template <class ForwardIterator, class Size, class T>
ForwardIterator
__uninitialized_fill_n_aux(ForwardIterator first, Size n,
                           const T& x, __false_type) {
  ForwardIterator cur = first;

  try {

    for ( ; n > 0; --n, ++cur)
      construct(&*cur, x);
    return cur;

  }
  catch(...) {
    destroy(first, cur);
    throw;
  }

}

template <class ForwardIterator, class Size, class T, class T1>
inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n,
                                              const T& x, T1*) {
  return __uninitialized_fill_n_aux(first, n, x,
                                    __type_traits<T1>::is_POD_type());
}

template <class ForwardIterator, class Size, class T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n,
                                            const T& x) {
  return __uninitialized_fill_n(first, n, x, value_type(first));
}

 
 
 

template <class InputIterator1, class InputIterator2, class ForwardIterator>
inline ForwardIterator
__uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1,
                          InputIterator2 first2, InputIterator2 last2,
                          ForwardIterator result) {
  ForwardIterator mid = uninitialized_copy(first1, last1, result);

  try {

    return uninitialized_copy(first2, last2, mid);

  }
  catch(...) {
    destroy(result, mid);
    throw;
  }

}

 
 
template <class ForwardIterator, class T, class InputIterator>
inline ForwardIterator 
__uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,
                          const T& x,
                          InputIterator first, InputIterator last) {
  uninitialized_fill(result, mid, x);

  try {

    return uninitialized_copy(first, last, mid);

  }
  catch(...) {
    destroy(result, mid);
    throw;
  }

}

 
 
template <class InputIterator, class ForwardIterator, class T>
inline void
__uninitialized_copy_fill(InputIterator first1, InputIterator last1,
                          ForwardIterator first2, ForwardIterator last2,
                          const T& x) {
  ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);

  try {

    uninitialized_fill(mid2, last2, x);

  }
  catch(...) {
    destroy(first2, mid2);
    throw;
  }

}


# 32 "/home/room1/kriol/local/include/g++/algo.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/heap.h" 1 3
 





















template <class RandomAccessIterator, class Distance, class T>
void __push_heap(RandomAccessIterator first, Distance holeIndex,
		 Distance topIndex, T value) {
    Distance parent = (holeIndex - 1) / 2;
    while (holeIndex > topIndex && *(first + parent) < value) {
	*(first + holeIndex) = *(first + parent);
	holeIndex = parent;
	parent = (holeIndex - 1) / 2;
    }    
    *(first + holeIndex) = value;
}

template <class RandomAccessIterator, class Distance, class T>
inline void __push_heap_aux(RandomAccessIterator first,
			    RandomAccessIterator last, Distance*, T*) {
    __push_heap(first, Distance((last - first) - 1), Distance(0), 
		T(*(last - 1)));
}

template <class RandomAccessIterator>
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last) {
    __push_heap_aux(first, last, distance_type(first), value_type(first));
}

template <class RandomAccessIterator, class Distance, class T, class Compare>
void __push_heap(RandomAccessIterator first, Distance holeIndex,
		 Distance topIndex, T value, Compare comp) {
    Distance parent = (holeIndex - 1) / 2;
    while (holeIndex > topIndex && comp(*(first + parent), value)) {
	*(first + holeIndex) = *(first + parent);
	holeIndex = parent;
	parent = (holeIndex - 1) / 2;
    }
    *(first + holeIndex) = value;
}

template <class RandomAccessIterator, class Compare, class Distance, class T>
inline void __push_heap_aux(RandomAccessIterator first,
			    RandomAccessIterator last, Compare comp,
			    Distance*, T*) {
    __push_heap(first, Distance((last - first) - 1), Distance(0), 
		T(*(last - 1)), comp);
}

template <class RandomAccessIterator, class Compare>
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last,
		      Compare comp) {
    __push_heap_aux(first, last, comp, distance_type(first), value_type(first));
}

template <class RandomAccessIterator, class Distance, class T>
void __adjust_heap(RandomAccessIterator first, Distance holeIndex,
		   Distance len, T value) {
    Distance topIndex = holeIndex;
    Distance secondChild = 2 * holeIndex + 2;
    while (secondChild < len) {
	if (*(first + secondChild) < *(first + (secondChild - 1)))
	    secondChild--;
	*(first + holeIndex) = *(first + secondChild);
	holeIndex = secondChild;
	secondChild = 2 * (secondChild + 1);
    }
    if (secondChild == len) {
	*(first + holeIndex) = *(first + (secondChild - 1));
	holeIndex = secondChild - 1;
    }
    __push_heap(first, holeIndex, topIndex, value);
}

template <class RandomAccessIterator, class T, class Distance>
inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last,
		       RandomAccessIterator result, T value, Distance*) {
    *result = *first;
    __adjust_heap(first, Distance(0), Distance(last - first), value);
}

template <class RandomAccessIterator, class T>
inline void __pop_heap_aux(RandomAccessIterator first,
			   RandomAccessIterator last, T*) {
    __pop_heap(first, last - 1, last - 1, T(*(last - 1)), distance_type(first));
}

template <class RandomAccessIterator>
inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last) {
    __pop_heap_aux(first, last, value_type(first));
}

template <class RandomAccessIterator, class Distance, class T, class Compare>
void __adjust_heap(RandomAccessIterator first, Distance holeIndex,
		   Distance len, T value, Compare comp) {
    Distance topIndex = holeIndex;
    Distance secondChild = 2 * holeIndex + 2;
    while (secondChild < len) {
	if (comp(*(first + secondChild), *(first + (secondChild - 1))))
	    secondChild--;
	*(first + holeIndex) = *(first + secondChild);
	holeIndex = secondChild;
	secondChild = 2 * (secondChild + 1);
    }
    if (secondChild == len) {
	*(first + holeIndex) = *(first + (secondChild - 1));
	holeIndex = secondChild - 1;
    }
    __push_heap(first, holeIndex, topIndex, value, comp);
}

template <class RandomAccessIterator, class T, class Compare, class Distance>
inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last,
		       RandomAccessIterator result, T value, Compare comp,
		       Distance*) {
    *result = *first;
    __adjust_heap(first, Distance(0), Distance(last - first), value, comp);
}

template <class RandomAccessIterator, class T, class Compare>
inline void __pop_heap_aux(RandomAccessIterator first,
			   RandomAccessIterator last, T*, Compare comp) {
    __pop_heap(first, last - 1, last - 1, T(*(last - 1)), comp,
	       distance_type(first));
}

template <class RandomAccessIterator, class Compare>
inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last,
		     Compare comp) {
    __pop_heap_aux(first, last, value_type(first), comp);
}

template <class RandomAccessIterator, class T, class Distance>
void __make_heap(RandomAccessIterator first, RandomAccessIterator last, T*,
		 Distance*) {
    if (last - first < 2) return;
    Distance len = last - first;
    Distance parent = (len - 2)/2;
    
    while (true) {
	__adjust_heap(first, parent, len, T(*(first + parent)));
	if (parent == 0) return;
	parent--;
    }
}

template <class RandomAccessIterator>
inline void make_heap(RandomAccessIterator first, RandomAccessIterator last) {
    __make_heap(first, last, value_type(first), distance_type(first));
}

template <class RandomAccessIterator, class Compare, class T, class Distance>
void __make_heap(RandomAccessIterator first, RandomAccessIterator last,
		 Compare comp, T*, Distance*) {
    if (last - first < 2) return;
    Distance len = last - first;
    Distance parent = (len - 2)/2;
    
    while (true) {
	__adjust_heap(first, parent, len, T(*(first + parent)), comp);
	if (parent == 0) return;
	parent--;
    }
}

template <class RandomAccessIterator, class Compare>
inline void make_heap(RandomAccessIterator first, RandomAccessIterator last,
		      Compare comp) {
    __make_heap(first, last, comp, value_type(first), distance_type(first));
}

template <class RandomAccessIterator>
void sort_heap(RandomAccessIterator first, RandomAccessIterator last) {
    while (last - first > 1) pop_heap(first, last--);
}

template <class RandomAccessIterator, class Compare>
void sort_heap(RandomAccessIterator first, RandomAccessIterator last,
	       Compare comp) {
    while (last - first > 1) pop_heap(first, last--, comp);
}






# 33 "/home/room1/kriol/local/include/g++/algo.h" 2 3

# 1 "/home/room1/kriol/local/include/g++/tempbuf.h" 1 3
 




























# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 1 3 4
 


 

# 113 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/limits.h" 3 4







# 30 "/home/room1/kriol/local/include/g++/tempbuf.h" 2 3

# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 1 3 4
# 327 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/stddef.h" 3 4

# 31 "/home/room1/kriol/local/include/g++/tempbuf.h" 2 3





template <class T>
pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len, T*) {
  if (len > ptrdiff_t(2147483647   / sizeof(T)))
    len = 2147483647   / sizeof(T);

  while (len > 0) {
    T* tmp = (T*) malloc((size_t)len * sizeof(T));
    if (tmp != 0)
      return pair<T*, ptrdiff_t>(tmp, len);
    len /= 2;
  }

  return pair<T*, ptrdiff_t>((T*)0, 0);
}

template <class T>
void return_temporary_buffer(T* p) {
  free(p);
}

template <class ForwardIterator,
          class T  >
class temporary_buffer {
private:
  ptrdiff_t original_len;
  ptrdiff_t len;
  T* buffer;

  void allocate_buffer() {
    original_len = len;
    buffer = 0;

    if (len > (ptrdiff_t)(2147483647   / sizeof(T)))
      len = 2147483647   / sizeof(T);

    while (len > 0) {
      buffer = (T*) malloc(len * sizeof(T));
      if (buffer)
        break;
      len /= 2;
    }
  }

  void initialize_buffer(const T&, __true_type) {}
  void initialize_buffer(const T& val, __false_type) {
    uninitialized_fill_n(buffer, len, val);
  }

public:
  ptrdiff_t size() const { return len; }
  ptrdiff_t requested_size() const { return original_len; }
  T* begin() { return buffer; }
  T* end() { return buffer + len; }

  temporary_buffer(ForwardIterator first, ForwardIterator last) {

    try {

      len = 0;
      distance(first, last, len);
      allocate_buffer();
      if (len > 0)
        initialize_buffer(*first,
                          __type_traits<T>::has_trivial_default_constructor());

    }
    catch(...) {
      free(buffer);
      buffer = 0;
      len = 0;
      throw;
    }

  }
 
  ~temporary_buffer() {  
    destroy(buffer, buffer + len);
    free(buffer);
  }

private:
  temporary_buffer(const temporary_buffer&) {}
  void operator=(const temporary_buffer&) {}
};


# 34 "/home/room1/kriol/local/include/g++/algo.h" 2 3






template <class T>
inline const T& __median(const T& a, const T& b, const T& c) {
    if (a < b)
	if (b < c)
	    return b;
	else if (a < c)
	    return c;
	else
	    return a;
    else if (a < c)
	return a;
    else if (b < c)
	return c;
    else
	return b;
}

template <class T, class Compare>
inline const T& __median(const T& a, const T& b, const T& c, Compare comp) {
    if (comp(a, b))
	if (comp(b, c))
	    return b;
	else if (comp(a, c))
	    return c;
	else
	    return a;
    else if (comp(a, c))
	return a;
    else if (comp(b, c))
	return c;
    else
	return b;
}

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f) {
  for ( ; first != last; ++first)
    f(*first);
  return f;
}

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
    while (first != last && *first != value) ++first;
    return first;
}

template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
		      Predicate pred) {
    while (first != last && !pred(*first)) ++first;
    return first;
}

template <class ForwardIterator>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) {
    if (first == last) return last;
    ForwardIterator next = first;
    while(++next != last) {
	if (*first == *next) return first;
	first = next;
    }
    return last;
}

template <class ForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last,
			      BinaryPredicate binary_pred) {
    if (first == last) return last;
    ForwardIterator next = first;
    while(++next != last) {
	if (binary_pred(*first, *next)) return first;
	first = next;
    }
    return last;
}

template <class InputIterator, class T, class Size>
void count(InputIterator first, InputIterator last, const T& value,
	   Size& n) {
  for ( ; first != last; ++first)
    if (*first == value)
      ++n;
}

template <class InputIterator, class Predicate, class Size>
void count_if(InputIterator first, InputIterator last, Predicate pred,
	      Size& n) {
  for ( ; first != last; ++first)
    if (pred(*first))
      ++n;
}



template <class InputIterator, class T>
iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& value) {
  iterator_traits<InputIterator>::difference_type n = 0;
  for ( ; first != last; ++first)
    if (*first == value)
      ++n;
  return n;
}

template <class InputIterator, class Predicate>
iterator_traits<InputIterator>::difference_type
count_if(InputIterator first, InputIterator last, Predicate pred) {
  iterator_traits<InputIterator>::difference_type n = 0;
  for ( ; first != last; ++first)
    if (pred(*first))
      ++n;
  return n;
}




template <class ForwardIterator1, class ForwardIterator2, class Distance1,
          class Distance2>
ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2,
                          Distance1*, Distance2*) {
  Distance1 d1 = 0;
  distance(first1, last1, d1);
  Distance2 d2 = 0;
  distance(first2, last2, d2);

  if (d1 < d2) return last1;

  ForwardIterator1 current1 = first1;
  ForwardIterator2 current2 = first2;

  while (current2 != last2) 
    if (*current1 == *current2) {
      ++current1;
      ++current2;
    }
    else {
      if (d1 == d2)
        return last1;
      else {
        current1 = ++first1;
        current2 = first2;
        --d1;
      }
    }
  return first1;
}

template <class ForwardIterator1, class ForwardIterator2>
inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
			       ForwardIterator2 first2, ForwardIterator2 last2)
{
    return __search(first1, last1, first2, last2, distance_type(first1),
		    distance_type(first2));
}

template <class ForwardIterator1, class ForwardIterator2,
          class BinaryPredicate, class Distance1, class Distance2>
ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2,
                          BinaryPredicate binary_pred, Distance1*, Distance2*) {
  Distance1 d1 = 0;
  distance(first1, last1, d1);
  Distance2 d2 = 0;
  distance(first2, last2, d2);

  if (d1 < d2) return last1;

  ForwardIterator1 current1 = first1;
  ForwardIterator2 current2 = first2;

  while (current2 != last2)
    if (binary_pred(*current1, *current2)) {
      ++current1;
      ++current2;
    }
    else {
      if (d1 == d2)
        return last1;
      else {
        current1 = ++first1;
        current2 = first2;
        --d1;
      }
    }
  return first1;
}

template <class ForwardIterator1, class ForwardIterator2,
	  class BinaryPredicate>
inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
			       ForwardIterator2 first2, ForwardIterator2 last2,
			       BinaryPredicate binary_pred) {
    return __search(first1, last1, first2, last2, binary_pred,
		    distance_type(first1), distance_type(first2));
}

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1,
			     ForwardIterator2 first2) {
  for ( ; first1 != last1; ++first1, ++first2)
    iter_swap(first1, first2);
  return first2;
}

template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator first, InputIterator last,
			 OutputIterator result, UnaryOperation op) {
  for ( ; first != last; ++first, ++result)
    *result = op(*first);
  return result;
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
	  class BinaryOperation>
OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
			 InputIterator2 first2, OutputIterator result,
			 BinaryOperation binary_op) {
  for ( ; first1 != last1; ++first1, ++first2, ++result)
    *result = binary_op(*first1, *first2);
  return result;
}

template <class ForwardIterator, class T>
void replace(ForwardIterator first, ForwardIterator last, const T& old_value,
	     const T& new_value) {
  for ( ; first != last; ++first)
    if (*first == old_value) *first = new_value;
}

template <class ForwardIterator, class Predicate, class T>
void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred,
		const T& new_value) {
  for ( ; first != last; ++first)
    if (pred(*first)) *first = new_value;
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy(InputIterator first, InputIterator last,
			    OutputIterator result, const T& old_value,
			    const T& new_value) {
  for ( ; first != last; ++first, ++result)
    *result = *first == old_value ? new_value : *first;
  return result;
}

template <class Iterator, class OutputIterator, class Predicate, class T>
OutputIterator replace_copy_if(Iterator first, Iterator last,
			       OutputIterator result, Predicate pred,
			       const T& new_value) {
  for ( ; first != last; ++first, ++result)
    *result = pred(*first) ? new_value : *first;
  return result;
}

template <class ForwardIterator, class Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen) {
  for ( ; first != last; ++first)
    *first = gen();
}

template <class OutputIterator, class Size, class Generator>
OutputIterator generate_n(OutputIterator first, Size n, Generator gen) {
  for ( ; n > 0; --n, ++first)
    *first = gen();
  return first;
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy(InputIterator first, InputIterator last,
                           OutputIterator result, const T& value) {
  for ( ; first != last; ++first)
    if (*first != value) {
      *result = *first;
      ++result;
    }
  return result;
}

template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator remove_copy_if(InputIterator first, InputIterator last,
                              OutputIterator result, Predicate pred) {
  for ( ; first != last; ++first)
    if (!pred(*first)) {
      *result = *first;
      ++result;
    }
  return result;
}

template <class ForwardIterator, class T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last,
		       const T& value) {
    first = find(first, last, value);
    ForwardIterator next = first;
    return first == last ? first : remove_copy(++next, last, first, value);
}

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
			  Predicate pred) {
    first = find_if(first, last, pred);
    ForwardIterator next = first;
    return first == last ? first : remove_copy_if(++next, last, first, pred);
}

template <class InputIterator, class ForwardIterator>
ForwardIterator __unique_copy(InputIterator first, InputIterator last,
			      ForwardIterator result, forward_iterator_tag) {
    *result = *first;
    while (++first != last)
        if (*result != *first) *++result = *first;
    return ++result;
}

template <class InputIterator, class BidirectionalIterator>
inline BidirectionalIterator __unique_copy(InputIterator first, 
					   InputIterator last,
			            	   BidirectionalIterator result, 
				    	   bidirectional_iterator_tag) {
    return __unique_copy(first, last, result, forward_iterator_tag());
}

template <class InputIterator, class RandomAccessIterator>
inline RandomAccessIterator __unique_copy(InputIterator first, 
					  InputIterator last,
			           	  RandomAccessIterator result, 
				   	  random_access_iterator_tag) {
    return __unique_copy(first, last, result, forward_iterator_tag());
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator __unique_copy(InputIterator first, InputIterator last,
			     OutputIterator result, T*) {
    T value = *first;
    *result = value;
    while (++first != last)
	if (value != *first) {
	    value = *first;
	    *++result = value;
	}
    return ++result;
}

template <class InputIterator, class OutputIterator>
inline OutputIterator __unique_copy(InputIterator first, InputIterator last,
                             	    OutputIterator result, 
				    output_iterator_tag) {
    return __unique_copy(first, last, result, value_type(first));
}

template <class InputIterator, class OutputIterator>
inline OutputIterator unique_copy(InputIterator first, InputIterator last,
			   	  OutputIterator result) {
    if (first == last) return result;
    return __unique_copy(first, last, result, iterator_category(result));
}
template <class InputIterator, class ForwardIterator, class BinaryPredicate>
ForwardIterator __unique_copy(InputIterator first, InputIterator last,
			      ForwardIterator result, 
			      BinaryPredicate binary_pred,
			      forward_iterator_tag) {
    *result = *first;
    while (++first != last)
        if (!binary_pred(*result, *first)) *++result = *first;
    return ++result;
}

template <class InputIterator, class BidirectionalIterator,
          class BinaryPredicate>
inline BidirectionalIterator __unique_copy(InputIterator first, 
					   InputIterator last,
			            	   BidirectionalIterator result, 
					   BinaryPredicate binary_pred,
				    	   bidirectional_iterator_tag) {
    return __unique_copy(first, last, result, binary_pred,
			 forward_iterator_tag());
}

template <class InputIterator, class RandomAccessIterator,
          class BinaryPredicate>
inline RandomAccessIterator __unique_copy(InputIterator first, 
					  InputIterator last,
			           	  RandomAccessIterator result, 
					  BinaryPredicate binary_pred,
				   	  random_access_iterator_tag) {
    return __unique_copy(first, last, result, binary_pred, 
			 forward_iterator_tag());
}

template <class InputIterator, class OutputIterator, class BinaryPredicate,
          class T>
OutputIterator __unique_copy(InputIterator first, InputIterator last,
			     OutputIterator result,
			     BinaryPredicate binary_pred, T*) {
    T value = *first;
    *result = value;
    while (++first != last)
	if (!binary_pred(value, *first)) {
	    value = *first;
	    *++result = value;
	}
    return ++result;
}

template <class InputIterator, class OutputIterator, class BinaryPredicate>
inline OutputIterator __unique_copy(InputIterator first, InputIterator last,
                             	    OutputIterator result,
				    BinaryPredicate binary_pred,
				    output_iterator_tag) {
    return __unique_copy(first, last, result, binary_pred, value_type(first));
}

template <class InputIterator, class OutputIterator, class BinaryPredicate>
inline OutputIterator unique_copy(InputIterator first, InputIterator last,
			   	  OutputIterator result,
				  BinaryPredicate binary_pred) {
    if (first == last) return result;
    return __unique_copy(first, last, result, binary_pred,
			 iterator_category(result));
}

template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last) {
    first = adjacent_find(first, last);
    return unique_copy(first, last, first);
}

template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(ForwardIterator first, ForwardIterator last,
		       BinaryPredicate binary_pred) {
    first = adjacent_find(first, last, binary_pred);
    return unique_copy(first, last, first, binary_pred);
}

template <class BidirectionalIterator>
void __reverse(BidirectionalIterator first, BidirectionalIterator last, 
	       bidirectional_iterator_tag) {
    while (true)
        if (first == last || first == --last)
	    return;
        else
	    iter_swap(first++, last);
}

template <class RandomAccessIterator>
void __reverse(RandomAccessIterator first, RandomAccessIterator last,
	       random_access_iterator_tag) {
    while (first < last) iter_swap(first++, --last);
}

template <class BidirectionalIterator>
inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {
    __reverse(first, last, iterator_category(first));
}

template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy(BidirectionalIterator first,
                            BidirectionalIterator last,
                            OutputIterator result) {
  while (first != last) {
    --last;
    *result = *last;
    ++result;
  }
  return result;
}

template <class ForwardIterator, class Distance>
void __rotate(ForwardIterator first, ForwardIterator middle,
              ForwardIterator last, Distance*, forward_iterator_tag) {
  for (ForwardIterator i = middle; ;) {
    iter_swap(first, i);
    ++first;
    ++i;
    if (first == middle) {
      if (i == last) return;
      middle = i;
    }
    else if (i == last)
      i = middle;
  }
}

template <class BidirectionalIterator, class Distance>
void __rotate(BidirectionalIterator first, BidirectionalIterator middle,
	      BidirectionalIterator last, Distance*,
	      bidirectional_iterator_tag) {
    reverse(first, middle);
    reverse(middle, last);
    reverse(first, last);
}

template <class EuclideanRingElement>
EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n)
{
    while (n != 0) {
	EuclideanRingElement t = m % n;
	m = n;
	n = t;
    }
    return m;
}

template <class RandomAccessIterator, class Distance, class T>
void __rotate_cycle(RandomAccessIterator first, RandomAccessIterator last,
		    RandomAccessIterator initial, Distance shift, T*) {
    T value = *initial;
    RandomAccessIterator ptr1 = initial;
    RandomAccessIterator ptr2 = ptr1 + shift;
    while (ptr2 != initial) {
	*ptr1 = *ptr2;
	ptr1 = ptr2;
	if (last - ptr2 > shift)
	    ptr2 += shift;
	else
	    ptr2 = first + (shift - (last - ptr2));
    }
    *ptr1 = value;
}

template <class RandomAccessIterator, class Distance>
void __rotate(RandomAccessIterator first, RandomAccessIterator middle,
	      RandomAccessIterator last, Distance*,
	      random_access_iterator_tag) {
    Distance n = __gcd(last - first, middle - first);
    while (n--)
	__rotate_cycle(first, last, first + n, middle - first,
		       value_type(first));
}

template <class ForwardIterator>
inline void rotate(ForwardIterator first, ForwardIterator middle,
		   ForwardIterator last) {
    if (first == middle || middle == last) return;
    __rotate(first, middle, last, distance_type(first),
	     iterator_category(first));
}

template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle,
			   ForwardIterator last, OutputIterator result) {
    return copy(first, middle, copy(middle, last, result));
}

template <class RandomAccessIterator, class Distance>
void __random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
		      Distance*) {
    if (first == last) return;
    for (RandomAccessIterator i = first + 1; i != last; ++i) 



      iter_swap(i, first + Distance(lrand48() % ((i - first) + 1)));

}

template <class RandomAccessIterator>
inline void random_shuffle(RandomAccessIterator first,
			   RandomAccessIterator last) {
    __random_shuffle(first, last, distance_type(first));
}

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
		    RandomNumberGenerator& rand) {
    if (first == last) return;
    for (RandomAccessIterator i = first + 1; i != last; ++i)
	iter_swap(i, first + rand((i - first) + 1));
}

template <class ForwardIterator, class OutputIterator, class Distance>
OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
                               OutputIterator out, const Distance n)
{
  Distance remaining = 0;
  distance(first, last, remaining);
  Distance m = min(n, remaining);

  while (m > 0) {



    if (lrand48() % remaining < m) {

      *out = *first;
      ++out;
      --m;
    }

    --remaining;
    ++first;
  }
  return out;
}

template <class ForwardIterator, class OutputIterator, class Distance,
          class RandomNumberGenerator>
OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
                               OutputIterator out, const Distance n,
                               RandomNumberGenerator& rand)
{
  Distance remaining = 0;
  distance(first, last, remaining);
  Distance m = min(n, remaining);

  while (m > 0) {
    if (rand(remaining) < m) {
      *out = *first;
      ++out;
      --m;
    }

    --remaining;
    ++first;
  }
  return out;
}

template <class InputIterator, class RandomAccessIterator, class Distance>
RandomAccessIterator __random_sample(InputIterator first, InputIterator last,
                                     RandomAccessIterator out,
                                     const Distance n)
{
  Distance m = 0;
  Distance t = n;
  for ( ; first != last && m < n; ++m, ++first) 
    out[m] = *first;

  while (first != last) {
    ++t;



    Distance M = lrand48() % t;

    if (M < n)
      out[M] = *first;
    ++first;
  }

  return out + m;
}

template <class InputIterator, class RandomAccessIterator,
          class RandomNumberGenerator, class Distance>
RandomAccessIterator __random_sample(InputIterator first, InputIterator last,
                                     RandomAccessIterator out,
                                     RandomNumberGenerator& rand,
                                     const Distance n)
{
  Distance m = 0;
  Distance t = n;
  for ( ; first != last && m < n; ++m, ++first)
    out[m] = *first;

  while (first != last) {
    ++t;
    Distance M = rand(t);
    if (M < n)
      out[M] = *first;
    ++first;
  }

  return out + m;
}

template <class InputIterator, class RandomAccessIterator>
inline RandomAccessIterator
random_sample(InputIterator first, InputIterator last,
              RandomAccessIterator out_first, RandomAccessIterator out_last) 
{
  return __random_sample(first, last, out_first, out_last - out_first);
}

template <class InputIterator, class RandomAccessIterator, 
          class RandomNumberGenerator>
inline RandomAccessIterator
random_sample(InputIterator first, InputIterator last,
              RandomAccessIterator out_first, RandomAccessIterator out_last,
              RandomNumberGenerator& rand) 
{
  return __random_sample(first, last, out_first, rand, out_last - out_first);
}



template <class BidirectionalIterator, class Predicate>
BidirectionalIterator partition(BidirectionalIterator first,
				BidirectionalIterator last, Predicate pred) {
    while (true) {
	while (true)
	    if (first == last)
		return first;
	    else if (pred(*first))
		++first;
	    else
		break;
	--last;
	while (true)
	    if (first == last)
		return first;
	    else if (!pred(*last))
		--last;
	    else
		break;
	iter_swap(first, last);
	++first;
    }
}

template <class ForwardIterator, class Predicate, class Distance>
ForwardIterator __inplace_stable_partition(ForwardIterator first,
					   ForwardIterator last,
					   Predicate pred, Distance len) {
    if (len == 1) return pred(*first) ? last : first;
    ForwardIterator middle = first;
    advance(middle, len / 2);
    ForwardIterator 
	first_cut = __inplace_stable_partition(first, middle, pred, len / 2);
    ForwardIterator 
	second_cut = __inplace_stable_partition(middle, last, pred,
						len - len / 2);
    rotate(first_cut, middle, second_cut);
    len = 0;
    distance(middle, second_cut, len);
    advance(first_cut, len);
    return first_cut;
}

template <class ForwardIterator, class Pointer, class Predicate, 
          class Distance>
ForwardIterator __stable_partition_adaptive(ForwardIterator first,
                                            ForwardIterator last,
                                            Predicate pred, Distance len,
                                            Pointer buffer,
                                            Distance buffer_size) {
  if (len <= buffer_size) {
    ForwardIterator result1 = first;
    Pointer result2 = buffer;
    for ( ; first != last ; ++first)
      if (pred(*first)) {
        *result1 = *first;
        ++result1;
      }
      else {
        *result2 = *first;
        ++result2;
      }
    copy(buffer, result2, result1);
    return result1;
  }
  else {
    ForwardIterator middle = first;
    advance(middle, len / 2);
    ForwardIterator first_cut =
      __stable_partition_adaptive(first, middle, pred, len / 2,
                                  buffer, buffer_size);
    ForwardIterator second_cut =
      __stable_partition_adaptive(middle, last, pred, len - len / 2,
                                  buffer, buffer_size);

    rotate(first_cut, middle, second_cut);
    len = 0;
    distance(middle, second_cut, len);
    advance(first_cut, len);
    return first_cut;
  }
}

template <class ForwardIterator, class Predicate, class T, class Distance>
inline ForwardIterator __stable_partition_aux(ForwardIterator first,
                                              ForwardIterator last, 
                                              Predicate pred, T*, Distance*) {
  temporary_buffer<ForwardIterator, T> buf(first, last);
  if (buf.size() > 0)
    return __stable_partition_adaptive(first, last, pred,
                                       Distance(buf.requested_size()),
                                       buf.begin(), buf.size());
  else
    return __inplace_stable_partition(first, last, pred, 
                                      Distance(buf.requested_size()));
}

template <class ForwardIterator, class Predicate>
inline ForwardIterator stable_partition(ForwardIterator first,
                                        ForwardIterator last, 
                                        Predicate pred) {
  if (first == last)
    return first;
  else
    return __stable_partition_aux(first, last, pred,
                                  value_type(first), distance_type(first));
}

template <class RandomAccessIterator, class T>
RandomAccessIterator __unguarded_partition(RandomAccessIterator first, 
					   RandomAccessIterator last, 
					   T pivot) {
    while (1) {
	while (*first < pivot) ++first;
	--last;
	while (pivot < *last) --last;
	if (!(first < last)) return first;
	iter_swap(first, last);
	++first;
    }
}    

template <class RandomAccessIterator, class T, class Compare>
RandomAccessIterator __unguarded_partition(RandomAccessIterator first, 
					   RandomAccessIterator last, 
					   T pivot, Compare comp) {
    while (1) {
	while (comp(*first, pivot)) ++first;
	--last;
	while (comp(pivot, *last)) --last;
	if (!(first < last)) return first;
	iter_swap(first, last);
	++first;
    }
}

const int __stl_threshold = 16;


template <class RandomAccessIterator, class T>
void __unguarded_linear_insert(RandomAccessIterator last, T value) {
    RandomAccessIterator next = last;
    --next;
    while (value < *next) {
	*last = *next;
	last = next;
        --next;
    }
    *last = value;
}

template <class RandomAccessIterator, class T, class Compare>
void __unguarded_linear_insert(RandomAccessIterator last, T value, 
			       Compare comp) {
    RandomAccessIterator next = last;
    --next;  
    while (comp(value , *next)) {
	*last = *next;
	last = next;
        --next;
    }
    *last = value;
}

template <class RandomAccessIterator, class T>
inline void __linear_insert(RandomAccessIterator first, 
			    RandomAccessIterator last, T*) {
    T value = *last;
    if (value < *first) {
	copy_backward(first, last, last + 1);
	*first = value;
    } else
	__unguarded_linear_insert(last, value);
}

template <class RandomAccessIterator, class T, class Compare>
inline void __linear_insert(RandomAccessIterator first, 
			    RandomAccessIterator last, T*, Compare comp) {
    T value = *last;
    if (comp(value, *first)) {
	copy_backward(first, last, last + 1);
	*first = value;
    } else
	__unguarded_linear_insert(last, value, comp);
}

template <class RandomAccessIterator>
void __insertion_sort(RandomAccessIterator first, RandomAccessIterator last) {
    if (first == last) return; 
    for (RandomAccessIterator i = first + 1; i != last; ++i)
	__linear_insert(first, i, value_type(first));
}

template <class RandomAccessIterator, class Compare>
void __insertion_sort(RandomAccessIterator first,
		      RandomAccessIterator last, Compare comp) {
    if (first == last) return;
    for (RandomAccessIterator i = first + 1; i != last; ++i)
	__linear_insert(first, i, value_type(first), comp);
}

template <class RandomAccessIterator, class T>
void __unguarded_insertion_sort_aux(RandomAccessIterator first, 
				    RandomAccessIterator last, T*) {
    for (RandomAccessIterator i = first; i != last; ++i)
	__unguarded_linear_insert(i, T(*i));
}

template <class RandomAccessIterator>
inline void __unguarded_insertion_sort(RandomAccessIterator first, 
				RandomAccessIterator last) {
    __unguarded_insertion_sort_aux(first, last, value_type(first));
}

template <class RandomAccessIterator, class T, class Compare>
void __unguarded_insertion_sort_aux(RandomAccessIterator first, 
				    RandomAccessIterator last,
				    T*, Compare comp) {
    for (RandomAccessIterator i = first; i != last; ++i)
	__unguarded_linear_insert(i, T(*i), comp);
}

template <class RandomAccessIterator, class Compare>
inline void __unguarded_insertion_sort(RandomAccessIterator first, 
				       RandomAccessIterator last,
				       Compare comp) {
    __unguarded_insertion_sort_aux(first, last, value_type(first), comp);
}

template <class RandomAccessIterator>
void __final_insertion_sort(RandomAccessIterator first, 
			    RandomAccessIterator last) {
    if (last - first > __stl_threshold) {
	__insertion_sort(first, first + __stl_threshold);
	__unguarded_insertion_sort(first + __stl_threshold, last);
    } else
	__insertion_sort(first, last);
}

template <class RandomAccessIterator, class Compare>
void __final_insertion_sort(RandomAccessIterator first, 
			    RandomAccessIterator last, Compare comp) {
    if (last - first > __stl_threshold) {
	__insertion_sort(first, first + __stl_threshold, comp);
	__unguarded_insertion_sort(first + __stl_threshold, last, comp);
    } else
	__insertion_sort(first, last, comp);
}

template <class Size>
Size __lg(Size n) {
    Size k;
    for (k = 0; n != 1; n = n / 2) ++k;
    return k;
}

template <class RandomAccessIterator, class T, class Size>
void __introsort_loop(RandomAccessIterator first,
                      RandomAccessIterator last, T*,
                      Size depth_limit) {
    while (last - first > __stl_threshold) {
      if (depth_limit == 0) {
	partial_sort(first, last, last);
	return;
      }
      --depth_limit;
      RandomAccessIterator cut = __unguarded_partition
	(first, last, T(__median(*first, *(first + (last - first)/2),
				 *(last - 1))));
     __introsort_loop(cut, last, value_type(first), depth_limit);
     last = cut;
    }
}

template <class RandomAccessIterator, class T, class Size, class Compare>
void __introsort_loop(RandomAccessIterator first,
 		      RandomAccessIterator last, T*,
		      Size depth_limit, Compare comp) {
  while (last - first > __stl_threshold) {
    if (depth_limit == 0) {
      partial_sort(first, last, last, comp);
      return;
    }
    --depth_limit;
    RandomAccessIterator cut = __unguarded_partition
      (first, last, T(__median(*first, *(first + (last - first)/2),
			       *(last - 1), comp)), comp);
    __introsort_loop(cut, last, value_type(first), depth_limit, comp);
    last = cut;
  }
}

template <class RandomAccessIterator>
inline void sort(RandomAccessIterator first, RandomAccessIterator last) {
  if (first != last) {
    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2);
    __final_insertion_sort(first, last);
  }
}

template <class RandomAccessIterator, class Compare>
inline void sort(RandomAccessIterator first, RandomAccessIterator last,
                 Compare comp) {
  if (first != last) {
    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2,
                     comp);
    __final_insertion_sort(first, last, comp);
  }
}


template <class RandomAccessIterator>
void __inplace_stable_sort(RandomAccessIterator first,
			   RandomAccessIterator last) {
    if (last - first < 15) {
	__insertion_sort(first, last);
	return;
    }
    RandomAccessIterator middle = first + (last - first) / 2;
    __inplace_stable_sort(first, middle);
    __inplace_stable_sort(middle, last);
    __merge_without_buffer(first, middle, last, middle - first, last - middle);
}

template <class RandomAccessIterator, class Compare>
void __inplace_stable_sort(RandomAccessIterator first,
			   RandomAccessIterator last, Compare comp) {
    if (last - first < 15) {
	__insertion_sort(first, last, comp);
	return;
    }
    RandomAccessIterator middle = first + (last - first) / 2;
    __inplace_stable_sort(first, middle, comp);
    __inplace_stable_sort(middle, last, comp);
    __merge_without_buffer(first, middle, last, middle - first,
			   last - middle, comp);
}

template <class RandomAccessIterator1, class RandomAccessIterator2,
	  class Distance>
void __merge_sort_loop(RandomAccessIterator1 first,
		       RandomAccessIterator1 last, 
		       RandomAccessIterator2 result, Distance step_size) {
    Distance two_step = 2 * step_size;

    while (last - first >= two_step) {
	result = merge(first, first + step_size,
		       first + step_size, first + two_step, result);
	first += two_step;
    }

    step_size = min(Distance(last - first), step_size);
    merge(first, first + step_size, first + step_size, last, result);
}

template <class RandomAccessIterator1, class RandomAccessIterator2,
	  class Distance, class Compare>
void __merge_sort_loop(RandomAccessIterator1 first,
		       RandomAccessIterator1 last, 
		       RandomAccessIterator2 result, Distance step_size,
		       Compare comp) {
    Distance two_step = 2 * step_size;

    while (last - first >= two_step) {
	result = merge(first, first + step_size,
		       first + step_size, first + two_step, result, comp);
	first += two_step;
    }
    step_size = min(Distance(last - first), step_size);

    merge(first, first + step_size, first + step_size, last, result, comp);
}

const int __stl_chunk_size = 7;
        
template <class RandomAccessIterator, class Distance>
void __chunk_insertion_sort(RandomAccessIterator first, 
                            RandomAccessIterator last, Distance chunk_size) {
  while (last - first >= chunk_size) {
    __insertion_sort(first, first + chunk_size);
    first += chunk_size;
  }
  __insertion_sort(first, last);
}

template <class RandomAccessIterator, class Distance, class Compare>
void __chunk_insertion_sort(RandomAccessIterator first, 
                            RandomAccessIterator last,
                            Distance chunk_size, Compare comp) {
  while (last - first >= chunk_size) {
    __insertion_sort(first, first + chunk_size, comp);
    first += chunk_size;
  }
  __insertion_sort(first, last, comp);
}

template <class RandomAccessIterator, class Pointer, class Distance>
void __merge_sort_with_buffer(RandomAccessIterator first, 
                              RandomAccessIterator last,
                              Pointer buffer, Distance*) {
    Distance len = last - first;
    Pointer buffer_last = buffer + len;

    Distance step_size = __stl_chunk_size;
    __chunk_insertion_sort(first, last, step_size);

    while (step_size < len) {
	__merge_sort_loop(first, last, buffer, step_size);
	step_size *= 2;
	__merge_sort_loop(buffer, buffer_last, first, step_size);
	step_size *= 2;
    }
}

template <class RandomAccessIterator, class Pointer, class Distance,
          class Compare>
void __merge_sort_with_buffer(RandomAccessIterator first, 
                              RandomAccessIterator last, Pointer buffer,
                              Distance*, Compare comp) {
    Distance len = last - first;
    Pointer buffer_last = buffer + len;

    Distance step_size = __stl_chunk_size;
    __chunk_insertion_sort(first, last, step_size, comp);

    while (step_size < len) {
	__merge_sort_loop(first, last, buffer, step_size, comp);
	step_size *= 2;
	__merge_sort_loop(buffer, buffer_last, first, step_size, comp);
	step_size *= 2;
    }
}

template <class RandomAccessIterator, class Pointer, class Distance>
void __stable_sort_adaptive(RandomAccessIterator first, 
			    RandomAccessIterator last, Pointer buffer,
			    Distance buffer_size) {
    Distance len = (last - first + 1) / 2;
    RandomAccessIterator middle = first + len;
    if (len > buffer_size) {
	__stable_sort_adaptive(first, middle, buffer, buffer_size);
	__stable_sort_adaptive(middle, last, buffer, buffer_size);
    } else {
	__merge_sort_with_buffer(first, middle, buffer, (Distance*)0);
	__merge_sort_with_buffer(middle, last, buffer, (Distance*)0);
    }
    __merge_adaptive(first, middle, last, Distance(middle - first), 
		     Distance(last - middle), buffer, buffer_size);
}

template <class RandomAccessIterator, class Pointer, class Distance, 
          class Compare>
void __stable_sort_adaptive(RandomAccessIterator first, 
                            RandomAccessIterator last, Pointer buffer,
                            Distance buffer_size, Compare comp) {
    Distance len = (last - first + 1) / 2;
    RandomAccessIterator middle = first + len;
    if (len > buffer_size) {
        __stable_sort_adaptive(first, middle, buffer, buffer_size, 
                               comp);
        __stable_sort_adaptive(middle, last, buffer, buffer_size, 
                               comp);
    } else {
        __merge_sort_with_buffer(first, middle, buffer, (Distance*)0, comp);
        __merge_sort_with_buffer(middle, last, buffer, (Distance*)0, comp);
    }
    __merge_adaptive(first, middle, last, Distance(middle - first), 
                     Distance(last - middle), buffer, buffer_size,
                     comp);
}

template <class RandomAccessIterator, class T, class Distance>
inline void __stable_sort_aux(RandomAccessIterator first,
			      RandomAccessIterator last, T*, Distance*) {
  temporary_buffer<RandomAccessIterator, T> buf(first, last);
  if (buf.begin() == 0)
    __inplace_stable_sort(first, last);
  else 
    __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()));
}

template <class RandomAccessIterator, class T, class Distance, class Compare>
inline void __stable_sort_aux(RandomAccessIterator first,
			      RandomAccessIterator last, T*, Distance*,
			      Compare comp) {
  temporary_buffer<RandomAccessIterator, T> buf(first, last);
  if (buf.begin() == 0)
    __inplace_stable_sort(first, last, comp);
  else 
    __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()),
                           comp);
}

template <class RandomAccessIterator>
inline void stable_sort(RandomAccessIterator first,
			RandomAccessIterator last) {
    __stable_sort_aux(first, last, value_type(first), distance_type(first));
}

template <class RandomAccessIterator, class Compare>
inline void stable_sort(RandomAccessIterator first,
			RandomAccessIterator last, Compare comp) {
    __stable_sort_aux(first, last, value_type(first), distance_type(first), 
		      comp);
}

template <class RandomAccessIterator, class T>
void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
		    RandomAccessIterator last, T*) {
    make_heap(first, middle);
    for (RandomAccessIterator i = middle; i < last; ++i)
	if (*i < *first) 
	  __pop_heap(first, middle, i, T(*i), distance_type(first));
    sort_heap(first, middle);
}

template <class RandomAccessIterator>
inline void partial_sort(RandomAccessIterator first,
			 RandomAccessIterator middle,
			 RandomAccessIterator last) {
    __partial_sort(first, middle, last, value_type(first));
}

template <class RandomAccessIterator, class T, class Compare>
void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
		    RandomAccessIterator last, T*, Compare comp) {
    make_heap(first, middle, comp);
    for (RandomAccessIterator i = middle; i < last; ++i)
	if (comp(*i, *first))
	  __pop_heap(first, middle, i, T(*i), comp, distance_type(first));
    sort_heap(first, middle, comp);
}

template <class RandomAccessIterator, class Compare>
inline void partial_sort(RandomAccessIterator first,
			 RandomAccessIterator middle,
			 RandomAccessIterator last, Compare comp) {
    __partial_sort(first, middle, last, value_type(first), comp);
}

template <class InputIterator, class RandomAccessIterator, class Distance,
          class T>
RandomAccessIterator __partial_sort_copy(InputIterator first,
					 InputIterator last,
					 RandomAccessIterator result_first,
					 RandomAccessIterator result_last, 
					 Distance*, T*) {
    if (result_first == result_last) return result_last;
    RandomAccessIterator result_real_last = result_first;
    while(first != last && result_real_last != result_last) {
	*result_real_last = *first;
        ++result_real_last;
        ++first;
    }
    make_heap(result_first, result_real_last);
    while (first != last) {
	if (*first < *result_first) 
	    __adjust_heap(result_first, Distance(0),
			  Distance(result_real_last - result_first), T(*first));
	++first;
    }
    sort_heap(result_first, result_real_last);
    return result_real_last;
}

template <class InputIterator, class RandomAccessIterator>
inline RandomAccessIterator
partial_sort_copy(InputIterator first, InputIterator last,
		  RandomAccessIterator result_first,
		  RandomAccessIterator result_last) {
    return __partial_sort_copy(first, last, result_first, result_last, 
			       distance_type(result_first), value_type(first));
}

template <class InputIterator, class RandomAccessIterator, class Compare,
          class Distance, class T>
RandomAccessIterator __partial_sort_copy(InputIterator first,
					 InputIterator last,
					 RandomAccessIterator result_first,
					 RandomAccessIterator result_last,
					 Compare comp, Distance*, T*) {
    if (result_first == result_last) return result_last;
    RandomAccessIterator result_real_last = result_first;
    while(first != last && result_real_last != result_last) {
	*result_real_last = *first;
        ++result_real_last;
        ++first;
    }
    make_heap(result_first, result_real_last, comp);
    while (first != last) {
	if (comp(*first, *result_first))
	    __adjust_heap(result_first, Distance(0),
			  Distance(result_real_last - result_first), T(*first),
			  comp);
	++first;
    }
    sort_heap(result_first, result_real_last, comp);
    return result_real_last;
}

template <class InputIterator, class RandomAccessIterator, class Compare>
inline RandomAccessIterator
partial_sort_copy(InputIterator first, InputIterator last,
		  RandomAccessIterator result_first,
		  RandomAccessIterator result_last, Compare comp) {
    return __partial_sort_copy(first, last, result_first, result_last, comp,
			       distance_type(result_first), value_type(first));
}

template <class RandomAccessIterator, class T>
void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,
		   RandomAccessIterator last, T*) {
    while (last - first > 3) {
	RandomAccessIterator cut = __unguarded_partition
	    (first, last, T(__median(*first, *(first + (last - first)/2),
				     *(last - 1))));
	if (cut <= nth)
	    first = cut;
	else 
	    last = cut;
    }
    __insertion_sort(first, last);
}

template <class RandomAccessIterator>
inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
			RandomAccessIterator last) {
    __nth_element(first, nth, last, value_type(first));
}

template <class RandomAccessIterator, class T, class Compare>
void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,
		   RandomAccessIterator last, T*, Compare comp) {
    while (last - first > 3) {
	RandomAccessIterator cut = __unguarded_partition
	    (first, last, T(__median(*first, *(first + (last - first)/2), 
				     *(last - 1), comp)), comp);
	if (cut <= nth)
	    first = cut;
	else 
	    last = cut;
    }
    __insertion_sort(first, last, comp);
}

template <class RandomAccessIterator, class Compare>
inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
		 RandomAccessIterator last, Compare comp) {
    __nth_element(first, nth, last, value_type(first), comp);
}

template <class ForwardIterator, class T, class Distance>
ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
			      const T& value, Distance*,
			      forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (*middle < value) {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	} else
	    len = half;
    }
    return first;
}

template <class ForwardIterator, class T, class Distance>
inline ForwardIterator __lower_bound(ForwardIterator first,
				     ForwardIterator last,
				     const T& value, Distance*,
				     bidirectional_iterator_tag) {
    return __lower_bound(first, last, value, (Distance*)0,
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Distance>
RandomAccessIterator __lower_bound(RandomAccessIterator first,
				   RandomAccessIterator last, const T& value,
				   Distance*, random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (*middle < value) {
	    first = middle + 1;
	    len = len - half - 1;
	} else
	    len = half;
    }
    return first;
}

template <class ForwardIterator, class T>
inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
				   const T& value) {
    return __lower_bound(first, last, value, distance_type(first),
			 iterator_category(first));
}

template <class ForwardIterator, class T, class Compare, class Distance>
ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
			      const T& value, Compare comp, Distance*,
			      forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (comp(*middle, value)) {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	} else
	    len = half;
    }
    return first;
}

template <class ForwardIterator, class T, class Compare, class Distance>
inline ForwardIterator __lower_bound(ForwardIterator first,
				     ForwardIterator last,
				     const T& value, Compare comp, Distance*,
				     bidirectional_iterator_tag) {
    return __lower_bound(first, last, value, comp, (Distance*)0,
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Compare, class Distance>
RandomAccessIterator __lower_bound(RandomAccessIterator first,
				   RandomAccessIterator last,
				   const T& value, Compare comp, Distance*,
				   random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (comp(*middle, value)) {
	    first = middle + 1;
	    len = len - half - 1;
	} else
	    len = half;
    }
    return first;
}

template <class ForwardIterator, class T, class Compare>
inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
				   const T& value, Compare comp) {
    return __lower_bound(first, last, value, comp, distance_type(first),
			 iterator_category(first));
}

template <class ForwardIterator, class T, class Distance>
ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
			      const T& value, Distance*,
			      forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (value < *middle)
	    len = half;
	else {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	}
    }
    return first;
}

template <class ForwardIterator, class T, class Distance>
inline ForwardIterator __upper_bound(ForwardIterator first,
				     ForwardIterator last,
				     const T& value, Distance*,
				     bidirectional_iterator_tag) {
    return __upper_bound(first, last, value, (Distance*)0,
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Distance>
RandomAccessIterator __upper_bound(RandomAccessIterator first,
				   RandomAccessIterator last, const T& value,
				   Distance*, random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (value < *middle)
	    len = half;
	else {
	    first = middle + 1;
	    len = len - half - 1;
	}
    }
    return first;
}

template <class ForwardIterator, class T>
inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
				   const T& value) {
    return __upper_bound(first, last, value, distance_type(first),
			 iterator_category(first));
}

template <class ForwardIterator, class T, class Compare, class Distance>
ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
			      const T& value, Compare comp, Distance*,
			      forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (comp(value, *middle))
	    len = half;
	else {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	}
    }
    return first;
}

template <class ForwardIterator, class T, class Compare, class Distance>
inline ForwardIterator __upper_bound(ForwardIterator first,
				     ForwardIterator last,
				     const T& value, Compare comp, Distance*,
				     bidirectional_iterator_tag) {
    return __upper_bound(first, last, value, comp, (Distance*)0,
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Compare, class Distance>
RandomAccessIterator __upper_bound(RandomAccessIterator first,
				   RandomAccessIterator last,
				   const T& value, Compare comp, Distance*,
				   random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (comp(value, *middle))
	    len = half;
	else {
	    first = middle + 1;
	    len = len - half - 1;
	}
    }
    return first;
}

template <class ForwardIterator, class T, class Compare>
inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
				   const T& value, Compare comp) {
    return __upper_bound(first, last, value, comp, distance_type(first),
			 iterator_category(first));
}

template <class ForwardIterator, class T, class Distance>
pair<ForwardIterator, ForwardIterator>
__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
	      Distance*, forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle, left, right;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (*middle < value) {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	} else if (value < *middle)
	    len = half;
	else {
	    left = lower_bound(first, middle, value);
	    advance(first, len);
	    right = upper_bound(++middle, first, value);
	    return pair<ForwardIterator, ForwardIterator>(left, right);
	}
    }
    return pair<ForwardIterator, ForwardIterator>(first, first);
}

template <class ForwardIterator, class T, class Distance>
inline pair<ForwardIterator, ForwardIterator>
__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
	      Distance*, bidirectional_iterator_tag) {
    return __equal_range(first, last, value, (Distance*)0, 
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Distance>
pair<RandomAccessIterator, RandomAccessIterator>
__equal_range(RandomAccessIterator first, RandomAccessIterator last,
	      const T& value, Distance*, random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle, left, right;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (*middle < value) {
	    first = middle + 1;
	    len = len - half - 1;
	} else if (value < *middle)
	    len = half;
	else {
	    left = lower_bound(first, middle, value);
	    right = upper_bound(++middle, first + len, value);
	    return pair<RandomAccessIterator, RandomAccessIterator>(left,
								    right);
	}
    }
    return pair<RandomAccessIterator, RandomAccessIterator>(first, first);
}

template <class ForwardIterator, class T>
inline pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last, const T& value) {
    return __equal_range(first, last, value, distance_type(first),
			 iterator_category(first));
}

template <class ForwardIterator, class T, class Compare, class Distance>
pair<ForwardIterator, ForwardIterator>
__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
	      Compare comp, Distance*, forward_iterator_tag) {
    Distance len = 0;
    distance(first, last, len);
    Distance half;
    ForwardIterator middle, left, right;

    while (len > 0) {
	half = len / 2;
	middle = first;
	advance(middle, half);
	if (comp(*middle, value)) {
	    first = middle;
	    ++first;
	    len = len - half - 1;
	} else if (comp(value, *middle))
	    len = half;
	else {
	    left = lower_bound(first, middle, value, comp);
	    advance(first, len);
	    right = upper_bound(++middle, first, value, comp);
	    return pair<ForwardIterator, ForwardIterator>(left, right);
	}
    }
    return pair<ForwardIterator, ForwardIterator>(first, first);
}           

template <class ForwardIterator, class T, class Compare, class Distance>
inline pair<ForwardIterator, ForwardIterator>
__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
	      Compare comp, Distance*, bidirectional_iterator_tag) {
    return __equal_range(first, last, value, comp, (Distance*)0, 
			 forward_iterator_tag());
}

template <class RandomAccessIterator, class T, class Compare, class Distance>
pair<RandomAccessIterator, RandomAccessIterator>
__equal_range(RandomAccessIterator first, RandomAccessIterator last,
	      const T& value, Compare comp, Distance*,
	      random_access_iterator_tag) {
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle, left, right;

    while (len > 0) {
	half = len / 2;
	middle = first + half;
	if (comp(*middle, value)) {
	    first = middle + 1;
	    len = len - half - 1;
	} else if (comp(value, *middle))
	    len = half;
	else {
	    left = lower_bound(first, middle, value, comp);
	    right = upper_bound(++middle, first + len, value, comp);
	    return pair<RandomAccessIterator, RandomAccessIterator>(left,
								    right);
	}
    }
    return pair<RandomAccessIterator, RandomAccessIterator>(first, first);
}           

template <class ForwardIterator, class T, class Compare>
inline pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last, const T& value,
	    Compare comp) {
    return __equal_range(first, last, value, comp, distance_type(first),
			 iterator_category(first));
}    

template <class ForwardIterator, class T>
bool binary_search(ForwardIterator first, ForwardIterator last,
		   const T& value) {
    ForwardIterator i = lower_bound(first, last, value);
    return i != last && !(value < *i);
}

template <class ForwardIterator, class T, class Compare>
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value,
		   Compare comp) {
    ForwardIterator i = lower_bound(first, last, value, comp);
    return i != last && !comp(value, *i);
}

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result) {
  while (first1 != last1 && first2 != last2) {
    if (*first2 < *first1) {
      *result = *first2;
      ++first2;
    }
    else {
      *result = *first1;
      ++first1;
    }
    ++result;
  }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class Compare>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result, Compare comp) {
  while (first1 != last1 && first2 != last2) {
    if (comp(*first2, *first1)) {
      *result = *first2;
      ++first2;
    }
    else {
      *result = *first1;
      ++first1;
    }
    ++result;
  }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class BidirectionalIterator, class Distance>
void __merge_without_buffer(BidirectionalIterator first,
			    BidirectionalIterator middle,
			    BidirectionalIterator last,
			    Distance len1, Distance len2) {
    if (len1 == 0 || len2 == 0) return;
    if (len1 + len2 == 2) {
	if (*middle < *first) iter_swap(first, middle);
	return;
    }
    BidirectionalIterator first_cut = first;
    BidirectionalIterator second_cut = middle;
    Distance len11 = 0;
    Distance len22 = 0;
    if (len1 > len2) {
	len11 = len1 / 2;
	advance(first_cut, len11);
	second_cut = lower_bound(middle, last, *first_cut);
	distance(middle, second_cut, len22);
    } else {
	len22 = len2 / 2;
	advance(second_cut, len22);
	first_cut = upper_bound(first, middle, *second_cut);
	distance(first, first_cut, len11);
    }
    rotate(first_cut, middle, second_cut);
    BidirectionalIterator new_middle = first_cut;
    advance(new_middle, len22);
    __merge_without_buffer(first, first_cut, new_middle, len11, len22);
    __merge_without_buffer(new_middle, second_cut, last, len1 - len11,
			   len2 - len22);
}

template <class BidirectionalIterator, class Distance, class Compare>
void __merge_without_buffer(BidirectionalIterator first,
			    BidirectionalIterator middle,
			    BidirectionalIterator last,
			    Distance len1, Distance len2, Compare comp) {
    if (len1 == 0 || len2 == 0) return;
    if (len1 + len2 == 2) {
	if (comp(*middle, *first)) iter_swap(first, middle);
	return;
    }
    BidirectionalIterator first_cut = first;
    BidirectionalIterator second_cut = middle;
    Distance len11 = 0;
    Distance len22 = 0;
    if (len1 > len2) {
	len11 = len1 / 2;
	advance(first_cut, len11);
	second_cut = lower_bound(middle, last, *first_cut, comp);
	distance(middle, second_cut, len22);
    } else {
	len22 = len2 / 2;
	advance(second_cut, len22);
	first_cut = upper_bound(first, middle, *second_cut, comp);
	distance(first, first_cut, len11);
    }
    rotate(first_cut, middle, second_cut);
    BidirectionalIterator new_middle = first_cut;
    advance(new_middle, len22);
    __merge_without_buffer(first, first_cut, new_middle, len11, len22, comp);
    __merge_without_buffer(new_middle, second_cut, last, len1 - len11,
			   len2 - len22, comp);
}

template <class BidirectionalIterator1, class BidirectionalIterator2,
	  class Distance>
BidirectionalIterator1 __rotate_adaptive(BidirectionalIterator1 first,
					 BidirectionalIterator1 middle,
					 BidirectionalIterator1 last,
					 Distance len1, Distance len2,
					 BidirectionalIterator2 buffer,
					 Distance buffer_size) {
    BidirectionalIterator2 buffer_end;
    if (len1 > len2 && len2 <= buffer_size) {
	buffer_end = copy(middle, last, buffer);
	copy_backward(first, middle, last);
	return copy(buffer, buffer_end, first);
    } else if (len1 <= buffer_size) {
	buffer_end = copy(first, middle, buffer);
	copy(middle, last, first);
	return copy_backward(buffer, buffer_end, last);
    } else  {
	rotate(first, middle, last);
	advance(first, len2);
	return first;
    }
}

template <class BidirectionalIterator1, class BidirectionalIterator2,
	  class BidirectionalIterator3>
BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,
					BidirectionalIterator1 last1,
					BidirectionalIterator2 first2,
					BidirectionalIterator2 last2,
					BidirectionalIterator3 result) {
    if (first1 == last1) return copy_backward(first2, last2, result);
    if (first2 == last2) return copy_backward(first1, last1, result);
    --last1;
    --last2;
    while (true) {
	if (*last2 < *last1) {
	    *--result = *last1;
	    if (first1 == last1) return copy_backward(first2, ++last2, result);
	    --last1;
	} else {
	    *--result = *last2;
	    if (first2 == last2) return copy_backward(first1, ++last1, result);
	    --last2;
	}
    }
}

template <class BidirectionalIterator1, class BidirectionalIterator2,
	  class BidirectionalIterator3, class Compare>
BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,
					BidirectionalIterator1 last1,
					BidirectionalIterator2 first2,
					BidirectionalIterator2 last2,
					BidirectionalIterator3 result,
					Compare comp) {
    if (first1 == last1) return copy_backward(first2, last2, result);
    if (first2 == last2) return copy_backward(first1, last1, result);
    --last1;
    --last2;
    while (true) {
	if (comp(*last2, *last1)) {
	    *--result = *last1;
	    if (first1 == last1) return copy_backward(first2, ++last2, result);
	    --last1;
	} else {
	    *--result = *last2;
	    if (first2 == last2) return copy_backward(first1, ++last1, result);
	    --last2;
	}
    }
}

template <class BidirectionalIterator, class Distance, class Pointer>
void __merge_adaptive(BidirectionalIterator first, 
		      BidirectionalIterator middle, 
		      BidirectionalIterator last, Distance len1, Distance len2,
		      Pointer buffer, Distance buffer_size) {
    if (len1 <= len2 && len1 <= buffer_size) {
        Pointer end_buffer = copy(first, middle, buffer);
        merge(buffer, end_buffer, middle, last, first);
    } else if (len2 <= buffer_size) {
        Pointer end_buffer = copy(middle, last, buffer);
        __merge_backward(first, middle, buffer, end_buffer, last);
    } else {
	BidirectionalIterator first_cut = first;
	BidirectionalIterator second_cut = middle;
	Distance len11 = 0;
	Distance len22 = 0;
	if (len1 > len2) {
	    len11 = len1 / 2;
	    advance(first_cut, len11);
	    second_cut = lower_bound(middle, last, *first_cut);
	    distance(middle, second_cut, len22);   
	} else {
	    len22 = len2 / 2;
	    advance(second_cut, len22);
	    first_cut = upper_bound(first, middle, *second_cut);
	    distance(first, first_cut, len11);
	}
	BidirectionalIterator new_middle =
	    __rotate_adaptive(first_cut, middle, second_cut, len1 - len11,
			      len22, buffer, buffer_size);
	__merge_adaptive(first, first_cut, new_middle, len11, len22, buffer,
			 buffer_size);
	__merge_adaptive(new_middle, second_cut, last, len1 - len11,
			 len2 - len22, buffer, buffer_size);
    }
}

template <class BidirectionalIterator, class Distance, class Pointer,
	  class Compare>
void __merge_adaptive(BidirectionalIterator first, 
		      BidirectionalIterator middle, 
		      BidirectionalIterator last, Distance len1, Distance len2,
		      Pointer buffer, Distance buffer_size, Compare comp) {
    if (len1 <= len2 && len1 <= buffer_size) {
	Pointer end_buffer = copy(first, middle, buffer);
	merge(buffer, end_buffer, middle, last, first, comp);
    } else if (len2 <= buffer_size) {
	Pointer end_buffer = copy(middle, last, buffer);
	__merge_backward(first, middle, buffer, end_buffer, last, comp);
    } else {
	BidirectionalIterator first_cut = first;
	BidirectionalIterator second_cut = middle;
	Distance len11 = 0;
	Distance len22 = 0;
	if (len1 > len2) {
	    len11 = len1 / 2;
	    advance(first_cut, len11);
	    second_cut = lower_bound(middle, last, *first_cut, comp);
	    distance(middle, second_cut, len22);   
	} else {
	    len22 = len2 / 2;
	    advance(second_cut, len22);
	    first_cut = upper_bound(first, middle, *second_cut, comp);
	    distance(first, first_cut, len11);
	}
	BidirectionalIterator new_middle =
	    __rotate_adaptive(first_cut, middle, second_cut, len1 - len11,
			      len22, buffer, buffer_size);
	__merge_adaptive(first, first_cut, new_middle, len11, len22, buffer,
			 buffer_size, comp);
	__merge_adaptive(new_middle, second_cut, last, len1 - len11,
			 len2 - len22, buffer, buffer_size, comp);
    }
}

template <class BidirectionalIterator, class T, class Distance>
inline void __inplace_merge_aux(BidirectionalIterator first,
				BidirectionalIterator middle,
				BidirectionalIterator last, T*, Distance*) {
    Distance len1 = 0;
    distance(first, middle, len1);
    Distance len2 = 0;
    distance(middle, last, len2);

    temporary_buffer<BidirectionalIterator, T> buf(first, last);
    if (buf.begin() == 0)
      __merge_without_buffer(first, middle, last, len1, len2);
    else
      __merge_adaptive(first, middle, last, len1, len2,
                       buf.begin(), Distance(buf.size()));
}

template <class BidirectionalIterator, class T, class Distance, class Compare>
inline void __inplace_merge_aux(BidirectionalIterator first,
				BidirectionalIterator middle,
				BidirectionalIterator last, T*, Distance*,
				Compare comp) {
    Distance len1 = 0;
    distance(first, middle, len1);
    Distance len2 = 0;
    distance(middle, last, len2);

    temporary_buffer<BidirectionalIterator, T> buf(first, last);
    if (buf.begin() == 0)
      __merge_without_buffer(first, middle, last, len1, len2, comp);
    else
      __merge_adaptive(first, middle, last, len1, len2,
                       buf.begin(), Distance(buf.size()),
                       comp);
}

template <class BidirectionalIterator>
inline void inplace_merge(BidirectionalIterator first,
			  BidirectionalIterator middle,
			  BidirectionalIterator last) {
    if (first == middle || middle == last) return;
    __inplace_merge_aux(first, middle, last, value_type(first),
			distance_type(first));
}

template <class BidirectionalIterator, class Compare>
inline void inplace_merge(BidirectionalIterator first,
			  BidirectionalIterator middle,
			  BidirectionalIterator last, Compare comp) {
    if (first == middle || middle == last) return;
    __inplace_merge_aux(first, middle, last, value_type(first),
			distance_type(first), comp);
}

template <class InputIterator1, class InputIterator2>
bool includes(InputIterator1 first1, InputIterator1 last1,
	      InputIterator2 first2, InputIterator2 last2) {
    while (first1 != last1 && first2 != last2)
	if (*first2 < *first1)
	    return false;
	else if(*first1 < *first2) 
	    ++first1;
	else
	    ++first1, ++first2;

    return first2 == last2;
}

template <class InputIterator1, class InputIterator2, class Compare>
bool includes(InputIterator1 first1, InputIterator1 last1,
	      InputIterator2 first2, InputIterator2 last2, Compare comp) {
    while (first1 != last1 && first2 != last2)
	if (comp(*first2, *first1))
	    return false;
	else if(comp(*first1, *first2)) 
	    ++first1;
	else
	    ++first1, ++first2;

    return first2 == last2;
}

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result) {
  while (first1 != last1 && first2 != last2) {
    if (*first1 < *first2) {
      *result = *first1;
      ++first1;
    }
    else if (*first2 < *first1) {
      *result = *first2;
      ++first2;
    }
    else {
      *result = *first1;
      ++first1;
      ++first2;
    }
    ++result;
  }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class Compare>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result, Compare comp) {
  while (first1 != last1 && first2 != last2) {
    if (comp(*first1, *first2)) {
      *result = *first1;
      ++first1;
    }
    else if (comp(*first2, *first1)) {
      *result = *first2;
      ++first2;
    }
    else {
      *result = *first1;
      ++first1;
      ++first2;
    }
    ++result;
  }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                                InputIterator2 first2, InputIterator2 last2,
                                OutputIterator result) {
  while (first1 != last1 && first2 != last2) 
    if (*first1 < *first2) 
      ++first1;
    else if (*first2 < *first1) 
      ++first2;
    else {
      *result = *first1;
      ++first1;
      ++first2;
      ++result;
    }
  return result;
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class Compare>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                                InputIterator2 first2, InputIterator2 last2,
                                OutputIterator result, Compare comp) {
  while (first1 != last1 && first2 != last2)
    if (comp(*first1, *first2))
      ++first1;
    else if (comp(*first2, *first1))
      ++first2;
    else {
      *result = *first1;
      ++first1;
      ++first2;
      ++result;
    }
  return result;
}

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
                              InputIterator2 first2, InputIterator2 last2,
                              OutputIterator result) {
  while (first1 != last1 && first2 != last2)
    if (*first1 < *first2) {
      *result = *first1;
      ++first1;
      ++result;
    }
    else if (*first2 < *first1)
      ++first2;
    else {
      ++first1;
      ++first2;
    }
  return copy(first1, last1, result);
}

template <class InputIterator1, class InputIterator2, class OutputIterator, 
          class Compare>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
                              InputIterator2 first2, InputIterator2 last2, 
                              OutputIterator result, Compare comp) {
  while (first1 != last1 && first2 != last2)
    if (comp(*first1, *first2)) {
      *result = *first1;
      ++first1;
      ++result;
    }
    else if (comp(*first2, *first1))
      ++first2;
    else {
      ++first1;
      ++first2;
    }
  return copy(first1, last1, result);
}

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_symmetric_difference(InputIterator1 first1,
                                        InputIterator1 last1,
                                        InputIterator2 first2,
                                        InputIterator2 last2,
                                        OutputIterator result) {
  while (first1 != last1 && first2 != last2)
    if (*first1 < *first2) {
      *result = *first1;
      ++first1;
      ++result;
    }
    else if (*first2 < *first1) {
      *result = *first2;
      ++first2;
      ++result;
    }
    else {
      ++first1;
      ++first2;
    }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class Compare>
OutputIterator set_symmetric_difference(InputIterator1 first1,
                                        InputIterator1 last1,
                                        InputIterator2 first2,
                                        InputIterator2 last2,
                                        OutputIterator result, Compare comp) {
  while (first1 != last1 && first2 != last2)
    if (comp(*first1, *first2)) {
      *result = *first1;
      ++first1;
      ++result;
    }
    else if (comp(*first2, *first1)) {
      *result = *first2;
      ++first2;
      ++result;
    }
    else {
      ++first1;
      ++first2;
    }
  return copy(first2, last2, copy(first1, last1, result));
}

template <class ForwardIterator>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last) {
    if (first == last) return first;
    ForwardIterator result = first;
    while (++first != last) 
	if (*result < *first) result = first;
    return result;
}

template <class ForwardIterator, class Compare>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last,
			    Compare comp) {
    if (first == last) return first;
    ForwardIterator result = first;
    while (++first != last) 
	if (comp(*result, *first)) result = first;
    return result;
}

template <class ForwardIterator>
ForwardIterator min_element(ForwardIterator first, ForwardIterator last) {
    if (first == last) return first;
    ForwardIterator result = first;
    while (++first != last) 
	if (*first < *result) result = first;
    return result;
}

template <class ForwardIterator, class Compare>
ForwardIterator min_element(ForwardIterator first, ForwardIterator last,
			    Compare comp) {
    if (first == last) return first;
    ForwardIterator result = first;
    while (++first != last) 
	if (comp(*first, *result)) result = first;
    return result;
}

template <class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first,
		      BidirectionalIterator last) {
    if (first == last) return false;
    BidirectionalIterator i = first;
    ++i;
    if (i == last) return false;
    i = last;
    --i;

    for(;;) {
	BidirectionalIterator ii = i;
        --i;
	if (*i < *ii) {
	    BidirectionalIterator j = last;
	    while (!(*i < *--j));
	    iter_swap(i, j);
	    reverse(ii, last);
	    return true;
	}
	if (i == first) {
	    reverse(first, last);
	    return false;
	}
    }
}

template <class BidirectionalIterator, class Compare>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last,
		      Compare comp) {
    if (first == last) return false;
    BidirectionalIterator i = first;
    ++i;
    if (i == last) return false;
    i = last;
    --i;

    for(;;) {
	BidirectionalIterator ii = i;
        --i;
	if (comp(*i, *ii)) {
	    BidirectionalIterator j = last;
	    while (!comp(*i, *--j));
	    iter_swap(i, j);
	    reverse(ii, last);
	    return true;
	}
	if (i == first) {
	    reverse(first, last);
	    return false;
	}
    }
}

template <class BidirectionalIterator>
bool prev_permutation(BidirectionalIterator first,
		      BidirectionalIterator last) {
    if (first == last) return false;
    BidirectionalIterator i = first;
    ++i;
    if (i == last) return false;
    i = last;
    --i;

    for(;;) {
	BidirectionalIterator ii = i;
        --i;
	if (*ii < *i) {
	    BidirectionalIterator j = last;
	    while (!(*--j < *i));
	    iter_swap(i, j);
	    reverse(ii, last);
	    return true;
	}
	if (i == first) {
	    reverse(first, last);
	    return false;
	}
    }
}

template <class BidirectionalIterator, class Compare>
bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last,
		      Compare comp) {
    if (first == last) return false;
    BidirectionalIterator i = first;
    ++i;
    if (i == last) return false;
    i = last;
    --i;

    for(;;) {
	BidirectionalIterator ii = i;
        --i;
	if (comp(*ii, *i)) {
	    BidirectionalIterator j = last;
	    while (!comp(*--j, *i));
	    iter_swap(i, j);
	    reverse(ii, last);
	    return true;
	}
	if (i == first) {
	    reverse(first, last);
	    return false;
	}
    }
}

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init) {
  for ( ; first != last; ++first)
    init = init + *first;
  return init;
}

template <class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init,
             BinaryOperation binary_op) {
  for ( ; first != last; ++first)
    init = binary_op(init, *first);
  return init;
}

template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init) {
  for ( ; first1 != last1; ++first1, ++first2)
    init = init + (*first1 * *first2);
  return init;
}

template <class InputIterator1, class InputIterator2, class T,
          class BinaryOperation1, class BinaryOperation2>
T inner_product(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, T init, BinaryOperation1 binary_op1,
                BinaryOperation2 binary_op2) {
  for ( ; first1 != last1; ++first1, ++first2)
    init = binary_op1(init, binary_op2(*first1, *first2));
  return init;
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator __partial_sum(InputIterator first, InputIterator last,
			     OutputIterator result, T*) {
    T value = *first;
    while (++first != last) {
	value = value + *first;
	*++result = value;
    }
    return ++result;
}

template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last,
			   OutputIterator result) {
    if (first == last) return result;
    *result = *first;
    return __partial_sum(first, last, result, value_type(first));
}

template <class InputIterator, class OutputIterator, class T,
	  class BinaryOperation>
OutputIterator __partial_sum(InputIterator first, InputIterator last,
			     OutputIterator result, T*,
			     BinaryOperation binary_op) {
    T value = *first;
    while (++first != last) {
	value = binary_op(value, *first);
	*++result = value;
    }
    return ++result;
}

template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
			   OutputIterator result, BinaryOperation binary_op) {
    if (first == last) return result;
    *result = *first;
    return __partial_sum(first, last, result, value_type(first), binary_op);
}

template <class InputIterator, class OutputIterator, class T>
OutputIterator __adjacent_difference(InputIterator first, InputIterator last, 
				     OutputIterator result, T*) {
    T value = *first;
    while (++first != last) {
	T tmp = *first;
	*++result = tmp - value;
	value = tmp;
    }
    return ++result;
}

template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, 
				   OutputIterator result) {
    if (first == last) return result;
    *result = *first;
    return __adjacent_difference(first, last, result, value_type(first));
}

template <class InputIterator, class OutputIterator, class T, 
	  class BinaryOperation>
OutputIterator __adjacent_difference(InputIterator first, InputIterator last, 
				     OutputIterator result, T*,
				     BinaryOperation binary_op) {
    T value = *first;
    while (++first != last) {
	T tmp = *first;
	*++result = binary_op(tmp, value);
	value = tmp;
    }
    return ++result;
}

template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
				   OutputIterator result,
				   BinaryOperation binary_op) {
    if (first == last) return result;
    *result = *first;
    return __adjacent_difference(first, last, result, value_type(first),
				 binary_op);
}

 
 
    
template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op) {
  if (n == 0)
    return identity_element(op);
  else {
    while (n % 2 == 0) {
      n /= 2;
      x = op(x, x);
    }

    T result = x;
    n /= 2;
    while (n != 0) {
      x = op(x, x);
      if (n % 2 != 0)
        result = op(result, x);
      n /= 2;
    }
    return result;
  }
}

template <class T, class Integer>
inline T power(T x, Integer n) {
  return power(x, n, multiplies<T>());
}


template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value) {
    while (first != last) *first++ = value++;
}

template <class RandomAccessIterator, class Distance>
bool __is_heap(RandomAccessIterator first, RandomAccessIterator last,
               Distance*)
{
  const Distance n = last - first;

  Distance parent = 0;
  for (Distance child = 1; child < n; ++child) {
    if (first[parent] < first[child]) 
      return false;
    if (child % 2 == 0)
      ++parent;
  }
  return true;
}

template <class RandomAccessIterator>
inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last)
{
  return __is_heap(first, last, distance_type(first));
}


template <class RandomAccessIterator, class Distance, class StrictWeakOrdering>
bool __is_heap(RandomAccessIterator first, RandomAccessIterator last,
               StrictWeakOrdering comp,
               Distance*)
{
  const Distance n = last - first;

  Distance parent = 0;
  for (Distance child = 1; child < n; ++child) {
    if (comp(first[parent], first[child]))
      return false;
    if (child % 2 == 0)
      ++parent;
  }
  return true;
}

template <class RandomAccessIterator, class StrictWeakOrdering>
inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last,
                    StrictWeakOrdering comp)
{
  return __is_heap(first, last, comp, distance_type(first));
}


template <class ForwardIterator>
bool is_sorted(ForwardIterator first, ForwardIterator last)
{
  if (first == last)
    return true;

  ForwardIterator next = first;
  for (++next; next != last; first = next, ++next) {
    if (*next < *first)
      return false;
  }

  return true;
}

template <class ForwardIterator, class StrictWeakOrdering>
bool is_sorted(ForwardIterator first, ForwardIterator last,
               StrictWeakOrdering comp)
{
  if (first == last)
    return true;

  ForwardIterator next = first;
  for (++next; next != last; first = next, ++next) {
    if (comp(*next, *first))
      return false;
  }

  return true;
}






# 6 "/home/room1/kriol/local/include/g++/algorithm" 2 3


# 4 "../include/Toroid.iC" 2








# 1 "/home/room1/kriol/work/Project/include/Assert.H" 1 3
 







class assert_exception: public exception {
    
  public:
    
    assert_exception( const string& what_arg );
    
    virtual const char* what( void ) const;
    
  private:
    
    string what_;
};

void throw_assert( const char* expr, const char* fname, int linenum ) throw( assert_exception );







  




# 12 "../include/Toroid.iC" 2




# 1 "/home/room1/kriol/work/Project/include/Vector3D.H" 1 3
 










template <class numT> class TQuaternion;

template <class numT>
class TVector3D {
    
  public:
  
        
        
        

    TVector3D( void );

    TVector3D( numT dT );

    TVector3D( numT dX, numT dY, numT dZ );

    TVector3D( const numT* pdX );

    TVector3D( const TVector3D<numT>& rhs );
  
    ~TVector3D();
      
        
        
        

    TVector3D<numT>&   operator = ( const TVector3D<numT>& rhs );
    TVector3D<numT>&   operator = ( numT dT );

    numT&      operator[]( int iIdx );
    
    TVector3D<numT>    operator - ( void );

    TVector3D<numT>&   operator += ( const TVector3D<numT>& rhs );
    TVector3D<numT>&   operator += ( numT dT );

    TVector3D<numT>&   operator -= ( const TVector3D<numT>& rhs );
    TVector3D<numT>&   operator -= ( numT dT );

    TVector3D<numT>&   operator *= ( numT dT );
    TVector3D<numT>&   operator /= ( numT dT );

    void normalize( void );

    void setX( numT dX );
    void setY( numT dY );
    void setZ( numT dZ );

        
        
        

    numT      operator[]( int iIdx ) const;
    
    numT      dX( void ) const;    
    numT      dY( void ) const;
    numT      dZ( void ) const;

        
        
        

    friend class  TQuaternion<numT>;

    friend TVector3D<numT> operator + ( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    friend TVector3D<numT> operator + ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend TVector3D<numT> operator + ( numT, const TVector3D<numT>& ) __attribute__ ((const));
    friend TVector3D<numT> operator - ( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    friend TVector3D<numT> operator - ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend TVector3D<numT> operator - ( numT, const TVector3D<numT>& ) __attribute__ ((const));
    friend TVector3D<numT> operator * ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend TVector3D<numT> operator * ( numT, const TVector3D<numT>& ) __attribute__ ((const));
    friend numT            operator * ( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));  
    
    friend TVector3D<numT> operator / ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend TVector3D<numT> operator ^ ( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    
    friend bool_t operator != ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));
    friend bool_t operator != ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend bool_t operator != ( numT, const TVector3D<numT>& ) __attribute__ ((const));
    
    friend bool_t operator == ( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    friend bool_t operator == ( const TVector3D<numT>&, numT ) __attribute__ ((const));
    friend bool_t operator == ( numT, const TVector3D<numT>& ) __attribute__ ((const));
    
    friend numT            abs( const TVector3D<numT>& ) __attribute__ ((const));      
    friend numT            norm( const TVector3D<numT>& ) __attribute__ ((const));     
    friend numT            abs_trans( const TVector3D<numT>& ) __attribute__ ((const));
    friend numT            norm_trans( const TVector3D<numT>& ) __attribute__ ((const));
    friend numT            angle( const TVector3D<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    friend TVector3D<numT> unit( const TVector3D& ) __attribute__ ((const));

        
        
        

    friend istream& operator >> ( istream& is, TVector3D<numT>& );
    friend ostream& operator << ( ostream& os, const TVector3D<numT>& );

  private:

    numT dX_;
    numT dY_;
    numT dZ_;

};

 
 
 



    
    
    

template <class numT> inline
TVector3D<numT>::TVector3D( void ) {
}

template <class numT> inline
TVector3D<numT>::TVector3D( numT dT ):
  dX_(dT), dY_(dT), dZ_(dT) {
}

template <class numT> inline
TVector3D<numT>::TVector3D( numT dX, numT dY, numT dZ ):
  dX_(dX), dY_(dY), dZ_(dZ) {
}

template <class numT> inline
TVector3D<numT>::TVector3D( const numT* pdX ):
  dX_( pdX[0] ), dY_( pdX[1] ), dZ_( pdX[2] ) {
}

template <class numT> inline
TVector3D<numT>::TVector3D( const TVector3D<numT>& rhs ):
  dX_( rhs.dX_ ),
  dY_( rhs.dY_ ),
  dZ_( rhs.dZ_ ) {
}

template <class numT> inline
TVector3D<numT>::~TVector3D() {
}

    
    
    

template <class numT> inline numT&
TVector3D<numT>::operator[]( int iIdx ) {
  return ( *( (&dX_) + iIdx ) );   
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator = ( const TVector3D<numT>& theVector ) {
  
  dX_ = theVector.dX_;
  dY_ = theVector.dY_;
  dZ_ = theVector.dZ_;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator = ( numT dT ) {
  
  dX_ = dT;
  dY_ = dT;
  dZ_ = dT;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>
TVector3D<numT>::operator - ( void ) {
  return TVector3D<numT>( -dX_, -dY_, -dZ_ );
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator += ( const TVector3D<numT>& rhs ) {
  
  dX_ += rhs.dX_;
  dY_ += rhs.dY_;
  dZ_ += rhs.dZ_;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator += ( numT dT ) {
  
  dX_ += dT;
  dY_ += dT;
  dZ_ += dT;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator -= ( const TVector3D<numT>& rhs ) {
  
  dX_ -= rhs.dX_;
  dY_ -= rhs.dY_;
  dZ_ -= rhs.dZ_;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator -= ( numT dT ) {
  
  dX_ -= dT;
  dY_ -= dT;
  dZ_ -= dT;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator *= ( numT dT ) {
  
  dX_ *= dT;
  dY_ *= dT;
  dZ_ *= dT;
  
  return (*this);
}

template <class numT> inline TVector3D<numT>&
TVector3D<numT>::operator /= ( numT dT ) {
  dX_ /= dT;
  dY_ /= dT;
  dZ_ /= dT;
  return (*this);
}

template <class numT> inline void
TVector3D<numT>::normalize( void ) {
  numT dN  = ::sqrt( dX_*dX_ + dY_*dY_ + dZ_*dZ_ );
  dX_     /= dN;
  dY_     /= dN;
  dZ_     /= dN;
}

template <class numT> inline void
TVector3D<numT>::setX( numT dX ) {
  dX_ = dX;
}

template <class numT> inline void
TVector3D<numT>::setY( numT dY ) {
  dY_ = dY;
}

template <class numT> inline void
TVector3D<numT>::setZ( numT dZ ) {
  dZ_ = dZ;
}

    
    
    

template <class numT> inline numT
TVector3D<numT>::operator[]( int iIdx ) const {
  return ( *( &(dX_) + iIdx ) );   
}

template <class numT> inline numT
TVector3D<numT>::dX( void ) const {
  return dX_;
}

template <class numT> inline numT
TVector3D<numT>::dY( void ) const {
  return dY_;
}

template <class numT> inline numT
TVector3D<numT>::dZ( void ) const {
  return dZ_;
}

    
    
    

template <class numT> inline TVector3D<numT>
operator + ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT>
operator + ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {
  return TVector3D<numT>( lhs.dX_ + rhs.dX_,
                          lhs.dY_ + rhs.dY_,
                          lhs.dZ_ + rhs.dZ_ );
}

template <class numT> inline TVector3D<numT> 
operator + ( const TVector3D<numT>& lhs, numT dX ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator + ( const TVector3D<numT>& lhs, numT dX ) {
  return TVector3D<numT>( lhs.dX_ + dX,
                          lhs.dY_ + dX,
                          lhs.dZ_ + dX );
}

template <class numT> inline TVector3D<numT> 
operator + ( numT dX, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator + ( numT dX, const TVector3D<numT>& rhs ) {
  return TVector3D<numT>( rhs.dX_ + dX,
                          rhs.dY_ + dX,
                          rhs.dZ_ + dX );
}

template <class numT> inline TVector3D<numT> 
operator - ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator - ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {
  return TVector3D<numT>( lhs.dX_ - rhs.dX_,
                          lhs.dY_ - rhs.dY_,
                          lhs.dZ_ - rhs.dZ_ );
}

template <class numT> inline TVector3D<numT> 
operator - ( const TVector3D<numT>& lhs, numT dX ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator - ( const TVector3D<numT>& lhs, numT dX ) {
  return TVector3D<numT>( lhs.dX_ - dX,
                          lhs.dY_ - dX,
                          lhs.dZ_ - dX );
}

template <class numT> inline TVector3D<numT> 
operator - ( numT dX, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator - ( numT dX, const TVector3D<numT>& rhs ) {
  return TVector3D<numT>( -rhs.dX_ + dX,
                          -rhs.dY_ + dX,
                          -rhs.dZ_ + dX );
}

template <class numT> inline TVector3D<numT> 
operator * ( const TVector3D<numT>& lhs , numT dX ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator * ( const TVector3D<numT>& lhs , numT dX ) {
  return TVector3D<numT>( lhs.dX_ * dX,
                          lhs.dY_ * dX,
                          lhs.dZ_ * dX );
}

template <class numT> inline TVector3D<numT> 
operator * ( numT dX, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator * ( numT dX, const TVector3D<numT>& rhs ) {
  return TVector3D<numT>( rhs.dX_ * dX,
                          rhs.dY_ * dX,
                          rhs.dZ_ * dX );
}

template <class numT> inline numT
operator * ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline numT
operator * ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {   
  return ( lhs.dX_ * rhs.dX_ +                              
           lhs.dY_ * rhs.dY_ +
           lhs.dZ_ * rhs.dZ_   );
}

template <class numT> inline TVector3D<numT> 
operator / ( const TVector3D<numT>& lhs, numT dX ) __attribute__ ((const));

template <class numT> inline TVector3D<numT> 
operator / ( const TVector3D<numT>& lhs, numT dX ) {
  return TVector3D<numT>( lhs.dX_ / dX,
                          lhs.dY_ / dX,
                          lhs.dZ_ / dX );
}

template <class numT> inline TVector3D<numT>
operator ^ ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT>
operator ^ ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {  
  return TVector3D<numT>( lhs.dY_ * rhs.dZ_ - lhs.dZ_ * rhs.dY_,
                          lhs.dZ_ * rhs.dX_ - lhs.dX_ * rhs.dZ_,
                          lhs.dX_ * rhs.dY_ - lhs.dY_ * rhs.dX_  );
}

template <class numT> inline bool_t 
operator != ( const TVector3D<numT>& left,
              const TVector3D<numT>& right ) {
 
  
  return ( (left.dX_ != right.dX_) ||
           (left.dY_ != right.dY_) ||
           (left.dZ_ != right.dZ_)    );
}

template <class numT> inline bool_t
operator != ( const TVector3D<numT>& lhs, numT rhs ) __attribute__ ((const));

template <class numT> inline bool_t
operator != ( const TVector3D<numT>& lhs, numT rhs ) {
  return ( ( lhs.dX_ != rhs ) ||
           ( lhs.dY_ != rhs ) ||
           ( lhs.dZ_ != rhs )    );
}

template <class numT> inline bool_t
operator != ( numT lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t
operator != ( numT lhs, const TVector3D<numT>& rhs ) {
  return ( ( lhs != rhs.dX_ ) ||
           ( lhs != rhs.dY_ ) ||
           ( lhs != rhs.dZ_ )    );
}

template <class numT> inline bool_t 
operator == ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t 
operator == ( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {
  return ( (lhs.dX_ == rhs.dX_) &&
           (lhs.dY_ == rhs.dY_) &&
           (lhs.dZ_ == rhs.dZ_)    );
}

template <class numT> inline bool_t 
operator == ( const TVector3D<numT>& lhs, numT dX ) __attribute__ ((const));

template <class numT> inline bool_t 
operator == ( const TVector3D<numT>& lhs, numT dX ) {
  return ( (lhs.dX_ == dX) &&
           (lhs.dY_ == dX) &&
           (lhs.dZ_ == dX)    );
}

template <class numT> inline bool_t 
operator == ( numT dX, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t 
operator == ( numT dX, const TVector3D<numT>& rhs ) {
  return ( (rhs.dX_ == dX) &&
           (rhs.dY_ == dX) &&
           (rhs.dZ_ == dX)    );
}

template <class numT> inline numT
abs( const TVector3D<numT>& lhs ) __attribute__ ((const));

template <class numT> inline numT
abs( const TVector3D<numT>& lhs ) {
  return ::sqrt( lhs.dX_*lhs.dX_ + lhs.dY_*lhs.dY_ + lhs.dZ_*lhs.dZ_ );
}

template <class numT> inline numT
norm( const TVector3D<numT>& lhs ) __attribute__ ((const));

template <class numT> inline numT
norm( const TVector3D<numT>& lhs ) {
  return ( lhs.dX_*lhs.dX_ + lhs.dY_*lhs.dY_ + lhs.dZ_*lhs.dZ_ );
}

template <class numT> numT
abs_trans( const TVector3D<numT>& lhs ) __attribute__ ((const));

template <class numT> inline numT
abs_trans( const TVector3D<numT>& lhs ) {
  return ::sqrt( lhs.dX_*lhs.dX_ + lhs.dY_*lhs.dY_ );
}

template <class numT> inline numT
norm_trans( const TVector3D<numT>& lhs ) __attribute__ ((const));

template <class numT> inline numT
norm_trans( const TVector3D<numT>& lhs ) {
  return ( lhs.dX_*lhs.dX_ + lhs.dY_*lhs.dY_ );
}

template <class numT> inline numT
angle( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));
  
template <class numT> inline numT
angle( const TVector3D<numT>& lhs, const TVector3D<numT>& rhs ) {
  return ( ::acos( ( lhs * rhs ) / ::sqrt( norm( lhs ) * norm( rhs ) ) ) );
}

template <class numT> inline TVector3D<numT>
unit( const TVector3D<numT>& lhs ) __attribute__ ((const));

template <class numT> inline TVector3D<numT>
unit( const TVector3D<numT>& lhs ) {
  numT dNorm = ::sqrt( lhs.dX_*lhs.dX_ + lhs.dY_*lhs.dY_ + lhs.dZ_*lhs.dZ_ );
  return TVector3D<numT>( lhs.dX_ / dNorm,
                          lhs.dY_ / dNorm,
                          lhs.dZ_ / dNorm );
}


# 1 "/home/room1/kriol/work/Project/include/Vector3D.iC" 1 3
 



    
    
    


# 1 "/home/room1/kriol/work/Project/include/format.H" 1 3
 





# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/values.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)values.h	1.13	94/07/29 SMI"	


extern "C" {


 




 




 














 




 




























 

























# 124 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/values.h" 3 4
































}



# 7 "/home/room1/kriol/work/Project/include/format.H" 2 3






class format {
    
  public:
    
    enum {
            defflags =ios::skipws |
                      ios::right |
                      ios::dec |
                      ios::showpoint |
                      ios::fixed,
            defprec  =4,
            defwidth =0,
            deffill  =' '
    };

        
        
        

    format( ios& i );
  
    format( long_t l, int_t w, int_t p, char_t f );
  
    format( long_t l, char_t f );
  
    format( long_t l );
  
    format( int_t w, int_t p, char_t f );

    format( long_t l, int_t w, int_t p );
    
    format( char_t l, int_t w, int_t p );
  
    format( int_t w, int_t p );
  
    format( char_t f );

        
        
        
  
    void set( ios& f ) const;

  private:
    
    enum { xfi = 1, xwd = 2, xpr = 4, xfl = 8, xal = 15 };
    
    long_t flags;
    int_t  width;
    int_t  precision;
    char_t fill;
    char_t xxx;
};

 
 
 

    
    
    

inline
format::format( ios& i ):
  flags(     i.flags() ),
  width(     i.width() ),
  precision( i.precision() ),
  fill(      i.fill() ),
  xxx( xal )           {  
}

inline
format::format( long_t l, int_t w, int_t p, char_t f ):
  flags( l ),
  width( w ),
  precision( p ),
  fill( f ),
  xxx( xal ) {
}
  
inline
format::format( long_t l, char_t f ):
  flags( l ),
  width( defwidth ),
  precision( defprec ),
  fill( f ),
  xxx( xfl | xfi ) {
}

inline
format::format( long_t l ):
  flags( l ),
  width( defwidth ),
  precision( defprec ),
  fill( deffill ),
  xxx( xfl ) {
}
  
inline
format::format( int_t w, int_t p, char_t f ):
  flags( defflags ),
  width( w ),
  precision( p ),
  fill( f ),
  xxx( xfi | xwd | xpr ) {
}

inline
format::format( long_t l, int_t w, int_t p ):
  flags( l ),
  width( w ),
  precision( p ),
  fill( deffill ),
  xxx( xfl | xwd | xpr ) {
}

inline
format::format( int_t w, int_t p ):
  flags( defflags ),
  width( w ),
  precision( p ),
  fill( deffill ),
  xxx( xwd | xpr ) {
}
  
inline
format::format( char_t f ):
  flags( defflags ),
  width( defwidth ),
  precision( defprec ),
  fill( f ),
  xxx( xfi ) {
}

inline ostream&
operator<<( ostream& os, const format& fmt ) { 
  fmt.set( os ); return os;
}


# 10 "/home/room1/kriol/work/Project/include/Vector3D.iC" 2 3



template <class numT> istream&
operator >> ( istream& is, TVector3D<numT>& rhs ) {
  is >> rhs.dX_ >> rhs.dY_ >> rhs.dZ_;
  return is;
}

template <class numT> ostream&
operator << ( ostream& os, const TVector3D<numT>& rhs ) {
  
  const char* separator = "  ";
  
  os << format( 'E', 18, 12 ) << rhs.dX_ << separator
     << format( 'E', 18, 12 ) << rhs.dY_ << separator
     << format( 'E', 18, 12 ) << rhs.dZ_ ;
  
  return os;
}
# 525 "/home/room1/kriol/work/Project/include/Vector3D.H" 2 3



typedef TVector3D<double_t> TVector3D_t;


# 16 "../include/Toroid.iC" 2




# 1 "../include/Transformation.H" 1
 















# 1 "../include/Quaternion.H" 1
 










template <class numT> class TVector3D;
template <class numT> class TMatrix3D;

template <class numT> class TQuaternion {
    
  public:

        
        
        

    TQuaternion( void );
    TQuaternion( numT dS, numT dX, numT dY, numT dZ );
    TQuaternion( numT dS, const numT* pdX );
    TQuaternion( const TVector3D<numT>& axis, numT dAngle );
    TQuaternion( const TQuaternion<numT>& rhs );
    ~TQuaternion();
  
        
        
        
  
    TQuaternion<numT>&   operator = ( const TQuaternion<numT>& theQuaternion );
    TQuaternion<numT>&   operator - ( void );
    
    TQuaternion<numT>&   operator += ( const TQuaternion<numT>& theQuaternion );
    TQuaternion<numT>&   operator -= ( const TQuaternion<numT>& theQuaternion );
    TQuaternion<numT>&   operator *= ( const TQuaternion<numT>& theQuaternion );   
    TQuaternion<numT>&   operator *= ( numT dX );
    TQuaternion<numT>&   operator /= ( numT dX );

    numT&                operator[]( int iIdx );   

    void                 normalize( void );
    TQuaternion<numT>&   conj( void );
  
        
        
        

    numT                     dS( void ) const;
    numT                     dX( void ) const;
    numT                     dY( void ) const;
    numT                     dZ( void ) const;

    TVector3D<numT>          axis( void ) const;
    numT                     angle( void ) const;

    TMatrix3D<numT>          matrix( void ) const;
    
    numT                     operator[]( int iIdx ) const;

    TVector3D<numT>          rotate( const TVector3D<numT>& theVector ) const;
    void                     rotate_inplace( TVector3D<numT>& theVector ) const;
    
    TVector3D<numT>          rotate_reverse( const TVector3D<numT>& theVector ) const;
    void                     rotate_reverse_inplace( TVector3D<numT>& theVector ) const;

        
        
        

    friend TQuaternion<numT>  operator ~ ( const TQuaternion<numT>& ) __attribute__ ((const));  
    friend TQuaternion<numT>  operator + ( const TQuaternion<numT>&, const TQuaternion<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT>  operator - ( const TQuaternion<numT>&, const TQuaternion<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT>  operator * ( const TQuaternion<numT>&, const TQuaternion<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT>  operator * ( const TQuaternion<numT>&, numT ) __attribute__ ((const));
    friend TQuaternion<numT>  operator * ( numT, const TQuaternion<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT>  operator / ( const TQuaternion<numT>&, numT ) __attribute__ ((const));
  
    friend TQuaternion<numT>  operator * ( const TQuaternion<numT>&, const TVector3D<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT>  operator * ( const TVector3D<numT>&, const TQuaternion<numT>& ) __attribute__ ((const));

    friend  bool_t           operator == ( const TQuaternion<numT>&, const TQuaternion<numT>& ) __attribute__ ((const)); 
    friend  bool_t           operator != ( const TQuaternion<numT>&, const TQuaternion<numT>& ) __attribute__ ((const));
  
    friend numT              abs(  const TQuaternion<numT>& ) __attribute__ ((const));
    friend numT              norm( const TQuaternion<numT>& ) __attribute__ ((const));
    friend TQuaternion<numT> unit( const TQuaternion<numT>& ) __attribute__ ((const));

        
        
        

    friend istream& operator >> ( istream&, TQuaternion<numT>& );
    friend ostream& operator << ( ostream&, const TQuaternion<numT>& );
  
  private:
    numT dS_;             
    numT dX_, dY_, dZ_;   
};

 
 
 







    
    
    

template <class numT> inline
TQuaternion<numT>::TQuaternion( void ) {
}

template <class numT> inline
TQuaternion<numT>::TQuaternion( numT dS, numT dX, numT dY, numT dZ ):
  dS_( dS ), dX_( dX ), dY_( dY ), dZ_( dZ ) {
}

template <class numT> inline
TQuaternion<numT>::TQuaternion( numT dS, const numT* pdX ):
  dS_( dS )  , dX_( pdX[0] ), dY_(pdX[1]), dZ_( pdX[2] ) {
}

template <class numT> inline
TQuaternion<numT>::TQuaternion( const TQuaternion<numT>& rhs ):
  dS_( rhs.dS_ ),
  dX_( rhs.dX_ ),
  dY_( rhs.dY_ ),
  dZ_( rhs.dZ_ ) {
}

template <class numT> inline
TQuaternion<numT>::~TQuaternion() {
}

    
    
    

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator = ( const TQuaternion<numT>& rhs ) {
  
  dS_ = rhs.dS_;
  dX_ = rhs.dX_;
  dY_ = rhs.dY_;
  dZ_ = rhs.dZ_;
  
  return (*this);
}
  
template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator - ( void ) {
  
  dS_ = -dS_;
  dX_ = -dX_;
  dY_ = -dY_;
  dZ_ = -dZ_;
  
  return (*this);
}

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator += ( const TQuaternion<numT>& rhs ) {
  
  dS_ += rhs.dS_;
  dX_ += rhs.dX_;
  dY_ += rhs.dY_;
  dZ_ += rhs.dZ_;
  
  return (*this);
}

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator -= ( const TQuaternion<numT>& rhs ) {
  
  dS_ -= rhs.dS_;
  dX_ -= rhs.dX_;
  dY_ -= rhs.dY_;
  dZ_ -= rhs.dZ_;
  
  return (*this);
}

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator *= ( const TQuaternion<numT>& theQuaternion ) {

  numT dS = dS_ * theQuaternion.dS_ - ( dX_ * theQuaternion.dX_ +
                                  dY_ * theQuaternion.dY_ +
                                  dZ_ * theQuaternion.dZ_   );
  numT dX = dS_ * theQuaternion.dX_ + theQuaternion.dS_ * dX_ + 
    ( dY_ * theQuaternion.dZ_ - dZ_ * theQuaternion.dY_ );
  numT dY = dS_ * theQuaternion.dY_ + theQuaternion.dS_ * dY_ + 
    ( dZ_ * theQuaternion.dX_ - dX_ * theQuaternion.dZ_ );
  numT dZ = dS_ * theQuaternion.dZ_ + theQuaternion.dS_ * dZ_ + 
    ( dX_ * theQuaternion.dY_ - dY_ * theQuaternion.dX_ );

  dS_ = dS;
  dX_ = dX;
  dY_ = dY;
  dZ_ = dZ;
      
  return (*this);
}

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator *= ( numT dX ) {
  
  dS_ *= dX;
  dX_ *= dX;
  dY_ *= dX;
  dZ_ *= dX;
  
  return (*this);
}

template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::operator /= ( numT dX ) {
  
  dS_ /= dX;
  dX_ /= dX;
  dY_ /= dX;
  dZ_ /= dX;
  
  return (*this);
}

template <class numT> inline numT&
TQuaternion<numT>::operator[]( int iIdx ) {
  return ( *( (&dS_) + iIdx ) );   
}

template <class numT> inline void
TQuaternion<numT>::normalize( void ) {
  numT dN =  ::sqrt( dS_*dS_ + dX_*dX_ + dY_*dY_ + dZ_*dZ_ );
  dS_ /= dN;
  dX_ /= dN;
  dY_ /= dN;
  dZ_ /= dN;
}
  
template <class numT> inline TQuaternion<numT>&
TQuaternion<numT>::conj( void ) {
  
  dX_ = -dX_;
  dY_ = -dY_;
  dZ_ = -dZ_;
  
  return (*this);
}

    
    
    

template <class numT> inline numT
TQuaternion<numT>::dS( void ) const {
  return dS_;
}
  
template <class numT> inline numT
TQuaternion<numT>::dX( void ) const {
  return dX_;
}

template <class numT> inline numT
TQuaternion<numT>::dY( void ) const {
  return dY_;
}

template <class numT> inline numT
TQuaternion<numT>::dZ( void ) const {
  return dZ_;
}

template <class numT> inline numT
TQuaternion<numT>::operator[]( int iIdx ) const {
  return ( *( (&dS_) + iIdx ) );   
}

template <class numT> inline TVector3D<numT>
TQuaternion<numT>::rotate( const TVector3D<numT>& theVector ) const {
  numT dTmpA = numT( 2.0 ) * dS_;
  numT dTmpB = dTmpA * dS_ - numT(1.0);
  numT dTmpC = numT( 2.0 ) * ( dX_ * theVector.dX_ +
                               dY_ * theVector.dY_ +
                               dZ_ * theVector.dZ_ );

  return TVector3D<numT>( theVector.dX_ * dTmpB + ( dTmpA * ( dY_ * theVector.dZ_ - dZ_ * theVector.dY_ ) + dTmpC * dX_ ),
                          theVector.dY_ * dTmpB + ( dTmpA * ( dZ_ * theVector.dX_ - dX_ * theVector.dZ_ ) + dTmpC * dY_ ),
                          theVector.dZ_ * dTmpB + ( dTmpA * ( dX_ * theVector.dY_ - dY_ * theVector.dX_ ) + dTmpC * dZ_ ) );
}

template <class numT> inline  void
TQuaternion<numT>::rotate_inplace( TVector3D<numT>& theVector ) const {
  numT dTmpA = numT( 2.0 ) * dS_;
  numT dTmpB = dTmpA * dS_ - numT(1.0);
  numT dTmpC = numT( 2.0 ) * ( dX_ * theVector.dX_ +
                               dY_ * theVector.dY_ +
                               dZ_ * theVector.dZ_ );

  theVector = TVector3D<numT>( theVector.dX_ * dTmpB + ( dTmpA * ( dY_ * theVector.dZ_ - dZ_ * theVector.dY_ ) + dTmpC * dX_ ),
                               theVector.dY_ * dTmpB + ( dTmpA * ( dZ_ * theVector.dX_ - dX_ * theVector.dZ_ ) + dTmpC * dY_ ),
                               theVector.dZ_ * dTmpB + ( dTmpA * ( dX_ * theVector.dY_ - dY_ * theVector.dX_ ) + dTmpC * dZ_ ) );
}

template <class numT> inline TVector3D<numT>
TQuaternion<numT>::rotate_reverse( const TVector3D<numT>& theVector ) const {
  numT dTmpA = -numT(2.0) * dS_;
  numT dTmpB = -dTmpA * dS_ - numT(1.0);
  numT dTmpC =  numT(2.0) * ( dX_ * theVector.dX_ +
                              dY_ * theVector.dY_ +
                              dZ_ * theVector.dZ_ );

  return TVector3D<numT>( theVector.dX_ * dTmpB + ( dTmpA * ( dY_ * theVector.dZ_ - dZ_ * theVector.dY_ ) + dTmpC * dX_ ),
                          theVector.dY_ * dTmpB + ( dTmpA * ( dZ_ * theVector.dX_ - dX_ * theVector.dZ_ ) + dTmpC * dY_ ),
                          theVector.dZ_ * dTmpB + ( dTmpA * ( dX_ * theVector.dY_ - dY_ * theVector.dX_ ) + dTmpC * dZ_ ) );
}

template <class numT> inline void
TQuaternion<numT>::rotate_reverse_inplace( TVector3D<numT>& theVector ) const {
  numT dTmpA = -numT(2.0) * dS_;
  numT dTmpB = -dTmpA * dS_ - numT(1.0);
  numT dTmpC =  numT(2.0) * ( dX_ * theVector.dX_ +
                              dY_ * theVector.dY_ +
                              dZ_ * theVector.dZ_ );

  theVector = TVector3D<numT>( theVector.dX_ * dTmpB + ( dTmpA * ( dY_ * theVector.dZ() - dZ_ * theVector.dY_ ) + dTmpC * dX_ ),
                               theVector.dY_ * dTmpB + ( dTmpA * ( dZ_ * theVector.dX() - dX_ * theVector.dZ_ ) + dTmpC * dY_ ),
                               theVector.dZ_ * dTmpB + ( dTmpA * ( dX_ * theVector.dY() - dY_ * theVector.dX_ ) + dTmpC * dZ_ ) );
}

    
    
    

template <class numT> inline TQuaternion<numT>
operator ~ ( const TQuaternion<numT>& theQuaternionernion ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator ~ ( const TQuaternion<numT>& theQuaternionernion ) {
  return TQuaternion<numT>(   theQuaternionernion.dS_,
                            - theQuaternionernion.dX_,
                            - theQuaternionernion.dY_,
                            - theQuaternionernion.dZ_ );
}

template <class numT> inline TQuaternion<numT>
operator + ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator + ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return TQuaternion<numT>( lhs.dS_ + rhs.dS_,
                            lhs.dX_ + rhs.dX_,
                            lhs.dY_ + rhs.dY_,
                            lhs.dZ_ + rhs.dZ_ );
}

template <class numT> inline TQuaternion<numT>
operator - ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator - ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return TQuaternion<numT>( lhs.dS_ - rhs.dS_,
                            lhs.dX_ - rhs.dX_,
                            lhs.dY_ - rhs.dY_,
                            lhs.dZ_ - rhs.dZ_ );
}

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return TQuaternion<numT>( lhs.dS_ * rhs.dS_ -
                            ( lhs.dX_*rhs.dX_ + lhs.dY_*rhs.dY_ + lhs.dZ_*rhs.dZ_ ),
                            lhs.dS_ * rhs.dX_ + rhs.dS_ * lhs.dX_ + 
                            ( lhs.dY_ * rhs.dZ_ - lhs.dZ_ * rhs.dY_ ),
                            lhs.dS_ * rhs.dY_ + rhs.dS_ * lhs.dY_ + 
                            ( lhs.dZ_ * rhs.dX_ - lhs.dX_ * rhs.dZ_ ),
                            lhs.dS_ * rhs.dZ_ + rhs.dS_ * lhs.dZ_ + 
                            ( lhs.dX_ * rhs.dY_ - lhs.dY_ * rhs.dX_ ) );
}

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, numT dT ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, numT dT ) {
  return TQuaternion<numT>( lhs.dS_ * dT,
                            lhs.dX_ * dT,
                            lhs.dY_ * dT,
                            lhs.dZ_ * dT );
}

template <class numT> inline TQuaternion<numT>
operator * ( numT dT, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator * ( numT dT, const TQuaternion<numT>& rhs ) {
  return TQuaternion<numT>( rhs.dS_ * dT,
                            rhs.dX_ * dT,
                            rhs.dY_ * dT,
                            rhs.dZ_ * dT );
}

template <class numT> inline TQuaternion<numT>
operator / ( const TQuaternion<numT>& lhs, numT dT ) __attribute__ ((const)) ;

template <class numT> inline TQuaternion<numT>
operator / ( const TQuaternion<numT>& lhs, numT dT ) {
  return TQuaternion<numT>( lhs.dS_ / dT,
                            lhs.dX_ / dT,
                            lhs.dY_ / dT,
                            lhs.dZ_ / dT );
}

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, const TVector3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator * ( const TQuaternion<numT>& lhs, const TVector3D<numT>& rhs ) {
  return TQuaternion<numT>( ( lhs.dX_*rhs.dX_ + lhs.dY_*rhs.dY_ + lhs.dZ_*rhs.dZ_ ),
                            lhs.dS_ * rhs.dX_ + 
                            ( lhs.dY_ * rhs.dZ_ - lhs.dZ_ * rhs.dY_ ),
                            lhs.dS_ * rhs.dY_ +  
                            ( lhs.dZ_ * rhs.dX_ - lhs.dX_ * rhs.dZ_ ),
                            lhs.dS_ * rhs.dZ_ +  
                            ( lhs.dX_ * rhs.dY_ - lhs.dY_ * rhs.dX_ ) );
  
}

template <class numT> inline TQuaternion<numT>
operator * ( const TVector3D<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TQuaternion<numT>
operator * ( const TVector3D<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return TQuaternion<numT>( ( lhs.dX_*rhs.dX_ + lhs.dY_*rhs.dY_ + lhs.dZ_*rhs.dZ_ ),
                            rhs.dS_ * lhs.dX_ + 
                            ( lhs.dY_ * rhs.dZ_ - lhs.dZ_ * rhs.dY_ ),
                            rhs.dS_ * lhs.dY_ + 
                            ( lhs.dZ_ * rhs.dX_ - lhs.dX_ * rhs.dZ_ ),
                            rhs.dS_ * lhs.dZ_ + 
                            ( lhs.dX_ * rhs.dY_ - lhs.dY_ * rhs.dX_ ) ); 
}

template <class numT> inline bool_t 
operator == ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t 
operator == ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return ( ( lhs.dX_ == rhs.dX_ ) &&
           ( lhs.dY_ == rhs.dY_ ) &&
           ( lhs.dZ_ == rhs.dZ_ ) &&
           ( lhs.dS_ == rhs.dS_ )    );
}

template <class numT> inline bool_t 
operator != ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t 
operator != ( const TQuaternion<numT>& lhs, const TQuaternion<numT>& rhs ) {
  return ( ( lhs.dX_ != rhs.dX_ ) ||
           ( lhs.dY_ != rhs.dY_ ) ||
           ( lhs.dZ_ != rhs.dZ_ ) ||
           ( lhs.dS_ != rhs.dS_ )    );
}

template <class numT> inline numT
abs(  const TQuaternion<numT>& theQuaternion ) __attribute__ ((const));

template <class numT> inline numT
abs(  const TQuaternion<numT>& theQuaternion ) {
  return ::sqrt( theQuaternion.dS_*theQuaternion.dS_ +
                 theQuaternion.dX_*theQuaternion.dX_ +
                 theQuaternion.dY_*theQuaternion.dY_ +
                 theQuaternion.dZ_*theQuaternion.dZ_   );
}

template <class numT> inline numT
norm( const TQuaternion<numT>& theQuaternion ) __attribute__ ((const));

template <class numT> inline numT
norm( const TQuaternion<numT>& theQuaternion ) {
  return ( theQuaternion.dS_*theQuaternion.dS_ +
           theQuaternion.dX_*theQuaternion.dX_ +
           theQuaternion.dY_*theQuaternion.dY_ +
           theQuaternion.dZ_*theQuaternion.dZ_   );
}

template <class numT> inline TQuaternion<numT>
unit( const TQuaternion<numT>& theQuaternion ) __attribute__ ((const)) ;

template <class numT> inline TQuaternion<numT>
unit( const TQuaternion<numT>& theQuaternion ) {
  numT dNorm = ::sqrt( theQuaternion.dS_*theQuaternion.dS_ +
                       theQuaternion.dX_*theQuaternion.dX_ +
                       theQuaternion.dY_*theQuaternion.dY_ +
                       theQuaternion.dZ_*theQuaternion.dZ_   );

  return TQuaternion<numT>( theQuaternion.dS_ / dNorm,
                            theQuaternion.dX_ / dNorm,
                            theQuaternion.dY_ / dNorm,
                            theQuaternion.dZ_ / dNorm );
}


# 1 "../include/Quaternion.iC" 1
 

 
 
 






# 1 "../include/Matrix3D.H" 1
 















template <class numT>
class TMatrix3D {
  public:
  
        
        
        

    TMatrix3D( void );
    TMatrix3D( bool_t );

    TMatrix3D( numT dXX, numT dXY, numT dXZ,
               numT dYX, numT dYY, numT dYZ,
               numT dZX, numT dZY, numT dZZ );

    TMatrix3D( const numT* pdX );

    TMatrix3D( const TVector3D<numT>& rowX,
               const TVector3D<numT>& rowY,
               const TVector3D<numT>& rowZ );

    TMatrix3D( const numT* pRowX, const numT* pRowY, const numT* pRowZ );
    
    TMatrix3D( const TMatrix3D<numT>& theMatrix3D );

    ~TMatrix3D();

        
        
        

    TMatrix3D<numT>&   operator = ( const TMatrix3D<numT>& theMatrix3D );
    
    numT*              operator[]( int iIdx );
    
    TMatrix3D<numT>&   operator - ( void );
    
    TMatrix3D<numT>&   operator += ( const TMatrix3D<numT>& theMatrix3D );
    
    TMatrix3D<numT>&   operator -= ( const TMatrix3D<numT>& theMatrix3D );
    
    TMatrix3D<numT>&   operator *= ( numT dT );
    TMatrix3D<numT>&   operator *= ( const TMatrix3D<numT>& theMatrix3D );
    
    TMatrix3D<numT>&   operator /= ( numT dT );
  
        
        
        

    const numT* operator[]( int iIdx ) const;

    numT      dXX( void ) const;
    numT      dXY( void ) const;
    numT      dXZ( void ) const;
    numT      dYX( void ) const;
    numT      dYY( void ) const;
    numT      dYZ( void ) const;
    numT      dZX( void ) const;
    numT      dZY( void ) const;
    numT      dZZ( void ) const;

        
        
        

    friend TMatrix3D<numT> operator + ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));
    friend TMatrix3D<numT> operator - ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));
    friend TMatrix3D<numT> operator * ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));
    friend TMatrix3D<numT> operator * ( const TMatrix3D<numT>&, numT ) __attribute__ ((const));
    friend TMatrix3D<numT> operator * ( numT, const TMatrix3D<numT>& ) __attribute__ ((const));
    friend TMatrix3D<numT> operator / ( const TMatrix3D<numT>&, numT ) __attribute__ ((const));

    friend bool_t operator != ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));
    friend bool_t operator == ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));
  
    friend numT            norm( const TMatrix3D<numT>& ) __attribute__ ((const));  

        
        
        

    friend istream& operator >> ( istream& is, TMatrix3D<numT>& );
    friend ostream& operator << ( ostream& os, const TMatrix3D<numT>& );

  private:
  
    numT dXX_, dXY_, dXZ_ ;
    numT dYX_, dYY_, dYZ_ ;
    numT dZX_, dZY_, dZZ_ ;
  
};

 
 
 



    
    
    

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( void ) {
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( bool_t ):  
  dXX_( 1 ), dXY_( 0 ), dXZ_( 0 ),
  dYX_( 0 ), dYY_( 1 ), dYZ_( 0 ),
  dZX_( 0 ), dZY_( 0 ), dZZ_( 1 ) {  
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( numT dXX, numT dXY, numT dXZ,
                            numT dYX, numT dYY, numT dYZ,
                            numT dZX, numT dZY, numT dZZ ):
  dXX_( dXX ), dXY_( dXY ), dXZ_( dXZ ),
  dYX_( dYX ), dYY_( dYY ), dYZ_( dYZ ),
  dZX_( dZX ), dZY_( dZY ), dZZ_( dZZ ) {
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( const numT* pdX ):

  dXX_( pdX[0] ), dXY_( pdX[1] ), dXZ_( pdX[2] ),
  dYX_( pdX[3] ), dYY_( pdX[4] ), dYZ_( pdX[5] ),
  dZX_( pdX[6] ), dZY_( pdX[7] ), dZZ_( pdX[8] ) {
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( const TVector3D<numT>& rowX,
                            const TVector3D<numT>& rowY,
                            const TVector3D<numT>& rowZ ):
  dXX_( rowX.dX() ), dXY_( rowX.dY() ), dXZ_( rowX.dZ() ),
  dYX_( rowY.dX() ), dYY_( rowY.dY() ), dYZ_( rowY.dZ() ),
  dZX_( rowZ.dX() ), dZY_( rowZ.dY() ), dZZ_( rowZ.dZ() ) {
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( const numT* pX, const numT* pY, const numT* pZ ):
  dXX_( pX[0] ), dXY_( pX[1] ), dXZ_( pX[2] ),
  dYX_( pY[0] ), dYY_( pY[1] ), dYZ_( pY[2] ),
  dZX_( pZ[0] ), dZY_( pZ[1] ), dZZ_( pZ[2] ) {
}

template <class numT> inline
TMatrix3D<numT>::TMatrix3D( const TMatrix3D<numT>& theMatrix3D ):
  dXX_( theMatrix3D.dXX_ ), dXY_( theMatrix3D.dXY_ ), dXZ_( theMatrix3D.dXZ_ ),
  dYX_( theMatrix3D.dYX_ ), dYY_( theMatrix3D.dYY_ ), dYZ_( theMatrix3D.dYZ_ ),
  dZX_( theMatrix3D.dZX_ ), dZY_( theMatrix3D.dZY_ ), dZZ_( theMatrix3D.dZZ_ ) {
}

template <class numT> inline
TMatrix3D<numT>::~TMatrix3D() {
}

    
    
    

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator = ( const TMatrix3D<numT>& theMatrix3D ) {
  
  ((void) ((  this != &theMatrix3D  ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "../include/Matrix3D.H" ,   182 ,  "this != &theMatrix3D" ), 0) )) ;
  
  dXX_ = theMatrix3D.dXX_;
  dXY_ = theMatrix3D.dXY_;
  dXZ_ = theMatrix3D.dXZ_;
  dYX_ = theMatrix3D.dYX_;
  dYY_ = theMatrix3D.dYY_;
  dYZ_ = theMatrix3D.dYZ_;
  dZX_ = theMatrix3D.dZX_;
  dZY_ = theMatrix3D.dZY_;
  dZZ_ = theMatrix3D.dZZ_;

  return (*this);
}

template <class numT> inline numT*
TMatrix3D<numT>::operator[]( int iIdx ) {  
  return ( &dXX_ + 3*iIdx );
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator - ( void ) {
  dXX_ = -dXX_;
  dXY_ = -dXY_;
  dXZ_ = -dXZ_;
  dYX_ = -dYX_;
  dYY_ = -dYY_;
  dYZ_ = -dYZ_;
  dZX_ = -dZX_;
  dZY_ = -dZY_;
  dZZ_ = -dZZ_;
  
  return (*this);
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator += ( const TMatrix3D<numT>& theMatrix3D ) {
  
  dXX_ += theMatrix3D.dXX_;
  dXY_ += theMatrix3D.dXY_;
  dXZ_ += theMatrix3D.dXZ_;
  dYX_ += theMatrix3D.dYX_;
  dYY_ += theMatrix3D.dYY_;
  dYZ_ += theMatrix3D.dYZ_;
  dZX_ += theMatrix3D.dZX_;
  dZY_ += theMatrix3D.dZY_;
  dZZ_ += theMatrix3D.dZZ_;
  
  return (*this);
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator -= ( const TMatrix3D<numT>& theMatrix3D ) {
  
  dXX_ -= theMatrix3D.dXX_;
  dXY_ -= theMatrix3D.dXY_;
  dXZ_ -= theMatrix3D.dXZ_;
  dYX_ -= theMatrix3D.dYX_;
  dYY_ -= theMatrix3D.dYY_;
  dYZ_ -= theMatrix3D.dYZ_;
  dZX_ -= theMatrix3D.dZX_;
  dZY_ -= theMatrix3D.dZY_;
  dZZ_ -= theMatrix3D.dZZ_;
  
  return (*this);
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator *= ( numT dT ) {
  
  dXX_ *= dT;
  dXY_ *= dT;
  dXZ_ *= dT;
  dYX_ *= dT;
  dYY_ *= dT;
  dYZ_ *= dT;
  dZX_ *= dT;
  dZY_ *= dT;
  dZZ_ *= dT;
  
  return (*this);
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator *= ( const TMatrix3D<numT>& theMatrix3D ) {

  numT dTmpA = dXX_;
  numT dTmpB = dXY_;
  numT dTmpC = dXZ_;

  dXX_ = dTmpA*theMatrix3D.dXX_ + dTmpB*theMatrix3D.dYX_ + dTmpC*theMatrix3D.dZX_;
  dXY_ = dTmpA*theMatrix3D.dXY_ + dTmpB*theMatrix3D.dYY_ + dTmpC*theMatrix3D.dZY_;
  dXZ_ = dTmpA*theMatrix3D.dXZ_ + dTmpB*theMatrix3D.dYZ_ + dTmpC*theMatrix3D.dZZ_;
  
  dTmpA = dYX_;
  dTmpB = dYY_;
  dTmpC = dYZ_;
  
  dYX_ = dTmpA*theMatrix3D.dXX_ + dTmpB*theMatrix3D.dYX_ + dTmpC*theMatrix3D.dZX_;
  dYY_ = dTmpA*theMatrix3D.dXY_ + dTmpB*theMatrix3D.dYY_ + dTmpC*theMatrix3D.dZY_;
  dYZ_ = dTmpA*theMatrix3D.dXZ_ + dTmpB*theMatrix3D.dYZ_ + dTmpC*theMatrix3D.dZZ_;
  
  dTmpA = dZX_;
  dTmpB = dZY_;
  dTmpC = dZZ_;
  
  dYX_ = dTmpA*theMatrix3D.dXX_ + dTmpB*theMatrix3D.dYX_ + dTmpC*theMatrix3D.dZX_;
  dYY_ = dTmpA*theMatrix3D.dXY_ + dTmpB*theMatrix3D.dYY_ + dTmpC*theMatrix3D.dZY_;
  dYZ_ = dTmpA*theMatrix3D.dXZ_ + dTmpB*theMatrix3D.dYZ_ + dTmpC*theMatrix3D.dZZ_;
  
  return (*this);
}

template <class numT> inline TMatrix3D<numT>&
TMatrix3D<numT>::operator /= ( numT dT ) {

  ((void) ((  dT != 0  ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "../include/Matrix3D.H" ,   298 ,  "dT != 0" ), 0) )) ;
  
  dXX_ /= dT;
  dXY_ /= dT;
  dXZ_ /= dT;
  dYX_ /= dT;
  dYY_ /= dT;
  dYZ_ /= dT;
  dZX_ /= dT;
  dZY_ /= dT;
  dZZ_ /= dT;
  
  return (*this);
}

    
    
    

template <class numT> inline const numT*
TMatrix3D<numT>::operator[]( int iIdx ) const {
  return ( &dXX_ + 3*iIdx );
}

template <class numT> inline numT
TMatrix3D<numT>::dXX( void ) const {
  return dXX_;
}

template <class numT> inline numT
TMatrix3D<numT>::dXY( void ) const {
  return dXY_;
}

template <class numT> inline numT
TMatrix3D<numT>::dXZ( void ) const {
  return dXZ_;
}

template <class numT> inline numT
TMatrix3D<numT>::dYX( void ) const {
  return dYX_;
}

template <class numT> inline numT
TMatrix3D<numT>::dYY( void ) const {
  return dYY_;
}

template <class numT> inline numT
TMatrix3D<numT>::dYZ( void ) const {
  return dYZ_;
}

template <class numT> inline numT
TMatrix3D<numT>::dZX( void ) const {
  return dZX_;
}

template <class numT> inline numT
TMatrix3D<numT>::dZY( void ) const {
  return dZY_;
}

template <class numT> inline numT
TMatrix3D<numT>::dZZ( void ) const {
  return dZZ_;
}

    
    
    

template <class numT> inline TMatrix3D<numT>
operator + ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator + ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) {
  return TMatrix3D<numT>( lhs.dXX_ + rhs.dXX_,
                          lhs.dXY_ + rhs.dXY_,
                          lhs.dXZ_ + rhs.dXZ_,
                          lhs.dYX_ + rhs.dYX_,
                          lhs.dYY_ + rhs.dYY_,
                          lhs.dYZ_ + rhs.dYZ_,
                          lhs.dZX_ + rhs.dZX_,
                          lhs.dZY_ + rhs.dZY_,
                          lhs.dZZ_ + rhs.dZZ_ );
}

template <class numT> inline TMatrix3D<numT>
operator - ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator - ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) {
  return TMatrix3D<numT>( lhs.dXX_ - rhs.dXX_,
                          lhs.dXY_ - rhs.dXY_,
                          lhs.dXZ_ - rhs.dXZ_,
                          lhs.dYX_ - rhs.dYX_,
                          lhs.dYY_ - rhs.dYY_,
                          lhs.dYZ_ - rhs.dYZ_,
                          lhs.dZX_ - rhs.dZX_,
                          lhs.dZY_ - rhs.dZY_,
                          lhs.dZZ_ - rhs.dZZ_ );
}


template <class numT> inline TMatrix3D<numT>
operator * ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator * ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) {
  return TMatrix3D<numT>( lhs.dXX_ - rhs.dXX_,
                          lhs.dXY_ - rhs.dXY_,
                          lhs.dXZ_ - rhs.dXZ_,
                          lhs.dYX_ - rhs.dYX_,
                          lhs.dYY_ - rhs.dYY_,
                          lhs.dYZ_ - rhs.dYZ_,
                          lhs.dZX_ - rhs.dZX_,
                          lhs.dZY_ - rhs.dZY_,
                          lhs.dZZ_ - rhs.dZZ_ );
}

template <class numT> inline TMatrix3D<numT>
operator * ( const TMatrix3D<numT>& lhs, numT rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator * ( const TMatrix3D<numT>& lhs, numT rhs ) {
  return TMatrix3D<numT>( lhs.dXX_ * rhs,
                          lhs.dXY_ * rhs,
                          lhs.dXZ_ * rhs,
                          lhs.dYX_ * rhs,
                          lhs.dYY_ * rhs,
                          lhs.dYZ_ * rhs,
                          lhs.dZX_ * rhs,
                          lhs.dZY_ * rhs,
                          lhs.dZZ_ * rhs );
}

template <class numT> inline TMatrix3D<numT>
operator * ( numT lhs, const TMatrix3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator * ( numT lhs, const TMatrix3D<numT>& rhs ) {
  return TMatrix3D<numT>( lhs * rhs.dXX_,
                          lhs * rhs.dXY_,
                          lhs * rhs.dXZ_,
                          lhs * rhs.dYX_,
                          lhs * rhs.dYY_,
                          lhs * rhs.dYZ_,
                          lhs * rhs.dZX_,
                          lhs * rhs.dZY_,
                          lhs * rhs.dZZ_ );
}

template <class numT> inline TMatrix3D<numT>
operator / ( const TMatrix3D<numT>& lhs, numT rhs ) __attribute__ ((const));

template <class numT> inline TMatrix3D<numT>
operator / ( const TMatrix3D<numT>& lhs, numT rhs ) {
  return TMatrix3D<numT>( lhs.dXX_ / rhs,
                          lhs.dXY_ / rhs,
                          lhs.dXZ_ / rhs,
                          lhs.dYX_ / rhs,
                          lhs.dYY_ / rhs,
                          lhs.dYZ_ / rhs,
                          lhs.dZX_ / rhs,
                          lhs.dZY_ / rhs,
                          lhs.dZZ_ / rhs );
}

template <class numT> inline bool_t
operator != ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) __attribute__ ((const));

template <class numT> inline bool_t
operator != ( const TMatrix3D<numT>& lhs, const TMatrix3D<numT>& rhs ) {
  return ( ( lhs.dXX_ != rhs.dXX_ ) ||
           ( lhs.dXY_ != rhs.dXY_ ) ||
           ( lhs.dXZ_ != rhs.dXZ_ ) ||
           ( lhs.dYX_ != rhs.dYX_ ) ||
           ( lhs.dYY_ != rhs.dYY_ ) ||
           ( lhs.dYZ_ != rhs.dYZ_ ) ||
           ( lhs.dZX_ != rhs.dZX_ ) ||
           ( lhs.dZY_ != rhs.dZY_ ) ||
           ( lhs.dZZ_ != rhs.dZZ_ )
           );
}

template <class numT> inline bool_t
operator == ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) __attribute__ ((const));

template <class numT> inline bool_t
operator == ( const TMatrix3D<numT>&, const TMatrix3D<numT>& ) {
  return ( ( lhs.dXX_ == rhs.dXX_ ) &&
           ( lhs.dXY_ == rhs.dXY_ ) &&
           ( lhs.dXZ_ == rhs.dXZ_ ) &&
           ( lhs.dYX_ == rhs.dYX_ ) &&
           ( lhs.dYY_ == rhs.dYY_ ) &&
           ( lhs.dYZ_ == rhs.dYZ_ ) &&
           ( lhs.dZX_ == rhs.dZX_ ) &&
           ( lhs.dZY_ == rhs.dZY_ ) &&
           ( lhs.dZZ_ == rhs.dZZ_ )
           );
}


# 1 "../include/Matrix3D.iC" 1
 

 
 
 







    
    
    

template <class numT> numT
norm( const TMatrix3D<numT>& ) __attribute__ ((const));

template <class numT> numT
norm( const TMatrix3D<numT>& ) {  
  return ( dXX_*( dYY_*dZZ_ - dYZ_*dZY_ ) -
           dXY_*( dYX_*dZZ_ - dYX_*dZX_ ) +
           dXZ_*( dYX_*dZY_ - dYY_*dZX_ )
           );
}

template <class numT> istream&
operator >> ( istream& is, TMatrix3D<numT>& rMatrix3D ) {
  is >> rMatrix3D.dXX_ >> rMatrix3D.dXY_ >> rMatrix3D.dXZ_;
  is >> rMatrix3D.dYX_ >> rMatrix3D.dYY_ >> rMatrix3D.dYZ_;
  is >> rMatrix3D.dZX_ >> rMatrix3D.dZY_ >> rMatrix3D.dZZ_;
  return is;
}

template <class numT> ostream&
operator << ( ostream& os, const TMatrix3D<numT>& crMatrix3D ) {
  
 
 
  const char* separator = "  ";
  
 
  os << format( 'E', 15, 7 ) << crMatrix3D.dXX_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dXY_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dXZ_ << separator
     << endl
     << format( 'E', 15, 7 ) << crMatrix3D.dYX_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dYY_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dYZ_ << separator
     << endl
     << format( 'E', 15, 7 ) << crMatrix3D.dZX_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dZY_ << separator
     << format( 'E', 15, 7 ) << crMatrix3D.dZZ_ << separator;
 
    
  return os;
}
# 503 "../include/Matrix3D.H" 2



typedef TMatrix3D<double_t> TMatrix3D_t;


# 12 "../include/Quaternion.iC" 2



    
    
    

template <class numT>
TQuaternion<numT>::TQuaternion( const TVector3D<numT>& theVector3D, numT dAngle ) {
  if ( theVector3D.dX_ == numT(0) &&
       theVector3D.dY_ == numT(0) &&
       theVector3D.dZ_ == numT(0)    ) {
    dS_ = dX_ = dY_ = dZ_ = numT(0);
  } else {
    dAngle    *= numT( 0.5 );
    dS_        = ::sin( dAngle ) / abs( theVector3D );
    dX_        = dS_ * theVector3D.dX_;
    dY_        = dS_ * theVector3D.dY_;
    dZ_        = dS_ * theVector3D.dZ_;
    dS_        = ::cos( dAngle );
  }
}

    
    
    

template <class numT> TVector3D<numT>
TQuaternion<numT>::axis( void ) const {

  TQuaternion<numT> tmp( *this );

  tmp.normalize();

  numT dSinTh = ::sqrt( (1.0 - tmp.dS_ ) * (1.0 + tmp.dS_) );

  return ( dSinTh == 0.0 ? TVector3D<numT>( 0.0, 0.0, 0.0 ) :
           TVector3D<numT>( tmp.dX_/dSinTh, tmp.dY_/dSinTh, tmp.dZ_/dSinTh ) );
}

template <class numT> numT
TQuaternion<numT>::angle( void ) const {
  
  TQuaternion<numT> tmp( *this );

  tmp.normalize();

  numT dSinTh = ::sqrt( (1.0 - tmp.dS_ ) * (1.0 + tmp.dS_) );

  return ( 2.0 * ::atan2( dSinTh, tmp.dS_ ) );
}

template <class numT> TMatrix3D<numT>
TQuaternion<numT>::matrix( void ) const {
  
  numT s = 2.0 / norm( *this );
  
  return TMatrix3D<numT>(  1.0 - s*( dY_*dY_ + dZ_*dZ_ ), s*( dX_*dY_ - dS_*dZ_ ), s*( dX_*dZ_ + dS_*dY_ ),
                           s*( dX_*dY_ + dS_*dZ_ ), 1.0 - s*( dX_*dX_ + dZ_*dZ_ ), s*( dY_*dZ_ - dS_*dX_ ),
                           s*( dX_*dZ_ - dS_*dY_ ), s*( dY_*dZ_ + dS_*dX_ ), 1.0 - s*( dX_*dX_ + dY_*dY_ )
                           );
}

    
    
    

template <class numT> ostream&
operator >> ( istream& is, TQuaternion<numT>& theQuaternion ) {
  is >> theQuaternion.dS_ >> theQuaternion.dX_ >> theQuaternion.dY_ >> theQuaternion.dZ_ ;
  return is;
}

template <class numT> ostream&
operator << ( ostream& os, const TQuaternion<numT>& theQuaternion ) {
      



  
  const char* separator = "  ";
  
 
  
  os << format( 'F', 10, 6) << theQuaternion.dS() << separator
     << format( 'F', 10, 6) << theQuaternion.dX() << separator
     << format( 'F', 10, 6) << theQuaternion.dY() << separator
     << format( 'F', 10, 6) << theQuaternion.dZ();
  
 
    
  return os;
}
# 515 "../include/Quaternion.H" 2



typedef TQuaternion<double_t> TQuaternion_t;


# 17 "../include/Transformation.H" 2



template <class numT> class VTransformationRegistry;

template <class numT>
class TTransformation {
    
  public:
  
        
        
        

    TTransformation( const TVector3D<numT>*   pTranslation = 0,
                     const TQuaternion<numT>* pRotation    = 0 );
    
    TTransformation( const TVector3D<numT>&   theTranslation,
                     const TQuaternion<numT>& theRotation     );
    
    TTransformation( const TVector3D<numT>&   theTranslation,
                     const TQuaternion<numT>* pRotation    = 0 );
    
    TTransformation( const TVector3D<numT>*   pTranslation,
                     const TQuaternion<numT>& theRotation  );
    
    TTransformation( const TTransformation<numT>& theTransformation );

    ~TTransformation();   

        
        
        
  
    TTransformation<numT>& operator = ( const TTransformation<numT>& theTransformation );

        
        
        

    const TVector3D<numT>*    pTranslation( void ) const;
    const TQuaternion<numT>*  pRotation( void ) const;

        
        
        

    TVector3D<numT>           translate( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      translate_inplace( TVector3D<numT>& theVector3D ) const;
  
        
        
        
    
    TVector3D<numT>           translate_reverse( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      translate_reverse_inplace( TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    TVector3D<numT>           rotate( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      rotate_inplace( TVector3D<numT>& theVector3D ) const;
  
        
        
        
    
    TVector3D<numT>           rotate_reverse( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      rotate_reverse_inplace( TVector3D<numT>& theVector3D ) const;
  
        
        
        
    
    TVector3D<numT>           transform( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      transform_inplace( TVector3D<numT>& theVector3D ) const;

        
        
        
    
    TVector3D<numT>           transform_reverse( const TVector3D<numT>& theVector3D ) const;
    
        
        
        
    
    void                      transform_reverse_inplace( TVector3D<numT>& theVector3D ) const;
    
        
        
        

    friend bool_t operator == ( const TTransformation<numT>& , const TTransformation<numT>& ) __attribute__ ((const));
    friend bool_t operator != ( const TTransformation<numT>& , const TTransformation<numT>& ) __attribute__ ((const));

        
        
        
        
        

    friend TTransformation<numT> operator * ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) __attribute__ ((const));
  
    friend ostream&      operator<<( ostream&, const TTransformation<numT>& );

    friend class VTransformationRegistry<numT>;
    
  private:
    
    const TVector3D<numT>*    pTranslation_; 
    const TQuaternion<numT>*  pRotation_;

    static VTransformationRegistry<numT>* pRegistry_;
    
};

 
 
 








    
    
    

template <class numT> inline
TTransformation<numT>::TTransformation( const TVector3D<numT>*   pTranslation,
                                        const TQuaternion<numT>* pRotation    ): 
  pTranslation_( pTranslation ),
  pRotation_( pRotation ) {
    
    ((void)0) ;
    
}

template <class numT> inline
TTransformation<numT>::TTransformation( const TTransformation<numT>& theTransformation ):
  pTranslation_( theTransformation.pTranslation_ ),
  pRotation_( theTransformation.pRotation_ ) {
                              
    ((void)0) ;
}

template <class numT> inline
TTransformation<numT>::~TTransformation() {
  ((void)0) ;
}

    
    
    
  
template <class numT> inline TTransformation<numT>&
TTransformation<numT>::operator = ( const TTransformation<numT>& theTransformation ) {
  
  pTranslation_ = theTransformation.pTranslation_;
  pRotation_    = theTransformation.pRotation_;
    
  return (*this);
}


    
    
    

template <class numT> inline const TVector3D<numT>*
TTransformation<numT>::pTranslation( void ) const {
  return pTranslation_;
}
  
template <class numT> inline const TQuaternion<numT>*
TTransformation<numT>::pRotation( void ) const {
  return pRotation_;
}

template <class numT> inline TVector3D<numT>
TTransformation<numT>::translate( const TVector3D<numT>& theVector3D ) const {
  return ( pTranslation_ ? ( theVector3D+(*pTranslation_) ) : theVector3D );
}
  
template <class numT> inline void
TTransformation<numT>::translate_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pTranslation_ ) {
    theVector3D += *pTranslation_;
  }
}
  
template <class numT> inline TVector3D<numT>
TTransformation<numT>::translate_reverse( const TVector3D<numT>& theVector3D ) const {
  return ( pTranslation_ ? (theVector3D - *pTranslation_) : theVector3D );
}
  
template <class numT> inline void
TTransformation<numT>::translate_reverse_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pTranslation_ ) {
    theVector3D -= *pTranslation_;
  }
}

template <class numT> inline TVector3D<numT>
TTransformation<numT>::rotate( const TVector3D<numT>& theVector3D ) const {
  return ( pRotation_ ? pRotation_->rotate( theVector3D ) : theVector3D );
}
  
template <class numT> inline void
TTransformation<numT>::rotate_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    pRotation_->rotate_inplace( theVector3D );
  }
}
  
template <class numT>  inline TVector3D<numT>
TTransformation<numT>::rotate_reverse( const TVector3D<numT>& theVector3D ) const {
  return( pRotation_ ? pRotation_->rotate_reverse( theVector3D ) : theVector3D );
}
  
template <class numT> inline void
TTransformation<numT>::rotate_reverse_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    pRotation_->rotate_reverse_inplace( theVector3D );
  }
}
  
template <class numT> inline TVector3D<numT>
TTransformation<numT>::transform( const TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    if ( pTranslation_ ) {
      return ( pRotation_->rotate( theVector3D ) + *pTranslation_ );
    } else {
      return ( pRotation_->rotate( theVector3D ) );
    }
  } else {
    if ( pTranslation_ ) {
      return ( theVector3D  + *pTranslation_ );          
    }
  }
  return theVector3D;
}

template <class numT> inline void
TTransformation<numT>::transform_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    if ( pTranslation_ ) {
      pRotation_->rotate_inplace( theVector3D );
      theVector3D += *pTranslation_;
    } else {
      pRotation_->rotate_inplace( theVector3D );
    }
  } else {
    if ( pTranslation_ ) {
      theVector3D += *pTranslation_;
    }
  }
}

template <class numT> inline TVector3D<numT>
TTransformation<numT>::transform_reverse( const TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    if ( pTranslation_ ) {
      return ( pRotation_->rotate_reverse( theVector3D - *pTranslation_ ) );
    } else {
      return ( pRotation_->rotate_reverse( theVector3D ) );
    }
  } else {
    if ( pTranslation_ ) {
      return ( theVector3D  - *pTranslation_ );          
    }
  }
  return theVector3D;
}

template <class numT> inline void
TTransformation<numT>::transform_reverse_inplace( TVector3D<numT>& theVector3D ) const {
  if ( pRotation_ ) {
    if ( pTranslation_ ) {
      theVector3D -= *pTranslation_;
      pRotation_->rotate_reverse_inplace( theVector3D );
    } else {
      pRotation_->rotate_reverse_inplace( theVector3D );
    }
  } else {
    if ( pTranslation_ ) {
      theVector3D -= *pTranslation_;
    }
  }
}


# 1 "../include/Transformation.iC" 1
 













# 1 "../include/VTransformationRegistry.H" 1
 




template <class numT> class TVector3D;
template <class numT> class TQuaternion;

template < class numT >
class VTransformationRegistry {

  protected:

        
        
        

    VTransformationRegistry();
    VTransformationRegistry( const VTransformationRegistry<numT>& );
    
    virtual ~VTransformationRegistry();

        
        
        

    void operator = ( const VTransformationRegistry<numT>& );

  public:

    virtual const TVector3D<numT>*    pRegisterTranslation( const TVector3D<numT>&   ) = 0;
    virtual const TQuaternion<numT>*  pRegisterRotation(    const TQuaternion<numT>& ) = 0;

};

 
 
 


# 1 "../include/VTransformationRegistry.iC" 1
 













 
 
 

    
    
    

template <class numT>
VTransformationRegistry<numT>::VTransformationRegistry() {
  if ( TTransformation<numT>::pRegistry_ == 0 ) {
    TTransformation<numT>::pRegistry_ = static_cast< VTransformationRegistry<numT>* >( this );
  }
}

template <class numT>
VTransformationRegistry<numT>::VTransformationRegistry( const VTransformationRegistry<numT>& theVTransformationRegistry ) {
}

template <class numT>
VTransformationRegistry<numT>::~VTransformationRegistry() {
}

    
    
    

template <class numT> void
VTransformationRegistry<numT>::operator = ( const VTransformationRegistry<numT>& theRegistry ) {
}
# 41 "../include/VTransformationRegistry.H" 2




# 15 "../include/Transformation.iC" 2



 
 
 

template <class numT> VTransformationRegistry<numT>* TTransformation<numT>::pRegistry_ = 0;

    
    
    

template <class numT>
TTransformation<numT>::TTransformation( const TVector3D<numT>&   theTranslation,
                                        const TQuaternion<numT>& theRotation     ) {
      
  ((void)0) ;

  (void)((  pRegistry_ != 0  ) || ( throw_assert("pRegistry_ != 0", "../include/Transformation.iC", 34 ), 0)) ;
      
  pTranslation_ = pRegistry_->pRegisterTranslation( theTranslation );
  pRotation_    = pRegistry_->pRegisterRotation( theRotation );
}

template <class numT>
TTransformation<numT>::TTransformation( const TVector3D<numT>&   theTranslation,
                                        const TQuaternion<numT>* pRotation      ):
  pRotation_( pRotation ) {
    (void)((  pRegistry_ != 0  ) || ( throw_assert("pRegistry_ != 0", "../include/Transformation.iC", 44 ), 0)) ;
    pTranslation_ = pRegistry_->pRegisterTranslation( theTranslation );
}

template <class numT>    
TTransformation<numT>::TTransformation( const TVector3D<numT>*   pTranslation,
                                        const TQuaternion<numT>& theRotation     ):
  pTranslation_( pTranslation ) {
    (void)((  pRegistry_ != 0  ) || ( throw_assert("pRegistry_ != 0", "../include/Transformation.iC", 52 ), 0)) ;
    pRotation_    = pRegistry_->pRegisterRotation( theRotation );
}

    
    
    

template <class numT> TTransformation<numT>
operator * ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) {

  const TVector3D<numT>*    pTranslation = 0;
  const TQuaternion<numT>*  pRotation    = 0;
  
      
      
      

  if ( rhs.pTranslation_ != 0 ) {
    TVector3D<numT> localTranslation( *(rhs.pTranslation_) );
    if ( lhs.pRotation_ != 0 ) {
      lhs.pRotation_->rotate_inplace( localTranslation );
    }
    if ( lhs.pTranslation_ != 0 ) {
      localTranslation += *(lhs.pTranslation_);
    }
    pTranslation = TTransformation<numT>::pRegistry_->pRegisterTranslation( localTranslation );
  } else {
    pTranslation = lhs.pTranslation_;
  }

      
      
      

  if ( rhs.pRotation_ != 0 ) {
    if ( lhs.pRotation_ != 0 ) {
      pRotation  = TTransformation<numT>::pRegistry_->pRegisterRotation( *(lhs.pRotation_) * *(rhs.pRotation_) );
    } else {
      pRotation  = rhs.pRotation_;
    }
  } else {
    pRotation  = lhs.pRotation_;
  }
  
  return TTransformation<numT>( pTranslation, pRotation );
}

template <class numT> bool_t
operator == ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) __attribute__ ((const));

template <class numT> bool_t
operator == ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) {

      










  return ( (*(lhs.pTranslation_) == *(rhs.pTranslation_) ) &&
           (*(lhs.pRotation_)    == *(rhs.pRotation_)    )    );
}

template <class numT> bool_t
operator != ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) __attribute__ ((const));

template <class numT> bool_t
operator != ( const TTransformation<numT>& lhs, const TTransformation<numT>& rhs ) {

      










  return ( (*(lhs.pTranslation_) != *(rhs.pTranslation_) ) ||
           (*(lhs.pRotation_)    != *(rhs.pRotation_)    )    );
}

template <class numT> ostream&
operator<<( ostream& os, const TTransformation<numT>&  theTransformation ) {

  os << "Rotation:    ";
  
  if ( theTransformation.pRotation() == 0 ) {
    os << 0;
  } else {
    os << *(theTransformation.pRotation());
  }
  
  os << "\n";
    
  os << "Translation: ";
  if ( theTransformation.pTranslation() == 0 ) {
    os << 0;
  } else {
    os << *(theTransformation.pTranslation());
  }

  return os;
}
# 339 "../include/Transformation.H" 2



typedef TTransformation<double_t> TTransformation_t;


# 20 "../include/Toroid.iC" 2




# 1 "../include/Extent.H" 1
 














template <class numT> class TVector3D;
template <class numT> class TQuaternion;
template <class numT> class TTransformation;

template <class numT>
class TExtent {
  public:

        
        
        

    TExtent( const TVector3D<numT>& Lo, const TVector3D<numT>& Hi );

    TExtent( numT dLoX, numT dLoY, numT dLoZ,
             numT dHiX, numT dHiY, numT dHiZ );
  
    TExtent( const TExtent<numT>& theExtent );

    ~TExtent();

        
        
        

    TExtent<numT>& operator=( const TExtent<numT>& theExtent );

        
        
        

    const TVector3D<numT>& Lo( void ) const;
    
    const TVector3D<numT>& Hi( void ) const;

    bool_t bIn( const TVector3D<numT>& pos ) const;
    bool_t bHit( const TVector3D<numT>& pos, const TVector3D<numT>& dir ) const;

        
        
        
    
    friend bool_t         operator == ( const TExtent<numT>& lhs, const TExtent<numT>& rhs );
    friend bool_t         operator != ( const TExtent<numT>& lhs, const TExtent<numT>& rhs );
    friend ostream&       operator << ( ostream& os, const TExtent<numT>& );

  private:

    TVector3D<numT> Lo_;
    TVector3D<numT> Hi_;
};

template <class numT> TExtent<numT>
calcBoxExtent( numT tmpLoX, numT tmpLoY, numT tmpLoZ,
               numT tmpHiX, numT tmpHiY, numT tmpHiZ,
               const TTransformation<numT>& theTransformation );

 
 
 

    
    
    

template <class numT> inline
TExtent<numT>::TExtent( const TVector3D<numT>& Lo, const TVector3D<numT>& Hi ):
  Lo_(Lo),
  Hi_(Hi) {
}

template <class numT> inline
TExtent<numT>::TExtent( numT dLoX, numT dLoY, numT dLoZ,
                        numT dHiX, numT dHiY, numT dHiZ ) :
  Lo_( dLoX, dLoY, dLoZ ),
  Hi_( dHiX, dHiY, dHiZ ) {
}

template <class numT> inline
TExtent<numT>::TExtent( const TExtent<numT>& theExtent ):
  Lo_( theExtent.Lo_ ),
  Hi_( theExtent.Hi_ ) {
}

template <class numT> inline
TExtent<numT>::~TExtent() {
}

    
    
    

template <class numT> inline TExtent<numT>&
TExtent<numT>::operator=( const TExtent<numT>& theExtent ) {
  
  ((void)0) ;
  
  ((void) ((  this != &theExtent  ) ? 0 : (__eprintf ("%s:%u: failed assertion `%s'\n",	  "../include/Extent.H" ,   113 ,  "this != &theExtent" ), 0) )) ;
  
  Lo_ = theExtent.Lo_;
  Hi_ = theExtent.Hi_;

  return (*this);
}

    
    
    

template <class numT> inline const TVector3D<numT>&
TExtent<numT>::Lo( void ) const {
  return Lo_;
}
  
template <class numT> inline const TVector3D<numT>&
TExtent<numT>::Hi( void ) const {
  return Hi_;
}

template <class numT> inline bool_t
operator == ( const TExtent<numT>& lhs, const TExtent<numT>& rhs ) {
  return ( ( lhs.Lo_ == rhs.Lo_ ) &&
           ( lhs.Hi_ == rhs.Hi_ )
         );
}

template <class numT> inline bool_t
operator !=( const TExtent<numT>& lhs, const TExtent<numT>& rhs ) {
  return ( ( lhs.Lo_ != rhs.Lo_ ) ||
           ( lhs.Hi_ != rhs.Hi_ )
         );
}


# 1 "../include/Extent.iC" 1
 




















    
    
    

template <class numT> bool_t
TExtent<numT>::bIn( const TVector3D<numT>& pos ) const {
  
  numT dS_x = 0.5*( Hi_.dX() - Lo_.dX() ) -
              ::fabs( pos.dX() - 0.5*( Hi_.dX() + Lo_.dX() ) );
  numT dS_y = 0.5*( Hi_.dY() - Lo_.dY() ) -
              ::fabs( pos.dY() - 0.5*( Hi_.dY() + Lo_.dY() ) );
  numT dS_z = 0.5*( Hi_.dZ() - Lo_.dZ() ) -
              ::fabs( pos.dZ() - 0.5*( Hi_.dZ() + Lo_.dZ() ) );
  
  bool_t bStatus = false;

  if ( dS_x < 0.0 ) {  
    
    if ( dS_y < 0.0 ) {  
      
      if ( dS_z < 0.0 ) {  
    
        bStatus = true;
        
      }
    }
  }
  return bStatus;
}

template <class numT> bool_t
TExtent<numT>::bHit( const TVector3D<numT>&  ,
                     const TVector3D<numT>&   ) const {

      
      
      
  
  return true;
}

template <class numT> ostream&
operator << ( ostream& os, const TExtent<numT>& theExtent ) {
  os << " LO => " << theExtent.Lo_ << "\n"
     << " HI => " << theExtent.Hi_ ;

  return os;
}

template <class numT> TExtent<numT>
calcBoxExtent( numT tmpLoX, numT tmpLoY, numT tmpLoZ,
               numT tmpHiX, numT tmpHiY, numT tmpHiZ,
               const TTransformation<numT>& theTransformation ) {

  numT dLoX =  num_traits<numT>::maximum,
       dLoY =  num_traits<numT>::maximum,
       dLoZ =  num_traits<numT>::maximum;
  
  numT dHiX = -num_traits<numT>::maximum,
       dHiY = -num_traits<numT>::maximum,
       dHiZ = -num_traits<numT>::maximum;

     
     
     

  TVector3D<numT> vertex = theTransformation.transform( TVector3D<numT>( tmpHiX, tmpHiY, tmpHiZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }
  
     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpLoX, tmpHiY, tmpHiZ ) );
  
  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }
  
     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpHiX, tmpLoY, tmpHiZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }
  
     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpHiX, tmpHiY, tmpLoZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }

     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpLoX, tmpLoY, tmpHiZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }

     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpLoX, tmpHiY, tmpLoZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }

     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpHiX, tmpLoY, tmpLoZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }
  
     
     
     
  
  vertex = theTransformation.transform( TVector3D<numT>( tmpLoX, tmpLoY, tmpLoZ ) );

  if ( dLoX > vertex.dX() ) {
    dLoX = vertex.dX();
  }
  if ( dLoY > vertex.dY() ) {
    dLoY = vertex.dY();
  }
  if ( dLoZ > vertex.dZ() ) {
    dLoZ = vertex.dZ();
  }
  
  if ( dHiX < vertex.dX() ) {
    dHiX = vertex.dX();
  }
  if ( dHiY < vertex.dY() ) {
    dHiY = vertex.dY();
  }
  if ( dHiZ < vertex.dZ() ) {
    dHiZ = vertex.dZ();
  }
  
  return TExtent<numT>( dLoX, dLoY, dLoZ, dHiX, dHiY, dHiZ );
}
# 150 "../include/Extent.H" 2



typedef TExtent<double_t> TExtent_t;


# 24 "../include/Toroid.iC" 2




# 1 "/home/room1/kriol/work/Project/include/macros.H" 1 3





template <class T> inline const T&
max3( const T& a1, const T& a2, const T& a3 ) {
  return ( a1 > a2 ) ? ( a1 > a3 ? a1 : a3 ) : ( a2 > a3 ? a2 : a3 );
}

template <class T> inline const T&
min3( const T& a1, const T& a2, const T& a3 ) {
  return ( a1 > a2 ) ? ( a2 > a3 ? a3 : a2 ) : ( a1 > a3 ? a3 : a1 );
}

template <class T> inline const T&
max4( const T& a, const T& b, const T& c, const T& d ) {
  return max( max( a, b ), max( c, d ) );
}

template <class T> inline const T&
min4( const T& a, const T& b, const T& c, const T& d ) {
  return min( min( a, b ), min( c, d ) );
}

template <class T> inline T
sqr( const T& a ) {
  return (a*a);
}

template <class T> inline T
thr( const T& a ) {
  return (a*a*a);
}

template <class T> inline T
sign( const T& a ) {
  return (a>(T)0)?((T)1):((T)(-1));
}

 











  





  



# 28 "../include/Toroid.iC" 2








# 1 "/home/room1/kriol/work/Project/include/quartic_Roots.H" 1 3
 








void quartic_Roots( double_t a, double_t b, double_t c, double_t d, double_t* res );


# 36 "../include/Toroid.iC" 2


  
 
 
 

    
    
    
  
template <class numT, class traits>
TToroid<numT, traits>::TToroid( const string& sName,
                                numT dRadiusTor, numT dRadius ):
  VShape<numT>( sName ),
  dRadiusTor_( dRadiusTor ),
  dRadius_( dRadius ) {
    
    ((void)0) ;

    if ( traits::le( dRadiusTor_ ) ) {
      throw invalid_argument( "Bad dRadiusTor Parameter during Toroid construction" );
    }                                                    
    if ( traits::le( dRadius_ ) ) {
      throw invalid_argument( "Bad dRadius Parameter during Toroid construction" );
    }                                                    
    if ( traits::le( dRadiusTor_, dRadius_ ) ) {
      throw invalid_argument( "Bad dRadiusTor, dRadius Parameters during Toroid construction" );
    }                                                    
}
  
template <class numT, class traits>
TToroid<numT, traits>::TToroid( const TToroid< numT, traits >& theToroid ):
  VShape<numT>( theToroid ),
  dRadiusTor_( theToroid.dRadiusTor_ ),
  dRadius_( theToroid.dRadius_ ) {
    ((void)0) ;
}

template <class numT, class traits>
TToroid< numT, traits >::~TToroid() {
  ((void)0) ;
}

    
    
    
  
template <class numT, class traits> TToroid< numT, traits >&
TToroid< numT, traits >::operator=( const TToroid< numT, traits >& theToroid ) {
      
  ((void)0) ;
      
  (void)((  this != &theToroid  ) || ( throw_assert("this != &theToroid", "../include/Toroid.iC", 89 ), 0)) ;
  
  VShape<numT>::operator=( theToroid );
  dRadiusTor_ = theToroid.dRadiusTor_;
  dRadius_    = theToroid.dRadius_;
  
  return (*this);
}

    
    
    

template <class numT, class traits> TExtent<numT>
TToroid< numT, traits >::calcExtent( const TTransformation<numT>& theTransformation ) const {
  
  TMatrix3D<numT> tmpMtx( true );

  if ( theTransformation.pRotation() != 0 ) {
    tmpMtx = theTransformation.pRotation()->matrix();
  }

  numT dR   = dRadiusTor_ + dRadius_;
  numT dH_z = dRadius_;
    
  TVector3D<numT> vtxHi( dR*::sqrt( tmpMtx.dXX()*tmpMtx.dXX() + tmpMtx.dXY()*tmpMtx.dXY() ) + ::abs( tmpMtx.dXZ()*dH_z ),
                         dR*::sqrt( tmpMtx.dYX()*tmpMtx.dYX() + tmpMtx.dYY()*tmpMtx.dYY() ) + ::abs( tmpMtx.dYZ()*dH_z ),
                         dR*::sqrt( tmpMtx.dZX()*tmpMtx.dZX() + tmpMtx.dZY()*tmpMtx.dZY() ) + ::abs( tmpMtx.dZZ()*dH_z ) );
  
  TVector3D<numT> vtxLo( -vtxHi );

  return TExtent<numT>( theTransformation.translate( vtxLo ),
                        theTransformation.translate( vtxHi ) );
}

template <class numT, class traits> numT
TToroid< numT, traits >::dDistanceIn(  const TVector3D<numT>& pos ) const {
  
  ((void)0) ;

  register numT dS = 0.0;

  register numT r = ::sqrt( sqr(pos.dX()) + sqr(pos.dY()) );

  if ( r != 0.0 ) {

    r = ::sqrt( sqr( pos.dZ() ) +
                sqr( pos.dX() - dRadiusTor_ * pos.dX() / r ) +
                sqr( pos.dY() - dRadiusTor_ * pos.dY() / r )   );
    
  } else {
    r = ::sqrt( sqr( pos.dZ() ) + sqr( dRadiusTor_ ) );
  }
  
  dS = r - dRadius_;
  if ( dS < 0.0 ) {
    dS = 0.0;
  }

  return dS;
}

template <class numT, class traits> numT
TToroid< numT, traits >::dDistanceIn( const TVector3D<numT>& pos,
                                      const TVector3D<numT>& dir ) const {

  ((void)0) ;

  numT dS = norm( pos );

  numT a = pos*dir;
  numT d = dS + ( dRadiusTor_ - dRadius_ ) * ( dRadiusTor_ + dRadius_ );
  numT b, c;
  numT tmp;

  b = 2.0 * ( 2.0 * ( a*a - dRadiusTor_*dRadiusTor_ * ( 1.0 - dir.dZ() )*( 1.0 + dir.dZ() ) ) + d );
  c = 4.0 * ( a*d - 2.0*dRadiusTor_*dRadiusTor_*( a - pos.dZ() * dir.dZ() ) );

  d  = d*d - 4.0*dRadiusTor_*dRadiusTor_* ( dS - sqr( pos.dZ() ) );
  a *= 4.0;

  dS = 0.0;
  
  double_t res[4];

  quartic_Roots( (double_t)a, (double_t)b, (double_t)c, (double_t)d, res );

  if ( ( res[0]*res[1] < 0.0 ) ||
       ( res[2]*res[3] < 0.0 )    ) {  
    dS = 0.0;
  } else {
    dS = min( res[0], res[1] );
    if ( dS < 0.0 ) {
      dS = 0.0;      
    }
    tmp = min( res[2], res[3] );
    if ( tmp >= 0.0 ) {
      if ( ( dS == 0.0 ) || ( tmp < dS ) ) {
        dS = tmp;
      }
    }
    if ( tmp < 0.0 ) {
      if ( traits<numT>::lt( dS ) ) {
        dS = traits<numT>::maximum;
      }
    }
  }
  return dS;
}

template <class numT, class traits> numT
TToroid< numT, traits >::dDistanceOut( const TVector3D<numT>& pos ) const {

  ((void)0) ;

  register numT dS = 0.0;

  register numT r = ::sqrt( sqr(pos.dX()) + sqr(pos.dY()) );

  if ( r != 0.0 ) {

    register numT rNew = ::sqrt( sqr( pos.dZ() ) +
                                 sqr( pos.dX() - dRadiusTor_ * pos.dX() / r ) +
                                 sqr( pos.dY() - dRadiusTor_ * pos.dY() / r )   );
    

    dS = dRadius_ - rNew;
    if ( dS < 0.0 ) {
      dS = 0.0;
    }
  }  
  return dS;
}

template <class numT, class traits> numT
TToroid< numT, traits >::dDistanceOut( const TVector3D<numT>& pos,
                                       const TVector3D<numT>& dir ) const {

  ((void)0) ;

  numT dS = norm( pos );

  numT a = pos*dir;
  numT d = dS + ( dRadiusTor_ - dRadius_ ) * ( dRadiusTor_ + dRadius_ );
  numT b, c;

  b = 2.0 * ( 2.0 * ( a*a - dRadiusTor_*dRadiusTor_ * ( 1.0 - dir.dZ() )*( 1.0 + dir.dZ() ) ) + d );
  c = 4.0 * ( a*d - 2.0*dRadiusTor_*dRadiusTor_*( a - pos.dZ() * dir.dZ() ) );

  d  = d*d - 4.0*dRadiusTor_*dRadiusTor_* ( dS - sqr( pos.dZ() ) );
  a *= 4.0;

  dS = 0.0;
  
  double_t res[4];

  quartic_Roots( (double_t)a, (double_t)b, (double_t)c, (double_t)d, res );
  
  if ( ( res[0]*res[1] > 0.0 ) &&
       ( res[2]*res[3] > 0.0 )    ) {  
    dS = 0.0;
  } else {
    dS = max( res[0], res[1] );
    if ( dS < 0.0 ) {
      dS = 0.0;      
    }
    numT tmp = max( res[2], res[3] );
    if ( tmp > 0.0 ) {
      if ( ( dS == 0.0 ) || ( tmp < dS ) ) {
        dS = tmp;
      }
    }
  }
  
  return dS;
}


template <class numT, class traits> EPosStatus
TToroid< numT, traits >::eWhere( const TVector3D<numT>& pos ) const {
  
  ((void)0) ;  

  EPosStatus eStatus = eSurface;

  register numT tmpA = ::sqrt( sqr( pos.dX() ) + sqr( pos.dY() ) ) - dRadiusTor_;
  numT tmpB = ::sqrt( tmpA*tmpA + sqr( pos.dZ() ) ) - dRadius_;

  if ( traits::lt_2( tmpB ) ) {
    eStatus = eIn;
  } else if ( traits::gt_2( tmpB ) ) {
    eStatus = eOut;
  }  
  return eStatus;
}

template <class numT, class traits> ostream&
operator << ( ostream& os, const TToroid< numT, traits >& theToroid ) {
  const char chLBr = '{';
  const char chRBr = '}';

  os << "Toroid: "
     << chLBr
     << format( 'F', 10, 6) << theToroid.dRadiusTor()
     << format( 'F', 10, 6) << theToroid.dRadius()
     << chRBr;
  
  return os;
}
# 90 "../include/Toroid.H" 2



typedef TToroid<double_t, num_traits<double_t> > TToroid_t;


# 7 "../include/ToroidV.H" 2




# 1 "../include/WiredFrame.H" 1
 












# 1 "../include/ogl_exception.H" 1
 









class ogl_exception: public exception {
    
  public:
    
    ogl_exception( const string& what_arg, GLenum errcode );
    
    virtual const char* what( void ) const;
    virtual GLenum      errcode( void ) const;
    
  private:

    GLenum errcode_;
    string what_;
};


# 14 "../include/WiredFrame.H" 2



const int iDefWiredEdges = 16;

class TWiredFrame {

  public:
  
        
        
        
  
    TWiredFrame( void );
    TWiredFrame( const TWiredFrame& theWiredFrame );
    
    virtual ~TWiredFrame();

        
        
        

    void operator=( const TWiredFrame& theWiredFrame );
    
    virtual void BuildWiredList( int iNumEdges ) = 0;

        
        
        

    GLuint uiWiredList( void ) const;

  protected:
    
    GLuint uiWiredList_;
    
};

 
 
 

    
    
    

inline
TWiredFrame::TWiredFrame( void ):
  uiWiredList_( 0 ) {
  ((void)0) ;
}

inline
TWiredFrame::TWiredFrame( const TWiredFrame& theWiredFrame ):
  uiWiredList_( theWiredFrame.uiWiredList_ ) {
  ((void)0) ;
}

    
    
    

inline GLuint
TWiredFrame::uiWiredList( void ) const {
  return uiWiredList_;
}  


# 11 "../include/ToroidV.H" 2




# 1 "../include/SolidFrame.H" 1
 















const int iDefSolidEdges = 16;

class TSolidFrame {

  public:
  
        
        
        
  
    TSolidFrame( void );
    TSolidFrame( const TSolidFrame& theSolidFrame );
      
    virtual ~TSolidFrame();

        
        
        
    
    void operator=( const TSolidFrame& theSolidFrame );
    
    virtual void BuildSolidList( int iNumEdges ) = 0;

        
        
        

    GLuint uiSolidList( void ) const;
  
  protected:
    GLuint uiSolidList_;
};

 
 
 

    
    
    

inline
TSolidFrame::TSolidFrame( void ):
  uiSolidList_(0) {
  ((void)0) ;
}

inline
TSolidFrame::TSolidFrame( const TSolidFrame& theSolidFrame ):
  uiSolidList_( theSolidFrame.uiSolidList_ ) {
    ((void)0) ;
}

    
    
    

inline GLuint
TSolidFrame::uiSolidList( void ) const {
  return uiSolidList_;
}


# 15 "../include/ToroidV.H" 2



template <class numT, class traits = num_traits<numT> >
class TToroidV: public TToroid<numT,traits>, public TWiredFrame, public TSolidFrame {
  
  public:

        
        
        
  
    TToroidV( const string& sName, numT dRadiusTor, numT dRadius );
    TToroidV( const TToroidV<numT, traits>& theToroid );

    virtual ~TToroidV();
  
        
        
        
  
    TToroidV<numT, traits>& operator=( const TToroidV<numT, traits>& theToroid );

    virtual void BuildWiredList( int_t iNumEdges = iDefWiredEdges );
    virtual void BuildSolidList( int_t iNumEdges = iDefSolidEdges );

  private:

    static void toroid( GLfloat r, GLfloat R, GLint nsides, GLint rings, GLenum type );

};

 
 
 
    

# 1 "../include/ToroidV.iC" 1
 








# 1 "/home/room1/kriol/work/Project/include/Math.H" 1 3
 








 
 
 

struct Math {

  public:
    
    static const double_t dPI;
    static const double_t dTWOPI;
    static const double_t dFOURPI;
    static const double_t d1_SQRTPI;
    static const double_t dSQRT2;
    static const double_t dE;
    static const double_t d1_LN2;
    
    static const double_t dEuler;
    
};


# 10 "../include/ToroidV.iC" 2
















# 1 "/home/room1/kriol/local/include/auto_arr.H" 1 3
 




template <class T>
class auto_arr {
  public:

        
        
        

    explicit inline auto_arr( T* p = 0 ): pT(p) {
    }
    
    inline ~auto_arr( void ) {
      delete [] pT;
      pT = 0;
    }

        
        
        

    inline T* release( void ) {
      T* p = pT;
      pT   = 0;
      return p;
    }

    inline T* reset( T* p = 0 ) {
      if ( p != pT ) {
  	delete [] pT;
      }
      return (pT = p);
    }

    inline T& operator[]( int i ) {
      return pT[i];
    }

        
        
        
  
    inline const T& operator[]( int i ) const {
      return pT[i];
    }
  
    inline T* get( void ) const {
      return pT;
    }

        
        
        

    inline friend T* operator + ( const auto_arr<T>&, int i );
    inline friend T* operator + ( int i, const auto_arr<T>& );

  private:

    inline void operator=( const auto_arr<T>& rhs ) {
      if ( this != &rhs ) {
        if ( pT != rhs.pT ) {
          delete [] pT;
        }
        pT     = rhs.pT;
        rhs.pT = 0;
      }
    }
    
    inline auto_arr( const auto_arr<T>& rhs ) : pT( rhs.pT ) {  
      rhs.pT = 0;                                               
    }
    
    mutable T* pT;
};

template <class T> inline T* 
operator + ( const auto_arr<T>& one, int i ) {
  return ( one.pT + i );
}

template <class T> inline T*
operator + ( int i, const auto_arr<T>& two ) {
  return ( two.pT + i );
}


# 26 "../include/ToroidV.iC" 2



template <class numT, class traits>
TToroidV<numT, traits>::TToroidV( const string& sName,
                                  numT dRadiusTor, numT dRadius ):
  TToroid<numT, traits>::TToroid( sName, dRadiusTor, dRadius ) {
    
    ((void)0) ;
}
  
template <class numT, class traits>
TToroidV<numT, traits>::TToroidV( const TToroidV< numT, traits >& theToroid ):
  TToroid< numT, traits >( theToroid ),
  TWiredFrame( theToroid ),
  TSolidFrame( theToroid ) {
}

template <class numT, class traits>
TToroidV< numT, traits >::~TToroidV() {
  ((void)0) ;
}

    
    
    
  
template <class numT, class traits> TToroidV< numT, traits >&
TToroidV< numT, traits >::operator=( const TToroidV< numT, traits >& theToroid ) {
      
  ((void)0) ;
      
  (void)((  this != &theToroid  ) || ( throw_assert("this != &theToroid", "../include/ToroidV.iC", 58 ), 0)) ;
  
  TToroid<numT,traits>::operator=( theToroid );
  TWiredFrame::operator=( theToroid );
  TSolidFrame::operator=( theToroid );
  
  return (*this);
}

template <class numT, class traits> void
TToroidV< numT, traits >::BuildWiredList( int_t iNumEdges ) {

  ((void)0) ;
  
  uiWiredList_    = glGenLists( 1 );
  GLenum EGLError = glGetError();

  if ( EGLError == GL_FALSE  ) {
    
    glNewList( uiWiredList_, GL_COMPILE );
      toroid( dRadius(), dRadiusTor(), iNumEdges, iNumEdges, GL_LINE_LOOP );
    glEndList();

    if ( (EGLError = glGetError()) == GL_FALSE  ) {
      return;
    }
  }
  if ( glIsList( uiWiredList_ ) ) {
    glDeleteLists( uiWiredList_, 1 );
  }
  
  ogl_exception x( "OGL Error in TToroidV::BuildWiredList", EGLError );
  throw x;
}

template <class numT, class traits> void
TToroidV< numT, traits >::BuildSolidList( int iNumEdges ) {
  
  ((void)0) ;
  
  uiSolidList_    = glGenLists( 1 );
  GLenum EGLError = glGetError();

  if ( EGLError == GL_FALSE  ) {
    
    glEnable( GL_NORMALIZE );
    
    glNewList( uiSolidList_, GL_COMPILE );
      toroid( dRadius(), dRadiusTor(), iNumEdges, iNumEdges, GL_QUADS );
    glEndList();

    glDisable( GL_NORMALIZE );
    
    if ( (EGLError = glGetError()) == GL_FALSE  ) {
      return;
    }
  }
  if ( glIsList( uiWiredList_ ) ) {
    glDeleteLists( uiWiredList_, 1 );
  }
  
  ogl_exception x( "OGL Error in TToroidV::BuildSolidList", EGLError );
  throw x;
}

template <class numT, class traits> void
TToroidV< numT, traits >::toroid( GLfloat r, GLfloat R, GLint nsides, GLint rings, GLenum type ) {
  
  GLfloat	p0[3], p1[3], p2[3], p3[3];
  GLfloat	n0[3], n1[3], n2[3], n3[3];

  for ( int i = 0; i < rings; i++) {
      
    GLfloat theta  = (GLfloat)i * 2.0 * Math::dPI / (GLfloat)rings;
    GLfloat theta1 = (GLfloat)(i+1) * 2.0 * Math::dPI / (GLfloat)rings;
    
    GLfloat dCosTh = cos( theta );
    GLfloat dSinTh = sin( theta );
        
    GLfloat dCosTh1 = cos( theta1 );
    GLfloat dSinTh1 = sin( theta1 );
        
    for ( int j = 0; j < nsides; ++j ) {
          
      GLfloat phi  = (GLfloat)j * 2.0 * Math::dPI / (GLfloat)nsides;
      GLfloat phi1 = (GLfloat)(j+1) * 2.0 * Math::dPI / (GLfloat)nsides;

      GLfloat dCosPhi = cos( phi );
      GLfloat dSinPhi = sin( phi );
      
      GLfloat dCosPhi1 = cos( phi1 );
      GLfloat dSinPhi1 = sin( phi1 );

      p0[0] =  dCosTh * ( R + r * dCosPhi );
      p0[1] = -dSinTh * ( R + r * dCosPhi );
      p0[2] = r * dSinPhi;

      p1[0] =  dCosTh1 * ( R + r * dCosPhi );
      p1[1] = -dSinTh1 * ( R + r * dCosPhi );
      p1[2] =  r * dSinPhi;

      p2[0] =  dCosTh1 * ( R + r * dCosPhi1 );
      p2[1] = -dSinTh1 * ( R + r * dCosPhi1 );
      p2[2] =  r * dSinPhi1;

      p3[0] =  dCosTh * ( R + r * dCosPhi1 );
      p3[1] = -dSinTh * ( R + r * dCosPhi1 );
      p3[2] = r * dSinPhi1;

      n0[0] =  dCosTh * dCosPhi ;
      n0[1] = -dSinTh * dCosPhi ;
      n0[2] =  dSinPhi;

      n1[0] =  dCosTh1 * dCosPhi ;
      n1[1] = -dSinTh1 * dCosPhi ;
      n1[2] =  dSinPhi;

      n2[0] =  dCosTh1 * dCosPhi1 ;
      n2[1] = -dSinTh1 * dCosPhi1 ;
      n2[2] =  dSinPhi1;

      n3[0] =  dCosTh * dCosPhi1 ;
      n3[1] = -dSinTh * dCosPhi1 ;
      n3[2] =  dSinPhi1;

      glBegin(type);
      
        glNormal3fv(n3);
        glVertex3fv(p3);
        
        glNormal3fv(n2);
        glVertex3fv(p2);
        
        glNormal3fv(n1);
        glVertex3fv(p1);
        
        glNormal3fv(n0);
        glVertex3fv(p0);
        
      glEnd();
    }
  }
}
# 52 "../include/ToroidV.H" 2



typedef TToroidV<double_t, num_traits<double_t> > TToroidV_t;


# 9 "TestToroid.C" 2

# 1 "../include/BoxV.H" 1
 





# 1 "../include/Box.H" 1
 



















template <class numT> class TExtent;

template <class numT, class traits = num_traits<numT> >
class TBox: public VShape<numT > {
  
  public:

        
        
        
  
    TBox( const string& sName,
          numT dHalfX,
          numT dHalfY,
          numT dHalfZ );
  
    TBox( const TBox<numT, traits>& theBox );

    virtual ~TBox();
  
        
        
        
  
    TBox<numT, traits>& operator=( const TBox<numT, traits>& theBox );

        
        
        

    numT dHalfX( void ) const;
    
    numT dHalfY( void ) const;
      
    numT dHalfZ( void ) const;
  
    virtual TExtent<numT>  calcExtent( const TTransformation<numT>& ) const;
  
    virtual numT       dDistanceIn(  const TVector3D<numT>& pos ) const;
    virtual numT       dDistanceIn(  const TVector3D<numT>& pos,
                                     const TVector3D<numT>& dir ) const;
  
    virtual numT       dDistanceOut( const TVector3D<numT>& pos ) const;
    virtual numT       dDistanceOut( const TVector3D<numT>& pos,
                                     const TVector3D<numT>& dir ) const;
 
    virtual EPosStatus eWhere( const TVector3D<numT>& pos ) const;

        
        
        

    friend ostream& operator << ( ostream& os, const TBox<numT, traits>& );
    
  private:
  
    numT dHalfX_;
    numT dHalfY_;
    numT dHalfZ_;
  
};

 
 
 

    
    
    

template <class numT, class traits> inline numT
TBox<numT, traits>::dHalfX( void ) const {
  return dHalfX_;
}
  
template <class numT, class traits> inline numT
TBox<numT, traits>::dHalfY( void ) const {
  return dHalfY_;
}
  
template <class numT, class traits> inline numT
TBox<numT, traits>::dHalfZ( void ) const {
  return dHalfZ_;
}
    

# 1 "../include/Box.iC" 1
 




























 
 
 

    
    
    

template <class numT, class traits> 
TBox<numT, traits>::TBox( const string& sName,
                          numT dHalfX,
                          numT dHalfY,
                          numT dHalfZ ):
  VShape<numT>( sName ),
  dHalfX_( dHalfX ),
  dHalfY_( dHalfY ),
  dHalfZ_( dHalfZ ) {
        
    ((void)0) ;
                                                            
    if ( traits::le( dHalfX_ ) ) {
      throw invalid_argument( "Bad HalfX Parameter during Box construction" );
    }                                                      
    if ( traits::le( dHalfY_ ) ) {
      throw invalid_argument( "Bad HalfY Parameter during Box construction" );
    }                                                      
    if ( traits::le( dHalfZ_ ) ) {
      throw invalid_argument( "Bad HalfZ Parameter during Box construction" );
    }                                                      
}

template <class numT, class traits> 
TBox<numT, traits>::TBox( const TBox<numT, traits>& theBox ):
  VShape<numT>( theBox ),
  dHalfX_( theBox.dHalfX_ ),
  dHalfY_( theBox.dHalfY_ ),
  dHalfZ_( theBox.dHalfZ_ ) {
    ((void)0) ;
}

template <class numT, class traits> 
TBox<numT, traits>::~TBox() {
  ((void)0) ;
}

    
    
    

template <class numT, class traits> TBox<numT, traits>&
TBox<numT, traits>::operator=( const TBox<numT, traits>& theBox ) {
      
  ((void)0) ;

  (void)((  this != &theBox  ) || ( throw_assert("this != &theBox", "../include/Box.iC", 84 ), 0)) ;
  
  VShape<numT>::operator=( theBox );
  dHalfX_ = theBox.dHalfX_;
  dHalfY_ = theBox.dHalfY_;
  dHalfZ_ = theBox.dHalfZ_;
  
  return (*this);
}

    
    
    

template <class numT, class traits> numT
TBox<numT, traits>::dDistanceIn(  const TVector3D<numT>& pos ) const {
  
  ((void)0) ;

  return max4( ::fabs( pos.dX() ) - dHalfX_,
               ::fabs( pos.dY() ) - dHalfY_,
               ::fabs( pos.dZ() ) - dHalfZ_,
               0.0                           );
}

template <class numT, class traits> numT
TBox<numT, traits>::dDistanceIn( const TVector3D<numT>& pos,
                                 const TVector3D<numT>& dir ) const {
  
  ((void)0) ;

  numT dAbsX = ::fabs( pos.dX() );
  numT dAbsY = ::fabs( pos.dY() );
  numT dAbsZ = ::fabs( pos.dZ() );
  
  numT dS_x = dAbsX - dHalfX_;
  numT dS_y = dAbsY - dHalfY_;
  numT dS_z = dAbsZ - dHalfZ_;

  numT dS_min = traits::maximum;
  numT dS_max, dInvCos, dTmp;
  
  if ( !( ( ( pos.dX() * dir.dX() >= 0.0 ) && traits::ge_2( dS_x ) ) ||
          ( ( pos.dY() * dir.dY() >= 0.0 ) && traits::ge_2( dS_y ) ) ||
          ( ( pos.dZ() * dir.dZ() >= 0.0 ) && traits::ge_2( dS_z ) )    ) ) {  
                                                                              
       
       
       
    
    if ( dir.dX() ) {  
      
      if ( dS_x < 0.0 ) {
        
        dInvCos = 1.0 / dir.dX();
        dS_min  = 0.0;
        dS_max  = dHalfX_  * ::fabs( dInvCos ) - pos.dX() * dInvCos;
        
      } else {
        
        dInvCos = 1.0 / ::fabs( dir.dX() );
        dS_min  = dS_x  * dInvCos;
        dS_max  = ( dAbsX + dHalfX_ ) * dInvCos;
        
      }
      
    } else {
      
      if ( dS_x <= 0.0 ) {  
        
        dS_min = 0.0;
        dS_max = traits::maximum;
        
      } else {  
        
        return dS_min;
        
      }
    }
    
       
       
       
    
    if ( dir.dY() ) {  
      
      if ( dS_y < 0.0 ) {
        
        dInvCos  = 1.0 / dir.dY();      
        dTmp     = dHalfY_ * ::fabs( dInvCos ) - pos.dY() * dInvCos;
        
      } else {
        
        dInvCos  = 1.0 / ::fabs( dir.dY() );
        
        dTmp     = dS_y * dInvCos;
        if ( dTmp > dS_min ) {
          dS_min = dTmp;
        }
        
        dTmp     = ( dAbsY + dHalfY_ ) * dInvCos;
      }
    
      if ( dTmp < dS_max ) {
        dS_max = dTmp;
      }
      
      if ( dS_min > dS_max ) {  
        return traits::maximum;
      }
      
    } else {  
      if ( dS_y > 0.0 ) {
        return traits::maximum;
      }
    }

       
       
       
    
    if ( dir.dZ() ) {  

      if ( dS_z < 0.0 ) {
        
        dInvCos  = 1.0 / dir.dZ();
        
        dTmp     = dHalfZ_ * ::fabs( dInvCos ) - pos.dZ() * dInvCos;
        
      } else {
        
        dInvCos  = 1.0 / ::fabs( dir.dZ() );
      
        dTmp     = dS_z  * dInvCos;
        if ( dTmp > dS_min ) {
          dS_min = dTmp;
        }
      
        dTmp     = ( dAbsZ + dHalfZ_ ) * dInvCos;
      }
      
      if ( dTmp < dS_max ) {
        dS_max = dTmp;
      }
      if ( dS_min > dS_max ) {
        return traits::maximum;
      }
      
    } else {
      if ( dS_z > 0.0 ) {
        return traits::maximum;
      }
    }

    if ( dS_min < 0.0 ) {
      dS_min = 0.0;
    }
  }
  return dS_min;
}

template <class numT, class traits> numT
TBox<numT, traits>::dDistanceOut( const TVector3D<numT>& pos ) const {
  ((void)0) ;

  numT dS = min3( min( dHalfX_ - pos.dX(), dHalfX_ + pos.dX() ),
                  min( dHalfY_ - pos.dY(), dHalfY_ + pos.dY() ),
                  min( dHalfZ_ - pos.dZ(), dHalfZ_ + pos.dZ() ) );
                 
  return max( dS, 0.0 );
}

template <class numT, class traits> numT
TBox<numT, traits>::dDistanceOut( const TVector3D<numT>& pos,
                                  const TVector3D<numT>& dir ) const {
  
  ((void)0) ;

  numT dS, dTmp;

     
     
     
  
  if ( dir.dX() > 0.0 ) {  

    dS = dHalfX_ - pos.dX();
    if ( traits::gt_2( dS ) ) {
      dS /= dir.dX();
    } else {
      return 0.0;
    }
    
  } else if ( dir.dX() < 0.0 ) {  
    
    dS = pos.dX() + dHalfX_ ;
    if ( traits::gt_2( dS ) ) {
      dS /= - (dir.dX());
    } else {
      return 0.0;
    }
    
  } else {  

    dS = traits::maximum;
    
  }

     
     
     
  
  if ( dir.dY() > 0.0 ) {  

    dTmp = dHalfY_ - pos.dY();
    
    if ( traits::gt_2( dTmp ) ) {
      dTmp /= dir.dY();
      if ( dS > dTmp ) {
        dS = dTmp;
      }
    } else {
      return 0.0;
    }
    
  } else if ( dir.dY() < 0.0 ) {  
    
    dTmp = pos.dY() + dHalfY_ ;
    if ( traits::gt_2( dTmp ) ) {
      dTmp /= - (dir.dY());
      if ( dS > dTmp ) {
        dS = dTmp;
      }
    } else {
      return 0.0;
    }
  }

     
     
     
  
  if ( dir.dZ() > 0.0 ) {  

    dTmp = dHalfZ_ - pos.dZ();
    
    if ( traits::gt_2( dTmp ) ) {
      dTmp /= dir.dZ();
      if ( dS > dTmp ) {
        dS = dTmp;
      }
    } else {
      return 0.0;
    }
  } else if ( dir.dZ() < 0.0 ) {  
    
    dTmp = pos.dZ() + dHalfZ_ ;
    if ( traits::gt_2( dTmp ) ) {
      dTmp /= - (dir.dZ());
      if ( dS > dTmp ) {
        dS = dTmp;
      }
    } else {
      return 0.0;
    }
  }
  return dS;
}

template <class numT, class traits> EPosStatus
TBox<numT, traits>::eWhere( const TVector3D<numT>& pos ) const {
  
  ((void)0) ;

  numT dS_x = dHalfX_ - ::fabs( pos.dX() );
  numT dS_y = dHalfY_ - ::fabs( pos.dY() );
  numT dS_z = dHalfZ_ - ::fabs( pos.dZ() );

  EPosStatus eStatus = eOut;
  
  if ( traits::gti_2( dS_x ) ) {  
    
    if ( traits::gti_2( dS_y ) ) {  
      
      if ( traits::gti_2( dS_z ) ) {  
    
        eStatus = eIn;
        
      } else if ( traits::gei_2( dS_z ) ) { 
        
        eStatus = eSurface;
        
      }
      
    } else if ( traits::gei_2( dS_y ) ) {
      
      if ( traits::gei_2( dS_z ) ) {
        
        eStatus = eSurface;
        
      }
    }
    
  } else if ( traits::gei_2( dS_x ) ) {
    
    if ( traits::gei_2( dS_y ) ) {
      
      if ( traits::gei_2( dS_z ) ) {
        
        eStatus = eSurface;
        
      }
    }
  }
  return eStatus;
}

template <class numT, class traits> TExtent<numT>
TBox<numT, traits>::calcExtent( const TTransformation<numT>& theTransformation ) const {
  return calcBoxExtent( -dHalfX_, -dHalfY_, -dHalfZ_,
                        dHalfX_,  dHalfY_,  dHalfZ_,
                        theTransformation );
}

template <class numT, class traits> ostream&
operator << ( ostream& os, const TBox<numT, traits>& theBox ) {
  
  const char chLBr = '{';
  const char chRBr = '}';
  
  os << "Box: "
     << chLBr
     << format( 'F', 10, 6) << theBox.dHalfX()
     << format( 'F', 10, 6) << theBox.dHalfY()
     << format( 'F', 10, 6) << theBox.dHalfZ()
     << chRBr;
  return os;
}
# 107 "../include/Box.H" 2



typedef TBox<double_t, num_traits<double_t> > TBox_t;


# 7 "../include/BoxV.H" 2











template <class numT, class traits = num_traits<numT> >
class TBoxV: public TBox<numT,traits>, public TWiredFrame, public TSolidFrame {
  
  public:

        
        
        
  
    TBoxV( const string& sName,
           numT dHalfX,
           numT dHalfY,
           numT dHalfZ );
  
    TBoxV( const TBoxV<numT, traits>& theBox );

    virtual ~TBoxV();
  
        
        
        
  
    TBoxV<numT, traits>& operator=( const TBoxV<numT, traits>& theBox );

    virtual void BuildWiredList( int_t iNumEdges = iDefWiredEdges );
    virtual void BuildSolidList( int_t iNumEdges = iDefSolidEdges );    

};

 
 
 
    

# 1 "../include/BoxV.iC" 1
 









 
 
 

    
    
    

template <class numT, class traits> 
TBoxV<numT, traits>::TBoxV( const string& sName,
                            numT dHalfX,
                            numT dHalfY,
                            numT dHalfZ ):
  TBox<numT, traits>( sName, dHalfX, dHalfY, dHalfZ ),
  TWiredFrame(),
  TSolidFrame() {
    ((void)0) ;
}

template <class numT, class traits> 
TBoxV<numT, traits>::TBoxV( const TBoxV<numT, traits>& theBox ):
  TBox<numT, traits>( theBox ),
  TWiredFrame( theBox ),
  TSolidFrame( theBox ) {
    ((void)0) ;
}

template <class numT, class traits> 
TBoxV<numT, traits>::~TBoxV() {
  ((void)0) ;
}

    
    
    

template <class numT, class traits> TBoxV<numT, traits>&
TBoxV<numT, traits>::operator=( const TBoxV<numT, traits>& theBox ) {
      
  ((void)0) ;

  (void)((  this != &theBox  ) || ( throw_assert("this != &theBox", "../include/BoxV.iC", 52 ), 0)) ;
  
  TBoxV<numT, traits>::operator=( theBox );
  
  TWiredFrame::operator=( theBox );
  TSolidFrame::operator=( theBox );
    
  return (*this);
}

template <class numT, class traits> void
TBoxV<numT, traits>::BuildWiredList( int_t ) {
  
  ((void)0) ;

  uiWiredList_    = glGenLists( 1 );
  GLenum EGLError = glGetError();

  if ( EGLError == GL_FALSE  ) {

    glNewList( uiWiredList_, GL_COMPILE );

      glBegin( GL_LINE_LOOP );
        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
      glEnd();

      glBegin( GL_LINE_LOOP );
        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
      glEnd();

      glBegin( GL_LINES );
        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
  
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );

        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );

        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
      glEnd();

    glEndList();

    if ( (EGLError = glGetError() ) == GL_FALSE  ) {
      return;
    }
  }

  if ( glIsList( uiWiredList_ ) ) {
    glDeleteLists( uiWiredList_, 1 );
  }
  
  ogl_exception x( "OGL Error in TBoxV::BuildWiredList", EGLError );
  throw x;
}

template <class numT, class traits> void
TBoxV<numT, traits>::BuildSolidList( int_t ) {
  
  ((void)0) ;

  uiSolidList_    = glGenLists( 1 );
  GLenum EGLError = glGetError();

  if ( EGLError == GL_FALSE  ) {

    glEnable( GL_NORMALIZE );
    
    glNewList( uiSolidList_, GL_COMPILE );
    
        
        
        

       glBegin( GL_QUADS );
    
           
           
           

        glNormal3f( 1.0, 0.0, 0.0 );   

        glVertex3f( (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f( (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f( (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
                    
            
            
            
      
        glNormal3f( 0.0, 1.0, 0.0 );   

        glVertex3f(  (GLfloat)(this->dHalfX()), (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );

            
            
            

        glNormal3f( -1.0, 0.0, 0.0 );   

        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );

            
            
            
      
        glNormal3f( 0.0, -1.0, 0.0 );   

        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()),  (GLfloat)(this->dHalfZ()) );

            
            
            

        glNormal3f( 0.0, 0.0, 1.0  );

        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), (GLfloat)(this->dHalfZ()) );

            
            
            

        glNormal3f( 0.0, 0.0, -1.0 );

        glVertex3f(  (GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f(  (GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()), -(GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
        glVertex3f( -(GLfloat)(this->dHalfX()),  (GLfloat)(this->dHalfY()), -(GLfloat)(this->dHalfZ()) );
      
      glEnd();

    glEndList();
    
    glDisable( GL_NORMALIZE );

    if ( (EGLError = glGetError()) == GL_FALSE  ) {
      return;
    }
  }

  if ( glIsList( uiSolidList_ ) ) {
    glDeleteLists( uiSolidList_, 1 );
  }
  
  ogl_exception x( "OGL Error in TBoxV::BuildSolidList", EGLError );
  throw x;
  
}
# 52 "../include/BoxV.H" 2



typedef TBoxV<double_t, num_traits<double_t> > TBoxV_t;


# 10 "TestToroid.C" 2


# 1 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 1 3
 





  
# 1 "/usr/include/pthread.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)pthread.h	1.13	95/08/24 SMI"



# 1 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/signal.h" 1 3 4
 
 

 
 
 

 







#pragma ident	"@(#)signal.h	1.44	95/03/16 SMI"	





extern "C" {









































 


extern long _sysconf(int);	 





typedef	void SIG_FUNC_TYP(int);
typedef	SIG_FUNC_TYP *SIG_TYP;







# 96 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/signal.h" 3 4



















 






typedef struct {		 
	unsigned long	__sigbits[4];
} sigset_t;

typedef	struct {
	unsigned long	__sigbits[2];
} k_sigset_t;

 










struct  sigaction  {
	int sa_flags;
	union {

		void (*_handler)(int);






		void (*_sigaction)(int, siginfo_t *, void *);

	}	_funcptr;
	sigset_t sa_mask;
	int sa_resv[2];
};



 






			 

 














 


 


 





			 
			 
			 












struct sigaltstack {
	char	*ss_sp;
	int	ss_size;
	int	ss_flags;
};

typedef struct sigaltstack stack_t;



# 287 "/home/room1/kriol/local/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.03/include/sys/signal.h" 3 4



}



# 15 "/usr/include/pthread.h" 2 3 4


# 1 "/usr/include/sched.h" 1 3 4
 
 

 
 
 




#pragma ident	"@(#)sched.h	1.6	93/12/20 SMI"




extern "C" {


struct sched_param {
	int	sched_priority;	 
	int	sched_pad[8];	 
				 
				 
};

 






 



int	sched_getparam(pid_t pid, struct sched_param *param);
int	sched_setparam(pid_t pid, const struct sched_param *param);
int	sched_getscheduler(pid_t pid);
int	sched_setscheduler(pid_t pid, int policy,
		const struct sched_param *param);
int	sched_yield(void);
int	sched_get_priority_max(int policy);
int	sched_get_priority_min(int policy);
int	sched_get_rr_get_interval(pid_t pid, struct timespec *interval);
# 55 "/usr/include/sched.h" 3 4



}



# 17 "/usr/include/pthread.h" 2 3 4




extern "C" {





typedef	unsigned char	uint8_t;



typedef	unsigned long	uint32_t;



typedef	u_longlong_t	uint64_t;


 





typedef	unsigned int	pthread_t;	 
typedef	unsigned int	pthread_key_t;	 

typedef	struct	_pthread_mutex {		 
	struct {
		uint8_t		pthread_mutex_flag[4];
		uint32_t 	pthread_mutex_type;
	} pthread_mutex_flags;
	union {
		struct {
			uint8_t	pthread_mutex_pad[8];
		} pthread_mutex_lock64;
		uint64_t pthread_mutex_owner64;
	} pthread_mutex_lock;
	uint64_t pthread_mutex_data;
} pthread_mutex_t;

typedef	struct	_pthread_cond {		 
	struct {
		uint8_t		pthread_cond_flag[4];
		uint32_t 	pthread_cond_type;
	} pthread_cond_flags;
	uint64_t pthread_cond_data;
} pthread_cond_t;

 


typedef struct _pthread_attr {
	void	*pthread_attrp;
} pthread_attr_t;


 


typedef struct _pthread_mutexattr {
	void	*pthread_mutexattrp;
} pthread_mutexattr_t;


 


typedef struct _pthread_condattr {
	void	*pthread_condattrp;
} pthread_condattr_t;

 


typedef	struct	_once {
	uint64_t	pthread_once_pad[4];
} pthread_once_t;



 




 


 



 


 



 








 







 






 






 


typedef struct _cleanup {
	uint32_t	pthread_cleanup_pad[4];
} _cleanup_t;



void	__pthread_cleanup_push(void (*routine)(void *), void *args,
					caddr_t fp, _cleanup_t *info);
void	__pthread_cleanup_pop(int ex, _cleanup_t *info);
caddr_t	_getfp(void);




















 



int	pthread_attr_init(pthread_attr_t *attr);
int	pthread_attr_destroy(pthread_attr_t *attr);
int	pthread_attr_setstacksize(pthread_attr_t *attr,
					size_t stacksize);
int	pthread_attr_getstacksize(const pthread_attr_t *attr,
					size_t *stacksize);
int	pthread_attr_setstackaddr(pthread_attr_t *attr,
					void *stackaddr);
int	pthread_attr_getstackaddr(const pthread_attr_t *attr,
					void **stackaddr);
int	pthread_attr_setdetachstate(pthread_attr_t *attr,
					int detachstate);
int	pthread_attr_getdetachstate(const pthread_attr_t *attr,
					int *detachstate);
int	pthread_attr_setscope(pthread_attr_t *attr,
					int contentionscope);
int	pthread_attr_getscope(const pthread_attr_t *attr,
					int *scope);
int	pthread_attr_setinheritsched(pthread_attr_t *attr,
					int inherit);
int	pthread_attr_getinheritsched(const pthread_attr_t *attr,
					int *inheritsched);
int	pthread_attr_setschedpolicy(pthread_attr_t *attr,
					int policy);
int	pthread_attr_getschedpolicy(const pthread_attr_t *attr,
					int *policy);
int	pthread_attr_setschedparam(pthread_attr_t *attr,
					const struct sched_param *param);
int	pthread_attr_getschedparam(const pthread_attr_t *attr,
					struct sched_param *param);
int	pthread_create(pthread_t *thread, const pthread_attr_t *attr,
					void * (*start_routine)(void *),
					void *arg);
int	pthread_once(pthread_once_t *once_control,
					void (*init_routine)(void));
int	pthread_join(pthread_t thread, void **status);
int	pthread_detach(pthread_t thread);
void	pthread_exit(void *value_ptr);
int	pthread_kill(pthread_t thread, int sig);
int	pthread_cancel(pthread_t thread);
int	pthread_setschedparam(pthread_t thread, int policy,
					const struct sched_param *param);
int	pthread_getschedparam(pthread_t thread, int *policy,
					struct sched_param *param);
int	pthread_setcancelstate(int state, int *oldstate);
int	pthread_setcanceltype(int type, int *oldtype);
void	pthread_testcancel(void);
int	pthread_equal(pthread_t t1, pthread_t t2);
int	pthread_atfork(void (*prepare) (void), void (*parent) (void),
						void (*child) (void));
int	pthread_key_create(pthread_key_t *key, void (*destructor)(void *));
int	pthread_key_delete(pthread_key_t key);
int	pthread_setspecific(pthread_key_t key, const void *value);
void	*pthread_getspecific(pthread_key_t key);
pthread_t pthread_self(void);
int	pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);

 


int	pthread_mutexattr_init(pthread_mutexattr_t *attr);
int	pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int	pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,
					int pshared);
int	pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr,
					int *pshared);
int	pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
					int protocol);
int	pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr,
					int *protocol);
int	pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
					int prioceiling);
int	pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *attr,
					int *ceiling);
int	pthread_mutex_init(pthread_mutex_t *mutex,
					const pthread_mutexattr_t *attr);
int	pthread_mutex_destroy(pthread_mutex_t *mutex);
int	pthread_mutex_lock(pthread_mutex_t *mutex);
int	pthread_mutex_unlock(pthread_mutex_t *mutex);
int	pthread_mutex_trylock(pthread_mutex_t *mutex);
int	pthread_mutex_setprioceiling(pthread_mutex_t *mutex,
					int prioceiling, int *old_ceiling);
int	pthread_mutex_getprioceiling(pthread_mutex_t *mutex,
					int *ceiling);
int	pthread_condattr_init(pthread_condattr_t *attr);
int	pthread_condattr_destroy(pthread_condattr_t *attr);
int	pthread_condattr_setpshared(pthread_condattr_t *attr,
					int pshared);
int	pthread_condattr_getpshared(const pthread_condattr_t *attr,
					int *pshared);
int	pthread_cond_init(pthread_cond_t *cond,
					const pthread_condattr_t *attr);
int	pthread_cond_destroy(pthread_cond_t *cond);
int	pthread_cond_broadcast(pthread_cond_t *cond);
int	pthread_cond_signal(pthread_cond_t *cond);
int	pthread_cond_wait(pthread_cond_t *cond,
					pthread_mutex_t *mutex);
int	pthread_cond_timedwait(pthread_cond_t *cond,
					pthread_mutex_t *mutex,
					const struct timespec *abstime);

# 360 "/usr/include/pthread.h" 3 4





}



# 7 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3








# 1 "/home/room1/kriol/work/Project/include/IMWC1616RandUniform.H" 1 3
  




 
 
 
 
 
 
 
 





 






























# 1 "/home/room1/kriol/work/Project/include/IMWC1616RandBasis.H" 1 3
 








class TIMWC1616RandBasis {
  
  public:

    static const int_t iMultipliers[80];

        
        
        
  
    TIMWC1616RandBasis( void );
  
    TIMWC1616RandBasis( int_t iX, int_t iY, int_t iA, int_t iB );

    virtual ~TIMWC1616RandBasis();

        
        
        
  
    int_t iX( void ) const;
  
    int_t iY( void ) const;

    int_t iA( void ) const;
  
    int_t iB( void ) const;

    friend class TIMWC1616RandUniform;
  
  protected:

    static int_t  iX_;
    static int_t  iY_;
    static int_t  iA_;
    static int_t  iB_;
};

 
 
 

    
    
    
  
inline
TIMWC1616RandBasis::TIMWC1616RandBasis( void ) {
}
  
    
    
    
  
inline int_t
TIMWC1616RandBasis::iX( void ) const {
  return iX_;
}
  
inline int_t
TIMWC1616RandBasis::iY( void ) const {
  return iY_;
}

inline int_t
TIMWC1616RandBasis::iA( void ) const {
  return iA_;
}
  
inline int_t
TIMWC1616RandBasis::iB( void ) const {
  return iB_;
}


# 50 "/home/room1/kriol/work/Project/include/IMWC1616RandUniform.H" 2 3



class TIMWC1616RandUniform {
  
  public:
  
    enum {
      IRAND_MAX = 0xFFFFFFFF
    };
  
        
        
        
  
    TIMWC1616RandUniform( void );
  
    ~TIMWC1616RandUniform();

        
        
        
  
    static uint_t sample( void );
};

 
 
 

    
    
    
  
inline
TIMWC1616RandUniform::TIMWC1616RandUniform( void ) {
}
  
inline
TIMWC1616RandUniform::~TIMWC1616RandUniform() {
}

    
    
    
  
inline uint_t
TIMWC1616RandUniform::sample( void ) {

  TIMWC1616RandBasis::iX_ = ( TIMWC1616RandBasis::iX_ & 65535 ) * TIMWC1616RandBasis::iA_ +
                            ( TIMWC1616RandBasis::iX_ >> 16 );
  TIMWC1616RandBasis::iY_ = ( TIMWC1616RandBasis::iY_ & 65535 ) * TIMWC1616RandBasis::iB_ +
                            ( TIMWC1616RandBasis::iY_ >> 16 );

  return static_cast<uint_t>( ( TIMWC1616RandBasis::iX_ << 16   ) +
                              ( TIMWC1616RandBasis::iY_ & 65535 )   );  
}


# 15 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandUniform.H" 1 3
 




 
 
 
 
 
 
 
 
 
 
 
 
 





template <class IRandT> 
class TRandUniform {
    
  public:
  
        
        
        
  
    TRandUniform();
    
    ~TRandUniform();
  
        
        
        
 
    static double_t    sample( void );  

    static double_t    sample( bool_t );  

    static double_t    sample( double_t dDelta );  
  
    static double_t    sample( double_t dMin, double_t dDelta );  
    
        
        
        

    static double_t PDF( double_t x );
    
  
  private:
  
    static  const double_t  dDivider;
    static  const double_t  dDivider2;

};

 
 
 

    
    
    
  
template <class IRandT> inline
TRandUniform<IRandT>::TRandUniform() {
}

template <class IRandT> inline
TRandUniform<IRandT>::~TRandUniform() {
}

    
    
    

template <class IRandT> inline double_t
TRandUniform<IRandT>::sample( void ) {
  return ( static_cast<double_t>( IRandT::sample() ) * dDivider );
}

template <class IRandT> inline double_t
TRandUniform<IRandT>::sample( bool_t ) {
  return static_cast<double_t>( IRandT::sample() ) * dDivider2 - 1.0;
}

template <class IRandT> inline double_t
TRandUniform<IRandT>::sample( double_t dDelta ) {
  return dDelta * ( static_cast<double_t>( IRandT::sample() ) * dDivider );
}

template <class IRandT> inline double_t
TRandUniform<IRandT>::sample( double_t dMin, double_t dDelta ) {
  return dMin + dDelta * ( static_cast<double_t>( IRandT::sample() ) * dDivider );
}

    
    
    

template <class IRandT> inline double_t
TRandUniform<IRandT>::PDF( double_t x ) {

  register double_t res = ( x >= 0.0 && x <= 1.0 ) ? 1.0 : 0.0;
  
  return( res );
}

template<class IRandT> const double_t  TRandUniform<IRandT>::dDivider  = 1.0 / static_cast<double_t>( IRandT::IRAND_MAX );
template<class IRandT> const double_t  TRandUniform<IRandT>::dDivider2 = 2.0 / static_cast<double_t>( IRandT::IRAND_MAX );


# 19 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandUniform_MT.H" 1 3
 





  


 
 
 
 
 
 
 
 
 
 
 
 
 





template <class IRandT> 
class TRandUniform_MT {
    
  public:
  
        
        
        
  
    TRandUniform_MT();
    
    ~TRandUniform_MT();
  
        
        
        
 
    static double_t    sample( void );  

    static double_t    sample( bool_t );  

    static double_t    sample( double_t dDelta );  
  
    static double_t    sample( double_t dMin, double_t dDelta );  
    
        
        
        

    static double_t PDF( double_t x );
    
  
  private:
  
    static  const double_t  dDivider;
    static  const double_t  dDivider2;


    static pthread_mutex_t lock;


};

 
 
 

    
    
    
  
template <class IRandT> inline
TRandUniform_MT<IRandT>::TRandUniform_MT() {
}

template <class IRandT> inline
TRandUniform_MT<IRandT>::~TRandUniform_MT() {
}

    
    
    

template <class IRandT> inline double_t
TRandUniform_MT<IRandT>::sample( void ) {
  

  pthread_mutex_lock( &lock );


  register double_t res = static_cast<double_t>( IRandT::sample() ) * dDivider;
  

  pthread_mutex_unlock( &lock );

  
  return ( res );
}

template <class IRandT> inline double_t
TRandUniform_MT<IRandT>::sample( bool_t ) {
  

  pthread_mutex_lock( &lock );

  
  register double_t res = static_cast<double_t>( IRandT::sample() ) * dDivider2 - 1.0;
  

  pthread_mutex_unlock( &lock );


  return res;
}

template <class IRandT> inline double_t
TRandUniform_MT<IRandT>::sample( double_t dDelta ) {
  

  pthread_mutex_lock( &lock );

  
  register double_t res = dDelta * ( static_cast<double_t>( IRandT::sample() ) * dDivider );
  

  pthread_mutex_unlock( &lock );


  return res;
}

template <class IRandT> inline double_t
TRandUniform_MT<IRandT>::sample( double_t dMin, double_t dDelta ) {


  pthread_mutex_lock( &lock );

  
  register double_t res = dMin + dDelta * ( static_cast<double_t>( IRandT::sample() ) * dDivider );
  

  pthread_mutex_unlock( &lock );


  return res;
}

    
    
    

template <class IRandT> inline double_t
TRandUniform_MT<IRandT>::PDF( double_t x ) {

  register double_t res = ( x >= 0.0 && x <= 1.0 ) ? 1.0 : 0.0;
  
  return( res );
}

template<class IRandT> const double_t  TRandUniform_MT<IRandT>::dDivider  = 1.0 / static_cast<double_t>( IRandT::IRAND_MAX );
template<class IRandT> const double_t  TRandUniform_MT<IRandT>::dDivider2 = 2.0 / static_cast<double_t>( IRandT::IRAND_MAX );


template<class IRandT> pthread_mutex_t TRandUniform_MT<IRandT>::lock      = {0, 0, 0} ;



# 23 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3








# 1 "/home/room1/kriol/work/Project/include/RandNormal.H" 1 3
 





  














template <class UniformRndT>  
class TRandNormal {
  public:
  
        
        
        
  
    TRandNormal();
  
    ~TRandNormal();

        
        
        
  
    static double_t  sample( void ); 
    static double_t  sample( double_t dSigma );
    static double_t  sample( double_t dSigma, double_t dMedian );

        
        
        

    static double_t  PDF( double_t x );
    static double_t  PDF( double_t x, double_t dSigma );
    static double_t  PDF( double_t x, double_t dSigma, double_t dMedian );

  private:
    

    static pthread_mutex_t lock;

    
};

 
 
 

    
    
    
  
template <class UniformRndT> inline
TRandNormal<UniformRndT>::TRandNormal( void ) {
}
  
template <class UniformRndT> inline
TRandNormal<UniformRndT>::~TRandNormal() {
}

    
    
    

template <class UniformRndT> inline double_t
TRandNormal<UniformRndT>::sample( double_t dSigma ) {
  return ( dSigma * sample() );
}
  
template <class UniformRndT> inline double_t
TRandNormal<UniformRndT>::sample( double_t dSigma, double_t dMedian ) {
  return ( dSigma * sample() + dMedian );
}

    
    
    

template <class UniformRndT> inline double_t
TRandNormal<UniformRndT>::PDF( double_t x ) {
  return ( Math::d1_SQRTPI * ::exp( -x*x / 2.0 ) / Math::dSQRT2 );
}

template <class UniformRndT> inline double_t
TRandNormal<UniformRndT>::PDF( double_t x, double_t dSigma ) {
  (void)((  dSigma > 0.0  ) || ( throw_assert("dSigma > 0.0", "/home/room1/kriol/work/Project/include/RandNormal.H", 99 ), 0)) ;
  return ( Math::d1_SQRTPI * ::exp( -x*x / ( 2.0 * dSigma ) ) / Math::dSQRT2 / dSigma );
}

template <class UniformRndT> inline double_t
TRandNormal<UniformRndT>::PDF( double_t x, double_t dSigma, double_t dMedian ) {
  (void)((  dSigma > 0.0  ) || ( throw_assert("dSigma > 0.0", "/home/room1/kriol/work/Project/include/RandNormal.H", 105 ), 0)) ;
  return ( Math::d1_SQRTPI * ::exp( -(x-dMedian)*(x-dMedian) / ( 2.0 * dSigma ) ) / Math::dSQRT2 / dSigma );  
}


# 1 "/home/room1/kriol/work/Project/include/RandNormal.iC" 1 3
 





template <class UniformRndT> double_t
TRandNormal<UniformRndT>::sample( void ) {

  register int_t    k      = 1;
  register double_t next;
  

  pthread_mutex_lock( &lock );


  register double_t res    = UniformRndT::sample( true );  
  
  register double_t prev   = res*res;

  for( ;; ) {
    
    next = UniformRndT::sample();
    ++k;
    if ( prev > next ) {
      prev = next;
    } else {
      if ( ( k % 2 ) == 0 ) {
        res *= 1.41421356237309505;  
        break;
      } else {
        if ( UniformRndT::sample() > 0.378695889155401721 ) {  

          res  = ( res > 0.0 ) ? (1.0) : (-1.0);

          register double_t ksi_1, ksi_2;
          register int_t    sernum;

          do {
            
            ksi_1  = UniformRndT::sample();
            prev   = ksi_1;
            k      = 1;
            sernum = 0;

            for ( ;; ) {
        
              next = UniformRndT::sample();
              ++k;
              if ( prev > next ) {
                prev = next;
              } else {
                if ( ( k % 2 ) == 0 ) {
                  break;
                } else {
                  ++sernum;
                  k     = 1;
                  ksi_1 = prev = UniformRndT::sample();
                }
              }
            }
            ksi_1 = 0.366025403784438645*( ksi_1 + static_cast<double_t>( sernum ) );  
            
            ksi_2  = UniformRndT::sample();
            prev   = ksi_2;
            k      = 1;
            sernum = 0;

            for ( ;; ) {
        
              next = UniformRndT::sample();
              ++k;
              if ( prev > next ) {
                prev = next;
              } else {
                if ( ( k % 2 ) == 0 ) {
                  break;
                } else {
                  ++sernum;
                  k     = 1;
                  ksi_2 = prev = UniformRndT::sample();
                }
              }
            }
          } while ( sqr( ksi_1 - 0.366025403784438645 ) > ksi_2 + static_cast<double_t>( sernum ) ); 

          res *= 1.41421356237309505 * ( 1.0 + ksi_1 );
          break;
          
        } else {  

          res    = UniformRndT::sample( true );  
          prev   = res*res;
          k      = 1;

          for( ;; ) {
            next = UniformRndT::sample();
            ++k;
            if ( prev > next ) {
              prev = next;
            } else {
              if ( ( k % 2 ) == 0 ) {
                res *= 1.41421356237309505;  
                break;
              } else {
                res    = UniformRndT::sample( true );  
                prev   = res*res;
                k      = 1;
              }
            }
          }
          break;
        }
      }
    }
  }
  

  pthread_mutex_unlock( &lock );

  
  return res;
}


template <class UniformRndT> pthread_mutex_t TRandNormal<UniformRndT>::lock = {0, 0, 0} ;

# 110 "/home/room1/kriol/work/Project/include/RandNormal.H" 2 3




# 31 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandExponent.H" 1 3
 





  


 
 
 
 
 
 
 
 
 
 
 
 
 
 







template <class UniformRndT>
class TRandExponent {
    
  public:
  
        
        
        
  
    TRandExponent( void );
  
    ~TRandExponent();

        
        
        
  
    static double_t  sample( void );
    static double_t  sample( double_t dSigma );

        
        
        

    static double_t  PDF( double_t x );
    static double_t  PDF( double_t x, double_t sigma );
    
  private:


    static pthread_mutex_t lock;

};

 
 
 

    
    
    

template <class UniformRndT> inline
TRandExponent<UniformRndT>::TRandExponent( void ) {
}
  
template <class UniformRndT> inline
TRandExponent<UniformRndT>::~TRandExponent() {
}

    
    
    
  
template <class UniformRndT> inline double_t
TRandExponent<UniformRndT>::sample( void ) {

  register double_t res    = UniformRndT::sample();
  register double_t prev   = res;
  register int_t    k      = 1;
  register int_t    sernum = 0;


  pthread_mutex_lock( &lock );

  
  for ( ;; ) {
        
    register double_t next = UniformRndT::sample();
    ++k;
    if ( prev > next ) {
      prev = next;
    } else {
      if ( ( k % 2 ) == 0 ) {
        break;
      } else {
        ++sernum;
        k    = 1;
        res  = prev = UniformRndT::sample();
      }
    }
  }
  

  pthread_mutex_unlock( &lock );

  
  return ( res + static_cast<double_t>( sernum ) );
}
  
template <class UniformRndT> inline double_t
TRandExponent<UniformRndT>::sample( double_t dSigma ) {
  return ( dSigma * sample() );
}

    
    
    

template <class UniformRndT> inline double_t
TRandExponent<UniformRndT>::PDF( double_t x ) {
  return ( ( x >= 0.0 ) ? ::exp( -x ) : 0.0 );
}

template <class UniformRndT> inline double_t
TRandExponent<UniformRndT>::PDF( double_t x, double_t sigma ) {
  return ( ( x >= 0.0 ) ? sigma*::exp( -sigma * x ) : 0.0 );
}


template <class UniformRndT> pthread_mutex_t TRandExponent<UniformRndT>::lock = {0, 0, 0} ;



# 35 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandPoisson.H" 1 3
 





  


 
 
 
 
 












const double_t dLimit = 1.12535174719e-7;  

template <class UniformRndT>
class TRandPoisson {
  
  public:
  
        
        
        
  
    TRandPoisson();
  
    ~TRandPoisson();

        
        
        

    static uint_t  sample( double_t expMu );

        
        
        
  
    static double_t PDF( uint_t n, double_t dMu );
  
  private:
    

    static pthread_mutex_t lock;

    
};

 
 
 

    
    
    
  
template <class UniformRndT> inline
TRandPoisson<UniformRndT>::TRandPoisson( void ) {
}

template <class UniformRndT> inline
TRandPoisson<UniformRndT>::~TRandPoisson() {
}


# 1 "/home/room1/kriol/work/Project/include/RandPoisson.iC" 1 3
 









template <class UniformRndT> uint_t
TRandPoisson<UniformRndT>::sample( double_t expMu ) {

  (void)((  expMu >  0.0  ) || ( throw_assert("expMu > 0.0", "/home/room1/kriol/work/Project/include/RandPoisson.iC", 14 ), 0)) ;
  (void)((  expMu <= 1.0  ) || ( throw_assert("expMu <= 1.0", "/home/room1/kriol/work/Project/include/RandPoisson.iC", 15 ), 0)) ;

  register double_t dT;
  register uint_t   iN;

  if ( expMu > dLimit ) {


  pthread_mutex_lock( &lock );


    iN = 0;
    dT = UniformRndT::sample();

    while ( dT > expMu ) {
      ++iN;
      dT *= UniformRndT::sample();
    }
    

  pthread_mutex_unlock( &lock );

    
  } else {

       
       
       


  pthread_mutex_lock( &lock );

  
    register double_t dMu       = -::log( expMu );
    register double_t dLocalExp = ::sqrt( dMu );

    for( ;; ) {
      
      dT = dMu + dLocalExp * TRandNormal<UniformRndT>::sample() + 0.5;
      
      if ( dT >= 0.0 ) {
        iN = static_cast<uint_t>( dT );
        break;
      }
    }
    

  pthread_mutex_unlock( &lock );

    
  }
  return iN;
}

 
 
 

template <class UniformRndT> double_t
TRandPoisson<UniformRndT>::PDF( uint_t n, double_t dMu ) {
  
  register double_t tmp = 1.0;

  for( uint_t i = 1; i <= n; ++i ) {
    tmp *= dMu / double_t( i );
  }
  return ( tmp * ::exp( -dMu ) );
}


template <class UniformRndT> pthread_mutex_t TRandPoisson<UniformRndT>::lock = {0, 0, 0} ;

# 79 "/home/room1/kriol/work/Project/include/RandPoisson.H" 2 3




# 39 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandAngles2D.H" 1 3
 





  


 
 
 
 
 
 
 
 
 


# 1 "/home/room1/kriol/local/include/g++/utility" 1 3
 
 






# 21 "/home/room1/kriol/work/Project/include/RandAngles2D.H" 2 3






typedef pair<double_t,double_t> RandAngles2D_t;

template <class UniformRndT>  
class TRandAngles2D {
    
  public:
  
        
        
        
  
    TRandAngles2D();
  
    ~TRandAngles2D();

        
        
        

    static void sample( RandAngles2D_t& );

    static RandAngles2D_t sample( void );

  private:
    

    static pthread_mutex_t lock;


};

 
 
 

    
    
    
  
template <class UniformRndT> inline
TRandAngles2D<UniformRndT>::TRandAngles2D( void ) {
}
  
template <class UniformRndT> inline
TRandAngles2D<UniformRndT>::~TRandAngles2D() {
}

    
    
    

template <class UniformRndT> inline void
TRandAngles2D<UniformRndT>::sample( RandAngles2D_t& theAngles ) {

  register double_t norm;
  register double_t tmpA;
  register double_t tmpB;


  pthread_mutex_lock( &lock );

  
  do {
    tmpA = UniformRndT::sample( true );
    tmpB = UniformRndT::sample();
  } while ( (norm = tmpA*tmpA + tmpB*tmpB) > 1.0 );


  pthread_mutex_unlock( &lock );

  
  theAngles.second = ( tmpA*tmpA - tmpB*tmpB ) / norm;  
  theAngles.first  = 2.0 * tmpA * tmpB / norm;          
}

template <class UniformRndT> inline RandAngles2D_t
TRandAngles2D<UniformRndT>::sample( void ) {

  RandAngles2D_t tmp;
  sample( tmp );
  return tmp;
}


template <class UniformRndT> pthread_mutex_t TRandAngles2D<UniformRndT>::lock = {0, 0, 0} ;

  

# 43 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3




# 1 "/home/room1/kriol/work/Project/include/RandAngles3D.H" 1 3
 





  


 
 
 
 
 
 
 
 
 














# 1 "/home/room1/kriol/work/Project/include/troika.H" 1 3
 




template <class T1, class T2, class T3>
struct troika {
  public:
    
    typedef T1 first_type;
    typedef T2 second_type;
    typedef T3 third_type;

    T1 first;
    T2 second;
    T3 third;
    
    troika();
    troika( const T1& x, const T2& y, const T3& z );
    
    troika( const troika<T1,T2,T3>& );
    
};

 
 
 

template <class T1, class T2, class T3> inline
troika<T1,T2,T3>::troika() {
}

template <class T1, class T2, class T3> inline
troika<T1,T2,T3>::troika( const T1& x, const T2& y, const T3& z ):
  first( x ),
  second( y ),
  third( z ) {
}

template <class T1, class T2, class T3> inline
troika<T1,T2,T3>::troika( const troika<T1,T2,T3>& theTroika ):
  first( theTroika.first ),
  second( theTroika.second ),
  third( theTroika.third ) {
}


# 33 "/home/room1/kriol/work/Project/include/RandAngles3D.H" 2 3



typedef troika<double_t,double_t,double_t> RandAngles3D_t;

template <class UniformRndT>  
class TRandAngles3D {
    
  public:
  
        
        
        
  
    TRandAngles3D( void );
  
    ~TRandAngles3D();

        
        
        

    static void sample( RandAngles3D_t& );
    static void sample( TVector3D<double_t>& );

    static RandAngles3D_t       sample( void );
    static TVector3D<double_t>  sample( bool_t );

  private:


    static pthread_mutex_t lock;

    
};

 
 
 

    
    
    
  
template <class UniformRndT> inline
TRandAngles3D<UniformRndT>::TRandAngles3D( void ) {
}
  
template <class UniformRndT> inline
TRandAngles3D<UniformRndT>::~TRandAngles3D() {
}

    
    
    

template <class UniformRndT> inline void
TRandAngles3D<UniformRndT>::sample( RandAngles3D_t& theAngles ) {

  register double_t beta_0, norm_0;
  register double_t norm, tmpA, tmpB;


  pthread_mutex_lock( &lock );

  
      
      
      

  do {
    beta_0 = UniformRndT::sample();
    norm_0 = 1.0 + beta_0*beta_0;
  } while( beta_0 < norm_0*norm_0*UniformRndT::sample()*0.32475952641916449 );  

  theAngles.third  = ( 2.0 - norm_0 ) / norm_0;

  if ( UniformRndT::sample() < 0.5 ) {
    theAngles.third = -theAngles.third;
  }
      
      
      
  
  do {
    tmpA = UniformRndT::sample( true );
    tmpB = UniformRndT::sample();
  } while ( (norm = tmpA*tmpA + tmpB*tmpB) > 1.0 );


  pthread_mutex_unlock( &lock );


  norm             = 2.0 * beta_0 / ( norm_0 * norm );
  theAngles.first  = 2.0 * tmpA * tmpB * norm;
  theAngles.second = ( tmpA*tmpA - tmpB*tmpB ) * norm;
}

template <class UniformRndT> inline void
TRandAngles3D<UniformRndT>::sample( TVector3D<double_t>& theVector ) {

  register double_t beta_0, norm_0;
  register double_t norm, tmpA, tmpB;


  pthread_mutex_lock( &lock );

  
  do {
    beta_0 = UniformRndT::sample();
    norm_0 = 1.0 + beta_0*beta_0;
  } while( beta_0 < norm_0*norm_0*UniformRndT::sample()*0.32475952641916449 );  

  tmpA  = ( 2.0 - norm_0 ) / norm_0;

  if ( UniformRndT::sample() < 0.5 ) {
    tmpA = -tmpA;
  }
  theVector.setZ( tmpA );
  
      
      
      
  
  do {
    tmpA = UniformRndT::sample( true );
    tmpB = UniformRndT::sample();
  } while ( (norm = tmpA*tmpA + tmpB*tmpB) > 1.0 );


  pthread_mutex_unlock( &lock );

  
  norm             = 2.0 * beta_0 / ( norm_0 * norm );
  theVector.setX( 2.0 * tmpA * tmpB * norm );
  theVector.setY( ( tmpA*tmpA - tmpB*tmpB ) * norm );
}

template <class UniformRndT> inline RandAngles3D_t
TRandAngles3D<UniformRndT>::sample( void ) {

  RandAngles3D_t tmp;
  sample( tmp );
  return tmp;
}

template <class UniformRndT> inline TVector3D<double_t>
TRandAngles3D<UniformRndT>::sample( bool_t ) {

  TVector3D<double_t> tmp;
  sample( tmp );
  return tmp;
}


template <class UniformRndT> pthread_mutex_t TRandAngles3D<UniformRndT>::lock = {0, 0, 0} ;



# 47 "/home/room1/kriol/work/Project/include/DefaultRNG.H" 2 3



typedef TRandUniform_MT<TIMWC1616RandUniform>                         TUniformRNG_t;

typedef TRandNormal<TRandUniform<TIMWC1616RandUniform> >              TGaussRNG_t;
typedef TRandExponent<TRandUniform<TIMWC1616RandUniform> >            TExponentRNG_t;
typedef TRandPoisson<TRandUniform<TIMWC1616RandUniform> >             TPoissonRNG_t;

typedef TRandAngles2D<TRandUniform<TIMWC1616RandUniform> >            TAngles2DRNG_t;
typedef TRandAngles3D<TRandUniform<TIMWC1616RandUniform> >            TAngles3DRNG_t;


# 12 "TestToroid.C" 2


# 1 "display2d.H" 1



extern GLuint uiUniverseWiredList;
extern GLuint uiBodyWiredList;

void display( void );
void reshape( int w, int h );


# 14 "TestToroid.C" 2

# 1 "allocate.H" 1



typedef TVector3D<double_t> point_t ;

void allocateRes( void );
void deallocateRes( void );

extern EPosStatus* eStatus;
extern point_t* start;
extern point_t* inA;
extern point_t* outA;
extern point_t* inB;
extern point_t* outB;
extern point_t* theend;

extern const point_t inf;


# 15 "TestToroid.C" 2

# 1 "numtest_twofold.H" 1



void numtest_twofold( long lNHist,
                      const VShape<double_t>& in,
                      const VShape<double_t>& out,
                      double_t dDx, double_t dDy, double_t dDz );


# 16 "TestToroid.C" 2


 

extern const int_t iNhist = 0;

const double_t dD_x = 4.0;
const double_t dD_y = 4.0;
const double_t dD_z = 4.0;

const double_t rExt = 2.0;

int
main( void ) {









  
  allocateRes();
  
  TToroidV_t   toroid( string("Toroid"), rExt, 1.0 );
  TBoxV_t      extBox( string("Box-II"), dD_x, dD_y, dD_z );
  
  numtest_twofold( 1L, toroid, extBox, dD_x, dD_y, dD_z );

# 55 "TestToroid.C"

  
  for ( int i = 0; i < iNhist; ++i ) {

    TVector3D_t pos( dD_x * TUniformRNG_t::sample( true ),
                     dD_y * TUniformRNG_t::sample( true ),
                     dD_z * TUniformRNG_t::sample( true ) );
    start[i] = pos;

    TVector3D_t dir;

    TAngles3DRNG_t::sample( dir );
    
    if ( (eStatus[i] = toroid.eWhere( pos )) == eIn ) {
      
      double_t dS = toroid.dDistanceOut( pos, dir );
      inA[i] = start[i] + dS*dir;

      dS = toroid.dDistanceIn( inA[i], dir );

      if ( dS != num_traits<double_t>::maximum ) {

        outA[i] = inA[i] + dS*dir;
        
        dS = toroid.dDistanceOut( outA[i], dir );
        inB[i] = outA[i] + dS*dir;
        
        dS     = extBox.dDistanceOut( inB[i], dir );
        outB[i]= inB[i] + dS*dir;
      } else {

        dS      = extBox.dDistanceOut( inA[i], dir );
        outA[i] = inA[i] + dS*dir;
        
      }
      
    } else {
      
      double_t dS = toroid.dDistanceIn( pos, dir );

      if ( dS != num_traits<double_t>::maximum ) {
        
        inA[i] = start[i] + dS*dir;

        dS = toroid.dDistanceOut( inA[i], dir );

        outA[i] = inA[i] + dS*dir;

        dS = toroid.dDistanceIn( outA[i], dir );

        if ( dS != num_traits<double_t>::maximum ) {

          inB[i] = outA[i] + dS*dir;

          dS = toroid.dDistanceOut( inB[i], dir );

          outB[i] = inB[i] + dS*dir;
          
          dS = extBox.dDistanceOut( outB[i], dir );

          theend[i] = outB[i] + dS*dir;
          
        } else {
          
          dS = extBox.dDistanceOut( outA[i], dir );
          inB[i] = outA[i] + dS*dir;
        }
      } else {
        
        dS     = extBox.dDistanceOut( pos, dir );
        inA[i] = start[i] + dS*dir;
      }
    }
  }








  deallocateRes();

  
  return 0;
}

void
superdummy( void ) {
  TVector3D_t ccc;
  TQuaternion_t ddd;
  abs(ccc);
  norm(ddd);
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]