aiwaf-js 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,9 @@
1
+ name: Publish to npm
2
+
1
3
  on:
2
4
  release:
3
5
  types: [created]
4
- push:
5
- branches: [ "main" ]
6
+ workflow_dispatch:
6
7
 
7
8
  jobs:
8
9
  build-and-publish:
@@ -10,13 +11,16 @@ jobs:
10
11
 
11
12
  steps:
12
13
  - uses: actions/checkout@v4
14
+ with:
15
+ fetch-depth: 0
16
+
13
17
  - uses: actions/setup-node@v4
14
18
  with:
15
19
  node-version: 20
16
20
  registry-url: https://registry.npmjs.org/
17
21
 
18
- - run: npm install
19
- - run: npm run test
22
+ - run: npm ci
23
+ - run: npm test
20
24
  - run: npm publish --access public
21
25
  env:
22
26
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -1,47 +1,36 @@
1
- // lib/anomalyDetector.js
2
-
1
+ const fs = require('fs');
2
+ const path = require('path');
3
3
  const { IsolationForest } = require('./isolationForest');
4
+
4
5
  let model;
5
6
  let trained = false;
6
7
 
8
+ const modelPath = path.join(__dirname, '..', 'resources', 'model.json');
9
+
10
+ try {
11
+ const data = fs.readFileSync(modelPath, 'utf-8');
12
+ model = IsolationForest.fromJSON(JSON.parse(data));
13
+ trained = true;
14
+ console.log('✅ Pretrained anomaly model loaded.');
15
+ } catch (err) {
16
+ console.warn('⚠️ Failed to load pretrained model:', err);
17
+ }
18
+
7
19
  module.exports = {
8
- /**
9
- * Initialize a fresh forest instance.
10
- * @param {Object} opts
11
- * @param {number} opts.nTrees Number of trees to build (default 100)
12
- * @param {number} opts.sampleSize Subsample size per tree (default 256)
13
- */
14
- init({ nTrees = 100, sampleSize = 256 } = {}) {
15
- model = new IsolationForest({ nTrees, sampleSize });
16
- trained = false;
20
+ init(opts = {}) {
21
+ if (!model) {
22
+ model = new IsolationForest({ nTrees: opts.nTrees || 100, sampleSize: opts.sampleSize || 256 });
23
+ }
17
24
  },
18
25
 
19
- /**
20
- * Train the isolation forest on feature vectors.
21
- * @param {Array<Array<number>>} data Array of feature vectors.
22
- */
23
26
  train(data) {
24
- if (!model) this.init(); // ensure model initialized
25
27
  model.fit(data);
26
28
  trained = true;
27
29
  },
28
30
 
29
- /**
30
- * Check if a request is anomalous.
31
- * @param {Object} req Express request object
32
- * @returns {boolean} true if anomalous, false otherwise
33
- */
34
- isAnomalous(req) {
31
+ // ✅ Now expects a vector, not a request
32
+ isAnomalous(features, threshold = 0.5) {
35
33
  if (!trained) return false;
36
- // build your feature vector here; add more features as needed
37
- const feat = [
38
- req.path.length, // path length
39
- 0, // placeholder: keyword hits
40
- 0, // placeholder: status code index
41
- 0, // placeholder: response time
42
- 0, // placeholder: burst count
43
- 0 // placeholder: total 404s
44
- ];
45
- return model.isAnomaly(feat);
34
+ return model.isAnomaly(features, threshold);
46
35
  }
47
- };
36
+ };
@@ -0,0 +1,20 @@
1
+ const STATIC_KW = ['.php', '.xmlrpc', 'wp-', '.env', '.git', '.bak', 'shell'];
2
+ const STATUS_IDX = ['200', '403', '404', '500'];
3
+
4
+ function extractFeatures(req) {
5
+ const uri = req.path.toLowerCase();
6
+ const pathLen = uri.length;
7
+
8
+ const kwHits = STATIC_KW.reduce(
9
+ (count, kw) => count + (uri.includes(kw) ? 1 : 0), 0
10
+ );
11
+
12
+ const statusIdx = STATUS_IDX.indexOf(String(req.res?.statusCode || 200));
13
+ const rt = parseFloat(req.headers['x-response-time'] || '0');
14
+ const burst = 0;
15
+ const total404 = 0;
16
+
17
+ return [pathLen, kwHits, statusIdx, rt, burst, total404];
18
+ }
19
+
20
+ module.exports = { extractFeatures };
@@ -1,97 +1,117 @@
1
- // lib/isolationForest.js
2
-
3
1
  class IsolationTree {
4
- constructor(depth = 0, maxDepth = 0) {
5
- this.depth = depth;
6
- this.maxDepth = maxDepth;
7
- this.left = null;
8
- this.right = null;
9
- this.splitAttr = null;
10
- this.splitValue = null;
11
- this.size = 0;
12
- }
13
-
14
- fit(data) {
15
- this.size = data.length;
16
- // stop criteria
17
- if (this.depth >= this.maxDepth || data.length <= 1) return;
18
- // choose random feature
19
- const numFeatures = data[0].length;
20
- this.splitAttr = Math.floor(Math.random() * numFeatures);
21
- // find min/max on that feature
22
- let vals = data.map(row => row[this.splitAttr]);
23
- const min = Math.min(...vals), max = Math.max(...vals);
24
- if (min === max) return;
25
- // choose random split
26
- this.splitValue = min + Math.random() * (max - min);
27
- // partition data
28
- const leftData = [], rightData = [];
29
- for (let row of data) {
30
- (row[this.splitAttr] < this.splitValue ? leftData : rightData).push(row);
31
- }
32
- // build subtrees
33
- this.left = new IsolationTree(this.depth+1, this.maxDepth);
34
- this.right = new IsolationTree(this.depth+1, this.maxDepth);
35
- this.left.fit(leftData);
36
- this.right.fit(rightData);
2
+ constructor(depth = 0, maxDepth = 0) {
3
+ this.depth = depth;
4
+ this.maxDepth = maxDepth;
5
+ this.left = null;
6
+ this.right = null;
7
+ this.splitAttr = null;
8
+ this.splitValue = null;
9
+ this.size = 0;
10
+ }
11
+
12
+ fit(data) {
13
+ this.size = data.length;
14
+ if (this.depth >= this.maxDepth || data.length <= 1) return;
15
+ const numFeatures = data[0].length;
16
+ this.splitAttr = Math.floor(Math.random() * numFeatures);
17
+ let vals = data.map(row => row[this.splitAttr]);
18
+ const min = Math.min(...vals), max = Math.max(...vals);
19
+ if (min === max) return;
20
+ this.splitValue = min + Math.random() * (max - min);
21
+ const leftData = [], rightData = [];
22
+ for (let row of data) {
23
+ (row[this.splitAttr] < this.splitValue ? leftData : rightData).push(row);
37
24
  }
38
-
39
- pathLength(point) {
40
- // if leaf or no split, path ends here
41
- if (!this.left || !this.right) {
42
- // use average c(size) for external nodes
43
- return this.depth + c(this.size);
44
- }
45
- // descend
46
- if (point[this.splitAttr] < this.splitValue) {
47
- return this.left.pathLength(point);
48
- } else {
49
- return this.right.pathLength(point);
50
- }
25
+ this.left = new IsolationTree(this.depth + 1, this.maxDepth);
26
+ this.right = new IsolationTree(this.depth + 1, this.maxDepth);
27
+ this.left.fit(leftData);
28
+ this.right.fit(rightData);
29
+ }
30
+
31
+ pathLength(point) {
32
+ if (!this.left || !this.right) {
33
+ return this.depth + c(this.size);
51
34
  }
35
+ return point[this.splitAttr] < this.splitValue
36
+ ? this.left.pathLength(point)
37
+ : this.right.pathLength(point);
52
38
  }
53
-
54
- // average path length of unsuccessful search in a BST
55
- function c(n) {
56
- if (n <= 1) return 1;
57
- return 2 * (Math.log(n - 1) + 0.5772156649) - (2*(n-1)/n);
39
+
40
+ serialize() {
41
+ return {
42
+ depth: this.depth,
43
+ maxDepth: this.maxDepth,
44
+ splitAttr: this.splitAttr,
45
+ splitValue: this.splitValue,
46
+ size: this.size,
47
+ left: this.left ? this.left.serialize() : null,
48
+ right: this.right ? this.right.serialize() : null
49
+ };
58
50
  }
59
-
60
- class IsolationForest {
61
- constructor({ nTrees = 100, sampleSize = 256 } = {}) {
62
- this.nTrees = nTrees;
63
- this.sampleSize = sampleSize;
64
- this.trees = [];
65
- }
66
-
67
- fit(data) {
68
- const heightLimit = Math.ceil(Math.log2(this.sampleSize));
69
- for (let i = 0; i < this.nTrees; i++) {
70
- // random subsample
71
- const sample = [];
72
- for (let j = 0; j < this.sampleSize; j++) {
73
- sample.push(data[Math.floor(Math.random() * data.length)]);
74
- }
75
- const tree = new IsolationTree(0, heightLimit);
76
- tree.fit(sample);
77
- this.trees.push(tree);
51
+
52
+ static deserialize(obj) {
53
+ const tree = new IsolationTree(obj.depth, obj.maxDepth);
54
+ tree.splitAttr = obj.splitAttr;
55
+ tree.splitValue = obj.splitValue;
56
+ tree.size = obj.size;
57
+ tree.left = obj.left ? IsolationTree.deserialize(obj.left) : null;
58
+ tree.right = obj.right ? IsolationTree.deserialize(obj.right) : null;
59
+ return tree;
60
+ }
61
+ }
62
+
63
+ // Average path length
64
+ function c(n) {
65
+ if (n <= 1) return 1;
66
+ return 2 * (Math.log(n - 1) + 0.5772156649) - (2 * (n - 1) / n);
67
+ }
68
+
69
+ class IsolationForest {
70
+ constructor({ nTrees = 100, sampleSize = 256 } = {}) {
71
+ this.nTrees = nTrees;
72
+ this.sampleSize = sampleSize;
73
+ this.trees = [];
74
+ }
75
+
76
+ fit(data) {
77
+ const heightLimit = Math.ceil(Math.log2(this.sampleSize));
78
+ for (let i = 0; i < this.nTrees; i++) {
79
+ const sample = [];
80
+ for (let j = 0; j < this.sampleSize; j++) {
81
+ sample.push(data[Math.floor(Math.random() * data.length)]);
78
82
  }
83
+ const tree = new IsolationTree(0, heightLimit);
84
+ tree.fit(sample);
85
+ this.trees.push(tree);
79
86
  }
80
-
81
- anomalyScore(point) {
82
- // average path length
83
- const pathLens = this.trees.map(t => t.pathLength(point));
84
- const avgPath = pathLens.reduce((a,b) => a+b, 0) / this.nTrees;
85
- // score: 2^(-E[h(x)]/c(sampleSize))
86
- const cn = c(this.sampleSize);
87
- return Math.pow(2, -avgPath / cn);
88
- }
89
-
90
- // simple threshold helper
91
- isAnomaly(point, thresh = 0.5) {
92
- return this.anomalyScore(point) > thresh;
93
- }
94
87
  }
95
-
96
- module.exports = { IsolationForest };
97
-
88
+
89
+ anomalyScore(point) {
90
+ const pathLens = this.trees.map(t => t.pathLength(point));
91
+ const avgPath = pathLens.reduce((a, b) => a + b, 0) / this.nTrees;
92
+ return Math.pow(2, -avgPath / c(this.sampleSize));
93
+ }
94
+
95
+ isAnomaly(point, thresh = 0.5) {
96
+ return this.anomalyScore(point) > thresh;
97
+ }
98
+
99
+ toJSON() {
100
+ return {
101
+ nTrees: this.nTrees,
102
+ sampleSize: this.sampleSize,
103
+ trees: this.trees.map(t => t.serialize())
104
+ };
105
+ }
106
+
107
+ static fromJSON(obj) {
108
+ const forest = new IsolationForest({
109
+ nTrees: obj.nTrees,
110
+ sampleSize: obj.sampleSize
111
+ });
112
+ forest.trees = obj.trees.map(IsolationTree.deserialize);
113
+ return forest;
114
+ }
115
+ }
116
+
117
+ module.exports = { IsolationForest };
@@ -1,5 +1,3 @@
1
- // lib/wafMiddleware.js
2
-
3
1
  const rateLimiter = require('./rateLimiter');
4
2
  const blacklistManager = require('./blacklistManager');
5
3
  const keywordDetector = require('./keywordDetector');
@@ -7,9 +5,9 @@ const dynamicKeyword = require('./dynamicKeyword');
7
5
  const honeypotDetector = require('./honeypotDetector');
8
6
  const uuidDetector = require('./uuidDetector');
9
7
  const anomalyDetector = require('./anomalyDetector');
8
+ const { extractFeatures } = require('./featureUtils');
10
9
 
11
10
  module.exports = function aiwaf(opts = {}) {
12
- // initialize all sub‑modules
13
11
  rateLimiter.init(opts);
14
12
  keywordDetector.init(opts);
15
13
  dynamicKeyword.init(opts);
@@ -18,29 +16,23 @@ module.exports = function aiwaf(opts = {}) {
18
16
  anomalyDetector.init(opts);
19
17
 
20
18
  return async (req, res, next) => {
21
- // honor X‑Forwarded‑For for tests or real proxies
22
19
  const ipHdr = req.headers['x-forwarded-for'];
23
20
  const ip = ipHdr ? ipHdr.split(',')[0].trim() : req.ip;
24
21
  const path = req.path.toLowerCase();
25
22
 
26
- // learn every request for dynamic keywords
27
23
  dynamicKeyword.learn(path);
28
24
 
29
- // 1) IP blacklist
30
25
  if (await blacklistManager.isBlocked(ip)) {
31
26
  return res.status(403).json({ error: 'blocked' });
32
27
  }
33
28
 
34
- // 2) Honeypot trap
35
29
  if (honeypotDetector.isTriggered(req)) {
36
30
  await blacklistManager.block(ip, 'honeypot');
37
31
  return res.status(403).json({ error: 'bot_detected' });
38
32
  }
39
33
 
40
- // 3) Rate limiting
41
34
  await rateLimiter.record(ip);
42
35
 
43
- // If recs > MAX_REQ but not yet blacklisted (flood), return 429
44
36
  if (await rateLimiter.isBlocked(ip)) {
45
37
  if (await blacklistManager.isBlocked(ip)) {
46
38
  return res.status(403).json({ error: 'blocked' });
@@ -48,33 +40,41 @@ module.exports = function aiwaf(opts = {}) {
48
40
  return res.status(429).json({ error: 'too_many_requests' });
49
41
  }
50
42
 
51
- // 4) Static keyword
52
43
  const sk = keywordDetector.check(path);
53
44
  if (sk) {
54
45
  await blacklistManager.block(ip, `static:${sk}`);
55
46
  return res.status(403).json({ error: 'blocked' });
56
47
  }
57
48
 
58
- // 5) Dynamic keyword
59
49
  const dk = dynamicKeyword.check(path);
60
50
  if (dk) {
61
51
  await blacklistManager.block(ip, `dynamic:${dk}`);
62
52
  return res.status(403).json({ error: 'blocked' });
63
53
  }
64
54
 
65
- // 6) UUID tamper
66
55
  if (uuidDetector.isSuspicious(req)) {
67
56
  await blacklistManager.block(ip, 'uuid');
68
57
  return res.status(403).json({ error: 'blocked' });
69
58
  }
70
59
 
71
- // 7) Anomaly detection
72
- if (await anomalyDetector.isAnomalous(req)) {
73
- await blacklistManager.block(ip, 'anomaly');
74
- return res.status(403).json({ error: 'blocked' });
60
+ // Anomaly detection only for unknown routes
61
+ const knownRoutes = req.app._router.stack
62
+ .filter(r => r.route && r.route.path)
63
+ .map(r => r.route.path);
64
+
65
+ const matchesKnown = knownRoutes.some(route => {
66
+ const pattern = new RegExp('^' + route.replace(/:\w+/g, '[^/]+') + '$');
67
+ return pattern.test(req.path);
68
+ });
69
+
70
+ if (!matchesKnown) {
71
+ const features = extractFeatures(req);
72
+ if (await anomalyDetector.isAnomalous(features)) {
73
+ await blacklistManager.block(ip, 'anomaly');
74
+ return res.status(403).json({ error: 'blocked' });
75
+ }
75
76
  }
76
77
 
77
- // no block, pass through
78
78
  next();
79
79
  };
80
80
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwaf-js",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Adaptive Web Application Firewall middleware for Node.js (Express, Fastify, Hapi, Next.js)",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1 @@
1
+ {"nTrees":100,"sampleSize":256,"trees":[{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":232},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":2,"splitValue":1.0390695353859254,"size":3},"splitAttr":3,"splitValue":0.018154897807514576,"size":6},"splitAttr":1,"splitValue":2.5072251084527197,"size":238},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":18},"splitAttr":3,"splitValue":0.13069383372266463,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":135},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":40},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":16},"splitAttr":3,"splitValue":0.0430664097585193,"size":56},"splitAttr":3,"splitValue":0.03166407432894987,"size":191},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":38},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.151363098194917,"size":4},"splitAttr":1,"splitValue":0.8101772926202886,"size":8},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":29.874439471196087,"size":2},"splitAttr":0,"splitValue":15.029812721842989,"size":10},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.09202337400228641,"size":12},"splitAttr":2,"splitValue":0.012479075014248497,"size":50},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":15},"splitAttr":1,"splitValue":1.4288226318448667,"size":65},"splitAttr":3,"splitValue":0.05124370335825135,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":63.91449458179204,"size":5},"splitAttr":1,"splitValue":2.9626728533025015,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":63},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":132},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":2.8262553668417865,"size":133},"splitAttr":2,"splitValue":0.516652735969785,"size":196},"splitAttr":2,"splitValue":-0.9971780377960271,"size":198},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":13},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.23000441458097365,"size":17},"splitAttr":3,"splitValue":0.1049780733522879,"size":215},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":24},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":36.57423064280308,"size":25},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":1,"splitValue":2.9689709806745235,"size":7},"splitAttr":0,"splitValue":31.01404506563697,"size":16},"splitAttr":1,"splitValue":1.4953014181330289,"size":41},"splitAttr":2,"splitValue":1.2761051150608833,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":31},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"splitAttr":0,"splitValue":1.3078586893875466,"size":14},"splitAttr":3,"splitValue":0.07124879352849997,"size":45},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":59},"splitAttr":1,"splitValue":0.3034477039866519,"size":104},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"splitAttr":1,"splitValue":1.6569847317875421,"size":114},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":142},"splitAttr":0,"splitValue":19.864835367880048,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":83},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":167},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":6},"splitAttr":3,"splitValue":0.18792721666453335,"size":173},"splitAttr":0,"splitValue":13.68099605373191,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"splitAttr":2,"splitValue":-0.25362718897911507,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.4949980848097649,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":16},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":24},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":28},"splitAttr":0,"splitValue":28.08997725184874,"size":52},"splitAttr":0,"splitValue":7.821001172130293,"size":68},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"splitAttr":2,"splitValue":1.0319406522633239,"size":77},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":72},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":55.82453077193347,"size":73},"splitAttr":1,"splitValue":0.24116319502618522,"size":150},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":0,"splitValue":66.03755079181694,"size":152},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":78},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":83.6142439384943,"size":79},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":2,"splitValue":1.068890671249742,"size":88},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.2422981262658392,"size":5},"splitAttr":3,"splitValue":0.04566405752683591,"size":93},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"splitAttr":1,"splitValue":2.8019117659418598,"size":100},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.07648942860995323,"size":103},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.1316823223374119,"size":104},"splitAttr":1,"splitValue":1.1666367559774224,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":70},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":178},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"splitAttr":3,"splitValue":0.22961521702902454,"size":8},"splitAttr":3,"splitValue":0.1737170126418322,"size":186},"splitAttr":3,"splitValue":0.01428414241207198,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":74},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":182},"splitAttr":1,"splitValue":0.2167504931923987,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":157},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":2.442588976124597,"size":158},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":32},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":62},"splitAttr":1,"splitValue":1.3649558454955375,"size":94},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01863200623479045,"size":2},"splitAttr":3,"splitValue":0.010934693418344991,"size":3},"splitAttr":0,"splitValue":52.18274668018073,"size":97},"splitAttr":0,"splitValue":28.463987540095093,"size":255},"splitAttr":2,"splitValue":-0.052428451607588356,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":53.299507312909654,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":209},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.2519962785548923,"size":213},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":43},"splitAttr":2,"splitValue":1.8373851073730623,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":53},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":67},"splitAttr":2,"splitValue":0.24443438107691873,"size":120},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":88},"splitAttr":1,"splitValue":1.2032725456328324,"size":208},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":44},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":1,"splitValue":2.746076870790678,"size":46},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":42.03346636116573,"size":48},"splitAttr":2,"splitValue":1.40161287005381,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":51},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":205},"splitAttr":2,"splitValue":0.7732338594870884,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":103},"splitAttr":2,"splitValue":0.3095983000367035,"size":106},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":6},"splitAttr":0,"splitValue":43.97600409516369,"size":112},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":13},"splitAttr":2,"splitValue":0.2748343929927244,"size":16},"splitAttr":3,"splitValue":0.02390215318305431,"size":128},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":72},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":3,"splitValue":0.103341343963202,"size":81},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.2560545352067961,"size":85},"splitAttr":3,"splitValue":0.030899968952326808,"size":213},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":43},"splitAttr":2,"splitValue":1.6218760853727616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.4620246973402094,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":168},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":58},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":15},"splitAttr":0,"splitValue":39.612533913327496,"size":73},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":65.76624532901687,"size":74},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":0,"splitValue":42.095863823510946,"size":14},"splitAttr":2,"splitValue":1.3707610133214527,"size":88},"splitAttr":0,"splitValue":28.751409638567146,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":253},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":82.02059724420617,"size":255},"splitAttr":2,"splitValue":-0.42007286600349825,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":136},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":120},"splitAttr":1,"splitValue":1.4579218216989465,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.31049527547845096,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":34.92795359039633,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":48},"splitAttr":3,"splitValue":0.02351120337257634,"size":51},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":127},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":62},"splitAttr":0,"splitValue":34.546250843308655,"size":189},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.12963784890961924,"size":190},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.060252821368077074,"size":4},"splitAttr":1,"splitValue":2.521172532125446,"size":194},"splitAttr":2,"splitValue":0.2861222865281494,"size":245},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"splitAttr":3,"splitValue":0.19239833605228607,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"splitAttr":1,"splitValue":1.7653303057961667,"size":10},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":12},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":6},"splitAttr":3,"splitValue":0.04162311586079971,"size":18},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":29},"splitAttr":3,"splitValue":0.05098968298068611,"size":47},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.2227421200418095,"size":50},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":125},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":69},"splitAttr":0,"splitValue":31.465616843655614,"size":194},"splitAttr":2,"splitValue":0.6383811993579056,"size":244},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":79.78908468285371,"size":246},"splitAttr":3,"splitValue":0.009973313058177773,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":246},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":7},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.20002065033319458,"size":10},"splitAttr":1,"splitValue":2.8641818259292497,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":79},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":177},"splitAttr":3,"splitValue":0.01689738881109126,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":14},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":42},"splitAttr":0,"splitValue":1.932013286701094,"size":56},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.22817921333918315,"size":58},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":197},"splitAttr":2,"splitValue":0.9552450231388354,"size":255},"splitAttr":2,"splitValue":-0.609764232826616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":120},"splitAttr":1,"splitValue":0.9880755750302734,"size":172},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":18},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.07623639893191882,"size":22},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.11418145411550693,"size":23},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.015532044617765157,"size":3},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":29},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.04132337889206499,"size":30},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":4},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.030848775313679553,"size":7},"splitAttr":0,"splitValue":42.92277650796948,"size":37},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":2,"splitValue":1.8735670775314226,"size":45},"splitAttr":1,"splitValue":1.4077992440571292,"size":48},"splitAttr":1,"splitValue":0.9832576762095755,"size":71},"splitAttr":0,"splitValue":33.29118805922725,"size":243},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":31.756177610197383,"size":4},"splitAttr":0,"splitValue":30.81965992299928,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.02870160410159593,"size":7},"splitAttr":1,"splitValue":2.4590389413163942,"size":250},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":32.21327563923714,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":1,"splitValue":0.7597906134894123,"size":6},"splitAttr":3,"splitValue":0.20974284083839478,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":82},"splitAttr":2,"splitValue":-0.4212736899846574,"size":83},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":31},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":2,"splitValue":0.2648387407887167,"size":57},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":67},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":42},"splitAttr":0,"splitValue":34.72498096588713,"size":109},"splitAttr":1,"splitValue":1.3981739614443882,"size":166},"splitAttr":0,"splitValue":13.050970436813163,"size":249},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":54.97805441658472,"size":6},"splitAttr":2,"splitValue":0.9961818951833827,"size":7},"splitAttr":0,"splitValue":48.372341855158695,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":248},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.017594350586376165,"size":8},"splitAttr":1,"splitValue":2.2890853929699793,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":138},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":0.9189900330439407,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":68.34149050711432,"size":6},"splitAttr":0,"splitValue":43.52192124023985,"size":144},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":112},"splitAttr":1,"splitValue":1.6719552244839135,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":195},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":7},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.12243704294176538,"size":8},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":14.902203322966654,"size":10},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":33},"splitAttr":1,"splitValue":0.09895097169380818,"size":43},"splitAttr":2,"splitValue":1.2629289692817611,"size":238},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":44.624371109056725,"size":6},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.16979180463623347,"size":7},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":8},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":48.99414353707397,"size":10},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.13920302765398074,"size":11},"splitAttr":1,"splitValue":1.275384941935566,"size":18},"splitAttr":0,"splitValue":42.561775607355266,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":80},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":35},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":14},"splitAttr":0,"splitValue":14.26067983682374,"size":49},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":11},"splitAttr":2,"splitValue":1.1244500796571109,"size":60},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":6},"splitAttr":0,"splitValue":23.970835350682428,"size":66},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":14},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":54},"splitAttr":0,"splitValue":20.002133975519826,"size":68},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":17},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":0,"splitValue":36.5828034566161,"size":21},"splitAttr":2,"splitValue":1.4154343063977448,"size":89},"splitAttr":1,"splitValue":1.5159551261604227,"size":155},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":42.634897417603675,"size":156},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":13},"splitAttr":0,"splitValue":43.95151790605535,"size":169},"splitAttr":1,"splitValue":0.3056680395424993,"size":249},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.8146883572767845,"size":7},"splitAttr":1,"splitValue":2.245104850712947,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":249},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":2,"splitValue":1.1634158739994485,"size":6},"splitAttr":1,"splitValue":2.7319709800577057,"size":255},"splitAttr":2,"splitValue":-0.5121795678778942,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":8},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":28},"splitAttr":0,"splitValue":10.08961561099855,"size":36},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":18},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.13250453384479932,"size":5},"splitAttr":3,"splitValue":0.11753391141453251,"size":23},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.150271079707112,"size":27},"splitAttr":3,"splitValue":0.06569222015038288,"size":63},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":52},"splitAttr":1,"splitValue":0.9664275865417586,"size":115},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":96},"splitAttr":1,"splitValue":1.7099585314690644,"size":211},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":45},"splitAttr":2,"splitValue":1.1304100109781543,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":28},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":18},"splitAttr":2,"splitValue":0.891286134210417,"size":46},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.19014991101349354,"size":49},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":54},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":15},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":1.2327269773363894,"size":16},"splitAttr":2,"splitValue":1.2231482085291923,"size":70},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.20600029028561154,"size":71},"splitAttr":1,"splitValue":0.4214142020059155,"size":120},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":39},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":97},"splitAttr":1,"splitValue":0.3080812408110605,"size":136},"splitAttr":0,"splitValue":20.6446665143037,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":251},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":45.92381281099708,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":84},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":63},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":109},"splitAttr":0,"splitValue":17.3804252489267,"size":172},"splitAttr":1,"splitValue":0.8483675466440606,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.3104026820785125,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":11.670680941113165,"size":2},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":1,"splitValue":0.16933378813231936,"size":28},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":8},"splitAttr":3,"splitValue":0.018437934580056454,"size":36},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"splitAttr":1,"splitValue":1.1614344844725544,"size":40},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":0,"splitValue":15.681165661374763,"size":48},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":67},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":2.700199320236443,"size":2},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2091514511922493,"size":4},"splitAttr":3,"splitValue":0.15619221190240595,"size":6},"splitAttr":3,"splitValue":0.11115227017682106,"size":73},"splitAttr":3,"splitValue":0.021130878857935638,"size":121},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":135},"splitAttr":0,"splitValue":17.353548030186616,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":247},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.01121688481141123,"size":5},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":0,"splitValue":61.09646839354064,"size":9},"splitAttr":0,"splitValue":50.181356594619906,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":64},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":63.409374115265294,"size":66},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":44},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":24.2641217899353,"size":8},"splitAttr":3,"splitValue":0.03153497322711089,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":89},"splitAttr":1,"splitValue":1.1556590459694789,"size":141},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":47},"splitAttr":2,"splitValue":1.025946105132344,"size":188},"splitAttr":1,"splitValue":0.6224970389618374,"size":254},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.2826237283345496,"size":2},"splitAttr":3,"splitValue":0.2561387789424267,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":18},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":96},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":27},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":0,"splitValue":57.1254976152951,"size":31},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":108},"splitAttr":1,"splitValue":1.5066097697631529,"size":139},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":82.65888720692706,"size":140},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":39.7944282890024,"size":2},"splitAttr":1,"splitValue":2.423566533061533,"size":142},"splitAttr":0,"splitValue":22.757860136671383,"size":238},"splitAttr":0,"splitValue":7.112303384913654,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":196},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":60},"splitAttr":3,"splitValue":0.057982724881625286,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":58.07396379975989,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":245},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"splitAttr":3,"splitValue":0.2055368035865504,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":87},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.009813745484701873,"size":4},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01893477005425118,"size":5},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":163},"splitAttr":0,"splitValue":7.327136771655147,"size":168},"splitAttr":1,"splitValue":0.7747176401815887,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":80.53469621869499,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":44},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":11},"splitAttr":0,"splitValue":20.823771121091667,"size":16},"splitAttr":3,"splitValue":0.08185778040685489,"size":60},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":7},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.03485627705189094,"size":11},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":56},"splitAttr":1,"splitValue":0.5989744366633851,"size":67},"splitAttr":2,"splitValue":0.4601461496958781,"size":127},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":73},"splitAttr":1,"splitValue":1.94455770014195,"size":200},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":56},"splitAttr":2,"splitValue":1.892083753539799,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":57},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":48.408857877068016,"size":58},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":19},"splitAttr":0,"splitValue":7.436374336682013,"size":21},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":0,"splitValue":27.1545273708167,"size":23},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":175},"splitAttr":1,"splitValue":0.49726958771873986,"size":198},"splitAttr":2,"splitValue":0.17331377510649282,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":58},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":139},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":4},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":16},"splitAttr":1,"splitValue":0.0016824275021889434,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2694634507483018,"size":19},"splitAttr":0,"splitValue":12.457786746184953,"size":23},"splitAttr":3,"splitValue":0.04019895335837297,"size":162},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":14},"splitAttr":1,"splitValue":1.2341308427696422,"size":31},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.10439792483972762,"size":32},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.2541611950835064,"size":4},"splitAttr":3,"splitValue":0.12662711585864414,"size":36},"splitAttr":2,"splitValue":1.8068027404653049,"size":198},"splitAttr":2,"splitValue":0.47365251645657036,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":75},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":69},"splitAttr":1,"splitValue":0.6843578487282118,"size":144},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":112},"splitAttr":1,"splitValue":1.04787872116466,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":254},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.296756655306395,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":149},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":3,"splitValue":null,"size":2},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":7.891772489036387,"size":3},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.27027819225547106,"size":7},"splitAttr":3,"splitValue":0.21215603971901129,"size":156},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":74},"splitAttr":1,"splitValue":1.5663400098835136,"size":230},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":26},"splitAttr":0,"splitValue":40.518329615889144,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":201},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.17926403898939727,"size":202},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.1958556708102756,"size":206},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":50},"splitAttr":2,"splitValue":1.4935857311629253,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":207},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":17},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.06826887072497154,"size":21},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"splitAttr":0,"splitValue":33.27986398413898,"size":26},"splitAttr":2,"splitValue":1.6801804359437158,"size":233},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":7},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":13},"splitAttr":0,"splitValue":5.205589611580348,"size":20},"splitAttr":3,"splitValue":0.10624978790400946,"size":253},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":84.72358420912005,"size":3},"splitAttr":0,"splitValue":82.42137174471901,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":36},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":220},"splitAttr":0,"splitValue":9.499820492796712,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":212},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":44},"splitAttr":2,"splitValue":1.6031290693056017,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":165},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":19},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":13},"splitAttr":0,"splitValue":15.37529429438514,"size":32},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":27},"splitAttr":2,"splitValue":1.4574868617854535,"size":59},"splitAttr":3,"splitValue":0.057835522773905544,"size":224},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":0,"splitValue":12.752864869747626,"size":3},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":28.38920437452901,"size":4},"splitAttr":3,"splitValue":0.2217186704628454,"size":228},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":28},"splitAttr":0,"splitValue":38.62862584744329,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":36},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.1614110502518954,"size":4},"splitAttr":3,"splitValue":0.1164424790508223,"size":40},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.21289444714876393,"size":45},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":14},"splitAttr":2,"splitValue":0.1674208941292843,"size":59},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":12},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":42},"splitAttr":3,"splitValue":0.010895627667325151,"size":54},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":29},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":27},"splitAttr":3,"splitValue":0.01820170758426023,"size":56},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":3,"splitValue":0.0736121906266844,"size":61},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":73},"splitAttr":1,"splitValue":1.5679065107041559,"size":134},"splitAttr":3,"splitValue":0.012784648569546198,"size":188},"splitAttr":1,"splitValue":0.5842951982814877,"size":247},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":9},"splitAttr":1,"splitValue":2.130447860314339,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":88},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":52},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":65},"splitAttr":1,"splitValue":1.6567173505061847,"size":117},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":39},"splitAttr":2,"splitValue":1.5062183324286398,"size":156},"splitAttr":1,"splitValue":0.36681001830682813,"size":244},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":7},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":5},"splitAttr":2,"splitValue":1.1622334287194838,"size":12},"splitAttr":1,"splitValue":2.516646938232622,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":10},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":9},"splitAttr":0,"splitValue":4.358468863504891,"size":19},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":16},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.09674272192713852,"size":19},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":64},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":8},"splitAttr":3,"splitValue":0.086424727296836,"size":72},"splitAttr":0,"splitValue":8.140685771657534,"size":91},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.12021408505505186,"size":94},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":47},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.09429274845878587,"size":4},"splitAttr":3,"splitValue":0.08612636213024331,"size":51},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":8},"splitAttr":2,"splitValue":1.6617984637971763,"size":59},"splitAttr":0,"splitValue":18.812492064508216,"size":153},"splitAttr":0,"splitValue":7.612557635858257,"size":172},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.25951017047707553,"size":3},"splitAttr":3,"splitValue":0.2201374783926,"size":175},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.48389238989975875,"size":176},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":11},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.08124017361273712,"size":15},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.06516471385942887,"size":2},"splitAttr":0,"splitValue":40.6805877251555,"size":17},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":51},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":12},"splitAttr":3,"splitValue":0.037463391310594875,"size":63},"splitAttr":1,"splitValue":1.8780351043535324,"size":80},"splitAttr":0,"splitValue":29.78598806434138,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":9},"splitAttr":0,"splitValue":12.011478044858043,"size":11},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":24},"splitAttr":3,"splitValue":0.03979120289019637,"size":35},"splitAttr":3,"splitValue":0.028231554726716474,"size":40},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":17},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":52},"splitAttr":0,"splitValue":10.511917007815253,"size":69},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":12},"splitAttr":3,"splitValue":0.036450353095731115,"size":81},"splitAttr":2,"splitValue":0.9716327077658213,"size":121},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":9},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":41.0354944420908,"size":10},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":45},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":7},"splitAttr":3,"splitValue":0.027750716577897266,"size":52},"splitAttr":2,"splitValue":0.09069260560655867,"size":62},"right":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":0,"splitValue":49.70871549882598,"size":64},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":0,"splitValue":null,"size":2},"splitAttr":1,"splitValue":1.6678920788679468,"size":4},"splitAttr":2,"splitValue":0.17737230152686445,"size":5},"splitAttr":0,"splitValue":50.05133829651629,"size":69},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.06607061825655096,"size":73},"splitAttr":0,"splitValue":31.879092896682153,"size":194},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":4},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.2632758550658744,"size":6},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":2,"splitValue":0.49633596092256593,"size":7},"splitAttr":3,"splitValue":0.17416892688537208,"size":9},"splitAttr":3,"splitValue":0.12208217446342962,"size":203},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":53},"splitAttr":2,"splitValue":1.3290481887930876,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":36},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":2},"splitAttr":0,"splitValue":41.30883587123608,"size":38},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":93},"splitAttr":2,"splitValue":0.20041035398871498,"size":131},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":67},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":13},"splitAttr":3,"splitValue":0.03908753596740887,"size":80},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.01904945398466017,"size":2},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.875162685631743,"size":4},"splitAttr":1,"splitValue":2.254623510784489,"size":84},"splitAttr":1,"splitValue":1.5378046877489695,"size":215},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":39},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":1,"splitValue":0.32270799373949144,"size":2},"splitAttr":3,"splitValue":0.2621833040292809,"size":41},"splitAttr":3,"splitValue":0.07957786624997337,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":2},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":23},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":36},"splitAttr":0,"splitValue":12.200220474576174,"size":59},"right":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":68.17850348962538,"size":60},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":192},"splitAttr":2,"splitValue":0.7037680654086196,"size":252},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":3,"splitValue":0.5044349451988848,"size":2},"splitAttr":3,"splitValue":0.3335510110789435,"size":254},"splitAttr":2,"splitValue":-0.37409868491452714,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":60},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":196},"splitAttr":2,"splitValue":0.5375578964411918,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":5},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":64},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":31.935613338967872,"size":2},"splitAttr":3,"splitValue":0.17707725915452202,"size":66},"splitAttr":3,"splitValue":0.02940098202396065,"size":71},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":3,"splitValue":0.21935027688882194,"size":73},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":146},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":37},"splitAttr":2,"splitValue":1.9818520395045247,"size":183},"splitAttr":1,"splitValue":0.5124416331220034,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":254},"splitAttr":2,"splitValue":-0.694562336296551,"size":255},"right":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"splitAttr":0,"splitValue":78.74045544798486,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":193},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":61},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":0,"splitValue":75.18588666485599,"size":63},"splitAttr":0,"splitValue":31.4090279741928,"size":256},{"depth":0,"maxDepth":8,"left":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":7},"right":{"depth":3,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":48},"splitAttr":0,"splitValue":4.482189511019696,"size":55},"right":{"depth":2,"maxDepth":8,"left":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":16},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.632077692746353,"size":18},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"right":{"depth":7,"maxDepth":8,"left":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":40},"right":{"depth":8,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":75},"splitAttr":1,"splitValue":1.6633048219758073,"size":115},"splitAttr":1,"splitValue":0.47871571891140263,"size":118},"splitAttr":0,"splitValue":9.060620039980854,"size":136},"right":{"depth":5,"maxDepth":8,"left":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":4},"splitAttr":3,"splitValue":0.05718243709579659,"size":5},"right":{"depth":6,"maxDepth":8,"left":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":9},"right":{"depth":7,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":10},"splitAttr":3,"splitValue":0.060204641800962286,"size":19},"splitAttr":1,"splitValue":0.3381638007352179,"size":24},"splitAttr":3,"splitValue":0.049031333861810696,"size":160},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":5},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":2},"splitAttr":2,"splitValue":1.2581601522916497,"size":7},"splitAttr":1,"splitValue":2.9465241111172835,"size":167},"right":{"depth":3,"maxDepth":8,"left":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":null,"splitValue":null,"size":1},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":1,"splitValue":null,"size":3},"splitAttr":1,"splitValue":0.385929614809021,"size":4},"right":{"depth":4,"maxDepth":8,"left":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":2,"splitValue":null,"size":3},"right":{"depth":5,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":3},"splitAttr":3,"splitValue":0.21257680768484796,"size":6},"splitAttr":3,"splitValue":0.11728708366994596,"size":10},"splitAttr":3,"splitValue":0.08885848982062794,"size":177},"splitAttr":2,"splitValue":0.46872240469532644,"size":232},"right":{"depth":1,"maxDepth":8,"left":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":5,"splitValue":null,"size":21},"right":{"depth":2,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":3},"splitAttr":0,"splitValue":50.77635694038341,"size":24},"splitAttr":0,"splitValue":43.56936005701017,"size":256},{"depth":0,"maxDepth":8,"left":null,"right":null,"splitAttr":4,"splitValue":null,"size":256}]}
package/test/waf.test.js CHANGED
@@ -3,11 +3,12 @@ const express = require('express');
3
3
  const path = require('path');
