فهرست منبع

auto update script executed

Toby Chui 1 سال پیش
والد
کامیت
e257996821
8فایلهای تغییر یافته به همراه1330 افزوده شده و 4 حذف شده
  1. 1 1
      main.go
  2. 1 1
      mod/dynamicproxy/proxyRequestHandler.go
  3. 258 0
      web/components/stats.html
  4. 0 1
      web/components/status.html
  5. 859 0
      web/example.json
  6. 7 0
      web/index.html
  7. 4 1
      web/main.css
  8. 200 0
      web/script/useragent.js

+ 1 - 1
main.go

@@ -38,7 +38,7 @@ var (
 	name        = "Zoraxy"
 	version     = "2.3"
 	nodeUUID    = "generic"
-	development = false //Set this to false to use embedded web fs
+	development = true //Set this to false to use embedded web fs
 
 	/*
 		Binary Embedding File System

+ 1 - 1
mod/dynamicproxy/proxyRequestHandler.go

@@ -151,7 +151,7 @@ func (h *ProxyHandler) logRequest(r *http.Request, succ bool, statusCode int, fo
 				ForwardType:                   forwardType,
 				Referer:                       r.Referer(),
 				UserAgent:                     r.UserAgent(),
-				RequestURL:                    r.RequestURI,
+				RequestURL:                    r.Host + r.RequestURI,
 			}
 			h.Parent.Option.StatisticCollector.RecordRequest(requestInfo)
 		}()

+ 258 - 0
web/components/stats.html

@@ -0,0 +1,258 @@
+<script src="./script/useragent.js"></script>
+<div class="standardContainer">
+    <div class="ui basic segment">
+        <h2>Statistical Analysis</h2>
+        <p>Statistic of your server in every aspects</p>
+    </div>
+    <div class="ui divider"></div>
+    <div class="ui basic segment">
+        <!-- Client Geolocation Analysis-->
+        <h3>Visitors Countries</h3>
+        <p>Distributions of visitors by country code. Access origin are estimated using open source GeoIP database and might not be accurate.</p>
+        <div style="min-height: 400px;">
+            <canvas id="stats_visitors"></canvas>
+        </div>
+        <div class="ui divider"></div>
+        <!-- Client IP Analysis -->
+        <div class="ui stackable grid">
+            <div class="eight wide column">
+                <h3>Request Client IP Versions</h3>
+                <p>The version of Internet Protocol that the client is using. If the request client is pass through a DNS proxy like CloudFlare, 
+                    the CloudFlare proxy server address will be filtered and only the first value in the RemoteAddress field will be analysised.</p>
+                <div>
+                    <canvas id="stats_ipver"></canvas>
+                </div>
+            </div>
+            <div class="eight wide column">
+                <h3>Request Origin Counts</h3>
+                <p>Top 25 request origin sorted by request count</p>
+                <div style="height: 500px; overflow-y: auto;">
+                    <table class="ui unstackable striped celled table">
+                        <thead>
+                          <tr>
+                            <th>Request Origin</th>
+                            <th>No of Requests</th>
+                        </tr></thead>
+                        <tbody id="stats_requestCountlist">
+                         
+                        </tbody>
+                    </table>
+                </div>
+                
+            </div>
+        </div>
+        <div class="ui divider"></div>
+        <!-- Client Device Analysis -->
+        <div class="ui stackable grid">
+            <div class="eight wide column">
+                <h3>Client Devices</h3>
+                <p>Device type analysis by its request interactions.The number of iteration count does not means the number unique device, as no cookie is used to track the devices identify.</p>
+                <div>
+                    <canvas id="stats_device"></canvas>
+                </div>
+            </div>
+            <div class="eight wide column">
+                <h3>Client OS</h3>
+                <p>The OS where your client is using. Estimated using the UserAgent header sent by the client browser while requesting a resources from one of your host.</p>
+                <div>
+                    <canvas id="stats_OS"></canvas>
+                </div>
+            </div>
+        </div>
+        
+    </div>
+    <button class="ui icon right floated basic button" onclick="initStatisticSummery();"><i class="green refresh icon"></i> Refresh</button>
+    <br><br>
+</div>
+<script>
+   function initStatisticSummery(){
+        $.getJSON("./example.json", function(data){
+            //Render visitor data
+            renderVisitorChart(data.RequestOrigin);
+
+            //Render IP versions
+            renderIPVersionChart(data.RequestClientIp);
+
+            //Render user agent analysis
+            renderUserAgentCharts(data.UserAgent);
+        });
+   }
+   initStatisticSummery();
+
+
+  
+
+    function renderUserAgentCharts(userAgentsEntries){
+        let userAgents = Object.keys(userAgentsEntries);
+        
+        let mobileUser = 0;
+        let desktopUser = 0;
+        let osTypes = {};
+        //Statistics collector
+        userAgents.forEach(function(thisUA){
+           var uaInfo = parseUserAgent(thisUA);
+           if (uaInfo.isMobile){
+                mobileUser+=userAgentsEntries[thisUA];
+           }else{
+                desktopUser+=userAgentsEntries[thisUA];
+           }
+
+           let currentNo = osTypes[uaInfo.os];
+           if (currentNo == undefined){
+                osTypes[uaInfo.os] = userAgentsEntries[thisUA];
+           }else{
+                osTypes[uaInfo.os] = currentNo + userAgentsEntries[thisUA]
+           }
+        });
+
+        //Create the device chart
+        let deviceTypeChart = new Chart(document.getElementById("stats_device"), {
+            type: 'pie',
+            data: {
+                labels: ['Desktop', 'Mobile'],
+                datasets: [{
+                    data: [desktopUser, mobileUser],
+                    backgroundColor: ['#e56b5e', '#6eb9c1'],
+                    hoverBackgroundColor: ['#e56b5e', '#6eb9c1']
+                }]
+            },
+            options: {
+                responsive: true,
+                maintainAspectRatio: false,
+            }
+        });
+
+        //Create the OS chart
+        let OSnames = [];
+        let OSCounts = [];
+        let OSColors = [];
+        for (const [key, value] of Object.entries(osTypes)) {
+            OSnames.push(key);
+            OSCounts.push(value);
+            OSColors.push(getOSColorCode(key));
+        }
+    
+        let osTypeChart = new Chart(document.getElementById("stats_OS"), {
+            type: 'pie',
+            data: {
+                labels: OSnames,
+                datasets: [{
+                    data: OSCounts,
+                    backgroundColor: OSColors,
+                    hoverBackgroundColor: OSColors
+                }]
+            },
+            options: {
+                responsive: true,
+                maintainAspectRatio: false,
+            }
+        });
+
+        console.log(osTypes);
+    }
+
+    //Generate the IPversion pie chart
+    function renderIPVersionChart(RequestClientIp){
+        let ipv4Count = Object.keys(RequestClientIp).filter(ip => ip.includes('.')).length;
+        let ipv6Count = Object.keys(RequestClientIp).filter(ip => ip.includes(':')).length;
+        let totalCount = ipv4Count + ipv6Count;
+        let ipv4Percent = ((ipv4Count / totalCount) * 100).toFixed(2);
+        let ipv6Percent = ((ipv6Count / totalCount) * 100).toFixed(2);
+
+        // Create the chart data object
+        let chartData = {
+            labels: ['IPv4', 'IPv6'],
+            datasets: [{
+                data: [ipv4Percent, ipv6Percent],
+                backgroundColor: ['#9295f0', '#bff092'],
+                hoverBackgroundColor: ['#9295f0', '#bff092']
+            }]
+        };
+
+        // Create the chart options object
+        let ipvChartOption = {
+            responsive: true,
+            maintainAspectRatio: false,
+        };
+
+        // Create the pie chart
+        let ipTypeChart = new Chart(document.getElementById("stats_ipver"), {
+            type: 'pie',
+            data: chartData,
+            options: ipvChartOption
+        });
+
+        //Populate the request count table
+        let requestCounts = Object.entries(RequestClientIp);
+
+        // Sort the array by the value (count)
+        requestCounts.sort((a, b) => b[1] - a[1]);
+
+        // Select the table body and empty it
+        let tableBody = $('#stats_requestCountlist');
+        tableBody.empty();
+
+        // Loop through the sorted array and add the top 25 requested IPs to the table
+        for (let i = 0; i < 25 && i < requestCounts.length; i++) {
+            let [ip, count] = requestCounts[i];
+            let row = $('<tr>').appendTo(tableBody);
+            $('<td style="word-break: break-all;">').text(ip).appendTo(row);
+            $('<td>').text(count).appendTo(row);
+        }
+    }
+
+    //Generate a fixed color code from string hash
+    function generateColorFromHash(stringToHash){
+        let hash = 0;
+        for (let i = 0; i < stringToHash.length; i++) {
+            hash = stringToHash.charCodeAt(i) + ((hash << 5) - hash);
+        }
+        const hue = hash % 300;
+        const saturation = Math.floor(Math.random() * 20) + 70;
+        const lightness = Math.floor(Math.random() * 20) + 60;
+        return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
+    }
+
+    //Generate the visitor country pie chart    
+   function renderVisitorChart(visitorData){
+        // Extract the labels and data from the visitor data object
+        let labels = [];
+        let data = Object.values(visitorData);
+
+        Object.keys(visitorData).forEach(function(cc){
+            if (cc == ""){
+                labels.push("Local / Unknown")
+            }else{
+                labels.push(`${getCountryName(cc)} [${cc.toUpperCase()}]` );
+            }
+        });
+
+        // Define the colors to be used in the pie chart
+        let colors = [];
+        labels.forEach(function(cc){
+            colors.push(generateColorFromHash(cc));
+        });
+
+        // Create the chart data object
+        let CCchartData = {
+            labels: labels,
+            datasets: [{
+                data: data,
+                backgroundColor: colors
+            }]
+        };
+
+        // Create the chart options object
+        let CCchartOptions = {
+            responsive: true,
+            maintainAspectRatio: false,
+        };
+
+        // Create the pie chart
+        const visitorsChart = new Chart(document.getElementById("stats_visitors"), {
+            type: 'pie',
+            data: CCchartData,
+            options: CCchartOptions
+        });
+   }
+</script>

+ 0 - 1
web/components/status.html

@@ -1,4 +1,3 @@
-<script src="script/chart.js"></script>
 <div class="ui stackable grid">
     <div class="ten wide column serverstatusWrapper">
         <div id="serverstatus" class="ui statustab inverted segment">

+ 859 - 0
web/example.json

@@ -0,0 +1,859 @@
+{
+  "TotalRequest": 39911,
+  "ErrorRequest": 8,
+  "ValidRequest": 39903,
+  "ForwardTypes": {
+    "redirect": 6,
+    "subdomain-http": 38707,
+    "subdomain-websocket": 21,
+    "vdir-http": 1177
+  },
+  "RequestOrigin": {
+    "": 12504,
+    "bg": 1,
+    "ca": 63,
+    "cn": 40,
+    "cy": 14,
+    "de": 18,
+    "es": 7,
+    "fr": 59,
+    "gb": 8,
+    "gp": 1,
+    "hk": 292,
+    "id": 6,
+    "in": 1,
+    "mu": 1,
+    "nl": 5,
+    "pl": 25,
+    "pt": 2,
+    "ru": 5,
+    "se": 2,
+    "sg": 196,
+    "tw": 26319,
+    "ua": 1,
+    "us": 337,
+    "vn": 4
+  },
+  "RequestClientIp": {
+    "101.200.151.101": 1,
+    "103.131.71.141": 1,
+    "103.131.71.167": 1,
+    "103.131.71.184": 1,
+    "103.149.192.6": 1,
+    "103.180.120.170": 1,
+    "103.55.39.194": 6,
+    "104.248.164.148": 1,
+    "104.250.135.90": 1,
+    "107.170.240.10": 1,
+    "107.170.241.34": 1,
+    "107.170.242.14": 1,
+    "109.237.97.180": 1,
+    "109.237.98.226": 1,
+    "111.251.102.141": 17,
+    "114.119.129.50": 1,
+    "114.119.129.71": 1,
+    "114.119.130.217": 1,
+    "114.119.130.97": 1,
+    "114.119.131.189": 1,
+    "114.119.131.90": 1,
+    "114.119.132.23": 1,
+    "114.119.132.28": 1,
+    "114.119.132.59": 1,
+    "114.119.133.116": 1,
+    "114.119.133.208": 1,
+    "114.119.134.116": 1,
+    "114.119.134.12": 1,
+    "114.119.135.182": 1,
+    "114.119.135.193": 1,
+    "114.119.135.204": 1,
+    "114.119.135.84": 1,
+    "114.119.136.100": 1,
+    "114.119.136.111": 2,
+    "114.119.136.251": 1,
+    "114.119.138.226": 1,
+    "114.119.138.28": 1,
+    "114.119.138.95": 1,
+    "114.119.139.246": 1,
+    "114.119.139.59": 1,
+    "114.119.139.70": 1,
+    "114.119.141.93": 1,
+    "114.119.142.15": 1,
+    "114.119.142.156": 1,
+    "114.119.144.212": 1,
+    "114.119.144.24": 1,
+    "114.119.145.86": 1,
+    "114.119.146.100": 1,
+    "114.119.146.126": 1,
+    "114.119.147.58": 1,
+    "114.119.147.87": 1,
+    "114.119.148.102": 1,
+    "114.119.148.132": 2,
+    "114.119.150.16": 1,
+    "114.119.150.68": 1,
+    "114.119.151.128": 1,
+    "114.119.152.230": 1,
+    "114.119.154.82": 1,
+    "114.119.154.87": 1,
+    "114.119.155.104": 2,
+    "114.119.156.120": 1,
+    "114.119.157.46": 1,
+    "114.119.159.160": 1,
+    "114.119.160.248": 1,
+    "114.119.165.200": 1,
+    "116.118.50.44": 1,
+    "117.62.218.192": 1,
+    "118.184.177.74": 1,
+    "118.184.177.95": 1,
+    "123.125.186.110": 2,
+    "123.125.186.28": 2,
+    "123.125.186.29": 1,
+    "123.150.11.128": 1,
+    "124.244.86.40": 288,
+    "131.153.142.170": 1,
+    "134.209.111.70": 28,
+    "134.209.31.111": 1,
+    "137.184.29.30": 5,
+    "138.197.168.101": 9,
+    "138.246.253.24": 1,
+    "14.29.216.170": 1,
+    "140.116.247.215": 21938,
+    "140.116.247.243": 1537,
+    "140.116.252.158": 1455,
+    "143.110.166.51": 1,
+    "143.198.36.122": 4,
+    "145.131.4.60": 1,
+    "146.59.52.85": 2,
+    "146.59.69.71": 11,
+    "146.70.165.176": 2,
+    "149.28.158.245": 2,
+    "149.62.173.87": 6,
+    "150.129.81.216": 4,
+    "151.84.195.60": 16,
+    "154.47.24.82": 2,
+    "154.62.182.2": 1,
+    "154.91.84.31": 65,
+    "157.55.39.225": 1,
+    "162.243.144.19": 1,
+    "162.255.87.136": 1,
+    "165.22.99.67": 27,
+    "167.94.138.35": 5,
+    "167.94.138.50": 5,
+    "171.113.20.167": 1,
+    "171.8.254.97": 4,
+    "178.128.49.227": 76,
+    "178.79.184.103": 1,
+    "183.36.114.155": 1,
+    "183.69.137.85": 1,
+    "185.107.89.149": 1,
+    "185.11.61.182": 1,
+    "185.180.143.188": 2,
+    "185.191.171.12": 2,
+    "185.191.171.14": 1,
+    "185.191.171.16": 1,
+    "185.191.171.17": 1,
+    "185.191.171.23": 2,
+    "185.191.171.24": 2,
+    "185.191.171.35": 2,
+    "185.191.171.38": 1,
+    "185.191.171.4": 1,
+    "185.191.171.7": 1,
+    "188.166.70.18": 1,
+    "193.235.141.17": 2,
+    "194.113.40.34": 16,
+    "194.35.43.175": 1,
+    "194.38.21.214": 1,
+    "198.199.95.36": 1,
+    "198.235.24.111": 1,
+    "198.235.24.122": 1,
+    "198.235.24.35": 1,
+    "198.235.24.6": 1,
+    "199.16.157.180": 1,
+    "199.16.157.181": 1,
+    "199.16.157.182": 2,
+    "199.16.157.183": 2,
+    "20.204.74.136": 1,
+    "20.218.125.22": 37,
+    "20.219.167.125": 22,
+    "20.230.94.40": 1,
+    "20.250.5.236": 3,
+    "2001:19f0:1000:20a0:5400:4ff:fe67:79fc": 1,
+    "2001:288:7001:2717:18b3:bab1:ef6f:c329": 2445,
+    "2001:288:7001:2717:38bd:7312:ac38:884c": 10000,
+    "2001:448a:5020:23fc:4049:55ff:fee0:e2af": 1,
+    "205.210.31.154": 1,
+    "205.210.31.57": 1,
+    "206.189.90.49": 67,
+    "207.154.253.117": 1,
+    "207.46.13.206": 10,
+    "207.46.13.214": 12,
+    "207.46.13.215": 3,
+    "207.46.13.229": 2,
+    "213.180.203.132": 1,
+    "213.180.203.137": 1,
+    "213.180.203.223": 1,
+    "216.235.107.56": 1,
+    "216.244.66.245": 11,
+    "216.39.248.55": 5,
+    "219.71.102.145": 1368,
+    "222.211.72.55": 1,
+    "222.211.72.58": 1,
+    "223.111.175.3": 1,
+    "23.106.62.93": 1,
+    "2409:8c20:b281:14::101": 14,
+    "240e:352:125:c200:10fc:ab72:b575:8a42": 16,
+    "2601:601:9c00:1b2c:fd5e:7baa:d6d:6b0a": 1,
+    "2a00:801:70b:85a6:120f:bea6:1bd2:fe97": 8,
+    "2a01:4f9:4a:25a4::2": 1,
+    "2a02:598:128:8a00::b97:bb40": 1,
+    "2a02:598:128:8a00::bfa:3d00": 1,
+    "2a02:598:64:8a00::314a:6c80": 1,
+    "2a02:598:64:8a00::315b:c480": 1,
+    "2a03:2880:13ff:14::face:b00c": 1,
+    "2a03:2880:13ff:4::face:b00c": 1,
+    "2a03:2880:13ff:d::face:b00c": 2,
+    "2a03:2880:23ff:e::face:b00c": 1,
+    "2a03:4000:0:2e5:1440:7dff:fece:8698": 1,
+    "2a03:4000:0:404:4ab:5dff:feb2:34c": 1,
+    "2a10:cc45:100:0:30c0:a37c:7eb0:c8a9": 3,
+    "2a10:cc45:100:0:b048:c10c:f2f9:d3ef": 3,
+    "3.216.3.74": 1,
+    "34.219.156.159": 2,
+    "34.222.155.23": 1,
+    "34.79.162.186": 1,
+    "35.161.199.73": 1,
+    "35.174.161.252": 3,
+    "35.212.211.76": 2,
+    "37.187.89.104": 8,
+    "40.77.167.208": 3,
+    "40.77.167.220": 6,
+    "40.77.167.85": 4,
+    "40.77.188.235": 1,
+    "40.77.189.186": 1,
+    "42.228.5.141": 1,
+    "43.128.103.165": 1,
+    "45.40.133.116": 1,
+    "46.161.60.105": 2,
+    "49.7.21.121": 1,
+    "5.255.231.20": 1,
+    "50.115.120.249": 1,
+    "51.161.84.56": 1,
+    "51.222.253.1": 2,
+    "51.222.253.10": 3,
+    "51.222.253.11": 2,
+    "51.222.253.12": 1,
+    "51.222.253.13": 4,
+    "51.222.253.14": 3,
+    "51.222.253.15": 4,
+    "51.222.253.16": 4,
+    "51.222.253.17": 6,
+    "51.222.253.18": 7,
+    "51.222.253.19": 4,
+    "51.222.253.2": 2,
+    "51.222.253.20": 2,
+    "51.222.253.3": 1,
+    "51.222.253.4": 3,
+    "51.222.253.5": 3,
+    "51.222.253.6": 4,
+    "51.222.253.7": 1,
+    "51.222.253.8": 2,
+    "51.222.253.9": 1,
+    "51.38.134.68": 12,
+    "51.75.130.109": 1,
+    "52.167.144.152": 1,
+    "52.167.144.166": 5,
+    "52.167.144.171": 6,
+    "54.189.205.195": 1,
+    "54.245.177.9": 1,
+    "54.248.9.68": 2,
+    "54.36.148.107": 1,
+    "54.36.148.110": 1,
+    "54.36.148.122": 1,
+    "54.36.148.15": 1,
+    "54.36.148.163": 1,
+    "54.36.148.178": 1,
+    "54.36.148.186": 1,
+    "54.36.148.195": 1,
+    "54.36.148.197": 1,
+    "54.36.148.202": 1,
+    "54.36.148.213": 1,
+    "54.36.148.235": 1,
+    "54.36.148.242": 1,
+    "54.36.148.245": 1,
+    "54.36.148.249": 1,
+    "54.36.148.34": 1,
+    "54.36.148.49": 1,
+    "54.36.148.92": 1,
+    "54.36.149.107": 1,
+    "54.36.149.11": 1,
+    "54.36.149.22": 1,
+    "54.36.149.32": 1,
+    "54.36.149.39": 1,
+    "54.36.149.46": 1,
+    "54.36.149.63": 1,
+    "54.36.149.7": 1,
+    "54.36.149.81": 1,
+    "54.36.149.86": 1,
+    "54.36.149.94": 1,
+    "54.36.149.98": 1,
+    "54.39.104.60": 1,
+    "58.250.125.86": 1,
+    "59.120.98.210": 2,
+    "60.217.75.70": 2,
+    "61.221.35.29": 1,
+    "64.62.197.52": 1,
+    "64.62.197.54": 1,
+    "64.62.197.57": 1,
+    "64.62.197.58": 1,
+    "64.62.197.61": 1,
+    "66.249.68.21": 5,
+    "66.249.68.25": 1,
+    "66.249.68.30": 3,
+    "66.249.73.31": 2,
+    "66.249.73.4": 1,
+    "69.167.12.35": 11,
+    "85.208.136.158": 1,
+    "87.236.176.163": 1,
+    "87.236.176.247": 1,
+    "92.205.190.42": 1
+  },
+  "Referer": {
+    "": 861,
+    "http://124.244.86.40:8080/wordpress/2021/04/09/%e7%94%a8%e4%ba%86%e4%b8%89%e5%b9%b4%e6%99%82%e9%96%93%e5%af%ab%e7%9a%84%e7%b6%b2%e9%a0%81%e6%a1%8c%e9%9d%a2%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1%e7%9a%84%e6%95%85%e4%ba%8b": 2,
+    "http://192.168.178.81:8080/": 1,
+    "http://imuslab.com//wp-content/themes/seotheme/db.php?u": 4,
+    "http://imuslab.com/admin/wp-login.php": 4,
+    "http://imuslab.com/favicon.ico": 1,
+    "http://imuslab.com/login/wp-login.php": 4,
+    "http://imuslab.com/shop/wp-login.php": 1,
+    "http://imuslab.com/web/wp-login.php": 4,
+    "http://imuslab.com/wordpress//?author=1": 4,
+    "http://imuslab.com/wordpress//?author=2": 4,
+    "http://imuslab.com/wordpress//wp-json/wp/v2/users/": 4,
+    "http://imuslab.com/wordpress/wp-login.php": 4,
+    "http://imuslab.com/wp-admin/wp-login.php": 4,
+    "http://imuslab.com/wp-login.php": 1,
+    "http://lanips.imuslab.com/": 2,
+    "http://order.imuslab.com/": 1,
+    "http://order.imuslab.com/backup": 1,
+    "http://order.imuslab.com/bc": 1,
+    "http://order.imuslab.com/bk": 1,
+    "http://order.imuslab.com/home": 1,
+    "http://order.imuslab.com/main": 1,
+    "http://order.imuslab.com/new": 1,
+    "http://order.imuslab.com/old": 1,
+    "http://order.imuslab.com/wordpress": 1,
+    "http://order.imuslab.com/wp": 1,
+    "http://www.imuslab.com": 5,
+    "http://www.imuslab.com/": 1,
+    "http://www.imuslab.com/Content/plugins/ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/Editor/UEditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/Scripts/Ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/Static/ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/Utility/UEditor/net?action=catchimage": 1,
+    "http://www.imuslab.com/Utility/UEditor?action=catchimage": 1,
+    "http://www.imuslab.com/js/ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/scripts/ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.imuslab.com/ueditor/net/controller.ashx?action=catchimage": 1,
+    "http://www.sogou.com/web?query=site%3Awww.imuslab.com": 1,
+    "https://124.244.86.40:443/manager/html": 2,
+    "https://124.244.86.40:443/users/sign_in": 1,
+    "https://drive.imuslab.com/Music/embedded.html": 159,
+    "https://drive.imuslab.com/SystemAO/file_system/file_explorer.html": 17754,
+    "https://drive.imuslab.com/desktop.system": 17758,
+    "https://drive.imuslab.com/login.system?redirect=/": 14,
+    "https://drive.imuslab.com/script/semantic/offline-font.css": 2,
+    "https://drive.imuslab.com/script/semantic/semantic.min.css": 3,
+    "https://easyseo.s-nac.com": 1,
+    "https://hkmrchui.net/qs/file.php": 4,
+    "https://imuslab.com/": 48,
+    "https://imuslab.com/aroz/index_en.php": 1,
+    "https://imuslab.com/gelo/index.html": 1,
+    "https://imuslab.com/pma/index.php": 1,
+    "https://imuslab.com/talks.php": 2,
+    "https://imuslab.com/utm/": 5,
+    "https://imuslab.com/wordpress": 1,
+    "https://imuslab.com/wordpress/": 16,
+    "https://imuslab.com/wordpress//?author=1": 4,
+    "https://imuslab.com/wordpress//?author=2": 4,
+    "https://imuslab.com/wordpress/2016/12/11/universal-charging-port-2-0/": 1,
+    "https://imuslab.com/wordpress/2016/12/30/40000mah-%e8%b6%85%e5%a4%a7%e5%ae%b9%e9%87%8f%e8%81%9a%e5%90%88%e7%89%a9%e9%8b%b0%e9%9b%bb%e6%b1%a0%e9%96%8b%e7%99%bc%e5%ae%8c%e6%88%90/": 1,
+    "https://imuslab.com/wordpress/2017/03/02/3d-%e6%89%93%e5%8d%b0-pla-%e8%a1%a8%e9%9d%a2%e5%b9%b3%e6%bb%91%e5%8c%96%e8%99%95%e7%90%86%e5%8f%8a%e4%b8%8a%e8%89%b2%e7%94%a8%e5%ba%95%e6%bc%86%e4%b9%8b%e7%9b%b8%e9%97%9c%e7%a0%94%e7%a9%b6/": 1,
+    "https://imuslab.com/wordpress/2020/03/06/%e4%ba%8c%e6%ac%a1%e5%85%83%e4%ba%ba%e7%89%a9%e6%88%90%e7%94%9f%e5%99%a8%ef%bc%9f/": 1,
+    "https://imuslab.com/wordpress/2021/04/09/%e7%94%a8%e4%ba%86%e4%b8%89%e5%b9%b4%e6%99%82%e9%96%93%e5%af%ab%e7%9a%84%e7%b6%b2%e9%a0%81%e6%a1%8c%e9%9d%a2%e4%bd%9c%e6%a5%ad%e7%b3%bb%e7%b5%b1%e7%9a%84%e6%95%85%e4%ba%8b/": 1,
+    "https://imuslab.com/wordpress/2021/04/12/": 3,
+    "https://imuslab.com/wordpress/2022/05/05/": 1,
+    "https://imuslab.com/wordpress/2023/02/25/%e6%b7%a1%e6%b7%a1%e6%9d%af%ef%bc%8c%e4%bd%86%e6%98%af%e7%94%a8%e4%b8%8d%e6%ad%a3%e5%bc%8f%e7%9a%84%e6%96%b9%e6%b3%95%e4%be%86%e7%8e%a9/": 1,
+    "https://imuslab.com/wordpress/category/blender-unity/": 1,
+    "https://imuslab.com/wordpress/category/development-logs/aroz-online-system/page/2/": 2,
+    "https://imuslab.com/wordpress/category/development-logs/page/5/": 1,
+    "https://imuslab.com/wordpress/category/diy-projects": 1,
+    "https://imuslab.com/wordpress/page/6/": 1,
+    "https://imuslab.com/wordpress/page/7/": 1,
+    "https://imuslab.com/wordpress/page/8/": 1,
+    "https://imuslab.com/wordpress/tag/firefox/": 1,
+    "https://imuslab.com/wordpress/tag/oao/": 2,
+    "https://imuslab.com/wordpress/tag/virtual-filepath/": 7,
+    "https://lanips.imuslab.com/talks.php": 1,
+    "https://order.imuslab.com/": 2,
+    "https://order.imuslab.com/qs/": 1,
+    "https://order.imuslab.com/wordpress": 1,
+    "https://router.imuslab.com/web/": 2862,
+    "https://router.imuslab.com/web/login.html": 11,
+    "https://router.imuslab.com/web/main.css": 2,
+    "https://router.imuslab.com/web/script/semantic/offline-font.css": 2,
+    "https://router.imuslab.com/web/script/semantic/semantic.min.css": 5,
+    "https://www.imuslab.com/": 20,
+    "https://www.imuslab.com/Content/plugins/ueditor/net/controller.ashx?action=catchimage": 5,
+    "https://www.imuslab.com/Editor/UEditor/net/controller.ashx?action=catchimage": 6,
+    "https://www.imuslab.com/Scripts/Ueditor/net/controller.ashx?action=catchimage": 5,
+    "https://www.imuslab.com/Static/ueditor/net/controller.ashx?action=catchimage": 7,
+    "https://www.imuslab.com/Utility/UEditor/net?action=catchimage": 6,
+    "https://www.imuslab.com/Utility/UEditor?action=catchimage": 6,
+    "https://www.imuslab.com/js/ueditor/net/controller.ashx?action=catchimage": 5,
+    "https://www.imuslab.com/net/controller.ashx?action=catchimage": 7,
+    "https://www.imuslab.com/scripts/ueditor/net/controller.ashx?action=catchimage": 5,
+    "https://www.imuslab.com/ueditor/net/controller.ashx?action=catchimage": 2,
+    "www.google.com": 81
+  },
+  "UserAgent": {
+    "": 19,
+    "ALittle Client": 1,
+    "Baiduspider": 1,
+    "Expanse, a Palo Alto Networks company, searches across the global IPv4 space multiple times per day to identify customers&#39; presences on the Internet. If you would like to be excluded from our scans, please send IP addresses/domains to: [email protected]": 6,
+    "Go-http-client/1.1": 3,
+    "Go-http-client/2.0": 295,
+    "Java/1.8.0_321": 1,
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201": 1,
+    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)": 1,
+    "Mozilla/5.0": 5,
+    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36": 8,
+    "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.142 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)": 1,
+    "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.63 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)": 2,
+    "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)": 2,
+    "Mozilla/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36": 2,
+    "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)": 47,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0": 1,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36": 1,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36": 3,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.146 Safari/537.36": 2,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36": 17,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15": 1,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15": 1,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 8_1_1) AppleWebKit/558.46 (KHTML, like Gecko) Chrome/76.0.212 Safari/537.36": 1,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 9_2_1) AppleWebKit/553.43 (KHTML, like Gecko) Chrome/56.0.1778 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36": 5,
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32": 16,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36": 2,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36": 4,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 OPR/95.0.0.0 (Edition Yx 05)": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36": 2,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36": 4,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36": 16,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36": 2,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36": 12,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36": 64,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36": 3,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36": 2,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/3eZNDnO; 41AE4AB2B2) Chrome/84.0.4147.105 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/3eZNDnO; 41ae4ab2b2) Chrome/84.0.4147.105 Safari/537.36": 2,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0": 38614,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0": 5,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96": 1,
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0": 1,
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36": 6,
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; +http://url-classification.io/wiki/index.php?title=URL_server_crawler) KStandBot/1.0": 1,
+    "Mozilla/5.0 (Windows NT 7_2_1; Win64; x64) AppleWebKit/556.51 (KHTML, like Gecko) Chrome/101.0.2030 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows NT 9_1; Win64; x64) AppleWebKit/556.39 (KHTML, like Gecko) Chrome/85.0.1934 Safari/537.36": 1,
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/534.24.1 (KHTML, like Gecko) Version/4.0.4 Safari/534.24.1": 1,
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)": 6,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.46 (KHTML, like Gecko) Chrome/89.0.1291 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36": 2,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36": 6,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/112.0.5614.0 Safari/537.36": 16,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/561.35 (KHTML, like Gecko) Chrome/80.0.2852 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/569.37 (KHTML, like Gecko) Chrome/50.0.2455 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/571.42 (KHTML, like Gecko) Chrome/54.0.2271 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/595.45 (KHTML, like Gecko) Chrome/84.0.1157 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/597.54 (KHTML, like Gecko) Chrome/79.0.959 Safari/537.36": 1,
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0": 41,
+    "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)": 89,
+    "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)": 6,
+    "Mozilla/5.0 (compatible; DotBot/1.2; +https://opensiteexplorer.org/dotbot; [email protected])": 11,
+    "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)": 5,
+    "Mozilla/5.0 (compatible; InternetMeasurement/1.0; +https://internet-measurement.com/)": 2,
+    "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)": 17,
+    "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)": 14,
+    "Mozilla/5.0 (compatible; SeznamBot/4.0-RC1; +http://napoveda.seznam.cz/seznambot-intro/)": 4,
+    "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)": 4,
+    "Mozilla/5.0 (compatible; coccocbot-web/1.0; +http://help.coccoc.com/searchengine)": 3,
+    "Mozilla/5.0 (compatible;PetalBot;+https://webmaster.petalsearch.com/site/petalbot)": 5,
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1": 1,
+    "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/113.0.5672.63 Safari/537.36": 2,
+    "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/100.0.4896.127 Safari/537.36": 2,
+    "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/103.0.5060.134 Safari/537.36": 53,
+    "Mozilla/5.0 zgrab/0.x": 9,
+    "Mozlila/5.0 (Linux; Android 7.0; SM-G892A Bulid/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Moblie Safari/537.36": 150,
+    "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)": 4,
+    "Twitterbot/1.0": 6,
+    "cpp-httplib/0.10.9": 13,
+    "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)": 5,
+    "python-requests/2.21.0": 5,
+    "python-requests/2.27.1": 98,
+    "python-requests/2.28.2": 1
+  },
+  "RequestURL": {
+    "*": 2,
+    "/": 373,
+    "/.git/config": 1,
+    "//?rest_route=/wp/v2/users": 3,
+    "//feed/": 1,
+    "//wp-admin": 28,
+    "//wp-admin/admin-ajax.php": 4,
+    "//wp-content/king.php": 2,
+    "//wp-content/plugins/apikey/a57bze8931.php": 2,
+    "//wp-content/plugins/apikey/apikey.php": 2,
+    "//wp-content/plugins/cherry-plugin/admin/import-export/a57bze8931.php": 2,
+    "//wp-content/plugins/cherry-plugin/admin/import-export/upload.php": 2,
+    "//wp-content/plugins/divi-contact-extended/includes/upload.php": 2,
+    "//wp-content/plugins/dzs-zoomsounds/a57bze8931.php": 2,
+    "//wp-content/plugins/dzs-zoomsounds/savepng.php?location=a57bze8931.php": 2,
+    "//wp-content/plugins/formcraft/file-upload/server/php/": 2,
+    "//wp-content/plugins/formcraft/file-upload/server/php/files/a57bze8931.php": 2,
+    "//wp-content/plugins/gatewayapi/inc/a57bze8931.php": 2,
+    "//wp-content/plugins/gatewayapi/inc/css_js.php": 2,
+    "//wp-content/plugins/ioptimization/a57bze8931.php": 2,
+    "//wp-content/plugins/ioptimizations/a57bze8931.php": 2,
+    "//wp-content/plugins/wp-engine-module/a57bze8931.php": 2,
+    "//wp-content/plugins/wp-engine-module/wp-engine.php": 2,
+    "//wp-content/plugins/wp-file-manager-pro/lib/php/connector.minimal.php": 2,
+    "//wp-content/plugins/wpcargo/includes/barcode.php?text=x1x1111x1xx1xx111xx11111xx1x111x1x1x1xxx11x1111xx1x11xxxx1xx1xxxxx1x1x1xx1x1x11xx1xxxx1x11xx111xxx1xx1xx1x1x1xxx11x1111xxx1xxx1xx1x111xxx1x1xx1xxx1x1x1xx1x1x11xxx11xx1x11xx111xx1xxx1xx11x1x11x11x1111x1x11111x1x1xxxx&sizefactor=.090909090909&size=1&filepath=../../../x.php": 2,
+    "//wp-content/uploads/kaswara/fonts_icon/a57bze8931/.__a57bze8931.php": 2,
+    "//wp-content/uploads/typehub/custom/a57bze8931/.__a57bze8931.php": 2,
+    "//wp-login.php": 29,
+    "/Music/embedded.html": 2,
+    "/RxRgnsza.php": 1,
+    "/RxRythzy.php": 1,
+    "/Speedtest/": 5,
+    "/Speedtest/index.html": 3,
+    "/SystemAO/desktop/script/jsCalendar/source/jsCalendar.js": 1,
+    "/SystemAO/file_system/file_explorer.html": 1,
+    "/Utility/UEditor/net?action=catchimage": 7,
+    "/Utility/UEditor?action=catchimage": 7,
+    "/ab2g": 2,
+    "/ab2h": 1,
+    "/about.php": 3,
+    "/actuator/health": 1,
+    "/admin/elfinder/php/connector.minimal.php": 1,
+    "/admin/wp-login.php": 4,
+    "/administrator/": 2,
+    "/administrator/index.php": 2,
+    "/ajax/api/user/save": 1,
+    "/api/auth/checkLogin": 1,
+    "/api/auth/login": 1,
+    "/api/auth/userCount": 3,
+    "/api/blacklist/enable": 2,
+    "/api/blacklist/list?type=country": 2,
+    "/api/blacklist/list?type=ip": 2,
+    "/api/cert/checkDefault": 2,
+    "/api/cert/list?date=true": 2,
+    "/api/cert/tls": 2,
+    "/api/mdns/list": 4,
+    "/api/proxy/list?type=root": 2,
+    "/api/proxy/list?type=subd": 1,
+    "/api/proxy/list?type=vdir": 1,
+    "/api/proxy/requestIsProxied": 2,
+    "/api/proxy/status": 2,
+    "/api/proxy/useHttpsRedirect": 2,
+    "/api/redirect/list": 2,
+    "/api/stats/countries": 2,
+    "/api/stats/listnic": 2,
+    "/api/stats/netstat": 2,
+    "/api/stats/netstatgraph?array=true": 2510,
+    "/api/stats/summary": 6,
+    "/api/stats/summary?fast=true": 253,
+    "/api/tools/smtp/admin": 2,
+    "/api/tools/smtp/get": 2,
+    "/api/tools/websshSupported": 2,
+    "/api/tools/wol": 2,
+    "/api/utm/list": 8,
+    "/aroz": 2,
+    "/aroz/": 2,
+    "/aroz/video.php": 1,
+    "/autodiscover/autodiscover.json?@zdi/Powershell": 1,
+    "/backup": 1,
+    "/bc": 1,
+    "/bk": 1,
+    "/blog": 1,
+    "/dc/?dip=private/AOB": 1,
+    "/dc?dip=private/AOB": 1,
+    "/furicas": 3,
+    "/furicas/": 4,
+    "/gelo/": 2,
+    "/gelo/contact.html": 1,
+    "/gelo/dl/index.php": 1,
+    "/gelo/full-width.html": 1,
+    "/gelo/gl/index.php": 1,
+    "/gelo/index.html": 1,
+    "/gelo/js/jquery.flexslider-min.js": 1,
+    "/gelo/js/jquery.prettyPhoto.js": 1,
+    "/gelo/js/scripts.js": 1,
+    "/gelo/sidebar-left.html": 2,
+    "/gelo/sidebar-right.html": 1,
+    "/gelo/three-column.html": 1,
+    "/geoserver/web/": 1,
+    "/home": 1,
+    "/index.php": 1,
+    "/index/script/jquery.min.js": 10,
+    "/index_sso.php": 1,
+    "/login.system?redirect=/": 1,
+    "/login/wp-login.php": 4,
+    "/main": 2,
+    "/manager/html": 3,
+    "/misc/ajax.js": 2,
+    "/new": 2,
+    "/noscript.php": 1,
+    "/old": 2,
+    "/owa/": 1,
+    "/php/thinkphp/aaaffff123.php": 1,
+    "/phpmyadmin/index.php": 1,
+    "/pma/": 1,
+    "/pma/index.php": 1,
+    "/private/AOB/": 1,
+    "/public/register/checkPublicRegister": 1,
+    "/qs/": 2,
+    "/qs/file.php": 4,
+    "/qs/index.php": 2,
+    "/qs/jquery.qrcode.min.js": 3,
+    "/qs/js/alignpat.js": 1,
+    "/qs/js/bitmat.js": 1,
+    "/qs/js/bmparser.js": 1,
+    "/qs/js/datablock.js": 1,
+    "/qs/js/databr.js": 1,
+    "/qs/js/datamask.js": 1,
+    "/qs/js/decoder.js": 1,
+    "/qs/js/detector.js": 1,
+    "/qs/js/errorlevel.js": 1,
+    "/qs/js/findpat.js": 1,
+    "/qs/js/formatinf.js": 1,
+    "/qs/js/gf256.js": 1,
+    "/qs/js/gf256poly.js": 1,
+    "/qs/js/grid.js": 1,
+    "/qs/js/qrcode.js": 1,
+    "/qs/js/rsdecoder.js": 1,
+    "/qs/js/version.js": 1,
+    "/qs/rx.php": 4,
+    "/qs/wp-content/plugins/wp-daft/miin.php": 1,
+    "/qs/wp-content/updates.php": 1,
+    "/remote/fgt_lang?lang=en": 1,
+    "/rindex.php?parameter=RxRgnsza.php%7Chttp://ndot.us/za&action=add": 1,
+    "/rindex.php?parameter=RxRythzy.php%7Chttp://ndot.us/za&action=add": 1,
+    "/script/aframe-gif-shader.min.js": 10,
+    "/script/ao_module.js": 3,
+    "/script/applocale.js": 1,
+    "/script/forge-sha256.min.js": 1,
+    "/script/jquery.min.js": 1,
+    "/script/qrcode.min.js": 1,
+    "/script/semantic/semantic.min.js": 1,
+    "/script/tablesort.js": 1,
+    "/shop/wp-login.php": 1,
+    "/system/ajgi/interface?script=Music/functions/getMeta.js": 3,
+    "/system/ajgi/interface?script=Music/functions/getThumbnail.js": 141,
+    "/system/ajgi/interface?script=Speedtest/special/wspeedtest.js": 12,
+    "/system/auth/checkLogin": 5888,
+    "/system/auth/ldap/checkldap": 1,
+    "/system/auth/login": 1,
+    "/system/auth/oauth/checkoauth": 1,
+    "/system/desktop/host": 1,
+    "/system/desktop/listDesktop": 1,
+    "/system/desktop/preference": 2,
+    "/system/desktop/preference?preference=iconsize": 1,
+    "/system/desktop/theme": 1,
+    "/system/desktop/theme?get=true": 1,
+    "/system/desktop/user": 1,
+    "/system/disk/space/tmp": 2,
+    "/system/file_system/handleCacheRender?folder=fd%3A%2F": 1,
+    "/system/file_system/handleCacheRender?folder=fd%3A%2FMusics%2F": 2,
+    "/system/file_system/handleCacheRender?folder=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2F": 1,
+    "/system/file_system/handleCacheRender?folder=fd%3A%2FMusics%2FMusic%20Bank%2F": 1,
+    "/system/file_system/handleCacheRender?folder=is1%3A%2FMusic%2FMusic%20Bank%2FYear%202023%2F05-2023%2F": 1,
+    "/system/file_system/handleCacheRender?folder=user%3A%2F": 1,
+    "/system/file_system/handleCacheRender?folder=user%3A%2FMusic%2F": 1,
+    "/system/file_system/handleCacheRender?folder=user:/Desktop": 1,
+    "/system/file_system/listDir": 13,
+    "/system/file_system/listDirHash?dir=fd%3A%2F": 1,
+    "/system/file_system/listDirHash?dir=fd%3A%2FMusics%2F": 3,
+    "/system/file_system/listDirHash?dir=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2F": 13,
+    "/system/file_system/listDirHash?dir=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2F%E4%BD%9C%E6%A5%AD%E7%94%A8%20BGM%2F": 522,
+    "/system/file_system/listDirHash?dir=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2FLicense%20open%20source%2F": 7,
+    "/system/file_system/listDirHash?dir=fd%3A%2FMusics%2FMusic%20Bank%2F": 2,
+    "/system/file_system/listDirHash?dir=is1%3A%2FMusic%2FMusic%20Bank%2FYear%202023%2F05-2023%2F": 17148,
+    "/system/file_system/listDirHash?dir=user%3A%2F": 1,
+    "/system/file_system/listDirHash?dir=user%3A%2FDesktop%2F": 5902,
+    "/system/file_system/listDirHash?dir=user%3A%2FMusic%2F": 2,
+    "/system/file_system/listRoots": 1,
+    "/system/file_system/listRoots?user=true": 1,
+    "/system/file_system/ongoing": 5862,
+    "/system/file_system/preference?key=Music%2FrepeatModeEmbedded": 3,
+    "/system/file_system/preference?key=file_explorer/listmode": 2,
+    "/system/file_system/preference?key=file_explorer/listmode&value=details": 1,
+    "/system/file_system/preference?key=file_explorer/listmode&value=list": 1,
+    "/system/file_system/preference?key=file_explorer/theme": 2,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2FMusics%2F": 2,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2F": 4,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2F%E4%BD%9C%E6%A5%AD%E7%94%A8%20BGM%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2FMusics%2FBGM%20%E7%B4%A0%E6%9D%90%2FLicense%20open%20source%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=fd%3A%2FMusics%2FMusic%20Bank%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=is1%3A%2FMusic%2FMusic%20Bank%2FYear%202023%2F05-2023%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=user%3A%2F": 1,
+    "/system/file_system/sortMode?opr=get&folder=user%3A%2FMusic%2F": 1,
+    "/system/id/requestInfo": 1,
+    "/system/info/getArOZInfo": 1,
+    "/system/info/getRAMinfo": 1,
+    "/system/modules/getDefault?opr=launch&ext=": 2,
+    "/system/modules/getLaunchPara?module=File%20Manager": 1,
+    "/system/modules/getLaunchPara?module=Speedtest": 2,
+    "/system/modules/list": 1,
+    "/system/power/accessCheck": 1,
+    "/t4": 2,
+    "/talks.php": 2,
+    "/tech/": 3,
+    "/telerik.web.ui.dialoghandler.aspx": 1,
+    "/test": 1,
+    "/test/": 1,
+    "/testing": 1,
+    "/toby.php": 3,
+    "/users/sign_in": 2,
+    "/utm/": 1,
+    "/version": 1,
+    "/view-source:": 2,
+    "/web/": 3,
+    "/web/components/blacklist.html": 2,
+    "/web/components/cert.html": 2,
+    "/web/components/gan.html": 2,
+    "/web/components/networktools.html": 2,
+    "/web/components/redirection.html": 2,
+    "/web/components/rproot.html": 2,
+    "/web/components/rules.html": 2,
+    "/web/components/status.html": 2,
+    "/web/components/subd.html": 2,
+    "/web/components/uptime.html": 2,
+    "/web/components/utils.html": 2,
+    "/web/components/vdir.html": 2,
+    "/web/login.html": 1,
+    "/web/script/chart.js": 2,
+    "/web/script/countryCode.js": 2,
+    "/web/script/jquery-3.6.0.min.js": 2,
+    "/web/script/semantic/semantic.min.js": 2,
+    "/web/script/tablesort.js": 2,
+    "/web/wp-login.php": 4,
+    "/wordpress": 4,
+    "/wordpress/": 7,
+    "/wordpress//?author=1": 4,
+    "/wordpress//?author=2": 4,
+    "/wordpress//wp-json/wp/v2/users/": 4,
+    "/wordpress/2016/10/22/tp4056-%E8%81%9A%E5%90%88%E7%89%A9%E9%8B%B0%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB-ic-%E4%B9%8B%E7%9B%B8%E9%97%9C%E7%A0%94%E7%A9%B6/": 1,
+    "/wordpress/2016/10/22/tp4056-%E8%81%9A%E5%90%88%E7%89%A9%E9%8B%B0%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB-ic-%E4%B9%8B%E7%9B%B8%E9%97%9C%E7%A0%94%E7%A9%B6/feed/": 1,
+    "/wordpress/2016/12/30/40000mah-%E8%B6%85%E5%A4%A7%E5%AE%B9%E9%87%8F%E8%81%9A%E5%90%88%E7%89%A9%E9%8B%B0%E9%9B%BB%E6%B1%A0%E9%96%8B%E7%99%BC%E5%AE%8C%E6%88%90/": 1,
+    "/wordpress/2017/02/06/sab-%E7%8D%A8%E7%AB%8B%E9%9B%BB%E6%B1%A0%E5%85%85%E9%9B%BB%E6%9E%B6%E6%A7%8B-1-0/": 1,
+    "/wordpress/2017/03/02/": 1,
+    "/wordpress/2017/03/31/": 1,
+    "/wordpress/2020/02/29/php7-%E4%B8%8B%E6%AA%94%E6%A1%88%E5%90%8D%E7%A8%B1%E5%A4%AA%E9%95%B7%E5%B0%8E%E8%87%B4-glob-%E5%9B%9E%E5%82%B3-false-%E7%9A%84%E5%95%8F%E9%A1%8C/": 1,
+    "/wordpress/2020/02/29/php7-%e4%b8%8b%e6%aa%94%e6%a1%88%e5%90%8d%e7%a8%b1%e5%a4%aa%e9%95%b7%e5%b0%8e%e8%87%b4-glob-%e5%9b%9e%e5%82%b3-false-%e7%9a%84%e5%95%8f%e9%a1%8c/": 1,
+    "/wordpress/2020/03/01/": 1,
+    "/wordpress/2020/03/01/oao-%E9%96%8B%E6%BA%90%E7%89%88%E6%9C%AC%E7%9A%84-aroz-online-%E5%80%8B%E4%BA%BA%E9%9B%B2%E7%AB%AF%E5%B9%B3%E5%8F%B0/": 2,
+    "/wordpress/2020/03/02/open-vtuber-studio-%E4%B9%8B%E9%96%8B%E7%99%BC-2/?_escaped_fragment_=": 1,
+    "/wordpress/2020/03/03/": 1,
+    "/wordpress/2020/03/24/": 1,
+    "/wordpress/2020/03/29/%E7%B7%A8%E7%A8%8B%E8%AA%9E%E8%A8%80%E7%9A%84%E6%A5%B5%E9%99%90%EF%BC%9Aphp": 1,
+    "/wordpress/2020/03/29/%E7%B7%A8%E7%A8%8B%E8%AA%9E%E8%A8%80%E7%9A%84%E6%A5%B5%E9%99%90%EF%BC%9Aphp/": 2,
+    "/wordpress/2020/04/07/": 1,
+    "/wordpress/2020/06/18": 1,
+    "/wordpress/2020/10/25/golang-ex-exec-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%88%E7%AD%86%E8%A8%98%EF%BC%89/": 1,
+    "/wordpress/2021/01/19/%E5%9C%A8-raspberry-pi-%E4%B8%8A%E8%A8%AD%E5%AE%9A-mhs-3-5%E5%AF%B8%E5%B1%8F%E5%B9%95%E4%B8%A6%E5%95%9F%E7%94%A8-chromium-kiosk-%E6%A8%A1%E5%BC%8F/": 1,
+    "/wordpress/2021/03/22/aroz-portable-%E4%B8%BB%E6%9D%BF%E9%96%8B%E7%99%BC%E8%A8%88%E5%8A%83/": 1,
+    "/wordpress/2021/04/03/%E5%BE%9E%E9%9B%B6%E9%96%8B%E5%A7%8B%E7%9A%84-iot-%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88/": 2,
+    "/wordpress/2021/04/12/sinilink-xy-wf5v-%E7%81%8C-home-dynamic-v2-iot-%E6%8E%A7%E5%88%B6%E5%99%A8/": 1,
+    "/wordpress/2021/05/25/aroz-portable-%e4%b8%bb%e6%9d%bf%e9%96%8b%e7%99%bc%e8%a8%88%e5%8a%83/": 1,
+    "/wordpress/2021/08/20/3d-%E6%89%93%E5%8D%B0%E6%96%B0%E6%89%8B%E6%87%B6%E4%BA%BA%E5%8C%85/?_escaped_fragment_=": 1,
+    "/wordpress/2022/02/27/": 1,
+    "/wordpress/2022/04/17/%e7%94%a8-pd-%e8%a6%81%e6%b1%82%e9%9b%bb%e5%a3%93%e7%9a%84%e6%9c%80%e7%b0%a1%e5%96%ae%e9%9b%bb%e8%b7%af%ef%bc%81/": 1,
+    "/wordpress/2022/05/05/%E4%BE%BF%E5%AE%9C%E5%8F%88%E5%A5%BD%E7%94%A8%E7%9A%84-sop8-ic-%E6%B8%85%E5%96%AE/": 1,
+    "/wordpress/2022/12/22/marktext-vs-mdeditor-%E9%82%84%E6%98%AF%E8%87%AA%E5%B7%B1%E5%AF%AB%E7%9A%84%E5%A5%BD%E7%94%A8/": 1,
+    "/wordpress/2022/12/22/marktext-vs-mdeditor-%E9%82%84%E6%98%AF%E8%87%AA%E5%B7%B1%E5%AF%AB%E7%9A%84%E5%A5%BD%E7%94%A8/feed/": 1,
+    "/wordpress/2022/12/28/arozos-%E7%9A%84%E7%9B%B8%E5%AE%B9%E6%80%A7%E5%AD%98%E5%8F%96%E6%A8%A1%E5%BC%8F/": 1,
+    "/wordpress/2022/12/28/arozos-%E7%9A%84%E7%9B%B8%E5%AE%B9%E6%80%A7%E5%AD%98%E5%8F%96%E6%A8%A1%E5%BC%8F/feed/": 1,
+    "/wordpress/2023/02/25/": 1,
+    "/wordpress/2023/03/07/%E5%88%9D%E5%98%97-ch552g-%E8%88%87-macro-pad-%E9%8D%B5%E7%9B%A4/": 1,
+    "/wordpress/2023/03/18/stable-diffusion-counterfeit-v2-5-%E8%B7%9F-656408761/": 1,
+    "/wordpress/2023/04/04/ch552g-%E6%80%8E%E6%A8%A3%E7%9B%B4%E6%8E%A5%E8%BC%B8%E5%85%A5%E4%B8%AD%E6%96%87%E5%88%B0-windows-%E4%B8%8A%E7%9A%84%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%EF%BC%9F/": 1,
+    "/wordpress/?author=2": 4,
+    "/wordpress/author/tobychui/": 4,
+    "/wordpress/category/development-logs/": 1,
+    "/wordpress/category/development-logs/ai-tensorflow-machine-learning/": 1,
+    "/wordpress/category/development-logs/open-vtuber-studio": 1,
+    "/wordpress/category/development-logs/open-vtuber-studio/": 1,
+    "/wordpress/category/development-logs/page/4/": 1,
+    "/wordpress/page/5/": 1,
+    "/wordpress/page/7/": 1,
+    "/wordpress/page/8/": 1,
+    "/wordpress/tag/aob/": 1,
+    "/wordpress/tag/character-design/": 1,
+    "/wordpress/tag/file-system/": 1,
+    "/wordpress/tag/golang": 1,
+    "/wordpress/tag/golang/": 1,
+    "/wordpress/tag/modules/": 1,
+    "/wordpress/tag/pa/": 1,
+    "/wordpress/tag/posenet": 1,
+    "/wordpress/tag/posenet/": 1,
+    "/wordpress/tag/real-time/": 1,
+    "/wordpress/tag/tensorflow/": 2,
+    "/wordpress/tag/umfilename/": 1,
+    "/wordpress/tag/unity/": 1,
+    "/wordpress/wp-aobbridge/aofw.min.js": 3,
+    "/wordpress/wp-json/wordpress-popular-posts/v1/popular-posts": 2,
+    "/wordpress/wp-json/wp/v2/users": 1,
+    "/wordpress/wp-login.php": 5,
+    "/wp": 2,
+    "/wp-admin/wp-login.php": 4,
+    "/wp-content/RxR_kivzq.php": 1,
+    "/wp-content/RxR_kwzzc.php": 1,
+    "/wp-content/RxR_ofhxv.php": 1,
+    "/wp-content/RxR_rdrwc.php": 1,
+    "/wp-content/RxR_siahb.php": 1,
+    "/wp-content/RxR_staxo.php": 1,
+    "/wp-content/RxR_ttwag.php": 1,
+    "/wp-content/RxR_uzupm.php": 1,
+    "/wp-content/RxR_vhpyl.php": 1,
+    "/wp-content/RxR_yhifm.php": 1,
+    "/wp-content/plugins/background-image-cropper/ups.php": 6,
+    "/wp-content/plugins/core-stab/": 12,
+    "/wp-content/plugins/core-stab/RxRascnk.php": 1,
+    "/wp-content/plugins/core-stab/RxRdhtog.php": 1,
+    "/wp-content/plugins/core-stab/RxRengnb.php": 1,
+    "/wp-content/plugins/core-stab/RxRfxsas.php": 1,
+    "/wp-content/plugins/core-stab/RxRksafo.php": 1,
+    "/wp-content/plugins/core-stab/RxRwsuwh.php": 1,
+    "/wp-content/plugins/core-stab/index.php": 12,
+    "/wp-content/plugins/indeed-membership-pro/classes/PaymentGateways/mollie/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php": 2,
+    "/wp-content/plugins/wp-daft/miin.php": 1,
+    "/wp-content/themes/classic/inc/": 8,
+    "/wp-content/themes/classic/inc/RxRdknqv.php": 1,
+    "/wp-content/themes/classic/inc/RxRlewbw.php": 1,
+    "/wp-content/themes/classic/inc/RxRlyorm.php": 1,
+    "/wp-content/themes/classic/inc/RxRtobjo.php": 1,
+    "/wp-content/themes/classic/inc/index.php": 8,
+    "/wp-content/updates.php": 7,
+    "/wp-json/wp/v2/users": 1,
+    "/wp-login.php": 2,
+    "/wp-plain.php": 1
+  }
+}

+ 7 - 0
web/index.html

@@ -13,6 +13,7 @@
         <script src="script/semantic/semantic.min.js"></script>
         <script src="script/tablesort.js"></script>
         <script src="script/countryCode.js"></script>
+        <script src="script/chart.js"></script>
         <link rel="stylesheet" href="main.css">
     </head>
     <body>
@@ -73,6 +74,9 @@
                     <a class="item" tag="networktool">
                         <i class="simplistic terminal icon"></i> Network Tools
                     </a>
+                    <a class="item" tag="stats">
+                        <i class="simplistic database icon"></i> Statistical Analysis
+                    </a>
                     <a class="item" tag="utils">
                         <i class="simplistic paperclip icon"></i> Utilities
                     </a>
@@ -115,6 +119,9 @@
                 <!-- Network Tools -->
                 <div id="networktool" class="functiontab" target="networktools.html"></div>
 
+                <!-- Statistic Tools -->
+                <div id="stats" class="functiontab" target="stats.html"></div>
+
                 <!-- Utilities -->
                 <div id="utils" class="functiontab" target="utils.html"></div>
             </div>

+ 4 - 1
web/main.css

@@ -48,6 +48,8 @@ body{
 
 .toolbar {
     display: inline-block;
+    height: calc(100% - 51px);
+    overflow-y: auto;
     width: 240px;
 }
 
@@ -149,7 +151,8 @@ body{
         background-color: white;
         top: 3.6em;
         right: 0;
-        height: 100%;
+        height: calc(100% - 51px);
+        overflow-y: auto;
         margin-bottom: 1em;
         z-index: 9;
         padding: 1em;

+ 200 - 0
web/script/useragent.js

@@ -0,0 +1,200 @@
+/*
+    User-Agent.js
+
+    A utilities script that help render
+    user agents by giving its raw UA header
+
+    CopyRight tobychui. All Right Reserved
+*/
+
+ //parseUserAgent return the OS and browser name of the given ua
+ function parseUserAgent(userAgent) {
+    // browser
+    var nVer = userAgent;
+    var nAgt = userAgent;
+    var browser = "";
+    var version = '';
+    var majorVersion = 0;
+    var nameOffset, verOffset, ix;
+
+    // Opera
+    if ((verOffset = nAgt.indexOf('Opera')) != -1) {
+        browser = 'Opera';
+        version = nAgt.substring(verOffset + 6);
+        if ((verOffset = nAgt.indexOf('Version')) != -1) {
+            version = nAgt.substring(verOffset + 8);
+        }
+    }
+    // Opera Next
+    if ((verOffset = nAgt.indexOf('OPR')) != -1) {
+        browser = 'Opera';
+        version = nAgt.substring(verOffset + 4);
+    }
+    // Legacy Edge
+    else if ((verOffset = nAgt.indexOf('Edge')) != -1) {
+        browser = 'Microsoft Legacy Edge';
+        version = nAgt.substring(verOffset + 5);
+    } 
+    // Edge (Chromium)
+    else if ((verOffset = nAgt.indexOf('Edg')) != -1) {
+        browser = 'Microsoft Edge';
+        version = nAgt.substring(verOffset + 4);
+    }
+    // MSIE
+    else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
+        browser = 'Microsoft Internet Explorer';
+        version = nAgt.substring(verOffset + 5);
+    }
+    // Chrome
+    else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
+        browser = 'Chrome';
+        version = nAgt.substring(verOffset + 7);
+    }
+    // Safari
+    else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
+        browser = 'Safari';
+        version = nAgt.substring(verOffset + 7);
+        if ((verOffset = nAgt.indexOf('Version')) != -1) {
+            version = nAgt.substring(verOffset + 8);
+        }
+    }
+    // Firefox
+    else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
+        browser = 'Firefox';
+        version = nAgt.substring(verOffset + 8);
+    }
+    // MSIE 11+
+    else if (nAgt.indexOf('Trident/') != -1) {
+        browser = 'Microsoft Internet Explorer';
+        version = nAgt.substring(nAgt.indexOf('rv:') + 3);
+    }
+    // Other browsers
+    else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
+        browser = nAgt.substring(nameOffset, verOffset);
+        version = nAgt.substring(verOffset + 1);
+        if (browser.toLowerCase() == browser.toUpperCase()) {
+            browser = navigator.appName;
+        }
+    }
+    // trim the version string
+    if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
+    if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
+    if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
+
+    majorVersion = parseInt('' + version, 10);
+    if (isNaN(majorVersion)) {
+        version = '' + parseFloat(navigator.appVersion);
+        majorVersion = parseInt(navigator.appVersion, 10);
+    }
+
+    // mobile version
+    var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
+
+    // system
+    var os = "";
+    var clientStrings = [
+        {s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/},
+        {s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/},
+        {s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/},
+        {s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/},
+        {s:'Windows Vista', r:/Windows NT 6.0/},
+        {s:'Windows Server 2003', r:/Windows NT 5.2/},
+        {s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/},
+        {s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/},
+        {s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/},
+        {s:'Windows 98', r:/(Windows 98|Win98)/},
+        {s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/},
+        {s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
+        {s:'Windows CE', r:/Windows CE/},
+        {s:'Windows 3.11', r:/Win16/},
+        {s:'Android', r:/Android/},
+        {s:'Open BSD', r:/OpenBSD/},
+        {s:'Sun OS', r:/SunOS/},
+        {s:'Chrome OS', r:/CrOS/},
+        {s:'Linux', r:/(Linux|X11(?!.*CrOS))/},
+        {s:'iOS', r:/(iPhone|iPad|iPod)/},
+        {s:'Mac OS X', r:/Mac OS X/},
+        {s:'Mac OS', r:/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
+        {s:'QNX', r:/QNX/},
+        {s:'UNIX', r:/UNIX/},
+        {s:'BeOS', r:/BeOS/},
+        {s:'OS/2', r:/OS\/2/},
+        //Special agents
+        {s:'Search Bot', r:/(nuhk|CensysInspect|facebookexternalhit|Twitterbot|AhrefsBot|Palo Alto|InternetMeasurement|PetalBot|coccocbot|MJ12bot|Googlebot|bingbot|Yammybot|YandexBot|SeznamBot|SemrushBot|Openbot|Slurp|Sogou web spider|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/},
+        {s: 'Auto Scripts', r:/(Go-http-client|cpp-httplib|python-requests|Java|zgrab|ALittle Client|)/},
+    ];
+    for (var id in clientStrings) {
+        var cs = clientStrings[id];
+        if (cs.r.test(nAgt)) {
+            os = cs.s;
+            break;
+        }
+    }
+
+    var osVersion = "";
+
+    if (/Windows/.test(os)) {
+        osVersion = /Windows (.*)/.exec(os)[1];
+        os = 'Windows';
+    }
+
+    switch (os) {
+        case 'Mac OS':
+        case 'Mac OS X':
+        case 'Android':
+            osVersion = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([\.\_\d]+)/.exec(nAgt)[1];
+            break;
+
+        case 'iOS':
+            osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
+            osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
+            break;
+    }
+
+    // Return OS and browser
+    return {
+        os: os,
+        browser: browser,
+        version: osVersion,
+        isMobile: mobile,
+    };
+}
+
+//Get OS color code give a persistant color
+//if a OS or browser agent is known
+//otherwise return light grey
+function getOSColorCode(browserName){
+    let browserColors = {
+        'Windows 10': '#0078D7',
+        'Windows 8.1': '#2D7D9A',
+        'Windows 8': '#0063B1',
+        'Windows 7': '#4C4C4C',
+        'Windows Vista': '#008080',
+        'Windows Server 2003': '#A30000',
+        'Windows XP': '#6D6D6D',
+        'Windows 2000': '#7F7F7F',
+        'Windows ME': '#BDBDBD',
+        'Windows 98': '#ECECEC',
+        'Windows 95': '#F0F0F0',
+        'Windows NT 4.0': '#9E9E9E',
+        'Windows CE': '#FFDDBB',
+        'Windows 3.11': '#BF2F2F',
+        'Windows': '#6ec3f5',
+        'Android': '#A4C639',
+        'Open BSD': '#F5DEB3',
+        'Sun OS': '#DAA520',
+        'Chrome OS': '#4285F4',
+        'Linux': '#ECECEC',
+        'iOS': '#000000',
+        'Mac OS X': '#A5A5A5',
+        'Mac OS': '#A5A5A5',
+        'QNX': '#696969',
+        'UNIX': '#D3D3D3',
+        'BeOS': '#8F8F8F',
+        'OS/2': '#D8BFD8',
+        'Search Bot': '#F6A821',
+        'Auto Scripts': '#B8B8B8',
+    }
+
+    return browserColors[browserName] || "#e0e0e0";
+}