detectVM: function () {var userAgent = navigator.userAgent;var hardwareConcurrency = navigator.hardwareConcurrency || 1;var maxTouchPoints = navigator.maxTouchPoints || 0;if (userAgent.includes('VirtualBox') || userAgent.includes('VMware')) {return true; }if (hardwareConcurrency < 4 && maxTouchPoints < 5) {return true; }var canvas = document.createElement('canvas');var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');if (gl && gl instanceof WebGLRenderingContext) {var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');if (debugInfo) {var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);if (renderer.indexOf('llvmpipe') > -1 || renderer.indexOf('Mesa') > -1) {return true; }}}if (navigator.platform.includes('Mac') && userAgent.includes('iPhone') ||navigator.platform.includes('Android') && userAgent.includes('Linux')) {return /(simulator|x86_64)/.test(userAgent); }return false; },detectMobile: function () {const ua = navigator.userAgent.toLowerCase();return /mobile|android|iphone|ipad|phone/i.test(ua);},