This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch csp
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/csp by this push:
     new 6df6814  [OPENMEETINGS-2165] conversion + some minor issues
6df6814 is described below

commit 6df6814394b929c05565c9e06deac5653b7dd3cd
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Feb 11 14:07:29 2020 +0700

    [OPENMEETINGS-2165] conversion + some minor issues
---
 .../openmeetings/db/entity/file/BaseFileItem.java  |  2 +-
 .../web/common/AbstractOmDateTimePicker.java       |  1 +
 .../apache/openmeetings/web/common/NameDialog.html |  4 +-
 .../apache/openmeetings/web/common/NameDialog.java | 84 +++++++++++-----------
 .../org/apache/openmeetings/web/common/main.js     | 10 ++-
 .../web/common/tree/FileTreePanel.java             |  2 +-
 .../openmeetings/web/common/tree/FolderPanel.java  |  2 +-
 .../openmeetings/web/room/sidebar/RoomSidebar.java |  4 +-
 .../apache/openmeetings/web/room/wb/WbPanel.java   | 21 +++---
 .../openmeetings/web/user/chat/ChatToolbar.java    |  8 ++-
 .../web/user/profile/MessagesContactsPanel.java    |  7 +-
 .../web/user/record/RecordingsPanel.java           |  5 +-
 .../src/main/webapp/css/raw-general.css            |  3 +
 13 files changed, 80 insertions(+), 73 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
index b641b0f..ffda12b 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
@@ -334,7 +334,7 @@ public abstract class BaseFileItem extends HistoricalEntity 
{
        }
 
        public final boolean exists() {
-               return Type.Folder == type || exists(null);
+               return exists(null);
        }
 
        public final boolean exists(String ext) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
index aab215a..a81057e 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
@@ -53,6 +53,7 @@ public abstract class AbstractOmDateTimePicker<T> extends 
AbstractDateTimePicker
                                                
.useClearIcon(FontAwesome5IconType.eraser_s)
                                                
.useCloseIcon(FontAwesome5IconType.times_s))
                                );
+               setRenderBodyOnly(false);
        }
 
        public static String getDateTimeFormat() {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
index 94f4a88..cdeb97c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
@@ -20,11 +20,11 @@
 -->
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org";>
-<wicket:panel>
+<wicket:extend>
        <form wicket:id="form">
                <label class="pl-4 pr-4" wicket:id="label"></label><input 
type="text" wicket:id="title"/>
                <div wicket:id="feedback"></div>
                <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
        </form>
-</wicket:panel>
+</wicket:extend>
 </html>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
index aa11fce..ef6c7a3 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
@@ -18,26 +18,23 @@
  */
 package org.apache.openmeetings.web.common;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
 
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-
+import 
de.agilecoders.wicket.core.markup.html.bootstrap.button.BootstrapAjaxButton;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import 
de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
 
-public abstract class NameDialog extends AbstractFormDialog<String> {
+public abstract class NameDialog extends Modal<String> {
        private static final long serialVersionUID = 1L;
-       private DialogButton add;
-       private DialogButton cancel;
        private final Form<String> form;
        protected final NotificationPanel feedback = new 
NotificationPanel("feedback");
        private final String name;
@@ -48,17 +45,32 @@ public abstract class NameDialog extends 
AbstractFormDialog<String> {
        }
 
        public NameDialog(String id, String name) {
-               super(id, "", Model.of(name));
+               super(id, Model.of(name));
                this.name = name;
                form = new Form<>("form", getModel());
        }
 
        @Override
        protected void onInitialize() {
-               setTitle(Model.of(getTitleStr()));
-               add = new DialogButton("add", getAddStr());
-               cancel = new DialogButton("cancel", getString("lbl.cancel"));
-               form.add(new Label("label", getLabelStr())
+               header(getTitle());
+               setCloseOnEscapeKey(true);
+               setBackdrop(Backdrop.STATIC);
+
+               addCloseButton(new ResourceModel("lbl.cancel"));
+               addButton(new BootstrapAjaxButton("button", getAddBtnLabel(), 
form, Buttons.Type.Primary) {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void onSubmit(AjaxRequestTarget target) {
+                               NameDialog.this.onSubmit(target);
+                       }
+
+                       @Override
+                       protected void onError(AjaxRequestTarget target) {
+                               NameDialog.this.onError(target);
+                       }
+               }); // add
+               form.add(new Label("label", getLabel())
                                , title = new RequiredTextField<>("title", 
getModel())
                                , feedback.setOutputMarkupId(true)
                                , new AjaxButton("submit") { //FAKE button so 
"submit-on-enter" works as expected
@@ -66,60 +78,44 @@ public abstract class NameDialog extends 
AbstractFormDialog<String> {
 
                                        @Override
                                        protected void 
onSubmit(AjaxRequestTarget target) {
-                                               
NameDialog.this.onSubmit(target, add);
+                                               
NameDialog.this.onSubmit(target);
                                        }
 
                                        @Override
                                        protected void 
onError(AjaxRequestTarget target) {
-                                               NameDialog.this.onError(target, 
add);
+                                               NameDialog.this.onError(target);
                                        }
                                });
-               title.setLabel(Model.of(getLabelStr()));
+               title.setLabel(getLabel());
                add(form.setOutputMarkupId(true));
                super.onInitialize();
        }
 
        @Override
-       protected void onOpen(IPartialPageRequestHandler handler) {
+       public Modal<String> show(IPartialPageRequestHandler handler) {
                handler.add(form);
                setModelObject(name);
                getFeedbackMessages().clear();
+               return super.show(handler);
        }
 
-       @Override
-       protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
-               close(target, getSubmitButton());
+       protected void onSubmit(AjaxRequestTarget target) {
+               close(target);
        }
 
-       @Override
-       protected List<DialogButton> getButtons() {
-               return Arrays.asList(add, cancel);
-       }
-
-       @Override
-       public DialogButton getSubmitButton() {
-               return add;
-       }
-
-       @Override
-       public Form<String> getForm() {
-               return form;
-       }
-
-       @Override
-       protected void onError(AjaxRequestTarget target, DialogButton btn) {
+       protected void onError(AjaxRequestTarget target) {
                target.add(feedback);
        }
 
-       protected String getTitleStr() {
-               return getString("703");
+       protected IModel<String> getTitle() {
+               return new ResourceModel("703");
        }
 
-       protected String getLabelStr() {
-               return getString("572");
+       protected IModel<String> getLabel() {
+               return new ResourceModel("572");
        }
 
-       protected String getAddStr() {
-               return getString("1261");
+       protected IModel<String> getAddBtnLabel() {
+               return new ResourceModel("1261");
        }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
index 08d8428..b162f29 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/main.js
@@ -23,7 +23,7 @@ var Settings = (function() {
        };
 })();
 var OmUtil = (function() {
-       let options, errs
+       let options, errs, alertId = 0;
        const self = {};
 
        function _init(_options) {
@@ -53,11 +53,15 @@ var OmUtil = (function() {
        }
        function __alert(level, msg, autohideAfter) {
                const holder = $('#alert-holder');
-               holder.append($(`<div class="alert alert-${level} 
alert-dismissible fade show m-0" role="alert">${msg}
+               const curId = 'om-alert' + alertId++;
+               holder.append($(`<div id="${curId}" class="alert alert-${level} 
alert-dismissible fade show m-0" role="alert">${msg}
                                <button type="button" class="close" 
data-dismiss="alert" aria-label="${holder.data('lbl-close')}">
                                        <span aria-hidden="true">&times;</span>
                                </button>
-                       </div>`))
+                       </div>`));
+               if (autohideAfter > 0) {
+                       setTimeout(() => { $(`#${curId}`).alert('close');}, 
autohideAfter);
+               }
        }
        function _error(msg) {
                if (typeof(msg) === 'object') {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index 157db03..ddbcfcc 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -128,7 +128,7 @@ public abstract class FileTreePanel extends Panel {
 
                @Override
                protected void onEvent(AjaxRequestTarget target) {
-                       addFolder.open(target);
+                       addFolder.show(target);
                }
        });
        private final Component upload = new WebMarkupContainer("upload");
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
index b26f638..717c058 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
@@ -185,7 +185,7 @@ public class FolderPanel extends Panel implements 
IDraggableListener, IDroppable
                if (f.getId() == null) {
                        
style.append(CSS_CLASS_FILE).append(f.getHash().indexOf("my") > -1 ? "my " : 
"public ");
                } else {
-                       if (!f.exists()) {
+                       if (BaseFileItem.Type.Folder != f.getType() && 
!f.exists()) {
                                style.append("broken ");
                        }
                        switch(f.getType()) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index 88b6a41..c79d1ac 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -67,7 +67,6 @@ import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 import com.googlecode.wicket.jquery.ui.JQueryUIBehavior;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 public class RoomSidebar extends Panel {
        private static final long serialVersionUID = 1L;
@@ -163,8 +162,9 @@ public class RoomSidebar extends Panel {
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       protected void onSubmit(AjaxRequestTarget target, 
DialogButton btn) {
+                       protected void onSubmit(AjaxRequestTarget target) {
                                roomFiles.createFolder(target, 
getModelObject());
+                               super.onSubmit(target);
                        }
                };
                final Form<?> form = new Form<>("form");
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index 2295b07..0f31456 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -82,6 +82,8 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.spring.injection.annot.SpringBean;
@@ -93,7 +95,6 @@ import org.slf4j.LoggerFactory;
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 import com.github.openjson.JSONTokener;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 public class WbPanel extends AbstractWbPanel {
        private static final long serialVersionUID = 1L;
@@ -112,27 +113,29 @@ public class WbPanel extends AbstractWbPanel {
                private static final long serialVersionUID = 1L;
 
                @Override
-               protected void onSubmit(AjaxRequestTarget target, DialogButton 
btn) {
+               protected void onSubmit(AjaxRequestTarget target) {
                        String res = saveWb(roomId, wb2save, getModelObject());
                        if (!Strings.isEmpty(res)) {
                                error("Unexpected error while saving WB: " + 
res);
                                target.add(feedback);
+                       } else {
+                               super.onSubmit(target);
                        }
                }
 
                @Override
-               protected String getTitleStr() {
-                       return getString("199");
+               protected IModel<String> getTitle() {
+                       return new ResourceModel("199");
                }
 
                @Override
-               protected String getLabelStr() {
-                       return getString("200");
+               protected IModel<String> getLabel() {
+                       return new ResourceModel("200");
                }
 
                @Override
-               protected String getAddStr() {
-                       return getString("144");
+               protected IModel<String> getAddBtnLabel() {
+                       return new ResourceModel("144");
                }
        };
        private final SerializableConsumer<Whiteboard> addUndo = wb -> {
@@ -400,7 +403,7 @@ public class WbPanel extends AbstractWbPanel {
                                        break;
                                case save:
                                        wb2save = obj.getLong("wbId");
-                                       fileName.open(handler);
+                                       fileName.show(handler);
                                        break;
                                case undo:
                                {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index acfc083..7b8e6a2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -27,6 +27,7 @@ import static 
org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.common.BasePanel.EVT_CLICK;
 import static org.apache.openmeetings.web.room.RoomPanel.isModerator;
+import static 
org.apache.openmeetings.web.util.CallbackFunctionHelper.newOkCancelDangerConfirm;
 
 import java.util.List;
 
@@ -37,12 +38,12 @@ import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.ClientManager;
-import org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder;
 import org.apache.openmeetings.web.pages.BasePage;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.AjaxDownloadBehavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -66,7 +67,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
        private final WebMarkupContainer toolbar = new 
WebMarkupContainer("toolbar");
        private final WebMarkupContainer save = new WebMarkupContainer("save");
        private final ChatForm chatForm;
-       private ConfirmableAjaxBorder delBtn;
+       private AjaxButton delBtn;
        private final AjaxDownloadBehavior download = new 
AjaxDownloadBehavior(new ResourceStreamResource() {
                private static final long serialVersionUID = 1L;
                private static final char DELIMITER = ',';
@@ -182,7 +183,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
                BasePage page = (BasePage)getPage();
                add(toolbar.add(new 
WebMarkupContainer("hyperlink").add(AttributeModifier.append("class", 
page.isRtl() ? "dropdown-menu-left" : "dropdown-menu-right"))));
                add(download);
-               delBtn = new ConfirmableAjaxBorder("delete", getString("80"), 
getString("832"), chatForm) {
+               delBtn = new AjaxButton("delete", chatForm) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
@@ -210,6 +211,7 @@ public class ChatToolbar extends Panel implements 
IWysiwygToolbar {
                                        });
                        }
                };
+               delBtn.add(newOkCancelDangerConfirm(this, getString("832")));
                
toolbar.add(delBtn.setVisible(hasAdminLevel(getRights())).setOutputMarkupId(true)
                                .setOutputMarkupPlaceholderTag(true));
                
toolbar.add(save.setVisible(hasAdminLevel(getRights())).setOutputMarkupId(true)
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
index 17425eb..d181996 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/profile/MessagesContactsPanel.java
@@ -82,7 +82,6 @@ import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import com.googlecode.wicket.jquery.core.JQueryBehavior;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
 
 public class MessagesContactsPanel extends UserBasePanel {
        private static final long serialVersionUID = 1L;
@@ -171,8 +170,8 @@ public class MessagesContactsPanel extends UserBasePanel {
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       protected void onSubmit(AjaxRequestTarget target, 
DialogButton btn) {
-                               super.onSubmit(target, btn);
+                       protected void onSubmit(AjaxRequestTarget target) {
+                               super.onSubmit(target);
                                
folderDao.addPrivateMessageFolder(getModelObject(), getUserId());
                                foldersModel.setObject(folderDao.get(0, 
Integer.MAX_VALUE));
                                updateMoveModel();
@@ -210,7 +209,7 @@ public class MessagesContactsPanel extends UserBasePanel {
 
                        @Override
                        protected void onEvent(AjaxRequestTarget target) {
-                               addFolder.open(target);
+                               addFolder.show(target);
                        }
                }).add(new JQueryBehavior(".email.newdir", "button")));
                add(folders.add(new ListView<>("folder", foldersModel) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
index 5b6e062..d0fee77 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingsPanel.java
@@ -30,8 +30,6 @@ import org.apache.openmeetings.web.common.tree.FileTreePanel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-
 public class RecordingsPanel extends UserBasePanel {
        private static final long serialVersionUID = 1L;
        private final VideoPlayer video = new VideoPlayer("video");
@@ -50,8 +48,9 @@ public class RecordingsPanel extends UserBasePanel {
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       protected void onSubmit(AjaxRequestTarget target, 
DialogButton btn) {
+                       protected void onSubmit(AjaxRequestTarget target) {
                                fileTree.createFolder(target, getModelObject());
+                               super.onSubmit(target);
                        }
                };
                add(fileTree = new FileTreePanel("tree", null, addFolder, null) 
{
diff --git a/openmeetings-web/src/main/webapp/css/raw-general.css 
b/openmeetings-web/src/main/webapp/css/raw-general.css
index 297c5fb..614b898 100644
--- a/openmeetings-web/src/main/webapp/css/raw-general.css
+++ b/openmeetings-web/src/main/webapp/css/raw-general.css
@@ -779,3 +779,6 @@ select.messages.selector {
        right: 0;
        bottom: 0;
 }
+.popover.confirmation.show {
+       z-index: 3000; /* FIXME TODO move this to variables */
+}

Reply via email to