initialTimeOffset = 0;
  public void run() {    gridbag = new GridBagLayout();    vncContainer.setLayout(gridbag);    GridBagConstraints gbc = new GridBagConstraints();    gbc.gridwidth = GridBagConstraints.REMAINDER;    gbc.anchor = GridBagConstraints.NORTHWEST;    if (showControls) {      buttonPanel = new ButtonPanel(this);      buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));      gridbag.setConstraints(buttonPanel, gbc);      vncContainer.add(buttonPanel);    }    if (inSeparateFrame) {      vncFrame.pack();      vncFrame.show();    } else {      validate();    }    try {      URL url = new URL(sessionURL);      fbsStream = new FbsInputStream(url.openStream());      rfb = new RfbProto(fbsStream);      vc = new VncCanvas(this);      gbc.weightx = 1.0;      gbc.weighty = 1.0;      if (inSeparateFrame) {	// Create a panel which itself is resizeable and can hold	// non-resizeable VncCanvas component at the top left corner.	Panel canvasPanel = new Panel();	canvasPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));	canvasPanel.add(vc);	// Create a ScrollPane which will hold a panel with VncCanvas	// inside.	desktopScrollPane = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);	gbc.fill = GridBagConstraints.BOTH;	gridbag.setConstraints(desktopScrollPane, gbc);	desktopScrollPane.add(canvasPanel);	// Finally, add our ScrollPane to the Frame window.	vncFrame.add(desktopScrollPane);	vncFrame.setTitle(rfb.desktopName);	vncFrame.pack();	vc.resizeDesktopFrame();      } else {	// Just add the VncCanvas component to the Applet.	gridbag.setConstraints(vc, gbc);	add(vc);	validate();      }      while (true) {	try {	  buttonPanel.setPaused(true);	  vc.processNormalProtocol();	} catch (EOFException e) {	  fbsStream.close();	  fbsStream = new FbsInputStream(url.openStream());	  rfb.newInputStream(fbsStream);	}      }    } catch (FileNotFoundException e) {      fatalError(e.toString());    } catch (Exception e) {      e.printStackTrace();      fatalError(e.toString());    }      }