<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html lang="it" xml:lang="it">

<head>
<meta HTTP-EQUIV="refresh" CONTENT="1; url=contents.htm">
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body bgcolor="#FFFFFF" text="#000000" link="#004080" vlink="#666666" alink="#0000FF">


<table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top">






<h3 align="center">Indice</h3>

<p><br>
</p>

<h4 align="center">Attendere, caricamento della pagina dell'indice in corso...</h4>
<pre msnavigation> </pre></td><td valign="top" width="24">


      <p> <small><small>Copyright&nbsp;
        &copy; 2005, 2006 IBM Corporation e altri</small></small></p>

</td><td valign="top" width="24"></td><td valign="top" width="1%">
<p>
<a href="../index.htm"></a>
</p>

<script language="JavaScript">
var already_using_frames_MSG="Eclipse Process Framework è visualizzato mediante i frame";
// <!--
function loadTop()
{
  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
  {
     alert(already_using_frames_MSG);
  }
  else
  {
    var expires = new Date();
    expires.setTime (expires.getTime() + (1000 * 20));
    document.cookie = "rup_ory_doc=" + escape (document.URL) +
    "; expires=" + expires.toUTCString() +  "; path=/";

    var new_ory_doc_loc = null;

    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href;
         break;
       }
    }

    if(new_ory_doc_loc!=null)
    {
	if( self.name == "ory_doc" )
	{
		window.close();
		window.open( new_ory_doc_loc );
	}
	else
	{
	       	top.location = new_ory_doc_loc;
	}
    }
   }
}
// -->
</script>
<script language="JavaScript">
// <!--
  function getImageUrl(image)
  {
    var new_ory_doc_loc=null;
    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href.substring(0,document.links[i].href.lastIndexOf("/"));
         new_ory_doc_loc = new_ory_doc_loc + "" + image;
         return new_ory_doc_loc;
       }
    }
    return null;
  }
// -->
</script>
<script language="JavaScript">
// <!--
MSFPhover =
(((navigator.appName == "Netscape") &&
  (parseInt(navigator.appVersion) >= 3 )) ||
  ((navigator.appName == "Microsoft Internet Explorer") &&
  (parseInt(navigator.appVersion) >= 4 )));

  function MSFPpreload(img)
  {
     var a=new Image();
     a.src=img;
     return a;
  }
// -->
</script>
<script language="JavaScript">
// <!--
    if(MSFPhover)
    {
        RupGray=MSFPpreload(getImageUrl('/images/display_views.gif'));
        RupBlue=MSFPpreload(getImageUrl('/images/display_views_a.gif'));
    }
// -->
</script>

<script language="JavaScript">
   var displayFramesMsg="Visualizza Eclipse Process Framework tramite i frame";
// <!--
   function mouseOver()
   {
   		if(MSFPhover) 
   			document['Home'].src=RupBlue.src; 
   		self.status=displayFramesMsg; 
   		return true;
   }
// -->
</script>

<script language="JavaScript">
var clearStatusMsg=" ";
// <!--
function mouseOut()
{
if(MSFPhover) 
document['Home'].src=RupGray.src; 
self.status=clearStatusMsg;
return true;
}
// -->
</script>

<a href="JavaScript:loadTop();" onmouseover="JavaScript:mouseOver();" onmouseout="JavaScript:mouseOut();">

<p>
<img src="../images/rup1.gif" border="0" alt="Visualizza Eclipse Process Framework tramite i frame" name="Home" width="20" height="110"></p></a>
</td></tr></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
<p align="right"><small><small>Eclipse Process
Framework&nbsp;&nbsp;</small></small>
</td></tr></table>


</body>
</html>
