ROOT logo
//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
// HOnlineMonClientMain
//
// Main class of the HADES Online Monitoring Client.
// It contains a separat Thread in which the histograms are updated.
// The canvases are updated in the main thread, because the
// canvas-update is not threadsafe.
////////////////////////////////////////////////////////////////////////////

#include "honlinemonclientmain.h"

#include "honlinemonclientxml.h"
#include "honlinemonclientmainwin.h"
#include "honlinemonclientdet.h"
#include "honlinemonclienttabwin.h"
#include "honlinemonclientsimplewin.h"
#include "honlinemonclienttab.h"
#include "honlinemonclientcanvas.h"
#include "honlinemonclienthist.h"

#include "TClass.h"
#include "TObject.h"
#include "TPad.h"
#include "TTimeStamp.h"
#include "TObjString.h"
//#include "TGMsgBox.h"

#include <cstdlib>

ClassImp(HOnlineMonClientMain);

 Int_t    HOnlineMonClientMain::AutoSaveInterval       = -1;  // auto save interval in minutes.
 Int_t    HOnlineMonClientMain::AutoSaveIntervalOnline = -1;  // auto save interval in minutes.
 time_t   HOnlineMonClientMain::lastSaved        = 0;
 time_t   HOnlineMonClientMain::lastSavedOnline  = 0;
TThread*  HOnlineMonClientMain::mainThread       = NULL;
ULong64_t HOnlineMonClientMain::lastSumBytes     = 0;
Int_t     HOnlineMonClientMain::isMasterClient   = -1;