4
4
 
5
5
  process.env.NODE_ENV = 'test';
6
- jest.setTimeout(15000); // Set global test timeout to 15s
6
+ jest.setTimeout(15000);
7
7
 
8
- const db = require('../utils/db'); // Adjust path if needed
8
+ const db = require('../utils/db');
9
9
  const aiwaf = require('../index');
10
10
  const dynamicKeyword = require('../lib/dynamicKeyword');
11
+ const anomalyDetector = require('../lib/anomalyDetector');
11
12
 
12
13
  beforeAll(async () => {
13
14
  const hasTable = await db.schema.hasTable('blocked_ips');
@@ -100,6 +101,15 @@ describe('AIWAF-JS Middleware', () => {
100
101
  .set('X-Forwarded-For', ip)
101
102
  .expect(403, { error: 'blocked' });
102
103
  });
104
+
105
+ it('flags and blocks anomalous paths', async () => {
106
+ // Fake a long weird path to trigger the anomaly detector
107
+ const longPath = '/' + 'a'.repeat(200);
108
+ await request(app)
109
+ .get(longPath)
110
+ .set('X-Forwarded-For', ip)
111
+ .expect(403, { error: 'blocked' }); // should be flagged as anomalous
112
+ });
103
113
  });
104
114
 
105
- afterAll(() => db.destroy());
115
+ afterAll(() => db.destroy());