js-confuser 1.7.1 → 1.7.3

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.
Files changed (153) hide show
  1. package/.github/workflows/node.js.yml +1 -1
  2. package/CHANGELOG.md +73 -0
  3. package/README.md +32 -31
  4. package/dist/compiler.js +2 -8
  5. package/dist/constants.js +22 -10
  6. package/dist/index.js +15 -30
  7. package/dist/obfuscator.js +15 -62
  8. package/dist/options.js +33 -40
  9. package/dist/order.js +4 -7
  10. package/dist/parser.js +5 -13
  11. package/dist/precedence.js +6 -8
  12. package/dist/presets.js +4 -6
  13. package/dist/probability.js +13 -24
  14. package/dist/templates/bufferToString.js +121 -5
  15. package/dist/templates/core.js +35 -0
  16. package/dist/templates/crash.js +22 -11
  17. package/dist/templates/es5.js +125 -6
  18. package/dist/templates/functionLength.js +24 -6
  19. package/dist/templates/globals.js +9 -0
  20. package/dist/templates/template.js +189 -43
  21. package/dist/transforms/antiTooling.js +26 -22
  22. package/dist/transforms/calculator.js +19 -55
  23. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
  24. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  25. package/dist/transforms/deadCode.js +542 -31
  26. package/dist/transforms/dispatcher.js +112 -112
  27. package/dist/transforms/es5/antiClass.js +70 -44
  28. package/dist/transforms/es5/antiDestructuring.js +14 -38
  29. package/dist/transforms/es5/antiES6Object.js +39 -48
  30. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  31. package/dist/transforms/es5/antiTemplate.js +10 -19
  32. package/dist/transforms/es5/es5.js +7 -40
  33. package/dist/transforms/extraction/classExtraction.js +83 -0
  34. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  35. package/dist/transforms/extraction/objectExtraction.js +24 -56
  36. package/dist/transforms/finalizer.js +6 -20
  37. package/dist/transforms/flatten.js +51 -99
  38. package/dist/transforms/identifier/globalAnalysis.js +21 -26
  39. package/dist/transforms/identifier/globalConcealing.js +72 -56
  40. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  41. package/dist/transforms/identifier/renameVariables.js +36 -68
  42. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  43. package/dist/transforms/lock/antiDebug.js +20 -25
  44. package/dist/transforms/lock/integrity.js +53 -52
  45. package/dist/transforms/lock/lock.js +161 -126
  46. package/dist/transforms/minify.js +77 -108
  47. package/dist/transforms/opaquePredicates.js +12 -49
  48. package/dist/transforms/preparation.js +28 -49
  49. package/dist/transforms/renameLabels.js +5 -22
  50. package/dist/transforms/rgf.js +125 -72
  51. package/dist/transforms/shuffle.js +42 -47
  52. package/dist/transforms/stack.js +41 -98
  53. package/dist/transforms/string/encoding.js +76 -27
  54. package/dist/transforms/string/stringCompression.js +75 -68
  55. package/dist/transforms/string/stringConcealing.js +127 -135
  56. package/dist/transforms/string/stringEncoding.js +6 -26
  57. package/dist/transforms/string/stringSplitting.js +5 -30
  58. package/dist/transforms/transform.js +76 -104
  59. package/dist/traverse.js +11 -18
  60. package/dist/util/compare.js +27 -29
  61. package/dist/util/gen.js +32 -86
  62. package/dist/util/guard.js +5 -1
  63. package/dist/util/identifiers.js +9 -72
  64. package/dist/util/insert.js +27 -77
  65. package/dist/util/math.js +0 -3
  66. package/dist/util/object.js +3 -7
  67. package/dist/util/random.js +31 -36
  68. package/dist/util/scope.js +6 -3
  69. package/docs/Countermeasures.md +13 -6
  70. package/docs/Integrity.md +35 -28
  71. package/docs/RGF.md +6 -1
  72. package/docs/RenameVariables.md +116 -0
  73. package/docs/TamperProtection.md +100 -0
  74. package/docs/Template.md +117 -0
  75. package/package.json +3 -3
  76. package/src/constants.ts +17 -0
  77. package/src/index.ts +7 -5
  78. package/src/options.ts +60 -7
  79. package/src/order.ts +2 -2
  80. package/src/templates/bufferToString.ts +79 -11
  81. package/src/templates/core.ts +29 -0
  82. package/src/templates/crash.ts +6 -38
  83. package/src/templates/es5.ts +1 -1
  84. package/src/templates/functionLength.ts +21 -3
  85. package/src/templates/globals.ts +3 -0
  86. package/src/templates/template.ts +205 -46
  87. package/src/transforms/antiTooling.ts +33 -11
  88. package/src/transforms/calculator.ts +4 -2
  89. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
  90. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  91. package/src/transforms/deadCode.ts +74 -42
  92. package/src/transforms/dispatcher.ts +99 -73
  93. package/src/transforms/es5/antiClass.ts +25 -12
  94. package/src/transforms/es5/antiDestructuring.ts +1 -1
  95. package/src/transforms/es5/antiES6Object.ts +2 -2
  96. package/src/transforms/es5/antiTemplate.ts +1 -1
  97. package/src/transforms/extraction/classExtraction.ts +168 -0
  98. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
  99. package/src/transforms/extraction/objectExtraction.ts +4 -15
  100. package/src/transforms/flatten.ts +20 -5
  101. package/src/transforms/identifier/globalAnalysis.ts +18 -1
  102. package/src/transforms/identifier/globalConcealing.ts +119 -72
  103. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  104. package/src/transforms/identifier/renameVariables.ts +16 -1
  105. package/src/transforms/lock/antiDebug.ts +2 -2
  106. package/src/transforms/lock/integrity.ts +13 -11
  107. package/src/transforms/lock/lock.ts +122 -30
  108. package/src/transforms/minify.ts +28 -13
  109. package/src/transforms/opaquePredicates.ts +2 -2
  110. package/src/transforms/preparation.ts +16 -0
  111. package/src/transforms/rgf.ts +139 -12
  112. package/src/transforms/shuffle.ts +3 -3
  113. package/src/transforms/stack.ts +19 -4
  114. package/src/transforms/string/encoding.ts +88 -51
  115. package/src/transforms/string/stringCompression.ts +86 -17
  116. package/src/transforms/string/stringConcealing.ts +148 -118
  117. package/src/transforms/string/stringEncoding.ts +1 -2
  118. package/src/transforms/string/stringSplitting.ts +1 -2
  119. package/src/transforms/transform.ts +63 -46
  120. package/src/types.ts +2 -0
  121. package/src/util/compare.ts +39 -5
  122. package/src/util/gen.ts +10 -3
  123. package/src/util/guard.ts +10 -0
  124. package/src/util/insert.ts +17 -0
  125. package/src/util/random.ts +81 -1
  126. package/src/util/scope.ts +14 -2
  127. package/test/code/Cash.test.ts +94 -5
  128. package/test/code/StrictMode.src.js +65 -0
  129. package/test/code/StrictMode.test.js +37 -0
  130. package/test/compare.test.ts +62 -2
  131. package/test/options.test.ts +129 -55
  132. package/test/templates/template.test.ts +211 -1
  133. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  134. package/test/transforms/dispatcher.test.ts +55 -0
  135. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  136. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  137. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  138. package/test/transforms/identifier/globalConcealing.test.ts +89 -0
  139. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  140. package/test/transforms/identifier/renameVariables.test.ts +75 -1
  141. package/test/transforms/lock/tamperProtection.test.ts +336 -0
  142. package/test/transforms/minify.test.ts +37 -0
  143. package/test/transforms/rgf.test.ts +50 -0
  144. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  145. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  146. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  147. package/dist/transforms/eval.js +0 -84
  148. package/dist/transforms/hexadecimalNumbers.js +0 -63
  149. package/dist/transforms/hideInitializingCode.js +0 -270
  150. package/dist/transforms/identifier/nameRecycling.js +0 -218
  151. package/dist/transforms/label.js +0 -67
  152. package/dist/transforms/preparation/nameConflicts.js +0 -116
  153. package/dist/transforms/preparation/preparation.js +0 -188
