Generated on Fri Oct 6 16:26:43 2006 for Gecode/J by doxygen 1.4.7

TreeCanvas.java

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Mikael Lagerkvist <lagerkvist@gecode.org> 
00004  *     Guido Tack <tack@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Mikael Lagerkvist, 2006
00008  *     Guido Tack, 2006
00009  *
00010  *  Last modified:
00011  *     $Date: 2006-10-05 09:50:19 +0200 (Thu, 05 Oct 2006) $ by $Author: zayenz $
00012  *     $Revision: 3721 $
00013  *
00014  *  This file is part of Gecode, the generic constraint
00015  *  development environment:
00016  *     http://www.gecode.org
00017  *
00018  *  See the file "LICENSE" for information on usage and
00019  *  redistribution of this file, and for a
00020  *     DISCLAIMER OF ALL WARRANTIES.
00021  *
00022  */
00023 
00024 package org.gecode.explorer.swing;
00025 
00026 import java.awt.*;
00027 import java.awt.event.*;
00028 import javax.swing.*;
00029 
00030 import javax.swing.event.*;
00031 import javax.swing.border.*;
00032 
00033 import org.gecode.explorer.BoundingBox;
00034 import org.gecode.explorer.*;
00035 
00036 public class TreeCanvas
00037   extends JPanel
00038   implements MouseListener, ChangeListener, Scrollable {
00039 
00040   boolean firstTime = true;
00041 
00042   UINode root;
00043   UINode current;
00044 
00045   double scale = 0.3;
00046   double xtrans;
00047   double ytrans = 30.0;
00048   int width, depth;
00049     
00050   ExplorerController _ctrl;
00051 
00052   // GUI references
00053   JFrame frame;
00054   JScrollPane scrollPane;
00055   JPopupMenu pop;
00056   JSlider scaleSlider;
00057   MenuBar menuBar;
00058   JLabel jl_status, jl_statistics;
00059   JPanel jp_status;
00060   StatusPanel sp_statistics;
00061     
00062   public TreeCanvas(ExplorerController ctrl){
00063     setPreferredSize(new Dimension(600,400));
00064     _ctrl = ctrl;
00065     setBackground(Color.white);
00066     setForeground(Color.black);
00067 
00068     addMouseListener(this);                
00069 
00070     String space_name = ctrl.getCurrentNode().getSpace().getName();
00071     frame = new JFrame("Gecode/J Explorer" + 
00072                               (space_name==""?"" : ": " + space_name));
00073     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
00074     frame.setIconImage(new ImageIcon(gecodeLogo).getImage());
00075 
00076     frame.getContentPane().setLayout(new BorderLayout());
00077 
00078     scrollPane = new JScrollPane( this );
00079     scrollPane.setVerticalScrollBarPolicy
00080       (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
00081     scrollPane.setHorizontalScrollBarPolicy
00082       (JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
00083 
00084     scrollPane.getHorizontalScrollBar().setUnitIncrement(10);
00085     scrollPane.getHorizontalScrollBar().setBlockIncrement(100);
00086     scrollPane.getVerticalScrollBar().setUnitIncrement(10);
00087     scrollPane.getVerticalScrollBar().setBlockIncrement(100);
00088 
00089     menuBar = new MenuBar(frame, ctrl);
00090     frame.setJMenuBar(menuBar);
00091     pop = menuBar.getPopupMenu();
00092 
00093     frame.getContentPane().add(scrollPane);
00094 
00095     scaleSlider = new JSlider(JSlider.VERTICAL, 2, 300, 100);
00096     scaleSlider.addChangeListener(this);
00097     scaleSlider.setPaintTicks(false);
00098     scaleSlider.setPaintLabels(false);
00099 
00100     frame.getContentPane().add("East", scaleSlider);
00101 
00102     jp_status = new JPanel();
00103     jp_status.setLayout(new BorderLayout());
00104 
00105     // On Mac OS, add leading space to the label
00106     if (System.getProperty("mrj.version") == null)
00107       jl_status = new JLabel("ready.");
00108     else
00109       jl_status = new JLabel(" ready.");
00110 
00111     jp_status.add(jl_status, BorderLayout.WEST);
00112     jl_statistics = new JLabel("");
00113     sp_statistics = new StatusPanel();
00114     jp_status.add(sp_statistics, BorderLayout.EAST);
00115     jp_status.setBorder(new BevelBorder(BevelBorder.LOWERED));
00116     frame.getContentPane().add("South", jp_status);
00117 
00118     //Display the window.
00119     frame.pack();
00120     frame.setSize(new Dimension(600,400));
00121     frame.setVisible(true);
00122 
00123   }
00124 
00125   JFrame getFrame() {
00126       return frame;
00127   }
00128 
00129   public void updateTree(UINode rootNode, UINode currentNode) {
00130     root = rootNode;
00131     if (current != null)
00132       current.hasShadow = false;
00133     current = currentNode;
00134     current.hasShadow = true;
00135     BoundingBox b = root.getBoundingBox();
00136 
00137     if (b != null) {
00138       xtrans = -b.left + 50;
00139             
00140       width = b.right - b.left + 100;
00141       depth = b.depth * 200 + 100;
00142     }
00143     Dimension d = scrollPane.getViewport().getExtentSize();
00144     setPreferredSize(new Dimension(Math.max((int)(width*scale), d.width),
00145                                    Math.max((int)(depth*scale), d.height)));
00146 
00147     setStatistics();
00148     revalidate();
00149     repaint();
00150   }
00151 
00152   public void scaleToFit() {
00153     if (root != null) {
00154       BoundingBox b = root.getBoundingBox();
00155       Dimension d = scrollPane.getViewport().getExtentSize();
00156             
00157       float newYScale = ((float)d.height / (b.depth*200 + 100))*300;
00158       float newXScale = ((float)d.width / (b.right-b.left + 100))*300;
00159       int newScale = Math.min(Math.round(newYScale),
00160                               Math.round(newXScale));
00161             
00162       scaleSlider.setValue(newScale);
00163     }
00164   }
00165 
00166   public void centerCursor() {
00167       if (current != null) {
00168           JViewport p = scrollPane.getViewport();
00169           Coordinate c = current.coordinates();
00170           //      System.err.println("coords: "+c+" "+xtrans);
00171           Dimension extent = p.getExtentSize();
00172           int yCenterOffset = extent.height / 2;
00173           int xCenterOffset = extent.width / 2;
00174 
00175 
00176           int newy = (int)(scale*(double)c.y());
00177           int newx = (int)((c.x()+(int)xtrans)*scale);
00178           
00179           if (!p.getViewRect().contains(newx,newy)) {
00180               newy = Math.max(newy-yCenterOffset, 0);
00181               newx = Math.max(newx-xCenterOffset, 0);
00182               p.setViewPosition(new Point(newx, newy));
00183               revalidate();
00184               repaint();
00185           }
00186       }
00187   }
00188 
00189   public void paintComponent(Graphics g){
00190     super.paintComponent(g);
00191     update(g);
00192   }
00193 
00194   final static BasicStroke stroke = new BasicStroke(2.0f);
00195   public void update(Graphics g){
00196     Graphics2D g2 = (Graphics2D)g;
00197 
00198     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
00199                         RenderingHints.VALUE_ANTIALIAS_ON);
00200 
00201     g2.translate(xtrans*scale, ytrans);
00202     g2.scale(scale, scale);
00203 
00204     Rectangle clip = g2.getClipBounds();
00205 
00206     if (clip != null) {
00207       g2.setPaint(Color.white);
00208       g2.fillRect(clip.x, clip.x, clip.width, clip.height);
00209       g2.setPaint(Color.black);
00210     }
00211 
00212     if (root != null)
00213       root.draw(g2, new Rect(clip.x, clip.y, clip.width, clip.height));
00214 
00215   }
00216 
00217   public void setCurrentNode(UINode newNode) {
00218     current.hasShadow = false;
00219     newNode.hasShadow = true;
00220     current = newNode;
00221     centerCursor();
00222     repaint();
00223   }
00224 
00225   private void setStatistics() {
00226     int[] stat = _ctrl.getStatistics();
00227 
00228 //     String text = "";
00229 //     if (stat[0] != 0) text += "   Success nodes: " + stat[0];
00230 //     if (stat[1] != 0) text += "   Failed nodes: "  + stat[1];
00231 //     if (stat[2] != 0) text += "   Choice nodes: "  + stat[2];
00232 //     if (stat[3] != 0) text += "   White nodes: "   + stat[3];
00233 //     if (stat[4] != 0) text += "   Tree depth: "    + stat[4];
00234 
00235 //     jl_statistics.setText(text);
00236     sp_statistics.setSuccess(stat[0]);
00237     sp_statistics.setFailure(stat[1]);
00238     sp_statistics.setChoice(stat[2]);
00239     sp_statistics.setUnknown(stat[3]);
00240     sp_statistics.setDepth(stat[4]);
00241   }
00242     
00243   public void mousePressed(MouseEvent e) {}
00244   public void mouseDragged(MouseEvent e) {}
00245   public void mouseReleased(MouseEvent e){}
00246   public void mouseMoved(MouseEvent e){}
00247   public void mouseClicked(MouseEvent e) {
00248     int x = (int) (((double) e.getX()) / scale - xtrans);
00249     int y = (int) (((double) e.getY()) / scale - ytrans/scale);
00250     UINode foundNode = (UINode) root.findNodeForPoint(x, y);
00251     if (foundNode != null) {
00252       _ctrl.setCurrentNode(foundNode);
00253       if (e.getClickCount() == 2 &&
00254           e.getButton() == MouseEvent.BUTTON1) {
00255         _ctrl.inspect();
00256       }
00257       // Does not seem to work...
00258       //if (e.isPopupTrigger()) {
00259       if (e.getClickCount() == 1 &&
00260           e.getButton() == MouseEvent.BUTTON3) {
00261         pop.show(this, e.getX(), e.getY());
00262       }
00263     }
00264   }
00265   public void mouseExited(MouseEvent e){}
00266   public void mouseEntered(MouseEvent e){}
00267 
00268   // ChangeListener Interface
00269   public void stateChanged(ChangeEvent e) {
00270     JSlider source = (JSlider)e.getSource();
00271     //         if (!source.getValueIsAdjusting()) {
00272     scale = ((int)source.getValue()) / 300.0;
00273     double newWidth = width * scale;
00274     double newHeight = depth * scale;
00275     Dimension d = scrollPane.getViewport().getExtentSize();
00276     setPreferredSize(new Dimension(Math.max((int)newWidth, d.width),
00277                                    Math.max((int)newHeight, d.height)));        
00278     revalidate();
00279     repaint();
00280     //         }
00281   }
00282 
00283   public Dimension getPreferredSize() {
00284     Dimension d = scrollPane.getViewport().getExtentSize();
00285     setPreferredSize(new Dimension(Math.max((int)(width*scale), d.width),
00286                                    Math.max((int)(depth*scale), d.height)));    
00287     return super.getPreferredSize();
00288   }
00289 
00290   // Scrollable Interface
00291   public Dimension getPreferredScrollableViewportSize() {
00292     return getPreferredSize();
00293   }
00294   public int getScrollableUnitIncrement(Rectangle r, int i, int j) {
00295     return 1;
00296   }
00297   public int getScrollableBlockIncrement(Rectangle r, int i, int j) {
00298     return 1;
00299   }
00300   public boolean getScrollableTracksViewportWidth() {
00301     return false;
00302   }
00303   public boolean getScrollableTracksViewportHeight() {
00304     return false;
00305   }
00306 
00307 
00308   // Status panel
00309   class StatusPanel extends JPanel {
00310     JLabel ns, nf, nc, nu, d;
00311 
00312     public StatusPanel() {
00313       Icon si = new SuccessNode().getIcon();
00314       Icon fi = new FailureNode().getIcon();
00315       Icon ci = new ChoiceNode().getIcon();
00316       Icon ui = new UnknownNode().getIcon();
00317       
00318       ns = new JLabel(new SuccessNode().getIcon());
00319       setSuccess(0);
00320       nf = new JLabel(new FailureNode().getIcon());
00321       setFailure(0);
00322       nc = new JLabel(new ChoiceNode().getIcon());
00323       setChoice(0);
00324       nu = new JLabel(new UnknownNode().getIcon());
00325       setUnknown(0);
00326       d = new JLabel();
00327       setDepth(0);
00328       add(ns);
00329       add(nf);
00330       add(nc);
00331       add(nu);
00332       add(d);
00333     }
00334 
00335     public void setSuccess(int n) {
00336       ns.setText("" + n);
00337       ns.setVisible(n != 0);
00338     }
00339     public void setFailure(int n) {
00340       nf.setText("" + n);
00341       nf.setVisible(n != 0);
00342     }
00343     public void setChoice(int n) {
00344       nc.setText("" + n);
00345       nc.setVisible(n != 0);
00346     }
00347     public void setUnknown(int n) {
00348       nu.setText("" + n);
00349       nu.setVisible(n != 0);
00350     }
00351     public void setDepth(int n) {
00352       // On Mac OS, add trailing spaces to the label
00353       if (System.getProperty("mrj.version") == null)
00354         d.setText("Depth: " + n);
00355       else
00356         d.setText("Depth: " + n + "    ");
00357 
00358       d.setVisible(n != 0);
00359     }
00360   }
00361 
00362     // This array contains the bytes of the small single-quadrant gecode logo.
00363     static byte[] gecodeLogo = {
00364         (byte)0x89, (byte)0x50, (byte)0x4e, (byte)0x47, (byte)0x0d, (byte)0x0a, 
00365         (byte)0x1a, (byte)0x0a, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0d, 
00366         (byte)0x49, (byte)0x48, (byte)0x44, (byte)0x52, (byte)0x00, (byte)0x00, 
00367         (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x10, 
00368         (byte)0x08, (byte)0x06, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x1f, 
00369         (byte)0xf3, (byte)0xff, (byte)0x61, (byte)0x00, (byte)0x00, (byte)0x00, 
00370         (byte)0x06, (byte)0x62, (byte)0x4b, (byte)0x47, (byte)0x44, (byte)0x00, 
00371         (byte)0xff, (byte)0x00, (byte)0xff, (byte)0x00, (byte)0xff, (byte)0xa0, 
00372         (byte)0xbd, (byte)0xa7, (byte)0x93, (byte)0x00, (byte)0x00, (byte)0x00, 
00373         (byte)0x09, (byte)0x70, (byte)0x48, (byte)0x59, (byte)0x73, (byte)0x00, 
00374         (byte)0x00, (byte)0x00, (byte)0x48, (byte)0x00, (byte)0x00, (byte)0x00, 
00375         (byte)0x48, (byte)0x00, (byte)0x46, (byte)0xc9, (byte)0x6b, (byte)0x3e, 
00376         (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x3a, (byte)0x49, (byte)0x44, 
00377         (byte)0x41, (byte)0x54, (byte)0x38, (byte)0xcb, (byte)0x95, (byte)0x92, 
00378         (byte)0xcf, (byte)0x4b, (byte)0xd3, (byte)0x71, (byte)0x1c, (byte)0xc6, 
00379         (byte)0x5f, (byte)0x9f, (byte)0xef, (byte)0x36, (byte)0x9b, (byte)0x4a, 
00380         (byte)0x4e, (byte)0x25, (byte)0x99, (byte)0x9a, (byte)0x88, (byte)0x1d, 
00381         (byte)0xbc, (byte)0xe4, (byte)0x21, (byte)0x04, (byte)0x37, (byte)0x1d, 
00382         (byte)0x0a, (byte)0x7a, (byte)0x51, (byte)0x90, (byte)0x1d, (byte)0xa2, 
00383         (byte)0x0e, (byte)0x0d, (byte)0x54, (byte)0x50, (byte)0xd1, (byte)0x8b, 
00384         (byte)0x58, (byte)0x17, (byte)0x41, (byte)0x2f, (byte)0xfe, (byte)0x01, 
00385         (byte)0xd3, (byte)0xab, (byte)0x83, (byte)0xbc, (byte)0x85, (byte)0x6b, 
00386         (byte)0x28, (byte)0xa2, (byte)0x82, (byte)0x20, (byte)0xfe, (byte)0xd8, 
00387         (byte)0x84, (byte)0x8a, (byte)0x4e, (byte)0xe1, (byte)0x49, (byte)0x44, 
00388         (byte)0x6b, (byte)0x81, (byte)0xc8, (byte)0x4e, (byte)0xb6, (byte)0x28, 
00389         (byte)0x75, (byte)0x8a, (byte)0xd1, (byte)0x46, (byte)0xdf, (byte)0xcf, 
00390         (byte)0xf6, (byte)0xee, (byte)0x10, (byte)0x4d, (byte)0x87, (byte)0x13, 
00391         (byte)0xea, (byte)0x39, (byte)0xbe, (byte)0xf9, (byte)0x3c, (byte)0xcf, 
00392         (byte)0xfb, (byte)0xf3, (byte)0xbc, (byte)0x9f, (byte)0x07, (byte)0x6e, 
00393         (byte)0x81, (byte)0xce, (byte)0x68, (byte)0x19, (byte)0xdd, (byte)0x1e, 
00394         (byte)0x15, (byte)0xef, (byte)0x92, (byte)0x57, (byte)0x2e, (byte)0x52, 
00395         (byte)0x17, (byte)0xc2, (byte)0xff, (byte)0x40, (byte)0x67, (byte)0xb4, 
00396         (byte)0x0c, (byte)0xac, (byte)0x0f, (byte)0x08, (byte)0x7e, (byte)0x04, 
00397         (byte)0x3f, (byte)0xe2, (byte)0x79, (byte)0xed, (byte)0x91, (byte)0xf3, 
00398         (byte)0xd4, (byte)0x79, (byte)0x5e, (byte)0x11, (byte)0x95, (byte)0x8f, 
00399         (byte)0x3c, (byte)0xb4, (byte)0x39, (byte)0x44, (byte)0x70, (byte)0x3f, 
00400         (byte)0x98, (byte)0x33, (byte)0x6f, (byte)0xa9, (byte)0x6e, (byte)0x21, 
00401         (byte)0xec, (byte)0x0b, (byte)0x53, (byte)0x6a, (byte)0x2f, (byte)0xcd, 
00402         (byte)0xe1, (byte)0x58, (byte)0x73, (byte)0xc8, (byte)0x69, (byte)0x2d, 
00403         (byte)0x83, (byte)0x1b, (byte)0x83, (byte)0x84, (byte)0x0e, (byte)0x42, 
00404         (byte)0xd4, (byte)0x96, (byte)0xd4, (byte)0xd2, (byte)0xf5, (byte)0xa0, 
00405         (byte)0x8b, (byte)0x9a, (byte)0xbb, (byte)0x35, (byte)0x24, (byte)0x75, 
00406         (byte)0x92, (byte)0x83, (byte)0xef, (byte)0x07, (byte)0x74, (byte)0x2f, 
00407         (byte)0x75, (byte)0x93, (byte)0x48, (byte)0x25, (byte)0xa4, (byte)0xcc, 
00408         (byte)0x5e, (byte)0x76, (byte)0x63, (byte)0x31, (byte)0x3a, (byte)0xad, 
00409         (byte)0xa5, (byte)0x6f, (byte)0xad, (byte)0x4f, (byte)0x8c, (byte)0x29, 
00410         (byte)0x43, (byte)0xa6, (byte)0x3f, (byte)0x4c, (byte)0x8b, (byte)0x99, 
00411         (byte)0x36, (byte)0xe5, (byte)0x3a, (byte)0xe2, (byte)0x3f, (byte)0xe2, 
00412         (byte)0x62, (byte)0x4c, (byte)0x19, (byte)0xe2, (byte)0x0e, (byte)0xba, 
00413         (byte)0x25, (byte)0x91, (byte)0x4c, (byte)0xe4, (byte)0xda, (byte)0x31, 
00414         (byte)0xd3, (byte)0xa6, (byte)0xf4, (byte)0xae, (byte)0xf5, (byte)0x0a, 
00415         (byte)0x7e, (byte)0x64, (byte)0xfc, (byte)0xed, (byte)0xb8, (byte)0x88, 
00416         (byte)0x88, (byte)0x1c, (byte)0x9e, (byte)0x1d, (byte)0x8a, (byte)0x77, 
00417         (byte)0xd9, (byte)0x2b, (byte)0xce, (byte)0x19, (byte)0xa7, (byte)0xd4, 
00418         (byte)0xbd, (byte)0xac, (byte)0x93, (byte)0xb6, (byte)0x50, (byte)0x5b, 
00419         (byte)0xf6, (byte)0x26, (byte)0xae, (byte)0x39, (byte)0x97, (byte)0x9c, 
00420         (byte)0x25, (byte)0xcf, (byte)0x04, (byte)0x40, (byte)0x99, (byte)0x69, 
00421         (byte)0x53, (byte)0xfa, (byte)0xd7, (byte)0xfb, (byte)0x59, (byte)0xf8, 
00422         (byte)0xb4, (byte)0x80, (byte)0xa1, (byte)0x0c, (byte)0x8e, (byte)0x9f, 
00423         (byte)0x1f, (byte)0xe3, (byte)0x2c, (byte)0x76, (byte)0xd2, (byte)0xf8, 
00424         (byte)0xaa, (byte)0x91, (byte)0xbd, (byte)0x6f, (byte)0x7b, (byte)0xb7, 
00425         (byte)0x1e, (byte)0xba, (byte)0xa9, (byte)0xaa, (byte)0x89, (byte)0x6d, 
00426         (byte)0xdf, (byte)0x36, (byte)0x6a, (byte)0x24, (byte)0x3c, (byte)0x22, 
00427         (byte)0xb3, (byte)0xbb, (byte)0xb3, (byte)0x00, (byte)0x54, (byte)0x16, 
00428         (byte)0x57, (byte)0x12, (byte)0x7f, (byte)0x11, (byte)0xe7, (byte)0xe4, 
00429         (byte)0xe7, (byte)0x09, (byte)0x15, (byte)0x33, (byte)0x15, (byte)0x00, 
00430         (byte)0xac, (byte)0x3e, (byte)0x5d, (byte)0xa5, (byte)0xbe, (byte)0xbc, 
00431         (byte)0x1e, (byte)0x80, (byte)0x89, (byte)0x77, (byte)0x13, (byte)0x6c, 
00432         (byte)0x1e, (byte)0x6d, (byte)0x66, (byte)0x45, (byte)0xdc, (byte)0xd5, 
00433         (byte)0x6e, (byte)0x0c, (byte)0xe1, (byte)0xca, (byte)0x8e, (byte)0xce, 
00434         (byte)0x68, (byte)0x00, (byte)0x0a, (byte)0x6d, (byte)0x85, (byte)0x14, 
00435         (byte)0x58, (byte)0x0a, (byte)0x00, (byte)0x88, (byte)0x5d, (byte)0xc4, 
00436         (byte)0xb0, (byte)0x28, (byte)0x0b, (byte)0x0d, (byte)0xf7, (byte)0x1a, 
00437         (byte)0x70, (byte)0xdc, (byte)0x71, (byte)0xe4, (byte)0x7e, (byte)0x43, 
00438         (byte)0xc0, (byte)0x08, (byte)0x74, (byte)0x06, (byte)0xe8, (byte)0x79, 
00439         (byte)0xd8, (byte)0x03, (byte)0xc0, (byte)0x69, (byte)0xf2, (byte)0x94, 
00440         (byte)0xe8, (byte)0x69, (byte)0x94, (byte)0x62, (byte)0x5b, (byte)0x31, 
00441         (byte)0xc3, (byte)0x8f, (byte)0x86, (byte)0x01, (byte)0x18, (byte)0x7b, 
00442         (byte)0x33, (byte)0xc6, (byte)0xf2, (byte)0xe7, (byte)0xe5, (byte)0xbc, 
00443         (byte)0x16, (byte)0xc2, (byte)0xbe, (byte)0x30, (byte)0x56, (byte)0x9b, 
00444         (byte)0xc5, (byte)0xa6, (byte)0xcc, (byte)0xb4, (byte)0x29, (byte)0x4a, 
00445         (byte)0x29, (byte)0xe6, (byte)0x3f, (byte)0xce, (byte)0x33, (byte)0xf9, 
00446         (byte)0x7e, (byte)0x92, (byte)0x95, (byte)0x27, (byte)0x2b, (byte)0x04, 
00447         (byte)0x3a, (byte)0x03, (byte)0xb4, (byte)0xd7, (byte)0xb6, (byte)0xb3, 
00448         (byte)0xfb, (byte)0x75, (byte)0x97, (byte)0x8e, (byte)0xda, (byte)0x8e, 
00449         (byte)0x1c, (byte)0xb2, (byte)0xab, (byte)0xca, (byte)0x45, (byte)0xc4, 
00450         (byte)0x17, (byte)0xa1, (byte)0xbc, (byte)0xb0, (byte)0xfc, (byte)0x2a, 
00451         (byte)0xce, (byte)0xbf, (byte)0x31, (byte)0xe2, (byte)0x47, (byte)0xbc, 
00452         (byte)0x4b, (byte)0x5e, (byte)0xd9, (byte)0xf9, (byte)0xb2, (byte)0x93, 
00453         (byte)0x8d, (byte)0xd2, (byte)0x4c, (byte)0x9b, (byte)0x12, (byte)0x3d, 
00454         (byte)0x89, (byte)0x4a, (byte)0x6b, (byte)0xa8, (byte)0xf5, (byte)0x46, 
00455         (byte)0x8c, (byte)0xd9, (byte)0x22, (byte)0x59, (byte)0x2d, (byte)0x56, 
00456         (byte)0xa5, (byte)0xd3, (byte)0x5a, (byte)0x94, (byte)0x52, (byte)0x84, 
00457         (byte)0x0e, (byte)0x42, (byte)0x6c, (byte)0x1c, (byte)0x6d, (byte)0x60, 
00458         (byte)0xb7, (byte)0xda, (byte)0x29, (byte)0x29, (byte)0x28, (byte)0xe1, 
00459         (byte)0xf2, (byte)0xd7, (byte)0x25, (byte)0x49, (byte)0x9d, (byte)0xa4, 
00460         (byte)0xb9, (byte)0xba, (byte)0x99, (byte)0x88, (byte)0x2f, (byte)0xc2, 
00461         (byte)0xf5, (byte)0x22, (byte)0xe5, (byte)0x34, (byte)0xd1, (byte)0x6a, 
00462         (byte)0xb1, (byte)0x2a, (byte)0x9d, (byte)0xd1, (byte)0x62, (byte)0x28, 
00463         (byte)0x83, (byte)0xe0, (byte)0x7e, (byte)0x90, (byte)0x94, (byte)0x4e, 
00464         (byte)0x91, (byte)0xd2, (byte)0xa9, (byte)0x7f, (byte)0xaf, (byte)0x32, 
00465         (byte)0x80, (byte)0xd5, (byte)0xf8, (byte)0x23, (byte)0xa2, (byte)0x50, 
00466         (byte)0xcc, (byte)0xed, (byte)0xcf, (byte)0x01, (byte)0xe0, (byte)0xb9, 
00467         (byte)0xef, (byte)0x61, (byte)0xeb, (byte)0xd9, (byte)0xd6, (byte)0x0d, 
00468         (byte)0x72, (byte)0x5e, (byte)0x81, (byte)0xeb, (byte)0x22, (byte)0x45, 
00469         (byte)0xb6, (byte)0x22, (byte)0x62, (byte)0xe7, (byte)0x31, (byte)0x16, 
00470         (byte)0x1f, (byte)0x2f, (byte)0xe2, (byte)0xb0, (byte)0x3b, (byte)0x54, 
00471         (byte)0xbe, (byte)0xb7, (byte)0xbf, (byte)0x01, (byte)0x57, (byte)0x10, 
00472         (byte)0x22, (byte)0x23, (byte)0x3f, (byte)0xf9, (byte)0x4d, (byte)0x33, 
00473         (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x49, (byte)0x45, 
00474         (byte)0x4e, (byte)0x44, (byte)0xae, (byte)0x42, (byte)0x60, (byte)0x82  
00475     };
00476 }