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.
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +73 -0
- package/README.md +32 -31
- package/dist/compiler.js +2 -8
- package/dist/constants.js +22 -10
- package/dist/index.js +15 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +33 -40
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +121 -5
- package/dist/templates/core.js +35 -0
- package/dist/templates/crash.js +22 -11
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +189 -43
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +19 -55
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +542 -31
- package/dist/transforms/dispatcher.js +112 -112
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +21 -26
- package/dist/transforms/identifier/globalConcealing.js +72 -56
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +36 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +53 -52
- package/dist/transforms/lock/lock.js +161 -126
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +12 -49
- package/dist/transforms/preparation.js +28 -49
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +125 -72
- package/dist/transforms/shuffle.js +42 -47
- package/dist/transforms/stack.js +41 -98
- package/dist/transforms/string/encoding.js +76 -27
- package/dist/transforms/string/stringCompression.js +75 -68
- package/dist/transforms/string/stringConcealing.js +127 -135
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +76 -104
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +5 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +31 -36
- package/dist/util/scope.js +6 -3
- package/docs/Countermeasures.md +13 -6
- package/docs/Integrity.md +35 -28
- package/docs/RGF.md +6 -1
- package/docs/RenameVariables.md +116 -0
- package/docs/TamperProtection.md +100 -0
- package/docs/Template.md +117 -0
- package/package.json +3 -3
- package/src/constants.ts +17 -0
- package/src/index.ts +7 -5
- package/src/options.ts +60 -7
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +79 -11
- package/src/templates/core.ts +29 -0
- package/src/templates/crash.ts +6 -38
- package/src/templates/es5.ts +1 -1
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +205 -46
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/calculator.ts +4 -2
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +74 -42
- package/src/transforms/dispatcher.ts +99 -73
- package/src/transforms/es5/antiClass.ts +25 -12
- package/src/transforms/es5/antiDestructuring.ts +1 -1
- package/src/transforms/es5/antiES6Object.ts +2 -2
- package/src/transforms/es5/antiTemplate.ts +1 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalAnalysis.ts +18 -1
- package/src/transforms/identifier/globalConcealing.ts +119 -72
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/identifier/renameVariables.ts +16 -1
- package/src/transforms/lock/antiDebug.ts +2 -2
- package/src/transforms/lock/integrity.ts +13 -11
- package/src/transforms/lock/lock.ts +122 -30
- package/src/transforms/minify.ts +28 -13
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +16 -0
- package/src/transforms/rgf.ts +139 -12
- package/src/transforms/shuffle.ts +3 -3
- package/src/transforms/stack.ts +19 -4
- package/src/transforms/string/encoding.ts +88 -51
- package/src/transforms/string/stringCompression.ts +86 -17
- package/src/transforms/string/stringConcealing.ts +148 -118
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +63 -46
- package/src/types.ts +2 -0
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/guard.ts +10 -0
- package/src/util/insert.ts +17 -0
- package/src/util/random.ts +81 -1
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +94 -5
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +129 -55
- package/test/templates/template.test.ts +211 -1
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +89 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/identifier/renameVariables.test.ts +75 -1
- package/test/transforms/lock/tamperProtection.test.ts +336 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- 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
|
-
|
|
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
|
-
|
|
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.$
|
|
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
|
-
}
|
|
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);
|
|
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)(
|
|
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.
|
|
78
|
-
|
|
79
|
-
|
|
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;
|