/* -------------------------------------------------------------------------- */
HOnlineMonClientMain::HOnlineMonClientMain(TString filename) {
    // filename is the name of the xml configuration file
    
    configfile = filename;
    socket = 0;
    updateComplete = kTRUE;
    updateThread = 0;
    UpdateInterval = 4;
    serverhost = "";
    serverport = 0;\
    doReconnect = 1;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::Init(Bool_t sendCmdOnly, TString host, Int_t port, TString cmd) {
    // Initialize program.
    // If there is a command, execute it and exit.
    // Else start client program with graphical user interface
    
    // check if there is a command to execute
    if (sendCmdOnly) {
        // connect and send command to server
        Bool_t validcmd = kFALSE;
        if ( Connect(host, port) ) {
            TThread::Printf("connected to server '%s' on port '%d'.", host.Data(), port);
        } else {
            TThread::Printf("failed to connect to server '%s' on port '%d'.", host.Data(), port);
            return;
        }
        
        /* CMD list */
        if (cmd.CompareTo("list")==0) {
            validcmd = kTRUE;
            TThread::Printf("list of available histograms from server '%s' on port '%d'", host.Data(), port);
            TThread::Printf("=========================================================");
            TList* histolist = GetListOfHistograms();
            if (histolist) {
                for(Int_t i=0;i<histolist->LastIndex()+1;i++) {
                    TString tempname = ((TObjString*) histolist->At(i))->GetString();
                    TThread::Printf("%s\n",tempname.Data());
                }
                TThread::Printf("=========================================================");
                histolist->Delete();
                delete histolist;
                histolist = 0;
            } else {
                TThread::Printf("ERROR: Received invalid list of histograms from server for command '%s'", cmd.Data());
                return;
            }
        }
        
        /* CMD stop */
        if (cmd.CompareTo("stop")==0) {
            validcmd = kTRUE;
            TThread::Printf("stop server '%s' on port '%d'", host.Data(), port);
            TString answer = SendCmdToServer("CMD stop");
        }
        
        socket->Close();
        delete socket;
        socket = 0;
        
        /* invalid cmd */
        if (!validcmd) {
            // invalid command
            TThread::Printf("Error: Unknown command '%s'", cmd.Data());
            return;
        }
        
        return;
    }
    
    
    // no command to execute, START CLIENT
    TThread::Printf("Create MainClient");
     
    clientmainwin = new HOnlineMonClientMainWin();
    clientmainwin->SetMainClient(this);

    CreateClientConfig(configfile);

    mainThread = TThread::Self();

    clientmainwin->CreateMainWin(this);
    
    if ( Connect(serverhost, serverport) ) {
        TThread::Printf("connected to server '%s' on port '%d'.", serverhost.Data(), serverport);
    } else {
        TThread::Printf("failed to connect to server '%s' on port '%d'.", serverhost.Data(), serverport);
        exit(1);
    }

    TString master = SendCmdToServer("CMD ismaster");
    if(master == "yes") {
	SetIsMasterClient(kTRUE);
	TThread::Printf("Running as Master client");
    } else {
        TThread::Printf("Running as Slave client");
    }

    // start update thread
    if (!updateThread) {
	TThread::Printf("start Update");
        updateThread = new TThread("updateThread", ( void(*) (void*) )&ThreadUpdateHists, (void*) this);
        updateThread->Run();
        TThread::Ps();
    }

     mainThread->Lock();
 
    //---------------------------------------------
    // create all detector GUIS
    TThread::Printf("Create Detetctor GUIs");
    for (Int_t i=0;i<listDetectors.LastIndex()+1;i++) {
	TString detname = listDetectors.At(i)->GetName();
	HOnlineMonClientDet *det = (HOnlineMonClientDet*) listDetectors.At(i);
	TGCheckButton *checkbutton = (TGCheckButton *)clientmainwin->listControlbuttons.FindObject(detname);
	if(checkbutton->IsOn()){
	  CreateDetGui(det);
	}
    }
    //---------------------------------------------

    mainThread->UnLock();

    // canvas/subpad update function should NOT be called
    // in a Thread, because it is NOT threadsafe

    TThread::Printf("Before Loop");
    lastSaved       = time(NULL);
    lastSavedOnline = time(NULL);

    // canvas / subpad update loop
    while(kTRUE) {

	mainThread->Lock();

        gSystem->ProcessEvents();
        
        for (Int_t i=0;i<listPads.LastIndex()+1;i++) {
            if (listPads.At(i)->IsA() == TCanvas::Class()) {
                // unsplit canvas, update the canvas itself
                TCanvas* cnv = (TCanvas*) listPads.At(i);
		cnv->cd();
                HOnlineMonClientHist* hist = (HOnlineMonClientHist*) listHists.FindObject(pad2hist[cnv->GetName()]);
                if (hist&&hist->IsActive() && hist->histo) {
                    if (cnv->IsModified()) {
                        cnv->Update();
                    }
                }
            } else {
                // split canvas, update the subpads
                TPad* subpad = (TPad*) listPads.At(i);
                subpad->cd();
                HOnlineMonClientHist* hist = (HOnlineMonClientHist*) listHists.FindObject(pad2hist[subpad->GetName()]);
                if (hist&&hist->IsActive() && hist->histo) {
                    if (subpad->IsModified()) {
                        subpad->Update();
                    }
                }
	    }
	    gSystem->ProcessEvents();
        }
	mainThread->UnLock();
	TThread::Sleep(0,1000000*1); // sleep ms  to give the UpdateHists Thread a chance :-)
    }
}
/* -------------------------------------------------------------------------- */
void* HOnlineMonClientMain::ThreadUpdateHists(void* arg) {
    
    // This function is executed in a separat thread.
    // It will update all histograms in the global histogram list.
    // The code between TThread::Lock() and TThread::UnLock() is
    // executed without interruption. The Thread will only be locked
    // before TThread::Lock() or after TThread::UnLock().
    // This ensures that the histogram update is performed in one step
    // without interruption.
    
    HOnlineMonClientMain *clientmain = (HOnlineMonClientMain*) arg;
    
    while(1) {
        gSystem->Sleep(clientmain->UpdateInterval*1000);
        //gSystem->ProcessEvents();

	mainThread->Lock();

	//--------------------------------------------------------------------------
	if(clientmain->updateComplete) {
	    clientmain->updateComplete = kFALSE;
	    clientmain->UpdateHists();
	    clientmain->updateComplete = kTRUE;
	}
 	//--------------------------------------------------------------------------


	//--------------------------------------------------------------------------
	if(AutoSaveInterval > 0){
	    time_t now = time(NULL);
	    if(now - lastSaved > AutoSaveInterval*60){

		clientmain->HandleSnapshotSave();

		lastSaved = time(NULL);
	    }
	}
	//--------------------------------------------------------------------------

	//--------------------------------------------------------------------------
	if(AutoSaveIntervalOnline > 0){
	    time_t now = time(NULL);
	    if(now - lastSavedOnline > AutoSaveIntervalOnline*60){

		clientmain->HandleSnapshotSaveOnline();

		lastSavedOnline = time(NULL);
	    }
	}
	//--------------------------------------------------------------------------

	mainThread->UnLock();
   }
    return 0;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::UpdateHists() {
    
    // update all hists in the global list of histograms.
    // This function is called by the thread-function
    // and is executed in the update-Thread.


    TString filename = SendCmdToServer("CMD filename");
    TString speed    = SendCmdToServer("CMD speed");
    filename = gSystem->BaseName(filename.Data());

    ULong64_t totBytesRecieved = socket->GetSocketBytesRecv();
    Float_t bytesPerSecond = (0.000001*(totBytesRecieved-lastSumBytes))/UpdateInterval;
    lastSumBytes = totBytesRecieved;

    clientmainwin->fTextFilename->SetText(filename.Data());
    clientmainwin->fTextSpeed   ->SetText(speed.Data());
    clientmainwin->fDataRate    ->SetText(Form("%10.4f Mb/s",bytesPerSecond));


    for (Int_t i=0;i<listPads.LastIndex()+1;i++) {
	if (listPads.At(i)->IsA() == TCanvas::Class()) {
            // unsplit canvas
            TCanvas* cnv = (TCanvas*) listPads.At(i);
	    // change to the canvas in which the histogram must be displayed
	    if(cnv == 0) TThread::Printf("UpdateHists() : canvas == 0");
	    cnv->cd();
            HOnlineMonClientHist* hist = (HOnlineMonClientHist*) listHists.FindObject(pad2hist[cnv->GetName()]);
	    //if(hist == 0) TThread::Printf("UpdateHists() : hist == 0"); // needs investigation ???
	    if (hist&&hist->IsActive() && hist->histo) {
                if (!UpdateHist(hist)) {
                    // error occurred
                    TThread::Printf("ERROR: Update of histogram '%s' failed.", hist->GetName());
		}
            }
        } else {
            // split canvas
            TPad* subpad = (TPad*) listPads.At(i);
	    if(subpad == 0) TThread::Printf("UpdateHists() : subpad == 0");
	    subpad->cd();
            HOnlineMonClientHist* hist = (HOnlineMonClientHist*) listHists.FindObject(pad2hist[subpad->GetName()]);
	    //if(hist == 0) TThread::Printf("UpdateHists() : hist == 0");  // needs investigation ???
	    if (hist&&hist->IsActive() && hist->histo) {
                if (!UpdateHist(hist)) {
                    // error occurred
                    TThread::Printf("ERROR: Update of histogram '%s' failed.", hist->GetName());
		}
	    }

        }
    }

}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::CreateClientConfig(TString xmlfile) {
        // Parse configuration file
	
	HOnlineMonClientXML* xmlparser = new HOnlineMonClientXML();
        Bool_t r = xmlparser->ParseXMLFile(xmlfile, this);

        if (!r) {
            TThread::Printf("Error: could not parse xml file.");
            delete xmlparser;
            xmlparser = 0;
            exit(1);
        }
        
        delete xmlparser;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::CreateDetGui(HOnlineMonClientDet *detector) {
    // Create and show all windows from given detector

    mainThread->Lock();
    
    detector->CreateDet(this);
   
    // unlock update thread
    mainThread->UnLock();

}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::DestroyDetGui(HOnlineMonClientDet *detector) {
    // Hide and destroy all windows from given detector
    mainThread->Lock();

    // the TCanvas objects will be deleted automatically, when TGMainFrame is destroyed.
    detector->DestroyDet(this);

    // unlock update thread
    mainThread->UnLock();
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::DestroySingleWindow(HOnlineMonClientSimpleWin *window) {
    // Hide and destroy a single simple window

    HOnlineMonClientDet *detector = (HOnlineMonClientDet *) listDetectors.FindObject(window->detectorname);
    if(detector) {
	TGCheckButton *button = 0;
	button = (TGCheckButton*) clientmainwin->listControlbuttons.FindObject(window->detectorname);
	if(button){
	    button->SetEnabled(kFALSE);

	    DestroyDetGui(detector);

	    button->SetEnabled(kTRUE);
	    button->SetOn(kFALSE);

	}
    }
    else { TThread::Printf("Error : DestroySingleWindow () retrieved NULL pointer for detector %s .",window->detectorname.Data());}

}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::DestroySingleWindow(HOnlineMonClientTabWin *window) {
    // Hide and destroy a single tab window


    HOnlineMonClientDet *detector = (HOnlineMonClientDet *) listDetectors.FindObject(window->detectorname);
    if(detector) {

	TGCheckButton *button = (TGCheckButton*) clientmainwin->listControlbuttons.FindObject(window->detectorname);
	if(button){
	    button->SetEnabled(kFALSE);

	    DestroyDetGui(detector);

	    button->SetEnabled(kTRUE);
	    button->SetOn(kFALSE);
	}
    }
    else { TThread::Printf("Error : DestroySingleWindow () retrieved NULL pointer for detector %s .",window->detectorname.Data());}


}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleRefreshRateChange() {
    // GUI Event Handler to handle change of refresh rate
    SetUpdateInterval(clientmainwin->numberEntryRefreshRate->GetNumberEntry()->GetIntNumber());
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleAutoSaveRateChange() {
    // GUI Event Handler to handle change of refresh rate
    SetAutoSaveInterval(clientmainwin->numberEntryAutoSaveRate->GetNumberEntry()->GetIntNumber());
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleSendStopServer(){
    TString returnval = SendCmdToServer("CMD stop");
    TThread::Printf("server responded on command stop = %s !", returnval.Data());
    if(returnval != "IGNORED"){
	TThread::Printf("Close Monitor application !");
	HandleMainWindowClose();
    }
    if(returnval == "IGNORED"){
	Int_t retval = 0;
	new TGMsgBox(gClient->GetRoot(), clientmainwin->GetMainWindow(),
		     "ERROR MSG", "YOU ARE NOT RUNNING AS MASTER AND CANNOT STOP THE SERVER!"
		     ,kMBIconExclamation,kMBCancel,&retval);//,
    }

}

/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleSendResetHists(){
    TString returnval = SendCmdToServer("CMD resetall");
    TThread::Printf("server responded on command resetall = %s !", returnval.Data());
    if(returnval == "IGNORED"){
	Int_t retval = 0;
	new TGMsgBox(gClient->GetRoot(), clientmainwin->GetMainWindow(),
		     "ERROR MSG", "YOU ARE NOT RUNNING AS MASTER AND CANNOT RESET HISTOGRAMS!"
		     ,kMBIconExclamation,kMBCancel,&retval);//,
    }

}

/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleConnectionError()
{
    TThread::Printf("server responded connection Error!" );

    Int_t retval = -1;

    //clientmainwin->GetMainWindow()->Disconnect("CloseWindow()");
    //clientmainwin->GetMainWindow()->Connect("CloseWindow()", "HOnlineMonClientMain", this, "HandleTryClose()");
    //new TGMsgBox(gClient->GetRoot(), clientmainwin->GetMainWindow(),
    //    	 "ERROR MSG", "CONNECTION TO SERVER LOST!"
    //    	 ,kMBIconStop,kMBClose,&retval);
    TGMsgBox* box = NULL;
    if(doReconnect == 1){
	box = new TGMsgBox(gClient->GetRoot(), clientmainwin->GetMainWindow(),
			   "ERROR MSG", "CONNECTION TO SERVER LOST! \n PRESS YES TO EXIT OR NO TO WAIT FOR RECONNECT!"
			   ,kMBIconStop,kMBYes|kMBNo ,&retval);
    }

    if(doReconnect == 0) {
	HandleMainWindowClose();
        return;
    }

    while ( ReConnect(serverhost,serverport) == kFALSE ){
        gSystem->ProcessEvents();
	TThread::Sleep(1);
        gSystem->ProcessEvents();
	TThread::Sleep(1);
	TThread::Printf("Try to reconnect!" );
    }

    if( IsMasterClient() ) {

	TString message = SendCmdToServer("CMD setmaster");
	if(message == "ok") {
           TThread::Printf("Running as Master client");
	} else {
	    TThread::Printf("Running as Slave client");
	}
    }

    TThread::Printf("Succesfully reconnected to server %s , port %i!",serverhost.Data(),serverport);


    if(doReconnect == 1 && box && retval == -1 && retval != kMBClose){ // nothing done to the window or closed
	box->CloseWindow();
    }


    if(doReconnect == 1 && retval == kMBYes) {
	HandleMainWindowClose();
    }
}
/* -------------------------------------------------------------------------- */

void HOnlineMonClientMain::HandleTryClose()
{
    Int_t retval = 0;
    //clientmainwin->Connect("CloseWindow()", "TestMsgBox", this, "TryToClose()");
    new TGMsgBox(gClient->GetRoot(), clientmainwin->GetMainWindow(),
		 "ERROR MSG", "CANNOT CLOSE NOW, STILL A MESSAGE BOX OPEN!"
		 ,kMBIconExclamation,kMBCancel,&retval);//,
    HandleConnectionError();
}

/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleSnapshotSave() {
    // GUI Event Handler to handle snapshot button click
    // Save all active canvases in a ps file in the same folder as the program.
    // The filename contains a timestamp

    if (listPads.LastIndex() == -1) return; // return if no window is open

    Bool_t doQuit = kFALSE;

    mainThread->Lock();
    
    // loop over the pads, not over the canvases. But the print-function
    // prints the complete canvas into the file. If there is a split canvas,
    // the print-function prints the canvas several times (nx*ny) into the file.
    // Prevent this by adding the name of each printed canvas into this map and
    // check the map before each canvas is printed.

    map <TString, Bool_t> printedCanvases;
    
    // create timestamp
    UInt_t year = 0;
    UInt_t month = 0;
    UInt_t day = 0;
    UInt_t hour = 0;
    UInt_t min = 0;
    UInt_t sec = 0;
    
    TTimeStamp* timestamp = new TTimeStamp();
    timestamp->GetDate(kFALSE, 0, &year, &month, &day);
    timestamp->GetTime(kFALSE, 0, &hour, &min, &sec);
    delete timestamp;
    TString  path      = clientmainwin->fTextSnapshotPath->GetText();
    TString currentRun = clientmainwin->fTextFilename->GetText();

    if(path      .Contains("ERROR")) doQuit = kTRUE;
    if(currentRun.Contains("ERROR")) doQuit = kTRUE;

    if(!doQuit)
    {

	if(path != ""){
	    path += "/";
	    path.ReplaceAll("//","/");
	    if(gSystem->AccessPathName(path.Data()) != 0 ){ // path not found
		TThread::Printf("HandleSnapshotSave() : Path = %s not found! Will use currentdirectory.",path.Data());
		path = "";
	    }
	}
	TString currentRun = clientmainwin->fTextFilename->GetText();


	TString filename = "";
	filename.Form("%s_%d-%02d-%02d_%02d%02d%02d.ps", currentRun.Data(), year, month, day, hour, min, sec);

	TString pdf = filename;
	pdf.ReplaceAll(".ps",".pdf");

	TString input  = path + filename;
	TString output = path + pdf;


	// get first subpad
	TPad* subpad = (TPad*) listPads.At(0);

	// open file without printing anything
	subpad->GetCanvas()->Print(filename + TString("["));

	for (Int_t i=0;i<listPads.LastIndex()+1;i++) {
	    TPad* subpad = (TPad*) listPads.At(i);
	    TCanvas* cnv = subpad->GetCanvas();
	    if (!printedCanvases[cnv->GetName()]) {  // canvas is not yet printed
		cnv->Print(filename);
		printedCanvases[cnv->GetName()] = kTRUE;
                cnv->SetBatch(kFALSE); // Unset Batch mode, because TPad::Print sometimes sets it to draw hidden parts of the Canvas
                cnv->Modified();       // Redraw the Canvas because the Batch Flag was manipulated
	    }
	}

	// close file without printing anything
	subpad->GetCanvas()->Print(filename + TString("]"));
        subpad->GetCanvas()->SetBatch(kFALSE); // Unset Batch mode, because TPad::Print sometimes sets it to draw hidden parts of the Canvas
	subpad->GetCanvas()->Modified();       // Redraw the Canvas because the Batch Flag was manipulated



	if (gSystem->AccessPathName(filename.Data()) == 0 ){ // file exists
	    gSystem->Exec(Form("ps2pdf %s %s",filename.Data(),pdf.Data()));
	    if (gSystem->AccessPathName(pdf.Data()) == 0 ){
		gSystem->Exec(Form("rm -f %s",filename.Data()));
		if(path != "") gSystem->Exec(Form("mv %s %s/",pdf.Data(),path.Data()));
		TThread::Printf("HandleSnapshotSave() : Snapshot File has been saved in %s",Form("%s%s",path.Data(),pdf.Data()));
	    } else {
		TThread::Printf("HandleSnapshotSave() : Could not convert ps file!");
	    }
	}
	lastSaved = time(NULL);

	TThread::Printf("SnapShot finished!");
    } else {

       	TThread::Printf("HandleSnapshotSave() : Could not convert ps file because of lost connection to server! Will QUIT! BYE ...");
	mainThread->UnLock();
	HandleMainWindowClose();
    }
    if(!doQuit) mainThread->UnLock();
}

/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleSnapshotSaveOnline() {
    // GUI Event Handler to handle snapshot button click
    // Save all active canvases in png file in the online snapshot path.

    if (listPads.LastIndex() == -1) return; // return if no window is open


    mainThread->Lock();
    
    // loop over the pads, not over the canvases. But the print-function
    // prints the complete canvas into the file. If there is a split canvas,
    // the print-function prints the canvas several times (nx*ny) into the file.
    // Prevent this by adding the name of each printed canvas into this map and
    // check the map before each canvas is printed.

    map <TString, Bool_t> printedCanvases;
    
    TString  path      = clientmainwin->fTextSnapshotPathOnline;

    if(path != ""){
	path += "/";
	path.ReplaceAll("//","/");
	if(gSystem->AccessPathName(path.Data()) != 0 ){ // path not found
	    TThread::Printf("HandleSnapshotSave() : Path = %s not found! Will use currentdirectory.",path.Data());
	    path = "";
	}
    }

    for (Int_t i=0;i<listPads.LastIndex()+1;i++) {
	TPad* subpad = (TPad*) listPads.At(i);
	TCanvas* cnv = subpad->GetCanvas();
	if (!printedCanvases[cnv->GetName()]) {  // canvas is not yet printed
	    cnv->SaveAs(Form("%s%s.png",path.Data(),cnv->GetName()));
	    printedCanvases[cnv->GetName()] = kTRUE;
	}
    }

    lastSavedOnline = time(NULL);

    TThread::Printf("SnapShot finished!");

    mainThread->UnLock();
}

/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleMainWindowClose() {
    // GUI Event Handler to handle close-event of the main window

    mainThread->Lock();

    for(Int_t i=0;i<listDetectors.LastIndex()+1;i++) {
	HOnlineMonClientDet* detector = (HOnlineMonClientDet*) listDetectors.At(i);
	if (detector->IsActive()) {
	    detector->DestroyDet(this);
	}
    }
    listDetectors.Delete();
    listHists.Delete();
    listPads.Delete();
    TThread::Delete(updateThread);
    delete updateThread;
    socket->Close();
    delete socket;

    mainThread->UnLock();
   
    gApplication->Terminate();
}
/* -------------------------------------------------------------------------- */
HOnlineMonClientMain::~HOnlineMonClientMain() {

    mainThread->Lock();

    for(Int_t i=0;i<listDetectors.LastIndex()+1;i++) {
	    HOnlineMonClientDet* detector = (HOnlineMonClientDet*) listDetectors.At(i);
	    if (detector->IsActive()) {
	        detector->DestroyDet(this);
	    }
    }
    listDetectors.Delete();
    listHists.Delete();
    listPads.Delete();
	
    TThread::Delete(updateThread);
    delete updateThread;
    if (socket) {
        socket->Close();
        delete socket;
        socket = 0;
    }

    mainThread->UnLock();

}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleControlbuttonClick(char *detectorname) {

    TGCheckButton *button = (TGCheckButton*) clientmainwin->listControlbuttons.FindObject(detectorname);
    Bool_t buttonOn = button->IsOn();
    
    if (buttonOn) {
	button->SetEnabled(kFALSE);
	HOnlineMonClientDet *det = (HOnlineMonClientDet*) listDetectors.FindObject(detectorname);

	CreateDetGui(det);
	button->SetEnabled(kTRUE);

    } else {
	button->SetEnabled(kFALSE);
	HOnlineMonClientDet *det = (HOnlineMonClientDet*) listDetectors.FindObject(detectorname);
	DestroyDetGui(det);
	button->SetEnabled(kTRUE);
    }
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::SetUpdateInterval(Int_t msec) {
    UpdateInterval = msec;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::HandleSingleWindowClose(char *windowname, char* detectorname) {

    mainThread->Lock();

    HOnlineMonClientDet *det = (HOnlineMonClientDet*) listDetectors.FindObject(detectorname);
    if (det->listWindows.FindObject(windowname)->IsA() == HOnlineMonClientTabWin::Class()) {
        HOnlineMonClientTabWin *win = (HOnlineMonClientTabWin*) det->listWindows.FindObject(windowname);
        DestroySingleWindow(win);
    } else {
        HOnlineMonClientSimpleWin *win = (HOnlineMonClientSimpleWin*) det->listWindows.FindObject(windowname);
        DestroySingleWindow(win);
    }
    mainThread->UnLock();
}
/* -------------------------------------------------------------------------- */
Bool_t HOnlineMonClientMain::Connect(TString host, Int_t port) {
    socket = new TSocket(host, port);
    if (socket->IsValid()) {
        return kTRUE;
    }
    
    return kFALSE;
}

/* -------------------------------------------------------------------------- */
Bool_t HOnlineMonClientMain::ReConnect(TString host, Int_t port) {


    if (socket) {
	socket->Close();
	delete socket;
	socket = 0;
    }
    lastSumBytes = 0 ;
    socket = new TSocket(host, port);
    if (socket->IsValid()) {
        return kTRUE;
    }
    
    return kFALSE;
}

/* -------------------------------------------------------------------------- */
Bool_t HOnlineMonClientMain::UpdateHist(HOnlineMonClientHist *hist) { 
    // update a single histogram and draw it on the current canvas.
    // A timestamp is added to the histogram title

    HOnlineMonHistAddon* newhisto = GetHist(hist->GetRealName());
    if (newhisto == 0) { return kFALSE; }
    
    // create timestamp
    UInt_t year = 0;
    UInt_t month = 0;
    UInt_t day = 0;
    UInt_t hour = 0;
    UInt_t min = 0;
    UInt_t sec = 0;
    TString update_on;

    TTimeStamp* timestamp = new TTimeStamp();
    timestamp->GetDate(kFALSE, 0, &year, &month, &day);
    timestamp->GetTime(kFALSE, 0, &hour, &min, &sec);
    delete timestamp;
    timestamp = 0;
    
    update_on.Form(" %d.%d.%d %d:%d:%d", day, month, year, hour, min, sec);
     
    // cast the HOnlineMonHistAddon pointer, add timestamp to title, draw histogram
    if (hist->histo->IsA() == HOnlineMonHist::Class()) {
        HOnlineMonHist* h = (HOnlineMonHist*) hist->histo;
        h->getP()->SetTitle(newhisto->getP()->GetTitle() + update_on);
	h->getP()->Reset();
        h->getP()->Add(newhisto->getP());
        delete (HOnlineMonHist*) newhisto;

	h->draw();
        return kTRUE;
    }

    // cast the HOnlineMonHistAddon pointer, add timestamp to title, draw histogram
    if (hist->histo->IsA() == HOnlineMonStack::Class()) {
        HOnlineMonStack* h = (HOnlineMonStack*) hist->histo;
	h->reset(100,0);  // >10 = only here
	h->add(newhisto);
	h->addTimeStamp(update_on);
	delete (HOnlineMonStack*) newhisto;

	h->draw();
        return kTRUE;
    }
    
    if (hist->histo->IsA() == HOnlineMonHist2::Class()) {
        HOnlineMonHist2* h = (HOnlineMonHist2*) hist->histo;
        h->getP()->SetTitle(newhisto->getP()->GetTitle() + update_on);
	h->getP()->Reset();
	h->getP()->Add(newhisto->getP());
	delete (HOnlineMonHist2*) newhisto;

	h->draw();
        return kTRUE;
    }
    
    if (hist->histo->IsA() == HOnlineTrendHist::Class()) {
        HOnlineTrendHist* h = (HOnlineTrendHist*) hist->histo;
        h->getP()->SetTitle(newhisto->getP()->GetTitle() + update_on);
	h->getP()->Reset();
	h->getP()->Add(newhisto->getP());
	delete (HOnlineTrendHist*) newhisto;

	h->draw();
        return kTRUE;
    }
    
    if (hist->histo->IsA() == HOnlineHistArray::Class()) {
        HOnlineHistArray* h = (HOnlineHistArray*) hist->histo;

	h->reset(0,0);
        h->add(newhisto);

	Int_t s = hist->GetArrayIndexS();
        Int_t m = hist->GetArrayIndexM();
        
        Int_t i;
        Int_t j;
        h->getDim(&i, &j);
        
        if ( (s != -1) || (m != -1) ) {
            // if indices in configfile given, draw specific histogram only.
            // otherwise call draw-function from HOnline* object.
            
            // check if s,m in range of array
            if( (s < i) || (m < j) ) {
                h->getP(s,m)->SetTitle(newhisto->getP(s,m)->GetTitle() + update_on);
		h->getP(s,m)->Draw();  // ignoriert die Optionen (OPT#) aus Histogrammdefinitionsdatei onlinehists.txt
	    } else {
                TThread::Printf("Histogram ERROR: histogram array HOnlineHistArray '%s', index s='%d' or m='%d' out of bound. Dimension of the array is ('%d','%d').", hist->GetName(), s, m, i, j);
                exit(1);
            }
        } else {
            // get the last histogram in the array
            // and add the timestamp to the title.
            h->getP(0,i*j)->SetTitle(newhisto->getP(0,i*j)->GetTitle() + update_on);
	    h->draw();
	}

	delete (HOnlineHistArray*) newhisto;
        return kTRUE;
    }

    if (hist->histo->IsA() == HOnlineHistArray2::Class()) {
        HOnlineHistArray2* h = (HOnlineHistArray2*) hist->histo;

	h->reset(0,0);
        h->add(newhisto);

	Int_t s = hist->GetArrayIndexS();
        Int_t m = hist->GetArrayIndexM();
        
        Int_t i;
        Int_t j;
        h->getDim(&i, &j);
        
        if ( (s != -1) || (m != -1) ) {
            // if indices in configfile given, draw specific histogram only.
            // otherwise call draw-function from HOnline* object.
            
            // check if s,m in range of array
            if( (s < i) || (m < j) ) {
                h->getP(s,m)->SetTitle(newhisto->getP(s,m)->GetTitle() + update_on);
		h->getP(s,m)->Draw();  // ignoriert die Optionen (OPT#) aus Histogrammdefinitionsdatei onlinehists.txt
	    } else {
                TThread::Printf("Histogram ERROR: histogram array HOnlineHistArray2 '%s', index s='%d' or m='%d' out of bound. Dimension of the array is ('%d','%d').", hist->GetName(), s, m, i, j);
                exit(1);
            }
        } else {
            // get the last histogram in the array
            // and add the timestamp to the title.
            h->getP(0,i*j)->SetTitle(newhisto->getP(0,i*j)->GetTitle() + update_on);
	    h->draw();
	}

	delete (HOnlineHistArray2*) newhisto;
        return kTRUE;
    }

    if (hist->histo->IsA() == HOnlineTrendArray::Class()) {
        HOnlineTrendArray* h = (HOnlineTrendArray*) hist->histo;

	h->reset(0,0);
        h->add(newhisto);
	Int_t s = hist->GetArrayIndexS();
        Int_t m = hist->GetArrayIndexM();
        
        Int_t i;
        Int_t j;
        h->getDim(&i, &j);
        
        if ( (s != -1) || (m != -1) ) { 
            // if indices in configfile given, draw specific histogram only.
            // otherwise call draw-function from HOnline* object.
            
            // check if s,m in range of array
            if( (s < i) || (m < j) ) {
                h->getP(s,m)->SetTitle(newhisto->getP(s,m)->GetTitle() + update_on);
        	h->getP(s,m)->Draw();  // ignoriert die Optionen (OPT#) aus Histogrammdefinitionsdatei onlinehists.txt
	    } else {
                TThread::Printf("Histogram ERROR: histogram array HOnlineTrendArray '%s', index s='%d' or m='%d' out of bound. Dimension of the array is ('%d','%d').", hist->GetName(), s, m, i, j);
                exit(1);
            }
        } else {
            // get the last histogram in the array
            // and add the timestamp to the title.
            h->getP(0,i*j)->SetTitle(newhisto->getP(0,i*j)->GetTitle() + update_on);
	    h->draw();
	}

	delete (HOnlineTrendArray*) newhisto;
        return kTRUE;
    }
    
    TThread::Printf("Histogram ERROR: histogram '%s' is of unknown type", hist->histo->GetName());
    return kFALSE;

}
/* -------------------------------------------------------------------------- */

TString HOnlineMonClientMain::SendCmdToServer(TString cmd) {
    if (!socket->IsValid()) {
        TString s;
	s.Form("ERROR: Socket invalid");
	HandleConnectionError();
        return s;
    }

    TMessage* recvmess = 0;
    TMessage sendmess(kMESS_STRING);
    sendmess.WriteTString(cmd);
    Int_t scode = socket->Send(sendmess); // sendcode
    if (scode <= 0) {
        TString s;
        s.Form("socket sent code %d for command '%s'.", scode, cmd.Data());
        return s;
    }
    
    Int_t rcode = socket->Recv(recvmess); // receivecode
    
    if (rcode <= 0) {
        TString s;
        s.Form("socket received code %d for command %s", rcode, cmd.Data());
        delete recvmess;
        return s;
    }

    if (recvmess->What() == kMESS_STRING) {
        TString str;
        recvmess->ReadTString(str);
        delete recvmess;
        return str;
    } else {
        TString s;
        s.Form("ERROR: type of message received from server for command '%s' is invalid.", cmd.Data());
        delete recvmess;
        return s;
    }

    delete recvmess;
    TString errormsg = "ERROR: message received from server is invalid";
    return errormsg;
}
/* -------------------------------------------------------------------------- */
TList* HOnlineMonClientMain::GetListOfHistograms() {
    if (!socket->IsValid()) {
        TThread::Printf("ERROR: Socket invalid");
        return 0;
    }
    
    TString cmd = "CMD histlist";
    TMessage* recvmess = 0;
    TList* hlist = new TList();
    
    TMessage sendmess(kMESS_STRING);
    sendmess.WriteTString(cmd);
    Int_t scode = socket->Send(sendmess); // sendcode
    if (scode <= 0) {
        TThread::Printf("socket sent code %d for command '%s'.", scode, cmd.Data());
        return 0;
    }
    
    Int_t rcode = socket->Recv(recvmess); // receivecode
    
    if (rcode <= 0) {
        TThread::Printf("socket received code %d for command %s", rcode, cmd.Data());
        delete recvmess;
        return 0;
    }

    if (recvmess->What() == kMESS_STRING) {
        TString str;
        recvmess->ReadTString(str);
        TThread::Printf("message received from server for command '%s': %s", cmd.Data(), str.Data());
        delete recvmess;
        return 0;
    } else {
        if (recvmess->What() == kMESS_OBJECT) {
            if ( (hlist = (TList*) recvmess->ReadObjectAny(TList::Class())) == 0) {
                TThread::Printf("ERROR: Received invalid data for command '%s' from server.", cmd.Data());       
                delete recvmess;
                return 0;
            }
        } else {
            TThread::Printf("ERROR: type of message received from server for command '%s' is invalid.", cmd.Data());
            delete recvmess;
            return 0;
        }
    }

    delete recvmess;
    return hlist;  
}
/* -------------------------------------------------------------------------- */
HOnlineMonHistAddon* HOnlineMonClientMain::GetHist(TString histoname) {

    if (!socket->IsValid()) {
        TThread::Printf("ERROR: Socket invalid");
        return 0;
    }
    
    
    // TMessage object to receive object from server
    TMessage* recvmess = 0;  // receiving message
    HOnlineMonHistAddon* newhist = 0;
    
    
    // TMessage object to send TString to server
    // can NOT be a TMessage* object, because of TSocket::Receive(TMessage&) 
    TMessage sendmess(kMESS_STRING); 
    sendmess.WriteTString(histoname);
    
    Int_t scode = socket->Send(sendmess);  // sendcode
    
    if (scode <= 0) {
        TThread::Printf("socket sent code %d histo %s", scode, histoname.Data());
        return 0;
    }
    
    Int_t rcode = socket->Recv(recvmess); // receivecode
    
    if (rcode <= 0) {
        TThread::Printf("socket received code %d histo %s", rcode, histoname.Data());
        delete recvmess;
        return 0;
    }
    

    if (recvmess->What() == kMESS_STRING) {
        TString str;
        recvmess->ReadTString(str);
        TThread::Printf("message received from server: %s", str.Data());
        delete recvmess;
        return 0;
    } else {
        if (recvmess->What() == kMESS_OBJECT) {
            if ( (newhist = (HOnlineMonHistAddon*) recvmess->ReadObjectAny(HOnlineMonHistAddon::Class())) == 0) {
                TThread::Printf("ERROR: Received invalid data for histogram '%s' from server.", histoname.Data());       
                delete recvmess;
                return 0;
            }
        } else {
            TThread::Printf("ERROR: type of message received from server is invalid.");
            delete recvmess;
            return 0;
        }
    }

    delete recvmess;
    return newhist;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::AddHist(HOnlineMonClientCanvas* canvas, HOnlineMonClientHist* hist) {
    // Put the histogram and the corresponding canvas into the global
    // lists listHists / listPads.
    // All histograms and canvases/pads in these lists are updated
    // by the update-function

    listHists.Add(hist);

    // get an initial histogram from server. The real name must be send.
    HOnlineMonHistAddon* newhist = this->GetHist(hist->GetRealName());
    
    if (newhist == 0) {
        TThread::Printf("ERROR: Can't add histogram '%s' to the update-list. Received invalid initial histogram from server.", hist->GetName());
        return;
    }
    
    hist->SetHist(newhist);

    // get the subpad and apply grid- and log-values
    if (hist->GetSubpadnumber() == 0) {
    	// unsplit canvas, apply options to the canvas
    	TCanvas* cnv = canvas->GetCanvas();
        cnv->SetGrid(hist->GetHist()->getGridX(), hist->GetHist()->getGridY());
        cnv->SetLogx(hist->GetHist()->getLogX());
        cnv->SetLogy(hist->GetHist()->getLogY());
        cnv->SetLogz(hist->GetHist()->getLogZ());
        listPads.Add(cnv);
        pad2hist[cnv->GetName()] = hist->GetName();
    } else {
    	// split canvas, apply options to the subpad, not to the canvas
        TString padnr = "";
        padnr += hist->GetSubpadnumber();
        
        TString padname = canvas->GetName() + TString("_") + padnr;
        
        TPad* pad=(TPad*) canvas->GetCanvas()->GetPrimitive(padname.Data());
        pad->SetGrid(hist->GetHist()->getGridX(), hist->GetHist()->getGridY());
        pad->SetLogx(hist->GetHist()->getLogX());
        pad->SetLogy(hist->GetHist()->getLogY());
        pad->SetLogz(hist->GetHist()->getLogZ());
        
        listPads.Add(pad);
        pad2hist[padname] = hist->GetName();
    }
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::RemoveHist(HOnlineMonClientCanvas* canvas, HOnlineMonClientHist* hist) {
    // Remove canvas and hist from the global list. Then, the hist and the canvas
    // are no longer updated

    if (hist->GetSubpadnumber() == 0) {
    	// unsplit canvas
    	TCanvas* cnv = canvas->GetCanvas();
        listHists.Remove(hist);
        listPads.Remove(cnv);
        pad2hist.erase(cnv->GetName());
    } else {
        TString padnr = "";
        padnr += hist->GetSubpadnumber();
        
        TString padname = canvas->GetName() + TString("_") + padnr;
        
        TPad* pad=(TPad*) canvas->GetCanvas()->GetPrimitive(padname.Data());
        listHists.Remove(hist);
        listPads.Remove(pad);
        pad2hist.erase(pad->GetName());
    }
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::SetServerhost(TString host) {
    serverhost = host;
}
/* -------------------------------------------------------------------------- */
TString HOnlineMonClientMain::GetServerhost() {
    return serverhost;
}
/* -------------------------------------------------------------------------- */
void HOnlineMonClientMain::SetServerport(Int_t port) {
    serverport = port;
}
/* -------------------------------------------------------------------------- */
Int_t HOnlineMonClientMain::GetServerport() {
    return serverport;
}
/* -------------------------------------------------------------------------- */


 honlinemonclientmain.cc:1
 honlinemonclientmain.cc:2
 honlinemonclientmain.cc:3
 honlinemonclientmain.cc:4
 honlinemonclientmain.cc:5
 honlinemonclientmain.cc:6
 honlinemonclientmain.cc:7
 honlinemonclientmain.cc:8
 honlinemonclientmain.cc:9
 honlinemonclientmain.cc:10
 honlinemonclientmain.cc:11
 honlinemonclientmain.cc:12
 honlinemonclientmain.cc:13
 honlinemonclientmain.cc:14
 honlinemonclientmain.cc:15
 honlinemonclientmain.cc:16
 honlinemonclientmain.cc:17
 honlinemonclientmain.cc:18
 honlinemonclientmain.cc:19
 honlinemonclientmain.cc:20
 honlinemonclientmain.cc:21
 honlinemonclientmain.cc:22
 honlinemonclientmain.cc:23
 honlinemonclientmain.cc:24
 honlinemonclientmain.cc:25
 honlinemonclientmain.cc:26
 honlinemonclientmain.cc:27
 honlinemonclientmain.cc:28
 honlinemonclientmain.cc:29
 honlinemonclientmain.cc:30
 honlinemonclientmain.cc:31
 honlinemonclientmain.cc:32
 honlinemonclientmain.cc:33
 honlinemonclientmain.cc:34
 honlinemonclientmain.cc:35
 honlinemonclientmain.cc:36
 honlinemonclientmain.cc:37
 honlinemonclientmain.cc:38
 honlinemonclientmain.cc:39
 honlinemonclientmain.cc:40
 honlinemonclientmain.cc:41
 honlinemonclientmain.cc:42
 honlinemonclientmain.cc:43
 honlinemonclientmain.cc:44
 honlinemonclientmain.cc:45
 honlinemonclientmain.cc:46
 honlinemonclientmain.cc:47
 honlinemonclientmain.cc:48
 honlinemonclientmain.cc:49
 honlinemonclientmain.cc:50
 honlinemonclientmain.cc:51
 honlinemonclientmain.cc:52
 honlinemonclientmain.cc:53
 honlinemonclientmain.cc:54
 honlinemonclientmain.cc:55
 honlinemonclientmain.cc:56
 honlinemonclientmain.cc:57
 honlinemonclientmain.cc:58
 honlinemonclientmain.cc:59
 honlinemonclientmain.cc:60
 honlinemonclientmain.cc:61
 honlinemonclientmain.cc:62
 honlinemonclientmain.cc:63
 honlinemonclientmain.cc:64
 honlinemonclientmain.cc:65
 honlinemonclientmain.cc:66
 honlinemonclientmain.cc:67
 honlinemonclientmain.cc:68
 honlinemonclientmain.cc:69
 honlinemonclientmain.cc:70
 honlinemonclientmain.cc:71
 honlinemonclientmain.cc:72
 honlinemonclientmain.cc:73
 honlinemonclientmain.cc:74
 honlinemonclientmain.cc:75
 honlinemonclientmain.cc:76
 honlinemonclientmain.cc:77
 honlinemonclientmain.cc:78
 honlinemonclientmain.cc:79
 honlinemonclientmain.cc:80
 honlinemonclientmain.cc:81
 honlinemonclientmain.cc:82
 honlinemonclientmain.cc:83
 honlinemonclientmain.cc:84
 honlinemonclientmain.cc:85
 honlinemonclientmain.cc:86
 honlinemonclientmain.cc:87
 honlinemonclientmain.cc:88
 honlinemonclientmain.cc:89
 honlinemonclientmain.cc:90
 honlinemonclientmain.cc:91
 honlinemonclientmain.cc:92
 honlinemonclientmain.cc:93
 honlinemonclientmain.cc:94
 honlinemonclientmain.cc:95
 honlinemonclientmain.cc:96
 honlinemonclientmain.cc:97
 honlinemonclientmain.cc:98
 honlinemonclientmain.cc:99
 honlinemonclientmain.cc:100
 honlinemonclientmain.cc:101
 honlinemonclientmain.cc:102
 honlinemonclientmain.cc:103
 honlinemonclientmain.cc:104
 honlinemonclientmain.cc:105
 honlinemonclientmain.cc:106
 honlinemonclientmain.cc:107
 honlinemonclientmain.cc:108
 honlinemonclientmain.cc:109
 honlinemonclientmain.cc:110
 honlinemonclientmain.cc:111
 honlinemonclientmain.cc:112
 honlinemonclientmain.cc:113
 honlinemonclientmain.cc:114
 honlinemonclientmain.cc:115
 honlinemonclientmain.cc:116
 honlinemonclientmain.cc:117
 honlinemonclientmain.cc:118
 honlinemonclientmain.cc:119
 honlinemonclientmain.cc:120
 honlinemonclientmain.cc:121
 honlinemonclientmain.cc:122
 honlinemonclientmain.cc:123
 honlinemonclientmain.cc:124
 honlinemonclientmain.cc:125
 honlinemonclientmain.cc:126
 honlinemonclientmain.cc:127
 honlinemonclientmain.cc:128
 honlinemonclientmain.cc:129
 honlinemonclientmain.cc:130
 honlinemonclientmain.cc:131
 honlinemonclientmain.cc:132
 honlinemonclientmain.cc:133
 honlinemonclientmain.cc:134
 honlinemonclientmain.cc:135
 honlinemonclientmain.cc:136
 honlinemonclientmain.cc:137
 honlinemonclientmain.cc:138
 honlinemonclientmain.cc:139
 honlinemonclientmain.cc:140
 honlinemonclientmain.cc:141
 honlinemonclientmain.cc:142
 honlinemonclientmain.cc:143
 honlinemonclientmain.cc:144
 honlinemonclientmain.cc:145
 honlinemonclientmain.cc:146
 honlinemonclientmain.cc:147
 honlinemonclientmain.cc:148
 honlinemonclientmain.cc:149
 honlinemonclientmain.cc:150
 honlinemonclientmain.cc:151
 honlinemonclientmain.cc:152
 honlinemonclientmain.cc:153
 honlinemonclientmain.cc:154
 honlinemonclientmain.cc:155
 honlinemonclientmain.cc:156
 honlinemonclientmain.cc:157
 honlinemonclientmain.cc:158
 honlinemonclientmain.cc:159
 honlinemonclientmain.cc:160
 honlinemonclientmain.cc:161
 honlinemonclientmain.cc:162
 honlinemonclientmain.cc:163
 honlinemonclientmain.cc:164
 honlinemonclientmain.cc:165
 honlinemonclientmain.cc:166
 honlinemonclientmain.cc:167
 honlinemonclientmain.cc:168
 honlinemonclientmain.cc:169
 honlinemonclientmain.cc:170
 honlinemonclientmain.cc:171
 honlinemonclientmain.cc:172
 honlinemonclientmain.cc:173
 honlinemonclientmain.cc:174
 honlinemonclientmain.cc:175
 honlinemonclientmain.cc:176
 honlinemonclientmain.cc:177
 honlinemonclientmain.cc:178
 honlinemonclientmain.cc:179
 honlinemonclientmain.cc:180
 honlinemonclientmain.cc:181
 honlinemonclientmain.cc:182
 honlinemonclientmain.cc:183
 honlinemonclientmain.cc:184
 honlinemonclientmain.cc:185
 honlinemonclientmain.cc:186
 honlinemonclientmain.cc:187
 honlinemonclientmain.cc:188
 honlinemonclientmain.cc:189
 honlinemonclientmain.cc:190
 honlinemonclientmain.cc:191
 honlinemonclientmain.cc:192
 honlinemonclientmain.cc:193
 honlinemonclientmain.cc:194
 honlinemonclientmain.cc:195
 honlinemonclientmain.cc:196
 honlinemonclientmain.cc:197
 honlinemonclientmain.cc:198
 honlinemonclientmain.cc:199
 honlinemonclientmain.cc:200
 honlinemonclientmain.cc:201
 honlinemonclientmain.cc:202
 honlinemonclientmain.cc:203
 honlinemonclientmain.cc:204
 honlinemonclientmain.cc:205
 honlinemonclientmain.cc:206
 honlinemonclientmain.cc:207
 honlinemonclientmain.cc:208
 honlinemonclientmain.cc:209
 honlinemonclientmain.cc:210
 honlinemonclientmain.cc:211
 honlinemonclientmain.cc:212
 honlinemonclientmain.cc:213
 honlinemonclientmain.cc:214
 honlinemonclientmain.cc:215
 honlinemonclientmain.cc:216
 honlinemonclientmain.cc:217
 honlinemonclientmain.cc:218
 honlinemonclientmain.cc:219
 honlinemonclientmain.cc:220
 honlinemonclientmain.cc:221
 honlinemonclientmain.cc:222
 honlinemonclientmain.cc:223
 honlinemonclientmain.cc:224
 honlinemonclientmain.cc:225
 honlinemonclientmain.cc:226
 honlinemonclientmain.cc:227
 honlinemonclientmain.cc:228
 honlinemonclientmain.cc:229
 honlinemonclientmain.cc:230
 honlinemonclientmain.cc:231
 honlinemonclientmain.cc:232
 honlinemonclientmain.cc:233
 honlinemonclientmain.cc:234
 honlinemonclientmain.cc:235
 honlinemonclientmain.cc:236
 honlinemonclientmain.cc:237
 honlinemonclientmain.cc:238
 honlinemonclientmain.cc:239
 honlinemonclientmain.cc:240
 honlinemonclientmain.cc:241
 honlinemonclientmain.cc:242
 honlinemonclientmain.cc:243
 honlinemonclientmain.cc:244
 honlinemonclientmain.cc:245
 honlinemonclientmain.cc:246
 honlinemonclientmain.cc:247
 honlinemonclientmain.cc:248
 honlinemonclientmain.cc:249
 honlinemonclientmain.cc:250
 honlinemonclientmain.cc:251
 honlinemonclientmain.cc:252
 honlinemonclientmain.cc:253
 honlinemonclientmain.cc:254
 honlinemonclientmain.cc:255
 honlinemonclientmain.cc:256
 honlinemonclientmain.cc:257
 honlinemonclientmain.cc:258
 honlinemonclientmain.cc:259
 honlinemonclientmain.cc:260
 honlinemonclientmain.cc:261
 honlinemonclientmain.cc:262
 honlinemonclientmain.cc:263
 honlinemonclientmain.cc:264
 honlinemonclientmain.cc:265
 honlinemonclientmain.cc:266
 honlinemonclientmain.cc:267
 honlinemonclientmain.cc:268
 honlinemonclientmain.cc:269
 honlinemonclientmain.cc:270
 honlinemonclientmain.cc:271
 honlinemonclientmain.cc:272
 honlinemonclientmain.cc:273
 honlinemonclientmain.cc:274
 honlinemonclientmain.cc:275
 honlinemonclientmain.cc:276
 honlinemonclientmain.cc:277
 honlinemonclientmain.cc:278
 honlinemonclientmain.cc:279
 honlinemonclientmain.cc:280
 honlinemonclientmain.cc:281
 honlinemonclientmain.cc:282
 honlinemonclientmain.cc:283
 honlinemonclientmain.cc:284
 honlinemonclientmain.cc:285
 honlinemonclientmain.cc:286
 honlinemonclientmain.cc:287
 honlinemonclientmain.cc:288
 honlinemonclientmain.cc:289
 honlinemonclientmain.cc:290
 honlinemonclientmain.cc:291
 honlinemonclientmain.cc:292
 honlinemonclientmain.cc:293
 honlinemonclientmain.cc:294
 honlinemonclientmain.cc:295
 honlinemonclientmain.cc:296
 honlinemonclientmain.cc:297
 honlinemonclientmain.cc:298
 honlinemonclientmain.cc:299
 honlinemonclientmain.cc:300
 honlinemonclientmain.cc:301
 honlinemonclientmain.cc:302
 honlinemonclientmain.cc:303
 honlinemonclientmain.cc:304
 honlinemonclientmain.cc:305
 honlinemonclientmain.cc:306
 honlinemonclientmain.cc:307
 honlinemonclientmain.cc:308
 honlinemonclientmain.cc:309
 honlinemonclientmain.cc:310
 honlinemonclientmain.cc:311
 honlinemonclientmain.cc:312
 honlinemonclientmain.cc:313
 honlinemonclientmain.cc:314
 honlinemonclientmain.cc:315
 honlinemonclientmain.cc:316
 honlinemonclientmain.cc:317
 honlinemonclientmain.cc:318
 honlinemonclientmain.cc:319
 honlinemonclientmain.cc:320
 honlinemonclientmain.cc:321
 honlinemonclientmain.cc:322
 honlinemonclientmain.cc:323
 honlinemonclientmain.cc:324
 honlinemonclientmain.cc:325
 honlinemonclientmain.cc:326
 honlinemonclientmain.cc:327
 honlinemonclientmain.cc:328
 honlinemonclientmain.cc:329
 honlinemonclientmain.cc:330
 honlinemonclientmain.cc:331
 honlinemonclientmain.cc:332
 honlinemonclientmain.cc:333
 honlinemonclientmain.cc:334
 honlinemonclientmain.cc:335
 honlinemonclientmain.cc:336
 honlinemonclientmain.cc:337
 honlinemonclientmain.cc:338
 honlinemonclientmain.cc:339
 honlinemonclientmain.cc:340
 honlinemonclientmain.cc:341
 honlinemonclientmain.cc:342
 honlinemonclientmain.cc:343
 honlinemonclientmain.cc:344
 honlinemonclientmain.cc:345
 honlinemonclientmain.cc:346
 honlinemonclientmain.cc:347
 honlinemonclientmain.cc:348
 honlinemonclientmain.cc:349
 honlinemonclientmain.cc:350
 honlinemonclientmain.cc:351
 honlinemonclientmain.cc:352
 honlinemonclientmain.cc:353
 honlinemonclientmain.cc:354
 honlinemonclientmain.cc:355
 honlinemonclientmain.cc:356
 honlinemonclientmain.cc:357
 honlinemonclientmain.cc:358
 honlinemonclientmain.cc:359
 honlinemonclientmain.cc:360
 honlinemonclientmain.cc:361
 honlinemonclientmain.cc:362
 honlinemonclientmain.cc:363
 honlinemonclientmain.cc:364
 honlinemonclientmain.cc:365
 honlinemonclientmain.cc:366
 honlinemonclientmain.cc:367
 honlinemonclientmain.cc:368
 honlinemonclientmain.cc:369
 honlinemonclientmain.cc:370
 honlinemonclientmain.cc:371
 honlinemonclientmain.cc:372
 honlinemonclientmain.cc:373
 honlinemonclientmain.cc:374
 honlinemonclientmain.cc:375
 honlinemonclientmain.cc:376
 honlinemonclientmain.cc:377
 honlinemonclientmain.cc:378
 honlinemonclientmain.cc:379
 honlinemonclientmain.cc:380
 honlinemonclientmain.cc:381
 honlinemonclientmain.cc:382
 honlinemonclientmain.cc:383
 honlinemonclientmain.cc:384
 honlinemonclientmain.cc:385
 honlinemonclientmain.cc:386
 honlinemonclientmain.cc:387
 honlinemonclientmain.cc:388
 honlinemonclientmain.cc:389
 honlinemonclientmain.cc:390
 honlinemonclientmain.cc:391
 honlinemonclientmain.cc:392
 honlinemonclientmain.cc:393
 honlinemonclientmain.cc:394
 honlinemonclientmain.cc:395
 honlinemonclientmain.cc:396
 honlinemonclientmain.cc:397
 honlinemonclientmain.cc:398
 honlinemonclientmain.cc:399
 honlinemonclientmain.cc:400
 honlinemonclientmain.cc:401
 honlinemonclientmain.cc:402
 honlinemonclientmain.cc:403
 honlinemonclientmain.cc:404
 honlinemonclientmain.cc:405
 honlinemonclientmain.cc:406
 honlinemonclientmain.cc:407
 honlinemonclientmain.cc:408
 honlinemonclientmain.cc:409
 honlinemonclientmain.cc:410
 honlinemonclientmain.cc:411
 honlinemonclientmain.cc:412
 honlinemonclientmain.cc:413
 honlinemonclientmain.cc:414
 honlinemonclientmain.cc:415
 honlinemonclientmain.cc:416
 honlinemonclientmain.cc:417
 honlinemonclientmain.cc:418
 honlinemonclientmain.cc:419
 honlinemonclientmain.cc:420
 honlinemonclientmain.cc:421
 honlinemonclientmain.cc:422
 honlinemonclientmain.cc:423
 honlinemonclientmain.cc:424
 honlinemonclientmain.cc:425
 honlinemonclientmain.cc:426
 honlinemonclientmain.cc:427
 honlinemonclientmain.cc:428
 honlinemonclientmain.cc:429
 honlinemonclientmain.cc:430
 honlinemonclientmain.cc:431
 honlinemonclientmain.cc:432
 honlinemonclientmain.cc:433
 honlinemonclientmain.cc:434
 honlinemonclientmain.cc:435
 honlinemonclientmain.cc:436
 honlinemonclientmain.cc:437
 honlinemonclientmain.cc:438
 honlinemonclientmain.cc:439
 honlinemonclientmain.cc:440
 honlinemonclientmain.cc:441
 honlinemonclientmain.cc:442
 honlinemonclientmain.cc:443
 honlinemonclientmain.cc:444
 honlinemonclientmain.cc:445
 honlinemonclientmain.cc:446
 honlinemonclientmain.cc:447
 honlinemonclientmain.cc:448
 honlinemonclientmain.cc:449
 honlinemonclientmain.cc:450
 honlinemonclientmain.cc:451
 honlinemonclientmain.cc:452
 honlinemonclientmain.cc:453
 honlinemonclientmain.cc:454
 honlinemonclientmain.cc:455
 honlinemonclientmain.cc:456
 honlinemonclientmain.cc:457
 honlinemonclientmain.cc:458
 honlinemonclientmain.cc:459
 honlinemonclientmain.cc:460
 honlinemonclientmain.cc:461
 honlinemonclientmain.cc:462
 honlinemonclientmain.cc:463
 honlinemonclientmain.cc:464
 honlinemonclientmain.cc:465
 honlinemonclientmain.cc:466
 honlinemonclientmain.cc:467
 honlinemonclientmain.cc:468
 honlinemonclientmain.cc:469
 honlinemonclientmain.cc:470
 honlinemonclientmain.cc:471
 honlinemonclientmain.cc:472
 honlinemonclientmain.cc:473
 honlinemonclientmain.cc:474
 honlinemonclientmain.cc:475
 honlinemonclientmain.cc:476
 honlinemonclientmain.cc:477
 honlinemonclientmain.cc:478
 honlinemonclientmain.cc:479
 honlinemonclientmain.cc:480
 honlinemonclientmain.cc:481
 honlinemonclientmain.cc:482
 honlinemonclientmain.cc:483
 honlinemonclientmain.cc:484
 honlinemonclientmain.cc:485
 honlinemonclientmain.cc:486
 honlinemonclientmain.cc:487
 honlinemonclientmain.cc:488
 honlinemonclientmain.cc:489
 honlinemonclientmain.cc:490
 honlinemonclientmain.cc:491
 honlinemonclientmain.cc:492
 honlinemonclientmain.cc:493
 honlinemonclientmain.cc:494
 honlinemonclientmain.cc:495
 honlinemonclientmain.cc:496
 honlinemonclientmain.cc:497
 honlinemonclientmain.cc:498
 honlinemonclientmain.cc:499
 honlinemonclientmain.cc:500
 honlinemonclientmain.cc:501
 honlinemonclientmain.cc:502
 honlinemonclientmain.cc:503
 honlinemonclientmain.cc:504
 honlinemonclientmain.cc:505
 honlinemonclientmain.cc:506
 honlinemonclientmain.cc:507
 honlinemonclientmain.cc:508
 honlinemonclientmain.cc:509
 honlinemonclientmain.cc:510
 honlinemonclientmain.cc:511
 honlinemonclientmain.cc:512
 honlinemonclientmain.cc:513
 honlinemonclientmain.cc:514
 honlinemonclientmain.cc:515
 honlinemonclientmain.cc:516
 honlinemonclientmain.cc:517
 honlinemonclientmain.cc:518
 honlinemonclientmain.cc:519
 honlinemonclientmain.cc:520
 honlinemonclientmain.cc:521
 honlinemonclientmain.cc:522
 honlinemonclientmain.cc:523
 honlinemonclientmain.cc:524
 honlinemonclientmain.cc:525
 honlinemonclientmain.cc:526
 honlinemonclientmain.cc:527
 honlinemonclientmain.cc:528
 honlinemonclientmain.cc:529
 honlinemonclientmain.cc:530
 honlinemonclientmain.cc:531
 honlinemonclientmain.cc:532
 honlinemonclientmain.cc:533
 honlinemonclientmain.cc:534
 honlinemonclientmain.cc:535
 honlinemonclientmain.cc:536
 honlinemonclientmain.cc:537
 honlinemonclientmain.cc:538
 honlinemonclientmain.cc:539
 honlinemonclientmain.cc:540
 honlinemonclientmain.cc:541
 honlinemonclientmain.cc:542
 honlinemonclientmain.cc:543
 honlinemonclientmain.cc:544
 honlinemonclientmain.cc:545
 honlinemonclientmain.cc:546
 honlinemonclientmain.cc:547
 honlinemonclientmain.cc:548
 honlinemonclientmain.cc:549
 honlinemonclientmain.cc:550
 honlinemonclientmain.cc:551
 honlinemonclientmain.cc:552
 honlinemonclientmain.cc:553
 honlinemonclientmain.cc:554
 honlinemonclientmain.cc:555
 honlinemonclientmain.cc:556
 honlinemonclientmain.cc:557
 honlinemonclientmain.cc:558
 honlinemonclientmain.cc:559
 honlinemonclientmain.cc:560
 honlinemonclientmain.cc:561
 honlinemonclientmain.cc:562
 honlinemonclientmain.cc:563
 honlinemonclientmain.cc:564
 honlinemonclientmain.cc:565
 honlinemonclientmain.cc:566
 honlinemonclientmain.cc:567
 honlinemonclientmain.cc:568
 honlinemonclientmain.cc:569
 honlinemonclientmain.cc:570
 honlinemonclientmain.cc:571
 honlinemonclientmain.cc:572
 honlinemonclientmain.cc:573
 honlinemonclientmain.cc:574
 honlinemonclientmain.cc:575
 honlinemonclientmain.cc:576
 honlinemonclientmain.cc:577
 honlinemonclientmain.cc:578
 honlinemonclientmain.cc:579
 honlinemonclientmain.cc:580
 honlinemonclientmain.cc:581
 honlinemonclientmain.cc:582
 honlinemonclientmain.cc:583
 honlinemonclientmain.cc:584
 honlinemonclientmain.cc:585
 honlinemonclientmain.cc:586
 honlinemonclientmain.cc:587
 honlinemonclientmain.cc:588
 honlinemonclientmain.cc:589
 honlinemonclientmain.cc:590
 honlinemonclientmain.cc:591
 honlinemonclientmain.cc:592
 honlinemonclientmain.cc:593
 honlinemonclientmain.cc:594
 honlinemonclientmain.cc:595
 honlinemonclientmain.cc:596
 honlinemonclientmain.cc:597
 honlinemonclientmain.cc:598
 honlinemonclientmain.cc:599
 honlinemonclientmain.cc:600
 honlinemonclientmain.cc:601
 honlinemonclientmain.cc:602
 honlinemonclientmain.cc:603
 honlinemonclientmain.cc:604
 honlinemonclientmain.cc:605
 honlinemonclientmain.cc:606
 honlinemonclientmain.cc:607
 honlinemonclientmain.cc:608
 honlinemonclientmain.cc:609
 honlinemonclientmain.cc:610
 honlinemonclientmain.cc:611
 honlinemonclientmain.cc:612
 honlinemonclientmain.cc:613
 honlinemonclientmain.cc:614
 honlinemonclientmain.cc:615
 honlinemonclientmain.cc:616
 honlinemonclientmain.cc:617
 honlinemonclientmain.cc:618
 honlinemonclientmain.cc:619
 honlinemonclientmain.cc:620
 honlinemonclientmain.cc:621
 honlinemonclientmain.cc:622
 honlinemonclientmain.cc:623
 honlinemonclientmain.cc:624
 honlinemonclientmain.cc:625
 honlinemonclientmain.cc:626
 honlinemonclientmain.cc:627
 honlinemonclientmain.cc:628
 honlinemonclientmain.cc:629
 honlinemonclientmain.cc:630
 honlinemonclientmain.cc:631
 honlinemonclientmain.cc:632
 honlinemonclientmain.cc:633
 honlinemonclientmain.cc:634
 honlinemonclientmain.cc:635
 honlinemonclientmain.cc:636
 honlinemonclientmain.cc:637
 honlinemonclientmain.cc:638
 honlinemonclientmain.cc:639
 honlinemonclientmain.cc:640
 honlinemonclientmain.cc:641
 honlinemonclientmain.cc:642
 honlinemonclientmain.cc:643
 honlinemonclientmain.cc:644
 honlinemonclientmain.cc:645
 honlinemonclientmain.cc:646
 honlinemonclientmain.cc:647
 honlinemonclientmain.cc:648
 honlinemonclientmain.cc:649
 honlinemonclientmain.cc:650
 honlinemonclientmain.cc:651
 honlinemonclientmain.cc:652
 honlinemonclientmain.cc:653
 honlinemonclientmain.cc:654
 honlinemonclientmain.cc:655
 honlinemonclientmain.cc:656
 honlinemonclientmain.cc:657
 honlinemonclientmain.cc:658
 honlinemonclientmain.cc:659
 honlinemonclientmain.cc:660
 honlinemonclientmain.cc:661
 honlinemonclientmain.cc:662
 honlinemonclientmain.cc:663
 honlinemonclientmain.cc:664
 honlinemonclientmain.cc:665
 honlinemonclientmain.cc:666
 honlinemonclientmain.cc:667
 honlinemonclientmain.cc:668
 honlinemonclientmain.cc:669
 honlinemonclientmain.cc:670
 honlinemonclientmain.cc:671
 honlinemonclientmain.cc:672
 honlinemonclientmain.cc:673
 honlinemonclientmain.cc:674
 honlinemonclientmain.cc:675
 honlinemonclientmain.cc:676
 honlinemonclientmain.cc:677
 honlinemonclientmain.cc:678
 honlinemonclientmain.cc:679
 honlinemonclientmain.cc:680
 honlinemonclientmain.cc:681
 honlinemonclientmain.cc:682
 honlinemonclientmain.cc:683
 honlinemonclientmain.cc:684
 honlinemonclientmain.cc:685
 honlinemonclientmain.cc:686
 honlinemonclientmain.cc:687
 honlinemonclientmain.cc:688
 honlinemonclientmain.cc:689
 honlinemonclientmain.cc:690
 honlinemonclientmain.cc:691
 honlinemonclientmain.cc:692
 honlinemonclientmain.cc:693
 honlinemonclientmain.cc:694
 honlinemonclientmain.cc:695
 honlinemonclientmain.cc:696
 honlinemonclientmain.cc:697
 honlinemonclientmain.cc:698
 honlinemonclientmain.cc:699
 honlinemonclientmain.cc:700
 honlinemonclientmain.cc:701
 honlinemonclientmain.cc:702
 honlinemonclientmain.cc:703
 honlinemonclientmain.cc:704
 honlinemonclientmain.cc:705
 honlinemonclientmain.cc:706
 honlinemonclientmain.cc:707
 honlinemonclientmain.cc:708
 honlinemonclientmain.cc:709
 honlinemonclientmain.cc:710
 honlinemonclientmain.cc:711
 honlinemonclientmain.cc:712
 honlinemonclientmain.cc:713
 honlinemonclientmain.cc:714
 honlinemonclientmain.cc:715
 honlinemonclientmain.cc:716
 honlinemonclientmain.cc:717
 honlinemonclientmain.cc:718
 honlinemonclientmain.cc:719
 honlinemonclientmain.cc:720
 honlinemonclientmain.cc:721
 honlinemonclientmain.cc:722
 honlinemonclientmain.cc:723
 honlinemonclientmain.cc:724
 honlinemonclientmain.cc:725
 honlinemonclientmain.cc:726
 honlinemonclientmain.cc:727
 honlinemonclientmain.cc:728
 honlinemonclientmain.cc:729
 honlinemonclientmain.cc:730
 honlinemonclientmain.cc:731
 honlinemonclientmain.cc:732
 honlinemonclientmain.cc:733
 honlinemonclientmain.cc:734
 honlinemonclientmain.cc:735
 honlinemonclientmain.cc:736
 honlinemonclientmain.cc:737
 honlinemonclientmain.cc:738
 honlinemonclientmain.cc:739
 honlinemonclientmain.cc:740
 honlinemonclientmain.cc:741
 honlinemonclientmain.cc:742
 honlinemonclientmain.cc:743
 honlinemonclientmain.cc:744
 honlinemonclientmain.cc:745
 honlinemonclientmain.cc:746
 honlinemonclientmain.cc:747
 honlinemonclientmain.cc:748
 honlinemonclientmain.cc:749
 honlinemonclientmain.cc:750
 honlinemonclientmain.cc:751
 honlinemonclientmain.cc:752
 honlinemonclientmain.cc:753
 honlinemonclientmain.cc:754
 honlinemonclientmain.cc:755
 honlinemonclientmain.cc:756
 honlinemonclientmain.cc:757
 honlinemonclientmain.cc:758
 honlinemonclientmain.cc:759
 honlinemonclientmain.cc:760
 honlinemonclientmain.cc:761
 honlinemonclientmain.cc:762
 honlinemonclientmain.cc:763
 honlinemonclientmain.cc:764
 honlinemonclientmain.cc:765
 honlinemonclientmain.cc:766
 honlinemonclientmain.cc:767
 honlinemonclientmain.cc:768
 honlinemonclientmain.cc:769
 honlinemonclientmain.cc:770
 honlinemonclientmain.cc:771
 honlinemonclientmain.cc:772
 honlinemonclientmain.cc:773
 honlinemonclientmain.cc:774
 honlinemonclientmain.cc:775
 honlinemonclientmain.cc:776
 honlinemonclientmain.cc:777
 honlinemonclientmain.cc:778
 honlinemonclientmain.cc:779
 honlinemonclientmain.cc:780
 honlinemonclientmain.cc:781
 honlinemonclientmain.cc:782
 honlinemonclientmain.cc:783
 honlinemonclientmain.cc:784
 honlinemonclientmain.cc:785
 honlinemonclientmain.cc:786
 honlinemonclientmain.cc:787
 honlinemonclientmain.cc:788
 honlinemonclientmain.cc:789
 honlinemonclientmain.cc:790
 honlinemonclientmain.cc:791
 honlinemonclientmain.cc:792
 honlinemonclientmain.cc:793
 honlinemonclientmain.cc:794
 honlinemonclientmain.cc:795
 honlinemonclientmain.cc:796
 honlinemonclientmain.cc:797
 honlinemonclientmain.cc:798
 honlinemonclientmain.cc:799
 honlinemonclientmain.cc:800
 honlinemonclientmain.cc:801
 honlinemonclientmain.cc:802
 honlinemonclientmain.cc:803
 honlinemonclientmain.cc:804
 honlinemonclientmain.cc:805
 honlinemonclientmain.cc:806
 honlinemonclientmain.cc:807
 honlinemonclientmain.cc:808
 honlinemonclientmain.cc:809
 honlinemonclientmain.cc:810
 honlinemonclientmain.cc:811
 honlinemonclientmain.cc:812
 honlinemonclientmain.cc:813
 honlinemonclientmain.cc:814
 honlinemonclientmain.cc:815
 honlinemonclientmain.cc:816
 honlinemonclientmain.cc:817
 honlinemonclientmain.cc:818
 honlinemonclientmain.cc:819
 honlinemonclientmain.cc:820
 honlinemonclientmain.cc:821
 honlinemonclientmain.cc:822
 honlinemonclientmain.cc:823
 honlinemonclientmain.cc:824
 honlinemonclientmain.cc:825
 honlinemonclientmain.cc:826
 honlinemonclientmain.cc:827
 honlinemonclientmain.cc:828
 honlinemonclientmain.cc:829
 honlinemonclientmain.cc:830
 honlinemonclientmain.cc:831
 honlinemonclientmain.cc:832
 honlinemonclientmain.cc:833
 honlinemonclientmain.cc:834
 honlinemonclientmain.cc:835
 honlinemonclientmain.cc:836
 honlinemonclientmain.cc:837
 honlinemonclientmain.cc:838
 honlinemonclientmain.cc:839
 honlinemonclientmain.cc:840
 honlinemonclientmain.cc:841
 honlinemonclientmain.cc:842
 honlinemonclientmain.cc:843
 honlinemonclientmain.cc:844
 honlinemonclientmain.cc:845
 honlinemonclientmain.cc:846
 honlinemonclientmain.cc:847
 honlinemonclientmain.cc:848
 honlinemonclientmain.cc:849
 honlinemonclientmain.cc:850
 honlinemonclientmain.cc:851
 honlinemonclientmain.cc:852
 honlinemonclientmain.cc:853
 honlinemonclientmain.cc:854
 honlinemonclientmain.cc:855
 honlinemonclientmain.cc:856
 honlinemonclientmain.cc:857
 honlinemonclientmain.cc:858
 honlinemonclientmain.cc:859
 honlinemonclientmain.cc:860
 honlinemonclientmain.cc:861
 honlinemonclientmain.cc:862
 honlinemonclientmain.cc:863
 honlinemonclientmain.cc:864
 honlinemonclientmain.cc:865
 honlinemonclientmain.cc:866
 honlinemonclientmain.cc:867
 honlinemonclientmain.cc:868
 honlinemonclientmain.cc:869
 honlinemonclientmain.cc:870
 honlinemonclientmain.cc:871
 honlinemonclientmain.cc:872
 honlinemonclientmain.cc:873
 honlinemonclientmain.cc:874
 honlinemonclientmain.cc:875
 honlinemonclientmain.cc:876
 honlinemonclientmain.cc:877
 honlinemonclientmain.cc:878
 honlinemonclientmain.cc:879
 honlinemonclientmain.cc:880
 honlinemonclientmain.cc:881
 honlinemonclientmain.cc:882
 honlinemonclientmain.cc:883
 honlinemonclientmain.cc:884
 honlinemonclientmain.cc:885
 honlinemonclientmain.cc:886
 honlinemonclientmain.cc:887
 honlinemonclientmain.cc:888
 honlinemonclientmain.cc:889
 honlinemonclientmain.cc:890
 honlinemonclientmain.cc:891
 honlinemonclientmain.cc:892
 honlinemonclientmain.cc:893
 honlinemonclientmain.cc:894
 honlinemonclientmain.cc:895
 honlinemonclientmain.cc:896
 honlinemonclientmain.cc:897
 honlinemonclientmain.cc:898
 honlinemonclientmain.cc:899
 honlinemonclientmain.cc:900
 honlinemonclientmain.cc:901
 honlinemonclientmain.cc:902
 honlinemonclientmain.cc:903
 honlinemonclientmain.cc:904
 honlinemonclientmain.cc:905
 honlinemonclientmain.cc:906
 honlinemonclientmain.cc:907
 honlinemonclientmain.cc:908
 honlinemonclientmain.cc:909
 honlinemonclientmain.cc:910
 honlinemonclientmain.cc:911
 honlinemonclientmain.cc:912
 honlinemonclientmain.cc:913
 honlinemonclientmain.cc:914
 honlinemonclientmain.cc:915
 honlinemonclientmain.cc:916
 honlinemonclientmain.cc:917
 honlinemonclientmain.cc:918
 honlinemonclientmain.cc:919
 honlinemonclientmain.cc:920
 honlinemonclientmain.cc:921
 honlinemonclientmain.cc:922
 honlinemonclientmain.cc:923
 honlinemonclientmain.cc:924
 honlinemonclientmain.cc:925
 honlinemonclientmain.cc:926
 honlinemonclientmain.cc:927
 honlinemonclientmain.cc:928
 honlinemonclientmain.cc:929
 honlinemonclientmain.cc:930
 honlinemonclientmain.cc:931
 honlinemonclientmain.cc:932
 honlinemonclientmain.cc:933
 honlinemonclientmain.cc:934
 honlinemonclientmain.cc:935
 honlinemonclientmain.cc:936
 honlinemonclientmain.cc:937
 honlinemonclientmain.cc:938
 honlinemonclientmain.cc:939
 honlinemonclientmain.cc:940
 honlinemonclientmain.cc:941
 honlinemonclientmain.cc:942
 honlinemonclientmain.cc:943
 honlinemonclientmain.cc:944
 honlinemonclientmain.cc:945
 honlinemonclientmain.cc:946
 honlinemonclientmain.cc:947
 honlinemonclientmain.cc:948
 honlinemonclientmain.cc:949
 honlinemonclientmain.cc:950
 honlinemonclientmain.cc:951
 honlinemonclientmain.cc:952
 honlinemonclientmain.cc:953
 honlinemonclientmain.cc:954
 honlinemonclientmain.cc:955
 honlinemonclientmain.cc:956
 honlinemonclientmain.cc:957
 honlinemonclientmain.cc:958
 honlinemonclientmain.cc:959
 honlinemonclientmain.cc:960
 honlinemonclientmain.cc:961
 honlinemonclientmain.cc:962
 honlinemonclientmain.cc:963
 honlinemonclientmain.cc:964
 honlinemonclientmain.cc:965
 honlinemonclientmain.cc:966
 honlinemonclientmain.cc:967
 honlinemonclientmain.cc:968
 honlinemonclientmain.cc:969
 honlinemonclientmain.cc:970
 honlinemonclientmain.cc:971
 honlinemonclientmain.cc:972
 honlinemonclientmain.cc:973
 honlinemonclientmain.cc:974
 honlinemonclientmain.cc:975
 honlinemonclientmain.cc:976
 honlinemonclientmain.cc:977
 honlinemonclientmain.cc:978
 honlinemonclientmain.cc:979
 honlinemonclientmain.cc:980
 honlinemonclientmain.cc:981
 honlinemonclientmain.cc:982
 honlinemonclientmain.cc:983
 honlinemonclientmain.cc:984
 honlinemonclientmain.cc:985
 honlinemonclientmain.cc:986
 honlinemonclientmain.cc:987
 honlinemonclientmain.cc:988
 honlinemonclientmain.cc:989
 honlinemonclientmain.cc:990
 honlinemonclientmain.cc:991
 honlinemonclientmain.cc:992
 honlinemonclientmain.cc:993
 honlinemonclientmain.cc:994
 honlinemonclientmain.cc:995
 honlinemonclientmain.cc:996
 honlinemonclientmain.cc:997
 honlinemonclientmain.cc:998
 honlinemonclientmain.cc:999
 honlinemonclientmain.cc:1000
 honlinemonclientmain.cc:1001
 honlinemonclientmain.cc:1002
 honlinemonclientmain.cc:1003
 honlinemonclientmain.cc:1004
 honlinemonclientmain.cc:1005
 honlinemonclientmain.cc:1006
 honlinemonclientmain.cc:1007
 honlinemonclientmain.cc:1008
 honlinemonclientmain.cc:1009
 honlinemonclientmain.cc:1010
 honlinemonclientmain.cc:1011
 honlinemonclientmain.cc:1012
 honlinemonclientmain.cc:1013
 honlinemonclientmain.cc:1014
 honlinemonclientmain.cc:1015
 honlinemonclientmain.cc:1016
 honlinemonclientmain.cc:1017
 honlinemonclientmain.cc:1018
 honlinemonclientmain.cc:1019
 honlinemonclientmain.cc:1020
 honlinemonclientmain.cc:1021
 honlinemonclientmain.cc:1022
 honlinemonclientmain.cc:1023
 honlinemonclientmain.cc:1024
 honlinemonclientmain.cc:1025
 honlinemonclientmain.cc:1026
 honlinemonclientmain.cc:1027
 honlinemonclientmain.cc:1028
 honlinemonclientmain.cc:1029
 honlinemonclientmain.cc:1030
 honlinemonclientmain.cc:1031
 honlinemonclientmain.cc:1032
 honlinemonclientmain.cc:1033
 honlinemonclientmain.cc:1034
 honlinemonclientmain.cc:1035
 honlinemonclientmain.cc:1036
 honlinemonclientmain.cc:1037
 honlinemonclientmain.cc:1038
 honlinemonclientmain.cc:1039
 honlinemonclientmain.cc:1040
 honlinemonclientmain.cc:1041
 honlinemonclientmain.cc:1042
 honlinemonclientmain.cc:1043
 honlinemonclientmain.cc:1044
 honlinemonclientmain.cc:1045
 honlinemonclientmain.cc:1046
 honlinemonclientmain.cc:1047
 honlinemonclientmain.cc:1048
 honlinemonclientmain.cc:1049
 honlinemonclientmain.cc:1050
 honlinemonclientmain.cc:1051
 honlinemonclientmain.cc:1052
 honlinemonclientmain.cc:1053
 honlinemonclientmain.cc:1054
 honlinemonclientmain.cc:1055
 honlinemonclientmain.cc:1056
 honlinemonclientmain.cc:1057
 honlinemonclientmain.cc:1058
 honlinemonclientmain.cc:1059
 honlinemonclientmain.cc:1060
 honlinemonclientmain.cc:1061
 honlinemonclientmain.cc:1062
 honlinemonclientmain.cc:1063
 honlinemonclientmain.cc:1064
 honlinemonclientmain.cc:1065
 honlinemonclientmain.cc:1066
 honlinemonclientmain.cc:1067
 honlinemonclientmain.cc:1068
 honlinemonclientmain.cc:1069
 honlinemonclientmain.cc:1070
 honlinemonclientmain.cc:1071
 honlinemonclientmain.cc:1072
 honlinemonclientmain.cc:1073
 honlinemonclientmain.cc:1074
 honlinemonclientmain.cc:1075
 honlinemonclientmain.cc:1076
 honlinemonclientmain.cc:1077
 honlinemonclientmain.cc:1078
 honlinemonclientmain.cc:1079
 honlinemonclientmain.cc:1080
 honlinemonclientmain.cc:1081
 honlinemonclientmain.cc:1082
 honlinemonclientmain.cc:1083
 honlinemonclientmain.cc:1084
 honlinemonclientmain.cc:1085
 honlinemonclientmain.cc:1086
 honlinemonclientmain.cc:1087
 honlinemonclientmain.cc:1088
 honlinemonclientmain.cc:1089
 honlinemonclientmain.cc:1090
 honlinemonclientmain.cc:1091
 honlinemonclientmain.cc:1092
 honlinemonclientmain.cc:1093
 honlinemonclientmain.cc:1094
 honlinemonclientmain.cc:1095
 honlinemonclientmain.cc:1096
 honlinemonclientmain.cc:1097
 honlinemonclientmain.cc:1098
 honlinemonclientmain.cc:1099
 honlinemonclientmain.cc:1100
 honlinemonclientmain.cc:1101
 honlinemonclientmain.cc:1102
 honlinemonclientmain.cc:1103
 honlinemonclientmain.cc:1104
 honlinemonclientmain.cc:1105
 honlinemonclientmain.cc:1106
 honlinemonclientmain.cc:1107
 honlinemonclientmain.cc:1108
 honlinemonclientmain.cc:1109
 honlinemonclientmain.cc:1110
 honlinemonclientmain.cc:1111
 honlinemonclientmain.cc:1112
 honlinemonclientmain.cc:1113
 honlinemonclientmain.cc:1114
 honlinemonclientmain.cc:1115
 honlinemonclientmain.cc:1116
 honlinemonclientmain.cc:1117
 honlinemonclientmain.cc:1118
 honlinemonclientmain.cc:1119
 honlinemonclientmain.cc:1120
 honlinemonclientmain.cc:1121
 honlinemonclientmain.cc:1122
 honlinemonclientmain.cc:1123
 honlinemonclientmain.cc:1124
 honlinemonclientmain.cc:1125
 honlinemonclientmain.cc:1126
 honlinemonclientmain.cc:1127
 honlinemonclientmain.cc:1128
 honlinemonclientmain.cc:1129
 honlinemonclientmain.cc:1130
 honlinemonclientmain.cc:1131
 honlinemonclientmain.cc:1132
 honlinemonclientmain.cc:1133
 honlinemonclientmain.cc:1134
 honlinemonclientmain.cc:1135
 honlinemonclientmain.cc:1136
 honlinemonclientmain.cc:1137
 honlinemonclientmain.cc:1138
 honlinemonclientmain.cc:1139
 honlinemonclientmain.cc:1140
 honlinemonclientmain.cc:1141
 honlinemonclientmain.cc:1142
 honlinemonclientmain.cc:1143
 honlinemonclientmain.cc:1144
 honlinemonclientmain.cc:1145
 honlinemonclientmain.cc:1146
 honlinemonclientmain.cc:1147
 honlinemonclientmain.cc:1148
 honlinemonclientmain.cc:1149
 honlinemonclientmain.cc:1150
 honlinemonclientmain.cc:1151
 honlinemonclientmain.cc:1152
 honlinemonclientmain.cc:1153
 honlinemonclientmain.cc:1154
 honlinemonclientmain.cc:1155
 honlinemonclientmain.cc:1156
 honlinemonclientmain.cc:1157
 honlinemonclientmain.cc:1158
 honlinemonclientmain.cc:1159
 honlinemonclientmain.cc:1160
 honlinemonclientmain.cc:1161
 honlinemonclientmain.cc:1162
 honlinemonclientmain.cc:1163
 honlinemonclientmain.cc:1164
 honlinemonclientmain.cc:1165
 honlinemonclientmain.cc:1166
 honlinemonclientmain.cc:1167
 honlinemonclientmain.cc:1168
 honlinemonclientmain.cc:1169
 honlinemonclientmain.cc:1170
 honlinemonclientmain.cc:1171
 honlinemonclientmain.cc:1172
 honlinemonclientmain.cc:1173
 honlinemonclientmain.cc:1174
 honlinemonclientmain.cc:1175
 honlinemonclientmain.cc:1176
 honlinemonclientmain.cc:1177
 honlinemonclientmain.cc:1178
 honlinemonclientmain.cc:1179
 honlinemonclientmain.cc:1180
 honlinemonclientmain.cc:1181
 honlinemonclientmain.cc:1182
 honlinemonclientmain.cc:1183
 honlinemonclientmain.cc:1184
 honlinemonclientmain.cc:1185
 honlinemonclientmain.cc:1186
 honlinemonclientmain.cc:1187
 honlinemonclientmain.cc:1188
 honlinemonclientmain.cc:1189
 honlinemonclientmain.cc:1190
 honlinemonclientmain.cc:1191
 honlinemonclientmain.cc:1192
 honlinemonclientmain.cc:1193
 honlinemonclientmain.cc:1194
 honlinemonclientmain.cc:1195
 honlinemonclientmain.cc:1196
 honlinemonclientmain.cc:1197
 honlinemonclientmain.cc:1198