// Path: app/src/main/java/com/github/xfalcon/vhosts/util/LogUtils.java
// public class LogUtils {
// 
// 
//     public static Context context;
// 
//     private static void sendLogData(String tag,String msg){
// 
//     }
// 
//     public static void v(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.v(tag,msg);
//     }
// 
//     public static void v(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.v(tag,msg,tr);
//     }
// 
//     public static void d(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.d(tag,msg);
//     }
// 
//     public static void d(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.d(tag,msg,tr);
//     }
// 
//     public static void i(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.i(tag,msg);
//     }
// 
//     public static void i(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.i(tag,msg,tr);
//     }
// 
//     public static void w(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.w(tag,msg);
//     }
// 
//     public static void w(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.w(tag,msg,tr);
//     }
// 
//     public static void e(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.e(tag,msg);
//     }
// 
//     public static void e(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.e(tag,msg,tr);
//     }
// 
// }


import com.github.xfalcon.vhosts.util.LogUtils;
import org.xbill.DNS.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
            message.addRecord(record, 1);
            message.getHeader().setFlag(Flags.QR);
            packet_buffer.limit(packet_buffer.capacity());
            packet_buffer.put(message.toWire());
            packet_buffer.limit(packet_buffer.position());
            packet_buffer.reset();
            packet.swapSourceAndDestination();
            packet.updateUDPBuffer(packet_buffer, packet_buffer.remaining());
            packet_buffer.position(packet_buffer.limit());
            LogUtils.d(TAG, "hit: " + question.getType() + " :" + query_domain.toString() + " :" + address.getHostName());
            return packet_buffer;
        } catch (Exception e) {
            LogUtils.d(TAG, "dns hook error", e);
            return null;
        }

    }

    public static int handle_hosts(InputStream inputStream) {
        String STR_COMMENT = "#";
        String HOST_PATTERN_STR = "^\\s*(" + STR_COMMENT + "?)\\s*(\\S*)\\s*([^" + STR_COMMENT + "]*)" + STR_COMMENT + "?(.*)$";
        Pattern HOST_PATTERN = Pattern.compile(HOST_PATTERN_STR);
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            DOMAINS_IP_MAPS4 = new ConcurrentHashMap<>();
            DOMAINS_IP_MAPS6 = new ConcurrentHashMap<>();
            while (!Thread.interrupted() && (line = reader.readLine()) != null) {
                if (line.length() > 1000 || line.startsWith(STR_COMMENT)) continue;
                Matcher matcher = HOST_PATTERN.matcher(line);
// Path: app/src/main/java/com/github/xfalcon/vhosts/util/LogUtils.java
// public class LogUtils {
// 
// 
//     public static Context context;
// 
//     private static void sendLogData(String tag,String msg){
// 
//     }
// 
//     public static void v(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.v(tag,msg);
//     }
// 
//     public static void v(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.v(tag,msg,tr);
//     }
// 
//     public static void d(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.d(tag,msg);
//     }
// 
//     public static void d(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.d(tag,msg,tr);
//     }
// 
//     public static void i(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.i(tag,msg);
//     }
// 
//     public static void i(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.i(tag,msg,tr);
//     }
// 
//     public static void w(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.w(tag,msg);
//     }
// 
//     public static void w(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.w(tag,msg,tr);
//     }
// 
//     public static void e(String tag, String msg) {
//         sendLogData(tag,msg);
//         Log.e(tag,msg);
//     }
// 
//     public static void e(String tag, String msg, Throwable tr) {
//         sendLogData(tag,msg+"   ;"+tr.getMessage());
//         Log.e(tag,msg,tr);
//     }
// 
// }


// Path: app/src/main/java/com/github/xfalcon/vhosts/vservice/DnsChange.java
import com.github.xfalcon.vhosts.util.LogUtils;
import org.xbill.DNS.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

            message.addRecord(record, 1);
            message.getHeader().setFlag(Flags.QR);
            packet_buffer.limit(packet_buffer.capacity());
            packet_buffer.put(message.toWire());
            packet_buffer.limit(packet_buffer.position());
            packet_buffer.reset();
            packet.swapSourceAndDestination();
            packet.updateUDPBuffer(packet_buffer, packet_buffer.remaining());
            packet_buffer.position(packet_buffer.limit());
            LogUtils.d(TAG, "hit: " + question.getType() + " :" + query_domain.toString() + " :" + address.getHostName());
            return packet_buffer;
        } catch (Exception e) {
            LogUtils.d(TAG, "dns hook error", e);
            return null;
        }

    }

    public static int handle_hosts(InputStream inputStream) {
        String STR_COMMENT = "#";
        String HOST_PATTERN_STR = "^\\s*(" + STR_COMMENT + "?)\\s*(\\S*)\\s*([^" + STR_COMMENT + "]*)" + STR_COMMENT + "?(.*)$";
        Pattern HOST_PATTERN = Pattern.compile(HOST_PATTERN_STR);
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            DOMAINS_IP_MAPS4 = new ConcurrentHashMap<>();
            DOMAINS_IP_MAPS6 = new ConcurrentHashMap<>();
            while (!Thread.interrupted() && (line = reader.readLine()) != null) {
                if (line.length() > 1000 || line.startsWith(STR_COMMENT)) continue;
                Matcher matcher = HOST_PATTERN.matcher(line);
                if (matcher.find()) {