Commit b39951ac authored by wangmingming's avatar wangmingming

1

parent 0fa14419
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
const generate = require(`@babel/generator`).default;
const jtraverse = require(`json-schema-traverse`);
const t = require(`@babel/types`);
const traverse = require(`@babel/traverse`).default;
const { extractSignals } = require(`./signals.js`);
const {FINDERS, findInVar} = require('./finders.js');
const XOR_SHIFT_128 = `xorShift128`;
const LOOP_TYPES = [`WhileStatement`, `ForInStatement`];
function xorShift128(_$arg, _$arg2) {
var rI = _$arg;
var Vh = _$arg2;
return function () {
var di = rI;
di ^= di << 23;
di ^= di >> 17;
var Wu = Vh;
rI = Wu;
di ^= Wu;
di ^= Wu >> 26;
Vh = di;
return (rI + Vh) % 4294967296;
};
}
function createEncoderFromPath({
path,
type
}) {
//Good
const handleWhileAndByOneByte = (path) => {
const rounds = path.node.test.right.value;
const staticXor = path.getSibling(path.key - 3).get(`declarations.0.init.arguments.0.value`).node;
return {
"encoder" : function (xor) {
const xored = xorShift128(staticXor, xor);
const bytes = [];
let index = 0;
while (index < rounds) {
bytes.push(xored() & 255);
index += 1;
}
return bytes;
},
"decoder" : function (xor) {
const xored = xorShift128(staticXor, xor);
const bytes = [];
let index = 0;
while (index < rounds) {
bytes.push(xored() & 255);
index += 1;
}
return bytes;
},
type
};
};
//Good
const handleWhileCharCodeAt = (path) => {
return {
"encoder" : function (data, xor) {
const newData = [];
let i = 0;
while (i < data.length) {
newData.push(data.charCodeAt(i));
i++;
}
return newData;
},
"decoder" : function (data, xor) {
const newData = [];
let i = 0;
while (i < data.length) {
newData.push(String.fromCharCode(data[i]));
i++;
}
return newData;
},
type
};
};
//Good
const handleWhileShuffle = (path) => {
const xorIndex = path.get(`body.body.0.expression.arguments.0.property.left.right.property.value`).node;
return {
"encoder" : function (data, xor) {
const newData = [];
for (let i = 0; i < data.length; i++) {
newData.push(data[(i + xor[xorIndex]) % data.length]);
}
return newData;
},
"decoder" : function (data, xor) {
const tail = [...data];
const head = [];
for (let i = 0, start = xor[xorIndex] % data.length, maxIterations = data.length - start; i < maxIterations; i++) {
head.push(tail.shift());
}
return [...tail, ...head];
},
type
};
};
//Good
const handleWhilePushToArrayReverse = (path) => {
return {
"encoder" : function (data, xor) {
return [...data.reverse()];
},
"decoder" : function (data, xor) {
return [...data.reverse()];
},
type
};
};
//Good
const handleWhileExtraByte = (path) => {
const startSlice = path.get(`body.body.1.expression.arguments.0.object.arguments.0.value`).node;
const endSlice = path.get(`body.body.1.expression.arguments.0.object.arguments.1.value`).node;
return {
"encoder" : function (data, xor) {
const newData = [];
const slicedLength = xor.slice(startSlice, endSlice).length;
for (let i = 0, maxIterations = data.length; i < maxIterations; i++) {
newData.push(data[i]);
const extraByte = xor.slice(startSlice, endSlice)[i % slicedLength];
newData.push(extraByte);
}
return newData;
},
"decoder" : function (data, xor) {
return [...data.filter((d, i) => !(i % 2))];
},
type
};
};
//Good
const handleWhileSwapValues = (path) => {
return {
"encoder" : function (data, xor) {
const newData = [...data];
for (let i = 0, maxIterations = data.length; i + 1 < maxIterations; i += 2) {
const current = newData[i];
newData[i] = newData[i + 1];
newData[i + 1] = current;
}
return newData;
},
"decoder" : function (data, xor) {
const newData = [...data];
for (let i = 0, maxIterations = data.length; i + 1 < maxIterations; i += 2) {
const current = newData[i];
newData[i] = newData[i + 1];
newData[i + 1] = current;
}
return newData;
},
type
};
};
const handleWhileFromCharCode = (path) => {
return {
"encoder" : function (data, xor) {
return [...data.map((d) => String.fromCharCode(d))];
},
"decoder" : function (data, xor) {
return [...data.map((d) => d.charCodeAt(0))];
},
type
};
};
//Good
const handleWhileXorBySeed = (path) => {
const startSlice = path.get(`body.body.1.declarations.0.init.object.arguments.0.value`).node;
const endSlice = path.get(`body.body.1.declarations.0.init.object.arguments.1.value`).node;
return {
"encoder" : function (data, xor) {
const newData = [];
const slicedLength = xor.slice(startSlice, endSlice).length;
for (let i = 0, maxIterations = data.length; i < maxIterations; i++) {
const extraByte = xor.slice(startSlice, endSlice)[i % slicedLength];
newData.push(data[i] ^ extraByte);
}
return newData;
},
"decoder" : function (data, xor) {
const newData = [];
const slicedLength = xor.slice(startSlice, endSlice).length;
for (let i = 0, maxIterations = data.length; i < maxIterations; i++) {
const extraByte = xor.slice(startSlice, endSlice)[i % slicedLength];
newData.push(data[i] ^ extraByte);
}
return newData;
},
type
};
};
//Good
const handleForFromCharCode = (path) => {
return {
"encoder" : function (data, xor) {
return [...data.map((d) => String.fromCharCode(d))];
},
"decoder" : function (data, xor) {
return [...data].map((d, i) => d.charCodeAt(0));
},
type
};
};
//Good
const handleforOrTopByBottom = (path) => {
return {
"encoder" : function (data, xor) {
return [...data.map((d) => d << 4 & 240 | d >> 4)];
},
"decoder" : function (data, xor) {
return [...data.map((d) => d << 4 & 240 | d >> 4)];
},
type
};
};
//Good
const handleForPushToArray = (path) => {
return {
"encoder" : function (data, xor) {
return [...data];
},
"decoder" : function (data, xor) {
return [...data];
},
type
};
};
switch (type) {
case `whileAndByOneByte`:
return handleWhileAndByOneByte(path);
case `whileCharCodeAt`:
return handleWhileCharCodeAt(path);
case `whileShuffle`:
return handleWhileShuffle(path);
case `whilePushToArrayReverse`:
return handleWhilePushToArrayReverse(path);
case `whileExtraByte`:
return handleWhileExtraByte(path);
case `whileSwapValues`:
return handleWhileSwapValues(path);
case `WhileFromCharCode`:
return handleWhileFromCharCode(path);
case `whileXorBySeed`:
return handleWhileXorBySeed(path);
case `forFromCharCode`:
return handleForFromCharCode(path);
case `forOrTopByBottom`:
return handleforOrTopByBottom(path);
case `forPushToArray`:
return handleForPushToArray(path);
default:
throw Error(`Unknown type:${type}`);
}
}
function extractEncoderType(path) {
const body = path.get(`body.body`);
const firstNode = body[0].node;
const secondNode = body.length >= 2 ? body[1].node : null;
const thirdNode = body.length >= 3 ? body[2].node : null;
const lastNode = body.slice(-1)[0].node;
if (!LOOP_TYPES.includes(path.type)) {
return false;
}
if (path.type === `WhileStatement`) {
switch (body.length) {
case 2:
const firstNodeCode = generate(firstNode).code;
if (firstNodeCode.endsWith(`& 255);`)) {
return `whileAndByOneByte`;
}
if (firstNodeCode.includes(`charCodeAt`)) {
return `whileCharCodeAt`;
}
let hasShuffle = false;
body.forEach((bodyNodePath) => {
const bodyNodeCode = generate(bodyNodePath.node).code;
if (bodyNodeCode.match(/([a-zA-Z0-9].*)\.push\(([a-zA-Z0-9].*)\[\(([a-zA-Z0-9].*) \+ ([a-zA-Z0-9].*)\[([0-9].*)\]\) \% ([a-zA-Z0-9].*)\]\);/)) {
hasShuffle = true;
}
});
if (hasShuffle) {
return `whileShuffle`;
}
const test = path.get(`test`);
if (
test.type === `BinaryExpression` && test.node.operator === `>=` && test.node.right.type === `NumericLiteral` &&
test.node.right.value === 0
) {
return `whilePushToArrayReverse`;
}
return false;
case 3:
if (secondNode.type === `IfStatement`) {
return false;
}
const nodes = [firstNode, secondNode];
const hasNonPush = nodes.filter((n) =>
n.type === `ExpressionStatement` && n.expression.type === `CallExpression` && n.expression.callee.type === `MemberExpression` &&
n.expression.callee.property.type === `Identifier` && n.expression.callee.property.name === `push`
);
if (hasNonPush.length === 2) {
return `whileExtraByte`;
}
if (firstNodeCode.includes(`charCodeAt`)) {
return `whileCharCodeAt`;
}
return false;
case 4:
if (
lastNode.type === `ExpressionStatement` && lastNode.expression.type === `AssignmentExpression` &&
lastNode.expression.operator === `+=` && lastNode.expression.right.type === `NumericLiteral` &&
lastNode.expression.right.value === 2
) {
return `whileSwapValues`;
}
if (
secondNode.type === `VariableDeclaration` && secondNode.declarations.length === 1 && secondNode.declarations[0].init === `CallExpression` &&
generate(secondNode.declarations[0].init.callee).code.includes(`String.fromCharCode`)
) {
return `WhileFromCharCode`;
}
if (
thirdNode.type === `ExpressionStatement` && thirdNode.expression.type === `CallExpression` && thirdNode.expression.arguments.length === 1 &&
thirdNode.expression.arguments[0].type === `BinaryExpression` && thirdNode.expression.arguments[0].operator === `^`
) {
return `whileXorBySeed`;
}
return false;
}
return false;
} else {
const lastNode = body.slice(-1)[0].node;
if (!(lastNode.type === `IfStatement` && generate(lastNode.test).code.includes(`hasOwnProperty`))) {
return false;
}
const firstNodeOfLast = lastNode.consequent.body[0];
switch (firstNodeOfLast.type) {
case `VariableDeclaration`:
const init = firstNodeOfLast.declarations[0].init;
if (init.type === `CallExpression` && generate(init.callee).code.includes(`String.fromCharCode`)) {
return `forFromCharCode`;
}
if (init.type === `BinaryExpression` && generate(init).code.includes(`<< 4 & 240`)) {
return `forOrTopByBottom`;
}
break;
case `ExpressionStatement`:
const expression = firstNodeOfLast.expression;
if (
expression.type === `CallExpression` && expression.callee.type === `MemberExpression` &&
expression.callee.property.type === `Identifier` && expression.callee.property.name === `push`
) {
return `forPushToArray`;
}
break;
}
return false;
}
}
function getXorEncoderFromPath(path) {
const encoderVar = path.get(`declarations.0.id.name`).node;
const isStartOfEncoder = (n) => {
return n.type === `VariableDeclaration` && n.declarations.length === 1 && n.declarations[0].init.type === `CallExpression` &&
generate(n.declarations[0].init).code.startsWith(XOR_SHIFT_128);
};
const isEndOfEncoder = (n) => {
return n.type === `VariableDeclaration` && n.declarations.length === 1 && n.declarations[0].init.type === `CallExpression` &&
generate(n.declarations[0].init).code.includes(`btoa`);
};
let currentPath = path.getNextSibling();
const encoders = [];
const paths = [];
const loopEncoders = [];
while (currentPath.node !== undefined || currentPath.node !== null) {
if (isStartOfEncoder(currentPath.node)) {
//SKIP THE NEXT TIME
currentPath.setData(`skip`, true);
const subEncoders = getXorEncoderFromPath(currentPath);
subEncoders.forEach((subEncoder) => encoders.push(subEncoder));
const lastSubEncoder = subEncoders.slice(-1)[0][`nextPath`];
currentPath = lastSubEncoder.getNextSibling();
continue;
}
if (isEndOfEncoder(currentPath.node)) {
break;
}
if (LOOP_TYPES.includes(currentPath.type)) {
const encoderType = extractEncoderType(currentPath);
if (encoderType) {
const encoderPath = createEncoderFromPath({ path : currentPath, type : encoderType});
loopEncoders.push(encoderPath);
}
}
currentPath = currentPath.getNextSibling();
}
const nextPath = [undefined, null].includes(currentPath) ? false : currentPath;
encoders.push({
"var" : encoderVar,
"encoders" : loopEncoders,
"nextPath" : nextPath,
"path" : t.blockStatement(paths.map((p) => p.node))
});
return encoders;
}
function buildEncoderAndDecoder(encoders, encoderVar) {
return {
"encoder" : function (data, xor) {
const _encs = [...encoders];
const firstEncoder = _encs.shift()['encoder'];
const xored = firstEncoder(xor);
const encodeFuncs = [..._encs];
let mutable = data;
for (let i = 0, maxIterations = encodeFuncs.length; i < maxIterations; i++) {
const enc = encodeFuncs[i];
mutable = enc[`encoder`](mutable, xored);
}
return btoa(mutable.join(``));
},
"decoder" : function (data, xor) {
const _encs = [...encoders];
const xored = _encs.shift()[`decoder`](xor);
const decodeFuncs = [..._encs].reverse();
let mutable = atob(data);
for (let i = 0, maxIterations = decodeFuncs.length; i < maxIterations; i++) {
const enc = decodeFuncs[i];
mutable = enc[`decoder`](mutable, xored);
}
return JSON.parse(mutable.join(``));
},
"var" : encoderVar
};
}
function findFirstPushIIFE(mainFuncPath){
const bodyPaths = mainFuncPath.get(`body.body.0.expression.right.body.body.0.block.body.2.expression.arguments.1.body.body.0.block.body`);
for(let bodyPath of bodyPaths){
if(t.isExpressionStatement(bodyPath.node) && t.isCallExpression(bodyPath.node.expression) && generate(bodyPath.node.expression.callee).code.endsWith(`["push"]`)){
return bodyPath
}
}
}
function getSignalsPaths(ast) {
const paths = [];
traverse(ast, {
Program(path) {
const mainFuncPath = path.get(`body.0.expression.callee.body.body`).slice(-2)[0];
const bodyPaths = mainFuncPath.get(`body.body.0.expression.right.body.body.0.block.body.2.expression.arguments.1.body.body.0.block.body`);
for(let bodyPath of bodyPaths){
if(t.isExpressionStatement(bodyPath.node) && t.isCallExpression(bodyPath.node.expression) && generate(bodyPath.node.expression.callee).code.endsWith(`["push"]`)){
paths.push(bodyPath);
}
}
}
});
return paths;
}
function extractXorEncoders(ast){
const xorEncoders = [];
const signalsPaths = getSignalsPaths(ast);
signalsPaths.forEach((currentPath, index) => {
xorEncoders[index] = [];
const currentEncoders = xorEncoders[index];
if(index === 2){
currentPath.traverse({
TryStatement(tryPath){
const block = tryPath.get(`block`);
const firstNode = block.get(`body.0`).node;
if(!
(t.isIfStatement(firstNode) && generate(firstNode.test).code.endsWith(`() !== undefined`))
){
return;
}
tryPath.get(`block.body.0.consequent.body.0.expression.right.callee.body`).traverse({
CallExpression(callPath) {
const callee = callPath.get(`callee`);
if (!(callee.type === `Identifier` && callee.node.name === XOR_SHIFT_128)) {
return;
}
const statementPath = callPath.getStatementParent();
if (!statementPath.getData(`skip`, false)) {
const encoders = getXorEncoderFromPath(statementPath);
encoders.forEach((encoder) =>
currentEncoders.push(buildEncoderAndDecoder(encoder[`encoders`], encoder['var']))
);
}
}
});
const timestampProp = tryPath.get(`block.body.0.consequent.body.0.expression.left.property`).node;
ast.restorePaths.push([tryPath, t.cloneNode(tryPath.node)]);
tryPath.replaceWith(
t.expressionStatement(
t.assignmentExpression(
`=`, t.memberExpression(
t.identifier(`TIMESTAMPS`), timestampProp, true
), t.stringLiteral(`FINDME`),
)
)
);
}
});
}
currentPath.traverse({
CallExpression(callPath) {
const callee = callPath.get(`callee`);
if (!(callee.type === `Identifier` && callee.node.name === XOR_SHIFT_128)) {
return;
}
const statementPath = callPath.getStatementParent();
if (!statementPath.getData(`skip`, false)) {
const encoders = getXorEncoderFromPath(statementPath);
encoders.forEach((encoder) => {
currentEncoders.push(buildEncoderAndDecoder(encoder[`encoders`], encoder['var']));
});
}
}
});
});
//console.log(xorEncoders);
return xorEncoders;
}
function extractInterrogatorId(ast){
let found = false;
traverse(ast, {
NewExpression(path){
const callee = path.node.callee
if(generate(callee).code !== 'window["reese84interrogator"]'){
return;
}
found = path.node.arguments[2].value;
}
})
return found;
}
function extractSignalsKeys(ast) {
const paths = getSignalsPaths(ast);
const signalKeys = extractSignals({ signalPaths : paths});
//console.log(signalKeys);
const getValue = (key) => {
if(!(key in signalKeys)){
throw Error(`Key:${key} is not a signal key`);
}
const currentSignal = signalKeys[key];
if(!currentSignal){
throw Error(`Could not find key:${key} in ast`);
}
return currentSignal;
};
const interrogatorId = extractInterrogatorId(ast);
return {
'events' : getValue(`events`),
'events.mouse' : getValue(`events.mouse`),
'events.mouse.type' : getValue(`events.mouse.type`),
'events.mouse.timestamp' : getValue(`events.mouse.timestamp`),
'events.mouse.client_x' : getValue(`events.mouse.client_x`),
'events.mouse.client_y' : getValue(`events.mouse.client_y`),
'events.mouse.screen_x' : getValue(`events.mouse.screen_x`),
'events.mouse.screen_y' : getValue(`events.mouse.screen_y`),
'events.touch' : getValue(`events.touch`),
'events.touch.type' : getValue(`events.touch.type`),
'events.touch.timestamp' : getValue(`events.touch.timestamp`),
'events.touch.identifier' : getValue(`events.touch.identifier`),
'events.touch.client_x' : getValue(`events.touch.client_x`),
'events.touch.client_y' : getValue(`events.touch.client_y`),
'events.touch.screen_x' : getValue(`events.touch.screen_x`),
'events.touch.screen_y' : getValue(`events.touch.screen_y`),
'events.touch.radius_x' : getValue(`events.touch.radius_x`),
'events.touch.radius_y' : getValue(`events.touch.radius_y`),
'events.touch.rotation_angle' : getValue(`events.touch.rotation_angle`),
'events.touch.force' : getValue(`events.touch.force`),
'interrogator_id' : interrogatorId,
'user_agent' : getValue(`user_agent`),
'navigator_language' : getValue(`navigator_language`),
'navigator_languages' : getValue(`navigator_languages`),
'navigator_languages.languages_is_not_undefined' : getValue(`navigator_languages.languages_is_not_undefined`),
'navigator_languages.languages' : getValue(`navigator_languages.languages`),
'navigator_build_id' : getValue(`navigator_build_id`),
'timestamps' : getValue(`timestamps`),
'timestamps.date_get_time' : getValue(`timestamps.date_get_time`),
'timestamps.file_last_modified' : getValue(`timestamps.file_last_modified`),
'timestamps.performance_now' : getValue(`timestamps.performance_now`),
'timestamps.document_timeline' : getValue(`timestamps.document_timeline`),
'timestamps.performance_timing' : getValue(`timestamps.performance_timing`),
'mime_types' : getValue('mime_types'),
'mime_types.suffixes' : getValue('mime_types.suffixes'),
'mime_types.type' : getValue('mime_types.type'),
'mime_types.file_name' : getValue('mime_types.file_name'),
'window_size' : getValue(`window_size`),
'window_size.window_screen_width' : getValue(`window_size.window_screen_width`),
'window_size.window_screen_height' : getValue(`window_size.window_screen_height`),
'window_size.window_screen_avail_height' : getValue(`window_size.window_screen_avail_height`),
'window_size.window_screen_avail_left' : getValue(`window_size.window_screen_avail_left`),
'window_size.window_screen_avail_top' : getValue(`window_size.window_screen_avail_top`),
'window_size.window_screen_avail_width' : getValue(`window_size.window_screen_avail_width`),
'window_size.window_screen_pixel_depth' : getValue(`window_size.window_screen_pixel_depth`),
'window_size.window_inner_width' : getValue(`window_size.window_inner_width`),
'window_size.window_inner_height' : getValue(`window_size.window_inner_height`),
'window_size.window_outer_width' : getValue(`window_size.window_outer_width`),
'window_size.window_outer_height' : getValue(`window_size.window_outer_height`),
'window_size.window_device_pixel_ratio' : getValue(`window_size.window_device_pixel_ratio`),
'window_size.window_screen_orientation_type' : getValue(`window_size.window_screen_orientation_type`),
'window_size.window_screenX' : getValue(`window_size.window_screenX`),
'window_size.window_screenY' : getValue(`window_size.window_screenY`),
'date_get_time_zone_off_set' : getValue(`date_get_time_zone_off_set`),
'has_indexed_db' : getValue(`has_indexed_db`),
'has_body_add_behaviour' : getValue(`has_body_add_behaviour`),
'iframe_null' : getValue('iframe_null'),
'open_database' : getValue(`open_database`),
'cpu_class' : getValue(`cpu_class`),
'platform' : getValue(`platform`),
'do_not_track' : getValue(`do_not_track`),
'plugins_or_active_x_object' : getValue(`plugins_or_active_x_object`),
'plugins_named_item_item_refresh' : getValue(`plugins_named_item_item_refresh`),
'plugins_named_item_item_refresh.named_item' : getValue(`plugins_named_item_item_refresh.named_item`),
'plugins_named_item_item_refresh.item' : getValue(`plugins_named_item_item_refresh.item`),
'plugins_named_item_item_refresh.refresh' : getValue(`plugins_named_item_item_refresh.refresh`),
'canvas_hash' : getValue(`canvas_hash`),
'canvas_hash.is_point_in_path' : getValue(`canvas_hash.is_point_in_path`),
'canvas_hash.to_data_url_image' : getValue(`canvas_hash.to_data_url_image`),
'canvas_hash.screen_is_global_composite_operation' : getValue(`canvas_hash.screen_is_global_composite_operation`),
'canvas_hash.hash' : getValue(`canvas_hash.hash`),
'webgl' : getValue(`webgl`),
'webgl.canvas_hash' : getValue(`webgl.canvas_hash`),
'webgl.get_supported_extensions' : getValue(`webgl.get_supported_extensions`),
'webgl.aliased_line_width_range' : getValue(`webgl.aliased_line_width_range`),
'webgl.aliased_point_size_range' : getValue(`webgl.aliased_point_size_range`),
'webgl.alpha_bits' : getValue(`webgl.alpha_bits`),
'webgl.antialias' : getValue(`webgl.antialias`),
'webgl.blue_bits' : getValue(`webgl.blue_bits`),
'webgl.depth_bits' : getValue(`webgl.depth_bits`),
'webgl.green_bits' : getValue(`webgl.green_bits`),
'webgl.all_bits' : getValue(`webgl.all_bits`),
'webgl.max_combined_texture_image_units' : getValue(`webgl.max_combined_texture_image_units`),
'webgl.max_cube_map_texture_size' : getValue(`webgl.max_cube_map_texture_size`),
'webgl.max_fragment_uniform_vectors' : getValue(`webgl.max_fragment_uniform_vectors`),
'webgl.max_renderbuffer_size' : getValue(`webgl.max_renderbuffer_size`),
'webgl.max_texture_image_units' : getValue(`webgl.max_texture_image_units`),
'webgl.max_texture_size' : getValue(`webgl.max_texture_size`),
'webgl.max_varying_vectors' : getValue(`webgl.max_varying_vectors`),
'webgl.max_vertex_attribs' : getValue(`webgl.max_vertex_attribs`),
'webgl.max_vertex_texture_image_units' : getValue(`webgl.max_vertex_texture_image_units`),
'webgl.max_vertex_uniform_vectors' : getValue(`webgl.max_vertex_uniform_vectors`),
'webgl.max_viewport_dims' : getValue(`webgl.max_viewport_dims`),
'webgl.red_bits' : getValue(`webgl.red_bits`),
'webgl.renderer' : getValue(`webgl.renderer`),
'webgl.shading_language_version' : getValue(`webgl.shading_language_version`),
'webgl.stencil_bits' : getValue(`webgl.stencil_bits`),
'webgl.vendor' : getValue(`webgl.vendor`),
'webgl.version' : getValue(`webgl.version`),
'webgl.shader_precision_vertex_high_float' : getValue(`webgl.shader_precision_vertex_high_float`),
'webgl.shader_precision_vertex_high_float_min' : getValue(`webgl.shader_precision_vertex_high_float_min`),
'webgl.shader_precision_vertex_high_float_max' : getValue(`webgl.shader_precision_vertex_high_float_max`),
'webgl.shader_precision_vertex_medium_float' : getValue(`webgl.shader_precision_vertex_medium_float`),
'webgl.shader_precision_vertex_medium_float_min' : getValue(`webgl.shader_precision_vertex_medium_float_min`),
'webgl.shader_precision_vertex_medium_float_max' : getValue(`webgl.shader_precision_vertex_medium_float_max`),
'webgl.shader_precision_vertex_low_float' : getValue(`webgl.shader_precision_vertex_low_float`),
'webgl.shader_precision_vertex_low_float_min' : getValue(`webgl.shader_precision_vertex_low_float_min`),
'webgl.shader_precision_vertex_low_float_max' : getValue(`webgl.shader_precision_vertex_low_float_max`),
'webgl.shader_precision_fragment_high_float' : getValue(`webgl.shader_precision_fragment_high_float`),
'webgl.shader_precision_fragment_high_float_min' : getValue(`webgl.shader_precision_fragment_high_float_min`),
'webgl.shader_precision_fragment_high_float_max' : getValue(`webgl.shader_precision_fragment_high_float_max`),
'webgl.shader_precision_fragment_medium_float' : getValue(`webgl.shader_precision_fragment_medium_float`),
'webgl.shader_precision_fragment_medium_float_min' : getValue(`webgl.shader_precision_fragment_medium_float_min`),
'webgl.shader_precision_fragment_medium_float_max' : getValue(`webgl.shader_precision_fragment_medium_float_max`),
'webgl.shader_precision_fragment_low_float' : getValue(`webgl.shader_precision_fragment_low_float`),
'webgl.shader_precision_fragment_low_float_min' : getValue(`webgl.shader_precision_fragment_low_float_min`),
'webgl.shader_precision_fragment_low_float_max' : getValue(`webgl.shader_precision_fragment_low_float_max`),
'webgl.shader_precision_vertex_high_int' : getValue(`webgl.shader_precision_vertex_high_int`),
'webgl.shader_precision_vertex_high_int_min' : getValue(`webgl.shader_precision_vertex_high_int_min`),
'webgl.shader_precision_vertex_high_int_max' : getValue(`webgl.shader_precision_vertex_high_int_max`),
'webgl.shader_precision_vertex_medium_int' : getValue(`webgl.shader_precision_vertex_medium_int`),
'webgl.shader_precision_vertex_medium_int_min' : getValue(`webgl.shader_precision_vertex_medium_int_min`),
'webgl.shader_precision_vertex_medium_int_max' : getValue(`webgl.shader_precision_vertex_medium_int_max`),
'webgl.shader_precision_vertex_low_int' : getValue(`webgl.shader_precision_vertex_low_int`),
'webgl.shader_precision_vertex_low_int_min' : getValue(`webgl.shader_precision_vertex_low_int_min`),
'webgl.shader_precision_vertex_low_int_max' : getValue(`webgl.shader_precision_vertex_low_int_max`),
'webgl.shader_precision_fragment_high_int' : getValue(`webgl.shader_precision_fragment_high_int`),
'webgl.shader_precision_fragment_high_int_min' : getValue(`webgl.shader_precision_fragment_high_int_min`),
'webgl.shader_precision_fragment_high_int_max' : getValue(`webgl.shader_precision_fragment_high_int_max`),
'webgl.shader_precision_fragment_medium_int' : getValue(`webgl.shader_precision_fragment_medium_int`),
'webgl.shader_precision_fragment_medium_int_min' : getValue(`webgl.shader_precision_fragment_medium_int_min`),
'webgl.shader_precision_fragment_medium_int_max' : getValue(`webgl.shader_precision_fragment_medium_int_max`),
'webgl.shader_precision_fragment_low_int' : getValue(`webgl.shader_precision_fragment_low_int`),
'webgl.shader_precision_fragment_low_int_min' : getValue(`webgl.shader_precision_fragment_low_int_min`),
'webgl.shader_precision_fragment_low_int_max' : getValue(`webgl.shader_precision_fragment_low_int_max`),
'webgl.unmasked_vendor_webgl' : getValue(`webgl.unmasked_vendor_webgl`),
'webgl.unmasked_renderer_webgl' : getValue(`webgl.unmasked_renderer_webgl`),
'webgl_meta' : getValue(`webgl_meta`),
'webgl_meta.webgl_rendering_context_get_parameter' : getValue(`webgl_meta.webgl_rendering_context_get_parameter`),
'webgl_meta.is_native_webgl_rendering_context_get_parameter' : getValue(`webgl_meta.is_native_webgl_rendering_context_get_parameter`),
'touch_event' : getValue(`touch_event`),
'touch_event.max_touch_points' : getValue(`touch_event.max_touch_points`),
'touch_event.has_touch_event' : getValue(`touch_event.has_touch_event`),
'touch_event.on_touch_start_is_undefined' : getValue(`touch_event.on_touch_start_is_undefined`),
'video' : getValue(`video`),
'video.can_play_type_video_ogg' : getValue(`video.can_play_type_video_ogg`),
'video.can_play_type_video_mp4' : getValue(`video.can_play_type_video_mp4`),
'video.can_play_type_video_webm' : getValue(`video.can_play_type_video_webm`),
'audio' : getValue(`audio`),
'audio.can_play_type_audio_ogg' : getValue(`audio.can_play_type_audio_ogg`),
'audio.can_play_type_audio_mpeg' : getValue(`audio.can_play_type_audio_mpeg`),
'audio.can_play_type_audio_wav' : getValue(`audio.can_play_type_audio_wav`),
'audio.can_play_type_audio_xm4a' : getValue(`audio.can_play_type_audio_xm4a`),
'audio.can_play_type_audio_empty_array' : getValue(`audio.can_play_type_audio_empty_array`),
'audio.can_play_type_audio_mp4' : getValue(`audio.can_play_type_audio_mp4`),
'navigator_vendor' : getValue(`navigator_vendor`),
'navigator_product' : getValue(`navigator_product`),
'navigator_product_sub' : getValue(`navigator_product_sub`),
'browser' : getValue(`browser`),
'browser.is_internet_explorer' : getValue(`browser.is_internet_explorer`),
'browser.chrome' : getValue(`browser.chrome`),
'browser.chrome.load_times' : getValue(`browser.chrome.load_times`),
'browser.chrome.app' : getValue(`browser.chrome.app`),
'browser.chrome.chrome' : getValue(`browser.chrome.chrome`),
'browser.webdriver' : getValue(`browser.webdriver`),
'browser.is_chrome' : getValue(`browser.is_chrome`),
'browser.connection_rtt' : getValue(`browser.connection_rtt`),
'window' : getValue(`window`),
'window.history_length' : getValue(`window.history_length`),
'window.navigator_hardware_concurrency' : getValue(`window.navigator_hardware_concurrency`),
'window.is_window_self_not_window_top' : getValue(`window.is_window_self_not_window_top`),
'window.is_native_navigator_get_battery' : getValue(`window.is_native_navigator_get_battery`),
'window.console_debug_name' : getValue(`window.console_debug_name`),
'window.is_native_console_debug' : getValue(`window.is_native_console_debug`),
'window._phantom' : getValue(`window._phantom`),
'window.call_phantom' : getValue(`window.call_phantom`),
'window.empty' : getValue(`window.empty`),
'window.persistent' : getValue(`window.persistent`),
'window.temporary' : getValue(`window.temporary`),
'window.performance_observer' : getValue(`window.performance_observer`),
'window.performance_observer.supported_entry_types' : getValue(`window.performance_observer.supported_entry_types`),
'document' : getValue(`document`),
'document.document_location_protocol' : getValue(`document.document_location_protocol`),
'canvas_fonts' : getValue(`canvas_fonts`),
'document_children' : getValue(`document_children`),
'document_children.document_with_src' : getValue('document_children.document_with_src'),
'document_children.document_without_src' : getValue('document_children.document_without_src'),
'document_children.document_script_element_children' : getValue(`document_children.document_script_element_children`),
'document_children.document_head_element_children' : getValue(`document_children.document_head_element_children`),
'document_children.document_body_element_children' : getValue(`document_children.document_body_element_children`),
'webgl_rendering_call' : getValue(`webgl_rendering_call`),
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a' : getValue(`webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a`),
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b' : getValue(`webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b`),
'webgl_rendering_call.hash' : getValue(`webgl_rendering_call.hash`),
'window_object_get_own_property_names_a' : getValue(`window_object_get_own_property_names_a`),
'window_object_get_own_property_names_b' : getValue(`window_object_get_own_property_names_b`),
'window_object_get_own_property_names_b.prev' : getValue(`window_object_get_own_property_names_b.prev`),
'window_object_get_own_property_names_b.next' : getValue(`window_object_get_own_property_names_b.next`),
'window_object_get_own_property_names_last_30' : getValue(`window_object_get_own_property_names_last_30`),
'visual_view_port' : getValue(`visual_view_port`),
'visual_view_port.visual_view_port_width' : getValue(`visual_view_port.visual_view_port_width`),
'visual_view_port.visual_view_port_height' : getValue(`visual_view_port.visual_view_port_height`),
'visual_view_port.visual_view_port_scale' : getValue(`visual_view_port.visual_view_port_scale`),
'create_html_document' : getValue(`create_html_document`),
'performance_difference' : getValue(`performance_difference`),
'performance_difference.btoa_a' : getValue(`performance_difference.btoa_a`),
'performance_difference.btoa_b' : getValue(`performance_difference.btoa_b`),
'performance_difference.dump_a' : getValue(`performance_difference.dump_a`),
'performance_difference.dump_b' : getValue(`performance_difference.dump_b`),
'tampering' : getValue(`tampering`),
'tampering.prototype_of_navigator_vendor' : getValue(`tampering.prototype_of_navigator_vendor`),
'tampering.prototype_of_navigator_mimetypes' : getValue(`tampering.prototype_of_navigator_mimetypes`),
'tampering.prototype_of_navigator_languages' : getValue(`tampering.prototype_of_navigator_languages`),
'tampering.webgl2_rendering_context_to_string' : getValue(`tampering.webgl2_rendering_context_to_string`),
'tampering.function_to_string' : getValue(`tampering.function_to_string`),
'tampering.prototype_of_navigator_hardware_concurrency' : getValue(`tampering.prototype_of_navigator_hardware_concurrency`),
'tampering.webgl2_rendering_context_get_parameter' : getValue(`tampering.webgl2_rendering_context_get_parameter`),
'tampering.prototype_of_navigator_device_memory' : getValue(`tampering.prototype_of_navigator_device_memory`),
'tampering.prototype_of_navigator_permissions' : getValue(`tampering.prototype_of_navigator_permissions`),
'tampering.yes' : getValue(`tampering.yes`),
'tampering.no' : getValue(`tampering.no`),
'vendor_name' : getValue(`vendor_name`),
'vendor_value' : getValue(`vendor_value`),
'value_vendor_name' : getValue(`value_vendor_name`),
'value_vendor_value' : getValue(`value_vendor_value`),
};
}
function extractStAndSr(ast) {
const mainFuncPath = ast.program.body[0].expression.callee.body.body.slice(-2)[0];
let st = null;
let sr = null;
mainFuncPath.body.body[0].expression.right.body.body[0].handler.body.body.forEach((n) => {
if (n.type === `ExpressionStatement` && n.expression.type === `CallExpression`) {
return;
}
const key = n.expression.left.property.value;
if (key === `st`) {
st = n.expression.right.value;
} else if (key === `sr`) {
sr = n.expression.right.value;
}
});
return {
st,
sr
};
}
function extractSignalsKeys2(ast) {
const paths = getSignalsPaths(ast);
const getValue = (key) => {
const func = FINDERS[key];
let foundKey = false;
//console.log(`finding key`, key)
if(key.startsWith("events.")){
const { found, value } = func(paths[0]);
if(found){
foundKey = value;
}
}else{
paths.forEach((currentPath) => {
const { found, value } = func(currentPath);
if(foundKey){
return;
}
if(found){
foundKey = value;
}
});
}
if(!foundKey){
throw Error(`Could not find key:${key} in ast`);
}
return foundKey;
};
const interrogatorId = extractInterrogatorId(ast);
return {
'events' : getValue(`events`),
'events.mouse' : getValue(`events.mouse`),
'events.mouse.type' : getValue(`events.mouse.type`),
'events.mouse.timestamp' : getValue(`events.mouse.timestamp`),
'events.mouse.client_x' : getValue(`events.mouse.client_x`),
'events.mouse.client_y' : getValue(`events.mouse.client_y`),
'events.mouse.screen_x' : getValue(`events.mouse.screen_x`),
'events.mouse.screen_y' : getValue(`events.mouse.screen_y`),
'events.touch' : getValue(`events.touch`),
'events.touch.type' : getValue(`events.touch.type`),
'events.touch.timestamp' : getValue(`events.touch.timestamp`),
'events.touch.identifier' : getValue(`events.touch.identifier`),
'events.touch.client_x' : getValue(`events.touch.client_x`),
'events.touch.client_y' : getValue(`events.touch.client_y`),
'events.touch.screen_x' : getValue(`events.touch.screen_x`),
'events.touch.screen_y' : getValue(`events.touch.screen_y`),
'events.touch.radius_x' : getValue(`events.touch.radius_x`),
'events.touch.radius_y' : getValue(`events.touch.radius_y`),
'events.touch.rotation_angle' : getValue(`events.touch.rotation_angle`),
'events.touch.force' : getValue(`events.touch.force`),
'interrogator_id' : interrogatorId,
'user_agent' : getValue(`user_agent`),
'navigator_language' : getValue(`navigator_language`),
'navigator_languages' : getValue(`navigator_languages`),
'navigator_languages.languages_is_not_undefined' : getValue(`navigator_languages.languages_is_not_undefined`),
'navigator_languages.languages' : getValue(`navigator_languages.languages`),
'navigator_build_id' : getValue(`navigator_build_id`),
'timestamps' : getValue(`timestamps`),
'timestamps.date_get_time' : getValue(`timestamps.date_get_time`),
'timestamps.file_last_modified' : getValue(`timestamps.file_last_modified`),
'timestamps.performance_now' : getValue(`timestamps.performance_now`),
'timestamps.document_timeline' : getValue(`timestamps.document_timeline`),
'timestamps.performance_timing' : getValue(`timestamps.performance_timing`),
'mime_types' : getValue('mime_types'),
'mime_types.suffixes' : getValue('mime_types.suffixes'),
'mime_types.type' : getValue('mime_types.type'),
'mime_types.file_name' : getValue('mime_types.file_name'),
'window_size' : getValue(`window_size`),
'window_size.window_screen_width' : getValue(`window_size.window_screen_width`),
'window_size.window_screen_height' : getValue(`window_size.window_screen_height`),
'window_size.window_screen_avail_height' : getValue(`window_size.window_screen_avail_height`),
'window_size.window_screen_avail_left' : getValue(`window_size.window_screen_avail_left`),
'window_size.window_screen_avail_top' : getValue(`window_size.window_screen_avail_top`),
'window_size.window_screen_avail_width' : getValue(`window_size.window_screen_avail_width`),
'window_size.window_screen_pixel_depth' : getValue(`window_size.window_screen_pixel_depth`),
'window_size.window_inner_width' : getValue(`window_size.window_inner_width`),
'window_size.window_inner_height' : getValue(`window_size.window_inner_height`),
'window_size.window_outer_width' : getValue(`window_size.window_outer_width`),
'window_size.window_outer_height' : getValue(`window_size.window_outer_height`),
'window_size.window_device_pixel_ratio' : getValue(`window_size.window_device_pixel_ratio`),
'window_size.window_screen_orientation_type' : getValue(`window_size.window_screen_orientation_type`),
'window_size.window_screenX' : getValue(`window_size.window_screenX`),
'window_size.window_screenY' : getValue(`window_size.window_screenY`),
'date_get_time_zone_off_set' : getValue(`date_get_time_zone_off_set`),
'has_indexed_db' : getValue(`has_indexed_db`),
'has_body_add_behaviour' : getValue(`has_body_add_behaviour`),
'iframe_null' : getValue('iframe_null'),
'open_database' : getValue(`open_database`),
'cpu_class' : getValue(`cpu_class`),
'platform' : getValue(`platform`),
'do_not_track' : getValue(`do_not_track`),
'plugins_or_active_x_object' : getValue(`plugins_or_active_x_object`),
'plugins_named_item_item_refresh' : getValue(`plugins_named_item_item_refresh`),
'plugins_named_item_item_refresh.named_item' : getValue(`plugins_named_item_item_refresh.named_item`),
'plugins_named_item_item_refresh.item' : getValue(`plugins_named_item_item_refresh.item`),
'plugins_named_item_item_refresh.refresh' : getValue(`plugins_named_item_item_refresh.refresh`),
'canvas_hash' : getValue(`canvas_hash`),
'canvas_hash.is_point_in_path' : getValue(`canvas_hash.is_point_in_path`),
'canvas_hash.to_data_url_image' : getValue(`canvas_hash.to_data_url_image`),
'canvas_hash.screen_is_global_composite_operation' : getValue(`canvas_hash.screen_is_global_composite_operation`),
'canvas_hash.hash' : getValue(`canvas_hash.hash`),
'webgl' : getValue(`webgl`),
'webgl.canvas_hash' : getValue(`webgl.canvas_hash`),
'webgl.get_supported_extensions' : getValue(`webgl.get_supported_extensions`),
'webgl.aliased_line_width_range' : getValue(`webgl.aliased_line_width_range`),
'webgl.aliased_point_size_range' : getValue(`webgl.aliased_point_size_range`),
'webgl.alpha_bits' : getValue(`webgl.alpha_bits`),
'webgl.antialias' : getValue(`webgl.antialias`),
'webgl.blue_bits' : getValue(`webgl.blue_bits`),
'webgl.depth_bits' : getValue(`webgl.depth_bits`),
'webgl.green_bits' : getValue(`webgl.green_bits`),
'webgl.all_bits' : getValue(`webgl.all_bits`),
'webgl.max_combined_texture_image_units' : getValue(`webgl.max_combined_texture_image_units`),
'webgl.max_cube_map_texture_size' : getValue(`webgl.max_cube_map_texture_size`),
'webgl.max_fragment_uniform_vectors' : getValue(`webgl.max_fragment_uniform_vectors`),
'webgl.max_renderbuffer_size' : getValue(`webgl.max_renderbuffer_size`),
'webgl.max_texture_image_units' : getValue(`webgl.max_texture_image_units`),
'webgl.max_texture_size' : getValue(`webgl.max_texture_size`),
'webgl.max_varying_vectors' : getValue(`webgl.max_varying_vectors`),
'webgl.max_vertex_attribs' : getValue(`webgl.max_vertex_attribs`),
'webgl.max_vertex_texture_image_units' : getValue(`webgl.max_vertex_texture_image_units`),
'webgl.max_vertex_uniform_vectors' : getValue(`webgl.max_vertex_uniform_vectors`),
'webgl.max_viewport_dims' : getValue(`webgl.max_viewport_dims`),
'webgl.red_bits' : getValue(`webgl.red_bits`),
'webgl.renderer' : getValue(`webgl.renderer`),
'webgl.shading_language_version' : getValue(`webgl.shading_language_version`),
'webgl.stencil_bits' : getValue(`webgl.stencil_bits`),
'webgl.vendor' : getValue(`webgl.vendor`),
'webgl.version' : getValue(`webgl.version`),
'webgl.shader_precision_vertex_high_float' : getValue(`webgl.shader_precision_vertex_high_float`),
'webgl.shader_precision_vertex_high_float_min' : getValue(`webgl.shader_precision_vertex_high_float_min`),
'webgl.shader_precision_vertex_high_float_max' : getValue(`webgl.shader_precision_vertex_high_float_max`),
'webgl.shader_precision_vertex_medium_float' : getValue(`webgl.shader_precision_vertex_medium_float`),
'webgl.shader_precision_vertex_medium_float_min' : getValue(`webgl.shader_precision_vertex_medium_float_min`),
'webgl.shader_precision_vertex_medium_float_max' : getValue(`webgl.shader_precision_vertex_medium_float_max`),
'webgl.shader_precision_vertex_low_float' : getValue(`webgl.shader_precision_vertex_low_float`),
'webgl.shader_precision_vertex_low_float_min' : getValue(`webgl.shader_precision_vertex_low_float_min`),
'webgl.shader_precision_vertex_low_float_max' : getValue(`webgl.shader_precision_vertex_low_float_max`),
'webgl.shader_precision_fragment_high_float' : getValue(`webgl.shader_precision_fragment_high_float`),
'webgl.shader_precision_fragment_high_float_min' : getValue(`webgl.shader_precision_fragment_high_float_min`),
'webgl.shader_precision_fragment_high_float_max' : getValue(`webgl.shader_precision_fragment_high_float_max`),
'webgl.shader_precision_fragment_medium_float' : getValue(`webgl.shader_precision_fragment_medium_float`),
'webgl.shader_precision_fragment_medium_float_min' : getValue(`webgl.shader_precision_fragment_medium_float_min`),
'webgl.shader_precision_fragment_medium_float_max' : getValue(`webgl.shader_precision_fragment_medium_float_max`),
'webgl.shader_precision_fragment_low_float' : getValue(`webgl.shader_precision_fragment_low_float`),
'webgl.shader_precision_fragment_low_float_min' : getValue(`webgl.shader_precision_fragment_low_float_min`),
'webgl.shader_precision_fragment_low_float_max' : getValue(`webgl.shader_precision_fragment_low_float_max`),
'webgl.shader_precision_vertex_high_int' : getValue(`webgl.shader_precision_vertex_high_int`),
'webgl.shader_precision_vertex_high_int_min' : getValue(`webgl.shader_precision_vertex_high_int_min`),
'webgl.shader_precision_vertex_high_int_max' : getValue(`webgl.shader_precision_vertex_high_int_max`),
'webgl.shader_precision_vertex_medium_int' : getValue(`webgl.shader_precision_vertex_medium_int`),
'webgl.shader_precision_vertex_medium_int_min' : getValue(`webgl.shader_precision_vertex_medium_int_min`),
'webgl.shader_precision_vertex_medium_int_max' : getValue(`webgl.shader_precision_vertex_medium_int_max`),
'webgl.shader_precision_vertex_low_int' : getValue(`webgl.shader_precision_vertex_low_int`),
'webgl.shader_precision_vertex_low_int_min' : getValue(`webgl.shader_precision_vertex_low_int_min`),
'webgl.shader_precision_vertex_low_int_max' : getValue(`webgl.shader_precision_vertex_low_int_max`),
'webgl.shader_precision_fragment_high_int' : getValue(`webgl.shader_precision_fragment_high_int`),
'webgl.shader_precision_fragment_high_int_min' : getValue(`webgl.shader_precision_fragment_high_int_min`),
'webgl.shader_precision_fragment_high_int_max' : getValue(`webgl.shader_precision_fragment_high_int_max`),
'webgl.shader_precision_fragment_medium_int' : getValue(`webgl.shader_precision_fragment_medium_int`),
'webgl.shader_precision_fragment_medium_int_min' : getValue(`webgl.shader_precision_fragment_medium_int_min`),
'webgl.shader_precision_fragment_medium_int_max' : getValue(`webgl.shader_precision_fragment_medium_int_max`),
'webgl.shader_precision_fragment_low_int' : getValue(`webgl.shader_precision_fragment_low_int`),
'webgl.shader_precision_fragment_low_int_min' : getValue(`webgl.shader_precision_fragment_low_int_min`),
'webgl.shader_precision_fragment_low_int_max' : getValue(`webgl.shader_precision_fragment_low_int_max`),
'webgl.unmasked_vendor_webgl' : getValue(`webgl.unmasked_vendor_webgl`),
'webgl.unmasked_renderer_webgl' : getValue(`webgl.unmasked_renderer_webgl`),
'webgl_meta' : getValue(`webgl_meta`),
'webgl_meta.webgl_rendering_context_get_parameter' : getValue(`webgl_meta.webgl_rendering_context_get_parameter`),
'webgl_meta.is_native_webgl_rendering_context_get_parameter' : getValue(`webgl_meta.is_native_webgl_rendering_context_get_parameter`),
'touch_event' : getValue(`touch_event`),
'touch_event.max_touch_points' : getValue(`touch_event.max_touch_points`),
'touch_event.has_touch_event' : getValue(`touch_event.has_touch_event`),
'touch_event.on_touch_start_is_undefined' : getValue(`touch_event.on_touch_start_is_undefined`),
'video' : getValue(`video`),
'video.can_play_type_video_ogg' : getValue(`video.can_play_type_video_ogg`),
'video.can_play_type_video_mp4' : getValue(`video.can_play_type_video_mp4`),
'video.can_play_type_video_webm' : getValue(`video.can_play_type_video_webm`),
'audio' : getValue(`audio`),
'audio.can_play_type_audio_ogg' : getValue(`audio.can_play_type_audio_ogg`),
'audio.can_play_type_audio_mpeg' : getValue(`audio.can_play_type_audio_mpeg`),
'audio.can_play_type_audio_wav' : getValue(`audio.can_play_type_audio_wav`),
'audio.can_play_type_audio_xm4a' : getValue(`audio.can_play_type_audio_xm4a`),
'audio.can_play_type_audio_empty_array' : getValue(`audio.can_play_type_audio_empty_array`),
'audio.can_play_type_audio_mp4' : getValue(`audio.can_play_type_audio_mp4`),
'navigator_vendor' : getValue(`navigator_vendor`),
'navigator_product' : getValue(`navigator_product`),
'navigator_product_sub' : getValue(`navigator_product_sub`),
'browser' : getValue(`browser`),
'browser.is_internet_explorer' : getValue(`browser.is_internet_explorer`),
'browser.chrome' : getValue(`browser.chrome`),
'browser.chrome.load_times' : getValue(`browser.chrome.load_times`),
'browser.chrome.app' : getValue(`browser.chrome.app`),
'browser.chrome.chrome' : getValue(`browser.chrome.chrome`),
'browser.webdriver' : getValue(`browser.webdriver`),
'browser.is_chrome' : getValue(`browser.is_chrome`),
'browser.connection_rtt' : getValue(`browser.connection_rtt`),
'window' : getValue(`window`),
'window.history_length' : getValue(`window.history_length`),
'window.navigator_hardware_concurrency' : getValue(`window.navigator_hardware_concurrency`),
'window.is_window_self_not_window_top' : getValue(`window.is_window_self_not_window_top`),
'window.is_native_navigator_get_battery' : getValue(`window.is_native_navigator_get_battery`),
'window.console_debug_name' : getValue(`window.console_debug_name`),
'window.is_native_console_debug' : getValue(`window.is_native_console_debug`),
'window._phantom' : getValue(`window._phantom`),
'window.call_phantom' : getValue(`window.call_phantom`),
'window.empty' : getValue(`window.empty`),
'window.persistent' : getValue(`window.persistent`),
'window.temporary' : getValue(`window.temporary`),
'window.performance_observer' : getValue(`window.performance_observer`),
'window.performance_observer.supported_entry_types' : getValue(`window.performance_observer.supported_entry_types`),
'document' : getValue(`document`),
'document.document_location_protocol' : getValue(`document.document_location_protocol`),
'canvas_fonts' : getValue(`canvas_fonts`),
'document_children' : getValue(`document_children`),
'document_children.document_with_src' : getValue('document_children.document_with_src'),
'document_children.document_without_src' : getValue('document_children.document_without_src'),
'document_children.document_script_element_children' : getValue(`document_children.document_script_element_children`),
'document_children.document_head_element_children' : getValue(`document_children.document_head_element_children`),
'document_children.document_body_element_children' : getValue(`document_children.document_body_element_children`),
'webgl_rendering_call' : getValue(`webgl_rendering_call`),
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a' : getValue(`webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a`),
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b' : getValue(`webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b`),
'webgl_rendering_call.hash' : getValue(`webgl_rendering_call.hash`),
'window_object_get_own_property_names_a' : getValue(`window_object_get_own_property_names_a`),
'window_object_get_own_property_names_b' : getValue(`window_object_get_own_property_names_b`),
'window_object_get_own_property_names_b.prev' : getValue(`window_object_get_own_property_names_b.prev`),
'window_object_get_own_property_names_b.next' : getValue(`window_object_get_own_property_names_b.next`),
'window_object_get_own_property_names_last_30' : getValue(`window_object_get_own_property_names_last_30`),
'visual_view_port' : getValue(`visual_view_port`),
'visual_view_port.visual_view_port_width' : getValue(`visual_view_port.visual_view_port_width`),
'visual_view_port.visual_view_port_height' : getValue(`visual_view_port.visual_view_port_height`),
'visual_view_port.visual_view_port_scale' : getValue(`visual_view_port.visual_view_port_scale`),
'create_html_document' : getValue(`create_html_document`),
'performance_difference' : getValue(`performance_difference`),
'performance_difference.btoa_a' : getValue(`performance_difference.btoa_a`),
'performance_difference.btoa_b' : getValue(`performance_difference.btoa_b`),
'performance_difference.dump_a' : getValue(`performance_difference.dump_a`),
'performance_difference.dump_b' : getValue(`performance_difference.dump_b`),
'tampering' : getValue(`tampering`),
'tampering.prototype_of_navigator_vendor' : getValue(`tampering.prototype_of_navigator_vendor`),
'tampering.prototype_of_navigator_mimetypes' : getValue(`tampering.prototype_of_navigator_mimetypes`),
'tampering.prototype_of_navigator_languages' : getValue(`tampering.prototype_of_navigator_languages`),
'tampering.webgl2_rendering_context_to_string' : getValue(`tampering.webgl2_rendering_context_to_string`),
'tampering.function_to_string' : getValue(`tampering.function_to_string`),
'tampering.prototype_of_navigator_hardware_concurrency' : getValue(`tampering.prototype_of_navigator_hardware_concurrency`),
'tampering.webgl2_rendering_context_get_parameter' : getValue(`tampering.webgl2_rendering_context_get_parameter`),
'tampering.prototype_of_navigator_device_memory' : getValue(`tampering.prototype_of_navigator_device_memory`),
'tampering.prototype_of_navigator_permissions' : getValue(`tampering.prototype_of_navigator_permissions`),
'tampering.yes' : getValue(`tampering.yes`),
'tampering.no' : getValue(`tampering.no`),
'vendor_name' : getValue(`vendor_name`),
'vendor_value' : getValue(`vendor_value`),
'value_vendor_name' : getValue(`value_vendor_name`),
'value_vendor_value' : getValue(`value_vendor_value`),
};
}
module.exports = {
createEncoderFromPath,
extractEncoderType,
getXorEncoderFromPath,
buildEncoderAndDecoder,
extractXorEncoders,
extractSignalsKeys,
extractStAndSr,
findInVar
};
const t = require(`@babel/types`);
const generate = require(`@babel/generator`).default;
function getPropertyValue(p){
if(p.type === `Identifier`){
return p.node.name;
}else if(p.type === `StringLiteral`){
return p.node.value;
}
}
function findFirstStringifyForward(p){
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getNextSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.JSON\.stringify\((.*?)\) {/)){
return _p;
}
_p = _p.getNextSibling();
}
}
function findFirstStringifyBackwards(p){
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getPrevSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.JSON\.stringify\((.*?)\) {/)){
return _p;
}
_p = _p.getPrevSibling();
}
}
function findFirstBtoaBackwards(p) {
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getPrevSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.btoa\((.*?).join\((""|'')\)\);/)){
return _p;
}
_p = _p.getPrevSibling();
}
};
function findFirstBtoaForward(p) {
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getNextSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.btoa\((.*?).join\((""|'')\)\);/)){
return _p;
}
_p = _p.getNextSibling();
}
};
const findFirstTryBackwards = (p) => {
let _p = p;
while(_p.node !== undefined){
if(_p.type === `TryStatement`){
return _p;
}
_p = _p.getPrevSibling();
}
};
const findFirstTryForward = (p) => {
let _p = p;
while(_p.node !== undefined){
if(_p.type === `TryStatement`){
return _p;
}
_p = _p.getNextSibling();
}
};
function hasValueInCode({code, valueToFind, mode}){
let hasBeenFound = false;
switch(mode){
case `endsWith`:
hasBeenFound = code.endsWith(valueToFind);
break;
case `startsWith`:
hasBeenFound = code.startsWith(valueToFind);
break;
case `includes`:
hasBeenFound = code.includes(valueToFind);
break;
case `regex`:
hasBeenFound = code.match(valueToFind) !== null;
break;
}
return hasBeenFound;
}
function getPropertyValueInAssignment({path, siblingKey}){
const statementParent = path.getStatementParent();
const nextPath = statementParent.getSibling(statementParent.key + siblingKey);
if(!
(nextPath.type === `ExpressionStatement` && nextPath.get(`expression`).type === `AssignmentExpression` &&
nextPath.get(`expression.left`).type === `MemberExpression` &&
(
(nextPath.get(`expression.left.property`).type === `StringLiteral` && nextPath.get(`expression.left.computed`).node) ||
(nextPath.get(`expression.left.property`).type === `Identifier` && !nextPath.get(`expression.left.computed`).node)
)
)
){
return null;
}
const computed = nextPath.get(`expression.left.computed`).node;
const foundKeyValue = nextPath.get(`expression.left.property.${computed ? `value` : `name`}`).node;
return { value : foundKeyValue };
}
function getKeyFromDeclaration({path, valueToFind, mode, siblingKey}){
if(path.get(`declarations`).length !== 1){
return null;
}
const init = path.get(`declarations.0.init`);
const initCode = generate(init.node).code;
const hasBeenFound = hasValueInCode({code : initCode, valueToFind, mode});
if(hasBeenFound){
return getPropertyValueInAssignment({path, siblingKey});
}
return null;
}
function getKeyIfFound({pathQuery, path, valueToFind, mode, siblingKey}){
const code = generate(pathQuery.node).code;
const hasBeenFound = hasValueInCode({code, valueToFind, mode});
if(hasBeenFound){
return getPropertyValueInAssignment({path, siblingKey});
}
return null;
}
function findInVar({path, valueToFind, mode, siblingKey}){
let found = false;
let value = undefined;
// path.traverse({
// VariableDeclaration(varPath){
const foundKeys = getKeyFromDeclaration({path : path, valueToFind, mode, siblingKey});
if(foundKeys !== null){
found = true;
value = foundKeys[`value`];
}
// }
// });
return { found, value };
}
function findInAssignment({path, valueToFind, mode, siblingKey, instance = 0}){
let found = false;
let value = undefined;
let currentInstance = 0;
path.traverse({
AssignmentExpression(assPath){
const foundKeys = getKeyIfFound({pathQuery : assPath.get(`right`), path : assPath, valueToFind, mode, siblingKey});
if(foundKeys !== null){
if(currentInstance === instance){
found = true;
value = foundKeys[`value`];
}else{
currentInstance++;
}
}
}
});
return { found, value };
}
function findInExpression({path, valueToFind, mode, siblingKey}){
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const foundKeys = getKeyIfFound({pathQuery : expPath.get(`expression`), path : expPath, valueToFind, mode, siblingKey});
if(foundKeys !== null){
found = true;
value = foundKeys[`value`];
}
}
});
return { found, value };
}
function findTimestampProperty({path, index}){
let currentIndex = 0;
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`"FINDME";`)){
return;
}
if(index === currentIndex){
found = true;
const leftProp = expPath.get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
currentIndex++;
}
});
return { found, value };
}
const FINDERS = {
"events" : function(path) {
let found = false;
let value = undefined;
let index = 0;
path.traverse({
MemberExpression(memberPath){
const { property } = memberPath.node;
if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(memberPath.parentPath.node)){
const topPath = memberPath.getStatementParent();
for(let currentSibling = topPath;;){
if(
t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
){
index++;
if(index === 2){
value = getPropertyValue(currentSibling.getSibling(currentSibling.key + 3).get(`expression.left.property`));
found = true;
path.stop()
break;
}
}
currentSibling = currentSibling.getNextSibling();
if(generate(currentSibling.node).code === ''){
break;
}
}
}
}
})
return { found, value };
},
"events.mouse" : function(path) {
let found = false;
let value = undefined;
let index = 0;
path.traverse({
MemberExpression(memberPath){
const { property } = memberPath.node;
if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(memberPath.parentPath.node)){
const topPath = memberPath.getStatementParent();
for(let currentSibling = topPath;;){
if(
t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
){
index++;
if(index === 1){
value = getPropertyValue(currentSibling.getNextSibling().get(`expression.left.property`));
found = true;
path.stop()
break;
}
}
currentSibling = currentSibling.getNextSibling();
if(generate(currentSibling.node).code === ''){
break;
}
}
}
}
})
return { found, value };
},
"events.mouse.type" : function(path){
return findInAssignment({path, valueToFind : `["type"]`, mode : `endsWith`, siblingKey : 0});
},
"events.mouse.timestamp" : function(path){
return findInAssignment({path, valueToFind : `["timeStamp"]`, mode : `endsWith`, siblingKey : 0});
},
"events.mouse.client_x" : function(path){
return findInAssignment({path, valueToFind : `["clientX"]`, mode : `endsWith`, siblingKey : 0});
},
"events.mouse.client_y" : function(path){
return findInAssignment({path, valueToFind : `["clientY"]`, mode : `endsWith`, siblingKey : 0});
},
"events.mouse.screen_x" : function(path){
return findInAssignment({path, valueToFind : `["screenX"]`, mode : `endsWith`, siblingKey : 0});
},
"events.mouse.screen_y" : function(path){
return findInAssignment({path, valueToFind : `["screenY"]`, mode : `endsWith`, siblingKey : 0});
},
"events.touch" : function(path) {
let found = false;
let value = undefined;
let index = 0;
path.traverse({
MemberExpression(memberPath){
const { property } = memberPath.node;
if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(memberPath.parentPath.node)){
const topPath = memberPath.getStatementParent();
for(let currentSibling = topPath;;){
if(
t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
){
index++;
if(index === 2){
value = getPropertyValue(currentSibling.getNextSibling().get(`expression.left.property`));
found = true;
path.stop()
break;
}
}
currentSibling = currentSibling.getNextSibling();
if(generate(currentSibling.node).code === ''){
break;
}
}
}
}
})
return { found, value };
},
"events.touch.type" : function(path){
return findInAssignment({path, valueToFind : `["type"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.timestamp" : function(path){
return findInAssignment({path, valueToFind : `["timeStamp"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.identifier" : function(path){
return findInAssignment({path, valueToFind : `["identifier"]`, mode : `endsWith`, siblingKey : 0, instance : 0});
},
"events.touch.client_x" : function(path){
return findInAssignment({path, valueToFind : `["clientX"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.client_y" : function(path){
return findInAssignment({path, valueToFind : `["clientY"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.screen_x" : function(path){
return findInAssignment({path, valueToFind : `["screenX"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.screen_y" : function(path){
return findInAssignment({path, valueToFind : `["screenY"]`, mode : `endsWith`, siblingKey : 0, instance : 1});
},
"events.touch.radius_x" : function(path){
return findInAssignment({path, valueToFind : `["radiusX"]`, mode : `endsWith`, siblingKey : 0, instance : 0});
},
"events.touch.radius_y" : function(path){
return findInAssignment({path, valueToFind : `["radiusY"]`, mode : `endsWith`, siblingKey : 0, instance : 0});
},
"events.touch.rotation_angle" : function(path){
return findInAssignment({path, valueToFind : `["rotationAngle"]`, mode : `endsWith`, siblingKey : 0, instance : 0});
},
"events.touch.force" : function(path){
return findInAssignment({path, valueToFind : `["force"]`, mode : `endsWith`, siblingKey : 0, instance : 0});
},
"interrogator_id" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["userAgent"];`)){
return;
}
found = true;
const nextPath = varPath.parentPath.parentPath.parentPath.parentPath.getPrevSibling();
const leftProp = nextPath.get(`expression.arguments.0.body.body.0.consequent.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"user_agent" : function(path) {
return findInVar({path, valueToFind : `["userAgent"]`, mode : `endsWith`, siblingKey : 1});
},
"navigator_language" : function(path) {
return findInVar({path, valueToFind : `["language"]`, mode : `endsWith`, siblingKey : 1});
},
"navigator_languages" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const { test } = ifPath.node;
if(!(generate(test).code === `window["navigator"]["buildID"] !== undefined`)){
return;
}
if(!t.isBlockStatement(ifPath.node.consequent)){
return;
}
const leftProp = ifPath.getPrevSibling().get("expression.left.property")
found = true;
value = getPropertyValue(leftProp);
ifPath.stop();
}
});
return { found, value };
},
"navigator_languages.languages_is_not_undefined" : function(path) {
return findInAssignment({path, valueToFind : `"languages") !== undefined`, mode : `endsWith`, siblingKey : 0});
},
"navigator_languages.languages" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const code = generate(ifPath.node.test).code;
if(!code.endsWith(`window["navigator"]["languages"] !== undefined`)){
return;
}
found = true;
const leftProp = ifPath.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"navigator_build_id" : function(path){
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const { test } = ifPath.node;
if(!(generate(test).code === `window["navigator"]["buildID"] !== undefined`)){
return;
}
if(!t.isBlockStatement(ifPath.node.consequent)){
return;
}
const bodyLength = ifPath.get("consequent.body").length;
const leftProp = ifPath.get(`consequent.body.${bodyLength - 1}.expression.left.property`);
found = true;
value = getPropertyValue(leftProp);
ifPath.stop();
}
});
return { found, value };
},
"timestamps" : function(path){
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`window["screen"]["width"];`)){
return;
}
found = true;
let nextPath = findFirstBtoaBackwards(expPath);
nextPath = findFirstBtoaBackwards(nextPath.getPrevSibling())
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"timestamps.date_get_time" : function(path){
return findTimestampProperty({path, index : 0});
},
"timestamps.file_last_modified" : function(path){
return findTimestampProperty({path, index : 1});
},
"timestamps.performance_now" : function(path){
return findTimestampProperty({path, index : 2});
},
"timestamps.document_timeline" : function(path){
return findTimestampProperty({path, index : 3});
},
"timestamps.performance_timing" : function(path){
return findTimestampProperty({path, index : 4});
},
"mime_types" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
found = true;
const nextPath = varPath.parentPath.parentPath;
const leftProp = findFirstBtoaForward(nextPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"mime_types.suffixes" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
found = true;
let nextPath = varPath.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.2.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"mime_types.type" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
found = true;
let nextPath = varPath.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.3.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"mime_types.file_name" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
found = true;
let nextPath = varPath.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.4.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_size" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`new window["Date"]()["getTimezoneOffset"]() / -60;`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(varPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_size.window_screen_width" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["width"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_height" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["height"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_avail_height" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["availHeight"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_avail_left" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["availLeft"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_avail_top" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["availTop"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_avail_width" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["availWidth"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_pixel_depth" : function(path) {
return findInAssignment({path, valueToFind : `window["screen"]["pixelDepth"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_inner_width" : function(path) {
return findInAssignment({path, valueToFind : `window["innerWidth"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_inner_height" : function(path) {
return findInAssignment({path, valueToFind : `window["innerHeight"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_outer_width" : function(path) {
return findInAssignment({path, valueToFind : `window["outerWidth"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_outer_height" : function(path) {
return findInAssignment({path, valueToFind : `window["outerHeight"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_device_pixel_ratio" : function(path) {
return findInAssignment({path, valueToFind : `["devicePixelRatio"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screen_orientation_type" : function(path) {
return findInAssignment({path, valueToFind : `["screen"]["orientation"]["type"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screenX" : function(path) {
return findInAssignment({path, valueToFind : `window["screenX"]`, mode : `endsWith`, siblingKey : 0});
},
"window_size.window_screenY" : function(path) {
return findInAssignment({path, valueToFind : `window["screenY"]`, mode : `endsWith`, siblingKey : 0});
},
"date_get_time_zone_off_set" : function(path) {
return findInVar({path, valueToFind : `new window["Date"]()["getTimezoneOffset"]() / -60`, mode : `endsWith`, siblingKey : 1});
},
"has_indexed_db" : function(path) {
let found = false, value = undefined;
path.traverse({
TryStatement(tryPath){
const block = tryPath.get(`block`);
const nodeCode = generate(block.get(`body.0`).node).code;
if(nodeCode.endsWith(`["indexedDB"] ? true : false;`)){
found = true;
const leftProp = tryPath.getSibling(tryPath.key + 2).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
}
});
return { found, value };
},
"has_body_add_behaviour" : function(path) {
return findInVar({path, valueToFind : `["body"]["addBehavior"] ? true : false`, mode : `endsWith`, siblingKey : 1});
},
"iframe_null" : function(path) {
let found = false, value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(code.endsWith(`["openDatabase"] ? true : false;`)){
found = true;
const leftProp = varPath.getSibling(varPath.key - 1).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
}
});
return { found, value };
},
"open_database" : function(path) {
return findInVar({path, valueToFind : `["openDatabase"] ? true : false`, mode : `endsWith`, siblingKey : 1});
},
"cpu_class" : function(path) {
return findInVar({path, valueToFind : `["cpuClass"]`, mode : `endsWith`, siblingKey : 2});
},
"platform" : function(path) {
return findInVar({path, valueToFind : `["platform"]`, mode : `endsWith`, siblingKey : 2});
},
"do_not_track" : function(path) {
return findInVar({path, valueToFind : `["doNotTrack"]`, mode : `endsWith`, siblingKey : 2});
},
"plugins_or_active_x_object" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("plugins");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key + 2).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"plugins_named_item_item_refresh" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["startInternal"]("canvas_d");`)){
return;
}
found = true;
const leftProp = expPath.getPrevSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"plugins_named_item_item_refresh.named_item" : function(path) {
let found = false, value = undefined;
path.traverse({
TryStatement(tryPath){
const block = tryPath.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[0];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["namedItem"]["name"];`)){
found = true;
const leftProp = line.get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
}
});
return { found, value };
},
"plugins_named_item_item_refresh.item" : function(path) {
let found = false, value = undefined;
path.traverse({
TryStatement(tryPath){
const block = tryPath.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[1];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["item"]["name"];`)){
found = true;
const leftProp = line.get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
}
});
return { found, value };
},
"plugins_named_item_item_refresh.refresh" : function(path) {
let found = false, value = undefined;
path.traverse({
TryStatement(tryPath){
const block = tryPath.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[2];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["refresh"]["name"];`)){
found = true;
const leftProp = line.get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
}
});
return { found, value };
},
"canvas_hash" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_o");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"canvas_hash.is_point_in_path" : function(path) {
return findInAssignment({path, valueToFind : `["isPointInPath"](6, 6, "evenodd") === false`, mode : `endsWith`, siblingKey : 0});
},
"canvas_hash.to_data_url_image" : function(path) {
return findInAssignment({path, valueToFind : `["indexOf"]("data:image/webp")`, mode : `endsWith`, siblingKey : 0});
},
"canvas_hash.to_data_url_image_error" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_d");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key - 1).get(`handler.body.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"canvas_hash.screen_is_global_composite_operation" : function(path) {
let found = false;
let value = undefined;
path.traverse({
AssignmentExpression(assPath){
const code = generate(assPath.node).code;
if(!code.endsWith(`["textBaseline"] = "alphabetic"`)){
return;
}
found = true;
const leftProp = assPath.getStatementParent().getPrevSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"canvas_hash.hash" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_io");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("webgl_o");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl.get_supported_extensions" : function(path) {
return findInVar({path, valueToFind : `["getSupportedExtensions"]()`, mode : `endsWith`, siblingKey : 1});
},
"webgl.canvas_hash" : function(path) {
let found = false;
let value = undefined;
path.traverse({
AssignmentExpression(assPath){
const right = assPath.get(`right`);
const rightCode = generate(right.node).code;
if(!rightCode.match(/(.*?)\["canvas"\]\["toDataURL"\]\(\)/)){
return;
}
const tryStatement = assPath.getStatementParent().parentPath.parentPath;
found = true;
const leftProp = tryStatement.getPrevSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl.canvas_hash_error" : function(path) {
let found = false;
let value = undefined;
path.traverse({
AssignmentExpression(assPath){
const right = assPath.get(`right`);
const rightCode = generate(right.node).code;
if(!rightCode.match(/(.*?)\["canvas"\]\["toDataURL"\]\(\)/)){
return;
}
const tryStatement = assPath.getStatementParent().parentPath.parentPath;
found = true;
const leftProp = tryStatement.get(`handler.body.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl.aliased_line_width_range" : function(path) {
return findInAssignment({path, valueToFind : `["ALIASED_LINE_WIDTH_RANGE"]))`, mode : `endsWith`, siblingKey : 0});
},
"webgl.aliased_point_size_range" : function(path) {
return findInAssignment({path, valueToFind : `["ALIASED_POINT_SIZE_RANGE"]))`, mode : `endsWith`, siblingKey : 0});
},
"webgl.alpha_bits" : function(path) {
return findInAssignment({path, valueToFind : `["ALPHA_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.antialias" : function(path) {
return findInAssignment({path, valueToFind : `["antialias"] ? true : false : null`, mode : `endsWith`, siblingKey : 0});
},
"webgl.blue_bits" : function(path) {
return findInAssignment({path, valueToFind : `["BLUE_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.green_bits" : function(path) {
return findInAssignment({path, valueToFind : `["GREEN_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.depth_bits" : function(path) {
return findInAssignment({path, valueToFind : `["DEPTH_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.all_bits" : function(path) {
return findInVar({path, valueToFind : `"getContextAttributes"]()`, mode : `endsWith`, siblingKey : 5});
},
"webgl.max_combined_texture_image_units" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_COMBINED_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_cube_map_texture_size" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_CUBE_MAP_TEXTURE_SIZE"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_fragment_uniform_vectors" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_FRAGMENT_UNIFORM_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_renderbuffer_size" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_RENDERBUFFER_SIZE"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_texture_image_units" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_texture_size" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_TEXTURE_SIZE"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_varying_vectors" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_VARYING_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_vertex_attribs" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_VERTEX_ATTRIBS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_vertex_texture_image_units" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_VERTEX_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_vertex_uniform_vectors" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_VERTEX_UNIFORM_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.max_viewport_dims" : function(path) {
return findInAssignment({path, valueToFind : `["MAX_VIEWPORT_DIMS"]))`, mode : `endsWith`, siblingKey : 0});
},
"webgl.red_bits" : function(path) {
return findInAssignment({path, valueToFind : `["RED_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.renderer" : function(path) {
return findInAssignment({path, valueToFind : `["RENDERER"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.shading_language_version" : function(path) {
return findInAssignment({path, valueToFind : `["SHADING_LANGUAGE_VERSION"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.stencil_bits" : function(path) {
return findInAssignment({path, valueToFind : `["STENCIL_BITS"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.vendor" : function(path) {
return findInAssignment({path, valueToFind : `["VENDOR"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.version" : function(path) {
return findInAssignment({path, valueToFind : `["VERSION"])`, mode : `endsWith`, siblingKey : 0});
},
"webgl.shader_precision_vertex_low_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/ , mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_vertex_low_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_vertex_low_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_vertex_medium_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_vertex_medium_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_vertex_medium_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_vertex_high_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -3});
},
"webgl.shader_precision_vertex_high_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -2});
},
"webgl.shader_precision_vertex_high_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -1});
},
"webgl.shader_precision_vertex_low_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_vertex_low_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_vertex_low_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_vertex_medium_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_vertex_medium_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_vertex_medium_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_vertex_high_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_vertex_high_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_vertex_high_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_low_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_low_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_low_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_medium_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_medium_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_medium_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_high_float" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_high_float_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_high_float_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_low_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_low_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_low_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_medium_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_medium_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_medium_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.shader_precision_fragment_high_int" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 1});
},
"webgl.shader_precision_fragment_high_int_min" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 2});
},
"webgl.shader_precision_fragment_high_int_max" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 3});
},
"webgl.unmasked_vendor_webgl" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["getParameter"\]\((.*?)\["UNMASKED_VENDOR_WEBGL"\]\)/, mode : `regex`, siblingKey : 0});
},
"webgl.unmasked_renderer_webgl" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["getParameter"\]\((.*?)\["UNMASKED_RENDERER_WEBGL"\]\)/, mode : `regex`, siblingKey : 0});
},
"webgl_meta" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("webgl_meta");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key + 2).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl_meta.webgl_rendering_context_get_parameter" : function(path) {
return findInAssignment({path, valueToFind : `window["WebGLRenderingContext"]["prototype"]["getParameter"]["name"]`, mode : `endsWith`, siblingKey : 0});
},
"webgl_meta.is_native_webgl_rendering_context_get_parameter" : function(path) {
return findInAssignment({path, valueToFind : `window["WebGLRenderingContext"]["prototype"]["getParameter"])`, mode : `endsWith`, siblingKey : 0});
},
"touch_event" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["startInternal"]("video");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"touch_event.max_touch_points" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["maxTouchPoints"\]/, mode : `regex`, siblingKey : 0});
},
"touch_event.has_touch_event" : function(path) {
return findInExpression({path, valueToFind : /(.*?)\["createEvent"\]\("TouchEvent"\)/, mode : `regex`, siblingKey : 1});
},
"touch_event.on_touch_start_is_undefined" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["ontouchstart"\] !== undefined/, mode : `regex`, siblingKey : 0});
},
"video" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["startInternal"]("audio");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"video.can_play_type_video_ogg" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/ogg; codecs=\\"theora/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"video.can_play_type_video_mp4" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/mp4; codecs=\\"avc1.42E01E\\""/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"video.can_play_type_video_webm" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/webm; codecs=\\"vp8, vorbis\\""/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("audio");`)){
return;
}
found = true;
const leftProp = findFirstBtoaForward(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_ogg" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/ogg; codecs=\\"vorbis\\""/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_mpeg" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/mpeg"/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_wav" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/wav; codecs=\\"1\\""/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_xm4a" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/x-m4a;"\) \|\| (.*?)\["canPlayType"\]\("audio\/aac;"/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_empty_array" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\(\[\]\)/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"audio.can_play_type_audio_mp4" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/mp4; codecs=\\"avc1\.4D401E\\""/,
mode : `regex`
})){
return;
}
found = true;
const topPath = expPath.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"navigator_vendor" : function(path){
return findInVar({path, valueToFind : /(.*?)\["vendor"\]/, mode : `regex`, siblingKey : 1});
},
"navigator_product" : function(path) {
return findInVar({path, valueToFind : /(.*?)\["product"\]/, mode : `regex`, siblingKey : 1});
},
"navigator_product_sub" : function(path) {
return findInVar({path, valueToFind : /(.*?)\["productSub"\]/, mode : `regex`, siblingKey : 1});
},
"browser" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`window["self"] !== window["top"];`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(expPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"browser.is_internet_explorer" : function(path) {
return findInVar({path, valueToFind : /"Netscape" \&\& (.*?)\["test"\]\((.*?)\["userAgent"\]\)/, mode : `regex`, siblingKey : 1});
},
"browser.is_chrome" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["webdriver"] ? true : false;`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key+2).get(`consequent.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"browser.chrome" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["webdriver"] ? true : false;`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key-1).get(`consequent.body.0.block.body`).slice(-1)[0].get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"browser.chrome.load_times" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["loadTimes"\]/, mode : `regex`, siblingKey : 0});
},
"browser.chrome.app" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["loadTimes"]);`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key+1).get(`block.body.1.consequent.body.5.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"browser.chrome.chrome" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["loadTimes"]);`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key+2).get(`block.body.3.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"browser.webdriver" : function(path) {
return findInVar({path, valueToFind : /(.*?)\["webdriver"\] \? true : false/, mode : `regex`, siblingKey : 1});
},
"browser.connection_rtt" : function(path){
return findInAssignment({path, valueToFind : /(.*?)\["connection"\]\["rtt"\]/, mode : `regex`, siblingKey : 0});
},
"window" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["startInternal"]("canvas_fonts");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key - 5).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window.history_length" : function(path) {
return findInAssignment({path, valueToFind : /window\["history"\]\["length"\]/, mode : `regex`, siblingKey : 0});
},
"window.navigator_hardware_concurrency" : function(path) {
return findInAssignment({path, valueToFind : /window\["navigator"\]\["hardwareConcurrency"\]/, mode : `regex`, siblingKey : 0});
},
"window.is_window_self_not_window_top" : function(path) {
return findInAssignment({path, valueToFind : `window["self"] !== window["top"]`, mode : `endsWith`, siblingKey : 0});
},
"window.is_native_navigator_get_battery" : function(path) {
return findInAssignment({path, valueToFind : /window\["navigator"\]\["getBattery"\]/, mode : `regex`, siblingKey : 0});
},
"window.console_debug_name" : function(path) {
return findInAssignment({path, valueToFind : /window\["console"\]\["debug"\]\["name"\]/, mode : `regex`, siblingKey : 0});
},
"window.is_native_console_debug" : function(path) {
return findInAssignment({path, valueToFind : /window\["console"\]\["debug"\]\)/, mode : `regex`, siblingKey : 0});
},
"window._phantom" : function(path) {
return findInAssignment({path, valueToFind : /window\["_phantom"\] \!== undefined/, mode : `regex`, siblingKey : 0});
},
"window.call_phantom" : function(path) {
return findInAssignment({path, valueToFind : /window\["callPhantom"\] \!== undefined/, mode : `regex`, siblingKey : 0});
},
"window.empty" : function(path) {
return findInAssignment({path, valueToFind : /window\["callPhantom"\] \!== undefined/, mode : `regex`, siblingKey : 3});
},
"window.persistent" : function(path) {
return findInAssignment({path, valueToFind : `window["PERSISTENT"]`, mode : `endsWith`, siblingKey : 0});
},
"window.temporary" : function(path) {
return findInAssignment({path, valueToFind : `window["TEMPORARY"]`, mode : `endsWith`, siblingKey : 0});
},
"window.performance_observer" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const code = generate(ifPath.node.test).code;
if(!code.endsWith(`["PerformanceObserver"] !== undefined`)){
return;
}
found = true;
const leftProp = ifPath.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window.performance_observer.supported_entry_types" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const code = generate(ifPath.node.test).code;
if(!code.startsWith(`window["PerformanceObserver"]["supportedEntryTypes"]`)){
return;
}
const leftProp = ifPath.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
value = getPropertyValue(leftProp);
found = true;
}
});
return { found, value };
},
"document" : function(path) {
return findInExpression({path, valueToFind : /(.*?)\["startInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : -1});
},
"document.document_location_protocol" : function(path) {
return findInAssignment({path, valueToFind : /(.*?)\["location"\]\["protocol"\]/, mode : `regex`, siblingKey : 0});
},
"canvas_fonts" : function(path) {
return findInExpression({path, valueToFind : /(.*?)\["stopInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : 2});
},
"document_children" : function(path) {
return findInExpression({path, valueToFind : /(.*?)\["stopInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : 10});
},
"document_children.document_with_src" : function(path){
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_fonts");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key + 4).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"document_children.document_without_src" : function(path){
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_fonts");`)){
return;
}
found = true;
const leftProp = expPath.getSibling(expPath.key + 5).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"document_children.document_script_element_children" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ForInStatement(forPath){
const code = generate(forPath.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["documentElement"]["children"]`))){
return;
}
found = true;
const leftProp = forPath.getSibling(forPath.key + 1).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"document_children.document_head_element_children" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ForInStatement(forPath){
const code = generate(forPath.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["head"]["children"]`))){
return;
}
found = true;
const leftProp = forPath.getSibling(forPath.key + 1).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"document_children.document_body_element_children" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ForInStatement(forPath){
const code = generate(forPath.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["body"]["children"]`))){
return;
}
found = true;
const leftProp = forPath.getSibling(forPath.key + 1).get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl_rendering_call" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstBtoaBackwards(varPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstTryBackwards(varPath).getPrevSibling().getPrevSibling().get(`block.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstTryBackwards(varPath).getPrevSibling().get(`block.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"webgl_rendering_call.hash" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstTryBackwards(varPath).get(`block.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_object_get_own_property_names_a" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstBtoaForward(varPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_object_get_own_property_names_b" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const nextPath = findFirstBtoaForward(varPath);
const leftProp = findFirstBtoaForward(nextPath.getNextSibling()).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_object_get_own_property_names_b.prev" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const code = generate(ifPath.node.test).code;
if(!code.endsWith(' === "oncontextmenu"')){
return;
}
found = true;
const leftProp = ifPath.get("consequent.body.0.consequent.body.0.expression.left.property")
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_object_get_own_property_names_b.next" : function(path) {
let found = false;
let value = undefined;
path.traverse({
IfStatement(ifPath){
const code = generate(ifPath.node.test).code;
if(!code.endsWith(' === "oncontextmenu"')){
return;
}
found = true;
const leftProp = ifPath.get("consequent.body.1.consequent.body.0.expression.left.property")
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"window_object_get_own_property_names_last_30" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
const codeNext = generate(varPath.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(!codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
found = true;
const leftProp = findFirstBtoaForward(varPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"visual_view_port" : function(path) {
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(expPath){
const code = generate(expPath.node).code;
if(!code.endsWith(`window["visualViewport"]["scale"];`)){
return;
}
found = true;
const leftProp = findFirstBtoaForward(expPath.parentPath.parentPath.parentPath.parentPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"visual_view_port.visual_view_port_width" : function(path) {
return findInAssignment({path, valueToFind : `window["visualViewport"]["width"]`, mode : `endsWith`, siblingKey : 0});
},
"visual_view_port.visual_view_port_height" : function(path) {
return findInAssignment({path, valueToFind : `window["visualViewport"]["height"]`, mode : `endsWith`, siblingKey : 0});
},
"visual_view_port.visual_view_port_scale" : function(path) {
return findInAssignment({path, valueToFind : `window["visualViewport"]["scale"]`, mode : `endsWith`, siblingKey : 0});
},
"create_html_document" : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const nextPath = varPath.parentPath.parentPath.parentPath.parentPath.getPrevSibling();
const leftProp = nextPath.get(`expression.arguments.0.body.body`).slice(-1)[0].get(`consequent.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"performance_difference" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key + 5).get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"performance_difference.dump_a" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key + 2).get(`block.body.6.consequent.body.1.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"performance_difference.dump_b" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key + 2).get(`block.body.6.consequent.body.2.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"performance_difference.btoa_a" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key + 2).get(`block.body.6.consequent.body.8.consequent.body.0.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"performance_difference.btoa_b" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
const leftProp = varPath.getSibling(varPath.key + 2).get(`block.body.6.consequent.body.8.consequent.body.1.expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
found = true;
const nextPath = varPath.getNextSibling();
const leftProp = findFirstBtoaForward(nextPath).getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_vendor' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.0.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_mimetypes' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.1.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_languages' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.2.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.webgl2_rendering_context_to_string' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.3.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.function_to_string' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.4.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_hardware_concurrency' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.5.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.webgl2_rendering_context_get_parameter' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.6.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_device_memory' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.7.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.prototype_of_navigator_permissions' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.right.elements.8.elements.0');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.no' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.body.body.1.consequent.body.0.expression.callee.body.body.0.declarations.0.init.elements.1');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
'tampering.yes' : function(path){
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = varPath.getNextSibling();
found = true;
const leftProp = nextSibling.get('block.body.0.body.body.1.consequent.body.0.expression.callee.body.body.1.expression.right.body.body.0.expression.right.elements.1');
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"vendor_name" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
let nextPath = findFirstBtoaForward(varPath);
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
nextPath = findFirstBtoaForward(nextPath);
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"vendor_value" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
let nextPath = findFirstBtoaForward(varPath);
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
});
return { found, value };
},
"value_vendor_name" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
let nextPath = findFirstStringifyForward(varPath);
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
value = nextPath.get("declarations.0.init.arguments.0").node.value;
}
});
return { found, value };
},
"value_vendor_value" : function(path) {
let found = false;
let value = undefined;
path.traverse({
VariableDeclaration(varPath){
const code = generate(varPath.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
found = true;
let nextPath = findFirstStringifyForward(varPath);
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
value = nextPath.get("declarations.0.init.arguments.0").node.value;
}
});
return { found, value };
},
};
module.exports = {
FINDERS,
findInVar
};
const t = require(`@babel/types`);
const generate = require(`@babel/generator`).default;
function getPropertyValue(p){
if(p.type === `Identifier`){
return p.node.name;
}else if(p.type === `StringLiteral`){
return p.node.value;
}
}
function findFirstStringifyForward(p){
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getNextSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.JSON\.stringify\((.*?)\) {/)){
return _p;
}
_p = _p.getNextSibling();
}
}
function findFirstStringifyBackwards(p){
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getPrevSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.JSON\.stringify\((.*?)\) {/)){
return _p;
}
_p = _p.getPrevSibling();
}
}
function findFirstBtoaBackwards(p) {
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getPrevSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.btoa\((.*?).join\((""|'')\)\);/)){
return _p;
}
_p = _p.getPrevSibling();
}
};
function findFirstBtoaForward(p) {
let _p = p;
while(_p.node !== undefined){
if(!t.isVariableDeclaration(_p.node)){
_p = _p.getNextSibling();
continue;
}
const code = generate(_p.node).code;
if(code.match(/var (.*?) = window\.btoa\((.*?).join\((""|'')\)\);/)){
return _p;
}
_p = _p.getNextSibling();
}
};
const findFirstTryBackwards = (p) => {
let _p = p;
while(_p.node !== undefined){
if(_p.type === `TryStatement`){
return _p;
}
_p = _p.getPrevSibling();
}
};
const findFirstTryForward = (p) => {
let _p = p;
while(_p.node !== undefined){
if(_p.type === `TryStatement`){
return _p;
}
_p = _p.getNextSibling();
}
};
function hasValueInCode({code, valueToFind, mode}){
let hasBeenFound = false;
switch(mode){
case `endsWith`:
hasBeenFound = code.endsWith(valueToFind);
break;
case `startsWith`:
hasBeenFound = code.startsWith(valueToFind);
break;
case `includes`:
hasBeenFound = code.includes(valueToFind);
break;
case `regex`:
hasBeenFound = code.match(valueToFind) !== null;
break;
}
return hasBeenFound;
}
function getPropertyValueInAssignment({path, siblingKey}){
const statementParent = path.getStatementParent();
const nextPath = statementParent.getSibling(statementParent.key + siblingKey);
if(!
(nextPath.type === `ExpressionStatement` && nextPath.get(`expression`).type === `AssignmentExpression` &&
nextPath.get(`expression.left`).type === `MemberExpression` &&
(
(nextPath.get(`expression.left.property`).type === `StringLiteral` && nextPath.get(`expression.left.computed`).node) ||
(nextPath.get(`expression.left.property`).type === `Identifier` && !nextPath.get(`expression.left.computed`).node)
)
)
){
return null;
}
const computed = nextPath.get(`expression.left.computed`).node;
const foundKeyValue = nextPath.get(`expression.left.property.${computed ? `value` : `name`}`).node;
return { value : foundKeyValue };
}
function getKeyFromDeclaration({path, valueToFind, mode, siblingKey}){
if(path.get(`declarations`).length !== 1){
return null;
}
const init = path.get(`declarations.0.init`);
const initCode = generate(init.node).code;
const hasBeenFound = hasValueInCode({code : initCode, valueToFind, mode});
if(hasBeenFound){
return getPropertyValueInAssignment({path, siblingKey});
}
return null;
}
function getKeyIfFound({pathQuery, path, valueToFind, mode, siblingKey}){
const code = generate(pathQuery.node).code;
const hasBeenFound = hasValueInCode({code, valueToFind, mode});
if(hasBeenFound){
return getPropertyValueInAssignment({path, siblingKey});
}
return null;
}
function findTimestampProperty({key,index}){
let currentIndex = 0;
let found = false;
let value = undefined;
path.traverse({
ExpressionStatement(path){
const code = generate(path.node).code;
if(!code.endsWith(`"FINDME";`)){
return;
}
if(index === currentIndex){
found = true;
const leftProp = path.get(`expression.left.property`);
value = getPropertyValue(leftProp);
}
currentIndex++;
}
});
return { found, value };
}
function extractSignals({signalPaths}){
let findMeIndex = 0;
const FINDERS = {
'events' : false,
'events.mouse' : false,
'events.mouse.type' : false,
'events.mouse.timestamp' : false,
'events.mouse.client_x' : false,
'events.mouse.client_y' : false,
'events.mouse.screen_x' : false,
'events.mouse.screen_y' : false,
'events.touch' : false,
'events.touch.type' : false,
'events.touch.timestamp' : false,
'events.touch.identifier' : false,
'events.touch.client_x' : false,
'events.touch.client_y' : false,
'events.touch.screen_x' : false,
'events.touch.screen_y' : false,
'events.touch.radius_x' : false,
'events.touch.radius_y' : false,
'events.touch.rotation_angle' : false,
'events.touch.force' : false,
'interrogator_id' : false,
'user_agent' : false,
'navigator_language' : false,
'navigator_languages' : false,
'navigator_languages.languages_is_not_undefined' : false,
'navigator_languages.languages' : false,
'navigator_build_id' : false,
'timestamps' : false,
'timestamps.date_get_time' : false,
'timestamps.file_last_modified' : false,
'timestamps.performance_now' : false,
'timestamps.document_timeline' : false,
'timestamps.performance_timing' : false,
'mime_types' : false,
'mime_types.suffixes' : false,
'mime_types.type' : false,
'mime_types.file_name' : false,
'window_size' : false,
'window_size.window_screen_width' : false,
'window_size.window_screen_height' : false,
'window_size.window_screen_avail_height' : false,
'window_size.window_screen_avail_left' : false,
'window_size.window_screen_avail_top' : false,
'window_size.window_screen_avail_width' : false,
'window_size.window_screen_pixel_depth' : false,
'window_size.window_inner_width' : false,
'window_size.window_inner_height' : false,
'window_size.window_outer_width' : false,
'window_size.window_outer_height' : false,
'window_size.window_device_pixel_ratio' : false,
'window_size.window_screen_orientation_type' : false,
'window_size.window_screenX' : false,
'window_size.window_screenY' : false,
'date_get_time_zone_off_set' : false,
'has_indexed_db' : false,
'has_body_add_behaviour' : false,
'iframe_null' : false,
'open_database' : false,
'cpu_class' : false,
'platform' : false,
'do_not_track' : false,
'plugins_or_active_x_object' : false,
'plugins_named_item_item_refresh' : false,
'plugins_named_item_item_refresh.named_item' : false,
'plugins_named_item_item_refresh.item' : false,
'plugins_named_item_item_refresh.refresh' : false,
'canvas_hash' : false,
'canvas_hash.is_point_in_path' : false,
'canvas_hash.to_data_url_image' : false,
'canvas_hash.screen_is_global_composite_operation' : false,
'canvas_hash.hash' : false,
'webgl' : false,
'webgl.canvas_hash' : false,
'webgl.get_supported_extensions' : false,
'webgl.aliased_line_width_range' : false,
'webgl.aliased_point_size_range' : false,
'webgl.alpha_bits' : false,
'webgl.antialias' : false,
'webgl.blue_bits' : false,
'webgl.depth_bits' : false,
'webgl.green_bits' : false,
'webgl.all_bits' : false,
'webgl.max_combined_texture_image_units' : false,
'webgl.max_cube_map_texture_size' : false,
'webgl.max_fragment_uniform_vectors' : false,
'webgl.max_renderbuffer_size' : false,
'webgl.max_texture_image_units' : false,
'webgl.max_texture_size' : false,
'webgl.max_varying_vectors' : false,
'webgl.max_vertex_attribs' : false,
'webgl.max_vertex_texture_image_units' : false,
'webgl.max_vertex_uniform_vectors' : false,
'webgl.max_viewport_dims' : false,
'webgl.red_bits' : false,
'webgl.renderer' : false,
'webgl.shading_language_version' : false,
'webgl.stencil_bits' : false,
'webgl.vendor' : false,
'webgl.version' : false,
'webgl.shader_precision_vertex_high_float' : false,
'webgl.shader_precision_vertex_high_float_min' : false,
'webgl.shader_precision_vertex_high_float_max' : false,
'webgl.shader_precision_vertex_medium_float' : false,
'webgl.shader_precision_vertex_medium_float_min' : false,
'webgl.shader_precision_vertex_medium_float_max' : false,
'webgl.shader_precision_vertex_low_float' : false,
'webgl.shader_precision_vertex_low_float_min' : false,
'webgl.shader_precision_vertex_low_float_max' : false,
'webgl.shader_precision_fragment_high_float' : false,
'webgl.shader_precision_fragment_high_float_min' : false,
'webgl.shader_precision_fragment_high_float_max' : false,
'webgl.shader_precision_fragment_medium_float' : false,
'webgl.shader_precision_fragment_medium_float_min' : false,
'webgl.shader_precision_fragment_medium_float_max' : false,
'webgl.shader_precision_fragment_low_float' : false,
'webgl.shader_precision_fragment_low_float_min' : false,
'webgl.shader_precision_fragment_low_float_max' : false,
'webgl.shader_precision_vertex_high_int' : false,
'webgl.shader_precision_vertex_high_int_min' : false,
'webgl.shader_precision_vertex_high_int_max' : false,
'webgl.shader_precision_vertex_medium_int' : false,
'webgl.shader_precision_vertex_medium_int_min' : false,
'webgl.shader_precision_vertex_medium_int_max' : false,
'webgl.shader_precision_vertex_low_int' : false,
'webgl.shader_precision_vertex_low_int_min' : false,
'webgl.shader_precision_vertex_low_int_max' : false,
'webgl.shader_precision_fragment_high_int' : false,
'webgl.shader_precision_fragment_high_int_min' : false,
'webgl.shader_precision_fragment_high_int_max' : false,
'webgl.shader_precision_fragment_medium_int' : false,
'webgl.shader_precision_fragment_medium_int_min' : false,
'webgl.shader_precision_fragment_medium_int_max' : false,
'webgl.shader_precision_fragment_low_int' : false,
'webgl.shader_precision_fragment_low_int_min' : false,
'webgl.shader_precision_fragment_low_int_max' : false,
'webgl.unmasked_vendor_webgl' : false,
'webgl.unmasked_renderer_webgl' : false,
'webgl_meta' : false,
'webgl_meta.webgl_rendering_context_get_parameter' : false,
'webgl_meta.is_native_webgl_rendering_context_get_parameter' : false,
'touch_event' : false,
'touch_event.max_touch_points' : false,
'touch_event.has_touch_event' : false,
'touch_event.on_touch_start_is_undefined' : false,
'video' : false,
'video.can_play_type_video_ogg' : false,
'video.can_play_type_video_mp4' : false,
'video.can_play_type_video_webm' : false,
'audio' : false,
'audio.can_play_type_audio_ogg' : false,
'audio.can_play_type_audio_mpeg' : false,
'audio.can_play_type_audio_wav' : false,
'audio.can_play_type_audio_xm4a' : false,
'audio.can_play_type_audio_empty_array' : false,
'audio.can_play_type_audio_mp4' : false,
'navigator_vendor' : false,
'navigator_product' : false,
'navigator_product_sub' : false,
'browser' : false,
'browser.is_internet_explorer' : false,
'browser.chrome' : false,
'browser.chrome.load_times' : false,
'browser.chrome.app' : false,
'browser.chrome.chrome' : false,
'browser.webdriver' : false,
'browser.is_chrome' : false,
'browser.connection_rtt' : false,
'window' : false,
'window.history_length' : false,
'window.navigator_hardware_concurrency' : false,
'window.is_window_self_not_window_top' : false,
'window.is_native_navigator_get_battery' : false,
'window.console_debug_name' : false,
'window.is_native_console_debug' : false,
'window._phantom' : false,
'window.call_phantom' : false,
'window.empty' : false,
'window.persistent' : false,
'window.temporary' : false,
'window.performance_observer' : false,
'window.performance_observer.supported_entry_types' : false,
'document' : false,
'document.document_location_protocol' : false,
'canvas_fonts' : false,
'document_children' : false,
'document_children.document_with_src' : false,
'document_children.document_without_src' : false,
'document_children.document_script_element_children' : false,
'document_children.document_head_element_children' : false,
'document_children.document_body_element_children' : false,
'webgl_rendering_call' : false,
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a' : false,
'webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b' : false,
'webgl_rendering_call.hash' : false,
'window_object_get_own_property_names_a' : false,
'window_object_get_own_property_names_b' : false,
'window_object_get_own_property_names_b.prev' : false,
'window_object_get_own_property_names_b.next' : false,
'window_object_get_own_property_names_last_30' : false,
'visual_view_port' : false,
'visual_view_port.visual_view_port_width' : false,
'visual_view_port.visual_view_port_height' : false,
'visual_view_port.visual_view_port_scale' : false,
'create_html_document' : false,
'performance_difference' : false,
'performance_difference.btoa_a' : false,
'performance_difference.btoa_b' : false,
'performance_difference.dump_a' : false,
'performance_difference.dump_b' : false,
'tampering' : false,
'tampering.prototype_of_navigator_vendor' : false,
'tampering.prototype_of_navigator_mimetypes' : false,
'tampering.prototype_of_navigator_languages' : false,
'tampering.webgl2_rendering_context_to_string' : false,
'tampering.function_to_string' : false,
'tampering.prototype_of_navigator_hardware_concurrency' : false,
'tampering.webgl2_rendering_context_get_parameter' : false,
'tampering.prototype_of_navigator_device_memory' : false,
'tampering.prototype_of_navigator_permissions' : false,
'tampering.yes' : false,
'tampering.no' : false,
'vendor_name' : false,
'vendor_value' : false,
'value_vendor_name' : false,
'value_vendor_value' : false,
};
signalPaths.forEach((signalPath) =>
signalPath.traverse({
VariableDeclaration(path){
const findInVar = (({key, valueToFind, mode, siblingKey}) => {
const foundKeys = getKeyFromDeclaration({path, valueToFind, mode, siblingKey});
if(foundKeys !== null){
FINDERS[key] = foundKeys['value'];
}
});
findInVar({key: 'webgl.all_bits', valueToFind : `"getContextAttributes"]()`, mode : `endsWith`, siblingKey : 5});
findInVar({key: 'user_agent', valueToFind : `["userAgent"]`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'navigator_language', valueToFind : `["language"]`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'date_get_time_zone_off_set', valueToFind : `new window["Date"]()["getTimezoneOffset"]() / -60`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'open_database', valueToFind : `["openDatabase"] ? true : false`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'cpu_class', valueToFind : `["cpuClass"]`, mode : `endsWith`, siblingKey : 2});
findInVar({key: 'platform', valueToFind : `["platform"]`, mode : `endsWith`, siblingKey : 2});
findInVar({key: 'do_not_track', valueToFind : `["doNotTrack"]`, mode : `endsWith`, siblingKey : 2});
findInVar({key: 'has_body_add_behaviour', valueToFind : `["body"]["addBehavior"] ? true : false`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'webgl.get_supported_extensions', valueToFind : `["getSupportedExtensions"]()`, mode : `endsWith`, siblingKey : 1});
findInVar({key: 'navigator_vendor', valueToFind : /(.*?)\["vendor"\]/, mode : `regex`, siblingKey : 1});
findInVar({key: 'navigator_product', valueToFind : /(.*?)\["product"\]/, mode : `regex`, siblingKey : 1});
findInVar({key: 'navigator_product_sub', valueToFind : /(.*?)\["productSub"\]/, mode : `regex`, siblingKey : 1});
findInVar({key: 'browser.is_internet_explorer', valueToFind : /"Netscape" \&\& (.*?)\["test"\]\((.*?)\["userAgent"\]\)/, mode : `regex`, siblingKey : 1});
findInVar({key: 'browser.webdriver', valueToFind : /(.*?)\["webdriver"\] \? true : false/, mode : `regex`, siblingKey : 1});
// (() => {
//
// const code = generate(path.node).code;
//
// if(!code.endsWith(`["userAgent"];`)){
// return;
// }
//
// const nextPath = path.parentPath.parentPath.parentPath.parentPath.getPrevSibling();
// const leftProp = nextPath.get(`expression.arguments.0.body.body.0.consequent.body.0.expression.left.property`);
// FINDERS['interrogator_id'] = getPropertyValue(leftProp);
//
// })();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["webdriver"] ? true : false;`)){
return;
}
const leftProp = path.getSibling(path.key+2).get(`consequent.body.0.expression.left.property`);
FINDERS['browser.is_chrome'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["webdriver"] ? true : false;`)){
return;
}
const leftProp = path.getSibling(path.key-1).get(`consequent.body.0.block.body`).slice(-1)[0].get(`expression.left.property`);
FINDERS['browser.chrome'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextPath = path.getNextSibling();
const leftProp = findFirstBtoaForward(nextPath).getNextSibling().get(`expression.left.property`);
FINDERS['tampering'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.0.elements.0');
FINDERS['tampering.prototype_of_navigator_vendor'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.1.elements.0');
FINDERS['tampering.prototype_of_navigator_mimetypes'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.2.elements.0');
FINDERS['tampering.prototype_of_navigator_languages'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.3.elements.0');
FINDERS['tampering.webgl2_rendering_context_to_string'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.4.elements.0');
FINDERS['tampering.function_to_string'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.5.elements.0');
FINDERS['tampering.prototype_of_navigator_hardware_concurrency'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.6.elements.0');
FINDERS['tampering.webgl2_rendering_context_get_parameter'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.7.elements.0');
FINDERS['tampering.prototype_of_navigator_device_memory'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.right.elements.8.elements.0');
FINDERS['tampering.prototype_of_navigator_permissions'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.body.body.1.consequent.body.0.expression.callee.body.body.0.declarations.0.init.elements.1');
FINDERS['tampering.no'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["String"]["prototype"]["replace"];`)){
return;
}
const nextSibling = path.getNextSibling();
const leftProp = nextSibling.get('block.body.0.body.body.1.consequent.body.0.expression.callee.body.body.1.expression.right.body.body.0.expression.right.elements.1');
FINDERS['tampering.yes'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
let nextPath = findFirstBtoaForward(path);
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
nextPath = findFirstBtoaForward(nextPath);
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
FINDERS['vendor_name'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
let nextPath = findFirstBtoaForward(path);
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
nextPath = findFirstBtoaForward(nextPath.getNextSibling());
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
FINDERS['vendor_value'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
let nextPath = findFirstStringifyForward(path);
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
FINDERS['value_vendor_name'] = nextPath.get("declarations.0.init.arguments.0").node.value;
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
let nextPath = findFirstStringifyForward(path);
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
nextPath = findFirstStringifyForward(nextPath.getNextSibling());
FINDERS['value_vendor_value'] = nextPath.get("declarations.0.init.arguments.0").node.value;
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const nextPath = path.parentPath.parentPath.parentPath.parentPath.getPrevSibling();
const leftProp = nextPath.get(`expression.arguments.0.body.body`).slice(-1)[0].get(`consequent.body.0.expression.left.property`);
FINDERS['create_html_document'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 5).get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
FINDERS['performance_difference'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`block.body.6.consequent.body.1.expression.left.property`);
FINDERS['performance_difference.dump_a'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`block.body.6.consequent.body.2.expression.left.property`);
FINDERS['performance_difference.dump_b'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`block.body.6.consequent.body.8.consequent.body.0.expression.left.property`);
FINDERS['performance_difference.btoa_a']= getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`block.body.6.consequent.body.8.consequent.body.1.expression.left.property`);
FINDERS['performance_difference.btoa_b'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["dump"];`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`block.body.6.consequent.body.8.consequent.body.1.expression.left.property`);
FINDERS['performance_difference'] = getPropertyValue(leftProp);
})();
// (() => {
//
// const code = generate(path.node).code;
// const codeNext = generate(path.getNextSibling().node).code;
//
// if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
// return;
// }
//
// if(codeNext.endsWith(`\\\\udbff]$");`)){
// return;
// }
//
// const leftProp = findFirstTryBackwards(path).getPrevSibling().getPrevSibling().get(`block.body.0.expression.left.property`);
// FINDERS['webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_a']= getPropertyValue(leftProp);
//
// })();
// (() => {
// const code = generate(path.node).code;
// const codeNext = generate(path.getNextSibling().node).code;
//
// if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
// return;
// }
//
// if(codeNext.endsWith(`\\\\udbff]$");`)){
// return;
// }
//
// const leftProp = findFirstTryBackwards(path).getPrevSibling().get(`block.body.0.expression.left.property`);
// FINDERS['webgl_rendering_call.webgl_rendering_context_prototype_get_parameter_call_b'] = getPropertyValue(leftProp);
//
// })();
(() => {
const code = generate(path.node).code;
const codeNext = generate(path.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
const leftProp = findFirstTryBackwards(path).get(`block.body.0.expression.left.property`);
FINDERS['webgl_rendering_call.hash'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
const codeNext = generate(path.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
const leftProp = findFirstBtoaForward(path).getNextSibling().get(`expression.left.property`);
FINDERS['window_object_get_own_property_names_a'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
const codeNext = generate(path.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
const nextPath = findFirstBtoaForward(path);
const leftProp = findFirstBtoaForward(nextPath.getNextSibling()).getNextSibling().get(`expression.left.property`);
FINDERS['window_object_get_own_property_names_b'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
const nextPath = path.parentPath.parentPath;
const leftProp = findFirstBtoaForward(nextPath).getNextSibling().get(`expression.left.property`);
FINDERS['mime_types'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
let nextPath = path.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.2.expression.left.property`);
FINDERS['mime_types.suffixes'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
let nextPath = path.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.3.expression.left.property`);
FINDERS['mime_types.type'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["mimeTypes"];`)){
return;
}
let nextPath = path.getNextSibling();
const leftProp = nextPath.get(`body.body.1.consequent.body.0.expression.callee.body.body.0.block.body.4.expression.left.property`);
FINDERS['mime_types.file_name'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`new window["Date"]()["getTimezoneOffset"]() / -60;`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['window_size'] = getPropertyValue(leftProp);
})();
// (() => {
// const code = generate(path.node).code;
//
// if(code.endsWith(`["openDatabase"] ? true : false;`)){
// const leftProp = path.getSibling(path.key - 1).get(`expression.left.property`);
// FINDERS['iframe_null'] = getPropertyValue(leftProp);
// }
// })();
(() => {
const code = generate(path.node).code;
const codeNext = generate(path.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['webgl_rendering_call'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
const codeNext = generate(path.getNextSibling().node).code;
if(!code.endsWith(`window["Object"]["getOwnPropertyNames"](window);`)){
return;
}
if(!codeNext.endsWith(`\\\\udbff]$");`)){
return;
}
const leftProp = findFirstBtoaForward(path).getNextSibling().get(`expression.left.property`);
FINDERS['window_object_get_own_property_names_last_30'] = getPropertyValue(leftProp);
})();
},
MemberExpression(path){
const { property } = path.node;
// (() => {
//
// let index = 0;
// if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(path.parentPath.node)){
// const topPath = path.getStatementParent();
//
// for(let currentSibling = topPath;;){
//
// if(
// t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
// generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
// ){
// index++;
// if(index === 2){
// FINDERS['events'] = getPropertyValue(currentSibling.getSibling(currentSibling.key + 3).get(`expression.left.property`));
// break;
// }
// }
//
// currentSibling = currentSibling.getNextSibling();
//
// if(generate(currentSibling.node).code === ''){
// break;
// }
// }
// }
// })();
// (() => {
// let index = 0;
// if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(path.parentPath.node)){
// const topPath = path.getStatementParent();
// for(let currentSibling = topPath;;){
//
// if(
// t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
// generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
// ){
// index++;
// if(index === 1){
// FINDERS['events.mouse'] = getPropertyValue(currentSibling.getNextSibling().get(`expression.left.property`));
// break;
// }
// }
//
// currentSibling = currentSibling.getNextSibling();
//
// if(generate(currentSibling.node).code === ''){
// break;
// }
// }
//
// }
//
// })();
// (() => {
// let index = 0;
//
// if(t.isStringLiteral(property) && property.value === "abort" && t.isAssignmentExpression(path.parentPath.node)){
// const topPath = path.getStatementParent();
//
// for(let currentSibling = topPath;;){
//
// if(
// t.isExpressionStatement(currentSibling.node) && t.isCallExpression(currentSibling.node.expression) &&
// generate(currentSibling.node.expression.callee).code.endsWith(`["push"]`)
// ){
// index++;
// if(index === 2){
// FINDERS['events.touch'] = getPropertyValue(currentSibling.getNextSibling().get(`expression.left.property`));
// break;
// }
// }
//
// currentSibling = currentSibling.getNextSibling();
//
// if(generate(currentSibling.node).code === ''){
// break;
// }
// }
//
// }
//
// })();
},
ExpressionStatement(path){
const findInExpression = (({key, valueToFind, mode, siblingKey}) => {
const foundKeys = getKeyIfFound({pathQuery : path.get(`expression`), path, valueToFind, mode, siblingKey});
if(foundKeys !== null){
FINDERS[key] = foundKeys['value'];
}
});
findInExpression({key: 'touch_event.has_touch_event', valueToFind : /(.*?)\["createEvent"\]\("TouchEvent"\)/, mode : `regex`, siblingKey : 1});
findInExpression({key: 'document', valueToFind : /(.*?)\["startInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : -1});
findInExpression({key: 'canvas_fonts', valueToFind : /(.*?)\["stopInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : 2});
findInExpression({key: 'document_children', valueToFind : /(.*?)\["stopInternal"\]\("canvas_fonts"\)/, mode : `regex`, siblingKey : 10});
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["startInternal"]("video");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['touch_event'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["startInternal"]("audio");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS["video"] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/ogg; codecs=\\"theora/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['video.can_play_type_video_ogg'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/mp4; codecs=\\"avc1.42E01E\\""/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['video.can_play_type_video_mp4'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/webm; codecs=\\"vp8, vorbis\\""/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['video.can_play_type_video_webm'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("audio");`)){
return;
}
const leftProp = findFirstBtoaForward(path).getNextSibling().get(`expression.left.property`);
FINDERS['audio'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/ogg; codecs=\\"vorbis\\""/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_ogg'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/mpeg"/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_mpeg'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/wav; codecs=\\"1\\""/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_wav'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("audio\/x-m4a;"\) \|\| (.*?)\["canPlayType"\]\("audio\/aac;"/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_xm4a'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\(\[\]\)/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_empty_array'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(
!hasValueInCode({
code,
valueToFind : /(.*?)\["canPlayType"\]\("video\/mp4; codecs=\\"avc1\.4D401E\\""/,
mode : `regex`
})){
return;
}
const topPath = path.parentPath.parentPath;
const leftProp = topPath.getSibling(topPath.key + 2).get(`expression.left.property`)
FINDERS['audio.can_play_type_audio_mp4']= getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`window["self"] !== window["top"];`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['browser'] = getPropertyValue(leftProp);
})();
// (() => {
// const code = generate(path.node).code;
//
// if(!code.endsWith(`["loadTimes"]);`)){
// return;
// }
//
// const leftProp = path.getSibling(path.key+1).get(`block.body.1.consequent.body.5.expression.left.property`);
// FINDERS['browser.chrome.app'] = getPropertyValue(leftProp);
//
// })();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["loadTimes"]);`)){
return;
}
const leftProp = path.getSibling(path.key+2).get(`block.body.3.expression.left.property`);
FINDERS['browser.chrome.chrome'] = getPropertyValue(leftProp);
})(),
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["startInternal"]("canvas_fonts");`)){
return;
}
const leftProp = path.getSibling(path.key - 5).get(`expression.left.property`);
FINDERS['window'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("webgl_meta");`)){
return;
}
const leftProp = path.getSibling(path.key + 2).get(`expression.left.property`);
FINDERS['webgl_meta'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`window["screen"]["width"];`)){
return;
}
let nextPath = findFirstBtoaBackwards(path);
nextPath = findFirstBtoaBackwards(nextPath.getPrevSibling())
const leftProp = nextPath.getNextSibling().get(`expression.left.property`);
FINDERS['timestamps'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`window["visualViewport"]["scale"];`)){
return;
}
const leftProp = findFirstBtoaForward(path.parentPath.parentPath.parentPath.parentPath).getNextSibling().get(`expression.left.property`);
FINDERS['visual_view_port'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_fonts");`)){
return;
}
const leftProp = path.getSibling(path.key + 4).get(`expression.left.property`);
FINDERS['document_children.document_with_src'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_fonts");`)){
return;
}
const leftProp = path.getSibling(path.key + 5).get(`expression.left.property`);
FINDERS['document_children.document_without_src'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("webgl_o");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['webgl'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_o");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['canvas_hash'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_io");`)){
return;
}
const leftProp = findFirstBtoaBackwards(path).getNextSibling().get(`expression.left.property`);
FINDERS['canvas_hash.hash'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["stopInternal"]("canvas_d");`)){
return;
}
const leftProp = path.getSibling(path.key - 1).get(`handler.body.body.0.expression.left.property`);
FINDERS['canvas_hash.to_data_url_image_error'] = getPropertyValue(leftProp);
})();
// (() => {
//
// const code = generate(path.node).code;
//
// if(!code.endsWith(`["stopInternal"]("plugins");`)){
// return;
// }
//
// const leftProp = path.getSibling(path.key + 2).get(`expression.left.property`);
// FINDERS['plugins_or_active_x_object'] = getPropertyValue(leftProp);
//
// })();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["startInternal"]("canvas_d");`)){
return;
}
const leftProp = path.getPrevSibling().get(`expression.left.property`);
FINDERS['plugins_named_item_item_refresh'] = getPropertyValue(leftProp);
})();
const code = generate(path.node).code;
if(code.endsWith(`"FINDME";`)){
let keyName = null;
switch(findMeIndex){
case 0:
keyName = 'timestamps.date_get_time';
break;
case 1:
keyName = 'timestamps.file_last_modified';
break;
case 2:
keyName = 'timestamps.performance_now';
break;
case 3:
keyName = 'timestamps.document_timeline';
break;
case 4:
keyName = 'timestamps.performance_timing';
default:
}
if(findMeIndex < 5){
leftProp = path.get(`expression.left.property`);
FINDERS[keyName] = getPropertyValue(leftProp);
}
findMeIndex++;
}
},
AssignmentExpression(path){
const findInAssignment = (({key, valueToFind, mode, siblingKey, instance = 0}) => {
let currentInstance = 0;
const foundKeys = getKeyIfFound({pathQuery : path.get(`right`), path, valueToFind, mode, siblingKey});
if(foundKeys !== null){
if(currentInstance === instance){
FINDERS[key] = foundKeys[`value`];
}else{
currentInstance++;
}
}
});
!(FINDERS['events.mouse.type']) && findInAssignment({key : 'events.mouse.type', valueToFind : `["type"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.mouse.timestamp']) && findInAssignment({key : 'events.mouse.timestamp', valueToFind : `["timeStamp"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.mouse.client_x']) && findInAssignment({key : 'events.mouse.client_x', valueToFind : `["clientX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.mouse.client_y']) && findInAssignment({key : 'events.mouse.client_y', valueToFind : `["clientY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.mouse.screen_x']) && findInAssignment({key : 'events.mouse.screen_x', valueToFind : `["screenX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.mouse.screen_y']) && findInAssignment({key : 'events.mouse.screen_y', valueToFind : `["screenY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.type']) && findInAssignment({key : 'events.touch.type', valueToFind : `["type"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.timestamp']) && findInAssignment({key : 'events.touch.timestamp', valueToFind : `["timeStamp"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.identifier']) && findInAssignment({key : 'events.touch.identifier', valueToFind : `["identifier"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.client_x']) && findInAssignment({key : 'events.touch.client_x', valueToFind : `["clientX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.client_y']) && findInAssignment({key : 'events.touch.client_y', valueToFind : `["clientY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.screen_x']) && findInAssignment({key : 'events.touch.screen_x', valueToFind : `["screenX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.screen_y']) && findInAssignment({key : 'events.touch.screen_y', valueToFind : `["screenY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.radius_x']) && findInAssignment({key : 'events.touch.radius_x', valueToFind : `["radiusX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.radius_y']) && findInAssignment({key : 'events.touch.radius_y', valueToFind : `["radiusY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.rotation_angle']) && findInAssignment({key : 'events.touch.rotation_angle', valueToFind : `["rotationAngle"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['events.touch.force']) && findInAssignment({key : 'events.touch.force', valueToFind : `["force"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['navigator_languages.languages_is_not_undefined']) && findInAssignment({key : 'navigator_languages.languages_is_not_undefined', valueToFind : `"languages") !== undefined`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_width']) && findInAssignment({key : 'window_size.window_screen_width', valueToFind : `window["screen"]["width"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_height']) && findInAssignment({key : 'window_size.window_screen_height', valueToFind : `window["screen"]["height"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_avail_height']) && findInAssignment({key : 'window_size.window_screen_avail_height', valueToFind : `window["screen"]["availHeight"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_avail_left']) && findInAssignment({key : 'window_size.window_screen_avail_left', valueToFind : `window["screen"]["availLeft"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_avail_top']) && findInAssignment({key : 'window_size.window_screen_avail_top', valueToFind : `window["screen"]["availTop"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_avail_width']) && findInAssignment({key : 'window_size.window_screen_avail_width', valueToFind : `window["screen"]["availWidth"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_pixel_depth']) && findInAssignment({key : 'window_size.window_screen_pixel_depth', valueToFind : `window["screen"]["pixelDepth"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_inner_width']) && findInAssignment({key : 'window_size.window_inner_width', valueToFind : `window["innerWidth"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_inner_height']) && findInAssignment({key : 'window_size.window_inner_height', valueToFind : `window["innerHeight"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_outer_width']) && findInAssignment({key : 'window_size.window_outer_width', valueToFind : `window["outerWidth"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_outer_height']) && findInAssignment({key : 'window_size.window_outer_height', valueToFind : `window["outerHeight"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_device_pixel_ratio']) && findInAssignment({key : 'window_size.window_device_pixel_ratio', valueToFind : `["devicePixelRatio"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screen_orientation_type']) && findInAssignment({key : 'window_size.window_screen_orientation_type', valueToFind : `["screen"]["orientation"]["type"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screenX']) && findInAssignment({key : 'window_size.window_screenX', valueToFind : `window["screenX"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window_size.window_screenY']) && findInAssignment({key : 'window_size.window_screenY', valueToFind : `window["screenY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.aliased_line_width_range']) && findInAssignment({key : 'webgl.aliased_line_width_range', valueToFind : `["ALIASED_LINE_WIDTH_RANGE"]))`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.aliased_point_size_range']) && findInAssignment({key : 'webgl.aliased_point_size_range', valueToFind : `["ALIASED_POINT_SIZE_RANGE"]))`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.alpha_bits']) && findInAssignment({key : 'webgl.alpha_bits', valueToFind : `["ALPHA_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.antialias']) && findInAssignment({key : 'webgl.antialias', valueToFind : `["antialias"] ? true : false : null`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.blue_bits']) && findInAssignment({key : 'webgl.blue_bits', valueToFind : `["BLUE_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.green_bits']) && findInAssignment({key : 'webgl.green_bits', valueToFind : `["GREEN_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.depth_bits']) && findInAssignment({key : 'webgl.depth_bits', valueToFind : `["DEPTH_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_combined_texture_image_units']) && findInAssignment({key : 'webgl.max_combined_texture_image_units', valueToFind : `["MAX_COMBINED_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_cube_map_texture_size']) && findInAssignment({key : 'webgl.max_cube_map_texture_size', valueToFind : `["MAX_CUBE_MAP_TEXTURE_SIZE"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_fragment_uniform_vectors']) && findInAssignment({key : 'webgl.max_fragment_uniform_vectors', valueToFind : `["MAX_FRAGMENT_UNIFORM_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_renderbuffer_size']) && findInAssignment({key : 'webgl.max_renderbuffer_size', valueToFind : `["MAX_RENDERBUFFER_SIZE"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_texture_image_units']) && findInAssignment({key : 'webgl.max_texture_image_units', valueToFind : `["MAX_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_texture_size']) && findInAssignment({key : 'webgl.max_texture_size', valueToFind : `["MAX_TEXTURE_SIZE"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_varying_vectors']) && findInAssignment({key : 'webgl.max_varying_vectors', valueToFind : `["MAX_VARYING_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_vertex_attribs']) && findInAssignment({key : 'webgl.max_vertex_attribs', valueToFind : `["MAX_VERTEX_ATTRIBS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_vertex_texture_image_units']) && findInAssignment({key : 'webgl.max_vertex_texture_image_units', valueToFind : `["MAX_VERTEX_TEXTURE_IMAGE_UNITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_vertex_uniform_vectors']) && findInAssignment({key : 'webgl.max_vertex_uniform_vectors', valueToFind : `["MAX_VERTEX_UNIFORM_VECTORS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.max_viewport_dims']) && findInAssignment({key : 'webgl.max_viewport_dims', valueToFind : `["MAX_VIEWPORT_DIMS"]))`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.red_bits']) && findInAssignment({key : 'webgl.red_bits', valueToFind : `["RED_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.renderer']) && findInAssignment({key : 'webgl.renderer', valueToFind : `["RENDERER"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.shading_language_version']) && findInAssignment({key : 'webgl.shading_language_version', valueToFind : `["SHADING_LANGUAGE_VERSION"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.stencil_bits']) && findInAssignment({key : 'webgl.stencil_bits', valueToFind : `["STENCIL_BITS"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.vendor']) && findInAssignment({key : 'webgl.vendor', valueToFind : `["VENDOR"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.version']) && findInAssignment({key : 'webgl.version', valueToFind : `["VERSION"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl.shader_precision_vertex_low_float']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_float', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/ , mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_vertex_low_float_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_float_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_vertex_low_float_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_float_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_vertex_medium_float']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_float', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_vertex_medium_float_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_float_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_vertex_medium_float_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_float_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_vertex_high_float']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_float', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -3});
!(FINDERS['webgl.shader_precision_vertex_high_float_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_float_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -2});
!(FINDERS['webgl.shader_precision_vertex_high_float_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_float_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : -1});
!(FINDERS['webgl.shader_precision_vertex_low_int']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_int', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_vertex_low_int_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_int_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_vertex_low_int_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_low_int_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_vertex_medium_int']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_int', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_vertex_medium_int_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_int_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_vertex_medium_int_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_medium_int_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_vertex_high_int']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_int', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_vertex_high_int_min']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_int_min', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_vertex_high_int_max']) && findInAssignment({key : 'webgl.shader_precision_vertex_high_int_max', valueToFind : /(.*?)\["VERTEX_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_low_float']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_float', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_low_float_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_float_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_low_float_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_float_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_medium_float']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_float', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_medium_float_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_float_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_medium_float_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_float_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_high_float']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_float', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_high_float_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_float_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_high_float_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_float_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_FLOAT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_low_int']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_int', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_low_int_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_int_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_low_int_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_low_int_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["LOW_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_medium_int']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_int', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_medium_int_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_int_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_medium_int_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_medium_int_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["MEDIUM_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.shader_precision_fragment_high_int']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_int', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 1});
!(FINDERS['webgl.shader_precision_fragment_high_int_min']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_int_min', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 2});
!(FINDERS['webgl.shader_precision_fragment_high_int_max']) && findInAssignment({key : 'webgl.shader_precision_fragment_high_int_max', valueToFind : /(.*?)\["FRAGMENT_SHADER"\], (.*?)\["HIGH_INT"\]\)/, mode : `regex`, siblingKey : 3});
!(FINDERS['webgl.unmasked_vendor_webgl']) && findInAssignment({key : 'webgl.unmasked_vendor_webgl', valueToFind : /(.*?)\["getParameter"\]\((.*?)\["UNMASKED_VENDOR_WEBGL"\]\)/, mode : `regex`, siblingKey : 0});
!(FINDERS['webgl.unmasked_renderer_webgl']) && findInAssignment({key : 'webgl.unmasked_renderer_webgl', valueToFind : /(.*?)\["getParameter"\]\((.*?)\["UNMASKED_RENDERER_WEBGL"\]\)/, mode : `regex`, siblingKey : 0});
!(FINDERS['canvas_hash.is_point_in_path']) && findInAssignment({key : 'canvas_hash.is_point_in_path', valueToFind : `["isPointInPath"](6, 6, "evenodd") === false`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['canvas_hash.to_data_url_image']) && findInAssignment({key : 'canvas_hash.to_data_url_image', valueToFind : `["indexOf"]("data:image/webp")`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl_meta.webgl_rendering_context_get_parameter']) && findInAssignment({key : 'webgl_meta.webgl_rendering_context_get_parameter', valueToFind : `window["WebGLRenderingContext"]["prototype"]["getParameter"]["name"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['webgl_meta.is_native_webgl_rendering_context_get_parameter']) && findInAssignment({key : 'webgl_meta.is_native_webgl_rendering_context_get_parameter', valueToFind : `window["WebGLRenderingContext"]["prototype"]["getParameter"])`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['touch_event.max_touch_points']) && findInAssignment({key: 'touch_event.max_touch_points', valueToFind : /(.*?)\["maxTouchPoints"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['touch_event.on_touch_start_is_undefined']) && findInAssignment({key: 'touch_event.on_touch_start_is_undefined', valueToFind : /(.*?)\["ontouchstart"\] !== undefined/, mode : `regex`, siblingKey : 0});
!(FINDERS['browser.chrome.load_times']) && findInAssignment({key: 'browser.chrome.load_times', valueToFind : /(.*?)\["loadTimes"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['browser.connection_rtt']) && findInAssignment({key: 'browser.connection_rtt', valueToFind : /(.*?)\["connection"\]\["rtt"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.history_length']) && findInAssignment({key: 'window.history_length', valueToFind : /window\["history"\]\["length"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.navigator_hardware_concurrency']) && findInAssignment({key: 'window.navigator_hardware_concurrency', valueToFind : /window\["navigator"\]\["hardwareConcurrency"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.is_window_self_not_window_top']) && findInAssignment({key: 'window.is_window_self_not_window_top', valueToFind : `window["self"] !== window["top"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window.is_native_navigator_get_battery']) && findInAssignment({key: 'window.is_native_navigator_get_battery', valueToFind : /window\["navigator"\]\["getBattery"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.console_debug_name']) && findInAssignment({key: 'window.console_debug_name', valueToFind : /window\["console"\]\["debug"\]\["name"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.is_native_console_debug']) && findInAssignment({key: 'window.is_native_console_debug', valueToFind : /window\["console"\]\["debug"\]\)/, mode : `regex`, siblingKey : 0});
!(FINDERS['window._phantom']) && findInAssignment({key: 'window._phantom', valueToFind : /window\["_phantom"\] \!== undefined/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.call_phantom']) && findInAssignment({key: 'window.call_phantom', valueToFind : /window\["callPhantom"\] \!== undefined/, mode : `regex`, siblingKey : 0});
!(FINDERS['window.empty']) && findInAssignment({key: 'window.empty', valueToFind : /window\["callPhantom"\] \!== undefined/, mode : `regex`, siblingKey : 3});
!(FINDERS['window.persistent']) && findInAssignment({key: 'window.persistent', valueToFind : `window["PERSISTENT"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['window.temporary']) && findInAssignment({key: 'window.temporary', valueToFind : `window["TEMPORARY"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['document.document_location_protocol']) && findInAssignment({key: 'document.document_location_protocol', valueToFind : /(.*?)\["location"\]\["protocol"\]/, mode : `regex`, siblingKey : 0});
!(FINDERS['visual_view_port.visual_view_port_width']) && findInAssignment({key: 'visual_view_port.visual_view_port_width', valueToFind : `window["visualViewport"]["width"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['visual_view_port.visual_view_port_height']) && findInAssignment({key: 'visual_view_port.visual_view_port_height', valueToFind : `window["visualViewport"]["height"]`, mode : `endsWith`, siblingKey : 0});
!(FINDERS['visual_view_port.visual_view_port_scale']) && findInAssignment({key: 'visual_view_port.visual_view_port_scale', valueToFind : `window["visualViewport"]["scale"]`, mode : `endsWith`, siblingKey : 0});
(() => {
const right = path.get(`right`);
const rightCode = generate(right.node).code;
if(!rightCode.match(/(.*?)\["canvas"\]\["toDataURL"\]\(\)/)){
return;
}
const tryStatement = path.getStatementParent().parentPath.parentPath;
const leftProp = tryStatement.getPrevSibling().get(`expression.left.property`);
FINDERS['webgl.canvas_hash'] = getPropertyValue(leftProp);
})();
(() => {
const right = path.get(`right`);
const rightCode = generate(right.node).code;
if(!rightCode.match(/(.*?)\["canvas"\]\["toDataURL"\]\(\)/)){
return;
}
const tryStatement = path.getStatementParent().parentPath.parentPath;
const leftProp = tryStatement.get(`handler.body.body.0.expression.left.property`);
FINDERS['webgl.canvas_hash_error'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node).code;
if(!code.endsWith(`["textBaseline"] = "alphabetic"`)){
return;
}
const leftProp = path.getStatementParent().getPrevSibling().get(`expression.left.property`);
FINDERS['canvas_hash.screen_is_global_composite_operation'] = getPropertyValue(leftProp);
})();
},
IfStatement(path){
(() => {
const { test } = path.node;
if(!(generate(test).code === `window["navigator"]["buildID"] !== undefined`)){
return;
}
if(!t.isBlockStatement(path.node.consequent)){
return;
}
const leftProp = path.getPrevSibling().get("expression.left.property")
FINDERS['navigator_languages'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node.test).code;
if(!code.endsWith(`window["navigator"]["languages"] !== undefined`)){
return;
}
const leftProp = path.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
FINDERS['navigator_languages.languages'] = getPropertyValue(leftProp);
})();
(() => {
const { test } = path.node;
if(!(generate(test).code === `window["navigator"]["buildID"] !== undefined`)){
return;
}
if(!t.isBlockStatement(path.node.consequent)){
return;
}
const bodyLength = path.get("consequent.body").length;
const leftProp = path.get(`consequent.body.${bodyLength - 1}.expression.left.property`);
FINDERS['navigator_build_id'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node.test).code;
if(!code.endsWith(' === "oncontextmenu"')){
return;
}
const leftProp = path.get("consequent.body.0.consequent.body.0.expression.left.property")
FINDERS['window_object_get_own_property_names_b.prev'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node.test).code;
if(!code.endsWith(' === "oncontextmenu"')){
return;
}
const leftProp = path.get("consequent.body.1.consequent.body.0.expression.left.property")
FINDERS['window_object_get_own_property_names_b.next'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node.test).code;
if(!code.endsWith(`["PerformanceObserver"] !== undefined`)){
return;
}
const leftProp = path.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
FINDERS['window.performance_observer'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.node.test).code;
if(!code.startsWith(`window["PerformanceObserver"]["supportedEntryTypes"]`)){
return;
}
const leftProp = path.get(`consequent.body`).slice(-1)[0].get(`expression.left.property`);
FINDERS['window.performance_observer.supported_entry_types'] = getPropertyValue(leftProp);
})();
},
TryStatement(path){
(() => {
const block = path.get(`block`);
const nodeCode = generate(block.get(`body.0`).node).code;
if(nodeCode.endsWith(`["indexedDB"] ? true : false;`)){
const leftProp = path.getSibling(path.key + 2).get(`expression.left.property`);
FINDERS['has_indexed_db'] = getPropertyValue(leftProp);
}
})();
(() => {
const block = path.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[0];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["namedItem"]["name"];`)){
const leftProp = line.get(`expression.left.property`);
FINDERS['plugins_named_item_item_refresh.named_item'] = getPropertyValue(leftProp);
}
})();
(() => {
const block = path.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[1];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["item"]["name"];`)){
const leftProp = line.get(`expression.left.property`);
FINDERS['plugins_named_item_item_refresh.item'] = getPropertyValue(leftProp);
}
})();
(() => {
const block = path.get(`block.body`);
if(block.length !== 3){
return;
}
const line = block[2];
const nodeCode = generate(line.node).code;
if(nodeCode.endsWith(`window["navigator"]["plugins"]["refresh"]["name"];`)){
const leftProp = line.get(`expression.left.property`);
FINDERS['plugins_named_item_item_refresh.refresh'] = getPropertyValue(leftProp);
}
})();
},
ForInStatement(path){
(() => {
const code = generate(path.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["documentElement"]["children"]`))){
return;
}
const leftProp = path.getSibling(path.key + 1).get(`expression.left.property`);
FINDERS['document_children.document_script_element_children'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["head"]["children"]`))){
return;
}
const leftProp = path.getSibling(path.key + 1).get(`expression.left.property`);
FINDERS['document_children.document_head_element_children'] = getPropertyValue(leftProp);
})();
(() => {
const code = generate(path.get(`right`).node).code;
if(!(code.endsWith(`window["document"]["body"]["children"]`))){
return;
}
const leftProp = path.getSibling(path.key + 1).get(`expression.left.property`);
FINDERS['document_children.document_body_element_children'] = getPropertyValue(leftProp);
})();
},
})
);
return FINDERS;
}
module.exports = {
extractSignals,
};
const generate = require(`@babel/generator`).default;
const parser = require("@babel/parser");
const {extractSignalsKeys, findInVar} = require('./extract')
const fs = require("fs");
const {traverse} = require("@babel/core");
let sourceCode = fs.readFileSync('./decodeResult_ok.js', {encoding: "utf-8"});
let ast = parser.parse(sourceCode);
// signalKeys = extractSignalsKeys(ast)
traverse(ast, {
VariableDeclaration(path) {
let {found, value} = findInVar({path, valueToFind: `["userAgent"]`, mode: `endsWith`, siblingKey: 1});
if (found) {
console.log(value)
}
}
})
const fs = require('fs');
const types = require("@babel/types");
const parser = require("@babel/parser");
const template = require("@babel/template").default;
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;
//js混淆代码读取
process.argv.length > 2 ? encodeFile = process.argv[2] : encodeFile = "./decodeResult.js"; //默认的js文件
process.argv.length > 3 ? decodeFile = process.argv[3] : decodeFile = encodeFile.replace(".js", "") + "_ok.js";
//将源代码解析为AST
let sourceCode = fs.readFileSync(encodeFile, { encoding: "utf-8" });
let ast = parser.parse(sourceCode);
console.time("处理完毕,耗时");
const keyToLiteral = {
MemberExpression:
{
exit({ node }) {
const prop = node.property;
if (!node.computed && types.isIdentifier(prop)) {
node.property = types.StringLiteral(prop.name);
node.computed = true;
}
}
},
ObjectProperty:
{
exit({ node }) {
const key = node.key;
if (!node.computed && types.isIdentifier(key)) {
node.key = types.StringLiteral(key.name);
return;
}
if (node.computed && types.isStringLiteral(key)) {
node.computed = false;
}
}
},
}
traverse(ast, keyToLiteral);
const standardLoop =
{
"ForStatement|WhileStatement|ForInStatement|ForOfStatement"({ node }) {
if (!types.isBlockStatement(node.body)) {
node.body = types.BlockStatement([node.body]);
}
},
IfStatement(path) {
const consequent = path.get("consequent");
const alternate = path.get("alternate");
if (!consequent.isBlockStatement()) {
consequent.replaceWith(types.BlockStatement([consequent.node]));
}
if (alternate.node !== null && !alternate.isBlockStatement()) {
alternate.replaceWith(types.BlockStatement([alternate.node]));
}
},
}
traverse(ast, standardLoop);
const DeclaratorToDeclaration =
{
VariableDeclaration(path) {
let { parentPath, node } = path;
if (!parentPath.isBlock()) {
return;
}
let { declarations, kind } = node;
if (declarations.length == 1) {
return;
}
let newNodes = [];
for (const varNode of declarations) {
let newDeclartionNode = types.VariableDeclaration(kind, [varNode]);
newNodes.push(newDeclartionNode);
}
path.replaceWithMultiple(newNodes);
},
}
traverse(ast, DeclaratorToDeclaration);
function SequenceOfStatement(path) {
let { scope, parentPath, node } = path;
if (parentPath.parentPath.isLabeledStatement()) {//标签节点无法往前插入。
return;
}
let expressions = node.expressions;
if (parentPath.isReturnStatement({ "argument": node }) ||
parentPath.isThrowStatement({ "argument": node })) {
parentPath.node.argument = expressions.pop();
}
else if (parentPath.isIfStatement({ "test": node }) ||
parentPath.isWhileStatement({ "test": node })) {
parentPath.node.test = expressions.pop();
}
else if (parentPath.isForStatement({ "init": node })) {
parentPath.node.init = expressions.pop();
}
else if (parentPath.isForInStatement({ "right": node }) ||
parentPath.isForOfStatement({ "right": node })) {
parentPath.node.right = expressions.pop();
}
else if (parentPath.isSwitchStatement({ "discriminant": node })) {
parentPath.node.discriminant = expressions.pop();
}
else if (parentPath.isExpressionStatement({ "expression": node })) {
parentPath.node.expression = expressions.pop();
}
else {
return;
}
for (let expression of expressions) {
parentPath.insertBefore(types.ExpressionStatement(expression = expression));
}
}
function SequenceOfExpression(path) {
let { scope, parentPath, node, parent } = path;
let ancestorPath = parentPath.parentPath;
let expressions = node.expressions;
if (parentPath.isConditionalExpression({ "test": node }) &&
ancestorPath.isExpressionStatement({ "expression": parent })) {
parentPath.node.test = expressions.pop();
}
else if (parentPath.isVariableDeclarator({ "init": node }) &&
ancestorPath.parentPath.isBlock()) {
parentPath.node.init = expressions.pop();
}
else if (parentPath.isAssignmentExpression({ "right": node }) &&
ancestorPath.isExpressionStatement({ "expression": parent })) {
parentPath.node.right = expressions.pop();
}
else if ((parentPath.isCallExpression({ "callee": node }) ||
parentPath.isNewExpression({ "callee": node })) &&
ancestorPath.isExpressionStatement({ "expression": parent })) {
parentPath.node.callee = expressions.pop();
}
else {
return;
}
for (let expression of expressions) {
ancestorPath.insertBefore(types.ExpressionStatement(expression = expression));
}
}
const resolveSequence =
{
SequenceExpression:
{//对同一节点遍历多个方法
exit: [SequenceOfStatement, SequenceOfExpression]
}
}
traverse(ast, resolveSequence);
const removeDeadCode = {
"IfStatement|ConditionalExpression"(path) {
let { consequent, alternate } = path.node;
let testPath = path.get('test');
const evaluateTest = testPath.evaluateTruthy();
if (evaluateTest === true) {
if (types.isBlockStatement(consequent)) {
consequent = consequent.body;
}
path.replaceWithMultiple(consequent);
return;
}
if (evaluateTest === false) {
if (alternate != null) {
if (types.isBlockStatement(alternate)) {
alternate = alternate.body;
}
path.replaceWithMultiple(alternate);
}
else {
path.remove();
}
}
},
"LogicalExpression"(path) {
let { left, operator, right } = path.node;
let leftPath = path.get('left');
const evaluateLeft = leftPath.evaluateTruthy();
if ((operator == "||" && evaluateLeft == true) ||
(operator == "&&" && evaluateLeft == false)) {
path.replaceWith(left);
return;
}
if ((operator == "||" && evaluateLeft == false) ||
(operator == "&&" && evaluateLeft == true)) {
path.replaceWith(right);
}
},
"EmptyStatement|DebuggerStatement"(path) {
path.remove();
},
}
traverse(ast, removeDeadCode); //PS:因为有赋值语句和定义语句同时存在,因此该插件可能需要运行多次才能删除干净。
const simplifyLiteral = {
NumericLiteral({ node }) {
if (node.extra && /^0[obx]/i.test(node.extra.raw)) {
node.extra = undefined;
}
},
StringLiteral({ node }) {
if (node.extra && /\\[ux]/gi.test(node.extra.raw)) {
node.extra = undefined;
}
},
}
traverse(ast, simplifyLiteral);
function isNodePure(node, scope) {
if (types.isLiteral(node)) {
return true;
}
if (types.isUnaryExpression(node)) {
return isNodePure(node.argument, scope)
}
if (types.isIdentifier(node)) {//处理 var c = String;
if (scope && scope.isPure(node, true)) {
return true;
}
if (typeof this[node.name] != 'undefined') {
return true;
}
return false;
}
if (types.isMemberExpression(node)) {//处理 var d = String.fromCharCode;
let {object, property, computed} = node;
if (computed && !isNodePure(property, scope)) {
return false;
}
if (isNodePure(object, scope)) {
return true;
}
if (types.isIdentifier(object)) {
let name = object.name;
if (typeof this[name] != 'undefined' && name != 'window') {//注意object为window时,可能会还原出错
return true;
}
return false;
}
if (types.isMemberExpression(object)) {
return isNodePure(object, scope);
}
return false;
}
if (types.isBinary(node) && scope) {
return isNodePure(node.left, scope) && isNodePure(node.right, scope);
}
return false;
}
traverse(ast, {
VariableDeclaration(path) {
let {node} = path;
let {declarations} = node;
let res = [];
// console.log(path.parentPath.type)
if (types.isForStatement(path.parentPath)) return
if (!declarations || declarations.length == 1) return
for (let i = 0; i < declarations.length; i++) {
let declaration = declarations[i];
res.push(types.VariableDeclaration('var', [declaration]))
}
path.replaceWithMultiple(res)
path.skip()
}
})
const restoreVarDeclarator = {
VariableDeclarator(path) {
let scope = path.scope;
let {id, init} = path.node;
if (!init && (!types.isNumericLiteral(init) || !types.isStringLiteral(init))) return
if (id.name === 'c' && init.value === 0) return
if (!types.isIdentifier(id) || !isNodePure(init, scope)) {
return;
}
const binding = scope.getBinding(id.name);
try {
var {
constant, referencePaths, constantViolations
} = binding; //变量的定义一定会有binding.
} catch (e) {
return;
}
if (constantViolations.length > 1) {
return;
}
if (constant || constantViolations[0] == path) {
for (let referPath of referencePaths) {
// console.log(init.value)
// console.log(id.name, referPath.type, generator(referPath.container).code, generator(init).code)
referPath.replaceWith(init);
}
// console.log(path.toString())
path.remove();//没有被引用,或者替换完成,可直接删除
}
},
}
traverse(ast, restoreVarDeclarator)
//还原object
function isBaseLiteral(node) {
if (types.isLiteral(node)) {
return true;
}
if (types.isUnaryExpression(node, {operator: "-"}) ||
types.isUnaryExpression(node, {operator: "+"})) {
return isBaseLiteral(node.argument);
}
return false;
}
const decodeValueOfObject =
{//当一个object里面的value全部为字面量时的还原,没有考虑单个key重新赋值的情况。
VariableDeclarator(path) {
let { node, scope } = path;
const { id, init } = node;
if (!types.isObjectExpression(init)) return;
let properties = init.properties;
if (properties.length == 0 || !properties.every(property => isBaseLiteral(property.value)))
return;
let binding = scope.getBinding(id.name);
if (!binding)return;
let { constant, referencePaths } = binding;
if (!constant) return;
let newMap = new Map();
for (const property of properties) {
let { key, value } = property;
newMap.set(key.value, value);
}
let canBeRemoved = true;
for (const referPath of referencePaths) {
let { parentPath } = referPath;
if (!parentPath.isMemberExpression()) {
canBeRemoved = false;
return;
}
let AncestorPath = parentPath.parentPath;
if (AncestorPath.isAssignmentExpression({"left":parentPath.node}))
{
canBeRemoved = false;
return;
}
if (AncestorPath.isUpdateExpression() && ['++','--'].includes(AncestorPath.node.operator))
{
canBeRemoved = false;
return;
}
let curKey = parentPath.node.property.value;
if (!newMap.has(curKey)) {
canBeRemoved = false;
break;
}
parentPath.replaceWith(newMap.get(curKey));
}
canBeRemoved && path.remove();
newMap.clear();
},
}
traverse(ast, decodeValueOfObject);
console.timeEnd("处理完毕,耗时");
let { code } = generator(ast, opts = {
"compact": false, // 是否压缩代码
"comments": false, // 是否保留注释
"jsescOption": { "minimal": true }, //Unicode转义
});
fs.writeFile(decodeFile, code, (err) => { });
\ No newline at end of file
{
"name": "lcc-reese84",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@babel/core": "^7.22.10",
"abab": "^2.0.5",
"acorn": "^8.4.1",
"acorn-globals": "^6.0.0",
"canvas": "^2.11.2",
"cssom": "^0.5.0",
"cssstyle": "^2.3.0",
"data-urls": "^3.0.0",
"decimal.js": "^10.3.1",
"domexception": "^2.0.1",
"escodegen": "^2.0.0",
"express": "^4.18.2",
"fingerprint-generator": "^2.1.37",
"form-data": "^4.0.0",
"ghost-cursor": "^1.1.18",
"html-encoding-sniffer": "^2.0.1",
"http-proxy-agent": "^4.0.1",
"https-proxy-agent": "^5.0.0",
"is-potential-custom-element-name": "^1.0.1",
"json-schema-traverse": "^1.0.0",
"nwsapi": "^2.2.0",
"parse5": "6.0.1",
"saxes": "^5.0.1",
"symbol-tree": "^3.2.4",
"tough-cookie": "^4.1.3",
"w3c-hr-time": "^1.0.2",
"w3c-xmlserializer": "^2.0.0",
"webidl-conversions": "^6.1.0",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
"whatwg-url": "^9.0.0",
"ws": "^8.0.0",
"xml-name-validator": "^3.0.0"
},
"devDependencies": {
"@babel/core": "^7.23.3"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
"integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": {
"version": "7.22.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
"integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.22.13",
"chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz",
"integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz",
"integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.22.13",
"@babel/generator": "^7.23.3",
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helpers": "^7.23.2",
"@babel/parser": "^7.23.3",
"@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.3",
"@babel/types": "^7.23.3",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.3",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/generator": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz",
"integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.23.3",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
"integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.22.9",
"@babel/helper-validator-option": "^7.22.15",
"browserslist": "^4.21.9",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
"integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
"integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-simple-access": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/helper-validator-identifier": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-simple-access": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
"integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
"integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
"integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
"integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
"integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz",
"integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/template": {
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz",
"integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.22.13",
"@babel/generator": "^7.23.3",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.3",
"@babel/types": "^7.23.3",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.23.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz",
"integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
"integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.20",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
"integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@mapbox/node-pre-gyp": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
"integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
"dependencies": {
"detect-libc": "^2.0.0",
"https-proxy-agent": "^5.0.0",
"make-dir": "^3.1.0",
"node-fetch": "^2.6.7",
"nopt": "^5.0.0",
"npmlog": "^5.0.1",
"rimraf": "^3.0.2",
"semver": "^7.3.5",
"tar": "^6.1.11"
},
"bin": {
"node-pre-gyp": "bin/node-pre-gyp"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@tootallnate/once": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
"engines": {
"node": ">= 6"
}
},
"node_modules/@types/bezier-js": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-4.1.3.tgz",
"integrity": "sha512-FNVVCu5mx/rJCWBxLTcL7oOajmGtWtBTDjq6DSUWUI12GeePivrZZXz+UgE0D6VYsLEjvExRO03z4hVtu3pTEQ=="
},
"node_modules/abab": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
},
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/acorn": {
"version": "8.11.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-globals": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
"integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
"dependencies": {
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1"
}
},
"node_modules/acorn-globals/node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/adm-zip": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
"integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
"engines": {
"node": ">=6.0"
}
},
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/aproba": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
},
"node_modules/are-we-there-yet": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/bezier-js": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz",
"integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==",
"funding": {
"type": "individual",
"url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md"
}
},
"node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/body-parser/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/browser-process-hrtime": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
"integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
},
"node_modules/browserslist": {
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
"integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001541",
"electron-to-chromium": "^1.4.535",
"node-releases": "^2.0.13",
"update-browserslist-db": "^1.0.13"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
"integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
"dependencies": {
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.1",
"set-function-length": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001563",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz",
"integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
]
},
"node_modules/canvas": {
"version": "2.11.2",
"resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
"integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
"hasInstallScript": true,
"dependencies": {
"@mapbox/node-pre-gyp": "^1.0.0",
"nan": "^2.17.0",
"simple-get": "^3.0.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"engines": {
"node": ">=10"
}
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"node_modules/color-support": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
"bin": {
"color-support": "bin.js"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
},
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dependencies": {
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-type": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/cssom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
"integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
},
"node_modules/cssstyle": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
"dependencies": {
"cssom": "~0.3.6"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cssstyle/node_modules/cssom": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
},
"node_modules/data-urls": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
"integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
"dependencies": {
"abab": "^2.0.6",
"whatwg-mimetype": "^3.0.0",
"whatwg-url": "^11.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/data-urls/node_modules/tr46": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
"integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
"dependencies": {
"punycode": "^2.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/data-urls/node_modules/webidl-conversions": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"engines": {
"node": ">=12"
}
},
"node_modules/data-urls/node_modules/whatwg-mimetype": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
"integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
"engines": {
"node": ">=12"
}
},
"node_modules/data-urls/node_modules/whatwg-url": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
"integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
"dependencies": {
"tr46": "^3.0.0",
"webidl-conversions": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/decimal.js": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
},
"node_modules/decompress-response": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
"integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
"dependencies": {
"mimic-response": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
"dependencies": {
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/detect-libc": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
"engines": {
"node": ">=8"
}
},
"node_modules/domexception": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
"dependencies": {
"webidl-conversions": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/domexception/node_modules/webidl-conversions": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
"engines": {
"node": ">=8"
}
},
"node_modules/dot-prop": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
"integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
"dependencies": {
"is-obj": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/electron-to-chromium": {
"version": "1.4.588",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz",
"integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w=="
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/escodegen": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
"esutils": "^2.0.2"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
"node": ">=6.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/express/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/finalhandler/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/fingerprint-generator": {
"version": "2.1.43",
"resolved": "https://registry.npmjs.org/fingerprint-generator/-/fingerprint-generator-2.1.43.tgz",
"integrity": "sha512-uCm9Lp9ljbOn9r+5Zo+xwBj5np7zMHsdvKMGdJceXjXFG2xJvCFOSigc/7mW/Nge0Hi556laGQz+WnmK3XZQFQ==",
"dependencies": {
"generative-bayesian-network": "^2.1.43",
"header-generator": "^2.1.43",
"tslib": "^2.4.0"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/fs-minipass/node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fs-minipass/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gauge": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
"dependencies": {
"aproba": "^1.0.3 || ^2.0.0",
"color-support": "^1.1.2",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.1",
"object-assign": "^4.1.1",
"signal-exit": "^3.0.0",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
"wide-align": "^1.1.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/generative-bayesian-network": {
"version": "2.1.43",
"resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.43.tgz",
"integrity": "sha512-hQWAoGOsakNO+qRbzKFAGAzOfBmORBugjr9LcdpWNRoqQA7teZSekjP9I9TjBTrKgm+TUr5GWdBsNSjtuLqqGQ==",
"dependencies": {
"adm-zip": "^0.5.9",
"tslib": "^2.4.0"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"dependencies": {
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ghost-cursor": {
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/ghost-cursor/-/ghost-cursor-1.1.19.tgz",
"integrity": "sha512-PJsM+edFPB7VxBASB1IZP2CP03R4goJ142RIfPslo1drin16WvNaZX7eSxY4zZpJ41u+F8rVbKFImPku9spHiQ==",
"dependencies": {
"@types/bezier-js": "4",
"bezier-js": "^6.1.3"
}
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dependencies": {
"get-intrinsic": "^1.2.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
},
"node_modules/hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/header-generator": {
"version": "2.1.43",
"resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.43.tgz",
"integrity": "sha512-ZosQc4rWManbjV64dqL5iqNLmt6zhHcm/1HYShiiZdEGu7RzXahd9tpcnA5x6VJL0XlIxbcqOM7KJqeeXmfpXA==",
"dependencies": {
"browserslist": "^4.21.1",
"generative-bayesian-network": "^2.1.43",
"ow": "^0.28.1",
"tslib": "^2.4.0"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/html-encoding-sniffer": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
"integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
"dependencies": {
"whatwg-encoding": "^1.0.5"
},
"engines": {
"node": ">=10"
}
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/http-proxy-agent": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
"dependencies": {
"@tootallnate/once": "1",
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"engines": {
"node": ">=8"
}
},
"node_modules/is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"engines": {
"node": ">=8"
}
},
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dependencies": {
"semver": "^6.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
},
"node_modules/methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-response": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minipass": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
"integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/minizlib/node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/minizlib/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/nan": {
"version": "2.18.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w=="
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/node-fetch/node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/node-fetch/node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"node_modules/node-fetch/node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/node-releases": {
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
"integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
},
"node_modules/nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/npmlog": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
"dependencies": {
"are-we-there-yet": "^2.0.0",
"console-control-strings": "^1.1.0",
"gauge": "^3.0.0",
"set-blocking": "^2.0.0"
}
},
"node_modules/nwsapi": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
"integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/ow": {
"version": "0.28.2",
"resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz",
"integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==",
"dependencies": {
"@sindresorhus/is": "^4.2.0",
"callsites": "^3.1.0",
"dot-prop": "^6.0.1",
"lodash.isequal": "^4.5.0",
"vali-date": "^1.0.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
},
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/saxes": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
"dependencies": {
"xmlchars": "^2.2.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
"node_modules/set-function-length": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
"integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
"dependencies": {
"define-data-property": "^1.1.1",
"get-intrinsic": "^1.2.1",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
},
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/simple-get": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
"integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
"dependencies": {
"decompress-response": "^4.2.0",
"once": "^1.3.1",
"simple-concat": "^1.0.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"node_modules/tar": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/tar/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/tough-cookie": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
"universalify": "^0.2.0",
"url-parse": "^1.5.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/tr46": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
"dependencies": {
"punycode": "^2.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/url-parse": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"dependencies": {
"querystringify": "^2.1.1",
"requires-port": "^1.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/vali-date": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
"integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
"integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
"deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
"dependencies": {
"browser-process-hrtime": "^1.0.0"
}
},
"node_modules/w3c-xmlserializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
"integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
"dependencies": {
"xml-name-validator": "^3.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
"engines": {
"node": ">=10.4"
}
},
"node_modules/whatwg-encoding": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
"dependencies": {
"iconv-lite": "0.4.24"
}
},
"node_modules/whatwg-mimetype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
},
"node_modules/whatwg-url": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz",
"integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==",
"dependencies": {
"tr46": "^2.1.0",
"webidl-conversions": "^6.1.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/wide-align": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
"dependencies": {
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
"node_modules/ws": {
"version": "8.14.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
"integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
},
"node_modules/xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
}
}
}
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
"abab": "^2.0.5", "abab": "^2.0.5",
"acorn": "^8.4.1", "acorn": "^8.4.1",
"acorn-globals": "^6.0.0", "acorn-globals": "^6.0.0",
"canvas": "^2.11.2",
"cssom": "^0.5.0", "cssom": "^0.5.0",
"cssstyle": "^2.3.0", "cssstyle": "^2.3.0",
"data-urls": "^3.0.0", "data-urls": "^3.0.0",
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment