Initial version of AnalyzeTool under EPL
authorMatti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:22:14 +0200
changeset 1 1050670c6980
parent 0 5ad7ad99af01
child 2 b9ab3b238396
Initial version of AnalyzeTool under EPL
sysperfana/analyzetoolext/build.xml
sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/build.properties
sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/buildFeature.xml
sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/feature.xml
sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/license.txt
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/.classpath
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/META-INF/MANIFEST.MF
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/about.html
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/addr2line.exe
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/atool.exe
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/binutils-2.19.1-src.zip
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/build.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/license.txt
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/xerces-c_2_7.dll
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/META-INF/MANIFEST.MF
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/about.html
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/build.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/buildAT.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/cheatsheets/getStarted_at_cs.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/advanced.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/concepts.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/datafile.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/memory_leaks.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/preferences.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/tracing.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/contexts.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/basic.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/gs_index.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/overview.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/prerequisites.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/AT1.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/AT_preferences.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/advanced_preferences.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_ask.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_build_active.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_build_passive.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_cellular.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_clear.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_computer.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_all.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_known.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_topmost.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_open.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_record.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_save.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_start_subtest.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_stop_subtest.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_terminate.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/green_fade_left_68_165_28.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_build.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_not_build.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_outside.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/properties_view.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/resultsaftercapture.PNG
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/sample_graph.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/statistic.PNG
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/toolbar.PNG
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.css
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.gif
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool_hov.gif
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/overviewAtoolExtContent.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/tutorialsAtoolExtContent.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/legal.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/nokia.css
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/references.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/toolbar.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/troubleshooting.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/release_notes.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/build.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/capture.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/emulatorsupport.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/subtest.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/tasks.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewactivitygraph.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewmemoryleaks.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewstatistic.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tool.htm
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/toolTOC.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/plugin.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/.classpath
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/META-INF/MANIFEST.MF
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.html
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.ini
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.mappings
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/build.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/buildAT.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/ccbuild.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/analyzetool.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_ask.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build_active.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build_passive.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_cellular.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_clear.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_computer.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_all.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_known.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_topmost.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_fast.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_open.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_record.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_save.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_start_subtest.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_stop_subtest.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_terminate.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/error.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/linkto_help.gif
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_build.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_not_build.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_outside.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/open_prefs.png
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/properties.gif
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/propview.gif
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/javadoc.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/license.txt
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/plugin.properties
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/plugin.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/runTest.xml
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/schema/com.nokia.s60tools.analyzetool.schema.exsd
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ActivateTrace.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/Activator.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/AnalyzeToolHelpContextIDs.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/AnalyzeToolBuilder.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/BuilderUtil.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/CustomPostBuilder.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/CustomPreBuilder.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/PostNature.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/PreNature.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/AnalysisItem.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/AnalyzeFactory.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/BaseItem.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/CallstackItem.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/EpocReader.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/IMemoryActivityModel.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/IMemoryActivityModelChangeListener.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/MMPInfo.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ParseAnalyzeData.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ParseXMLFileSAX.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ProjectResults.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ResultsBase.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/RunResults.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/Subtest.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/UseAtool.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/AllocCallstack.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/AllocInfo.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/BaseInfo.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/DllLoad.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/FreeInfo.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/ProcessInfo.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/ReadFile.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/SourceFile.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/SymReader.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/global/Constants.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/global/Util.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/engine/MemoryActivityModel.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/AnalyzeToolGraph.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/ChartContainer.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/MemOpDescriptor.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/YAxis.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/util/ColorUtil.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/util/GraphUtils.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/AdvancedPreferencePage.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/AnalyzeToolPreferencePage.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/PreferenceInitializer.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/properties/PropertiesPage.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ATResourceListener.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ActiveSubtests.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/CustomInputDialog.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/IActionListener.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/MainView.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ResourceVisitor.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeHelper.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeObject.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeParent.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ActivateMainView.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ClearAtoolChanges.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/CompileSymbianComponent.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/CompileWithAtool.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/DropDownMenu.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/FileAction.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/FileActionHistory.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ViewMemoryLeakFromFile.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/statistic/ATComparator.java
sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/statistic/StatisticView.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/build.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,229 @@
+  
+<project name="com.nokia.s60tools.analyzetool" default="build.all">
+
+  <!-- declare ant4eclipse -->
+  <taskdef resource="net/sf/ant4eclipse/antlib.xml" />
+
+  <!-- Name definitions -->
+  <property name="feature.name" value="AnalyzeTool"/>
+  <property name="project.name" value="com.nokia.carbide.extensions.analyzetool" />
+  <property name="jar.filename" value="${ant.project.name}.jar"/>
+  
+  <!-- Folder definitions -->
+  <property name="workspace.path" value="." />
+  <property name="java.location" value="C:/APPS/j2sdk_1.5.0_12" />
+  <property name="destination.path" value="." />
+  
+  <property name="carbide.folder" value="C:/Carbide_internal" />
+	<property name="carbide.int.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	
+	<property name="test.folder" location="${ant.project.name}.tests"/>
+	<property name="test.cache.folder" location="${ant.project.name}.cache.tests"/>
+	<property name="test.ifsheets.folder" location="${ant.project.name}.ifsheets.tests"/>
+	<property name="test.web.folder" location="${ant.project.name}.web.tests"/> 
+  <property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="binaries.folder" location="${feature.name}.binaries"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<!-- Folders -->
+	<delete dir="${instr.folder}"/>
+	<mkdir dir="${instr.folder}"/>
+	
+	<delete dir="${reports.folder}"/>
+	<mkdir dir="${reports.folder}"/>
+	
+	<!-- Carbide_classpath -->
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+		<fileset dir="plugins" includes="**/*.jar" />
+	</path>
+	
+  <!-- Delete old plugins and features -->
+  <target name="delete">
+	  <delete dir="plugins" failonerror="false"/>
+	  <delete dir="features" failonerror="false"/>
+	  <delete dir="${ant.project.name}/bin/com" failonerror="false"/>
+	  <delete dir="${ant.project.name}.tests/bin/com" failonerror="false"/>
+	  <delete dir="${ant.project.name}.trace/bin/com" failonerror="false"/>
+  </target>
+ 
+   
+  <!-- Target Plugin -->
+  <target name="build.plugins" depends="">
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}.corecomponents" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+  <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}.help" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+   <buildPlugin workspace="${workspace.path}" targetPlatformLocation="${carbide.folder}" projectname="${ant.project.name}.trace" destDir="${destination.path}" packageAsJar="true">
+  	<javacLibraryCompiler>
+  <compilerSettings debug="true" fork="true"/>
+  </javacLibraryCompiler>
+  </buildPlugin>
+
+                
+                
+  <!-- Build MultiTestRunner feature -->
+  <buildFeature workspace="${workspace.path}"
+               targetPlatformLocation="${carbide.folder}"
+               projectname="${project.name}"
+               buildPluginTarget="build.plugin"
+               destDir="${destination.path}" />
+               
+  </target>
+  
+  <!-- Empty target to do nothing --> 
+  <target name="build.plugin">
+  </target>	
+  
+  
+  
+  <!-- Instrumentation target, depends on build.mtrunner -->
+	<target name="instr" depends="build.plugins">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${ant.project.name}/bin" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+  
+  
+  <target name="create.zip">
+  
+  	<delete dir="${binaries.folder}/nightly_builds"/>
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+  	
+ 		 <!-- Zip jars to AnalyzeTool.zip -->
+ 		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp> 
+ 		 
+    <zip destfile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip"
+       basedir="."
+       includes="plugins/*, features/com.nokia.carbide.extensions.*/"/>
+  </target>
+  
+  <!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd shortFileNames="true">
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>unusedcode</ruleset>
+			<ruleset>junit</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<!-- Files to analyze -->
+			<fileset dir="${ant.project.name}/src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="${ant.project.name}.tests/src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="${ant.project.name}.trace/src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr, analyze" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="carbide_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="no">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    <jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.analyzetool.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+	
+	<target name="copy_to_carbide">
+	<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="plugins"/>
+		</copy>
+  </target>
+  
+  
+  <!-- Target Build all -->
+  <target name="build.all" depends="delete, build.plugins, instr, analyze, test, copy_to_carbide, create.zip" />
+  
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/build.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/buildFeature.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="feature_export" name="build">
+	<property name="feature_location" value="C:\temp"/>
+	<property name="feature_name" value="AnalyzeTool_2009w26_Carbide_Extension.zip"/>
+	<target name="feature_export">
+		<pde.exportFeatures destination="${feature_location}" exportSource="false" exportType="zip" features="com.nokia.carbide.extensions.analyzetool" filename="${feature_name}" useJARFormat="false"/>
+	</target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/feature.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,992 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="com.nokia.carbide.extensions.analyzetool"
+      label="Carbide.c++ Extensions - AnalyzeTool"
+      version="1.8.0"
+      provider-name="Nokia"
+      plugin="com.nokia.s60tools.analyzetool">
+
+   <description>
+      AnalyzeTool is a test software which is used for testing Symbian
+SW for memory leaks and pinpointing the leaking problems from
+source codes.
+The test software is used from Windows command prompt or from
+Carbide 2.0 onwards. S60 3.1, S60 3.2 or S60 5.0 phone with R&amp;D certificates is
+required for the use of AnalyzeTool. Also HTI and XTI are required
+for some features.
+Test can not be run without access to source codes of a tested
+application.
+Testing is also limited to user side SW instead of kernel SW.
+   </description>
+
+   <copyright>
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
+   </copyright>
+
+   <license url="license.txt">
+      Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available under the terms of &quot;Eclipse Public License v1.0&quot;
+which accompanies this distribution, and is available at the URL &quot;http://www.eclipse.org/legal/epl-v10.html&quot;.
+
+This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.
+
+This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+
+
+
+The Apache Software License, Version 2.0
+http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      &quot;control&quot; means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      &quot;Source&quot; form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      &quot;Object&quot; form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      &quot;Work&quot; shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      &quot;Contribution&quot; shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
+
+      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+--------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers&apos; and authors&apos; protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users&apos; and
+authors&apos; sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users&apos; freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  &quot;This License&quot; refers to version 3 of the GNU General Public License.
+
+  &quot;Copyright&quot; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  &quot;The Program&quot; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &quot;you&quot;.  &quot;Licensees&quot; and
+&quot;recipients&quot; may be individuals or organizations.
+
+  To &quot;modify&quot; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a &quot;modified version&quot; of the
+earlier work or a work &quot;based on&quot; the earlier work.
+
+  A &quot;covered work&quot; means either the unmodified Program or a work based
+on the Program.
+
+  To &quot;propagate&quot; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To &quot;convey&quot; a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays &quot;Appropriate Legal Notices&quot;
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The &quot;source code&quot; for a work means the preferred form of the work
+for making modifications to it.  &quot;Object code&quot; means any non-source
+form of a work.
+
+  A &quot;Standard Interface&quot; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The &quot;System Libraries&quot; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+&quot;Major Component&quot;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The &quot;Corresponding Source&quot; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work&apos;s
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users&apos; Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work&apos;s
+users, your or third parties&apos; legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program&apos;s source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    &quot;keep intact all notices&quot;.
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&quot;aggregate&quot; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation&apos;s users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A &quot;User Product&quot; is either (1) a &quot;consumer product&quot;, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, &quot;normally used&quot; refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  &quot;Installation Information&quot; for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  &quot;Additional permissions&quot; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered &quot;further
+restrictions&quot; within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An &quot;entity transaction&quot; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party&apos;s predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A &quot;contributor&quot; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor&apos;s &quot;contributor version&quot;.
+
+  A contributor&apos;s &quot;essential patent claims&quot; are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, &quot;control&quot; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor&apos;s essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a &quot;patent license&quot; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To &quot;grant&quot; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  &quot;Knowingly relying&quot; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient&apos;s use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is &quot;discriminatory&quot; if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others&apos; Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &quot;or any later version&quot; applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy&apos;s
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &quot;copyright&quot; line and a pointer to where the full notice is found.
+
+    &lt;one line to give the program&apos;s name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w&apos;.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c&apos; for details.
+
+The hypothetical commands `show w&apos; and `show c&apos; should show the appropriate
+parts of the General Public License.  Of course, your program&apos;s commands
+might be different; for a GUI interface, you would use an &quot;about box&quot;.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &quot;copyright disclaimer&quot; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.
+
+--------------------------------------------------------------------------
+
+addr2line notices
+Copyright (c) 1983, 1993, 1998
+The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS&apos;&apos; AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+----
+
+Copyright (c) 1997 John D. Polstra.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&apos;&apos; AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+   </license>
+
+   <requires>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.cdt.core"/>
+      <import plugin="com.nokia.carbide.cdt.builder"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.ui.console"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.draw2d"/>
+      <import plugin="com.nokia.carbide.cpp.project.ui"/>
+      <import plugin="com.nokia.carbide.cpp.sdk.core"/>
+      <import plugin="com.nokia.carbide.cpp.epoc.engine"/>
+      <import plugin="org.eclipse.ui.navigator"/>
+      <import plugin="org.eclipse.cdt.ui"/>
+      <import plugin="org.eclipse.jface"/>
+   </requires>
+
+   <plugin
+         id="com.nokia.s60tools.analyzetool"
+         download-size="0"
+         install-size="0"
+         version="1.8.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.nokia.s60tools.analyzetool.corecomponents"
+         download-size="0"
+         install-size="0"
+         version="1.8.0"/>
+
+   <plugin
+         id="com.nokia.s60tools.analyzetool.help"
+         download-size="0"
+         install-size="0"
+         version="1.8.0"
+         unpack="false"/>
+
+</feature>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.carbide.extensions.analyzetool/license.txt	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,923 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.
+
+This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+
+	 
+
+The Apache Software License, Version 2.0
+http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+--------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+--------------------------------------------------------------------------
+
+addr2line notices
+Copyright (c) 1983, 1993, 1998
+The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+----
+
+Copyright (c) 1997 John D. Polstra.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+ 
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/.classpath	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/META-INF/MANIFEST.MF	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - AnalyzeTool Core Components  Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.analyzetool.corecomponents
+Bundle-Version: 1.8.0
+Bundle-Vendor: Nokia
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/about.html	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,918 @@
+<!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0//EN&#8221;>
+<html>
+<head>
+<title>About</title>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</head>
+<body lang=&#8221;EN-US&#8221;>
+<h2>About This Content</h2>
+ 
+<p>May 05, 2008</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of &quot;Eclipse Public License v1.0&quot; which accompanies this distribution, and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">&quot;http://www.eclipse.org/legal/epl-v10.html&quot;</a>.</p>
+
+<p>This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.</p>
+
+<h3>Legal Notices</h3>
+<p>This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).</p>
+<p>Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.</p>
+
+	 
+<h4>Apache License</h4>
+<p>Apache License, Version 2.0, January 2004<br>
+<a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p>
+
+<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+
+<p><b>1. Definitions.</b></p>
+<p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. </p>
+<p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
+<p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common       control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
+<p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
+<p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
+<p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
+<p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
+<p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
+<p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p>
+<p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and       subsequently incorporated within the Work.<br></p>
+
+<p><b>2. Grant of Copyright License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.<br></p>
+
+<p><b>3. Grant of Patent License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,       worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.<br></p>
+
+<p><b>4. Redistribution.</b> You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p>
+<p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and</p>
+<p>(b) You must cause any modified files to carry prominent notices stating that You changed the files; and</p>
+<p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p>
+<p>(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or           documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.</p>
+<p>You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.<br></p>
+
+<p><b>5. Submission of Contributions.</b> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work       by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.<br></p>
+
+<p><b>6. Trademarks.</b> This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.<br></p>
+
+<p><b>7. Disclaimer of Warranty.</b> Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.<br></p>
+
+<p><b>8. Limitation of Liability.</b> In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.<br></p>
+
+<p><b>9. Accepting Warranty or Additional Liability.</b> While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.<br></p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+<p>&nbsp;</p>
+
+
+
+<h4>gSOAP Public License</h4>
+<p> Version 1.3a</p>
+<p> The gSOAP public license is derived from the Mozilla Public License (MPL1.1). The sections that were deleted from the original MPL1.1 text are 1.0.1, 2.1.(c),(d), 2.2.(c),(d), 8.2.(b), 10, and 11. Section 3.8 was added. The modified sections are 2.1.(b), 2.2.(b), 3.2 (simplified), 3.5 (deleted the last sentence), and 3.6 (simplified).</p>
+
+<p><b>1 DEFINITIONS.</b></p>
+<p>sep 0mm </p>
+<p><b>1.0.</b></p>
+<p><b>1.1.1. "Contributor"</b></p>
+<p>means each entity that creates or contributes to the creation of Modifications.</p>
+<p><b>1.2. "Contributor Version"</b></p>
+<p>means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.</p>
+<p><b>1.3. "Covered Code"</b></p>
+<p>means the Original Code, or Modifications or the combination of the Original Code, and Modifications, in each case including portions thereof. </p>
+<p><b>1.4. "Electronic Distribution Mechanism"</b></p>
+<p>means a mechanism generally accepted in the software development community for the electronic transfer of data.</p>
+<p><b>1.5. "Executable"</b></p>
+<p>means Covered Code in any form other than Source Code.</p>
+<p><b>1.6. "Initial Developer"</b></p>
+<p>means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.</p>
+<p><b>1.7. "Larger Work"</b></p>
+<p>means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.</p>
+<p><b>1.8. "License"</b></p>
+<p>means this document.</p>
+<p><b>1.8.1. "Licensable"</b></p>
+<p> means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.</p>
+<p><b>1.9. "Modifications"</b></p>
+<p>means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:</p>
+<p>sep 0mm</p>
+<p>A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.</p>
+<p>B. Any new file that contains any part of the Original Code, or previous Modifications.</p>
+
+<p><b>1.10. "Original Code"</b></p>
+<p>means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. </p>
+<p><b>1.10.1. "Patent Claims"</b></p>
+<p>means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. </p>
+<p><b>1.11. "Source Code"</b></p>
+<p>means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.</p>
+<p><b>1.12. "You" (or "Your")</b></p>
+<p>means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.<br></p>
+
+<p><b>2 SOURCE CODE LICENSE.</b></p>
+<p>sep 0mm</p>
+<p><b>2.1. The Initial Developer Grant.</b></p>
+<p>The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: </p>
+<p>sep 0mm</p>
+<p>(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and</p>
+<p>(b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("offer to sell and import") the Original Code, Modifications, or portions thereof, but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Original Code, Modifications, or any combination or portions thereof.</p>
+<p>(c) </p>
+<p>(d) </p>
+
+<p><b>2.2. Contributor Grant.</b></p>
+<p>Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license  </p>
+<p>sep 0mm</p>
+<p>(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and</p>
+<p>(b) under patents now or hereafter owned or controlled by Contributor, to make, have made, use and sell ("offer to sell and import") the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Contributor Version (or portions thereof).</p>
+<p>(c)</p>
+<p>(d)<br></p>
+
+<p><b>3 DISTRIBUTION OBLIGATIONS.</b></p>
+<p>sep 0mm </p>
+<p><b>3.1. Application of License.</b></p>
+<p>The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.</p>
+<p><b>3.2. Availability of Source Code.</b></p>
+<p>Any Modification created by You will be provided to the Initial Developer in Source Code form and are subject to the terms of the License.</p>
+<p><b>3.3. Description of Modifications.</b></p>
+<p>You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.</p>
+<p><b>3.4. Intellectual Property Matters.</b></p>
+<p>sep 0mm</p>
+<p>(a) Third Party Claims.</p>
+<p>If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.</p>
+<p>(b) Contributor APIs.</p>
+<p>If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file.</p>
+<p>(c) Representations.</p>
+<p>Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.</p>
+<p><b>3.5. Required Notices.</b></p>
+<p>You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor.</p>
+<p><b>3.6. Distribution of Executable Versions.</b></p>
+<p>You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. If you distribute executable versions containing Covered Code as part of a product, you must reproduce the notice in Exhibit B in the documentation and/or other materials provided with the product.</p>
+<p><b>3.7. Larger Works.</b></p>
+<p>You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.</p>
+<p><b>3.8. Restrictions.</b></p>
+<p>You may not remove any product identification, copyright, proprietary notices or labels from gSOAP.<br></p>
+
+<p><b>4 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION.</b></p>
+<p>If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.<br></p>
+
+<p><b>5 APPLICATION OF THIS LICENSE.</b></p>
+<p>This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.<br></p>
+
+<p><b>6 VERSIONS OF THE LICENSE.</b></p>
+<p>sep 0mm</p>
+<p><b>6.1. New Versions.</b></p>
+<p>Grantor may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.</p>
+<p><b>6.2. Effect of New Versions.</b></p>
+<p>Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License.</p>
+<p><b>6.3. Derivative Works.</b></p>
+<p>If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrase "gSOAP" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the gSOAP Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)<br></p>
+
+<p><b>7 DISCLAIMER OF WARRANTY.</b></p>
+<p>COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, AND ANY WARRANTY THAT MAY ARISE BY REASON OF TRADE USAGE, CUSTOM, OR COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, YOU ACKNOWLEDGE THAT THE SOFTWARE IS PROVIDED "AS IS" AND THAT THE AUTHORS DO NOT WARRANT THE SOFTWARE WILL RUN UNINTERRUPTED OR ERROR FREE. LIMITED LIABILITY THE ENTIRE RISK AS TO RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. UNDER NO CIRCUMSTANCES WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND OR NATURE WHATSOEVER, WHETHER BASED ON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF THE AUTHORS HAVE BEEN ADVISED ON THE POSSIBILITY OF SUCH DAMAGE OR IF SUCH DAMAGE COULD HAVE BEEN REASONABLY FORESEEN, AND NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY EXCLUSIVE REMEDY PROVIDED. SUCH LIMITATION ON DAMAGES INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF GOODWILL, LOST PROFITS, LOSS OF DATA OR SOFTWARE, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION OR IMPAIRMENT OF OTHER GOODS. IN NO EVENT WILL THE AUTHORS BE LIABLE FOR THE COSTS OF PROCUREMENT OF SUBSTITUTE SOFTWARE OR SERVICES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT DESIGNED FOR USE IN ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS SUCH AS OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR CONTROL, OR LIFE-CRITICAL APPLICATIONS. THE AUTHORS EXPRESSLY DISCLAIM ANY LIABILITY RESULTING FROM USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS AND ACCEPTS NO LIABILITY IN RESPECT OF ANY ACTIONS OR CLAIMS BASED ON THE USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS BY YOU. FOR PURPOSES OF THIS PARAGRAPH, THE TERM "LIFE-CRITICAL APPLICATION" MEANS AN APPLICATION IN WHICH THE FUNCTIONING OR MALFUNCTIONING OF THE SOFTWARE MAY RESULT DIRECTLY OR INDIRECTLY IN PHYSICAL INJURY OR LOSS OF HUMAN LIFE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.<br></p>
+
+<p><b>8 TERMINATION.</b></p>
+<p>sep 0mm</p>
+<p><b>8.1.</b></p>
+<p>This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.</p>
+<p><b>8.2.</b></p>
+<p><b>8.3.</b></p>
+<p>If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount
+or value of any payment or license. </p>
+<p><b>8.4.</b></p>
+<p>In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.<br></p>
+
+<p><b>9 LIMITATION OF LIABILITY.</b></p>
+<p>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.<br></p>
+
+<p><b>10 U.S. GOVERNMENT END USERS.</b><br></p>
+
+<p><b>11  MISCELLANEOUS.</b><br></p>
+
+<p><b>12  RESPONSIBILITY FOR CLAIMS.</b></p>
+<p>As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.<br></p>
+
+<p>EXHIBIT A.</p>
+<p>"The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at</p>
+<p>http://www.cs.fsu.edu/~engelen/soaplicense.html</p>
+<p>Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code of the gSOAP Software is: stdsoap.h, stdsoap2.h, stdsoap.c, stdsoap2.c, stdsoap.cpp, stdsoap2.cpp, soapcpp2.h, soapcpp2.c, soapcpp2_lex.l, soapcpp2_yacc.y, error2.h, error2.c, symbol2.c, init2.c, soapdoc2.html, and soapdoc2.pdf, httpget.h, httpget.c, stl.h, stldeque.h, stllist.h, stlvector.h, stlset.h. The Initial Developer of the Original Code is Robert A. van Engelen. Portions created by Robert A. van Engelen are Copyright &copy; 2001-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. Contributor(s):</p>
+<p>"________________________." </p>
+<p>[Note: The text of this Exhibit A may differ slightly form the text of the notices in the Source Code files of the Original code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.]</p>
+<p>EXHIBIT B.</p>
+<p>"Part of the software embedded in this product is gSOAP software.</p>
+<p>Portions created by gSOAP are Copyright &copy; 2001-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved.</p>
+<p>THE SOFTWARE IN THIS PRODUCT WAS IN PART PROVIDED BY GENIVIA INC AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."</p>
+<p>&nbsp;</p>
+
+
+
+<h4>GNU GENERAL PUBLIC LICENSE</h4>
+<p>Version 3, 29 June 2007</p>
+<p>Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p>
+<p>Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<p><b><a name="preamble"></a>Preamble</b></p>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<p><b><a name="terms"></a>TERMS AND CONDITIONS</b></p>
+
+<p><b><a name="section0"></a>0. Definitions.</b></p>
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>
+
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.</p>
+
+<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the
+earlier work or a work &ldquo;based on&rdquo; the earlier work.</p>
+
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<p><b><a name="section1"></a>1. Source Code.</b></p>
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work
+for making modifications to it.  &ldquo;Object code&rdquo; means any non-source
+form of a work.</p>
+
+<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+&ldquo;Major Component&rdquo;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<p><b><a name="section2"></a>2. Basic Permissions.</b></p>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<p><b><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</b></p>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<p><b><a name="section4"></a>4. Conveying Verbatim Copies.</b></p>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<p><b><a name="section5"></a>5. Conveying Modified Source Versions.</b></p>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    &ldquo;keep intact all notices&rdquo;.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<p><b><a name="section6"></a>6. Conveying Non-Source Forms.</b></p>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, &ldquo;normally used&rdquo; refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<p><b><a name="section7"></a>7. Additional Terms.</b></p>
+
+<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<p><b><a name="section8"></a>8. Termination.</b></p>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<p><b><a name="section9"></a>9. Acceptance Not Required for Having Copies.</b></p>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<p><b><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</b></p>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<p><b><a name="section11"></a>11. Patents.</b></p>
+
+<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>
+
+<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+  
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<p><b><a name="section12"></a>12. No Surrender of Others' Freedom.</b></p>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<p><b><a name="section13"></a>13. Use with the GNU Affero General Public License.</b></p>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<p><b><a name="section14"></a>14. Revised Versions of this License.</b></p>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &ldquo;or any later version&rdquo; applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<p><b><a name="section15"></a>15. Disclaimer of Warranty.</b></p>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<p><b><a name="section16"></a>16. Limitation of Liability.</b></p>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<p><b><a name="section17"></a>17. Interpretation of Sections 15 and 16.</b></p>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<p><b><a name="howto"></a>How to Apply These Terms to Your New Programs</b></p>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an &ldquo;about box&rdquo;.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>
+<p>&nbsp;</p>
+
+
+
+<h4>addr2line notices</h4>
+<p>Copyright &copy; 1987 Regents of the University of California. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley.  The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission.</p>
+<p>THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+
+<p>Copyright &copy; 1983, 1993, 1998 The Regents of the University of California.  All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+<li>Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+
+<p>Copyright &copy; 1997 John D. Polstra. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+	  
+</body></html>
+
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/addr2line.exe has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/atool.exe has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/binutils-2.19.1-src.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/build.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,9 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               atool.exe,\
+               xerces-c_2_7.dll,\
+               about.html,\
+               addr2line.exe,\
+               binutils-2.19.1-src.zip,\
+               license.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/license.txt	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,923 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.
+
+This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+
+	 
+
+The Apache Software License, Version 2.0
+http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+--------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+--------------------------------------------------------------------------
+
+addr2line notices
+Copyright (c) 1983, 1993, 1998
+The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+----
+
+Copyright (c) 1997 John D. Polstra.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+ 
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.corecomponents/xerces-c_2_7.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/META-INF/MANIFEST.MF	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 10.0-b19 (Sun Microsystems Inc.)
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - AnalyzeTool Help Plug-in
+Bundle-SymbolicName: com.nokia.s60tools.analyzetool.help;singleton:=tr
+ ue
+Bundle-Version: 1.8.0
+Bundle-Vendor: Nokia
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/about.html	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,782 @@
+<!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0//EN&#8221;>
+<html>
+<head>
+<title>About</title>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</head>
+<body lang=&#8221;EN-US&#8221;>
+<h2>About This Content</h2>
+ 
+<p>May 05, 2008</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of &quot;Eclipse Public License v1.0&quot; which accompanies this distribution, and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">&quot;http://www.eclipse.org/legal/epl-v10.html&quot;</a>.</p>
+
+<p>This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.</p>
+
+<h3>Legal Notices</h3>
+<p>This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).</p>
+<p>Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.</p>
+
+	 
+<h4>Apache License</h4>
+<p>Apache License, Version 2.0, January 2004<br>
+<a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p>
+
+<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+
+<p><b>1. Definitions.</b></p>
+<p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. </p>
+<p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
+<p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common       control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
+<p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
+<p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
+<p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
+<p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
+<p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
+<p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p>
+<p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and       subsequently incorporated within the Work.<br></p>
+
+<p><b>2. Grant of Copyright License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.<br></p>
+
+<p><b>3. Grant of Patent License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,       worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.<br></p>
+
+<p><b>4. Redistribution.</b> You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p>
+<p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and</p>
+<p>(b) You must cause any modified files to carry prominent notices stating that You changed the files; and</p>
+<p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p>
+<p>(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or           documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.</p>
+<p>You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.<br></p>
+
+<p><b>5. Submission of Contributions.</b> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work       by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.<br></p>
+
+<p><b>6. Trademarks.</b> This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.<br></p>
+
+<p><b>7. Disclaimer of Warranty.</b> Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.<br></p>
+
+<p><b>8. Limitation of Liability.</b> In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.<br></p>
+
+<p><b>9. Accepting Warranty or Additional Liability.</b> While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.<br></p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+<p>&nbsp;</p>
+
+
+
+<h4>GNU GENERAL PUBLIC LICENSE</h4>
+<p>Version 3, 29 June 2007</p>
+<p>Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p>
+<p>Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<p><b><a name="preamble"></a>Preamble</b></p>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<p><b><a name="terms"></a>TERMS AND CONDITIONS</b></p>
+
+<p><b><a name="section0"></a>0. Definitions.</b></p>
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>
+
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.</p>
+
+<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the
+earlier work or a work &ldquo;based on&rdquo; the earlier work.</p>
+
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<p><b><a name="section1"></a>1. Source Code.</b></p>
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work
+for making modifications to it.  &ldquo;Object code&rdquo; means any non-source
+form of a work.</p>
+
+<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+&ldquo;Major Component&rdquo;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<p><b><a name="section2"></a>2. Basic Permissions.</b></p>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<p><b><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</b></p>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<p><b><a name="section4"></a>4. Conveying Verbatim Copies.</b></p>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<p><b><a name="section5"></a>5. Conveying Modified Source Versions.</b></p>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    &ldquo;keep intact all notices&rdquo;.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<p><b><a name="section6"></a>6. Conveying Non-Source Forms.</b></p>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, &ldquo;normally used&rdquo; refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<p><b><a name="section7"></a>7. Additional Terms.</b></p>
+
+<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<p><b><a name="section8"></a>8. Termination.</b></p>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<p><b><a name="section9"></a>9. Acceptance Not Required for Having Copies.</b></p>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<p><b><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</b></p>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<p><b><a name="section11"></a>11. Patents.</b></p>
+
+<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>
+
+<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+  
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<p><b><a name="section12"></a>12. No Surrender of Others' Freedom.</b></p>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<p><b><a name="section13"></a>13. Use with the GNU Affero General Public License.</b></p>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<p><b><a name="section14"></a>14. Revised Versions of this License.</b></p>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &ldquo;or any later version&rdquo; applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<p><b><a name="section15"></a>15. Disclaimer of Warranty.</b></p>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<p><b><a name="section16"></a>16. Limitation of Liability.</b></p>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<p><b><a name="section17"></a>17. Interpretation of Sections 15 and 16.</b></p>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<p><b><a name="howto"></a>How to Apply These Terms to Your New Programs</b></p>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an &ldquo;about box&rdquo;.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>
+<p>&nbsp;</p>
+
+
+
+<h4>addr2line notices</h4>
+<p>Copyright &copy; 1987 Regents of the University of California. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley.  The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission.</p>
+<p>THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+
+<p>Copyright &copy; 1983, 1993, 1998 The Regents of the University of California.  All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+<li>Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+
+<p>Copyright &copy; 1997 John D. Polstra. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+	  
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/build.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,6 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               html/,\
+             about.html
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/buildAT.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.analyzetool.help" default="build.jars" basedir=".">
+
+	<property name="pluginVersion" value="1.8.0"/>
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	<property name="bundleId" value="com.nokia.s60tools.analyzetool.help"/>
+	<property name="bundleVersion" value="${pluginVersion}"/>
+
+	<!-- Compiler settings. -->
+	<property name="javacFailOnError" value="false"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="1.5"/>
+	<property name="javacTarget" value="1.5"/>
+	<condition property="dir_bootclasspath" value="${java.home}/../Classes">
+		<os family="mac"/>
+	</condition>
+	<property name="dir_bootclasspath" value="${java.home}/lib"/>
+	<path id="path_bootclasspath">
+		<fileset dir="${dir_bootclasspath}">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/com.nokia.s60tools.analyzetool.help_${pluginVersion}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the plug-in: com.nokia.s60tools.analyzetool.help for an update site.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<jar destfile="${plugin.destination}/com.nokia.s60tools.analyzetool.help_${pluginVersion}.jar" basedir="${temp.folder}/com.nokia.s60tools.analyzetool.help_${pluginVersion}" filesetmanifest="merge"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="build.jars" depends="init" description="Compile classes and build nested jars for the plug-in: com.nokia.s60tools.analyzetool.help.">
+	</target>
+
+	<target name="build.sources" depends="init">
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.analyzetool.help_${pluginVersion}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.analyzetool.help_${pluginVersion}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="plugin.xml"/>
+				<include name="META-INF/"/>
+				<include name="."/>
+				<include name="html/"/>
+				<include name="nokia.css"/>
+				<include name="about.html"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+	</target>
+
+	<target name="clean" depends="init" description="Clean the plug-in: com.nokia.s60tools.analyzetool.help of all the zips, jars and logs created.">
+		<delete file="${plugin.destination}/com.nokia.s60tools.analyzetool.help_${pluginVersion}.jar"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.analyzetool.help_${pluginVersion}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="C:/PlatformRnDTools/Carbide_Extensions/AnalyzeTool/trunk/com.nokia.s60tools.analyzetool.help" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: com.nokia.s60tools.analyzetool.help.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}">
+				<include name="**/*.bin${logExtension}"/>
+			</fileset>
+		</delete>
+		<zip destfile="${plugin.destination}/com.nokia.s60tools.analyzetool.help_${pluginVersion}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/cheatsheets/getStarted_at_cs.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Setting up and using Analyze Tool">
+   <intro>
+      <description>
+         Follow these steps to start analyzing memory leaks. To open a related help page, click the question mark icon at the end of the task title row.
+      </description>
+   </intro>
+   <item title="(Optional) Check the prerequisites" dialog="true" skip="true" href="/com.nokia.s60tools.analyzetool.help/html/gettingstarted/prerequisites.htm">
+      <description>
+         Check that your workstation contains the necessary components for using AnalyzeTool. Tip! If you obtained AnalyzeTool from the SymSEE installation, you can proceed to the next step.
+      </description>
+   </item>
+   <item title="Define the data gathering mode." dialog="true" skip="false" href="/com.nokia.s60tools.analyzetool.help/html/concepts/preferences.htm">
+      <description>
+         Go to <b>Preferences</b> to define how to capture the trace data either by using the monitored external, external data gathering or internal data gathering.
+Tip! You can also define the data gathering mode by using the AnalyzeTool toolbar.
+      </description>
+      <command serialization="org.eclipse.ui.window.preferences(preferencePageId=com.nokia.s60tools.analyzetool.preferences.AnalyzeToolPreferencePage)" confirm="false">
+      </command>
+   </item>
+   <item title="Create a project in Carbide" dialog="true" skip="true" href="/org.eclipse.cdt.doc.user/tasks/cdt_t_proj_new_with_template.htm">
+      <description>
+         Make sure you have your project created in Carbide.
+      </description>
+   </item>
+   <item title="Build your project with AnalyzeTool" dialog="true" skip="false" href="/com.nokia.s60tools.analyzetool.help/html/tasks/build.htm">
+      <description>
+         To make memory leak analysis possible, you must build each project with AnalyzeTool. Information of the building process is displayed in the Console view. You can activate the project build from the AnalyzeTool toolbar or from the pop-up menu in the Project Explorer. You can also change the data gathering mode from the AnalyzeTool toolbar.
+      </description>
+      <command serialization="org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=com.nokia.s60tools.analyzetool.ui.MainView)" confirm="true">
+      </command>
+   </item>
+   <item title="Capture data" dialog="true" skip="false" href="/com.nokia.s60tools.analyzetool.help/html/tasks/capture.htm">
+      <description>
+         You have two possible choices to capture data.
+<br/><br/>
+1. If you have selected the <b>External data gathering</b> mode in AnalyzeTool build, AnalyzeTool captures trace data directly from the target hardware. You can start and stop the trace capturing from the AnalyzeTool toolbar. See the <b>TraceViewer help</b> for detailed information on creating a TraceViewer connection.
+<br/><br/>
+2. If you have selected the <b>Internal data gathering</b>  mode in AnalyzeTool build, AnalyzeTool collects the test data into a file in the target hardware. You need to transfer this file to a PC after the test run is completed.
+      </description>
+   </item>
+   <item title="View and analyze memory leaks" dialog="true" skip="false" href="/com.nokia.s60tools.analyzetool.help/html/tasks/viewmemoryleaks.htm">
+      <description>
+         The memory leak analysis results are displayed in the AnalyzeTool window. Test runs with the memory leak information is displayed in the left pane. The right pane shows the information on the selected memory leak call stack.
+<br/><br/>
+Test run details will be shown in the AnalyzeTool view automatically after the data capture in External data gathering mode. You can also open the memory analysis data file by yourself later by clicking <b>Open and analyze data file</b> in the AnalyzeTool toolbar.
+<br/><br/>
+You can define how much detail you want to see in the memory leak analysis report by using the AnalyzeTool toolbar.
+      </description>
+   </item>
+</cheatsheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/advanced.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>AnalyzeTool preferences</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>AnalyzeTool properties</h2>
+<p>AnalyzeTool has additional preferences which can be found by selecting <b>Project > Properties> Carbide Extensions > AnalyzeTool</b>.</p>
+<p><img src="../images/advanced_preferences.png" alt="Setting properties"></p>
+<p>The AnalyzeTool advanced preferences are described in the following table:</p>
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="250*">
+<col width="356*"></colgroup>
+<tbody>
+<tr>
+<th>Options</th>
+<th align="center">Description</th>
+</tr>
+<tr>
+<td>Use rom symbol</td>
+<td>AnalyzeTool can take advantage of phone image's rom symbol file to pinpoint call stack items located in rom area. 
+To use enable usage of rom symbol and select the corresponding rom symbol files. 
+Selected symbol files are defined only for selected project.</td>
+</tr>
+</tbody>
+</table>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/concepts.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Concepts</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Concepts</h2>
+<p>The following concepts provide information on certain terminology that is used in AnalyzeTool.</p>
+<ul>
+	<li><a href="preferences.htm">AnalyzeTool preferences</a></li>
+	<li><a href="advanced.htm">AnalyzeTool properties</a></li>
+	<li><a href="datafile.htm">AnalyzeTool files</a></li>
+	<li><a href="memory_leaks.htm">Memory leaks</a></li>
+	<li><a href="tracing.htm">Tracing</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/datafile.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta content="text/html; charset=us-ascii" http-equiv="content-type">
+<meta content="text/css" http-equiv="content-style-type">
+<link href="../nokia.css" rel="StyleSheet" type="text/css">
+<title>AnalyzeTool data file</title>
+</head>
+<body>
+
+<h2>AnalyzeTool files</h2><p>AnalyzeTool uses files as follows:</p>
+<ul>
+	<li>Device data file. Data file saved to target device in <b>monitored internal</b> data gathering mode.</li>
+	<li>Raw data file. Analysis file saved after the trace is captured in <b>monitored external</b> or <b>external</b> data gathering mode.</li>
+	<li>Memory leak results. Results file saved by user.</li>
+</ul>
+<p>Any of these files can be opened by using the same button in <b>AnalyzeTool</b> view. AnalyzeTool automatically recognizes the file type, and performs the desired action.</p>
+
+<h4>Saving analysis data</h4>
+<p>You can save the memory leak results or raw test run data. The difference between the file formats is that the raw test run data contains all available data collected during the test run, whereas the memory leak results file only contains the test results from the currently selected project. The memory leak results file can be opened and the results read without source codes, but the raw data always needs the source codes built with AnalyzeTool before it can be opened.</p>    
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/memory_leaks.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Memory leaks</title>
+<link href="../nokia.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Memory leaks</h2>
+<p>Symbian OS is designed to operate in resource-constrained environments. In simple terms, memory usage is optimized to allocate memory to applications and then freeing it for reuse when it is no longer needed. Memory leaks occur when an application fails to free memory that has been allocated.</p>
+<p>Memory leaks indicate problems with the source code. The AnalyzeTool helps you detect memory leaks and pinpoint the leaking problems from the source code.</p>
+<p>For instructions on how to prevent memory leaks in development, see <a href="http://developer.symbian.com/main/documentation/symbian_cpp/" target="_new">Symbian OS coding standards</a>.</p>
+<p>For more information on memory management, see <a href="http://developer.symbian.org/"
+target="_new">Symbian OS developer documentation</a>.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/viewmemoryleaks.htm">Viewing memory leaks</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/preferences.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>AnalyzeTool preferences</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>AnalyzeTool preferences</h2>
+<p>You can change the AnalyzeTool preferences by selecting <b>Window > Preferences...> Carbide Extensions > AnalyzeTool</b>.</p>
+<p><img src="../images/AT_preferences.png" alt="Setting preferences"></p>
+<p>The AnalyzeTool preferences are described in the following table:</p>
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="250*">
+<col width="356*"></colgroup>
+<tbody>
+<tr>
+<th>Options</th>
+<th align="center">Description</th>
+</tr>
+<tr>
+<td>AnalyzeTool Engine</td>
+<td>AnalyzeTool uses the command line utility <i>atool.exe</i> which is used for instrumenting and uninstrumenting the project and analysing captured data.
+<ul>
+<li>
+Use internal engine. This option uses the built-in version of <i>atool.exe</i>.
+</li>
+<li>
+Use external command line engine. This options uses <i>atool.exe</i> from a user-defined location.
+</li>
+<ul>
+</ul>
+</td>
+</tr>
+<!--<tr>
+<td>Generate statistics</td>
+<td>Enables AnalyzeTool to generate memory statistics.</td>
+</tr>-->
+<tr>
+<td>Verbose output</td>
+<td>Enables command line engine debug information to the <b>Console</b> view.</td>
+</tr>
+<tr>
+<td>Engine version</td>
+<td>Displays selected engine version number.</td>
+</tr>
+<tr>
+<td>Data gathering mode</td>
+<td>Specifies the data gathering mode for AnalyzeTool build.
+<ul>
+<li>Monitored External or External: This option will send the memory analysis data through tracing utility connection. For more information, see <a href="../tasks/capture.htm#capture_external">Capturing data in external data gathering mode</a>.</li>
+<li>Internal: This option will create a data file to the target hardware. The data file name is the same as the project name. If you select the <b>Name from the user</b> option, you must define a name for the data file. For more information, see <a href="../tasks/capture.htm#capture_s60_file">Capturing data in internal data gathering mode</a>
+<ul>
+<li>Name from the process: This option will a use data file name which is the same as application target name.</li>
+<li>Name from the user: This option will ask a data file name every time a project is built with the <i>atool.exe</i>.</li>
+</ul>
+</li>
+<li>Ask always: This option will ask before each build which data gathering mode to use, External or Internal</li>
+</ul></td>
+</tr>
+<tr>
+<td>Stored callstack size</td>
+<td>
+<ul>
+<li>No items. This option does not store any callstack items.</li>
+<li>40 items. This option stores forty callstack items.</li>
+<li>100 items. This option stores hundred callstack items</li>
+<li>Custom callstack size. This option provides possibility to define custom size of callstack items. Custom size of callstack items is limited to 0-255</li>
+
+</ul>
+<b>Note!</b> The callstack size affects the speed of hooked process, lower callstack size is faster.
+</td>
+</tr>
+<tr>
+<td>Report level</td>
+<td>Specifies the report level of memory leak analysis results.
+<ul>
+<li>Show every detail: This option displays all the call stack information.</li>
+<li>Show only known code lines: This option displays all the known line numbers of call stack information.</li>
+<li>Show only topmost memory allocation code line: This option displays the first known line of call stack information.</li>
+</ul></td>
+</tr>
+</tbody>
+</table>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/concepts/tracing.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>Tracing</title>
+<link href="../nokia.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Tracing</h2>
+<p>Tracing is a way to record debugging information that can be used in during software development. With tracing, you can generate detailed, low-level information about an application's execution.</p>
+<p>The AnalyzeTool uses a tracing utility for tracing memory leaks.</p>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/capture.htm#capture_external">Capturing data in monitored external or external data gathering mode</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/contexts.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.contexts"?>
+<contexts>
+
+<context id="ANALYZETOOL_VIEW_MEM_LEAKS">
+	<description>Setting AnalyzeTool preferences</description>
+	<topic label="Setting AnalyzeTool preferences" href="html/concepts/preferences.htm" />
+</context> 
+<context id="ANALYZETOOL_MAIN">
+	<description>AnalyzeTool Help</description>
+	<topic label="AnalyzeTool introduction" href="html/gettingstarted/overview.htm" />
+	<topic label="AnalyzeTool basic walk-through" href="html/gettingstarted/basic.htm" />
+	<topic label="AnalyzeTool toolbar buttons" href="html/reference/toolbar.htm" />
+</context>   
+<context id="ANALYZETOOL_GRAPH" title="AnalyzeTool Graph Help">
+	<topic label="AnalyzeTool Memory Activity Graph" href="html/tasks/viewactivitygraph.htm" />
+</context>   
+ 
+</contexts>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/basic.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>AnalyzeTool Basic walk-through</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Basic walk-through</h2>
+<p>This section guides you with three easy steps for using AnalyzeTool to perform memory leak tests for a simple application.</p>
+<p>You can launch the AnalyzeTool Carbide.c++ Extension by selecting <b>AnalyzeTool</b> in the <b>Carbide</b> menu, or from <b>Window > Show View > Other... > Carbide Extensions > AnalyzeTool</b>.</p>
+
+<h5>Before you start</h5>
+<ul>
+	<li>Check the <a href="../gettingstarted/prerequisites.htm">Prerequisites</a> for AnalyzeTool.</li>
+	<li>Check the <a href="../concepts/preferences.htm">AnalyzeTool preferences.</a></li>
+</ul>
+
+<p>By following these simple steps you can start using AnalyzeTool:</p>
+<ol>
+	<li><a href="../tasks/build.htm">Build the project with AnalyzeTool</a>.</li>
+	<li><a href="../tasks/capture.htm#capture_external">Capture data in the monitored external or external data gathering mode</a>.<p>If you cannot use the tracing utility connection to the target hardware, you can use the <a href="../tasks/capture.htm#capture_s60_file">monitored internal data gathering mode</a>.</p></li>
+	<li><a href="../tasks/viewmemoryleaks.htm">View memory leaks</a>.</li>
+	<li><a href="../tasks/viewactivitygraph.htm">View memory activity graph</a>.</li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/gs_index.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>Concepts</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Getting started</h2>
+<p>The following concepts provide information on AnalyzeTool terminology and processes:</p>
+<ul>
+	<li><a href="overview.htm">Overview</a></li>
+	<li><a href="prerequisites.htm">Prerequisites</a></li>
+	<li><a href="basic.htm">Basic walk-through</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/overview.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<meta name="lastupdated" content="06/17/05 11:09:43">
+<title>Analyze Tool Overview</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Overview</h2>
+<p>AnalyzeTool is a tool used for testing Symbian software for memory leaks and pinpointing the leaking problems in source code. AnalyzeTool is used from Windows command prompt or from Carbide.c++ 2.0 onwards. Using AnalyzeTool requires an S60 3.1, S60 3.2, or S60 5.0 device with R&amp;D certificates. Tracing utility Connection (USB) is required as follows:</p>
+<ul>
+<li>Tracing utility Connection (USB) is required for collecting real time data from target hardware to PC.</li>
+</ul>
+<p><b>Note!</b> You cannot use AnalyzeTool if you do not have access to source codes of a tested application. Testing is also limited to user side SW instead of kernel SW.</p>
+<p>You can use the AnalyzeTool Carbide.c++ Extension for the whole test cycle or just to read the analysis file generated by the command line tool. AnalyzeTool supports automated testing without a need for any user interaction. AnalyzeTool works as a background service, so no user input is necessary during the test run. Analysis does not interfere with program run so it can be executed among any other testing activities.</p>
+<p>Currently AnalyzeTool supports memory analysis on S60 based devices by storing all the reserved memory addresses that were never released. Memory addresses with call stack information are used for identifying the code line of the possible memory issue. AnalyzeTool can also spot unclosed resource handles at process exit, and in most cases it can pinpoint the exact code line where the memory issue was introduced.</p>
+
+<h5>Basic workflow of AnalyzeTool</h5>
+<img src="../images/AT1.png">
+<ol>
+<li>Tested software is first compiled with AnalyzeTool.</li>
+<li>Software is installed to target hardware as well as the Symbian components of AnalyzeTool.</li>
+<li>Data is collected to PC/target hardware while tests are run. Analysis is run after the test run is completed to spot memory issues.</li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/gettingstarted/prerequisites.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>AnalyzeTool Prerequisites</title>
+<link href="../nokia.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Prerequisites</h2>
+<p>For fully functioning, AnalyzeTool requires the following components:</p>
+<ul>
+	<li>AnalyzeTool command line tool (atool.exe).</li>
+	<li>Symbian component of AnalyzeTool extracted in build environment.</li>
+	<li>AnalyzeTool for target hardware (through SIS or ROM build).</li>
+	<li>Tracing utility Carbide.c++ Extension (any connection method to target hardware that can pass information through RDebug).</li>
+</ul>
+<p><b>Note!</b> If you have taken AnalyzeTool into use through the Nokia internal SymSEE Installer, the required components have been automatically installed to your PC.</p>
+
+<h5>AnalyzeTool for target hardware</h5>
+<p>To run analysis in the target hardware, AnalyzeTool needs to be installed. You can either choose to install AnalyzeTool through an installation package, or add AnalyzeTool to a phone image. You can find the needed files from the <b>c:\apps\atool</b> directory, if you have acquired AnalyzeTool through the Nokia internal SymSEE environment. If you want to install AnalyzeTool from a SIS package, unzip the <i>AnalyzeToolPhone.zip</i> which contains the binaries of the release and debug versions for the supported platforms. In case of ROM image inclusion (with the 3.2 release), <i>AnalyzeTool.iby</i> needs to be included. In case of 5.x release, it is automatically included.</p>
+
+<h5>Additions to build environment</h5>
+<p>S60 version 3.2.x, 5.0, 5.0.1, and 5.1 platforms and MCL releases include AnalyzeTool so if you are using one of those you do not need to take any actions. If you are using a platform which does not include AnalyzeTool, you have to add some AnalyzeTool files to the platform to be able to build with AnalyzeTool. If you have installed AnalyzeTool through the Nokia internal SymSEE environment, these files can be found from <b>c:\apps\atool</b>. The file name is <i>S60_environment_changes_xx.zip</i> where <i>xx</i> specifies the S60 platform version number. To install these files, unzip the file to the directory which contains the <i>epoc32</i> directory. The zip file includes the necessary directory structure.</p>
+<p><b>Note!</b> Errors about missing AnalyzeTool files are displayed in the problems view if your build environment is missing any necessary AnalyzeTool files.</p>
+
+<h5>Checking the AnalyzeTool Carbide.c++ Extension installation</h5>
+<p>If you intend to use <a href="../tasks/capture.htm#capture_external">External data gathering mode</a>, check that Tracing utility Carbide.c++ Extension is configured correctly. </p>
+
+<h5>Related concepts</h5>
+<ul>
+	<li><a href="../gettingstarted/basic.htm">Basic walk-through</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/AT1.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/AT_preferences.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/advanced_preferences.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_ask.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_build_active.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_build_passive.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_cellular.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_clear.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_computer.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_all.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_known.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_details_topmost.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_open.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_record.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_save.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_start_subtest.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_stop_subtest.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/btn_terminate.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/green_fade_left_68_165_28.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_build.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_not_build.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/module_outside.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/properties_view.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/resultsaftercapture.PNG has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/sample_graph.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/statistic.PNG has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/images/toolbar.PNG has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.css	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,2 @@
+a#atool img { background-image : url(atool.gif); }
+a#atool:hover img { background-image : url(atool_hov.gif); }
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,6 @@
+
+overview.atool = html/intro/atool.gif
+overview.atool:hover = html/intro/atool_hov.gif
+
+tutorials.atool = html/intro/atool.gif
+tutorials.atool:hover = html/intro/atool_hov.gif
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/atool_hov.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/overviewAtoolExtContent.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<introContent>
+<!-- Extension to the Overview page. -->
+
+	<extensionContent 
+		id="com.nokia.s60tools.analyzetool.help-overview" 
+		alt-style="atool.properties" 
+		style="atool.css" 
+		path="overview/@">
+		
+		<group 
+			id="content-group" 
+			style-id="content-group">
+			
+			<link 
+				label="AnalyzeTool Overview" 
+	       		url="http://org.eclipse.ui.intro/showHelpTopic?id=/com.nokia.s60tools.analyzetool.help/html/gettingstarted/overview.htm" 
+				id="atool"
+				style-id="content-link"> 
+          		<text>Learn about AnalyzeTool and what it can do to improve your development efforts.</text>
+			</link>
+			
+		</group>
+		
+	</extensionContent>
+  
+</introContent>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/intro/tutorialsAtoolExtContent.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<introContent>
+<!-- Extension to the Tutorials page. -->
+
+	<extensionContent 
+		id="com.nokia.s60tools.analyzetool.help-tutorials" 
+		alt-style="atool.properties" 
+		style="atool.css" 
+		path="tutorials/@">
+		
+		<group 
+			id="content-group" 
+			style-id="content-group">
+			
+		<link 
+			label="AnalyzeTool tutorial" 
+			url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&amp;input=com.nokia.s60tools.analyzetool.quickstart" 
+			id="atool"
+			style-id="content-link">
+             <text>Start analyzing memory leaks by following step-by-step instructions.</text>
+    	</link>
+			
+		</group>
+		
+	</extensionContent>
+  
+</introContent>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/legal.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,788 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<title>License Information</title>
+<link href="nokia.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h3>License Information</h3>
+
+<h5>COPYRIGHTS</h5>
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of &quot;Eclipse Public License v1.0&quot; which accompanies this distribution, and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">&quot;http://www.eclipse.org/legal/epl-v10.html&quot;</a>.</p>
+
+<p>Initial Contributors:<br>
+Nokia Corporation - initial contribution</p>
+
+<p>This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.</p>
+
+<h5>NOTICES</h5>
+
+<p>This product includes software developed by The Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org/</a>).</p>
+<p>Portions of this software were originally based on the following:<br> - software copyright &copy; 1999, IBM Corporation, <a href="http://www.ibm.com/">http://www.ibm.com</a></p>
+<p>&nbsp;</p>
+
+
+<h5>Apache License</h5>
+<p>Apache License, Version 2.0, January 2004<br>
+<a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p>
+
+<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+
+<p><b>1. Definitions.</b></p>
+<p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. </p>
+<p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
+<p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common       control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
+<p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
+<p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
+<p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
+<p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
+<p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
+<p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p>
+<p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and       subsequently incorporated within the Work.<br></p>
+
+<p><b>2. Grant of Copyright License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.<br></p>
+
+<p><b>3. Grant of Patent License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,       worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.<br></p>
+
+<p><b>4. Redistribution.</b> You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p>
+<p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and</p>
+<p>(b) You must cause any modified files to carry prominent notices stating that You changed the files; and</p>
+<p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p>
+<p>(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or           documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.</p>
+<p>You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.<br></p>
+
+<p><b>5. Submission of Contributions.</b> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work       by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.<br></p>
+
+<p><b>6. Trademarks.</b> This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.<br></p>
+
+<p><b>7. Disclaimer of Warranty.</b> Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.<br></p>
+
+<p><b>8. Limitation of Liability.</b> In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.<br></p>
+
+<p><b>9. Accepting Warranty or Additional Liability.</b> While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.<br></p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+<p>&nbsp;</p>
+
+
+
+
+<h5>GNU GENERAL PUBLIC LICENSE</h5>
+<p>Version 3, 29 June 2007</p>
+<p>Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p>
+<p>Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<p><b><a name="preamble"></a>Preamble</b></p>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<p><b><a name="terms"></a>TERMS AND CONDITIONS</b></p>
+
+<p><b><a name="section0"></a>0. Definitions.</b></p>
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>
+
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.</p>
+
+<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the
+earlier work or a work &ldquo;based on&rdquo; the earlier work.</p>
+
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<p><b><a name="section1"></a>1. Source Code.</b></p>
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work
+for making modifications to it.  &ldquo;Object code&rdquo; means any non-source
+form of a work.</p>
+
+<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+&ldquo;Major Component&rdquo;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<p><b><a name="section2"></a>2. Basic Permissions.</b></p>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<p><b><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</b></p>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<p><b><a name="section4"></a>4. Conveying Verbatim Copies.</b></p>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<p><b><a name="section5"></a>5. Conveying Modified Source Versions.</b></p>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    &ldquo;keep intact all notices&rdquo;.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<p><b><a name="section6"></a>6. Conveying Non-Source Forms.</b></p>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, &ldquo;normally used&rdquo; refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<p><b><a name="section7"></a>7. Additional Terms.</b></p>
+
+<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<p><b><a name="section8"></a>8. Termination.</b></p>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<p><b><a name="section9"></a>9. Acceptance Not Required for Having Copies.</b></p>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<p><b><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</b></p>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<p><b><a name="section11"></a>11. Patents.</b></p>
+
+<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>
+
+<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+  
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<p><b><a name="section12"></a>12. No Surrender of Others' Freedom.</b></p>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<p><b><a name="section13"></a>13. Use with the GNU Affero General Public License.</b></p>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<p><b><a name="section14"></a>14. Revised Versions of this License.</b></p>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &ldquo;or any later version&rdquo; applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<p><b><a name="section15"></a>15. Disclaimer of Warranty.</b></p>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<p><b><a name="section16"></a>16. Limitation of Liability.</b></p>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<p><b><a name="section17"></a>17. Interpretation of Sections 15 and 16.</b></p>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<p><b><a name="howto"></a>How to Apply These Terms to Your New Programs</b></p>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an &ldquo;about box&rdquo;.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>
+<p>&nbsp;</p>
+
+
+
+<h5>addr2line notices</h5>
+<p>Copyright &copy; 1987 Regents of the University of California. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley.  The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission.</p>
+<p>THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+
+<p>Copyright &copy; 1983, 1993, 1998 The Regents of the University of California.  All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+<li>Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+
+<p>Copyright &copy; 1997 John D. Polstra. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/nokia.css	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,186 @@
+/*	Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+	License: http://www.eclipse.org/legal/epl-v10.html.
+
+*/
+
+/*	Add whitespace around entire display to avoid crowding edges of view 	*/
+html {
+	margin: 10px;
+	/* fixes gray backgrounds when displayed in external browsers */
+	background-color:#FFFFFF;
+	}
+
+/* 	Set default font to serif style, 12-pt and plain	*/
+body, p, table {
+	font-family: Georgia, "Times New Roman", Times, serif;
+	font-size: 12px;
+	font-weight: normal;
+}
+
+/*	Use sans-serif fonts for all title styles	*/
+h1, h2, h3, h4, h5, h6, strong, em {
+	font-family: Arial, Helvetica, sans-serif;
+	color: #000000;	
+	}
+
+h1	{ font-size:20px }
+h2	{ font-size:18px }
+h3	{ font-size:16px }
+h4	{ font-size:14px }
+h5	{ font-size:12px }
+h6	{ font-size:10px }
+
+/*	For headlines at the top of a view, add space	*/
+/*	20070522-added gradiant to background to update visual style of docs	*/
+h1, h2, h3 {
+	background-image: url(images/green_fade_left_68_165_28.png);
+	background-repeat: no-repeat;
+	padding:10px 0px 10px 12px;	
+	}
+
+li	{
+	margin-bottom:8px;	
+	margin-top:8px;
+	}
+
+/*	Footer includes space and a gray line above the company logo	*/
+#footer {
+	padding-top:10px;
+	margin-top:20px;
+	border-top:1px solid #999;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	color: #03C;	
+	}
+
+.listing	{
+	font-family: "Courier New", Courier, mono;
+	color: #009;
+	background-color: #EEE;
+	padding: 10px 0px;
+	margin: 10px 0px;
+	}
+
+.code, pre	{
+	font-family: "Courier New", Courier, mono;
+	font-size: 11px;
+	color: #333;
+	}
+
+.step	{
+	/* background-color: #EEE; */
+	/* margin: 10px 0px; */
+	color: #333;
+	border-bottom:2px solid #EEE;
+	}
+	
+.substep	{
+	background-color: #EEE;
+	}
+	
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.table {
+	color: #999;
+	font-weight: bold;
+	padding-top: 5px;
+	}
+
+table	{
+	border: solid #999 1px;
+	table-layout: auto;
+	font-size: 12px;
+	}
+
+td, th	{
+	border: solid #999 1px;
+	padding: 5px;
+	vertical-align:top;
+	}
+	
+/*	20070522-replaced gray with green background to match gradiant color for title	*/
+th	{
+	background-color:#ACD79B;
+	/* background-color:#999;
+	color:#FFF; */
+	}
+
+div.ol.p	{
+	margin-left: 3em;
+	}
+
+/* Make all ordered/unordered list items appear in bold gray */
+div ol > li, div ul > li {
+	font-weight:bold;
+	color: #333;
+	}
+
+div ol > p, div ul > p, div li > p {
+	font-weight:normal;
+	}
+	
+/* Make all H4 and H5 items appear in bold gray against a light green background */
+div h5, div h4	{
+	padding:5px 0px 5px 12px;	
+	background-color:#ECFBEA;
+	/* background-color: #EEE; */
+	font-weight:bold;
+	color: #333;
+	}
+	
+	
+/*	Notes stand out using a light top & bottom borders with dark gray text	*/
+p.note {
+	/* color: #03C; */
+	/* background-color: #FFFF99; */
+	color: #333;
+	padding: 5px;
+	margin-left: 1em;
+	margin-right: 1em;
+	border-top: solid #BBB thin;
+	border-bottom: solid #BBB thin;
+	}
+
+	
+/*	Figure/Listing/Table titles are centered and gray	*/
+p.figure {
+	color: #333;
+	text-align: center;
+	font-weight: bold;
+	}
+
+/*	highly visible red background and white text for things that need fixing before release	*/
+/*  SHOULD NOT BE PRESENT IN RELEASED PRODUCTS */
+.fix	{
+	background-color: red;
+	font-weight: bold;
+	color: white;
+	}
+
+.question	{
+	font-style:italic;
+	font-weight:bold;
+	color: #555;
+	}
+	
+.titleSmall {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	}
+
+	
+.plain {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	font-style: normal;
+	line-height: normal;
+	font-weight: normal;
+	font-variant: normal;
+	color: #000000;
+	text-decoration: none;
+	}
+
+a:link 		{ color: #0033CC }
+a:visited	{ color: #555555 }
+a:hover 	{ color: #0033CC }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/references.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>References</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>References</h2>
+<p>The following references are available for this tool:</p>
+<ul>
+	<li><a href="toolbar.htm">Toolbar</a></li>
+	<li><a href="troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/toolbar.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>AnalyzeTool Toolbar</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Toolbar</h2>
+<p>The toolbar in the AnalyzeTool view contains the following icons:</p>
+<img src="../images/toolbar.PNG" alt="toolbar">
+<p></p>
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="149*">
+<col width="456*"></colgroup>
+<tbody>
+<tr>
+<th align="center">Button</th>
+<th align="center">Description</th>
+</tr>
+<tr>
+<td><img src="../images/btn_computer.png" alt="Compurer"><p></p>
+<img src="../images/btn_cellular.png" alt="Phone"><p></p>
+<img src="../images/btn_ask.png" alt="Ask"></td>
+<td>Toggles between data gathering modes. Monitored external and external modes to get data using tracing utility connection, monitored internal mode to use device data file and asking from user which mode to use.
+</td>
+</tr>
+<tr>
+<td><img src="../images/btn_build_active.png" alt="build"><p></p>
+<img src="../images/btn_build_passive.png" alt="build"></td>
+<td>Toggles between activating and deactivating project build with AnalyzeTool.</td>
+</tr>
+<tr>
+<td><img src="../images/btn_record.png" alt="Record data"><img src="../images/btn_terminate.png" alt="Stop data capture"></td>
+<td>Starts and stops data capture from external mode.</td>
+</tr>
+<tr>
+<td><img src="../images/btn_start_subtest.png" alt="Start subtest"></td>
+<td>Starts subtest.</td>
+</tr>
+<tr>
+<td><img src="../images/btn_stop_subtest.png" alt="Stop subtest"></td>
+<td>Stops subtest.</td>
+</tr>
+<tr>
+<td><img src="../images/btn_details_all.png" alt="Change report detail level: All"><p></p>
+<img src="../images/btn_details_known.png" alt="Change report detail level: Known"><p></p>
+<img src="../images/btn_details_topmost.png" alt="Change report detail level: Topmost"><p></p></td>
+<td>Change memory leak analysis call stack detail level (<b>Known</b>, <b>Topmost</b>, <b>All</b>).</td>
+</tr>
+<tr>
+<td><img src="../images/btn_open.png" alt="Open xml file"></td>
+<td>Open user selected test run data file or memory leak results file. File can be also selected from recently opened files list. After file open automatically generates memory leak analysis based on the selected file.</td>
+</tr>
+<tr>
+<td><img src="../images/btn_save.png" alt="Save report file"></td>
+<td>Saves raw data file or memory leak results.<p> For more information, see <a href="../concepts/datafile.htm">AnalyzeTool files</a>.</p></td>
+</tr>
+<tr>
+<td><img src="../images/btn_clear.png" alt="Clear AnalyzeTool made changes"></td>
+<td>Clears AnalyzeTool made changes and deletes unsaved analysis data.</td>
+</tr>
+</tbody>
+</table>
+
+<h5>Related tasks</h5>
+<ul>
+	<li><a href="../tasks/build.htm">Building the project with AnalyzeTool</a></li>
+	<li><a href="../tasks/capture.htm">Capturing trace data</a></li>
+	<li><a href="../tasks/subtest.htm">Running subtests</a></li>
+	<li><a href="../tasks/viewmemoryleaks.htm">Viewing memory leaks</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/reference/troubleshooting.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<title>AnalyzeTool Troubleshooting</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Troubleshooting</h2>
+<p>The following table lists AnalyzeTool error messages:</p>
+
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="250*">
+<col width="356*"></colgroup>
+<tbody>
+<tr>
+<th>Message</th>
+<th align="center">Description</th>
+</tr>
+<tr>
+<td>No project selected. Please select project.</td>
+<td>You tried to use Carbide.c++ Extension actions but you have not selected a project first. Select a project from the <b>Project Explorer</b> window, and run action again.</td>
+</tr>
+<tr>
+<td>Could not find mmp file for current project.</td>
+<td>AnalyzeTool Carbide.c++ Extension could not load the mmp file info. Ensure that project's <i>bld.inf</i> file contains mmp files.</td>
+</tr>
+<tr>
+<td>Invalid name. Do you want to specify a valid name?</td>
+<td>You have entered an invalid subtest name, for example the name is empty or starts with an illegal parameter.</td>
+</tr>
+<tr>
+<td>No process started, could not start a subtest.</td>
+<td>The trace is active but no processes started in the target hardware which are built with the external data gathering mode of AnalyzeTool.</td>
+</tr>
+<tr>
+<td>The given subtest is already started for the active process.</td>
+<td>You have already started the subtest with same name for selected process.
+</td>
+</tr>
+<tr>
+<td>Cannot find AnalyzeTool libraries from current SDK. Install libraries first.</td>
+<td>This message is displayed in the <b>Console</b> view if AnalyzeTool is not included in SDK.</td>
+</tr>
+</tbody>
+</table>
+
+<p>The following table lists possible known problematic situations related to AnalyzeTool:</p>
+
+<table width="615" border="1" cellspacing="1" cellpadding="2">
+<colgroup>
+<col width="250*">
+<col width="356*"></colgroup>
+<tbody>
+<tr>
+<th>Problem</th>
+<th align="center">Possible cause</th>
+</tr>
+<tr>
+<td>Compiling with AnalyzeTool gives an error related to header files.</td>
+<td>Mixing header files from different AnalyzeTool versions might be the cause. From version 1.5.0 onwards, AnalyzeTool uses a different folder structure compared to previous versions. Therefore it is essential that you check that there are no header files in the folder <i>\epoc32\include\applications\analyzetool</i> or <i>\epoc32\include\analyzetool</i>.</td>
+</tr>
+<tr>
+<td>Compiling with AnalyzeTool gives an error related to AnalyzeTool library files.</td>
+<td>Build environment is missing AnalyzeTool files. Install the AnalyzeTool to build environment by unzipping environment changes from AnalyzeTool installation folder.</i>.</td>
+</tr>
+<tr>
+<td>Software compiled with AnalyzeTool does not run.</td>
+<td>Mixing header files from different AnalyzeTool versions might be the cause. From version 1.5.0 onwards, AnalyzeTool uses a different folder structure compared to previous versions. Therefore it is essential that you check that there are no header files in the folder <i>\epoc32\include\applications\analyzetool</i> or <i>\epoc32\include\analyzetool</i>.</td>
+</tr>
+<tr>
+<td>Software compiled with AnalyzeTool does not run.</td>
+<td>AnalyzeTool core components are missing from the target HW/emulator environment.</td>
+</tr>
+<tr>
+<td>Software compiled with AnalyzeTool does not run.</td>
+<td>The AnalyzeTool core components in the target HW/emulator environment are old (incompatible) versions.</td>
+</tr>
+</tbody>
+</table>
+
+<p>The following ones are Command line engine related errors. These errors are displayed in the Carbide.c++ <b>Console</b> view.</p>
+
+<table>
+<colgroup>
+<col width="250*">
+<col width="356*"></colgroup>
+<tbody>
+<tr>
+<th>Error</th>
+<th align="center">Possible cause</th>
+</tr>
+<tr>
+<td>Mmp file: &lt;mmp file name> is read only. Compile aborted.</td>
+<td>The project's mmp file is read only. Remove the write protection from the mmp file.</td>
+</tr>
+<tr>
+<td>AnalyzeTool build failed in module: &lt;mmp file name&gt;.</td>
+<td>Project contains build errors. Details can be found from <b>Console</b> view.</td>
+</tr>
+<tr>
+<td>Can not find AnalyzeTool libraries from current SDK</td>
+<td>Your build environment is missing the necessary files for building with AnalyzeTool. You need to compile AnalyzeTool to all platforms in your environment.</td>
+</tr>
+<tr>
+<td>AnalyzeTool : Errors :<br>
+Missing symbol file: <symbol file name></td>
+<td>You are using GCCE release build which does not produce needed symbol files. Symbol files are needed to pinpoint memory leaks. To correct this user needs to add "<i>-debug</i>" to project's build configuration arguments. To do this open project's <b>properties</b>, select <b>Carbide.c++ &gt; Build Configurations &gt; Arguments</b> while the GCCE release build configuration is selected and write the <i>-debug</i> to arguments field.</td>
+</tr>
+</tbody>
+</table>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/release_notes.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,338 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Release Notes</title>
+<link href="nokia.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+
+<h2>Release note</h2>
+<h4>AnalyzeTool Carbide.c++ Extension &ndash; Version 1.8.0</h4>
+<p>Released 12th December 2009</p>
+
+<ul>
+	<li><a href="#description">Product description</a></li>
+	<li><a href="#features">Main features</a></li>
+	<li><a href="#newfeatures">What's new</a></li>
+	<li><a href="#installation">Installation notes</a></li>
+	<li><a href="#requirements">System requirements</a></li>
+	<li><a href="#compissues">Compatibility issues</a></li>
+	<li><a href="#issues">Known issues</a></li>
+</ul>
+
+<h3><a name="description"></a>Product description</h3>
+<p>AnalyzeTool is a test software tool that is used for testing Symbian software for memory leaks and pinpointing the leaking problems in the source code.</p>
+<p>For any support email list "D-AnalyzeTool-Support DG" should be used.</p>
+
+<h3><a name="features"></a>Main features</h3>
+<ul>
+	<li>UI for activating a memory leak analysis. </li>
+	<li>UI for seeing results of a memory leak analysis.</li>
+	<li>Pinpoints memory leaks from target hardware to source code lines.</li>
+	<li>Discovers resource leaks from process.</li>
+	<li>Command line interface and Carbide.c++ Extension.</li>
+</ul>
+
+<h3><a name="newfeatures"></a>What's new</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="installation"></a>Installation notes</h3>
+<ul>
+	<li>N/A</li>
+</ul>
+
+<h3><a name="requirements"></a>System requirements</h3>
+<p>Basic Requirements:</p>
+<ul>
+	<li>Windows XP.</li>
+	<li>S60 3.1, 3.2, 5.0 or 5.1 (R&amp;D SW).</li>
+	<li>ARMV5 or GCCE compiler.</li>
+	<li>Tracing utility Carbide.c++ Extension (version 1.0.1+).</li>
+</ul>
+<p>Additional Requirements:</p>
+<ul>
+	<li>Tracing utility connection (USB connection) is required for collecting real time data from target hardware to PC.</li>
+</ul>
+
+<h3><a name="compissues"></a>Compatibility issues</h3>
+<ul>
+    <li>AnalyzeTool iby files (ROM image creation) at S60 5.0 SDK and higher are not compatible with older than week 16/2009 release of SDK.</li>
+	<li>Not compatible with older versions than 1.6.0 of AnalyzeTool command line engine.</li>
+	<li>Kernel code analysis not supported.</li>
+</ul>
+
+<h3><a name="issues"></a>Known issues</h3>
+<ul>
+	<li><b>Note:</b> If you are updating AnalyzeTool from the version older than 1.5.0, AnalyzeTool uses a different folder structure compared to previous versions. Therefore it is essential that you check that there are no header files in the folder <i>\epoc32\include\applications\analyzetool</i> or <i>\epoc32\include\analyzetool</i>.</li>
+	<li>Tested processes must be closed successfully, meaning that they cannot be panicked or exited abnormally (will cause also a lot of false memory leaks).</li>
+	<li>Handle leaks in subtest shows substraction of open handles within the subtest.</li>
+	<li>The subtesting feature cannot be used with internal data gathering mode.</li>
+	<li>Memory leaks from ECOM plugins are reported, but not pinpointed to code lines inside plugin.</li>
+	<li>Pinpointing memory leaks from urel binaries shows only function names.</li>
+</ul>
+
+<h3>Version history</h3>
+<h5>Version 1.7.4 &ndash; 4th November 2009</h5>
+<ul>
+	<li>Feature: [AT-560] - Third data gathering mode which is simple and fast.</li>
+	<li>Feature: [AT-592] - Support for specifying call stack size(s).</li>
+	<li>Feature: [AT-627] - Button to open preferences.</li>
+	<li>Feature: [AT-551] - New error dialogs in Carbide extension.</li>
+	<li>Feature: [AT-583] - Extension version number shown in AnalyzeTool view.</li>
+	<li>Fix: [AT-568] - Inform user in build phase that kernel mode is not supported/hooked.</li>
+	<li>Fix: [AT-623] - Version conflict not shown to user.</li>
+	<li>Fix: [AT-632] - Selecting leak from sub test does not give call stack info.</li>	
+</ul>
+
+<h5>Version 1.7.3 &ndash; 1st October 2009</h5>
+<ul>
+	<li>Fix: [AT-570] - Support for define multiple symbol files</li>
+	<li>Fix: [AT-586] - Carbide extension builds project although the selected target is not supported.
+</ul>
+
+<h5>Version in 1.7.2 &ndash; 3th September 2009</h5>
+<ul>
+	<li>Fix: [AT-538] - Memory leak information copied to clipboard.</li>
+</ul>
+
+<h5>Version in 1.7.1 &ndash; 19th August 2009</h5>
+<ul>
+	<li>Fix: [AT-542] - Decrease extension memory usage when creating results.</li>
+	<li>Fix: [AT-553] - Device data file input should not accept path.</li>
+</ul>
+
+<h5>Version in 1.7.0 &ndash; 25th June 2009</h5>
+<ul>
+	<li>Feature: [AT-520] - "-debug" passed as build argument in Carbide.</li>
+	<li>Feature: [AT-134] - Carbide.c++ AnalyzeTool building of a QT project.</li>
+	<li>Feature: [AT-236] - Refresh button which makes results again.</li>
+	<li>Feature: [AT-136] - AnalyzeTool Carbide.c++ Extension can be used to visualize results for emulator/simulator memory leaks automatically.</li>
+	<li>Fix: [AT-517] - Improve parsing speed of addresses.</li>
+	<li>Fix: [AT-464] - Verbose output renders AnalyzeTool unusable slow.</li>
+	<li>Fix: [AT-279] - Usability Improvement: Console view should be opened after building done.</li>
+</ul>
+
+<h5>Version in 1.6.0 &ndash; 20th April 2009</h5>
+<ul>
+	<li>Feature: [AT-480] - Rom symbol file can be defined in Carbide Extension preferences.</li>
+	<li>Feature: [AT-489] - AnalyzeTool memory leak results can be cleared from view.</li>
+	<li>Feature: [AT-475] - Number of max callstack items increased to 40.</li>
+	<li>Feature: [AT-453] - On the fly call stack filtering improved.</li>
+	<li>Feature: [AT-481] - "PROCESS_END x ABNORMAL" are now printed also when internal data gathering mode is used.</li>
+	<li>Feature: [AT-337] - Supports for pinpointing codelines from GCCE binaries.</li>
+	<li>Feature: [AT-113] - Pinpoint memory leaks to code lines also in urel builds.</li>
+	<li>Feature: [AT-467] - Cheat sheet for AnalyzeTool created.</li>
+	<li>Feature: [AT-416] - Carbide extension checks atool.exe version before using it.</li>
+	<li>Feature: [AT-440] - atool.exe version number showed in AnalyzeTool preference page.</li>
+	<li>Feature: [AT-442] - AnalyzeTool "core" version number is displayed in Carbide preferences.</li>
+	<li>Feature: [AT-451] - Added support for pinpointing codelines from static libraries in ARMV5 platform.</li>
+	<li>Fix: [AT-461] - Pinpointing works also to dlls in emulator environment.</li>
+	<li>Fix: [AT-419] - Clear AnalyzeTool changes runs reallyclean also.</li>
+	<li>Fix: [AT-446] - Error message is displayed when user analysis invalid data.</li>
+	<li>Fix: [AT-466] - Cancelling build enabled during pre-builder.</li>
+	<li>Fix: [AT-420] - Analysis progress bar now progresses.</li>
+</ul>
+
+<h5>Version in 1.5.2 &ndash; 27th March 2009</h5>
+<ul>
+	<li>Feature: [AT-254] - AnalyzeTool to work also in emulator.</li>
+	<li>Feature: [AT-323] - AnalyzeTool Carbide extension can be used without Traceviewer Extension.</li>
+	<li>Fix: [AT-350] - Running atool -c in directory where only empty atool_temp directory exists will not delete atool_temp directory.</li>
+	<li>Fix: [AT-330] - In analyze report pinpointed memoryleak count is always zero when using sbs v.2, in logging levels 1 & 2.</li>
+	<li>Fix: [AT-333] - Use of raptor build variables leads to incorrect listing file name with certain types.</li>
+	<li>Fix: [AT-357] - AnalyzeTool can share existing Tracing utility connection.</li>
+	<li>Fix: [AT-361] - Unnecessary "Can not analyze" dialog is no longer displayed after the project is built with AnalyzeTool.</li>
+	<li>Fix: [AT-363] - Needed files for AnalyzeTool hooking are also checked for winscw.</li>
+	<li>Fix: [AT-376] - Analyze Tool Pre- and Post-Build Errors are added to Problems View.</li>
+	<li>Fix: [AT-272] - AnalyzeTool debug logging improved.</li>
+	<li>Fix: [AT-374] - Start tracing icon changed.</li>
+	<li>Fix: [AT-372] - If SDK prefs not ok in Carbide, atool gives error: missing libraries from SDK.</li>
+	<li>Fix: [AT-378] - Crash when trying to navigate to source location.</li>
+	<li>Fix: [AT-390] - Emulator pinpoints to wrong cpp file.</li>
+	<li>Fix: [AT-393] - Progress monitor is shown while starting the Tracing utility connection.</li>
+	<li>Fix: [AT-410] - Command line tool, "atool.exe", is bundled into the Carbide extension.</li>
+	<li>Fix: [AT-325] - unnecessary copying of trace file removed from Carbide.</li>
+	<li>Fix: [AT-358] - Disable unnecessary AnalyzeTool buttons when trace is started.</li>
+</ul>
+
+<h5>Version 1.5.1 &ndash; 19th March 2009</h5>
+<ul>
+	<li>Feature: [AT-443] - Atool version is checked when hooked application is started.</li>
+	<li>Fearure: [AT-451] - Added support for pinpointing codelines from static libraries in ARMV5 platform.</li>
+	<li>Fix: [AT-422] - Abnormal process ends not anymore showed for non-AnalyzeTool processes.</li>
+</ul>
+
+<h5>Version 1.5.0 &ndash; 19th February 2009</h5>
+<ul>
+	<li>Feature: [AT-254] - AnalyzeTool to work also in emulator.</li>
+	<li>Feature: [AT-323] - AnalyzeTool Carbide extension can be used without Traceviewer Extension.</li>
+	<li>Fix: [AT-350] - Running atool -c in directory where only empty atool_temp directory exists will not delete atool_temp directory.</li>
+	<li>Fix: [AT-330] - In analyze report pinpointed memoryleak count is always zero when using sbs v.2, in logging levels 1 & 2.</li>
+	<li>Fix: [AT-333] - Use of raptor build variables leads to incorrect listing file name with certain types.</li>
+	<li>Fix: [AT-357] - AnalyzeTool can share existing Tracing utility connection.</li>
+	<li>Fix: [AT-361] - Unnecessary "Can not analyze" dialog is no longer displayed after the project is built with AnalyzeTool.</li>
+	<li>Fix: [AT-363] - Needed files for AnalyzeTool hooking are also checked for winscw.</li>
+	<li>Fix: [AT-376] - Analyze Tool Pre- and Post-Build Errors are added to Problems View.</li>
+	<li>Fix: [AT-272] - AnalyzeTool debug logging improved.</li>
+	<li>Fix: [AT-374] - Start tracing icon changed.</li>
+	<li>Fix: [AT-372] - If SDK prefs not ok in Carbide, atool gives error: missing libraries from SDK.</li>
+	<li>Fix: [AT-378] - Crash when trying to navigate to source location.</li>
+	<li>Fix: [AT-390] - Emulator pinpoints to wrong cpp file.</li>
+	<li>Fix: [AT-393] - Progress monitor is shown while starting the Tracing utility connection.</li>
+	<li>Fix: [AT-410] - Command line tool, "atool.exe", is bundled into the Carbide extension.</li>
+	<li>Fix: [AT-325] - unnecessary copying of trace file removed from Carbide.</li>
+	<li>Fix: [AT-358] - Disable unnecessary AnalyzeTool buttons when trace is started.</li>
+</ul>
+
+<h5>Version 1.4.1 &ndash; 19th December 2008</h5>
+<ul>
+	<li>Change: [AT-235] - Carbide Extension could show which modules are built with atool.</li>
+	<li>Change: [AT-263] - Atool supports Symbian build system version 2 (SBS v.2).</li>
+	<li>Change: [AT-69]  - Subtest memory analysis summary should be separated inside to subtest information.</li>
+	<li>Change: [AT-252] - Carbide extension to ask user "to continue or abort compilation" if target is not supported.</li>
+	<li>Change: [AT-274] - AnalyzeTool window buttons improvement.</li>
+	<li>Change: [AT-218] - History of files opened added to open file button.</li>
+	<li>Change: [AT-219] - Verbose configuration option for Carbide.c++.</li>
+	<li>Change: [AT-233] - Results include processes udeb/urel info.</li>
+	<li>Fix: [AT-205] - Carbide Extension cannot find the .cpp file where memoryleak is pinpointed.</li>
+	<li>Fix: [AT-278] - Usability Improvement: Preferences page and Logging mode.</li>
+	<li>Fix: [AT-300] - Number of leaks in subtest is displayed in report.</li>
+	<li>Fix: [AT-237] - Support analysing datafiles without /epoc32/build content or from sub folder where build was made.</li>
+	<li>Fix: [AT-276] - Atool will not show the correct name of subtest if it contains spaces.</li>
+	<li>Fix: [AT-280] - Compiling a project deletes logging data file from atool_temp.</li>
+	<li>Fix: [AT-285] - Temporary file left to output directory in atool.exe analyze.</li>
+	<li>Fix: [AT-286] - AnalyzeTool window not updated after current project change.</li>
+	<li>Fix: [AT-289] - Number of memory leaks info should be updated after report detail level change.</li>
+	<li>Fix: [AT-226] - Project only specifies one MMP but all the MMP files are built.</li>
+	<li>Fix: [AT-234] - Changing detail level of report clears call stack window.</li>
+	<li>Fix: [AT-249] - AnalyzeTool post-builder is not working with variants on Carbide.c++.</li>
+	<li>Fix: [AT-273] - "Start Trace" clears results from all open projects.</li>
+	<li>Fix: [AT-275] - Pinpointing from urel module does not work from Carbide.c++.</li>
+</ul>
+
+<h5>Version 1.4.0 &ndash; 12th December 2008</h5>
+<ul>
+	<li>Change: [AT-218] - History of files opened added to open file button.</li>
+	<li>Change: [AT-219] - Verbose configuration option for Carbide.c++.</li>
+	<li>Change: [AT-233] - Results include processes udeb/urel info.</li>
+	<li>Fix: [AT-226] - Project only specifies one MMP but all the mmp files are built.</li>
+	<li>Fix: [AT-234] - Changing detail level of report clears callstack window.</li>
+	<li>Fix: [AT-249] - AnalyzeTool post-builder is not working with variants on Carbide.c++.</li>
+	<li>Fix: [AT-273] - "Start Trace" clears results from all open projects.</li>
+	<li>Fix: [AT-275] - Pinpointing from urel module does not work from Carbide.</li>
+</ul>
+
+<h5>Version 1.3.3 &ndash; 27th November 2008</h5>
+<ul>
+	<li>Change: [AT-218] - History of files opened added to open file button.</li>
+	<li>Change: [AT-219] - Verbose configuration option for Carbide.c++.</li>
+	<li>Change: [AT-233] - Results include processes udeb/urel info.</li>
+	<li>Fix: [AT-226] - Project only specifies one MMP but all the mmp files are built.</li>
+	<li>Fix: [AT-234] - Changing detail level of report clears callstack window.</li>
+	<li>Fix: [AT-249] - AnalyzeTool post-builder is not working with variants on Carbide.c++.</li>
+	<li>Fix: [AT-273] - "Start Trace" clears results from all open projects.</li>
+	<li>Fix: [AT-275] - Pinpointing from urel module does not work from Carbide.</li>
+</ul>
+
+<h5>Version 1.3.2 &ndash; 13th November 2008</h5>
+<ul>
+	<li>Change: [AT-218] - History of files opened added to open file button.</li>
+	<li>Change: [AT-219] - Verbose configuration option for Carbide.c++.</li>
+	<li>Change: [AT-233] - Results include processes udeb/urel info.</li>
+	<li>Fix: [AT-226] - Project only specifies one MMP but all the mmp files are built.</li>
+	<li>Fix: [AT-234] - Changing detail level of report clears callstack window.</li>
+	<li>Fix: [AT-249] - AnalyzeTool post-builder is not working with variants on Carbide.c++.</li>
+	<li>Fix: [AT-273] - "Start Trace" clears results from all open projects.</li>
+	<li>Fix: [AT-275] - Pinpointing from urel module does not work from Carbide.</li>
+</ul>
+
+<h5>Version 1.3.1 &ndash; 30th October 2008</h5>
+<ul>
+	<li>Change: [AT-163] - A single process start - end, should not be a test run.</li>
+	<li>Change: [AT-189] - Carbide.c++ Extension shows ABNORMAL text when system exception happens in the phone.</li>
+	<li>Change: [AT-190] - Carbide.c++ Extension could filter memory leaks which does not contain any call stack.</li>
+	<li>Change: [AT-191] - MemoryHook reports PROCESS_END with ABNORMAL tag.</li>
+	<li>Change: [AT-192] - atool -c to undo mmp change.</li>
+	<li>Change: [AT-202] - Modules with read only mmp files can be hooked.</li>
+	<li>Change: [AT-209] - Print S60 logging filename if not given.</li>
+	<li>Fix: [AT-156] - Multiple subtests within test run show only one subtest.</li>
+	<li>Fix: [AT-181] - Logging levels 1 and 3 produce same results when using UREL target.</li>
+	<li>Fix: [AT-204] - Memoryhook prints PROCESS_END when child threads are killed.</li>
+	<li>Fix: [AT-206] - Atool reports runs from irrelevant PROCESS_ENDS.</li>
+	<li>Fix: [AT-222] - No error message data file can not be opened.</li>
+	<li>Fix: [AT-225] - NPE when using the Analyze View in Carbide 2.0.</li>
+	<li>Fix: [AT-243] - "Error 1 make[1]: *** Waiting for unfinished jobs...." error is displayed during the AnalyzeTool build.</li>
+	<li>Fix: [AT-247] - run abld reallyclean instead of abld clean.</li>
+	<li>Fix: [AT-248] - AnalyzeTool builder "is shown active" after importing a deleted project again to Carbide.c++.</li>
+	<li>Fix: [AT-212] - Progress information: Executing AnalyzeTool, Cannot send to background.</li>
+	<li>Fix: [AT-250] - Devlon52 or other ARMV5 based variants cannot be built from Carbide.</li>
+</ul>
+
+<h5>Version 1.3.0 &ndash; 23rd October 2008</h5>
+<ul>
+	<li>Change: [AT-163] - A single process start - end, should not be a test run.</li>
+	<li>Change: [AT-189] - Carbide.c++ Extension shows ABNORMAL text when system exception happens in the phone.</li>
+	<li>Change: [AT-190] - Carbide.c++ Extension could filter memory leaks which does not contain any call stack.</li>
+	<li>Change: [AT-191] - MemoryHook reports PROCESS_END with ABNORMAL tag.</li>
+	<li>Change: [AT-192] - atool -c to undo mmp change.</li>
+	<li>Change: [AT-202] - Modules with read only mmp files can be hooked.</li>
+	<li>Change: [AT-209] - Print S60 logging filename if not given.</li>
+	<li>Fix: [AT-156] - Multiple subtests within test run show only one subtest.</li>
+	<li>Fix: [AT-181] - Logging levels 1 and 3 produce same results when using UREL target.</li>
+	<li>Fix: [AT-204] - Memoryhook prints PROCESS_END when child threads are killed.</li>
+	<li>Fix: [AT-206] - Atool reports runs from irrelevant PROCESS_ENDS.</li>
+	<li>Fix: [AT-222] - No error message data file can not be opened.</li>
+	<li>Fix: [AT-225] - NPE when using the Analyze View in Carbide 2.0.</li>
+</ul>
+
+<h5>Version 1.2.1 &ndash; 2nd October 2008</h5>
+<ul>
+	<li>Change: AnalyzeTool building method changed: AnalyzeTool Carbide.c++ Extension uses now the Carbide builder.</li>
+</ul>
+
+<h5>Version 1.2.0 &ndash; 18th September 2008</h5>
+<ul>
+	<li>Change: AnalyzeTool building method changed: AnalyzeTool Carbide.c++ Extension uses now the Carbide builder.</li>
+</ul>
+
+<h5>Version 1.1.2 &ndash; 21th August 2008</h5>
+<ul>
+	<li>Fix: [AT-97] - Launching Carbide.c++ generates error message to the atool error log.</li>
+	<li>Fix: [AT-99] - 'Module not build with AnalyzeTool' is still displayed after AnalyzeTool build.</li>
+</ul>
+
+<h5>Version 1.1.1 &ndash; 7th August 2008</h5>
+<ul>
+	<li>Fix: [AT-72] - Command line tool can not handle project where two MMP-files are in same directory.</li>
+</ul>
+
+<h5>Version 1.1.0 &ndash; 10th July 2008</h5>
+<ul>
+	<li>Feature: [AT-59] - Trace data can be saved to a file.</li>
+	<li>Feature: [AT-68] - Cancel logging from ConfigUI feature.</li>
+	<li>Fix: [AT-70] - Redundant handle leak information.</li>
+</ul>
+
+<h5>Version 1.0.0 &ndash; 7th July 2008</h5>
+<p>The first version.</p>
+
+<div id="footer">
+Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies).<br>
+All rights reserved. <br>
+This component and the accompanying materials are made available <br>
+under the terms of "Eclipse Public License v1.0" <br>
+which accompanies this distribution and is available <br>
+at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+<br><br>
+Initial Contributors:<br>
+Nokia Corporation - initial contribution
+<br><br>
+Contributors:<br>
+Description:
+
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/build.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+<title>Build project</title>
+</head>
+<body>
+
+<h2>Building the project with AnalyzeTool</h2>
+<p>To be able to analyse memory leaks, you must build each project with AnalyzeTool.</p>
+<p>To build with AnalyzeTool:</p>
+<ol>
+<li>Choose any of the following options for the data gathering mode:<br>
+<ul>
+<li><b>Monitored external </b>or<b> External</b>: This option will send the memory analysis data through a tracing utility connection. For more information, see <a href="../tasks/capture.htm#capture_external">Capturing data in external data gathering mode</a>.</li>
+<li><b>Monitored internal</b>: This option will create a data file to the target device. The default data file name is the same as the target process name. If you select the <b>Name from the user</b> option, you must define a name for the data file. For more information, see <a href="../tasks/capture.htm#capture_s60_file">Capturing data in internal data gathering mode</a>.</li>
+<li><b>Ask always</b>: This option will ask from the user which data gathering mode to use.</li>
+</ul>
+<p>
+<b>Note!</b> There are some differences between a monitored and a not monitored external data gathering modes:
+<ul>
+<li>A process using the monitored mode  is visible from the AnalyzeTool configuration UI application on device.</li>
+<li>A hooked process executes faster in the external (not monitored) mode than in the monitored mode.</li>
+</ul>
+</p>
+</li>
+<li>Activate the AnalyzeTool build from the <b>AnalyzeTool</b> toolbar or from the <b>Project Explorer</b> view pop-up menu.
+<p><b>Note!</b> You can also deactivate the build from the <b>AnalyzeTool</b> toolbar or the <b>Project Explorer</b> view pop-up menu.</p></li>
+<li>Build the project.</li>
+<li><p>Check if the build completed successfully.</p>
+<p>Information about the build process is displayed in the <b>Console view</b>. The last row of the <b>Console view</b> indicates if the build was successful or not.</p> <p>For more information on error messages, see <a href="../reference/troubleshooting.htm">Troubleshooting</a>.</p></li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/capture.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta content="text/html; charset=us-ascii" http-equiv="content-type">
+<meta content="text/css" http-equiv="content-style-type">
+<link href="../nokia.css" rel="StyleSheet" type="text/css">
+<title>Capturing data</title>
+</head>
+<body>
+
+<h2>Capturing data</h2>
+<p>There are two alternative ways to capture data, depending on the data gathering mode.</p>
+
+<h3 id="capture_external">Capturing data in monitored external or external data gathering mode</h3>
+<p><b>Note!</b> AnalyzeTool decides which connection method to use by checking the project active build configuration settings. If the active build configuration is set to <b>WINSCW</b>, AnalyzeTool captures data from the emulator output file <i>(%tmp%\epocwind.out)</i>; in <b>ARMV5</b> and <b>GCEE</b> build configurations AnalyzeTool captures data using the tracing utility connection.</p>
+<p><b>Note!</b> This option requires that a tracing utility is available and a connection is established to the target hardware.</p>
+<p>USB tracing can not be run from the device bootup because it requires USB tracing activation from the device side.</p>
+<p>To capture data:</p>
+<ol>
+<li>Open the <b>AnalyzeTool</b> view (if it is not already open) by selecting <b>Window > Show View > Other... > Carbide Extensions > AnalyzeTool.</b></li>
+<li>Start capturing data by clicking <b>Start tracing</b> in the AnalyzeTool toolbar.</li>
+<li>Start the application built with AnalyzeTool, and run the desired test cases. Note that Carbide.c++ needs to be connected to the target hardware.</li>
+<li>At the end of a test run, close the tested application (process). After you have closed the application, stop the test run by clicking <b>Stop tracing</b>. <p>Now AnalyzeTool has captured data, saved it into the project's <i>bld.inf\atool_temp</i> directory, and the memory analysis results are displayed in the <b>AnalyzeTool</b> view.</p></li>
+</ol>
+<h3 id="capture_s60_file">Capturing data in monitored internal data gathering mode</h3>
+<p>When you select the <b>monitored internal</b> data gathering mode in AnalyzeTool build, AnalyzeTool collects the test data into a file.</p><p><b>Note!</b> If you are analyzing an application in the target hardware, the file must be transferred to a PC after the test run is completed.</p>
+<p>To capture data:</p>
+<ol>
+<li>Install the AnalyzeTool software to the target hardware if not already installed.</li>
+<li>Install the test software built with AnalyzeTool to the target hardware.</li>
+<li>Start the application built with AnalyzeTool in the target hardware, and run the desired test cases.</li>
+<li>At the end of a test run, close the tested application (process). This will write the test data to a file. In the target hardware the file is saved in <i>e:\analyzetool\</i> or <i>c:\data\analyzetool\</i> depending if the memory card is used or not. In the emulator environment the file is saved in <i>\epoc32\winscw\c\logs\analyzetool\</i>.
+<p><b>Note!</b> The data file name was specified before the build.</p></li>
+<li>While the tested software project is active in the <b>Project Explorer</b>, open the data file by clicking <b>Open and analyze data file</b> in the <b>AnalyzeTool</b> toolbar. This will run the analysis and display the results in the <b>AnalyzeTool</b> view.</li>
+</ol>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/emulatorsupport.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Emulator support</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Emulator support</h2>
+
+<p>
+Latest AnalyzeTool version supports running tests also in an emulator environment.
+</p>
+<h4>Running analysis</h4>
+<p>
+You can run the analysis by opening the data file generated by AnalyzeTool. Click the <b>Open and analyze data file...</b> button.
+</p>
+<p>
+In the external data gathering mode, analysis data is saved to the <i>%tmp%\epocwind.out</i> file.
+</p>
+<p>
+In the internal data gathering mode, analysis data is saved to the <i>\epoc32\winscw\c\logs\analyzetool\</i> folder.
+</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/subtest.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=us-ascii">
+<meta http-equiv="content-style-type" content="text/css">
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+<title>Subtests</title>
+</head>
+<body>
+
+<h2>Running subtests</h2>
+<p>You can run subtests which are tests inside a test run. While the test run life cycle is the same as for the tested process, the subtest is started and stopped inside the time frame of the test run. The number of test runs is not limited and they can overlap each other.</p>
+<p>To run subtests:</p>
+<ol>
+<li><p>When the data capture is running and you have started the test run, you can start a new subtest by selecting <b>Start subtest</b> from the <b>AnalyzeTool</b> view. The subtest name dialog is now displayed, and starting from this point AnalyzeTool collects separate memory leak data for the subtest timeframe.</p>
+<p>When the subtest is started, the information is displayed in the message area. The information contains the target name and the subtest name.</p></li>
+<li><p>When the desired subtests in the target device are run, the next step is to end the active subtest by selecting <b>Stop subtest</b> from the <b>AnalyzeTool</b> view.</p> <p>If there are multiple subtests running, the <b>Select subtest to stop</b> dialog is displayed.</p><p>Information of ended subtest is displayed in the message area.</p></li>
+</ol>
+<p>When the test run is finished, AnalyzeTool shows the data about subtests run under the test run.</p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/tasks.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+<title>Tasks</title>
+</head>
+<body>
+
+<h2>Tasks</h2>
+<p>The following tasks are available for this tool:</p>
+<ul>
+	<li><a href="build.htm">Building the project with AnalyzeTool</a></li>
+	<li><a href="capture.htm">Capturing data</a></li>
+	<li><a href="subtest.htm">Running subtests</a></li>
+	<li><a href="viewmemoryleaks.htm">Viewing memory leaks</a></li>
+	<!--<li><a href="viewstatistic.htm">Viewing memory statistic</a></li>
+	<li><a href="emulatorsupport.htm">Emulator support</a></li>-->
+	<li><a href="viewactivitygraph.htm">Viewing memory activity graph</a></li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewactivitygraph.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Viewing AnalyzeTool memory activity graphs</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Viewing memory activity graph</h2>
+<p>Memory activity graphs are generated automatically after the data capturing is stopped. Alternatively, an existing trace file can be opened to view memory activity graphs. For more information, see <a href="..\concepts\datafile.htm">AnalyzeTool files</a>.</p>
+<p>There are two options for opening a memory analysis data file:</p>
+<ul>
+<li>From the <b>Project pop-up</b> menu, select <b>AnalyzeTool</b> > <b>Open and analyze data file</b>.</li>
+<li>In the <b>AnalyzeTool</b> view, click the <b>Open and analyze data file</b> button.</li>
+</ul>
+<p>Memory activity graphs are displayed in the <b>AnalyzeTool</b> window on the <b>Graph</b> tab. After the data has loaded, select a process in the <b>Process</b> drop down box to view its memory activity. </p>
+<p><img src="../images/sample_graph.png" alt="AnalyzeTool graph tab"></p>
+
+<h3>Description of graph</h3>
+<p>The graph shows the cumulative memory of the given process over time. 
+Each memory operation is marked with a dot on the graph as follows:
+<ul>
+<li><font color="blue">Alloc</font>: A memory allocation is marked in blue if it is freed during the lifetime of the process.</li>
+<li><font color="red">Leak</font>: A memory allocation is marked in red with a vertical line going down if it is not freed during the lifetime of the process (also known as <em>leak</em>).</li>
+<li><font color="green">Free</font>: A memory free is marked in green.</li>
+</ul>
+<p>Hovering the mouse over a memory operation shows a tooltip with relevant information. 
+A memory operation can also be selected with a mouse click. This will highlight the memory operation on the graph, and 
+more detailed information is shown in the Eclipse Properties view. The Eclipse Properties view may include callstack information if available.
+<p><b>Tip</b>: Use the <b>arrow left</b> and <b>arrow right</b> keys to move to the next or previous memory operation.</p> 
+<p>When a memory operation is selected, related memory operations are highlighted on the graph. For example, when an alloc is selected, its associated free memory is marked on the graph with a green line going down.</p>
+
+<h3>Navigating the graph</h3>
+<ul>
+<li><b>Zoom in:</b> Select a region in the graph with your mouse (click the left edge and drag to the right edge of the region to be zoomed in).</li>
+<li><b>Zoom out:</b> Right-click with the mouse.</li>
+<li><b>Scroll:</b> Use the scroll bar. Alternatively, select a memory operation with your mouse and use the <b>arrow right</b> or <b>arrow left</b> keys to bring the next or previous into view.</li>
+</ul>
+
+<h3>The Eclipse Properties View</h3>
+<p>When a single memory allocation is selected on the graph, the Eclipse Properties view shows detailed information about the memory operation.
+If the Eclipse Properties view is not already open, it can be opened by selecting <b>Windows</b> > <b>Show View</b> > <b>Properties</b>.
+</p>
+<img src="../images/properties_view.png" alt="AnalyzeTool Properties View">
+<p>Double-clicking an item in the callstack opens the appropriate source code file to that code line, provided the source code file can be found in the selected project in Carbide.c++.</p>
+
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewmemoryleaks.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Viewing AnalyzeTool memory leaks</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Viewing memory leaks</h2>
+<p>Test run details will be shown in the <b>AnalyzeTool</b> view automatically after the data capture in tracing utility connection. You can also open the memory analysis data file by yourself later. For more information, see <a href="..\concepts\datafile.htm">AnalyzeTool files</a>.</p>
+<p>There are two options for opening a memory analysis data file:</p>
+<ul>
+<li>From <b>Project pop-up</b> menu, select <b>AnalyzeTool</b> > <b>Open and analyze data file</b></li>
+<li>In the <b>AnalyzeTool</b> view, select <b>Open and analyze data file</b></li>
+</ul>
+<p>The memory leak analysis results are displayed in the <b>AnalyzeTool</b> window. Test runs with the memory leak information is displayed in the left pane. The right pane shows the information on the selected memory leak call stack.</p><br>
+<img src="../images/resultsaftercapture.PNG" alt="Results after data capture">
+
+<h5>Description of call stack view</h5>
+<ul>
+<li>One line always contains the memory address, for example <i>7cf255571 MemoryLeaker.exe</i>. A module name is displayed if the memory address is in the module memory area, otherwise <i>???</i> is displayed.</li>
+<li>The function name, for example <i>CMemoryLeakerListbox: :OfferKeyEventL,</i> is displayed if the function is identified, otherwise <i>???</i> is displayed. The class name is also displayed if the function belongs to a class.</li>
+<li>A .cpp file name, for example <i>MemoryLeakerListbox.cpp:570</i>, is displayed if the source code file is available. If the address can be matched to an exact code line, the line number is shown. Code line number is <i>???</i> if the memory address is within function memory area but does not point to a code line.</li>
+</ul><p>By double-clicking the call stack item which has known code line number opens the appropriate source code file to that code line.</p>
+
+<h5>Descriptions of icons</h5>
+<ul>
+<li>(<img src="../images/module_build.png">) Describes that the module belongs to an active/selected project and has been built with AnalyzeTool. The module can be analyzed right away.</li>
+<li>(<img src="../images/module_not_build.png">) Describes that the module belongs to an active/selected project but has not been built with AnalyzeTool. It is possible to analyze the project but it needs to be built first.</li>
+<li>(<img src="../images/module_outside.png">) Describes that the module does not belong to an active/selected project. It is some library that has been loaded but is not available in the Carbide.c++ project at the moment. You need to take additional steps (identifying component, importing to Carbide.c++, building with AnalyzeTool etc.) for being able to analyze.</li>
+</ul>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tasks/viewstatistic.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<title>Viewing AnalyzeTool memory statistic</title>
+<link href="../nokia.css" type="text/css" rel="StyleSheet">
+</head>
+<body>
+
+<h2>Viewing memory statistics</h2>
+<p>Memory usage statistics are generated automatically after the data capturing is stopped. Alternative to the data capture user can open the existing trace file to see memory statistics. For more information, see <a href="..\concepts\datafile.htm">AnalyzeTool files</a>.</p>
+<p>There are two options for opening a memory analysis data file:</p>
+<ul>
+<li>From <b>Project pop-up</b> menu, select <b>AnalyzeTool</b> > <b>Open and analyze data file</b></li>
+<li>In the <b>AnalyzeTool</b> view, select <b>Open and analyze data file</b></li>
+</ul>
+<p><b>Note!</b> The memory statistics generation must be activated from the AnalyzeTool preferences page, see <a href="../concepts/preferences.htm" >AnalyzeTool preferences</a>
+<p>The memory statistics are displayed in the <b>AnalyzeTool</b> window.</p><br>
+<img src="../images/statistic.PNG" alt="AnalyzeTool statistic tab">
+
+<h5>Description of statistics tab</h5>
+<ul>
+<li>File column: Source code file name.</li>
+<li>Function column: Function name.</li>
+<li>Line column: Source code line number.</li>
+<li>Allocations column: How many allocations match to the source code location.</li>
+<li>Time column: The last allocation time.</li>
+<li>Size column: Total size of allocations.</li>
+</ul>
+<p>User can select/change active run by using drop down list. By default the statistics information is ordered by “Allocations” column. The code line matching most allocations is topmost of the list. User can reorganize the list by clicking “Allocations”, “Time” or “Size” columns.</p>
+<p>Double-clicking the statistic item opens the appropriate source code file to that code line.</p>
+
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/tool.htm	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 1.0 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+<link href="nokia.css" type="text/css" rel="StyleSheet">
+<title>Analyze Tool</title>
+</head>
+<body>
+
+<h1>AnalyzeTool Online Help</h1>
+<p><a href="release_notes.htm">Release note</a></p>
+
+<p><a href="gettingstarted/gs_index.htm">Getting started</a></p>
+<ul>
+	<li><a href="gettingstarted/overview.htm">Overview</a></li>
+	<li><a href="gettingstarted/prerequisites.htm">Prerequisites</a></li>
+	<li><a href="gettingstarted/basic.htm">Basic walk-through</a></li>
+</ul>
+
+<p><a href="concepts/concepts.htm">Concepts</a></p>
+<ul>
+	<li><a href="concepts/preferences.htm">AnalyzeTool preferences</a></li>
+	<li><a href="concepts/advanced.htm">AnalyzeTool properties</a></li>
+	<li><a href="concepts/datafile.htm">AnalyzeTool files</a></li>
+	<li><a href="concepts/memory_leaks.htm">Memory leaks</a></li>
+	<li><a href="concepts/tracing.htm">Tracing</a></li>
+</ul>
+
+<p><a href="tasks/tasks.htm">Tasks</a></p>
+<ul>
+	<li><a href="tasks/build.htm">Building the project with AnalyzeTool</a></li>
+	<li><a href="tasks/capture.htm">Capturing trace data</a></li>
+	<li><a href="tasks/subtest.htm">Running subtests</a></li>
+	<li><a href="tasks/viewmemoryleaks.htm">Viewing memory leaks</a></li>
+	<!--<li><a href="tasks/viewstatistic.htm">Viewing memory statistics</a></li>
+	<li><a href="tasks/emulatorsupport.htm">Emulator support</a></li>-->
+	<li><a href="tasks/viewactivitygraph.htm">Viewing memory activity graph</a></li>
+</ul>
+
+<p><a href="reference/references.htm">References</a></p>
+<ul>
+	<li><a href="reference/toolbar.htm">Toolbar</a></li>
+	<li><a href="reference/troubleshooting.htm">Troubleshooting</a></li>
+</ul>
+
+<p><a href="legal.htm">Legal</a></p>
+
+<div id="footer">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+License: <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/html/toolTOC.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<!--
+	Links tool docs to main TOC for Carbide help in the defined location.
+	NOTE: Tool name seems to be ignored here for display purposes but needed to
+	make the link_to section work.
+-->
+
+<toc label="AnalyzeTool"
+	link_to="../com.nokia.carbide.help.common/carbideHelpTOC.xml#anchorCarbideFeature" >
+
+	<topic label="AnalyzeTool" href="html/tool.htm">
+		<topic label="Release note" href="html/release_notes.htm" />
+		<topic label="Getting started" href="html/gettingstarted/gs_index.htm">
+			<topic label="Overview" href="html/gettingstarted/overview.htm" />
+			<topic label="Prerequisites" href="html/gettingstarted/prerequisites.htm" />
+			<topic label="Basic walk-through" href="html/gettingstarted/basic.htm" />
+		</topic>
+
+		<topic label="Concepts" href="html/concepts/concepts.htm">
+			<topic label="AnalyzeTool preferences" href="html/concepts/preferences.htm" />
+			<topic label="AnalyzeTool properties" href="html/concepts/advanced.htm" />
+			<topic label="AnalyzeTool files" href="html/concepts/datafile.htm" />
+			<topic label="Memory leaks" href="html/concepts/memory_leaks.htm" />
+			<topic label="Tracing" href="html/concepts/tracing.htm" />
+		</topic>
+
+		<topic label="Tasks" href="html/tasks/tasks.htm">
+			<topic label="Building the project with AnalyzeTool" href="html/tasks/build.htm" />
+			<topic label="Capturing trace data" href="html/tasks/capture.htm" />
+			<topic label="Running subtests" href="html/tasks/subtest.htm" />
+			<topic label="Viewing memory leaks" href="html/tasks/viewmemoryleaks.htm" />
+		</topic>
+
+		<topic label="References" href="html/reference/references.htm">
+			<topic label="Toolbar" href="html/reference/toolbar.htm" />
+			<topic label="Troubleshooting" href="html/reference/troubleshooting.htm" />
+		</topic>
+
+		<topic label="Legal" href="html/legal.htm" />
+
+	</topic>
+
+</toc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool.help/plugin.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+	<extension point="org.eclipse.help.toc">
+		<toc
+			file="html/toolTOC.xml"
+			primary="true"/>
+	</extension>
+
+	<extension point="org.eclipse.help.contexts">
+    	<contexts file="html/contexts.xml" plugin="com.nokia.s60tools.analyzetool.help"/>
+  	</extension>
+<!-- Carbide.c++ cheatsheets extension / ADDED 02022009 -->
+
+	<extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+		<!-- <category
+			id="com.nokia.carbide.cpp.tools.cheatsheets"
+			name="Carbide.c++ Tools" /> -->
+		<cheatsheet
+			category="com.nokia.carbide.cpp.tools.cheatsheets"
+			contentFile="html/cheatsheets/getStarted_at_cs.xml"
+			composite="false"
+			id="com.nokia.s60tools.analyzetool.quickstart"
+			name="Analyze Tool Quick Start Guide"/>
+	</extension>
+
+<!-- Carbide.c++ INDEX extension / ADDED 02022009
+    <extension point="org.eclipse.help.index" >
+        <index file="html/index.xml"/>
+    </extension> -->
+
+<!-- =================================================================================== -->
+<!-- Universal Intro support for welcome pages                                           -->
+<!-- =================================================================================== -->
+	<extension
+		point="org.eclipse.ui.intro.configExtension">
+		
+		<configExtension
+			configId="org.eclipse.ui.intro.universalConfig" 
+			content="html/intro/overviewAtoolExtContent.xml" />
+		 
+		<configExtension
+			configId="org.eclipse.ui.intro.universalConfig"
+			content="html/intro/tutorialsAtoolExtContent.xml" /> 
+		 
+	</extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/.classpath	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/META-INF/MANIFEST.MF	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Carbide.c++ Extensions - AnalyzeTool
+Bundle-SymbolicName: com.nokia.s60tools.analyzetool;singleton:=true
+Bundle-Version: 1.8.0
+Bundle-Activator: com.nokia.s60tools.analyzetool.Activator
+Bundle-Vendor: Nokia
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.swt,
+ org.eclipse.cdt.core,
+ com.nokia.carbide.cdt.builder,
+ org.eclipse.jface.text,
+ org.eclipse.ui.console,
+ org.eclipse.ui.ide,
+ org.eclipse.draw2d,
+ com.nokia.carbide.cpp.project.ui,
+ com.nokia.carbide.cpp.sdk.core,
+ com.nokia.carbide.cpp.epoc.engine,
+ org.eclipse.ui.navigator,
+ org.eclipse.cdt.ui,
+ com.nokia.cdt.debug.cw.symbian,
+ com.trolltech.qtcppproject,
+ com.nokia.s60tools.util,
+ org.eclipse.gef,
+ org.eclipse.help
+Bundle-ActivationPolicy: lazy
+Eclipse-BuddyPolicy: registered
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: com.nokia.s60tools.analyzetool.engine;x-friends:="com.nokia.s60tools.analyzetool.trace",
+ com.nokia.s60tools.analyzetool.global;x-friends:="com.nokia.s60tools.analyzetool.trace",
+ com.nokia.s60tools.analyzetool.ui;x-friends:="com.nokia.s60tools.analyzetool.trace"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.html	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,918 @@
+<!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0//EN&#8221;>
+<html>
+<head>
+<title>About</title>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</head>
+<body lang=&#8221;EN-US&#8221;>
+<h2>About This Content</h2>
+ 
+<p>May 05, 2008</p>	
+
+<h3>Copyright</h3>
+
+<p>Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. This component and the accompanying materials are made available under the terms of &quot;Eclipse Public License v1.0&quot; which accompanies this distribution, and is available at the URL <a href="http://www.eclipse.org/legal/epl-v10.html">&quot;http://www.eclipse.org/legal/epl-v10.html&quot;</a>.</p>
+
+<p>This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.</p>
+
+<h3>Legal Notices</h3>
+<p>This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).</p>
+<p>Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.</p>
+
+	 
+<h4>Apache License</h4>
+<p>Apache License, Version 2.0, January 2004<br>
+<a href="http://www.apache.org/licenses/">http://www.apache.org/licenses/</a></p>
+
+<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>
+
+<p><b>1. Definitions.</b></p>
+<p>"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. </p>
+<p>"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.</p>
+<p>"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common       control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.</p>
+<p>"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.</p>
+<p>"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.</p>
+<p>"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.</p>
+<p>"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).</p>
+<p>"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.</p>
+<p>"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."</p>
+<p>"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and       subsequently incorporated within the Work.<br></p>
+
+<p><b>2. Grant of Copyright License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.<br></p>
+
+<p><b>3. Grant of Patent License.</b> Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual,       worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.<br></p>
+
+<p><b>4. Redistribution.</b> You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:</p>
+<p>(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and</p>
+<p>(b) You must cause any modified files to carry prominent notices stating that You changed the files; and</p>
+<p>(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and</p>
+<p>(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or           documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.</p>
+<p>You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.<br></p>
+
+<p><b>5. Submission of Contributions.</b> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work       by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.<br></p>
+
+<p><b>6. Trademarks.</b> This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.<br></p>
+
+<p><b>7. Disclaimer of Warranty.</b> Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.<br></p>
+
+<p><b>8. Limitation of Liability.</b> In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.<br></p>
+
+<p><b>9. Accepting Warranty or Additional Liability.</b> While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.<br></p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+<p>&nbsp;</p>
+
+
+
+<h4>gSOAP Public License</h4>
+<p> Version 1.3a</p>
+<p> The gSOAP public license is derived from the Mozilla Public License (MPL1.1). The sections that were deleted from the original MPL1.1 text are 1.0.1, 2.1.(c),(d), 2.2.(c),(d), 8.2.(b), 10, and 11. Section 3.8 was added. The modified sections are 2.1.(b), 2.2.(b), 3.2 (simplified), 3.5 (deleted the last sentence), and 3.6 (simplified).</p>
+
+<p><b>1 DEFINITIONS.</b></p>
+<p>sep 0mm </p>
+<p><b>1.0.</b></p>
+<p><b>1.1.1. "Contributor"</b></p>
+<p>means each entity that creates or contributes to the creation of Modifications.</p>
+<p><b>1.2. "Contributor Version"</b></p>
+<p>means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.</p>
+<p><b>1.3. "Covered Code"</b></p>
+<p>means the Original Code, or Modifications or the combination of the Original Code, and Modifications, in each case including portions thereof. </p>
+<p><b>1.4. "Electronic Distribution Mechanism"</b></p>
+<p>means a mechanism generally accepted in the software development community for the electronic transfer of data.</p>
+<p><b>1.5. "Executable"</b></p>
+<p>means Covered Code in any form other than Source Code.</p>
+<p><b>1.6. "Initial Developer"</b></p>
+<p>means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.</p>
+<p><b>1.7. "Larger Work"</b></p>
+<p>means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.</p>
+<p><b>1.8. "License"</b></p>
+<p>means this document.</p>
+<p><b>1.8.1. "Licensable"</b></p>
+<p> means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.</p>
+<p><b>1.9. "Modifications"</b></p>
+<p>means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:</p>
+<p>sep 0mm</p>
+<p>A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.</p>
+<p>B. Any new file that contains any part of the Original Code, or previous Modifications.</p>
+
+<p><b>1.10. "Original Code"</b></p>
+<p>means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. </p>
+<p><b>1.10.1. "Patent Claims"</b></p>
+<p>means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. </p>
+<p><b>1.11. "Source Code"</b></p>
+<p>means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.</p>
+<p><b>1.12. "You" (or "Your")</b></p>
+<p>means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.<br></p>
+
+<p><b>2 SOURCE CODE LICENSE.</b></p>
+<p>sep 0mm</p>
+<p><b>2.1. The Initial Developer Grant.</b></p>
+<p>The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: </p>
+<p>sep 0mm</p>
+<p>(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and</p>
+<p>(b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("offer to sell and import") the Original Code, Modifications, or portions thereof, but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Original Code, Modifications, or any combination or portions thereof.</p>
+<p>(c) </p>
+<p>(d) </p>
+
+<p><b>2.2. Contributor Grant.</b></p>
+<p>Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license  </p>
+<p>sep 0mm</p>
+<p>(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and</p>
+<p>(b) under patents now or hereafter owned or controlled by Contributor, to make, have made, use and sell ("offer to sell and import") the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Contributor Version (or portions thereof).</p>
+<p>(c)</p>
+<p>(d)<br></p>
+
+<p><b>3 DISTRIBUTION OBLIGATIONS.</b></p>
+<p>sep 0mm </p>
+<p><b>3.1. Application of License.</b></p>
+<p>The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.</p>
+<p><b>3.2. Availability of Source Code.</b></p>
+<p>Any Modification created by You will be provided to the Initial Developer in Source Code form and are subject to the terms of the License.</p>
+<p><b>3.3. Description of Modifications.</b></p>
+<p>You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.</p>
+<p><b>3.4. Intellectual Property Matters.</b></p>
+<p>sep 0mm</p>
+<p>(a) Third Party Claims.</p>
+<p>If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.</p>
+<p>(b) Contributor APIs.</p>
+<p>If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file.</p>
+<p>(c) Representations.</p>
+<p>Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.</p>
+<p><b>3.5. Required Notices.</b></p>
+<p>You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor.</p>
+<p><b>3.6. Distribution of Executable Versions.</b></p>
+<p>You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. If you distribute executable versions containing Covered Code as part of a product, you must reproduce the notice in Exhibit B in the documentation and/or other materials provided with the product.</p>
+<p><b>3.7. Larger Works.</b></p>
+<p>You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.</p>
+<p><b>3.8. Restrictions.</b></p>
+<p>You may not remove any product identification, copyright, proprietary notices or labels from gSOAP.<br></p>
+
+<p><b>4 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION.</b></p>
+<p>If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.<br></p>
+
+<p><b>5 APPLICATION OF THIS LICENSE.</b></p>
+<p>This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.<br></p>
+
+<p><b>6 VERSIONS OF THE LICENSE.</b></p>
+<p>sep 0mm</p>
+<p><b>6.1. New Versions.</b></p>
+<p>Grantor may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.</p>
+<p><b>6.2. Effect of New Versions.</b></p>
+<p>Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License.</p>
+<p><b>6.3. Derivative Works.</b></p>
+<p>If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrase "gSOAP" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the gSOAP Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)<br></p>
+
+<p><b>7 DISCLAIMER OF WARRANTY.</b></p>
+<p>COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, AND ANY WARRANTY THAT MAY ARISE BY REASON OF TRADE USAGE, CUSTOM, OR COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, YOU ACKNOWLEDGE THAT THE SOFTWARE IS PROVIDED "AS IS" AND THAT THE AUTHORS DO NOT WARRANT THE SOFTWARE WILL RUN UNINTERRUPTED OR ERROR FREE. LIMITED LIABILITY THE ENTIRE RISK AS TO RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. UNDER NO CIRCUMSTANCES WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND OR NATURE WHATSOEVER, WHETHER BASED ON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF THE AUTHORS HAVE BEEN ADVISED ON THE POSSIBILITY OF SUCH DAMAGE OR IF SUCH DAMAGE COULD HAVE BEEN REASONABLY FORESEEN, AND NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY EXCLUSIVE REMEDY PROVIDED. SUCH LIMITATION ON DAMAGES INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF GOODWILL, LOST PROFITS, LOSS OF DATA OR SOFTWARE, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION OR IMPAIRMENT OF OTHER GOODS. IN NO EVENT WILL THE AUTHORS BE LIABLE FOR THE COSTS OF PROCUREMENT OF SUBSTITUTE SOFTWARE OR SERVICES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT DESIGNED FOR USE IN ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS SUCH AS OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR CONTROL, OR LIFE-CRITICAL APPLICATIONS. THE AUTHORS EXPRESSLY DISCLAIM ANY LIABILITY RESULTING FROM USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS AND ACCEPTS NO LIABILITY IN RESPECT OF ANY ACTIONS OR CLAIMS BASED ON THE USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS BY YOU. FOR PURPOSES OF THIS PARAGRAPH, THE TERM "LIFE-CRITICAL APPLICATION" MEANS AN APPLICATION IN WHICH THE FUNCTIONING OR MALFUNCTIONING OF THE SOFTWARE MAY RESULT DIRECTLY OR INDIRECTLY IN PHYSICAL INJURY OR LOSS OF HUMAN LIFE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.<br></p>
+
+<p><b>8 TERMINATION.</b></p>
+<p>sep 0mm</p>
+<p><b>8.1.</b></p>
+<p>This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.</p>
+<p><b>8.2.</b></p>
+<p><b>8.3.</b></p>
+<p>If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount
+or value of any payment or license. </p>
+<p><b>8.4.</b></p>
+<p>In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.<br></p>
+
+<p><b>9 LIMITATION OF LIABILITY.</b></p>
+<p>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.<br></p>
+
+<p><b>10 U.S. GOVERNMENT END USERS.</b><br></p>
+
+<p><b>11  MISCELLANEOUS.</b><br></p>
+
+<p><b>12  RESPONSIBILITY FOR CLAIMS.</b></p>
+<p>As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.<br></p>
+
+<p>EXHIBIT A.</p>
+<p>"The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at</p>
+<p>http://www.cs.fsu.edu/~engelen/soaplicense.html</p>
+<p>Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code of the gSOAP Software is: stdsoap.h, stdsoap2.h, stdsoap.c, stdsoap2.c, stdsoap.cpp, stdsoap2.cpp, soapcpp2.h, soapcpp2.c, soapcpp2_lex.l, soapcpp2_yacc.y, error2.h, error2.c, symbol2.c, init2.c, soapdoc2.html, and soapdoc2.pdf, httpget.h, httpget.c, stl.h, stldeque.h, stllist.h, stlvector.h, stlset.h. The Initial Developer of the Original Code is Robert A. van Engelen. Portions created by Robert A. van Engelen are Copyright &copy; 2001-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. Contributor(s):</p>
+<p>"________________________." </p>
+<p>[Note: The text of this Exhibit A may differ slightly form the text of the notices in the Source Code files of the Original code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.]</p>
+<p>EXHIBIT B.</p>
+<p>"Part of the software embedded in this product is gSOAP software.</p>
+<p>Portions created by gSOAP are Copyright &copy; 2001-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved.</p>
+<p>THE SOFTWARE IN THIS PRODUCT WAS IN PART PROVIDED BY GENIVIA INC AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."</p>
+<p>&nbsp;</p>
+
+
+
+<h4>GNU GENERAL PUBLIC LICENSE</h4>
+<p>Version 3, 29 June 2007</p>
+<p>Copyright &copy; 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p>
+<p>Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<p><b><a name="preamble"></a>Preamble</b></p>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<p><b><a name="terms"></a>TERMS AND CONDITIONS</b></p>
+
+<p><b><a name="section0"></a>0. Definitions.</b></p>
+
+<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>
+
+<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+
+<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and
+&ldquo;recipients&rdquo; may be individuals or organizations.</p>
+
+<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the
+earlier work or a work &ldquo;based on&rdquo; the earlier work.</p>
+
+<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<p><b><a name="section1"></a>1. Source Code.</b></p>
+
+<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work
+for making modifications to it.  &ldquo;Object code&rdquo; means any non-source
+form of a work.</p>
+
+<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+&ldquo;Major Component&rdquo;, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<p><b><a name="section2"></a>2. Basic Permissions.</b></p>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<p><b><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</b></p>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<p><b><a name="section4"></a>4. Conveying Verbatim Copies.</b></p>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<p><b><a name="section5"></a>5. Conveying Modified Source Versions.</b></p>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    &ldquo;keep intact all notices&rdquo;.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<p><b><a name="section6"></a>6. Conveying Non-Source Forms.</b></p>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, &ldquo;normally used&rdquo; refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<p><b><a name="section7"></a>7. Additional Terms.</b></p>
+
+<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered &ldquo;further
+restrictions&rdquo; within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<p><b><a name="section8"></a>8. Termination.</b></p>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<p><b><a name="section9"></a>9. Acceptance Not Required for Having Copies.</b></p>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<p><b><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</b></p>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<p><b><a name="section11"></a>11. Patents.</b></p>
+
+<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>
+
+<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, &ldquo;control&rdquo; includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+  
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<p><b><a name="section12"></a>12. No Surrender of Others' Freedom.</b></p>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<p><b><a name="section13"></a>13. Use with the GNU Affero General Public License.</b></p>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<p><b><a name="section14"></a>14. Revised Versions of this License.</b></p>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License &ldquo;or any later version&rdquo; applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<p><b><a name="section15"></a>15. Disclaimer of Warranty.</b></p>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<p><b><a name="section16"></a>16. Limitation of Liability.</b></p>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<p><b><a name="section17"></a>17. Interpretation of Sections 15 and 16.</b></p>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<p><b><a name="howto"></a>How to Apply These Terms to Your New Programs</b></p>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the &ldquo;copyright&rdquo; line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an &ldquo;about box&rdquo;.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a &ldquo;copyright disclaimer&rdquo; for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;http://www.gnu.org/licenses/&gt;.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</p>
+<p>&nbsp;</p>
+
+
+
+<h4>addr2line notices</h4>
+<p>Copyright &copy; 1987 Regents of the University of California. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms are permitted provided that the above copyright notice and this paragraph are duplicated in all such forms and that any documentation, advertising materials, and other materials related to such distribution and use acknowledge that the software was developed by the University of California, Berkeley.  The name of the University may not be used to endorse or promote products derived from this software without specific prior written permission.</p>
+<p>THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.</p>
+
+<p>Copyright &copy; 1983, 1993, 1998 The Regents of the University of California.  All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+<li>Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+
+<p>Copyright &copy; 1997 John D. Polstra. All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol>
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+</ol>
+
+<p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
+	  
+</body></html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.ini	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+# This text is shown in Feature Details -dialog when feature is selected.
+aboutText=%productBlurb
+
+# Property "windowImage" contains path to window icon (16x16)
+# needed for primary features only
+
+# Property "featureImage" contains path to feature image (32x32)
+# Not using this in here because we do not want the icon to
+# show on about dialog. Only using aboutText above.
+#featureImage=icons/appdep.png
+
+# Property "aboutImage" contains path to product image (500x330 or 115x164)
+# needed for primary features only
+
+# Property "appName" contains name of the application (translated)
+# needed for primary features only
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.mappings	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+# The following should contain the build version.
+# e.g. "0=20020612"
+0=0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/about.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# about.properties
+# contains externalized strings for about.ini
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# fill-ins are supplied by about.mappings
+# This file should be translated.
+
+productBlurb=Carbide.c++ Extensions - AnalyzeTool \n\
+\n\
+Version: 1.8\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/build.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,14 @@
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               about.html,\
+               about.ini,\
+               about.properties,\
+               plugin.properties,\
+               license.txt,\
+               about.mappings
+javacSource=1.5
+javacTarget=1.5
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/buildAT.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.analyzetool" default="build.jars" basedir=".">
+
+	<property name="pluginVersion" value="1.8.0"/>
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+	<property name="bundleId" value="com.nokia.s60tools.analyzetool"/>
+	<property name="bundleVersion" value="${pluginVersion}"/>
+
+	<!-- Compiler settings. -->
+	<property name="javacFailOnError" value="false"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="1.5"/>
+	<property name="javacTarget" value="1.5"/>
+	<property name="carbide.plugins" location="e:/carbide_libs"/>
+	<condition property="dir_bootclasspath" value="${java.home}/../Classes">
+		<os family="mac"/>
+	</condition>
+	<property name="dir_bootclasspath" value="${java.home}/lib"/>
+	<path id="path_bootclasspath">
+		<fileset dir="${dir_bootclasspath}">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.plugins}" includes="**/*.jar" />
+	</path>
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/com.nokia.s60tools.analyzetool_${pluginVersion}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+
+	</target>
+
+	<target name="build.update.jar" depends="init" description="Build the plug-in: com.nokia.s60tools.analyzetool for an update site.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<jar destfile="${plugin.destination}/com.nokia.s60tools.analyzetool_${pluginVersion}.jar" basedir="${temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}" filesetmanifest="merge"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="@dot" depends="init" unless="@dot" description="Create jar: com.nokia.s60tools.analyzetool @dot.">
+		<delete dir="${temp.folder}/@dot.bin"/>
+		<mkdir dir="${temp.folder}/@dot.bin"/>
+		<!-- compile the source code -->
+		<javac destdir="${temp.folder}/@dot.bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}"		>
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/"			/>
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/@dot.bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/@dot.bin" failonerror="true" overwrite="false">
+			<fileset dir="src/">
+				<exclude name="**/*.java"/>
+				<exclude name="**/package.htm*"/>
+			</fileset>
+		</copy>
+		<mkdir dir="${build.result.folder}"/>
+		<copy todir="${build.result.folder}/@dot" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/@dot.bin">
+			</fileset>
+		</copy>
+		<delete dir="${temp.folder}/@dot.bin"/>
+	</target>
+
+	<target name="src.zip" depends="init" unless="src.zip">
+		<mkdir dir="${build.result.folder}"/>
+		<zip destfile="${build.result.folder}/src.zip" filesonly="false" whenempty="skip" update="false">
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</zip>
+	</target>
+
+	<target name="build.jars" depends="init" description="Compile classes and build nested jars for the plug-in: com.nokia.s60tools.analyzetool.">
+		<available property="@dot" file="${build.result.folder}/@dot"/>
+		<antcall target="@dot"/>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<available property="src.zip" file="${build.result.folder}/src.zip"/>
+		<antcall target="src.zip"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}" failonerror="true" overwrite="false">
+			<fileset dir="${build.result.folder}/@dot">
+				<include name="**"/>
+			</fileset>
+		</copy>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}" failonerror="true" overwrite="false">
+			<fileset dir="${basedir}">
+				<include name="plugin.xml"/>
+				<include name="META-INF/"/>
+				<include name="icons/"/>
+				<include name="about.html"/>
+				<include name="about.ini"/>
+				<include name="about.properties"/>
+				<include name="plugin.properties"/>
+				<include name="license.txt"/>
+				<include name="about.mappings"/>
+				<include name="tools/" />
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}"/>
+		<copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}" failonerror="false" overwrite="false"/>
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}"/>
+		<copy todir="${destination.temp.folder}/com.nokia.s60tools.analyzetool_${pluginVersion}" failonerror="false" overwrite="false">
+			<fileset dir="${temp.folder}">
+				<include name="@dot.bin${logExtension}"/>
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="clean" depends="init" description="Clean the plug-in: com.nokia.s60tools.analyzetool of all the zips, jars and logs created.">
+		<delete dir="${build.result.folder}/@dot"/>
+		<delete file="${build.result.folder}/src.zip"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.analyzetool_${pluginVersion}.jar"/>
+		<delete file="${plugin.destination}/com.nokia.s60tools.analyzetool_${pluginVersion}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+		<eclipse.convertPath fileSystemPath="C:/PlatformRnDTools/Carbide_Extensions/AnalyzeTool/trunk/com.nokia.s60tools.analyzetool" property="resourcePath"/>
+		<eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: com.nokia.s60tools.analyzetool.">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}">
+				<include name="**/*.bin${logExtension}"/>
+			</fileset>
+		</delete>
+		<zip destfile="${plugin.destination}/com.nokia.s60tools.analyzetool_${pluginVersion}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/ccbuild.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.analyzetool" default="cc" basedir=".">
+
+	<target name="cc" depends="clean-test,jar, instr, feature, analyze, test, zip" description="Build, instrument, run unit tests and analyze code"/>
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	
+	<property name="help.project.name" value="${ant.project.name}.help"/>
+	<property name="trace.project.name" value="${ant.project.name}.trace"/>
+	<property name="feature.project.folder" location="../com.nokia.carbide.extensions.analyzetool"/>
+	<property name="feature.project.name" value="com.nokia.carbide.extensions.analyzetool"/>
+	<property name="feature.name" value="AnalyzeTool"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	<property name="trace.jar.filename" value="${trace.project.name}.jar"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.dev.folder" location="c:/Carbide_development/plugins"/>
+	<property name="carbide.int.folder" location="c:/Carbide_internal/plugins"/>
+	<property name="carbide.adt.folder" location="c:/Carbide_ADT/plugins"/>
+	<property name="test.folder" location="../com.nokia.s60tools.analyzetool.tests"/>
+	
+	<property name="binaries.folder" location="../${feature.name}.binaries"/>	
+	<property name="reports.folder" location="../reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="../instr"/>
+	
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.lib" >
+    	<pathelement location="${ant.home}/lib/pmd-4.2.5.jar" />
+    	<pathelement location="${ant.home}/lib/asm-3.1.jar" />
+    	<pathelement location="${ant.home}/lib/jaxen-1.1.1.jar" />
+  	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.lib" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.int.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+
+		<delete dir="${temp.folder}/bin"/>
+		<mkdir dir="${temp.folder}/bin"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+		
+		<delete dir="../features"/>
+		<mkdir dir="../features"/>
+		
+		<delete dir="../plugins"/>
+		<mkdir dir="../plugins"/>
+		
+		<exec executable="svn" dir="../.">
+			<arg line="up"/>
+		</exec>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="${temp.folder}/bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<src path="../com.nokia.s60tools.analyzetool.trace/src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/bin" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+		<!-- Copy classes from the temporary folder to bin -->
+		<copy todir="${build.result.folder}" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/bin" />
+		</copy>
+		
+		<!-- Delete temporary folder -->
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	
+	<!-- JAR target -->
+	<target name="jar" depends="build" description="Create JAR">
+		<!-- Create JAR -->
+		
+		<delete dir="binaries"/>
+		<mkdir dir="binaries"/>
+		<delete dir="binaries_trace/com/nokia/s60tools/analyzetool/trace"/>
+		<mkdir dir="binaries_trace/com/nokia/s60tools/analyzetool/trace"/>
+		
+		<copy todir="binaries" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}" />
+		</copy>
+		
+		<copy todir="binaries_trace/com/nokia/s60tools/analyzetool/trace" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}/com/nokia/s60tools/analyzetool/trace" />
+		</copy>
+		
+		<!--<mkdir dir="${published.plugins.folder}"/>-->
+		<echo message="Copying files to binaries"/>
+		<copy todir="binaries" failonerror="true" overwrite="false">
+				<fileset dir="${build.result.folder}">
+    					<include name="META-INF/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="icons/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="about.ini"/>
+					    <include name="about.properties"/>
+					    <include name="plugin.properties"/>
+					    <include name="license.txt"/>
+					    <include name="about.mappings"/>
+				</fileset>
+		</copy>
+
+		<copy todir="binaries_trace" failonerror="true" overwrite="false">
+				<fileset dir="../com.nokia.s60tools.analyzetool.trace" >
+							<include name="META-INF/**"/>
+					    <include name="plugin.xml"/>
+					    <include name="about.html"/>
+					    <include name="license.txt"/>
+				</fileset>
+		</copy>
+
+		<echo message="Creating ${jar.filename}..."/>
+		<zip destfile="${binaries.folder}/${jar.filename}" basedir="binaries" />
+		<zip destfile="${binaries.folder}/${trace.jar.filename}" basedir="binaries_trace" />
+		
+		<delete>
+			<fileset dir="binaries"/>
+			<fileset dir="binaries_trace"/>
+			<fileset dir="com"/>
+		</delete>
+		
+	</target>
+	
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${binaries.folder}/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+			<instr instrpath="${binaries.folder}/${trace.jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+
+	<!-- Feature target -->
+	<target name="feature" depends="jar" description="Create feature">
+		<property name="feature.folder" location="${binaries.folder}/feature"/>
+		
+		<mkdir dir="${feature.folder}"/>
+		<mkdir dir="${feature.folder}/plugins/com.nokia.s60tools.analyzetool.corecomponents"/>
+		<mkdir dir="${feature.folder}/features/${feature.project.name}"/>
+		<mkdir dir="${binaries.folder}/nightly_builds"/>
+				
+		<!-- Create help JAR -->
+		<zip destfile="../plugins/${help.jar.filename}" basedir="../${help.project.name}" excludes="src/,.*"/>
+		
+		<!-- Copy feature stuff to the temp folder -->
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/feature.xml"/>
+		<copy todir="${feature.folder}/features/${feature.project.name}" file="${feature.project.folder}/license.txt"/>
+		
+		<!-- Copy the actual plug-in to the temp folder -->
+		<copy todir="../plugins" file="${binaries.folder}/${jar.filename}"/>
+		<copy todir="../plugins" file="${binaries.folder}/${trace.jar.filename}"/>
+		<copy todir="../plugins/com.nokia.s60tools.analyzetool.corecomponents"> 
+				<fileset dir="../com.nokia.s60tools.analyzetool.corecomponents">
+							<include name="META-INF/**"/>
+					    <include name="atool.exe"/>
+					    <include name="xerces-c_2_7.dll"/>
+					    <include name="license.txt"/>
+					    <include name="about.html"/>
+					    <include name="atool_gsoap_src.zip"/>
+					    <include name="AToolManageHTI.dll"/>
+					    <include name="addr2line.exe"/>
+					    <include name="binutils-2.19.1-src.zip"/>
+			 </fileset>			
+		</copy>
+		
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}"/>
+		</exec>
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.help"/>
+		</exec>	
+		<exec dir="../" executable="bash" resolveexecutable="true" failonerror="true"> 
+				<arg value="-c"/>
+				<arg value="C:\\hudson\\jobs\\setPluginVersion.sh ${ant.project.name}.trace"/>
+		</exec>	
+		
+		<!-- Copy the actual plug-in to the feature folder -->
+		<copy todir="${feature.folder}/plugins">
+			<fileset dir="../plugins"/>
+		</copy>
+		
+		
+			<!-- Copy the actual plug-ins to the carbide folders -->
+		<copy todir="${carbide.int.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		<copy todir="${carbide.dev.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		<copy todir="${carbide.adt.folder}" failonerror="true" overwrite="true">
+				<fileset dir="${feature.folder}/plugins"/>
+		</copy>
+		
+	</target>
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			<ruleset>junit</ruleset>
+			<ruleset>unusedcode</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="../com.nokia.s60tools.analyzetool.tests/src/">
+				<include name="**/*.java"/>
+			</fileset>
+			<fileset dir="../com.nokia.s60tools.analyzetool.trace/src/">
+				<include name="**/*.java"/>
+			</fileset>
+			
+		</pmd>
+	</target>
+	
+	<!-- Clean target -->
+	<target name="clean" description="Clean" depends="clean-test">
+		<delete dir="binaries"/>
+	</target>
+	
+	<!-- Clean tests target -->
+  	<target name="clean-test" description="Clean test">
+
+			<delete>
+      		<fileset dir="${test.folder}" includes="**/*.class" />
+      </delete>
+    	<delete dir="temp.folder"/>
+    	<delete dir="com"/>
+    	<delete dir="bin"/>
+    	<delete dir="binaries"/>
+    	<delete dir="binaries_trace"/>
+    	<delete dir="instr"/>
+  	</target>
+  	
+  		<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<fileset dir="${carbide.adt.folder}" includes="**/*.jar" />
+		   	
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+		
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" fork="yes" haltonfailure="yes">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    	<jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.analyzetool.tests.AllPureJUnitTests" todir="${reports.folder}"/>
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<xml outfile="${reports.emma}/coverage.xml" />
+        	</report>
+	    </emma>
+	</target>
+	
+	<target name="zip">
+	
+		<!-- Create the feature zip -->
+		<zip destfile="${binaries.folder}/${feature.name}.zip" basedir="${feature.folder}"/>
+		
+		<deltree dir="${feature.folder}"/>
+		
+		<!-- Nightly build -->
+		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp>
+
+		<delete dir="${binaries.folder}/nightly_builds"/>
+  	<mkdir dir="${binaries.folder}/nightly_builds"/>
+
+		<copy tofile="${binaries.folder}/nightly_builds/${feature.name}-${timestamp}.zip" file="${binaries.folder}/${feature.name}.zip"/>
+	</target>
+  
+	
+</project>
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/analyzetool.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_ask.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build_active.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_build_passive.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_cellular.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_clear.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_computer.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_all.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_known.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_details_topmost.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_fast.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_open.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_record.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_save.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_start_subtest.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_stop_subtest.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/btn_terminate.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/error.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/linkto_help.gif has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_build.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_not_build.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/module_outside.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/open_prefs.png has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/properties.gif has changed
Binary file sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/icons/propview.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/javadoc.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project default="javadoc">
+    <target name="javadoc">
+        <javadoc access="public" author="true" classpath="C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.jface_3.4.0.I20080606-1300.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.jobs_3.4.0.v20080512.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.ide_3.4.0.I20080606-1300.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\com.nokia.carbide.cpp.project.ui_2.0.0.007.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.workbench_3.4.0.I20080606-1300.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.equinox.preferences_3.2.200.v20080421-2006.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.resources_3.4.0.v20080604-1400.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.cdt.core_5.0.1.007.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.swt.win32.win32.x86_3.4.0.v3448f.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.console_3.3.0.v20080529-1300.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.equinox.common_3.4.0.v20080421-2006.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.navigator_3.3.100.I20080606-1300.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.editors_3.4.0.v20080603-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.osgi_3.4.0.v20080605-1900.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.contenttype_3.3.0.v20080604-1400.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.equinox.registry_3.4.0.v20080516-0950.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.runtime.compatibility.registry_3.2.200.v20080610\runtime_registry_compatibility.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.equinox.app_1.1.0.v20080421-2006.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui_3.4.0.I20080610-1200.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.runtime_3.4.0.v20080512.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.filebuffers_3.4.0.v20080603-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.core.commands_3.4.0.I20080509-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.views_3.3.0.I20080509-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.swt_3.4.0.v3448f.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.draw2d_3.4.0.v20080529.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.ui.workbench.texteditor_3.4.0.v20080603-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.text_3.4.0.v20080605-1800.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\com.nokia.carbide.cpp.epoc.engine_2.0.0.007.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\com.nokia.carbide.cpp.sdk.core_2.0.0.007\sdkCorePlugin.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.cdt.ui_5.0.1.007.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\com.nokia.carbide.cdt.builder_2.0.0.007.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.jface.text_3.4.0.v20080603-2000.jar;C:\Program Files\Nokia\Carbide.c++ v2.0\plugins\org.eclipse.cdt.make.core_5.0.1.007.jar" destdir="doc" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" packagenames="com.nokia.s60tools.analyzetool.global,com.nokia.s60tools.analyzetool.ui,com.nokia.s60tools.analyzetool,com.nokia.s60tools.analyzetool.builder,com.nokia.s60tools.analyzetool.engine,com.nokia.s60tools.analyzetool.preferences" source="1.5" sourcepath="src" splitindex="true" use="true" version="true"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/license.txt	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,923 @@
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0"
+which accompanies this distribution, and is available at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+This Nokia Product includes Open Source Software. Certain software included in this Nokia Product is licensed and distributed under licenses containing obligation or permission to provide the source code of such software with the binary / executable form delivery of the said software. The source code is delivered to you in accordance with the referred license terms and conditions in the media attached to this document. The exact license terms, as well as the required copyright and other notices, permissions and acknowledgements are reproduced in and delivered to you as part of the referred source code.
+
+This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+
+	 
+
+The Apache Software License, Version 2.0
+http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+--------------------------------------------------------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+--------------------------------------------------------------------------
+
+addr2line notices
+Copyright (c) 1983, 1993, 1998
+The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+----
+
+Copyright (c) 1997 John D. Polstra.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+ 
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/plugin.properties	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# plugin.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# Plugin properties for Analyze Tool
+# This file should be translated.
+productBlurb=Carbide.c++ Extensions - Analyze Tool \n\
+\n\
+Version: 1.5\n\
+Build id: {0}\n\
+\n\
+\n\
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n\
+All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/plugin.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="AnalyzeTool" name="AnalyzeTool" schema="schema/com.nokia.s60tools.analyzetool.schema.exsd"/>
+   <extension point="org.eclipse.ui.popupMenus">
+      <objectContribution adaptable="true"
+            			  objectClass="org.eclipse.core.resources.IProject"
+            			  id="com.nokia.s60tools.analyzetool.contribution">
+		<menu
+               label="AnalyzeTool"
+               path="additions"
+               id="com.nokia.s60tools.analyzetool.menu">
+            <separator
+                  name="submenu">
+            </separator>
+
+        </menu>
+    	<action
+               label="Clean AnalyzeTool changes"
+               class="com.nokia.s60tools.analyzetool.ui.actions.ClearAtoolChanges"
+               menubarPath="com.nokia.s60tools.analyzetool.menu/submenu"
+               enablesFor="1"
+               id="com.nokia.s60tools.analyzetool.ui.actions.ClearAtoolChanges"
+               tooltip="Clean AnalyzeTool changes">
+
+        </action>
+        <action
+               label="Open and analyze data file"
+               class="com.nokia.s60tools.analyzetool.ui.actions.ViewMemoryLeakFromFile"
+               menubarPath="com.nokia.s60tools.analyzetool.menu/submenu"
+               enablesFor="1"
+               id="com.nokia.s60tools.analyzetool.ui.actions.ViewMemoryLeakFromFile"
+               tooltip="Open and analyze data file">
+        </action>
+        <action
+               label="Activate AnalyzeTool build"
+               class="com.nokia.s60tools.analyzetool.ui.actions.CompileWithAtool"
+               menubarPath="com.nokia.s60tools.analyzetool.menu/submenu"
+               enablesFor="1"
+               id="com.nokia.s60tools.analyzetool.ui.actions.CompileWithAtool"
+               tooltip="Activate AnalyzeTool build">
+        </action>
+        <filter
+              name="projectNature"
+              value="com.nokia.carbide.cdt.builder.carbideCPPBuilderNature"/>
+
+
+      </objectContribution>
+  </extension>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+      		adaptable="true"
+            objectClass="org.eclipse.core.resources.IFile"
+            id="com.nokia.s60tools.analyzetool.ui.actions.CompileSymbianComponent">
+             <visibility>
+              <and>
+                 <objectState
+                    name="projectNature"
+                    value="com.nokia.carbide.cdt.builder.carbideCPPBuilderNature"/>
+                  <or>
+                    <objectState
+                       name="extension"
+                       value="mk"
+                       />
+                    <objectState
+                        name="extension"
+                        value="mmp"
+                        />
+                  </or>
+              </and>
+            </visibility>
+            <menu
+               label="AnalyzeTool"
+               path="additions"
+               id="com.nokia.s60tools.analyzetool.menu1">
+            <separator
+                  name="submenu">
+            </separator>
+
+        </menu>
+          <action
+               label="Instrument and build with AnalyzeTool"
+               class="com.nokia.s60tools.analyzetool.ui.actions.CompileSymbianComponent"
+               menubarPath="com.nokia.s60tools.analyzetool.menu1/submen"
+               enablesFor="+"
+                definitionId="com.nokia.s60tools.analyzetool.ui.actions.CompileSymbianComponent"
+               id="com.nokia.s60tools.analyzetool.ui.actions.CompileSymbianComponent"
+               tooltip="Instrument and build with AnalyzeTool">
+         </action>
+      </objectContribution>
+   </extension>
+   <extension
+       point="org.eclipse.ui.views">
+    <category
+          id="com.nokia.s60tools"
+          name="Carbide Extensions">
+    </category>
+    <view
+          category="com.nokia.s60tools"
+          class="com.nokia.s60tools.analyzetool.ui.MainView"
+          icon="icons/analyzetool.png"
+          id="com.nokia.s60tools.analyzetool.ui.MainView"
+          name="AnalyzeTool">
+    </view>
+ </extension>
+  <extension
+       point="org.eclipse.ui.preferencePages">
+    <page
+          class="com.nokia.s60tools.analyzetool.preferences.AnalyzeToolPreferencePage"
+          id="com.nokia.s60tools.analyzetool.preferences.AnalyzeToolPreferencePage"
+          name="AnalyzeTool"
+          category="com.nokia.carbide.cpp.preferences.ExtensionsPreferencesPage">
+    </page>
+    <page
+          class="com.nokia.s60tools.analyzetool.preferences.AdvancedPreferencePage"
+          id="com.nokia.s60tools.analyzetool.preferences.AdvancedPreferencePage"
+          name="Advanced"
+          category="com.nokia.s60tools.analyzetool.preferences.AnalyzeToolPreferencePage">
+    </page>
+ </extension>
+ <extension
+       point="org.eclipse.core.runtime.preferences">
+    <initializer
+          class="com.nokia.s60tools.analyzetool.preferences.PreferenceInitializer">
+    </initializer>
+ </extension>
+  <extension
+          point="org.eclipse.ui.actionSets">
+      <actionSet
+      description="1"
+            id="com.nokia.s60tools.analyzetool.actionSet"
+            label="AnalyzeTool"
+            visible="true">
+         <action
+               class="com.nokia.s60tools.analyzetool.ui.actions.ActivateMainView"
+               icon="icons/analyzetool.png"
+               id="com.nokia.s60tools.analyzetool.ui.actions.ActivateMainView"
+               label="AnalyzeTool"
+               menubarPath="com.nokia.carbide.cpp.ui.CarbideMenu/CarbideExtensions"
+               tooltip="1">
+         </action>
+         <menu
+         		id="com.nokia.carbide.cpp.ui.CarbideMenu"
+       			label="&amp;Carbide"
+       			path="additions">
+       			<groupMarker name="additions"/>
+       	</menu>
+       	</actionSet>
+       </extension>
+  <extension
+      point="org.eclipse.core.runtime.products"
+      id="product">
+      <product name="AnalyzeTool" application="org.eclipse.ui.ide.workbench" >
+          <property name="appName" value="Carbide.c++ Extensions - AnalyzeTool"/>
+     </product>
+   </extension>
+ 	<extension
+         id="analyzeToolPreBuilder"
+         name="AnalyzeTool Pre-Builder"
+         point="org.eclipse.core.resources.builders">
+      <builder
+            hasNature="true">
+         <run
+               class="com.nokia.s60tools.analyzetool.builder.CustomPreBuilder">
+         </run>
+      </builder>
+   </extension>
+
+   <extension
+         id="preNature"
+         name="AnalyzeTool Custom Build Pre Nature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="com.nokia.s60tools.analyzetool.builder.PreNature">
+         </run>
+      </runtime>
+      <builder
+            id="com.nokia.s60tools.analyzetool.analyzeToolPreBuilder">
+      </builder>
+   </extension>
+
+   <extension
+         id="analyzeToolPostBuilder"
+         name="AnalyzeTool Post-Builder"
+         point="org.eclipse.core.resources.builders">
+      <builder
+             hasNature="true">
+         <run
+               class="com.nokia.s60tools.analyzetool.builder.CustomPostBuilder">
+         </run>
+      </builder>
+   </extension>
+
+    <extension
+         id="postNature"
+         name="AnalyzeTool Custom Build Post Nature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="com.nokia.s60tools.analyzetool.builder.PostNature">
+         </run>
+      </runtime>
+      <builder
+            id="com.nokia.s60tools.analyzetool.analyzeToolPostBuilder">
+      </builder>
+
+   </extension>
+
+  <extension
+         point="org.eclipse.ui.startup">
+      <startup class="com.nokia.s60tools.analyzetool.ActivateTrace"/>
+   </extension>
+  <extension
+        point="org.eclipse.ui.propertyPages">
+     <page
+           category="com.nokia.carbide.cpp.preferences.ExtensionsPropertiesPage"
+           class="com.nokia.s60tools.analyzetool.properties.PropertiesPage"
+           id="com.nokia.s60tools.analyzetool.properties.PropertiesPage"
+           name="AnalyzeTool"
+           objectClass="org.eclipse.core.resources.IProject">
+           >
+     </page>
+  </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/runTest.xml	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="com.nokia.s60tools.analyzetool" default="test" basedir=".">
+
+	<property name="basews" value="${ws}"/>
+	<property name="baseos" value="${os}"/>
+	<property name="basearch" value="${arch}"/>
+	<property name="basenl" value="${nl}"/>
+
+	<!-- Compiler settings -->
+	<property name="javacFailOnError" value="true"/>
+	<property name="javacDebugInfo" value="on"/>
+	<property name="javacVerbose" value="false"/>
+	<property name="logExtension" value=".log"/>
+	<property name="compilerArg" value=""/>
+	<property name="javacSource" value="5"/>
+	<property name="javacTarget" value="5"/>
+	
+	<property name="bootclasspath" refid="path_bootclasspath"/>
+	<property name="bundleJavacSource" value="${javacSource}"/>
+	<property name="bundleJavacTarget" value="${javacTarget}"/>
+	<property name="bundleBootClasspath" value="${bootclasspath}"/>
+	
+	<property name="help.project.name" value="${ant.project.name}.help"/>
+	<property name="feature.project.folder" location="../com.nokia.carbide.extensions.analyzetool"/>
+	<property name="feature.name" value="AnalyzeTool"/>
+	
+	<property name="jar.filename" value="${ant.project.name}.jar"/>
+	<property name="help.jar.filename" value="${help.project.name}.jar"/>
+	
+	<!-- Folder definitions -->
+	<property name="carbide.folder" location="C:/PlatformRnDTools/Carbide_Extensions/AnalyzeTool/carbide_libs"/>
+	<property name="test.folder" location="../com.nokia.s60tools.analyzetool.tests"/>
+	<property name="dist.folder" location="../AnalyzeTool.binaries"/>
+	
+	<property name="reports.folder" location="reports"/>
+	<property name="reports.emma" location="${reports.folder}/emma"/>
+	<property name="instr.folder" location="instr"/>
+	<property name="pmd.folder" location="/pmd-4.2.2"/>
+	
+	<!-- EMMA configuration -->
+ 	<path id="emma.lib" >
+    	<pathelement location="${ant.home}/lib/emma.jar" />
+    	<pathelement location="${ant.home}/lib/emma_ant.jar" />
+  	</path>
+
+  	<taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+	
+	<!-- PMD configuration -->
+	<path id="pmd.classpath">
+		<pathelement location="${build}"/>
+		<fileset dir="${pmd.folder}/lib/">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath" />
+	
+	<path id="path_bootclasspath">
+		<fileset dir="${java.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="build_classpath">
+		<path refid="carbide_classpath"/>
+	</path>
+	
+	<path id="carbide_classpath">
+		<fileset dir="${carbide.folder}" includes="**/*.jar" />
+	</path>
+	
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<!-- Initialization -->
+	<target name="init" depends="properties">
+		<condition property="pluginTemp" value="${buildTempFolder}/plugins">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="pluginTemp" value="${basedir}"/>
+		<condition property="build.result.folder" value="${pluginTemp}/${ant.project.name}">
+			<isset property="buildTempFolder"/>
+		</condition>
+		<property name="build.result.folder" value="${basedir}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+
+		<property name="jar.filename" value="${ant.project.name}.jar"/>
+		
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+
+		<delete dir="${temp.folder}/bin"/>
+		<mkdir dir="${temp.folder}/bin"/>
+		
+		<delete dir="${reports.folder}"/>
+		<mkdir dir="${reports.folder}"/>
+	</target>
+
+	<!-- Build target -->
+	<target name="build" depends="init" description="Build the source">
+		<!-- Build the source -->
+		<javac destdir="${temp.folder}/bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}">
+			<compilerarg line="${compilerArg}" compiler="${build.compiler}"/>
+			<classpath refid="build_classpath" />
+			<src path="src/" />
+			<compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+			<compilerarg line="-log '${temp.folder}/bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+		</javac>
+
+		<!-- Copy necessary resources -->
+		<copy todir="${temp.folder}/bin" failonerror="true" overwrite="false">
+			<fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+		</copy>
+
+		<!-- Create build result folder -->
+		<mkdir dir="${build.result.folder}"/>
+
+		<!-- Copy classes from the temporary folder to bin -->
+		<copy todir="${build.result.folder}/bin" failonerror="true" overwrite="false">
+			<fileset dir="${temp.folder}/bin" />
+		</copy>
+		
+		<!-- Delete temporary folder -->
+		<delete dir="${temp.folder}/bin"/>
+	</target>
+	
+	<!-- Clean target -->
+	<target name="clean" description="Clean" depends="clean-test">
+		<delete dir="${build.result.folder}/bin" />
+		<delete>
+			<fileset dir="${dist.folder}" includes="*.jar"/>
+		</delete>
+	</target>
+	
+	<!-- Analyze target -->
+	<target name="analyze">
+		<!-- PMD -->
+		<pmd>
+			<!-- Rules -->
+			<ruleset>basic</ruleset>
+			<ruleset>codesize</ruleset>
+			<ruleset>coupling</ruleset>
+			<ruleset>design</ruleset>
+			<ruleset>strictexception</ruleset>
+			<ruleset>strings</ruleset>
+			<ruleset>sunsecure</ruleset>
+			
+			<!-- XML output -->
+			<formatter type="xml" toFile="${reports.folder}/report.pmd.xml"/>
+			
+			<!-- Files to analyze -->
+			<fileset dir="src/">
+				<include name="**/*.java"/>
+			</fileset>
+		</pmd>
+	</target>
+	
+	<!-- Instrumentation target, depends on JAR -->
+	<target name="instr" depends="jar">
+		<!-- Instrument the source code -->
+		<emma>
+			<instr instrpath="${temp.folder}/${jar.filename}" destdir="${instr.folder}" metadatafile="${reports.emma}/metadata.emma" merge="true"/>
+		</emma>
+	</target>
+	
+	<!-- JAR target -->
+	<target name="jar" depends="build" description="Create JAR">
+		<!-- Create JAR -->
+		<jar destfile="${temp.folder}/${jar.filename}" basedir="${build.result.folder}/bin" />
+	</target>
+
+	<!-- Feature target -->
+	<target name="feature" depends="jar" description="Create feature">
+		<property name="feature.folder" location="${dist.folder}/feature"/>
+		
+		<mkdir dir="${feature.folder}"/>
+		<mkdir dir="${feature.folder}/plugins"/>
+		<mkdir dir="${feature.folder}/features"/>
+				
+		<!-- Create help JAR -->
+		<jar destfile="${feature.folder}/plugins/${help.jar.filename}" basedir="../${help.project.name}" excludes="src/,.*"/>
+		
+		<!-- Copy feature stuff to the temp folder -->
+		<copy todir="${feature.folder}/features" file="${feature.project.folder}/feature.xml"/>
+		<copy todir="${feature.folder}/features" file="${feature.project.folder}/license.txt"/>
+		
+		<!-- Copy the actual plug-in to the temp folder -->
+		<copy todir="${feature.folder}/plugins" file="${dist.folder}/${jar.filename}"/>
+		
+		<!-- Create the feature zip -->
+		<zip destfile="${dist.folder}/${feature.name}.zip" basedir="${feature.folder}"/>
+		
+		<deltree dir="${feature.folder}"/>
+
+		<!-- Nightly build -->
+		<tstamp>
+		   <format property="timestamp" pattern="dd-MM-yyyy" />
+		</tstamp>
+
+		<copy tofile="../../nightly_builds/${feature.name}/${feature.name}-${timestamp}.zip" file="${dist.folder}/${feature.name}.zip"/>
+	</target>
+	
+	
+	<!-- Clean tests target -->
+  	<target name="clean-test" description="Clean test">
+    	<delete>
+      		<fileset dir="${test.folder}" includes="**/*.class" />
+    	</delete>
+    	<delete dir="${instr.folder}"/>
+    	<delete dir="${reports.folder}"/>
+  	</target>
+  
+  	<!-- Test target, depends on instrumentation and analyze -->
+	<target name="test" depends="instr" description="Run unit tests">
+    	<!-- Test classpath -->
+    	<path id="test_classpath">
+			<!-- Test classes -->
+			<pathelement location="${test.folder}/src"/>
+			
+			<!-- Instrumented class files -->
+		   	<pathelement location="${instr.folder}"/>
+		   	
+    		<!-- Normal class files -->
+    		<pathelement path="${dist.folder}/${jar.filename}"/>
+    		
+		   	<!-- EMMA -->
+		   	<pathelement path="${ant.home}/lib/emma.jar"/>
+		   	
+		   	<path refid="build_classpath" />
+		</path>
+	
+		<!-- Compile the tests -->
+     	<javac srcdir="${test.folder}" verbose="${javacVerbose}">
+      		<classpath refid="test_classpath"/>
+	    </javac>
+		
+		<!-- Run JUnit -->
+	    <junit printsummary="yes" haltonfailure="yes">
+	      	<classpath refid="test_classpath" />
+	      	
+	      	<!-- Plain format and XML -->
+	      	<formatter type="plain" />
+	      	<formatter type="xml" />
+			
+			<!-- Instrumentation arguments to JVM -->
+			<jvmarg value="-Demma.coverage.out.file=${reports.emma}/coverage.emma" />
+	    	<jvmarg value="-Demma.coverage.out.merge=true" />
+
+			<!-- Test classes -->
+	      	<test name="com.nokia.s60tools.analyzetool.tests.AllTests" todir="${reports.folder}"/>
+	    </junit>
+	    
+	    <!-- Create EMMA report -->
+	    <emma>
+	    	<report sourcepath="src/" >
+            	<fileset dir="${reports.emma}" >
+                	<include name="*.emma" />
+            	</fileset>
+            	<html outfile="${reports.emma}/coverage.html" />
+        	</report>
+	    </emma>
+	</target>
+	
+	<target name="cc" depends="test, analyze, feature" description="Build, instrument, run unit tests and analyze code"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/schema/com.nokia.s60tools.analyzetool.schema.exsd	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,87 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="com.nokia.s60tools.analyzetool">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="com.nokia.s60tools.analyzetool" id="com.nokia.s60tools.analyzetool.schema" name="AnalyzeTool"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ActivateTrace.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,83 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Definitions for the class ActivateTrace
+ *
+*/
+
+
+package com.nokia.s60tools.analyzetool;
+
+import org.eclipse.ui.IStartup;
+import org.eclipse.core.runtime.*;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+import com.nokia.s60tools.analyzetool.ui.MainView;
+
+/**
+ * Checks at plugin startup is trace plugin available
+ * and sets MainView trace actions state
+ * @author kihe
+ *
+ */
+public class ActivateTrace implements IStartup {
+
+	/**
+	 * Check is AnalyzeTool trace plugin registered.
+	 *
+	 * If not registered disables AnalyzeTool trace buttons.
+	 *
+	 * @see org.eclipse.ui.IStartup#earlyStartup()
+	 */
+	public final void earlyStartup() {
+
+		//get action listener
+		final IActionListener listener = Activator.getActionListener();
+
+		//get extension registry
+		IExtensionRegistry registry = RegistryFactory.getRegistry();
+		if( registry == null ) {
+			MainView.enableTrace = false;
+			if(listener != null) {
+				listener.disableTraceActions(false);
+			}
+			return;
+		}
+
+		//get analyzetool extension
+		final IExtensionPoint extensionPoint = registry.getExtensionPoint("com.nokia.s60tools.analyzetool.AnalyzeTool");
+
+		//try find analyzetool trace extension
+		IExtension extension = null;
+		if( extensionPoint != null ) {
+			extension = extensionPoint.getExtension("com.nokia.s60tools.analyzetool.trace.ActivateTrace");
+		}
+
+
+
+		//if trace extension found => enable trace buttons in the MainView
+		if(extension != null && extension.isValid()) {
+			MainView.enableTrace = true;
+			if(listener != null) {
+				listener.disableTraceActions(true);
+			}
+		}
+		//no trace extension found => disable trace buttons
+		else {
+			MainView.enableTrace = false;
+			if(listener != null) {
+				listener.disableTraceActions(false);
+			}
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/Activator.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class Activator
+ *
+ */
+
+package com.nokia.s60tools.analyzetool;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+
+/**
+ * @author kihe The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+    /** The plug-in ID. */
+	public static final String PLUGIN_ID = Constants.PLUGINID;
+
+	/** The shared instance. */
+	private static Activator plugin;
+
+	/** Preference store. */
+	private static IPreferenceStore preferenceStore;
+
+	/** Action listener. */
+	private static IActionListener actionListener = null;
+
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public final void start(final BundleContext context) {
+		try {
+			super.start(context);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public final void stop(final BundleContext context) {
+		try {
+			plugin = null;
+			super.stop(context);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Returns the shared instance.
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path.
+	 *
+	 * @param path
+	 *            the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(final String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+
+	/**
+	 * Returns AnalyzeTool used preference store.
+	 *
+	 * @return Preference store
+	 */
+	public static IPreferenceStore getPreferences() {
+
+		// if preference store not yet created => create it
+		if (preferenceStore == null) {
+			preferenceStore = getDefault().getPreferenceStore();
+		}
+
+		return preferenceStore;
+	}
+
+	/**
+	 * Add action listener class.
+	 *
+	 * @param listener
+	 *            Action listener
+	 */
+	public static void setActionListener(final IActionListener listener) {
+		actionListener = listener;
+	}
+
+	/**
+	 * Gets action listener.
+	 *
+	 * @return ActionListener Action listener
+	 */
+	public static IActionListener getActionListener() {
+		return actionListener;
+	}
+
+	/**
+	 * Returns a File corresponding to the given bundle relative path.
+	 * @param path the bundle relative path to resource to locate
+	 * @return the File corresponding to the given bundle relative path, or null
+	 * @throws IOException
+	 */
+	public File locateFileInBundle(final String path) throws IOException {
+		Bundle myBundle= getDefault().getBundle();
+		IPath ppath= new Path(path);
+		ppath= ppath.makeRelative();
+		URL[] urls= FileLocator.findEntries(myBundle, ppath);
+		if(urls.length != 1) {
+			return null;
+		}
+		return new File(FileLocator.toFileURL(urls[0]).getFile());
+	}
+
+	/**
+	 * Logs information to the eclipse .log file
+	 * @param severity Message severity
+	 * @param code Message code
+	 * @param message Message content
+	 */
+	public void logInfo(int severity, int code, String message) {
+		IStatus status = new Status(severity, PLUGIN_ID, code, message, (Throwable) null);
+		getDefault().getLog().log(status);
+	}
+	/**
+	 * Logs the given message with the given severity and the given exception to
+	 * this plug-in's log.
+	 * @param aSeverity
+	 *            the severity; one of the <strong>IStatus</strong> severity
+	 *            constants: OK, ERROR, INFO, WARNING, or CANCEL
+	 * @param aMessage
+	 *            a human-readable message, localised to the current locale
+	 * @param aException
+	 *            a low-level exception, or null if not applicable
+	 */
+	public void log(final int aSeverity, final String aMessage,
+			        final Exception aException)
+	{
+		getLog().log(new Status(aSeverity, PLUGIN_ID, IStatus.OK, aMessage, aException));
+	}
+	
+	/**
+	 * Creates and returns an Image for the file at the given plug-in relative
+	 * path. The Image is cached in the #ImageRegistry.
+	 * @param aPath the plug-in relative path to the image file
+	 * @return the requested Image
+	 */
+	public Image getImage(final String aPath)
+	{
+		Image cachedImage = getImageRegistry().get(aPath);
+		if (null == cachedImage)
+		{
+			cachedImage = getImageDescriptor(aPath).createImage();
+			getImageRegistry().put(aPath, cachedImage);
+		}
+		return cachedImage;
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/AnalyzeToolHelpContextIDs.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Definitions for the class AnalyzeToolHelpContextIDs
+*
+*/
+
+package com.nokia.s60tools.analyzetool;
+
+/**
+ * IDs for context sensitive help.
+ * @author kihe
+ */
+public class AnalyzeToolHelpContextIDs {
+
+   /**
+     * The AnalyzeTool help plug-in ID.
+     */
+    private static final String ANALYZE_TOOL_HELP_PROJECT_PLUGIN_ID =
+                                        "com.nokia.s60tools.analyzetool.help"; //$NON-NLS-1$
+
+    /**
+     * AnalyzeTool view memory leaks page ID
+     */
+    public static final String ANALYZE_TOOL_VIEW_MEM_LEAKS=
+    	ANALYZE_TOOL_HELP_PROJECT_PLUGIN_ID +".ANALYZETOOL_VIEW_MEM_LEAKS";
+
+    /**
+     * AnalyzeTool main page ID
+     */
+    public static final String ANALYZE_MAIN=
+    	ANALYZE_TOOL_HELP_PROJECT_PLUGIN_ID +".ANALYZETOOL_MAIN";
+    /**
+     * AnalyzeTool graph page ID
+     */
+    public static final String ANALYZE_GRAPH=
+    	ANALYZE_TOOL_HELP_PROJECT_PLUGIN_ID +".ANALYZETOOL_GRAPH";
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/AnalyzeToolBuilder.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,901 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AnalyzeToolBuilder
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
+import com.nokia.carbide.cdt.builder.builder.CarbideCommandLauncher;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.carbide.cdt.builder.BuildArgumentsInfo;
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.ui.CustomInputDialog;
+
+/**
+ * Base class for AnalyzeTool builders.
+ *
+ * This class modifies Carbide builder settings during the AnalyzeTool build.
+ * This class can be used to built whole project or selected components with
+ * AnalyzeTool
+ *
+ * @author kihe
+ *
+ */
+public class AnalyzeToolBuilder extends CarbideCPPBuilder {
+
+	/** Pre-builder id. */
+	public static final String AT_BUILDER_ID = "com.nokia.s60tools.analyzetool.analyzeToolPreBuilder";
+
+	/** CarbideCommandLauncher reference. */
+	protected static CarbideCommandLauncher cmdLauncher = null;
+
+	/** Used mmp files. */
+	protected List<String> mmpFiles;
+
+	/** Verbose atool.exe output? */
+	private boolean verbose;
+
+	/**
+	 * Gets shared instance of CarbideCommandLauncher.
+	 *
+	 * @return CarbideCommandLauncher reference
+	 */
+	protected static CarbideCommandLauncher getCarbideCommandLauncher() {
+		return cmdLauncher;
+	}
+
+	/**
+	 * Checks is SBS v2 build activated for the project.
+	 *
+	 * @param cpi
+	 *            ICarbideProjectInfo
+	 * @return True if SBS v2 build is activated otherwise False
+	 */
+	public static boolean isSBSBuildActivated(final ICarbideProjectInfo cpi) {
+		try {
+			final Class<?> buildManagerClass = Class
+					.forName("com.nokia.carbide.cdt.builder.ICarbideBuildManager");
+
+			java.lang.reflect.Method[] methods = buildManagerClass.getMethods();
+			for (int i = 0; i < methods.length; i++) {
+				java.lang.reflect.Method oneMethod = methods[i];
+				if (oneMethod.toString().contains("isCarbideSBSv2Project")) {
+					IProject project = cpi.getProject();
+					if (project == null) {
+						return false;
+					}
+					Object[] objs = new Object[1];
+					objs[0] = project;
+					Boolean obj = (Boolean) oneMethod.invoke(
+							CarbideBuilderPlugin.getBuildManager(), objs);
+					return obj.booleanValue();
+
+				}
+			}
+		} catch (ClassNotFoundException cnfe) {
+			cnfe.printStackTrace();
+			return false;
+		} catch (SecurityException se) {
+			se.printStackTrace();
+			return false;
+		} catch (IllegalAccessException iae) {
+			iae.printStackTrace();
+			return false;
+		} catch (IllegalArgumentException iare) {
+			iare.printStackTrace();
+			return false;
+		} catch (java.lang.reflect.InvocationTargetException ite) {
+			ite.printStackTrace();
+			return false;
+		}
+		return false;
+	}
+
+	/**
+	 * Ask data file name from the user and after that executes atool.exe.
+	 *
+	 * @param monitor
+	 *            {@link IProgressMonitor} reference
+	 * @param cpi
+	 *            {@link ICarbideProjectInfo} reference
+	 * @param files
+	 *            Used mmp files
+	 *
+	 * @return COMMAND_LINE_ERROR_CODE.OK if no errors, otherwise error code
+	 */
+	private int askFileNameAndBuild(final IProgressMonitor monitor,
+			final ICarbideProjectInfo cpi, final List<IFile> files) {
+		// ask for the user data file name
+		CustomInputDialog dialog = new CustomInputDialog(
+				Constants.ANALYZE_TOOL_TITLE,
+				Constants.DIALOG_INPUT_DATA_FILE_NAME, "");
+		dialog.open();
+
+		//get data file name
+		String dataFileName = dialog.getUserInput();
+		int errorCode = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();
+		// user press "Cancel"
+		if (dataFileName == null || ("").equals(dataFileName)) {
+			buildCancelled(monitor, true);
+		} else { // if user specify data file name
+			errorCode = executeAtool(dataFileName, Constants.ATOOL_INST,
+					Constants.LOGGING_S60, files, cpi, monitor);
+		}
+		return errorCode;
+	}
+
+	/**
+	 * Ask logging mode from the user.
+	 *
+	 * @return User selected logging mode
+	 */
+	private String askLoggingMode() {
+
+		IPreferenceStore store = Activator.getPreferences();
+
+		// logging modes
+		AbstractList<String> modes = new ArrayList<String>();
+		modes.add(Constants.PREFS_EXT);
+
+		// if fast data gathering mode is enabled => add to selection list
+		if( store.getBoolean(Constants.LOGGING_FAST_ENABLED ) ) {
+			modes.add(Constants.PREFS_EXT_FAST);
+		}
+		modes.add(Constants.PREFS_S60);
+
+		// open selection dialog
+		String userSelection = Util.openSelectionDialog(
+				Constants.DIALOG_SELECT_LOGGING_MODE, null, modes);
+
+		// get used logging mode for the atool.exe
+		// user selected logging mode can not be used straight because it is
+		// different in the UI and which atool.exe uses
+		String modeSelection = "";
+		if (userSelection == Constants.PREFS_EXT) {
+			modeSelection = Constants.LOGGING_EXT;
+		} else if (userSelection == Constants.PREFS_S60) {
+			modeSelection = Constants.LOGGING_S60;
+		} else if( userSelection == Constants.PREFS_EXT_FAST) {
+			modeSelection = Constants.LOGGING_EXT_FAST;
+		}
+		return modeSelection;
+	}
+
+	/**
+	 * Cancels AnalyzeTool build.
+	 *
+	 * @param monitor
+	 *            Currently running progress monitor
+	 * @param continueBuild
+	 *            Stop the whole build chain (including Carbide other builders)
+	 *            or not
+	 */
+	public final void buildCancelled(final IProgressMonitor monitor,
+			final boolean continueBuild) {
+
+		IPreferenceStore store = Activator.getPreferences();
+
+		store.setValue(Constants.PREFS_BUILD_CANCELLED, true);
+
+		// if user wants to continue build
+		if (!continueBuild) {
+			// write info to the Carbide console view
+			getCarbideCommandLauncher().writeToConsole(
+					Constants.BUILD_CANCELLED);
+
+			// update monitor state
+			monitor.setCanceled(true);
+			monitor.done();
+
+		}
+
+		boolean promptMPPChange = store.getBoolean(Constants.PREFS_PROMPT_MMP);
+		boolean manageDeps = store.getBoolean(Constants.PREFS_MANAGE_DEPS);
+		boolean useConcBuild = store.getBoolean(Constants.PREFS_CONC_BUILD);
+
+		// build canceled set project preference back to normal
+		IPreferenceStore cStore = CarbideBuilderPlugin.getDefault()
+				.getPreferenceStore();
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
+						promptMPPChange);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES,
+						manageDeps);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
+						useConcBuild);
+
+		// CarbideCPPBuilder to forgot build state
+		super.forgetLastBuiltState();
+	}
+
+	/**
+	 * Builds user selected components.
+	 *
+	 * Normally this method is called from the CompileSymbianComponent
+	 *
+	 * @param selectedFiles
+	 *            User selected files
+	 */
+	public final void buildComponents(final List<IFile> selectedFiles) {
+		// create new job
+		Job buildJob = new Job(Constants.BUILD_AND_INSTRUMENT) {
+			@Override
+			protected IStatus run(final IProgressMonitor monitor) {
+				try {
+
+					// get project
+					IProject lastProject = selectedFiles.get(0).getProject();
+
+					// get CarbideProjectInfo
+					ICarbideProjectInfo cpi = CarbideBuilderPlugin
+							.getBuildManager().getProjectInfo(lastProject);
+
+					// get command launcher
+					cmdLauncher = new CarbideCommandLauncher(lastProject,
+							monitor, Constants.atoolParserIds, cpi
+									.getINFWorkingDirectory());
+					cmdLauncher.showCommand(true);
+
+					// run pre steps for the build
+					if (!runPreSteps(cmdLauncher, monitor, cpi)) {
+						return new Status(IStatus.ERROR, Constants.ANALYZE_TOOL_TITLE,
+								IStatus.ERROR, Constants.CANCELLED, null);
+					}
+
+					// build selected components
+					runBuild(Constants.ATOOL_INST, monitor, cpi, selectedFiles);
+
+					// run post steps
+					runPostSteps(cpi);
+
+					//after the build is finished => open the console view
+					Util.openConsoleView();
+				} finally {
+					monitor.done();
+				}
+				return new Status(IStatus.OK, Constants.ANALYZE_TOOL_TITLE,
+						IStatus.OK, Constants.COMPLETE, null);
+			}
+		};
+
+		buildJob.setPriority(Job.BUILD);
+		buildJob.schedule();
+	}
+
+	/**
+	 * Checks that platform is ARMV5, GCEE or WINSCW
+	 *
+	 * @param cpi
+	 *            ICarbideProjectInfo
+	 * @return True if platform is set to ARMV5, GCCE or WINSCW otherwise False
+	 */
+	public final boolean checkPlatform(final ICarbideProjectInfo cpi) {
+		String platform = cpi.getDefaultConfiguration().getPlatformString();
+		if ( platform.equals(Constants.BUILD_TARGET_ARMV5) || platform.equals(Constants.BUILD_TARGET_WINSCW)
+				|| platform.equals(Constants.BUILD_TARGET_GCEE) ) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Executes atool.exe with options.
+	 *
+	 * @param dataFileName
+	 *            Used data file name
+	 * @param type
+	 *            Type of execution. Possible types ATOOL_INST or ATOOL_UNINST
+	 * @param loggingModeCommand
+	 *            Used logging mode
+	 * @param userSelectedMmpFiles
+	 *            List of user selected mmp files
+	 * @param cpi
+	 *            ICarbideProjectInfo reference
+	 * @param monitor
+	 *            Progress monitor reference
+	 *
+	 * @return COMMAND_LINE_ERROR_CODE.OK if no errors, otherwise error code
+	 */
+	protected final int executeAtool(final String dataFileName,
+			final String type, final String loggingModeCommand,
+			final List<IFile> userSelectedMmpFiles,
+			final ICarbideProjectInfo cpi, final IProgressMonitor monitor) {
+
+		// get used platform
+		String platform = cpi.getDefaultConfiguration().getPlatformString().toLowerCase(Locale.US);
+
+		// get build target
+		String buildTarget = cpi.getDefaultConfiguration().getTargetString().toLowerCase(Locale.US);
+
+		// used arguments to atool.exe
+		AbstractList<String> usedArguments = new ArrayList<String>();
+
+		// which logging mode is used
+		if( loggingModeCommand.equalsIgnoreCase(Constants.LOGGING_EXT) )
+		{
+			usedArguments.add(Constants.ATOOL_INST_E);
+		}
+		else if( loggingModeCommand.equalsIgnoreCase(Constants.LOGGING_EXT_FAST)) {
+			usedArguments.add(Constants.ATOOL_INST_EF);
+		}
+		else
+		{
+			usedArguments.add(Constants.ATOOL_INST_I);
+		}
+
+		// if data file is set
+		if (dataFileName != null && !("").equals(dataFileName)) {
+			usedArguments.add("-f");
+			usedArguments.add(dataFileName);
+		}
+
+		// if "verbose atool.exe output" is enabled
+		if (verbose) {
+			usedArguments.add(Constants.ATOOL_SHOW_DEBUG);
+		}
+
+		IPreferenceStore store = Activator.getPreferences();
+		if( store.getBoolean(Constants.USE_CALLSTACK_SIZE) ) {
+			int callstackSize = store.getInt(Constants.CALLSTACK_SIZE);
+			usedArguments.add(Constants.CALLSTACK_SIZE_OPTION);
+			usedArguments.add(Integer.toString(callstackSize));
+		}
+
+		//add build command
+		// if project using SBSv2 build system
+		boolean sbsBuild = isSBSBuildActivated(cpi);
+		if (sbsBuild) {
+			usedArguments.add("sbs");
+			usedArguments.add("-c");
+			StringBuffer buildCommand = new StringBuffer();
+			buildCommand.append(platform);
+			buildCommand.append('_');
+			buildCommand.append(buildTarget);
+			usedArguments.add(buildCommand.toString());
+		}
+		else
+		{
+			usedArguments.add("abld");
+			usedArguments.add("build");
+			usedArguments.add(platform);
+			usedArguments.add(buildTarget);
+		}
+
+		int errorCode = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();
+		// if user has selected custom setup of components =>build them
+		// this means that call is come from CompileSymbianComponent class
+		if (userSelectedMmpFiles != null && !userSelectedMmpFiles.isEmpty()) {
+
+			//get atool.exe command
+			Iterator<IFile> files = userSelectedMmpFiles.iterator();
+			while(files.hasNext()) {
+				IFile file = files.next();
+				IPath location = file.getLocation();
+
+				String mmpFileName = getMMPFileName(location, true);
+				if( mmpFileName == null || ("").equals(mmpFileName)) {
+					continue;
+				}
+
+				// if this is first mmp file add it parameter list
+				usedArguments.add("-p");
+				usedArguments.add(mmpFileName);
+			}
+
+			//now the command is ready
+			//execute command
+			// execute atool.exe via CommandLauncher class
+			cmdLauncher.showCommand(true);
+			String[] arguments = new String[usedArguments.size()];
+		    usedArguments.toArray(arguments);
+		    errorCode = cmdLauncher.executeCommand(new Path(Util
+					.getAtoolInstallFolder()), arguments,
+					CarbideCPPBuilder.getResolvedEnvVars(cpi
+							.getDefaultConfiguration()), cpi
+							.getINFWorkingDirectory());
+
+
+			// if user press "Cancel"
+			if (monitor.isCanceled()) {
+				buildCancelled(monitor, false);
+				monitor.done();
+			}
+
+			// thru selected files and build with the Carbide builder
+			for (int i = 0; i < userSelectedMmpFiles.size(); i++) {
+
+				// get one file
+				IFile file = userSelectedMmpFiles.get(i);
+
+				// get file location
+				IPath fileLocation = file.getLocation();
+
+				// invoke normal Carbide build
+				try {
+					CarbideCPPBuilder.invokeSymbianComponenetAction(cpi
+							.getDefaultConfiguration(),
+							CarbideCPPBuilder.BUILD_COMPONENT_ACTION,
+							fileLocation, cmdLauncher, monitor, true);
+				} catch (CoreException e) {
+					e.printStackTrace();
+				}
+
+				// if user press "Cancel"
+				if (monitor.isCanceled()) {
+					buildCancelled(monitor, false);
+					monitor.done();
+				}
+			}
+
+			// Carbide build is finished
+			// now remove AnalyzeTool made modifications
+			// if project contains build erros => only uninstrument mmp
+			// file
+			if (CarbideCPPBuilder.projectHasBuildErrors(cpi
+					.getProject())) {
+				usedArguments.set(0, Constants.ATOOL_UNINST_FAILED);
+			}
+
+			// project succesfully build => uninstrumet project
+			runUninstrument(Constants.ATOOL_UNINST, cpi, monitor);
+
+		}
+		// if build from bld.inf file
+		else if (cpi.isBuildingFromInf()) {
+			cmdLauncher.showCommand(true);
+			String[] arguments = new String[usedArguments.size()];
+		    usedArguments.toArray(arguments);
+		    errorCode = cmdLauncher.executeCommand(new Path(Util.getAtoolInstallFolder()),
+					arguments,
+					CarbideCPPBuilder.getResolvedEnvVars(cpi
+							.getDefaultConfiguration()), cpi
+							.getINFWorkingDirectory());
+
+			if (mmpFiles != null) {
+				mmpFiles.clear();
+			}
+
+			// if user press "Cancel"
+			if (monitor.isCanceled()) {
+				buildCancelled(monitor, false);
+				monitor.done();
+			}
+
+		} else { // instrument only defined components
+			// get build components
+			mmpFiles = cpi.getInfBuildComponents();
+
+			for (int i = 0; i < mmpFiles.size(); i++) {
+				usedArguments.add("-p");
+				usedArguments.add(mmpFiles.get(i));
+			}
+			cmdLauncher.showCommand(true);
+			String[] arguments = new String[usedArguments.size()];
+		    usedArguments.toArray(arguments);
+		    errorCode = cmdLauncher.executeCommand(new Path(Util
+					.getAtoolInstallFolder()), arguments,
+					CarbideCPPBuilder.getResolvedEnvVars(cpi
+							.getDefaultConfiguration()), cpi
+							.getINFWorkingDirectory());
+
+			// if user press "Cancel"
+			if (monitor.isCanceled()) {
+				buildCancelled(monitor, false);
+				monitor.done();
+			}
+		}
+		return errorCode;
+	}
+
+	/**
+	 * Parses mmp file from the entered path
+	 * @param fileLocation MMP file location
+	 * @param sbsBuild IS sbsv2 build system activated
+	 * @return MMP file name without path
+	 */
+	public String getMMPFileName(IPath fileLocation, boolean sbsBuild)
+	{
+		// because mmp file contains project related path
+		// we need to parse mmp file name
+		int index = Util.getLastSlashIndex(fileLocation.toString());
+		String mmpFileName = null;
+		if (index == -1) {
+			// mmp file is incorrect => skip this file
+			return mmpFileName;
+		}
+
+		// parse mmp file name
+		mmpFileName = fileLocation.toString().substring(
+				index + 1, fileLocation.toString().length());
+
+		//if not using the SBS2 builds => nees to remove mmp file name extension
+		if( !sbsBuild && mmpFileName.endsWith(".mmp")) {
+			mmpFileName = mmpFileName.substring(0, mmpFileName.length()-4);
+		}
+		return mmpFileName;
+	}
+
+
+	/**
+	 * Runs AnalyzeTool build.
+	 *
+	 * @param type
+	 *            Type of execution. Possible types ATOOL_INST or ATOOL_UNINST
+	 * @param monitor
+	 *            Progress monitor reference
+	 * @param cpi
+	 *            ICarbideProjectInfo reference
+	 * @param files
+	 *            List of user selected mmp files
+	 * @return True is no errors otherwise False
+	 */
+	protected final boolean runBuild(final String type,
+			final IProgressMonitor monitor, final ICarbideProjectInfo cpi,
+			final List<IFile> files) {
+
+		// check AnalyzeTool libraries if the AnalyzeTool libraries missing =>
+		// creates error marker for the project and cancels build
+		if( !Util.checkAtoolLibs(cpi) )
+		{
+			buildCancelled(monitor, false);
+			return false;
+		}
+
+		// get preference store
+		IPreferenceStore store = Activator.getPreferences();
+
+		// get active logging mode
+		String loggingMode = store.getString(Constants.LOGGING_MODE);
+		String s60FileNameMode = store.getString(Constants.S60_LOG_FILE_MODE);
+		verbose = store.getBoolean(Constants.ATOOL_VERBOSE);
+
+		// possible error code from command line engine
+		int errorCode = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();
+
+		// if logging mode is set to "ask always"
+		// ask for user used logging mode
+		if (Constants.LOGGING_ASK_ALLWAYS.equals(loggingMode)) {
+			String modeSelection = askLoggingMode();
+
+			// user press "Cancel"
+			if (modeSelection == null || ("").equals(modeSelection)) {
+				buildCancelled(monitor, true);
+				return false;
+			}
+			// if user selects S60 log file and mode
+			// and data file must ask for user
+			else if (Constants.LOGGING_S60.equals(modeSelection)
+					&& Constants.LOGGING_S60_USER_SPECIFIED
+							.equals(s60FileNameMode)) {
+				errorCode = askFileNameAndBuild(monitor, cpi, files);
+			} else { // no need to ask data file for the user => just build
+						// with
+				// user selected logging mode
+				errorCode = executeAtool(null, type, modeSelection, files, cpi, monitor);
+			}
+
+		}
+		// if used logging mode is s60
+		// and data file name must ask for the user
+		else if (Constants.LOGGING_S60.equals(loggingMode)
+				&& Constants.LOGGING_S60_USER_SPECIFIED.equals(s60FileNameMode)) {
+			errorCode = askFileNameAndBuild(monitor, cpi, files);
+		}
+		// build with selected mode
+		else {
+			errorCode = executeAtool(null, type, loggingMode, files, cpi, monitor);
+		}
+
+
+		// no errors from command line engine
+		if( errorCode == Constants.COMMAND_LINE_ERROR_CODE.OK.getCode() ) {
+			return true;
+		}
+
+		// if some error code is returned from command line engine display it to user
+		// and cancel build
+		Constants.COMMAND_LINE_ERROR_CODE error = Util.getErrorCode(errorCode);
+		Util.displayCommandLineError(error);
+		buildCancelled(monitor, false);
+		return false;
+	}
+
+	/**
+	 * After the built is finished set preferences back to normal.
+	 * @param cpi ICarbideProjectInfo refernece
+	 */
+	public final void runPostSteps(ICarbideProjectInfo cpi) {
+
+		IPreferenceStore store = Activator.getPreferences();
+		boolean keepFilesSync = store.getBoolean(Constants.PREFS_KEEP_IN_SYNC);
+		boolean promptMPPChange = store.getBoolean(Constants.PREFS_PROMPT_MMP);
+		boolean manageDeps = store.getBoolean(Constants.PREFS_MANAGE_DEPS);
+		boolean useConcBuild = store.getBoolean(Constants.PREFS_CONC_BUILD);
+
+		// try to load ProjectUIPlugin class
+		try {
+			Class.forName("com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils");
+
+			// no need to keep project files in sync
+			// this should fix the mmp selection dialog prompt
+			com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils
+					.setKeepProjectsInSync(keepFilesSync);
+		} catch (ClassNotFoundException cnte) {
+			//Do nothing by design
+		}
+
+		// set builder preference to not prompt mmp file change dialog
+		IPreferenceStore cStore = CarbideBuilderPlugin.getDefault()
+				.getPreferenceStore();
+
+
+		// add existing/default values of Carbide builder settings
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
+						promptMPPChange);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES,
+						manageDeps);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
+						useConcBuild);
+
+
+		// try to remove -debug parameter from the build arguments list
+		try {
+			//get build configuration
+			ICarbideBuildConfiguration config = cpi.getDefaultConfiguration();
+
+			//get build arguments info
+			BuildArgumentsInfo info = config.getBuildArgumentsInfoCopy();
+
+			//get used platform
+			String platform = config.getPlatformString();
+
+			String debug = "-debug";
+			String abldArgs = info.abldBuildArgs;
+
+			//if platform is set to ARMV5 or GCCE
+			if ( platform.contains(Constants.BUILD_TARGET_ARMV5) || platform.contains(Constants.BUILD_TARGET_GCEE)) {
+
+				//get "-debug" string index
+				int index = abldArgs.indexOf(debug);
+
+				//if abld build arguments contains only "-debug" parameter
+				if( abldArgs.equals(debug) ) {
+					info.abldBuildArgs = "";
+					config.setBuildArgumentsInfo(info);
+				}
+				//remove just "-debug" word
+				else if( abldArgs.contains(debug) && index != -1 ) {
+					info.abldBuildArgs = abldArgs.substring(0,index) + abldArgs.substring(index+debug.length(), abldArgs.length());
+					config.setBuildArgumentsInfo(info);
+				}
+			}
+
+		}catch( java.lang.NoSuchMethodError nsme ) {
+			//Do nothing by design
+			//user might run AT with too old Carbide version
+		}catch( Exception e ) {
+			e.printStackTrace();
+		}
+
+		//after the build is finished => open the console view
+		Util.openConsoleView();
+	}
+
+	/**
+	 * Checks is atool.exe available and modifies Carbide preferences.
+	 *
+	 * @param launcher
+	 *            Command launcher
+	 * @param monitor
+	 *            Progress monitor
+	 * @param cpi
+	 *            Carbide project info
+	 * @return True is all checks are OK, otherwise False
+	 */
+	protected final boolean runPreSteps(final CarbideCommandLauncher launcher,
+			final IProgressMonitor monitor, final ICarbideProjectInfo cpi) {
+
+
+		// set command launchers
+		cmdLauncher = launcher;
+
+		// check is atool.exe available
+		if (!Util.isAtoolAvailable()) {
+			launcher.writeToConsole(Constants.INFO_ATOOL_NOT_AVAILABLE);
+			buildCancelled(monitor, false);
+			Util.showErrorMessage(Constants.ERROR_ATOOL_NOT_AVAILABLE);
+			return false;
+		}
+		
+		// check AnalyzeTool version, 1.6.0 and forward versions is supported
+		int compared = Util.compareVersionNumber(Util.getAtoolVersionNumber(Util.getAtoolInstallFolder()), Constants.MIN_VERSION);
+		if( compared == Constants.VERSION_NUMBERS_SECOND || compared == Constants.VERSION_NUMBERS_INVALID ) {
+			buildCancelled(monitor, false);
+			Util.showMessage(Constants.TOO_OLD_ENGINE);
+			return false;
+		}
+
+		// remove existing error markers
+		try {
+			CarbideCPPBuilder.removeAllMarkers(cpi.getProject());
+		}catch (CoreException ce) {
+			ce.printStackTrace();
+			return false;
+		}
+		
+		// check used platform
+		if (!checkPlatform(cpi)) {
+			buildCancelled(monitor, Util
+					.openConfirmationDialog(Constants.PLATFORM_NOT_SUPPORTED));
+			return false;
+		}
+
+		// check AnalyzeTool libraries if the AnalyzeTool libraries missing =>
+		// creates error marker for the project and cancels build
+		if( !Util.checkAtoolLibs(cpi) )
+		{
+			PlatformUI.getWorkbench().getDisplay().syncExec( new Runnable() {
+				public void run() {
+					// show error message for the user
+					Util.showMessage(Constants.CAN_NOT_FIND_LIBRARIES);
+				}
+			});
+			buildCancelled(monitor, false);
+			return false;
+		}
+
+		// use CarbideCPPBuilder to bldmake bldfiles for selected project
+		String[] bldmakeArgs = { "bldfiles" };
+		CarbideCPPBuilder.invokeBldmakeCommand(cpi.getDefaultConfiguration(),
+				launcher, bldmakeArgs, true);
+
+		IPreferenceStore store = Activator.getPreferences();
+
+		// try to load ProjectUIPlugin class
+		try {
+			Class.forName("com.nokia.carbide.cpp.project.ui.ProjectUIPlugin");
+
+			// get keep project files in sync flag
+			boolean keepFilesSync = com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils
+					.keepProjectsInSync();
+
+			store.setValue(Constants.PREFS_KEEP_IN_SYNC, keepFilesSync);
+
+			// no need to keep project files in sync
+			// this should fix the mmp selection dialog prompt
+			com.nokia.carbide.cpp.project.ui.utils.ProjectUIUtils
+					.setKeepProjectsInSync(false);
+		} catch (ClassNotFoundException cnfe) {
+			//Do nothing by design
+		}
+
+		// set builder preference to not prompt mmp file change dialog
+		IPreferenceStore cStore = CarbideBuilderPlugin.getDefault()
+				.getPreferenceStore();
+
+		// get existing values
+		boolean promptMPPChange = cStore
+				.getBoolean(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT);
+		boolean manageDeps = cStore
+				.getBoolean(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES);
+		boolean useConcBuild = cStore
+				.getBoolean(com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING);
+
+		//store existing values
+		store.setValue(Constants.PREFS_PROMPT_MMP, promptMPPChange);
+		store.setValue(Constants.PREFS_MANAGE_DEPS, manageDeps);
+		store.setValue(Constants.PREFS_CONC_BUILD, useConcBuild);
+		// add custom values for AnalyzeTool build
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MMP_CHANGED_ACTION_PROMPT,
+						false);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_MANAGE_DEPENDENCIES,
+						false);
+		cStore
+				.setValue(
+						com.nokia.carbide.cdt.builder.BuilderPreferenceConstants.PREF_USE_CONCURRENT_BUILDING,
+						false);
+		
+		// try to add -debug parameter to the build arguments list
+		try {
+			//get selected build configuration
+			ICarbideBuildConfiguration config = cpi.getDefaultConfiguration();
+
+			//get build arguments info
+			BuildArgumentsInfo info = config.getBuildArgumentsInfoCopy();
+
+			//get selected platform
+			String platform = cpi.getDefaultConfiguration().getPlatformString();
+
+			//if platform is ARMV5 or GCCE and the "-debug" parameter is not set => we need set the parameter
+			if ( (platform.contains(Constants.BUILD_TARGET_ARMV5) || platform.contains(Constants.BUILD_TARGET_GCEE)) && !info.abldBuildArgs.contains("-debug") ) {
+				if( info.abldBuildArgs.length() > 0 && !info.abldBuildArgs.endsWith(" ") ) {
+					info.abldBuildArgs += " ";
+				}
+				info.abldBuildArgs += "-debug";
+				config.setBuildArgumentsInfo(info);
+			}
+
+		}
+		//catch NoSuchMethodError because is it possible to use older versions where this method is not available
+		catch( java.lang.NoSuchMethodError nsme)
+		{
+			//Do nothing by design
+		}
+
+		return true;
+	}
+
+	/**
+	 * Executes uninstrument for the project.
+	 * @param command Uninstrument command
+	 * @param cpi ICarbideProjectInfo reference
+	 * @param monitor IProgressMonitor reference
+	 */
+	public void runUninstrument(String command, ICarbideProjectInfo cpi, IProgressMonitor monitor)
+	{
+		cmdLauncher.showCommand(true);
+		String[] arguments = new String[1];
+	    arguments[0] = command;
+		int error = cmdLauncher.executeCommand(new Path(Util
+				.getAtoolInstallFolder()),arguments,
+				CarbideCPPBuilder.getResolvedEnvVars(cpi
+						.getDefaultConfiguration()), cpi
+					.getINFWorkingDirectory());
+		
+		// if some occurs => display it to user
+		if( error != Constants.COMMAND_LINE_ERROR_CODE.OK.getCode() ) {
+			Constants.COMMAND_LINE_ERROR_CODE errorCode = Util.getErrorCode(error);
+			Util.displayCommandLineError(errorCode);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/BuilderUtil.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class BuilderUtil
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Add and removes AnalyzeTool build natures to project natures.
+ *
+ * @author kihe
+ *
+ */
+public class BuilderUtil {
+
+	/**
+	 * Constructor.
+	 */
+	public BuilderUtil() {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+	/**
+	 * Adds AnalyzeTool build natures.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @return True no errors otherwise False
+	 */
+	private boolean addAnalysisNatures(final IProject project) {
+		try {
+
+			// get existing natures
+			String[] natures = project.getDescription().getNatureIds();
+
+			// get project description
+			IProjectDescription description = project.getDescription();
+
+			// create array for the new natures
+			String[] newNatures = new String[natures.length + 2];
+
+
+			//if QT nature found we must adjust pre- and post natures to correct place
+			if( description.hasNature(com.trolltech.qtcppproject.QtNature.QT_NATURE_ID) ) {
+
+				//find QT nature location
+				int qtNatureIndex = 0;
+				for( int i=0; i<natures.length; i++ ) {
+					if( natures[i].equals(com.trolltech.qtcppproject.QtNature.QT_NATURE_ID ) ) {
+						qtNatureIndex = i;
+						break;
+					}
+				}
+
+				//QT nature id found and it is first nature=> now start to copy existing id and add AT id
+				if( qtNatureIndex == 0 ) {
+					//add natures
+					newNatures[0] = natures[0];
+					newNatures[1] = PreNature.NATURE_ID;
+
+					//copy rest of the existing natures
+					System.arraycopy(natures, 1, newNatures, 2, natures.length-1);
+
+					// add post-builder nature
+					newNatures[natures.length + 1] = PostNature.NATURE_ID;
+				}
+				//QT nature id found but there are some other natures
+				//before QT nature
+				else {
+					//copy existing natures
+					System.arraycopy(natures, 0, newNatures, 0, qtNatureIndex+1);
+					newNatures[qtNatureIndex+1] = PreNature.NATURE_ID;
+
+					//copy rest of the existing natures
+					System.arraycopy(natures, qtNatureIndex+1, newNatures, qtNatureIndex+2, natures.length-qtNatureIndex);
+
+					// add post-builder nature
+					newNatures[natures.length + 1] = PostNature.NATURE_ID;
+				}
+			}
+			//no QT nature found just add pre nature first and post nature last
+			else {
+
+				// set pre-builder nature
+				newNatures[0] = PreNature.NATURE_ID;
+
+				// copy existing natures
+				System.arraycopy(natures, 0, newNatures, 1, natures.length);
+
+				// add post-builder nature
+				newNatures[natures.length + 1] = PostNature.NATURE_ID;
+			}
+
+			// update project description
+			description.setNatureIds(newNatures);
+			project.setDescription(description, null);
+
+			return true;
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+			return false;
+		}
+	}
+
+
+
+	/**
+	 * Disable AnalyzeTool build natures.
+	 *
+	 * @param project
+	 *            Project reference
+	 */
+	public final void disableNatures(final IProject project) {
+		try {
+			// both natures found
+			if (isNatureEnabled(project)) {
+				removeNature(project, 2);
+			} else {
+				IProjectDescription description = project.getDescription();
+
+				// find natures
+				boolean foundPreNature = description
+						.hasNature(PreNature.NATURE_ID);
+				boolean foundPostNature = description
+						.hasNature(PostNature.NATURE_ID);
+
+				//either pre- or post builder nature found => remove it
+				if (foundPreNature || foundPostNature) {
+					removeNature(project, 1);
+				}
+
+			}
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Add AnalyzeTool custom builder nature to project builder natures.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @return True if natures are added otherwise False
+	 */
+	public final boolean enableNatures(final IProject project) {
+		try {
+			// check is nature enable
+			if( isNatureEnabled(project)) {
+				return true;
+			}
+			// get project description
+			IProjectDescription description = project.getDescription();
+
+			// find natures
+			boolean foundPreNature = description
+					.hasNature(PreNature.NATURE_ID);
+			boolean foundPostNature = description
+					.hasNature(PostNature.NATURE_ID);
+
+			// only one analyzetool nature found => remove it
+			if (foundPostNature || foundPreNature) {
+				removeNature(project, 1);
+			}
+
+			// add right analysis natures
+			return addAnalysisNatures(project);
+
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+			return false;
+		}
+	}
+
+	/**
+	 * Checks is AnalyzeTool custom nature enabled.
+	 *
+	 * @param projRef
+	 *            Project reference
+	 * @return True both pre or post nature enabled otherwise False
+	 */
+	public final boolean isNatureEnabled(final IProject projRef) {
+		boolean preNatureFound = false;
+		boolean postNatureFound = false;
+
+		//check project validity
+		if (projRef == null || !projRef.isOpen()) {
+			return false;
+		}
+
+		try {
+			IProjectDescription description = projRef.getDescription();
+			preNatureFound = description.hasNature(PreNature.NATURE_ID);
+			postNatureFound = description.hasNature(PostNature.NATURE_ID);
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+		if (preNatureFound && postNatureFound) {
+			return true;
+		}
+		return false;
+
+	}
+
+	/**
+	 * Removes AnalyzeTool custom builder natures.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @param count
+	 *            How many natures to remove
+	 */
+	private void removeNature(final IProject project, final int count) {
+		try {
+			IProjectDescription desc = project.getDescription();
+			String[] natures = desc.getNatureIds();
+			String[] newNatures = new String[natures.length - count];
+
+			int index = 0;
+
+			//thru natures
+			//if pre- or post nature found skip it
+			for (int i = 0; i < natures.length; i++) {
+				if (!natures[i].equals(PreNature.NATURE_ID)
+						&& !natures[i].equals(PostNature.NATURE_ID)) {
+					newNatures[index] = natures[i];
+					index++;
+				}
+			}
+			desc.setNatureIds(newNatures);
+			project.setDescription(desc, null);
+
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/CustomPostBuilder.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CustomPostBuilder
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+//import com.nokia.carbide.cdt.builder.BuildArgumentsInfo;
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
+//import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+
+
+/**
+ * Class to execute custom post-build actions.
+ *
+ * @author kihe
+ *
+ */
+public class CustomPostBuilder extends AnalyzeToolBuilder {
+
+	/** Post-builder id. */
+	public static final String POST_BUILDER_ID = "com.nokia.s60tools.analyzetool.analyzeToolPostBuilder";
+
+	/**
+	 * Executes AnalyzeTool post actions when user builds projects.
+	 *
+	 *
+	 * @see com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	protected IProject[] build(int kind, java.util.Map args,
+			IProgressMonitor monitor) {
+
+		// get project reference
+		IProject project = super.getProject();
+
+		// get project info
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(project);
+
+
+		IPreferenceStore store = Activator.getPreferences();
+		boolean buildCanceled = store.getBoolean(Constants.PREFS_BUILD_CANCELLED);
+		// if the AnalyzeTool is canceled
+		if (buildCanceled) {
+			getCarbideCommandLauncher().writeToConsole(
+					Constants.BUILD_CANCELLED);
+			buildCanceled = false;
+			// if atool.exe is not available write info to console view
+			if (!Util.isAtoolAvailable()) {
+				getCarbideCommandLauncher().writeToConsole(
+						Constants.INFO_ATOOL_NOT_AVAILABLE);
+			}
+			super.forgetLastBuiltState();
+			runPostSteps(cpi);
+			return null;
+		}
+
+
+		//execute atool.exe
+		if (CarbideCPPBuilder.projectHasBuildErrors(cpi.getProject())) {
+			runUninstrument(Constants.ATOOL_UNINST_FAILED,cpi, monitor);
+		} else {
+			runUninstrument(Constants.ATOOL_UNINST,cpi, monitor);
+		}
+
+
+		monitor.worked(1);
+
+		runPostSteps(cpi);
+
+		return new IProject[0];
+	}
+
+
+	@Override
+	protected void clean(final IProgressMonitor arg0){
+		// DO nothing by design
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/CustomPreBuilder.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CustomPreBuilder
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.builder.CarbideCommandLauncher;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Class to execute AnalyzeTool custom pre-build actions.
+ *
+ * This class holds many static variables because {@link CustomPostBuilder}
+ * class need to know what variables is used when calling CustomPreBuilder
+ * without creating a new object of this class
+ *
+ * @author kihe
+ *
+ */
+public class CustomPreBuilder extends AnalyzeToolBuilder {
+
+	/**
+	 * Executes AnalyzeTool post actions when user builds projects.
+	 *
+	 * @see com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	protected IProject[] build(final int kind, final java.util.Map args,
+			final IProgressMonitor monitor) {
+		// clear used build parameters
+		if (mmpFiles != null) {
+			mmpFiles.clear();
+		}
+		IPreferenceStore store = Activator.getPreferences();
+		store.setValue(Constants.PREFS_BUILD_CANCELLED, false);
+
+		// get selected project reference
+		final IProject project = super.getProject();
+
+		// get project info
+		final ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(project);
+
+		final CarbideCommandLauncher launcher = new CarbideCommandLauncher(project,
+				monitor, Constants.atoolParserIds, cpi.getINFWorkingDirectory());
+		launcher.showCommand(true);
+
+		if (!runPreSteps(launcher, monitor, cpi)) {
+			return null;
+		}
+
+		runBuild(Constants.ATOOL_INST, monitor, cpi, null);
+
+		return new IProject[0];
+	}
+
+	@Override
+	protected void clean(final IProgressMonitor arg0){
+		// DO nothing by design
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/PostNature.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class PostNature
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Class to implement post-builder nature.
+ *
+ * @author kihe
+ *
+ */
+public class PostNature implements IProjectNature {
+
+	/** ID of post-builder project nature. */
+	public static final String NATURE_ID = "com.nokia.s60tools.analyzetool.postNature";
+
+	/** Project reference. */
+	private IProject project;
+
+	/**
+	 * Sets AnalyzeTool builder to project description
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#configure()
+	 */
+	public void configure() throws CoreException {
+		IProjectDescription desc = project.getDescription();
+		ICommand[] commands = desc.getBuildSpec();
+
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(
+					CustomPostBuilder.POST_BUILDER_ID)) {
+				return;
+			}
+		}
+
+		ICommand[] newCommands = new ICommand[commands.length + 1];
+		System.arraycopy(commands, 0, newCommands, 0, commands.length);
+		ICommand command = desc.newCommand();
+		command.setBuilderName(CustomPostBuilder.POST_BUILDER_ID);
+		newCommands[newCommands.length - 1] = command;
+		desc.setBuildSpec(newCommands);
+		project.setDescription(desc, null);
+	}
+
+	/**
+	 * Removes AnalyzeTool builder from the project description
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+	 */
+	public void deconfigure() throws CoreException {
+		IProjectDescription description = getProject().getDescription();
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(
+					CustomPostBuilder.POST_BUILDER_ID)) {
+				ICommand[] newCommands = new ICommand[commands.length - 1];
+				System.arraycopy(commands, 0, newCommands, 0, i);
+				System.arraycopy(commands, i + 1, newCommands, i,
+						commands.length - i - 1);
+				description.setBuildSpec(newCommands);
+				project.setDescription(description, null);
+				return;
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#getProject()
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+	 */
+	public void setProject(IProject projectRef) {
+		this.project = projectRef;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/builder/PreNature.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class PreNature
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.builder;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Class to implement pre-builder nature.
+ *
+ * @author kihe
+ *
+ */
+public class PreNature implements IProjectNature {
+
+	/** ID of pre-builder project nature. */
+	public static final String NATURE_ID = "com.nokia.s60tools.analyzetool.preNature";
+
+	/** Project reference. */
+	private IProject project;
+
+	/**
+	 * Sets AnalyzeTool builder to project description
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#configure()
+	 */
+	public void configure() throws CoreException {
+		IProjectDescription desc = project.getDescription();
+		ICommand[] commands = desc.getBuildSpec();
+
+		int qtBuilderIndex = 0;
+		boolean qtBuildeFound = false;
+
+		//thru existing builders
+		for (int i = 0; i < commands.length; ++i) {
+			//if AT builder id is already addred => leave
+			if (commands[i].getBuilderName().equals(
+					AnalyzeToolBuilder.AT_BUILDER_ID)) {
+				return;
+			}
+			//if current builder is QT builder => save location
+			else if(commands[i].getBuilderName().equals(com.trolltech.qtcppproject.QtProConstants.QTBUILDER_ID)) {
+				qtBuilderIndex = i;
+				qtBuildeFound = true;
+			}
+		}
+
+		//create new commands
+		ICommand[] newCommands = new ICommand[commands.length + 1];
+
+		//create new command(AT command)
+		ICommand command = desc.newCommand();
+		command.setBuilderName(AnalyzeToolBuilder.AT_BUILDER_ID);
+
+		//QT nature id found => now start to copy existing id and add AT builder id
+		if( qtBuildeFound ) {
+
+			if( qtBuilderIndex == 0 ) {
+				newCommands[0] = commands[0];
+				newCommands[1] = command;
+				System.arraycopy(commands, 1, newCommands, 2, commands.length-1);
+			}
+			else {
+				System.arraycopy(commands, 0, newCommands, 0, qtBuilderIndex+1);
+				newCommands[qtBuilderIndex+1] =command;
+				System.arraycopy(commands, qtBuilderIndex+1, newCommands, qtBuilderIndex+2, commands.length-qtBuilderIndex);
+			}
+		}
+		//no qt builder found => add AT builder to first of the builder list
+		else {
+			newCommands[0] = command;
+			System.arraycopy(commands, 0, newCommands, 1, commands.length);
+
+		}
+
+		//update project description
+		desc.setBuildSpec(newCommands);
+		project.setDescription(desc, null);
+	}
+
+	/**
+	 * Removes AnalyzeTool builder from the project description
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+	 */
+	public void deconfigure() throws CoreException {
+		IProjectDescription description = getProject().getDescription();
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(
+					AnalyzeToolBuilder.AT_BUILDER_ID)) {
+				ICommand[] newCommands = new ICommand[commands.length - 1];
+				System.arraycopy(commands, 0, newCommands, 0, i);
+				System.arraycopy(commands, i + 1, newCommands, i,
+						commands.length - i - 1);
+				description.setBuildSpec(newCommands);
+				project.setDescription(description, null);
+				return;
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#getProject()
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+	 */
+	public void setProject(IProject projectRef) {
+		this.project = projectRef;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/AnalysisItem.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AnalysisItem
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+/**
+ * Contains information of one memory leak item Information is parsed from
+ * atool.exe generated XML file so we can assume that all the information is
+ * valid and no other checking is needed.
+ *
+ * @author kihe
+ *
+ */
+public class AnalysisItem extends BaseItem {
+
+	/** Size of leak. */
+	private int leakSize = 0;
+
+	/** Call stack addresses. */
+	private final AbstractList<CallstackItem> callstackItems;
+
+	/**
+	 * Constructor.
+	 */
+	public AnalysisItem() {
+		super();
+		callstackItems = new ArrayList<CallstackItem>();
+	}
+
+	/**
+	 * Adds new Callstack item.
+	 *
+	 * @param item
+	 *            Callstack item
+	 */
+	public final void addCallstackItem(final CallstackItem item) {
+		this.callstackItems.add(item);
+	}
+
+	/**
+	 * Check contains current item valid callstack item.
+	 *
+	 * @return True one callstack info contains Function name and leak line
+	 *         number, otherwise False
+	 */
+	public final boolean containValidCallstack() {
+		// thru stored callstack items
+		final java.util.Iterator<CallstackItem> iterCallstack = callstackItems
+				.iterator();
+		while (iterCallstack.hasNext()) {
+			// if one item contains valid filename and line number
+			// this means that current callstack items can be pinpointed
+			final CallstackItem oneItem = iterCallstack.next();
+			if (!("").equals(oneItem.getFileName())
+					&& oneItem.getLeakLineNumber() != 0) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Gets stored callstack items.
+	 *
+	 * @return Callstack items
+	 */
+	public final AbstractList<CallstackItem> getCallstackItems() {
+		return this.callstackItems;
+	}
+
+	/**
+	 * Gets size of memory leak.
+	 *
+	 * @return Memory leak size
+	 */
+	public final int getLeakSize() {
+		return this.leakSize;
+	}
+
+
+	/**
+	 * Sets size for the memory leak.
+	 *
+	 * @param newSize
+	 *            Memory leak size
+	 */
+	public final void setLeakSize(final int newSize) {
+		this.leakSize = newSize;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/AnalyzeFactory.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AnalyzeFactory
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.internal.engine.MemoryActivityModel;
+
+/**
+ * Factory for creating the memory model of AnalyzeTool
+ *
+ */
+public class AnalyzeFactory {
+	private static final IMemoryActivityModel EMPTY_MODEL= new EmptyAnalysisGraphModel();
+	
+	/**
+	 * Creates an instance of IMemoryActivityModel
+	 * @param emptyModel if true return a model that cannot take processes
+	 * @return the newly created model
+	 */
+	public IMemoryActivityModel createModel(final boolean emptyModel){
+		return emptyModel ? EMPTY_MODEL : new MemoryActivityModel();
+	}
+	
+	/**
+	 * Returns an empty model
+	 * @return
+	 */
+	public static IMemoryActivityModel getEmptyModel(){
+		return EMPTY_MODEL;
+	}
+
+	private static class EmptyAnalysisGraphModel implements IMemoryActivityModel {
+		
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getFirstMemOpTime()
+		 */
+		public Long getFirstMemOpTime() {
+			return 0L;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getFirstProcessTime()
+		 */
+		public Long getFirstProcessTime() {
+			return 0L;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getHighestCumulatedMemoryAlloc()
+		 */
+		public int getHighestCumulatedMemoryAlloc() {
+			return 10*1024;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getLastMemOpTime()
+		 */
+		public Long getLastMemOpTime() {
+			return 0L;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getLastProcessTime()
+		 */
+		public Long getLastProcessTime() {
+			return 0L;
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getProcesses()
+		 */
+		public AbstractList<ProcessInfo> getProcesses() {
+			return new ArrayList<ProcessInfo>();
+		}
+
+		public void addListener(IMemoryActivityModelChangeListener listener) {
+			//immediately call this listener to let it know there is no data
+			//there is no need to add this listener
+			listener.onProcessesAdded();
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#addProcesses(java.util.AbstractList)
+		 */
+		public void addProcesses(AbstractList<ProcessInfo> processes) {
+			// nothing to do
+		}
+
+		/* (non-Javadoc)
+		 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#removeListener(com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener)
+		 */
+		public void removeListener(IMemoryActivityModelChangeListener listener) {
+			// nothing to do
+		}
+
+		public ProcessInfo getSelectedProcess() {
+			return null;
+		}
+
+		public void setSelectedProcess(ProcessInfo processInfo) {
+			//cannot occur in empty model
+		}
+		
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/BaseItem.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class BaseItem
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+/**
+ * Base class for {@link AnalysisItem} and {@link CallstackItem} Provides
+ * methods to store basic information of one item
+ *
+ * Information is parsed from atool.exe generated XML file so we can assume that
+ * all the information is valid and no other checking is needed.
+ *
+ * @author kihe
+ *
+ */
+public class BaseItem {
+
+	/** Module name. */
+	private String moduleName;
+
+	/** Memory leak time. */
+	private String memoryLeakTime;
+
+	/** Memory item memory address. */
+	private String memoryAddress;
+
+	/** item ID. */
+	private int itemID = 0;
+
+	/**
+	 * Gets Callstack item ID.
+	 *
+	 * @return Callstack item ID
+	 */
+	public final int getID() {
+		return itemID;
+	}
+
+	/**
+	 * Returns current item memory address.
+	 *
+	 * @return Memory address
+	 */
+	public final String getMemoryAddress() {
+		if (memoryAddress == null) {
+			return "";
+		}
+		return memoryAddress;
+	}
+
+	/**
+	 * Gets memory leak time.
+	 *
+	 * @return Memory leak time
+	 */
+	public final String getMemoryLeakTime() {
+		if (memoryLeakTime == null) {
+			return "";
+		}
+		return this.memoryLeakTime;
+	}
+
+	/**
+	 * Gets module name.
+	 *
+	 * @return Module name
+	 */
+	public final String getModuleName() {
+		if (moduleName == null) {
+			return "";
+		}
+		return this.moduleName;
+	}
+
+	/**
+	 * Sets Callstack item ID.
+	 *
+	 * @param newID
+	 *            New callstack item id value
+	 */
+	public final void setID(final int newID) {
+		itemID = newID;
+	}
+
+	/**
+	 * Set current item memory address.
+	 *
+	 * @param newMemoryAddress
+	 *            Item memory address
+	 */
+	public final void setMemoryAddress(final String newMemoryAddress) {
+		memoryAddress = newMemoryAddress;
+	}
+
+	/**
+	 * Sets memory leak time.
+	 *
+	 * @param newMemoryLeakTime
+	 *            Memory leak time
+	 */
+	public final void setMemoryLeakTime(final String newMemoryLeakTime) {
+		this.memoryLeakTime = newMemoryLeakTime;
+
+	}
+
+	/**
+	 * Sets module name.
+	 *
+	 * @param newModuleName
+	 *            Module name
+	 */
+	public final void setModuleName(final String newModuleName) {
+		this.moduleName = newModuleName;
+	}
+
+	/**
+	 * Checks that at least one needed information is available
+	 *
+	 * @return True if at least one needed information is available otherwise
+	 *         False
+	 */
+	protected boolean checkData() {
+		if ((moduleName == null || ("").equals(moduleName))
+				&& (memoryLeakTime == null || ("").equals(memoryLeakTime))
+				&& (memoryAddress == null || ("").equals(memoryAddress))) {
+			return false;
+		}
+		return true;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/CallstackItem.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CallstackItem
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+/**
+ * Contains information of one memory leak item Information is parsed from
+ * atool.exe generated XML file so we can assume that all the information is
+ * valid and no other checking is needed.
+ *
+ * @author kihe
+ *
+ */
+public class CallstackItem extends BaseItem {
+
+	/** File name. */
+	private String fileName;
+
+	/** Function name. */
+	private String functionName;
+
+	/** Memory leak line number. */
+	private int leakLineNumber;
+
+	/** Flag to inform that is results created for urel builds. */
+	private boolean urelBuild = false;
+
+
+	/**
+	 * Gets file name.
+	 *
+	 * @return File name
+	 */
+	public final String getFileName() {
+		return this.fileName;
+	}
+
+	/**
+	 * Gets function name.
+	 *
+	 * @return Function name
+	 */
+	public final String getFunctionName() {
+		return this.functionName;
+	}
+
+	/**
+	 * Gets leak line number.
+	 *
+	 * @return Leak line number
+	 */
+	public final int getLeakLineNumber() {
+		return this.leakLineNumber;
+	}
+
+	/**
+	 * Is results created for the urel build.
+	 *
+	 * @return True if results are created for the urel build otherwise false
+	 */
+	public final boolean isUrelBuild() {
+		return urelBuild;
+	}
+
+	/**
+	 * Sets cpp file name which contains memory leaks.
+	 *
+	 * @param newFileName
+	 *            File name
+	 */
+	public final void setFileName(final String newFileName) {
+		this.fileName = newFileName;
+	}
+
+	/**
+	 * Sets function name.
+	 *
+	 * @param newFunctionName
+	 *            Function name
+	 */
+	public final void setFunctionName(final String newFunctionName) {
+		this.functionName = newFunctionName;
+	}
+
+	/**
+	 * Sets leak line number.
+	 *
+	 * @param newLeakLineNumber
+	 *            Leak line number
+	 */
+	public final void setLeakLineNumber(final int newLeakLineNumber) {
+		this.leakLineNumber = newLeakLineNumber;
+	}
+
+	/**
+	 * Sets urel build flag.
+	 *
+	 * @param build
+	 *            Is project built with urel command
+	 */
+	public final void setUrelBuild(final boolean build) {
+		urelBuild = build;
+	}
+
+	/**
+	 * Checks that at least one needed information is available
+	 *
+	 * @return False if at least one needed information is available(not empty) otherwise
+	 *         True
+	 */
+	public boolean isEmpty() {
+		if ( !checkData() && (fileName == null || ("").equals(fileName))
+				&& (functionName == null || ("").equals(functionName) ) ) {
+			return true;
+		}
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/EpocReader.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class EpocReader
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.ui.MainView;
+
+/**
+ * Creates new job for polling epocwind.out file
+ * @author kihe
+ *
+ */
+public class EpocReader extends Job{
+
+	/** Epocwind.out file location*/
+	private final String emulatorFileLocation;
+
+	/**Is file listening active*/
+	boolean alreadyStarted = false;
+
+	/**Interval to read file contents*/
+	static final int POLL_INTERVAL = 1000; // 1 second
+
+	/**Epocwind.out file size*/
+	long fileSize = -1;
+
+	/**
+	 * How many characters we have read
+	 * We can assume that long is big enough to store character count
+	 * because max size of long is 9223372036854775807l
+	 */
+	long readCharacters = 0;
+
+	/**Project reference*/
+	IProject project;
+
+	/**Parent class reference*/
+	MainView main;
+
+	/**Flag to determinate do we still need to read changes from epocwind.out file*/
+	boolean stillRun = true;
+
+	/**
+	 * Constructor
+	 * @param projectRef Project reference
+	 * @param parentClass Parent class reference
+	 */
+	public EpocReader(IProject projectRef, MainView parentClass)
+	{
+		super(Constants.OUTPUT_READER_TITLE);
+		emulatorFileLocation = System.getenv("TEMP") + File.separator+ "epocwind.out";
+		project = projectRef;
+		main = parentClass;
+
+	}
+
+	/**
+	 * Starts epocwind.out file reading
+	 */
+	public void start(){
+
+		//if we are already listening epocwindout file => no need create new job
+		if( alreadyStarted ) {
+			return;
+		}
+
+		setPriority(Job.LONG);
+		setUser(false);
+
+		//start as soon as possible
+		schedule();
+
+		//update listening flag
+		alreadyStarted = true;
+
+		//open streams
+		main.parser.openStreams(Util.getBldInfFolder(
+				project, true));
+	}
+
+
+	/**
+	 * Stops listening emulator
+	 */
+	public void stop() {
+		alreadyStarted = false;
+		fileSize = -1;
+		readCharacters = 0;
+		stillRun = false;
+		cancel();
+
+	}
+
+
+	/**
+	 * Reads the epocwind.out file if it has been changed since last time
+	 */
+	@Override
+	protected IStatus run(IProgressMonitor arg0) {
+
+		//stream which are used to read file content
+		FileInputStream fis = null;
+		BufferedReader br = null;
+
+		//run while user stops the data capturing
+		while(stillRun) {
+			try {
+				//create new file
+				File epocFile = new File(emulatorFileLocation);
+
+				//if file exists
+				if (epocFile.exists()) {
+
+					// emulator output is not read
+					// so we need to thru existing data of emulator output,
+					// because we are only interested of new data.
+					if (fileSize == -1) {
+						fileSize = epocFile.length();
+
+						//open epocwind.out file
+						fis = new FileInputStream(epocFile);
+						br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
+
+						//skip lines what we have already read
+						br.skip(readCharacters);
+
+						String line = "";
+						// read all new lines of epocwind.out file
+						while ((line = br.readLine()) != null) {
+							//update read count
+							readCharacters+=line.length()+2; //<== line feed character
+						}
+					// emulator output contains new/more information than what we are read
+					} else if (epocFile.length() > fileSize) {
+
+						//open epocwind.out file
+						fis = new FileInputStream(epocFile);
+						br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
+
+						//skip lines what we have already read
+						br.skip(readCharacters);
+
+						String line = "";
+						// read all new lines in epocwind.out
+						while ((line = br.readLine()) != null) {
+							//update read count
+							readCharacters+=line.length()+2; //<== line feed character
+
+							//transfer line to parser
+							main.parser.parse(line);
+
+						}
+
+						//update size
+						fileSize = epocFile.length();
+
+						//tell AT UI to update online allocation count value
+						main.updateAllocNumber();
+					}else if (epocFile.length() < fileSize){
+						fileSize = 0;
+						readCharacters = 0;
+					}
+				}
+				if( br != null ) {
+					br.close();
+					br = null;
+				}
+
+				if( fis != null ) {
+					fis.close();
+					fis = null;
+				}
+
+				//sleep this thread
+				Thread.sleep(POLL_INTERVAL);
+			} catch (InterruptedException ie) {
+				//we can shallow the exception
+				//because when this exception is raised we can exit
+				cancel();
+			} catch (Exception e) {
+				e.printStackTrace();
+				cancel();
+			}
+			finally{
+				try{
+					if(br != null ) {
+						br.close();
+					}
+				}catch(IOException ioe ) {
+					ioe.printStackTrace();
+				}
+
+				try{
+					if(fis != null ) {
+						fis.close();
+					}
+				}catch(IOException ioe ) {
+					ioe.printStackTrace();
+				}
+			}
+		}
+
+		//parsing is finished
+		return Status.OK_STATUS;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/IMemoryActivityModel.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class IMemoryActivityModel
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine;
+import java.util.AbstractList;
+
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+
+
+/**
+ * Interface for the memory model of AnalyzeTool
+ */
+public interface IMemoryActivityModel {
+	
+	/**
+	 * Sets the data to use. This will cause listeners to be notified.
+	 * @param processes The list of processes to set
+	 */
+	public void addProcesses(AbstractList<ProcessInfo> processes);
+	
+	/**
+	 * Sets the selected ProcessInfo
+	 * @param processInfo
+	 */
+	public void setSelectedProcess(ProcessInfo processInfo);
+	
+	/**
+	 * returns the last selected process
+	 * @return
+	 */
+	public ProcessInfo getSelectedProcess();
+
+	/**
+	 * get the start time of the process that started first
+	 * @return time
+	 */
+	public Long getFirstProcessTime();
+
+	/**
+	 * get end time of the process that ended last
+	 * @return
+	 */
+	public Long getLastProcessTime();
+
+	/**
+	 * get get first point time from all processes
+	 * @return time
+	 */
+	public Long getFirstMemOpTime();
+
+	/**
+	 * get last point time from all processes
+	 * @return time
+	 */
+	public Long getLastMemOpTime();
+
+	/**
+	 * get highest cumulated memory
+	 * @return size
+	 */
+	public int getHighestCumulatedMemoryAlloc();
+
+	/**
+	 * get list of processes
+	 * @return processes
+	 */
+	public AbstractList<ProcessInfo> getProcesses();
+
+	
+	/**
+	 * @param listener the listener to register
+	 */
+	void addListener(IMemoryActivityModelChangeListener listener);
+	
+	/**
+	 * @param listener the listener to remove
+	 */
+	void removeListener(IMemoryActivityModelChangeListener listener);
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/IMemoryActivityModelChangeListener.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class IMemoryActivityModelChangeListener
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine;
+
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+
+/**
+ * 
+ * A change listener for {@link IMemoryActivityModel}
+ */
+public interface IMemoryActivityModelChangeListener {
+	
+	/** 
+	 * callback when data has been added to the model
+	 * and is ready to be used
+	 */
+	public void onProcessesAdded();
+	
+	/**
+	 * callback when a process has been selected
+	 * @param ProcessInfo The ProcessInfo of the newly selected process
+	 */
+	public void onProcessSelected(ProcessInfo processId);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/MMPInfo.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class MMPInfo
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+
+import com.nokia.s60tools.analyzetool.global.Util;
+
+/**
+ * Contains one mmp(module) file info.
+ *
+ * @author kihe
+ *
+ */
+public class MMPInfo {
+
+	/** String mmp file name. */
+	private final String mmpName;
+
+	/** mmp file path. */
+	private String mmpFilePath = "";
+
+	/** mmp file target. */
+	private String mmpTarget = "";
+
+	/** Is this mmp(module) build successfully. */
+	private boolean buildSuccesfully = false;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name
+	 *            MMP file name
+	 */
+	public MMPInfo(final String name) {
+		mmpName = name;
+	}
+
+	/**
+	 * Gets mmp file location.
+	 *
+	 * @return MMP file location if it is set otherwise ""
+	 */
+	public final String getLocation() {
+		return mmpFilePath;
+	}
+
+	/**
+	 * Returns mmp file name.
+	 *
+	 * @return MMP file name
+	 */
+	public final String getName() {
+		return mmpName;
+	}
+
+	/**
+	 * Returns mmp file target.
+	 *
+	 * @return MMP file target
+	 */
+	public final String getTarget() {
+		return mmpTarget;
+	}
+
+	/**
+	 * Returns info is mmp file built successfully.
+	 *
+	 * @return True if module is build successfully otherwise False
+	 */
+	public final boolean isBuildSuccesfully() {
+		return buildSuccesfully;
+	}
+
+	/**
+	 * Sets info is mmp file build with AnalyzeTool.
+	 *
+	 * @param build
+	 *            Build info
+	 */
+	public final void setBuildInfo(final boolean build) {
+		buildSuccesfully = build;
+	}
+
+	/**
+	 * Sets info is mmp file build with AnalyzeTool.
+	 *
+	 * @param location
+	 *            MMP file location
+	 */
+	public final void setBuildInfoAndCheck(final String location) {
+		buildSuccesfully = Util.isModuleBuild(location);
+	}
+
+	/**
+	 * MMP file location.
+	 *
+	 * @param location
+	 *            MMP file location
+	 */
+	public final void setLocation(final String location) {
+		IFile file = null;
+
+		// try to find file
+		file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+				new Path(location));
+
+		// file found from workspace store file location
+		if (file.exists()) {
+			mmpFilePath = file.getLocation().toOSString();
+
+		}
+		setBuildInfoAndCheck(mmpFilePath);
+	}
+
+	/**
+	 * Sets mmp file target.
+	 *
+	 * @param target
+	 *            MMP file target
+	 */
+	public final void setTarget(final String target) {
+		mmpTarget = target;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ParseAnalyzeData.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,933 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ParseAnalyzeData
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IStatus;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocCallstack;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.DllLoad;
+import com.nokia.s60tools.analyzetool.engine.statistic.FreeInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Parses trace messages which comes thru tracing utility.
+ * If one message contains PCSS prefix the message will saved to the data file Data file will be saved
+ * to the project [bld.inf location]\atool_temp folder.
+ *
+ * @author kihe
+ *
+ */
+public class ParseAnalyzeData {
+
+	private static final String KEYWORD_ABNORMAL = "ABNORMAL";//$NON-NLS-1$
+	/** FileOutputStream . */
+	private FileOutputStream fis;
+
+	/** File. */
+	private File file;
+
+	/** Contains information which processes are started. */
+	private final Hashtable<String, Integer> processStart;
+
+	/** Contains information which processes are ended. */
+	private final AbstractList<Integer> processEnd;
+
+
+	/** Contains information of where to save trace data. */
+	private String usedFilePath;
+
+	/** Contains active process information. */
+	public Hashtable<Integer, ProcessInfo> processes;
+
+	/**
+	 * Contains list of executed process. One process will begin in the
+	 * PROCESS_START and ends with the PROCESS_END tag
+	 */
+	private final AbstractList<ProcessInfo> processList;
+
+	/**
+	 * Allocation cache
+	 * Used when one free info is separated to multiple lines.
+	 */
+	private final Hashtable<Long, AllocInfo> allocCache;
+
+
+	/**
+	 * Deallocation cache.
+	 * Used when one free info is separated to multiple lines.
+	 */
+	private final Hashtable<Long, FreeInfo> freeCache;
+
+
+	/**
+	 * Cache for dll loads.
+	 * We must find dll load item for every allocation callstack item.
+	 * This is heavy process and usually we must find more than thousand times.
+	 * So when using cache for found items => it makes finding process more rapid than without it.
+	 */
+	private final Hashtable<Long, DllLoad> dllLoadCache;
+
+
+	/**
+	 * Flag to determinate need to save parsed data to file.
+	 * If this flag is set to "true" all the lines which contains PCSS are saved to the file.
+	 * Otherwise just parse the file/trace content.
+	 */
+	boolean saveDataToFile;
+
+	boolean createGraphModel;
+	/**
+	 * Constructor.
+	 * @param saveData Need to save data to file.
+	 */
+	public ParseAnalyzeData(boolean saveData, boolean createModel) {
+
+		processStart = new Hashtable<String, Integer>();
+		processEnd = new ArrayList<Integer>();
+		processes = new Hashtable<Integer, ProcessInfo>();
+		processList = new ArrayList<ProcessInfo>();
+		allocCache = new Hashtable<Long, AllocInfo>();
+		saveDataToFile = saveData;
+		dllLoadCache = new Hashtable<Long, DllLoad>();
+		freeCache = new Hashtable<Long, FreeInfo>();
+		createGraphModel = createModel;
+	}
+
+	/**
+	 * Add one dllLoad object to process related list
+	 *
+	 * @param dllLoad
+	 *            One DllLoad
+	 */
+	private void addDllLoad(DllLoad dllLoad) {
+		// if one of the started process contains same process id what dll load
+		// has add dll load to list
+		if (processes.containsKey(dllLoad.getProcessID())) {
+			ProcessInfo tempProcessInfo = processes.get(dllLoad.getProcessID());
+			tempProcessInfo.addOneDllLoad(dllLoad);
+		}
+	}
+
+	/**
+	 * Add one memory allocation info to process related list
+	 *
+	 * @param info
+	 *            One memory allocation info
+	 */
+	private void addMemAddress(AllocInfo info) {
+		// if one of the started process contains same process id what memory
+		// allocation has add memory allocation info to list
+		if (processes.containsKey(info.getProcessID())) {
+			ProcessInfo tempProcessInfo = processes.get(info.getProcessID());
+			tempProcessInfo.addOneAlloc(info);
+		}
+	}
+
+
+	/**
+	 * Removes memory allocation from process related
+	 * memory allocations list.
+	 *
+	 * @param info Deallocation info
+	 */
+	private void removeMemAddress(FreeInfo info) {
+		if (processes.containsKey(info.getProcessID())) {
+			ProcessInfo tempProcessInfo = processes.get(info.getProcessID());
+			tempProcessInfo.free(info);
+		}
+
+	}
+	/**
+	 * Closes the input stream if it is open.
+	 */
+	private final void closeStreams() {
+		try {
+
+			// if fis exists => close fis
+			if (fis != null) {
+				fis.close();
+
+				// clear file and fis
+				file = null;
+				fis = null;
+			}
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+		}
+	}
+
+	/**
+	 * Finish the writing.
+	 *
+	 */
+	public final void finish() {
+
+		try {
+			// if some data is not write to file yet => do it now
+			if (fis != null) {
+				fis.flush();
+			}
+		} catch (IOException ioe) {
+			return;
+		} finally {
+
+			// close needed streams
+			closeStreams();
+		}
+
+		// clear stored data
+		processList.clear();
+		processes.clear();
+		processStart.clear();
+		processEnd.clear();
+		allocCache.clear();
+		freeCache.clear();
+		dllLoadCache.clear();
+	}
+
+	/**
+	 * Return memory allocation size for all started processes.
+	 *
+	 * @return Memory allocation size for all started processes
+	 */
+	public final int getAllocationsSize() {
+		int allocCnt = 0;
+		// get memory allocations count from ongoing processes
+		for (ProcessInfo p : processes.values()) {
+			//the current number of memory allocations is traced as potential memory leaks
+			allocCnt += p.getMemLeaksNumber();
+		}
+		
+		//get memory allocations count from already ended processes
+		Iterator<ProcessInfo> iterPro = processList.iterator();
+		while( iterPro.hasNext() ) {
+			ProcessInfo oneInfo = iterPro.next();
+			allocCnt += oneInfo.getMemLeaksNumber();
+		}
+		return allocCnt;
+	}
+
+	/**
+	 * Gets used data file name.
+	 *
+	 * @return Data file name
+	 */
+	public final String getDataFileName() {
+		return usedFilePath;
+	}
+
+	/**
+	 * Checks given path if it is null set used path to point java temp
+	 * directory.
+	 *
+	 * @param path
+	 *            Given path
+	 * @return Data file location
+	 */
+	private final String getFileName(final String path) {
+		if (path == null || ("").equals(path)) {
+			// null path given => use java temp dir
+			usedFilePath = System.getProperty("java.io.tmpdir")
+					+ Constants.FILENAME;
+		} else if (!path.contains(Constants.FILENAME)) {
+			usedFilePath = path + Constants.FILENAME;
+		}
+		return usedFilePath;
+	}
+
+	/**
+	 * Gets started process info.
+	 *
+	 * @return Hashtable<String, String> Started processes info
+	 */
+	public final Hashtable<String, Integer> getStartedProcesses() {
+		if (processStart.isEmpty()) {
+			return null;
+		}
+		return processStart;
+	}
+
+	/**
+	 * Returns stored statistic
+	 *
+	 * @return Stored statistic
+	 */
+	public AbstractList<ProcessInfo> getStatistic() {
+		return processList;
+	}
+
+	/**
+	 * Opens the needed streams.
+	 *
+	 * @param filePath
+	 *            File name and path where to save trace data
+	 *
+	 * @return True if stream could be opened otherwise false
+	 */
+	public final boolean openStreams(final String filePath) {
+
+		boolean returnValue = false;
+		try {
+			// store used data file name
+			usedFilePath = getFileName(filePath);
+
+			// if file did not exists => create it
+			if (file == null) {
+				file = new File(usedFilePath);
+			}
+
+			// if fis did not exists => open it
+			if (fis == null) {
+				fis = new FileOutputStream(file, false);
+			}
+			returnValue = true;
+		} catch (FileNotFoundException fno) {
+
+			// if error occurs => close open streams
+			closeStreams();
+			returnValue = false;
+		}
+		return returnValue;
+	}
+
+	/**
+	 * Executes parser.
+	 *
+	 * @param data
+	 *            File name to be used
+	 */
+	public final boolean parse(final String data) {
+
+		try{
+			// if no data => leave
+			if (data == null) {
+				//although the data is null
+				//return true because false is returned only when
+				//some unexpected error occurs
+				return true;
+			}
+
+			// if data must be saved to project group\atool_temp folder
+			if(saveDataToFile) {
+				// open needed streams
+				openStreams(usedFilePath);
+			}
+
+			// if data contains desired prefix => write data to file
+			boolean contains = data.contains(Constants.PREFIX);
+
+			if (contains) {
+				writeDataToFile(data);
+			}
+			return true;
+		}catch(OutOfMemoryError oome) {
+			return false;
+		}catch(Exception e) {
+			Activator.getDefault().log(IStatus.ERROR, "AnalyzeTool - parsing trace data", e);
+			return false;
+		}
+	}
+
+	/**
+	 * Fills dll load item information. Check what data file version is used,
+	 * because data file format is changed.
+	 * 
+	 * @param dllLoad
+	 *            Dll load item
+	 * @param splittedText
+	 *            One line of trace data file.
+	 */
+	private void fillDllLoadInfo(DllLoad dllLoad, String[] splittedText) {
+		int processID = dllLoad.getProcessID();
+		if(processes.containsKey(processID)) {
+			ProcessInfo processInfo = processes.get(processID);
+
+			//if data file contains also time stamp for dll load
+			//this information is added later than other information
+			//thats why we must check which version is used.
+			if( processInfo.getTraceDataVersion() > 1 && splittedText.length > 6 ) {
+				dllLoad.setLoadTime(splittedText[4]);
+				dllLoad.setStartAddress(splittedText[5]);
+				dllLoad.setEndAddress(splittedText[6]);
+			}
+			else {
+				dllLoad.setStartAddress(splittedText[4]);
+				dllLoad.setEndAddress(splittedText[5]);
+			}
+		}
+	}
+
+	/**
+	 * Parses "FREE" tag information from the trace data file.
+	 *
+	 * Note! This tag is not used in current version,
+	 * this is support for older version of trace data files.
+	 * @param splitted One line content of trace file.
+	 */
+	private void parseFree(String[] splitted) {
+		
+		// check that there is enough data
+		// at least we need know to memory address 
+		// which is forth item of trace data
+		if( splitted.length > 3 ) {
+			String processID = splitted[1];
+			FreeInfo freeInfo = new FreeInfo();
+			freeInfo.setProcessID(processID);
+			freeInfo.setMemoryAddress(splitted[3]);
+			removeMemAddress(freeInfo);
+		}
+	}
+
+
+	/**
+	 * Parse dealloction header from the line
+	 * @param line Allocation header line
+	 */
+	private void parseFreeHeader(String[] splitted) {
+		//get free line info
+		String processID = splitted[1];
+		FreeInfo freeInfo = new FreeInfo();
+		freeInfo.setProcessID(processID);
+
+		freeInfo.setMemoryAddress(splitted[3]);
+		
+		if( createGraphModel ) {
+		
+			int traceFileVersion = 1;
+			//get trace file version
+			if(processes.containsKey(freeInfo.getProcessID())) {
+				ProcessInfo processInfo = processes.get(freeInfo.getProcessID());
+				traceFileVersion = processInfo.getTraceDataVersion();
+			}
+			// how many callstakc items
+			int callstackCount = 0;
+
+			// index where the callstack addresses begins
+			int startIndex = 5;
+
+			//if using the new trace file format
+			if( traceFileVersion > 1 ) {
+				freeInfo.setTime(splitted[4]);
+				callstackCount = Integer.parseInt(splitted[5], 16);
+				startIndex = 6;
+			}
+			else {
+				callstackCount = Integer.parseInt(splitted[5], 16);
+			}
+
+			AbstractList<AllocCallstack> callstack = new ArrayList<AllocCallstack>();
+			createCallstack(splitted, freeInfo.getProcessID(), callstack, startIndex);
+			freeInfo.addCallstack(callstack);
+			
+			//if this free item contains fragments
+			//so we must store this info to cache
+			//and rest of the callstack items later
+			if( callstackCount > (splitted.length-startIndex) ) {
+				freeCache.put(freeInfo.getMemoryAddress(), freeInfo);
+			}
+		}
+		
+		removeMemAddress(freeInfo);
+
+		
+	}
+
+
+	/**
+	 * Parse dealloction fragment from the line
+	 * @param line Allocation fragment line
+	 */
+	private void parseFreeFragment(String[] splitted)
+	{
+		if( createGraphModel ) {
+			String procId = splitted[1];
+			int processId = Integer.parseInt(procId,16);
+			if (processes.containsKey(processId)) {
+				String memAddr = splitted[3];
+				Long memoryAddress =Long.parseLong(memAddr, 16);
+				Long time = Long.parseLong(splitted[4],16);
+				String packetNumber = splitted[5];
+
+				//if cache contains corresponding free info
+				if (freeCache.containsKey(memoryAddress)) {
+					FreeInfo info = freeCache.get(memoryAddress);
+					if (info.getMemoryAddress() == memoryAddress && info.getTime() == time ) {
+						AbstractList<AllocCallstack> callstack = new ArrayList<AllocCallstack>();
+						createCallstack(splitted, processId, callstack, 6);
+						info.updateFragment(callstack, packetNumber);
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Remove dll load from the list.
+	 * This provides functionality for dynamically loaded dll loads
+	 * @param dllLoad DllLoad item to unload
+	 */
+	private void unloadDll( DllLoad dllLoad )
+	{
+		if (processes.containsKey(dllLoad.getProcessID())) {
+			ProcessInfo tempProcessInfo = processes.get(dllLoad.getProcessID());
+			tempProcessInfo.unloadOneDll(dllLoad);
+
+			//remove found dll load item from cache
+			for( java.util.Enumeration<Long> e = dllLoadCache.keys(); e.hasMoreElements();)
+			{
+				Long key = e.nextElement();
+				DllLoad tempDllLoad = dllLoadCache.get(key);
+
+				// if values equals remove it from the list
+				if (tempDllLoad.getProcessID() == dllLoad.getProcessID() && tempDllLoad.getStartAddress() == dllLoad.getStartAddress()
+						&& tempDllLoad.getEndAddress() == dllLoad.getEndAddress() && tempDllLoad.getName() == tempDllLoad.getName()) {
+					dllLoadCache.remove(key);
+				}
+			}
+
+		}
+	}
+
+	/**
+	 * Parse allocation header info from the line
+	 * @param line Allocation line
+	 */
+	private void parseAllocHeader(String[] splitted)
+	{
+		try {
+			String procID = splitted[1];
+			int processID = Integer.parseInt(procID, 16);
+			if (processes.containsKey(processID)) {
+				AllocInfo oneAlloc = new AllocInfo();
+				oneAlloc.setProcessID(procID);
+				oneAlloc.setMemoryAddress(splitted[3]);
+				if( createGraphModel ) {
+					oneAlloc.setTime(splitted[4]);
+					
+					oneAlloc.setSizeInt(Integer.parseInt(splitted[5], 16));
+					// if one trace message contains callstack
+					if (splitted.length > 6) {
+
+						AbstractList<AllocCallstack> callstack = new ArrayList<AllocCallstack>();
+						createCallstack(splitted, processID, callstack, 7);
+						oneAlloc.addCallstack(callstack);
+						allocCache.put(oneAlloc.getMemoryAddress(), oneAlloc);
+					}
+				}
+				addMemAddress(oneAlloc);
+			}
+		} catch (NumberFormatException nfe) {
+			nfe.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Parse allocation fragment from the line
+	 * 
+	 * @param line
+	 *            Allocation fragment line
+	 */
+	private void parseAllocFragment(String[] splitted) {
+		if( createGraphModel ) {
+			String procId = splitted[1];
+			int processId = Integer.parseInt(procId, 16);
+			if (processes.containsKey(processId)) {
+				String memAddr = splitted[3];
+				Long memoryAddress = Long.parseLong(memAddr,16);
+				Long time = Long.parseLong(splitted[4],16);
+				String packetNumber = splitted[5];
+
+				if (allocCache.containsKey(memoryAddress)) {
+					AllocInfo info = allocCache.get(memoryAddress);
+					if (info.getMemoryAddress() == memoryAddress && info.getTime() == time) {
+						AbstractList<AllocCallstack> callstack = new ArrayList<AllocCallstack>();
+						createCallstack(splitted, processId, callstack, 6);
+						info.updateFragment(callstack, packetNumber);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Creates callstack values
+	 * 
+	 * @param splitted
+	 *            Callstack values
+	 * @param processId
+	 *            Process id
+	 * @param callstack
+	 *            Callstack reference where the callstack values are added
+	 * @param startIndex
+	 *            Index where to start parse callstack values
+	 */
+	private void createCallstack(String[] splitted, int processId, AbstractList<AllocCallstack> callstack, int startIndex) {
+		// append whole callstack as a one memory address
+		for (int i = startIndex; i < splitted.length; i++) {
+			try{
+				AllocCallstack allocCAll = new AllocCallstack();
+				allocCAll.setMemoryAddress(splitted[i]);
+
+				// define dll load for current alloc
+				DllLoad dllLoad = getDllLoadName(processId, Long.parseLong(splitted[i],16));
+				if( dllLoad != null ) {
+					allocCAll.setDllLoad(dllLoad);
+					callstack.add(allocCAll);	
+				}
+			} catch(NumberFormatException nfe) {
+				//no nothing by design
+				
+			} catch( Exception e ) {
+				//no nothing by design
+			}
+			
+		}
+	}
+
+	/**
+	 * Parses memory address from the one trace message line. Parses one trace
+	 * message whole callstack to one memory address. This memory address is
+	 * used to calculate most used memory allocation location.
+	 * 
+	 * @param line
+	 *            One trace message
+	 */
+	private void parseMemAddressesFromLine(String[] splitted) {
+
+		//TODO
+		String processID = splitted[1];
+		if (processes.containsKey(processID)) {
+			AllocInfo oneAlloc = new AllocInfo();
+			oneAlloc.setProcessID(processID);
+			oneAlloc.setMemoryAddress(splitted[3]);
+			oneAlloc.setTime(splitted[4]);
+			oneAlloc.setSizeInt(Integer.parseInt(splitted[5], 16));
+
+			// if one trace message contains callstack
+			if (splitted.length > 5) {
+				AbstractList<AllocCallstack> callstack = new ArrayList<AllocCallstack>();
+				// append whole callstack as a one memory address
+				for (int i = 6; i < splitted.length; i++) {
+					AllocCallstack allocCAll = new AllocCallstack();
+					allocCAll.setMemoryAddress(splitted[i]);
+
+					// define dll load for current alloc
+					DllLoad dllLoad = getDllLoadName(oneAlloc.getProcessID(), allocCAll.getMemoryAddress());
+					if (dllLoad != null) {
+						allocCAll.setDllLoad(dllLoad);
+					}
+
+					callstack.add(allocCAll);
+				}
+				oneAlloc.addCallstack(callstack);
+				addMemAddress(oneAlloc);
+			}
+		}
+	}
+
+	/**
+	 * Returns dll load item for the memory address. Checks that entered memory
+	 * address is dll load memory area
+	 * 
+	 * @param processId
+	 *            Process id
+	 * @param memoryAddress
+	 *            Memory address
+	 * @return DllLoad item if found otherwise null
+	 */
+	private DllLoad getDllLoadName(int processId, Long memoryAddress) {
+		if (processes.containsKey(processId)) {
+			ProcessInfo tempProcessInfo = processes.get(processId);
+			Hashtable<String, DllLoad> loads = tempProcessInfo.getDllLoads();
+
+			// check does cache contains already corresponding item
+			if (dllLoadCache.containsKey(memoryAddress)) {
+				return dllLoadCache.get(memoryAddress);
+			}
+
+			// no item found in the cache loop thru the loaded dlls
+			for (java.util.Enumeration<String> e = loads.keys(); e.hasMoreElements();) {
+				try {
+					String key = e.nextElement();
+					DllLoad oneLoad = loads.get(key);
+					Long start = oneLoad.getStartAddress();
+					Long end =  oneLoad.getEndAddress();
+					Long actual = memoryAddress;
+					if (actual >= start && actual <= end) {
+						// dll load found => save it to cache and return it
+						dllLoadCache.put(memoryAddress, oneLoad);
+						return oneLoad;
+					}
+				} catch (java.lang.NumberFormatException nfe) {
+					// trace message corrupt?
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * process the line: switch on the event type and fill the model
+	 * 
+	 * @param aLine
+	 *            One debug print
+	 */
+	private final void parseLine(final String aLine) {
+
+		try {
+			// parse switch
+			int index = aLine.indexOf(Constants.PREFIX); // lines should be preceded
+			// with PCSS
+			String usedString = null;
+
+			if (index == -1 || index == 0) {
+				usedString = aLine;
+			} else {
+				usedString = aLine.substring(index, aLine.length());
+			}
+
+			String[] lineFragments = usedString.split(" ");
+
+			// determine the memory operation/event
+			String event = null;
+			if (lineFragments.length >= 3) {
+				event = lineFragments[2];
+			}
+
+			DllLoad dllLoad = null;
+
+			switch (Constants.Operation.toOperation(event)) {
+			case PROCESS_START:
+				// process PROCESS_START
+				parseProcessStarted(lineFragments);
+				break;
+			case PROCESS_END:
+				// process PROCESS_END
+				parseProcessEnded(lineFragments);
+				break;
+			case ALLOC:
+				// process ALLOC
+				parseMemAddressesFromLine(lineFragments);
+				break;
+			case FREE:
+				parseFree(lineFragments);
+				break;
+			case ALLOCH:
+				parseAllocHeader(lineFragments);
+				break;
+			case FREEH:
+				parseFreeHeader(lineFragments);
+				break;
+			case ALLOCF:
+				parseAllocFragment(lineFragments);
+				break;
+			case FREEF:
+				parseFreeFragment(lineFragments);
+				break;
+			case DLL_LOAD:
+				if(createGraphModel) {
+					dllLoad = new DllLoad();
+					dllLoad.setProcessID(lineFragments[1]);
+					dllLoad.setName(lineFragments[3]);
+					fillDllLoadInfo(dllLoad, lineFragments);
+					addDllLoad(dllLoad);
+				}
+				break;
+			case DLL_UNLOAD:
+				if(createGraphModel) {
+					dllLoad = new DllLoad();
+					dllLoad.setProcessID(lineFragments[1]);
+					dllLoad.setName(lineFragments[3]);
+					fillDllLoadInfo(dllLoad, lineFragments);
+					unloadDll(dllLoad);
+				}
+				break;
+			default:
+				// ignore this line
+				break;
+			}
+		}catch(Exception e) {
+			Activator.getDefault().log(IStatus.ERROR, "Error while parsing data", e);
+		}
+		
+	}
+
+	/**
+	 * Processing PROCESS_END tag
+	 * @param lineFragments String[] containing split PROCESS_END tag line
+	 */
+	private void parseProcessEnded(String[] lineFragments) {
+
+		// process id
+		String procId = null;
+
+		// if data contains all the needed information
+		if (lineFragments.length >= 2) {
+			procId = lineFragments[1];
+		}
+		
+		int processId = Integer.parseInt(procId, 16);
+		if (processes.containsKey(processId)) {
+			if( lineFragments.length > 4 ){
+				//check is ABNORMAL process end and that there are enough data to parse
+				if( lineFragments[4].equals(KEYWORD_ABNORMAL) && lineFragments.length > 5 ) {
+					processes.get(processId).setEndTime(lineFragments[5]);	
+				}
+				else {
+					processes.get(processId).setEndTime(lineFragments[4]);
+				}	
+			}
+			
+
+			// store process id and process name
+			this.processEnd.add(processId);
+
+			if (processStart.containsValue(processId)) {
+				for (java.util.Enumeration<String> e = processStart.keys(); e.hasMoreElements();) {
+					Object key = e.nextElement();
+					Object value = processStart.get(key);
+					if (value.equals(processId)) {
+						processStart.remove(key);
+					}
+
+				}
+			}
+
+			// PROCESS_END tag reached
+			// check that started processes contains this process id.
+			ProcessInfo info = processes.get(processId);
+
+			// process found from the started processes list
+			// add it to list
+			if (info != null) {
+				addProcessInfoToList(processes.get(processId));
+			}
+
+			// remove process id from processes list
+			processes.remove(processId);
+
+			// clear the founded dll load items list
+			// this prevent that results between runs do not mixed up
+			dllLoadCache.clear();
+		}
+	}
+
+	/**
+	 * Processing PROCESS_START tag
+	 * @param lineFragments String[] containing split PROCESS_START tag line
+	 */
+	private void parseProcessStarted(String[] lineFragments) {
+
+		String procId = lineFragments[1];
+		int processId = Integer.parseInt(procId, 16);
+
+		ProcessInfo processInfo = new ProcessInfo();
+		processInfo.setProcessID(processId);
+
+		if (lineFragments.length >= 4) {
+			processInfo.setProcessName(lineFragments[3]);
+		}
+
+		if (lineFragments.length > 5) {
+			processInfo.setStartTime(lineFragments[5]);
+		}
+
+		// set trace data version number
+		// this information is used later when parsing e.g. one allocation
+		// information
+		if (lineFragments.length > 7) {
+			processInfo.setTraceDataVersion(lineFragments[7]);
+		}
+
+		// store process id and process name
+		if( lineFragments.length > 3 ) {
+			this.processStart.put(lineFragments[3], processId);
+			processes.put(processId, processInfo);
+		}
+	}
+
+	/**
+	 * Adds process info to the list
+	 * 
+	 * @param info
+	 *            ProcessInfo reference
+	 */
+	private void addProcessInfoToList(ProcessInfo info) {
+		if (processList.isEmpty()) {
+			processList.add(info);
+			return;
+		}
+		for (int i = 0; i < processList.size(); i++) {
+			ProcessInfo tempInfo = processList.get(i);
+			if( info.getStartTime() != null && info.getStartTime() < tempInfo.getStartTime() ){
+				processList.add(i, info);
+				return;
+			}
+		}
+		processList.add(info);
+	}
+
+	/**
+	 * Writes data to file if line contains wanted data.
+	 * 
+	 * @param data
+	 *            Data to write
+	 */
+	private void writeDataToFile(String data) {
+		try {
+
+			// check if data contains PROCESS_START or PROCESS_END tag
+			parseLine(data);
+
+			// if saveDataToFile flag is true => save data
+			if (saveDataToFile) {
+
+				if (fis == null) {
+
+					// streams not open => try to open
+					boolean returnValue = this.openStreams(usedFilePath);
+					if (!returnValue) {
+						return;
+					}
+				}
+
+				// append line feed and write given data to file
+				String dataAndLineFeed = data + "\n";
+
+				// write data
+				fis.write(dataAndLineFeed.getBytes("UTF-8"));
+			}
+
+		} catch (IOException ioe) {
+			return;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ParseXMLFileSAX.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,451 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ParseXMLFileSAX
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.core.resources.IProject;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * Parses atool.exe generated xml file and creates memory analysis results.
+ * Using the SAX parser to parse xml file. SAX parser fits better than DOM
+ * parser because it is possible that AT must handle very big xml files.
+ *
+ * @author kihe
+ *
+ */
+public class ParseXMLFileSAX implements org.xml.sax.ContentHandler {
+	/** XML constants. */
+	public static final String XML_BUILD_TARGET = "build_target";
+	public static final String XML_CALC_MEMADDR = "calc_addr";
+	public static final String XML_CALLSTACK = "callstack";
+	public static final String XML_COUNT = "count";
+	public static final String XML_END_TIME = "end_time";
+	public static final String XML_FILE = "file";
+	public static final String XML_FUNCTION = "function";
+	public static final String XML_FUNCTION_LINE = "function_line";
+	public static final String XML_HANDLE_LEAKS = "handle_leaks";
+	public static final String XML_ID = "id";
+	public static final String XML_ITEM = "item";
+	public static final String XML_LEAK = "leak";
+	public static final String XML_LEAKS = "leaks";
+	public static final String XML_LINE = "line";
+	public static final String XML_MEM_LEAKS = "mem_leaks";
+	public static final String XML_MEMADDR = "memaddress";
+	public static final String XML_MODULE = "module";
+	public static final String XML_NAME = "name";
+	public static final String XML_PROCESS_NAME = "process_name";
+	public static final String XML_RUN = "run";
+	public static final String XML_SIZE = "size";
+	public static final String XML_START_TIME = "start_time";
+	public static final String XML_SUBTEST = "subtest";
+	public static final String XML_TIME = "time";
+	public static final String XML_UNKNOWN = "???";
+
+	/**Active call stack item id*/
+	private int activeCallstackID = 1;
+
+	/** Active item(memory leak) information */
+	private AnalysisItem activeItem;
+
+	/**Active item(memory leak) id*/
+	private int activeItemID = 1;
+
+	/** Summary field active module memory leak count*/
+	private String activeModuleCount;
+
+	/** Summary field active module name*/
+	private String activeModuleName;
+
+	/** Active run information */
+	protected RunResults activeRunResults;
+
+	/** Contains all the runs parsed results */
+	private final AbstractList<RunResults> activeRuns;
+
+	/** Active subtest item information */
+	private Subtest activeSubtest;
+
+	/**Active subtest id*/
+	private int activeSubtestID = 1;
+
+	/** Active callstack item information */
+	private CallstackItem callstackItem;
+
+	/** xml file path. */
+	private final String filePath;
+
+	/** Do we parsing module leak summary field */
+	private boolean moduleLeakActive = true;
+
+	/** List of modules */
+	private final AbstractList<String> moduleList;
+
+	/** Do we parsing subtest info just now */
+	private boolean parsingSubtest = false;
+
+	/** Project reference */
+	private final IProject project;
+
+	/** Project result reference where to save results */
+	private final ProjectResults results;
+
+	/** Index for active items */
+	private int runID = 1;
+	
+
+	/**
+	 * Constructor.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 * @param newFilePath
+	 *            Used file path
+	 * @param projResults
+	 *            Project results reference
+	 */
+	public ParseXMLFileSAX(
+			final org.eclipse.core.resources.IProject projectRef,
+			final String newFilePath, final ProjectResults projResults) {
+		results = projResults;
+		filePath = newFilePath;
+		project = projectRef;
+		activeRuns = new ArrayList<RunResults>();
+		moduleList = new ArrayList<String>();
+	}
+
+	/**
+	 * Adds module name to list
+	 *
+	 * @param moduleName
+	 *            Module to add to the list
+	 */
+	private void addModuleNameToList(final String moduleName) {
+		if (moduleName == null || ("").equals(moduleName)) {
+			return;
+		}
+		if (!moduleList.contains(moduleName)) {
+			moduleList.add(moduleName);
+		}
+	}
+
+	public void characters(char[] ch, int start, int length) {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	/**
+	 * When the SAX parser reach the end of the XML file this function is
+	 * called.
+	 *
+	 * Updates results.
+	 */
+	public void endDocument() throws SAXException {
+		results.updateRunResults(project, activeRuns, filePath);
+	}
+
+	/**
+	 * When the SAX parser reach the end of the xml tag this function is called.
+	 *
+	 * Checks what tag read is finished and stores corresponding results
+	 */
+	public void endElement(String uri, String localName, String name)
+			throws SAXException {
+		// "results" tag => store results
+		if (name.equals(XML_RUN)) {
+			activeRuns.add(activeRunResults);
+		} else if (name.equals(XML_LEAK)) {
+
+			//not enough information so clear the active item
+			if( activeItem == null || !activeItem.checkData() ) {
+				activeItem = null;
+			}
+			else if (parsingSubtest) {
+				activeSubtest.addAnalysisItem(activeItem);
+			} else {
+				activeRunResults.addAnalysisItem(activeItem);
+			}
+		} else if (name.equals(XML_ITEM)) {
+			if( callstackItem.isEmpty() ) {
+				callstackItem = null;
+			}
+			else {
+				activeItem.addCallstackItem(callstackItem);
+			}
+		} else if (name.equals(XML_SUBTEST)) {
+			activeRunResults.addSubtest(activeSubtest);
+			parsingSubtest = false;
+		} else if (name.equals(XML_MODULE)) {
+
+			try {
+				// check that module count value is valid
+				if (activeModuleCount == null || ("").equals(activeModuleCount)) {
+					moduleLeakActive = true;
+					return;
+				}
+
+				// convert module count information to string object
+				int count = Integer.parseInt(activeModuleCount,16);
+
+				// if module leak summary is active
+				if (moduleLeakActive) {
+					activeRunResults.addModuleLeak(activeModuleName, count);
+				}
+				// if handle leak summary is active
+				else {
+					activeRunResults.addHandleLeak(activeModuleName, count);
+				}
+
+			}catch( NumberFormatException npe ) {
+				npe.printStackTrace();
+			}
+		}
+	}
+
+	public void endPrefixMapping(String prefix) throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	/**
+	 * Returns list of modules
+	 *
+	 * @return List of modules
+	 */
+	public AbstractList<String> getModules() {
+		return moduleList;
+	}
+
+	public void ignorableWhitespace(char[] ch, int start, int length)
+			throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	/**
+	 * Parses xml file content.
+	 *
+	 * @return True if there are no errors while parsing XML file otherwise
+	 *         False
+	 */
+	public final boolean parse() {
+
+		boolean ret = false;
+		try {
+
+			// check that file exists
+			File file = new File(filePath);
+			if (file.exists()) {
+
+				SAXParserFactory factor = null;
+				SAXParser parser = null;
+				XMLReader xmlReader = null;
+
+				// get parser factory
+				factor = SAXParserFactory.newInstance();
+
+				if (factor != null) {
+					// get xml parser
+					parser = factor.newSAXParser();
+
+					if (parser != null) {
+						// get xml reader
+						xmlReader = parser.getXMLReader();
+
+						if (xmlReader != null) {
+							// set content handle to this class
+							xmlReader.setContentHandler(this);
+
+							// parse xml file
+							xmlReader.parse(new InputSource(file.getPath()));
+							ret = true;
+						}
+					}
+				}
+			}
+
+			// file does not exists
+			else {
+				ret = false;
+			}
+
+			//check that XML file contains data
+			//otherwise return false
+			if( activeRunResults == null ) {
+				ret = false;
+			}
+		} catch (SAXException sae) {
+			sae.printStackTrace();
+			ret = false;
+		} catch (ParserConfigurationException pce) {
+			pce.printStackTrace();
+			ret = false;
+		} catch (IOException ioe) {
+			ioe.printStackTrace();
+			ret = false;
+		}
+
+		// no errors => return positive value
+		return ret;
+	}
+
+	public void processingInstruction(String target, String data)
+			throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	public void setDocumentLocator(Locator locator) {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	public void skippedEntity(String name) throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	public void startDocument() throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+
+	/**
+	 * When the SAX parser start to read xml tag this function is called.
+	 *
+	 * Checks what tag read is started and initializes corresponding objects
+	 */
+	public void startElement(String uri, String localName, String name,
+			Attributes atts) throws SAXException {
+
+		//parse one run information
+		if (name.equals(XML_RUN)) {
+			activeRunResults = new RunResults(runID);
+			activeRunResults.setEndTime(atts.getValue(XML_END_TIME));
+			activeRunResults.setBuildTarget(atts.getValue(XML_BUILD_TARGET));
+			activeRunResults.setProcessName(atts.getValue(XML_PROCESS_NAME));
+			activeRunResults.setStartTime(atts.getValue(XML_START_TIME));
+			runID++;
+			activeItemID = 1;
+			activeSubtestID = 1;
+		}
+		//parse one memory leak information
+		else if (name.equals(XML_LEAK)) {
+			try {
+				activeItem = new AnalysisItem();
+				activeItem.setID(activeItemID);
+				activeItem.setMemoryAddress(atts.getValue(XML_MEMADDR));
+				activeItem.setMemoryLeakTime(atts.getValue(XML_TIME));
+				String moduleName = atts.getValue(XML_MODULE);
+				addModuleNameToList(moduleName);
+				activeItem.setModuleName(moduleName);
+				String size = atts.getValue(XML_SIZE);
+				if (size != null && !("").equals(size)) {
+					activeItem.setLeakSize(Integer
+							.parseInt(size));
+				}
+
+			}catch(NumberFormatException npe) {
+				npe.printStackTrace();
+			}
+			activeItemID++;
+			activeCallstackID = 1;
+		}
+		//parse call stack item information
+		else if (name.equals(XML_ITEM)) {
+			try{
+				//create new item
+				callstackItem = new CallstackItem();
+				callstackItem.setID(activeCallstackID);
+				callstackItem.setFileName(atts.getValue(XML_FILE));
+				callstackItem.setFunctionName(atts.getValue(XML_FUNCTION));
+				callstackItem.setMemoryAddress(atts.getValue(XML_MEMADDR));
+
+				//get module name and add it to list
+				//module name list is used later.
+				String moduleName = atts.getValue(XML_MODULE);
+				addModuleNameToList(moduleName);
+				callstackItem.setModuleName(moduleName);
+
+				//if line number is added to the XML file
+				//this means that the results are generated to UREL
+				String lineNumber = atts.getValue(XML_LINE);
+				if (lineNumber != null && !("").equals(lineNumber) && !(XML_UNKNOWN).equals(lineNumber)) {
+					callstackItem.setLeakLineNumber(Integer.parseInt(lineNumber));
+				}
+
+				//if function line is added to the XML file
+				//this means that the results are generated to UREL
+				String functionLine = atts.getValue(XML_FUNCTION_LINE);
+				if (functionLine != null && !("").equals(functionLine) && !(XML_UNKNOWN).equals(functionLine)) {
+					callstackItem.setLeakLineNumber(Integer.parseInt(functionLine));
+					callstackItem.setUrelBuild(true);
+				}
+			}catch(NumberFormatException npe) {
+				npe.printStackTrace();
+			}
+			activeCallstackID++;
+
+		}
+		//parse subtest information
+		else if (name.equals(XML_SUBTEST)) {
+			activeSubtest = new Subtest(activeSubtestID);
+			activeItemID = 1;
+			activeCallstackID = 1;
+			activeSubtest.setEndTime(atts.getValue(XML_END_TIME));
+			activeSubtest.setName(atts.getValue(XML_NAME));
+			activeSubtest.setStartTime(atts.getValue(XML_START_TIME));
+			parsingSubtest = true;
+			activeSubtestID++;
+		} else if (name.equals(XML_HANDLE_LEAKS)) {
+			moduleLeakActive = false;
+		} else if (name.equals(XML_MEM_LEAKS)) {
+			moduleLeakActive = true;
+		} else if (name.equals(XML_MODULE)) {
+			activeModuleName = atts.getValue(XML_NAME);
+			activeModuleCount = atts.getValue(XML_LEAKS);
+		}
+
+	}
+
+	public void startPrefixMapping(String prefix, String uri)
+			throws SAXException {
+		// Do nothing be design, because AT is not interested of this
+		// information
+		// also this method is overloaded
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ProjectResults.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ProjectResults
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.eclipse.core.resources.IProject;
+
+import com.nokia.s60tools.analyzetool.global.Util;
+
+/**
+ * Stores project related memory analysis results.
+ *
+ * @author kihe
+ *
+ */
+public class ProjectResults {
+
+	/** Contains project related results. */
+	private final Hashtable<IProject, AbstractList<RunResults>> projRelatedRes;
+
+	/** Contains project related data file path and name. */
+	private final Hashtable<IProject, String> projDataFile;
+
+	/** Contains list of project unknown componets */
+	private final Hashtable<IProject, AbstractList<String>> projectUnknownComp;
+
+
+	/**
+	 * Constructor.
+	 */
+	public ProjectResults() {
+		projRelatedRes = new Hashtable<IProject, AbstractList<RunResults>>();
+		projDataFile = new Hashtable<IProject, String>();
+		projectUnknownComp = new Hashtable<IProject, AbstractList<String>>();
+	}
+
+	/**
+	 * Clears all the stored data.
+	 */
+	public final void clear() {
+		projDataFile.clear();
+		projRelatedRes.clear();
+		projectUnknownComp.clear();
+	}
+
+	/**
+	 * Clears given project data.
+	 *
+	 * @param project
+	 *            Project reference
+	 */
+	public final void clearProjectData(final IProject project) {
+		// existing data contains project => delete it
+		if (projRelatedRes.containsKey(project)) {
+			projRelatedRes.remove(project);
+		}
+
+		// delete data file
+		if (projDataFile.containsKey(project)) {
+			projDataFile.remove(project);
+		}
+
+		// remove project unknown components
+		if(projectUnknownComp.containsKey(project)) {
+			projectUnknownComp.remove(project);
+		}
+	}
+
+	/**
+	 * Check that contains given project some data.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @return True if project contains data, otherwise False
+	 */
+	public final boolean contains(final IProject project) {
+		if (project == null) {
+			return false;
+		}
+		return projRelatedRes.containsKey(project);
+	}
+
+	/**
+	 * Gets project related data file name.
+	 *
+	 * @param projRef
+	 *            Project reference
+	 * @return Data file or null
+	 */
+	public final String getDataFileName( final IProject projRef) {
+
+		if( projDataFile == null || projDataFile.isEmpty() ) {
+			return null;
+		}
+		// if selected project contains data file
+		if (projDataFile.containsKey(projRef)) {
+			// thru projects
+			for (java.util.Enumeration<IProject> e = projDataFile.keys(); e
+					.hasMoreElements();) {
+				// get project ref
+				IProject key = e.nextElement();
+
+				// if project ref equals selected project
+				if (key.equals(projRef)) {
+					// return data file name
+					return projDataFile.get(key);
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * Gets project results by project reference.
+	 *
+	 * @param projRef
+	 *            Project reference
+	 * @return Project moduleresults
+	 */
+	public final AbstractList<RunResults> getResults(final IProject projRef) {
+		// if selected project contains results
+		if (projRelatedRes.containsKey(projRef)) {
+			// thru projects
+			for (java.util.Enumeration<IProject> e = projRelatedRes.keys(); e
+					.hasMoreElements();) {
+				// get project ref
+				IProject key = e.nextElement();
+
+				// if project ref equals selected project
+				if (key.equals(projRef)) {
+					// return project results
+					return projRelatedRes.get(key);
+				}
+			}
+		}
+		// project does not contain existing results
+		// =>just return empty results
+		return new ArrayList<RunResults>();
+	}
+
+	/**
+	 * Gets project run results by run ID.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @param runID
+	 *            Given run ID
+	 * @return Project run results if exists, otherwise null
+	 */
+	public final RunResults getRun(final IProject project, final int runID) {
+		AbstractList<RunResults> runs = getResults(project);
+		Iterator<RunResults> iterRuns = runs.iterator();
+		while (iterRuns.hasNext()) {
+			RunResults oneRunRes = iterRuns.next();
+			if (oneRunRes.getItemID() == runID) {
+				return oneRunRes;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets project one AnalysisItem by run ID and leak ID.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @param runID
+	 *            Given run ID
+	 * @param leakID
+	 *            Given leak ID
+	 * @return AlysisItem if exists, otherwise null
+	 */
+	public final AnalysisItem getSpecific(final IProject project, final int runID, final int leakID) {
+		AbstractList<RunResults> runs = getResults(project);
+		Iterator<RunResults> iterRuns = runs.iterator();
+		while (iterRuns.hasNext()) {
+			RunResults oneRunRes = iterRuns.next();
+			if (oneRunRes.getItemID() == runID) {
+				AbstractList<AnalysisItem> items = oneRunRes.getAnalysisItems();
+				Iterator<AnalysisItem> iterItems = items.iterator();
+				while (iterItems.hasNext()) {
+					AnalysisItem oneItem = iterItems.next();
+					if (oneItem.getID() == leakID) {
+						return oneItem;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets subtest info for given project and given run.
+	 *
+	 * @param project
+	 *            Project reference
+	 * @param runID
+	 *            Current run ID
+	 * @param leakID
+	 *            Current leak ID
+	 * @param subtestID
+	 *            Subtest ID
+	 * @return Subtest if it exists otherwise null
+	 */
+	public final AnalysisItem getSubtestItem(final IProject project, final int runID, final int leakID,
+			final int subtestID) {
+		// get project runs
+		AbstractList<RunResults> runs = getResults(project);
+		Iterator<RunResults> iterRuns = runs.iterator();
+
+		// thru runs
+		while (iterRuns.hasNext()) {
+			RunResults oneRunRes = iterRuns.next();
+
+			// run ID equals given ID
+			if (oneRunRes.getItemID() == runID) {
+				// get run subtest
+				AbstractList<Subtest> subtests = oneRunRes.getSubtest();
+				Iterator<Subtest> iterSubtests = subtests.iterator();
+				while (iterSubtests.hasNext()) {
+					Subtest oneSubtest = iterSubtests.next();
+
+					// if subtest ID equals with given ID return it
+					if (oneSubtest.getItemID() == subtestID) {
+						return oneSubtest.getItemByID(leakID);
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Set project used data file name and path.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 * @param newDataFileName
+	 *            Project used data file name
+	 */
+	public final void setDataFileName(final IProject projectRef, final String newDataFileName) {
+		// store data file name
+		projDataFile.put(projectRef, newDataFileName);
+	}
+
+	/**
+	 * Updates/stores project related memory analysis results.
+	 *
+	 * @param projRef
+	 *            Project reference
+	 * @param runResults
+	 *            Run results
+	 * @param dataFile
+	 *            Used data file name and path
+	 */
+	public final void updateRunResults(final IProject projRef,
+			final AbstractList<RunResults> runResults, final String dataFile) {
+		// store data
+		projRelatedRes.put(projRef, runResults);
+
+		// set project used data file name and path
+		setDataFileName(projRef, dataFile);
+	}
+
+
+	/**
+	 * Sets project modules, also creating the unknown component list
+	 * @param project Project reference
+	 * @param mmps Project mmp's
+	 * @param modules List of the modules.
+	 */
+	public void setProjectModules(IProject project, AbstractList<MMPInfo> mmps, AbstractList<String> modules)
+	{
+		Iterator<String> iterModules = modules.iterator();
+		AbstractList<String> unknownComponents = new ArrayList<String>();
+		while( iterModules.hasNext() ) {
+			String moduleName = iterModules.next();
+			boolean build = Util.isModulePartOfProject(mmps, moduleName);
+			if( !build ) {
+				unknownComponents.add(moduleName);
+			}
+		}
+		setProjectUnknownModules(project, unknownComponents);
+	}
+
+	/**
+	 * Stores project unknown modules.
+	 * @param project Project reference
+	 * @param modules Project unknown modules
+	 */
+	private void setProjectUnknownModules(IProject project, AbstractList<String> modules) {
+
+		//update list only it is empty
+		if( !projectUnknownComp.containsKey(project) ) {
+			projectUnknownComp.put(project, modules);
+			return;
+		}
+
+		AbstractList<String> existingModules = projectUnknownComp.get(project);
+		if( existingModules == null || existingModules.isEmpty() ) {
+			projectUnknownComp.put(project, modules);
+		}
+	}
+
+	/**
+	 * Returns project unknown modules.
+	 * @param project Project reference
+	 * @return If project contains unknown modules returns unknown component list otherwise empty list
+	 */
+	public AbstractList<String> getProjectUnknownModules(IProject project){
+		if( projectUnknownComp == null || projectUnknownComp.isEmpty() ) {
+			return new ArrayList<String>();
+		}
+		if( projectUnknownComp.containsKey(project)) {
+			return projectUnknownComp.get(project);
+		}
+
+		//no unknown components found for given project => return empty list
+		return new ArrayList<String>();
+	}
+
+	/**
+	 * Updates project unknown components list
+	 * @param project Project reference
+	 * @param targets Project targets
+	 */
+	public void updateUnknownModulesList(final IProject project, final AbstractList<MMPInfo> targets) {
+		if( project != null && project.isOpen() ) {
+			AbstractList<String> unkModules = projectUnknownComp.get(project);
+			if( unkModules == null || unkModules.isEmpty() ) {
+				return;
+			}
+
+			if( targets == null || targets.isEmpty() ) {
+				return;
+			}
+			Iterator<MMPInfo> iterTargets = targets.iterator();
+
+			while(iterTargets.hasNext()) {
+				MMPInfo oneInfo = iterTargets.next();
+				if( oneInfo == null ) {
+					continue;
+				}
+				String oneModule = oneInfo.getTarget();
+				if( oneModule == null || ("").equals(oneModule ) ) {
+					continue;
+				}
+
+				if(unkModules.contains(oneModule.toLowerCase(Locale.US)) ) {
+					unkModules.remove(oneModule.toLowerCase(Locale.US));
+				}
+			}
+
+			projectUnknownComp.put(project,unkModules);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ResultsBase.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ResultsBase
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+/**
+ * Base class for {@link ProjectResults} and {@link RunResults} Provides
+ * functionality to store basic information of one results item.
+ *
+ * Information is parsed from atool.exe generated XML file so we can assume that
+ * all the information is valid and no other checking is needed.
+ *
+ * @author kihe
+ *
+ */
+public class ResultsBase {
+
+	/** Run id. */
+	private final int itemID;
+
+	/** Run end time. */
+	private String endTime;
+
+	/** Run start time. */
+	private String startTime;
+
+	/** Contains information of current run memory leak count for modules. */
+	private final Hashtable<String, Integer> moduleLeaks;
+
+	/** Contains information of current run handle leak count for modules. */
+	private final Hashtable<String, Integer> handleLeaks;
+
+	/** Run process name. */
+	private String processName;
+
+	/** Run build target. */
+	private String buildTarget;
+
+	/** Run Analysis items. */
+	private final AbstractList<AnalysisItem> analysisItems;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param id
+	 *            Results id number
+	 */
+	public ResultsBase(final int id) {
+		itemID = id;
+		this.moduleLeaks = new Hashtable<String, Integer>();
+		this.handleLeaks = new Hashtable<String, Integer>();
+		analysisItems = new ArrayList<AnalysisItem>();
+	}
+
+	/**
+	 * Adds one item to the existing list.
+	 *
+	 * @param item
+	 *            Analysis item
+	 */
+	public final void addAnalysisItem(final AnalysisItem item) {
+		analysisItems.add(item);
+	}
+
+	/**
+	 * Adds module handle leak information.
+	 *
+	 * @param name
+	 *            Module name
+	 * @param count
+	 *            Number of handle leaks
+	 */
+	public final void addHandleLeak(final String name, final int count) {
+		handleLeaks.put(name, count);
+	}
+
+	/**
+	 * Adds module memory leak information.
+	 *
+	 * @param name
+	 *            Module name
+	 * @param count
+	 *            Number of module leaks
+	 */
+	public final void addModuleLeak(final String name, final int count) {
+		moduleLeaks.put(name, count);
+	}
+
+	/**
+	 * Gets run Analysis items.
+	 *
+	 * @return Run Analysis items
+	 */
+	public final AbstractList<AnalysisItem> getAnalysisItems() {
+		return analysisItems;
+	}
+
+	/**
+	 * Gets current run build target.
+	 *
+	 * @return Build target
+	 */
+	public final String getBuildTarget() {
+		if( buildTarget == null) {
+			return "";
+		}
+		return buildTarget;
+	}
+
+	/**
+	 * Gets the end time of current analysis run.
+	 *
+	 * @return End time
+	 */
+	public final String getEndTime() {
+		if(endTime == null) {
+			return "";
+		}
+		return this.endTime;
+	}
+
+	/**
+	 * Gets handle leak count.
+	 *
+	 * @return Handle leak count
+	 */
+	public final int getHandleLeakCount() {
+		int count = 0;
+		if (handleLeaks != null) {
+			for (java.util.Enumeration<String> e = handleLeaks.keys(); e
+					.hasMoreElements();) {
+				String handleLeakName = e.nextElement();
+				count = count + handleLeaks.get(handleLeakName);
+			}
+		}
+		return count;
+
+	}
+
+	/**
+	 * Gets current run module handle leak information.
+	 *
+	 * @return Hashtable<String, Integer> Module handle leak information
+	 */
+	public final Hashtable<String, Integer> getHandleLeaks() {
+		return handleLeaks;
+	}
+
+	/**
+	 * Gets one Analysis item by given id number.
+	 *
+	 * @param givenID
+	 *            Analysis item id
+	 * @return Analysis item if found otherwise null
+	 */
+	public final AnalysisItem getItemByID(final int givenID) {
+
+		// get analysis items
+		Iterator<AnalysisItem> itemIter = this.analysisItems.iterator();
+		while (itemIter.hasNext()) {
+			// get one analysis item
+			AnalysisItem oneItem = itemIter.next();
+
+			// if given id and current analysis item id match return current
+			// analysis item
+			if (oneItem.getID() == givenID) {
+				return oneItem;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Gets current run ID.
+	 *
+	 * @return Run ID
+	 */
+	public final int getItemID() {
+		return itemID;
+	}
+
+	/**
+	 * Gets current run module memory leak information.
+	 *
+	 * @return Hashtable<String, Integer> Module memory leak information
+	 */
+	public final Hashtable<String, Integer> getModuleLeaks() {
+		return moduleLeaks;
+	}
+
+	/**
+	 * Gets current run process name.
+	 *
+	 * @return Process name of the run
+	 */
+	public final String getProcessName() {
+		if( processName == null ){
+			return "";
+		}
+		return processName;
+	}
+
+	/**
+	 * Gets the start time of current analysis run.
+	 *
+	 * @return Start time
+	 */
+	public final String getStartTime() {
+		if( startTime == null ){
+			return "";
+		}
+		return this.startTime;
+	}
+
+	/**
+	 * Sets current run build target.
+	 *
+	 * @param target
+	 *            Build target
+	 */
+	public final void setBuildTarget(final String target) {
+		buildTarget = target;
+	}
+
+	/**
+	 * Sets the end time of current analysis run.
+	 *
+	 * @param newEndTime
+	 *            End time
+	 */
+	public final void setEndTime(final String newEndTime) {
+		this.endTime = newEndTime;
+	}
+
+	/**
+	 * Sets current run process name.
+	 *
+	 * @param newProcessName
+	 *            Process name for the run
+	 */
+	public final void setProcessName(final String newProcessName) {
+		processName = newProcessName;
+	}
+
+	/**
+	 * Sets the start time of current analysis run.
+	 *
+	 * @param newStartTime
+	 *            Start time
+	 */
+	public final void setStartTime(final String newStartTime) {
+		this.startTime = newStartTime;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/RunResults.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class RunResults
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+
+/**
+ * Stores one run related results (these results are created to link multiple
+ * xml results file).
+ *
+ * @author kihe
+ *
+ */
+public class RunResults extends ResultsBase {
+
+	/** Run subtests. */
+	private final AbstractList<Subtest> subtests;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param newRunID
+	 *            Run ID
+	 */
+	public RunResults(final int newRunID) {
+		super(newRunID);
+		subtests = new ArrayList<Subtest>();
+	}
+
+	/**
+	 * Adds new subtest to existing subtest list.
+	 *
+	 * @param subtest
+	 *            Subtest
+	 */
+	public final void addSubtest(final Subtest subtest) {
+		subtests.add(subtest);
+	}
+
+	/**
+	 * Gets used data file name.
+	 *
+	 * @return Used data file
+	 */
+	/*public final String getDataFileName() {
+		return usedDataFile;
+	}*/
+
+	/**
+	 * Gets current run Subtests.
+	 *
+	 * @return Subtests
+	 */
+	public final AbstractList<Subtest> getSubtest() {
+		return subtests;
+	}
+
+	/**
+	 * Sets used data file name.
+	 *
+	 * @param newDataFileName Used data file name and path
+	 */
+	/*public final void setDataFileName(final String newDataFileName) {
+		usedDataFile = newDataFileName;
+	}*/
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/Subtest.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class Subtest
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+/**
+ * Contains information of subtest.
+ *
+ * @author kihe
+ *
+ */
+public class Subtest extends ResultsBase {
+
+	/** Subtest name. */
+	private String name = null;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param id Subtest ID
+	 */
+	public Subtest(final int id) {
+		super(id);
+	}
+
+	/**
+	 * Gets current subtest name.
+	 *
+	 * @return Subtest name
+	 */
+	public final String getName() {
+		return name;
+	}
+
+	/**
+	 * Sets current subtest name.
+	 *
+	 * @param newName
+	 *            New subtest name
+	 */
+	public final void setName(final String newName) {
+		name = newName;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/UseAtool.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class UseAtool
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.AbstractList;
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.QualifiedName;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
+import com.nokia.carbide.cdt.builder.builder.CarbideCommandLauncher;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+
+/**
+ * Class to use atool.exe Atool.exe is usually used in command prompt so that's
+ * why we executes atool commands with using CarbideCommandLauncher class.
+ *
+ * @author kihe
+ *
+ */
+public class UseAtool {
+
+	/** Used data file name and path */
+	private String dataFileName = "";
+	
+	/**
+	 * Returns used data file name and path
+	 * @return Data file name and path
+	 */
+	public String getDataFileName() {
+		return dataFileName;
+	}
+
+	/**
+	 * Check data file type Gets first line of file and compares that to
+	 * predefined constants.
+	 *
+	 * @param path
+	 *            Data file path
+	 * @return Type of data file
+	 */
+	public static int checkFileType(final String path) {
+		// return value
+		int retValue = Constants.DATAFILE_INVALID;
+
+		// check that file exists
+		if (path == null || ("").equals(path)) {
+			return retValue;
+		}
+		java.io.File file = new java.io.File(path);
+		if (!file.exists()) {
+			return retValue;
+		}
+
+		if( Util.isFileXML(path) ) {
+			return Constants.DATAFILE_XML;
+		}
+
+		// input
+		BufferedReader input = null;
+		FileInputStream fileInputStream = null;
+		InputStreamReader inputReader = null;
+		try {
+
+			// get input
+			fileInputStream = new FileInputStream(path);
+			if( fileInputStream.available() == 0 ) {
+				fileInputStream.close();
+				return Constants.DATAFILE_EMPTY;
+			}
+
+			// file not empty read file contents
+			inputReader = new InputStreamReader(fileInputStream, "UTF-8");
+			input = new BufferedReader(inputReader);
+
+			// get first line of data file
+			String line = input.readLine();
+
+			// line contains data file version specification => data file type
+			// is log
+			if (line != null && line.contains(Constants.DATAFILE_VERSION)) {
+				// update return value
+				retValue = Constants.DATAFILE_LOG;
+			} else {
+				// go thru file
+				while ((line = input.readLine()) != null) {
+
+					// line contains prefix specification => data file type is
+					// trace
+					if (line.contains(Constants.PREFIX)) {
+						// update return value
+						retValue = Constants.DATAFILE_TRACE;
+						return retValue;
+					}
+
+				}
+			}
+			input.close();
+			inputReader.close();
+			fileInputStream.close();
+		} catch (FileNotFoundException ex) {
+			ex.printStackTrace();
+		} catch (IOException ex) {
+			ex.printStackTrace();
+		} finally {
+			try {
+				if (input != null) {
+					input.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+
+			try {
+				if (inputReader != null) {
+					inputReader.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+
+			try {
+				if (fileInputStream != null) {
+					fileInputStream.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+		}
+		return retValue;
+	}
+
+	/**
+	 * Creates atool_temp folder to current mmp folder location.
+	 *
+	 * @param folderLocation
+	 *            Current mmp folder location
+	 * @return True if given location contains atool_temp folder otherwise false
+	 *
+	 */
+	public static boolean createAToolFolderIfNeeded(final String folderLocation) {
+
+		boolean returnValue = false;
+
+		// check if folder location contains atool_temp folder
+		if (folderLocation.indexOf(Constants.ATOOL_TEMP) != -1) {
+			returnValue = true;
+		}
+
+		// create atool_temp folder
+		if( !returnValue ) {
+			File file = new File(folderLocation + "\\" + Constants.ATOOL_TEMP);
+			if (!file.exists()) {
+				returnValue = file.mkdir();
+			}
+		}
+		return returnValue;
+	}
+
+	/**
+	 * Constructor.
+	 */
+	public UseAtool() {
+		// ConstructorDeclaration[@Private='false'][count(BlockStatement) = 0
+		// and ($ignoreExplicitConstructorInvocation = 'true' or
+		// not(ExplicitConstructorInvocation)) and @containsComment = 'false']
+	}
+
+	/**
+	 * Creates xml file to project bld.inf folder.
+	 *
+	 * @param monitor
+	 *            IProgressMonitor reference
+	 * @param project
+	 *            Project reference
+	 * @param dataFilePath
+	 *            Trace file location
+	 * @param command
+	 *            Command which is used to execute atool.exe
+	 * @return XML file name and path if file was successfully created otherwise
+	 *         null
+	 */
+	public final Constants.COMMAND_LINE_ERROR_CODE createXMLFileToCarbide(final IProgressMonitor monitor,
+			final IProject project, final String dataFilePath, final String command) {
+		// check file type
+		// possible file types: S60 data file, trace data file or xml file
+		int fileType = 0;
+
+		// get file type
+		fileType = checkFileType(dataFilePath);
+
+		if (fileType == Constants.DATAFILE_INVALID) {
+			return Constants.COMMAND_LINE_ERROR_CODE.DATA_FILE_INVALID;
+		} else if( fileType == Constants.DATAFILE_EMPTY ) {
+			return Constants.COMMAND_LINE_ERROR_CODE.DATA_FILE_EMPTY;
+		}
+		
+		//check that command line engine can be executed
+		if( !Util.isAtoolAvailable() ) {
+			return Constants.COMMAND_LINE_ERROR_CODE.EXECUTE_ERROR;
+		}
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(project);
+
+		// if ICarbideProjectInfo not found return null
+		if( cpi == null ) {
+			return Constants.COMMAND_LINE_ERROR_CODE.UNKNOWN_ERROR;
+		}
+		String absolutePath = cpi.getAbsoluteBldInfPath().toOSString();
+		String bldInfFolder = null;
+		int index = Util.getLastSlashIndex(absolutePath);
+		if (index != -1) {
+			bldInfFolder = absolutePath.substring(0, index);
+		}
+		if( bldInfFolder != null ) {
+			createAToolFolderIfNeeded(bldInfFolder);
+		}
+
+		AbstractList<String> usedArguments = new ArrayList<String>();
+		usedArguments.add(command);
+		usedArguments.add(dataFilePath);
+		
+		//try to load user defined symbol files
+		try {
+			//property store names
+			QualifiedName useRom = new QualifiedName(Constants.USE_ROM_SYMBOL, Constants.USE_ROM );
+			QualifiedName name = new QualifiedName(Constants.USE_ROM_SYMBOL_LOCATION, Constants.ROM_LOC );
+			
+			//get value
+			String useRomText = project.getPersistentProperty(useRom);
+			if( useRomText != null ) {
+				boolean useRomSymbol = useRomText.equalsIgnoreCase("true") ? true : false;
+				//is symbol files activated for project
+				if(useRomSymbol) {
+					String symbolFileLocation = project.getPersistentProperty(name);
+					if( symbolFileLocation != null && !("").equals(symbolFileLocation) ) {
+						String[] split = symbolFileLocation.split(";");
+						if( split != null ) {
+							for( int i=0; i<split.length; i++ ) {
+								//check that file exists
+								java.io.File symFile = new java.io.File(split[i]);
+								if(symFile.exists()) {
+									usedArguments.add("-s");
+									usedArguments.add(split[i]);
+								}
+							}
+						}
+					}
+				}
+			}
+		}catch(CoreException ce) {
+			ce.printStackTrace();
+		}
+		
+		
+		usedArguments.add(bldInfFolder + "\\" + Constants.ATOOL_TEMP + "\\"
+				+ Constants.FILENAME_CARBIDE);
+		if (Util.verboseAtoolOutput()) {
+			usedArguments.add(Constants.ATOOL_SHOW_DEBUG);
+		}
+
+	    String[] arguments = new String[usedArguments.size()];
+        usedArguments.toArray(arguments);
+
+		int returnValue = executeCommand(arguments, bldInfFolder,
+				monitor, project);
+
+		// if some error happens
+		if (returnValue == Constants.DATAFILE_INVALID || returnValue != Constants.COMMAND_LINE_ERROR_CODE.OK.getCode() ) {
+			Constants.COMMAND_LINE_ERROR_CODE error = Util.getErrorCode(returnValue);
+			setDataFileName(null);
+			return error;
+		}
+		
+		setDataFileName(bldInfFolder + "\\" + Constants.ATOOL_TEMP + "\\"
+		+ Constants.FILENAME_CARBIDE); 
+		return Constants.COMMAND_LINE_ERROR_CODE.OK; 
+	}
+
+	/**
+	 * Sets data file name and path
+	 * @param dataFileName Data file name and path
+	 */
+	private void setDataFileName(String newDataFileName) {
+		dataFileName = newDataFileName;
+	}
+
+	/**
+	 * Executes given command, uses CarbideCommandLauncher class for execution.
+	 *
+	 * @param args
+	 *            Command argument list
+	 * @param path
+	 *            Where to run command
+	 * @param monitor
+	 *            Monitor
+	 * @param project
+	 *            Project
+	 * @return Return value of executeCommand method
+	 */
+	public final int executeCommand(final String[] args, final String path,
+			final IProgressMonitor monitor, final IProject project) {
+
+		int error = Constants.DATAFILE_INVALID;
+		try {
+
+			// get project info
+			ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+					.getProjectInfo(project);
+			if (cpi == null) {
+				return Constants.DATAFILE_INVALID;
+			}
+
+			// get command launcher
+			CarbideCommandLauncher cmdLauncher = new CarbideCommandLauncher(
+					project, monitor, Constants.atoolParserIds, cpi
+							.getINFWorkingDirectory());
+
+			// start timing stats
+			cmdLauncher.startTimingStats();
+
+			// get default config
+			ICarbideBuildConfiguration defaultConfig = cpi
+					.getDefaultConfiguration();
+
+			// show command on console view
+			cmdLauncher.showCommand(true);
+
+			// execute command
+			error = cmdLauncher.executeCommand(new Path(Util
+					.getAtoolInstallFolder()), args, CarbideCPPBuilder
+					.getResolvedEnvVars(defaultConfig), new Path(path));
+			cmdLauncher.writeToConsole(cmdLauncher.getTimingStats());
+
+		} catch (OutOfMemoryError oome) {
+			oome.printStackTrace();
+		}
+		return error;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/AllocCallstack.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AllocCallstack
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+/**
+ * Contains information of allocation callstack item.
+ * @author kihe
+ *
+ */
+public class AllocCallstack {
+
+	/** Callstack memory address */
+	Long memoryAddress;
+
+	/** Dll name where this callstack belongs*/
+	DllLoad dllLoad;
+
+	/**
+	 * Returns memory address.
+	 * @return Memory address
+	 */
+	public Long getMemoryAddress() {
+		return memoryAddress;
+	}
+
+	/**
+	 * Sets memory address
+	 * @param newMemoryAddress Memory address
+	 */
+	public void setMemoryAddress(String newMemoryAddress) {
+		Long iValue = Long.parseLong(newMemoryAddress,16);
+		this.memoryAddress = iValue;
+	}
+
+	/**
+	 * Set dll load item for current allocation callstack item
+	 * @param loadItem Dll load item
+	 */
+	public void setDllLoad(DllLoad loadItem)
+	{
+		dllLoad = loadItem;
+	}
+
+	/**
+	 * Returns Dll load item
+	 * @return Dll load item
+	 */
+	public DllLoad getDllLoad()
+	{
+		return dllLoad;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/AllocInfo.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AllocInfo
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+
+
+/**
+ * Class holds information of one memory allocation
+ * @author kihe
+ *
+ */
+public class AllocInfo extends BaseInfo {
+
+	private FreeInfo freedBy = null;
+
+	/**
+	 * set this allocation as freed by the provide FreeInfo
+	 * @param info
+	 */
+	public void setFreedBy(FreeInfo info) {
+		this.freedBy  =info;
+	}
+	
+	/**
+	 * get the FreeInfo that freed this allocation
+	 * @return a FreeInfo or null
+	 */
+	public FreeInfo getFreedBy() {
+		return this.freedBy;
+	}
+
+	/**
+	 * is this allocation freed
+	 * @return boolean true/false
+	 */
+	public boolean isFreed() {
+		return this.freedBy != null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/BaseInfo.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class BaseInfo
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+/**
+ * Base class for {@link AllocInfo} and {@link FreeInfo}
+ *
+ * @author kihe
+ *
+ */
+public class BaseInfo {
+
+	/**
+	 * Cache for callstack items. Used when allocation fragment is parsed wrong
+	 * order.
+	 */
+	private final Hashtable<Integer, AbstractList<AllocCallstack>> callstackCache;
+
+	/** Memory address of this memory allocation. */
+	private Long memoryAddress;
+
+	/** Memory allocation process id. */
+	private int processID;
+
+	/** Allocation time */
+	private Long time;
+	
+	/** Total memory size at this time */
+	private int totalMemory = 0;
+	private int size = 0;
+
+	/**
+	 * Constructor
+	 */
+	public BaseInfo() {
+		callstackCache = new Hashtable<Integer, AbstractList<AllocCallstack>>();
+	}
+
+	/**
+	 * Sets memory allocation callstack
+	 *
+	 * @param callstack
+	 *            Memory allocation callstack
+	 */
+	public void addCallstack(AbstractList<AllocCallstack> callstack) {
+		callstackCache.put(0, callstack);
+	}
+
+	/**
+	 * Returns memory allocation callstack.
+	 *
+	 * @return Callstack of memory allocation
+	 */
+	public AbstractList<AllocCallstack> getCallstack() {
+		AbstractList<AllocCallstack> wholeCallstack = new ArrayList<AllocCallstack>();
+		int callstacksize = callstackCache.size();
+		for (int i = 0; i < callstacksize; i++) {
+			AbstractList<AllocCallstack> tempCallstack = callstackCache
+					.get(i);
+			if (tempCallstack == null || tempCallstack.isEmpty())
+				continue;
+			Iterator<AllocCallstack> iterCall = tempCallstack.iterator();
+			while (iterCall.hasNext()) {
+				wholeCallstack.add(iterCall.next());
+			}
+		}
+		return wholeCallstack;
+	}
+
+	/**
+	 * Returns memory address
+	 *
+	 * @return Memory address
+	 */
+	public Long getMemoryAddress() {
+		return memoryAddress;
+	}
+
+	/**
+	 * Returns process ID.
+	 *
+	 * @return Process ID.
+	 */
+	public int getProcessID() {
+		return processID;
+	}
+
+	/**
+	 * Returns time for the allocation
+	 *
+	 * @return Allocation time
+	 */
+	public Long getTime() {
+		return time == null ? 0 : time;
+	}
+
+
+	/**
+	 * Sets memory address
+	 *
+	 * @param newMemoryAddress
+	 *            Memory address
+	 */
+	public void setMemoryAddress(String newMemoryAddress) {
+		Long lValue = Long.parseLong(newMemoryAddress, 16);
+		this.memoryAddress = lValue;
+	}
+
+	/**
+	 * Sets process ID.
+	 *
+	 * @param newProcessID
+	 *            Process ID
+	 */
+	public void setProcessID(String newProcessID) {
+		int iValue = Integer.parseInt(newProcessID, 16);
+		this.processID = iValue;
+	}
+
+	/**
+	 * Sets time for the allocation
+	 *
+	 * @param newTime
+	 *            Allocation time
+	 */
+	public void setTime(String newTime) {
+		Long lValue = Long.parseLong(newTime, 16);
+		this.time = lValue;
+	}
+	
+	public void setTime(Long newTime)
+	{
+		this.time = newTime;
+	}
+
+	/**
+	 * Updates allocation fragment. Means that given callstack is addition to
+	 * previous added alloc
+	 *
+	 * @param callstack
+	 *            Addition callstack items
+	 * @param packetNumber
+	 *            AllocF id value
+	 */
+	public void updateFragment(AbstractList<AllocCallstack> callstack,
+			String packetNumber) {
+		callstackCache.put(Integer.parseInt(packetNumber, 16), callstack);
+	}
+	
+	/**
+	 * set total memory used at this time.
+	 * @param size 
+	 */
+	public void setTotalMem(int newSize) {
+		totalMemory = newSize;
+	}
+	
+	/**
+	 * get total memory used at this time
+	 * @return size
+	 */
+	public int getTotalMem() {
+		return totalMemory;
+	}
+	
+	public void setSizeInt(int aSize) {
+		size = aSize;
+	}
+	
+	public int getSizeInt() {
+		return size;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/DllLoad.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class DllLoad
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+/**
+ * Contains information of dll loads
+ *
+ * @author kihe
+ *
+ */
+public class DllLoad {
+
+	/** Dll load end address */
+	Long endAddress;
+
+	/** Time when this dll is loaded. */
+	Long loadTime;
+
+	/** Name of the dll */
+	String name;
+
+	/** Process ID of the dll load */
+	int processID;
+
+	/** Dll load start address */
+	Long startAddress;
+
+	/**
+	 * Returns dll load end address
+	 *
+	 * @return Dll load end address
+	 */
+	public Long getEndAddress() {
+		return endAddress;
+	}
+
+	/**
+	 * Returns dll item load time
+	 *
+	 * @return Time when this dll item is loaded
+	 */
+	public Long getLoadTime() {
+		return loadTime;
+	}
+
+	/**
+	 * Returns name of the dll load
+	 *
+	 * @return Dll load name
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Returns dll load process id
+	 *
+	 * @return Dll load process id
+	 */
+	public int getProcessID() {
+		return processID;
+	}
+
+	/**
+	 * Returns dll load start address
+	 *
+	 * @return Dll load start address
+	 */
+	public Long getStartAddress() {
+		return startAddress;
+	}
+
+	/**
+	 * Sets dll load end address
+	 *
+	 * @param newEndAddress
+	 *            Dll load end address
+	 */
+	public void setEndAddress(String newEndAddress) {
+		Long lValue = Long.parseLong(newEndAddress, 16);
+		this.endAddress = lValue;
+	}
+
+	/**
+	 * Set load time of this item
+	 *
+	 * @param newLoadTime
+	 *            Time when this dll is loaded.
+	 */
+	public void setLoadTime(String newLoadTime) {
+		Long lValue = Long.parseLong(newLoadTime, 16);
+		this.loadTime = lValue;
+	}
+
+	/**
+	 * Sets dll load name
+	 *
+	 * @param newName
+	 *            Dll load name
+	 */
+	public void setName(String newName) {
+		this.name = newName;
+	}
+
+	/**
+	 * Sets dll load process id
+	 *
+	 * @param newProcessID
+	 *            Dll load process id
+	 */
+	public void setProcessID(String newProcessID) {
+		Integer lValue = Integer.parseInt(newProcessID, 16);
+		this.processID = lValue;
+	}
+
+	/**
+	 * Sets dll load start address
+	 *
+	 * @param newStartAddress
+	 *            Dll load start address
+	 */
+	public void setStartAddress(String newStartAddress) {
+		Long lValue = Long.parseLong(newStartAddress, 16);
+		this.startAddress = lValue;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/FreeInfo.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class FreeInfo
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+
+
+/**
+ * Constains information of free
+ * @author kihe
+ *
+ */
+public class FreeInfo extends BaseInfo {
+	Set<AllocInfo> allocsFreed;
+
+	/**
+	 * Adds an alloc which has been freed by this Free 
+	 * @param alloc the alloc to add
+	 */
+	public void addFreedAlloc(AllocInfo alloc){
+		if (allocsFreed == null){
+			allocsFreed = new HashSet<AllocInfo>();
+		}
+		allocsFreed.add(alloc);
+	}
+	
+	/**
+	 * Returns a collection of allocs freed by this Free
+	 * @return the Collection of AllocInfos freed
+	 */
+	public Collection<AllocInfo> getFreedAllocs(){
+		return Collections.unmodifiableSet(allocsFreed == null ? new HashSet<AllocInfo>() : allocsFreed);
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/ProcessInfo.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ProcessInfo
+ *
+ */
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import com.nokia.s60tools.analyzetool.Activator;
+
+/**
+ * Contains information of process
+ * 
+ * @author kihe
+ * 
+ */
+public class ProcessInfo {
+
+	/** List of allocations and frees sorted as they arrive in time */
+	AbstractList<BaseInfo> allocsFrees;
+
+	/** List of dll loads */
+	Hashtable<String, DllLoad> dllLoads;
+
+	/** Process id */
+	int processID;
+
+	/** Process Name */
+	String processName;
+
+	/** Process start time */
+	Long startTime;
+
+	/** Process start time */
+	Long endTime;
+
+	/** Trace data format version number */
+	int traceDataVersion = 1;
+
+	/** active allocations account */
+	private int allocCount = 0;
+	/** total memory consumed by this process at each event */
+	private int totalMemory = 0;
+	/** highest memory consumed by this process */
+	private int highestMemory =0;
+
+	/** Map of potential leaks; to track allocations not yet freed */
+	private Map<Long, List<AllocInfo>> potentialLeaksMap;
+
+	/**
+	 * Constructor
+	 */
+	public ProcessInfo() {
+		dllLoads = new Hashtable<String, DllLoad>();
+		allocsFrees = new ArrayList<BaseInfo>();
+		allocCount = 0;
+		potentialLeaksMap = new HashMap<Long, List<AllocInfo>>(); 
+	}
+
+	/**
+	 * Adds one memory allocation to the list.
+	 * 
+	 * @param oneInfo
+	 *            One memory allocation
+	 */
+	public void addOneAlloc(AllocInfo oneInfo) {
+		allocCount++;
+		totalMemory = totalMemory + oneInfo.getSizeInt();
+		oneInfo.setTotalMem(totalMemory);
+		if (totalMemory > highestMemory) {
+			highestMemory = totalMemory;
+		}
+		allocsFrees.add(oneInfo);
+		//add this alloc to the potential leaks map
+		Long addr = oneInfo.getMemoryAddress();
+		List<AllocInfo> allocsSameAddr = potentialLeaksMap.get(addr);
+		if (allocsSameAddr == null){
+			allocsSameAddr = new ArrayList<AllocInfo>();
+			potentialLeaksMap.put(addr, allocsSameAddr);
+		}
+		allocsSameAddr.add(oneInfo);
+	}
+
+	/**
+	 * Adds one dll load to the list.
+	 * 
+	 * @param dllLoad
+	 *            One dll load
+	 */
+	public void addOneDllLoad(DllLoad dllLoad) {
+		dllLoads.put(dllLoad.getName(), dllLoad);
+	}
+
+	/**
+	 * Updates memory leaks list by given free information
+	 * 
+	 * @param info
+	 *            Which memory allocation to be deallocated.
+	 */
+	public void free(FreeInfo info) {
+
+		int freeSize = 0;
+		
+		//remove allocs with the same address from the potential leaks map
+		Long freeAddr = info.getMemoryAddress();
+		List<AllocInfo> allocsSameAddr = potentialLeaksMap.remove(freeAddr);
+		if (allocsSameAddr != null && allocsSameAddr.size()>0){
+			for(AllocInfo allocInfo : allocsSameAddr){
+				allocInfo.setFreedBy(info);
+				info.addFreedAlloc(allocInfo);
+				allocCount--;
+				int thisFreedSize = allocInfo.getSizeInt();
+				freeSize = freeSize + thisFreedSize;
+				totalMemory = totalMemory - thisFreedSize;
+			}			
+		}
+
+		info.setSizeInt(freeSize);
+		info.setTotalMem(totalMemory);
+		
+		if (info.getTime() == null || info.getTime() == 0 ) {
+			// support old format
+			//set time as last operation time or start time.
+			Long time = getPreviousTime();
+			if (time == null || time == -1L) {
+				Activator.getDefault().log(IStatus.WARNING, String.format("AnalyzeTool encountered a process = %s, which starts with FREE.", processID), null);
+				time = startTime;
+			}
+			info.setTime(time);
+		}
+		
+		allocsFrees.add(info);
+	}
+
+	/**
+	 * Returns the timestamp of the last memory operation
+	 * @return the timestamp of the last memory operation, or -1 if there
+	 * are no memory operations
+	 */
+	private Long getPreviousTime() {
+		Long time = -1L;
+		if (!allocsFrees.isEmpty()) {
+			time = (allocsFrees.get(allocsFrees.size() -1)).getTime();
+		}
+		return time;
+	}
+
+	/**
+	 * Returns list of allocations
+	 * 
+	 * @return List of allocations
+	 */
+	public AbstractList<AllocInfo> getAllocs() {
+		AbstractList<AllocInfo> allocs = new ArrayList<AllocInfo>();
+		for (BaseInfo alloc : allocsFrees) {
+			if (alloc instanceof AllocInfo) {
+				allocs.add((AllocInfo) alloc);
+			}
+		}
+		return allocs;
+	}
+
+	/**
+	 * Returns list of dll loads
+	 * 
+	 * @return List of dll loads
+	 */
+	public Hashtable<String, DllLoad> getDllLoads() {
+		return dllLoads;
+	}
+
+	/**
+	 * Returns list of memory leak from this process.
+	 * 
+	 * @return List of memory leaks.
+	 */
+	public AbstractList<AllocInfo> getMemLeaks() {
+		AbstractList<AllocInfo> leaks = new ArrayList<AllocInfo>();
+		for (List<AllocInfo> potLeaks : potentialLeaksMap.values()) {
+			leaks.addAll(potLeaks);
+		}
+		return leaks;
+	}
+
+	/**
+	 * Returns the number of memory leaks of this process.
+	 * 
+	 * @return number of memory leaks.
+	 */
+	public int getMemLeaksNumber() {
+		int count = 0;
+		for (List<AllocInfo> potLeaks : potentialLeaksMap.values()) {
+			count += potLeaks.size();
+		}
+		return count;
+	}
+
+	/** 
+	 * get list of frees
+	 * @return List of FreeInfo
+	 */
+	public AbstractList<FreeInfo> getFrees() {
+		AbstractList<FreeInfo> frees = new ArrayList<FreeInfo>();
+		for (BaseInfo alloc : allocsFrees) {
+			if (alloc instanceof FreeInfo) {
+				frees.add((FreeInfo) alloc);
+			}
+		}
+		return frees;
+	}
+
+	/**
+	 * Returns process id
+	 * 
+	 * @return Process id
+	 */
+	public int getProcessID() {
+		return processID;
+	}
+
+	/**
+	 * Returns process start time
+	 * 
+	 * @return Process start time
+	 */
+	public Long getStartTime() {
+		return startTime;
+	}
+
+	/**
+	 * Returns trace data version number
+	 * 
+	 * @return Trace data version number
+	 */
+	public int getTraceDataVersion() {
+		return traceDataVersion;
+	}
+
+	/**
+	 * Sets process id
+	 * 
+	 * @param newProcessID
+	 *            Process id
+	 */
+	public void setProcessID(int newProcessID) {
+		this.processID = newProcessID;
+	}
+
+	/**
+	 * Sets process start time
+	 * 
+	 * @param newTime
+	 *            Process start time
+	 */
+	public void setStartTime(String newTime) {
+		Long lValue = Long.parseLong(newTime, 16);
+		this.startTime = lValue;
+	}
+
+	/**
+	 * Updates trace version number
+	 * 
+	 * @param newTraceDataVersion
+	 *            New trace data version number
+	 */
+	public void setTraceDataVersion(String newTraceDataVersion) {
+
+		try {
+			traceDataVersion = Integer.parseInt(newTraceDataVersion, 16);
+		} catch (NumberFormatException nfe) {
+			// exception while trying to set new version number
+			// use the oldest version number, this version number is safest
+			// but when use this version some information could be lost
+			traceDataVersion = 1;
+		}
+	}
+
+	/**
+	 * Unloads one dll load from the stored items
+	 * 
+	 * @param dllLoad
+	 *            Dll unload item
+	 */
+	public void unloadOneDll(DllLoad dllLoad) {
+		if (dllLoads.containsKey(dllLoad.getName())) {
+			dllLoads.remove(dllLoad.getName());
+		}
+	}
+
+	/**
+	 * set end time of the process
+	 * @param aTime
+	 */
+	public void setEndTime(String aTime) {
+		Long lValue = Long.parseLong(aTime, 16);
+		endTime = lValue;
+	}
+
+	/**
+	 * set process name
+	 * @param aProcessName
+	 */
+	public void setProcessName(String aProcessName) {
+		processName = aProcessName;
+	}
+
+	/**
+	 * @return the process name
+	 */
+	public String getProcessName() {
+		return processName;
+	}
+
+	/**
+	 * get all events
+	 * @return list of BaseInfo
+	 */
+	public AbstractList<BaseInfo> getAllocsFrees() {
+		return allocsFrees;
+	}
+
+	/**
+	 * get end time of the process
+	 * @return
+	 */
+	public Long getEndTime() {
+		return endTime;
+	}
+
+	/**
+	 * get list of allocations freed by a FreeInfo
+	 * 
+	 * @param free
+	 * @return AbstractList<AllocInfo> list of allocations freed by the provided
+	 *         FreeInfo
+	 */
+	public AbstractList<AllocInfo> getAllocsFreedBy(FreeInfo free) {
+		AbstractList<AllocInfo> allocs = new ArrayList<AllocInfo>();
+		for (BaseInfo alloc : allocsFrees) {
+			if (alloc instanceof AllocInfo && ((AllocInfo) alloc).getFreedBy() == free) {
+				allocs.add((AllocInfo) alloc);
+			}
+		}
+		return allocs;
+	}
+	/**
+	 * Getter for highest memory allocation for the current process
+	 * @return int containing highest memory usage
+	 */
+	public int getHighestCumulatedMemoryAlloc() {
+		return highestMemory;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/ReadFile.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ReadFile
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.AbstractList;
+
+import com.nokia.s60tools.analyzetool.engine.ParseAnalyzeData;
+
+/**
+ * Reads thru trace file and generates statistic info
+ * @author kihe
+ *
+ */
+public class ReadFile {
+
+	/** Parser */
+	ParseAnalyzeData parser;
+
+	/**
+	 * Constructor
+	 */
+	public ReadFile()
+	{
+		parser = new ParseAnalyzeData(false, true);
+	}
+
+
+	/**
+	 * Reads thru file
+	 * @param path File location
+	 * @return True if no errors occurs when reading file otherwise False
+	 */
+	public boolean readFile(final String path) {
+		// return value
+		boolean retValue = true;
+
+		// input
+		BufferedReader input = null;
+		FileInputStream fis = null;
+		try {
+
+			// check that file exists
+			if (path == null || ("").equals(path)) {
+				return false;
+			}
+			java.io.File file = new java.io.File(path);
+			if (!file.exists()) {
+				return false;
+			}
+
+			// get input
+			fis = new FileInputStream(file);
+			input = new BufferedReader(new InputStreamReader(fis,"UTF-8"));
+
+			// get first line of data file
+			String line = null;
+			// go thru file
+			while ((line = input.readLine()) != null) {
+				parser.parse(line);
+			}
+			fis.close();
+			input.close();
+		} catch (FileNotFoundException ex) {
+			retValue = false;
+			ex.printStackTrace();
+		} catch (OutOfMemoryError oome){
+			retValue = true;
+			oome.printStackTrace();
+		} catch (IOException ex) {
+			retValue = false;
+			ex.printStackTrace();
+		} finally {
+			try {
+				if (input != null) {
+					input.close();
+				}
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+
+			try {
+				if( fis != null ) {
+					fis.close();
+				}
+			}catch(Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return retValue;
+	}
+
+	/**
+	 * Returns statistic
+	 * @return Statistic
+	 */
+	public AbstractList<ProcessInfo> getStatistic()
+	{
+		return parser.getStatistic();
+	}
+
+	/**
+	 * Finish the file reading.
+	 */
+	public void finish()
+	{
+		parser.finish();
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/SourceFile.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class SourceFile
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+/**
+ * Constains information of found source file.
+ * @author kihe
+ *
+ */
+public class SourceFile {
+
+	/** Source file name.*/
+	private String fileName;
+
+	/** Source file line number.*/
+	private int lineNumber;
+
+	/** How many times this source file is allocated.*/
+	private int howManyTimes = 1;
+
+	/** Source file function name. */
+	private String functionName;
+
+	/** Summary of allocations size.*/
+	private int size;
+
+	/** Allocation time.*/
+	private Long time;
+
+	/**
+	 * Returns source file name.
+	 * @return Source file name
+	 */
+	public String getFileName() {
+		return fileName;
+	}
+
+	/**
+	 * Sets source file name.
+	 * @param newFileName Source file name
+	 */
+	public void setFileName(String newFileName) {
+		this.fileName = newFileName;
+	}
+
+	/**
+	 * Returns source file line number.
+	 * @return Source file line number
+	 */
+	public int getLineNumber() {
+		return lineNumber;
+	}
+
+	/**
+	 * Sets source file line number
+	 * @param newLineNumber Line number
+	 */
+	public void setLineNumber(int newLineNumber) {
+		this.lineNumber = newLineNumber;
+	}
+
+	/**
+	 * Returns count of how many times this source file is allocated.
+	 * @return Count of allocations
+	 */
+	public int getHowManyTimes() {
+		return howManyTimes;
+	}
+
+	/**
+	 * Sets count of how many times this source file is allocated.
+	 * @param count Count of allocations
+	 */
+	public void setHowManyTimes(int count) {
+		this.howManyTimes = count;
+	}
+
+	/**
+	 * Updates count of allocations
+	 */
+	public void updateHowManyTimes()
+	{
+		this.howManyTimes +=1;
+	}
+
+	/**
+	 * Returns function name.
+	 * @return Function name
+	 */
+	public String getFunctionName() {
+		return functionName;
+	}
+
+	/**
+	 * Sets function name.
+	 * @param newFunctionName Function name
+	 */
+	public void setFunctionName(String newFunctionName) {
+		this.functionName = newFunctionName;
+	}
+
+	/**
+	 * Returns size of allocations.
+	 * @return Size of allocations
+	 */
+	public int getSize() {
+		return size;
+	}
+
+	/**
+	 * Updates allocation count memory usage size.
+	 * @param newSize Memory usage size
+	 */
+	public void updateSize(int newSize){
+		this.size += newSize;
+	}
+
+	/**
+	 * Returns time of allocation.
+	 * @return Time of allocation
+	 */
+	public Long getTime() {
+		return time;
+	}
+
+	/**
+	 * Sets time of allocation
+	 * @param newTime Time of allocation
+	 */
+	public void setTime(Long newTime) {
+		this.time = newTime;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/statistic/SymReader.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class SymReader
+ *
+ */
+
+
+package com.nokia.s60tools.analyzetool.engine.statistic;
+
+import java.io.File;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.DefaultMMPViewConfiguration;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.carbide.cpp.epoc.engine.EpocEnginePlugin;
+import com.nokia.carbide.cpp.epoc.engine.MMPDataRunnableAdapter;
+import com.nokia.carbide.cpp.epoc.engine.model.mmp.EMMPStatement;
+import com.nokia.carbide.cpp.epoc.engine.model.mmp.IMMPData;
+import com.nokia.carbide.cpp.epoc.engine.preprocessor.AcceptedNodesViewFilter;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISymbolFile;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISymbolReaderManager;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.SymbolReaderManager;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Opens and closes symbol files.
+ * @author kihe
+ *
+ */
+@SuppressWarnings("restriction")
+public class SymReader {
+
+	/**Selected project*/
+	IProject project;
+
+	/**List of opened symbol files */
+	HashMap<String, ISymbolFile> allreayOpen;
+
+	/**Project target list*/
+	AbstractList<String> targets;
+
+	/**SymbolReaderManager*/
+	ISymbolReaderManager manager;
+
+	/**Build target*/
+	String buildTarget;
+
+	/**
+	 * Constructor
+	 * @param projectRef Active project reference
+	 */
+	public SymReader( IProject projectRef )
+	{
+		project = projectRef;
+		targets = new ArrayList<String>();
+		manager = SymbolReaderManager.getSymbolReaderManager();
+		allreayOpen = new HashMap<String, ISymbolFile>();
+	}
+
+
+	/**
+	 * Gets ISymbolFile object to corresponding symbol file
+	 * @param moduleName Module name which is loaded
+	 * @param onlyForProjecTargets Create results for only project modules
+	 * @return Symbol file if found, otherwise null
+	 */
+	public ISymbolFile getSymbolFile( String moduleName, boolean onlyForProjecTargets )
+	{
+		//thru project targets
+		if( onlyForProjecTargets )
+		{
+			Iterator<String> targetsIter = targets.iterator();
+			while( targetsIter.hasNext() )
+			{
+				String oneTarget = targetsIter.next();
+				if( oneTarget.contains( moduleName ) )
+				{
+					return getSymFile(moduleName);
+				}
+			}
+		}
+		else
+		{
+			return getSymFile(moduleName);
+		}
+
+		return null;
+	}
+
+	/**
+	 * Opens and return ISymbolFile for the given module
+	 * @param moduleName Module name
+	 * @return Opened symbol file
+	 */
+	private ISymbolFile getSymFile(String moduleName )
+	{
+		if( allreayOpen.containsKey( moduleName ) )
+		{
+			return allreayOpen.get( moduleName );
+		}
+
+		//get symbol file name
+		String symFile = getSymbolFileNameForTarget( moduleName );
+		if( symFile != null && manager != null )
+		{
+			ISymbolFile symbolFile = manager.openSymbolFile( symFile );
+			allreayOpen.put(moduleName, symbolFile);
+			return symbolFile;
+		}
+
+		return null;
+	}
+
+
+	/**
+	 *
+	 * @param targetName Target name
+	 * @return Target sym file name if found, otherwise null
+	 */
+	public String getSymbolFileNameForTarget( final String targetName )
+	{
+		if( targetName == null || ("").equals( targetName) )
+			return null;
+
+		buildTarget = getBuildTarget();
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo( project );
+		String platform = cpi.getDefaultConfiguration().getPlatformString();
+		//set symbol file location
+		char backslash = '\\';
+
+		String epocRoot = getEpocroot();
+		if( epocRoot == null || ("").equals( epocRoot )) {
+			return null;
+		}
+		StringBuffer symbolFileLocation = new StringBuffer(32);
+		symbolFileLocation.append( epocRoot );
+		symbolFileLocation.append( "epoc32\\release\\" );
+		symbolFileLocation.append(platform);
+		symbolFileLocation.append(backslash);
+		symbolFileLocation.append( buildTarget );
+		symbolFileLocation.append(backslash);
+
+		
+		//build target is set to WINSCW we can use the target name
+		if( (Constants.BUILD_TARGET_WINSCW).equalsIgnoreCase(platform) ) {
+			symbolFileLocation.append(targetName);
+		}
+		//remove target name extension and add .sym
+		else if( targetName.lastIndexOf('.') != -1 ) {
+			String targetWithoutExt = targetName.substring(0, targetName.lastIndexOf('.'));
+			symbolFileLocation.append( targetWithoutExt );
+			symbolFileLocation.append(".sym");
+		}
+		
+		//symbol file exists => return file location
+		File symFile = new File( symbolFileLocation.toString() );
+		if( symFile.exists() )
+		{
+			return symbolFileLocation.toString();
+		}
+		//symbol file not found
+		//try find target(with extension) + .sym
+		StringBuffer symFileLocWithExt = new StringBuffer(32);
+		symFileLocWithExt.append( epocRoot );
+		symFileLocWithExt.append( "epoc32\\release\\" );
+		symFileLocWithExt.append(platform);
+		symFileLocWithExt.append(backslash);
+		symFileLocWithExt.append( buildTarget );
+		symFileLocWithExt.append(backslash);
+		symFileLocWithExt.append(targetName);
+		symFileLocWithExt.append(".sym");
+
+		File symFileWithExt = new File( symFileLocWithExt.toString() );
+		if( symFileWithExt.exists() ) {
+			return symFileLocWithExt.toString();
+		}
+		return null;
+
+	}
+
+	/**
+	 * Returns build target
+	 * @return Active build target
+	 */
+	public String getBuildTarget()
+	{
+		//get build target
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo( project );
+		EpocEngineHelper.getEpocRootForProject(project);
+		String configName = cpi.getDefaultBuildConfigName();
+		buildTarget = "udeb";
+		if( configName.contains( "Release") )
+		{
+			buildTarget = "urel";
+		}
+		return buildTarget;
+	}
+
+	/**
+	 * Returns default epocroot location
+	 * @return Epocroot location
+	 */
+	public String getEpocroot()
+	{
+		if( project != null && project.isOpen() ) {
+			IPath epocRootPath = EpocEngineHelper.getEpocRootForProject(project);
+			if( epocRootPath != null ) {
+				return epocRootPath.toOSString();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Closes active ISymbolFiles
+	 */
+	public void dispose()
+	{
+		if( allreayOpen.isEmpty() ) {
+			manager = null;
+			return;
+		}
+		//thru open ISymbolFiles
+		Set<String> keySet = allreayOpen.keySet();
+		for (String moduleName : keySet) {
+			ISymbolFile symFile = allreayOpen.get( moduleName );
+			symFile.close();
+			symFile = null;
+			allreayOpen.remove( moduleName );
+		}
+
+		allreayOpen.clear();
+		manager = null;
+	}
+
+	/**
+	 * Gets current project targets info
+	 */
+	public void loadProjectTargetsInfo()
+	{
+		// Assumes buildConfig (ICarbideBuildConfiguration) is known
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager().getProjectInfo( project );
+		ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+		for (IPath mmpPath : EpocEngineHelper.getMMPFilesForBuildConfiguration(buildConfig)) {
+		     Object data = EpocEnginePlugin.runWithMMPData(mmpPath,  new
+		                              DefaultMMPViewConfiguration(buildConfig.getCarbideProject().getProject(),
+		                              buildConfig, new AcceptedNodesViewFilter()),  new MMPDataRunnableAdapter()
+		     {
+					public Object run(IMMPData mmpData) {
+						// The real return value, getting a single argument setting
+					    return mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGET);
+					}
+		      });
+
+		     // Make sure to test for and cast to proper Object type!
+			String mmpStatement = (String)data;  // Now we should have the TARGETTYPE
+			targets.add( mmpStatement );
+		}
+	}
+	
+	/**
+	 * Reopen all cached symbol files if not already open
+	 */
+	public void reOpenCachedSymbolFiles() {
+		if (manager == null) {
+			//it's strange that we need to create another Object here so that DE releases the
+			//targets
+			manager = new SymbolReaderManager().getSymbolReaderManager();
+		}
+		Set<String> keySet = allreayOpen.keySet();
+		for (String moduleName : keySet) {
+			if (allreayOpen.get(moduleName) == null) {
+				String file = getSymbolFileNameForTarget(moduleName);
+				if (file != null) {
+					ISymbolFile symFile = manager.openSymbolFile(file);
+					allreayOpen.put(moduleName, symFile);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Close all cached symbol files
+	 */
+	public void closeCachedSymbolFiles() {
+		Set<String> keySet = allreayOpen.keySet();
+		for (String moduleName : keySet) {
+			ISymbolFile symFile = allreayOpen.get( moduleName );
+			if (symFile != null) {
+				symFile.close();
+				symFile = null;
+			}
+			allreayOpen.put(moduleName, null);
+		}
+		manager = null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/global/Constants.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,517 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class Constants
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.global;
+
+/**
+ * Contains all the defined constants
+ *
+ * @author kihe
+ *
+ */
+public class Constants {
+
+	public static enum ACTIONS {
+		RUN_VIEW_MEM_LEAKS, RUN_BUILD, RUN_CLEAN
+	}
+	
+	public static enum Operation {
+		PROCESS_START, PROCESS_END, ALLOC, FREE, ALLOCH, FREEH, ALLOCF, FREEF, DLL_LOAD, DLL_UNLOAD, NOVALUE;
+
+		public static Operation toOperation(String str) {
+			try {
+				return valueOf(str);
+			} catch (Exception ex) {
+				return NOVALUE;
+			}
+		}
+	}
+
+	/** AnalyzeTool specific constants */
+	public final static String ANALYZE_TOOL_TITLE = "AnalyzeTool";
+	public final static String ANALYZE_TOOL_TITLE_WITH_VERSION = "AnalyzeTool v%s";
+	public final static String MAIN_TAB_TITLE = "Results";
+	public final static String ANALYZE_TOOL_VIEW_ID = "com.nokia.s60tools.analyzetool.ui.MainView";
+	public final static String ANALYZE_TOOL_PREFS_ID = "com.nokia.s60tools.analyzetool.preferences.AnalyzeToolPreferencePage";
+	/**
+	 * Progress monitor text displayed when AnalyzeTool processing some action
+	 * long time
+	 */
+	public final static String PROGRESSDIALOG_TITLE = "Processing analysis data";
+	public final static String PROGRESSDIALOG_ATOOL = "Executing AnalyzeTool";
+	public final static String PROGRESSDIALOG_CLEAR_CHANGES = "Cleaning changes made by AnalyzeTool";
+
+	public final static String PROGRESSDIALOG_CLEAN_COMPLETE = "Changes made by AnalyzeTool cleaned";
+	public static final String PROGRESSDIALOG_ANALYZE_COMPLETE = "Analysis complete";
+	/** AnalyzeTool toolbar actions text */
+	public final static String ACTION_AT_BUILD_ACTIVE = "Deactivate AnalyzeTool build - currently activated";
+	public final static String ACTION_AT_BUILD_DEACTIVE = "Activate AnalyzeTool build - currently deactivated";
+	public final static String ACTION_CLEAR_CHANGES = "Clean AnalyzeTool changes";
+	public final static String ACTION_CLEAR_CHANGES_TOOLTIP = "Clean all changes made by AnalyzeTool (delete atool_temp folder(s) etc.)";
+	public final static String ACTION_CHANGE_REPORT_LEVEL = "Change report detail level";
+	public final static String ACTION_CHANGE_REPORT_LEVEL_ALL = "Report detail level: All";
+	public final static String ACTION_CHANGE_REPORT_LEVEL_KNOWN = "Report detail level: Known";
+	public final static String ACTION_CHANGE_REPORT_LEVEL_TOPMOST = "Report detail level: Topmost";
+	public final static String ACTION_CHANGE_LOGGING_MODE = "Change data gathering mode";
+	public final static String ACTION_CHANGE_LOGGING_MODE_TOOLTIP_EXT = "Current mode: Monitored external";
+	public final static String ACTION_CHANGE_LOGGING_MODE_TOOLTIP_FAST = "Current mode: External";
+	public final static String ACTION_CHANGE_LOGGING_MODE_TOOLTIP_S60 = "Current mode: Monitored Internal";
+	public final static String ACTION_CHANGE_LOGGING_MODE_TOOLTIP_ASK = "Current mode: Ask always";
+	public final static String ACTION_SAVE = "Save raw test run data or memory leak results";
+	public final static String ACTION_SAVE_REPORT = "Save memory leak results";
+	public final static String ACTION_SAVE_DATA = "Save raw test run data";
+	public final static String ACTION_START_SUBTEST = "Start subtest";
+	public final static String ACTION_STOP_SUBTEST = "Stop subtest";
+	public static final String ACTION_START_TRACE = "Start tracing";
+	public static final String ACTION_STOP_TRACE = "Stop tracing";
+	public static final String ACTION_OPEN = "Open and analyze data file";
+	public static final String ACTION_OPEN_DOTS = "Open and analyze data file...";
+	public static final String ACTION_CLEAR_RESULTS = "Clear project results";
+	public static final String ACTION_RE_ANALYZE = "Re-analyze results";
+	public static final String ACTION_RE_ANALYZE_TOOLTIP = "You can re-analyze recently opened file.";
+	public static final String ACTION_COPY = "Copy to clipboard";
+	public static final String ACTION_OPEN_PREFS = "Open AnalyzeTool preferences";
+	public static final String ACTION_OPEN_PREFS_TOOLTIP = "Open AnalyzeTool preferences";
+	/** Dialog related text */
+	// File save dialog title when user saves project results (XML file)
+	public final static String DIALOG_SAVE_REPORT = "Save memory leak results";
+
+	// File save dialog title when user save test run data ( data file )
+	public final static String DIALOG_SAVE_TRACE = "Save raw test run data";
+
+	// Selection dialog title when user builds project with AnalyzeTool and
+	// logging mode is set to "Ask always"
+	public final static String DIALOG_SELECT_LOGGING_MODE = "Select data gathering mode for AnalyzeTool";
+
+	// generic title for all dialogs, information notes
+	public final static String DIALOG_TITLE = "AnalyzeTool";
+
+	// File selection dialog title when user wants to open and analyze data file
+	public static final String DIALOG_SELECT_DATA_FILE = "Select data file";
+
+	// Input dialog title when user inputs data file name
+	public static final String DIALOG_INPUT_DATA_FILE_NAME = "Enter device data file name";
+
+	/**
+	 * Information dialog text in these dialogs user has possible to press just
+	 * "Ok"
+	 */
+
+	// when trying to save project results
+	public static final String INFO_NO_RESULTS_FILE = "No results file found in the current project.";
+
+	// when trying to save test run data
+	public static final String INFO_NO_DATA_FILE = "No data file found in the current project.";
+
+	// after the file is saved
+	public static final String INFO_SAVE_SUCCESS = "The file successfully saved to: ";
+
+	// information text when user try to use actions and the atool.exe can not
+	// be executed
+	public static final String INFO_ATOOL_NOT_AVAILABLE = "\n\nCan not execute command line engine. \nCheck AnalyzeTool preferences.";
+	public static final String ERROR_ATOOL_NOT_AVAILABLE = "Can not execute command line engine. \nCheck AnalyzeTool preferences.";
+
+	// info to user if AnalyzeTool for some reason can create results
+	public static final String INFO_FILE_INVALID = "Can not analyze. \nNo data to be analyzed.";
+
+	// when user try use AnalyzeTool without selection project first
+	public static final String NO_PROJ_SELECT = "No project selected. \nPlease select a project.";
+
+	// if user try to open data file for the project and AnalyzeTool already
+	// processing another data file.
+	public static final String INFO_ALLREADY_RUNNING = "AnalyzeTool is already processing previously selected file. Try again later.";
+
+	/** Confirmation dialog */
+	// when user wants to clean AnalyzeTool made changes
+	public static final String CONFIRM_DELETE_ALL = "This option deletes all temporary files created by AnalyzeTool. \n\n Do you want to continue?";
+
+	// when starting the trace and there are data file available
+	public static final String CONFIRM_OVERWRITE_FILE = "The project already contains a data file that will be overwritten. \nDo you want to save it first?";
+
+	// when user select folder which does not contain atool.exe via AnalyzeTool
+	// preference pages.
+	public static final String CONFIRM_DIR_DOES_NOT_CONTAIN_ATOOL = "Directory does not contain atool.exe. \n\nDo you want to continue?";
+
+	/** Tree model text */
+	// when no results are opened/available
+	public static final String INFO_NO_DATA_FILE_AVAILABLE = "No data file opened or trace data captured.";
+	/** Preference page title*/
+	public static final String ATOOL_DESC = "AnalyzeTool Carbide extension configuration";
+	/** Trace capturing related text */
+	public static final String INFO_NO_DATA = "No data";
+	public static final String SUBTEST_INPUT_NAME = "Enter subtest name.";
+	public static final String SUBTEST_NO_PROCESSES = "No processes started, could not start a subtest.";
+	public static final String SUBTEST_SELECT_TARGET = "Select the target.";
+	public static final String SUBTEST_RUNNING_PROCESSES_INFO = "Running processes";
+	public static final String SUBTEST_NO_SUBTESTS = "No subtests started.";
+	public static final String SUBTEST_SELECT_SUBTEST_TO_STOP = "Select which subtest should be stopped.";
+	public static final String SUBTEST_ALLREADY_RUNNING = "The given subtest already started for the active process.";
+	public static final String SUBTEST_STARTED = "Subtest started: ";
+	public static final String SUBTEST_ENDED = "Subtest ended: ";
+	public static final String INFO_TRACE_START = "Trace started.";
+	public static final String INFO_TRACE_STOP = "Trace stopped.";
+	public static final String INFO_TRACE_FROM_TARGET_START = "Trace from %s started.";
+	public static final String INFO_TRACE_FROM_EMULATOR = "emulator";
+	public static final String INFO_TRACE_FROM_DEVICE = "device";
+	public static final String INFO_ALLOCATED_MEM = "Number of memory allocations: ";
+	public static final String NO_OPENED_FILES = "No recently opened files.";
+	public static final String STARTING_TRACE = "Starting trace capture";
+	/** Tracing utility error information */
+	public static final String TRACE_ALLREADY_CONNECTED = "Tracing utility connection reserved for another plug-in.";
+	public static final String TRACE_GENERAL_ERROR = "General Tracing utility error.";
+	public static final String TRACE_CON_SET_ERROR = "Invalid Tracing utility connection settings.";
+	public static final String TRACE_CANT_FIND_DATAPR = "Cannot find dataprocessor. \nPlease contact the support team.";
+	public static final String TRACE_ERROR_NONE = "";
+	public static final String TRACE_DISC_ERROR = "Error while disconnecting Tracing utility.";
+	public static final String TRACE_NOT_FOUND = "Could not load Tracing utility plugin.";
+
+	/** Main view tree model related constants */
+	public static final String HANDLE_LEAK_MODULES_TITLE = "Modules with handle leaks";
+	public static final String MEMORY_LEAK_MODULES_TITLE = "Modules with memory leaks";
+	public static final String TEST_RUNS_TREE_TITLE = "Test runs";
+	public static final String TREE_TITLE = "runs";
+	public static final String RUN_TREE_RUN = "Run: ";
+	public static final String RUN_TREE_RUN_MEM_LEAKS = " Memory Leaks: ";
+	public static final String RUN_TREE_RUN_HANDLE_LEAKS = " Handle leaks: ";
+	public static final String RUN_TREE_START_TIME = " Start time: ";
+	public static final String RUN_TREE_PROCESS_NAME = " Process name: ";
+	public static final String RUN_TREE_BUILD_TARGET = " Build target: ";
+	public static final String RUN_TREE_FILTERED = " filtered)";
+	public static final String MODULE_TREE_MEM_LEAKS = " memory leaks";
+	public static final String MODULE_TREE_HANDLE_LEAKS = " handle leaks";
+	public static final String ITEM_TREE_MEM_LEAKS = "Memory leak ";
+	public static final String SUBTEST_TREE_TITLE = "Subtest: ";
+	public static final String NO_MEM_LEAKS_CURRENT_LEVEL = "No memory leaks info available for current detail level. Try to change report detail level.";
+	public static final String RUN_FAILED = " FAILED ";
+	public static final String RUN_ABNORMAL = "Abnormal process end";
+	public static final String RUN_NO_LEAKS = "No memory leaks.";
+
+	public static final String CANCELLED = "Canceled.";
+
+	/**Error information if AnalyzeTool libraries are not installed*/
+	public static final String CAN_NOT_FIND_LIBRARIES = "Can not find AnalyzeTool library files from current SDK. \n\nYou can build AnalyzeTool from sources or contact " +
+			"AnalyzeTool development team to get AnalyzeTool binaries.";
+
+	public static final String CAN_NOT_FIND_LIBRARIES_MARKER = "Can not find AnalyzeTool library files from current SDK."; 
+	/**If user try to build with unsupported platform*/
+	public static final String PLATFORM_NOT_SUPPORTED = "AnalyzeTool supports only ARMV5, GCCE and WINSCW build platforms. \n\nDo you want to continue?";
+
+	public static final String TOO_OLD_ENGINE = "Current version of AnalyzeTool Engine is too old. \nRequired version must be 1.6.0 or higher.\n\nCheck AnalyzeTool preferences.";
+
+	/** Error text when trying to import unknown module to the workspace and module could not be found*/
+	public static final String CAN_NOT_FIND_MODULE = "Can not find module from the active SDK";
+
+	public static final String BUILD_STATE_CHANGED = "Project build state changed. \nDo you want to re-analyze results?";
+
+	public static final String BUILD_CANCELLED = "\n\nAnalyzeTool build cancelled.";
+
+	public static final String BUILD_AND_INSTRUMENT = "Instrument and build with AnalyzeTool";
+
+	public static final String COMPLETE = "Complete";
+
+	public static final String OUTPUT_READER_TITLE = "AnalyzeTool - emulator output reader";
+
+	public static final String INPUT_ILLEGAL = "Illegal character";
+
+	public static final String INPUT_TOO_LONG = "Data file name is too long.";
+
+	public static final String INPUT_NO_SPACES_ALLOWED = "No spaces allowed";
+
+	public static final String MAIN_CAN_NOT_COPY = "Cannot copy: \n";
+	/**
+	 * Preference page constants
+	 */
+	public static final String PREFS_EXT = "Monitored external data gathering";
+	public static final String PREFS_EXT_TOOLTIP = "Gather data to the host computer through external connection.";
+	public static final String PREFS_EXT_FAST = "External data gathering";
+	public static final String PREFS_EXT_FAST_TOOLTIP = "Gather data to the host computer through external connection.";
+	public static final String PREFS_S60 = "Monitored internal data gathering";
+	public static final String PREFS_S60_TOOLTIP = "Gather data to a file in the target device.";
+	public static final String PREFS_USER_SPEC = "Name from the user";
+	public static final String PREFS_USER_SPEC_TOOLTIP = "Ask the file name from the user when building.";
+	public static final String PREFS_USE_PROCESS_NAME = "Name from the process";
+	public static final String PREFS_USE_PROCESS_NAME_TOOLTIP = "Use the process name as the name of the file.";
+	public static final String PREFS_ASK_ALWAYS = "Ask Always";
+	public static final String PREFS_ASK_ALWAYS_TOOLTIP = "Ask data gathering mode from the user every time when building.";
+	public static final String PREFS_ATOOL_VER_NOT_FOUND ="Not available";
+
+	public static final String PREFS_ATOOL_GROUP_TITLE= "AnalyzeTool Engine";
+	public static final String PREFS_USE_INTERNAL_TITLE = "Use internal command line engine";
+	public static final String PREFS_USE_EXTERNAL_TITLE = "Use external command line engine";
+	public static final String PREFS_SELECT_FOLDER = "Choose the atool.exe directory";
+	public static final String PREFS_ATOOL_PATH = "&Atool.exe path:";
+	public static final String PREFS_BROWSE = "Browse...";
+	public static final String PREFS_VERBOSE = "Verbose output";
+	public static final String PREFS_VERBOSE_TOOLTIP = "Verbose output to Console View.";
+	public static final String PREFS_ENGINE_VERSION = "Engine version: ";
+	public static final String PREFS_ADVANCED = "Advanced settings";
+	public static final String PREFS_USE_ROM_SYMBOL = "Use rom symbol file";
+	public static final String PREFS_USE_ROM_SYMBOL_TOOLTIP = "Use rom symbol file to pinpoint rom locations.";
+	public static final String PREFS_ROM_SYMBOL_PATH = "Rom symbol file:";
+	public static final String PREFS_ROM_SYMBOL_PATH_TOOLTIP = "Define which rom symbol file to use.";
+	public static final String PREFS_SELECT_ROM_SYMBOL= "Choose the rom symbol file.";
+	public static final String PREFS_REFRESH_VERSION = "Refresh version";
+	public static final String PREFS_REPORT_LEVEL = "Report level";
+	public static final String PREFS_SHOW_EVERY = "&Show every detail";
+	public static final String PREFS_SHOW_KNOWN = "Show only known code lines(default)";
+	public static final String PREFS_SHOW_TOPMOST = "Show only topmost memory allocation code line";
+	public static final String PREFS_SELECT_DIR = "Select folder";
+	public static final String PREFS_CSSIZE_TITLE = "Callstack size";
+	public static final String PREFS_ZERO_BUTTON = "No callstack stored";
+	public static final String PREFS_FORTY_BUTTON = "40 items";
+	public static final String PREFS_HUNDRED_BUTTON = "100 items (Slows down test run a lot)";
+	public static final String PREFS_CUSTOM_BUTTON = "Custom size (0-255)";
+	public static final String PREFS_CS_SIZE_DISABLED_TOOLTIP = "Command line engine version is too old, version must be 1.7.4 or higher";
+
+	/**Statistics view constants*/
+	public static final String STATISTICS_TAB_TITLE = "Top allocation locations";
+	public static final String STATISTICS_SELECT_RUN = "Select run";
+	public static final String STATISTICS_NODE_FILE = "File";
+	public static final String STATISTICS_NODE_FUNCTION = "Function";
+	public static final String STATISTICS_NODE_LINE = "Line";
+	public static final String STATISTICS_NODE_ALLOCS = "Allocations";
+	public static final String STATISTICS_NODE_TIME = "Time";
+	public static final String STATISTICS_NODE_SIZE = "Size";
+	public static final String STATISTICS_GENERATING = "Generating statistics. Please wait...";
+	public static final String STATISTICS_GENERATING_PROG_TITLE = "Generating statistics";
+	public static final String GRAPH_GENERATING_PROG_TITLE = "Generating graph model";
+	public static final String STATISTICS_NO_STATS = "No statistics available.";
+
+
+	public static final String FIND_COMP_JOB_TITLE = "Finding component locations";
+	public static final String FIND_COMP_JOB_SELECT_MODULE = "Select module";
+	// UI RELATED CONSTANTS END HERE
+
+
+	public static final String SOURCE_NOT_FOUND = "Source file not found from any project.";
+
+
+	public static final String SOURCE_FILE_EDITOR_ID = "org.eclipse.jdt.ui.SourceView";
+	/** Plug-in id */
+	public static final String PLUGINID = "com.nokia.s60tools.analyzetool";
+
+	/** Parser id's to command launcher */
+	public static final String[] atoolParserIds = new String[] { "com.nokia.s60tools.analyzetool" };
+
+	/** File name which is used when saving captured data thru Tracing utility */
+	public static final String FILENAME = "AtoolDataFile.dat";
+
+	/** File name which is used when generating memory analysis results */
+	public static final String FILENAME_CARBIDE = "AtoolFileToCarbide.xml";
+
+	/** Alloc */
+	public static final String ALLOC = "ALLOC";
+	/** Alloc */
+	public static final String ALLOCH = "ALLOCH";
+	/** Alloc */
+	public static final String ALLOCF = "ALLOCF";
+	/** Free */
+	public static final String FREE = "FREE";
+	public static final String FREEH = "FREEH";
+	public static final String FREEF = "FREEF";
+
+	public static final String DLL_LOAD = "DLL_LOAD";
+	public static final String DLL_UNLOAD = "DLL_UNLOAD";
+
+	/** Memory allocation deallocation flag definitions */
+	public static final int TYPE_ALLOC = 0;
+
+	public static final int TYPE_FREE = 1;
+	public static final int TYPE_ALLOCH = 2;
+	public static final int TYPE_FREEH = 3;
+
+	/** Prefix to find */
+	public final static String PREFIX = "PCSS";
+
+	/** Process start string */
+	public static final String PROCESS_START = "PROCESS_START";
+	/** Process end string */
+	public static final String PROCESS_END = "PROCESS_END";
+	/** Button icon definitions */
+	public static final String BUTTON_RUN = "icons/btn_record.png";
+	public static final String BUTTON_STOP = "icons/btn_terminate.png";
+	public static final String BUTTON_BUILD = "icons/btn_build.png";
+	public static final String BUTTON_CLEAN = "icons/btn_clear.png";
+	public static final String BUTTON_COMPUTER = "icons/btn_computer.png";
+	public static final String BUTTON_COMPUTER_FAST = "icons/btn_fast.png";
+	public static final String BUTTON_CELLURAR = "icons/btn_cellular.png";
+	public static final String BUTTON_ASK = "icons/btn_ask.png";
+	public static final String BUTTON_OPEN = "icons/btn_open.png";
+	public static final String BUTTON_DETAILS_ALL = "icons/btn_details_all.png";
+	public static final String BUTTON_DETAILS_KNOWN = "icons/btn_details_known.png";
+	public static final String BUTTON_DETAILS_TOPMOST = "icons/btn_details_topmost.png";
+	public static final String BUTTON_SAVE = "icons/btn_save.png";
+	public static final String BUTTON_START_SUBTEST = "icons/btn_start_subtest.png";
+	public static final String BUTTON_STOP_SUBTEST = "icons/btn_stop_subtest.png";
+	public static final String BUTTON_OPEN_PREFS = "icons/open_prefs.png";
+	public static final String ICON_OUTSIDE = "icons/module_outside.png";
+	public static final String ICON_NOT_BUILD = "icons/module_not_build.png";
+	public static final String ICON_BUILD = "icons/module_build.png";
+	/** Data file definitions */
+	public static final int DATAFILE_LOG = 0;
+	public static final int DATAFILE_TRACE = 1;
+	public static final int DATAFILE_XML = 2;
+
+	public static final int DATAFILE_INVALID = -1;
+	public static final int DATAFILE_EMPTY = -2;
+
+	public static final String DATAFILE_VERSION = "DATA_FILE_VERSION";
+	public static final String ATOOL_TEMP = "atool_temp";
+	public static final String ATOOL_FOLDER = "atool_folder";
+	public static final String LOGGING_MODE = "logging_mode";
+	public static final String S60_LOG_FILE_MODE = "s60_log_file_mode";
+	public static final String USER_SELECTED_FOLDER = "user_selected";
+	public static final String CREATE_STATISTIC = "create_stats";
+	public static final String USE_ROM_SYMBOL = "use_rom_symbol";
+	public static final String USE_ROM = "use_rom";
+	public static final String ROM_LOC = "rom_loc";
+	public static final String USE_ROM_SYMBOL_LOCATION = "rom_symbol_location";
+	public static final String CALLSTACK_SIZE = "callstack_size";
+	public static final String USE_CALLSTACK_SIZE = "use_user_define_cs_size";
+	public static final String REPORT_LEVEL = "report_level";
+	public static final String ATOOL_VERBOSE = "verbose_atool";
+	/** Logging mode preference values */
+	public static final String LOGGING_EXT = "EXT";
+	public static final String LOGGING_EXT_FAST = "EXT_FAST";
+	public static final String LOGGING_S60 = "S60";
+	public static final String LOGGING_ASK_ALLWAYS = "ask_always";
+	public static final String LOGGING_FAST_ENABLED = "logging_fast_enabled";
+
+	/** report level preference values */
+	public static final String REPORT_EVERY = "every_details";
+
+	public static final String REPORT_KNOWN = "known_lines";
+	public static final String REPORT_TOPMOST = "topmost_lines";
+
+	/** S60 logging mode data file name */
+	public static final String LOGGING_S60_PROCESS_NAME = "process_name";
+	public static final String LOGGING_S60_USER_SPECIFIED = "user_secified";
+
+	/** Save report file types */
+	public static final int SAVE_REPORT_FILE_DATA = 0;
+	public static final int SAVE_REPORT_FILE_XML = 1;
+
+
+	public static final String BUILD_TARGET_WINSCW = "WINSCW";
+	public static final String BUILD_TARGET_ARMV5 = "ARMV5";
+	public static final String BUILD_TARGET_GCEE = "GCCE";
+
+	/** Default preference values */
+	public static final String DEFAULT_ATOOL_FOLDER = "c:\\apps\\atool\\";
+
+	public static final String DEFAULT_LOGGING_MODE = Constants.LOGGING_EXT;
+	public static final String DEFAULT_REPORT_LEVEL = Constants.REPORT_KNOWN;
+	public static final String PREFS_LOGGING_MODE_TITLE = "Data gathering mode";
+
+	public static final int ANALYZE_ASK_FOR_USER = 0;
+	public static final int ANALYZE_USE_DATA_FILE = 1;
+
+	public static final String ANALYZE_CONSOLE_ID = "Memory Analysis ID";
+	public static final String ENRULE = " - ";
+
+	public static final int SAVE_DATA_FILE = 0;
+	public static final int SAVE_DATA_FILE_NO = 1;
+	public static final int SAVE_DATA_FILE_CANCEL = 2;
+
+	public static final String ATOOL_INST = "-inst";
+	public static final String ATOOL_INST_E = "-instrument_e";
+	public static final String ATOOL_INST_EF = "-instrument_ef";
+	public static final String ATOOL_INST_I = "-instrument_i";
+	public static final String ATOOL_UNINST = "-uninstrument";
+	public static final String ATOOL_USE_VARIANT = "-variant";
+	public static final String ATOOL_UNINST_FAILED = "-uninstrument_failed";
+	public static final String ATOOL_SHOW_DEBUG = "-show_debug";
+	public static final String USE_INTERNAL = "use_internal";
+	public static final String CALLSTACK_SIZE_OPTION = "-acs";
+
+	public static final int MAX_LENGTH_OF_USER_INPUT = 50;
+
+	public static final int HISTORY_LEVEL = 5;
+
+	//version number comparision constants
+	public static final int VERSION_NUMBERS_INVALID = -1;
+	public static final int VERSION_NUMBERS_FIRST = 0;
+	public static final int VERSION_NUMBERS_SECOND = 1;
+	public static final int VERSION_NUMBERS_EQUALS = 2;
+	public static final String MIN_VERSION = "1.6.0";
+	public static final String CS_SUPPORT_MIN_VERSION = "1.7.4";
+
+	public static final String UNKNOWN = "Unknown";
+
+	public static final String PREFS_KEEP_IN_SYNC = "keepFilesSync";
+	public static final String PREFS_PROMPT_MMP = "promptMMPChanges";
+	public static final String PREFS_MANAGE_DEPS = "manageDeps";
+	public static final String PREFS_CONC_BUILD = "useConcBuild";
+	public static final String PREFS_BUILD_CANCELLED = "buildCancelled";
+
+	// List of libraries what AnalyzeTool needs when compiled applications on armv5 platform
+	public static final String atoolLibs[] = {
+		"epoc32\\RELEASE\\armv5\\LIB\\AToolMemoryHook.lib",
+		"epoc32\\RELEASE\\armv5\\udeb\\AtoolStaticLib.lib",
+		"epoc32\\RELEASE\\armv5\\urel\\AtoolStaticLib.lib"
+	};
+
+	// List of libraries what AnalyzeTool needs when compiled applications on armv5 platform (using sbs2 / ABIV2 binaries)
+	public static final String  atoolLibsSbs2[] = {
+		"epoc32\\RELEASE\\armv5\\LIB\\AToolMemoryHook.dso",
+		"epoc32\\RELEASE\\armv5\\udeb\\AtoolStaticLib.lib",
+		"epoc32\\RELEASE\\armv5\\urel\\AtoolStaticLib.lib"
+	};
+
+	// List of libraries what AnalyzeTool needs when compiled applications on winscw platform
+	public static final String  atoolLibsWinscw[] = {
+		"epoc32\\RELEASE\\winscw\\udeb\\AToolMemoryHook.lib",
+		"epoc32\\RELEASE\\winscw\\udeb\\AtoolStaticLib.lib",
+		"epoc32\\RELEASE\\winscw\\urel\\AtoolStaticLib.lib"
+	};
+
+	public static enum COMMAND_LINE_ERROR_CODE {
+		EXECUTE_ERROR(-1),
+		OK(0),
+		/* instrument errors */
+		INVALID_ARGUMENT_ERROR(1), 
+		CANNOT_FIND_EPOCROOT(3),
+		MAKEFILE_ERROR(5),
+		NO_SUPPORTED_MODULES_ERROR(8),
+		/* Analyze errors */
+		WRONG_DATA_FILE_VERSION(10),
+		ANALYZE_ERROR(12),
+		SYMBOL_FILE_ERROR(14),
+		DATA_FILE_EMPTY(31),
+		DATA_FILE_INVALID(32),
+		/* building&releasing errors */
+		RELEASABLES_ERROR(20),
+		RESTORE_MODULES_ERROR(21),
+		CREATING_TEMP_CPP_ERROR(22),
+		CLEANING_TEMP_ERROR(23),
+		READ_MAKEFILE_ERROR(24),
+		MODIFY_MODULES_ERROR(25),
+		INVALID_MMP_DEFINED(27),
+
+		/* User issued exit */
+		UNKNOWN_ERROR(999);
+		private final int code;
+
+		COMMAND_LINE_ERROR_CODE(int c) {
+		   code = c;
+		 }
+
+		 public int getCode() {
+		   return code;
+		 }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/global/Util.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,1271 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class Util
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.global;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.channels.FileChannel;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.cdt.core.model.ICModelMarker;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.core.runtime.IBundleGroupProvider;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ListDialog;
+import org.osgi.framework.Bundle;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.DefaultMMPViewConfiguration;
+import com.nokia.carbide.cdt.builder.EpocEngineHelper;
+import com.nokia.carbide.cdt.builder.builder.CarbideCPPBuilder;
+import com.nokia.carbide.cdt.builder.builder.CarbideCommandLauncher;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.carbide.cpp.epoc.engine.EpocEnginePlugin;
+import com.nokia.carbide.cpp.epoc.engine.MMPDataRunnableAdapter;
+import com.nokia.carbide.cpp.epoc.engine.model.mmp.EMMPStatement;
+import com.nokia.carbide.cpp.epoc.engine.model.mmp.IMMPData;
+import com.nokia.carbide.cpp.epoc.engine.preprocessor.AcceptedNodesViewFilter;
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.builder.AnalyzeToolBuilder;
+import com.nokia.s60tools.analyzetool.engine.MMPInfo;
+import com.nokia.s60tools.analyzetool.engine.UseAtool;
+import com.nokia.s60tools.analyzetool.global.Constants.COMMAND_LINE_ERROR_CODE;
+
+/**
+ * Provides commonly used functions.
+ *
+ * @author kihe
+ *
+ */
+public class Util {
+
+    /** Contains user selection in the confirmation dialog. */
+    private static boolean ret;
+
+    /** Contains user selection (integer) in the selection dialog. */
+    private static int retValue;
+
+    /** Contains user selection (String) in the selection dialog. */
+    private static String userSelection = "";
+
+    /** Contains StringBuffer size. */
+    private static int bufferSize = 32;
+
+    /**
+     * Checks is module built.
+     *
+     * @param modules
+     *            Project modules
+     * @param oneModuleName
+     *            Current module
+     * @return True if module found and it is build
+     */
+    public static boolean chechModuleBuildState(
+            final AbstractList<MMPInfo> modules, final String oneModuleName) {
+        Iterator<MMPInfo> iterModules = modules.iterator();
+        while (iterModules.hasNext()) {
+            MMPInfo oneMMPInfo = iterModules.next();
+            String target = oneMMPInfo.getTarget();
+            if (target == null) {
+                continue;
+            } else if (oneMMPInfo.getTarget().equalsIgnoreCase(oneModuleName)) {
+                return oneMMPInfo.isBuildSuccesfully();
+            }
+
+            // target not found try remove {}
+            // for example process name is
+            // "AToolMemoryLeakerDll2.dll{000a0000}[04463b81]"
+            // but target name is AToolMemoryLeakerDll2.dll
+            CharSequence brace = "{";
+            if (oneModuleName.contains(brace)) {
+                // parse braces
+                String tmpTargetName = oneModuleName.substring(0, oneModuleName
+                        .indexOf('{'));
+                if (tmpTargetName != null
+                        && oneMMPInfo.getTarget().equalsIgnoreCase(
+                                tmpTargetName)) {
+                    return oneMMPInfo.isBuildSuccesfully();
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Checks is AnalyzeTool libraries installed from the current SDK.
+     *
+     * @param cpi
+     *            {@link ICarbideProjectInfo} reference
+     * @return True if libraries are installed otherwise false.
+     */
+    public static boolean checkAtoolLibs(final ICarbideProjectInfo cpi) {
+        // get active platform
+        String platform = cpi.getDefaultConfiguration().getPlatformString();
+
+        // get epoc root
+        IPath epocRootPath = EpocEngineHelper.getEpocRootForProject(cpi.getProject());
+
+        //check that epocroot path found
+        if( epocRootPath == null ) {
+            return false;
+        }
+
+        String epocroot = epocRootPath.toOSString();
+        boolean found = true;
+        StringBuffer fileBuffer = new StringBuffer(bufferSize);
+        fileBuffer.append(Constants.CAN_NOT_FIND_LIBRARIES_MARKER);
+        fileBuffer.append(": ");
+        if ((Constants.BUILD_TARGET_WINSCW).equalsIgnoreCase(platform)) {
+            for (int i = 0; i < Constants.atoolLibsSbs2.length; i++) {
+                java.io.File file = new java.io.File(epocroot
+                        + Constants.atoolLibsWinscw[i]);
+                if (!file.exists()) {
+                    found = false;
+                    fileBuffer.append(epocroot);
+                    fileBuffer.append(Constants.atoolLibsWinscw[i]);
+                    fileBuffer.append(' ');
+                }
+            }
+        } else if ((Constants.BUILD_TARGET_ARMV5).equalsIgnoreCase(platform)) {
+            if (AnalyzeToolBuilder.isSBSBuildActivated(cpi)) {
+                for (int i = 0; i < Constants.atoolLibsSbs2.length; i++) {
+                    java.io.File file = new java.io.File(epocroot
+                            + Constants.atoolLibsSbs2[i]);
+                    if (!file.exists()) {
+                        found = false;
+                        fileBuffer.append(epocroot);
+                        fileBuffer.append(Constants.atoolLibsSbs2[i]);
+                        fileBuffer.append(' ');
+                    }
+                }
+            } else {
+                for (int i = 0; i < Constants.atoolLibs.length; i++) {
+                    java.io.File file = new java.io.File(epocroot
+                            + Constants.atoolLibs[i]);
+                    if (!file.exists()) {
+                        found = false;
+                        fileBuffer.append(epocroot);
+                        fileBuffer.append(Constants.atoolLibs[i]);
+                        fileBuffer.append(' ');
+                    }
+                }
+            }
+        }
+        if (!found) {
+            createErrorMarker(cpi.getProject(), fileBuffer.toString());
+        }
+
+        return found;
+    }
+
+    /**
+     * Copies stored memory leak analysis file to given folder.
+     *
+     * @param resultFile
+     *            Existing results file
+     * @param targetPath
+     *            Where to save xml file
+     * @return True if copy success otherwise False
+     */
+    public static boolean copyFileToFolder(final String resultFile,
+            final String targetPath) {
+        FileChannel inputChannel = null;
+        FileChannel ouputChannel = null;
+        FileInputStream inStream = null;
+        FileOutputStream outStream = null;
+        boolean returnValue = true;
+        try {
+
+            // get channel to existing file
+            inStream = new FileInputStream(resultFile);
+            inputChannel = inStream.getChannel();
+
+            // get channel to new file
+            outStream = new FileOutputStream(targetPath, false);
+            ouputChannel = outStream.getChannel();
+
+            // get existing file size
+            final long size = inputChannel.size();
+
+            // position inside the file
+            long position = 0;
+
+            // copy file contents if there are data to copy
+            while (position < size) {
+                position += ouputChannel.transferFrom(inputChannel, position,
+                        size - position);
+            }
+
+            // close opened channels
+            inputChannel.close();
+            inStream.close();
+            ouputChannel.close();
+            outStream.close();
+        } catch (FileNotFoundException fnfe) {
+            returnValue = false;
+        } catch (IOException ioe) {
+            returnValue = false;
+        } finally {
+            try {
+                if (inputChannel != null) {
+                    inputChannel.close();
+                    inputChannel = null;
+                }
+            } catch (IOException ioe) {
+                returnValue = false;
+            }
+
+            try {
+                if (inStream != null) {
+                    inStream.close();
+                    inStream = null;
+                }
+            } catch (IOException ioe) {
+                returnValue = false;
+            }
+
+            try {
+                if (ouputChannel != null) {
+                    ouputChannel.close();
+                    ouputChannel = null;
+                }
+            } catch (IOException ioe) {
+                returnValue = false;
+            }
+
+            try {
+                if (outStream != null) {
+                    outStream.close();
+                    outStream = null;
+                }
+            } catch (IOException ioe) {
+                returnValue = false;
+            }
+
+        }
+
+        return returnValue;
+    }
+
+    /**
+     * Creates AnalyzeTool related error marker for the selected project.
+     *
+     * @param project
+     *            Project reference
+     * @param errorText
+     *            Error information
+     */
+    public static void createErrorMarker(final IProject project,
+            final String errorText) {
+        try {
+            // check project validity
+            if (project == null || !project.isOpen()) {
+                return;
+            }
+
+            // create marker for the project
+            IMarker marker = project
+                    .createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER);
+            if (marker.exists()) {
+                // set marker attributes
+                marker.setAttribute(IMarker.SEVERITY, IMarker.PRIORITY_HIGH);
+                marker.setAttribute(IMarker.TEXT, errorText);
+                marker.setAttribute(IMarker.MESSAGE, errorText);
+            }
+        } catch (CoreException ce) {
+            // #ifdef DEBUG
+            ce.printStackTrace();
+            // #endif
+        }
+    }
+
+    /**
+     * Deletes existing data file.
+     *
+     * @param project
+     *            Project reference
+     */
+    public static void deleteDataFile(final IProject project) {
+        String bldInfFolder = getBldInfFolder(project, false);
+        String dataFileLocation = bldInfFolder + Constants.FILENAME;
+        java.io.File tmpFile = new java.io.File(dataFileLocation);
+        if (tmpFile.exists()) {
+            tmpFile.delete();
+        }
+
+        String xmlFileLocation = bldInfFolder + Constants.FILENAME_CARBIDE;
+        java.io.File tmpXMLFile = new java.io.File(xmlFileLocation);
+        if (tmpXMLFile.exists()) {
+            tmpXMLFile.delete();
+        }
+
+        tmpFile = null;
+        tmpXMLFile = null;
+    }
+
+
+    /**
+     * Open file save dialog.
+     *
+     * @param title
+     *            Save dialog title
+     * @param ext
+     *            Used extension filters
+     *
+     * @param shell
+     *            Used Shell reference
+     *
+     * @return User selected path
+     */
+    public static String fileSaveDialog(final String title, final String[] ext,
+            final Shell shell) {
+        FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
+        fileDialog.setText(title);
+        fileDialog.setFilterExtensions(ext);
+        return fileDialog.open();
+
+    }
+
+    /**
+     * Gets atool.exe installation folder which is specified on preferences
+     * page.
+     *
+     * @return Atool.exe installation folder
+     */
+    public static String getAtoolInstallFolder() {
+        // get preference store
+        IPreferenceStore store = Activator.getPreferences();
+
+        // create new string buffer
+        StringBuffer atoolInstallFolder = new StringBuffer();
+
+        boolean useInternal = store.getBoolean(Constants.USE_INTERNAL);
+
+        // append atool.exe installation folder
+        String folder = store.getString(Constants.ATOOL_FOLDER);
+        if (useInternal) {
+            atoolInstallFolder.append(getDefaultAtoolLocation());
+        } else if (("").equals(folder)) {
+            store.setValue(Constants.USE_INTERNAL, true);
+            atoolInstallFolder.append(getDefaultAtoolLocation());
+        } else if (folder.equals(Constants.DEFAULT_ATOOL_FOLDER)) {
+            java.io.File file = new java.io.File(Constants.DEFAULT_ATOOL_FOLDER);
+            if (file.exists()) {
+                atoolInstallFolder.append(Constants.DEFAULT_ATOOL_FOLDER);
+            } else {
+                store.setValue(Constants.USE_INTERNAL, true);
+                atoolInstallFolder.append(getDefaultAtoolLocation());
+            }
+        } else {
+            atoolInstallFolder.append(folder);
+        }
+        // append atool.exe to installation path
+        atoolInstallFolder.append("\\atool.exe");
+        return atoolInstallFolder.toString();
+    }
+
+    /**
+     * Returns atool.exe version number Executes atool.exe via Process class and
+     * parses atool.exe output to get version number.
+     *
+     * @param path
+     *            Atool.exe path
+     * @return Atool.exe version number if found otherwise "Not available"
+     */
+    public static String getAtoolVersionNumber(final String path) {
+
+        BufferedInputStream br = null;
+
+        try {
+            // used atool.exe location
+            String usedPath = null;
+
+            // if path not given => use default location
+            if (path == null) {
+                usedPath = getDefaultAtoolLocation() + "\\atool.exe";
+            }
+            else if( path.contains("atool.exe") ){
+                usedPath = path;
+            }
+            // else use given location
+            else {
+                usedPath = path + "\\atool.exe";
+            }
+
+            // command
+            String[] args = { "cmd", "/c", usedPath, "-v" };
+
+            // execute command
+            Process pr = Runtime.getRuntime().exec(args);
+
+            // get atool.exe response to buffer
+            br = new BufferedInputStream(pr
+                    .getInputStream());
+
+            // wait that all the input is captured
+            pr.waitFor();
+
+            // create new stringbuffer for the input
+            StringBuffer bf = new StringBuffer("");
+            int r = -1;
+
+            // read atool.exe response to stringbufffer
+            while ((r = br.read()) != -1) {
+                bf.append((char) r);
+            }
+
+            // because atool.exe response is following format
+            // Version: [version number]
+            // Path: [location]
+            // Modified: [date and time]
+            // we only need to get first row of response
+            String[] array = bf.toString().split("\r\n");
+
+            // check array
+            if (array != null && array.length > 0) {
+
+                String version = "Version:";
+
+                // get first array
+                String versionStr = array[0];
+
+                // if first row contains "version:"
+                if (versionStr.contains(version)) {
+
+                    // get atool.exe version number
+                    String atoolVersionNbr = versionStr.substring(version
+                            .length() + 1, versionStr.length());
+
+                    if( atoolVersionNbr == null || ("").equals(atoolVersionNbr ) ) {
+                        return Constants.PREFS_ATOOL_VER_NOT_FOUND;
+                    }
+
+                    return atoolVersionNbr;
+                }
+            }
+            br.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if( br != null ) {
+                    br.close();
+                    br = null;
+                }
+            }catch( IOException ioe ) {
+                ioe.printStackTrace();
+            }
+
+        }
+        return Constants.PREFS_ATOOL_VER_NOT_FOUND;
+    }
+
+    /**
+     * Returns the version number of the AnalyzeTool host-side feature, or "Unknown" if it cannot be determined
+     * @return feature version string
+     */
+    public static String getAToolFeatureVersionNumber(){
+    	String version = Constants.UNKNOWN;
+    	IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
+		if (providers != null) {
+			for (IBundleGroupProvider bundleGroupProvider : providers) {
+				for (IBundleGroup feature : bundleGroupProvider.getBundleGroups()) {
+					if (feature.getIdentifier().equals("com.nokia.carbide.extensions.analyzetool")){
+						version = feature.getVersion();
+						break;
+					}
+				}
+			}
+		}
+    	return version;
+    }
+
+    /**
+     * Gets project bld.inf folder path.
+     *
+     * @param project
+     *            Project reference
+     * @param createTempFolder
+     *            Flag to create atool_temp folder
+     * @return Project bld.inf folder path
+     */
+    public static String getBldInfFolder(final IProject project,
+            final boolean createTempFolder) {
+        // get bld.inf directory
+        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+                .getProjectInfo(project);
+        if (cpi == null) {
+            return "";
+        }
+
+        String infDir = cpi.getINFWorkingDirectory().toOSString();
+
+        // create atool_temp folder if it does not exists
+        if (createTempFolder) {
+            UseAtool.createAToolFolderIfNeeded(infDir);
+        }
+
+        return infDir + "\\atool_temp\\";
+    }
+
+    /**
+     * Gets cpp file name and path.
+     *
+     * @param resource
+     *            One resource file
+     * @return MMP file name and path if resource is mmp file, otherwise null
+     */
+    public static String getCPPFileNameAndPath(final IResource resource) {
+        // get file extension
+        String fileExt = resource.getFileExtension();
+        String cppFileAndPath = null;
+
+        // if file contains extension and it equals to mmp
+        if (fileExt != null && fileExt.compareTo("cpp") == 0) {
+            // get resource location/path
+            String resourcePath = resource.getLocation().toString();
+
+            // if resource path does not contain atool_temp folder
+            // save resource location
+            if (resourcePath.indexOf(Constants.ATOOL_TEMP) == -1) {
+                cppFileAndPath = resource.getProjectRelativePath().toString();
+            }
+
+        }
+
+        // return cpp file name and path
+        return cppFileAndPath;
+    }
+
+    /**
+     * Returns atool.exe location inside the plugin.
+     *
+     * @return Atool.exe location folder could be found otherwise ""
+     */
+    public static String getDefaultAtoolLocation() {
+        try {
+            // AnalyzeTool bundle
+            Bundle bunble = Platform
+                    .getBundle("com.nokia.s60tools.analyzetool.corecomponents"); //$NON-NLS-1$
+
+            // if bundle not found return empty path
+            if( bunble == null ) {
+                return "";
+            }
+            // get bundle URL
+            URL bundleURL = bunble.getEntry("/");
+
+            // get file URL
+            URL fileURL = FileLocator.toFileURL(bundleURL);
+
+            // create new file
+            File file = new File(fileURL.getPath());
+
+            // if file exists return file path + atool.exe folder name
+            if (file.exists()) {
+                return file.getAbsolutePath();
+            }
+            return "";
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    /**
+     * Gets last slash index for current string.
+     *
+     * @param line
+     *            Line where to find slash index
+     * @return Integer value of slash index
+     */
+    public static int getLastSlashIndex(final String line) {
+        // get last slash index
+        char slash = '/';
+        int slashIndex = line.lastIndexOf(slash);
+        if (slashIndex == -1) {
+            char backSlash = '\\';
+            slashIndex = line.lastIndexOf(backSlash);
+        }
+
+        return slashIndex;
+    }
+
+     /**
+     * Check is atool.exe available.
+     *
+     * @return True if atool.exe found otherwise False
+     */
+    public static boolean isAtoolAvailable() {
+        IPreferenceStore store = Activator.getPreferences();
+        String folderLocation = store.getString(Constants.ATOOL_FOLDER);
+
+        if (folderLocation.length() > 0) {
+            if (!folderLocation.endsWith("\\")) {
+                folderLocation += "\\";
+            }
+
+            IPath atoolPath = new Path(folderLocation + "atool.exe");
+
+            // if folder does not exists
+            if (atoolPath.toFile().exists()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks is data file available.
+     *
+     * @param project
+     *            Project reference
+     * @return Data file path if it's available otherwise null
+     */
+    public static String isDataFileAvailable(final IProject project) {
+        String bldInfFolder = getBldInfFolder(project, false);
+        String dataFileLocation = bldInfFolder + Constants.FILENAME;
+        java.io.File dataFile = new java.io.File(dataFileLocation);
+        if (dataFile.exists() && dataFile.length() > 0 ) {
+            return dataFileLocation;
+        }
+        return null;
+    }
+
+    /**
+     * Checks is file extension .xml.
+     *
+     * @param filePath
+     *            File location
+     * @return True if file contains xml extension otherwise false
+     */
+    public static boolean isFileXML(final String filePath) {
+        String fileNameAndExt = null;
+        // get index of last backslash
+        int index = Util.getLastSlashIndex(filePath);
+
+        // if backslash found
+        if (index != -1) {
+
+            // get file name
+            fileNameAndExt = filePath.substring(index + 1, filePath.length());
+
+            // if file name contains xml extension
+            if (fileNameAndExt.contains(".xml")) {
+                return true;
+            }
+        }
+        return false;
+
+    }
+
+    /**
+     * Check if current module is build.
+     *
+     * @param mmpFile
+     *            MMP file name and path
+     * @return True if module is build otherwise False
+     */
+    public static boolean isModuleBuild(final String mmpFile) {
+        String path = null;
+        // remove mmp file name for path
+        int slash = Util.getLastSlashIndex(mmpFile);
+        if (slash == -1) {
+            return false;
+        }
+        path = mmpFile.substring(0, slash);
+        String buildFile = path + "\\atool_temp\\BuildComplete";
+        java.io.File file = new java.io.File(buildFile);
+        return file.exists();
+    }
+
+    /**
+     * Checks that belongs given module to selected project.
+     *
+     * @param modules
+     *            Project modules
+     * @param oneModuleName
+     *            One module name
+     * @return True if module belongs to selected project otherwise false
+     */
+    public static boolean isModulePartOfProject(
+            final AbstractList<MMPInfo> modules, final String oneModuleName) {
+        Iterator<MMPInfo> iterModules = modules.iterator();
+        while (iterModules.hasNext()) {
+            MMPInfo oneMMPInfo = iterModules.next();
+            String target = oneMMPInfo.getTarget();
+            if (target == null) {
+                continue;
+            } else if (oneMMPInfo.getTarget().equalsIgnoreCase(oneModuleName)) {
+                return true;
+            }
+
+            // target not found try remove {}
+            // for example process name is
+            // "AToolMemoryLeakerDll2.dll{000a0000}[04463b81]"
+            // but target name is AToolMemoryLeakerDll2.dll
+            CharSequence brace = "{";
+            if (oneModuleName.contains(brace)) {
+                // parse braces
+                String tmpTargetName = oneModuleName.substring(0, oneModuleName
+                        .indexOf('{'));
+                if (tmpTargetName != null
+                        && oneMMPInfo.getTarget().equalsIgnoreCase(
+                                tmpTargetName)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Gets current project targets info.
+     *
+     * @param project
+     *            Project reference
+     *
+     * @return AbstractList<MMPInfo> List of project targets
+     */
+    public static AbstractList<MMPInfo> loadProjectTargetsInfo(
+            final IProject project) {
+        AbstractList<MMPInfo> targets = new ArrayList<MMPInfo>();
+        if (project == null || !project.isOpen()) {
+            return targets;
+        }
+
+        // Assumes buildConfig (ICarbideBuildConfiguration) is known
+        ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+                .getProjectInfo(project);
+        if (cpi == null) {
+            return new ArrayList<MMPInfo>();
+        }
+
+        ICarbideBuildConfiguration buildConfig = cpi.getDefaultConfiguration();
+
+        for (IPath mmpPath : EpocEngineHelper
+                .getMMPFilesForBuildConfiguration(buildConfig)) {
+            Object data = EpocEnginePlugin.runWithMMPData(mmpPath,
+                    new DefaultMMPViewConfiguration(buildConfig
+                            .getCarbideProject().getProject(), buildConfig,
+                            new AcceptedNodesViewFilter()),
+                    new MMPDataRunnableAdapter() {
+                        public Object run(IMMPData mmpData) {
+                            // The real return value, getting a single argument
+                            // setting
+                            return mmpData.getSingleArgumentSettings().get(
+                                    EMMPStatement.TARGET);
+
+                        }
+                    });
+
+            // Make sure to test for and cast to proper Object type!
+            int index = Util.getLastSlashIndex(mmpPath.toOSString());
+            String mmpFileName = "";
+            if (index != -1) {
+                mmpFileName = mmpPath.toOSString().substring(index + 1,
+                        mmpPath.toOSString().length());
+            }
+            MMPInfo oneMMPInfo = new MMPInfo(mmpFileName);
+            oneMMPInfo.setLocation(mmpPath.toOSString());
+
+            String mmpStatement = (String) data; // Now we should have the
+            // TARGETTYPE
+            oneMMPInfo.setTarget(mmpStatement);
+            targets.add(oneMMPInfo);
+        }
+        return targets;
+    }
+
+    /**
+     * Opens confirmation Dialog.
+     *
+     * @param text
+     *            Dialog info text
+     * @return boolean True if user selects "Yes" False if user selects "No"
+     */
+    public static boolean openConfirmationDialog(final String text) {
+
+        Activator.getDefault().getWorkbench().getDisplay().syncExec(
+                new Runnable() {
+                    public void run() {
+                        ret = MessageDialog.openQuestion(new Shell(),
+                                Constants.ANALYZE_TOOL_TITLE, text);
+                    }
+                });
+        return ret;
+    }
+
+    /**
+     * Opens confirmation Dialog.
+     *
+     * @param text
+     *            Dialog info text
+     * @return int User selected index
+     */
+    public static int openConfirmationDialogWithCancel(final String text) {
+
+        Activator.getDefault().getWorkbench().getDisplay().syncExec(
+                new Runnable() {
+                    public void run() {
+
+                        String[] labels = new String[3];
+                        labels[0] = "Yes";
+                        labels[1] = "No";
+                        labels[2] = "Cancel";
+                        MessageDialog mDialog = new MessageDialog(new Shell(),
+                                Constants.ANALYZE_TOOL_TITLE, null, text, 0,
+                                labels, 0);
+                        mDialog.open();
+                        mDialog.create();
+                        retValue = mDialog.getReturnCode();
+                    }
+                });
+        return retValue;
+    }
+
+    /**
+     * Opens console view.
+     */
+    public static void openConsoleView() {
+        // sync with UI thread
+        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
+            public void run() {
+
+                try {
+                    // get active workspace page
+                    IWorkbenchPage page = Activator.getDefault().getWorkbench()
+                            .getActiveWorkbenchWindow().getActivePage();
+
+
+                    // display main view
+                    if (page != null) {
+                        IWorkbenchPart part = page.getActivePart();
+
+
+                        String activePageID = part.getSite().getId();
+
+                        if( activePageID.equals(Constants.ANALYZE_TOOL_VIEW_ID) || part instanceof org.eclipse.ui.navigator.CommonNavigator) {
+                            page
+                            .showView(org.eclipse.ui.console.IConsoleConstants.ID_CONSOLE_VIEW);
+                        }
+
+                    }
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    /**
+     * Opens selection dialog.
+     *
+     * @param shell
+     *            Shell reference
+     * @param title
+     *            Dialog title
+     * @param defaultLocation
+     *            Dialog default location
+     * @return User selection
+     */
+    public static String openFileDialog(final Shell shell, final String title,
+            final String defaultLocation) {
+        FileDialog fileDialog = new FileDialog(shell);
+        fileDialog.setText(title);
+        // set the file extension filter
+        String[] filterExt = { "*.*", "*.dat", "*.xml" };
+        fileDialog.setFilterExtensions(filterExt);
+
+        // fileDialog.setFilterPath( defaultLocation );
+        return fileDialog.open();
+    }
+
+    /**
+     * Opens selection dialog.
+     *
+     * @param title
+     *            Dialog title
+     * @param message
+     *            Dialog message text
+     * @param input
+     *            Dialog input
+     * @return Selected item
+     */
+    public static String openSelectionDialog(final String title,
+            final String message, final AbstractList<String> input) {
+        Activator.getDefault().getWorkbench().getDisplay().syncExec(
+                new Runnable() {
+                    public void run() {
+                        userSelection = "";
+
+                        ListDialog ld = new ListDialog(new Shell());
+                        ld.setAddCancelButton(true);
+                        ld.setContentProvider(new ArrayContentProvider());
+                        ld.setLabelProvider(new LabelProvider());
+
+                        int width = 0;
+                        // calculate dialog width
+                        for (int i = 0; i < input.size(); i++) {
+                            String tempStr = input.get(i);
+
+                            if (tempStr.length() > width) {
+                                width = tempStr.length();
+                            }
+                        }
+
+                        // set dialog width
+                        // ld.setWidthInChars( width + 2 );
+                        ld.setInput(input);
+                        ld.setTitle(title);
+                        if (message != null) {
+                            ld.setMessage(message);
+                        }
+
+                        ld.setHelpAvailable(false);
+                        ld.open();
+
+                        Object[] objs = ld.getResult();
+                        if (objs != null) {
+                            userSelection = objs[0].toString();
+                        }
+
+                    }
+                });
+        return userSelection;
+    }
+
+    /**
+     * Displays error message.
+     *
+     * @param message
+     *            Error note content
+     */
+    public static void showErrorMessage(final String message) {
+    	
+    	PlatformUI.getWorkbench().getDisplay().asyncExec( new Runnable() {
+			public void run() {
+				MessageDialog
+                .openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Constants.DIALOG_TITLE, message);		
+			}
+		});
+        
+    }
+
+    /**
+     * Displays information note.
+     *
+     * @param message
+     *            Information note content
+     */
+    public static void showMessage(final String message) {
+
+        //sync with the UI thread
+        PlatformUI.getWorkbench().getDisplay().syncExec( new Runnable() {
+            public void run() {
+
+                MessageDialog
+                .openInformation(Activator.getDefault().getWorkbench()
+                        .getDisplay().getActiveShell(), Constants.DIALOG_TITLE,
+                        message);
+            }
+        });
+
+    }
+
+    /**
+     * Check is atool.exe verbose output checked.
+     *
+     * @return True verbose output is checked otherwise False
+     */
+    public static boolean verboseAtoolOutput() {
+        IPreferenceStore store = Activator.getPreferences();
+        return store.getBoolean(Constants.ATOOL_VERBOSE);
+    }
+
+    /**
+     * Creates progress dialog and clears atool.exe made changes.
+     *
+     * @param newProject
+     *            Project reference
+     */
+    public final void clearAtoolChanges(final IProject newProject) {
+
+        // project reference
+        final IProject project = newProject;
+
+        Job cleanJob = new Job(Constants.PROGRESSDIALOG_CLEAR_CHANGES) {
+            @Override
+            protected IStatus run(IProgressMonitor monitor) {
+
+                // update progress monitor state
+                monitor.beginTask(Constants.PROGRESSDIALOG_CLEAR_CHANGES, IProgressMonitor.UNKNOWN);
+
+                // get project info
+                ICarbideProjectInfo cpi = CarbideBuilderPlugin
+                        .getBuildManager().getProjectInfo(project);
+                if (cpi == null) {
+                    return new Status(IStatus.OK, Constants.ANALYZE_CONSOLE_ID,
+                            IStatus.OK,
+                            Constants.PROGRESSDIALOG_CLEAN_COMPLETE, null);
+                }
+
+                // new command launcher
+                CarbideCommandLauncher cmdLauncher = new CarbideCommandLauncher(
+                        project, monitor, Constants.atoolParserIds, cpi
+                                .getINFWorkingDirectory());
+                cmdLauncher.startTimingStats();
+
+                cmdLauncher.showCommand(true);
+
+                cmdLauncher.writeToConsole(cmdLauncher.getTimingStats());
+
+                AbstractList<String> usedArguments = new ArrayList<String>();
+                usedArguments.add("-c");
+                if (Util.verboseAtoolOutput()) {
+                    usedArguments.add(Constants.ATOOL_SHOW_DEBUG);
+                }
+
+                String[] arguments = new String[usedArguments.size()];
+                usedArguments.toArray(arguments);
+                int error = Constants.COMMAND_LINE_ERROR_CODE.OK.getCode();
+                error = cmdLauncher.executeCommand(new Path(Util
+                        .getAtoolInstallFolder()), arguments,
+                        CarbideCPPBuilder.getResolvedEnvVars(cpi
+                                .getDefaultConfiguration()), cpi
+                                .getINFWorkingDirectory());
+
+                // if command line engine returns some error code => display the error
+                if( error != Constants.COMMAND_LINE_ERROR_CODE.OK.getCode() ) {
+                	Constants.COMMAND_LINE_ERROR_CODE errorCode = Util.getErrorCode(error);
+                	Util.displayCommandLineError(errorCode);
+                }
+
+                return new Status(IStatus.OK, Constants.ANALYZE_CONSOLE_ID,
+                        IStatus.OK, Constants.PROGRESSDIALOG_CLEAN_COMPLETE,
+                        null);
+            }
+        };
+        cleanJob.setUser(true);
+        cleanJob.schedule();
+    }
+
+
+    /**
+     * Compares two atool.exe version numbers and returns
+     * higher one.
+     * @param firstVersion First version number
+     * @param secondVersion Second version number
+     * @return 0 if the first one is higher, 1 if the second one is higher otherwise -1
+     */
+    public static int compareVersionNumber(String firstVersion, String secondVersion)
+    {
+
+        // split version numbers
+        String first[] = firstVersion.split("[.]");
+        String second[] = secondVersion.split("[.]");
+
+        // check that version numbers contains valid formatting
+        if( first == null || second == null || first.length <1 || second.length < 1 || (first.length != second.length) ) {
+            return Constants.VERSION_NUMBERS_INVALID;
+        }
+        // if version number equals => no need to check which one is higher
+        if( firstVersion.equalsIgnoreCase(secondVersion) )
+        {
+            return Constants.VERSION_NUMBERS_EQUALS;
+        }
+        // thru splitted version number
+        for( int i=0; i<first.length; i++ ) {
+        	try{
+        		int firstNumber = Integer.parseInt( first[i] );
+                int secondNumber = Integer.parseInt( second[i] );
+
+                // if first and second given number equals => skip to next number
+                if( firstNumber == secondNumber ) {
+                    continue;
+                }
+                else if( firstNumber > secondNumber ) {
+                    return Constants.VERSION_NUMBERS_FIRST;
+                }
+                else {
+                    return Constants.VERSION_NUMBERS_SECOND;
+                }
+
+        	}catch(NumberFormatException nfe) {
+        		nfe.printStackTrace();
+        		return Constants.VERSION_NUMBERS_INVALID;
+        	}
+        }
+        return Constants.VERSION_NUMBERS_INVALID;
+    }
+
+ 
+    /**
+     * Displays corresponding error message.
+     * @param errorCode Error code
+     */
+    public static final void displayCommandLineError( Constants.COMMAND_LINE_ERROR_CODE errorCode ) {
+    	switch(errorCode) {
+    		case EXECUTE_ERROR:
+    			Util.showErrorMessage(Constants.ERROR_ATOOL_NOT_AVAILABLE);
+    			break;
+	    	case OK:
+	    		// everything is OK, no need to do anything
+	    		break;
+	    		
+	    	case INVALID_ARGUMENT_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool tried to execute command line engine with invalid parameters. \n\nTo avoid this go to AnalyzeTool preference page and select \"Use internal " +
+	    				"command line engine\".");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Extension tried to execute command line engine with invalid parameters.");
+	    		break;
+	    		
+	       	case CANNOT_FIND_EPOCROOT:
+	       		Util.showErrorMessage("AnalyzeTool can not find epocroot. \nCheck SDK preferences and build project again.");
+	       		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Can not find epocroot.");
+	    		break;
+	    		
+	    	case MAKEFILE_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool command line engine fails to create makefiles.\n\nTry to clean AnalyzeTool changes and build project again." +
+	    				"\nIf problem still occurs contact AnalyzeTool development team.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Make file error.");
+	    		break;
+	    		
+	      	case NO_SUPPORTED_MODULES_ERROR:
+	      		Util.showErrorMessage("Project contains unsupported modules, this project could not build with AnalyzeTool!");
+	      		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - No supported modules error.");
+	    		break;
+	    		
+	    	case WRONG_DATA_FILE_VERSION:
+	    		Util.showErrorMessage("Selected data file contains invalid version number. \nThis usually means that data file " +
+	    				"format is changed and AnalyzeTool command line engine can not resolve that. \n\nTry run tests again with the newest version of AnalyzeTool.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Wrong data file version.");
+	    		break;
+	    	
+	    	case ANALYZE_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool can not analyze the selected data file.\nThis problem usually occurs when selected file contains corrupted AnalyzeTool data. \nTry to run " +
+	    				"tests again with the newest version of AnalyzeTool.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - General Analyze Error.");
+	    		break;
+	    		
+	    	case SYMBOL_FILE_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool can not resolve selected symbol file(s). \n\nGo to AnalyzeTool advanced preference page and check selected symbol file(s).");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Symbol file error.");
+	    		break;
+	    		
+	    	case DATA_FILE_EMPTY:
+	    		Util.showErrorMessage("Can not analyze. \n\nSelected file is empty.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Selected file is empty.");
+	    		break;
+	    		
+	    	case DATA_FILE_INVALID:
+	    		Util.showErrorMessage("Can not analyze. \n\nSelected data file does not contain AnalyzeTool data.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Invalid data file.");
+	    		break;
+	    		
+	    	case RELEASABLES_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool can not copy needed files, therefore callstack can not be displayed when analyzing data." +
+	    				"\n\nTry to clean AnalyzeTool made changes and build project again.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Releasebles error.");
+	    		break;
+	    		
+	    	case RESTORE_MODULES_ERROR:
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Restore module error.");
+	    		break;
+
+	    	case CREATING_TEMP_CPP_ERROR:
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Creating temp cpp file error.");
+	    		break;
+
+	    	case CLEANING_TEMP_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool failed to clean project. You may have to clean changes manually.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Clean error.");
+	    		break;
+
+	    	case READ_MAKEFILE_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool command line engine can not read project make files. \n\nTry to clean AnalyzeTool" +
+	    				" made changes and build project again.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Read make file error.");
+	    		break;
+
+	    	case MODIFY_MODULES_ERROR:
+	    		Util.showErrorMessage("AnalyzeTool command line engine can not modify project modules.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Modify modules error.");
+	    		break;
+
+	    	 case INVALID_MMP_DEFINED:
+	    		 // I think this case is not possible in extension side.
+	    		 // because we ask mmp files from Carbide
+	    		 // however if this case happens we just log it Carbide error log
+	    	 	Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - Invalid mmp file.");
+	    		break;
+
+	    	case UNKNOWN_ERROR:
+	    		Util.showErrorMessage("Unable to execute action for current project.");
+	    		Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "AnalyzeTool - unknown error.");
+	    		break;
+
+    	}
+    }
+
+    /**
+     * Finds correct Enum value for integer value.
+     *
+     * @param value Value to find from enum values
+     * @return Enum value if found otherwise COMMAND_LINE_ERROR_CODE.UNKNOWN_ERROR
+     */
+    public static COMMAND_LINE_ERROR_CODE getErrorCode(final int value) {
+		 for( COMMAND_LINE_ERROR_CODE errorCode : COMMAND_LINE_ERROR_CODE.values() ) {
+			 if( errorCode.getCode() == value ) {
+				 return errorCode;
+			 }
+		 }
+		 return COMMAND_LINE_ERROR_CODE.UNKNOWN_ERROR;
+	 }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/engine/MemoryActivityModel.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,392 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class MemoryActivityModel
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.engine;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener;
+import com.nokia.s60tools.analyzetool.engine.statistic.BaseInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+
+/**
+ * AnalyseGraphModel
+ * this class fills a model suitable for AnalyseTool graph
+ * the model is initialised from the constructor.  
+ *
+ */
+public class MemoryActivityModel implements IMemoryActivityModel {
+	private final Collection<IMemoryActivityModelChangeListener> listeners; // listeners for changes to the model
+
+	/** list of processes */
+	private AbstractList<ProcessInfo> processList;
+	
+	/** time of the process that started first */
+	private Long firstProcessTime = 0L;
+	
+	/** time of the process that ended last */
+	private Long lastProcessTime = 0L;
+	
+	/** first memory operation in the model */
+	private BaseInfo firstMemOp = null;
+	
+	/** time of the first memory operation in the model */
+	private Long firstMemOpTime = 0L;
+	
+	/** last memory opeartion in the  model */
+	private BaseInfo lastMemOp =  null;
+	
+	/** time of the last memory operation in the model */
+	private Long lastMemOpTime = 0L;
+	
+	/** highest cummulative memory allocation in all processes */
+	private int highestCumMemSize = 0;
+
+	/** the currently selected process*/
+	private ProcessInfo selectedProcess;
+	
+	/** computed values for currently selected process*/
+	private ProcessInfoComputedValues selectedProcessComputedValues;
+	
+
+	/**
+	 * Constructor. 
+	 * 
+	 */
+	public MemoryActivityModel() {
+		this.listeners= new ArrayList<IMemoryActivityModelChangeListener>();
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#addProcesses(java.util.AbstractList)
+	 */
+	public void addProcesses(AbstractList<ProcessInfo> processes){
+		if (processes == null) {
+			this.processList = new ArrayList<ProcessInfo>();
+		} else {
+			this.processList = new ArrayList<ProcessInfo>(processes);
+		}
+		selectedProcess = null;
+		selectedProcessComputedValues = null;
+		firstProcessTime = 0L;
+		lastProcessTime = 0L;
+		firstMemOp = null;
+		firstMemOpTime = 0L;
+		lastMemOp =  null;
+		lastMemOpTime = 0L;
+		highestCumMemSize = 0;
+		// compute all needed values.
+		if (!processList.isEmpty()) {
+			computeValues();
+		}	
+		fireDataChanged();
+		
+	}
+	
+	/**
+	 * Notifies listeners that data has changed
+	 */
+	private void fireDataChanged() {
+		for (IMemoryActivityModelChangeListener listener : listeners) {
+			listener.onProcessesAdded();
+		}
+		
+	}
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#setSelectedProcess(com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo)
+	 */
+	public void setSelectedProcess(ProcessInfo processInfo) throws IllegalArgumentException {
+		if (this.processList == null || processInfo != null && !this.processList.contains(processInfo)) {
+			throw new IllegalArgumentException("Error selecting unknown process");
+		}
+		selectedProcess = processInfo;
+		selectedProcessComputedValues = null;
+		fireProcessSelected(processInfo);
+	}
+	
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getSelectedProcess()
+	 */
+	public ProcessInfo getSelectedProcess(){
+		return selectedProcess;
+	}
+	
+	/**
+	 * Notifies listeners that data has changed
+	 */
+	private void fireProcessSelected(ProcessInfo p) {
+		for (IMemoryActivityModelChangeListener listener : listeners) {
+			listener.onProcessSelected(p);
+		}
+		
+	}
+
+	/**
+	 * Compute the model
+	 */
+	private void computeValues() {
+		computeFirstProcessTime();
+		computeLastProcessTime();
+		computeFirstMemOpTime();
+		computeLastMemOpTime();
+		computeHighestCumulatedMemoryAlloc();
+	}
+
+	/**
+	 * find the start time of the process that started first
+	 */
+	private void computeFirstProcessTime() {
+		Long smallestTime = Long.MAX_VALUE;
+		firstProcessTime = 0L;//stays zero if there are no processes
+
+		for (ProcessInfo process : processList) {
+			if (process.getStartTime() < smallestTime) {
+				smallestTime = process.getStartTime();
+				firstProcessTime = smallestTime; 
+			}
+		}
+	}
+	
+	/**
+	 * find end time of the process that ended last
+	 */
+	private void computeLastProcessTime() {
+		Long biggestTime = Long.MIN_VALUE;
+		lastProcessTime = 0L; //stays zero if there are no processes
+		
+		for (ProcessInfo process : processList) {
+			Long tmpTime = process.getEndTime();
+			if (tmpTime > biggestTime) {
+				biggestTime = tmpTime;
+				lastProcessTime = tmpTime;
+			}
+		}
+	}
+
+	/**
+	 *  find first memory time from all processes
+	 */
+	private void computeFirstMemOpTime() {
+		findFirstMemOp();
+	}
+
+	/** find first memory operation in the model */
+	private void findFirstMemOp() {
+		Long smallestTime = Long.MAX_VALUE;
+		for (ProcessInfo process : processList) {
+			AbstractList<BaseInfo> allocsAndFrees = process.getAllocsFrees();
+			BaseInfo baseInfo = allocsAndFrees.get(0);
+			long time = baseInfo.getTime();
+			if (time < smallestTime ){
+				smallestTime = time;
+				firstMemOp = baseInfo;
+			}
+		}
+		if (firstMemOp != null) {
+			firstMemOpTime = smallestTime;
+		}
+	}
+	
+	/**
+	 * find last memory operation time from all processes
+	 */
+	void computeLastMemOpTime() {
+		findLastMemOp();
+	}
+
+	/** find last memory operation */
+	private void findLastMemOp() {
+		Long biggestTime = firstMemOpTime; //Long.MIN_VALUE;
+		for (ProcessInfo process : processList) {
+			AbstractList<BaseInfo> allocsAndFrees = process.getAllocsFrees();
+			BaseInfo baseInfo = allocsAndFrees.get(allocsAndFrees.size() -1);
+			long time = baseInfo.getTime();
+			if (time > biggestTime ){
+				biggestTime = time;
+				lastMemOp = baseInfo;
+			}
+		}
+		if (lastMemOp != null) {
+			lastMemOpTime = biggestTime;
+		}
+	}
+	
+	/** calculate the biggest memory size in all processes */
+	private void computeHighestCumulatedMemoryAlloc() {
+		for (ProcessInfo process : processList) {
+			if (process.getHighestCumulatedMemoryAlloc() > highestCumMemSize) {
+				highestCumMemSize = process.getHighestCumulatedMemoryAlloc();
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see IMemoryActivityModel#getProcesses()
+	 */
+	public AbstractList<ProcessInfo> getProcesses() {
+		return processList;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getFirstMemOpTime()
+	 */
+	public Long getFirstMemOpTime() {
+		return firstMemOpTime;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getFirstProcessTime()
+	 */
+	public Long getFirstProcessTime() {
+		if (selectedProcess != null){
+			if (selectedProcessComputedValues == null){
+				selectedProcessComputedValues = new ProcessInfoComputedValues(selectedProcess);
+			}
+			return selectedProcessComputedValues.getProcessStartTime();
+		}
+		return firstProcessTime;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getHighestCumulatedMemoryAlloc()
+	 */
+	public int getHighestCumulatedMemoryAlloc() {
+		if (selectedProcess != null){
+			if (selectedProcessComputedValues == null){
+				selectedProcessComputedValues = new ProcessInfoComputedValues(selectedProcess);
+			}
+			return selectedProcessComputedValues.getHighestCumulatedMemorySize();
+		}
+		return highestCumMemSize;
+	}
+
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getLastMemOpTime()
+	 */
+	public Long getLastMemOpTime() {
+		return lastMemOpTime;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#getLastProcessTime()
+	 */
+	public Long getLastProcessTime() {
+		if (selectedProcess != null){
+			if (selectedProcessComputedValues == null){
+				selectedProcessComputedValues = new ProcessInfoComputedValues(selectedProcess);
+			}
+			return selectedProcessComputedValues.getProcessEndTime();
+		}
+		return lastProcessTime;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#addListener(com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener)
+	 */
+	public void addListener(IMemoryActivityModelChangeListener listener) {
+		listeners.add(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel#removeListener(com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener)
+	 */
+	public void removeListener(IMemoryActivityModelChangeListener listener) {
+		listeners.remove(listener);
+	}
+	
+	/**
+	 * 
+	 * This class computes values for a given process
+	 *
+	 */
+	private class ProcessInfoComputedValues{
+		/** process life cycle start  */
+		private long processStartTime;
+		
+		/** process life cycle end */ 
+		private long processEndTime;
+		
+		/** highest value for cumulative memory allocation during the processes life time*/
+		private int highestCumulatedMemorySize;
+		
+		
+		/**
+		 * Constructor
+		 * @param p the ProcessInfo for this process
+		 */
+		public ProcessInfoComputedValues(ProcessInfo p) {
+			computeValues(p);
+		}
+
+		/**
+		 * Compute the values for the given process
+		 * @param p the ProcessInfo to use
+		 */
+		private void computeValues(ProcessInfo p){
+			//calculate highest cumulative memory value
+			highestCumulatedMemorySize = p.getHighestCumulatedMemoryAlloc();
+			
+			//work out process start time
+			Long startTime = p.getStartTime();
+			if (startTime == null && p.getAllocsFrees().size() > 0){
+				//take the time of the first memory activity
+				startTime = p.getAllocsFrees().get(0).getTime();
+			}
+			if (startTime != null){
+				processStartTime = startTime;
+			}
+			
+			//work out process end time
+			Long endTime = p.getEndTime();
+			if (endTime == null && p.getAllocsFrees().size() > 0){
+				//take the time of the last memory activity
+				endTime = p.getAllocsFrees().get(p.getAllocsFrees().size()-1).getTime();
+			}
+			if (endTime != null){
+				processEndTime = endTime;
+			}
+		}
+
+		/**
+		 * @return the process start time
+		 */
+		public long getProcessStartTime() {
+			return processStartTime;
+		}
+
+		/**
+		 * @return the process end time
+		 */
+		public long getProcessEndTime() {
+			return processEndTime;
+		}
+
+		/**
+		 * @return the highest cumulative memory size for the process
+		 */
+		public int getHighestCumulatedMemorySize() {
+			return highestCumulatedMemorySize;
+		}
+
+	}
+	
+	
+	// Other public methods can be added here.
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/AnalyzeToolGraph.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,1123 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AnalyzeToolGraph
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.ui.graph;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.KeyEvent;
+import org.eclipse.draw2d.KeyListener;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.draw2d.MouseMotionListener;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.draw2d.XYLayout;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.PropertySheet;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.BaseInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.FreeInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.SymReader;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.internal.ui.util.ColorUtil;
+import com.nokia.s60tools.analyzetool.internal.ui.util.GraphUtils;
+import com.nokia.s60tools.analyzetool.ui.MainView;
+import com.nokia.s60tools.analyzetool.ui.ResourceVisitor;
+
+/**
+ * A FigureCanvas containing the graph and X-axis area of the 
+ * AnalyzeTool chart.
+ */
+public class AnalyzeToolGraph extends FigureCanvas implements IMemoryActivityModelChangeListener {
+
+	private static final int BOUNDARY_OFFSET = 3;
+	/** used for range model listener */
+	private static final String PROP_MAXIMUM = "maximum"; //$NON-NLS-1$
+	private static final int X_AXIS_HEIGHT = 50;
+	/** used for "Don't ask again" dialog */
+	private static final String PROMPT_KEY = "GraphOptimisationPrompt";//$NON-NLS-1$
+	
+	/** the scaling factor used for scaling the x-axis*/
+	private double scale = 1.0;
+
+	/** the model */
+	private IMemoryActivityModel model;
+
+	/** for synchronisation with the PropertySheet */
+	private DotSelectionProvider iDotsSelecProv = new DotSelectionProvider();
+	private IWorkbenchPartSite site;
+	
+	/** used when user selects a dot on the graph, and moves with arrow keys */
+	private ISelection iCurrentSelectedDot = null;
+	
+	/** controls mouse and arrow key movements */
+	private MouseAndKeyController mc;
+	private SymReader iSymReader = null;
+	private IProject iCurrentProject = null;
+	/** Contains c++ files info for the current project. */
+	private final AbstractList<String> cppFileNames;
+	
+	/** "time ->" on axis*/
+	private Image timeImage;
+	private GraphPartServiceListener iGraphPartServiceListener;
+	private boolean optimisedDrawing;
+	private boolean userInformed;
+
+
+	/**
+	 * Constructor
+	 * @param parent The parent composite
+	 */
+	public AnalyzeToolGraph(Composite parent) {
+		super(parent);
+		IPartService partService = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getPartService();
+		iGraphPartServiceListener = new GraphPartServiceListener();
+		partService.addPartListener(iGraphPartServiceListener);
+		PlatformUI.getWorkbench().addWindowListener(iGraphPartServiceListener);
+		cppFileNames = new ArrayList<String>();
+	}
+
+	/**
+	 * Draws the graph on the canvas. Intended to be called on a paint event. 
+	 * @param graphics
+	 */
+	public void paint(final Graphics graphics) {
+		if (optimisedDrawing && !userInformed){
+			userInformed = true;
+			IPreferenceStore preferenceStore = Activator.getPreferences();
+            if (!preferenceStore.getString(PROMPT_KEY).equals(MessageDialogWithToggle.ALWAYS)) {
+                String dilaogTitle = "Optimised Graph";
+                String message = "The process contains too many memory operations to display efficiently. To optimise, only leaks will be indicated on the graph.";
+                String toggleMessage = "Don't show this again";
+
+                MessageDialogWithToggle.openInformation(getShell(), dilaogTitle, message, toggleMessage, false, preferenceStore, PROMPT_KEY);
+            }
+		}
+		Rectangle visibleRect = graphics.getClip(new org.eclipse.draw2d.geometry.Rectangle());
+		YConverter yConverter = new YConverter(getClientArea().height, model.getHighestCumulatedMemoryAlloc());
+
+		if (model.getSelectedProcess() != null && model.getSelectedProcess().getAllocsFrees().size() > 0){
+			PointList pts = new PointList((model.getSelectedProcess().getAllocsFrees().size()*2)-1);
+			Point prevPt = null;
+			List<Point> dotLocations = new ArrayList<Point>();
+			List<Integer> colorDotLocations = new ArrayList<Integer>();
+
+			for (BaseInfo info : model.getSelectedProcess().getAllocsFrees()) {
+				int x_point = (int) ((info.getTime() - model.getFirstProcessTime()) / getScale());
+				int y_point = yConverter.bytesToY(info.getTotalMem());
+
+				if (y_point < 0) {
+					y_point = 0;
+				}
+				if (prevPt != null) {
+					pts.addPoint(x_point, prevPt.y);
+				}
+				Point nextPt = new Point(x_point, y_point);
+				if (visibleRect.contains(nextPt) && (isLeak(info) || (!optimisedDrawing && !dotLocations.contains(nextPt)))){
+					//for improved performance, only draw dots that are in visible clip area
+					//and don't draw a dot if there is one already, unless it's a leak
+					dotLocations.add(nextPt);
+					colorDotLocations.add(getColorForAllocType(info));
+				}
+				pts.addPoint(nextPt);
+				prevPt = nextPt;
+			}
+
+			if (pts.size() > 0){
+				graphics.pushState();
+				
+				graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_DARK_YELLOW));
+				graphics.setLineWidthFloat(optimisedDrawing ? 0.5f : 2.0f);
+				graphics.drawPolyline(pts);
+				
+				graphics.setLineWidthFloat(optimisedDrawing ? 0.5f : 1.0f);
+				graphics.setAntialias(SWT.ON);
+				graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+				graphics.setBackgroundColor(Display.getDefault().getSystemColor(SWT.COLOR_RED));
+				int colourCode = SWT.COLOR_RED;
+				for (int j = 0; j < dotLocations.size(); j++) {
+					Point dotLocation = dotLocations.get(j);
+					if (!optimisedDrawing && colorDotLocations.get(j) != colourCode) {
+						colourCode = colorDotLocations.get(j);
+						graphics.setBackgroundColor(Display.getDefault().getSystemColor(colourCode));
+					}
+					// paint the dot
+					graphics.fillOval(dotLocation.x - 2, dotLocation.y - 2,	5, 5);
+					if (!optimisedDrawing && colourCode == SWT.COLOR_RED) {
+						// draw a red line
+						graphics.drawLine(dotLocation.x, dotLocation.y,	dotLocation.x, yConverter.bytesToY(0));
+					}
+				}
+				graphics.popState();
+			}
+		}
+	}
+	
+	
+
+	/**
+	 * Draws the background grid on the canvas. Intended to be called on a paint event.
+	 * @param graphics
+	 */
+	public void drawBackGroundLines(Graphics graphics) {
+		Rectangle canvasRect = graphics.getClip(new org.eclipse.draw2d.geometry.Rectangle());
+		graphics.setForegroundColor(ColorUtil.COLOR_100); // middle grey
+		graphics.setBackgroundColor(ColorUtil.COLOR_170); // lighter grey
+
+		int height = getClientArea().height;
+		int width = getClientArea().width;
+
+		graphics.fillRectangle(new Rectangle(canvasRect.x, 0, width, height - X_AXIS_HEIGHT));
+
+		double visY = height - X_AXIS_HEIGHT;
+
+		int k = 0;
+		// horizontal lines, height is divided into 10 sections, line is dotted
+		// (5 pixel length)
+		for (float y = 0; k <= 10; y += visY * 10000 / 100001, k++) {
+			for (int x = canvasRect.x; x <= canvasRect.x + canvasRect.width; x += 5) {
+				if ((x / 5) % 2 == 0)
+					graphics.drawLine(x, ((int) y) + 1, x + 5, ((int) y) + 1);
+			}
+		}
+
+		graphics.setForegroundColor(ColorUtil.COLOR_100);
+		graphics.setBackgroundColor(ColorUtil.WHITE);
+		
+		int alignedLeftEdge = ((int)(canvasRect.x / 50))*50;
+
+		// vertical lines (one darker, one lighter vertical line in turns every
+		// 50 points in width)
+		if (width > 0) {
+			for (int x = alignedLeftEdge ; x <= canvasRect.x + canvasRect.width; x += 50) {
+				if (x % 100 == 0)
+					graphics.setForegroundColor(ColorUtil.COLOR_100);
+				else
+					graphics.setForegroundColor(ColorUtil.COLOR_200);
+
+				for (int y = 0; y < height; y += 5) {
+					if ((y / 5) % 2 == 0)
+						graphics.drawLine(x, y, x, y + 5);
+				}
+			}
+		}
+
+		graphics.setForegroundColor(ColorUtil.COLOR_100);
+		graphics.setBackgroundColor(ColorUtil.WHITE);
+
+		for (int x = alignedLeftEdge; x <= canvasRect.x + canvasRect.width; x += 50) {
+			String timeStringWithUnits = GraphUtils.getTimeStringWithUnits(x * scale);
+			graphics.drawString(timeStringWithUnits, x + 5, height - 13);
+		}
+		if (timeImage == null){
+			timeImage = GraphUtils.getVerticalLabel("Time");			
+		}
+		graphics.drawImage(timeImage, width / 2, height - 30);
+	}
+
+	/**
+	 * Returns the content of the tooltip appropriate for the given coordinate
+	 * @param x the X-coordinate
+	 * @param y the Y-coordinate
+	 * @return String containing the content of the tooltip
+	 */
+	public String getToolTipText(int x, int y) {
+		StringBuilder text = new StringBuilder();
+		if (model.getSelectedProcess() == null) {
+			return "";
+		}
+
+		if (y > getClientArea().height - X_AXIS_HEIGHT) {
+			return null;
+		}
+
+		double timeInMs = (x * getScale());// x value in milliseconds
+
+		YConverter yConverter = new YConverter(getClientArea().height, model.getHighestCumulatedMemoryAlloc());
+		double bytes = yConverter.yToBytes(y); // y value in bytes
+
+		text.append(GraphUtils.renderTime(timeInMs)); 
+
+		BaseInfo allocInfo = findClosestAlloc((int) timeInMs, (int) ((x - BOUNDARY_OFFSET) * getScale()), (int) ((x + BOUNDARY_OFFSET) * getScale()),
+				(int) bytes, (int) yConverter.yToBytes(y + BOUNDARY_OFFSET), (int) yConverter.yToBytes(y - BOUNDARY_OFFSET));
+		if (allocInfo != null) {
+			text.append(String.format("%n%s: %,d B%nTotal: %,d B",
+					getMemOpString(allocInfo), 
+					Math.abs(allocInfo.getSizeInt()), 
+					allocInfo.getTotalMem()));
+		} else {
+			text.append(", " + GraphUtils.formatBytes(bytes));
+		}
+
+		return text.toString();
+	}
+	
+	/**
+	 * Returns a string representation of the type of the given memory operation
+	 * @param allocInfo the memory operation to use
+	 * @return 
+	 */
+	private String getMemOpString(BaseInfo allocInfo){
+		return allocInfo instanceof AllocInfo ? (((AllocInfo) allocInfo).isFreed() ? "Alloc" : "Leak"  ): "Free";
+	}
+
+	/**
+	 * Convenience method for
+	 * {@link #findClosestAlloc(int, int, int, int, int, int)} wrapping
+	 * conversion from x,y coordinates to time and byte values.
+	 * 
+	 * @param x
+	 *            X-coordinate
+	 * @param y
+	 *            Y-coordinate
+	 * @return closest BaseInfo within bounds, or null if none found
+	 */
+	private BaseInfo findClosest(int x, int y) {
+		if (y > getClientArea().height - X_AXIS_HEIGHT) {
+			return null;
+		}
+
+		YConverter yConverter = new YConverter(getClientArea().height, model.getHighestCumulatedMemoryAlloc());
+		return findClosestAlloc((int) (x * getScale()), (int) ((x - BOUNDARY_OFFSET) * getScale()), (int) ((x + BOUNDARY_OFFSET) * getScale()),
+				(int) (yConverter.yToBytes(y)), (int) yConverter.yToBytes(y + BOUNDARY_OFFSET), (int) yConverter.yToBytes(y - BOUNDARY_OFFSET));
+	}
+
+	/**
+	 * Finds the closest matching BaseInfo in the model. BaseInfo has to fit
+	 * into the given bounds and be a better match than other BaseInfo in the
+	 * same bounds.
+	 * 
+	 * @param timeInMsMidPoint
+	 *            time in milliseconds for the exact point of interest
+	 * @param timeInMsBoundLeft
+	 *            Left boundary for time in milliseconds
+	 * @param timeInMsBoundRight
+	 *            Right boundary for time in milliseconds
+	 * @param bytesMidPoint
+	 *            Cumulative memory in bytes for the exact point of interest
+	 * @param bytesBoundLeft
+	 *            Left boundary for cumulative memory in bytes
+	 * @param bytesBoundRight
+	 *            Right boundary for cumulative memory in bytes
+	 * @return
+	 */
+	private BaseInfo findClosestAlloc(int timeInMsMidPoint, int timeInMsBoundLeft, int timeInMsBoundRight, int bytesMidPoint, int bytesBoundLeft,
+			int bytesBoundRight) {
+		BaseInfo ret = null;
+		if (model.getSelectedProcess() == null){
+			return ret;
+		}
+		
+		int marginEnd = timeInMsBoundRight;
+		ProcessInfo process = model.getSelectedProcess();
+		AbstractList<BaseInfo> allocsFrees = process.getAllocsFrees();
+		Long firstTime = model.getFirstProcessTime();
+
+		for (BaseInfo info : allocsFrees) {
+			Long infoRelativeTime = info.getTime() - firstTime;
+			// check current alloc info is within given bounds
+			if (infoRelativeTime >= timeInMsBoundLeft && infoRelativeTime <= marginEnd && info.getTotalMem() >= bytesBoundLeft
+					&& info.getTotalMem() <= bytesBoundRight) {
+				// check whether current alloc info is a better match than
+				// previously found
+				if (ret == null
+						|| (Math.abs(infoRelativeTime - timeInMsMidPoint) < Math.abs((ret.getTime() - firstTime) - timeInMsMidPoint))
+						|| ((ret.getTime() - firstTime) == infoRelativeTime && Math.abs(info.getTotalMem() - bytesMidPoint) < Math.abs(ret
+								.getTotalMem()
+								- bytesMidPoint))) {
+					ret = info;
+				}
+			} else if ((info.getTime() - firstTime) > timeInMsBoundRight) {
+				break;
+			}
+		}
+		return ret;
+	}
+
+	/**
+	 * Finds the next AllocInfo in the model.
+	 * 
+	 * @param allocInfo
+	 *            AllocInfo prior to the one to return
+	 * @return The next AllocInfo in the model. This may return null if the
+	 *         passed object was the last in the model.
+	 */
+	private BaseInfo findNextAlloc(BaseInfo allocInfo, boolean forward) {
+		BaseInfo ret = null;
+		ProcessInfo processInfo = model.getSelectedProcess();
+		if (processInfo == null){
+			return ret;
+		}
+		
+		AbstractList<BaseInfo> allocsFrees = processInfo.getAllocsFrees(); 
+		int i = allocsFrees.indexOf(allocInfo);
+		if (forward) {
+			if (i < allocsFrees.size() - 1) {
+				ret = allocsFrees.get(i + 1);
+			}
+		} else {
+			if (i > 0) {
+				ret = allocsFrees.get(i - 1);
+			}
+		}
+		return ret;
+	}
+
+	/**
+	 * This method first zooms in graph to the maximum possible scale and zooms
+	 * out so that it fits in the canvas area.
+	 * 
+	 */
+	public void zoomGraph() {
+		int width = getClientArea().width;
+
+		if (width <= 0 || model == null)
+			return;
+		double new_scale = getMaxTimeValueInMilliSeconds() / width;
+		setScale(new_scale);
+		setZoomedSize(0);
+	}
+
+	/**
+	 * Returns the current scaling factor for the graph's width
+	 * @return
+	 */
+	public double getScale() {
+		return scale;
+	}
+
+	/**
+	 * Sets the scaling factor for the graph's width
+	 * @param scale
+	 */
+	public void setScale(double newScale) {
+		this.scale = newScale;
+	}
+
+	/**
+	 * Returns the highest time value of the current graph in milliseconds
+	 * @return
+	 */
+	public long getLastTimeValueInMilliSeconds() {
+		return model.getLastProcessTime() - model.getFirstProcessTime();
+	}
+
+	/**
+	 * Returns the last time value in the model plus 1 per cent.
+	 * 
+	 * @return
+	 */
+	private long getMaxTimeValueInMilliSeconds() {
+		return getLastTimeValueInMilliSeconds() + (int) (getLastTimeValueInMilliSeconds() * 0.01);
+	}
+
+	/**
+	 * Adds a new model to this class 
+	 * @param model the IMemoryActivityModel to use
+	 */
+	public void setInput(IMemoryActivityModel newModel) {
+		if (this.model != null){
+			this.model.removeListener(this);
+		}
+		this.model = newModel;
+		this.model.addListener(this);
+	}
+
+	/**
+	 * Creates the content of the FigureCanvas. Intended to be called
+	 * once in creating the ViewPart content. 
+	 */
+	public void createContent() {
+		mc = new MouseAndKeyController();
+		Panel panel = new Panel() {
+			@Override
+			public void paint(Graphics graphics) {
+				if (model != null) {
+					drawBackGroundLines(graphics);
+					AnalyzeToolGraph.this.paint(graphics);
+					mc.render(graphics);
+				} else {
+					erase();
+				}
+			}
+		};
+
+		panel.setLayoutManager(new XYLayout());
+		panel.addMouseMotionListener(mc);
+		panel.addMouseListener(mc);
+		panel.addKeyListener(mc);
+
+		setContents(panel);
+		panel.setFocusTraversable(true);
+		final org.eclipse.swt.widgets.ScrollBar horizontalBar = getHorizontalBar();
+
+		horizontalBar.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+
+			}
+
+			public void widgetSelected(SelectionEvent event) {
+				AnalyzeToolGraph.this.redraw();
+			}
+
+		});
+
+		addControlListener(new ControlAdapter() {
+			@Override
+			public void controlResized(ControlEvent e) {
+				horizontalBar.setPageIncrement(getBounds().width);
+				redraw();
+			}
+		});
+		
+	}
+
+	/**
+	 * Class containing code to deal with mouse and key events
+	 *
+	 */
+	private class MouseAndKeyController implements MouseMotionListener, MouseListener, KeyListener {
+
+		protected int mouseButton;
+		protected Point start;
+		protected boolean beingDragged;
+		private BaseInfo lastShownAlloc;
+		protected Point lastMouse;
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseMotionListener#mouseDragged(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseDragged(MouseEvent me) {
+			if (mouseButton == 1) {// for some reason me.button doesn't work
+				// here and always returns 0 so we need to
+				// track it from mouse pressed
+				beingDragged = true;
+				lastMouse = me.getLocation();
+			} else {
+				beingDragged = false;
+			}
+		}
+
+		public void render(Graphics graphics) {
+			graphics.pushState();
+			if (beingDragged){
+				graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
+				graphics.setLineWidth(1);
+				
+				int dragEnd = lastMouse.x;
+				int dragLeftX = start.x <= dragEnd ? start.x : dragEnd;// drag area left edge
+				int dragRightX = start.x <= dragEnd ? dragEnd : start.x;// drag area right edge
+				graphics.drawRectangle(new Rectangle(dragLeftX, 0, (dragRightX-dragLeftX), getClientArea().height));
+			}
+			
+			if (lastShownAlloc != null){
+				
+				//for the selected dot, try to mark related allocs and free
+				FreeInfo freeInfo = null;
+				if (lastShownAlloc instanceof FreeInfo){
+					freeInfo = (FreeInfo)lastShownAlloc;
+				} else{
+					freeInfo = ((AllocInfo)lastShownAlloc).getFreedBy();
+				}
+				if (freeInfo != null){
+					YConverter yConverter = new YConverter(getClientArea().height, model.getHighestCumulatedMemoryAlloc());
+					Rectangle visibleRect = graphics.getClip(new org.eclipse.draw2d.geometry.Rectangle());
+					Point pfree = getLocationOnGraph(yConverter, freeInfo);
+					if (lastShownAlloc != freeInfo && visibleRect.contains(pfree)){
+						graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN));
+						graphics.drawLine(pfree.x+1, pfree.y+3, pfree.x+1, yConverter.bytesToY(0));
+						if (optimisedDrawing){ //draw circle as well since we don't have dots
+							graphics.drawOval(pfree.x - 2, pfree.y - 2, 5, 5);							
+						}
+					}
+					for (AllocInfo freedAlloc : freeInfo.getFreedAllocs()) {
+						Point pAlloc = getLocationOnGraph(yConverter, freedAlloc);
+						if (lastShownAlloc != freedAlloc && visibleRect.contains(pAlloc)){
+							graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE));
+							graphics.drawLine(pAlloc.x+1, pAlloc.y+3, pAlloc.x+1, yConverter.bytesToY(0));
+							if (optimisedDrawing){ //draw circle as well since we don't have dots
+								graphics.drawOval(pAlloc.x - 2, pAlloc.y - 2, 5, 5);							
+							}
+						}
+						
+					}
+				}
+				//this should be the alloc that has its details displayed
+				//mark it in the graph
+				//draw a small circle around the alloc / dealloc, and a vertical line towards the X-axis
+				Point p = getLocationOnGraph(lastShownAlloc);
+				graphics.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_CYAN));
+				graphics.setLineWidth(1);
+				graphics.drawOval(p.x - 2, p.y - 2, 5, 5);
+				if (optimisedDrawing || !isLeak(lastShownAlloc)){
+					graphics.drawLine(p.x+1, p.y+3, p.x+1, getClientArea().height - X_AXIS_HEIGHT);					
+				}
+			}
+			graphics.popState();
+		}
+
+		private Point getLocationOnGraph(BaseInfo alloc) {
+			YConverter yConverter = new YConverter(getClientArea().height, model.getHighestCumulatedMemoryAlloc());
+			return getLocationOnGraph(yConverter, alloc);
+		}
+		private Point getLocationOnGraph(YConverter yConverter, BaseInfo alloc) {
+			int x = (int) ((alloc.getTime() - model.getFirstProcessTime()) / getScale());
+			int y = yConverter.bytesToY(alloc.getTotalMem());
+
+			if (y < 0) {
+				y = 0;
+			}
+			return new Point(x, y);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseMotionListener#mouseEntered(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseEntered(MouseEvent e) {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseMotionListener#mouseExited(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseExited(MouseEvent e) {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseMotionListener#mouseHover(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseHover(MouseEvent e) {
+			if (model != null) {
+				setToolTipText(getToolTipText(e.x, e.y));
+				redraw();
+			}
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseMotionListener#mouseMoved(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseMoved(MouseEvent e) {
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseListener#mouseDoubleClicked(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseDoubleClicked(MouseEvent e) {
+			beingDragged = false;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseListener#mousePressed(org.eclipse.draw2d.
+		 * MouseEvent)
+		 */
+		public void mousePressed(MouseEvent e) {
+			beingDragged = false;
+			start = e.getLocation();
+			mouseButton = e.button;
+			e.consume(); // don't pass on to other listeners
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see
+		 * org.eclipse.draw2d.MouseListener#mouseReleased(org.eclipse.draw2d
+		 * .MouseEvent)
+		 */
+		public void mouseReleased(MouseEvent me) {
+
+			if (beingDragged) {
+				beingDragged = false;
+				// finished drag - perform zoom in now
+
+				// set new scale
+				int dragEnd = me.getLocation().x;
+				int dragLeftX = start.x <= dragEnd ? start.x : dragEnd;// drag area left edge
+				int dragRightX = start.x <= dragEnd ? dragEnd : start.x;// drag area right edge
+				int dragWindowStartTime = (int) (dragLeftX * getScale());
+
+
+				int dragWidth = dragRightX - dragLeftX;// drag area width
+				int oldVisibleWidth = getViewport().getSize().width;// visible window width
+				double newScale = getScale() * dragWidth / oldVisibleWidth;
+				if (newScale < 1.0) {
+					// don't allow a scale smaller than 1 millisecond per pixel
+					// TODO: indicate a failed zoom
+					return;
+				}
+
+				int dragLeftXScaled = (int) (dragWindowStartTime / newScale);
+
+				// set new window location
+				setScale(newScale);
+				setZoomedSize(dragLeftXScaled);
+
+				//make sure the drag window disappears
+				AnalyzeToolGraph.this.redraw();				
+			} else if (me.button == 3) {
+				// mouse right click - zoom out
+
+				double maxScale = getMaxTimeValueInMilliSeconds() / getClientArea().width;
+				if (getScale() < maxScale) {
+					double newScale = GraphUtils.nextScale(getScale(), true);
+					if (getScale() != newScale) {
+						if (newScale > maxScale) {
+							newScale = maxScale;
+						}
+
+						// get left window edge is ms to be set to after zooming
+						double leftEdgeInMs = getViewport().getViewLocation().x * getScale();
+						setScale(newScale);
+						setZoomedSize((int) (leftEdgeInMs / newScale));
+					}
+				}
+			} else if (me.button == 1) {
+				BaseInfo info = findClosest(me.x, me.y);
+				if (info != null) {
+					iDotsSelecProv.setSelection(new StructuredSelection(new MemOpDescriptor(model.getFirstProcessTime(), info, iCurrentProject, iSymReader, cppFileNames)));
+					lastShownAlloc = info;
+				}
+				}
+
+			}
+
+
+		public void keyPressed(KeyEvent ke) {
+		}
+
+		public void keyReleased(KeyEvent ke) {
+			if (ke.keycode == SWT.ARROW_RIGHT || ke.keycode == SWT.ARROW_LEFT) {
+				if (lastShownAlloc != null) {
+					BaseInfo info = findNextAlloc(lastShownAlloc, ke.keycode == SWT.ARROW_RIGHT);
+					if (info != null) {
+						iDotsSelecProv.setSelection(new StructuredSelection(new MemOpDescriptor(model.getFirstProcessTime(), info, iCurrentProject, iSymReader, cppFileNames)));
+						lastShownAlloc = info;
+						
+						//if info is hidden from the visible graph area, scroll to reveal
+						int x = getLocationOnGraph(info).x;
+						int leftEdge = getViewport().getHorizontalRangeModel().getValue();
+						int width = getViewport().getHorizontalRangeModel().getExtent();
+						if (x < leftEdge){
+							if (x > 10){
+								x -=10;
+							}
+							getViewport().getHorizontalRangeModel().setValue(x);
+						} else if (x > (leftEdge + width)){
+							x -= (width - 10);
+							getViewport().getHorizontalRangeModel().setValue(x);							
+						}
+						AnalyzeToolGraph.this.redraw();
+					}
+				}
+			}
+
+		}
+
+		/**
+		 * resets any state
+		 */
+		public void clearState() {
+			mouseButton = 0;
+			start = null;
+			beingDragged = false;
+			lastShownAlloc = null;
+			lastMouse = null;
+			if (iDotsSelecProv != null){
+				iDotsSelecProv.setSelection(StructuredSelection.EMPTY);				
+			}
+		}
+		
+	}
+	
+	/**
+	 * Returns an SWT system color code depending on the type of the paramter passed.
+	 * </br> SWT.COLOR_DARK_BLUE for a alloc (that is not a leak)
+	 * </br> SWT.COLOR_RED for a leak
+	 * </br> SWT.COLOR_DARK_GREEN for a free
+	 * @param info the allocation to evaluate
+	 * @return the appropriate SWT system color code
+	 */
+	private int getColorForAllocType(BaseInfo info){
+		int color;
+		if (info instanceof AllocInfo) {
+			if (((AllocInfo) info).isFreed()) {
+				color = SWT.COLOR_DARK_BLUE;
+			} else {
+				color = SWT.COLOR_RED;
+			}
+		} else {
+			color = SWT.COLOR_DARK_GREEN;
+		}
+		return color;
+	}
+	
+	/**
+	 * Returns true if the passed info is a leak, false otherwise.
+	 * AllocInfo that haven't been freed are considered leaks.
+	 * 
+	 * @param info the BaseInfo to test
+	 * @return true if leak, false otherwise
+	 */
+	private static boolean isLeak(BaseInfo info){
+		return info instanceof AllocInfo && !(((AllocInfo) info).isFreed()) ? true : false;
+	}
+
+	/**
+	 * 
+	 * Converts bytes from/to Y values
+	 * 
+	 */
+	class YConverter {
+		private final double visY;
+		private final double multiplier;
+
+		public YConverter(int clientAreaHeight, int maxAllocValueInBytes) {
+			visY = clientAreaHeight - X_AXIS_HEIGHT;
+			multiplier = GraphUtils.prettyMaxBytes(maxAllocValueInBytes) / visY;
+		}
+
+		public int bytesToY(int bytes) {
+			return (int) (visY - (bytes / multiplier));
+		}
+
+		public double yToBytes(int y) {
+			return (visY - y) * multiplier;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessesAdded()
+	 */
+	public void onProcessesAdded() {
+		//the model is now ready to use - call a redraw on the graph
+		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				mc.clearState();
+				zoomGraph();
+				redraw();
+			}
+		});
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessSelected(com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo)
+	 */
+	public void onProcessSelected(ProcessInfo p) {
+		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				mc.clearState();
+				optimisedDrawing = model.getSelectedProcess().getAllocsFrees().size() > 25000 ? true : false;
+				userInformed = false;
+				zoomGraph();
+				redraw();
+			}
+		});
+	}
+	
+	@Override
+	public void dispose() {
+		//there is no dispose() entry point in this class; we may have to call this via MainView.dispose()
+		site.setSelectionProvider(null);
+		iDotsSelecProv = null;
+		if (timeImage != null){
+			timeImage.dispose();
+		}
+		IPartService partService = PlatformUI.getWorkbench()
+		.getActiveWorkbenchWindow().getPartService();
+		partService.removePartListener(iGraphPartServiceListener);
+		iGraphPartServiceListener = null;
+		if (iSymReader != null) {
+			iSymReader.dispose();
+			iSymReader = null;
+		}
+	}
+	
+	private void setZoomedSize(final int newXLocation) {
+		int prefSize = (int) (getMaxTimeValueInMilliSeconds() / getScale());
+
+		// new width has to propagate to viewport first before we can set
+		// the new viewport selection
+		// set newXLocation in listener
+		Panel panel = (Panel) (getContents());
+		panel.setPreferredSize(prefSize, 0);
+
+		if (prefSize > getClientArea().width) {
+			getViewport().getHorizontalRangeModel().addPropertyChangeListener(new PropertyChangeListener() {
+				public void propertyChange(PropertyChangeEvent e) {
+					if (e.getPropertyName().equals(PROP_MAXIMUM)) {
+						getViewport().getHorizontalRangeModel().removePropertyChangeListener(this);
+						getViewport().getHorizontalRangeModel().setValue(newXLocation);
+					}
+				}
+
+			});
+			panel.setSize(prefSize, 0);
+
+		} else {
+			// this only works if the canvas is large enough, otherwise use property listener
+			getViewport().getHorizontalRangeModel().setValue(newXLocation); 
+		}
+	}
+	
+	/**
+	 * DotSelectionProvider :  when a user selects a Dot on the graph, this class delivers the associated
+	 * descriptor MemOpDescriptor to the views interested in it mainly the Properties View. 
+	 *
+	 */
+	private class DotSelectionProvider implements ISelectionProvider, SelectionListener {
+		private ListenerList iSelectionChangedListeners = new ListenerList();
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+		 */
+		public void addSelectionChangedListener(ISelectionChangedListener listener) {
+			//TODO is there a way to allow only properties view to register.
+			iSelectionChangedListeners.add(listener);
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+		 */
+		public ISelection getSelection() {
+			return iCurrentSelectedDot;
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+		 */
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+			iSelectionChangedListeners.remove(listener);
+
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+		 */
+		public void setSelection(ISelection selection) {
+			iCurrentSelectedDot = selection;
+			//notify the listeners mainly the property view
+			for (final Object listenerObj : iSelectionChangedListeners
+					.getListeners())
+			{
+				((ISelectionChangedListener) listenerObj)
+					.selectionChanged(new SelectionChangedEvent(this, getSelection()));
+			}
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetDefaultSelected(SelectionEvent event) {
+			widgetSelected(event);
+			
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetSelected(SelectionEvent arg0) {
+			for (final Object listenerObj : iSelectionChangedListeners
+					.getListeners())
+			{
+				((ISelectionChangedListener) listenerObj)
+					.selectionChanged(new SelectionChangedEvent(this, getSelection()));
+			}
+			
+		}
+
+	}
+	
+	
+	/**
+	 * GraphPartServiceListener is for convenience only. It serves to find an appropriate time to
+	 * add DotSelectionProvider to the part site. It also covers that case where the properties View is already
+	 * open before opening AnalyzeTool View.
+	 *
+	 */
+	private class GraphPartServiceListener implements IPartListener, IWindowListener {
+
+		public void partActivated(IWorkbenchPart part) {
+			if (part instanceof MainView || part instanceof PropertySheet) {
+				
+				site = part.getSite();
+				//set property sheet selection provider.
+				site.setSelectionProvider(iDotsSelecProv);
+				if (part instanceof MainView && iSymReader != null) {
+					iSymReader.reOpenCachedSymbolFiles();
+				}
+			}
+		}
+
+		public void partBroughtToTop(IWorkbenchPart part) {
+			//do nothing
+		}
+
+		public void partClosed(IWorkbenchPart part) {
+			//TODO this is not working. why?
+			if (part instanceof MainView || part instanceof PropertySheet) {			
+				site = part.getSite();
+				iDotsSelecProv.setSelection(StructuredSelection.EMPTY);	
+				//set property sheet selection provider.
+				site.setSelectionProvider(null);
+			}
+		}
+
+		public void partDeactivated(IWorkbenchPart part) {
+			//the user might want to rebuild the project, so close the sumbol files
+			if (part instanceof MainView && iSymReader != null) {
+				iSymReader.closeCachedSymbolFiles();
+			}
+		}
+
+		public void partOpened(IWorkbenchPart part) {
+			if (part instanceof MainView) {
+				try {
+					part.getSite().getPage().showView("org.eclipse.ui.views.PropertySheet");//$NON-NLS-1$
+				} catch (PartInitException e) {
+					//just log the exception
+					Activator.getDefault().log(IStatus.ERROR, e.getMessage(), e);
+				}
+			}
+		}
+
+		public void windowActivated(IWorkbenchWindow window) {
+			if (iSymReader != null && window.getActivePage().getActivePart() instanceof MainView) {
+				iSymReader.reOpenCachedSymbolFiles();
+			}			
+		}
+
+		public void windowClosed(IWorkbenchWindow window) {
+			//do nothing
+			
+		}
+
+		public void windowDeactivated(IWorkbenchWindow window) {
+			// the user might do a re-build from the command line
+			if (iSymReader != null) {
+				iSymReader.closeCachedSymbolFiles();
+			}		
+		}
+
+		public void windowOpened(IWorkbenchWindow window) {
+			//do nothing	
+		}
+	}
+	
+	/**
+	 * set a new project
+	 * @param aProject
+	 */
+	public void setProject(IProject aProject) {
+		if(iCurrentProject != aProject) {
+			iCurrentProject = aProject;
+			iSymReader = new SymReader(aProject);
+			iSymReader.loadProjectTargetsInfo();
+			ResourceVisitor visitor = new ResourceVisitor(this);
+			try {
+				iCurrentProject.accept(visitor);
+			} catch (CoreException ce) {
+				//just log the exception
+				Activator.getDefault().log(IStatus.ERROR, ce.getMessage(), ce);
+			}
+		}
+	}
+	
+	/**
+	 * Load all cpp files from the project
+	 * This is callback to ResourcceVisitor.
+	 *
+	 * @param resource
+	 */
+	public final void loadFileInfo(IResource resource) {
+		// get all the cpp file info which are belongs to current project
+		String cppFileName = Util.getCPPFileNameAndPath(resource);
+
+		// if cpp file found, save it
+		if (cppFileName != null && !cppFileNames.contains(cppFileName)) {
+			this.cppFileNames.add(cppFileName);
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/ChartContainer.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,277 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ChartContainer
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.internal.ui.graph;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.AnalyzeToolHelpContextIDs;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+
+/**
+ *  Container for the complete AnalyzeTool chart (x and y axis as well as graph)
+ *
+ */
+public class ChartContainer extends Composite implements IMemoryActivityModelChangeListener{
+	
+	private static final String ICON_PROPVIEW = "icons/properties.gif";//$NON-NLS-1$
+	private static final String ICON_HELP = "icons/linkto_help.gif";//$NON-NLS-1$
+	
+	private AnalyzeToolGraph graphCanvas;
+	private YAxis yAxis;
+	private Combo processCombo;
+	private IMemoryActivityModel model;
+	private UIJob iRefreshUIJob;
+	
+	/**
+	 * Constructor
+	 * 
+	 * @param parent
+	 *            a widget which will be the parent of the new instance (cannot
+	 *            be null)
+	 * @param style
+	 *            the style of widget to construct
+	 */
+	public ChartContainer(Composite parent, int style) {
+		super(parent, SWT.NONE);
+		setBackground(parent.getBackground());
+		constructChartArea();
+	}
+	
+	/**
+	 * Builds up the main composite when opening for the first time
+	 */
+	private void constructChartArea(){
+		setLayout(new FormLayout());
+			
+		Label processLabel = new Label(this, SWT.CENTER);
+		processLabel.setText("Process:");
+		processCombo = new Combo(this, SWT.READ_ONLY | SWT.DROP_DOWN);
+
+		
+		ToolBar toolBar = new ToolBar (this, SWT.RIGHT | SWT.FLAT);
+		
+		//toolbar button to open the Eclipse Properties view
+		ToolItem propViewItem = new ToolItem (toolBar, SWT.PUSH | SWT.FLAT );
+		propViewItem.addSelectionListener(new SelectionListener(){
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+                try {
+                    PlatformUI.getWorkbench()
+                    .getActiveWorkbenchWindow().getActivePage()
+                    .showView("org.eclipse.ui.views.PropertySheet");//$NON-NLS-1$
+            } catch (PartInitException ex) {
+                    Activator.getDefault().log(IStatus.ERROR, ex.getMessage(), ex);
+            }
+			}
+			
+		});
+		propViewItem.setImage(Activator.getDefault().getImage(ICON_PROPVIEW));
+		propViewItem.setToolTipText("Show Properties View");
+
+		//toolbar button to show some navigation help and open the F1 help
+		ToolItem helpItem = new ToolItem (toolBar, SWT.PUSH | SWT.FLAT );
+		helpItem.addSelectionListener(new SelectionListener(){
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				PlatformUI.getWorkbench().getHelpSystem().displayHelp(AnalyzeToolHelpContextIDs.ANALYZE_GRAPH);
+			}
+			
+		});
+		helpItem.setImage(Activator.getDefault().getImage(ICON_HELP));
+		helpItem.setToolTipText("Quick navigtion help\n-------------------------\nZoom in: select a region of the graph (mouse left-click and drag).\nZoom out: mouse right-click.\n\nSelect memory operation: mouse left-click in the graph.\nMove selection to next or previous using arrow left and arrow right keys.\n\nFor more help press F1");
+		
+		yAxis = new YAxis(this);
+		yAxis.createContent();
+		graphCanvas = new AnalyzeToolGraph(this);
+		graphCanvas.setSize(500, 450);
+		
+		FormData formData = new FormData();
+		formData.top = new FormAttachment(0,2);
+		formData.left   = new FormAttachment(0, 2);
+		formData.height = processCombo.getBounds().height;
+		processLabel.setLayoutData(formData);
+		
+		formData = new FormData();
+		formData.top = new FormAttachment(0);
+		formData.left   = new FormAttachment(processLabel, 10, SWT.BOTTOM);
+		processCombo.setLayoutData(formData);
+
+		formData = new FormData();
+		formData.top = new FormAttachment(0, 2);
+		formData.right   = new FormAttachment(100, 2);
+		toolBar.setLayoutData(formData);
+		
+		formData = new FormData();
+		formData.top = new FormAttachment(processCombo, 5, SWT.BOTTOM);
+		formData.bottom = new FormAttachment(100);
+		formData.left   = new FormAttachment(0);
+		formData.width  = 60;
+		yAxis.setLayoutData(formData);
+		
+		formData = new FormData();
+		formData.top = new FormAttachment(processCombo, 5, SWT.BOTTOM);
+		formData.bottom = new FormAttachment(100);
+		formData.left   = new FormAttachment(yAxis, 0, SWT.RIGHT);
+		formData.right  = new FormAttachment(100);
+		graphCanvas.setLayoutData(formData);
+		
+		yAxis.setBackground(ColorConstants.white);
+		yAxis.addPaintListener(new PaintListener()
+		{
+
+			public void paintControl(PaintEvent event) {
+				
+				if(yAxis != null)
+					yAxis.paintYAxis(event.gc);
+			}		
+		});
+		
+		graphCanvas.setBackground(new Color(Display.getDefault(), new RGB(255,255,255)));
+		graphCanvas.createContent();
+		graphCanvas.addControlListener(new ControlAdapter() {
+			public void controlResized(ControlEvent e) {
+				//the client area of the graph panel might change if a scrollbar gets added/removed 
+				//this needs to be passed on to the y axis
+				if (yAxis.getHeight() !=  graphCanvas.getClientArea().height){
+					yAxis.setHeight(graphCanvas.getClientArea().height);
+					yAxis.redraw();
+				}
+			}
+			
+		});
+		
+		iRefreshUIJob = new UIJob("Updating process combo box"){
+
+			@Override
+			public IStatus runInUIThread(IProgressMonitor arg0) {
+				processCombo.removeAll();
+				// Update combo box
+				if (model.getProcesses().size() == 0){
+					processCombo.add("No data available");
+					processCombo.select(0);
+				} else {
+					for (ProcessInfo p : model.getProcesses()) {
+						processCombo.add(String.format("%s with %d leak(s)",p.getProcessName() != null ? p.getProcessName() : p.getProcessID(), p.getMemLeaksNumber()));
+					}
+					processCombo.setVisibleItemCount(10);
+				}
+				processCombo.pack();
+				return Status.OK_STATUS;
+			}
+			
+		};
+		iRefreshUIJob.setSystem(true);
+		
+		processCombo.addSelectionListener(new SelectionListener(){
+
+			public void widgetDefaultSelected(SelectionEvent e) {}
+
+			public void widgetSelected(SelectionEvent e) {
+				int sel = processCombo.getSelectionIndex();
+				if (model.getProcesses().size()>sel){
+					ProcessInfo process = model.getProcesses().get(processCombo.getSelectionIndex());
+					model.setSelectedProcess(process);
+					processCombo.setSize(processCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+				}
+			}
+			
+		});
+		
+				
+		layout();
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(
+				this,
+				AnalyzeToolHelpContextIDs.ANALYZE_GRAPH);
+	}
+
+	/**
+	 * Sets a new model. Note the redraw of the new content only happens on 
+	 * callbacks to model change listeners.
+	 * @param aProject The currently selected project in the IDE, used for pinpointing
+	 * 
+	 * @param model the new IMemoryActivityModel to set
+	 */
+	public void setInput(IProject aProject, IMemoryActivityModel model) {
+		if (this.model != null){
+			this.model.removeListener(this);
+		}
+		this.model = model;
+		this.model.addListener(this);
+
+		graphCanvas.setInput(model);
+		yAxis.setInput(model);
+		if (aProject != null) {
+			graphCanvas.setProject(aProject);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessSelected(com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo)
+	 */
+	public void onProcessSelected(ProcessInfo p) {
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessesAdded()
+	 */
+	public void onProcessesAdded() {
+		iRefreshUIJob.cancel();
+		iRefreshUIJob.schedule();
+		
+	}	
+	
+	public void update(){
+		graphCanvas.zoomGraph();
+		graphCanvas.redraw();
+		yAxis.redraw();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/MemOpDescriptor.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class MemOpDescriptor
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.internal.ui.graph;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.IFunction;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISourceLocation;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISymbolFile;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocCallstack;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.BaseInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.DllLoad;
+import com.nokia.s60tools.analyzetool.engine.statistic.SourceFile;
+import com.nokia.s60tools.analyzetool.engine.statistic.SymReader;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.internal.ui.util.GraphUtils;
+
+/**
+ * MemOpDescriptor provides properties of any Alloc/Leak/Free suitable to be displayed in eclipse
+ * Properties View.
+ * 
+ */
+@SuppressWarnings("restriction")
+class MemOpDescriptor implements IPropertySource {
+	BaseInfo memInfo;
+	
+	/** process Id descriptor */
+	private static final String PID_ID = "pid";
+	private final DotTextPropertyDescriptor PID_DESCRIPTOR = new DotTextPropertyDescriptor(PID_ID, "Process Id");
+
+	/** Memory operation type Allocation/Leak/Free descriptor */
+	private static final String TYPE_ID = "type";
+	private final DotTextPropertyDescriptor TYPE_DESCRIPTOR = new DotTextPropertyDescriptor(TYPE_ID, "Operation Type");
+
+	/** Time descriptor */
+	private static final String TIME_ID = "time";
+	private final DotTextPropertyDescriptor TIME_DESCRIPTOR = new DotTextPropertyDescriptor(TIME_ID, "Time");
+
+	/** size descriptor */
+	private static final String SIZE_ID = "size";
+	private final DotTextPropertyDescriptor SIZE_DESCRIPTOR = new DotTextPropertyDescriptor(SIZE_ID, "Size");
+
+	/** memory address descriptor */
+	private static final String ADDR_ID = "address";
+	private final DotTextPropertyDescriptor ADDR_DESCRIPTOR = new DotTextPropertyDescriptor(ADDR_ID, "Address");
+
+	/** total memory size consumed by the process descriptor */
+	private static final String TSIZE_ID = "total";
+	private final DotTextPropertyDescriptor TSIZE_DESCRIPTOR = new DotTextPropertyDescriptor(TSIZE_ID, "Total Size");
+
+	/** life time of an allocation descriptor. This applies only to non Leaked allocations  */
+	private static final String LIFETIME_ID = "lifetime";
+	private final DotTextPropertyDescriptor LIFETIME_DESCRIPTOR = new DotTextPropertyDescriptor(LIFETIME_ID, "Life Time");
+	private static final String ATTRIBUTES_GROUP = "Attributes";
+	/** used for making absolute time values relative */
+	private long baseTime;
+
+	/** callstack item descriptor id*/
+	private static final String CALL_STACK_ID = "callstack";
+
+	/** current project */
+	IProject iCurrentProject = null;
+	/** Symbol Reader */
+	SymReader iSymReader = null;
+	/** c++ files from the current project */
+	AbstractList<String> cppFileNames;
+	static final String LINE_SEPARATOR = " :: ";
+	/**
+	 * Constructor
+	 * @param baseTime usually process start time, used for making absolute time values relative   
+	 * @param info the alloc or free info
+	 * @param project IProject to use for locating source file 
+	 * @param symReader the SymReader to use for pinpointing
+	 * @param cppFiles 
+	 */
+	public MemOpDescriptor(Long baseTime, BaseInfo info, IProject project, SymReader symReader, AbstractList<String> cppFiles) {
+		memInfo = info;
+		iCurrentProject = project;
+		iSymReader = symReader;
+		cppFileNames = cppFiles;
+		this.baseTime = baseTime;	
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+	 */
+	public Object getEditableValue() {
+		return null; // no edit
+	}
+
+
+
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+	 */
+	public IPropertyDescriptor[] getPropertyDescriptors() {
+		final List<IPropertyDescriptor> completeList = new ArrayList<IPropertyDescriptor>();
+		PID_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(PID_DESCRIPTOR);
+		TYPE_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(TYPE_DESCRIPTOR);
+		TIME_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(TIME_DESCRIPTOR);
+		SIZE_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(SIZE_DESCRIPTOR);
+		ADDR_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(ADDR_DESCRIPTOR);
+		TSIZE_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+		completeList.add(TSIZE_DESCRIPTOR);
+		if (memInfo instanceof AllocInfo && ((AllocInfo)memInfo).isFreed()) {
+			LIFETIME_DESCRIPTOR.setCategory(ATTRIBUTES_GROUP);
+			completeList.add(LIFETIME_DESCRIPTOR); //only non leaks
+		}
+		// add callstack descriptors
+		AbstractList<AllocCallstack> callstack = memInfo.getCallstack();
+		for (int i = 0; i < callstack.size(); i++) {
+			
+			final DotTextPropertyDescriptor propDesc = new DotTextPropertyDescriptor(i, CALL_STACK_ID);
+			propDesc.setCategory("CallStack");
+			completeList.add(propDesc);
+		}
+		return completeList.toArray(new TextPropertyDescriptor[completeList.size()]);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+	 */
+	public Object getPropertyValue(Object id) {
+		//Note, this method must return String values for the CellEditor to work
+		if (PID_ID.equals(id)) {
+			return String.valueOf(memInfo.getProcessID());//process ids are usually decimal values
+		}
+		if (TYPE_ID.equals(id))
+			return memInfo instanceof AllocInfo ? ((AllocInfo)memInfo).isFreed() ? "Allocation" : "Leak" : "Free";
+		if (TIME_ID.equals(id))
+			return GraphUtils.renderTime(memInfo.getTime() - baseTime);
+		if (SIZE_ID.equals(id))
+			return String.format("%,d B",memInfo.getSizeInt());
+		if (ADDR_ID.equals(id))
+			return Long.toString(memInfo.getMemoryAddress(),16);
+		if (TSIZE_ID.equals(id))
+			return String.format("%,d B",memInfo.getTotalMem());
+		if (LIFETIME_ID.equals(id)) {
+			if (memInfo instanceof AllocInfo && ((AllocInfo)memInfo).isFreed()) {
+				AllocInfo info = (AllocInfo) memInfo;
+				return GraphUtils.renderTime(info.getFreedBy().getTime() - info.getTime()); 
+			}
+			throw new IllegalStateException("Should not happen because we did not provide a lifetime descriptor for leak and free");
+		}
+		if (id instanceof Integer && memInfo.getCallstack() != null){
+			int callstackId = (Integer)id;
+			if (callstackId < memInfo.getCallstack().size()){
+				AllocCallstack callstackItem = memInfo.getCallstack().get(callstackId);
+				DllLoad tempLoad = callstackItem.getDllLoad();
+				long addr = callstackItem.getMemoryAddress();
+				
+				String name = String.format("%1$08x",addr);
+				if (tempLoad != null && callstackItem.getMemoryAddress()!= tempLoad.getStartAddress()) {
+					SourceFile aSourcefile = pinpoint(callstackItem.getMemoryAddress(),
+							callstackItem.getDllLoad());
+					if (aSourcefile != null) { //callstack resolved to a file-function-line
+						return name + LINE_SEPARATOR + callstackItem.getDllLoad().getName() + LINE_SEPARATOR + aSourcefile.getFileName()+ LINE_SEPARATOR + aSourcefile.getFunctionName() + LINE_SEPARATOR + aSourcefile.getLineNumber();
+					}
+				}
+				return name + (tempLoad != null ? LINE_SEPARATOR + tempLoad.getName() : "");
+				}
+			}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+	 */
+	public boolean isPropertySet(Object id) {
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+	 */
+	public void resetPropertyValue(Object id) {
+		// do nothing
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+	 */
+	public void setPropertyValue(Object id, Object value) {
+		// do nothing
+	}
+
+	
+	/**
+	 * DotTextPropertyDescriptor  defines a read only TextPropertyDescriptor
+	 * It also add a customised key/mouse listener.
+	 * This listener will be useful for pinpointing the source.
+	 *
+	 */
+	private class DotTextPropertyDescriptor extends TextPropertyDescriptor {
+
+		/**
+		 * Constructor
+		 * @param id Descriptor Id
+		 * @param displayName Descriptor display name
+		 */
+		public DotTextPropertyDescriptor(Object id, String displayName) {
+			super(id, displayName);
+		}
+
+		/**
+		 * create a Read Only TextCellEditor and add the defined listener to its Control.
+		 * @see org.eclipse.ui.views.properties.TextPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
+		 */
+		@Override
+		public CellEditor createPropertyEditor(Composite parent) {
+			TextCellEditor editor = new SimpleTextCellEditor(parent,SWT.READ_ONLY);
+			Text control = (Text) editor.getControl();
+			control.setEditable(false);
+			
+			DotPropKeyMouseListener listener = new DotPropKeyMouseListener();
+			control.addKeyListener(listener);
+			control.addMouseListener(listener);
+			if (getValidator() != null) {
+				editor.setValidator(getValidator());
+			}
+			return editor;
+		}
+	}
+		
+		
+	private class SimpleTextCellEditor extends TextCellEditor {
+		public SimpleTextCellEditor(Composite parent, int readOnly) {
+			super(parent,readOnly);
+		}
+
+		@Override
+		public boolean isCopyEnabled() {
+			return false;
+		}
+		
+		@Override
+		public boolean isCutEnabled() {
+			return false;
+		}
+		
+		@Override
+		public boolean isPasteEnabled() {
+			return false;
+		}
+		
+		@Override
+		public boolean isFindEnabled() {
+			return false;
+		}
+	}
+	
+	
+	/**
+	 * This class is only for convenience for the moment.
+	 * It's very likely that the listener will be provided by AnalyzeToolGraph
+	 *
+	 */
+	private class DotPropKeyMouseListener implements KeyListener, MouseListener {
+
+		//key
+
+		public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
+		}
+
+		public void keyReleased(org.eclipse.swt.events.KeyEvent keyEvent) {
+			//System.out.println("key released.");
+			if (keyEvent.character == '\r') {
+				String text = ((Text)keyEvent.getSource()).getText();
+				if (text != null) {
+					String[] segs = text.split(LINE_SEPARATOR);
+					if (segs.length == 5) {
+						openEditor(segs[2], segs[4]);
+					}
+				}
+			}
+			
+		}
+
+		//Mouse
+		
+		public void mouseDoubleClick(MouseEvent e) {
+			String text = ((Text)e.getSource()).getText();
+			if (text != null) {
+				String[] segs = text.split(LINE_SEPARATOR);
+				if (segs.length == 5) {
+					openEditor(segs[2], segs[4]);
+				}
+			}
+		}
+
+		public void mouseDown(MouseEvent e) {
+		}
+
+		public void mouseUp(MouseEvent e) {
+		}
+	}
+	
+	
+	/**
+	 * Pinpoints one memory address to source code line.
+	 *
+	 * @param memoryAddress
+	 *            Memory address
+	 * @param dllLoad
+	 *           DllLoad item
+	 * @return SourceFile if found otherwise null
+	 */
+	private SourceFile pinpoint(Long memoryAddress, DllLoad dllLoad) {
+
+		if (dllLoad != null) {
+
+			ISymbolFile symbolFile = iSymReader.getSymbolFile(dllLoad.getName(),
+					false);
+			if( symbolFile != null ) {
+				return pinpointToSrcLine(symbolFile, memoryAddress, dllLoad);
+			}
+		}
+		return null;
+	}
+	
+	/**
+	 * Pinpoints memory address to source code line
+	 *
+	 * @param symbolFile
+	 *            Opened symbol file
+	 * @param memoryAddress
+	 *            Used memory address
+	 * @param dllLoad
+	 *            DllLoad object where to memory address belongs
+	 * @return SourceFile
+	 */
+	private SourceFile pinpointToSrcLine(ISymbolFile symbolFile,
+			Long memoryAddress, DllLoad dllLoad) {
+
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(iCurrentProject);
+		String platform = cpi.getDefaultConfiguration().getPlatformString();
+
+		try {
+			// this is the start address of each symbol file
+			long defaultLinkAddress = 0;
+
+			// if the platform is other than winscw => adjust the memory address
+			if (!(Constants.BUILD_TARGET_WINSCW).equalsIgnoreCase(platform)) {
+				defaultLinkAddress = 32768L;
+			} else {
+				defaultLinkAddress = -4096L;
+			}
+
+			// calculate memory address in symbol file
+			long calculated = (memoryAddress - dllLoad.getStartAddress()) + defaultLinkAddress;
+
+			java.math.BigInteger bigAddress = new java.math.BigInteger(Long
+					.toHexString(calculated), 16);
+			IFunction func = symbolFile.findFunctionByAddress(bigAddress);
+			ISourceLocation loc = symbolFile.findSourceLocation(bigAddress);
+			if (func != null && loc != null) {
+				String sourceFile = loc.getSourceFile();
+				if (sourceFile == null
+						|| sourceFile.equalsIgnoreCase(""))
+					return null;
+				int lineNumber = loc.getLineNumber();
+				if (lineNumber == 0)
+					return null;
+				String name = func.getName();
+				if (name == null
+						|| name.equalsIgnoreCase(""))
+					return null;
+				/*
+				 * if( onlyForProjectFiles &&
+				 * !isFilePartOfTheProject(loc.getSourceFile()) ) return null;
+				 */
+				SourceFile file = new SourceFile();
+				file.setFileName(sourceFile);
+				file.setLineNumber(lineNumber);
+				file.setFunctionName(name);
+				return file;
+			}
+
+		} catch (java.lang.NumberFormatException nfe) {
+			// do nothing by design
+			nfe.printStackTrace();
+		} catch (Exception e) {
+			// do nothing by design
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+	
+	
+	/**
+	 * Opens current callstack item on default editor and pinpoints memory leak
+	 * line
+	 *
+	 * @param cppFileName
+	 *            Cpp file name
+	 * @param lineNumber
+	 *            Cpp file line number
+	 */
+	private void openEditor(String cppFileName, String lineNumber) {
+
+		//check that used information is given
+		//we need to know file name and file line number
+		//that we could open the right line in editor
+		if (cppFileName == null || ("").equals(cppFileName)
+				|| lineNumber == null || ("").equals(lineNumber)) {
+			return;
+		}
+		try {
+
+			IFile file = null;
+			String usedFileName = null;
+			usedFileName = getFileNames(cppFileName);
+			if (iCurrentProject.isOpen()) {
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+						new Path(iCurrentProject.getName()
+								+ usedFileName.toLowerCase(Locale.US)));
+			}
+
+			// if file not found in active project
+			if (file == null || !file.exists()) {
+				IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace()
+						.getRoot();
+				IProject[] projects = myWorkspaceRoot.getProjects();
+				for (int i = 0; i < projects.length; i++) {
+					file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+							new Path(projects[i].getName() + "\\"
+									+ usedFileName));
+
+					// file found => skip the rest of the projects
+					if (file != null && file.exists()) {
+						break;
+					}
+				}
+
+			}
+
+			// if file still not found
+			// display info to user and leave
+			if (file == null || !file.exists()) {
+				Util.showMessage(Constants.SOURCE_NOT_FOUND);
+				return;
+			}
+
+			IWorkbenchPage page = PlatformUI.getWorkbench()
+					.getActiveWorkbenchWindow().getActivePage();
+
+			HashMap<String, Object> map = new HashMap<String, Object>();
+			map.put(IMarker.LINE_NUMBER, Integer.parseInt(lineNumber));
+			// map.put(IDE.EDITOR_ID_ATTR,
+			// "org.eclipse.jdt.ui.ClassFileEditor");
+			map.put(IDE.EDITOR_ID_ATTR, Constants.SOURCE_FILE_EDITOR_ID);
+			IMarker marker = file.createMarker(IMarker.TEXT);
+			marker.setAttributes(map);
+			IDE.openEditor(page, marker, true);
+
+		} catch (PartInitException pie) {
+			pie.printStackTrace();
+		} catch (NullPointerException npe) {
+			npe.printStackTrace();
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * Find symbol reader api pinpointed class file for project class files.
+	 *
+	 * @param fileName
+	 *            Cpp file name
+	 * @return Found cpp file location
+	 */
+	private String getFileNames(String fileName) {
+		int slash = Util.getLastSlashIndex(fileName);
+		String tempFile = fileName.substring(slash + 1, fileName.length());
+
+		String realFileName = fileName;
+		for(String tempFileName : cppFileNames){
+			int slashTemp = Util.getLastSlashIndex(tempFileName);
+			String tempFileWithoutExt = tempFileName.substring(slashTemp + 1,
+					tempFileName.length());
+			if (tempFileWithoutExt.equalsIgnoreCase(tempFile)) {
+				realFileName = tempFileName;
+				break;
+			}
+		}
+
+		return realFileName;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/YAxis.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class YAxis
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.ui.graph;
+import java.text.DecimalFormat;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Transform;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.progress.UIJob;
+
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.internal.ui.util.GraphUtils;
+
+/**
+ * FigureCanvas containing the Y axis of the AnalyzeTool graph
+ *
+ */
+public class YAxis extends Canvas implements IMemoryActivityModelChangeListener {
+	private static final int YLEGENDSPACE = 60;
+	private static final DecimalFormat MB_FORMAT = new DecimalFormat("#####.0");
+	private IMemoryActivityModel model;
+	protected int visualSizeY = 0;
+	private UIJob iRefreshUIJob;
+	private Image bytesImage;
+
+	/**
+	 * Constructor
+	 * @param parent
+	 */
+	public YAxis(Composite parent) {
+		super(parent, SWT.NONE);
+	}
+	/**
+	 * To be called once after construction.
+	 */
+	public void createContent() {
+		iRefreshUIJob = new UIJob("Updating Memory Activity Graph"){
+
+			@Override
+			public IStatus runInUIThread(IProgressMonitor arg0) {
+				// Refresh the graph
+				redraw();
+				return Status.OK_STATUS;
+			}
+			
+		};
+		iRefreshUIJob.setSystem(true);		
+	}
+
+	/**
+	 * Sets a new model as input
+	 * @param model
+	 */
+	public void setInput(IMemoryActivityModel model) {
+		if (this.model != null){
+			this.model.removeListener(this);
+		}
+		this.model = model;
+		this.model.addListener(this);
+	}
+	
+	/**
+	 * Called when paint event occurs. 
+	 * @param gc The GC to draw on
+	 */
+	@SuppressWarnings("cast")
+	public void paintYAxis(GC gc){
+		
+		
+		double visY = visualSizeY - 50;
+		//max value influences unit of measure on graph
+		int prettyBytes = GraphUtils.prettyMaxBytes(model.getHighestCumulatedMemoryAlloc());
+		double multiplier = prettyBytes / visY;
+		
+		double yIncrement = visY / 10;
+		int previousBottom = 0;
+		
+		for (double k = visY; k >= 0; k-=yIncrement)
+		{
+			// location for the value indicator is k * 1/10 the height of the display
+			int y = (int) (visY - k);
+		
+			int bytes = (int)(Math.ceil(k * multiplier));
+
+			String legend = "";
+			
+			if (prettyBytes < 10*1024)
+			{
+				legend += bytes + " B"; 
+			}
+			else if (prettyBytes <= 500 * 1024)
+			{
+				legend += (bytes / 1024) + " KB"; 
+			}
+			else
+			{
+				legend +=  MB_FORMAT.format(((float) bytes / (1024 * 1024)))  + " MB";
+			}
+			org.eclipse.swt.graphics.Point extent = gc.stringExtent(legend);
+			
+			gc.drawLine(YLEGENDSPACE - 3, (int)y + 1, YLEGENDSPACE, (int)y + 1);
+			
+			if (y >= previousBottom)
+			{
+				gc.drawString(legend, YLEGENDSPACE - extent.x -2, (int)y);
+				previousBottom = (int)y + extent.y;
+			}
+		}
+	
+		if (bytesImage == null){
+			bytesImage = GraphUtils.getVerticalLabel("Bytes");			
+		}
+		gc.setAdvanced(true);
+	    final org.eclipse.swt.graphics.Rectangle rect2 = bytesImage.getBounds();
+        Transform transform = new Transform(Display.getDefault());
+
+        transform.translate(rect2.height / 2f, rect2.width / 2f);
+        transform.rotate(-90);
+        transform.translate(-rect2.width / 2f, -rect2.height / 2f);
+
+        gc.setTransform(transform);
+        gc.drawImage(bytesImage, -(int)visY/3, 1);
+        
+        transform.dispose();
+	}
+	
+	/**
+	 * @return the visible height of the control
+	 */
+	public int getHeight() {
+		return visualSizeY;
+	}
+	/**
+	 * Sets the visible height of the control
+	 * @param height the height to set
+	 */
+	public void setHeight(int height) {
+		visualSizeY = height;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessesAdded()
+	 */
+	public void onProcessesAdded() {
+		iRefreshUIJob.cancel();
+		iRefreshUIJob.schedule();
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessSelected(com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo)
+	 */
+	public void onProcessSelected(ProcessInfo p) {
+		iRefreshUIJob.cancel();
+		iRefreshUIJob.schedule();
+	}
+	
+//	public void dispose() {
+//	//TODO cancel ui jobs here and remove listeners
+//	//there is no dispose() entry point in this class; we may have to call this via MainView.dispose()
+//}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/util/ColorUtil.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ColorUtil
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.ui.util;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utilities for generating the same (unique) colour for a given String every
+ * time.
+ */
+public final class ColorUtil
+{
+	private static final int[] RGB_WHITE = { 255, 255, 255 };
+	private static final int[] RGB_GREY  = { 180, 180, 180 };//light grey
+	private static final int[] RGB_BLACK = { 0, 0, 0 };
+	private static final int[] RGB_100 = {100, 100, 100};//middle grey
+	private static final int[] RGB_170 = {170, 170, 170};//light grey
+	private static final int[] RGB_200 = {200, 200, 200};//very light grey
+
+	/** Color representing the colour white */
+	public static final Color WHITE =
+		new Color(Display.getDefault(), RGB_WHITE[0], RGB_WHITE[1], RGB_WHITE[2]);
+
+	/** Color representing the colour grey */
+	public static final Color GREY =
+		new Color(Display.getDefault(), RGB_GREY[0], RGB_GREY[1], RGB_GREY[2]);
+
+	/** Color representing the colour black */
+	public static final Color BLACK =
+		new Color(Display.getDefault(), RGB_BLACK[0], RGB_BLACK[1], RGB_BLACK[2]);
+	
+	/** Color representing middle grey */
+	public static final Color COLOR_100 = new Color(Display.getDefault(), RGB_100[0], RGB_100[1], RGB_100[2]);
+	/** Color representing very light grey */
+	public static final Color COLOR_200 = new Color(Display.getDefault(), RGB_200[0], RGB_200[1], RGB_200[2]);
+	/** Color representing light grey */
+	public static final Color COLOR_170 = new Color(Display.getDefault(), RGB_170[0], RGB_170[1], RGB_170[2]);
+	
+	// Guard against instantiation
+	private ColorUtil() {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/util/GraphUtils.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,297 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class GraphUtils
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.ui.util;
+import java.text.DecimalFormat;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utilities class for the graph
+ *
+ */
+public final class GraphUtils {
+	private static final String MILLISECONDS = "ms"; //$NON-NLS-1$
+	private static final String SECONDS = "s"; //$NON-NLS-1$
+	private static final String MINUTES = "m"; //$NON-NLS-1$
+	private static final String HOURS = "h"; //$NON-NLS-1$
+	private static final String DAYS = "d"; //$NON-NLS-1$
+	private static final String SPACE = " "; //$NON-NLS-1$
+	private static final int KILOBYTE = 1024;
+	private static final int MEGABYTE = 1024*1024;
+	private static final int GIGABYTE = 1024*1024*1024;
+	private static final DecimalFormat MB_FORMAT = new DecimalFormat("#####.0");
+	private static final DecimalFormat BYTES_FORMAT = new DecimalFormat("#####.##");
+	
+	
+	//make constructor private so class doesn't get instantiated
+	private GraphUtils(){
+		
+	}
+	
+	/**
+	 * 
+	 * @param aBytes
+	 * @return next rounded value in Bytes.
+	 */
+	public static int prettyMaxBytes(final int aBytes) {
+		int bytes = aBytes;
+		if (bytes <= KILOBYTE)
+			bytes = 1024;
+		else if (bytes <= 10 * KILOBYTE)
+			bytes = 10 * KILOBYTE;
+		else if (bytes <= 20 * KILOBYTE)
+			bytes = 20 * KILOBYTE;
+		else if (bytes <= 30 * KILOBYTE)
+			bytes = 30 * KILOBYTE;
+		else if (bytes <= 50 * KILOBYTE)
+			bytes = 50 * KILOBYTE;
+		else if (bytes <= 100 * KILOBYTE)
+			bytes = 100 * KILOBYTE;
+		else if (bytes <= 200 * KILOBYTE)
+			bytes = 200 * KILOBYTE;
+		else if (bytes <= 300 * KILOBYTE)
+			bytes = 300 * KILOBYTE;
+		else if (bytes <= 500 * KILOBYTE)
+			bytes = 500 * KILOBYTE;
+		else if (bytes <= MEGABYTE)
+			bytes = MEGABYTE;
+		else if (bytes <= 2 * MEGABYTE)
+			bytes = 2 * MEGABYTE;
+		else if (bytes <= 3 * MEGABYTE)
+			bytes = 3 * MEGABYTE;
+		else if (bytes <= 5 * MEGABYTE)
+			bytes = 5 * MEGABYTE;
+		else if (bytes <= 10 * MEGABYTE)
+			bytes = 10 * MEGABYTE;
+		else if (bytes <= 20 * MEGABYTE)
+			bytes = 20 * MEGABYTE;
+		else if (bytes <= 30 * MEGABYTE)
+			bytes = 30 * MEGABYTE;
+		else if (bytes <= 50 * MEGABYTE)
+			bytes = 50 * MEGABYTE;
+		else if (bytes <= 100 * MEGABYTE)
+			bytes = 100 * MEGABYTE;
+		else if (bytes <= 200 * MEGABYTE)
+			bytes = 200 * MEGABYTE;
+		else if (bytes <= 300 * MEGABYTE)
+			bytes = 300 * MEGABYTE;
+		else if (bytes <= 500 * MEGABYTE)
+			bytes = 500 * MEGABYTE;
+		else
+			bytes = ((bytes + GIGABYTE - 1) / GIGABYTE) * GIGABYTE;
+
+		return bytes;
+	}
+	/**
+	 * Draws the given String and an arrow on an image and returns it.
+	 * @param name The string to display
+	 * @return the newly created image
+	 */
+	public static Image getVerticalLabel(final String name)
+	{
+		final Image image = new Image(Display.getDefault(), 90, 14);
+	    final GC gc = new GC(image);
+	    final Font font = new Font(Display.getDefault(), Display.getDefault().getSystemFont().getFontData()[0].getName(), 9, SWT.BOLD);
+	    gc.setFont(font);
+	    gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+	    gc.fillRectangle(0, 0, 90, 15);
+	    gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
+	    gc.drawText(name + " ->", 0, 0, true);
+	    font.dispose();
+	    gc.dispose();
+	    return image;
+	}
+	/**
+	 * Calculates the next larger or smaller scale. Used typically when zooming in / out.
+	 * @param scale the current scale
+	 * @param bigger flag to indicate whether to increase or decrease the scale
+	 * @return the new scale
+	 */
+	public static double nextScale(final double scale, final boolean bigger)
+    {
+    	double logScale = Math.log10(scale);
+    	double floorLogScale = Math.floor(Math.log10(scale));
+    	double mostSignificantDigit =  Math.rint(Math.pow(10, (logScale - floorLogScale)));
+    	double powerOfTen = Math.pow(10, floorLogScale);
+   	
+    	if (bigger) {
+    		if (mostSignificantDigit < 2) {
+    			mostSignificantDigit = 2;
+    		} else if (mostSignificantDigit < 5) {
+    			mostSignificantDigit = 5;
+    		} else {
+    			mostSignificantDigit = 10;
+    		}
+    	} else {
+    		if (mostSignificantDigit > 5) {
+    			mostSignificantDigit = 5;
+    		} else if (mostSignificantDigit > 2) {
+    			mostSignificantDigit = 2;
+    		} else if (mostSignificantDigit > 1) {
+    			mostSignificantDigit = 1;
+    		} else {
+    			mostSignificantDigit = 0.5;
+    		}
+    	}
+
+    	double result = mostSignificantDigit * powerOfTen;
+ 
+    	if (result < 0.1)
+        	result = 0.1;
+
+    	return result;
+    }
+	/**
+	 * Returns the given amount of microseconds as user-friendly formatted string,
+	 * for example "3d 5h 20min 2d 3ms"
+	 * The returned string can be quite long. Use {@link #renderTime(double)} for
+	 * a short version
+	 * @param aTotalMicroSeconds the given amount of microseconds to convert
+	 * @return the formatted time string
+	 */
+	@SuppressWarnings("nls")
+	public static String renderTime(final double aTotalMicroSeconds) { 
+		double totalMicroSeconds = aTotalMicroSeconds;
+		long days, hours, minutes, seconds, ms;
+		days= (long) (totalMicroSeconds / 86400000000L);
+		totalMicroSeconds -= days * 86400000000L;
+		hours = (long) (totalMicroSeconds / 3600000000L);
+		totalMicroSeconds -= hours * 3600000000L;
+		minutes = (long) totalMicroSeconds / 60000000;
+		totalMicroSeconds -= minutes * 60000000;
+		seconds = (long) totalMicroSeconds / 1000000;
+		totalMicroSeconds -= seconds * 1000000;
+		ms = (long)totalMicroSeconds / 1000;
+		
+		StringBuilder result= new StringBuilder();
+		if(days > 0) {
+			result.append(days).append(DAYS);
+		} 
+		if(hours > 0) {
+			if (result.length() > 0){
+				result.append(SPACE);
+			}
+			result.append(hours).append(HOURS);
+		} 
+		if(minutes > 0) {
+			if (result.length() > 0){
+				result.append(SPACE);
+			}
+			result.append(minutes).append(MINUTES);
+		} 
+		if(seconds > 0) {
+			if (result.length() > 0){
+				result.append(SPACE);
+			}
+			result.append(seconds).append(SECONDS);
+		}
+		if (ms > 0){
+			if (result.length() > 0){
+				result.append(SPACE);
+			}
+			result.append(ms).append(MILLISECONDS);
+		}
+		
+		if (result.length() == 0){
+			result.append(0).append(MILLISECONDS);			
+		}
+		return result.toString();
+	}
+	
+	/**
+	 * Formats the given number of bytes into an easily readable format 
+	 * @param bytes The number of bytes to format
+	 * @return String containing a formatted version of the input data 
+	 */
+	public static String formatBytes(final double bytes) {
+		String scaledY;
+
+		if (bytes < 10000) {
+			scaledY = BYTES_FORMAT.format((long)bytes) + " B"; 
+		} else if (bytes <= 500 * 1024) {
+			scaledY = BYTES_FORMAT.format(bytes / 1024) + " KB";
+		} else {
+			scaledY = MB_FORMAT.format(((float) bytes / (1024 * 1024))) + " MB";
+		}
+		return scaledY;
+	}
+
+	/**
+	 * Formats given time value to String with units. The resulting String
+	 * is formatted quite short, e.g.:
+	 * <br>"30s" 
+	 * <br>"1m 30s" 
+	 * <br>"40m"
+	 * <br>"1h 30m"
+	 * @param aTime Time in microseconds
+	 * @return time String with units
+	 */
+	public static String getTimeStringWithUnits(final double aTime) {
+		long time = (long) aTime / 1000; //convert from microseconds to milliseconds
+		String formatted ;
+		
+		//If we have only less than 10 seconds, show seconds and milliseconds
+		if(time < 6000){
+			//"s.S's'"
+			int seconds = (int) time / 1000;
+			long ms = time - (seconds * 1000);
+			if (ms == 0 ){
+				formatted = String.format("%ds", seconds);				
+			} else {
+				formatted = String.format("%ds%03d", seconds, ms);				
+			}
+		}
+		//If we have 10s or more, but less than 1min, show seconds
+		else if(time < 60000){
+			//"s's'"
+			formatted = String.format("%ds", (int) time / 1000);
+		}
+		//If we have more than one minute, but less than one 5min, showing the seconds as well
+		else if(time >= 60000 && time < (60000*5)){
+			//"m'm' s's'"
+			long minutes = (int) time / 60000;
+			long seconds = (time - minutes * 60000) / 1000;
+			if (seconds == 0 ){
+				formatted = String.format("%dm", minutes);
+			} else {
+				formatted = String.format("%dm %ds", minutes, seconds);
+			}
+		}
+		//If we have more than five minute, but less than one hour, we show only minutes
+		else if(time >= (60000*5) && time < (60*60*1000)){
+			//"m'm'"
+			formatted = String.format("%dm", (int) time / 60000);
+		}		
+		else{
+			//"H'h' m'm'"
+			long hours = (time / 3600000);
+			long minutes = (time - hours * 3600000) / 60000;
+			
+			if (minutes == 0){
+				formatted = String.format("%dh", hours);				
+			} else {
+				formatted = String.format("%dh %dm", hours, minutes);				
+			}
+
+		}		
+		return formatted;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/AdvancedPreferencePage.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AdvancedPreferencePage
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * This class implements AnalyzeTool advanced preference page.
+ *
+ * @author kihe
+ *
+ */
+public class AdvancedPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage {
+
+	/** Label to display info text  */
+	private Label infoText;
+	
+
+	/**
+	 * Constructor.
+	 */
+	public AdvancedPreferencePage() {
+		super();
+	}
+
+
+	/**
+	 * Creates this preference page content.
+	 *
+	 * @param parent
+	 *            This preference page parent
+	 */
+	@Override
+	protected final Control createContents(final Composite parent) {
+
+		// create new composite
+		final Composite composite = new Composite(parent, SWT.TOP);
+
+		// create griddata for view
+		final GridData gridData = new GridData();
+		composite.setLayoutData(gridData);
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.horizontalSpacing = 0;
+		gridLayout.verticalSpacing = 0;
+		gridLayout.marginWidth = 0;
+		gridLayout.marginHeight = 0;
+		gridLayout.numColumns = 1;
+
+		// set layoyt of this view
+		composite.setLayout(gridLayout);
+
+		infoText = new Label(composite, INFORMATION);
+		infoText.setText("AnalyzeTool rom symbol definition is changed to project related definition. \nSelect project - properties - " +
+				"Carbide extensions - AnalyzeTool to define symbol file(s).");
+
+		return composite;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(final IWorkbench workbench) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/AnalyzeToolPreferencePage.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,795 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class AnalyzeToolPreferencePage
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.preferences;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.RadioGroupFieldEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.AnalyzeToolHelpContextIDs;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+
+/**
+ * This class represents a preference page that is contributed to the
+ * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>,
+ * we can use the field support built into JFace that allows us to create a page
+ * that is small and knows how to save, restore and apply itself.
+ * <p>
+ * This page is used to modify preferences only. They are stored in the
+ * preference store that belongs to the main plug-in class. That way,
+ * preferences can be accessed directly via the preference store.
+ */
+
+public class AnalyzeToolPreferencePage extends FieldEditorPreferencePage
+		implements IWorkbenchPreferencePage, Listener{
+
+	/** Button to ask always. */
+	Button askButton = null;
+
+	/** Atool.exe path field. */
+	Text atooDirText = null;
+
+	/** User specified atool.exe path. */
+	Label atoolDir = null;
+
+	/** Atool.exe version field. */
+	Label atoolVerLabel;
+
+	/** Browse button to active file selection dialog. */
+	Button browseButton = null;
+
+	/** Button to activate/deactivate statistic generation */
+	//Button generateStatistic = null;
+
+	/** Group for callstack size buttons. */
+	Group csSizeGroup;
+
+	/** Custom items button */
+	Button customButton;
+
+	/** Forty items button */
+	Button fortyButton;
+
+	/** Hundred items button */
+	Button hundredButton;
+
+	/** Button to use process data. */
+	Button processButton = null;
+
+	/** Button to refresh atool.exe version. */
+	Button refeshAtoolVersion = null;
+
+	/** Radio group for report level. */
+	RadioGroupFieldEditor reportLevels = null;
+
+	/** Button to use S60 file mode. */
+	Button s60Button = null;
+
+	/**
+	 * Spinner to define custom size of callstack, this item is visible only
+	 * when custom button is selected.
+	 */
+	Spinner spinner;
+
+	/**
+	 * Button to use default atool.exe location this means that atool.exe is
+	 * executed inside AnalyzeTool jar.
+	 */
+	Button useDefaultLocation = null;
+
+	/** Button to use user specified data file name. */
+	Button userButton = null;
+
+	/** Use user specified location. */
+	Button useUserSpecified = null;
+
+	/** Button to verbose atool.exe output. */
+	Button verboseButton = null;
+
+	/** Button to select Tracing utility connection. */
+	Button externalButton = null;
+
+	/** Button to select fast external data gathering mode */
+	Button externalFastButton = null;
+
+	/** No items button. */
+	Button zeroButton;
+
+	/**
+	 * Constructor.
+	 */
+	public AnalyzeToolPreferencePage() {
+		super(GRID);
+		setPreferenceStore(Activator.getDefault().getPreferenceStore());
+		setDescription(Constants.ATOOL_DESC);
+	}
+
+	/**
+	 * Checks preferences initial values if logging mode is not set to S60
+	 * disables S60 data file name selections.
+	 */
+	public final void chechInitValues() {
+		IPreferenceStore store = Activator.getPreferences();
+		
+		// get stored atool folder
+		String atoolFolder = store.getString(Constants.ATOOL_FOLDER);
+		atoolVerLabel.setText(Constants.PREFS_ATOOL_VER_NOT_FOUND);
+
+		// if atool folder is set to point default atool location
+		if (atoolFolder.equals(Constants.DEFAULT_ATOOL_FOLDER)) {
+
+			// check stored atool location exists
+			java.io.File file = new java.io.File(atoolFolder);
+			if (file.exists()) { // if exists use this location and update
+				// preference page buttons
+				useDefaultLocation.setSelection(false);
+				store.setValue(Constants.USE_INTERNAL, false);
+
+			} else { // location could not found => use internal atool
+				useDefaultLocation.setSelection(true);
+				store.setValue(Constants.USE_INTERNAL, true);
+
+			}
+		} else {
+			boolean useDef = store.getBoolean(Constants.USE_INTERNAL);
+			useDefaultLocation.setSelection(useDef);
+
+		}
+
+		// get atool.exe path and set it atool.exe path field
+		String atoolPath = store.getString(Constants.USER_SELECTED_FOLDER);
+		atooDirText.setText(atoolPath);
+
+		// update preference page buttons
+		handleDefaultLocationChange();
+
+		// update atool.exe version number
+		if (useDefaultLocation.getSelection()) {
+			updateAtoolVersion(null);
+		} else {
+			updateAtoolVersion(atooDirText.getText());
+		}
+
+		// get logging mode and update buttons
+		String fileMode = store.getString(Constants.LOGGING_MODE);
+		setGroupButtons(fileMode);
+
+		String loggingMode = store.getString(Constants.S60_LOG_FILE_MODE);
+		if (loggingMode.equals(Constants.LOGGING_S60_USER_SPECIFIED)) {
+			processButton.setSelection(false);
+			userButton.setSelection(true);
+		} else {
+			processButton.setSelection(true);
+			userButton.setSelection(false);
+		}
+
+		verboseButton.setSelection(store.getBoolean(Constants.ATOOL_VERBOSE));
+		//generateStatistic.setSelection(store.getBoolean(Constants.CREATE_STATISTIC));
+
+		// get stored callstack size
+		int callstackSize = store.getInt(Constants.CALLSTACK_SIZE);
+		if (callstackSize == 0) {
+			zeroButton.setSelection(true);
+			spinner.setEnabled(false);
+		} else if (callstackSize == 40) {
+			fortyButton.setSelection(true);
+			spinner.setEnabled(false);
+		} else if (callstackSize == 100) {
+			hundredButton.setSelection(true);
+			spinner.setEnabled(false);
+		} else {
+			// if callstack size is set to custom area
+			// enable spinner and set stored callstack size
+			customButton.setSelection(true);
+			spinner.setEnabled(true);
+			spinner.setSelection(callstackSize);
+		}
+
+	}
+
+	/**
+	 * Check if user entered folder location is available.
+	 *
+	 * @param folderLocation
+	 *            User entered folder location
+	 * @return True if folder exists otherwise False
+	 */
+	public final boolean checkIfFolderExists(final String folderLocation) {
+		if (folderLocation.length() > 0) {
+			StringBuffer tmpFolderLoc = new StringBuffer();
+			tmpFolderLoc.append(folderLocation);
+			// folder is not end with backslash => add it
+			if (!folderLocation.endsWith("\\")) {
+				// folderLocation += "\\";
+				tmpFolderLoc.append('\\');
+			}
+			tmpFolderLoc.append("atool.exe");
+			IPath atoolPath = new Path(tmpFolderLoc.toString());
+
+			// if folder does not exists
+			if (atoolPath.toFile().exists()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Creates callstack size group items.
+	 */
+	private void createCallstackSizeGroup() {
+		// create new button group for callstack size
+		csSizeGroup = new Group(getFieldEditorParent(), SWT.NULL);
+		csSizeGroup.setText("Stored callstack size");
+
+		// set group layout
+		final GridLayout layoutCsSize = new GridLayout();
+		layoutCsSize.numColumns = 1;
+		csSizeGroup.setLayout(layoutCsSize);
+
+		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gridData.horizontalSpan = 1;
+		csSizeGroup.setLayoutData(gridData);
+
+		// zero size button
+		zeroButton = new Button(csSizeGroup, SWT.RADIO);
+		zeroButton.setText(Constants.PREFS_ZERO_BUTTON);
+		zeroButton.addListener(SWT.Selection, this);
+
+		// forty items button
+		fortyButton = new Button(csSizeGroup, SWT.RADIO);
+		fortyButton.setText(Constants.PREFS_FORTY_BUTTON);
+		fortyButton.addListener(SWT.Selection, this);
+
+		// hundred items button
+		hundredButton = new Button(csSizeGroup, SWT.RADIO);
+		hundredButton.setText(Constants.PREFS_HUNDRED_BUTTON);
+		hundredButton.addListener(SWT.Selection, this);
+
+		// button for define custom size of callstack
+		customButton = new Button(csSizeGroup, SWT.RADIO);
+		customButton.setText(Constants.PREFS_CUSTOM_BUTTON);
+		customButton.addListener(SWT.Selection, this);
+
+		// new composite for spinner item
+		Composite customComp = new Composite(csSizeGroup, SWT.NULL);
+		final GridLayout customGrid = new GridLayout();
+		customGrid.marginLeft = 15;
+		customGrid.numColumns = 1;
+		customComp.setLayout(customGrid);
+
+		spinner = new Spinner(customComp, SWT.BORDER);
+		spinner.setMaximum(255);
+	}
+
+	/**
+	 * Creates data gathering group items
+	 */
+	private void createGatheringGroup()
+	{
+		// create new button group for logging mode
+		Group groupGatheringMode = new Group(getFieldEditorParent(), SWT.NULL);
+		groupGatheringMode.setText(Constants.PREFS_LOGGING_MODE_TITLE);
+
+		// set group layout
+		final GridLayout layoutLogMode = new GridLayout();
+		layoutLogMode.numColumns = 1;
+		groupGatheringMode.setLayout(layoutLogMode);
+
+		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gridData.horizontalSpan = 1;
+		groupGatheringMode.setLayoutData(gridData);
+
+		// External mode button
+		externalButton = new Button(groupGatheringMode, SWT.RADIO);
+		externalButton.setToolTipText(Constants.PREFS_EXT_TOOLTIP);
+		externalButton.setText(Constants.PREFS_EXT);
+		externalButton.addListener(SWT.Selection, this);
+
+		// External fast mode button
+		externalFastButton = new Button(groupGatheringMode, SWT.RADIO);
+		externalFastButton.setToolTipText(Constants.PREFS_EXT_FAST_TOOLTIP);
+		externalFastButton.setText(Constants.PREFS_EXT_FAST);
+		externalFastButton.addListener(SWT.Selection, this);
+
+		// S60 mode button
+		s60Button = new Button(groupGatheringMode, SWT.RADIO);
+		s60Button.setToolTipText(Constants.PREFS_S60_TOOLTIP);
+		s60Button.setText(Constants.PREFS_S60);
+		s60Button.addListener(SWT.Selection, this);
+
+		Composite compStoreMode = new Composite(groupGatheringMode, SWT.NULL);
+
+		final GridLayout layoutStoreMode = new GridLayout();
+		layoutStoreMode.marginLeft = 15;
+		layoutStoreMode.numColumns = 1;
+		compStoreMode.setLayout(layoutStoreMode);
+
+		// use process name button
+		processButton = new Button(compStoreMode, SWT.RADIO);
+		processButton.setToolTipText(Constants.PREFS_USE_PROCESS_NAME_TOOLTIP);
+		processButton.setText(Constants.PREFS_USE_PROCESS_NAME);
+		processButton.addListener(SWT.Selection, this);
+
+		// user specified button
+		userButton = new Button(compStoreMode, SWT.RADIO);
+		userButton.setToolTipText(Constants.PREFS_USER_SPEC_TOOLTIP);
+		userButton.setText(Constants.PREFS_USER_SPEC);
+		userButton.addListener(SWT.Selection, this);
+
+		// ask always button
+		askButton = new Button(groupGatheringMode, SWT.RADIO);
+		askButton.setToolTipText(Constants.PREFS_ASK_ALWAYS_TOOLTIP);
+		askButton.setText(Constants.PREFS_ASK_ALWAYS);
+		askButton.addListener(SWT.Selection, this);
+
+	}
+	/**
+	 * Creates the field editors. Field editors are abstractions of the common
+	 * GUI blocks needed to manipulate various types of preferences. Each field
+	 * editor knows how to save and restore itself.
+	 */
+	@Override
+	public final void createFieldEditors() {
+		
+		Composite composite = new Composite(getFieldEditorParent(), SWT.NULL);
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 3;
+
+		// set layoyt of this view
+		composite.setLayout(gridLayout);
+
+		// new group for atool.exe specific settings
+		Group groupAtool = new Group(getFieldEditorParent(), SWT.NULL);
+		groupAtool.setText(Constants.PREFS_ATOOL_GROUP_TITLE);
+
+		// set group layout
+		final GridLayout layoutAtool = new GridLayout();
+		layoutAtool.numColumns = 1;
+		groupAtool.setLayout(layoutAtool);
+
+		// grid data for the atool.exe group
+		GridData gridDataAtool = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gridDataAtool.horizontalSpan = 1;
+		groupAtool.setLayoutData(gridDataAtool);
+
+		// create default location button and add listener to it
+		useDefaultLocation = new Button(groupAtool, SWT.RADIO);
+		useDefaultLocation.setText(Constants.PREFS_USE_INTERNAL_TITLE);
+		useDefaultLocation.setToolTipText(Constants.PREFS_USE_INTERNAL_TITLE);
+		useDefaultLocation.addListener(SWT.Selection, this);
+
+		// create user specified location button and add listener to it
+		useUserSpecified = new Button(groupAtool, SWT.RADIO);
+		useUserSpecified.setText(Constants.PREFS_USE_EXTERNAL_TITLE);
+		useUserSpecified.setToolTipText(Constants.PREFS_USE_EXTERNAL_TITLE);
+		useUserSpecified.addListener(SWT.Selection, this);
+
+		Composite compAtool = new Composite(groupAtool, SWT.NULL);
+
+		final GridLayout layoutAtoolDir = new GridLayout();
+		layoutAtoolDir.marginLeft = 15;
+		layoutAtoolDir.numColumns = 3;
+		compAtool.setLayout(layoutAtoolDir);
+
+		// directory label
+		atoolDir = new Label(compAtool, SWT.NONE);
+		atoolDir.setToolTipText(Constants.PREFS_SELECT_FOLDER);
+		atoolDir.setText(Constants.PREFS_ATOOL_PATH);
+
+		// directory field
+		atooDirText = new Text(compAtool, SWT.BORDER);
+		atooDirText.setLayoutData(new GridData(200, SWT.DEFAULT));
+
+		// button which opens the folder selection dialog
+		browseButton = new Button(compAtool, SWT.NONE);
+		browseButton.setToolTipText(Constants.PREFS_SELECT_FOLDER);
+		browseButton.setText(Constants.PREFS_BROWSE);
+		browseButton.addListener(SWT.Selection, this);
+
+		// generate statistics for the test run
+		/*
+		generateStatistic = new Button(groupAtool, SWT.CHECK);
+		generateStatistic.setText("Generate statistics");
+		generateStatistic.setToolTipText("Generate statistics");
+		*/
+		// verbose atool.exe output
+		verboseButton = new Button(groupAtool, SWT.CHECK);
+		verboseButton.setText(Constants.PREFS_VERBOSE);
+		verboseButton.setToolTipText(Constants.PREFS_VERBOSE_TOOLTIP);
+
+		// create new group for the atool.exe version
+		Group groupVersion = new Group(groupAtool, SWT.NONE);
+
+		// set atool.exe version group layout
+		GridData gridDataVersion = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		gridDataVersion.horizontalSpan = 1;
+		groupVersion.setLayoutData(gridDataVersion);
+
+		// set group layout
+		final GridLayout layoutVersion = new GridLayout(4, false);
+		groupVersion.setLayout(layoutVersion);
+
+		// atool.exe version label title
+		Label versionTextLabel = new Label(groupVersion, SWT.NONE);
+		versionTextLabel.setText(Constants.PREFS_ENGINE_VERSION);
+
+		// create atool.exe version field and set layout
+		atoolVerLabel = new Label(groupVersion, SWT.NONE);
+		GridData vergd13 = new GridData(GridData.FILL_HORIZONTAL);
+		vergd13.horizontalSpan = 2;
+		atoolVerLabel.setLayoutData(vergd13);
+
+		// create button to refresh atool.exe version
+		refeshAtoolVersion = new Button(groupVersion, SWT.NONE);
+		refeshAtoolVersion.setText(Constants.PREFS_REFRESH_VERSION);
+		refeshAtoolVersion.addListener(SWT.Selection, this);
+
+		// create data gathering group
+		createGatheringGroup();
+
+		// create callstack size group
+		createCallstackSizeGroup();
+
+		// report level related settings
+		reportLevels = new RadioGroupFieldEditor(Constants.REPORT_LEVEL,
+				Constants.PREFS_REPORT_LEVEL, 1, new String[][] {
+						{ Constants.PREFS_SHOW_EVERY, Constants.REPORT_EVERY },
+						{ Constants.PREFS_SHOW_KNOWN, Constants.REPORT_KNOWN },
+						{ Constants.PREFS_SHOW_TOPMOST,
+								Constants.REPORT_TOPMOST } },
+				getFieldEditorParent(), true);
+
+		addField(reportLevels);
+		chechInitValues();
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(super.getControl(),
+				AnalyzeToolHelpContextIDs.ANALYZE_TOOL_VIEW_MEM_LEAKS);
+
+	}
+
+	/**
+	 * Handles atool.exe location selection changes Update corresponding buttons
+	 * states.
+	 */
+	public final void handleDefaultLocationChange() {
+		if (useDefaultLocation.getSelection()) {
+			atooDirText.setEnabled(false);
+			browseButton.setEnabled(false);
+			atoolDir.setEnabled(false);
+			useUserSpecified.setSelection(false);
+		} else {
+			atooDirText.setEnabled(true);
+			browseButton.setEnabled(true);
+			atoolDir.setEnabled(true);
+			useUserSpecified.setSelection(true);
+		}
+	}
+
+	/**
+	 * Handles events.
+	 *
+	 * @param event
+	 *            Preference page event
+	 */
+	public final void handleEvent(final Event event) {
+		if (event.widget == browseButton) {
+			openFolderDialog();
+		} else if (event.widget == externalButton || event.widget == externalFastButton || event.widget == askButton ) {
+			userButton.setEnabled(false);
+			processButton.setEnabled(false);
+		} else if (event.widget == s60Button) {
+			userButton.setEnabled(true);
+			processButton.setEnabled(true);
+		} else if (event.widget == useDefaultLocation
+				|| event.widget == atoolDir) {
+			handleDefaultLocationChange();
+		} else if (event.widget == refeshAtoolVersion) {
+			if (useDefaultLocation.getSelection()) {
+				updateAtoolVersion(null);
+			} else {
+				updateAtoolVersion(atooDirText.getText());
+			}
+		} else if (event.widget == zeroButton || event.widget == fortyButton
+				|| event.widget == hundredButton) {
+			spinner.setEnabled(false);
+		} else if (event.widget == customButton) {
+			spinner.setEnabled(true);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(final IWorkbench workbench) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+	/**
+	 * Opens folder selection dialog.
+	 */
+	public final void openFolderDialog() {
+		DirectoryDialog folderDialog = new DirectoryDialog(atooDirText
+				.getShell(), SWT.OPEN);
+		folderDialog.setText(Constants.PREFS_SELECT_DIR);
+		folderDialog.setFilterPath(atooDirText.getText());
+		String folderPath = folderDialog.open();
+		if (folderPath != null) {
+			atooDirText.setText(folderPath);
+		}
+	}
+
+	/**
+	 * Perform defaults for AnalyzeTool preferences.
+	 */
+	@Override
+	public final void performDefaults() {
+		//check that AT prefs page is displayed
+		//if( getControl() != null && getControl().isVisible() ) {
+
+			processButton.setSelection(true);
+			userButton.setSelection(false);
+			setGroupButtons(Constants.LOGGING_EXT);
+
+			atooDirText.setText(Constants.DEFAULT_ATOOL_FOLDER);
+			useDefaultLocation.setSelection(true);
+			handleDefaultLocationChange();
+			verboseButton.setSelection(false);
+			zeroButton.setSelection(false);
+			fortyButton.setSelection(true);
+			hundredButton.setSelection(false);
+			customButton.setSelection(false);
+			spinner.setEnabled(false);
+			//generateStatistic.setSelection(false);
+			super.performDefaults();	
+		//}
+	}
+
+	/**
+	 * Stores selected values When user press "Ok" or "apply" button this method
+	 * is called
+	 */
+	@Override
+	public final boolean performOk() {
+		
+		//check that AT prefs page is displayed
+		//if( getControl() != null && getControl().isVisible() ) {
+			IPreferenceStore store = Activator.getPreferences();
+			String atoolFolder = atooDirText.getText();
+
+			// use default location is selected
+			if (useDefaultLocation.getSelection()) {
+				store.setValue(Constants.ATOOL_FOLDER, Util
+						.getDefaultAtoolLocation());
+				store.setValue(Constants.USE_INTERNAL, true);
+			}
+			// using user specified atool.exe location and the folder contains
+			// atool.exe
+			else if (checkIfFolderExists(atoolFolder)) {
+				store.setValue(Constants.ATOOL_FOLDER, atoolFolder);
+				store.setValue(Constants.USER_SELECTED_FOLDER, atoolFolder);
+				store.setValue(Constants.USE_INTERNAL, false);
+			}
+			// user selected folder does not contain atool.exe
+			// ask confirmation to use this folder anyway
+			else {
+				boolean ret = Util
+						.openConfirmationDialog(Constants.CONFIRM_DIR_DOES_NOT_CONTAIN_ATOOL);
+				if (ret) {
+
+					store.setValue(Constants.ATOOL_FOLDER, atoolFolder);
+					store.setValue(Constants.USER_SELECTED_FOLDER, atoolFolder);
+					store.setValue(Constants.USE_INTERNAL, false);
+				} else {
+					return false;
+				}
+			}
+
+			// store logging mode
+			if (askButton.getSelection()) {
+				store.setValue(Constants.LOGGING_MODE,
+						Constants.LOGGING_ASK_ALLWAYS);
+			} else if (s60Button.getSelection()) {
+				store.setValue(Constants.LOGGING_MODE, Constants.LOGGING_S60);
+			} else if( externalFastButton.getSelection() ) {
+				store.setValue(Constants.LOGGING_MODE, Constants.LOGGING_EXT_FAST);
+			} else {
+				store.setValue(Constants.LOGGING_MODE, Constants.LOGGING_EXT);
+			}
+
+			// store log file option
+			if (userButton.getSelection()) {
+				store.setValue(Constants.S60_LOG_FILE_MODE,
+						Constants.LOGGING_S60_USER_SPECIFIED);
+			} else {
+				store.setValue(Constants.S60_LOG_FILE_MODE,
+						Constants.LOGGING_S60_PROCESS_NAME);
+			}
+
+			// store value of verbose atool.exe output
+			store.setValue(Constants.ATOOL_VERBOSE, verboseButton.getSelection());
+
+			// update preference value
+			// this values is used later when UI creates/update toolbar options and when building project with "ask always" option
+			if( externalFastButton.isEnabled() ) {
+				store.setValue(Constants.LOGGING_FAST_ENABLED, true);
+			}
+			else {
+				store.setValue(Constants.LOGGING_FAST_ENABLED, false);
+			}
+			// store.setValue(Constants.CREATE_STATISTIC,
+			// generateStatistic.getSelection());
+
+			// get callstack size
+			int size = 0;
+			boolean userDefinedCSSize = false;
+			if (zeroButton.getSelection() && zeroButton.isEnabled()) {
+				userDefinedCSSize = true;
+			} else if (fortyButton.getSelection() && fortyButton.isEnabled()) {
+				size = 40;
+				userDefinedCSSize = true;
+			} else if (hundredButton.getSelection() && hundredButton.isEnabled()) {
+				size = 100;
+				userDefinedCSSize = true;
+			} else if (customButton.getSelection() && customButton.isEnabled()) {
+				size = spinner.getSelection();
+				userDefinedCSSize = true;
+			}
+
+			// store callstack size
+			store.setValue(Constants.USE_CALLSTACK_SIZE, userDefinedCSSize);
+			store.setValue(Constants.CALLSTACK_SIZE, size);
+
+			// update view with new settings
+			IActionListener listener = Activator.getActionListener();
+			if (listener != null) {
+				listener.preferenceChanged();
+			}
+		//}
+		
+		// store report detail level prefs
+		return super.performOk();
+	}
+
+	/**
+	 * Sets S60 file options visible.
+	 *
+	 * @param enabled
+	 *            Is buttons enabled.
+	 */
+	private void setFileModeEnabled(final boolean enabled) {
+		processButton.setEnabled(enabled);
+		userButton.setEnabled(enabled);
+	}
+
+	/**
+	 * Changes logging mode buttons.
+	 *
+	 * @param mode
+	 *            Which mode is used
+	 */
+	private void setGroupButtons(final String mode) {
+		if (mode.equals(Constants.LOGGING_S60)) {
+			externalButton.setSelection(false);
+			externalFastButton.setSelection(false);
+			s60Button.setSelection(true);
+			askButton.setSelection(false);
+			setFileModeEnabled(true);
+		} else if (mode.equals(Constants.LOGGING_ASK_ALLWAYS)) {
+			externalButton.setSelection(false);
+			externalFastButton.setSelection(false);
+			s60Button.setSelection(false);
+			askButton.setSelection(true);
+			setFileModeEnabled(false);
+		} else if( mode.equals(Constants.LOGGING_EXT_FAST)) {
+			externalButton.setSelection(false);
+			externalFastButton.setSelection(true);
+			s60Button.setSelection(false);
+			askButton.setSelection(false);
+			setFileModeEnabled(false);
+		} else {
+			externalButton.setSelection(true);
+			externalFastButton.setSelection(false);
+			s60Button.setSelection(false);
+			askButton.setSelection(false);
+			setFileModeEnabled(false);
+		}
+	}
+
+	/**
+	 * Update atool.exe version number.
+	 *
+	 * @param path
+	 *            Atool.exe location
+	 */
+	private void updateAtoolVersion(final String path) {
+		atoolVerLabel.setText(Util.getAtoolVersionNumber(path));
+		atoolVerLabel.update();
+		updateCSGroup(path);
+	}
+
+	/**
+	 * Checks what version of command line is used, if the version is 1.7.4 or
+	 * higher enables callstack size selection otherwise disables callstack size
+	 * selection.
+	 *
+	 * @param path
+	 *            Command line engine path
+	 */
+	private void updateCSGroup(final String path) {
+		int compared = Constants.VERSION_NUMBERS_INVALID;
+
+		// compare version numbers
+		compared = Util.compareVersionNumber(Constants.CS_SUPPORT_MIN_VERSION,
+				Util.getAtoolVersionNumber(path));
+
+		// if used command line version is 1.7.4 or higher enable callstack size
+		// selection
+		if (compared == Constants.VERSION_NUMBERS_SECOND
+				|| compared == Constants.VERSION_NUMBERS_EQUALS) {
+			zeroButton.setEnabled(true);
+			fortyButton.setEnabled(true);
+			hundredButton.setEnabled(true);
+			customButton.setEnabled(true);
+			spinner.setEnabled(true);
+			csSizeGroup.setToolTipText("");
+			externalFastButton.setEnabled(true);
+			externalFastButton.setToolTipText("");
+		} else {
+			zeroButton.setEnabled(false);
+			fortyButton.setEnabled(false);
+			hundredButton.setEnabled(false);
+			customButton.setEnabled(false);
+			spinner.setEnabled(false);
+			csSizeGroup
+					.setToolTipText(Constants.PREFS_CS_SIZE_DISABLED_TOOLTIP);
+
+			if( externalFastButton.getSelection() ) {
+				externalButton.setSelection(true);
+			}
+			externalFastButton.setSelection(false);
+			externalFastButton.setEnabled(false);
+			externalFastButton.setToolTipText(Constants.PREFS_CS_SIZE_DISABLED_TOOLTIP);
+
+
+		}
+
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/preferences/PreferenceInitializer.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,52 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Definitions for the class PreferenceInitializer
+*
+*/
+
+
+
+package com.nokia.s60tools.analyzetool.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Class to initialize default preference values.
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/*
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	@Override
+	public void initializeDefaultPreferences() {
+
+		IPreferenceStore store = Activator.getPreferences();
+
+		store.setDefault(Constants.LOGGING_MODE, Constants.LOGGING_EXT);
+		store.setDefault(Constants.REPORT_LEVEL, Constants.REPORT_KNOWN);
+		store.setDefault(Constants.USE_INTERNAL, false);
+		store.setDefault(Constants.ATOOL_FOLDER, Constants.DEFAULT_ATOOL_FOLDER);
+		store.setDefault(Constants.USER_SELECTED_FOLDER, Constants.DEFAULT_ATOOL_FOLDER);
+		store.setDefault(Constants.CREATE_STATISTIC, false);
+		store.setDefault(Constants.USE_ROM_SYMBOL, false);
+		store.setDefault(Constants.CALLSTACK_SIZE, 40);
+		store.setDefault(Constants.LOGGING_FAST_ENABLED, false);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/properties/PropertiesPage.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class PropertiesPage
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.properties;
+
+import org.eclipse.cdt.internal.core.model.CProject;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Implements AnalyzeTool properties page
+ * 
+ * @author kihe
+ * 
+ */
+@SuppressWarnings("restriction")
+public class PropertiesPage extends PropertyPage implements Listener {
+	/** Add button to open file selection dialog. */
+	private Button addSymbolFile;
+
+	/** Remove button to remove items from the list. */
+	private Button removeSymbolFile;
+
+	/** Rom symbol file. */
+	private List romSymbolDirText;
+
+	QualifiedName romSymbols;
+
+	QualifiedName useRom;
+	/**
+	 * Button to use default rom symbol file.
+	 */
+	private Button useRomSymbol;
+
+	/**
+	 * Constructor.
+	 */
+	public PropertiesPage() {
+		super();
+		useRom = new QualifiedName(Constants.USE_ROM_SYMBOL, Constants.USE_ROM);
+		romSymbols = new QualifiedName(Constants.USE_ROM_SYMBOL_LOCATION,
+				Constants.ROM_LOC);
+	}
+
+	/**
+	 * Checks that is selected symbol already in the list. If symbol file is not
+	 * added => add it to list
+	 * 
+	 * @param selectedFile
+	 *            Select symbol file name and location
+	 */
+	private void checkGivenSymbolFile(String selectedFile) {
+		String[] items = romSymbolDirText.getItems();
+		boolean found = false;
+		for (int i = 0; i < items.length; i++) {
+			if (items[i].equals(selectedFile)) {
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			romSymbolDirText.add(selectedFile);
+		}
+	}
+
+	/**
+	 * Updates this preference page values to match stored values
+	 */
+	private final void checkInitValues() {
+		try {
+			IProject project = getProject();
+			if (project == null) {
+				useRomSymbol.setEnabled(false);
+				romSymbolDirText.setEnabled(false);
+				return;
+			}
+
+			String useRomSymbolProperty = project.getPersistentProperty(useRom);
+			if (useRomSymbolProperty == null
+					|| useRomSymbolProperty.equalsIgnoreCase("false")) {
+				useRomSymbol.setSelection(false);
+			} else {
+				useRomSymbol.setSelection(true);
+			}
+
+			// get defined rom symbol(s)
+			// if user has definend more than one rom symbol
+			// parse those symbol files and add to list
+			// each symbol file name is divided by ";" char
+			// e.g. c:\temp\symbol.symbol;c:\temp\secondsymbol.symbol
+			String symbolLoc = project.getPersistentProperty(romSymbols);
+			if (symbolLoc != null && !("").equals(symbolLoc)) {
+				String[] split = symbolLoc.split(";");
+				if (split != null) {
+					for (int i = 0; i < split.length; i++) {
+						romSymbolDirText.add(split[i]);
+					}
+				}
+			}
+			handleRomSymbolState();
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Creates this preference page content.
+	 * 
+	 * @param parent
+	 *            This preference page parent
+	 */
+	@Override
+	protected final Control createContents(final Composite parent) {
+
+		// create new composite
+		final Composite composite = new Composite(parent, SWT.TOP);
+
+		// create griddata for view
+		final GridData gridData = new GridData();
+		composite.setLayoutData(gridData);
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.horizontalSpacing = 0;
+		gridLayout.verticalSpacing = 0;
+		gridLayout.marginWidth = 0;
+		gridLayout.marginHeight = 0;
+		gridLayout.numColumns = 1;
+
+		// set layoyt of this view
+		composite.setLayout(gridLayout);
+
+		// new group for symbol file definition
+		final Group groupUseRomSymbol = new Group(composite, SWT.NONE);
+		groupUseRomSymbol.setText(Constants.PREFS_ADVANCED);
+
+		// layout for useRomSymbol button
+		final GridLayout layoutSymbol = new GridLayout();
+		layoutSymbol.numColumns = 1;
+		groupUseRomSymbol.setLayout(layoutSymbol);
+
+		// checkbox item to enable rom symbol selection
+		useRomSymbol = new Button(groupUseRomSymbol, SWT.CHECK);
+		useRomSymbol.setText(Constants.PREFS_USE_ROM_SYMBOL);
+		useRomSymbol.addListener(SWT.Selection, this);
+
+		// grid data for use useRomSymbol
+		final GridData gridDataAtool = new GridData();
+		gridDataAtool.horizontalSpan = 3;
+		groupUseRomSymbol.setLayoutData(gridDataAtool);
+
+		// new composite for rom symbol location
+		final Composite romSymbolLocation = new Composite(groupUseRomSymbol,
+				SWT.TOP);
+
+		// romSymbolLocation layout
+		final GridLayout dirSettingsLayout = new GridLayout();
+		dirSettingsLayout.numColumns = 2;
+		romSymbolLocation.setLayout(dirSettingsLayout);
+
+		// grid data for romSymbolLocation
+		final GridData dirGridData = new GridData();
+		dirGridData.horizontalSpan = 3;
+		romSymbolLocation.setLayoutData(dirGridData);
+
+		// new composite for symbol file list
+		Composite listComposite = new Composite(romSymbolLocation, SWT.NULL);
+		GridLayout listCompLayout = new GridLayout();
+		listCompLayout.numColumns = 1;
+		listComposite.setLayout(listCompLayout);
+
+		GridData listData = new GridData(250, SWT.DEFAULT);
+		listData.minimumHeight = 350;
+		listData.heightHint = 150;
+		romSymbolDirText = new List(listComposite, SWT.BORDER | SWT.V_SCROLL
+				| SWT.H_SCROLL);
+		romSymbolDirText.setLayoutData(listData);
+
+		Composite buttonComposite = new Composite(romSymbolLocation, SWT.SIMPLE);
+		GridLayout buttonLayoyt = new GridLayout();
+		buttonLayoyt.numColumns = 1;
+		buttonComposite.setLayout(buttonLayoyt);
+
+		GridData buttonGridData = new GridData();
+		buttonGridData.horizontalAlignment = SWT.FILL;
+		buttonGridData.grabExcessVerticalSpace = true;
+
+		// button which opens the folder selection dialog
+		addSymbolFile = new Button(buttonComposite, SWT.NONE);
+		addSymbolFile.setToolTipText(Constants.PREFS_SELECT_ROM_SYMBOL);
+		addSymbolFile.setText("Add");
+		addSymbolFile.setLayoutData(buttonGridData);
+		addSymbolFile.addListener(SWT.Selection, this);
+
+		removeSymbolFile = new Button(buttonComposite, SWT.NONE);
+		removeSymbolFile.setToolTipText(Constants.PREFS_SELECT_ROM_SYMBOL);
+		removeSymbolFile.setText("Remove");
+		removeSymbolFile.setLayoutData(buttonGridData);
+		removeSymbolFile.addListener(SWT.Selection, this);
+
+		// UI elements are created => adjust right values
+		checkInitValues();
+		return composite;
+	}
+
+	/**
+	 * Returns selected project reference
+	 * 
+	 * @return Project reference
+	 */
+	private IProject getProject() {
+		// get project
+		
+		IAdaptable adap = super.getElement();
+		
+		IProject project = null;
+		if( adap instanceof IProject ) {
+			project = (IProject)adap;
+		}
+		else if( adap instanceof CProject ) {
+			CProject cproj = (CProject)adap;
+			project = cproj.getProject();
+		}
+			
+		if (project != null && project.exists() && project.isOpen()) {
+			return project;
+		}
+		return null;
+	}
+
+	/**
+	 * Handles events.
+	 * 
+	 * @param event
+	 *            Preference page event
+	 */
+	public final void handleEvent(final Event event) {
+		if (event.widget == addSymbolFile) {
+			openFolderDialog();
+		} else if (event.widget == useRomSymbol) {
+			handleRomSymbolState();
+		} else if (event.widget == removeSymbolFile) {
+			romSymbolDirText.remove(romSymbolDirText.getSelectionIndex());
+		}
+	}
+
+	/**
+	 * Updates rom symbol file selection state
+	 */
+	private final void handleRomSymbolState() {
+		if (useRomSymbol.getSelection()) {
+			romSymbolDirText.setEnabled(true);
+			addSymbolFile.setEnabled(true);
+			removeSymbolFile.setEnabled(true);
+		} else {
+			romSymbolDirText.setEnabled(false);
+			addSymbolFile.setEnabled(false);
+			removeSymbolFile.setEnabled(false);
+		}
+	}
+
+	/**
+	 * Opens file selection dialog.
+	 */
+	private final void openFolderDialog() {
+		final FileDialog fileDialog = new FileDialog(romSymbolDirText
+				.getShell(), SWT.MULTI);
+		fileDialog.setText(Constants.PREFS_SELECT_ROM_SYMBOL);
+		String[] extensions = { "*.symbol", "*.*" };
+		fileDialog.setFilterExtensions(extensions);
+		final String fileLocation = fileDialog.open();
+		String[] fileNames = fileDialog.getFileNames();
+
+		// if user has pressed "cancel"
+		if (fileLocation == null || ("").equals(fileLocation)) {
+			return;
+		}
+		// if user has selected only one file
+		else if (fileNames != null && fileNames.length == 1) {
+			checkGivenSymbolFile(fileLocation);
+		}
+		// user has selected multiple file
+		else if (fileNames != null && fileNames.length > 1) {
+
+			// get selected folder.
+			String folder = fileDialog.getFilterPath();
+
+			// go thru selected items
+			for (int i = 0; i < fileNames.length; i++) {
+				// get one selected file
+				String fileName = fileNames[i];
+
+				// check selected file
+				checkGivenSymbolFile(folder + "\\" + fileName);
+			}
+		}
+	}
+
+	/**
+	 * Stores selected values When user press "Ok" or "apply" button this method
+	 * is called
+	 */
+	@Override
+	public final boolean performOk() {
+		try {
+
+			// get selected project
+			IProject project = getProject();
+			if (project == null) {
+				return false;
+			}
+
+			// get useRomSymbel selection
+			if (useRomSymbol.getSelection()) {
+				project.setPersistentProperty(useRom, "true");
+
+			} else {
+				project.setPersistentProperty(useRom, "false");
+			}
+
+			// store user defined rom symbols
+			// divided by ";" char
+			StringBuffer symbolFiles = new StringBuffer();
+			String[] items = romSymbolDirText.getItems();
+			for (int i = 0; i < items.length; i++) {
+				symbolFiles.append(items[i]);
+				symbolFiles.append(';');
+			}
+
+			// store symbol files
+			project.setPersistentProperty(romSymbols, symbolFiles.toString());
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		}
+		return super.performOk();
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ATResourceListener.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ATResourceListener
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
+
+import com.nokia.s60tools.analyzetool.Activator;
+
+/**
+ * Listens projec changes
+ * @author kihe
+ *
+ */
+public class ATResourceListener implements IResourceChangeListener{
+
+	/**
+	 * Listens workspace resource changes.
+	 * If resource is BuildComplete file => notifies AT UI that module build state is changed
+	 *
+	 * @param event Resource changed event
+	 */
+	public void resourceChanged(IResourceChangeEvent event) {
+		try {
+
+			//if event type is change
+			if( event.getType() == IResourceChangeEvent.POST_CHANGE ) {
+
+				//get delta
+				IResourceDelta delta = event.getDelta();
+
+				//
+				if(delta != null ) {
+
+					//add new IResourceDeltaVisitor for delta
+					//now we can thru all the changed files
+					delta.accept( new IResourceDeltaVisitor() {
+						boolean updateView = true;
+
+
+						public boolean visit(IResourceDelta newDelta) {
+
+							//we are only interested in new files
+							if(newDelta.getKind() != IResourceDelta.ADDED ) {
+								return true;
+							}
+
+							//get resource
+							IResource res = newDelta.getResource();
+
+							//resource if BuildComplete file
+							if( res.getName().equalsIgnoreCase("BuildComplete")) {
+
+								//notify AT UI that module build state is changed
+								IActionListener listener = Activator.getActionListener();
+								if( listener != null && updateView && res.getProject() != null ) {
+									listener.buildStateChanged(res.getProject());
+									updateView = false;
+								}
+							}
+
+							return true;
+						}
+					}
+					);
+				}
+			}
+		}catch(CoreException ce) {
+			ce.printStackTrace();
+		}
+
+
+
+	}
+
+
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ActiveSubtests.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ActiveSubtests
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+/**
+ * Holds information of one active subtest.
+ *
+ * @author kihe
+ *
+ */
+public class ActiveSubtests {
+
+	/** Active subtest name. */
+	private final String name;
+
+	/** Subtest target name. */
+	private final String targetName;
+
+	/** Subtest process id. */
+	private final int processID;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param subTestName
+	 *            Subtest name
+	 * @param subTestTargetName
+	 *            Subtest target name
+	 * @param newProcessID
+	 *            Subtest process id
+	 */
+	public ActiveSubtests(final String subTestName, final String subTestTargetName,
+			final int newProcessID) {
+		name = subTestName;
+		targetName = subTestTargetName;
+		processID = newProcessID;
+	}
+
+	/**
+	 * Gets active subtest name.
+	 *
+	 * @return Subtest name
+	 */
+	public final String getName() {
+		return name;
+	}
+
+	/**
+	 * Gets active subtest process id.
+	 *
+	 * @return Process id
+	 */
+	public final String getProcessID() {
+		return Integer.toString(processID ,16);
+	}
+
+	/**
+	 * Gets active subtest target name.
+	 *
+	 * @return Target name
+	 */
+	public final String getTargetName() {
+		return targetName;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/CustomInputDialog.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CustomInputDialog
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.window.Window;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Provides input dialog Checks that user input does not contain spaces.
+ *
+ * @author kihe
+ *
+ */
+public class CustomInputDialog implements IInputValidator {
+	/** Dialog default value. */
+	private final String defaultValue;
+
+	/** Dialog hint text. */
+	private final String dialogHintText;
+
+	/** Dialog title. */
+	private final String dialogTitle;
+
+	/** User input. */
+	private String input = "";
+
+	/**
+	 * Constructor.
+	 *
+	 * @param title
+	 *            Dialog title
+	 * @param hintText
+	 *            Dialog hint text
+	 * @param defaultVal
+	 *            Dialog default input
+	 */
+	public CustomInputDialog(final String title, final String hintText,
+			final String defaultVal) {
+		dialogTitle = title;
+		dialogHintText = hintText;
+		defaultValue = defaultVal;
+	}
+
+	/**
+	 * Checks that user entered text does not contain illegal/unwanted
+	 * characters.
+	 *
+	 * @param line
+	 *            User entered text
+	 * @return True if user entered text does not contain illegal characters
+	 *         otherwise False
+	 */
+	public boolean checkCharacters(final String line) {
+
+		CharSequence[] charTable = { "&", "^", "+", "-", "@", "$", "%", "*",
+				"(", ")", "|", "\\", "/", "[", "]", "{", "}", "<", ">", "?",
+				";", ":", ",", "\"", "'" };
+
+		// thru illegal/unwanted char table
+		for (int i = 0; i < charTable.length; i++) {
+
+			// if user entered text contains illegal/unwanted characters =>
+			// return false
+			if (line.contains(charTable[i])) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Gets self instance.
+	 *
+	 * @return Self instance
+	 */
+	public final CustomInputDialog getParent() {
+		return this;
+	}
+
+	/**
+	 * Returns user input.
+	 *
+	 * @return User input
+	 */
+	public final String getUserInput() {
+		return input;
+	}
+
+	/**
+	 * Checks is user given input valid for the AnalyzeTool. If input contains
+	 * space/illegal character(s) or it contains more than 50 characters the OK
+	 * button becomes disabled and corresponding error message is displayed.
+	 *
+	 * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
+	 *
+	 * @param newText
+	 *            User input
+	 *
+	 * @return String Error message if the user given input is invalid otherwise
+	 *         empty string
+	 */
+	public final String isValid(final String newText) {
+
+		CharSequence space = " ";
+		if (("").equals(newText)) {
+			return ("");
+		} else if (newText.contains(space)) {
+			return (Constants.INPUT_NO_SPACES_ALLOWED);
+		} else if (newText.length() > Constants.MAX_LENGTH_OF_USER_INPUT) {
+			return (Constants.INPUT_TOO_LONG);
+		} else if (!checkCharacters(newText)) {
+			return (Constants.INPUT_ILLEGAL);
+		}
+		return null;
+	}
+
+	/**
+	 * Opens dialog
+	 */
+	public final void open() {
+
+		Activator.getDefault().getWorkbench().getDisplay().syncExec(
+				new Runnable() {
+					public void run() {
+						InputDialog dlg = new InputDialog(Activator
+								.getDefault().getWorkbench().getDisplay()
+								.getActiveShell(), dialogTitle, dialogHintText,
+								defaultValue, getParent());
+						if (dlg.open() == Window.OK) {
+							input = dlg.getValue();
+						}
+					}
+				});
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/IActionListener.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ActionListener
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import org.eclipse.core.resources.IProject;
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Notifies when preferences is changed or action must execute.
+ *
+ * @author kihe
+ *
+ */
+public interface IActionListener {
+
+	/**
+	 * Informs when all the modules are built with AnalyzeTool.
+	 *
+	 * @param projRef
+	 *            Project reference
+	 */
+	void buildStateChanged(IProject projRef);
+
+
+	/**
+	 * Disables or enables trace related actions If Tracing utility plugin could not
+	 * loaded the trace actions are disable at plugin startup.
+	 *
+	 * @param disable
+	 *            Boolean
+	 */
+	void disableTraceActions(boolean disable);
+
+	/**
+	 * Notifies when preference values are changed.
+	 */
+	void preferenceChanged();
+
+	/**
+	 * Notifies when action must execute.
+	 *
+	 * @param project
+	 *            Project reference
+	 *
+	 * @param action
+	 *            Action to execute
+	 */
+	void runAction(org.eclipse.core.resources.IProject project,
+			Constants.ACTIONS action);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/MainView.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,3283 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class MainView
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import java.io.FileInputStream;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.ViewPart;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.AnalyzeToolHelpContextIDs;
+import com.nokia.s60tools.analyzetool.builder.BuilderUtil;
+import com.nokia.s60tools.analyzetool.engine.AnalysisItem;
+import com.nokia.s60tools.analyzetool.engine.AnalyzeFactory;
+import com.nokia.s60tools.analyzetool.engine.CallstackItem;
+import com.nokia.s60tools.analyzetool.engine.EpocReader;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.MMPInfo;
+import com.nokia.s60tools.analyzetool.engine.ParseAnalyzeData;
+import com.nokia.s60tools.analyzetool.engine.ParseXMLFileSAX;
+import com.nokia.s60tools.analyzetool.engine.ProjectResults;
+import com.nokia.s60tools.analyzetool.engine.RunResults;
+import com.nokia.s60tools.analyzetool.engine.UseAtool;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.ReadFile;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.internal.ui.graph.ChartContainer;
+import com.nokia.s60tools.analyzetool.ui.actions.DropDownMenu;
+import com.nokia.s60tools.analyzetool.ui.actions.FileActionHistory;
+import com.nokia.s60tools.analyzetool.ui.statistic.StatisticView;
+
+/**
+ * Class to display memory analysis results also provides all the
+ * functionalities what AnalyzeTool has.
+ *
+ * @author kihe
+ *
+ */
+public class MainView extends ViewPart implements ISelectionListener,
+		ITreeViewerListener, IActionListener, ISelectionChangedListener, KeyListener {
+
+	/**
+	 * Sorts tree view objects.
+	 *
+	 * @author kihe
+	 */
+	public static class NameSorter extends ViewerSorter {
+
+		/**
+		 * Compares view items.
+		 *
+		 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
+		 *      java.lang.Object, java.lang.Object)
+		 *
+		 * @param viewer
+		 *            Viewer
+		 * @param e1
+		 *            Object
+		 * @param e2
+		 *            Object
+		 * @return int Always return 0
+		 */
+		@Override
+		public int compare(final Viewer viewer, final Object e1, final Object e2) {
+			return 0;
+		}
+	}
+
+	/**
+	 * The content provider class is responsible for providing objects to the
+	 * view. It can wrap existing objects in adapters or simply return objects
+	 * as-is. These objects may be sensitive to the current input of the view,
+	 * or ignore it and always show the same content (like Task List, for
+	 * example).
+	 */
+	class ViewContentProvider implements ITreeContentProvider {
+
+		/**
+		 *
+		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+		 */
+		public void dispose() {
+			// MethodDeclaration/Block[count(BlockStatement) = 0 and
+			// @containsComment = 'false']
+		}
+
+		/**
+		 *
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+		 */
+		public Object[] getChildren(Object parent) {
+			if (parent instanceof TreeParent) {
+				return ((TreeParent) parent).getChildren();
+			}
+			return new Object[0];
+		}
+
+		/*
+		 * (non-Javadoc)
+		 *
+		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+		 */
+		public Object[] getElements(Object parent) {
+			if (parent.equals(getViewSite())) {
+				if (invisibleRoot == null) {
+					getStartupContent();
+				}
+				return getChildren(invisibleRoot);
+			}
+			return getChildren(parent);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 *
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+		 */
+		public Object getParent(Object child) {
+			if (child instanceof TreeObject) {
+				return ((TreeObject) child).getParent();
+			}
+			return null;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 *
+		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+		 */
+		public boolean hasChildren(Object parent) {
+			if (parent instanceof TreeParent) {
+				return ((TreeParent) parent).hasChildren();
+			}
+			return false;
+		}
+
+		/*
+		 * (non-Javadoc)
+		 *
+		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
+		 *      java.lang.Object, java.lang.Object)
+		 */
+		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+			// MethodDeclaration/Block[count(BlockStatement) = 0 and
+			// @containsComment = 'false']
+		}
+
+	}
+
+	/**
+	 * Provides elements of tree view.
+	 *
+	 * @author kihe
+	 *
+	 */
+	public class ViewLabelProvider extends LabelProvider {
+
+		/**
+		 * Used when tree model item is TreeParent.
+		 */
+		private final Image folder;
+
+		/**
+		 * Default element only used to show error situations.
+		 */
+		private final Image element;
+
+		/**
+		 * Used when tree model item is part of the module which is build with
+		 * AnalyzeTool.
+		 */
+		private final Image build;
+
+		/**
+		 * Used when tree model item is part of the project but not build with
+		 * with AnalyzeTool.
+		 */
+		private final Image notBuild;
+
+		/**
+		 * Used when tree model item is outside of the project modules.
+		 */
+		public Image outside;
+
+		/**
+		 * Constructor. Created all the images which is used in the AnalyzeTool
+		 * tree model.
+		 */
+		public ViewLabelProvider() {
+			// create images
+			folder = PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJ_FOLDER);
+			element = PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJ_ELEMENT);
+			build = Activator.getImageDescriptor(Constants.ICON_BUILD)
+					.createImage();
+			notBuild = Activator.getImageDescriptor(Constants.ICON_NOT_BUILD)
+					.createImage();
+			outside = Activator.getImageDescriptor(Constants.ICON_OUTSIDE)
+					.createImage();
+		}
+
+		/**
+		 * Gets current tree object image.
+		 *
+		 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+		 *
+		 * @param obj
+		 *            Current tree model item
+		 * @return Corresponding image of tree view object
+		 */
+		@Override
+		public Image getImage(final Object obj) {
+
+			// if object is TreeParent return "folder" icon
+			if (obj instanceof TreeParent) {
+				return folder;
+			}
+
+			// if object is TreeObject, need to change icon to match object
+			// state
+			else if (obj instanceof TreeObject) {
+				// get TreeObject
+				TreeObject tempObject = (TreeObject) obj;
+
+				// change object icon if module belongs to selected project
+				if (tempObject.isBelongs()) {
+					// if module is built with AnalyzeTool
+					if (tempObject.isBuild()) {
+						return build;
+					}
+					// module not build with AnalyzeTool
+					return notBuild;
+				}
+				// module not belong to selected project
+				return outside;
+			}
+
+			return element;
+		}
+
+		/**
+		 * Gets current tree view object name.
+		 *
+		 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+		 *
+		 * @return Current tree view object name
+		 */
+		@Override
+		public final String getText(final Object obj) {
+			return obj.toString();
+		}
+	}
+
+	/** Is trace actions enabled. */
+	public static boolean enableTrace;
+
+	/** Title of the AnalyzeTool view */
+	private String viewTitle = Constants.ANALYZE_TOOL_TITLE;
+
+	/** Line feed character. */
+	private static String lineFeed = "\n";
+
+	/** Contains information of test runs. */
+	public TreeViewer runView;
+
+	/** Contains one memory leak call stack addresses. */
+	private TreeViewer callstackView;
+
+	/** Tree parent object which not shown to user. */
+	private TreeParent invisibleRoot;
+
+	/** Double click action. */
+	private Action doubleClickAction;
+	/** Click action. */
+	private Action clickAction;
+	/** Change detail level action. */
+	public Action changeDetails;
+	/** Select S60 log file action. */
+	private Action s60LogTargetAction;
+	/** Select Tracing utility connection action. */
+	private Action externalLogTargetAction;
+	/** Select fast data gathering mode */
+	private Action externalFastLogTargetAction;
+	/** Select Ask always action. */
+	private Action askLogTargetAction;
+	/** Save report file action. */
+	private Action saveReportAction;
+	/** Save test run action. */
+	private Action saveDataFileAction;
+	/** AnalyzeTool results action. */
+	private Action analyzeResults;
+	/** Activate AnalyzeTool build action. */
+	public Action buildWithAtool;
+	/** Clean AnalyzeTool changes action. */
+	private Action cleanAtoolChanges;
+	/** Start/Stop trace action. */
+	public Action traceAction;
+	/** Start subtest action. */
+	private Action startSubtest;
+	/** Stop subtest action. */
+	private Action stopSubtest;
+	/**Refresh(re-creates) project results*/
+	private Action refreshResults;
+	/**Copies selected memory leak item info to the clipboard.*/
+	private Action copyAction;
+	/** Action to open AnalyzeTool preference page.*/
+	private Action openPrefs;
+	/**
+	 * Clears selected project results without removing temporary files
+	 */
+	private Action clearProjectResults;
+
+	/** Selected project reference. */
+	public IProject project;
+
+	/** Previously select project reference. */
+	public IProject lastProjectRef;
+
+	/** Project reference for active trace. */
+	private IProject traceStartedProjectRef;
+
+	/** Contains detailed information of selected run or memory leak. */
+	public Label informationLabel;
+
+	/** Memory analysis parser. */
+	public ParseAnalyzeData parser;
+
+	/** Used data file. */
+	public String usedDataFileName = null;
+
+	/** Is trace active. */
+	private boolean traceActive = false;
+
+	/** Last active memory leak tree item. */
+	private TreeObject activeTreeItem;
+
+	/** Contains workbench (all project) related cpp file info. */
+	private final AbstractList<String> cppFileNames;
+
+	/** Contains started subtest information. */
+	private final AbstractList<ActiveSubtests> startedSubtest;
+
+	/** Contains project related module results. */
+	private final ProjectResults projectResults;
+
+	/** Job for analyzing data files. */
+	private Job analyzeJob;
+
+	/** Last selected tree item. */
+	private Object lastSelectedObject;
+
+	/** Contains information of which files is opened. */
+	public FileActionHistory fileOpenHistory;
+
+	/** File open drop down menu. */
+	private DropDownMenu fileOpenMenu;
+
+	/** Log target action drop down menu. */
+	private DropDownMenu logTargetMenu;
+
+	/** Save file drop down menu. */
+	private DropDownMenu saveFileMenu;
+
+	/** Tab item for the "Top allocation locations" tab */
+	CTabItem memoryTab;
+
+	/** Tab item for the memory results tab*/
+	CTabItem mainTab;
+
+	/** StatisticView reference */
+	StatisticView statisticView;
+
+	/** Contains project related modules */
+	private final Hashtable<IProject, AbstractList<MMPInfo>> projectModules;
+
+	/**Reads epocwind.out file*/
+	EpocReader listeningJob;
+	
+	/** The chart view composite */
+	protected ChartContainer chart;
+
+
+	/**
+	 * The constructor.
+	 */
+	public MainView() {
+		parser = new ParseAnalyzeData(true, false);
+		cppFileNames = new ArrayList<String>();
+		startedSubtest = new ArrayList<ActiveSubtests>();
+		projectResults = new ProjectResults();
+		fileOpenHistory = new FileActionHistory(Constants.HISTORY_LEVEL);
+		projectModules = new Hashtable<IProject, AbstractList<MMPInfo>>();
+	}
+
+	/**
+	 * Activates AnalyzeTool custom build if it is not activated.
+	 */
+	public final void activateAnalysisBuild() {
+		// check project validity
+		if (checkProjectValidity()) {
+			// add AnalyzeTool custom builder natures to project build nature
+			BuilderUtil bUtil = new BuilderUtil();
+			if (bUtil.isNatureEnabled(project)) {
+				bUtil.disableNatures(project);
+			} else {
+				bUtil.enableNatures(project);
+			}
+
+		}
+
+		// update build state
+		updateBuildState(project);
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see com.nokia.s60tools.analyzetool.ui.IActionListener#allModulesBuilt()
+	 */
+	public final void buildStateChanged(final IProject projRef) {
+
+		//check validity
+		if(!project.equals(projRef) || projectResults == null) {
+			return;
+		}
+
+
+		final String datafile = projectResults.getDataFileName(projRef);
+
+		// if trace is captured or data file is opened
+		if (datafile != null && runView != null) {
+
+			// need to check is data file available in the disk
+			FileInputStream fis = null;
+			try {
+
+				// get existing file stream
+				fis = new FileInputStream(datafile);
+
+				// if file is empty => do nothing
+				if (fis.available() == 0) {
+					return;
+				}
+			} catch (java.io.FileNotFoundException fnfe) {
+				fnfe.printStackTrace();
+				return;
+			} catch (java.io.IOException ioe) {
+				ioe.printStackTrace();
+				return;
+			} finally { // finally close input stream
+				try {
+					if (fis != null) {
+						fis.close();
+						fis = null;
+					}
+				} catch (java.io.IOException ioe) {
+					ioe.printStackTrace();
+				}
+			}
+
+
+			//data file is available
+			int dataFileType = UseAtool.checkFileType(datafile);
+
+			if( dataFileType == Constants.DATAFILE_INVALID || dataFileType == Constants.DATAFILE_XML || dataFileType == Constants.DATAFILE_EMPTY ) {
+				return;
+			}
+			boolean reGenerate = Util.openConfirmationDialog(Constants.BUILD_STATE_CHANGED);
+
+			if( reGenerate ) {
+				// sync with UI thread
+				runView.getControl().getDisplay().asyncExec(new Runnable() {
+					public void run() {
+						analyzeDataFile(Constants.ANALYZE_USE_DATA_FILE, datafile,
+								false);
+					}
+				});
+			}
+
+		}
+	}
+
+
+	/**
+	 * Opens file dialog and analyzing data file for given location.
+	 *
+	 * @param type
+	 *            Type to define is data file asked from the user or using the
+	 *            give data file
+	 * @param existingDataFile
+	 *            Data file path
+	 * @param showErrorInfo
+	 *            Flag to determinate that displaying error info or not
+	 */
+	public final void analyzeDataFile(final int type,
+			final String existingDataFile, final boolean showErrorInfo) {
+
+		// is project selected
+		if (!checkProjectValidity()) {
+			return;
+		}
+
+		// user selected file
+		final String selectedFile;
+
+		// ask for user data file
+		if (type == Constants.ANALYZE_ASK_FOR_USER) {
+			selectedFile = Util.openFileDialog(getSite().getShell(),
+					Constants.DIALOG_SELECT_DATA_FILE, project.getLocation()
+							.toOSString());
+		} else if (existingDataFile == null) {
+			selectedFile = parser.getDataFileName();
+		} else {
+			selectedFile = existingDataFile;
+		}
+
+		// if user select some file
+		if (selectedFile != null) {
+
+			// clear previous data
+			projectResults.clearProjectData(project);
+			activeTreeItem = null;
+			clearCallstackViewContent();
+			updateInformationLabel("");
+			runView.setInput(getStartupContent());
+			changeViewTitle(viewTitle);
+
+			AbstractList<MMPInfo> modules = Util.loadProjectTargetsInfo(project);
+			projectModules.put(project, modules);
+
+			boolean xmlFile = Util.isFileXML(selectedFile);
+			// if file is xml file
+			// no need to analyze data file
+			// => just create results from xml file
+			if (xmlFile) {
+				Job analyzingXMLJob = new Job(Constants.ANALYZE_TOOL_TITLE) {
+					@Override
+					protected IStatus run(IProgressMonitor monitor) {
+
+						// update progress monitor state
+						monitor.beginTask(Constants.PROGRESSDIALOG_TITLE,
+								IProgressMonitor.UNKNOWN);
+						// Parse the data file
+						ParseXMLFileSAX dataFileParser = new ParseXMLFileSAX(project, selectedFile, projectResults);
+						boolean ret = dataFileParser.parse();
+
+						// set used datafile name
+						usedDataFileName = selectedFile;
+
+						fileOpenHistory.setFileName(selectedFile);
+
+						// if parsing success
+						// display memory leak results
+						if (ret) {
+							// update project results
+							projectResults.setProjectModules(project, projectModules.get(project), dataFileParser.getModules());
+						} else {
+							fileOpenHistory.removeFileName(selectedFile);
+							if (showErrorInfo) {
+								showErrorMessage(Constants.INFO_FILE_INVALID);
+							}
+						}
+						updateChangeDetailState(project);
+						refreshView();
+						dataFileParser = null;
+						return new Status(IStatus.OK,
+								Constants.ANALYZE_CONSOLE_ID, IStatus.OK,
+								Constants.PROGRESSDIALOG_ANALYZE_COMPLETE, null);
+					}
+				};
+				analyzingXMLJob.setUser(true);
+				analyzingXMLJob.schedule();
+
+			} else {
+				try{
+					analyzeWithAtool(project, selectedFile, showErrorInfo);
+				}
+				catch( Exception e ) {
+					analyzeJob = null;
+				}
+			}
+		}
+	}
+
+	/**
+	 * Analyzing memory analysis results using atool.exe.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 * @param usedFile
+	 *            Data file which contains memory analyze data
+	 * @param showErrorInfo
+	 *            Flag to determinate that displaying error info or not
+	 */
+	public final void analyzeWithAtool(final IProject projectRef,
+			final String usedFile, final boolean showErrorInfo) {
+		// check that no existing job running
+		if (analyzeJob == null
+				|| analyzeJob.getResult().getCode() == IStatus.CANCEL
+				|| analyzeJob.getResult().getCode() == IStatus.ERROR) {
+			analyzeJob = new Job(Constants.ANALYZE_TOOL_TITLE) {
+				@Override
+				protected IStatus run(IProgressMonitor monitor) {
+					// inform progressdialog that task execution starts
+					// this make progressdialog visible on the UI
+					monitor.beginTask(Constants.PROGRESSDIALOG_ATOOL,
+							IProgressMonitor.UNKNOWN);
+
+					fileOpenHistory.setFileName(usedFile);
+					// add2UserActionHistory( "File opened: " + usedFile );
+
+					// set used datafile name
+					usedDataFileName = usedFile;
+
+					// create atool object and execute atool
+					UseAtool atool = new UseAtool();
+
+					// create xml file
+					Constants.COMMAND_LINE_ERROR_CODE errorCode = atool.createXMLFileToCarbide(
+							monitor, projectRef, usedFile, "-a");
+					String xmlFileLocation = null;
+					xmlFileLocation = atool.getDataFileName();
+						
+					// if some error occurs display it to user.
+					if( errorCode != Constants.COMMAND_LINE_ERROR_CODE.OK ) {
+						fileOpenHistory.removeFileName(usedFile);
+						Util.displayCommandLineError(errorCode);					
+					}
+					// if XML file generation failed => info to the user
+					else if (xmlFileLocation == null) {
+						fileOpenHistory.removeFileName(usedFile);
+						if (showErrorInfo) {
+							showErrorMessage(Constants.INFO_FILE_INVALID);
+						}
+					} else {
+						// Parse the xml file
+						ParseXMLFileSAX dataFileParser = new ParseXMLFileSAX(project,
+								xmlFileLocation, projectResults);
+						boolean error = dataFileParser.parse();
+						if (showErrorInfo && !error) {
+							fileOpenHistory.removeFileName(usedFile);
+							showErrorMessage(Constants.INFO_FILE_INVALID);
+						}
+
+						projectResults.setProjectModules(project, projectModules.get(project), dataFileParser.getModules());
+						projectResults.setDataFileName(projectRef, usedDataFileName);
+						// update display
+						refreshView();
+					}
+
+					updateChangeDetailState(projectRef);
+					
+//					//this only generates statistics and this feature is currently disabled
+//					if( !monitor.isCanceled() ) {
+//
+//						IPreferenceStore store = Activator.getPreferences();
+//						boolean generateStatistic = store.getBoolean(Constants.CREATE_STATISTIC);
+//						//used file data file create statistic also
+//						if( generateStatistic && UseAtool.checkFileType(usedFile) == Constants.DATAFILE_TRACE )
+//						{
+//							monitor.setTaskName(Constants.STATISTICS_GENERATING_PROG_TITLE);
+//
+//							ReadFile fileReader = new ReadFile();
+//							boolean error = fileReader.readFile(usedFile);
+//							if( error && statisticView != null) {
+//								AbstractList<ProcessInfo> processes = fileReader.getStatistic();
+//								statisticView.setData( project, processes);
+//								fileReader.finish();
+//							}
+//
+//						}
+//					}
+					if (!monitor.isCanceled()) {
+
+						monitor.setTaskName(Constants.GRAPH_GENERATING_PROG_TITLE);
+						try {
+							ReadFile fileReader = new ReadFile();
+							boolean success = fileReader.readFile(usedFile);
+							if (success) {
+								if (chart != null){
+									resetGraphView();
+								}
+								AbstractList<ProcessInfo> processes = fileReader.getStatistic();
+								IMemoryActivityModel model = new AnalyzeFactory().createModel(processes.size() == 0);
+								chart.setInput(project, model);
+								model.addProcesses(processes);
+								fileReader.finish();
+							}	
+						}catch( OutOfMemoryError oome ) {
+							Activator.getDefault().logInfo(IStatus.ERROR, IStatus.ERROR, "Can not allocate enough memory for the memory usage graph model.");
+							analyzeJob = null;
+						}catch (Exception e ) {
+							Activator.getDefault().log(IStatus.ERROR, "Error while generating graph model", e);
+							analyzeJob = null;
+						}
+					}
+					analyzeJob = null;
+					return new Status(IStatus.OK, Constants.ANALYZE_CONSOLE_ID,
+							IStatus.OK,
+							Constants.PROGRESSDIALOG_ANALYZE_COMPLETE, null);
+				}
+			};
+
+			analyzeJob.setUser(true);
+			analyzeJob.setPriority(Job.LONG);
+			analyzeJob.schedule();
+
+		} else { // if existing job is running display info to user
+			showMessage(Constants.INFO_ALLREADY_RUNNING);
+		}
+	}
+
+
+	/**
+	 * Change report detail level.
+	 */
+	public final void changeDetailLevel() {
+
+		// sync with UI thread
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				// get preference store
+				IPreferenceStore store = Activator.getPreferences();
+
+				// get active report level
+				String reportLevel = store.getString(Constants.REPORT_LEVEL);
+
+				boolean updateMemLeakAlso = false;
+
+				// set new report level
+				if (Constants.REPORT_EVERY.equals(reportLevel)) {
+					store.setValue(Constants.REPORT_LEVEL,
+							Constants.REPORT_KNOWN);
+					updateMemLeakAlso = true;
+				} else if (Constants.REPORT_KNOWN.equals(reportLevel)) {
+					store.setValue(Constants.REPORT_LEVEL,
+							Constants.REPORT_TOPMOST);
+				} else if (Constants.REPORT_TOPMOST.equals(reportLevel)) {
+					store.setValue(Constants.REPORT_LEVEL,
+							Constants.REPORT_EVERY);
+					updateMemLeakAlso = true;
+				}
+
+				if (updateMemLeakAlso && runView != null) {
+					activeTreeItem = null;
+
+					// set view content
+					runView.setInput(getResults(false));
+
+					// refresh view
+					runView.refresh();
+
+					// if last selected item not found current item list
+					if (activeTreeItem == null) {
+						runView.setAutoExpandLevel(2);
+					} else {
+						// set selection to correct item
+						runView.setSelection(new StructuredSelection(
+								activeTreeItem), true);
+					}
+
+				}
+
+				if (callstackView != null) {
+					// update view callstack view content
+					callstackView.setInput(getCallStack(activeTreeItem));
+
+					// expand all the trees on call stack view
+					callstackView.expandAll();
+
+				}
+
+				// change tooltip
+				changeReportActionTooltip();
+
+			}
+		});
+
+	}
+
+	/**
+	 * Change logging mode.
+	 *
+	 * @param loggingMode
+	 *            Used logging mode
+	 */
+	public final void changeLogTarget(final String loggingMode) {
+
+		if (logTargetMenu == null) {
+			return;
+		}
+
+		// get preference store
+		IPreferenceStore store = Activator.getPreferences();
+		String usedLoggingMode = "";
+
+		// if no loggingmode given get it from the AnalyzeTool preferences
+		if (loggingMode == null) {
+			usedLoggingMode = store.getString(Constants.LOGGING_MODE);
+		}
+		// logging mode is given => so start to use it
+		else {
+			store.setValue(Constants.LOGGING_MODE, loggingMode);
+			usedLoggingMode = loggingMode;
+		}
+
+		// current logging mode is external change it to external
+		if (Constants.LOGGING_EXT.equals(usedLoggingMode)) {
+			logTargetMenu.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_COMPUTER));
+			logTargetMenu
+					.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_EXT);
+			if (loggingMode == null){
+				externalLogTargetAction.setChecked(true);
+				s60LogTargetAction.setChecked(false);
+				externalFastLogTargetAction.setChecked(false);
+				askLogTargetAction.setChecked(false);
+			}
+		}
+		// current logging mode is s60 change it to s60
+		else if (Constants.LOGGING_S60.equals(usedLoggingMode)) {
+
+			logTargetMenu.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_CELLURAR));
+			logTargetMenu
+					.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_S60);
+			if (loggingMode == null){
+				externalLogTargetAction.setChecked(false);
+				s60LogTargetAction.setChecked(true);
+				externalFastLogTargetAction.setChecked(false);
+				askLogTargetAction.setChecked(false);
+			}
+		}
+
+		else if( Constants.LOGGING_EXT_FAST.equals(usedLoggingMode)) {
+			logTargetMenu.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_COMPUTER_FAST));
+			logTargetMenu.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_FAST);
+			if( loggingMode == null) {
+				externalLogTargetAction.setChecked(false);
+				s60LogTargetAction.setChecked(false);
+				externalFastLogTargetAction.setChecked(true);
+				askLogTargetAction.setChecked(false);
+			}
+		}
+		// current logging mode is "ask_always"
+		else {
+			logTargetMenu.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_ASK));
+			logTargetMenu
+					.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_ASK);
+			if (loggingMode == null){
+				externalLogTargetAction.setChecked(false);
+				s60LogTargetAction.setChecked(false);
+				externalFastLogTargetAction.setChecked(false);
+				askLogTargetAction.setChecked(true);
+			}
+		}
+
+		// if the fast data gathering mode is enabled by the preference page => enable also toolbar option
+		// else disable fast data gathering mode
+		externalFastLogTargetAction.setEnabled(store.getBoolean(Constants.LOGGING_FAST_ENABLED));
+	}
+
+	/**
+	 * Changes "Change report detail level" action tooltip.
+	 */
+	public final void changeReportActionTooltip() {
+		if (changeDetails == null) {
+			return;
+		}
+
+		// get preference store
+		IPreferenceStore store = Activator.getPreferences();
+
+		// get active report level
+		String reportLevel = store.getString(Constants.REPORT_LEVEL);
+
+		// set new report level
+		if (Constants.REPORT_EVERY.equals(reportLevel)) {
+			changeDetails.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_DETAILS_ALL));
+			changeDetails
+					.setToolTipText(Constants.ACTION_CHANGE_REPORT_LEVEL_ALL);
+		} else if (Constants.REPORT_KNOWN.equals(reportLevel)) {
+			changeDetails.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_DETAILS_KNOWN));
+			changeDetails
+					.setToolTipText(Constants.ACTION_CHANGE_REPORT_LEVEL_KNOWN);
+		} else if (Constants.REPORT_TOPMOST.equals(reportLevel)) {
+			changeDetails.setImageDescriptor(Activator
+					.getImageDescriptor(Constants.BUTTON_DETAILS_TOPMOST));
+			changeDetails
+					.setToolTipText(Constants.ACTION_CHANGE_REPORT_LEVEL_TOPMOST);
+		}
+
+	}
+
+	/**
+	 * Change view title.
+	 *
+	 * @param newTitle
+	 *            New title text
+	 */
+	private void changeViewTitle(final String newTitle) {
+
+		// if newTitle contains text
+		if (newTitle != null) {
+			super.setContentDescription(newTitle);
+		}
+	}
+
+	/**
+	 * Check project validity that is project is selected.
+	 *
+	 * @return True if project is open and accessible otherwise False
+	 */
+	public final boolean checkProjectValidity() {
+		// project is not selected show info to user
+		if (project == null || !project.isOpen()) {
+			Util.showMessage(Constants.NO_PROJ_SELECT);
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Cleans atool.exe made changes.
+	 */
+	public final void clean() {
+		if (!checkProjectValidity()) {
+			return;
+		}
+
+		// check is atool.exe available
+		if (!Util.isAtoolAvailable()) {
+			showErrorMessage(Constants.INFO_ATOOL_NOT_AVAILABLE);
+			return;
+		}
+
+		// ask for user
+		boolean ret = Util.openConfirmationDialog(Constants.CONFIRM_DELETE_ALL);
+
+		// if user confirms
+		if (ret) {
+			// clear AnalyzeTool made changes
+			Util util = new Util();
+			util.clearAtoolChanges(project);
+
+			cleanAnalyzeData(null);
+			updateChangeDetailState(project);
+		}
+
+		if( statisticView != null ) {
+			statisticView.clean(null);
+		}
+		
+		if (chart != null){
+			resetGraphView();
+		}
+
+	}
+
+	/**
+	 * Cleans all the saved data.
+	 */
+	private void cleanAnalyzeData(final IProject projectRef) {
+		// clean all data if project not specified
+		if (projectRef == null) {
+			// clean all the project related info and data
+			projectResults.clear();
+			projectModules.clear();
+		}
+		else {
+			// clear only one project results
+			if (projectResults.contains(projectRef)) {
+				projectResults.clearProjectData(projectRef);
+			}
+
+			if( projectModules.contains(projectRef)) {
+				projectModules.remove(projectRef);
+			}
+		}
+
+
+
+		cppFileNames.clear();
+
+		// update variables
+		activeTreeItem = null;
+		usedDataFileName = "";
+
+
+		// set default view contents
+		if (runView != null) {
+			runView.getControl().getDisplay().syncExec(new Runnable() {
+				public void run() {
+					runView.setInput(getStartupContent());
+					if (informationLabel != null) {
+						updateInformationLabel("");
+					}
+
+					changeViewTitle(viewTitle);
+					if( statisticView != null ) {
+						statisticView.clean(projectRef);
+					}
+				}
+			});
+		}
+
+		clearCallstackViewContent();
+		if( clearProjectResults != null && clearProjectResults != null ) {
+			clearProjectResults.setEnabled(false);
+		}else if( clearProjectResults != null ) {
+			updateChangeDetailState(projectRef);
+		}
+
+	}
+
+	/**
+	 * Clears callstack view contents.
+	 */
+	private void clearCallstackViewContent() {
+		if (runView == null) {
+			return;
+		}
+
+		// if view exists
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+
+				if (callstackView != null) {
+					callstackView.setInput(null);
+				}
+			}
+		});
+
+	}
+
+	/**
+	 * Contributes action bar.
+	 */
+	private void contributeToActionBars() {
+		if (getViewSite() == null) {
+			return;
+		}
+		IActionBars bars = getViewSite().getActionBars();
+		fillLocalPullDown(bars.getMenuManager());
+		fillLocalToolBar(bars.getToolBarManager());
+	}
+
+
+	/**
+	* This is a callback that will allow us
+	* to create the viewer and initialize it.
+	*/
+	@Override
+	public void createPartControl( Composite parent ){
+
+		//create new Tab
+		CTabFolder mainFolder = new CTabFolder( parent, SWT.TOP );
+
+		//create main view and add it tab
+		createMainView( mainFolder );
+
+		//create new statistic view
+		//createMemoryView( mainFolder );
+		//create graph
+		createGraphView(mainFolder);
+
+		//set initial selection
+		mainFolder.setSelection( mainTab );
+	}
+
+	/**
+	 * Creates graph view and add it to graph tab
+	 * @param parent CTabFolder parent of the view
+	 */
+	private void createGraphView(CTabFolder mainFolder) {
+		final CTabItem chartTabItem = new CTabItem(mainFolder, SWT.NONE);
+		chartTabItem.setText("Graph"); 
+		chartTabItem.setToolTipText("AnalyzeTool graph per process"); 
+		
+		chart = new ChartContainer(mainFolder, SWT.NONE);
+		chartTabItem.setControl(chart);
+		IMemoryActivityModel model = AnalyzeFactory.getEmptyModel();
+		chart.setInput(project, model);
+		model.addProcesses(model.getProcesses());//charts should get notified via listeners on the model
+	}
+	
+	/**
+	 * Clears the graph by setting an empty model and causing paint events
+	 */
+	private void resetGraphView(){
+		if (chart != null){
+			chart.setInput(project, AnalyzeFactory.getEmptyModel());
+			//chart.update();
+		}
+	}
+
+	/**
+	 * Creates new statistic view and add it to memory tab
+	 * @param parent Statistic view parent( CTabFolder )
+	 */
+	public void createMemoryView( CTabFolder parent )
+	{
+		statisticView = new StatisticView();
+		memoryTab = statisticView.createView( parent );
+	}
+
+	/**
+	 * Creates memory results view
+	 * @param parent View parent ( CTabFolder )
+	 */
+	public void createMainView(CTabFolder parent) {
+
+		// Create SashForm this form includes all the current view components
+		SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
+
+		mainTab = new CTabItem( parent, SWT.NONE );
+		mainTab.setControl( sashForm );
+		mainTab.setText(Constants.MAIN_TAB_TITLE);
+
+		// create new treeviewer to shown memory analysis runs and leaks
+		runView = new TreeViewer(sashForm, SWT.VIRTUAL);
+
+		// create SashForm to display call stack addresses and more detailed
+		// information
+		// of selected run or leak
+		SashForm callstackForm = new SashForm(sashForm, SWT.VERTICAL);
+
+		// set content and label providers
+		runView.setContentProvider(new ViewContentProvider());
+		runView.setLabelProvider(new ViewLabelProvider());
+		// runView.addFilter( new ATFilter() );
+		// get init content
+		runView.setInput(getStartupContent());
+
+		// add listener to provide selection change events
+		runView.addTreeListener(this);
+
+		runView.setAutoExpandLevel(2);
+
+		// create new information label
+		// this label contains more detailed information of selected item
+		informationLabel = new Label(callstackForm, SWT.BORDER | SWT.CENTER);
+
+		// create grid data => this provides layout changes
+		GridData data = new GridData();
+
+		// add grid data to label, this enables label ui modifications e.g. line
+		// feed
+		informationLabel.setLayoutData(data);
+
+		// set init text
+		informationLabel.setText(Constants.INFO_NO_DATA);
+
+		// create new call stack view
+		// this components contains information of one memory leak call stack
+		// addresses
+		callstackView = new TreeViewer(callstackForm, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL);
+
+		// modify UI components layouts
+		// reserve more space for left side of UI
+		sashForm.setWeights(new int[] { 5, 3 });
+		callstackForm.setWeights(new int[] { 2, 8 });
+
+		// add content and label providers
+		callstackView.setContentProvider(new ViewContentProvider());
+		callstackView.setLabelProvider(new ViewLabelProvider());
+
+		// make actions and construct click listeners
+		makeActions();
+		hookContextMenu();
+		hookDoubleClickAction();
+		hookClicks();
+		contributeToActionBars();
+
+		// set view title
+		viewTitle = String.format(Constants.ANALYZE_TOOL_TITLE_WITH_VERSION, Util.getAToolFeatureVersionNumber());
+		this.setContentDescription(viewTitle);
+
+		// add selection listener
+		if (getSite() != null) {
+			getSite().getPage().addSelectionListener(this);
+			runView.getControl().addKeyListener(this);
+		}
+
+		// set actionlistener
+		Activator.setActionListener(this);
+
+		// set help shortcuts
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(
+				callstackView.getControl(),
+				AnalyzeToolHelpContextIDs.ANALYZE_MAIN);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(runView.getControl(),
+				AnalyzeToolHelpContextIDs.ANALYZE_MAIN);
+
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(new ATResourceListener());
+		
+		//get used command line engine version
+		String version = Util.getAtoolVersionNumber(Util.getAtoolInstallFolder());
+		
+		//compare current version to min version
+		int comp = Util.compareVersionNumber(Constants.CS_SUPPORT_MIN_VERSION, version);
+		
+		IPreferenceStore store = Activator.getPreferences();
+		//if current version is same or higher than required version => set flag to true
+		if( comp == Constants.VERSION_NUMBERS_EQUALS || comp == Constants.VERSION_NUMBERS_SECOND ) {
+			store.setValue(Constants.LOGGING_FAST_ENABLED, true);
+		}
+		else {
+			store.setValue(Constants.LOGGING_FAST_ENABLED, false);
+		}
+		
+		// get default value for logging mode
+		preferenceChanged();
+	}
+
+	/**
+	 * When AnalyzeTool view is activated and Tracing utility plug-in is not
+	 * available disable AnalyzeTool trace actions.
+	 *
+	 * @see com.nokia.s60tools.analyzetool.ui.IActionListener#disableTraceActions(boolean)
+	 *
+	 * @param disable
+	 *            Boolean state of trace action
+	 */
+	public void disableTraceActions(final boolean disable) {
+
+		if (traceAction != null && disable) {
+			// enable trace action
+			traceAction.setToolTipText(Constants.ACTION_START_TRACE);
+			traceAction.setEnabled(disable);
+		} else if (traceAction != null && !disable) {
+			// disable trace action
+			traceAction.setToolTipText(Constants.TRACE_NOT_FOUND);
+			traceAction.setEnabled(disable);
+		}
+
+		traceActive = false;
+	}
+
+	/**
+	 * Fills context menu.
+	 *
+	 * @param manager
+	 *            Menu manager
+	 */
+	private void fillContextMenu(IMenuManager manager) {
+
+		manager.add(buildWithAtool);
+		manager.add(new Separator());
+		manager.add(traceAction);
+		manager.add(startSubtest);
+		manager.add(stopSubtest);
+		manager.add(new Separator());
+		manager.add(changeDetails);
+		manager.add(refreshResults);
+		manager.add(clearProjectResults);
+		manager.add(new Separator());
+		manager.add(cleanAtoolChanges);
+		manager.add(copyAction);
+		// Other plug-ins can contribute there actions here
+		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+	}
+
+	/**
+	 * Fills local pull down menu.
+	 *
+	 * @param manager
+	 *            Menu manager
+	 */
+	private void fillLocalPullDown(IMenuManager manager) {
+		manager.add(buildWithAtool);
+		manager.add(new Separator());
+		manager.add(traceAction);
+		manager.add(startSubtest);
+		manager.add(stopSubtest);
+		manager.add(new Separator());
+		manager.add(changeDetails);
+		manager.add(refreshResults);
+		manager.add(new Separator());
+		manager.add(cleanAtoolChanges);
+		manager.add(new Separator());
+		manager.add(openPrefs);
+	}
+
+	/**
+	 * Fills local toolbar.
+	 *
+	 * @param manager
+	 *            Menu manager
+	 */
+	private void fillLocalToolBar(IToolBarManager manager) {
+
+		logTargetMenu = new DropDownMenu(Constants.ACTION_SAVE, this, false,
+				false);
+		makeLogTargetActions();
+		logTargetMenu.addAction(s60LogTargetAction);
+		logTargetMenu.addAction(externalLogTargetAction);
+		logTargetMenu.addAction(externalFastLogTargetAction);
+		logTargetMenu.addAction(askLogTargetAction);
+		manager.add(logTargetMenu);
+
+		manager.add(buildWithAtool);
+		manager.add(new Separator());
+		manager.add(traceAction);
+		manager.add(startSubtest);
+		manager.add(stopSubtest);
+		manager.add(new Separator());
+		manager.add(changeDetails);
+		manager.add(new Separator());
+		fileOpenMenu = new DropDownMenu(Constants.ACTION_OPEN, this, false,
+				true);
+		makeFileOpenActions();
+		manager.add(fileOpenMenu);
+
+		// get drop down menu for save action
+		saveFileMenu = new DropDownMenu(Constants.ACTION_SAVE, this, true,
+				false);
+		saveFileMenu.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_SAVE));
+
+		saveFileMenu.addAction(saveReportAction);
+		saveFileMenu.addAction(saveDataFileAction);
+		manager.add(saveFileMenu);
+		manager.add(new Separator());
+		manager.add(cleanAtoolChanges);
+		manager.add(new Separator());
+		manager.add(openPrefs);
+	}
+
+	/**
+	 * Gets call stack information of current leak.
+	 *
+	 * @param treeObject
+	 *            Tree object
+	 * @return Object
+	 */
+	Object getCallStack(final TreeObject treeObject) {
+		IPreferenceStore store = Activator.getPreferences();
+		// if project is not selected or treeobject is not created
+		// => leave
+		if (project == null || treeObject == null) {
+			return null;
+		}
+
+		// set active tree item
+		activeTreeItem = treeObject;
+
+		AnalysisItem item = null;
+		if (treeObject.isSubTest()) {
+			item = projectResults.getSubtestItem(project,
+					treeObject.getRunID(), treeObject.getMemLeakID(),
+					treeObject.getSubtestID());
+		}
+		// get AnalysisItem
+		else {
+			item = projectResults.getSpecific(project, treeObject.getRunID(),
+					treeObject.getMemLeakID());
+		}
+
+		if (item == null) {
+			return null;
+		}
+
+		if (store == null) {
+			return null;
+		}
+		AbstractList<MMPInfo> modules = projectModules.get(project);
+		TreeHelper helper = new TreeHelper(null, store);
+
+		TreeParent parent = helper.getCallstack(item, modules);
+
+		return parent;
+	}
+
+
+	/**
+	 * Gets callstack item name.
+	 *
+	 * @param callstackItem
+	 *            One callstack item
+	 * @return Callstack name if found otherwise null
+	 */
+	public final String getCallstackItemName(final CallstackItem callstackItem) {
+		// if call stack item not set => return
+		if (callstackItem == null) {
+			return null;
+		}
+
+		String cppFileName = "";
+		String fileName = callstackItem.getFileName().toLowerCase(Locale.US);
+
+		if (fileName.indexOf(".cpp") == -1) {
+			return null;
+		}
+
+		// check that project contains cpp file which is parsed from call stack
+		// list
+		Iterator<String> iterCppFiles = cppFileNames.iterator();
+		while( iterCppFiles.hasNext() ) {
+			String cppFileLocation = iterCppFiles.next();
+
+			//parse file name from the source path
+			int slash = Util.getLastSlashIndex(cppFileLocation);
+			if( slash != -1 ) {
+				String cppFile = cppFileLocation.substring(slash+1, cppFileLocation.length());
+				if( cppFile.equalsIgnoreCase(fileName)) {
+					cppFileName = cppFileLocation;
+					break;
+				}
+			}
+		}
+		return cppFileName;
+	}
+
+	/**
+	 * Gets file info for current project.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 */
+	private void getFileInfos(final IProject projectRef) {
+		ResourceVisitor visitor = new ResourceVisitor(this);
+
+		// go thru all open projects
+		// this enables to display one memory address corresponding source code
+		// line
+		// for outside of active project
+		try {
+			if (projectRef == null) {
+				IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace()
+						.getRoot();
+				IProject[] projects = myWorkspaceRoot.getProjects();
+				for (int i = 0; i < projects.length; i++) {
+					IProject tempProject = projects[i];
+					if (tempProject.isOpen()) {
+						tempProject.accept(visitor);
+					}
+				}
+
+			} else { // project is selected
+				// if project is open => accept resource visitor
+				if (projectRef.isOpen()) {
+					projectRef.accept(visitor);
+				}
+			}
+		} catch (CoreException e) {
+			e.printStackTrace();
+
+		}
+	}
+
+	/**
+	 * Gets project results.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 */
+	public void getProjectResults(final IProject projectRef) {
+		// if project reference is null => leave
+		if (projectRef == null) {
+			return;
+		}
+		// if project is selected and it is open
+		else if (projectRef.isOpen()) {
+			// if this is the first time to get project results
+			if (lastProjectRef == null) {
+				lastProjectRef = projectRef;
+				updateBuildState(lastProjectRef);
+				updateChangeDetailState(lastProjectRef);
+			}
+			// project selection changed
+			// need to get selected project results and mmp file info
+			else if (!lastProjectRef.equals(projectRef)) {
+				activeTreeItem = null;
+				lastProjectRef = projectRef;
+
+				runView.setInput(getResults(false));
+				callstackView.setInput(getCallStack(null));
+
+				updateInformationLabel("");
+				updateBuildState(lastProjectRef);
+				updateChangeDetailState(lastProjectRef);
+			}
+		}
+
+		//update clear project results action state
+		if( projectResults.contains(projectRef) ) {
+			clearProjectResults.setEnabled(true);
+		}
+		else {
+			clearProjectResults.setEnabled(false);
+		}
+	}
+
+	/**
+	 * Gets memory leak analysis results.
+	 *
+	 * @param showErrorInfo
+	 *            Display error info or not
+	 * @return Object memory leak analysis results
+	 */
+	private Object getResults(final boolean showErrorInfo) {
+
+		try {
+			// create new tree paretn
+			TreeParent testRuns = new TreeParent(Constants.TEST_RUNS_TREE_TITLE);
+			invisibleRoot = null;
+			invisibleRoot = new TreeParent(Constants.TREE_TITLE);
+			invisibleRoot.addChild(testRuns);
+
+			// if current project does not contain results => just update
+			// default view values
+			if (!projectResults.contains(project)) {
+				changeViewTitle(viewTitle);
+				updateInformationLabel(Constants.INFO_NO_DATA);
+				return getStartupContent();
+			}
+
+			if( !projectModules.containsKey(project) )
+			{
+				AbstractList<MMPInfo> modules = Util.loadProjectTargetsInfo(project);
+				projectModules.put(project, modules);
+			}
+
+			// get run results
+			AbstractList<RunResults> runs = projectResults.getResults(project);
+			AbstractList<MMPInfo> modules = projectModules.get(project);
+
+			// if no results available => show default view content
+			if (runs == null || runs.isEmpty()) {
+				changeViewTitle(viewTitle);
+				updateInformationLabel(Constants.INFO_NO_DATA);
+
+				// because no results created => delete project empty results
+				projectResults.clearProjectData(project);
+
+				fileOpenHistory.removeFileName(projectResults
+						.getDataFileName(project));
+
+				// display info to user
+				if (showErrorInfo) {
+					showErrorMessage(Constants.INFO_FILE_INVALID);
+				}
+
+				return getStartupContent();
+			}
+
+			IPreferenceStore store = Activator.getPreferences();
+
+			// create TreeHelper object
+			// TreeHelper class creates tree model to this view.
+			TreeHelper helper = new TreeHelper(lastSelectedObject,
+					store);
+
+			// clear active item
+			activeTreeItem = null;
+
+			// update used data file name
+			usedDataFileName = projectResults.getDataFileName(project);
+
+			// change view title
+			changeViewTitle(viewTitle
+					+ " results from file: " + usedDataFileName);
+
+			// thru runs
+			Iterator<RunResults> runIterator = runs.iterator();
+			while (runIterator.hasNext()) {
+				// get one run info
+				RunResults oneRunResults = runIterator.next();
+
+				// creates one run information at the time
+				TreeParent oneRunTree = helper.createRunResults(oneRunResults, modules);
+
+				// get active item
+				// active must ask from the TreeHelper class
+				// because it can be filtered out when creating new tree model
+				activeTreeItem = helper.getActiveItem();
+				testRuns.addChild(oneRunTree);
+
+			}
+
+		} catch (java.lang.NullPointerException npe) {
+			npe.printStackTrace();
+			return null;
+		}
+
+		// expand to runs level
+		runView.setAutoExpandLevel(2);
+
+		return invisibleRoot;
+	}
+
+	/**
+	 * Sets startup contents for view.
+	 *
+	 * @return Object which can be displayd
+	 */
+	public TreeParent getStartupContent() {
+		// create default treeviewer content
+		invisibleRoot = new TreeParent(Constants.ANALYZE_TOOL_TITLE);
+		TreeParent child = new TreeParent(Constants.INFO_NO_DATA_FILE_AVAILABLE);
+		invisibleRoot.addChild(child);
+
+		return invisibleRoot;
+	}
+
+	/**
+	 * Adds selection changed listener to view.
+	 */
+	private void hookClicks() {
+		runView.addSelectionChangedListener(this);
+	}
+
+	/**
+	 * Hooks context menu.
+	 */
+	private void hookContextMenu() {
+		MenuManager menuMgr = new MenuManager("#PopupMenu");
+		menuMgr.setRemoveAllWhenShown(true);
+		menuMgr.addMenuListener(new IMenuListener() {
+			@SuppressWarnings("synthetic-access")
+			public void menuAboutToShow(IMenuManager manager) {
+				MainView.this.fillContextMenu(manager);
+			}
+		});
+		Menu menu = menuMgr.createContextMenu(runView.getControl());
+		runView.getControl().setMenu(menu);
+		if (getSite() != null) {
+			getSite().registerContextMenu(menuMgr, runView);
+		}
+
+	}
+
+	/**
+	 * Hook double click actions.
+	 */
+	private void hookDoubleClickAction() {
+		callstackView.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+
+				doubleClickAction.run();
+			}
+		});
+	}
+
+	/**
+	 * Check that if subtest by given name allready exists.
+	 *
+	 * @param subTestName
+	 *            Subtest name
+	 * @param target
+	 *            Testing target
+	 * @return True if allready exists otherwise False
+	 */
+	public final boolean isSubtestExists(final String subTestName,
+			final String target) {
+		Iterator<ActiveSubtests> subTestIter = startedSubtest.iterator();
+		while (subTestIter.hasNext()) {
+			ActiveSubtests oneSubtest = subTestIter.next();
+			if (oneSubtest.getName().equals(subTestName)
+					&& oneSubtest.getTargetName().equals(target)) {
+				return true;
+			}
+
+		}
+		return false;
+	}
+
+
+
+	/**
+	 * Go thru the project files and stores mmp files.
+	 *
+	 * @param resource
+	 *            One resource file of project
+	 */
+	public final void loadFileInfo(IResource resource) {
+		// get all the cpp file info which are imported to workspace
+		// this enable pinpointing the code line for outside active project cpp
+		// file than
+		// the memory analysis is made
+		// get cpp file info
+		String cppFileName = Util.getCPPFileNameAndPath(resource);
+
+		// if cpp file found, save it
+		if (cppFileName != null && !cppFileNames.contains(cppFileName)) {
+			this.cppFileNames.add(cppFileName);
+		}
+	}
+
+	/**
+	 * Construct all the actions.
+	 */
+	private void makeActions() {
+
+		// listens click actions
+		clickAction = new Action() {
+			@Override
+			public void run() {
+				// get selection
+				ISelection selection = runView.getSelection();
+
+				// get selection object
+				Object obj = ((IStructuredSelection) selection)
+						.getFirstElement();
+
+				// if object exists
+				if (obj == null) {
+					copyAction.setEnabled(false);
+					return;
+				}
+
+				// get call stack addresses to view
+				if (obj instanceof TreeObject) {
+					lastSelectedObject = obj;
+
+					//get callstack items
+					Object resultObject = getCallStack((TreeObject) obj);
+
+					// if results not found
+					if( resultObject == null ) {
+						copyAction.setEnabled(false);
+					}
+					else {
+						callstackView.setInput(resultObject);
+						copyAction.setEnabled(true);
+					}
+
+				}
+
+				// expand all the trees on call stack view
+				callstackView.expandAll();
+
+				setTextToInformationLabel();
+			}
+		};
+
+		// listens double click actions
+		doubleClickAction = new Action() {
+			@Override
+			public void run() {
+				// get selection
+				ISelection selection = callstackView.getSelection();
+				Object obj = ((IStructuredSelection) selection)
+						.getFirstElement();
+
+				// open file in editor
+				if (obj instanceof TreeObject) {
+					openEditor((TreeObject) obj);
+				}
+			}
+		};
+
+		// data capture
+		traceAction = new Action() {
+			@Override
+			public void run() {
+
+				// if trace is active => stop the trace
+				if (traceActive) {
+					stop(true);
+				}
+				// if trace is not active => start the trace
+				else {
+					start();
+				}
+			}
+		};
+		traceAction.setText(Constants.ACTION_START_TRACE);
+		traceAction.setToolTipText(Constants.ACTION_START_TRACE);
+		traceAction.setImageDescriptor(Activator
+				.getImageDescriptor((Constants.BUTTON_RUN)));
+
+		// if trace actions are disabled
+		if (!enableTrace) {
+			traceAction.setEnabled(false);
+			traceAction.setToolTipText(Constants.TRACE_NOT_FOUND);
+		}
+
+		// build with atool
+		buildWithAtool = new Action() {
+			@Override
+			public void run() {
+				activateAnalysisBuild();
+			}
+		};
+		buildWithAtool.setText(Constants.ACTION_AT_BUILD_ACTIVE);
+		buildWithAtool.setToolTipText(Constants.ACTION_AT_BUILD_ACTIVE);
+		buildWithAtool.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_BUILD));
+
+		// clean atool changes
+		cleanAtoolChanges = new Action() {
+			@Override
+			public void run() {
+				clean();
+			}
+		};
+		cleanAtoolChanges.setText(Constants.ACTION_CLEAR_CHANGES);
+		cleanAtoolChanges
+				.setToolTipText(Constants.ACTION_CLEAR_CHANGES_TOOLTIP);
+		cleanAtoolChanges.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_CLEAN));
+
+		// change detail level
+		changeDetails = new Action() {
+			@Override
+			public void run() {
+				changeDetailLevel();
+			}
+		};
+		changeDetails.setText(Constants.ACTION_CHANGE_REPORT_LEVEL);
+
+		// save report( xml ) file
+		saveReportAction = new Action() {
+			@Override
+			public void run() {
+				saveReportFile(Constants.SAVE_REPORT_FILE_XML);
+			}
+		};
+		saveReportAction.setText(Constants.ACTION_SAVE_REPORT);
+		saveReportAction.setToolTipText(Constants.ACTION_SAVE_REPORT);
+
+		// save data file
+		saveDataFileAction = new Action() {
+			@Override
+			public void run() {
+				saveReportFile(Constants.SAVE_REPORT_FILE_DATA);
+
+			}
+		};
+		saveDataFileAction.setText(Constants.ACTION_SAVE_DATA);
+		saveDataFileAction.setToolTipText(Constants.ACTION_SAVE_DATA);
+
+		// start subtest
+		startSubtest = new Action() {
+			@Override
+			public void run() {
+				startSubTest();
+			}
+		};
+		startSubtest.setText(Constants.ACTION_START_SUBTEST);
+		startSubtest.setToolTipText(Constants.ACTION_START_SUBTEST);
+		startSubtest.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_START_SUBTEST));
+
+		// stop subtest
+		stopSubtest = new Action() {
+			@Override
+			public void run() {
+				stopSubTest();
+			}
+		};
+		stopSubtest.setText(Constants.ACTION_STOP_SUBTEST);
+		stopSubtest.setToolTipText(Constants.ACTION_STOP_SUBTEST);
+		stopSubtest.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_STOP_SUBTEST));
+		stopSubtest.setDescription(Constants.ACTION_STOP_SUBTEST);
+
+		// set start and stop subtest not visible at the beginning
+		startSubtest.setEnabled(false);
+		stopSubtest.setEnabled(false);
+
+		analyzeResults = new Action() {
+			@Override
+			public void run() {
+				analyzeDataFile(Constants.ANALYZE_ASK_FOR_USER, null, true);
+			}
+		};
+
+		analyzeResults.setText(Constants.ACTION_OPEN);
+		analyzeResults.setToolTipText(Constants.ACTION_OPEN);
+		analyzeResults.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_OPEN));
+
+		clearProjectResults = new Action() {
+			@Override
+			public void run() {
+				cleanAnalyzeData(project);
+				if(statisticView != null ) {
+					statisticView.clean(project);
+				}
+				updateChangeDetailState(project);
+			}
+		};
+		clearProjectResults.setText(Constants.ACTION_CLEAR_RESULTS);
+		clearProjectResults.setToolTipText(Constants.ACTION_CLEAR_RESULTS);
+
+		refreshResults = new Action() {
+			@Override
+			public void run() {
+				if( project != null && project.isOpen() && projectResults != null ) {
+					String dataFile = projectResults.getDataFileName(project);
+					if( dataFile != null || !("").equals(dataFile) ) {
+						analyzeDataFile(Constants.ANALYZE_USE_DATA_FILE, dataFile, true);
+					}
+					else {
+						//some internal error occurred => disable this action
+						refreshResults.setEnabled(false);
+					}
+
+				}
+			}
+		};
+		refreshResults.setText(Constants.ACTION_RE_ANALYZE);
+		refreshResults.setToolTipText(Constants.ACTION_RE_ANALYZE_TOOLTIP);
+		refreshResults.setEnabled(false);
+
+		//copy active item contents to clipboard
+		copyAction = new Action(){
+			@Override
+			public void run() {
+				//copy active item contents to clipboard
+
+				//Create new clipboard object
+				Clipboard cp = new Clipboard(runView.getControl().getDisplay());
+
+				//Create new TextTransfer object
+				//TextTransfer converts plain text represented as a java String to a platform specific representation of the data and vice versa
+				TextTransfer tt = TextTransfer.getInstance();
+
+				//new StringBuffer which contains the copied text
+				StringBuffer sb = new StringBuffer(64);
+
+				// chech that project contains results
+				if( projectResults == null || !projectResults.contains(project) || activeTreeItem == null ) {
+					return;
+				}
+				//get active item info (also callstack info)
+				AnalysisItem item = null;
+
+				// if selected item is subtest
+				if( activeTreeItem.isSubTest() ) {
+					item = projectResults.getSubtestItem(project,
+							activeTreeItem.getRunID(), activeTreeItem.getMemLeakID(),
+							activeTreeItem.getSubtestID());
+				}
+				else {
+					item = projectResults.getSpecific(project, activeTreeItem.getRunID(), activeTreeItem.getMemLeakID());
+				}
+
+				// check that item found
+				if( item == null ) {
+					return;
+				}
+
+				sb.append(activeTreeItem.getName());
+				String separator = System.getProperty ( "line.separator" );
+				sb.append(separator);
+				char space = ' ';
+				AbstractList<CallstackItem> callstackItems = item.getCallstackItems();
+				Iterator<CallstackItem> iterCallstack = callstackItems.iterator();
+				while( iterCallstack.hasNext() ) {
+					CallstackItem oneItem = iterCallstack.next();
+					sb.append("      ");
+					sb.append(oneItem.getMemoryAddress());
+					sb.append(space);
+					sb.append(oneItem.getModuleName());
+					sb.append(space);
+					sb.append(oneItem.getFunctionName());
+					sb.append(space);
+					sb.append(oneItem.getFileName());
+					sb.append(space);
+					int lineNbr = oneItem.getLeakLineNumber();
+					if( lineNbr > 0 ) {
+						sb.append(lineNbr);
+					}
+					sb.append(separator);
+				}
+
+				//info is ready => now copy info to clipboard
+				cp.setContents(new Object[] { sb.toString() },
+			            new Transfer[] { tt });
+			}
+		};
+		copyAction.setText(Constants.ACTION_COPY);
+		copyAction.setEnabled(false);
+		
+		// open preferences action
+		openPrefs = new Action() {
+			@Override
+			public void run() {
+				PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+						Constants.ANALYZE_TOOL_PREFS_ID, null, null);
+				
+				if( dialog != null ) {
+					dialog.open();
+				}
+			}
+		};
+		openPrefs.setText(Constants.ACTION_OPEN_PREFS);
+		openPrefs.setToolTipText(Constants.ACTION_OPEN_PREFS_TOOLTIP);
+		openPrefs.setImageDescriptor(Activator.getImageDescriptor(Constants.BUTTON_OPEN_PREFS));
+		
+		changeReportActionTooltip();
+		updateChangeDetailState(project);
+		updateBuildState(project);
+	}
+
+	/**
+	 * Creates file open actions.
+	 */
+	private void makeFileOpenActions() {
+		fileOpenMenu.setText(Constants.ACTION_OPEN);
+		fileOpenMenu.setToolTipText(Constants.ACTION_OPEN);
+		fileOpenMenu.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_OPEN));
+	}
+
+	/**
+	 * Creates file open actions.
+	 */
+	private void makeLogTargetActions() {
+
+		s60LogTargetAction = new Action(Constants.LOGGING_S60, Action.AS_RADIO_BUTTON) {
+			@Override
+			public void run() {
+				changeLogTarget(Constants.LOGGING_S60);
+			}
+		};
+		s60LogTargetAction.setText(Constants.PREFS_S60);
+		s60LogTargetAction
+				.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_S60);
+		s60LogTargetAction.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_CELLURAR));
+
+		externalLogTargetAction = new Action(Constants.LOGGING_EXT, Action.AS_RADIO_BUTTON) {
+			@Override
+			public void run() {
+				changeLogTarget(Constants.LOGGING_EXT);
+			}
+		};
+		externalLogTargetAction.setText(Constants.PREFS_EXT);
+		externalLogTargetAction
+				.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_EXT);
+		externalLogTargetAction.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_COMPUTER));
+
+		externalFastLogTargetAction = new Action(Constants.LOGGING_EXT_FAST, Action.AS_RADIO_BUTTON) {
+			@Override
+			public void run() {
+				changeLogTarget(Constants.LOGGING_EXT_FAST);
+			}
+		};
+		externalFastLogTargetAction.setText(Constants.PREFS_EXT_FAST);
+		externalFastLogTargetAction.setToolTipText(Constants.PREFS_EXT_FAST_TOOLTIP);
+		externalFastLogTargetAction.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_COMPUTER_FAST));
+
+		askLogTargetAction = new Action(Constants.LOGGING_ASK_ALLWAYS, Action.AS_RADIO_BUTTON) {
+			@Override
+			public void run() {
+				changeLogTarget(Constants.LOGGING_ASK_ALLWAYS);
+			}
+		};
+
+
+		askLogTargetAction.setText(Constants.PREFS_ASK_ALWAYS);
+		askLogTargetAction
+				.setToolTipText(Constants.ACTION_CHANGE_LOGGING_MODE_TOOLTIP_ASK);
+		askLogTargetAction.setImageDescriptor(Activator
+				.getImageDescriptor(Constants.BUTTON_ASK));
+
+	}
+
+	/**
+	 * Opens current callstack item on default editor and pinpoints memory leak.
+	 * line
+	 *
+	 * @param treeObject
+	 *            Tree object
+	 */
+	public final void openEditor(final TreeObject treeObject) {
+		// get file info for all projects
+		getFileInfos(project);
+
+		try {
+
+			// if no project selected
+			if (project == null || !project.isOpen()) {
+				Util.showMessage(Constants.NO_PROJ_SELECT);
+				return;
+			}
+
+			// get selected call stack item
+			CallstackItem callstackItem = treeObject.getCallstackItem();
+			if (callstackItem == null) {
+				return;
+			}
+
+			String cppFileName = getCallstackItemName(callstackItem);
+
+			if (cppFileName == null || ("").equals(cppFileName)) {
+				cppFileName = callstackItem.getFileName();
+			}
+
+			// if leak number is invalid => leave
+			if (callstackItem.getLeakLineNumber() < 1) {
+				return;
+			}
+
+			String line = Integer.toString(callstackItem.getLeakLineNumber());
+
+			IFile file = null;
+			if (project.isOpen()) {
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+						new Path(project.getName() + "\\" + cppFileName));
+			}
+
+			// if file not found in active project
+			// go thru all open projects in current workbench
+			if (file == null || !file.exists()) {
+				IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace()
+						.getRoot();
+				IProject[] projects = myWorkspaceRoot.getProjects();
+				for (int i = 0; i < projects.length; i++) {
+					file = ResourcesPlugin.getWorkspace().getRoot()
+							.getFile(
+									new Path(projects[i].getName() + "\\"
+											+ cppFileName));
+
+					// file found => skip the rest of the projects
+					if (file != null && file.exists()) {
+						break;
+					}
+				}
+
+			}
+
+			// if file still not found
+			// display info to user and leave
+			if (file == null || !file.exists()) {
+				Util.showMessage(Constants.SOURCE_NOT_FOUND);
+				return;
+			}
+
+			IWorkbenchPage page = PlatformUI.getWorkbench()
+					.getActiveWorkbenchWindow().getActivePage();
+
+			HashMap<String, Object> map = new HashMap<String, Object>();
+			map.put(IMarker.LINE_NUMBER, Integer.parseInt(line));
+			map.put(IDE.EDITOR_ID_ATTR, Constants.SOURCE_FILE_EDITOR_ID);
+			IMarker marker = file.createMarker(IMarker.TEXT);
+			marker.setAttributes(map);
+			IDE.openEditor(page, marker);
+
+		} catch (NullPointerException npe) {
+			npe.printStackTrace();
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Updates log target action and report action tooltips.
+	 *
+	 * @see com.nokia.s60tools.analyzetool.ui.IActionListener#preferenceChanged()
+	 */
+	public void preferenceChanged() {
+		// get active logging mode
+		changeLogTarget(null);
+
+		changeReportActionTooltip();
+	}
+
+	/**
+	 * Refresh AnalyzeTool view.
+	 */
+	public final void refreshView() {
+		// update display content
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+
+				updateInformationLabel("");
+
+				// refresh view
+				runView.setInput(getResults(false));
+
+				// refresh callstack view
+				getCallStack(activeTreeItem);
+				if( project != null && project.isOpen() && projectResults.contains(project)) {
+					clearProjectResults.setEnabled(true);
+				}
+				else {
+					clearProjectResults.setEnabled(false);
+				}
+				updateChangeDetailState(project);
+
+			}
+		});
+	}
+
+	/**
+	 * Runs user selected AnalyzeTool action.
+	 *
+	 * @see com.nokia.s60tools.analyzetool.ui.IActionListener#runAction(IProject, com.nokia.s60tools.analyzetool.global.Constants.ACTIONS)
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 *
+	 * @param action
+	 *            Which action to execute
+	 */
+	public void runAction(IProject projectRef, Constants.ACTIONS action) {
+		project = projectRef;
+
+		switch (action) {
+		case RUN_VIEW_MEM_LEAKS:
+			analyzeResults.run();
+			break;
+
+		case RUN_BUILD:
+			buildWithAtool.run();
+			break;
+
+		case RUN_CLEAN:
+			cleanAtoolChanges.run();
+			break;
+
+		default: // by design default statement is empty
+			break;
+		}
+	}
+
+	/**
+	 * Saves existing report or data file asks user where to save.
+	 *
+	 * @param type
+	 *            Which kind of type the file is. Possible types xml or data
+	 *            file
+	 *
+	 * @return True if saving successfully otherwise false
+	 */
+	public final boolean saveReportFile(final int type) {
+		// copy success?
+		boolean success = false;
+
+		// check if project is selected
+		if (project == null) {
+			showMessage(Constants.NO_PROJ_SELECT);
+			return success;
+		}
+
+		// folder location
+		String folder = null;
+
+		// file path and name to use
+		String usedFile = null;
+
+		// save xml file
+		if (type == Constants.SAVE_REPORT_FILE_XML) {
+			String targetPath = Util.getBldInfFolder(project, true)
+					+ Constants.FILENAME_CARBIDE;
+			java.io.File file = new java.io.File(targetPath);
+			if (file.exists()) {
+				String[] names = new String[2];
+				names[0] = "*.xml";
+				names[1] = "*.*";
+
+				Shell shell = null;
+
+				// get shell from teh active view
+				if (runView != null) {
+					shell = runView.getControl().getShell();
+				}
+
+				// if for some reason shell is null => leave
+				if (shell == null) {
+					return success;
+				}
+
+				// ask user where to save xml report file
+				folder = Util.fileSaveDialog(Constants.DIALOG_SAVE_REPORT,
+						names, shell);
+				usedFile = targetPath;
+			} else {
+				Util.showMessage(Constants.INFO_NO_RESULTS_FILE);
+				return success;
+			}
+
+		}
+		// save data file
+		else {
+			String dataFile = Util.isDataFileAvailable(project);
+			// check is there data file which can be used
+			if ((dataFile == null || dataFile.equals(""))
+					&& (usedDataFileName == null || usedDataFileName.equals(""))) {
+				Util.showMessage(Constants.INFO_NO_DATA_FILE);
+				return success;
+			}
+			// if no existing data file opened
+			else if (usedDataFileName == null || usedDataFileName.equals("")) {
+				usedFile = dataFile;
+
+			}
+			// user is already opened data file => save it
+			else {
+				usedFile = usedDataFileName;
+			}
+
+			String[] names = new String[2];
+			names[0] = "*.dat";
+			names[1] = "*.*";
+
+			Shell shell = null;
+
+			// get shell from teh active view
+			if (runView != null) {
+				shell = runView.getControl().getShell();
+			}
+
+			// if for some reason shell is null => leave
+			if (shell == null) {
+				return success;
+			}
+
+			// ask user where to save xml report file
+			folder = Util.fileSaveDialog(Constants.DIALOG_SAVE_TRACE, names,
+					shell);
+		}
+
+		// no folder selected
+		// user press "cancel" button;
+		if (folder == null) {
+			return success;
+		}
+
+		// copy file to folder
+		success = Util.copyFileToFolder(usedFile, folder);
+
+		// report to user
+		if (success) {
+			Util.showMessage(Constants.INFO_SAVE_SUCCESS + folder);
+		} else {
+			Util.showMessage(Constants.MAIN_CAN_NOT_COPY + usedFile);
+		}
+		return success;
+	}
+
+	/**
+	 * Notifies this action delegate that the selection in the workbench has
+	 * changed.
+	 *
+	 * @param part
+	 *            Workbench part
+	 *
+	 * @param selection
+	 *            User selection
+	 */
+	@SuppressWarnings("restriction")
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		// project reference
+		IProject selectedProject = null;
+
+		// check where the selection comes
+		// supported views: CommonNavigator and SymbianProjectNavigator
+		if (!(part instanceof org.eclipse.ui.navigator.CommonNavigator) ) {
+			return;
+		}
+
+		// get selection
+		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+
+		// get first element of selection
+		Object element = structuredSelection.getFirstElement();
+
+		// check selection
+		if (element instanceof IAdaptable) {
+			IAdaptable adaptable = (IAdaptable) element;
+
+			IResource resource = null;
+			if (adaptable instanceof IResource) {
+				resource = (IResource) adaptable;
+			} else if (adaptable instanceof org.eclipse.cdt.internal.ui.cview.IncludeRefContainer) {
+				selectedProject = ((org.eclipse.cdt.internal.ui.cview.IncludeRefContainer) adaptable)
+						.getCProject().getProject();
+			} else if (adaptable instanceof org.eclipse.cdt.core.model.ICProject) {
+				selectedProject = ((org.eclipse.cdt.core.model.ICProject) adaptable)
+						.getProject();
+			} else {
+				resource = (IResource) adaptable
+						.getAdapter(IResource.class);
+			}
+
+			// resource found => get resource project
+			if (resource != null) {
+				selectedProject = resource.getProject();
+			}
+
+		}
+		// first item is null => update build state
+		else if (element == null) {
+			updateBuildState(null);
+		}
+
+		// if project found and it is open => get project results
+		if (selectedProject != null && selectedProject.isOpen()) {
+			project = selectedProject;
+			getProjectResults(selectedProject);
+			updateBuildState(project);
+			if( statisticView != null ) {
+				statisticView.handleProjectChange(project);
+			}
+		}
+	}
+
+
+	/**
+	 * Executes clicAction when user selects item in the AnalyzeTool view.
+	 *
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 *
+	 * @param event
+	 *            Selection changed event
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		clickAction.run();
+	}
+
+	/**
+	 * Passing the focus request to the viewer's control.
+	 */
+	@Override
+	public void setFocus() {
+		runView.getControl().setFocus();
+
+	}
+
+	/**
+	 * Sets text to information label.
+	 */
+	public final void setTextToInformationLabel() {
+		if (activeTreeItem == null) {
+			return;
+		}
+
+		// run information
+		RunResults oneRunResults = projectResults.getRun(project,
+				activeTreeItem.getRunID());
+
+		// no results found => update label
+		if (oneRunResults == null) {
+			updateInformationLabel("");
+		} else {
+			StringBuffer buffer = new StringBuffer(32);
+			buffer.append("Run: ");
+			buffer.append(oneRunResults.getItemID());
+
+			buffer.append(" Memory leaks: ");
+			buffer.append(oneRunResults.getAnalysisItems().size());
+			buffer.append(" Handle leaks: ");
+			buffer.append(oneRunResults.getHandleLeaks().size());
+			if (("").equals(oneRunResults.getEndTime())) {
+				buffer.append("\nStart time: " + oneRunResults.getStartTime()
+						+ " \nEnd time: FAILED");
+			} else {
+				buffer.append("\nStart time: " + oneRunResults.getStartTime()
+						+ " \nEnd time: " + oneRunResults.getEndTime());
+			}
+
+			updateInformationLabel(buffer.toString());
+
+		}
+
+	}
+
+	/**
+	 * Shows error message.
+	 *
+	 * @param message
+	 *            Error message to show
+	 */
+	public final void showErrorMessage(final String message) {
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				Util.showErrorMessage(message);
+			}
+		});
+	}
+
+	/**
+	 * Shows message.
+	 *
+	 * @param message
+	 *            Message to show
+	 */
+	public final void showMessage(final String message) {
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				Util.showMessage(message);
+			}
+		});
+	}
+
+	/**
+	 * Starts traceviewer connection.
+	 */
+	private void start() {
+		// check is project selected and open
+		if (!checkProjectValidity()) {
+			return;
+		}
+
+		// get project file infos
+		getFileInfos(project);
+
+		String dataFile = Util.isDataFileAvailable(project);
+		// if data file already exists, ask for overwrite
+		if (dataFile != null && !dataFile.equalsIgnoreCase("")) {
+			int saveDataFiles = Util
+					.openConfirmationDialogWithCancel(Constants.CONFIRM_OVERWRITE_FILE);
+			if (saveDataFiles == Constants.SAVE_DATA_FILE) {
+				if (!saveReportFile(Constants.SAVE_REPORT_FILE_DATA)) {
+					return;
+				}
+			} else if (saveDataFiles == Constants.SAVE_DATA_FILE_CANCEL) {
+				// user press "Cancel" so return and do nothing
+				return;
+			}
+
+			// delete existing data file
+			Util.deleteDataFile(project);
+		}
+
+		ICarbideProjectInfo info = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+		ICarbideBuildConfiguration config = info.getDefaultConfiguration();
+
+		//start listening emulator output
+		if( config.getPlatformString().equals(Constants.BUILD_TARGET_WINSCW) ) {
+
+			listeningJob = new EpocReader(project, this);
+			listeningJob.start();
+
+			traceStarted();
+
+			return;
+		}
+
+		// else start trace capturing using Tracing utility connection
+
+		// main view class instance
+		// this instance if passed to the TraceWrapper class
+		final MainView selfInstance = this;
+		Job activateTrace = new Job(Constants.STARTING_TRACE) {
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				try {
+
+					// update progress monitor state
+					monitor.beginTask(Constants.STARTING_TRACE,
+							IProgressMonitor.UNKNOWN);
+
+					// load TraceWrapper class
+					Class<?> buildManagerClass = Class
+							.forName("com.nokia.s60tools.analyzetool.trace.TraceWrapper");
+
+					// get TraceWrapper class available methods
+					java.lang.reflect.Method[] methods = buildManagerClass
+							.getMethods();
+
+					// thru methods
+					for (int i = 0; i < methods.length; i++) {
+						// get one method
+						java.lang.reflect.Method oneMethod = methods[i];
+
+						// if method name is "connect"
+						if (oneMethod.getName().equalsIgnoreCase("connect")) {
+
+							// parameters for the connect method
+							Object[] objs = new Object[1];
+							objs[0] = selfInstance;
+
+							// call connect method
+							String returnValue = (String) oneMethod.invoke(
+									buildManagerClass.newInstance(), objs);
+
+							// if there was no errors while connection
+							if (("").equals(returnValue)) {
+
+								// invoke parser to open needed streams
+								parser.openStreams(Util.getBldInfFolder(
+										project, true));
+
+								traceStarted();
+							} else {
+								traceAction
+										.setImageDescriptor(Activator
+												.getImageDescriptor((Constants.BUTTON_RUN)));
+								traceActive = false;
+
+								showErrorMessage(returnValue);
+							}
+						}
+					}
+				} catch (ClassNotFoundException cnfe) {
+					cnfe.printStackTrace();
+
+				} catch (SecurityException se) {
+					se.printStackTrace();
+
+				} catch (IllegalAccessException iae) {
+					iae.printStackTrace();
+
+				} catch (IllegalArgumentException iare) {
+					iare.printStackTrace();
+
+				} catch (java.lang.reflect.InvocationTargetException ite) {
+					ite.printStackTrace();
+
+				} catch (InstantiationException iv) {
+					iv.printStackTrace();
+				}
+
+				return new Status(IStatus.OK, Constants.ANALYZE_CONSOLE_ID,
+						IStatus.OK, "Trace started", null);
+			}
+		};
+		activateTrace.setUser(true);
+		activateTrace.schedule();
+
+	}
+
+	/**
+	 * Starts subtests.
+	 */
+	public final void startSubTest() {
+		// get started processes
+		Hashtable<String, Integer> startedPros = null;
+
+		// if parser exists => means that the tracing is started and processes
+		// info is available
+		if (parser != null) {
+			startedPros = parser.getStartedProcesses();
+		}
+
+		// no processes = >show info and leave
+		if (startedPros == null || startedPros.isEmpty()) {
+			Util.showMessage(Constants.SUBTEST_NO_PROCESSES);
+			return;
+		}
+
+		// get started target info
+		AbstractList<String> targets = new ArrayList<String>();
+		for (java.util.Enumeration<String> e = startedPros.keys(); e
+				.hasMoreElements();) {
+			String processName = e.nextElement();
+			targets.add(processName);
+		}
+
+		// used target
+		String target = null;
+
+		// processes found, print info to user
+		if (targets.size() == 1) {
+			target = targets.get(0);
+		} else {
+			target = Util.openSelectionDialog(Constants.SUBTEST_SELECT_TARGET,
+					Constants.SUBTEST_RUNNING_PROCESSES_INFO, targets);
+
+		}
+		if (target == null || ("").equals(target) ) {
+			return;
+		}
+
+		// ask for subtest name
+		CustomInputDialog dialog = new CustomInputDialog(
+				Constants.ANALYZE_TOOL_TITLE, Constants.SUBTEST_INPUT_NAME, "");
+		dialog.open();
+		String subTestName = dialog.getUserInput();
+
+		if (subTestName == null || subTestName.length() == 0) {
+			return;
+		}
+
+		// get process id for selected target
+		int processID = startedPros.get(target);
+
+		// if subtest allready exists
+		if (isSubtestExists(subTestName, target)) {
+			Util.showMessage(Constants.SUBTEST_ALLREADY_RUNNING);
+			return;
+		}
+
+		// create new subtes object and add it to AbstractList
+		ActiveSubtests subtes = new ActiveSubtests(subTestName, target,
+				processID);
+		startedSubtest.add(subtes);
+
+		// start subtest
+		parser.parse(Constants.PREFIX + " " + processID + " TEST_START 0000 "
+				+ subTestName);
+		updateSubtestInfoText(Constants.SUBTEST_STARTED + target
+				+ Constants.ENRULE + subTestName);
+
+		stopSubtest.setEnabled(true);
+	}
+
+	/**
+	 * Stop external message tracing.
+	 */
+	public final void stop(boolean analyze) {
+
+		ICarbideProjectInfo info = CarbideBuilderPlugin.getBuildManager().getProjectInfo(project);
+		ICarbideBuildConfiguration config = info.getDefaultConfiguration();
+		if( config.getPlatformString().equalsIgnoreCase(Constants.BUILD_TARGET_WINSCW) ) {
+			listeningJob.stop();
+			traceStopped(analyze);
+			return;
+		}
+
+		//else stop Tracing utility connection
+		try {
+			Class<?> buildManagerClass = Class
+					.forName("com.nokia.s60tools.analyzetool.trace.TraceWrapper");
+
+			java.lang.reflect.Method[] methods = buildManagerClass.getMethods();
+			for (int i = 0; i < methods.length; i++) {
+				java.lang.reflect.Method oneMethod = methods[i];
+				if (oneMethod.getName().equalsIgnoreCase("disconnect")) {
+
+					Object[] objs = new Object[1];
+					objs[0] = this;
+					String returnValue = (String) oneMethod.invoke(
+							buildManagerClass.newInstance(), new Object[] {});
+					if (("").equals(returnValue)) {
+						traceStopped(analyze);
+					} else {
+						showErrorMessage("Error while disconnecting Tracing utility");
+						traceAction.setImageDescriptor(Activator
+								.getImageDescriptor((Constants.BUTTON_STOP)));
+						traceActive = true;
+					}
+				}
+			}
+		} catch (ClassNotFoundException cnfe) {
+			cnfe.printStackTrace();
+
+		} catch (SecurityException se) {
+			se.printStackTrace();
+
+		} catch (IllegalAccessException iae) {
+			iae.printStackTrace();
+
+		} catch (IllegalArgumentException iare) {
+			iare.printStackTrace();
+
+		} catch (java.lang.reflect.InvocationTargetException ite) {
+			ite.printStackTrace();
+
+		} catch (InstantiationException iv) {
+			iv.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * Updates button states and creates results for project.
+	 */
+	private void traceStopped(boolean analyze) {
+		// update icon and information text
+		traceAction.setImageDescriptor(Activator
+				.getImageDescriptor((Constants.BUTTON_RUN)));
+		traceAction.setText(Constants.ACTION_START_TRACE);
+		traceAction
+				.setToolTipText(Constants.ACTION_START_TRACE);
+		traceActive = false;
+
+		// close any active subtests
+		if (!startedSubtest.isEmpty()) {
+			for (int j = 0; j < startedSubtest.size(); j++) {
+				ActiveSubtests oneSubtest = startedSubtest
+						.get(j);
+				parser.parse(Constants.PREFIX + " "
+						+ oneSubtest.getProcessID()
+						+ " TEST_END" + " 0000 "
+						+ oneSubtest.getName());
+			}
+			startedSubtest.clear();
+		}
+
+		// tell parser to finish => write data to file
+		parser.finish();
+
+		// inform user
+		updateLabel(Constants.INFO_TRACE_STOP);
+
+		// set start and stop trace not visible
+		startSubtest.setEnabled(false);
+		stopSubtest.setEnabled(false);
+		fileOpenMenu.setEnabled(true);
+		saveFileMenu.setEnabled(true);
+		cleanAtoolChanges.setEnabled(true);
+
+		project = traceStartedProjectRef;
+
+		// parse and analyze saved data file
+		if( analyze ) {
+			analyzeDataFile(Constants.ANALYZE_USE_DATA_FILE, null,
+					true);	
+		}
+	}
+
+	/**
+	 * Stop one subtest If there multiple subtest running ask for user to which
+	 * one to stop.
+	 */
+	public final void stopSubTest() {
+		// no processes show info
+		if (startedSubtest.isEmpty()) {
+			Util.showMessage(Constants.SUBTEST_NO_SUBTESTS);
+		} else {
+			// only one subtest no need to ask for users
+			if (startedSubtest.size() == 1) {
+				ActiveSubtests oneSubtest = startedSubtest.get(0);
+				parser.parse(Constants.PREFIX + " " + oneSubtest.getProcessID()
+						+ " TEST_END" + " 0000 " + oneSubtest.getName());
+				updateSubtestInfoText(Constants.SUBTEST_ENDED
+						+ oneSubtest.getTargetName() + Constants.ENRULE
+						+ oneSubtest.getName());
+				startedSubtest.remove(0);
+				stopSubtest.setEnabled(false);
+			} else { // multiple subtest found ask for the user which to stop
+				// multiple subtest found ask for user which to be ended
+				AbstractList<String> tmpSubtest = new ArrayList<String>();
+
+				// get list of active subtests
+				for (int i = 0; i < startedSubtest.size(); i++) {
+					ActiveSubtests oneSubtest = startedSubtest.get(i);
+					String tmpStr = oneSubtest.getTargetName()
+							+ Constants.ENRULE + oneSubtest.getName();
+					tmpSubtest.add(tmpStr);
+				}
+
+				String selection = Util.openSelectionDialog(
+						Constants.SUBTEST_SELECT_SUBTEST_TO_STOP, null,
+						tmpSubtest);
+				// thru active subtests
+				for (int k = 0; k < startedSubtest.size(); k++) {
+					// get one subtest
+					ActiveSubtests oneSubtest = startedSubtest.get(k);
+
+					// split user selected subtest information to get subtest
+					// name
+					String[] splittedText = selection.split(" ");
+
+					// if user selected subtest name and current subtest equals
+					if (splittedText[2].equals(oneSubtest.getName())) {
+						// write subtest end tag to data file
+						parser.parse(Constants.PREFIX + " "
+								+ oneSubtest.getProcessID() + " TEST_END"
+								+ " 0000 " + oneSubtest.getName());
+						updateSubtestInfoText(Constants.SUBTEST_ENDED
+								+ oneSubtest.getTargetName() + Constants.ENRULE
+								+ oneSubtest.getName());
+						// remove current subtest from active subtest
+						// AbstractList
+						startedSubtest.remove(k);
+						break;
+					}
+				}
+
+				if (startedSubtest.isEmpty()) {
+					stopSubtest.setEnabled(false);
+				}
+			}
+		}
+	}
+
+	/**
+	 * When AnalyzeTool view tree model is collapsed.
+	 *
+	 * @see org.eclipse.jface.viewers.ITreeViewerListener#treeCollapsed(org.eclipse.jface.viewers.TreeExpansionEvent)
+	 *
+	 * @param event
+	 *            Tree expansion event
+	 */
+	public void treeCollapsed(TreeExpansionEvent event) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+	/**
+	 * When AnalyzeTool view tree model is expanded.
+	 *
+	 * @see org.eclipse.jface.viewers.ITreeViewerListener#treeExpanded(org.eclipse.jface.viewers.TreeExpansionEvent)
+	 *
+	 * @param event
+	 *            Tree expansion event
+	 */
+	public void treeExpanded(TreeExpansionEvent event) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+	/**
+	 * Updates allocation count in the information label.
+	 *
+	 * The information layout is hard to modify so we need to manage information
+	 * label text
+	 */
+	public final void updateAllocNumber() {
+
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+
+				// if lable is created
+				if (informationLabel != null) {
+					// get existing label text
+					String tmpText = informationLabel.getText();
+
+					// split existing text
+					String[] strArray = tmpText.split(lineFeed);
+
+					// if text contains more than 3 lines
+					if (strArray.length >= 2) {
+						// create new buffer
+						StringBuffer tmpBuffer = new StringBuffer(
+								strArray.length);
+
+						// set memory allocation size
+						strArray[1] = Constants.INFO_ALLOCATED_MEM
+								+ parser.getAllocationsSize();
+
+						// get updated text to buffer
+						for (int i = 0; i < strArray.length; i++) {
+							tmpBuffer.append(strArray[i]);
+							tmpBuffer.append(lineFeed);
+						}
+
+						// set new text to information label
+						informationLabel.setText(tmpBuffer.toString());
+					} else {
+						informationLabel.setText(tmpText + lineFeed
+								+ Constants.INFO_ALLOCATED_MEM
+								+ parser.getAllocationsSize());
+					}
+
+				}
+
+			}
+		});
+
+	}
+
+	/**
+	 * Update build action icon and tooltip text.
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 */
+	public final void updateBuildState(final IProject projectRef) {
+		if (buildWithAtool == null) {
+			return;
+		}
+
+		BuilderUtil util = new BuilderUtil();
+
+		// if project is not selected
+		if (projectRef == null) {
+			buildWithAtool.setText(Constants.ACTION_AT_BUILD_DEACTIVE);
+			buildWithAtool.setToolTipText(Constants.ACTION_AT_BUILD_DEACTIVE);
+			buildWithAtool.setChecked(false);
+		}
+		// if AnalyzeTool build is enabled
+		else if (util.isNatureEnabled(projectRef)) {
+			buildWithAtool.setText(Constants.ACTION_AT_BUILD_ACTIVE);
+			buildWithAtool.setToolTipText(Constants.ACTION_AT_BUILD_ACTIVE);
+			buildWithAtool.setChecked(true);
+		} else {
+			buildWithAtool.setText(Constants.ACTION_AT_BUILD_DEACTIVE);
+			buildWithAtool.setToolTipText(Constants.ACTION_AT_BUILD_DEACTIVE);
+			buildWithAtool.setChecked(false);
+		}
+
+	}
+
+	/**
+	 * Indicates the target (emulator/device) by inspecting the given projects build configuration.
+	 * @param selectedProject the currently active project
+	 * @return "emulator" if the build configuration is WINSCW, "device" otherwise
+	 */
+	private static String getTraceTarget(final IProject selectedProject) {
+		String target = "";
+		if (selectedProject != null && selectedProject.isOpen()) {
+			ICarbideProjectInfo info = CarbideBuilderPlugin.getBuildManager().getProjectInfo(selectedProject);
+			if (info != null) {
+				ICarbideBuildConfiguration config = info.getDefaultConfiguration();
+				target = config.getPlatformString().equals(
+						Constants.BUILD_TARGET_WINSCW) ? Constants.INFO_TRACE_FROM_EMULATOR : Constants.INFO_TRACE_FROM_DEVICE;
+			}
+		}
+		return target;
+	}
+
+	/**
+	 * Update change detail action state.
+	 *
+	 * @param projectRef
+	 *            Current project
+	 */
+	public final void updateChangeDetailState(final IProject projectRef) {
+		if (changeDetails == null) {
+			return;
+		}
+
+		if (projectRef == null) {
+			changeDetails.setEnabled(false);
+			refreshResults.setEnabled(false);
+			return;
+		} else if (projectResults.contains(projectRef)) {
+			changeDetails.setEnabled(true);
+		} else {
+			changeDetails.setEnabled(false);
+		}
+
+		String dataFile = projectResults.getDataFileName(projectRef);
+		if( dataFile != null ) {
+			int fileType = UseAtool.checkFileType(dataFile);
+			if( fileType == Constants.DATAFILE_TRACE || fileType == Constants.DATAFILE_LOG ) {
+				refreshResults.setEnabled(true);
+			}
+			else {
+				refreshResults.setEnabled(false);
+			}
+		}
+		else {
+			refreshResults.setEnabled(false);
+		}
+	}
+
+	/**
+	 * Sets information to the information label.
+	 *
+	 * @param infoText
+	 *            Info text
+	 */
+	private void updateInformationLabel(final String infoText) {
+		// trace is active => do not update information label
+		if (traceActive) {
+			return;
+		}
+
+		// sync with the UI thread
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				// if informationlabel exists set text
+				if (informationLabel != null) {
+					informationLabel.setText(infoText);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Updates label by given string.
+	 *
+	 * @param line
+	 *            String to display
+	 */
+	public final void updateLabel(final String line) {
+
+		final String oneLine = line;
+
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				// if informationlabel exists set text
+				if (informationLabel != null) {
+					informationLabel.setText(oneLine);
+				}
+
+			}
+		});
+
+	}
+
+	/**
+	 * Updates Subtest info to the information label.
+	 *
+	 * The information layout is hard to modify so we need to manage information
+	 * label text
+	 *
+	 * @param text
+	 *            New label text
+	 */
+	private void updateSubtestInfoText(final String text) {
+		final String newText = text;
+
+		runView.getControl().getDisplay().syncExec(new Runnable() {
+			public void run() {
+
+				// if label exists
+				if (informationLabel != null) {
+					// get existing label text
+					String origText = informationLabel.getText();
+
+					// split existing text
+					String[] strArray = origText.split(lineFeed);
+
+					// create new buffer
+					StringBuffer tmpBuffer = new StringBuffer(strArray.length);
+					if (strArray.length >= 3) {
+						// update text
+						strArray[2] = newText;
+
+						// get updated text to buffer
+						for (int i = 0; i < strArray.length; i++) {
+							tmpBuffer.append(strArray[i]);
+							tmpBuffer.append(lineFeed);
+						}
+						// set new text to information label
+						informationLabel.setText(tmpBuffer.toString());
+					} else {
+						informationLabel.setText(origText + newText);
+					}
+
+				}
+
+			}
+		});
+	}
+
+	/**
+	 * Updates button states, clears existing project data and updating view.
+	 */
+	private void traceStarted() {
+		// clear view contents
+		cleanAnalyzeData(project);
+		clearCallstackViewContent();
+		traceStartedProjectRef = project;
+
+		// change icon and information text
+		traceAction
+				.setImageDescriptor(Activator
+						.getImageDescriptor((Constants.BUTTON_STOP)));
+		traceAction
+				.setText(Constants.ACTION_STOP_TRACE);
+		traceAction
+				.setToolTipText(Constants.ACTION_STOP_TRACE);
+		traceActive = true;
+
+		String fromTarget = getTraceTarget(traceStartedProjectRef);
+		updateLabel(fromTarget.length()==0 ? Constants.INFO_TRACE_START : String.format(Constants.INFO_TRACE_FROM_TARGET_START, fromTarget));
+		// add2UserActionHistory( "Trace started for
+		// project: "
+		// +project.getName() +" at "+ Util.getTime() );
+
+		// set start and stop subtest visible
+		startSubtest.setEnabled(true);
+		stopSubtest.setEnabled(false);
+		fileOpenMenu.setEnabled(false);
+		saveFileMenu.setEnabled(false);
+		cleanAtoolChanges.setEnabled(false);
+
+		updateAllocNumber();
+	}
+
+	/**
+	 * Overrided method to capture keyevents.
+	 *
+	 * @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyPressed(KeyEvent e) {
+
+		// C key address(hex)
+		final int CTRL_C = 0x3;
+
+		// key event character
+		int charValue = e.character;
+
+		// c key pressed
+		boolean cPressed = (charValue == CTRL_C); // This should be enough
+
+		// ctrl key pressed
+		boolean ctrlPressed = (e.stateMask & SWT.CTRL) != 0;
+
+		//if ctrl and c key pressed => run copy action
+		if(ctrlPressed & cPressed){
+			// Triggering copy action
+			copyAction.run();
+		}
+
+	}
+
+	/**
+	 * (non-Javadoc)
+	 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+	 */
+	public void keyReleased(KeyEvent e) {
+		// This method is overrided
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/ResourceVisitor.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ResourceVisitor
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+
+import com.nokia.s60tools.analyzetool.internal.ui.graph.AnalyzeToolGraph;
+import com.nokia.s60tools.analyzetool.ui.statistic.StatisticView;
+
+/**
+ * Class to visit resources in the project.
+ *
+ * @author araj modified kihe
+ *
+ */
+public class ResourceVisitor implements IResourceVisitor {
+
+	/** Parent class reference. */
+	private final Object arg0;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parentClass Parent class reference
+	 */
+	public ResourceVisitor(final Object parentClass) {
+		this.arg0 = parentClass;
+	}
+
+	/**
+	 * Visit every resource of project.
+	 *
+	 * @see org.eclipse.core.resources.IResourceVisitor#visit(org.eclipse.core.resources.IResource)
+	 *
+	 * @param resource
+	 *            One resource of the project
+	 */
+	public boolean visit(IResource resource) {
+
+		// if visit request came from main view
+		if (arg0 instanceof MainView) {
+			MainView mainView = (MainView) arg0;
+			mainView.loadFileInfo(resource);
+		}
+		else if( arg0 instanceof StatisticView )
+		{
+			StatisticView stats = (StatisticView)arg0;
+			stats.loadFileInfo(resource);
+		}
+		else if(arg0 instanceof AnalyzeToolGraph) {
+			AnalyzeToolGraph chart = (AnalyzeToolGraph)arg0;
+			chart.loadFileInfo(resource);
+		}
+		return true;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeHelper.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,640 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class TreeHelper
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import java.util.AbstractList;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.nokia.s60tools.analyzetool.engine.AnalysisItem;
+import com.nokia.s60tools.analyzetool.engine.CallstackItem;
+import com.nokia.s60tools.analyzetool.engine.MMPInfo;
+import com.nokia.s60tools.analyzetool.engine.RunResults;
+import com.nokia.s60tools.analyzetool.engine.Subtest;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+
+/**
+ * Class to create Tree model for the AnalyzeTool view.
+ *
+ * @author kihe
+ *
+ */
+public class TreeHelper {
+
+
+	/** Last active memory leak tree item. */
+	private TreeObject activeTreeItem;
+
+	/** Last selected tree item. */
+	private final Object lastSelectedObject;
+
+	/** Contains module leak info. */
+	private final java.util.Hashtable<String, Integer> moduleLeaks;
+
+	/** Used AnalyzeTool preference store */
+	private final IPreferenceStore store;
+
+	/** Contains already checked modules states */
+	private final Hashtable<String, Boolean> checkedModules;
+
+	/** Contains information which modules are part of the project */
+	private final Hashtable<String, Boolean> projectModules;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param selectedObject
+	 *            Last selected tree item
+	 *
+	 * @param storeRef AnalyzeTool preference store reference
+	 */
+	public TreeHelper(final Object selectedObject,
+			final IPreferenceStore storeRef) {
+		lastSelectedObject = selectedObject;
+		moduleLeaks = new java.util.Hashtable<String, Integer>();
+		store = storeRef;
+		checkedModules = new Hashtable<String, Boolean>();
+		projectModules = new Hashtable<String, Boolean>();
+	}
+
+	/**
+	 * Compares two different TreeObject.
+	 *
+	 * @param obj1
+	 *            Actual
+	 * @param obj2
+	 *            New object
+	 * @return True if objects equals otherwise false
+	 */
+	public final boolean compareItems(final Object obj1, final Object obj2) {
+		boolean found = false;
+
+		if (obj1 == null || obj2 == null) {
+			return false;
+		}
+
+		TreeObject tree1 = (TreeObject) obj1;
+		TreeObject tree2 = (TreeObject) obj2;
+
+		if (tree1.getMemLeakID() == tree2.getMemLeakID()
+				&& tree1.getRunID() == tree2.getRunID()
+				&& tree1.getName().equals(tree2.getName())
+				&& tree1.getSubtestID() == tree2.getSubtestID()) {
+			activeTreeItem = (TreeObject) obj1;
+			found = true;
+		}
+		return found;
+	}
+
+	/**
+	 * Creates tree node for analysis items.
+	 *
+	 * @param oneRunTree
+	 *            Current item parent tree node
+	 * @param items
+	 *            Analysis items
+	 * @param runID
+	 *            Current run id
+	 * @param isSubtest
+	 *            Is this element subtest
+	 * @param subTestID
+	 *            Subtest ID
+	 * @param modules Selected project target modules
+	 * @return How many items created
+	 */
+	public final int createItemResults(final TreeParent oneRunTree,
+			final AbstractList<AnalysisItem> items, final int runID,
+			final boolean isSubtest, final int subTestID, AbstractList<MMPInfo> modules) {
+		boolean thereAreItemsDisplayed = false;
+		moduleLeaks.clear();
+
+		int displayed = 0;
+		// thru actual memory leaks
+		Iterator<AnalysisItem> iterItem = items.iterator();
+		while (iterItem.hasNext()) {
+			// get one analysis file
+			AnalysisItem oneItem = iterItem.next();
+
+			if (getActiveDetailLevel().equals(Constants.REPORT_EVERY)
+					|| oneItem.containValidCallstack()) {
+				displayed++;
+				char space = ' ';
+				StringBuffer leakString = new StringBuffer(64);
+				leakString.append(Constants.ITEM_TREE_MEM_LEAKS);
+				leakString.append(oneItem.getID());
+				leakString.append(" (");
+				leakString.append(oneItem.getLeakSize());
+				leakString.append(" bytes) (");
+				leakString.append(oneItem.getMemoryAddress());
+				leakString.append(") ");
+				leakString.append(oneItem.getMemoryLeakTime());
+				leakString.append(space);
+				leakString.append(oneItem.getModuleName());
+
+				TreeObject oneLeak = new TreeObject();
+				if (!modules.isEmpty()) {
+					oneLeak.setBuild(checkItemBuildState(modules, oneItem.getModuleName()));
+					oneLeak.setBelongs(checkProjectModules(modules, oneItem.getModuleName()));
+				}
+
+				if (isSubtest) {
+					oneLeak.setSubtest(true);
+					oneLeak.setSubtestID(subTestID);
+				}
+				oneLeak.setRunID(runID);
+				oneLeak.setMemLeakID(oneItem.getID());
+				oneLeak.setName(leakString.toString());
+				oneLeak.setModuleName(oneItem.getModuleName());
+				oneLeak.setMemAddress(oneItem.getMemoryAddress());
+
+				oneRunTree.addChild(oneLeak);
+				thereAreItemsDisplayed = true;
+				updateModuleLeaksInfo(oneItem.getModuleName());
+				compareItems(oneLeak, lastSelectedObject);
+			}
+
+		}
+
+		// if no leaks added to list
+		if (!thereAreItemsDisplayed && !items.isEmpty()) {
+			TreeObject infoObject = new TreeObject();
+			infoObject.setName(Constants.NO_MEM_LEAKS_CURRENT_LEVEL);
+			oneRunTree.addChild(infoObject);
+		}
+		return displayed;
+	}
+
+	/**
+	 * Check is module built with AnalyzeTool
+	 * @param modules Project modules
+	 * @param moduleName Module name
+	 * @return True if module is built with AnalyzeTool otherwise false
+	 */
+	private final boolean checkItemBuildState( AbstractList<MMPInfo> modules, String moduleName)
+	{
+		if( checkedModules.containsKey(moduleName)) {
+			return checkedModules.get(moduleName);
+		}
+		else if (!modules.isEmpty()) {
+			boolean build = Util.chechModuleBuildState(modules, moduleName);
+			if( !build ) {
+				checkedModules.put(moduleName, build);
+			}
+			return build;
+		}
+		return false;
+	}
+
+	/**
+	 * Checks is module part of the project
+	 * @param modules Project modules
+	 * @param moduleName Module name
+	 * @return True if module is part of the project otherwise false
+	 */
+	private final boolean checkProjectModules(AbstractList<MMPInfo> modules, String moduleName)
+	{
+		if( projectModules.containsKey(moduleName) ) {
+			return projectModules.get(moduleName);
+		}
+		else if( !modules.isEmpty() ) {
+			boolean partOfTheProject = Util.isModulePartOfProject(modules,moduleName);
+			projectModules.put(moduleName, partOfTheProject);
+			return partOfTheProject;
+		}
+		return false;
+	}
+
+	/**
+	 * Creates tree item for run results.
+	 *
+	 * @param oneRunResults
+	 *            One run results
+	 * @param modules Selected project target modules
+	 * @return Tree item which contains run results
+	 */
+	public final TreeParent createRunResults(final RunResults oneRunResults, AbstractList<MMPInfo> modules) {
+
+		// create new run tree
+		TreeParent oneRunTree = new TreeParent("");
+		oneRunTree.setRunID(oneRunResults.getItemID());
+
+		// create new handle leak tree
+		TreeParent handleSummary = getHandleLeakInfo(oneRunResults
+				.getHandleLeaks(), oneRunResults.getItemID(), modules);
+		if (handleSummary.hasChildren()) {
+			oneRunTree.addChild(handleSummary);
+		}
+
+		// if no memory leaks set "No memory leaks" info
+		AbstractList<AnalysisItem> items = oneRunResults.getAnalysisItems();
+		if (items.isEmpty()) {
+			TreeObject noLeaks = new TreeObject();
+			noLeaks.setName(Constants.RUN_NO_LEAKS);
+			oneRunTree.addChild(noLeaks);
+		}
+
+		// create item tree and calculate how many of memory leaks are displayed
+		int howManyDisplayed = createItemResults(oneRunTree, items,
+				oneRunResults.getItemID(), false, 0, modules);
+		oneRunTree.setName(getRunTreeTitle(oneRunResults, howManyDisplayed));
+
+		// module leaks
+		TreeParent moduleSummary = getModuleLeakInfo(getCalcModuleLeaksInfo(),
+				oneRunResults.getItemID(), modules);
+		if (moduleSummary.hasChildren()) {
+			oneRunTree.addChild(0, moduleSummary);
+		}
+
+		// get subtests
+		AbstractList<Subtest> subtest = oneRunResults.getSubtest();
+		createSubtestResults(oneRunTree, subtest, oneRunResults.getItemID(), modules);
+
+		return oneRunTree;
+	}
+
+	/**
+	 * Creates tree node for subtests.
+	 *
+	 * @param oneRunTree
+	 *            Parent tree node
+	 * @param subtest
+	 *            Subtest information
+	 * @param runID
+	 *            Current run id
+	 * @param modules Selected project target modules
+	 */
+	public final void createSubtestResults(final TreeParent oneRunTree,
+			final AbstractList<Subtest> subtest, final int runID, AbstractList<MMPInfo> modules) {
+		// thru subtest
+		Iterator<Subtest> iterSubtest = subtest.iterator();
+
+		// thru subtest
+		while (iterSubtest.hasNext()) {
+			// get subtest
+			Subtest oneSubtest = iterSubtest.next();
+
+			// create tree item for the subtest
+			TreeParent oneSubtestParent = new TreeParent("");
+
+			// get and calculate how many memory leaks subtest contains
+			int howManyDisplayed = createItemResults(oneSubtestParent,
+					oneSubtest.getAnalysisItems(), runID, true, oneSubtest
+							.getItemID(), modules);
+
+			// udpate subtest tree title
+			oneSubtestParent.setName(getSubtestTreeTitle(oneSubtest,
+					howManyDisplayed));
+
+			if (oneSubtest.getAnalysisItems().isEmpty()) {
+				TreeObject noLeaks = new TreeObject();
+				noLeaks.setName(Constants.RUN_NO_LEAKS);
+				oneSubtestParent.addChild(noLeaks);
+			}
+
+			// if subtest contains handle leaks
+			TreeParent handleLeaksInfo = getHandleLeakInfo(oneSubtest
+					.getHandleLeaks(), oneSubtest.getItemID(), modules);
+			if (handleLeaksInfo.hasChildren()) {
+				oneSubtestParent.addChild(handleLeaksInfo);
+			}
+
+			// set subtest module leak info
+			TreeParent moduleLeaksInfo = getModuleLeakInfo(
+					getCalcModuleLeaksInfo(), oneSubtest.getItemID(), modules);
+			if (moduleLeaksInfo.hasChildren()) {
+				oneSubtestParent.addChild(0, moduleLeaksInfo);
+			}
+
+			oneRunTree.addChild(oneSubtestParent);
+		}
+	}
+
+	/**
+	 * Gets active detail level.
+	 *
+	 * @return Active detail level
+	 */
+	public final String getActiveDetailLevel() {
+		// get active report level
+		return store.getString(Constants.REPORT_LEVEL);
+	}
+
+	/**
+	 * Returns active item of tree.
+	 *
+	 * @return Active itemf
+	 */
+	public final TreeObject getActiveItem() {
+		return activeTreeItem;
+	}
+
+	/**
+	 * Returns tree item which contains callstack information.
+	 *
+	 * @param item
+	 *            AnalysisItem
+	 * @param modules Selected project target modules
+	 * @return Tree item
+	 */
+	public final TreeParent getCallstack(final AnalysisItem item, AbstractList<MMPInfo> modules) {
+
+		// get active logging mode
+		String reportLevel = store.getString(Constants.REPORT_LEVEL);
+
+		// create tree parent for test runs
+		TreeParent testRuns = new TreeParent(Constants.ITEM_TREE_MEM_LEAKS
+				+ item.getID() + " " + item.getMemoryLeakTime());
+
+		// get callstack items
+		Iterator<CallstackItem> stackItems = item.getCallstackItems()
+				.iterator();
+
+		// is one know line printed
+		boolean printed = false;
+
+		// thru call stack items
+		while (stackItems.hasNext()) {
+			// get one callstack item
+			CallstackItem oneStackItem = stackItems.next();
+
+			TreeObject to = new TreeObject();
+
+			// get function name, memory leak line number and file name
+			String functionName = oneStackItem.getFunctionName();
+			int leakLineNumber = oneStackItem.getLeakLineNumber();
+			String fileName = oneStackItem.getFileName();
+			String memAddress = oneStackItem.getMemoryAddress();
+			String moduleName = oneStackItem.getModuleName();
+
+			if (!modules.isEmpty()) {
+				to.setBuild(checkItemBuildState(modules, moduleName));
+				to.setBelongs(checkProjectModules(modules, moduleName));
+			}
+
+			// report all
+			if (Constants.REPORT_EVERY.equals(reportLevel)) {
+
+				if (leakLineNumber > 0) {
+					// if build is urel
+					// => change info order
+					if (oneStackItem.isUrelBuild()) {
+						to.setName(memAddress + " " + moduleName + " "
+								+ functionName + " " + leakLineNumber + " "
+								+ fileName);
+					} else {
+						to.setName(memAddress + " " + moduleName + " "
+								+ functionName + " " + fileName + " "
+								+ leakLineNumber);
+					}
+
+				} else {
+					to.setName(memAddress + " " + moduleName + " "
+							+ functionName + " " + fileName);
+				}
+
+				to.setCallstackItem(oneStackItem);
+				testRuns.addChild(to);
+			}
+			// display only known lines
+			else if (Constants.REPORT_KNOWN.equals(reportLevel)
+					&& (functionName != null && leakLineNumber > 0 && fileName != null)) {
+				// if build is urel
+				// => change info order
+				if (oneStackItem.isUrelBuild()) {
+					to.setName(memAddress + " " + moduleName + " "
+							+ functionName + " " + leakLineNumber + " "
+							+ fileName);
+				} else {
+					to.setName(memAddress + " " + moduleName + " "
+							+ functionName + " " + fileName + " "
+							+ leakLineNumber);
+				}
+				to.setCallstackItem(oneStackItem);
+				testRuns.addChild(to);
+			}
+			// display only topmost
+			else if (Constants.REPORT_TOPMOST.equals(reportLevel)
+					&& !printed
+					&& (functionName != null && leakLineNumber > 0 && fileName != null)) {
+				// if build is urel
+				// => change info order
+				if (oneStackItem.isUrelBuild()) {
+					to.setName(memAddress + " " + moduleName + " "
+							+ functionName + " " + leakLineNumber + " "
+							+ fileName);
+				} else {
+					to.setName(memAddress + " " + moduleName + " "
+							+ functionName + " " + fileName + " "
+							+ leakLineNumber);
+				}
+				to.setCallstackItem(oneStackItem);
+				testRuns.addChild(to);
+				printed = true;
+			}
+
+		}
+
+		TreeParent incRoot;
+		incRoot = new TreeParent(Constants.ANALYZE_TOOL_TITLE);
+		incRoot.addChild(testRuns);
+		return incRoot;
+	}
+
+	/**
+	 * Gets handle leaks tree item.
+	 *
+	 * @param handleLeaks
+	 *            Handle leaks information
+	 * @param runID
+	 *            Run id
+	 * @param modules Selected project target modules
+	 * @return Handle leak tree item
+	 */
+	public final TreeParent getHandleLeakInfo(
+			final Hashtable<String, Integer> handleLeaks, final int runID, AbstractList<MMPInfo> modules) {
+		// get handle leak information
+		TreeParent handleSummary = new TreeParent(
+				Constants.HANDLE_LEAK_MODULES_TITLE);
+		handleSummary.setRunID(runID);
+		for (java.util.Enumeration<String> e1 = handleLeaks.keys(); e1
+				.hasMoreElements();) {
+			String moduleName = e1.nextElement();
+			int handleLeakCount = handleLeaks.get(moduleName);
+			TreeObject object = new TreeObject();
+			object.setRunID(runID);
+			object.setName(moduleName + " (" + handleLeakCount
+					+ Constants.MODULE_TREE_HANDLE_LEAKS + ")");
+			if (!modules.isEmpty()) {
+				object.setBuild(checkItemBuildState(modules, moduleName));
+				object.setBelongs(checkProjectModules(modules, moduleName));
+			}
+
+			handleSummary.addChild(object);
+		}
+		return handleSummary;
+	}
+
+	/**
+	 * Gets module leaks tree item.
+	 *
+	 * @param moduleLeaksInfo
+	 *            Module leaks information
+	 * @param runID
+	 *            Run id
+	 * @param modules Selected project target modules
+	 * @return Module leak tree item
+	 */
+	public final TreeParent getModuleLeakInfo(
+			final Hashtable<String, Integer> moduleLeaksInfo, final int runID, AbstractList<MMPInfo> modules) {
+		TreeParent moduleSummary = new TreeParent(
+				Constants.MEMORY_LEAK_MODULES_TITLE);
+
+		moduleSummary.setRunID(runID);
+		for (java.util.Enumeration<String> e = moduleLeaksInfo.keys(); e
+				.hasMoreElements();) {
+			String moduleName = e.nextElement();
+			int moduleLeakCount = moduleLeaksInfo.get(moduleName);
+			TreeObject object = new TreeObject();
+			object.setRunID(runID);
+			object.setName(moduleName + " (" + moduleLeakCount
+					+ Constants.MODULE_TREE_MEM_LEAKS + ")");
+			if (!modules.isEmpty()) {
+				object.setBuild(checkItemBuildState(modules, moduleName));
+				object.setBelongs(checkProjectModules(modules, moduleName));
+			}
+
+			moduleSummary.addChild(object);
+		}
+		return moduleSummary;
+	}
+
+	/**
+	 * Return moduleaks info.
+	 *
+	 * @return Module leaks info
+	 */
+	public final Hashtable<String, Integer> getCalcModuleLeaksInfo() {
+		return moduleLeaks;
+	}
+
+	/**
+	 * Gets run tree title.
+	 *
+	 * @param oneRunResults
+	 *            Run results
+	 * @param howManyDisplayed
+	 *            How many of memory leak items are displayed
+	 * @return Run tree title
+	 */
+	public final String getRunTreeTitle(final RunResults oneRunResults,
+			final int howManyDisplayed) {
+		StringBuffer runTreeTitle = new StringBuffer(64);
+		runTreeTitle.append(Constants.RUN_TREE_RUN);
+		runTreeTitle.append(Integer.toString(oneRunResults.getItemID()));
+		runTreeTitle.append(Constants.RUN_TREE_RUN_MEM_LEAKS);
+		runTreeTitle.append(oneRunResults.getAnalysisItems().size());
+		if (howManyDisplayed > 0
+				&& oneRunResults.getAnalysisItems().size() != howManyDisplayed) {
+			int diff = oneRunResults.getAnalysisItems().size()
+					- howManyDisplayed;
+			runTreeTitle.append(" (");
+			runTreeTitle.append(Integer.toString(diff));
+			runTreeTitle.append(Constants.RUN_TREE_FILTERED);
+
+		}
+		runTreeTitle.append(Constants.RUN_TREE_RUN_HANDLE_LEAKS);
+		runTreeTitle.append(oneRunResults.getHandleLeakCount());
+		runTreeTitle.append(Constants.RUN_TREE_START_TIME);
+		runTreeTitle.append(oneRunResults.getStartTime());
+		runTreeTitle.append(Constants.RUN_TREE_PROCESS_NAME);
+		runTreeTitle.append(oneRunResults.getProcessName());
+		runTreeTitle.append(Constants.RUN_TREE_BUILD_TARGET);
+		runTreeTitle.append(oneRunResults.getBuildTarget());
+
+		if (oneRunResults.getEndTime() == null
+				|| ("").equals(oneRunResults.getEndTime())) {
+			runTreeTitle.append(Constants.RUN_FAILED);
+		} else if ((Constants.RUN_ABNORMAL).equals(oneRunResults.getEndTime())) {
+			runTreeTitle.append(' ');
+			runTreeTitle.append(Constants.RUN_ABNORMAL);
+			runTreeTitle.append(' ');
+		}
+
+		return runTreeTitle.toString();
+	}
+
+	/**
+	 * Gets subtest title.
+	 *
+	 * @param oneSubtest
+	 *            Subtest info
+	 * @param howManyDisplayed
+	 *            How many of subtest items are displayed
+	 * @return Subtest title
+	 */
+	public final String getSubtestTreeTitle(final Subtest oneSubtest,
+			final int howManyDisplayed) {
+		StringBuffer subtestTitle = new StringBuffer(64);
+		String startTime = oneSubtest.getStartTime();
+		subtestTitle.append(Constants.SUBTEST_TREE_TITLE);
+		subtestTitle.append(oneSubtest.getName());
+		subtestTitle.append(Constants.RUN_TREE_RUN_MEM_LEAKS);
+		subtestTitle.append(oneSubtest.getAnalysisItems().size());
+
+		if (howManyDisplayed > 0
+				&& oneSubtest.getAnalysisItems().size() != howManyDisplayed) {
+			int diff = oneSubtest.getAnalysisItems().size() - howManyDisplayed;
+
+			subtestTitle.append(" (");
+			subtestTitle.append(diff);
+			subtestTitle.append(Constants.RUN_TREE_FILTERED);
+		}
+		subtestTitle.append(Constants.RUN_TREE_RUN_HANDLE_LEAKS);
+		subtestTitle.append(oneSubtest.getHandleLeakCount());
+		if (startTime.length() != 0) {
+			subtestTitle.append(Constants.RUN_TREE_START_TIME);
+			subtestTitle.append(oneSubtest.getStartTime());
+		}
+		return subtestTitle.toString();
+	}
+
+	/**
+	 * Updates module leak count for current module.
+	 *
+	 * @param moduleName
+	 *            Module name
+	 */
+	public final void updateModuleLeaksInfo(final String moduleName) {
+
+		//check module name
+		if( moduleName == null || ("").equals(moduleName) ) {
+			return;
+		}
+		//if same module name is already added => update count value
+		else if (moduleLeaks.containsKey(moduleName)) {
+			int currentCount = moduleLeaks.get(moduleName);
+			currentCount++;
+			moduleLeaks.put(moduleName, currentCount);
+		} else {
+			moduleLeaks.put(moduleName, 1);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeObject.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,302 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class TreeObject
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+import com.nokia.s60tools.analyzetool.engine.CallstackItem;
+
+/**
+ * Class to implement TreeObject.
+ *
+ * @author kihe
+ *
+ */
+public class TreeObject implements IAdaptable {
+
+	/** Name. */
+	private String name;
+
+	/** Parent object. */
+	private TreeParent parent;
+
+	/** Analysis run id. */
+	private int runID = 0;
+
+	/** Memory leak id. */
+	private int memLeakID = 0;
+
+	/** Callstack item. */
+	private CallstackItem callstackItem = null;
+
+	/** Flag to inform is current treeobject subtest or not. */
+	private boolean isSubtest = false;
+
+	/** Module name. */
+	private String moduleName = null;
+
+	/** Subtest id. */
+	private int subtestID = 0;
+
+	/** Memory address. */
+	private String memAddress = null;
+
+	/** Is this item build. */
+	private boolean isBuild = false;
+
+	/** Does current module belongs to selected project. */
+	private boolean belongsToProject = false;
+
+	/**
+	 * Constructor.
+	 */
+	public TreeObject() {
+		// ConstructorDeclaration[@Private='false'][count(BlockStatement) = 0
+		// and ($ignoreExplicitConstructorInvocation = 'true' or
+		// not(ExplicitConstructorInvocation)) and @containsComment = 'false']
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	@SuppressWarnings("unchecked")
+	public Object getAdapter(final Class key) {
+		return null;
+	}
+
+	/**
+	 * Gets CallstackItem for current object.
+	 *
+	 * @return CallstackItem
+	 */
+	public final CallstackItem getCallstackItem() {
+		return this.callstackItem;
+	}
+
+	/**
+	 * Gets memory address.
+	 *
+	 * @return Memory address
+	 */
+	public final String getMemAddress() {
+		return memAddress;
+	}
+
+	/**
+	 * Gets memory leak id.
+	 *
+	 * @return Memory leak id
+	 */
+	public final int getMemLeakID() {
+		return memLeakID;
+	}
+
+	/**
+	 * Gets module name.
+	 *
+	 * @return Module name
+	 */
+	public final String getModuleName() {
+		return moduleName;
+	}
+
+	/**
+	 * Gets current object name.
+	 *
+	 * @return Current object name
+	 */
+	public final String getName() {
+		return name;
+	}
+
+	/**
+	 * Gets current object parent.
+	 *
+	 * @return TreeParent
+	 */
+	public final TreeParent getParent() {
+		return parent;
+	}
+
+	/**
+	 * Gets Analysis run id.
+	 *
+	 * @return Analysis run id
+	 */
+	public final int getRunID() {
+		return runID;
+	}
+
+	/**
+	 * Gets subtest id.
+	 *
+	 * @return Subtest id
+	 */
+	public final int getSubtestID() {
+		return subtestID;
+	}
+
+	/**
+	 * Gets value that belongs module to selected projects.
+	 *
+	 * @return True if module belongs to project otherwise False
+	 */
+	public final boolean isBelongs() {
+		return belongsToProject;
+	}
+
+	/**
+	 * Is build.
+	 *
+	 * @return True if this item is build otherwise False
+	 */
+	public final boolean isBuild() {
+		return isBuild;
+	}
+
+	/**
+	 * Gets flag is current treeobject is subtest.
+	 *
+	 * @return True is treeobject subtest otherwise false
+	 */
+	public final boolean isSubTest() {
+		return isSubtest;
+	}
+
+	/**
+	 * Does module belongs to selected project.
+	 *
+	 * @param belongs
+	 *            Info
+	 */
+	public final void setBelongs(final boolean belongs) {
+		belongsToProject = belongs;
+	}
+
+	/**
+	 * Set build info .
+	 *
+	 * @param build
+	 *            Build info
+	 */
+	public final void setBuild(final boolean build) {
+		isBuild = build;
+	}
+
+	/**
+	 * Sets CallstackItem.
+	 *
+	 * @param newCallItem
+	 *            CallstackItem
+	 */
+	public final void setCallstackItem(final CallstackItem newCallItem) {
+		this.callstackItem = newCallItem;
+	}
+
+	/**
+	 * Sets memory address.
+	 *
+	 * @param newMemAddress
+	 *            Memory address
+	 */
+	public final void setMemAddress(final String newMemAddress) {
+		memAddress = newMemAddress;
+	}
+
+	/**
+	 * Sets memory leak id.
+	 *
+	 * @param newID
+	 *            Memory leak id
+	 */
+	public final void setMemLeakID(final int newID) {
+		this.memLeakID = newID;
+	}
+
+	/**
+	 * Sets new module name.
+	 *
+	 * @param newModuleName
+	 *            Module name
+	 */
+	public final void setModuleName(final String newModuleName) {
+		moduleName = newModuleName;
+	}
+
+	/**
+	 * Set current object name.
+	 *
+	 * @param newName
+	 *            Current object name
+	 */
+	public final void setName(final String newName) {
+		this.name = newName;
+	}
+
+	/**
+	 * Set parent current object.
+	 *
+	 * @param newParent
+	 *            Sets current object parent
+	 */
+	public final void setParent(final TreeParent newParent) {
+		this.parent = newParent;
+	}
+
+	/**
+	 * Sets Analysis run id.
+	 *
+	 * @param newID
+	 *            Analysis run id
+	 */
+	public final void setRunID(final int newID) {
+		this.runID = newID;
+	}
+
+	/**
+	 * Set subtest flag.
+	 *
+	 * @param value
+	 *            True or false
+	 */
+	public final void setSubtest(final boolean value) {
+		isSubtest = value;
+	}
+
+	/**
+	 * Sets subtest id.
+	 *
+	 * @param newID
+	 *            Subtest id
+	 */
+	public final void setSubtestID(final int newID) {
+		subtestID = newID;
+	}
+
+	/**
+	 * Gets current object name.
+	 *
+	 * @return Current object name
+	 */
+	@Override
+	public final String toString() {
+		return getName();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/TreeParent.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class TreeParent
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to implement TreeParent.
+ *
+ * @author kihe
+ *
+ */
+public class TreeParent extends TreeObject {
+
+	/** Contains list of childrens. */
+	private final List<Object> children;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param name
+	 *            Current object name
+	 */
+	public TreeParent(final String name) {
+		if (name != null) {
+			super.setName(name);
+		}
+		children = new ArrayList<Object>();
+	}
+
+	/**
+	 * Adds child.
+	 *
+	 * @param index
+	 *            Index
+	 * @param child
+	 *            Current parent child
+	 */
+	public final void addChild(final int index, final TreeObject child) {
+		children.add(index, child);
+		child.setParent(this);
+	}
+
+	/**
+	 * Adds child.
+	 *
+	 * @param child
+	 *            Current parent child
+	 */
+	public final void addChild(final TreeObject child) {
+		children.add(child);
+		child.setParent(this);
+	}
+
+	/**
+	 * Gets current parent child objects.
+	 *
+	 * @return Array of TreeObject
+	 */
+	public final Object[] getChildren() {
+		return children.toArray(new TreeObject[children.size()]);
+	}
+
+	/**
+	 * Check that does current parent contains child objects.
+	 *
+	 * @return True if parent contains childrens otherwise false
+	 */
+	public final boolean hasChildren() {
+		return !children.isEmpty();
+	}
+
+	/**
+	 * Removes child.
+	 *
+	 * @param child
+	 *            Current parent child
+	 */
+	public final void removeChild(final TreeObject child) {
+		children.remove(child);
+		child.setParent(null);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ActivateMainView.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ActivateMainView
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+import com.nokia.s60tools.analyzetool.global.Constants;
+
+/**
+ * Entry point for main view when selecting AnalyzeTool in Carbide menu.
+ *
+ * @author kihe
+ *
+ */
+public class ActivateMainView implements IWorkbenchWindowActionDelegate {
+
+	/**Active workbench window.*/
+	private IWorkbenchWindow window;
+
+	/**
+	 * The constructor.
+	 */
+	public ActivateMainView() {
+		// ConstructorDeclaration[@Private='false'][count(BlockStatement) = 0
+		// and ($ignoreExplicitConstructorInvocation = 'true' or
+		// not(ExplicitConstructorInvocation)) and @containsComment = 'false']
+	}
+
+	/**
+	 * @see IWorkbenchWindowActionDelegate#dispose
+	 */
+	public void dispose() {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+	/**
+	 * @see IWorkbenchWindowActionDelegate#init
+	 *
+	 * @param windowRef Workbench Window
+	 */
+	public void init(IWorkbenchWindow windowRef) {
+		this.window = windowRef;
+	}
+
+	/**
+	 * @see IWorkbenchWindowActionDelegate#run(IAction)
+	 *
+	 * @param action User selected action
+	 */
+	public void run(IAction action) {
+
+		try {
+			IWorkbenchPage page = window.getActivePage();
+
+			// display main view
+			page.showView(Constants.ANALYZE_TOOL_VIEW_ID);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	/**
+	 * @see IWorkbenchWindowActionDelegate#selectionChanged(IAction action, ISelection selection)
+	 *
+	 * @param action User selected action
+	 *
+	 * @param selection User selection
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ClearAtoolChanges.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ClearAtoolChanges
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+
+/**
+ * Class to clear atool.exe made changes.
+ *
+ * @author kihe
+ *
+ */
+public class ClearAtoolChanges implements IObjectActionDelegate {
+
+	/** project reference.*/
+	public IProject project;
+
+	/**
+	 * Constructor.
+	 */
+	public ClearAtoolChanges() {
+		super();
+	}
+
+	/**
+	 * Opens the AnalyzeTool view and runs clean action.
+	 *
+	 * @param action User selected action
+	 */
+	public void run(IAction action) {
+		// open AnalyzeTool window
+		try {
+			Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
+					.getActivePage().showView(Constants.ANALYZE_TOOL_VIEW_ID,
+							null, org.eclipse.ui.IWorkbenchPage.VIEW_CREATE);
+		} catch (PartInitException pie) {
+			pie.printStackTrace();
+		}
+
+		IActionListener listener = Activator.getActionListener();
+		if (listener != null) {
+			listener.runAction(project, Constants.ACTIONS.RUN_CLEAN);
+		}
+
+	}
+
+	/**
+	 * Listening selection changed events and stores selected project reference.
+	 *
+	 * @param action User selected action
+	 *
+	 * @param selection User selection
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		try {
+			project = (IProject) ((IStructuredSelection) selection)
+					.getFirstElement();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Sets the active part for the delegate.
+	 *
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 *
+	 * @param action User selected action
+	 *
+	 * @param targetPart Workbench part
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/CompileSymbianComponent.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CompileSymbianComponent
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import com.nokia.s60tools.analyzetool.builder.CustomPreBuilder;
+
+/**
+ * Class to instrument and compile user selected mmp files with atool.exe.
+ *
+ * @author kihe
+ *
+ */
+public class CompileSymbianComponent implements IObjectActionDelegate {
+
+	/** list of user selected files.*/
+	public List<IFile> selectedFiles;
+
+	/**
+	 * Constructor.
+	 */
+	public CompileSymbianComponent() {
+		super();
+		selectedFiles = new ArrayList<IFile>(0);
+	}
+
+	/**
+	 * Instruments, builds and unistruments selected mmp's with AnalyzeTool builder.
+	 *
+	 * @param action User selected action
+	 */
+	public void run(IAction action) {
+
+		// if for some reason makefile list is empty => leave
+		if (selectedFiles.isEmpty()) {
+			return;
+		}
+
+		CustomPreBuilder builder = new CustomPreBuilder();
+		builder.buildComponents(selectedFiles);
+
+	}
+
+	/**
+	 * Listening selection changed events and is selection is mmp file stores it to list.
+	 *
+	 * @param action User selected action
+	 *
+	 * @param selection User selection
+	 */
+	@SuppressWarnings("unchecked")
+	public void selectionChanged(IAction action, ISelection selection) {
+
+		// clear existing data
+		selectedFiles.clear();
+
+		// if selection is null => leave
+		if (selection == null) {
+			return;
+		}
+
+		// if selection is
+		if (selection instanceof IStructuredSelection) {
+			// thru selections
+			for (Iterator<Object> iter = ((IStructuredSelection) selection)
+					.iterator(); iter.hasNext();) {
+
+				// get next selection
+				Object selectionItem = iter.next();
+				IFile file = null;
+				// if selection is IFile
+				if (selectionItem instanceof IFile) {
+					file = (IFile) selectionItem;
+				} else if (selectionItem instanceof IAdaptable) {
+					file = (IFile) ((IAdaptable) selectionItem)
+							.getAdapter(IFile.class);
+				}
+
+				// only allow mmp and mk files
+				if ( file != null
+						&& (file.getName().toUpperCase(Locale.US).endsWith(".MMP")
+						|| file.getName().toUpperCase(Locale.US).endsWith(".MK"))) {
+					selectedFiles.add(file);
+				}
+
+			}
+		}
+	}
+
+	/**
+	 * Sets the active part for the delegate.
+	 *
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 *
+	 * @param action User selected action
+	 *
+	 * @param targetPart Workbench Part
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+
+		//do nothing be design
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/CompileWithAtool.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class CompileWithAtoolS60
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.builder.BuilderUtil;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+
+/**
+ * Class to compile project with atool.exe.
+ *
+ * @author kihe
+ *
+ */
+public class CompileWithAtool implements IObjectActionDelegate {
+
+	/** project reference.*/
+	public IProject project;
+
+	/**
+	 * Constructor.
+	 */
+	public CompileWithAtool() {
+		super();
+	}
+
+	/**
+	 * Opens AnalyzeTool view and activates/deactivates build with AnalyzeTool.
+	 *
+	 * @param action User selected action
+	 */
+	public void run(IAction action) {
+
+		// open AnalyzeTool window
+		try {
+			Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
+					.getActivePage().showView(Constants.ANALYZE_TOOL_VIEW_ID,
+							null, org.eclipse.ui.IWorkbenchPage.VIEW_CREATE);
+		} catch (PartInitException pie) {
+			pie.printStackTrace();
+		}
+
+		IActionListener listener = Activator.getActionListener();
+		if (listener != null) {
+			listener.runAction(project, Constants.ACTIONS.RUN_BUILD);
+		}
+	}
+
+	/**
+	 * Listening selection changed events and updates AnalyzeTool
+	 * "build with AnalyzeTool" action state.
+	 *
+	 * @param action User selected action
+	 *
+	 * @param selection User selection
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+
+		try {
+			project = (IProject) ((IStructuredSelection) selection)
+					.getFirstElement();
+			BuilderUtil util = new BuilderUtil();
+			action.setChecked(util.isNatureEnabled(project));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Sets the active part for the delegate.
+	 *
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 *
+	 * @param action User selected action
+	 *
+	 * @param targetPart Workbench Part
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/DropDownMenu.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class DropDownMenu
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.ui.MainView;
+
+/**
+ * Creates new drop down menu by given IActions.
+ *
+ * @author kihe
+ *
+ */
+public class DropDownMenu extends Action implements IMenuCreator {
+
+	/** Menu where to add actions. */
+	private Menu ddMenu;
+
+	/** Contains actions of current menu. */
+	private final java.util.AbstractList<IAction> actions;
+
+	/** this class parent class reference. */
+	private final MainView parentClass;
+
+	/** Need to check actions. */
+	private final boolean checkActions;
+
+	/** Is menu for file open actions. */
+	private final boolean isFileMenu;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param title
+	 *            Drop down menu title
+	 * @param parentClassRef
+	 *            Parent class reference
+	 * @param check
+	 * 			  Is it necessary to check each action validity
+	 * @param fileMenu
+	 * 			  Is current reference file menu
+	 *
+	 */
+	public DropDownMenu(final String title, final MainView parentClassRef,
+			final boolean check, final boolean fileMenu) {
+		setText(title);
+		setMenuCreator(this);
+		actions = new ArrayList<IAction>();
+		parentClass = parentClassRef;
+		checkActions = check;
+		isFileMenu = fileMenu;
+	}
+
+	/**
+	 * Adds actions.
+	 *
+	 * @param action
+	 *            Action to add menu
+	 */
+	public void addAction(IAction action) {
+		actions.add(action);
+	}
+
+	/**
+	 * Adds new action to drop down menu.
+	 *
+	 * @param parent
+	 *            Current drop down menu
+	 * @param action
+	 *            Action to add drop down menu
+	 */
+	protected void addActionToMenu(Menu parent, IAction action) {
+		// create new contribution item
+		ActionContributionItem item = new ActionContributionItem(action);
+
+		item.fill(parent, -1);
+	}
+
+	/**
+	 * Creates file open menu.
+	 */
+	public final void createFileOpenMenu() {
+
+		// add default item to menu
+		// analyze results
+		IAction analyzeResults = new Action() {
+			@Override
+			public void run() {
+				parentClass.analyzeDataFile(Constants.ANALYZE_ASK_FOR_USER,
+						null, true);
+			}
+		};
+
+		analyzeResults.setText(Constants.ACTION_OPEN_DOTS);
+		analyzeResults.setToolTipText(Constants.ACTION_OPEN_DOTS);
+		addActionToMenu(ddMenu, analyzeResults);
+
+		// add separator to menu
+		new MenuItem(ddMenu, SWT.SEPARATOR);
+
+		// get history of opened files
+		AbstractList<String> openedFiles = parentClass.fileOpenHistory
+				.getItems();
+
+		if (openedFiles.isEmpty()) {
+			Action tmpAction = new Action() {
+				@Override
+				public void run() {
+					// no nothing by design
+				}
+			};
+
+			tmpAction.setText(Constants.NO_OPENED_FILES);
+			tmpAction.setEnabled(false);
+			addActionToMenu(ddMenu, tmpAction);
+		} else {
+			// thru opened files
+			final Iterator<String> iterOpenedFiles = openedFiles.iterator();
+			while (iterOpenedFiles.hasNext()) {
+				// get one history file
+				String oneFile = iterOpenedFiles.next();
+
+				// create new action
+				FileAction tmpAction = new FileAction() {
+					@Override
+					public void run() {
+						parentClass.analyzeDataFile(
+								Constants.ANALYZE_USE_DATA_FILE, super
+										.getFileLocation(), true);
+					}
+				};
+				tmpAction.setFileLocation(oneFile);
+
+				addActionToMenu(ddMenu, tmpAction);
+				tmpAction.setToolTipText(oneFile);
+				tmpAction.setText(parseTextName(oneFile));
+			}
+		}
+	}
+
+	/**
+	 * Disposes current menu
+	 *
+	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
+	 */
+	public void dispose() {
+		if (ddMenu != null) {
+			ddMenu.dispose();
+			ddMenu = null;
+		}
+	}
+
+	/**
+	 * Gets menu contents.
+	 *
+	 * @param parent Parent of this menu
+	 *
+	 * @return Reference of menu
+	 */
+	public Menu getMenu(Control parent) {
+		// if menu is open => close it
+		if (ddMenu != null) {
+			ddMenu.dispose();
+		}
+
+		// create new menu
+		ddMenu = new Menu(parent);
+
+		// if this menu is file open menu
+		if (isFileMenu) {
+			createFileOpenMenu();
+		} else {
+			// get iterator of menu actions
+			java.util.Iterator<IAction> iterActions = actions.iterator();
+
+			// thru action
+			while (iterActions.hasNext()) {
+
+				// get one action
+				IAction oneAction = iterActions.next();
+
+				// if no need to check actions => just add it to menu
+				if (!checkActions) {
+					addActionToMenu(ddMenu, oneAction);
+					continue;
+				}
+
+				// file location
+				String targetPath = "";
+
+				// get project reference
+				IProject project = parentClass.project;
+
+				// if action text equals to save data file and project exists
+				if (Constants.ACTION_SAVE_DATA.equals(oneAction.getText())
+						&& project != null && project.isOpen()) {
+					// get data file location
+					targetPath = Util.getBldInfFolder(project, false)
+							+ Constants.FILENAME;
+					java.io.File file = new java.io.File(targetPath);
+
+					// check file exists
+					if (!file.exists()) {
+						// is data file opened by user
+						String openedDataFile = parentClass.usedDataFileName;
+
+						// if no data file opened => set data file name to ""
+						if (openedDataFile == null) {
+							openedDataFile = "";
+						}
+
+						// create file and if it exists set targetpath
+						java.io.File s60File = new java.io.File(openedDataFile);
+						if (s60File.exists()) {
+							targetPath = openedDataFile;
+						}
+					}
+				} else if (Constants.ACTION_SAVE_REPORT.equals(oneAction
+						.getText())
+						&& project != null && project.isOpen()) {
+					targetPath = Util.getBldInfFolder(project, false)
+							+ Constants.FILENAME_CARBIDE;
+
+				}
+
+				// if file exisits enable this action otherwise disable
+				java.io.File file = new java.io.File(targetPath);
+				if (file.exists()) {
+					oneAction.setEnabled(true);
+				} else {
+					oneAction.setEnabled(false);
+				}
+				// add action to menu
+				addActionToMenu(ddMenu, oneAction);
+
+			}
+
+		}
+
+		return ddMenu;
+	}
+
+	/**
+	 * Returns menu.
+	 *
+	 * @return Returns reference of this menu
+	 */
+	public Menu getMenu(Menu parent) {
+		return null;
+	}
+
+	/**
+	 * Parsing given name if it is too long.
+	 *
+	 * @param name
+	 *            File name
+	 * @return Parsed file name if it is too long otherwise the actual file name
+	 */
+	public final String parseTextName(String name) {
+		int howManyChar = 100;
+		if (name.length() > howManyChar) {
+			StringBuffer tmpBuff = new StringBuffer();
+			tmpBuff.append("...");
+			tmpBuff.append(name.substring(name.length() - howManyChar, name
+					.length()));
+			return tmpBuff.toString();
+		}
+		return name;
+	}
+
+	@Override
+	public void run() {
+
+		// get menu
+		getMenu(parentClass.runView.getControl());
+
+		// set menu visible
+		ddMenu.setVisible(true);
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/FileAction.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class FileAction
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * Expand Action class functionality.
+ *
+ * @author kihe
+ *
+ */
+public class FileAction extends Action {
+
+	/** data file location. */
+	private String fileLocation;
+
+	/**
+	 * Gets file location.
+	 *
+	 * @return File location
+	 */
+	public final String getFileLocation() {
+		return fileLocation;
+	}
+
+	/**
+	 * Sets file location.
+	 *
+	 * @param fileLoc
+	 *            File location
+	 */
+	public final void setFileLocation(final String fileLoc) {
+		fileLocation = fileLoc;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/FileActionHistory.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class FileActionHistory
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Contains history of what files are opened.
+ *
+ * @author kihe
+ *
+ */
+public class FileActionHistory {
+
+	/** File name. */
+	private String fileName;
+
+	/** List of opened files. */
+	private final AbstractList<String> fileNameHistory;
+
+	/** How many files to displayed. */
+	private final int howManyItems;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param howMany
+	 *            How many file to display
+	 */
+	public FileActionHistory(final int howMany) {
+		fileNameHistory = new ArrayList<String>();
+		howManyItems = howMany;
+	}
+
+	/**
+	 * Gets history items.
+	 *
+	 * @return List of history items
+	 */
+	public final AbstractList<String> getItems() {
+		AbstractList<String> tmpFileList = new ArrayList<String>();
+		Iterator<String> iterFiles = fileNameHistory.iterator();
+		int index = 0;
+		while (iterFiles.hasNext() && index < howManyItems) {
+			tmpFileList.add(iterFiles.next());
+			index++;
+		}
+		return tmpFileList;
+	}
+
+	/**
+	 * Checks is list empty.
+	 *
+	 * @return True if list is empty otherwise False
+	 */
+	public final boolean isEmpty() {
+		return fileNameHistory.isEmpty();
+	}
+
+	/**
+	 * Removes file name from the list.
+	 *
+	 * @param usedFileName
+	 *            Used file
+	 */
+	public final void removeFileName(final String usedFileName) {
+		if (fileNameHistory.contains(usedFileName)) {
+			fileNameHistory.remove(usedFileName);
+			removeFileName(usedFileName);
+		}
+	}
+
+	/**
+	 * Sets file location and name.
+	 *
+	 * @param pathAndName
+	 *            File location and name
+	 */
+	public final void setFileName(final String pathAndName) {
+		if (!("").equals(pathAndName)) {
+			// if list already contains same file name remove it
+			if (fileNameHistory.contains(pathAndName)) {
+				removeFileName(pathAndName);
+
+			}
+			fileName = pathAndName;
+
+			// add file name to history list
+			fileNameHistory.add(0, fileName);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/actions/ViewMemoryLeakFromFile.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class ViewMemoryLeakFromFile
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.actions;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+import com.nokia.s60tools.analyzetool.Activator;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.ui.IActionListener;
+
+/**
+ * Entry point for displaying memory analysis results from file.
+ *
+ * @author kihe
+ *
+ */
+public class ViewMemoryLeakFromFile implements IObjectActionDelegate {
+
+	/** project reference.*/
+	public IProject project;
+
+	/**
+	 * Constructor.
+	 */
+	public ViewMemoryLeakFromFile() {
+		super();
+	}
+
+	/**
+	 * Performs this action.
+	 *
+	 * @param action User selected action
+	 */
+	public void run(IAction action) {
+
+		// open AnalyzeTool window
+		try {
+			Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
+					.getActivePage().showView(Constants.ANALYZE_TOOL_VIEW_ID,
+							null, org.eclipse.ui.IWorkbenchPage.VIEW_ACTIVATE);
+
+		} catch (PartInitException pie) {
+			pie.printStackTrace();
+		}
+
+		// analyze results
+		IActionListener listener = Activator.getActionListener();
+		if (listener != null) {
+			listener.runAction(project, Constants.ACTIONS.RUN_VIEW_MEM_LEAKS);
+		}
+	}
+
+	/**
+	 * Notifies this action delegate that the selection in the workbench has
+	 * changed.
+	 *
+	 * @param action User selected action
+	 *
+	 * @param selection User selection
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		try {
+			project = (IProject) ((IStructuredSelection) selection)
+					.getFirstElement();
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Sets the active part for the delegate.
+	 *
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 *
+	 * @param action User selected action
+	 *
+	 * @param targetPart Workbench part
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		// MethodDeclaration/Block[count(BlockStatement) = 0 and
+		// @containsComment = 'false']
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/statistic/ATComparator.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class StatisticView
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.statistic;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+import java.util.Comparator;
+import java.util.Collections;
+
+
+
+/**
+ * Sorts statistic view contents
+ * @author kihe
+ *
+ */
+public class ATComparator implements Listener, Comparator<String[]> {
+
+	/** Used table*/
+	private final Table memoryTable;
+
+	/** Column index to sort */
+	private final int columnIndex;
+
+	/** Sort only integer values */
+	private final boolean intComparator;
+
+	/** Sort order */
+	boolean ascending;
+
+	/** Parent class reference */
+	StatisticView parent;
+
+	/**
+	 * Constructor
+	 * @param view Parent view reference
+	 * @param table Used table
+	 * @param clnIndex Used column index
+	 * @param compInteger Compare only for integer values
+	 */
+	public ATComparator(StatisticView view, Table table, int clnIndex, boolean compInteger) {
+		parent = view;
+		memoryTable = table;
+		columnIndex = clnIndex;
+		intComparator = compInteger;
+		ascending = true;
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+	 */
+
+	public void handleEvent(Event e) {
+
+		//get existing items
+        TableItem[] items = memoryTable.getItems();
+
+
+        //add existing items to list => this helps item sorting
+        AbstractList<String[]> list = new ArrayList<String[]>();
+        for(int i=0; i<items.length; i++)
+        {
+        	TableItem oneItem = memoryTable.getItem(i);
+
+			String[] values = { oneItem.getText(0),oneItem.getText(1),
+					oneItem.getText(2),oneItem.getText(3),
+					oneItem.getText(4),oneItem.getText(5),
+					oneItem.getText(6) };
+			list.add(values);
+        }
+
+        //clear existing items
+        memoryTable.clearAll();
+
+        //sort items, use compare method provide by this class
+        Collections.sort(list, this);
+
+        //thru sorted items
+        Iterator<String[]> iterList = list.iterator();
+        memoryTable.setItemCount(list.size());
+        int index = 0;
+        while(iterList.hasNext())
+        {
+        	String[] value = iterList.next();
+        	TableItem item = memoryTable.getItem(index);
+        	item.setText(value);
+        	index++;
+        }
+
+        TableColumn currColumn = (TableColumn) e.widget;
+        memoryTable.setSortColumn(currColumn);
+
+        //update sort order
+        if(ascending) {
+        	ascending = false;
+        	memoryTable.setSortDirection(SWT.DOWN);
+        }
+        else {
+           	ascending = true;
+           	memoryTable.setSortDirection(SWT.UP);
+        }
+        doPackColumns();
+	}
+
+	/**
+	 * Fit columns size to match column text size.
+	 */
+	public void doPackColumns()
+	{
+		TableColumn[] columns = memoryTable.getColumns();
+		for (int i = 0; i < columns.length; i++) {
+			columns[i].pack();
+		}
+	}
+	/*
+	 * (non-Javadoc)
+	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+	 */
+	public int compare(String[] o1, String[] o2) {
+		int result = 0;
+
+		//if compare only integer values
+		if( intComparator )
+		{
+			//get values
+			int value1 = Integer.parseInt(o1[columnIndex]);
+			int value2 = Integer.parseInt(o2[columnIndex]);
+			result = (value1 < value2) ? -1 : 1;
+		}
+		else {
+			//get values
+			Long time1 = parent.getTimeFromCache(o1[columnIndex]);
+			Long time2 = parent.getTimeFromCache(o2[columnIndex]);
+
+			if( time1 == null || time2 == null ) {
+				result = -1;
+			}else {
+				result = (time1 < time2) ? -1 : 1;
+			}
+
+		}
+		//if sort order is set ascending change result to negative
+		if( ascending ){
+			result = -result;
+		}
+		return result;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/ui/statistic/StatisticView.java	Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,1089 @@
+/*
+ * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:  Definitions for the class StatisticView
+ *
+ */
+
+package com.nokia.s60tools.analyzetool.ui.statistic;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Calendar;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
+import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.IFunction;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISourceLocation;
+import com.nokia.cdt.debug.cw.symbian.symbolreader.ISymbolFile;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocCallstack;
+import com.nokia.s60tools.analyzetool.engine.statistic.AllocInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.DllLoad;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.engine.statistic.SourceFile;
+import com.nokia.s60tools.analyzetool.engine.statistic.SymReader;
+import com.nokia.s60tools.analyzetool.global.Util;
+import com.nokia.s60tools.analyzetool.global.Constants;
+import com.nokia.s60tools.analyzetool.ui.ResourceVisitor;
+
+/**
+ * Creates a statistic view Provides functions to create memory usage statistic
+ * from the AnalyzeTool trace file
+ *
+ * @author kihe
+ *
+ */
+@SuppressWarnings("restriction")
+public class StatisticView implements SelectionListener, MouseListener {
+
+	/** Tab for the this view */
+	CTabItem memoryTab;
+
+	/** Table for the statistic information */
+	Table memoryTable;
+
+	/** Function column */
+	TableColumn columnFunction;
+
+	/** File column */
+	TableColumn columnFile;
+
+	/** Count column */
+	TableColumn columnCount;
+
+	/** Line column */
+	TableColumn columnLine;
+
+	/** Time column */
+	TableColumn columnTime;
+
+	/** Size column */
+	TableColumn columnSize;
+
+	/** User selected table item */
+	TableItem selectedItem;
+
+	/** Selected run id */
+	int selectedRun = 0;
+
+	/** Combo for run selection */
+	Combo combo;
+
+	/** Active project reference */
+	IProject currProject;
+
+	/** Contains project related results */
+	HashMap<IProject, AbstractList<ProcessInfo>> projectRelatedRes;
+
+	/** Contains only one(selected) project cache */
+	HashMap<Integer, AbstractList<String[]>> cache;
+
+	/** Time cache, this cache is used provide comparison by time */
+	HashMap<String, Long> timeCache;
+
+	/** Contains all created results */
+	HashMap<IProject, HashMap<Integer, AbstractList<String[]>>> projectCache;
+
+	/** Contains build platform and target information. */
+	Label infoLabel;
+
+	/** Default display string when no results are available. */
+	String noResults = "---";
+
+	/** Contains cpp files info. */
+	private final AbstractList<String> cppFileNames;
+
+	/** Symbol reader */
+	SymReader reader;
+
+	boolean errorOccurred = false;
+
+	/**
+	 * Constructor
+	 */
+	public StatisticView() {
+		projectRelatedRes = new HashMap<IProject, AbstractList<ProcessInfo>>();
+		cache = new HashMap<Integer, AbstractList<String[]>>();
+		timeCache = new HashMap<String, Long>();
+		projectCache = new HashMap<IProject, HashMap<Integer, AbstractList<String[]>>>();
+		cppFileNames = new ArrayList<String>();
+	}
+
+
+	/**
+	 * Cleans stored statistic
+	 * @param project Project reference
+	 */
+	public void clean(IProject project) {
+		memoryTable.clearAll();
+
+		combo.removeAll();
+
+		if (project == null) {
+			projectCache.clear();
+			projectRelatedRes.clear();
+			cppFileNames.clear();
+			timeCache.clear();
+			cache.clear();
+		} else {
+			projectRelatedRes.remove(project);
+			projectCache.remove(project);
+		}
+
+		setDefaultContent();
+
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				infoLabel.setText("");
+			}
+		});
+	}
+
+	/**
+	 * Sorts the given statistic and displays it to user
+	 * @param createAllResults Create all the results, not just one run results
+	 */
+	public void compareAndPrint(boolean createAllResults) {
+		// if current project does not contain statistic => leave
+		if (!projectRelatedRes.containsKey(currProject)) {
+			return;
+		}
+
+		// if cache contains statistic for selected run use it
+		if (cache.containsKey(selectedRun)) {
+			AbstractList<String[]> items = cache.get(selectedRun);
+			updateView(items, false);
+			return;
+		}
+
+		if (reader == null) {
+			reader = new SymReader(currProject);
+			reader.loadProjectTargetsInfo();
+		}
+
+		// get project related results
+		AbstractList<ProcessInfo> processes = projectRelatedRes
+				.get(currProject);
+		if (processes.isEmpty()) {
+			setDefaultContent();
+			return;
+		}
+		// create all the results
+		else if (createAllResults) {
+
+			int runIndex = 0;
+			Iterator<ProcessInfo> iterProcess = processes.iterator();
+			while (iterProcess.hasNext()) {
+				ProcessInfo tempProcess = iterProcess.next();
+				createResults(tempProcess, runIndex);
+				runIndex++;
+			}
+
+			// all the runs results are generated => now display the first
+			// results
+			// compareAndPrint(false);
+
+		}
+		// create only one(specific) run results
+		else {
+			ProcessInfo tempProcessInfo = processes.get(selectedRun);
+			createResults(tempProcessInfo, selectedRun);
+		}
+		if (reader != null) {
+			reader.dispose();
+			reader = null;
+		}
+
+	}
+
+	/**
+	 * Find symbol reader api pinpointed class file for project class files.
+	 *
+	 * @param fileName
+	 *            Cpp file name
+	 * @return Found cpp file location
+	 */
+	private String getFileNames(String fileName) {
+		Iterator<String> iterFiles = cppFileNames.iterator();
+		int slash = Util.getLastSlashIndex(fileName);
+		String tempFile = fileName.substring(slash + 1, fileName.length());
+
+		String realFileName = fileName;
+		while (iterFiles.hasNext()) {
+			String tempFileName = iterFiles.next();
+			int slashTemp = Util.getLastSlashIndex(tempFileName);
+			String tempFileWithoutExt = tempFileName.substring(slashTemp + 1,
+					tempFileName.length());
+			if (tempFileWithoutExt.equalsIgnoreCase(tempFile)) {
+				realFileName = tempFileName;
+				break;
+			}
+		}
+
+		return realFileName;
+	}
+
+	/**
+	 * Converts hex time to time value
+	 *
+	 * @param timeInHex
+	 *            Time in hex
+	 * @return Time
+	 */
+	public String converTime(Long timeInHex) {
+		Calendar cal = Calendar.getInstance();
+
+		cal.setTimeInMillis(timeInHex / 1000);
+
+		StringBuffer timeStr = new StringBuffer();
+		String[] monthName = { "Jan", "Feb", "March", "Apr", "May", "June",
+				"July", "Aug", "Sep", "Oct", "Nov", "Dec" };
+		char space = ' ';
+		String[] day = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+		timeStr.append(day[cal.get(Calendar.DAY_OF_WEEK) - 1]);
+		timeStr.append(space);
+		timeStr.append(monthName[cal.get(Calendar.MONTH)]);
+		timeStr.append(space);
+		timeStr.append(cal.get(Calendar.DAY_OF_MONTH));
+		timeStr.append(space);
+		timeStr.append(cal.get(Calendar.YEAR));
+		timeStr.append(space);
+		timeStr.append(cal.get(Calendar.HOUR_OF_DAY));
+		timeStr.append(':');
+		int minute = cal.get(Calendar.MINUTE);
+		if (minute < 10) {
+			timeStr.append('0');
+		}
+		timeStr.append(minute);
+		timeStr.append(':');
+		int second = cal.get(Calendar.SECOND);
+		if (second < 10) {
+			timeStr.append('0');
+		}
+		timeStr.append(second);
+		timeStr.append('.');
+		int millis = cal.get(Calendar.MILLISECOND);
+		if (millis < 10) {
+			timeStr.append("00");
+		} else if (millis < 100) {
+			timeStr.append('0');
+		}
+		timeStr.append(millis);
+		return timeStr.toString();
+	}
+
+	/**
+	 * Creates results
+	 *
+	 * @param tempProcessInfo
+	 *           Process info
+	 * @param runIndex
+	 *            Selected run index
+	 */
+	private void createResults(ProcessInfo tempProcessInfo,
+			int runIndex) {
+
+		//create cache for found source files
+		HashMap<Long, SourceFile> sourceFileCache = new HashMap<Long, SourceFile>();
+
+		//list for found files
+		AbstractList<SourceFile> files = new ArrayList<SourceFile>();
+
+		//get process allocations
+		AbstractList<AllocInfo> allocs = tempProcessInfo.getAllocs();
+		Iterator<AllocInfo> iterAllocs = allocs.iterator();
+
+		//thru allocations
+		while (iterAllocs.hasNext()) {
+
+			//get one allocation
+			AllocInfo oneInfo = iterAllocs.next();
+
+			//get allocation callstack
+			AbstractList<AllocCallstack> allocCalls = oneInfo.getCallstack();
+			Iterator<AllocCallstack> iterAllocCalls = allocCalls.iterator();
+
+			//go thru callstack values until find first source file
+			while (iterAllocCalls.hasNext()) {
+
+				if( errorOccurred ) {
+					return;
+				}
+
+				AllocCallstack oneCallstack = iterAllocCalls.next();
+
+				//if callstack item do not contain dll load item => could not be pinpointed
+				DllLoad tempLoad = oneCallstack.getDllLoad();
+				if (tempLoad == null) {
+					continue;
+				}
+
+				//if callstack item memory addreess match to dll load start address => skip these values
+				if (oneCallstack.getMemoryAddress()== tempLoad.getStartAddress()) {
+					continue;
+				}
+
+				//find memory address from the cache
+				if (sourceFileCache
+						.containsKey(oneCallstack.getMemoryAddress())) {
+					SourceFile tempFile = sourceFileCache.get(oneCallstack
+							.getMemoryAddress());
+					int intValue = oneInfo.getSizeInt();
+					tempFile.updateSize(intValue);
+					tempFile.setTime(oneInfo.getTime());
+					tempFile.updateHowManyTimes();
+					break;
+				}
+
+				//not found in the cache => try to pinpoint it
+				SourceFile file = pinpoint(oneCallstack.getMemoryAddress(),
+						oneCallstack.getDllLoad());
+
+				//if source file found
+				if (file != null) {
+					//set source file values
+					int intValue = oneInfo.getSizeInt();
+					file.updateSize(intValue);
+					file.setTime(oneInfo.getTime());
+					files.add(file);
+
+					//add found source file to cache
+					sourceFileCache.put(oneCallstack.getMemoryAddress(), file);
+					break;
+				}
+			}
+		}
+
+		//store found results to cache
+		storeResults(files, runIndex);
+
+		//clear used cache
+		sourceFileCache.clear();
+	}
+
+	/**
+	 * Creates statistic view
+	 *
+	 * @param parent
+	 *            View parent
+	 * @return CTabItem created view
+	 */
+	public CTabItem createView(CTabFolder parent) {
+		// create new sashform for the statistic view
+		SashForm allFrom = new SashForm(parent, SWT.VERTICAL);
+
+		/** new sashform for the run selection */
+		SashForm infoFrom = new SashForm(allFrom, SWT.HORIZONTAL);
+
+		/** new sashform for the memory statistic information */
+		SashForm memoryFrom = new SashForm(allFrom, SWT.NONE);
+
+		// create new tab
+		memoryTab = new CTabItem(parent, SWT.NONE);
+		memoryTab.setText(Constants.STATISTICS_TAB_TITLE);
+
+		// initialize tab layout
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd.grabExcessVerticalSpace = true;
+		gd.grabExcessHorizontalSpace = true;
+		gd.horizontalSpan = 1;
+
+		/** create new label */
+		Label label = new Label(infoFrom, SWT.NONE);
+		label.setText(Constants.STATISTICS_SELECT_RUN);
+
+		/** create new choisebox */
+		combo = new Combo(infoFrom, SWT.DROP_DOWN);
+		combo.addSelectionListener(this);
+
+		/** create empty label to fill non-used space */
+		infoLabel = new Label(infoFrom, SWT.NONE);
+		infoLabel.setText("");
+
+		/** Set sashform layout */
+		infoFrom.setWeights(new int[] { 1, 1, 9 });
+
+		/** Set sashform layout */
+		allFrom.setWeights(new int[] { 1, 14 });
+
+		// create new table for the tab
+		memoryTable = new Table(memoryFrom, SWT.VIRTUAL | SWT.FULL_SELECTION
+				| SWT.BORDER | SWT.V_SCROLL);
+		memoryTable.setHeaderVisible(true);
+		memoryTable.setLinesVisible(true);
+		memoryTable.setItemCount(12);
+		memoryTab.setControl(allFrom);
+
+		columnFile = new TableColumn(memoryTable, SWT.Selection);
+		columnFile.setText(Constants.STATISTICS_NODE_FILE);
+		columnFile.setWidth(160);
+
+		// create table items
+		columnFunction = new TableColumn(memoryTable, SWT.Selection);
+		columnFunction.setText(Constants.STATISTICS_NODE_FUNCTION);
+		columnFunction.setWidth(120);
+
+		columnLine = new TableColumn(memoryTable, SWT.Selection);
+		columnLine.setText(Constants.STATISTICS_NODE_LINE);
+		columnLine.setWidth(60);
+
+		columnCount = new TableColumn(memoryTable, SWT.Selection);
+		columnCount.setText(Constants.STATISTICS_NODE_ALLOCS);
+		columnCount.setWidth(60);
+		columnCount.addListener(SWT.Selection, new ATComparator(this,
+				memoryTable, 3, true));
+
+		columnTime = new TableColumn(memoryTable, SWT.Selection);
+		columnTime.setText(Constants.STATISTICS_NODE_TIME);
+		columnTime.setWidth(60);
+		columnTime.addListener(SWT.Selection, new ATComparator(this,
+				memoryTable, 4, false));
+
+		columnSize = new TableColumn(memoryTable, SWT.Selection);
+		columnSize.setText(Constants.STATISTICS_NODE_SIZE);
+		columnSize.setWidth(60);
+		columnSize.addListener(SWT.Selection, new ATComparator(this,
+				memoryTable, 5, true));
+
+		memoryTable.addSelectionListener(this);
+		memoryTable.addMouseListener(this);
+
+		memoryTable.pack();
+		memoryTable.update();
+		setDefaultContent();
+		return memoryTab;
+	}
+
+	/**
+	 * Fit columns size to match column text size.
+	 */
+	public void doPack() {
+		TableColumn[] columns = memoryTable.getColumns();
+		for (int i = 0; i < columns.length; i++) {
+			columns[i].pack();
+		}
+	}
+
+	/**
+	 * Return time from the time cache
+	 *
+	 * @param time
+	 *            Time
+	 * @return Time in milliseconds if time found otherwise null
+	 */
+	public Long getTimeFromCache(String time) {
+		// if time is set to cache
+		if (timeCache.containsKey(time)) {
+			return timeCache.get(time);
+		}
+		return null;
+	}
+
+	/**
+	 * Handles project changed actions
+	 *
+	 * @param projectRef
+	 *            Project reference
+	 */
+	public void handleProjectChange(IProject projectRef) {
+
+		//save selected project info
+		if (projectRef == null) {
+			return;
+		} else if (currProject == null) {
+			currProject = projectRef;
+		} else if (currProject.equals(projectRef)) {
+			return;
+		}
+
+		currProject = projectRef;
+
+		//update UI items to match selected project results
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				memoryTable.clearAll();
+				infoLabel.setText("");
+				selectedRun = 0;
+				AbstractList<ProcessInfo> processes = projectRelatedRes
+						.get(currProject);
+
+				if (processes == null || processes.isEmpty()) {
+					String[] text = new String[1];
+					text[0] = "Run: 1";
+					combo.setItems(text);
+					combo.select(0);
+				} else {
+					String[] text = new String[processes.size()];
+					for (int i = 0; i < processes.size(); i++) {
+						text[i] = "Run: " + Integer.toString(i + 1);
+					}
+					combo.setItems(text);
+					combo.select(0);
+				}
+
+				updateCache();
+				compareAndPrint(false);
+			}
+		});
+	}
+
+	/**
+	 * Go thru the project files and stores cpp files.
+	 *
+	 * @param resource
+	 *            One resource file of project
+	 */
+	public final void loadFileInfo(IResource resource) {
+		// get all the cpp file info which are belongs to current project
+		String cppFileName = Util.getCPPFileNameAndPath(resource);
+
+		// if cpp file found, save it
+		if (cppFileName != null && !cppFileNames.contains(cppFileName)) {
+			this.cppFileNames.add(cppFileName);
+		}
+	}
+
+	/**
+	 * Listen mouse double click actions. Opens selected item in editor
+	 */
+	public void mouseDoubleClick(MouseEvent arg0) {
+		openSourceFile(null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseDown(MouseEvent arg0) {
+		//this method is overwrite method of MouseListnener
+		//and AT do not listens mouse DOWN events
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+	 */
+	public void mouseUp(MouseEvent arg0) {
+		//this method is overwrite method of MouseListnener
+		//and AT do not listens mouse UP events
+	}
+
+	/**
+	 * Opens current callstack item on default editor and pinpoints memory leak
+	 * line
+	 *
+	 * @param cppFileName
+	 *            Cpp file name
+	 * @param lineNumber
+	 *            Cpp file line number
+	 */
+	private void openEditor(String cppFileName, String lineNumber) {
+
+		//check that used information is given
+		//we need to know file name and file line number
+		//that we could open the right line in editor
+		if (cppFileName == null || ("").equals(cppFileName)
+				|| lineNumber == null || ("").equals(lineNumber)) {
+			return;
+		}
+		try {
+
+			IFile file = null;
+			String usedFileName = null;
+			usedFileName = getFileNames(cppFileName);
+			if (currProject.isOpen()) {
+				file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+						new Path(currProject.getName()
+								+ usedFileName.toLowerCase(Locale.US)));
+			}
+
+			// if file not found in active project
+			// go thru all open projects in current workbench
+			if (file == null || !file.exists()) {
+				IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace()
+						.getRoot();
+				IProject[] projects = myWorkspaceRoot.getProjects();
+				for (int i = 0; i < projects.length; i++) {
+					file = ResourcesPlugin.getWorkspace().getRoot().getFile(
+							new Path(projects[i].getName() + "\\"
+									+ usedFileName));
+
+					// file found => skip the rest of the projects
+					if (file != null && file.exists()) {
+						break;
+					}
+				}
+
+			}
+
+			// if file still not found
+			// display info to user and leave
+			if (file == null || !file.exists()) {
+				Util.showMessage(Constants.SOURCE_NOT_FOUND);
+				return;
+			}
+
+			IWorkbenchPage page = PlatformUI.getWorkbench()
+					.getActiveWorkbenchWindow().getActivePage();
+
+			HashMap<String, Object> map = new HashMap<String, Object>();
+			map.put(IMarker.LINE_NUMBER, Integer.parseInt(lineNumber));
+			// map.put(IDE.EDITOR_ID_ATTR,
+			// "org.eclipse.jdt.ui.ClassFileEditor");
+			map.put(IDE.EDITOR_ID_ATTR, Constants.SOURCE_FILE_EDITOR_ID);
+			IMarker marker = file.createMarker(IMarker.TEXT);
+			marker.setAttributes(map);
+			IDE.openEditor(page, marker, true);
+
+		} catch (PartInitException pie) {
+			pie.printStackTrace();
+		} catch (NullPointerException npe) {
+			npe.printStackTrace();
+		} catch (CoreException ce) {
+			ce.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * Opens source file for the selected item
+	 *
+	 * @param item
+	 *            Selected item
+	 */
+	private void openSourceFile(TableItem item) {
+		TableItem usedItem;
+
+		if (item == null && selectedItem == null) {
+			return;
+		} else if (item == null) {
+			usedItem = selectedItem;
+		} else {
+			usedItem = item;
+		}
+
+		// get source code line
+		String sourceLine = usedItem.getText(2);
+
+		// get source code file name
+		String sourceFile = usedItem.getText(0);
+
+		// open file in editor
+		openEditor(sourceFile, sourceLine);
+	}
+
+	/**
+	 * Pinpoints one memory address to source code line.
+	 *
+	 * @param memoryAddress
+	 *            Memory address
+	 * @param dllLoad
+	 *           DllLoad item
+	 * @return SourceFile if found otherwise null
+	 */
+	private SourceFile pinpoint(Long memoryAddress, DllLoad dllLoad) {
+
+		//if dll load item exists
+		if (dllLoad != null) {
+
+			//get symbol file
+			ISymbolFile symbolFile = reader.getSymbolFile(dllLoad.getName(),
+					true);
+
+			//if symbol file found => try to pinpoint memory address to source code line
+			if( symbolFile != null ) {
+				return pinpointToSrcLine(symbolFile, memoryAddress, dllLoad);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Pinpoints memory address to source code line
+	 *
+	 * @param symbolFile
+	 *            Opened symbol file
+	 * @param memoryAddress
+	 *            Used memory address
+	 * @param dllLoad
+	 *            DllLoad object where to memory address belongs
+	 * @return SourceFile
+	 */
+	private SourceFile pinpointToSrcLine(ISymbolFile symbolFile,
+			Long memoryAddress, DllLoad dllLoad) {
+
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(currProject);
+		String platform = cpi.getDefaultConfiguration().getPlatformString();
+
+		try {
+			// this is the start address of each symbol file
+			long defaultLinkAddress = 0;
+
+			// if the platform is other than winscw => adjust the memory address
+			if (!(Constants.BUILD_TARGET_WINSCW).equalsIgnoreCase(platform)) {
+				defaultLinkAddress = Long.parseLong("8000", 16);
+			}
+
+			// calculate memory address in symbol file
+			long calculated = (memoryAddress - dllLoad.getStartAddress()) + defaultLinkAddress;
+
+			java.math.BigInteger bigAddress = new java.math.BigInteger(Long
+					.toHexString(calculated), 16);
+			IFunction func = symbolFile.findFunctionByAddress(bigAddress);
+			ISourceLocation loc = symbolFile.findSourceLocation(bigAddress);
+			if (func != null && loc != null) {
+				if (loc.getSourceFile() == null
+						|| loc.getSourceFile().equalsIgnoreCase(""))
+					return null;
+				if (loc.getLineNumber() == 0)
+					return null;
+				if (func.getName() == null
+						|| func.getName().equalsIgnoreCase(""))
+					return null;
+				/*
+				 * if( onlyForProjectFiles &&
+				 * !isFilePartOfTheProject(loc.getSourceFile()) ) return null;
+				 */
+				SourceFile file = new SourceFile();
+				file.setFileName(loc.getSourceFile());
+				file.setLineNumber(loc.getLineNumber());
+				file.setFunctionName(func.getName());
+				return file;
+			}
+
+		} catch (java.lang.NumberFormatException nfe) {
+			errorOccurred = true;
+			// do nothing by design
+			nfe.printStackTrace();
+		} catch (Exception e) {
+			errorOccurred = true;
+			// do nothing by design
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	/**
+	 * Sets statistic data
+	 *
+	 * @param project
+	 *            Project reference
+	 * @param processes
+	 *            Statistic info for the processes
+	 */
+	public void setData(IProject project,
+			final AbstractList<ProcessInfo> processes) {
+		currProject = project;
+		cache.clear();
+
+		// update ui items
+		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				memoryTable.clearAll();
+				memoryTable.setItemCount(1);
+				TableItem tableItem = memoryTable.getItem(0);
+				String[] data = new String[6];
+				data[0] = Constants.STATISTICS_GENERATING;
+				data[1] = "";
+				data[2] = "";
+				data[3] = "";
+				data[4] = "";
+				data[5] = "";
+				tableItem.setText(data);
+				doPack();
+				String[] text = new String[processes.size()];
+				for (int i = 0; i < processes.size(); i++) {
+					text[i] = "Run: " + Integer.toString(i + 1);
+				}
+				combo.setItems(text);
+				combo.select(0);
+				combo.setEnabled(false);
+				infoLabel.setText("");
+
+			}
+		});
+		// store data
+		projectRelatedRes.put(project, new ArrayList<ProcessInfo>(processes));
+
+		// create results
+		compareAndPrint(true);
+
+		//update view
+		updateView(cache.get(selectedRun), true);
+
+		//load project cpp files => this helps us to open found source files in editor
+		ResourceVisitor visitor = new ResourceVisitor(this);
+		try {
+			currProject.accept(visitor);
+		} catch (CoreException ce) {
+			// DO nothing be design
+		}
+	}
+
+
+	@SuppressWarnings("unchecked")
+	private void storeSortedItems(final int runIndex) {
+		HashMap<Integer, AbstractList<String[]>> uiItems = new HashMap<Integer, AbstractList<String[]>>();
+			AbstractList<String[]> strings = new ArrayList<String[]>();
+			TableItem[] items = memoryTable.getItems();
+			for(int i=0; i<items.length; i++) {
+				TableItem oneItem = items[i];
+				String[] text = new String[6];
+				for(int j=0; j<6;j++) {
+					text[j] = oneItem.getText(j);
+				}
+				strings.add(text);
+			}
+			uiItems.put(runIndex, strings);
+
+			cache.put(runIndex, new ArrayList<String[]>(strings));
+			projectCache.put(currProject,(HashMap<Integer, AbstractList<String[]>>) uiItems.clone());
+	}
+
+
+	/**
+	 * Sets default content for the Statistic view.
+	 */
+	public void setDefaultContent() {
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				memoryTable.clearAll();
+				TableItem oneItem = memoryTable.getItem(0);
+				String[] data = new String[6];
+				data[0] = Constants.STATISTICS_NO_STATS;
+				data[1] = noResults;
+				data[2] = noResults;
+				data[3] = noResults;
+				data[4] = noResults;
+				data[5] = noResults;
+				oneItem.setText(data);
+			}
+		});
+	}
+
+	/**
+	 * Stores results to cache
+	 *
+	 * @param sortedFiles
+	 *            Sorted statistic results
+	 * @param runIndex
+	 *            Selected run index
+	 */
+	@SuppressWarnings("unchecked")
+	private void storeResults(AbstractList<SourceFile> sortedFiles, int runIndex) {
+		int founds = 0;
+		AbstractList<String[]> usedItems = new ArrayList<String[]>();
+		Iterator<SourceFile> iterSourceFile = sortedFiles.iterator();
+
+		//thru sorted source files
+		//create string table for each found source file because memoryTable use string tables when inserting items
+		while (iterSourceFile.hasNext()) {
+			SourceFile tempSrcFile = iterSourceFile.next();
+			String[] sdata = new String[6];
+			sdata[0] = tempSrcFile.getFileName();
+			sdata[1] = tempSrcFile.getFunctionName();
+			sdata[2] = Integer.toString(tempSrcFile.getLineNumber());
+			sdata[3] = Integer.toString(tempSrcFile.getHowManyTimes());
+			String time = converTime(tempSrcFile.getTime());
+			sdata[4] = time;
+			sdata[5] = Integer.toString(tempSrcFile.getSize());
+
+			//add time to cache
+			//when sorting UI items with time we using the timeCache
+			try {
+				timeCache.put(time, tempSrcFile.getTime());
+			} catch (java.lang.NumberFormatException nfe) {
+				// do nothing by design
+			}
+
+			usedItems.add(sdata);
+			founds++;
+		}
+
+		//if no items => set default content to UI
+		if (founds == 0) {
+			String[] data = new String[6];
+			data[0] = Constants.STATISTICS_NO_STATS;
+			data[1] = noResults;
+			data[2] = noResults;
+			data[3] = noResults;
+			data[4] = noResults;
+			data[5] = noResults;
+			usedItems.add(data);
+		}
+
+		// add pinpointed info to the cache
+		cache.put(runIndex, usedItems);
+		projectCache.put(currProject,
+				(HashMap<Integer, AbstractList<String[]>>) cache.clone());
+	}
+
+	/**
+	 * Updates cache for match project changes.
+	 */
+	@SuppressWarnings("unchecked")
+	public void updateCache() {
+
+		//project cache contains result for selected project
+		if (projectCache.containsKey(currProject)) {
+
+			//clear existing caches
+			cache.clear();
+
+			//update cache
+			cache = (HashMap<Integer, AbstractList<String[]>>) projectCache
+					.get(currProject).clone();
+		}
+	}
+
+	/**
+	 * Updates build target and platform information.
+	 */
+	public void updateTargetInfo() {
+		if (currProject == null) {
+			return;
+		}
+		ICarbideProjectInfo cpi = CarbideBuilderPlugin.getBuildManager()
+				.getProjectInfo(currProject);
+		if (cpi != null) {
+			String platform = cpi.getDefaultConfiguration().getPlatformString();
+			String buildTarget = cpi.getDefaultConfiguration()
+					.getTargetString();
+			infoLabel.setText("Platform: " + platform + "       Build target: "
+					+ buildTarget);
+		}
+	}
+
+	/**
+	 * Updates statistic view with entered elements
+	 *
+	 * @param usedItems
+	 *            Elements to UI
+	 * @param notify Notify column to sort items
+	 */
+	public void updateView(final AbstractList<String[]> usedItems, final boolean notify) {
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+
+			public void run() {
+				memoryTable.clearAll();
+
+				if (usedItems.isEmpty()) {
+					memoryTable.setItemCount(1);
+					TableItem item = memoryTable.getItem(0);
+					String[] data = new String[6];
+					data[0] = Constants.STATISTICS_NO_STATS;
+					data[1] = noResults;
+					data[2] = noResults;
+					data[3] = noResults;
+					data[4] = noResults;
+					data[5] = noResults;
+					item.setText(data);
+					return;
+				}
+				memoryTable.setItemCount(usedItems.size());
+
+				Iterator<String[]> iterItems = usedItems.iterator();
+				int counter = 0;
+				while (iterItems.hasNext()) {
+					String[] text = iterItems.next();
+					TableItem item = memoryTable.getItem(counter);
+					item.setText(text);
+					counter++;
+				}
+				updateTargetInfo();
+				doPack();
+				if( notify ) {
+					columnCount.notifyListeners(SWT.Selection, null);
+					storeSortedItems(selectedRun);
+
+				}
+				combo.setEnabled(true);
+			}
+		});
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 *
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent arg0) {
+		//this method is overwrite method of SelectionListener
+		//and AT do not listens widgetDefaultSelected events
+	}
+
+	/**
+	 * Checks which component is used and perform actions
+	 *
+	 * @param arg0
+	 *            Selection event
+	 */
+	public void widgetSelected(SelectionEvent arg0) {
+
+		// get selected table item
+		if (arg0.item instanceof TableItem) {
+			selectedItem = (TableItem) arg0.item;
+		} else if (arg0.getSource() instanceof Combo) {
+			Combo c = (Combo) arg0.getSource();
+			selectedRun = c.getSelectionIndex();
+			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+				public void run() {
+					compareAndPrint(false);
+				}
+			});
+		} else if (arg0.getSource() instanceof Button) {
+			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+				public void run() {
+					compareAndPrint(false);
+				}
+			});
+		}
+	}
+}