summaryrefslogtreecommitdiff
path: root/fpdfsdk/src/javascript/app.cpp
diff options
context:
space:
mode:
authorTom Sepez <tsepez@chromium.org>2015-02-05 15:52:15 -0800
committerTom Sepez <tsepez@chromium.org>2015-02-05 15:52:15 -0800
commite3dbe4db199586bee83f7db3ace142d4c71d0a18 (patch)
tree5b903a9de317429b99d35cb41a1640570fb9b5fc /fpdfsdk/src/javascript/app.cpp
parent219b3dab7e184bf8742f61527e37053b04903ff0 (diff)
downloadpdfium-e3dbe4db199586bee83f7db3ace142d4c71d0a18.tar.xz
Merge to master: Kill off some dodgy JS callbacks
Note that this work was done opposite the usual branch order, because I didn't want to kill things in master that turned out to be in use in XFA. Original Review URL: https://codereview.chromium.org/883393007 TBR=jam@chromium.org Review URL: https://codereview.chromium.org/903893002
Diffstat (limited to 'fpdfsdk/src/javascript/app.cpp')
-rw-r--r--fpdfsdk/src/javascript/app.cpp329
1 files changed, 87 insertions, 242 deletions
diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp
index cac129de46..c1dd41faff 100644
--- a/fpdfsdk/src/javascript/app.cpp
+++ b/fpdfsdk/src/javascript/app.cpp
@@ -1,7 +1,7 @@
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-
+
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "../../include/javascript/JavaScript.h"
@@ -45,7 +45,7 @@ TimerObj::TimerObj(CJS_Object* pJSObject)
: CJS_EmbedObj(pJSObject),
m_pTimer(NULL)
{
-
+
}
TimerObj::~TimerObj()
@@ -89,7 +89,7 @@ BEGIN_JS_STATIC_PROP(CJS_App)
JS_STATIC_PROP_ENTRY(runtimeHighlight)
JS_STATIC_PROP_ENTRY(viewerType)
JS_STATIC_PROP_ENTRY(viewerVariation)
- JS_STATIC_PROP_ENTRY(viewerVersion)
+ JS_STATIC_PROP_ENTRY(viewerVersion)
END_JS_STATIC_PROP()
BEGIN_JS_STATIC_METHOD(CJS_App)
@@ -104,7 +104,7 @@ BEGIN_JS_STATIC_METHOD(CJS_App)
JS_STATIC_METHOD_ENTRY(goBack, 0)
JS_STATIC_METHOD_ENTRY(goForward, 0)
JS_STATIC_METHOD_ENTRY(launchURL, 0)
- JS_STATIC_METHOD_ENTRY(mailMsg, 0)
+ JS_STATIC_METHOD_ENTRY(mailMsg, 0)
JS_STATIC_METHOD_ENTRY(newFDF, 0)
JS_STATIC_METHOD_ENTRY(newDoc, 0)
JS_STATIC_METHOD_ENTRY(openDoc, 0)
@@ -140,29 +140,29 @@ FX_BOOL app::activeDocs(OBJ_PROP_PARAMS)
CJS_Context* pContext = (CJS_Context *)cc;
ASSERT(pContext != NULL);
-
+
CPDFDoc_Environment* pApp = pContext->GetReaderApp();
ASSERT(pApp != NULL);
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
-
+
CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
-
+
CJS_Array aDocs(pRuntime->GetIsolate());
// int iNumDocs = pApp->CountDocuments();
-
-// for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
-// {
+
+// for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
+// {
CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
if (pDoc)
{
CJS_Document * pJSDocument = NULL;
-
+
if (pDoc == pCurDoc)
{
JSFXObject pObj = JS_GetThisObj(*pRuntime);
-
+
if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document"))
{
pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
@@ -173,15 +173,15 @@ FX_BOOL app::activeDocs(OBJ_PROP_PARAMS)
JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document"));
pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
ASSERT(pJSDocument != NULL);
-
-
+
+
// pDocument->AttachDoc(pDoc);
}
-
+
aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));
}
// }
-
+
if (aDocs.GetLength() > 0)
vp << aDocs;
else
@@ -201,31 +201,31 @@ FX_BOOL app::calculate(OBJ_PROP_PARAMS)
CJS_Context* pContext = (CJS_Context*)cc;
ASSERT(pContext != NULL);
-
+
CPDFDoc_Environment* pApp = pContext->GetReaderApp();
ASSERT(pApp != NULL);
-
+
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
CJS_Array aDocs(pRuntime->GetIsolate());
-// int iNumDocs = pApp->CountDocuments();
-//
-// for (int iIndex = 0;iIndex < iNumDocs; iIndex++)
-// {
+// int iNumDocs = pApp->CountDocuments();
+//
+// for (int iIndex = 0;iIndex < iNumDocs; iIndex++)
+// {
if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())
{
CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();
ASSERT(pInterForm != NULL);
pInterForm->EnableCalculate((FX_BOOL)m_bCalculate);
- }
+ }
// }
}
else
{
vp << (bool)m_bCalculate;
}
-
+
return TRUE;
}
@@ -236,30 +236,18 @@ FX_BOOL app::formsVersion(OBJ_PROP_PARAMS)
vp << JS_NUM_FORMSVERSION;
return TRUE;
}
-
+
return FALSE;
}
FX_BOOL app::viewerType(OBJ_PROP_PARAMS)
{
-
-
-
-
-
-
if (vp.IsGetting())
{
-// if (pApp->GetAppName() == PHANTOM)
-// vp << JS_STR_VIEWERTYPE_STANDARD;
-// else
-// vp << JS_STR_VIEWERTYPE_READER;
vp << L"unknown";
-
- //vp << pApp->GetAppTitle();
return TRUE;
}
-
+
return FALSE;
}
@@ -270,7 +258,7 @@ FX_BOOL app::viewerVariation(OBJ_PROP_PARAMS)
vp << JS_STR_VIEWERVARIATION;
return TRUE;
}
-
+
return FALSE;
}
@@ -281,7 +269,7 @@ FX_BOOL app::viewerVersion(OBJ_PROP_PARAMS)
vp << JS_STR_VIEWERVERSION;
return TRUE;
}
-
+
return FALSE;
}
@@ -292,7 +280,7 @@ FX_BOOL app::platform(OBJ_PROP_PARAMS)
vp << JS_STR_PLATFORM;
return TRUE;
}
-
+
return FALSE;
}
@@ -303,7 +291,7 @@ FX_BOOL app::language(OBJ_PROP_PARAMS)
vp << JS_STR_LANGUANGE;
return TRUE;
}
-
+
return FALSE;
}
@@ -425,7 +413,7 @@ FX_BOOL app::alert(OBJ_METHOD_PARAMS)
swMsg = params[0];
}
swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
-
+
for(int i = 1;i<iSize;i++)
{
if (i == 1)
@@ -433,7 +421,7 @@ FX_BOOL app::alert(OBJ_METHOD_PARAMS)
if (i == 2)
iType = int(params[i]);
if (i == 3)
- swTitle = params[i];
+ swTitle = params[i];
}
}
@@ -445,7 +433,7 @@ FX_BOOL app::alert(OBJ_METHOD_PARAMS)
pRuntime->BeginBlock();
vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon);
pRuntime->EndBlock();
-
+
return TRUE;
}
@@ -474,7 +462,7 @@ FX_BOOL app::findComponent(OBJ_METHOD_PARAMS)
}
FX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS)
-{
+{
return FALSE;
}
@@ -485,26 +473,26 @@ FX_BOOL app::fs(OBJ_PROP_PARAMS)
FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
{
- if (params.size() > 2 || params.size() == 0)
+ if (params.size() > 2 || params.size() == 0)
{
- sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
return FALSE;
}
-
+
CJS_Context* pContext = (CJS_Context*)cc;
ASSERT(pContext != NULL);
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : L"";
- if (script.IsEmpty())
+ if (script.IsEmpty())
{
sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
return TRUE;
}
FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;
-
+
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
ASSERT(pApp);
CJS_Timer* pTimer = new CJS_Timer(this, pApp);
@@ -516,19 +504,19 @@ FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
pTimer->SetTimeOut(0);
// pTimer->SetStartTime(GetTickCount());
pTimer->SetJSTimer(dwInterval);
-
+
JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
-
+
CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
ASSERT(pJS_TimerObj != NULL);
-
+
TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
ASSERT(pTimerObj != NULL);
-
- pTimerObj->SetTimer(pTimer);
-
+
+ pTimerObj->SetTimer(pTimer);
+
vRet = pRetObj;
-
+
return TRUE;
}
@@ -536,29 +524,29 @@ FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)
{
if (params.size() > 2 || params.size() == 0)
{
- sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
return FALSE;
}
-
+
CJS_Context* pContext = (CJS_Context*)cc;
ASSERT(pContext != NULL);
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
-
+
CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : L"";
- if (script.IsEmpty())
+ if (script.IsEmpty())
{
sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
return TRUE;
}
-
+
FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;
-
+
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
ASSERT(pApp);
CJS_Timer* pTimer = new CJS_Timer(this, pApp);
m_aTimer.Add(pTimer);
-
+
pTimer->SetType(1);
pTimer->SetRuntime(pRuntime);
pTimer->SetJScript(script);
@@ -566,20 +554,20 @@ FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)
// pTimer->SetStartTime(GetTickCount());
// pTimer->SetJSTimer(1000);
pTimer->SetJSTimer(dwTimeOut);
-
+
JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
// ASSERT(pRetObj != NULL);
-
+
CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
ASSERT(pJS_TimerObj != NULL);
-
+
TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
ASSERT(pTimerObj != NULL);
-
- pTimerObj->SetTimer(pTimer);
-
+
+ pTimerObj->SetTimer(pTimer);
+
vRet = pRetObj;
-
+
return TRUE;
}
@@ -589,13 +577,13 @@ FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
ASSERT(pContext != NULL);
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
-
+
if (params.size() != 1)
{
- sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
return FALSE;
}
-
+
if (params[0].GetType() == VT_fxobject)
{
JSFXObject pObj = (JSFXObject)params[0];
@@ -609,7 +597,7 @@ FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
if (CJS_Timer* pTimer = pTimerObj->GetTimer())
{
pTimer->KillJSTimer();
-
+
for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
{
if (m_aTimer[i] == pTimer)
@@ -618,7 +606,7 @@ FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
break;
}
}
-
+
delete pTimer;
pTimerObj->SetTimer(NULL);
}
@@ -627,7 +615,7 @@ FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
}
}
}
-
+
return TRUE;
}
@@ -640,10 +628,10 @@ FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
if (params.size() != 1)
{
- sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
return FALSE;
}
-
+
if (params[0].GetType() == VT_fxobject)
{
JSFXObject pObj = (JSFXObject)params[0];
@@ -657,7 +645,7 @@ FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
if (CJS_Timer* pTimer = pTimerObj->GetTimer())
{
pTimer->KillJSTimer();
-
+
for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
{
if (m_aTimer[i] == pTimer)
@@ -666,7 +654,7 @@ FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
break;
}
}
-
+
delete pTimer;
pTimerObj->SetTimer(NULL);
}
@@ -675,12 +663,12 @@ FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
}
}
}
-
+
return TRUE;
}
FX_BOOL app::execMenuItem(OBJ_METHOD_PARAMS)
-{
+{
return FALSE;
}
@@ -701,7 +689,7 @@ void app::TimerProc(CJS_Timer* pTimer)
}
break;
}
-
+
}
void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
@@ -721,24 +709,14 @@ void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
FX_BOOL app::goBack(OBJ_METHOD_PARAMS)
{
-
-
-
-
-
-
- return TRUE;
+ // Not supported.
+ return TRUE;
}
FX_BOOL app::goForward(OBJ_METHOD_PARAMS)
-{
-
-
-
-
-
-
- return TRUE;
+{
+ // Not supported.
+ return TRUE;
}
FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
@@ -762,7 +740,7 @@ FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L"";
cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L"";
cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L"";
- cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
+ cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
if (params[0].GetType() == VT_object)
@@ -787,8 +765,8 @@ FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
}
-
-
+
+
CJS_Runtime* pRuntime = pContext->GetJSRuntime();
ASSERT(pRuntime != NULL);
@@ -807,25 +785,8 @@ FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
FX_BOOL app::launchURL(OBJ_METHOD_PARAMS)
{
- if (IsSafeMode(cc)) return TRUE;
-
- CJS_Context* pContext = (CJS_Context*)cc;
- ASSERT(pContext != NULL);
-
-
-
-
- CFX_WideString swURL = params[0].operator CFX_WideString();
-
- CJS_Runtime* pRuntime = pContext->GetJSRuntime();
- ASSERT(pRuntime != NULL);
-
- pRuntime->BeginBlock();
-// FX_BOOL bRet = pApp->OpenURL(swURL);
- pRuntime->EndBlock();
-
-// return bRet;
- return FALSE;
+ // Unsafe, not supported.
+ return TRUE;
}
FX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS)
@@ -855,90 +816,14 @@ FX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS)
FX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS)
{
- //This method may trigger a "file save" dialog,while enable user to save contents of the document.
- //Such action is considered to be unsafe.
- if (IsSafeMode(cc)) return TRUE;
-
- v8::Isolate* isolate = GetIsolate(cc);
-
- bool bSave = false;
- CFX_ByteString cFilenameInit = CFX_ByteString();
- CFX_ByteString cFSInit = CFX_ByteString();
-
- if(params.size()>0 && (params[0].GetType() == VT_object))
- {
- JSObject pObj = (JSObject )params[0];
-
- v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"bSave");
- bSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
-
- pValue = JS_GetObjectElement(isolate, pObj,L"cFilenameInit");
- {
- CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
- cFilenameInit = t.operator CFX_ByteString();
- }
-
- pValue = JS_GetObjectElement(isolate,pObj,L"cFSInit");
- {
- CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
- cFSInit = t.operator CFX_ByteString();
- }
- }
- else
- {
- if(params.size() >= 1)
- {
- bSave = (bool)params[0];
- }
- if(params.size() >= 2)
- {
- CJS_Value t = params[1];
- cFilenameInit = t.operator CFX_ByteString();
- }
- if(params.size() >= 3)
- {
- CJS_Value t = params[2];
- cFSInit = t.operator CFX_ByteString();
- }
- }
- CJS_Context* pContext = (CJS_Context *)cc;
- ASSERT(pContext != NULL);
-
- CPDFDoc_Environment* pApp = pContext->GetReaderApp();
- ASSERT(pApp != NULL);
-
- CJS_Runtime* pRuntime = pContext->GetJSRuntime();
- ASSERT(pRuntime != NULL);
-
- CFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit);
- CFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit);
- CFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit);
- if(wsFilePath.IsEmpty())
- return FALSE;
-
- JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
-
- JS_PutObjectString(isolate,pRetObj, L"cPath", SysPathToPDFPath(wsFilePath));
- JS_PutObjectString(isolate,pRetObj, L"cURL", SysPathToPDFPath(wsFilePath));
-
- if (!cFSInit.IsEmpty())
- {
- JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength())));
- }
- else
- {
- JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal("DOS"));
- }
-
- vRet = pRetObj;
-
- return TRUE;
+ // Unsafe, not supported.
+ return TRUE;
}
CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)
{
CFX_WideString sRet = L"/";
-
+
for (int i=0,sz=sOldPath.GetLength(); i<sz; i++)
{
wchar_t c = sOldPath.GetAt(i);
@@ -957,47 +842,8 @@ CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)
}
}
}
-
- return sRet;
-}
-
-CFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath)
-{
- //strLPath = "D:\temporay.fdf";
- CFX_WideString strOPath = sOldPath;
- strOPath.TrimLeft();
- strOPath.TrimRight();
-
- if (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/')
- {
- wchar_t c_Drive = strOPath.GetAt(1);
- if ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z'))
- {
- strOPath.Replace(L"/",L"\\");
- //strOPath.SetAt(0,'');
- strOPath.Insert(2,':');
- strOPath.Delete(0);
- }
- }
-
- return strOPath;
-}
-CFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath)
-{
-// if (!PathIsRelative(sOldPath)) return sOldPath;
-
- int nSplit = 0;
- for (int i=sFilePath.GetLength()-1; i>=0; i--)
- {
- if (sFilePath[i] == '\\' || sFilePath[i] == '/')
- {
- nSplit = i;
- break;
- }
- }
-
- return sFilePath.Left(nSplit+1) + sOldPath;
+ return sRet;
}
FX_BOOL app::newDoc(OBJ_METHOD_PARAMS)
@@ -1099,4 +945,3 @@ FX_BOOL app::execDialog(OBJ_METHOD_PARAMS)
{
return TRUE;
}
-