@@ -4,84 +4,595 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _order = require("../order");
9
-
10
8
  var _probability = require("../probability");
11
-
12
9
  var _template = _interopRequireDefault(require("../templates/template"));
13
-
14
10
  var _traverse = require("../traverse");
15
-
16
11
  var _gen = require("../util/gen");
17
-
18
12
  var _insert = require("../util/insert");
19
-
20
13
  var _random = require("../util/random");
21
-
22
14
  var _transform = _interopRequireDefault(require("./transform"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ const templates = [new _template.default(`
20
+ function curCSS( elem, name, computed ) {
21
+ var ret;
22
+
23
+ computed = computed || getStyles( elem );
24
+
25
+ if ( computed ) {
26
+ ret = computed.getPropertyValue( name ) || computed[ name ];
27
+
28
+ if ( ret === "" && !isAttached( elem ) ) {
29
+ ret = redacted.style( elem, name );
30
+ }
31
+ }
32
+
33
+ return ret !== undefined ?
34
+
35
+ // Support: IE <=9 - 11+
36
+ // IE returns zIndex value as an integer.
37
+ ret + "" :
38
+ ret;
39
+ }`), new _template.default(`
40
+ function Example() {
41
+ var state = redacted.useState(false);
42
+ return x(
43
+ ErrorBoundary,
44
+ null,
45
+ x(
46
+ DisplayName,
47
+ null,
48
+ )
49
+ );
50
+ }`), new _template.default(`
51
+ const path = require('path');
52
+ const { version } = require('../../package');
53
+ const { version: dashboardPluginVersion } = require('@redacted/enterprise-plugin/package');
54
+ const { version: componentsVersion } = require('@redacted/components/package');
55
+ const { sdkVersion } = require('@redacted/enterprise-plugin');
56
+ const isStandaloneExecutable = require('../utils/isStandaloneExecutable');
57
+ const resolveLocalRedactedPath = require('./resolve-local-redacted-path');
58
+
59
+ const redactedPath = path.resolve(__dirname, '../redacted.js');`), new _template.default(`
60
+ module.exports = async (resolveLocalRedactedPath = ()=>{throw new Error("No redacted path provided")}) => {
61
+ const cliParams = new Set(process.argv.slice(2));
62
+ if (!cliParams.has('--version')) {
63
+ if (cliParams.size !== 1) return false;
64
+ if (!cliParams.has('-v')) return false;
65
+ }
66
+
67
+ const installationModePostfix = await (async (isStandaloneExecutable, redactedPath) => {
68
+ if (isStandaloneExecutable) return ' (standalone)';
69
+ if (redactedPath === (await resolveLocalRedactedPath())) return ' (local)';
70
+ return '';
71
+ })();
72
+
73
+ return true;
74
+ };`), new _template.default(`
75
+ function setCookie(cname, cvalue, exdays) {
76
+ var d = new Date();
77
+ d.setTime(d.getTime() + (exdays*24*60*60*1000));
78
+ var expires = "expires="+ d.toUTCString();
79
+ document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
80
+ }`), new _template.default(`function getCookie(cname) {
81
+ var name = cname + "=";
82
+ var decodedCookie = decodeURIComponent(document.cookie);
83
+ var ca = decodedCookie.split(';');
84
+ for(var i = 0; i <ca.length; i++) {
85
+ var c = ca[i];
86
+ while (c.charAt(0) == ' ') {
87
+ c = c.substring(1);
88
+ }
89
+ if (c.indexOf(name) == 0) {
90
+ return c.substring(name.length, c.length);
91
+ }
92
+ }
93
+ return "";
94
+ }`), new _template.default(`function getLocalStorageValue(key, cb){
95
+ if ( typeof key !== "string" ) {
96
+ throw new Error("Invalid data key provided (not type string)")
97
+ }
98
+ if ( !key ) {
99
+ throw new Error("Invalid data key provided (empty string)")
100
+ }
101
+ var value = window.localStorage.getItem(key)
102
+ try {
103
+ value = JSON.parse(value)
104
+ } catch ( e ) {
105
+ cb(new Error("Serialization error for data '" + key + "': " + e.message))
106
+ }
107
+
108
+ cb(null, value)
109
+ }`), new _template.default(`
110
+
111
+ var __ = "(c=ak(<~F$VU'9f)~><&85dBPL-module/from";
112
+ var s = "q:function(){var ad=ad=>b(ad-29);if(!T.r[(typeof ab==ad(123)?";
113
+ var g = "return U[c[c[d(-199)]-b(205)]]||V[ae(b(166))];case T.o[c[c[c[d(-199)]+d(-174)]-(c[b(119)]-(c[d(-199)]-163))]+ae(b(146))](0)==b(167)?d(-130):-d(-144)";
114
+
115
+ __.match(s + g);
116
+ `), new _template.default(`
117
+ function vec_pack(vec) {
118
+ return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);
119
+ }
120
+
121
+ function vec_unpack(number) {
122
+ switch (((number & 33554432) !== 0) * 1 + (number < 0) * 2) {
123
+ case 0:
124
+ return [number % 33554432, Math.trunc(number / 67108864)];
125
+ case 1:
126
+ return [
127
+ (number % 33554432) - 33554432,
128
+ Math.trunc(number / 67108864) + 1,
129
+ ];
130
+ case 2:
131
+ return [
132
+ (((number + 33554432) % 33554432) + 33554432) % 33554432,
133
+ Math.round(number / 67108864),
134
+ ];
135
+ case 3:
136
+ return [number % 33554432, Math.trunc(number / 67108864)];
137
+ }
138
+ }
139
+
140
+ let a = vec_pack([2, 4]);
141
+ let b = vec_pack([1, 2]);
142
+
143
+ let c = a + b; // Vector addition
144
+ let d = c - b; // Vector subtraction
145
+ let e = d * 2; // Scalar multiplication
146
+ let f = e / 2; // Scalar division
147
+
148
+ console.log(vec_unpack(c)); // [3, 6]
149
+ console.log(vec_unpack(d)); // [2, 4]
150
+ console.log(vec_unpack(e)); // [4, 8]
151
+ console.log(vec_unpack(f)); // [2, 4]
152
+ `), new _template.default(`
153
+ function buildCharacterMap(str) {
154
+ const characterMap = {};
155
+
156
+ for (let char of str.replace(/[^\w]/g, "").toLowerCase())
157
+ characterMap[char] = characterMap[char] + 1 || 1;
158
+
159
+ return characterMap;
160
+ }
161
+
162
+ function isAnagrams(stringA, stringB) {
163
+ const stringAMap = buildCharMap(stringA);
164
+ const stringBMap = buildCharMap(stringB);
165
+
166
+ for (let char in stringAMap) {
167
+ if (stringAMap[char] !== stringBMap[char]) {
168
+ return false;
169
+ }
170
+ }
171
+
172
+ if (Object.keys(stringAMap).length !== Object.keys(stringBMap).length) {
173
+ return false;
174
+ }
175
+
176
+ return true;
177
+ }
178
+
179
+ function isBalanced(root) {
180
+ const height = getHeightBalanced(root);
181
+ return height !== Infinity;
182
+ }
183
+
184
+ function getHeightBalanced(node) {
185
+ if (!node) {
186
+ return -1;
187
+ }
188
+
189
+ const leftTreeHeight = getHeightBalanced(node.left);
190
+ const rightTreeHeight = getHeightBalanced(node.right);
191
+
192
+ const heightDiff = Math.abs(leftTreeHeight - rightTreeHeight);
193
+
194
+ if (
195
+ leftTreeHeight === Infinity ||
196
+ rightTreeHeight === Infinity ||
197
+ heightDiff > 1
198
+ ) {
199
+ return Infinity;
200
+ }
201
+
202
+ const currentHeight = Math.max(leftTreeHeight, rightTreeHeight) + 1;
203
+ return currentHeight;
204
+ }
205
+
206
+ window["__GLOBAL__HELPERS__"] = {
207
+ buildCharacterMap,
208
+ isAnagrams,
209
+ isBalanced,
210
+ getHeightBalanced,
211
+ };
212
+ `), new _template.default(`
213
+ function ListNode(){}
214
+ var addTwoNumbers = function(l1, l2) {
215
+ var carry = 0;
216
+ var sum = 0;
217
+ var head = new ListNode(0);
218
+ var now = head;
219
+ var a = l1;
220
+ var b = l2;
221
+ while (a !== null || b !== null) {
222
+ sum = (a ? a.val : 0) + (b ? b.val : 0) + carry;
223
+ carry = Math.floor(sum / 10);
224
+ now.next = new ListNode(sum % 10);
225
+ now = now.next;
226
+ a = a ? a.next : null;
227
+ b = b ? b.next : null;
228
+ }
229
+ if (carry) now.next = new ListNode(carry);
230
+ return head.next;
231
+ };
232
+
233
+ console.log(addTwoNumbers)
234
+ `), new _template.default(`
235
+ var threeSum = function(nums) {
236
+ var len = nums.length;
237
+ var res = [];
238
+ var l = 0;
239
+ var r = 0;
240
+ nums.sort((a, b) => (a - b));
241
+ for (var i = 0; i < len; i++) {
242
+ if (i > 0 && nums[i] === nums[i - 1]) continue;
243
+ l = i + 1;
244
+ r = len - 1;
245
+ while (l < r) {
246
+ if (nums[i] + nums[l] + nums[r] < 0) {
247
+ l++;
248
+ } else if (nums[i] + nums[l] + nums[r] > 0) {
249
+ r--;
250
+ } else {
251
+ res.push([nums[i], nums[l], nums[r]]);
252
+ while (l < r && nums[l] === nums[l + 1]) l++;
253
+ while (l < r && nums[r] === nums[r - 1]) r--;
254
+ l++;
255
+ r--;
256
+ }
257
+ }
258
+ }
259
+ return res;
260
+ };
261
+ console.log(threeSum)
262
+ `), new _template.default(`
263
+ var combinationSum2 = function(candidates, target) {
264
+ var res = [];
265
+ var len = candidates.length;
266
+ candidates.sort((a, b) => (a - b));
267
+ dfs(res, [], 0, len, candidates, target);
268
+ return res;
269
+ };
270
+
271
+ var dfs = function (res, stack, index, len, candidates, target) {
272
+ var tmp = null;
273
+ if (target < 0) return;
274
+ if (target === 0) return res.push(stack);
275
+ for (var i = index; i < len; i++) {
276
+ if (candidates[i] > target) break;
277
+ if (i > index && candidates[i] === candidates[i - 1]) continue;
278
+ tmp = Array.from(stack);
279
+ tmp.push(candidates[i]);
280
+ dfs(res, tmp, i + 1, len, candidates, target - candidates[i]);
281
+ }
282
+ };
283
+
284
+ console.log(combinationSum2);
285
+ `), new _template.default(`
286
+ var isScramble = function(s1, s2) {
287
+ return helper({}, s1, s2);
288
+ };
289
+
290
+ var helper = function (dp, s1, s2) {
291
+ var map = {};
292
+
293
+ if (dp[s1 + s2] !== undefined) return dp[s1 + s2];
294
+ if (s1 === s2) return true;
295
+
296
+ for (var j = 0; j < s1.length; j++) {
297
+ if (map[s1[j]] === undefined) map[s1[j]] = 0;
298
+ if (map[s2[j]] === undefined) map[s2[j]] = 0;
299
+ map[s1[j]]++;
300
+ map[s2[j]]--;
301
+ }
302
+
303
+ for (var key in map) {
304
+ if (map[key] !== 0) {
305
+ dp[s1 + s2] = false;
306
+ return false;
307
+ }
308
+ }
309
+
310
+ for (var i = 1; i < s1.length; i++) {
311
+ if ((helper(dp, s1.substr(0, i), s2.substr(0, i))
312
+ && helper(dp, s1.substr(i), s2.substr(i))) ||
313
+ (helper(dp, s1.substr(0, i), s2.substr(s2.length - i))
314
+ && helper(dp, s1.substr(i), s2.substr(0, s2.length - i)))) {
315
+ dp[s1 + s2] = true;
316
+ return true;
317
+ }
318
+ }
319
+
320
+ dp[s1 + s2] = false;
321
+ return false;
322
+ };
23
323
 
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
324
+ console.log(isScramble);
325
+ `), new _template.default(`
326
+ var candy = function(ratings) {
327
+ var len = ratings.length;
328
+ var res = [];
329
+ var sum = 0;
330
+ for (var i = 0; i < len; i++) {
331
+ res.push((i !== 0 && ratings[i] > ratings[i - 1]) ? (res[i - 1] + 1) : 1);
332
+ }
333
+ for (var j = len - 1; j >= 0; j--) {
334
+ if (j !== len - 1 && ratings[j] > ratings[j + 1]) res[j] = Math.max(res[j], res[j + 1] + 1);
335
+ sum += res[j];
336
+ }
337
+ return sum;
338
+ };
339
+
340
+ console.log(candy)
341
+ `), new _template.default(`
342
+ var maxPoints = function(points) {
343
+ var max = 0;
344
+ var map = {};
345
+ var localMax = 0;
346
+ var samePoint = 0;
347
+ var k = 0;
348
+ var len = points.length;
349
+ for (var i = 0; i < len; i++) {
350
+ map = {};
351
+ localMax = 0;
352
+ samePoint = 1;
353
+ for (var j = i + 1; j < len; j++) {
354
+ if (points[i].x === points[j].x && points[i].y === points[j].y) {
355
+ samePoint++;
356
+ continue;
357
+ }
358
+ if (points[i].y === points[j].y) k = Number.MAX_SAFE_INTEGER;
359
+ else k = (points[i].x - points[j].x) / (points[i].y - points[j].y);
360
+ if (!map[k]) map[k] = 0;
361
+ map[k]++;
362
+ localMax = Math.max(localMax, map[k]);
363
+ }
364
+ localMax += samePoint;
365
+ max = Math.max(max, localMax);
366
+ }
367
+ return max;
368
+ };
369
+
370
+ console.log(maxPoints)
371
+ `), new _template.default(`
372
+ var maximumGap = function(nums) {
373
+ var len = nums.length;
374
+ if (len < 2) return 0;
375
+
376
+ var max = Math.max(...nums);
377
+ var min = Math.min(...nums);
378
+ if (max === min) return 0;
379
+
380
+ var minBuckets = Array(len - 1).fill(Number.MAX_SAFE_INTEGER);
381
+ var maxBuckets = Array(len - 1).fill(Number.MIN_SAFE_INTEGER);
382
+ var gap = Math.ceil((max - min) / (len - 1));
383
+ var index = 0;
384
+ for (var i = 0; i < len; i++) {
385
+ if (nums[i] === min || nums[i] === max) continue;
386
+ index = Math.floor((nums[i] - min) / gap);
387
+ minBuckets[index] = Math.min(minBuckets[index], nums[i]);
388
+ maxBuckets[index] = Math.max(maxBuckets[index], nums[i]);
389
+ }
390
+
391
+ var maxGap = Number.MIN_SAFE_INTEGER;
392
+ var preVal = min;
393
+ for (var j = 0; j < len - 1; j++) {
394
+ if (minBuckets[j] === Number.MAX_SAFE_INTEGER && maxBuckets[j] === Number.MIN_SAFE_INTEGER) continue;
395
+ maxGap = Math.max(maxGap, minBuckets[j] - preVal);
396
+ preVal = maxBuckets[j];
397
+ }
398
+ maxGap = Math.max(maxGap, max - preVal);
399
+
400
+ return maxGap;
401
+ };
25
402
 
26
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
403
+ console.log(maximumGap);
404
+ `), new _template.default(`
405
+ var LRUCache = function(capacity) {
406
+ this.capacity = capacity;
407
+ this.length = 0;
408
+ this.map = {};
409
+ this.head = null;
410
+ this.tail = null;
411
+ };
412
+
413
+ LRUCache.prototype.get = function(key) {
414
+ var node = this.map[key];
415
+ if (node) {
416
+ this.remove(node);
417
+ this.insert(node.key, node.val);
418
+ return node.val;
419
+ } else {
420
+ return -1;
421
+ }
422
+ };
423
+
424
+ LRUCache.prototype.put = function(key, value) {
425
+ if (this.map[key]) {
426
+ this.remove(this.map[key]);
427
+ this.insert(key, value);
428
+ } else {
429
+ if (this.length === this.capacity) {
430
+ this.remove(this.head);
431
+ this.insert(key, value);
432
+ } else {
433
+ this.insert(key, value);
434
+ this.length++;
435
+ }
436
+ }
437
+ };
438
+
439
+ /**
440
+ * Your LRUCache object will be instantiated and called as such:
441
+ * var obj = Object.create(LRUCache).createNew(capacity)
442
+ * var param_1 = obj.get(key)
443
+ * obj.put(key,value)
444
+ */
445
+
446
+ LRUCache.prototype.remove = function (node) {
447
+ var prev = node.prev;
448
+ var next = node.next;
449
+ if (next) next.prev = prev;
450
+ if (prev) prev.next = next;
451
+ if (this.head === node) this.head = next;
452
+ if (this.tail === node) this.tail = prev;
453
+ delete this.map[node.key];
454
+ };
455
+
456
+ LRUCache.prototype.insert = function (key, val) {
457
+ var node = new List(key, val);
458
+ if (!this.tail) {
459
+ this.tail = node;
460
+ this.head = node;
461
+ } else {
462
+ this.tail.next = node;
463
+ node.prev = this.tail;
464
+ this.tail = node;
465
+ }
466
+ this.map[key] = node;
467
+ };
468
+
469
+ console.log(LRUCache);
470
+ `), new _template.default(`
471
+ var isInterleave = function(s1, s2, s3) {
472
+ var dp = {};
473
+ if (s3.length !== s1.length + s2.length) return false;
474
+ return helper(s1, s2, s3, 0, 0, 0, dp);
475
+ };
476
+
477
+ var helper = function (s1, s2, s3, i, j, k, dp) {
478
+ var res = false;
479
+
480
+ if (k >= s3.length) return true;
481
+ if (dp['' + i + j + k] !== undefined) return dp['' + i + j + k];
482
+
483
+ if (s3[k] === s1[i] && s3[k] === s2[j]) {
484
+ res = helper(s1, s2, s3, i + 1, j, k + 1, dp) || helper(s1, s2, s3, i, j + 1, k + 1, dp);
485
+ } else if (s3[k] === s1[i]) {
486
+ res = helper(s1, s2, s3, i + 1, j, k + 1, dp);
487
+ } else if (s3[k] === s2[j]) {
488
+ res = helper(s1, s2, s3, i, j + 1, k + 1, dp);
489
+ }
490
+
491
+ dp['' + i + j + k] = res;
492
+
493
+ return res;
494
+ };
495
+
496
+ console.log(isInterleave);
497
+ `), new _template.default(`
498
+ var solveNQueens = function(n) {
499
+ var res = [];
500
+ if (n === 1 || n >= 4) dfs(res, [], n, 0);
501
+ return res;
502
+ };
503
+
504
+ var dfs = function (res, points, n, index) {
505
+ for (var i = index; i < n; i++) {
506
+ if (points.length !== i) return;
507
+ for (var j = 0; j < n; j++) {
508
+ if (isValid(points, [i, j])) {
509
+ points.push([i, j]);
510
+ dfs(res, points, n, i + 1);
511
+ if (points.length === n) res.push(buildRes(points));
512
+ points.pop();
513
+ }
514
+ }
515
+ }
516
+ };
517
+
518
+ var buildRes = function (points) {
519
+ var res = [];
520
+ var n = points.length;
521
+ for (var i = 0; i < n; i++) {
522
+ res[i] = '';
523
+ for (var j = 0; j < n; j++) {
524
+ res[i] += (points[i][1] === j ? 'Q' : '.');
525
+ }
526
+ }
527
+ return res;
528
+ };
529
+
530
+ var isValid = function (oldPoints, newPoint) {
531
+ var len = oldPoints.length;
532
+ for (var i = 0; i < len; i++) {
533
+ if (oldPoints[i][0] === newPoint[0] || oldPoints[i][1] === newPoint[1]) return false;
534
+ if (Math.abs((oldPoints[i][0] - newPoint[0]) / (oldPoints[i][1] - newPoint[1])) === 1) return false;
535
+ }
536
+ return true;
537
+ };
538
+
539
+ console.log(solveNQueens);
540
+ `)];
27
541
 
28
- const templates = [(0, _template.default)("\n function curCSS( elem, name, computed ) {\n var ret;\n \n computed = computed || getStyles( elem );\n \n if ( computed ) {\n ret = computed.getPropertyValue( name ) || computed[ name ];\n \n if ( ret === \"\" && !isAttached( elem ) ) {\n ret = redacted.style( elem, name );\n }\n }\n \n return ret !== undefined ?\n \n // Support: IE <=9 - 11+\n // IE returns zIndex value as an integer.\n ret + \"\" :\n ret;\n }"), (0, _template.default)("\n function Example() {\n var state = redacted.useState(false);\n return x(\n ErrorBoundary,\n null,\n x(\n DisplayName,\n null,\n )\n );\n }"), (0, _template.default)("\n const path = require('path');\nconst { version } = require('../../package');\nconst { version: dashboardPluginVersion } = require('@redacted/enterprise-plugin/package');\nconst { version: componentsVersion } = require('@redacted/components/package');\nconst { sdkVersion } = require('@redacted/enterprise-plugin');\nconst isStandaloneExecutable = require('../utils/isStandaloneExecutable');\nconst resolveLocalRedactedPath = require('./resolve-local-redacted-path');\n\nconst redactedPath = path.resolve(__dirname, '../redacted.js');"), (0, _template.default)("\nmodule.exports = async (resolveLocalRedactedPath = ()=>{throw new Error(\"No redacted path provided\")}) => {\n const cliParams = new Set(process.argv.slice(2));\n if (!cliParams.has('--version')) {\n if (cliParams.size !== 1) return false;\n if (!cliParams.has('-v')) return false;\n }\n\n const installationModePostfix = await (async (isStandaloneExecutable, redactedPath) => {\n if (isStandaloneExecutable) return ' (standalone)';\n if (redactedPath === (await resolveLocalRedactedPath())) return ' (local)';\n return '';\n })();\n\n return true;\n};"), (0, _template.default)("\nfunction setCookie(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() + (exdays*24*60*60*1000));\n var expires = \"expires=\"+ d.toUTCString();\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\n}"), (0, _template.default)("function getCookie(cname) {\n var name = cname + \"=\";\n var decodedCookie = decodeURIComponent(document.cookie);\n var ca = decodedCookie.split(';');\n for(var i = 0; i <ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) == ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) == 0) {\n return c.substring(name.length, c.length);\n }\n }\n return \"\";\n}"), (0, _template.default)("function getLocalStorageValue(key, cb){\n if ( typeof key !== \"string\" ) {\n throw new Error(\"Invalid data key provided (not type string)\")\n }\n if ( !key ) {\n throw new Error(\"Invalid data key provided (empty string)\")\n }\n var value = window.localStorage.getItem(key)\n try {\n value = JSON.parse(value)\n } catch ( e ) {\n cb(new Error(\"Serialization error for data '\" + key + \"': \" + e.message))\n }\n\n cb(null, value)\n }"), (0, _template.default)("\n \n var __ = \"(c=ak(<~F$VU'9f)~><&85dBPL-module/from\";\n var s = \"q:function(){var ad=ad=>b(ad-29);if(!T.r[(typeof ab==ad(123)?\";\n var g = \"return U[c[c[d(-199)]-b(205)]]||V[ae(b(166))];case T.o[c[c[c[d(-199)]+d(-174)]-(c[b(119)]-(c[d(-199)]-163))]+ae(b(146))](0)==b(167)?d(-130):-d(-144)\";\n\n __.match(s + g);\n "), (0, _template.default)("\n function vec_pack(vec) {\n return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);\n }\n \n function vec_unpack(number) {\n switch (((number & 33554432) !== 0) * 1 + (number < 0) * 2) {\n case 0:\n return [number % 33554432, Math.trunc(number / 67108864)];\n case 1:\n return [\n (number % 33554432) - 33554432,\n Math.trunc(number / 67108864) + 1,\n ];\n case 2:\n return [\n (((number + 33554432) % 33554432) + 33554432) % 33554432,\n Math.round(number / 67108864),\n ];\n case 3:\n return [number % 33554432, Math.trunc(number / 67108864)];\n }\n }\n \n let a = vec_pack([2, 4]);\n let b = vec_pack([1, 2]);\n \n let c = a + b; // Vector addition\n let d = c - b; // Vector subtraction\n let e = d * 2; // Scalar multiplication\n let f = e / 2; // Scalar division\n \n console.log(vec_unpack(c)); // [3, 6]\n console.log(vec_unpack(d)); // [2, 4]\n console.log(vec_unpack(e)); // [4, 8]\n console.log(vec_unpack(f)); // [2, 4]\n "), (0, _template.default)("\n function buildCharacterMap(str) {\n const characterMap = {};\n \n for (let char of str.replace(/[^w]/g, \"\").toLowerCase())\n characterMap[char] = characterMap[char] + 1 || 1;\n \n return characterMap;\n }\n \n function isAnagrams(stringA, stringB) {\n const stringAMap = buildCharMap(stringA);\n const stringBMap = buildCharMap(stringB);\n \n for (let char in stringAMap) {\n if (stringAMap[char] !== stringBMap[char]) {\n return false;\n }\n }\n \n if (Object.keys(stringAMap).length !== Object.keys(stringBMap).length) {\n return false;\n }\n \n return true;\n }\n \n /**\n * @param {TreeNode} root\n * @return {boolean}\n */\n function isBalanced(root) {\n const height = getHeightBalanced(root);\n return height !== Infinity;\n }\n \n function getHeightBalanced(node) {\n if (!node) {\n return -1;\n }\n \n const leftTreeHeight = getHeightBalanced(node.left);\n const rightTreeHeight = getHeightBalanced(node.right);\n \n const heightDiff = Math.abs(leftTreeHeight - rightTreeHeight);\n \n if (\n leftTreeHeight === Infinity ||\n rightTreeHeight === Infinity ||\n heightDiff > 1\n ) {\n return Infinity;\n }\n \n const currentHeight = Math.max(leftTreeHeight, rightTreeHeight) + 1;\n return currentHeight;\n }\n \n window[\"__GLOBAL__HELPERS__\"] = {\n buildCharacterMap,\n isAnagrams,\n isBalanced,\n getHeightBalanced,\n };\n "), (0, _template.default)("\n function ListNode(){}\n var addTwoNumbers = function(l1, l2) {\n var carry = 0;\n var sum = 0;\n var head = new ListNode(0);\n var now = head;\n var a = l1;\n var b = l2;\n while (a !== null || b !== null) {\n sum = (a ? a.val : 0) + (b ? b.val : 0) + carry;\n carry = Math.floor(sum / 10);\n now.next = new ListNode(sum % 10);\n now = now.next;\n a = a ? a.next : null;\n b = b ? b.next : null;\n }\n if (carry) now.next = new ListNode(carry);\n return head.next;\n };\n\n console.log(addTwoNumbers)\n "), (0, _template.default)("\n var threeSum = function(nums) {\n var len = nums.length;\n var res = [];\n var l = 0;\n var r = 0;\n nums.sort((a, b) => (a - b));\n for (var i = 0; i < len; i++) {\n if (i > 0 && nums[i] === nums[i - 1]) continue;\n l = i + 1;\n r = len - 1;\n while (l < r) {\n if (nums[i] + nums[l] + nums[r] < 0) {\n l++;\n } else if (nums[i] + nums[l] + nums[r] > 0) {\n r--;\n } else {\n res.push([nums[i], nums[l], nums[r]]);\n while (l < r && nums[l] === nums[l + 1]) l++;\n while (l < r && nums[r] === nums[r - 1]) r--;\n l++;\n r--;\n }\n }\n }\n return res;\n };\n console.log(threeSum)\n "), (0, _template.default)("\n var combinationSum2 = function(candidates, target) {\n var res = [];\n var len = candidates.length;\n candidates.sort((a, b) => (a - b));\n dfs(res, [], 0, len, candidates, target);\n return res;\n };\n\n var dfs = function (res, stack, index, len, candidates, target) {\n var tmp = null;\n if (target < 0) return;\n if (target === 0) return res.push(stack);\n for (var i = index; i < len; i++) {\n if (candidates[i] > target) break;\n if (i > index && candidates[i] === candidates[i - 1]) continue;\n tmp = Array.from(stack);\n tmp.push(candidates[i]);\n dfs(res, tmp, i + 1, len, candidates, target - candidates[i]);\n }\n };\n\n console.log(combinationSum2);\n "), (0, _template.default)("\n var isScramble = function(s1, s2) {\n return helper({}, s1, s2);\n };\n \n var helper = function (dp, s1, s2) {\n var map = {};\n \n if (dp[s1 + s2] !== undefined) return dp[s1 + s2];\n if (s1 === s2) return true;\n \n for (var j = 0; j < s1.length; j++) {\n if (map[s1[j]] === undefined) map[s1[j]] = 0;\n if (map[s2[j]] === undefined) map[s2[j]] = 0;\n map[s1[j]]++;\n map[s2[j]]--;\n }\n \n for (var key in map) {\n if (map[key] !== 0) {\n dp[s1 + s2] = false;\n return false;\n }\n }\n \n for (var i = 1; i < s1.length; i++) {\n if ((helper(dp, s1.substr(0, i), s2.substr(0, i))\n && helper(dp, s1.substr(i), s2.substr(i))) ||\n (helper(dp, s1.substr(0, i), s2.substr(s2.length - i))\n && helper(dp, s1.substr(i), s2.substr(0, s2.length - i)))) {\n dp[s1 + s2] = true;\n return true;\n }\n }\n \n dp[s1 + s2] = false;\n return false;\n };\n\n console.log(isScramble);\n "), (0, _template.default)("\n var candy = function(ratings) {\n var len = ratings.length;\n var res = [];\n var sum = 0;\n for (var i = 0; i < len; i++) {\n res.push((i !== 0 && ratings[i] > ratings[i - 1]) ? (res[i - 1] + 1) : 1);\n }\n for (var j = len - 1; j >= 0; j--) {\n if (j !== len - 1 && ratings[j] > ratings[j + 1]) res[j] = Math.max(res[j], res[j + 1] + 1);\n sum += res[j];\n }\n return sum;\n };\n \n console.log(candy)\n "), (0, _template.default)("\n var maxPoints = function(points) {\n var max = 0;\n var map = {};\n var localMax = 0;\n var samePoint = 0;\n var k = 0;\n var len = points.length;\n for (var i = 0; i < len; i++) {\n map = {};\n localMax = 0;\n samePoint = 1;\n for (var j = i + 1; j < len; j++) {\n if (points[i].x === points[j].x && points[i].y === points[j].y) {\n samePoint++;\n continue;\n }\n if (points[i].y === points[j].y) k = Number.MAX_SAFE_INTEGER;\n else k = (points[i].x - points[j].x) / (points[i].y - points[j].y);\n if (!map[k]) map[k] = 0;\n map[k]++;\n localMax = Math.max(localMax, map[k]);\n }\n localMax += samePoint;\n max = Math.max(max, localMax);\n }\n return max;\n };\n \n console.log(maxPoints)\n "), (0, _template.default)("\n var maximumGap = function(nums) {\n var len = nums.length;\n if (len < 2) return 0;\n \n var max = Math.max(...nums);\n var min = Math.min(...nums);\n if (max === min) return 0;\n \n var minBuckets = Array(len - 1).fill(Number.MAX_SAFE_INTEGER);\n var maxBuckets = Array(len - 1).fill(Number.MIN_SAFE_INTEGER);\n var gap = Math.ceil((max - min) / (len - 1));\n var index = 0;\n for (var i = 0; i < len; i++) {\n if (nums[i] === min || nums[i] === max) continue;\n index = Math.floor((nums[i] - min) / gap);\n minBuckets[index] = Math.min(minBuckets[index], nums[i]);\n maxBuckets[index] = Math.max(maxBuckets[index], nums[i]);\n }\n \n var maxGap = Number.MIN_SAFE_INTEGER;\n var preVal = min;\n for (var j = 0; j < len - 1; j++) {\n if (minBuckets[j] === Number.MAX_SAFE_INTEGER && maxBuckets[j] === Number.MIN_SAFE_INTEGER) continue;\n maxGap = Math.max(maxGap, minBuckets[j] - preVal);\n preVal = maxBuckets[j];\n }\n maxGap = Math.max(maxGap, max - preVal);\n \n return maxGap;\n };\n\n console.log(maximumGap);\n "), (0, _template.default)("\n /**\n * @param {number} capacity\n */\n var LRUCache = function(capacity) {\n this.capacity = capacity;\n this.length = 0;\n this.map = {};\n this.head = null;\n this.tail = null;\n };\n \n /** \n * @param {number} key\n * @return {number}\n */\n LRUCache.prototype.get = function(key) {\n var node = this.map[key];\n if (node) {\n this.remove(node);\n this.insert(node.key, node.val);\n return node.val;\n } else {\n return -1;\n }\n };\n \n /** \n * @param {number} key \n * @param {number} value\n * @return {void}\n */\n LRUCache.prototype.put = function(key, value) {\n if (this.map[key]) {\n this.remove(this.map[key]);\n this.insert(key, value);\n } else {\n if (this.length === this.capacity) {\n this.remove(this.head);\n this.insert(key, value);\n } else {\n this.insert(key, value);\n this.length++;\n }\n }\n };\n \n /** \n * Your LRUCache object will be instantiated and called as such:\n * var obj = Object.create(LRUCache).createNew(capacity)\n * var param_1 = obj.get(key)\n * obj.put(key,value)\n */\n \n LRUCache.prototype.remove = function (node) {\n var prev = node.prev;\n var next = node.next;\n if (next) next.prev = prev;\n if (prev) prev.next = next;\n if (this.head === node) this.head = next;\n if (this.tail === node) this.tail = prev;\n delete this.map[node.key];\n };\n \n LRUCache.prototype.insert = function (key, val) {\n var node = new List(key, val);\n if (!this.tail) {\n this.tail = node;\n this.head = node;\n } else {\n this.tail.next = node;\n node.prev = this.tail;\n this.tail = node;\n }\n this.map[key] = node;\n };\n\n console.log(LRUCache);\n "), (0, _template.default)("\n var isInterleave = function(s1, s2, s3) {\n var dp = {};\n if (s3.length !== s1.length + s2.length) return false;\n return helper(s1, s2, s3, 0, 0, 0, dp);\n };\n \n var helper = function (s1, s2, s3, i, j, k, dp) {\n var res = false;\n \n if (k >= s3.length) return true;\n if (dp['' + i + j + k] !== undefined) return dp['' + i + j + k];\n \n if (s3[k] === s1[i] && s3[k] === s2[j]) {\n res = helper(s1, s2, s3, i + 1, j, k + 1, dp) || helper(s1, s2, s3, i, j + 1, k + 1, dp);\n } else if (s3[k] === s1[i]) {\n res = helper(s1, s2, s3, i + 1, j, k + 1, dp);\n } else if (s3[k] === s2[j]) {\n res = helper(s1, s2, s3, i, j + 1, k + 1, dp);\n }\n \n dp['' + i + j + k] = res;\n \n return res;\n };\n\n console.log(isInterleave);\n "), (0, _template.default)("\n var solveNQueens = function(n) {\n var res = [];\n if (n === 1 || n >= 4) dfs(res, [], n, 0);\n return res;\n };\n \n var dfs = function (res, points, n, index) {\n for (var i = index; i < n; i++) {\n if (points.length !== i) return;\n for (var j = 0; j < n; j++) {\n if (isValid(points, [i, j])) {\n points.push([i, j]);\n dfs(res, points, n, i + 1);\n if (points.length === n) res.push(buildRes(points));\n points.pop();\n }\n }\n }\n };\n \n var buildRes = function (points) {\n var res = [];\n var n = points.length;\n for (var i = 0; i < n; i++) {\n res[i] = '';\n for (var j = 0; j < n; j++) {\n res[i] += (points[i][1] === j ? 'Q' : '.');\n }\n }\n return res;\n };\n \n var isValid = function (oldPoints, newPoint) {\n var len = oldPoints.length;\n for (var i = 0; i < len; i++) {\n if (oldPoints[i][0] === newPoint[0] || oldPoints[i][1] === newPoint[1]) return false;\n if (Math.abs((oldPoints[i][0] - newPoint[0]) / (oldPoints[i][1] - newPoint[1])) === 1) return false;\n }\n return true;\n };\n\n console.log(solveNQueens);\n ")];
29
542
  /**
30
543
  * Adds dead code to blocks.
31
544
  *
32
545
  * - Adds fake predicates.
33
546
  * - Adds fake code from various samples.
34
547
  */
35
-
36
548
  class DeadCode extends _transform.default {
37
549
  constructor(o) {
38
550
  super(o, _order.ObfuscateOrder.DeadCode);
39
-
40
551
  _defineProperty(this, "made", void 0);
41
-
552
+ _defineProperty(this, "compareObjectName", void 0);
553
+ _defineProperty(this, "gen", this.getGenerator("randomized"));
42
554
  this.made = 0;
43
555
  }
44
-
45
556
  match(object, parents) {
46
- return (0, _insert.isFunction)(object) && (0, _traverse.isBlock)(object.body) && !parents.find(x => x.$dispatcherSkip);
557
+ return (0, _insert.isFunction)(object) && (0, _traverse.isBlock)(object.body) && !object.$multiTransformSkip && !parents.find(x => x.$multiTransformSkip);
47
558
  }
48
-
49
559
  transform(object, parents) {
50
560
  if (!(0, _probability.ComputeProbabilityMap)(this.options.deadCode)) {
51
561
  return;
52
- } // Hard-coded limit of 100 Dead Code insertions
53
-
562
+ }
54
563
 
564
+ // Hard-coded limit of 100 Dead Code insertions
55
565
  this.made++;
56
-
57
566
  if (this.made > 100) {
58
567
  return;
59
568
  }
60
-
61
569
  return () => {
62
- var body = (0, _insert.getBlockBody)(object); // Do not place code before Import statements or 'use strict' directives
570
+ var body = (0, _insert.getBlockBody)(object);
63
571
 
572
+ // Do not place code before Import statements or 'use strict' directives
64
573
  var safeOffset = 0;
65
-
66
574
  for (var node of body) {
67
575
  if (node.type === "ImportDeclaration" || node.directive) safeOffset++;else break;
68
576
  }
69
-
70
577
  var index = (0, _random.getRandomInteger)(safeOffset, body.length);
578
+ if (!this.compareObjectName) {
579
+ this.compareObjectName = this.getPlaceholder();
580
+ (0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.compareObjectName, new _template.default(`Object["create"](null)`).single().expression)));
581
+ }
71
582
  var name = this.getPlaceholder();
72
- var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.Literal)(false)));
583
+ var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.BinaryExpression)("in", (0, _gen.Literal)(this.gen.generate()), (0, _gen.Identifier)(this.compareObjectName))));
73
584
  var template;
74
-
75
585
  do {
76
586
  template = (0, _random.choice)(templates);
77
- } while (this.options.es5 && template.source.includes("async"));
78
-
79
- var ifStatement = (0, _gen.IfStatement)((0, _gen.Identifier)(name), template.compile(), null);
587
+ } while (this.options.es5 && template.templates[0].includes("async"));
588
+ var nodes = template.compile();
589
+ if ((0, _random.chance)(50)) {
590
+ nodes.unshift((0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.MemberExpression)((0, _gen.Identifier)(this.compareObjectName), (0, _gen.Literal)(this.gen.generate()), true), (0, _gen.Literal)(this.gen.generate()))));
591
+ }
592
+ var ifStatement = (0, _gen.IfStatement)((0, _gen.Identifier)(name), nodes, null);
80
593
  body.splice(index, 0, ifStatement);
81
594
  (0, _insert.prepend)(object, variableDeclaration);
82
595
  };
83
596
  }
84
-
85
597
  }
86
-
87
598
  exports.default = DeadCode;