Commit e1b09179 authored by Marco Clemencic's avatar Marco Clemencic
Browse files

fixed tests for new persistency

* updated configuration
* translated options
* fixed dependencies

From: Marco Clemencic <marco.clemencic@cern.ch>


git-svn-id: svn+ssh://svn.cern.ch/reps/gaudi/Gaudi/branches/GAUDI/GAUDI_newpack@6745 53ecefc3-a64d-0410-9bdf-b8581fa3287e
parent e5050cc5
......@@ -3,6 +3,7 @@ version v22r5
use ROOT * LCG_Interfaces
use Reflex * LCG_Interfaces -no_auto_imports
use RELAX * LCG_Interfaces -no_auto_imports
use AIDA * LCG_Interfaces
use Gaudi *
......
Package GaudiExamples
Package manager : Marco Clemencic
! 2011-12-12 - Marco Clemencic
- Fixed tests for new dependencies:
- updated configuration
- translated options
- fixed dependencies
! 2011-12-09 - Marco Clemencic
- Rationalized structure:
- removed obsolete test runner scripts
......
//##############################################################
// Job options file
//==============================================================
#include "Common.opts"
AuditorSvc.Auditors = { "AlgErrorAuditor" };
ApplicationMgr.AuditAlgorithms = true;
ApplicationMgr.StatusCodeCheck = true;
//--------------------------------------------------------------
// Private Application Configuration options
......
......@@ -3,10 +3,10 @@
#==============================================================
from Gaudi.Configuration import *
from Configurables import ParentAlg, StopperAlg, Prescaler, HelloWorld
from Configurables import ParentAlg, StopperAlg, Prescaler, HelloWorld, TimingAuditor
importOptions('Common.opts')
MessageSvc().OutputLevel = INFO
from Configurables import GaudiExamplesCommonConf
GaudiExamplesCommonConf()
#--------------------------------------------------------------
# Testing Sequencers
......@@ -21,12 +21,12 @@ s2 = Sequencer('Sequence2', Members = [p2, h, c2] )
top = Sequencer('TopSequence', Members = [s1, s2], StopOverride = True )
#-----------------------------------------------------------------
# Testing the new GaudiSequencer
# Testing the new GaudiSequencer
#-----------------------------------------------------------------
sand = GaudiSequencer( 'ANDSequence',
sand = GaudiSequencer( 'ANDSequence',
Members = [ HelloWorld('AND'), EventCounter('ANDCounter') ],
MeasureTime = 1 )
sor = GaudiSequencer( 'ORSequence',
sor = GaudiSequencer( 'ORSequence',
Members = [ HelloWorld('OR'), EventCounter('ORCounter') ],
MeasureTime = 1,
ModeOR = 1 )
......@@ -39,4 +39,4 @@ ApplicationMgr( TopAlg = [ParentAlg(), StopperAlg( StopCount=20 ),
ExtSvc = ['ToolSvc', 'AuditorSvc' ],
AuditAlgorithms = True )
AuditorSvc().Auditors += [ "TimingAuditor/TIMER" ]
AuditorSvc().Auditors += [ TimingAuditor("TIMER") ]
......@@ -4,18 +4,17 @@
from Gaudi.Configuration import *
from Configurables import MyAlgorithm, MyTool, MyGaudiAlgorithm
importOptions('Common.opts')
MessageSvc().OutputLevel = INFO
from Configurables import GaudiExamplesCommonConf
GaudiExamplesCommonConf()
myalg = MyAlgorithm( 'MyAlg' )
myalg.addTool( MyTool( Int = 101,
Double = 101.1e+10,
String = "hundred one",
Bool = False ) )
Bool = False ) )
gtool = MyTool( 'MyTool',
gtool = MyTool( 'MyTool',
Int = 201,
Double = 201.1e+10,
String = "two hundred and one",
......
#!/usr/bin/env gaudirun.py
#!/usr/bin/env gaudirun.py
###############################################################
# Job options file
#==============================================================
from Gaudi.Configuration import *
from Configurables import MyDataAlgorithm, DataCreator
importOptions('Common.opts')
MessageSvc().OutputLevel = INFO
from Configurables import GaudiExamplesCommonConf
GaudiExamplesCommonConf()
mdigi = DataCreator ( 'MuonDigits', Data = 'Rec/Muon/Digits')
mfoo = DataCreator ( 'MuonFoos' , Data = 'Rec/Muon/Foos' )
mold = DataCreator ( 'MuonOld' , Data = 'Rec/Muon/Old' )
dondem = DataOnDemandSvc(
UsePreceedingPath = True,
NodeMap = { 'Rec': 'DataObject',
NodeMap = { 'Rec': 'DataObject',
'Rec/Muon' : 'DataObject',
'Rec/Foo' : 'DataObject',
},
AlgMap = { mdigi.Data : mdigi,
mfoo.Data : mfoo
mfoo.Data : mfoo
},
# obsolete property:
Algorithms = [ "DATA='%s' TYPE='%s'"%
......@@ -26,15 +26,13 @@ dondem = DataOnDemandSvc(
],
# obsolete property:
Nodes = [ "DATA='Rec/Obsolete' TYPE='DataObject'"],
Dump = False
Dump = False
)
pcache = PoolDbCacheSvc( Dlls = ['GaudiKernelDict'] )
ApplicationMgr( TopAlg = [ MyDataAlgorithm() ],
ExtSvc = [ pcache, dondem ],
ExtSvc = [ dondem ],
EvtMax = 10,
EvtSel = 'NONE' )
PoolDbCacheSvc().Dlls = ['GaudiKernelDict']
EventDataSvc().EnableFaultHandler = True
"""
Prepare DST file to be used by EvtColsEx examples.
"""
from Gaudi.Configuration import *
from Configurables import GaudiPersistency
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:EvtColsEx.xml" ])
# Output setup
# - DST
dst = OutputStream("RootDst")
dst.ItemList = ["/Event#1"]
dst.Output = "DATAFILE='PFN:EvtColsEx.dst' SVC='Gaudi::RootCnvSvc' OPT='RECREATE'"
# Application setup
app = ApplicationMgr()
# - I/O
app.OutStream += [ dst ]
# - Events
app.EvtMax = 50000
app.EvtSel = "NONE" # do not use any event input
"""
Read the Event Tag Collection
"""
from Gaudi.Configuration import *
from Configurables import GaudiPersistency, TagCollectionSvc
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:EvtColsEx.xml" ])
evtColl = TagCollectionSvc("EvtTupleSvc")
# Input
esel = EventSelector(PrintFreq=1)
esel.Input = ["COLLECTION='Fill/COL1' SEL='%s' "
"DATAFILE='PFN:EvtColsEx.tags' "
"SVC='Gaudi::RootCnvSvc' OPT='READ'" % sel
for sel in ['runNum<10 && runNum>8',
'runNum<100 && flat>9.9',
'binom==7 || poisson==9']
]
# "COLLECTION='Fill/COL1' SEL='runNum<10 && runNum>8' DATAFILE='PFN:EvtColsEx.tags' SVC='Gaudi::RootEvtSelector' OPT='READ'"
# "COLLECTION='Fill/COL1' SEL='runNum<100 && flat>9.9' DATAFILE='PFN:EvtColsEx.tags' SVC='Gaudi::RootEvtSelector' OPT='READ'"
# "COLLECTION='Fill/COL1' SEL='binom==7 || poisson==9' DATAFILE='PFN:EvtColsEx.tags' SVC='Gaudi::RootEvtSelector' OPT='READ'"
app = ApplicationMgr()
app.EvtMax = -1
app.ExtSvc += [evtColl]
"""
Create an Event Tag Collection based from the DST file prepared by the
"Prepare.py" options.
"""
from Gaudi.Configuration import *
from Configurables import GaudiPersistency, RndmGenSvc, TagCollectionSvc
from Configurables import Gaudi__Examples__EvtColAlg as EvtColAlg
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:EvtColsEx.xml" ])
# Input
esel = EventSelector(PrintFreq=1000)
esel.Input = ["DATAFILE='PFN:EvtColsEx.dst' SVC='Gaudi::RootEvtSelector' OPT='READ'"]
# Output
evtColl = TagCollectionSvc("EvtTupleSvc")
evtColl.Output = ["EVTCOLS DATAFILE='PFN:EvtColsEx.tags' OPT='RECREATE' SVC='Gaudi::RootCnvSvc'"]
app = ApplicationMgr()
app.TopAlg = [EvtColAlg("Fill",
#Logical unit for Event Tag Collection
EvtColLUN="EVTCOLS")]
app.EvtMax = -1
app.ExtSvc += [RndmGenSvc(), evtColl]
// $Id: EvtColsEx_Prepare.opts,v 1.8 2008/01/30 17:06:50 marcocle Exp $
// ============================================================================
// CVS tag $Name: $, version $Revision: 1.8 $
// ============================================================================
/** @file
* Helper options file to run ExtColsEx
* In "prepares" input "DST" file (only "/Event" ) object
* to be used to run later real EvtColsEx example
* @author Vanya BELYAEV ibelyaev@physics.syr.edu
* @date 2005-08-19
* @date 2007-04-09
*/
// ============================================================================
// POOL/persistency configuration
// ============================================================================
#include "GaudiPoolDbRoot.opts"
PoolDbCacheSvc.DLLs += { "GaudiExamplesDict" } ;
FileCatalog.Catalogs = { "xmlcatalog_file:EvtColsEx.xml" } ;
// ============================================================================
// do not use any event input
ApplicationMgr.EvtSel = "NONE";
// define the output stream
ApplicationMgr.OutStream += { "PoolDst" } ;
// number of events in the pseudo-DST
ApplicationMgr.EvtMax = 50000 ;
// content of pseudo-DST and the output pseudo-DST file
PoolDst.ItemList = { "/Event#1" } ;
// output pseudo-DST file
PoolDst.Output = "DATAFILE='PFN:EvtColsEx.dst' TYP='POOL_ROOTTREE' OPT='RECREATE'";
// ============================================================================
/// The END
// ============================================================================
// $Id: EvtColsEx_Read.opts,v 1.9 2008/01/30 17:06:50 marcocle Exp $
// ============================================================================
// CVS tag $Name: $, version $Revision: 1.9 $
// ============================================================================
/** @file
*
* Job coonfiguration ("options") file to run ExtColsEx example.
*
* It reads the Event Tag Collection
*
* @see EvtColAlg
* @see EvtColsEx_Prepare.opts
* @see EvtColsEx_Write.opts
*
* @author Vanya BELYAEV Ivan.Belyaev@lapp.in2p3.fr
* @date 2005-08-19
*/
// ============================================================================
// POOL/persistency configuration
// ============================================================================
#include "GaudiPoolDbRoot.opts"
ApplicationMgr.ExtSvc += { "TagCollectionSvc/EvtTupleSvc" } ;
PoolDbCacheSvc.DLLs += { "GaudiExamplesDict" } ;
FileCatalog.Catalogs += { "xmlcatalog_file:EvtColsEx.xml" } ;
// ============================================================================
/// Input data
// ============================================================================
EventSelector.Input =
{"COLLECTION='Fill/COL1' SEL='runNum<10 && runNum>8' DATAFILE='PFN:EvtColsEx.tags' TYP='POOL_ROOT' OPT='READ'" };
EventSelector.Input +=
{"COLLECTION='Fill/COL1' SEL='runNum<100 && flat>9.9' DATAFILE='PFN:EvtColsEx.tags' TYP='POOL_ROOT' OPT='READ'" };
EventSelector.Input +=
{"COLLECTION='Fill/COL1' SEL='binom==7 || poisson==9' DATAFILE='PFN:EvtColsEx.tags' TYP='POOL_ROOT' OPT='READ'" };
// ============================================================================
EventSelector.PrintFreq = 1 ;
ApplicationMgr.EvtMax = -1 ;
// ============================================================================
/// The END
// ============================================================================
// $Id: EvtColsEx_Write.opts,v 1.13 2008/01/30 17:06:49 marcocle Exp $
// ============================================================================
// CVS tag $Name: $, version $Revision: 1.13 $
// ============================================================================
/** @file
*
* Job configuration ("options") file to run ExtColsEx example.
*
* It reads the preparesd peudo-DST and WRITES
* the Event Tag Collection
*
* @see EvtColAlg
* @see EvtColsEx_Prepare.opts
*
* @author Vanya BELYAEV Ivan.Belyaev@lapp.in2p3.fr
* @date 2005-08-19
*/
// ============================================================================
// ============================================================================
// POOL/persistency configuration
// ============================================================================
#include "GaudiPoolDbRoot.opts"
PoolDbCacheSvc.DLLs += { "GaudiExamplesDict" } ;
FileCatalog.Catalogs = { "xmlcatalog_file:EvtColsEx.xml" } ;
// ============================================================================
// Define the other 'standard' DLLs and services
ApplicationMgr.ExtSvc += { "RndmGenSvc" ,
"TagCollectionSvc/EvtTupleSvc" } ;
ApplicationMgr.TopAlg = { "Gaudi::Examples::EvtColAlg/Fill" } ;
// Logical unit for Event Tag Collection
Fill.EvtColLUN = "EVTCOLS" ;
// input pseudo-DST
EventSelector.Input = {"DATAFILE='PFN:EvtColsEx.dst' TYP='POOL_ROOT' OPT='READ'" };
// output Event Tag Collection
// map the 'logical unit' with the real file
EvtTupleSvc.Output = { "EVTCOLS DATAFILE='PFN:EvtColsEx.tags' OPT='RECREATE' TYP='POOL_ROOTTREE'" };
EventSelector.PrintFreq = 1000 ;
ApplicationMgr.EvtMax = -1 ;
// ============================================================================
// The END
// ============================================================================
......@@ -5,7 +5,9 @@
from Gaudi.Configuration import *
from Configurables import ExtendedProperties
importOptions("Common.opts")
from Configurables import GaudiExamplesCommonConf
GaudiExamplesCommonConf()
from GaudiKernel.SystemOfUnits import *
######### BEGIN of xProp configuration
......
// Define the other standard DLLs and services
ApplicationMgr.ExtSvc = { "TagCollectionSvc/EvtTupleSvc" };
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
MessageSvc.OutputLevel = 3;
EventSelector.PrintFreq = 100;
//--------------------------------------------------------------
// Setup for ROOT I/O System
//--------------------------------------------------------------
#include "GaudiPoolDbRoot.opts"
//--------------------------------------------------------------
// Input File. For example the output of the EvtCollectionWrite example
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1 ;
ApplicationMgr.Histogrampersistency = "NONE";
EventSelector.Input = {
"COLLECTION='Dir1/Dir2/Dir3/Collection' DATAFILE='PFN:POOLIO.tags' TYP='POOL_ROOT' SEL='(Ntrack>15)' FUN='Gaudi::Examples::EvtCollectionSelector'"
,"COLLECTION='Dir1/Dir2/Dir3/Collection#Addr' DATAFILE='PFN:POOLIO.tags' TYP='POOL_ROOT' SEL='(Ntrack>15)' FUN='Gaudi::Examples::EvtCollectionSelector'"
};
ApplicationMgr.TopAlg = { "ReadAlg"};
FileCatalog.Catalogs += { "xmlcatalog_file:POOLIO.xml" } ;
// ============================================================================
// The END
// ============================================================================
// $Id: POOLIOCollWrite.opts,v 1.9 2008/11/04 22:49:25 marcocle Exp $
// ============================================================================
// Define the other standard DLLs and services
ApplicationMgr.TopAlg = { "GaudiSequencer/EventAlgs" };
EventAlgs.Members = { "EvtCollectionWrite/Writer" };
EventAlgs.VetoObjects = {"FSR"};
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
ToolSvc.SequencerTimerTool.OutputLevel = 4 ;
EventSelector.PrintFreq = 100;
//--------------------------------------------------------------
// Input File. For example, the output of the RootIOWrite Example
//--------------------------------------------------------------
ApplicationMgr.EvtMax = -1 ;
ApplicationMgr.Histogrampersistency = "NONE";
//--------------------------------------------------------------
// Setup for ROOT I/O System
//--------------------------------------------------------------
#include "GaudiPoolDbRoot.opts"
ApplicationMgr.ExtSvc += { "TagCollectionSvc/EvtTupleSvc" };
//--------------------------------------------------------------
// EventCollection Output Stream parameters
//--------------------------------------------------------------
EvtTupleSvc.Output = {"EvtColl DATAFILE='PFN:POOLIO.tags' OPT='RECREATE' TYP='POOL_ROOTTREE'" };
EventSelector.Input = {"DATAFILE='PFN:POOLIO.dst' TYP='POOL_ROOT' OPT='READ'" };
EventSelector.Input += {"DATAFILE='PFN:POOLIO.mdst' TYP='POOL_ROOT' OPT='READ'" };
FileCatalog.Catalogs = { "xmlcatalog_file:POOLIO.xml" } ;
// ============================================================================
// The END
// ============================================================================
// $Id: POOLIOExtCollRead.opts,v 1.4 2008/01/30 17:06:49 marcocle Exp $
// ============================================================================
// CVS tag $Name: $, version $Revision: 1.4 $
// ============================================================================
/** @file
* Configuratuon file to read extended event tag collections
* @see Gaudi::Examples::ExtendedEvtCol
* @see ExtendedEvtCol.cpp
* @author Vanya BELYAEV ibelyaev@physics.syr.edu
* @date 2007-04-08
*/
// ============================================================================
// POOL persistency setup
// ============================================================================
#include "GaudiPoolDbRoot.opts"
ApplicationMgr.ExtSvc += { "TagCollectionSvc/EvtTupleSvc" } ;
PoolDbCacheSvc.DLLs += { "GaudiExamplesDict" } ;
FileCatalog.Catalogs += { "xmlcatalog_file:POOLIO.xml" } ;
// ============================================================================
/// Input Event Tag collections
// ============================================================================
EventSelector.Input = {
// new:
"COLLECTION='Fill/MyCOL1' DATAFILE='PFN:POOLIO.etags' TYP='POOL_ROOT' SEL='(Ntrack>9 && Ntrack<20 && Energy<180)' FUN='Gaudi::Examples::EvtExtCollectionSelector'"
,
// old:
"COLLECTION='Dir1/Dir2/Dir3/Collection' DATAFILE='PFN:POOLIO.tags' TYP='POOL_ROOT' SEL='(Ntrack>15)' FUN='Gaudi::Examples::EvtCollectionSelector'"
} ;
// ============================================================================
ApplicationMgr.TopAlg = { "ReadAlg" } ;
ApplicationMgr.EvtMax = -1 ;
EventSelector.PrintFreq = 100;
// ============================================================================
// The END
// ============================================================================
// $Id: POOLIOExtCollWrite.opts,v 1.5 2008/11/04 22:49:25 marcocle Exp $
// ============================================================================
/** @file
* Configuration file to run ExtendedEvtCol example
* @see Gaudi::Examples::ExtendedEvtCol
* @see ExtendedEvtCol.cpp
* @author Vanya BELYAEV ibelyaev@physics.syr.edu
* @date 2007-04-08
*/
// ============================================================================
// POOL persistency setup
// ============================================================================
#include "GaudiPoolDbRoot.opts"
ApplicationMgr.ExtSvc += { "TagCollectionSvc/EvtTupleSvc" } ;
PoolDbCacheSvc.DLLs += { "GaudiExamplesDict" } ;
FileCatalog.Catalogs = { "xmlcatalog_file:POOLIO.xml" } ;
// ============================================================================
/// Input data
// ============================================================================
EventSelector.Input = {"DATAFILE='PFN:POOLIO.dst' TYP='POOL_ROOT' OPT='READ'" };
EventSelector.Input += {"DATAFILE='PFN:POOLIO.mdst' TYP='POOL_ROOT' OPT='READ'" };
// ============================================================================
/// Output Event Tag Collection
// ============================================================================
EvtTupleSvc.Output = {"EXTEVT DATAFILE='PFN:POOLIO.etags' OPT='RECREATE' TYP='POOL_ROOTTREE'" };
// ============================================================================
ApplicationMgr.TopAlg = { "GaudiSequencer/EventAlgs" };
EventAlgs.Members = { "Gaudi::Examples::ExtendedEvtCol/Fill" };
EventAlgs.VetoObjects = {"FSR"};
Fill.EvtColLUN = "EXTEVT" ; /// Logical unit for Event Tag Collection
// Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
ToolSvc.SequencerTimerTool.OutputLevel = 4 ;
EventSelector.PrintFreq = 100;
ApplicationMgr.EvtMax = -1 ;
// ============================================================================
// The END
// ============================================================================
from Gaudi.Configuration import *
from Configurables import (SequencerTimerTool, GaudiPersistency, ReadAlg)
# Basic configuration for Gaudi persistency
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:ROOTIO.xml" ])
# Input
esel = EventSelector(PrintFreq=100)
esel.Input = ["COLLECTION='Dir1/Dir2/Dir3/Collection' DATAFILE='PFN:ROOT_IO.tags' SVC='Gaudi::RootCnvSvc' SEL='(Ntrack>15)' FUN='Gaudi::Examples::EvtCollectionSelector'",
"COLLECTION='Dir1/Dir2/Dir3/Collection#Addr' DATAFILE='PFN:ROOT_IO.tags' SVC='Gaudi::RootCnvSvc' SEL='(Ntrack>15)' FUN='Gaudi::Examples::EvtCollectionSelector'"]
evtColl = TagCollectionSvc("EvtTupleSvc")
# Application
app = ApplicationMgr(TopAlg=[ReadAlg()],
EvtMax=-1,
HistogramPersistency="NONE")
app.ExtSvc.append(evtColl)
# Verbosity
#SequencerTimerTool(OutputLevel=WARNING)
from Gaudi.Configuration import *
from Configurables import (SequencerTimerTool, GaudiPersistency,
EvtCollectionWrite)
# Basic configuration for Gaudi persistency
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:ROOTIO.xml" ])
# Input
esel = EventSelector(PrintFreq=100)
esel.Input = ["DATAFILE='PFN:ROOTIO.dst' SVC='Gaudi::RootEvtSelector' OPT='READ'",
"DATAFILE='PFN:ROOTIO.mdst' SVC='Gaudi::RootEvtSelector' OPT='READ'"]
# Output
evtColl = TagCollectionSvc("EvtTupleSvc")
evtColl.Output = ["EvtColl DATAFILE='PFN:ROOT_IO.tags' OPT='RECREATE' SVC='Gaudi::RootCnvSvc'"]
# Algorithms
algs = GaudiSequencer("EventAlgs",
Members=[EvtCollectionWrite("Writer")],
VetoObjects=["FSR"])
# Application
app = ApplicationMgr(TopAlg=[algs],
EvtMax=-1,
HistogramPersistency="NONE")
app.ExtSvc.append(evtColl)
# Verbosity
SequencerTimerTool(OutputLevel=WARNING)
from Gaudi.Configuration import *
from Configurables import (SequencerTimerTool, GaudiPersistency, ReadAlg)
# Basic configuration for Gaudi persistency
GaudiPersistency()
FileCatalog(Catalogs = [ "xmlcatalog_file:ROOTIO.xml" ])
# Input
esel = EventSelector(PrintFreq=100)
esel.Input = [# new
"COLLECTION='Fill/MyCOL1' DATAFILE='PFN:ROOT_IO.etags' "
"SVC='Gaudi::RootCnvSvc' SEL='(Ntrack>9 && Ntrack<20 && Energy<180)' "
"FUN='Gaudi::Examples::EvtExtCollectionSelector'",
# old
"COLLECTION='Dir1/Dir2/Dir3/Collection' DATAFILE='PFN:ROOT_IO.tags' "
"SVC='Gaudi::RootCnvSvc' SEL='(Ntrack>15)' "
"FUN='Gaudi::Examples::EvtCollectionSelector'"]
evtColl = TagCollectionSvc("EvtTupleSvc")
# Application
app = ApplicationMgr(TopAlg=[ReadAlg()],
EvtMax=-1,
HistogramPersistency="NONE")
app.ExtSvc.append(evtColl)
# Verbosity
#SequencerTimerTool(OutputLevel=WARNING)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment