From 60f74b306659cba1a8ed7378f9df54a71e48a614 Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期三, 28 六月 2023 18:04:09 +0800
Subject: [PATCH] 临时

---
 app/src/main/java/com/hdl/photovoltaic/uni/UniToAndroidBean.java                  |   52 +++++++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java |  310 ++++++++++++++++++++++++++++++++++++++++++++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java   |    7 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ModbusCallBack.java  |   12 +
 app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java                     |   26 +--
 5 files changed, 389 insertions(+), 18 deletions(-)

diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
index e87278f..d66e47d 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
@@ -309,4 +309,11 @@
 
     public static final String GATEWAY_LOCATION_GET ="/user/%s/custom/gateway/location/get";
 
+    public static final String NATIVE_MODBUS_DOWN ="/user/%s/custom/native/inverter/down";
+    public static final String NATIVE_MODBUS_UP ="/user/%s/custom/native/inverter/up";
+    public static final String NATIVE_MODBUS_DOWN_REPLY ="/user/%s/custom/native/inverter/down_reply";
+
+    public static final String NATIVE_MODBUS_DOWN_SLAVE ="/user/%s/custom/native/inverter/down/slaveoid/%s";
+    public static final String NATIVE_MODBUS_DOWN_SLAVE_REPLY ="/user/%s/custom/native/inverter/down_reply/slaveoid/%s";
+
 }
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ModbusCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ModbusCallBack.java
new file mode 100644
index 0000000..7e58147
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ModbusCallBack.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.callback;
+
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/15.
+ */
+public interface ModbusCallBack extends BaseCallBack {
+    void onSuccess(String msg);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
new file mode 100644
index 0000000..e38c3ad
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
@@ -0,0 +1,310 @@
+package com.hdl.sdk.link.core.connect;
+
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.ZigbeeResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.callback.BaseCallBack;
+import com.hdl.sdk.link.core.callback.ModbusCallBack;
+import com.hdl.sdk.link.core.callback.ZigbeeCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+
+/**
+ * Created by hxb on 2021/12/8.
+ * 鍘熺敓閫氳鐩稿叧鎺ュ彛
+ */
+public class HDLModBusConnect {
+
+    private static final String TAG="HDLModbusConnect";
+    private static HDLModBusConnect instance;
+    /**
+     * 鍐呴儴鐢紝涓昏鏄鐞嗗鐞嗘帀閫忎紶涓婚鍙妉ink涓婚鍚庯紝杩樺師Zigbee鍘熺敓鏁版嵁鍙婁富棰樼敤
+     */
+    private final String zigbeeAllTopic = "/Modbus";
+
+    /**
+     * 杩斿洖褰撳墠瀹炰緥锛屼笉瀛樺湪灏卞垱寤哄苟鍚屾椂娉ㄥ唽鐩戝惉浜嬩欢
+     *
+     * @return
+     */
+    public static HDLModBusConnect getInstance() {
+        if (null == instance) {
+            instance = new HDLModBusConnect();
+            instance.initEventListener();
+        }
+        return instance;
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉Zigbee鎵�鏈夊師鐢熶富棰樺強鏁版嵁
+     *
+     * @param eventListener
+     */
+    public void registerListener(EventListener eventListener) {
+        if(null==eventListener){
+            return;
+        }
+        EventDispatcher.getInstance().register(zigbeeAllTopic, eventListener);
+    }
+
+    /**
+     * 绉婚櫎鐩戝惉Zigbee鍘熺敓涓婚鍙婃暟鎹�
+     *
+     * @param eventListener
+     */
+    public void removeListener(EventListener eventListener) {
+        if(null==eventListener){
+            return;
+        }
+        EventDispatcher.getInstance().remove(zigbeeAllTopic, eventListener);
+    }
+
+    /**
+     * 鍒濆鍖栫洃鍚簨浠�
+     */
+    private void initEventListener() {
+        final EventListener eventListener = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+//                try {
+//                    if (msg instanceof LinkResponse) {
+//                        LinkResponse linkResponse = (LinkResponse) msg;
+//                        String body = linkResponse.getData();
+//                        int index = body.indexOf("{");
+//                        //zigbee鍥炲鐨勬暟鎹墠鏈変富棰橈紝鍚庨潰鎵嶆槸鏁版嵁
+//                        if (index <= 0)
+//                            return;
+//
+//                        String zigbeeTopic = body.substring(0, index).trim();
+//                        //zigbee鐨勮礋杞芥暟鎹�
+//                        String bodyData = body.substring(index);
+//
+//                        ZigbeeResponse zigbeeResponse = new ZigbeeResponse();
+//                        zigbeeResponse.setTopic(zigbeeTopic);
+//                        zigbeeResponse.setData(bodyData);
+//                        String oid = null;
+//                        //鏄惁鏄�氳繃涓荤綉鍏抽�忎紶涓婚
+//                        if (linkResponse.getTopic().contains("/slaveoid/")) {
+//                            oid = linkResponse.getTopic().split("/")[8];
+//                        } else {
+//                            oid = linkResponse.getTopic().split("/")[2];
+//                        }
+//                        zigbeeResponse.setOid(oid);
+//                        for (GatewayBean gatewayBean : HDLLinkLocalGateway.getInstance().getGatewayList()) {
+//                            if (oid.equals(gatewayBean.getGatewayId()) || oid.equals(gatewayBean.getDevice_mac()) || oid.equals(gatewayBean.getOid())) {
+//                                //涓婇潰鐨刼id鍙兘鏄綉鍏砳d鎴栬�卪ac鎴栬�呮槸oid锛屼笉绠℃槸鍝釜缁熶竴浣跨敤oid琛ㄧず鏂瑰紡
+//                                zigbeeResponse.setOid(gatewayBean.getOid());
+//                                break;
+//                            }
+//                        }
+//                        EventDispatcher.getInstance().post(zigbeeTopic, zigbeeResponse);
+//                        //鍙戝竷Zigbee鍘熺敓涓婚鍙婃暟鎹�
+//                        EventDispatcher.getInstance().post(zigbeeAllTopic, zigbeeResponse);
+//                    }
+//                } catch (Exception e) {
+//                    LogUtils.e(TAG,"LinkResponse杞琙igbeeResponse寮傚父:"+ e.getMessage());
+//                }
+            }
+        };
+        //娉ㄥ唽鐩存帴閫氳鐨勪富棰橈紝鍖呮嫭鐩存帴鍜屼富缃戝叧閫氳鎴栬�呯洿鎺ュ拰浠庣綉鍏抽�氳
+        registerListener(String.format(TopicConstant.NATIVE_MODBUS_UP, "+"), eventListener);
+        registerListener(String.format(TopicConstant.NATIVE_MODBUS_DOWN_REPLY, "+"), eventListener);
+
+        //        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_UP_SLAVE, "+", "+"), eventListener);
+    }
+
+    /**
+     * 鍙戦�佸師鐢熸暟鎹�
+     *
+     * @param gatewayOidOrGatewayId 鐩爣缃戝叧鐨刼id鎴栬�呯綉鍏矷d
+     * @param responeTopic          鍥炲涓婚
+     * @param payload               鍙戦�佹暟鎹�
+     * @param baseCallBack        缁撴灉鍥炶皟
+     */
+    public void Send(String gatewayOidOrGatewayId,String responeTopic, String payload, final ModbusCallBack baseCallBack) {
+        //濡傛灉鏈湴鏈夐摼鎺ヨ繖涓綉鍏�,鍒欑敤鏈湴杩炴帴
+        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
+        if (null == gatewayBean) {
+            LogUtils.i("鎵句笉鍒扮綉鍏筹紝Oid鏄�" + gatewayOidOrGatewayId);
+            if (null != baseCallBack) {
+                baseCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+            return;
+        }
+
+        String tempTopic = String.format(TopicConstant.NATIVE_MODBUS_DOWN, gatewayOidOrGatewayId);
+        LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
+
+        if ("true".equals(gatewayBean.getMaster())) {
+            request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
+        } else {
+            request.setCloudTopic(String.format(TopicConstant.NATIVE_MODBUS_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId));
+        }
+        request.setReplyTopic(responeTopic);
+        long timeout = 2 * 1000;
+
+        new HDLConnectHelper(timeout, 1, gatewayBean.getIp_address(), 8586, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+//                if (msg instanceof String) {
+//                    if (null != baseCallBack) {
+//                        baseCallBack.onSuccess(msg+"");
+//                    }
+//                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (null != baseCallBack) {
+                    baseCallBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
+    }
+
+
+
+    /**
+     * 鍙戦�佸師鐢熼�忎紶鍛戒护鏁版嵁
+     *
+     * @param gatewayOidOrGatewayId 鐩爣缃戝叧鐨刼id鎴栬�呯綉鍏矷d
+     * @param responeTopic          鍥炲涓婚
+     * @param payload               鍙戦�佹暟鎹�
+     * @param zigbeeCallBack        缁撴灉鍥炶皟
+     */
+    public void SendThrough(String gatewayOidOrGatewayId, String responeTopic, String payload, final ZigbeeCallBack zigbeeCallBack) {
+//        //濡傛灉鏈湴鏈夐摼鎺ヨ繖涓綉鍏�,鍒欑敤鏈湴杩炴帴
+//        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
+//        if (null == gatewayBean) {
+//            LogUtils.i("鎵句笉鍒扮綉鍏筹紝Oid鏄�" + gatewayOidOrGatewayId);
+//            if (null != zigbeeCallBack) {
+//                zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+//            }
+//            return;
+//        }
+//        boolean isLocal = gatewayBean.getIsLocalGateway();
+//        //濡傛灉鏄湰鍦伴�氳
+//        if (isLocal == true) {
+//
+//            String tempTopic = String.format("/user/%s/custom/native/zigbee/down", gatewayOidOrGatewayId);
+//            String tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", gatewayOidOrGatewayId);
+//
+//            final boolean[] isCallBack = {false};
+//            //閫忎紶鍛戒护涓婚澶勭悊
+//            final EventListener eventListener = new EventListener() {
+//                @Override
+//                public void onMessage(Object msg) {
+//                    if (msg instanceof LinkResponse) {
+//                        LinkResponse linkResponse = (LinkResponse) msg;
+//                        //TODO 濡傛灉閰嶇疆浠庣綉鍏崇殑淇℃伅锛岄�氳繃涓荤綉鍏宠浆杈撅紝杩欓噷oid瑕佸垽鏂笅
+//                        String body = getZigbeeData(responeTopic, linkResponse);
+//                        if (null != body) {
+//                            isCallBack[0] = true;
+//                            removeListener(tempTopicReply, this);
+//                            if (null != zigbeeCallBack) {
+//                                zigbeeCallBack.onSuccess(body);
+//                            }
+//                        }
+//                    }
+//                }
+//            };
+//            //娉ㄥ唽鐩戝惉
+//            registerListener(tempTopicReply, eventListener);
+//
+//            //涓�瀹氭椂闂村悗杩樻病鏈夋帴鏀跺埌鏁版嵁锛屽氨鍥炶皟澶辫触
+//            ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+//            scheduledExecutorService.schedule(new Runnable() {
+//                @Override
+//                public void run() {
+//                    removeListener(tempTopicReply, eventListener);
+//                    scheduledExecutorService.shutdownNow();
+//                    if (!isCallBack[0]) {
+//                        if (null != zigbeeCallBack) {
+//                            zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_FAILURE_ERROR));
+//                        }
+//                    }
+//                }
+//            }, 5, TimeUnit.SECONDS);
+//
+//            //鏈湴鍙戦��
+//            LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
+//            new HDLConnectHelper(gatewayBean.getIp_address(), request,true).send();
+//        } else {
+//            //璇锋眰涓婚
+//            String tempTopic = null;
+//            //鍥炲涓婚
+//            String tempTopicReply = null;
+//
+//            //杩滅▼鍙戦��
+//            if ("true".equals(gatewayBean.getMaster())) {
+//                tempTopic = String.format("/user/%s/custom/native/zigbee/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
+//                tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
+//            } else {
+//                tempTopic = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId);
+//                tempTopicReply = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), "+");
+//            }
+//            //TODO 鍚庣画瀹屽杽浜戠鐨勫彂閫佹帴鏀舵柟娉�
+//        }
+    }
+
+
+    /**
+     * 澶勭悊zigbee鍥炲鐨勬暟鎹�
+     *
+     * @param responeTopic   鍥炲涓婚
+     * @param linkResponse   鍥炲鐨勯�忎紶鏁版嵁
+     */
+    private static String getZigbeeData(String responeTopic, LinkResponse linkResponse) {
+        //涓婚涓虹┖涓嶅鐞�
+        if(TextUtils.isEmpty(responeTopic)){
+            return null;
+        }
+
+        String body = linkResponse.getData();
+        int index = body.indexOf("{");
+        //zigbee鍥炲鐨勬暟鎹墠鏈変富棰橈紝鍚庨潰鎵嶆槸鏁版嵁
+        if (index <= 0)
+            return null;
+
+        String zigbeeTopic = body.substring(0, index).trim();
+        //zigbee鐨勮礋杞芥暟鎹�
+        String bodyData = body.substring(index);
+
+        //涓嶆槸褰撳墠璇锋眰鐨勬暟鎹紝涓嶅鐞�
+        if (!zigbeeTopic.startsWith(responeTopic)) {
+            return null;
+        }
+
+        return bodyData;
+        //Zigbee浠ュ墠鐨勬帴鏀堕�昏緫
+//        HdlZbGatewayReceiveLogic.Current.ZigbeeOldReceiveLogic(reportTopic, bodyData, gatewayMac);
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉
+     */
+    static void registerListener(String responseTopic, EventListener eventListener) {
+        if (!TextUtils.isEmpty(responseTopic)) {
+            EventDispatcher.getInstance().register(responseTopic, eventListener);
+        }
+    }
+
+    /**
+     * 绉婚櫎鐩戝惉
+     */
+    static void removeListener(String responseTopic, EventListener eventListener) {
+        if (!TextUtils.isEmpty(responseTopic)) {
+            EventDispatcher.getInstance().remove(responseTopic, eventListener);
+        }
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
index f8bcb24..445dc0c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -3,6 +3,7 @@
 
 import android.text.TextUtils;
 
+import com.alibaba.fastjson.JSON;
 import com.google.gson.Gson;
 import com.hdl.photovoltaic.HDLApp;
 import com.hdl.photovoltaic.config.UserConfigManage;
@@ -10,19 +11,16 @@
 import com.hdl.photovoltaic.ui.bean.HouseIdBean;
 import com.hdl.photovoltaic.uni.HDLUniMP;
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
+import com.hdl.photovoltaic.uni.UniToAndroidBean;
 import com.hdl.photovoltaic.utils.WifiUtils;
-import com.hdl.sdk.link.HDLLinkLocalSdk;
 import com.hdl.sdk.link.common.exception.HDLLinkException;
 import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
 import com.hdl.sdk.link.core.callback.GatewayCallBack;
-import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
-import com.hdl.sdk.link.core.config.HDLLinkConfig;
-import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+import com.hdl.sdk.link.core.connect.HDLModBusConnect;
 
 import org.json.JSONObject;
 
 
-import java.util.ArrayList;
 import java.util.List;
 
 import io.dcloud.feature.unimp.DCUniMPJSCallback;
@@ -64,19 +62,11 @@
             if (!HDLUniMP.UNI_APP_ID.equals(appId)) {
                 return;
             }
-            org.json.JSONObject jsonObject = getJSONObject(data);
-            String type_value = "";
-            String oid="";
-            if (jsonObject.has("type")) {
-                type_value = jsonObject.getString("type");
-            }
-            if (jsonObject.has("oid")) {
-                oid = jsonObject.getString("oid");
-            }
+            UniToAndroidBean uniToAndroidBean = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(data), UniToAndroidBean.class);
 
             if (HDLUniMP.UNI_EVENT_REPLY_HOME_MODEL.equals(event)) {
                 //浣忓畢妯″潡
-                switch (type_value) {
+                switch (uniToAndroidBean.getType()) {
                     case HDLUniMP.UNI_EVENT_REPLY_HOME_CREATION: {
                         //鍒涘缓
                         HdlResidenceLogic.getInstance().getResidenceIdList("", "", new CloudCallBeak<List<HouseIdBean>>() {
@@ -104,7 +94,7 @@
                 }
             } else if (HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODEL.equals(event)) {
                 //璁惧妯″潡
-                switch (type_value) {
+                switch (uniToAndroidBean.getType()) {
                     case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ADD: {
                         //娣诲姞
                     }
@@ -131,14 +121,14 @@
                     break;
                     case HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODBUS_SEND:{
                         //鍙戦�乵odbus鍗忚
-
+                        HDLModBusConnect.getInstance().Send(uniToAndroidBean.getGatewayOid(),null,);
                     }
                 }
 
             } else if (HDLUniMP.UNI_EVENT_REPLY_WIFI_MODEL.equals(event)) {
                 WifiUtils wifiUtils = new WifiUtils(HDLApp.getInstance());
                 //wifi妯″潡
-                switch (type_value) {
+                switch (uniToAndroidBean.getType()) {
                     case HDLUniMP.UNI_EVENT_REPLY_WIFI_LIST: {
                         //鑾峰彇wifi鍒楄〃
                         if (callback != null) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/uni/UniToAndroidBean.java b/app/src/main/java/com/hdl/photovoltaic/uni/UniToAndroidBean.java
new file mode 100644
index 0000000..c6f6b2a
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/uni/UniToAndroidBean.java
@@ -0,0 +1,52 @@
+package com.hdl.photovoltaic.uni;
+
+import java.io.Serializable;
+
+/**
+ * Created by hxb on 2023/6/28.
+ */
+public class UniToAndroidBean implements Serializable {
+
+    private String gatewayOid;//缃戝叧鐨刼id
+    private String type;//鍔熻兘绫诲瀷
+    private Object data;//闄勫姞json鏁版嵁
+
+    private String responseTopic;//鍥炲涓婚
+
+
+    public UniToAndroidBean() {
+
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public String getTopic() {
+        return topic == null ? "" : topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public String getType() {
+        return type == null ? "" : type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getGatewayOid() {
+        return gatewayOid;
+    }
+
+    public void setGatewayOid(String gatewayOid) {
+        this.gatewayOid = gatewayOid;
+    }
+}

--
Gitblit v1.8.0