[{"data":1,"prerenderedAt":1940},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device_page":829,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device_surround":1479,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device":1482},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":35,"stem":71,"children":72},"Bot Detector","docs\u002Fbot-detection\u002Findex",[73,74,77,81,85,106,180,183,187],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":78,"path":79,"stem":80},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":82,"path":83,"stem":84},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":86,"path":87,"stem":88,"children":89,"page":53},"Guides","\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[90,94,98,102],{"title":91,"path":92,"stem":93},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":95,"path":96,"stem":97},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":99,"path":100,"stem":101},"Logging","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":103,"path":104,"stem":105},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":107,"path":108,"stem":109,"children":110},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[111,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":117,"path":118,"stem":119},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":121,"path":122,"stem":123},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":125,"path":126,"stem":127},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":129,"path":130,"stem":131},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":133,"path":134,"stem":135},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":137,"path":138,"stem":139},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":141,"path":142,"stem":143},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":145,"path":146,"stem":147},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":149,"path":150,"stem":151},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":153,"path":154,"stem":155},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":157,"path":158,"stem":159},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":161,"path":162,"stem":163},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":165,"path":166,"stem":167},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":169,"path":170,"stem":171},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":173,"path":174,"stem":175},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":177,"path":178,"stem":179},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":181,"stem":182},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":184,"path":185,"stem":186},"API Reference","\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":188,"path":189,"stem":190},"Configuration","\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",[192],{"title":9,"path":66,"stem":67,"children":193,"page":53},[194,338,373,378,556,623],{"title":20,"path":22,"stem":195,"children":196},"docs\u002Fauth-h3client\u002Findex",[197,198,207,243,269,291,294,314,317],{"title":20,"path":22,"stem":195},{"title":14,"path":199,"stem":200,"children":201},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[202,203],{"title":14,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":208,"path":209,"stem":210,"children":211},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[212,213,217,221,225,229,233,236,240],{"title":208,"path":209,"stem":210},{"title":214,"path":215,"stem":216},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":218,"path":219,"stem":220},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":222,"path":223,"stem":224},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":226,"path":227,"stem":228},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":230,"path":231,"stem":232},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":234,"stem":235},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":237,"path":238,"stem":239},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":99,"path":241,"stem":242},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":244,"path":245,"stem":246,"children":247},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[248,249,253,257,261,265],{"title":244,"path":245,"stem":246},{"title":250,"path":251,"stem":252},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":254,"path":255,"stem":256},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":258,"path":259,"stem":260},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":262,"path":263,"stem":264},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":266,"path":267,"stem":268},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":270,"path":271,"stem":272,"children":273},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[274,275,279,283,287],{"title":270,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":280,"path":281,"stem":282},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":284,"path":285,"stem":286},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":288,"path":289,"stem":290},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":292,"stem":293},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":86,"path":295,"stem":296,"children":297,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[298,302,306,310],{"title":299,"path":300,"stem":301},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":303,"path":304,"stem":305},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":307,"path":308,"stem":309},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":311,"path":312,"stem":313},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":188,"path":315,"stem":316},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":184,"path":318,"stem":319,"children":320},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[321,322,326,330,334],{"title":184,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":327,"path":328,"stem":329},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":331,"path":332,"stem":333},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":335,"path":336,"stem":337},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":70,"path":35,"stem":71,"children":339},[340,341,342,343,344,350,370,371,372],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},{"title":78,"path":79,"stem":80},{"title":82,"path":83,"stem":84},{"title":86,"path":87,"stem":88,"children":345,"page":53},[346,347,348,349],{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109,"children":351},[352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127},{"title":129,"path":130,"stem":131},{"title":133,"path":134,"stem":135},{"title":137,"path":138,"stem":139},{"title":141,"path":142,"stem":143},{"title":145,"path":146,"stem":147},{"title":149,"path":150,"stem":151},{"title":153,"path":154,"stem":155},{"title":157,"path":158,"stem":159},{"title":161,"path":162,"stem":163},{"title":165,"path":166,"stem":167},{"title":169,"path":170,"stem":171},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":38,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":374,"path":11,"stem":375,"children":376},"Introduction","docs\u002Fgetting-started\u002Findex",[377],{"title":374,"path":11,"stem":375},{"title":27,"path":29,"stem":379,"children":380},"docs\u002Fiam\u002Findex",[381,382,385,520,523,539,542],{"title":27,"path":29,"stem":379},{"title":14,"path":383,"stem":384},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":208,"path":386,"stem":387,"children":388},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[389,390,394,398,402,406,410,414,418,422,426,430,433,437,441,445,449,452,456,460,463,467,470],{"title":208,"path":386,"stem":387},{"title":391,"path":392,"stem":393},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":395,"path":396,"stem":397},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":399,"path":400,"stem":401},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":403,"path":404,"stem":405},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":407,"path":408,"stem":409},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":411,"path":412,"stem":413},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":415,"path":416,"stem":417},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":419,"path":420,"stem":421},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":423,"path":424,"stem":425},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":427,"path":428,"stem":429},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":244,"path":431,"stem":432},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":434,"path":435,"stem":436},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":438,"path":439,"stem":440},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":442,"path":443,"stem":444},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":446,"path":447,"stem":448},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":99,"path":450,"stem":451},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":453,"path":454,"stem":455},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":457,"path":458,"stem":459},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":237,"path":461,"stem":462},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":464,"path":465,"stem":466},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":254,"path":468,"stem":469},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":471,"path":472,"stem":473,"children":474},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[475,476,480,484,514,517],{"title":471,"path":472,"stem":473},{"title":477,"path":478,"stem":479},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":481,"path":482,"stem":483},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":485,"path":486,"stem":487,"children":488},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[489,490,494,498,502,506,510],{"title":485,"path":486,"stem":487},{"title":491,"path":492,"stem":493},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":495,"path":496,"stem":497},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":499,"path":500,"stem":501},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":503,"path":504,"stem":505},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":507,"path":508,"stem":509},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":511,"path":512,"stem":513},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":453,"path":515,"stem":516},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":518,"stem":519},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":521,"stem":522},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":86,"path":524,"stem":525,"children":526,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[527,531,535],{"title":528,"path":529,"stem":530},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":532,"path":533,"stem":534},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":536,"path":537,"stem":538},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":188,"path":540,"stem":541},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":543,"path":544,"stem":545,"children":546,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[547,550,553],{"title":184,"path":548,"stem":549},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":327,"path":551,"stem":552},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":323,"path":554,"stem":555},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":557,"children":558},"docs\u002Fshield-base\u002Findex",[559,560,563,567,608,612,616,620],{"title":40,"path":42,"stem":557},{"title":14,"path":561,"stem":562},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":564,"path":565,"stem":566},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":82,"path":568,"stem":569,"children":570},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[571,572,576,580,584,588,592,596,600,604],{"title":82,"path":568,"stem":569},{"title":573,"path":574,"stem":575},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":577,"path":578,"stem":579},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":581,"path":582,"stem":583},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":585,"path":586,"stem":587},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":589,"path":590,"stem":591},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":593,"path":594,"stem":595},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":597,"path":598,"stem":599},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":601,"path":602,"stem":603},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":605,"path":606,"stem":607},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":609,"path":610,"stem":611},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":613,"path":614,"stem":615},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":617,"path":618,"stem":619},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":184,"path":621,"stem":622},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":335,"path":48,"stem":624,"children":625},"docs\u002Futils\u002Findex",[626,627,644,677,774],{"title":335,"path":48,"stem":624},{"title":628,"path":629,"stem":630,"children":631,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[632,636,640],{"title":633,"path":634,"stem":635},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":637,"path":638,"stem":639},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":641,"path":642,"stem":643},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":645,"path":646,"stem":647,"children":648,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[649,653,657,661,665,669,673],{"title":650,"path":651,"stem":652},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":654,"path":655,"stem":656},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":658,"path":659,"stem":660},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":662,"path":663,"stem":664},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":666,"path":667,"stem":668},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":670,"path":671,"stem":672},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":674,"path":675,"stem":676},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":678,"path":679,"stem":680,"children":681,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754,758,762,766,770],{"title":683,"path":684,"stem":685},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":687,"path":688,"stem":689},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":691,"path":692,"stem":693},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":695,"path":696,"stem":697},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":699,"path":700,"stem":701},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":703,"path":704,"stem":705},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":707,"path":708,"stem":709},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":711,"path":712,"stem":713},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":715,"path":716,"stem":717},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":719,"path":720,"stem":721},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":723,"path":724,"stem":725},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":727,"path":728,"stem":729},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":731,"path":732,"stem":733},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":735,"path":736,"stem":737},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":739,"path":740,"stem":741},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":743,"path":744,"stem":745},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":747,"path":748,"stem":749},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":751,"path":752,"stem":753},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":755,"path":756,"stem":757},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":759,"path":760,"stem":761},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":763,"path":764,"stem":765},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":767,"path":768,"stem":769},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":771,"path":772,"stem":773},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":775,"path":776,"stem":777,"children":778},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[779,780,784,788,792,796,800,804,808,812],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":785,"path":786,"stem":787},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":789,"path":790,"stem":791},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":793,"path":794,"stem":795},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":797,"path":798,"stem":799},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":801,"path":802,"stem":803},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":805,"path":806,"stem":807},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":809,"path":810,"stem":811},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":813,"path":814,"stem":815},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":817,"meta":828,"stem":62,"__hash__":63},[818,826,827],{"nested":8,"label":9,"icon":10,"to":11,"children":819},[820,821,822,823,824,825],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":830,"title":121,"body":831,"description":1471,"extension":1472,"icon":1473,"meta":1474,"module":1475,"navigation":8,"path":122,"rawbody":1476,"seo":1477,"stem":123,"__hash__":1478},"docs\u002Fdocs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device.md",{"type":832,"value":833,"toc":1466},"minimark",[834,847,850,853,858,861,886,896,906,916,932,948,950,953,1229,1236,1315,1317,1321,1441,1443,1462],[835,836,837,838,842,843,846],"p",{},"The browser and device checker parses the ",[839,840,841],"code",{},"User-Agent"," header with ",[839,844,845],{},"ua-parser-js"," and validates the resulting browser and device attributes. Bots and automated tools produce User-Agents that fail real-world plausibility checks: they identify as CLI libraries, declare impossible OS\u002Fbrowser combinations, or omit fields that every real browser populates.",[835,848,849],{},"This checker runs entirely in memory. It reads no databases and performs no network calls.",[851,852],"hr",{},[854,855,857],"h2",{"id":856},"how-it-works","How It Works",[835,859,860],{},"After parsing the User-Agent, the checker evaluates a set of independent conditions. Each condition adds its own penalty if it matches. Multiple conditions can fire on the same request.",[835,862,863,867,868,871,872,871,875,871,878,881,882,885],{},[864,865,866],"strong",{},"CLI or library tools",": User-Agents containing keywords like ",[839,869,870],{},"curl",", ",[839,873,874],{},"python-requests",[839,876,877],{},"go-http-client",[839,879,880],{},"axios",", or similar library identifiers receive the ",[839,883,884],{},"cliOrLibrary"," penalty. These strings never appear in browser requests.",[835,887,888,891,892,895],{},[864,889,890],{},"Internet Explorer",": IE is a deprecated browser with known security vulnerabilities. Requests claiming to use IE receive the ",[839,893,894],{},"internetExplorer"," penalty. Legitimate modern users no longer run IE.",[835,897,898,901,902,905],{},[864,899,900],{},"Linux OS on a desktop",": Server-side scripts and headless browsers commonly run on Linux and produce User-Agents that declare a Linux desktop. The ",[839,903,904],{},"linuxOs"," penalty applies a low-weight signal to desktop Linux claims.",[835,907,908,911,912,915],{},[864,909,910],{},"Impossible browser\u002FOS combinations",": Certain combinations are physically impossible: macOS does not run on non-Apple hardware in standard deployments, Safari does not run on Windows, and desktop browsers do not report mobile device attributes. When the parsed UA produces one of these contradictions, the ",[839,913,914],{},"impossibleBrowserCombinations"," penalty fires.",[835,917,918,921,922,871,925,871,928,931],{},[864,919,920],{},"Missing browser fields",": Every real browser populates its browser name, browser type, browser version, and engine. Automated tools often omit some of these fields. The checker applies individual penalties for each missing field: ",[839,923,924],{},"browserTypeUnknown",[839,926,927],{},"browserNameUnknown",[839,929,930],{},"browserVersionUnknown",".",[835,933,934,937,938,871,941,944,945,931],{},[864,935,936],{},"Missing device fields",": Desktop browsers typically identify their OS but not a specific device vendor or model. Mobile browsers identify all three. When a User-Agent reports a desktop without any OS, or a device type that implies vendor\u002Fmodel data but those fields are absent, the checker applies ",[839,939,940],{},"desktopWithoutOS",[839,942,943],{},"deviceVendorUnknown",", and ",[839,946,947],{},"deviceModelUnknown",[851,949],{},[854,951,188],{"id":952},"configuration",[954,955,961],"pre",{"className":956,"code":957,"filename":958,"language":959,"meta":960,"style":960},"language-ts shiki shiki-themes light-plus light-plus dracula","await defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableBrowserAndDeviceChecks: {\n      enable: true,\n      penalties: {\n        cliOrLibrary: 100,\n        internetExplorer: 100,\n        linuxOs: 10,\n        impossibleBrowserCombinations: 30,\n        browserTypeUnknown: 10,\n        browserNameUnknown: 10,\n        desktopWithoutOS: 10,\n        deviceVendorUnknown: 10,\n        browserVersionUnknown: 10,\n        deviceModelUnknown: 5,\n      },\n    },\n  },\n})\n","server.ts","ts","",[839,962,963,980,1034,1045,1055,1070,1080,1094,1106,1119,1132,1144,1156,1168,1180,1192,1205,1211,1217,1223],{"__ignoreMap":960},[964,965,968,972,976],"span",{"class":966,"line":967},"line",1,[964,969,971],{"class":970},"sZ328","await",[964,973,975],{"class":974},"sHOzp"," defineConfiguration",[964,977,979],{"class":978},"sDd4n","({\n",[964,981,983,987,991,994,997,999,1001,1004,1006,1010,1014,1017,1019,1022,1024,1026,1029,1031],{"class":966,"line":982},2,[964,984,986],{"class":985},"sjsA6","  store",[964,988,990],{"class":989},"s34zl",":",[964,992,993],{"class":978}," { ",[964,995,996],{"class":985},"main",[964,998,990],{"class":989},[964,1000,993],{"class":978},[964,1002,1003],{"class":985},"driver",[964,1005,990],{"class":989},[964,1007,1009],{"class":1008},"sFkSl"," '",[964,1011,1013],{"class":1012},"sFB1V","sqlite",[964,1015,1016],{"class":1008},"'",[964,1018,871],{"class":978},[964,1020,1021],{"class":985},"name",[964,1023,990],{"class":989},[964,1025,1009],{"class":1008},[964,1027,1028],{"class":1012},".\u002Fbot-detector.db",[964,1030,1016],{"class":1008},[964,1032,1033],{"class":978}," } },\n",[964,1035,1037,1040,1042],{"class":966,"line":1036},3,[964,1038,1039],{"class":985},"  checkers",[964,1041,990],{"class":989},[964,1043,1044],{"class":978}," {\n",[964,1046,1048,1051,1053],{"class":966,"line":1047},4,[964,1049,1050],{"class":985},"    enableBrowserAndDeviceChecks",[964,1052,990],{"class":989},[964,1054,1044],{"class":978},[964,1056,1058,1061,1063,1067],{"class":966,"line":1057},5,[964,1059,1060],{"class":985},"      enable",[964,1062,990],{"class":989},[964,1064,1066],{"class":1065},"sjR7W"," true",[964,1068,1069],{"class":978},",\n",[964,1071,1073,1076,1078],{"class":966,"line":1072},6,[964,1074,1075],{"class":985},"      penalties",[964,1077,990],{"class":989},[964,1079,1044],{"class":978},[964,1081,1083,1086,1088,1092],{"class":966,"line":1082},7,[964,1084,1085],{"class":985},"        cliOrLibrary",[964,1087,990],{"class":989},[964,1089,1091],{"class":1090},"spgvN"," 100",[964,1093,1069],{"class":978},[964,1095,1097,1100,1102,1104],{"class":966,"line":1096},8,[964,1098,1099],{"class":985},"        internetExplorer",[964,1101,990],{"class":989},[964,1103,1091],{"class":1090},[964,1105,1069],{"class":978},[964,1107,1109,1112,1114,1117],{"class":966,"line":1108},9,[964,1110,1111],{"class":985},"        linuxOs",[964,1113,990],{"class":989},[964,1115,1116],{"class":1090}," 10",[964,1118,1069],{"class":978},[964,1120,1122,1125,1127,1130],{"class":966,"line":1121},10,[964,1123,1124],{"class":985},"        impossibleBrowserCombinations",[964,1126,990],{"class":989},[964,1128,1129],{"class":1090}," 30",[964,1131,1069],{"class":978},[964,1133,1135,1138,1140,1142],{"class":966,"line":1134},11,[964,1136,1137],{"class":985},"        browserTypeUnknown",[964,1139,990],{"class":989},[964,1141,1116],{"class":1090},[964,1143,1069],{"class":978},[964,1145,1147,1150,1152,1154],{"class":966,"line":1146},12,[964,1148,1149],{"class":985},"        browserNameUnknown",[964,1151,990],{"class":989},[964,1153,1116],{"class":1090},[964,1155,1069],{"class":978},[964,1157,1159,1162,1164,1166],{"class":966,"line":1158},13,[964,1160,1161],{"class":985},"        desktopWithoutOS",[964,1163,990],{"class":989},[964,1165,1116],{"class":1090},[964,1167,1069],{"class":978},[964,1169,1171,1174,1176,1178],{"class":966,"line":1170},14,[964,1172,1173],{"class":985},"        deviceVendorUnknown",[964,1175,990],{"class":989},[964,1177,1116],{"class":1090},[964,1179,1069],{"class":978},[964,1181,1183,1186,1188,1190],{"class":966,"line":1182},15,[964,1184,1185],{"class":985},"        browserVersionUnknown",[964,1187,990],{"class":989},[964,1189,1116],{"class":1090},[964,1191,1069],{"class":978},[964,1193,1195,1198,1200,1203],{"class":966,"line":1194},16,[964,1196,1197],{"class":985},"        deviceModelUnknown",[964,1199,990],{"class":989},[964,1201,1202],{"class":1090}," 5",[964,1204,1069],{"class":978},[964,1206,1208],{"class":966,"line":1207},17,[964,1209,1210],{"class":978},"      },\n",[964,1212,1214],{"class":966,"line":1213},18,[964,1215,1216],{"class":978},"    },\n",[964,1218,1220],{"class":966,"line":1219},19,[964,1221,1222],{"class":978},"  },\n",[964,1224,1226],{"class":966,"line":1225},20,[964,1227,1228],{"class":978},"})\n",[835,1230,1231,1232,1235],{},"All weights live inside the ",[839,1233,1234],{},"penalties: {}"," sub-object.",[1237,1238,1239,1249,1256,1264,1272,1279,1286,1293,1300,1307],"field-group",{},[1240,1241,1243],"field",{"name":884,"type":1242},"number",[835,1244,1245,1246,931],{},"Penalty for User-Agents that identify as a CLI tool or HTTP library (curl, python-requests, etc.). Default: ",[839,1247,1248],{},"100",[1240,1250,1251],{"name":894,"type":1242},[835,1252,1253,1254,931],{},"Penalty for User-Agents claiming Internet Explorer. Default: ",[839,1255,1248],{},[1240,1257,1258],{"name":904,"type":1242},[835,1259,1260,1261,931],{},"Penalty for desktop User-Agents declaring Linux as the operating system. Default: ",[839,1262,1263],{},"10",[1240,1265,1266],{"name":914,"type":1242},[835,1267,1268,1269,931],{},"Penalty for contradictory browser and OS or device pairs that cannot exist in real browsers. Default: ",[839,1270,1271],{},"30",[1240,1273,1274],{"name":924,"type":1242},[835,1275,1276,1277,931],{},"Penalty when the parsed browser type is missing or unrecognized. Default: ",[839,1278,1263],{},[1240,1280,1281],{"name":927,"type":1242},[835,1282,1283,1284,931],{},"Penalty when the parsed browser name is missing or unrecognized. Default: ",[839,1285,1263],{},[1240,1287,1288],{"name":940,"type":1242},[835,1289,1290,1291,931],{},"Penalty for desktop device type with no recognized operating system. Default: ",[839,1292,1263],{},[1240,1294,1295],{"name":943,"type":1242},[835,1296,1297,1298,931],{},"Penalty for a non-desktop device type with no recognized device vendor. Default: ",[839,1299,1263],{},[1240,1301,1302],{"name":930,"type":1242},[835,1303,1304,1305,931],{},"Penalty when the browser version is absent. Default: ",[839,1306,1263],{},[1240,1308,1309],{"name":947,"type":1242},[835,1310,1311,1312,931],{},"Penalty for a non-desktop device type with no recognized device model. Default: ",[839,1313,1314],{},"5",[851,1316],{},[854,1318,1320],{"id":1319},"reason-codes","Reason Codes",[1322,1323,1324,1337],"table",{},[1325,1326,1327],"thead",{},[1328,1329,1330,1334],"tr",{},[1331,1332,1333],"th",{},"Code",[1331,1335,1336],{},"Trigger",[1338,1339,1340,1351,1361,1371,1381,1391,1401,1411,1421,1431],"tbody",{},[1328,1341,1342,1348],{},[1343,1344,1345],"td",{},[839,1346,1347],{},"CLI_OR_LIBRARY",[1343,1349,1350],{},"User-Agent identified as a CLI tool or HTTP library.",[1328,1352,1353,1358],{},[1343,1354,1355],{},[839,1356,1357],{},"INTERNET_EXPLORER",[1343,1359,1360],{},"User-Agent claims Internet Explorer.",[1328,1362,1363,1368],{},[1343,1364,1365],{},[839,1366,1367],{},"LINUX_OS",[1343,1369,1370],{},"User-Agent declares Linux as the operating system.",[1328,1372,1373,1378],{},[1343,1374,1375],{},[839,1376,1377],{},"IMPOSSIBLE_BROWSER_COMBINATION",[1343,1379,1380],{},"Browser, OS, or device attributes form a physically impossible combination.",[1328,1382,1383,1388],{},[1343,1384,1385],{},[839,1386,1387],{},"BROWSER_TYPE_UNKNOWN",[1343,1389,1390],{},"Browser type field is absent or unrecognized after parsing.",[1328,1392,1393,1398],{},[1343,1394,1395],{},[839,1396,1397],{},"BROWSER_NAME_UNKNOWN",[1343,1399,1400],{},"Browser name field is absent or unrecognized after parsing.",[1328,1402,1403,1408],{},[1343,1404,1405],{},[839,1406,1407],{},"DESKTOP_WITHOUT_OS",[1343,1409,1410],{},"Device type is desktop but no OS is present in the User-Agent.",[1328,1412,1413,1418],{},[1343,1414,1415],{},[839,1416,1417],{},"DEVICE_VENDOR_UNKNOWN",[1343,1419,1420],{},"Device type implies a vendor but the vendor field is absent.",[1328,1422,1423,1428],{},[1343,1424,1425],{},[839,1426,1427],{},"BROWSER_VERSION_UNKNOWN",[1343,1429,1430],{},"Browser version field is absent after parsing.",[1328,1432,1433,1438],{},[1343,1434,1435],{},[839,1436,1437],{},"NO_MODEL",[1343,1439,1440],{},"Device type implies a model but the model field is absent.",[851,1442],{},[1444,1445,1446],"tip",{},[835,1447,1448,1449,1451,1452,1454,1455,1457,1458,1461],{},"The ",[839,1450,884],{}," and ",[839,1453,894],{}," penalties default to ",[839,1456,1248],{},", matching ",[839,1459,1460],{},"banScore",". A single match from either condition immediately bans the visitor without accumulating other scores. Lower these values if your application intentionally serves programmatic clients.",[1463,1464,1465],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":960,"searchDepth":982,"depth":982,"links":1467},[1468,1469,1470],{"id":856,"depth":982,"text":857},{"id":952,"depth":982,"text":188},{"id":1319,"depth":982,"text":1320},"Detects CLI tools, impossible browser\u002FOS combinations, Internet Explorer, and missing User-Agent attributes.","md","i-lucide-monitor-smartphone",{},null,"---\ntitle: Browser & Device Fingerprint\ndescription: Detects CLI tools, impossible browser\u002FOS combinations, Internet Explorer, and missing User-Agent attributes.\nicon: i-lucide-monitor-smartphone\n---\n\nThe browser and device checker parses the `User-Agent` header with `ua-parser-js` and validates the resulting browser and device attributes. Bots and automated tools produce User-Agents that fail real-world plausibility checks: they identify as CLI libraries, declare impossible OS\u002Fbrowser combinations, or omit fields that every real browser populates.\n\nThis checker runs entirely in memory. It reads no databases and performs no network calls.\n\n---\n\n## How It Works\n\nAfter parsing the User-Agent, the checker evaluates a set of independent conditions. Each condition adds its own penalty if it matches. Multiple conditions can fire on the same request.\n\n**CLI or library tools**: User-Agents containing keywords like `curl`, `python-requests`, `go-http-client`, `axios`, or similar library identifiers receive the `cliOrLibrary` penalty. These strings never appear in browser requests.\n\n**Internet Explorer**: IE is a deprecated browser with known security vulnerabilities. Requests claiming to use IE receive the `internetExplorer` penalty. Legitimate modern users no longer run IE.\n\n**Linux OS on a desktop**: Server-side scripts and headless browsers commonly run on Linux and produce User-Agents that declare a Linux desktop. The `linuxOs` penalty applies a low-weight signal to desktop Linux claims.\n\n**Impossible browser\u002FOS combinations**: Certain combinations are physically impossible: macOS does not run on non-Apple hardware in standard deployments, Safari does not run on Windows, and desktop browsers do not report mobile device attributes. When the parsed UA produces one of these contradictions, the `impossibleBrowserCombinations` penalty fires.\n\n**Missing browser fields**: Every real browser populates its browser name, browser type, browser version, and engine. Automated tools often omit some of these fields. The checker applies individual penalties for each missing field: `browserTypeUnknown`, `browserNameUnknown`, `browserVersionUnknown`.\n\n**Missing device fields**: Desktop browsers typically identify their OS but not a specific device vendor or model. Mobile browsers identify all three. When a User-Agent reports a desktop without any OS, or a device type that implies vendor\u002Fmodel data but those fields are absent, the checker applies `desktopWithoutOS`, `deviceVendorUnknown`, and `deviceModelUnknown`.\n\n---\n\n## Configuration\n\n```ts [server.ts]\nawait defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableBrowserAndDeviceChecks: {\n      enable: true,\n      penalties: {\n        cliOrLibrary: 100,\n        internetExplorer: 100,\n        linuxOs: 10,\n        impossibleBrowserCombinations: 30,\n        browserTypeUnknown: 10,\n        browserNameUnknown: 10,\n        desktopWithoutOS: 10,\n        deviceVendorUnknown: 10,\n        browserVersionUnknown: 10,\n        deviceModelUnknown: 5,\n      },\n    },\n  },\n})\n```\n\nAll weights live inside the `penalties: {}` sub-object.\n\n::field-group\n::field{name=\"cliOrLibrary\" type=\"number\"}\nPenalty for User-Agents that identify as a CLI tool or HTTP library (curl, python-requests, etc.). Default: `100`.\n::\n\n::field{name=\"internetExplorer\" type=\"number\"}\nPenalty for User-Agents claiming Internet Explorer. Default: `100`.\n::\n\n::field{name=\"linuxOs\" type=\"number\"}\nPenalty for desktop User-Agents declaring Linux as the operating system. Default: `10`.\n::\n\n::field{name=\"impossibleBrowserCombinations\" type=\"number\"}\nPenalty for contradictory browser and OS or device pairs that cannot exist in real browsers. Default: `30`.\n::\n\n::field{name=\"browserTypeUnknown\" type=\"number\"}\nPenalty when the parsed browser type is missing or unrecognized. Default: `10`.\n::\n\n::field{name=\"browserNameUnknown\" type=\"number\"}\nPenalty when the parsed browser name is missing or unrecognized. Default: `10`.\n::\n\n::field{name=\"desktopWithoutOS\" type=\"number\"}\nPenalty for desktop device type with no recognized operating system. Default: `10`.\n::\n\n::field{name=\"deviceVendorUnknown\" type=\"number\"}\nPenalty for a non-desktop device type with no recognized device vendor. Default: `10`.\n::\n\n::field{name=\"browserVersionUnknown\" type=\"number\"}\nPenalty when the browser version is absent. Default: `10`.\n::\n\n::field{name=\"deviceModelUnknown\" type=\"number\"}\nPenalty for a non-desktop device type with no recognized device model. Default: `5`.\n::\n::\n\n---\n\n## Reason Codes\n\n| Code | Trigger |\n| --- | --- |\n| `CLI_OR_LIBRARY` | User-Agent identified as a CLI tool or HTTP library. |\n| `INTERNET_EXPLORER` | User-Agent claims Internet Explorer. |\n| `LINUX_OS` | User-Agent declares Linux as the operating system. |\n| `IMPOSSIBLE_BROWSER_COMBINATION` | Browser, OS, or device attributes form a physically impossible combination. |\n| `BROWSER_TYPE_UNKNOWN` | Browser type field is absent or unrecognized after parsing. |\n| `BROWSER_NAME_UNKNOWN` | Browser name field is absent or unrecognized after parsing. |\n| `DESKTOP_WITHOUT_OS` | Device type is desktop but no OS is present in the User-Agent. |\n| `DEVICE_VENDOR_UNKNOWN` | Device type implies a vendor but the vendor field is absent. |\n| `BROWSER_VERSION_UNKNOWN` | Browser version field is absent after parsing. |\n| `NO_MODEL` | Device type implies a model but the model field is absent. |\n\n---\n\n::tip\nThe `cliOrLibrary` and `internetExplorer` penalties default to `100`, matching `banScore`. A single match from either condition immediately bans the visitor without accumulating other scores. Lower these values if your application intentionally serves programmatic clients.\n::\n",{"title":121,"description":1471},"DBSFFyxoOUAw5F50wx_I-5SUsFHTfxeK9pk6reFyMEo",[1480,1481],{"title":117,"path":118,"stem":119,"children":-1},{"title":125,"path":126,"stem":127,"children":-1},{"id":830,"title":121,"body":1483,"description":1471,"extension":1472,"icon":1473,"meta":1938,"module":1475,"navigation":8,"path":122,"rawbody":1476,"seo":1939,"stem":123,"__hash__":1478},{"type":832,"value":1484,"toc":1933},[1485,1491,1493,1495,1497,1499,1513,1519,1525,1531,1541,1551,1553,1555,1755,1759,1821,1823,1825,1917,1919,1931],[835,1486,837,1487,842,1489,846],{},[839,1488,841],{},[839,1490,845],{},[835,1492,849],{},[851,1494],{},[854,1496,857],{"id":856},[835,1498,860],{},[835,1500,1501,867,1503,871,1505,871,1507,871,1509,881,1511,885],{},[864,1502,866],{},[839,1504,870],{},[839,1506,874],{},[839,1508,877],{},[839,1510,880],{},[839,1512,884],{},[835,1514,1515,891,1517,895],{},[864,1516,890],{},[839,1518,894],{},[835,1520,1521,901,1523,905],{},[864,1522,900],{},[839,1524,904],{},[835,1526,1527,911,1529,915],{},[864,1528,910],{},[839,1530,914],{},[835,1532,1533,921,1535,871,1537,871,1539,931],{},[864,1534,920],{},[839,1536,924],{},[839,1538,927],{},[839,1540,930],{},[835,1542,1543,937,1545,871,1547,944,1549,931],{},[864,1544,936],{},[839,1546,940],{},[839,1548,943],{},[839,1550,947],{},[851,1552],{},[854,1554,188],{"id":952},[954,1556,1557],{"className":956,"code":957,"filename":958,"language":959,"meta":960,"style":960},[839,1558,1559,1567,1605,1613,1621,1631,1639,1649,1659,1669,1679,1689,1699,1709,1719,1729,1739,1743,1747,1751],{"__ignoreMap":960},[964,1560,1561,1563,1565],{"class":966,"line":967},[964,1562,971],{"class":970},[964,1564,975],{"class":974},[964,1566,979],{"class":978},[964,1568,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603],{"class":966,"line":982},[964,1570,986],{"class":985},[964,1572,990],{"class":989},[964,1574,993],{"class":978},[964,1576,996],{"class":985},[964,1578,990],{"class":989},[964,1580,993],{"class":978},[964,1582,1003],{"class":985},[964,1584,990],{"class":989},[964,1586,1009],{"class":1008},[964,1588,1013],{"class":1012},[964,1590,1016],{"class":1008},[964,1592,871],{"class":978},[964,1594,1021],{"class":985},[964,1596,990],{"class":989},[964,1598,1009],{"class":1008},[964,1600,1028],{"class":1012},[964,1602,1016],{"class":1008},[964,1604,1033],{"class":978},[964,1606,1607,1609,1611],{"class":966,"line":1036},[964,1608,1039],{"class":985},[964,1610,990],{"class":989},[964,1612,1044],{"class":978},[964,1614,1615,1617,1619],{"class":966,"line":1047},[964,1616,1050],{"class":985},[964,1618,990],{"class":989},[964,1620,1044],{"class":978},[964,1622,1623,1625,1627,1629],{"class":966,"line":1057},[964,1624,1060],{"class":985},[964,1626,990],{"class":989},[964,1628,1066],{"class":1065},[964,1630,1069],{"class":978},[964,1632,1633,1635,1637],{"class":966,"line":1072},[964,1634,1075],{"class":985},[964,1636,990],{"class":989},[964,1638,1044],{"class":978},[964,1640,1641,1643,1645,1647],{"class":966,"line":1082},[964,1642,1085],{"class":985},[964,1644,990],{"class":989},[964,1646,1091],{"class":1090},[964,1648,1069],{"class":978},[964,1650,1651,1653,1655,1657],{"class":966,"line":1096},[964,1652,1099],{"class":985},[964,1654,990],{"class":989},[964,1656,1091],{"class":1090},[964,1658,1069],{"class":978},[964,1660,1661,1663,1665,1667],{"class":966,"line":1108},[964,1662,1111],{"class":985},[964,1664,990],{"class":989},[964,1666,1116],{"class":1090},[964,1668,1069],{"class":978},[964,1670,1671,1673,1675,1677],{"class":966,"line":1121},[964,1672,1124],{"class":985},[964,1674,990],{"class":989},[964,1676,1129],{"class":1090},[964,1678,1069],{"class":978},[964,1680,1681,1683,1685,1687],{"class":966,"line":1134},[964,1682,1137],{"class":985},[964,1684,990],{"class":989},[964,1686,1116],{"class":1090},[964,1688,1069],{"class":978},[964,1690,1691,1693,1695,1697],{"class":966,"line":1146},[964,1692,1149],{"class":985},[964,1694,990],{"class":989},[964,1696,1116],{"class":1090},[964,1698,1069],{"class":978},[964,1700,1701,1703,1705,1707],{"class":966,"line":1158},[964,1702,1161],{"class":985},[964,1704,990],{"class":989},[964,1706,1116],{"class":1090},[964,1708,1069],{"class":978},[964,1710,1711,1713,1715,1717],{"class":966,"line":1170},[964,1712,1173],{"class":985},[964,1714,990],{"class":989},[964,1716,1116],{"class":1090},[964,1718,1069],{"class":978},[964,1720,1721,1723,1725,1727],{"class":966,"line":1182},[964,1722,1185],{"class":985},[964,1724,990],{"class":989},[964,1726,1116],{"class":1090},[964,1728,1069],{"class":978},[964,1730,1731,1733,1735,1737],{"class":966,"line":1194},[964,1732,1197],{"class":985},[964,1734,990],{"class":989},[964,1736,1202],{"class":1090},[964,1738,1069],{"class":978},[964,1740,1741],{"class":966,"line":1207},[964,1742,1210],{"class":978},[964,1744,1745],{"class":966,"line":1213},[964,1746,1216],{"class":978},[964,1748,1749],{"class":966,"line":1219},[964,1750,1222],{"class":978},[964,1752,1753],{"class":966,"line":1225},[964,1754,1228],{"class":978},[835,1756,1231,1757,1235],{},[839,1758,1234],{},[1237,1760,1761,1767,1773,1779,1785,1791,1797,1803,1809,1815],{},[1240,1762,1763],{"name":884,"type":1242},[835,1764,1245,1765,931],{},[839,1766,1248],{},[1240,1768,1769],{"name":894,"type":1242},[835,1770,1253,1771,931],{},[839,1772,1248],{},[1240,1774,1775],{"name":904,"type":1242},[835,1776,1260,1777,931],{},[839,1778,1263],{},[1240,1780,1781],{"name":914,"type":1242},[835,1782,1268,1783,931],{},[839,1784,1271],{},[1240,1786,1787],{"name":924,"type":1242},[835,1788,1276,1789,931],{},[839,1790,1263],{},[1240,1792,1793],{"name":927,"type":1242},[835,1794,1283,1795,931],{},[839,1796,1263],{},[1240,1798,1799],{"name":940,"type":1242},[835,1800,1290,1801,931],{},[839,1802,1263],{},[1240,1804,1805],{"name":943,"type":1242},[835,1806,1297,1807,931],{},[839,1808,1263],{},[1240,1810,1811],{"name":930,"type":1242},[835,1812,1304,1813,931],{},[839,1814,1263],{},[1240,1816,1817],{"name":947,"type":1242},[835,1818,1311,1819,931],{},[839,1820,1314],{},[851,1822],{},[854,1824,1320],{"id":1319},[1322,1826,1827,1835],{},[1325,1828,1829],{},[1328,1830,1831,1833],{},[1331,1832,1333],{},[1331,1834,1336],{},[1338,1836,1837,1845,1853,1861,1869,1877,1885,1893,1901,1909],{},[1328,1838,1839,1843],{},[1343,1840,1841],{},[839,1842,1347],{},[1343,1844,1350],{},[1328,1846,1847,1851],{},[1343,1848,1849],{},[839,1850,1357],{},[1343,1852,1360],{},[1328,1854,1855,1859],{},[1343,1856,1857],{},[839,1858,1367],{},[1343,1860,1370],{},[1328,1862,1863,1867],{},[1343,1864,1865],{},[839,1866,1377],{},[1343,1868,1380],{},[1328,1870,1871,1875],{},[1343,1872,1873],{},[839,1874,1387],{},[1343,1876,1390],{},[1328,1878,1879,1883],{},[1343,1880,1881],{},[839,1882,1397],{},[1343,1884,1400],{},[1328,1886,1887,1891],{},[1343,1888,1889],{},[839,1890,1407],{},[1343,1892,1410],{},[1328,1894,1895,1899],{},[1343,1896,1897],{},[839,1898,1417],{},[1343,1900,1420],{},[1328,1902,1903,1907],{},[1343,1904,1905],{},[839,1906,1427],{},[1343,1908,1430],{},[1328,1910,1911,1915],{},[1343,1912,1913],{},[839,1914,1437],{},[1343,1916,1440],{},[851,1918],{},[1444,1920,1921],{},[835,1922,1448,1923,1451,1925,1454,1927,1457,1929,1461],{},[839,1924,884],{},[839,1926,894],{},[839,1928,1248],{},[839,1930,1460],{},[1463,1932,1465],{},{"title":960,"searchDepth":982,"depth":982,"links":1934},[1935,1936,1937],{"id":856,"depth":982,"text":857},{"id":952,"depth":982,"text":188},{"id":1319,"depth":982,"text":1320},{},{"title":121,"description":1471},1780436276260]