<!DOCTYPE html> <html> <head> <!--meta charset="utf-8"--> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> form { display: table; } p { display: table-row; } label { display: table-cell; } input { display: table-cell; } h1{ color:red;} h2{ color:red;} </style> <!-- <title>Onenet插件测试页面</title> --> <!-- <h1>重要提示:</h1> <h2>请不要直接在本地打开onenettest.html进行测试,这样会导致调用onenethelper.js的接口失败</h2> <h2>一定要将demo目录下的文件,放置到web服务器中,通过浏览器访问的方式进行测试。</h2> <h2>各个接口的详细说明,请务必参考《【非密】卫士通安全网关V4.0接口开发手册.pdf》</h2> --> <!-- (1) 可选 , 针对IE浏览器 申明引用ActiveX 对象(如果业务系统不需要支持IE浏览器,可以不引用ActiveX对象) --> <object id="AuthClientCtrl" classid="clsid:C966EBD9-49E9-4E9C-B854-270861C58382" width="0" height="0"></object> <!-- 可选 , 针对奇安信浏览器 引用plugin 对象 --> <object id="plugin" type="application/onenet-plugin" width="0" height="0"></object> <!-- 可选 , 针对老版本IE浏览器 兼容模式不支持json的情况下,引用json2.js,解决json 解析问题。(如果业务系统不需要支持IE浏览器,可以不引用) --> <script type="text/javascript" src="json2.js"></script> <!-- (2)引入onenethelper浏览器插件的js文件,总共四个文件 --> <script type="text/javascript" src="onenethelper.webext.js"></script> <script type="text/javascript" src="onenethelper.np.js"></script> <script type="text/javascript" src="onenethelper.ie.js"></script> <script type="text/javascript" src="onenethelper.js"></script> </head> <body> <script src="./axios.min.js"></script> <script> //(3) 初始化onenethelper插件 onenetHelperInit.Init(); //(4) 判断onenethelper插件是否可用 function IsAddonAvailable() { if(oneNetHelper.IsAddonAvailable()) { form1.T01.value = "true"; } else { alert("请先安装插件!") //(5) 当onenethelper插件不可用时,调用通知接口加载插件 oneNetHelper.AddonAvailableNotify(AddonAvailableCb); } } function AddonAvailableCb(ob) { form1.T01.value=ob.addon; } function ClearAddonStatusButton() { form1.T01.value = ""; } //(6)以下为具体的业务调用。 function GetUserInfoCb(ob) { //console.log('GetUserInfoCb return :' + JSON.stringify(ob)); form1.T6.value=ob.ret; if(ob.ret == 1) { form1.T1.value=ob.authresult; form1.T2.value=ob.userid; form1.T3.value=ob.username; form1.T4.value=ob.certuserid; form1.T5.value=ob.certusername; form1.T7.value="成功"; } else { form1.T7.value=ob.errinfo; } } function GetUserInfoClear() { form1.T1.value=""; form1.T2.value=""; form1.T3.value=""; form1.T4.value=""; form1.T5.value=""; form1.T6.value=""; form1.T7.value=""; } function GetUserInfo() { if(form1.T01.value == "false" || form1.T01.value == 0) { alert("请先安装插件!") } oneNetHelper.GetUserInfo(GetUserInfoCb); } function GetSignAndTokenCb(ob) { //console.log('GetSignAndTokenCb return:' + JSON.stringify(ob)); form1.T10.value=ob.ret; if(ob.ret == 1) { console.log(ob.signandtoken,'组合令牌') form1.T9.value = ob.signandtoken;//获取组合令牌数据 form1.T11.value="成功"; axios({ method: 'post', // url:' http://127.0.0.1:6006/webservice/verifyIdentityTicket ', // 配制api data: { // 配制参数 challenge: form1.T8.value,//随机挑战数 identityTicket:form1.T9.value,//组合令牌数据 appServerID:'0'//服务器ID }, headers: { } }).then(res => { if(res.expiresIn==7200) { } }) } else { form1.T11.value=ob.errinfo; } } function GetSignAndTokenClear() { //form1.T8.value=""; form1.T9.value=""; form1.T10.value=""; form1.T11.value=""; } function GetSignAndToken() { if(form1.T01.value == "false" || form1.T01.value == 0) { alert("请先安装插件!") } if (form1.T8.value == "") { alert("请输入随机数"); } else { axios({ method: 'post', // url:' http://127.0.0.1:6006/webservice/generatorchallenge', // 配制api data: { // 配制参数 }, headers: { } }).then(res => { if(res.data.code ==0) console.log(res.data.msg,'随机挑战数') form1.T8.value = res.data.msg//获取随机挑战数 oneNetHelper.GetSignAndToken(form1.T8.value, GetSignAndTokenCb); }) } } function GetUserCertInfoCb(ob) { //console.log('GetUserCertInfoCb return :' + JSON.stringify(ob)); form1.T37.value=ob.ret; if(ob.ret == 1) { form1.T39.value=ob.DNStringAll; form1.T21.value=ob.UserName; form1.T22.value=ob.UserID; form1.T23.value=ob.DNCode; form1.T24.value=ob.DisName; form1.T25.value=ob.UniqueId; form1.T26.value=ob.IssuerDisName; form1.T27.value=ob.CertSerial; form1.T28.value=ob.EMail; form1.T29.value=ob.Org; form1.T30.value=ob.OrgUnit; form1.T31.value=ob.City; form1.T32.value=ob.State; form1.T33.value=ob.Descption; form1.T34.value=ob.Version; form1.T35.value=ob.BeginTime; form1.T36.value=ob.EndTime; form1.T38.value="成功"; } else { form1.T38.value=ob.errinfo; } } function GetUserCertInfoClear() { form1.T21.value=""; form1.T22.value=""; form1.T23.value=""; form1.T24.value=""; form1.T25.value=""; form1.T26.value=""; form1.T27.value=""; form1.T28.value=""; form1.T29.value=""; form1.T30.value=""; form1.T31.value=""; form1.T32.value=""; form1.T33.value=""; form1.T34.value=""; form1.T35.value=""; form1.T36.value=""; form1.T37.value=""; form1.T38.value=""; form1.T39.value=""; } function GetUserCertInfo() { if(form1.T01.value == "false" || form1.T01.value == 0) { alert("请先安装插件!") } oneNetHelper.GetUserCertInfo(GetUserCertInfoCb); } //获取统一认证Token的应用举例 function GetUASTokenCb(ob) { //console.log('obj:' + JSON.stringify(ob)); if(ob.ret == 1) { form1.S01.value="成功"; form1.S02.value=ob.token; form1.S03.value=ob.expiredate; } else { form1.S01.value=ob.errinfo; } } function GetUASToken() { oneNetHelper.GetUASToken(GetUASTokenCb); } function GetUASTokenClear() { form1.S01.value=""; form1.S02.value=""; form1.S03.value=""; } function SSLUsbKeyLoginCb(ob) { // console.log('SSLUsbKeyLoginCb return :' + JSON.stringify(ob)); form1.T44.value=ob.ret; if(ob.ret == 1) { form1.T45.value="认证成功"; } else { form1.T45.value=ob.errinfo; } } function SSLUsbKeyLoginClear() { form1.T41.value=""; form1.T42.value=""; form1.T43.value=""; form1.T44.value=""; form1.T45.value=""; } function SSLUsbKeyLogin() { if (form1.T41.value == ""||form1.T42.value == ""||form1.T43.value == "") { alert("请输入登录参数"); } else { oneNetHelper.SSLUsbKeyLogin(form1.T41.value,form1.T42.value,form1.T43.value,SSLUsbKeyLoginCb); } } function SSLUserPwdLoginCb(ob) { //console.log('SSLUserPwdLoginCb return :' + JSON.stringify(ob)); form1.T50.value=ob.ret; if(ob.ret == 1) { form1.T51.value="认证成功"; } else { form1.T51.value=ob.errinfo; } } function SSLUserPwdLoginClear() { form1.T46.value=""; form1.T47.value=""; form1.T48.value=""; form1.T49.value=""; form1.T50.value=""; form1.T51.value=""; } function SSLUserPwdLogin() { if (form1.T46.value == ""||form1.T47.value == ""||form1.T48.value == ""||form1.T49.value == "") { alert("请输入登录参数"); } else { oneNetHelper.SSLUserPwdLogin(form1.T46.value,form1.T47.value,form1.T48.value,form1.T49.value,SSLUserPwdLoginCb); } } function IPSecUsbKeyLoginCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T55.value=ob.ret; if(ob.ret == 1) { form1.T56.value="认证成功"; } else { form1.T56.value=ob.errinfo; } } function IPSecUsbKeyLoginClear() { form1.T52.value=""; form1.T53.value=""; form1.T54.value=""; form1.T55.value=""; form1.T56.value=""; } function IPSecUsbKeyLogin() { if (form1.T52.value == ""||form1.T53.value == ""||form1.T54.value == "") { alert("请输入登录参数"); } else { oneNetHelper.IPSecUsbKeyLogin(form1.T52.value,form1.T53.value,form1.T54.value,IPSecUsbKeyLoginCb); } } function LoginCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T63.value=ob.ret; if(ob.ret == 1) { form1.T64.value="认证成功"; } else { form1.T64.value=ob.errinfo; } } function LoginClear() { form1.T57.value=""; form1.T58.value=""; form1.T59.value=""; form1.T60.value=""; form1.T61.value=""; form1.T62.value=""; form1.T63.value=""; form1.T64.value=""; } function Login() { oneNetHelper.Login(form1.T57.value,form1.T58.value,form1.T59.value,form1.T60.value,form1.T61.value,form1.T62.value,LoginCb); } function LogoutCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T72.value=ob.ret; if(ob.ret == 1) { form1.T73.value="退出成功"; } else { form1.T73.value=ob.errinfo; } } function Logout() { if (form1.T71.value == "") { alert("请输入登出参数"); } else { oneNetHelper.Logout(form1.T71.value, LogoutCb); } } function LogoutClear() { form1.T71.value=""; form1.T72.value=""; form1.T73.value=""; } function QuerySecPortalStatusCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T83.value=ob.ret; if(ob.ret == 1) { form1.T82.value=ob.AuthEvent; form1.T84.value="成功"; } else { form1.T84.value=ob.errinfo; } } function QuerySecPortalStatus() { if (form1.T81.value == "") { alert("请输入参数"); } else { oneNetHelper.QuerySecPortalStatus(form1.T81.value, QuerySecPortalStatusCb); } } function QuerySecPortalStatusClear() { form1.T81.value=""; form1.T82.value=""; form1.T83.value=""; form1.T84.value=""; } function HeartBeatCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T92.value=ob.ret; if(ob.ret == 1) { form1.T93.value="成功"; } else { form1.T93.value=ob.errinfo; } } function HeartBeat() { if (form1.T91.value == "") { alert("请输入参数"); } else { oneNetHelper.HeartBeat(form1.T91.value, HeartBeatCb); //oneNetHelper.HeartBeat(form1.T91.value,null); } } function HeartBeatClear() { form1.T91.value=""; form1.T92.value=""; form1.T93.value=""; } function ClearAll() { GetUserNameClear(); GetSignAndTokenClear(); GetUserCertInfoClear(); LoginClear(); LogoutClear(); QuerySecPortalStatusClear(); HeartBeatClear(); } function GetGateWayAddrListCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T101.value=ob.ret; if(ob.ret == 1) { form1.T102.value="成功"; form1.T103.value=ob.wbaddrNum; if(ob.wbaddrNum > 0) { form1.T104.value=ob.webserviceList; form1.T105.value=ob.webserviceList[0]; } form1.T106.value=ob.gwaddrNum; if(ob.gwaddrNum > 0) { form1.T107.value=ob.gatewayaddrList; form1.T108.value=ob.gatewayaddrList[0]; } } else { form1.T102.value=ob.errinfo; } } function GetGateWayAddrList() { oneNetHelper.GetGateWayAddrList(GetGateWayAddrListCb); } function GetGateWayAddrListClear() { form1.T101.value=""; form1.T102.value=""; form1.T103.value=""; form1.T104.value=""; form1.T105.value=""; form1.T106.value=""; form1.T107.value=""; form1.T108.value=""; } function ChangeUKeyPinCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T111.value=ob.ret; if(ob.ret == 1) { form1.T112.value="成功"; } else { form1.T112.value=ob.errinfo; } } function ChangeUKeyPin() { if (form1.T113.value == "" ||form1.T114.value == ""||form1.T115.value == "") { alert("请输入PIN码"); } else { if(form1.T114.value == form1.T115.value ) { oneNetHelper.ChangeUKeyPin(form1.T113.value,form1.T114.value,ChangeUKeyPinCb); } else { alert("两次输入的新PIN码不一致"); } } } function ChangeUKeyPinClear() { form1.T111.value=""; form1.T112.value=""; form1.T113.value=""; form1.T114.value=""; form1.T115.value=""; } function JsonActionTestCmdDealCb(ob) { //console.log('obj:' + JSON.stringify(ob)); form1.T121.value=ob.ret; if(ob.ret == 1) { form1.T122.value="成功"; form1.T123.value=ob.value; } else { form1.T122.value=ob.errinfo; } } function JsonActionTestCmdDeal() { oneNetHelper.JsonActionTestCmdDeal(JsonActionTestCmdDealCb); } function JsonActionTestCmdDealClear() { form1.T121.value=""; form1.T122.value=""; form1.T123.value=""; } </script> <form method="POST" action="--WEBBOT-SELF--" name="form1"> <!-- <p><label>OnenetHelper测试页面</label> </p> --> <br/> <p> <label/><input type="button" value="获取插件状态" name="获取插件状态" OnClick = "IsAddonAvailable()"> <label/><input type="button" value="清空插件状态" name="B01" OnClick = "ClearAddonStatusButton()"> </p> <p> <label>安装结果:</label><input type="text" name="T01" value="0" size="80"> </p> <p><label/><br/></p> <p/> <p> <label/><input type="button" value="获取用户信息" name="获取用户信息" OnClick="return GetUserInfo()"> <label/><input type="button" value="清空用户信息" name="B1" OnClick = "return GetUserInfoClear()"> </p> <p><label>认证结果:</label> <input type="text" name="T1" size="80"></p> <p><label>用户ID:</label> <input type="text" name="T2" size="80"></p> <p><label>用户名:</label> <input type="text" name="T3" size="80"></p> <p><label>证书用户ID:</label> <input type="text" name="T4" size="80"></p> <p><label>证书用户名:</label><input type="text" name="T5" size="80"></p> <p><label>调用结果:</label><input type="text" name="T6" size="80"></p> <p><label>错误信息:</label><input type="text" name="T7" size="80"></p> <br/> <p> <label/><input type="button" value="获取令牌和签名值" name="获取令牌签名值" OnClick = "return GetSignAndToken()"> <label/><input type="button" value="清空令牌签名值" name="B4" OnClick = "return GetSignAndTokenClear()"> </p> <p><label>随机数:</label><input type="text" name="T8" size="80" value="asfsadfsadfsadfasfsadf"></p> <p><label>令牌和签名值:</label><textarea style="OVERFLOW:hidden" type="text" name="T9" rows="6" cols="80" ></textarea></p> <p><label>调用结果:</label><input type="text" name="T10" size="80"></p> <p><label>错误信息:</label><input type="text" name="T11" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="获取证书信息" name="获取证书信息" OnClick = "return GetUserCertInfo()"> <label/><input type="button" value="清空证书信息" name="B4" OnClick = "return GetUserCertInfoClear()"> </p> <p><label>DNStringAll</label> <input type="text" name="T39" size="120"></p> <p><label>UserName:</label> <input type="text" name="T21" size="80"></p> <p><label>UserID:</label> <input type="text" name="T22" size="80"></p> <p><label>DNCode:</label> <input type="text" name="T23" size="80"></p> <p><label>DisName:</label> <input type="text" name="T24" size="80"></p> <p><label>UniqueId:</label> <input type="text" name="T25" size="80"></p> <p><label>IssuerDisName</label><input type="text" name="T26" size="80"></p> <p><label>CertSerial</label><input type="text" name="T27" size="80"></p> <p><label>EMail</label><input type="text" name="T28" size="80"></p> <p><label>Org</label><input type="text" name="T29" size="80"></p> <p><label>OrgUnit</label><input type="text" name="T30" size="80"></p> <p><label>City</label><input type="text" name="T31" size="80"></p> <p><label>State</label><input type="text" name="T32" size="80"></p> <p><label>Descption</label><input type="text" name="T33" size="80"></p> <p><label>Version</label><input type="text" name="T34" size="80"></p> <p><label>BeginTime</label><input type="text" name="T35" size="80"></p> <p><label>EndTime</label><input type="text" name="T36" size="80"></p> <p><label>调用结果:</label><input type="text" name="T37" size="80"></p> <p><label>错误信息:</label><input type="text" name="T38" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="获取统一认证Token" name="获取统一认证Token" OnClick = "GetUASToken()"> <label/><input type="button" value="清空统一认证Token" name="C01" OnClick = "GetUASTokenClear()"> </p> <p><label>调用结果:</label><input type="text" name="S01" value="0" size="80"></p> <p><label>Token值:</label> <input type="text" name="S02" size="80"></p> <p><label>Token有效时间:</label> <input type="text" name="S03" size="80"></p> </p> <p><label/><br/></p> <p> <label/><input type="button" value="SSL USBKEY登录" name="SSL USBKEY登录" OnClick = "return SSLUsbKeyLogin()"> <label/><input type="button" value="清空SSL USBKEY登录" name="B5" OnClick = "return SSLUsbKeyLoginClear()"> </p> <p><label>appToken: </label><input type="text" name="T41" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>服务器ID: </label><input type="text" name="T42" size="80" value="0"></p> <p><label>UsbKeyPIN码:</label><input type="text" name="T43" size="80" value="11111111"></p> <p><label>调用结果:</label><input type="text" name="T44" size="80"></p> <p><label>错误信息:</label><input type="text" name="T45" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="SSL用户名口令登录" name="SSL用户名口令登录" OnClick = "return SSLUserPwdLogin()"> <label/><input type="button" value="清空SSL用户名口令登录" name="B5" OnClick = "return SSLUserPwdLoginClear()"> </p> <p><label>appToken: </label><input type="text" name="T46" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>服务器ID: </label><input type="text" name="T47" size="80" value="0"></p> <p><label>用户名: </label><input type="text" name="T48" size="80" value="testsx1"></p> <p><label>密 码: </label><input type="text" name="T49" size="80" value="11111111Aa"></p> <p><label>调用结果:</label><input type="text" name="T50" size="80"></p> <p><label>错误信息:</label><input type="text" name="T51" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="IPSec USBKEY登录" name="IPSec USBKEY登录" OnClick = "return IPSecUsbKeyLogin()"> <label/><input type="button" value="清空IPSec USBKEY登录" name="B5" OnClick = "return IPSecUsbKeyLoginClear()"> </p> <p><label>appToken: </label><input type="text" name="T52" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>服务器ID: </label><input type="text" name="T53" size="80" value="0"></p> <p><label>UsbKeyPIN码:</label><input type="text" name="T54" size="80" value="11111111"></p> <p><label>调用结果:</label><input type="text" name="T55" size="80"></p> <p><label>错误信息:</label><input type="text" name="T56" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="登录" name="登录" OnClick = "return Login()"> <label/><input type="button" value="清空登录" name="B5" OnClick = "return LoginClear()"> </p> <p><label>appToken: </label><input type="text" name="T57" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>用户名: </label><input type="text" name="T58" size="80" value="testsx1"></p> <p><label>密码: </label><input type="text" name="T59" size="80" value="11111111Aa"></p> <p><label>认证方式:</label><input type="text" name="T60" size="80" value="2"></p> <p><label>协议类型:</label><input type="text" name="T61" size="80" value="1"></p> <p><label>服务器ID:</label><input type="text" name="T62" size="80" value="0"></p> <p><label>调用结果:</label><input type="text" name="T63" size="80"></p> <p><label>错误信息:</label><input type="text" name="T64" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="退出登录" name="退出" OnClick = "return Logout()"> <label/><input type="button" value="清空退出" name="B6" OnClick = "return LogoutClear()"> </p> <p><label>appToken: </label><input type="text" name="T71" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>调用结果:</label><input type="text" name="T72" size="80"></p> <p><label>错误信息:</label><input type="text" name="T73" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="查询SecPortal状态" name="查询状态" OnClick = "return QuerySecPortalStatus()"> <label/><input type="button" value="清空查询状态" name="B6" OnClick = "return QuerySecPortalStatusClear()"> </p> <p><label>appToken: </label><input type="text" name="T81" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>状态值:</label><input type="text" name="T82" size="80"></p> <p><label>调用结果:</label><input type="text" name="T83" size="80"></p> <p><label>错误信息:</label><input type="text" name="T84" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="发送心跳" name="心跳" OnClick = "return HeartBeat()"> <label/><input type="button" value="清空心跳" name="B6" OnClick = "return HeartBeatClear()"> </p> <p><label>appToken: </label><input type="text" name="T91" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p> <p><label>调用结果:</label><input type="text" name="T92" size="80"></p> <p><label>错误信息:</label><input type="text" name="T93" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="获取SSL网关地址列表" name="获取SSL网关地址列表" OnClick = "return GetGateWayAddrList()"> <label/><input type="button" value="清空获取SSL网关地址列表" name="B6" OnClick = "return GetGateWayAddrListClear()"> </p> <p><label>内网口地址个数: </label><input type="text" name="T103" size="80"></p> <p><label>内网口地址数组: </label><input type="text" name="T104" size="80"></p> <p><label>第一个内网口地址:</label><input type="text" name="T105" size="80"></p> <p><label>外网口地址个数: </label><input type="text" name="T106" size="80"></p> <p><label>外网口地址数组: </label><input type="text" name="T107" size="80"></p> <p><label>第一个外网口地址:</label><input type="text" name="T108" size="80"></p> <p><label>调用结果: </label><input type="text" name="T101" size="80"></p> <p><label>错误信息: </label><input type="text" name="T102" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="修改UKPIN码" name="修改UKPIN码" OnClick = "return ChangeUKeyPin()"> <label/><input type="button" value="清空修改UKPIN码" name="B6" OnClick = "return ChangeUKeyPinClear()"> </p> <p><label>旧口令: </label><input type="text" name="T113" size="80"></p> <p><label>新口令: </label><input type="text" name="T114" size="80"></p> <p><label>确认新口令:</label><input type="text" name="T115" size="80"></p> <p><label>调用结果: </label><input type="text" name="T111" size="80"></p> <p><label>错误信息: </label><input type="text" name="T112" size="80"></p> <br/> <br/> <p> <label/><input type="button" value="Action命令处理" name="Action命令处理" OnClick = "return JsonActionTestCmdDeal()"> <label/><input type="button" value="清空命令处理" name="B6" OnClick = "return JsonActionTestCmdDealClear()"> </p> <p><label>测试返回: </label><input type="text" name="T123" size="80"></p> <p><label>调用结果: </label><input type="text" name="T121" size="80"></p> <p><label>错误信息: </label><input type="text" name="T122" size="80"></p> </form> </body> </html>