Blame | Last modification | View Log | RSS feed
<%@LANGUAGE="VBSCRIPT"%><%'====================================================='| |'| REPORT |'| SBOM Issues |'=====================================================%><%Option explicit' Good idea to set when using redirectResponse.Expires = 0 ' always load the page, dont store'To enable the script timeout to 5 minsServer.ScriptTimeout=300%><!--#include file="common/config.asp"--><!--#include file="common/common_subs.asp"--><!--#include file="common/globals.asp"--><!--#include file="common/formating.asp"--><!--#include file="common/qstr.asp"--><!--#include file="common/common_dbedit.asp"--><%'------------ ACCESS CONTROL ------------------%><!--#include file="_access_control_general.asp"--><%'------------ Variable Definition -------------Dim rsQryDim parPv_idDim objSbomDetailsA, objSbomDetailsBDim objRelCollectorA, objRelCollectorBDim parSbomA, parSbomBDim retValDim topLevelIdDim DEVIiss, TDSEiss, VT5DMiss, VTSUPissDim pvIdListDim objIssueDetailsDim rsCQDim rsBomPackagesDim rsPkgDeps'------------ Constants Declaration -----------'------------ Variable Init -------------------parSbomA = Request("sbomA")parSbomB = Request("sbomB")Set objRelCollectorA = CreateObject("Scripting.Dictionary")Set objRelCollectorB = CreateObject("Scripting.Dictionary")Set objSbomDetailsA = CreateObject("Scripting.Dictionary")Set objSbomDetailsB = CreateObject("Scripting.Dictionary")Set objIssueDetails = CreateObject("Scripting.Dictionary")Set rsCQ = Server.CreateObject("ADODB.Recordset")Set rsBomPackages = Server.CreateObject("ADODB.Recordset")Set rsPkgDeps = Server.CreateObject("ADODB.Recordset")'----------------------------------------------%><%'----------------------------------------------------------------------------------------------------------------------------------------Sub GetFormDetails ( nSourceSBOM, ByRef tempObjRelCollector )Dim rsQry, query' Exit if nSourceRtagId is emptyIf nSourceSBOM = "" Then Exit SubOraDatabase.Parameters.Add "SBOM", nSourceSBOM, ORAPARM_INPUT, ORATYPE_NUMBERquery = _" SELECT pr.PROJ_NAME ||' > '|| br.BRANCH_NAME ||' > '|| b.BOM_VERSION ||'.'||b.BOM_LIFECYCLE AS LOCATION, "&_" pr.PROJ_ID, b.BOM_ID, br.BRANCH_ID, b.IS_READONLY, b.RTAG_ID_FK"&_" FROM BRANCHES br,"&_" BOMS b,"&_" DM_PROJECTS pr"&_" WHERE br.PROJ_ID = pr.PROJ_ID"&_" AND b.BRANCH_ID = br.BRANCH_ID"&_" AND b.BOM_ID = :SBOM"Set rsQry = OraDatabase.DbCreateDynaset( query, ORADYN_DEFAULT )OraDatabase.Parameters.Remove "SBOM"If rsQry.RecordCount > 0 ThentempObjRelCollector ("location") = rsQry("location")tempObjRelCollector ("official") = rsQry("IS_READONLY")tempObjRelCollector ("proj_id") = rsQry("proj_id")tempObjRelCollector ("branch_id") = rsQry("branch_id")tempObjRelCollector ("bom_id") = rsQry("bom_id")tempObjRelCollector ("rtag_id_fk") = rsQry("rtag_id_fk")ElseErr.Raise 8, "Sub GetFormDetails in "& SCRIPT_NAME, "Empty record set returned. nSourceSBOM="& nSourceSBOMEnd IfIf tempObjRelCollector ("location") = "" ThentempObjRelCollector.Item ("location") = "N"End IfrsQry.CloseSet rsQry = NothingEnd Sub'----------------------------------------------------------------------------------------------------------------------------------------Sub GetPackageDetailsForIssue ( nIss_id, sPvIdList, tempIssDetails )Dim rsQry, queryquery = "SELECT DISTINCT pkg.pkg_name, pv.pkg_version, pv.v_ext, pkg.pkg_id, pv.pv_id FROM package_versions pv, packages pkg, cq_issues iss WHERE pv.pkg_id = pkg.pkg_id AND pv.pv_id = iss.pv_id AND iss.iss_id = :ISS_ID AND pv.pv_id IN ("& sPvIdList &")"OraDatabase.Parameters.Add "ISS_ID", nIss_id, ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( query, ORADYN_DEFAULT )OraDatabase.Parameters.Remove "ISS_ID"If rsQry.RecordCount > 0 ThentempIssDetails("pkg_name") = rsQry("pkg_name")tempIssDetails("pkg_version") = rsQry("pkg_version")tempIssDetails("v_ext") = rsQry("v_ext")tempIssDetails("pkg_id") = rsQry("pkg_id")tempIssDetails("pv_id") = rsQry("pv_id")ElseErr.Raise 8, "Sub GetPackageDetailsForIssue in "& SCRIPT_NAME, "Empty record set returned. nIss_id="& nIss_idEnd IfrsQry.CloseSet rsQry = NothingEnd Sub'----------------------------------------------------------------------------------------------------------------------------------------Function GetIssues( sPvIdList, oRsCqIssTemp )Dim sqlStrTemp, oRsTempSet oRsTemp = OraDatabase.DbCreateDynaset("SELECT iss_db, iss_id FROM CQ_ISSUES WHERE pv_id IN ("& sPvIdList &")", cint(0))If oRsTemp.RecordCount <> 0 ThenDEVIiss = "-1"TDSEiss = "-1"VT5DMiss = "-1"VTSUPiss = "-1"While ((NOT oRsTemp.BOF) AND (NOT oRsTemp.EOF))If CInt(oRsTemp("iss_db")) = CInt(enumCLEARQUEST_DEVI_ID) ThenDEVIiss = DEVIiss &","& oRsTemp("iss_id")ElseIf CInt(oRsTemp("iss_db")) = CInt(enumCLEARQUEST_TDSE_ID) ThenTDSEiss = TDSEiss &","& oRsTemp("iss_id")ElseIf CInt(oRsTemp("iss_db")) = CInt(enumCLEARQUEST_VT5DM_ID) ThenVT5DMiss = VT5DMiss &","& oRsTemp("iss_id")ElseIf CInt(oRsTemp("iss_db")) = CInt(enumCLEARQUEST_VTSUP_ID) ThenVTSUPiss = VTSUPiss &","& oRsTemp("iss_id")End IfoRsTemp.MoveNextWendsqlStrTemp = GetQuery ("cq_issues.sql")sqlStrTemp = Replace( sqlStrTemp, "/*enumCLEARQUEST_DEVI_ID*/", enumCLEARQUEST_DEVI_ID)sqlStrTemp = Replace( sqlStrTemp, "/*enumCLEARQUEST_TDSE_ID*/", enumCLEARQUEST_TDSE_ID)sqlStrTemp = Replace( sqlStrTemp, "/*enumCLEARQUEST_VT5DM_ID*/", enumCLEARQUEST_VT5DM_ID)sqlStrTemp = Replace( sqlStrTemp, "/*enumCLEARQUEST_VTSUP_ID*/", enumCLEARQUEST_VTSUP_ID)sqlStrTemp = Replace( sqlStrTemp, "/*DEVIiss*/", DEVIiss)sqlStrTemp = Replace( sqlStrTemp, "/*TDSEiss*/", TDSEiss)sqlStrTemp = Replace( sqlStrTemp, "/*VT5DMiss*/", VT5DMiss)sqlStrTemp = Replace( sqlStrTemp, "/*VTSUPiss*/", VTSUPiss)If oRsCqIssTemp.State = 1 ThenoRsCqIssTemp.CloseEnd IfOn Error Resume NextoRsCqIssTemp.ActiveConnection = CQ_connoRsCqIssTemp.Source = sqlStrTempoRsCqIssTemp.CursorType = 0oRsCqIssTemp.CursorLocation = 2oRsCqIssTemp.LockType = 3oRsCqIssTemp.Open()GetIssues = Err.NumberElseGetIssues = -1End IfEnd Function'----------------------------------------------------------------------------------------------------------------------------------------Sub GetPackageDependencies ( nPv_id_a, nPv_id_b, oRsTemp )OraDatabase.Parameters.Add "PV_ID_A", nPv_id_a, ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "PV_ID_B", nPv_id_b, ORAPARM_INPUT, ORATYPE_NUMBERSet oRsTemp = OraDatabase.DbCreateDynaset( GetQuery ("UniquePackageDependencies.sql"), ORADYN_DEFAULT )OraDatabase.Parameters.Remove "PV_ID_A"OraDatabase.Parameters.Remove "PV_ID_B"End Sub'----------------------------------------------------------------------------------------------------------------------------------------Sub GetAllBomContents ( nSbom_id, oRsTemp )OraDatabase.Parameters.Add "SBOM_ID", nSbom_id, ORAPARM_INPUT, ORATYPE_NUMBERSet oRsTemp = OraDatabase.DbCreateDynaset( GetQuery ("BomPackagesAndDeps.sql"), ORADYN_DEFAULT )OraDatabase.Parameters.Remove "SBOM_ID"End Sub'----------------------------------------------------------------------------------------------------------------------------------------Sub GetBomPackages ( nSbomA, nSbomB, oRsTemp )OraDatabase.Parameters.Add "SBOM_A", nSbomA, ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "SBOM_B", nSbomB, ORAPARM_INPUT, ORATYPE_NUMBERSet oRsTemp = OraDatabase.DbCreateDynaset( GetQuery ("BomPackageDiff.sql"), ORADYN_DEFAULT )OraDatabase.Parameters.Remove "SBOM_A"OraDatabase.Parameters.Remove "SBOM_B"End Sub'----------------------------------------------------------------------------------------------------------------------------------------%><%'---------------------- Run Before Page ---------------------------' Get release detailsCall GetFormDetails ( parSbomA, objRelCollectorA )Call GetFormDetails ( parSbomB, objRelCollectorB )If parSbomA <> "" AND parSbomB <> "" ThenIf Request("form_btn_comp") = "Get Issues" ThenCall OpenInWindow ( SCRIPT_NAME &"?sbomA="& parSbomA &"&sbomB="& parSbomB )End IfCall GetBomDetails (parSbomA, objSbomDetailsA)Call GetBomDetails (parSbomB, objSbomDetailsB)objSbomDetailsA("bom_full_version") = objSbomDetailsA("bom_name")&" "& objSbomDetailsA("bom_version") &"."& objSbomDetailsA("bom_lifecycle")objSbomDetailsB("bom_full_version") = objSbomDetailsB("bom_name")&" "& objSbomDetailsB("bom_version") &"."& objSbomDetailsB("bom_lifecycle")ElseobjSbomDetailsA("bom_full_version") = "Software Bill of Materials (SBOM)"End If'------------------------------------------------------------------%><html><head><title>Deployment Manager - SBOM Issues Report</title><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><link rel="stylesheet" href="images/release_manager_style.css" type="text/css"><script language="JavaScript" src="scripts/common.js"></script><script language="JavaScript" src="scripts/remote_scripting.js"></script><script language="JavaScript" type="text/javascript"><!--function RequestSBOMCombo( paramString, rowId ){var requestURL = 'RequestSBOMCombo.asp';// Set ajax divnameajaxdivname = rowId;//Append the name to search for to the requestURLvar url = requestURL + paramString;rowId.options[0] = new Option('Loading...','');rowId.selectedIndex = 0;//Create the xmlHttp object to use in the request//stateChangeHandler will fire when the state has changed, i.e. data is received backxmlHttp = GetXmlHttpObject(stateComboChangeHandler);//Send the xmlHttp get to the specified url//This is non-blocking (asynchronous)xmlHttp_Get(xmlHttp, url);}function RequestReleaseCombos( paramString, rowIdA, rowIdB ){var requestURL = 'RequestReleaseCombo.asp';// First release combo box.// Set ajax divnameajaxdivname = rowIdA;//Append the name to search for to the requestURLvar url = requestURL + paramString;rowIdA.options[0] = new Option('Loading...','');rowIdA.selectedIndex = 0;//Create the xmlHttp object to use in the request//stateChangeHandler will fire when the state has changed, i.e. data is received backxmlHttp = GetXmlHttpObject(stateComboChangeHandler);//Send the xmlHttp get to the specified url//This is blocking (synchronous)xmlHttp_Get_Synch(xmlHttp, url);// Second release combo box.ajaxdivname = rowIdB;rowIdB.options[0] = new Option('Loading...','');rowIdB.selectedIndex = 0;//Create the xmlHttp object to use in the request//stateChangeHandler will fire when the state has changed, i.e. data is received backxmlHttp = GetXmlHttpObject(stateComboChangeHandler);//Send the xmlHttp get to the specified url//This is blocking (synchronous)xmlHttp_Get_Synch(xmlHttp, url);}function openSbom( elementId ){var url = 'Bom_Home.asp?bom_id=';var bom_id = document.getElementById(elementId).value;window.open( url + bom_id );}function setLeftOffset( elementId ){if ( document.getElementById(elementId) ){var offset = (getWindowWidth() / 2) - (document.getElementById(elementId).clientWidth / 2);document.getElementById(elementId).style.left = offset;}}function removePrompt ( elementId ){var selectElement = document.getElementById(elementId);if ( /^\d+$/.test(selectElement.options[0].value) == false){selectElement.options[0] = null;}}function clearSelectBox ( elementId ){var selectElement = document.getElementById(elementId);selectElement.options.length = 0;}//--></script></head><body onresize="setLeftOffset('loader');"><div align="center" class="report_header"><%=objSbomDetailsA("bom_full_version")%> Issues Report</div><form name="FormName" method="post" action="<%=SCRIPT_NAME%>"><table width="100%" border="0" cellspacing="10" cellpadding="0"><tr><td align="left" class="body_col" colspan="2">Select SBOM To View</td></tr><tr><td align="left"><select name="proj" id="proj" class="form_item"onchange="RequestReleaseCombos('?proj_id='+ this.value, FormName.rtagA, FormName.rtagB);removePrompt(this.id);clearSelectBox('sbomA');clearSelectBox('sbomB');"><option value="">-- Select Project --</option><%' Currently set project to'Dim temp_proj_id'temp_proj_id = 142OraDatabase.Parameters.Add "PROJ_ID", objRelCollectorA("proj_id"), ORAPARM_INPUT, ORATYPE_NUMBER'OraDatabase.Parameters.Add "PROJ_ID", temp_proj_id, ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( GetQuery("ProjectsCombo.sql"), cint(0))OraDatabase.Parameters.Remove "PROJ_ID"While ((NOT rsQry.BOF) AND (NOT rsQry.EOF))%><option value="<%=rsQry("proj_id")%>" <%=rsQry("selected")%>><%=rsQry("proj_name")%></option><%rsQry.MoveNextWEndrsQry.CloseSet rsQry = Nothing%></select></td><td align="left" class="body_col">Select SBOM To Compare To</td></tr><tr><td align="left" width="25%"><select name="rtagA" id="rtagA" class="form_item" onchange="RequestSBOMCombo('?branch_id='+ this.value, FormName.sbomA);removePrompt(this.id);"><!-- <option value="">-- Select Branch --</option> --><%OraDatabase.Parameters.Add "PROJ_ID", objRelCollectorA("proj_id"), ORAPARM_INPUT, ORATYPE_NUMBER'OraDatabase.Parameters.Add "PROJ_ID", temp_proj_id, ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "BRANCH_ID", objRelCollectorA("branch_id"), ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( GetQuery("ReleasesCombo.sql"), cint(0))OraDatabase.Parameters.Remove "PROJ_ID"OraDatabase.Parameters.Remove "BRANCH_ID"While ((NOT rsQry.BOF) AND (NOT rsQry.EOF))%><option value="<%=rsQry("branch_id")%>" <%=rsQry("selected")%>><%=rsQry("branch_name")%></option><%rsQry.MoveNextWEndrsQry.CloseSet rsQry = Nothing%></select></td><td align="left"><select name="rtagB" id="rtagB" class="form_item" onchange="RequestSBOMCombo('?branch_id='+ this.value, FormName.sbomB);removePrompt(this.id);"><!-- <option value="">-- Select Branch --</option> --><%OraDatabase.Parameters.Add "PROJ_ID", objRelCollectorB("proj_id"), ORAPARM_INPUT, ORATYPE_NUMBER'OraDatabase.Parameters.Add "PROJ_ID", temp_proj_id, ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "BRANCH_ID", objRelCollectorB("branch_id"), ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( GetQuery("ReleasesCombo.sql"), cint(0))OraDatabase.Parameters.Remove "PROJ_ID"OraDatabase.Parameters.Remove "BRANCH_ID"While ((NOT rsQry.BOF) AND (NOT rsQry.EOF))%><option value="<%=rsQry("branch_id")%>" <%=rsQry("selected")%>><%=rsQry("branch_name")%></option><%rsQry.MoveNextWEndrsQry.CloseSet rsQry = Nothing%></select></td></tr><tr><td align="left" width="25%"><select name="sbomA" id="sbomA" class="form_item"><%OraDatabase.Parameters.Add "BOM_ID", objRelCollectorA("bom_id"), ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "BRANCH_ID", objRelCollectorA("branch_id"), ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( GetQuery("SBOMCombo.sql"), cint(0))OraDatabase.Parameters.Remove "BOM_ID"OraDatabase.Parameters.Remove "BRANCH_ID"While ((NOT rsQry.BOF) AND (NOT rsQry.EOF))%><option value="<%=rsQry("bom_id")%>" <%=rsQry("selected")%>><%=rsQry("version")%></option><%rsQry.MoveNextWEndrsQry.CloseSet rsQry = Nothing%></select></td><td align="left"><select name="sbomB" id="sbomB" class="form_item"><%OraDatabase.Parameters.Add "BOM_ID", objRelCollectorB("bom_id"), ORAPARM_INPUT, ORATYPE_NUMBEROraDatabase.Parameters.Add "BRANCH_ID", objRelCollectorB("branch_id"), ORAPARM_INPUT, ORATYPE_NUMBERSet rsQry = OraDatabase.DbCreateDynaset( GetQuery("SBOMCombo.sql"), cint(0))OraDatabase.Parameters.Remove "BOM_ID"OraDatabase.Parameters.Remove "BRANCH_ID"While ((NOT rsQry.BOF) AND (NOT rsQry.EOF))%><option value="<%=rsQry("bom_id")%>" <%=rsQry("selected")%>><%=rsQry("version")%></option><%rsQry.MoveNextWEndrsQry.CloseSet rsQry = Nothing%></select></td></tr><%If parSbomA <> "" OR parSbomB <> "" Then%><tr><td align="left" width="25%"><%If parSbomA <> "" Then%><a href="javascript:;" onclick="openSbom('sbomA')" class="body_txt_drk">Go To SBOM A »</a><%End If%></td><td align="left"><%If parSbomB <> "" Then%><a href="javascript:;" onclick="openSbom('sbomB')" class="body_txt_drk">Go To SBOM B »</a><%End If%></td></tr><%End If%><tr><td colspan="2"><input class="form_btn_comp" name="form_btn_comp" type="submit" style="margin-right: 5px;" value="Get Issues" name="btn"/></td></tr></table></form><%If parSbomA = "" OR parSbomB = "" Then%><div align="center" class="report_msg">Select both SBOMs to compare.</div><%ElseIf parSbomA = parSbomB Then%><div align="center" class="report_msg">Select two different SBOMs to compare.</div><%Else%><img src="images/ajax-loader.gif" width="100px" height="100px" id="loader" name="loader" style="position: absolute; z-index: 100; display: block; top: 110px;" onload="setLeftOffset(this.id);"><div align="center" class="report_msg" id="report_heading">Issues found in BOM <%=objSbomDetailsA("bom_version") &"."& objSbomDetailsA("bom_lifecycle")%> but not in SBOM <%=objSbomDetailsB("bom_version") &"."& objSbomDetailsB("bom_lifecycle")%></div><br><%Dim issueCounterissueCounter = 0Call GetBomPackages( parSbomA, parSbomB, rsBomPackages )If rsBomPackages.RecordCount > 0 ThenWhile (NOT rsBomPackages.BOF) AND (NOT rsBomPackages.EOF)pvIdList = rsBomPackages("pv_id")Call GetPackageDependencies( rsBomPackages("pv_id"), rsBomPackages("prev_pv_id"), rsPkgDeps )While (NOT rsPkgDeps.BOF) AND (NOT rsPkgDeps.EOF)pvIdList = pvIdList & "," & rsPkgDeps("dpv_id")rsPkgDeps.MoveNextWendretVal = GetIssues( pvIdList, rsCQ )If retVal = 0 ThenissueCounter = issueCounter + 1%><fieldset><legend style="padding: 0px 4px 3px 4px;" ><a href="javascript:;" onclick="MM_openBrWindow('../release_manager/_wform_versions_history_release_notes.asp?OLDpv_id=<%=rsBomPackages("pv_id")%>&pkg_id=<%=rsBomPackages("pkg_id")%>&FLpkg_version=*<%=rsBomPackages("v_ext")%>&FLuser_name=*&rfile=<%=SCRIPT_NAME%>&pv_id=<%=rsBomPackages("pv_id")%>&#ANC_<%=rsBomPackages("pv_id")%>','History','resizable=yes,width=850,height='+ ( screen.height - 100 ) );" class="report_sub_header"><%=rsBomPackages("pkg_name")%> <%=rsBomPackages("pkg_version")%></a></legend><table width="100%" border="0" cellspacing="2" cellpadding="3"><tr><td background="images/bg_form_lightbluedark.gif" nowrap width="70px" class="form_field">Issue Id</td><td background="images/bg_form_lightbluedark.gif" nowrap width="65%" class="form_field">Title</td><td background="images/bg_form_lightbluedark.gif" nowrap width="80px" class="form_field">Status</td><td background="images/bg_form_lightbluedark.gif" nowrap class="form_field">Package</td></tr><%While (NOT rsCQ.BOF) AND (NOT rsCQ.EOF)Call GetPackageDetailsForIssue( rsCQ("iss_id"), pvIdList, objIssueDetails )%><tr><td background="images/bg_form_lightgray.gif" valign="top" class="form_item"><%=rsCQ("iss_num")%></td><td background="images/bg_form_lightgray.gif" valign="top" class="form_item"><%=rsCQ("summary")%></td><td nowrap background="images/bg_form_lightgray.gif" valign="top" class="form_item"><%=rsCQ("status")%></td><td nowrap background="images/bg_form_lightgray.gif" valign="top" class="form_item"><a href="javascript:;" onclick="MM_openBrWindow('../release_manager/_wform_versions_history_release_notes.asp?OLDpv_id=<%=objIssueDetails("pv_id")%>&pkg_id=<%=objIssueDetails("pkg_id")%>&FLpkg_version=*<%=objIssueDetails("v_ext")%>&FLuser_name=*&rfile=<%=SCRIPT_NAME%>&pv_id=<%=objIssueDetails("pv_id")%>&#ANC_<%=objIssueDetails("pv_id")%>','History','resizable=yes,width=850,height='+ ( screen.height - 100 ) );" class="report_link"><%Response.Write(objIssueDetails("pkg_name") &" "& objIssueDetails("pkg_version"))%></a></td></tr><%rsCQ.MoveNextWend%></table></fieldset><br><%End IfrsBomPackages.MoveNextWendEnd IfIf issueCounter = 0 Then%><div align="center" class="report_sub_header">No issues found</div><%End If%><script><!--document.getElementById("loader").style.display = "none";//--></script><%' Clean up objects before quittingOn Error Resume NextrsBomPackages.ClosersPkgDeps.ClosersCQ.CloseSet objRelCollectorA = NothingSet objRelCollectorB = NothingSet objSbomDetailsA = NothingSet objSbomDetailsB = NothingSet rsBomPackages = NothingSet rsPkgDeps = NothingSet rsCQ = NothingEnd If%></body></html>