[{"data":1,"prerenderedAt":2807},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header_page":829,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header_surround":1990,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header":1993},{"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":169,"body":831,"description":1982,"extension":1983,"icon":1984,"meta":1985,"module":1986,"navigation":8,"path":170,"rawbody":1987,"seo":1988,"stem":171,"__hash__":1989},"docs\u002Fdocs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header.md",{"type":832,"value":833,"toc":1967},"minimark",[834,838,841,844,849,854,884,888,895,899,913,917,924,961,981,1014,1018,1051,1053,1056,1566,1572,1619,1624,1634,1831,1837,1888,1890,1894,1963],[835,836,837],"p",{},"The UA and header analysis checker is one of the most comprehensive checks in the pipeline. It evaluates multiple orthogonal signals about the HTTP request itself: the User-Agent string for headless browser keywords, the request TLS fingerprint for browser identity mismatch, the full set of HTTP headers for bot-characteristic patterns, and the request path for traversal attempts.",[835,839,840],{},"This checker runs in the heavy phase.",[842,843],"hr",{},[845,846,848],"h2",{"id":847},"how-it-works","How It Works",[850,851,853],"h3",{"id":852},"headless-browser-detection","Headless Browser Detection",[835,855,856,857,861,862,861,865,861,868,871,872,875,876,879,880,883],{},"The checker scans the User-Agent string for keywords associated with headless browser automation: ",[858,859,860],"code",{},"headless",", ",[858,863,864],{},"puppeteer",[858,866,867],{},"selenium",[858,869,870],{},"playwright",", and ",[858,873,874],{},"phantomjs",". Any match fires ",[858,877,878],{},"HEADLESS_BROWSER_DETECTED"," and applies ",[858,881,882],{},"headlessBrowser",".",[850,885,887],{"id":886},"short-user-agent","Short User-Agent",[835,889,890,891,894],{},"A User-Agent shorter than 10 characters is a strong signal of a script or misconfigured tool. Real browser User-Agents are always significantly longer. This check applies ",[858,892,893],{},"shortUserAgent"," when the condition is met.",[850,896,898],{"id":897},"tls-protocol-checks","TLS & Protocol Checks",[835,900,901,902,861,905,908,909,912],{},"The checker reads the ",[858,903,904],{},"x-client-cipher",[858,906,907],{},"x-client-tls-version",", and HTTP version from the request and validates them against a whitelist of cipher suites and protocol versions that real browsers use. When the cipher or protocol does not match (for example, when a tool uses TLS 1.0 or a non-browser cipher), ",[858,910,911],{},"tlsCheckFailed"," fires. These headers must be forwarded by an upstream proxy such as Caddy or Nginx; they are not set by Node.js itself.",[850,914,916],{"id":915},"header-analysis","Header Analysis",[835,918,919,920,923],{},"The checker runs a full header scoring pass that evaluates three groups of signals. All weights for this group come from the top-level ",[858,921,922],{},"headerOptions"," configuration object.",[835,925,926,930,931,934,935,861,938,861,941,861,944,861,947,861,950,871,953,956,957,960],{},[927,928,929],"strong",{},"Must-have headers",": HTTP\u002F1.0 requests score an immediate ",[858,932,933],{},"40"," points. Real browsers always send ",[858,936,937],{},"User-Agent",[858,939,940],{},"Accept",[858,942,943],{},"Accept-Encoding",[858,945,946],{},"Accept-Language",[858,948,949],{},"Host",[858,951,952],{},"Upgrade-Insecure-Requests",[858,954,955],{},"Sec-Fetch-*"," headers. Missing any of these applies ",[858,958,959],{},"weightPerMustHeader"," per missing header.",[835,962,963,966,967,970,971,974,975,977,978,980],{},[927,964,965],{},"Engine-specific headers",": The checker resolves the browser engine from the User-Agent. Blink-based browsers (Chrome, Edge, Opera) send ",[858,968,969],{},"sec-ch-ua-*"," client hints and never send a ",[858,972,973],{},"TE"," header. Gecko browsers (Firefox) send a ",[858,976,973],{}," header and never send client hints. WebKit browsers follow a similar pattern. Violations of these engine-specific expectations apply the corresponding ",[858,979,922],{}," penalty.",[835,982,983,986,987,990,991,994,995,998,999,1002,1003,1006,1007,1010,1011,883],{},[927,984,985],{},"Weird headers",": Several header patterns are characteristic of automation tools or misconfigured clients: an ",[858,988,989],{},"Accept: *\u002F*"," wildcard (omitting the structured accept list real browsers send), an ",[858,992,993],{},"X-Requested-With"," header on a GET request (an AJAX marker that real browsers do not send on normal navigation), ",[858,996,997],{},"Postman-Token"," or ",[858,1000,1001],{},"Insomnia"," headers, a mismatched ",[858,1004,1005],{},"X-Forwarded-Host",", aggressive cache-control on GET requests, a missing referer on cross-site requests, a null or mismatched ",[858,1008,1009],{},"Origin",", and an unexpected ",[858,1012,1013],{},"sec-fetch-mode",[850,1015,1017],{"id":1016},"path-traversal-detection","Path Traversal Detection",[835,1019,1020,1021,1024,1025,861,1028,1031,1032,1035,1036,1039,1040,1043,1044,1047,1048,883],{},"The checker inspects ",[858,1022,1023],{},"req.path"," for directory traversal sequences. It catches encoded variants (",[858,1026,1027],{},"%2F",[858,1029,1030],{},"%2E%2E","), decodes them iteratively up to ",[858,1033,1034],{},"pathTraveler.maxIterations"," times, and checks for ",[858,1037,1038],{},"..\u002F"," patterns. Paths exceeding ",[858,1041,1042],{},"pathTraveler.maxPathLength"," characters apply the ",[858,1045,1046],{},"pathLengthToLong"," penalty. Detected traversal sequences apply ",[858,1049,1050],{},"traversalDetected",[842,1052],{},[845,1054,188],{"id":1055},"configuration",[1057,1058,1064],"pre",{"className":1059,"code":1060,"filename":1061,"language":1062,"meta":1063,"style":1063},"language-ts shiki shiki-themes light-plus light-plus dracula","await defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableUaAndHeaderChecks: {\n      enable: true,\n      penalties: {\n        headlessBrowser: 100,\n        shortUserAgent: 80,\n        tlsCheckFailed: 60,\n        badUaChecker: true,  \u002F\u002F enables the knownBadUserAgents sub-checker\n      },\n    },\n  },\n  \u002F\u002F Header scoring weights (all optional, defaults shown)\n  headerOptions: {\n    weightPerMustHeader: 20,\n    missingBrowserEngine: 30,\n    postManOrInsomiaHeaders: 50,\n    AJAXHeaderExists: 30,\n    connectionHeaderIsClose: 20,\n    originHeaderIsNULL: 10,\n    originHeaderMismatch: 30,\n    omittedAcceptHeader: 30,\n    clientHintsMissingForBlink: 30,\n    teHeaderUnexpectedForBlink: 10,\n    clientHintsUnexpectedForGecko: 30,\n    teHeaderMissingForGecko: 20,\n    aggressiveCacheControlOnGet: 15,\n    crossSiteRequestMissingReferer: 10,\n    inconsistentSecFetchMode: 20,\n    hostMismatchWeight: 40,\n  },\n  \u002F\u002F Path traversal weights (all optional, defaults shown)\n  pathTraveler: {\n    maxIterations: 3,\n    maxPathLength: 1500,\n    pathLengthToLong: 100,\n    longDecoding: 100,\n    traversalDetected: 60,\n  },\n})\n","server.ts","ts","",[858,1065,1066,1083,1137,1148,1158,1173,1183,1197,1210,1223,1240,1246,1252,1258,1264,1274,1287,1300,1313,1325,1337,1350,1362,1374,1386,1398,1410,1422,1435,1447,1459,1472,1477,1483,1493,1506,1519,1531,1543,1555,1560],{"__ignoreMap":1063},[1067,1068,1071,1075,1079],"span",{"class":1069,"line":1070},"line",1,[1067,1072,1074],{"class":1073},"sZ328","await",[1067,1076,1078],{"class":1077},"sHOzp"," defineConfiguration",[1067,1080,1082],{"class":1081},"sDd4n","({\n",[1067,1084,1086,1090,1094,1097,1100,1102,1104,1107,1109,1113,1117,1120,1122,1125,1127,1129,1132,1134],{"class":1069,"line":1085},2,[1067,1087,1089],{"class":1088},"sjsA6","  store",[1067,1091,1093],{"class":1092},"s34zl",":",[1067,1095,1096],{"class":1081}," { ",[1067,1098,1099],{"class":1088},"main",[1067,1101,1093],{"class":1092},[1067,1103,1096],{"class":1081},[1067,1105,1106],{"class":1088},"driver",[1067,1108,1093],{"class":1092},[1067,1110,1112],{"class":1111},"sFkSl"," '",[1067,1114,1116],{"class":1115},"sFB1V","sqlite",[1067,1118,1119],{"class":1111},"'",[1067,1121,861],{"class":1081},[1067,1123,1124],{"class":1088},"name",[1067,1126,1093],{"class":1092},[1067,1128,1112],{"class":1111},[1067,1130,1131],{"class":1115},".\u002Fbot-detector.db",[1067,1133,1119],{"class":1111},[1067,1135,1136],{"class":1081}," } },\n",[1067,1138,1140,1143,1145],{"class":1069,"line":1139},3,[1067,1141,1142],{"class":1088},"  checkers",[1067,1144,1093],{"class":1092},[1067,1146,1147],{"class":1081}," {\n",[1067,1149,1151,1154,1156],{"class":1069,"line":1150},4,[1067,1152,1153],{"class":1088},"    enableUaAndHeaderChecks",[1067,1155,1093],{"class":1092},[1067,1157,1147],{"class":1081},[1067,1159,1161,1164,1166,1170],{"class":1069,"line":1160},5,[1067,1162,1163],{"class":1088},"      enable",[1067,1165,1093],{"class":1092},[1067,1167,1169],{"class":1168},"sjR7W"," true",[1067,1171,1172],{"class":1081},",\n",[1067,1174,1176,1179,1181],{"class":1069,"line":1175},6,[1067,1177,1178],{"class":1088},"      penalties",[1067,1180,1093],{"class":1092},[1067,1182,1147],{"class":1081},[1067,1184,1186,1189,1191,1195],{"class":1069,"line":1185},7,[1067,1187,1188],{"class":1088},"        headlessBrowser",[1067,1190,1093],{"class":1092},[1067,1192,1194],{"class":1193},"spgvN"," 100",[1067,1196,1172],{"class":1081},[1067,1198,1200,1203,1205,1208],{"class":1069,"line":1199},8,[1067,1201,1202],{"class":1088},"        shortUserAgent",[1067,1204,1093],{"class":1092},[1067,1206,1207],{"class":1193}," 80",[1067,1209,1172],{"class":1081},[1067,1211,1213,1216,1218,1221],{"class":1069,"line":1212},9,[1067,1214,1215],{"class":1088},"        tlsCheckFailed",[1067,1217,1093],{"class":1092},[1067,1219,1220],{"class":1193}," 60",[1067,1222,1172],{"class":1081},[1067,1224,1226,1229,1231,1233,1236],{"class":1069,"line":1225},10,[1067,1227,1228],{"class":1088},"        badUaChecker",[1067,1230,1093],{"class":1092},[1067,1232,1169],{"class":1168},[1067,1234,1235],{"class":1081},",  ",[1067,1237,1239],{"class":1238},"sghk6","\u002F\u002F enables the knownBadUserAgents sub-checker\n",[1067,1241,1243],{"class":1069,"line":1242},11,[1067,1244,1245],{"class":1081},"      },\n",[1067,1247,1249],{"class":1069,"line":1248},12,[1067,1250,1251],{"class":1081},"    },\n",[1067,1253,1255],{"class":1069,"line":1254},13,[1067,1256,1257],{"class":1081},"  },\n",[1067,1259,1261],{"class":1069,"line":1260},14,[1067,1262,1263],{"class":1238},"  \u002F\u002F Header scoring weights (all optional, defaults shown)\n",[1067,1265,1267,1270,1272],{"class":1069,"line":1266},15,[1067,1268,1269],{"class":1088},"  headerOptions",[1067,1271,1093],{"class":1092},[1067,1273,1147],{"class":1081},[1067,1275,1277,1280,1282,1285],{"class":1069,"line":1276},16,[1067,1278,1279],{"class":1088},"    weightPerMustHeader",[1067,1281,1093],{"class":1092},[1067,1283,1284],{"class":1193}," 20",[1067,1286,1172],{"class":1081},[1067,1288,1290,1293,1295,1298],{"class":1069,"line":1289},17,[1067,1291,1292],{"class":1088},"    missingBrowserEngine",[1067,1294,1093],{"class":1092},[1067,1296,1297],{"class":1193}," 30",[1067,1299,1172],{"class":1081},[1067,1301,1303,1306,1308,1311],{"class":1069,"line":1302},18,[1067,1304,1305],{"class":1088},"    postManOrInsomiaHeaders",[1067,1307,1093],{"class":1092},[1067,1309,1310],{"class":1193}," 50",[1067,1312,1172],{"class":1081},[1067,1314,1316,1319,1321,1323],{"class":1069,"line":1315},19,[1067,1317,1318],{"class":1088},"    AJAXHeaderExists",[1067,1320,1093],{"class":1092},[1067,1322,1297],{"class":1193},[1067,1324,1172],{"class":1081},[1067,1326,1328,1331,1333,1335],{"class":1069,"line":1327},20,[1067,1329,1330],{"class":1088},"    connectionHeaderIsClose",[1067,1332,1093],{"class":1092},[1067,1334,1284],{"class":1193},[1067,1336,1172],{"class":1081},[1067,1338,1340,1343,1345,1348],{"class":1069,"line":1339},21,[1067,1341,1342],{"class":1088},"    originHeaderIsNULL",[1067,1344,1093],{"class":1092},[1067,1346,1347],{"class":1193}," 10",[1067,1349,1172],{"class":1081},[1067,1351,1353,1356,1358,1360],{"class":1069,"line":1352},22,[1067,1354,1355],{"class":1088},"    originHeaderMismatch",[1067,1357,1093],{"class":1092},[1067,1359,1297],{"class":1193},[1067,1361,1172],{"class":1081},[1067,1363,1365,1368,1370,1372],{"class":1069,"line":1364},23,[1067,1366,1367],{"class":1088},"    omittedAcceptHeader",[1067,1369,1093],{"class":1092},[1067,1371,1297],{"class":1193},[1067,1373,1172],{"class":1081},[1067,1375,1377,1380,1382,1384],{"class":1069,"line":1376},24,[1067,1378,1379],{"class":1088},"    clientHintsMissingForBlink",[1067,1381,1093],{"class":1092},[1067,1383,1297],{"class":1193},[1067,1385,1172],{"class":1081},[1067,1387,1389,1392,1394,1396],{"class":1069,"line":1388},25,[1067,1390,1391],{"class":1088},"    teHeaderUnexpectedForBlink",[1067,1393,1093],{"class":1092},[1067,1395,1347],{"class":1193},[1067,1397,1172],{"class":1081},[1067,1399,1401,1404,1406,1408],{"class":1069,"line":1400},26,[1067,1402,1403],{"class":1088},"    clientHintsUnexpectedForGecko",[1067,1405,1093],{"class":1092},[1067,1407,1297],{"class":1193},[1067,1409,1172],{"class":1081},[1067,1411,1413,1416,1418,1420],{"class":1069,"line":1412},27,[1067,1414,1415],{"class":1088},"    teHeaderMissingForGecko",[1067,1417,1093],{"class":1092},[1067,1419,1284],{"class":1193},[1067,1421,1172],{"class":1081},[1067,1423,1425,1428,1430,1433],{"class":1069,"line":1424},28,[1067,1426,1427],{"class":1088},"    aggressiveCacheControlOnGet",[1067,1429,1093],{"class":1092},[1067,1431,1432],{"class":1193}," 15",[1067,1434,1172],{"class":1081},[1067,1436,1438,1441,1443,1445],{"class":1069,"line":1437},29,[1067,1439,1440],{"class":1088},"    crossSiteRequestMissingReferer",[1067,1442,1093],{"class":1092},[1067,1444,1347],{"class":1193},[1067,1446,1172],{"class":1081},[1067,1448,1450,1453,1455,1457],{"class":1069,"line":1449},30,[1067,1451,1452],{"class":1088},"    inconsistentSecFetchMode",[1067,1454,1093],{"class":1092},[1067,1456,1284],{"class":1193},[1067,1458,1172],{"class":1081},[1067,1460,1462,1465,1467,1470],{"class":1069,"line":1461},31,[1067,1463,1464],{"class":1088},"    hostMismatchWeight",[1067,1466,1093],{"class":1092},[1067,1468,1469],{"class":1193}," 40",[1067,1471,1172],{"class":1081},[1067,1473,1475],{"class":1069,"line":1474},32,[1067,1476,1257],{"class":1081},[1067,1478,1480],{"class":1069,"line":1479},33,[1067,1481,1482],{"class":1238},"  \u002F\u002F Path traversal weights (all optional, defaults shown)\n",[1067,1484,1486,1489,1491],{"class":1069,"line":1485},34,[1067,1487,1488],{"class":1088},"  pathTraveler",[1067,1490,1093],{"class":1092},[1067,1492,1147],{"class":1081},[1067,1494,1496,1499,1501,1504],{"class":1069,"line":1495},35,[1067,1497,1498],{"class":1088},"    maxIterations",[1067,1500,1093],{"class":1092},[1067,1502,1503],{"class":1193}," 3",[1067,1505,1172],{"class":1081},[1067,1507,1509,1512,1514,1517],{"class":1069,"line":1508},36,[1067,1510,1511],{"class":1088},"    maxPathLength",[1067,1513,1093],{"class":1092},[1067,1515,1516],{"class":1193}," 1500",[1067,1518,1172],{"class":1081},[1067,1520,1522,1525,1527,1529],{"class":1069,"line":1521},37,[1067,1523,1524],{"class":1088},"    pathLengthToLong",[1067,1526,1093],{"class":1092},[1067,1528,1194],{"class":1193},[1067,1530,1172],{"class":1081},[1067,1532,1534,1537,1539,1541],{"class":1069,"line":1533},38,[1067,1535,1536],{"class":1088},"    longDecoding",[1067,1538,1093],{"class":1092},[1067,1540,1194],{"class":1193},[1067,1542,1172],{"class":1081},[1067,1544,1546,1549,1551,1553],{"class":1069,"line":1545},39,[1067,1547,1548],{"class":1088},"    traversalDetected",[1067,1550,1093],{"class":1092},[1067,1552,1220],{"class":1193},[1067,1554,1172],{"class":1081},[1067,1556,1558],{"class":1069,"line":1557},40,[1067,1559,1257],{"class":1081},[1067,1561,1563],{"class":1069,"line":1562},41,[1067,1564,1565],{"class":1081},"})\n",[850,1567,1569],{"id":1568},"checkersenableuaandheadercheckspenalties",[858,1570,1571],{},"checkers.enableUaAndHeaderChecks.penalties",[1573,1574,1575,1585,1593,1601],"field-group",{},[1576,1577,1579],"field",{"name":882,"type":1578},"number",[835,1580,1581,1582,883],{},"Penalty when the User-Agent contains headless browser keywords. Default: ",[858,1583,1584],{},"100",[1576,1586,1587],{"name":893,"type":1578},[835,1588,1589,1590,883],{},"Penalty when the User-Agent is fewer than 10 characters. Default: ",[858,1591,1592],{},"80",[1576,1594,1595],{"name":911,"type":1578},[835,1596,1597,1598,883],{},"Penalty when the TLS fingerprint does not match the declared browser. Default: ",[858,1599,1600],{},"60",[1576,1602,1605],{"name":1603,"type":1604},"badUaChecker","boolean",[835,1606,1607,1608,1611,1612,1616,1617,883],{},"When ",[858,1609,1610],{},"true",", enables the ",[1613,1614,177],"a",{"href":1615},".\u002Fknown-bad-ua"," sub-checker, which runs the LMDB pattern database against the User-Agent. Default: ",[858,1618,1610],{},[850,1620,1622],{"id":1621},"headeroptions",[858,1623,922],{},[835,1625,1626,1627,1630,1631,883],{},"These weights are configured at the top level of ",[858,1628,1629],{},"defineConfiguration",", not inside ",[858,1632,1633],{},"checkers",[1573,1635,1636,1644,1653,1667,1678,1694,1706,1717,1727,1737,1748,1759,1770,1786,1801,1818],{},[1576,1637,1638],{"name":959,"type":1578},[835,1639,1640,1641,883],{},"Penalty per missing required browser header (User-Agent, Accept, Accept-Language, Host, Sec-Fetch-*, etc.). Default: ",[858,1642,1643],{},"20",[1576,1645,1647],{"name":1646,"type":1578},"missingBrowserEngine",[835,1648,1649,1650,883],{},"Penalty when the browser engine cannot be determined from the User-Agent. Default: ",[858,1651,1652],{},"30",[1576,1654,1656],{"name":1655,"type":1578},"postManOrInsomiaHeaders",[835,1657,1658,1659,998,1661,1663,1664,883],{},"Penalty for requests carrying ",[858,1660,997],{},[858,1662,1001],{}," headers. Default: ",[858,1665,1666],{},"50",[1576,1668,1670],{"name":1669,"type":1578},"AJAXHeaderExists",[835,1671,1672,1673,1675,1676,883],{},"Penalty for a GET request that includes ",[858,1674,993],{}," (AJAX marker). Default: ",[858,1677,1652],{},[1576,1679,1681],{"name":1680,"type":1578},"connectionHeaderIsClose",[835,1682,1683,1684,1687,1688,1691,1692,883],{},"Penalty for an HTTP\u002F1.1 request with ",[858,1685,1686],{},"Connection: close"," instead of ",[858,1689,1690],{},"keep-alive",". Default: ",[858,1693,1643],{},[1576,1695,1697],{"name":1696,"type":1578},"originHeaderIsNULL",[835,1698,1699,1700,1702,1703,883],{},"Penalty when the ",[858,1701,1009],{}," header is null on a non-navigational same-origin request. Default: ",[858,1704,1705],{},"10",[1576,1707,1709],{"name":1708,"type":1578},"originHeaderMismatch",[835,1710,1711,1712,1714,1715,883],{},"Penalty when ",[858,1713,1009],{}," does not match the server's protocol and hostname. Default: ",[858,1716,1652],{},[1576,1718,1720],{"name":1719,"type":1578},"omittedAcceptHeader",[835,1721,1711,1722,1724,1725,883],{},[858,1723,989],{}," is sent instead of a proper browser accept list. Default: ",[858,1726,1652],{},[1576,1728,1730],{"name":1729,"type":1578},"clientHintsMissingForBlink",[835,1731,1732,1733,1663,1735,883],{},"Penalty when a Blink-engine browser does not send ",[858,1734,969],{},[858,1736,1652],{},[1576,1738,1740],{"name":1739,"type":1578},"teHeaderUnexpectedForBlink",[835,1741,1742,1743,1745,1746,883],{},"Penalty when a Blink-engine browser sends the ",[858,1744,973],{}," header (a Gecko-only header). Default: ",[858,1747,1705],{},[1576,1749,1751],{"name":1750,"type":1578},"clientHintsUnexpectedForGecko",[835,1752,1753,1754,1756,1757,883],{},"Penalty when a Gecko or WebKit browser sends ",[858,1755,969],{}," client hints. Default: ",[858,1758,1652],{},[1576,1760,1762],{"name":1761,"type":1578},"teHeaderMissingForGecko",[835,1763,1764,1765,1767,1768,883],{},"Penalty when a Gecko browser does not send the ",[858,1766,973],{}," header. Default: ",[858,1769,1643],{},[1576,1771,1773],{"name":1772,"type":1578},"aggressiveCacheControlOnGet",[835,1774,1775,1776,1779,1780,1691,1783,883],{},"Penalty for a GET request with both ",[858,1777,1778],{},"Cache-Control: no-cache"," and ",[858,1781,1782],{},"Pragma: no-cache",[858,1784,1785],{},"15",[1576,1787,1789],{"name":1788,"type":1578},"crossSiteRequestMissingReferer",[835,1790,1791,1792,1795,1796,1767,1799,883],{},"Penalty for a cross-site request (",[858,1793,1794],{},"Sec-Fetch-Site: cross-site",") without a ",[858,1797,1798],{},"Referer",[858,1800,1705],{},[1576,1802,1804],{"name":1803,"type":1578},"inconsistentSecFetchMode",[835,1805,1711,1806,1809,1810,998,1813,1691,1816,883],{},[858,1807,1808],{},"Sec-Fetch-Mode"," is not ",[858,1811,1812],{},"same-origin",[858,1814,1815],{},"navigate",[858,1817,1643],{},[1576,1819,1821],{"name":1820,"type":1578},"hostMismatchWeight",[835,1822,1711,1823,1825,1826,1691,1829,883],{},[858,1824,1005],{}," does not match ",[858,1827,1828],{},"req.hostname",[858,1830,933],{},[850,1832,1834],{"id":1833},"pathtraveler",[858,1835,1836],{},"pathTraveler",[1573,1838,1839,1848,1859,1868,1879],{},[1576,1840,1842],{"name":1841,"type":1578},"maxIterations",[835,1843,1844,1845,883],{},"Maximum number of URL decode passes to apply when looking for encoded traversal sequences. Default: ",[858,1846,1847],{},"3",[1576,1849,1851],{"name":1850,"type":1578},"maxPathLength",[835,1852,1853,1854,1691,1856,883],{},"Maximum accepted path length in characters. Paths longer than this trigger ",[858,1855,1046],{},[858,1857,1858],{},"1500",[1576,1860,1861],{"name":1046,"type":1578},[835,1862,1863,1864,1691,1866,883],{},"Penalty for a request path that exceeds ",[858,1865,1850],{},[858,1867,1584],{},[1576,1869,1871],{"name":1870,"type":1578},"longDecoding",[835,1872,1873,1874,1876,1877,883],{},"Penalty for a path that requires more than ",[858,1875,1841],{}," decode passes to resolve (heavily encoded traversal attempts). Default: ",[858,1878,1584],{},[1576,1880,1881],{"name":1050,"type":1578},[835,1882,1711,1883,1885,1886,883],{},[858,1884,1038],{}," sequences are found in the decoded path. Default: ",[858,1887,1600],{},[842,1889],{},[845,1891,1893],{"id":1892},"reason-codes","Reason Codes",[1895,1896,1897,1910],"table",{},[1898,1899,1900],"thead",{},[1901,1902,1903,1907],"tr",{},[1904,1905,1906],"th",{},"Code",[1904,1908,1909],{},"Trigger",[1911,1912,1913,1923,1933,1943,1953],"tbody",{},[1901,1914,1915,1920],{},[1916,1917,1918],"td",{},[858,1919,878],{},[1916,1921,1922],{},"User-Agent contains headless automation keywords.",[1901,1924,1925,1930],{},[1916,1926,1927],{},[858,1928,1929],{},"SHORT_USER_AGENT",[1916,1931,1932],{},"User-Agent is fewer than 10 characters.",[1901,1934,1935,1940],{},[1916,1936,1937],{},[858,1938,1939],{},"TLS_CHECK_FAILED",[1916,1941,1942],{},"TLS fingerprint does not match the declared browser identity.",[1901,1944,1945,1950],{},[1916,1946,1947],{},[858,1948,1949],{},"HEADER_SCORE_TOO_HIGH",[1916,1951,1952],{},"Header analysis accumulated a non-zero score from must-have, engine-specific, or weird header checks.",[1901,1954,1955,1960],{},[1916,1956,1957],{},[858,1958,1959],{},"PATH_TRAVELER_FOUND",[1916,1961,1962],{},"Path traversal sequences, excessive length, or over-encoded paths detected.",[1964,1965,1966],"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 pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}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":1063,"searchDepth":1085,"depth":1085,"links":1968},[1969,1976,1981],{"id":847,"depth":1085,"text":848,"children":1970},[1971,1972,1973,1974,1975],{"id":852,"depth":1139,"text":853},{"id":886,"depth":1139,"text":887},{"id":897,"depth":1139,"text":898},{"id":915,"depth":1139,"text":916},{"id":1016,"depth":1139,"text":1017},{"id":1055,"depth":1085,"text":188,"children":1977},[1978,1979,1980],{"id":1568,"depth":1139,"text":1571},{"id":1621,"depth":1139,"text":922},{"id":1833,"depth":1139,"text":1836},{"id":1892,"depth":1085,"text":1893},"Detects headless browsers, short User-Agents, TLS and protocol inconsistencies, anomalous HTTP headers, and path traversal attempts.","md","i-lucide-scan-search",{},null,"---\ntitle: UA & Header Analysis\ndescription: Detects headless browsers, short User-Agents, TLS and protocol inconsistencies, anomalous HTTP headers, and path traversal attempts.\nicon: i-lucide-scan-search\n---\n\nThe UA and header analysis checker is one of the most comprehensive checks in the pipeline. It evaluates multiple orthogonal signals about the HTTP request itself: the User-Agent string for headless browser keywords, the request TLS fingerprint for browser identity mismatch, the full set of HTTP headers for bot-characteristic patterns, and the request path for traversal attempts.\n\nThis checker runs in the heavy phase.\n\n---\n\n## How It Works\n\n### Headless Browser Detection\n\nThe checker scans the User-Agent string for keywords associated with headless browser automation: `headless`, `puppeteer`, `selenium`, `playwright`, and `phantomjs`. Any match fires `HEADLESS_BROWSER_DETECTED` and applies `headlessBrowser`.\n\n### Short User-Agent\n\nA User-Agent shorter than 10 characters is a strong signal of a script or misconfigured tool. Real browser User-Agents are always significantly longer. This check applies `shortUserAgent` when the condition is met.\n\n### TLS & Protocol Checks\n\nThe checker reads the `x-client-cipher`, `x-client-tls-version`, and HTTP version from the request and validates them against a whitelist of cipher suites and protocol versions that real browsers use. When the cipher or protocol does not match (for example, when a tool uses TLS 1.0 or a non-browser cipher), `tlsCheckFailed` fires. These headers must be forwarded by an upstream proxy such as Caddy or Nginx; they are not set by Node.js itself.\n\n### Header Analysis\n\nThe checker runs a full header scoring pass that evaluates three groups of signals. All weights for this group come from the top-level `headerOptions` configuration object.\n\n**Must-have headers**: HTTP\u002F1.0 requests score an immediate `40` points. Real browsers always send `User-Agent`, `Accept`, `Accept-Encoding`, `Accept-Language`, `Host`, `Upgrade-Insecure-Requests`, and `Sec-Fetch-*` headers. Missing any of these applies `weightPerMustHeader` per missing header.\n\n**Engine-specific headers**: The checker resolves the browser engine from the User-Agent. Blink-based browsers (Chrome, Edge, Opera) send `sec-ch-ua-*` client hints and never send a `TE` header. Gecko browsers (Firefox) send a `TE` header and never send client hints. WebKit browsers follow a similar pattern. Violations of these engine-specific expectations apply the corresponding `headerOptions` penalty.\n\n**Weird headers**: Several header patterns are characteristic of automation tools or misconfigured clients: an `Accept: *\u002F*` wildcard (omitting the structured accept list real browsers send), an `X-Requested-With` header on a GET request (an AJAX marker that real browsers do not send on normal navigation), `Postman-Token` or `Insomnia` headers, a mismatched `X-Forwarded-Host`, aggressive cache-control on GET requests, a missing referer on cross-site requests, a null or mismatched `Origin`, and an unexpected `sec-fetch-mode`.\n\n### Path Traversal Detection\n\nThe checker inspects `req.path` for directory traversal sequences. It catches encoded variants (`%2F`, `%2E%2E`), decodes them iteratively up to `pathTraveler.maxIterations` times, and checks for `..\u002F` patterns. Paths exceeding `pathTraveler.maxPathLength` characters apply the `pathLengthToLong` penalty. Detected traversal sequences apply `traversalDetected`.\n\n---\n\n## Configuration\n\n```ts [server.ts]\nawait defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableUaAndHeaderChecks: {\n      enable: true,\n      penalties: {\n        headlessBrowser: 100,\n        shortUserAgent: 80,\n        tlsCheckFailed: 60,\n        badUaChecker: true,  \u002F\u002F enables the knownBadUserAgents sub-checker\n      },\n    },\n  },\n  \u002F\u002F Header scoring weights (all optional, defaults shown)\n  headerOptions: {\n    weightPerMustHeader: 20,\n    missingBrowserEngine: 30,\n    postManOrInsomiaHeaders: 50,\n    AJAXHeaderExists: 30,\n    connectionHeaderIsClose: 20,\n    originHeaderIsNULL: 10,\n    originHeaderMismatch: 30,\n    omittedAcceptHeader: 30,\n    clientHintsMissingForBlink: 30,\n    teHeaderUnexpectedForBlink: 10,\n    clientHintsUnexpectedForGecko: 30,\n    teHeaderMissingForGecko: 20,\n    aggressiveCacheControlOnGet: 15,\n    crossSiteRequestMissingReferer: 10,\n    inconsistentSecFetchMode: 20,\n    hostMismatchWeight: 40,\n  },\n  \u002F\u002F Path traversal weights (all optional, defaults shown)\n  pathTraveler: {\n    maxIterations: 3,\n    maxPathLength: 1500,\n    pathLengthToLong: 100,\n    longDecoding: 100,\n    traversalDetected: 60,\n  },\n})\n```\n\n### `checkers.enableUaAndHeaderChecks.penalties`\n\n::field-group\n::field{name=\"headlessBrowser\" type=\"number\"}\nPenalty when the User-Agent contains headless browser keywords. Default: `100`.\n::\n\n::field{name=\"shortUserAgent\" type=\"number\"}\nPenalty when the User-Agent is fewer than 10 characters. Default: `80`.\n::\n\n::field{name=\"tlsCheckFailed\" type=\"number\"}\nPenalty when the TLS fingerprint does not match the declared browser. Default: `60`.\n::\n\n::field{name=\"badUaChecker\" type=\"boolean\"}\nWhen `true`, enables the [Known Bad User-Agents](.\u002Fknown-bad-ua) sub-checker, which runs the LMDB pattern database against the User-Agent. Default: `true`.\n::\n::\n\n### `headerOptions`\n\nThese weights are configured at the top level of `defineConfiguration`, not inside `checkers`.\n\n::field-group\n::field{name=\"weightPerMustHeader\" type=\"number\"}\nPenalty per missing required browser header (User-Agent, Accept, Accept-Language, Host, Sec-Fetch-*, etc.). Default: `20`.\n::\n\n::field{name=\"missingBrowserEngine\" type=\"number\"}\nPenalty when the browser engine cannot be determined from the User-Agent. Default: `30`.\n::\n\n::field{name=\"postManOrInsomiaHeaders\" type=\"number\"}\nPenalty for requests carrying `Postman-Token` or `Insomnia` headers. Default: `50`.\n::\n\n::field{name=\"AJAXHeaderExists\" type=\"number\"}\nPenalty for a GET request that includes `X-Requested-With` (AJAX marker). Default: `30`.\n::\n\n::field{name=\"connectionHeaderIsClose\" type=\"number\"}\nPenalty for an HTTP\u002F1.1 request with `Connection: close` instead of `keep-alive`. Default: `20`.\n::\n\n::field{name=\"originHeaderIsNULL\" type=\"number\"}\nPenalty when the `Origin` header is null on a non-navigational same-origin request. Default: `10`.\n::\n\n::field{name=\"originHeaderMismatch\" type=\"number\"}\nPenalty when `Origin` does not match the server's protocol and hostname. Default: `30`.\n::\n\n::field{name=\"omittedAcceptHeader\" type=\"number\"}\nPenalty when `Accept: *\u002F*` is sent instead of a proper browser accept list. Default: `30`.\n::\n\n::field{name=\"clientHintsMissingForBlink\" type=\"number\"}\nPenalty when a Blink-engine browser does not send `sec-ch-ua-*` headers. Default: `30`.\n::\n\n::field{name=\"teHeaderUnexpectedForBlink\" type=\"number\"}\nPenalty when a Blink-engine browser sends the `TE` header (a Gecko-only header). Default: `10`.\n::\n\n::field{name=\"clientHintsUnexpectedForGecko\" type=\"number\"}\nPenalty when a Gecko or WebKit browser sends `sec-ch-ua-*` client hints. Default: `30`.\n::\n\n::field{name=\"teHeaderMissingForGecko\" type=\"number\"}\nPenalty when a Gecko browser does not send the `TE` header. Default: `20`.\n::\n\n::field{name=\"aggressiveCacheControlOnGet\" type=\"number\"}\nPenalty for a GET request with both `Cache-Control: no-cache` and `Pragma: no-cache`. Default: `15`.\n::\n\n::field{name=\"crossSiteRequestMissingReferer\" type=\"number\"}\nPenalty for a cross-site request (`Sec-Fetch-Site: cross-site`) without a `Referer` header. Default: `10`.\n::\n\n::field{name=\"inconsistentSecFetchMode\" type=\"number\"}\nPenalty when `Sec-Fetch-Mode` is not `same-origin` or `navigate`. Default: `20`.\n::\n\n::field{name=\"hostMismatchWeight\" type=\"number\"}\nPenalty when `X-Forwarded-Host` does not match `req.hostname`. Default: `40`.\n::\n::\n\n### `pathTraveler`\n\n::field-group\n::field{name=\"maxIterations\" type=\"number\"}\nMaximum number of URL decode passes to apply when looking for encoded traversal sequences. Default: `3`.\n::\n\n::field{name=\"maxPathLength\" type=\"number\"}\nMaximum accepted path length in characters. Paths longer than this trigger `pathLengthToLong`. Default: `1500`.\n::\n\n::field{name=\"pathLengthToLong\" type=\"number\"}\nPenalty for a request path that exceeds `maxPathLength`. Default: `100`.\n::\n\n::field{name=\"longDecoding\" type=\"number\"}\nPenalty for a path that requires more than `maxIterations` decode passes to resolve (heavily encoded traversal attempts). Default: `100`.\n::\n\n::field{name=\"traversalDetected\" type=\"number\"}\nPenalty when `..\u002F` sequences are found in the decoded path. Default: `60`.\n::\n::\n\n---\n\n## Reason Codes\n\n| Code | Trigger |\n| --- | --- |\n| `HEADLESS_BROWSER_DETECTED` | User-Agent contains headless automation keywords. |\n| `SHORT_USER_AGENT` | User-Agent is fewer than 10 characters. |\n| `TLS_CHECK_FAILED` | TLS fingerprint does not match the declared browser identity. |\n| `HEADER_SCORE_TOO_HIGH` | Header analysis accumulated a non-zero score from must-have, engine-specific, or weird header checks. |\n| `PATH_TRAVELER_FOUND` | Path traversal sequences, excessive length, or over-encoded paths detected. |\n",{"title":169,"description":1982},"9Uf9MG_a4KJLBHKo5Ix0cvWWIoEnLP-LIcGgvgrQMb0",[1991,1992],{"title":165,"path":166,"stem":167,"children":-1},{"title":173,"path":174,"stem":175,"children":-1},{"id":830,"title":169,"body":1994,"description":1982,"extension":1983,"icon":1984,"meta":2805,"module":1986,"navigation":8,"path":170,"rawbody":1987,"seo":2806,"stem":171,"__hash__":1989},{"type":832,"value":1995,"toc":2790},[1996,1998,2000,2002,2004,2006,2022,2024,2028,2030,2038,2040,2044,2066,2078,2096,2098,2116,2118,2120,2504,2508,2538,2542,2548,2688,2692,2732,2734,2736,2788],[835,1997,837],{},[835,1999,840],{},[842,2001],{},[845,2003,848],{"id":847},[850,2005,853],{"id":852},[835,2007,856,2008,861,2010,861,2012,861,2014,871,2016,875,2018,879,2020,883],{},[858,2009,860],{},[858,2011,864],{},[858,2013,867],{},[858,2015,870],{},[858,2017,874],{},[858,2019,878],{},[858,2021,882],{},[850,2023,887],{"id":886},[835,2025,890,2026,894],{},[858,2027,893],{},[850,2029,898],{"id":897},[835,2031,901,2032,861,2034,908,2036,912],{},[858,2033,904],{},[858,2035,907],{},[858,2037,911],{},[850,2039,916],{"id":915},[835,2041,919,2042,923],{},[858,2043,922],{},[835,2045,2046,930,2048,934,2050,861,2052,861,2054,861,2056,861,2058,861,2060,871,2062,956,2064,960],{},[927,2047,929],{},[858,2049,933],{},[858,2051,937],{},[858,2053,940],{},[858,2055,943],{},[858,2057,946],{},[858,2059,949],{},[858,2061,952],{},[858,2063,955],{},[858,2065,959],{},[835,2067,2068,966,2070,970,2072,974,2074,977,2076,980],{},[927,2069,965],{},[858,2071,969],{},[858,2073,973],{},[858,2075,973],{},[858,2077,922],{},[835,2079,2080,986,2082,990,2084,994,2086,998,2088,1002,2090,1006,2092,1010,2094,883],{},[927,2081,985],{},[858,2083,989],{},[858,2085,993],{},[858,2087,997],{},[858,2089,1001],{},[858,2091,1005],{},[858,2093,1009],{},[858,2095,1013],{},[850,2097,1017],{"id":1016},[835,2099,1020,2100,1024,2102,861,2104,1031,2106,1035,2108,1039,2110,1043,2112,1047,2114,883],{},[858,2101,1023],{},[858,2103,1027],{},[858,2105,1030],{},[858,2107,1034],{},[858,2109,1038],{},[858,2111,1042],{},[858,2113,1046],{},[858,2115,1050],{},[842,2117],{},[845,2119,188],{"id":1055},[1057,2121,2122],{"className":1059,"code":1060,"filename":1061,"language":1062,"meta":1063,"style":1063},[858,2123,2124,2132,2170,2178,2186,2196,2204,2214,2224,2234,2246,2250,2254,2258,2262,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2410,2420,2430,2434,2438,2446,2456,2466,2476,2486,2496,2500],{"__ignoreMap":1063},[1067,2125,2126,2128,2130],{"class":1069,"line":1070},[1067,2127,1074],{"class":1073},[1067,2129,1078],{"class":1077},[1067,2131,1082],{"class":1081},[1067,2133,2134,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168],{"class":1069,"line":1085},[1067,2135,1089],{"class":1088},[1067,2137,1093],{"class":1092},[1067,2139,1096],{"class":1081},[1067,2141,1099],{"class":1088},[1067,2143,1093],{"class":1092},[1067,2145,1096],{"class":1081},[1067,2147,1106],{"class":1088},[1067,2149,1093],{"class":1092},[1067,2151,1112],{"class":1111},[1067,2153,1116],{"class":1115},[1067,2155,1119],{"class":1111},[1067,2157,861],{"class":1081},[1067,2159,1124],{"class":1088},[1067,2161,1093],{"class":1092},[1067,2163,1112],{"class":1111},[1067,2165,1131],{"class":1115},[1067,2167,1119],{"class":1111},[1067,2169,1136],{"class":1081},[1067,2171,2172,2174,2176],{"class":1069,"line":1139},[1067,2173,1142],{"class":1088},[1067,2175,1093],{"class":1092},[1067,2177,1147],{"class":1081},[1067,2179,2180,2182,2184],{"class":1069,"line":1150},[1067,2181,1153],{"class":1088},[1067,2183,1093],{"class":1092},[1067,2185,1147],{"class":1081},[1067,2187,2188,2190,2192,2194],{"class":1069,"line":1160},[1067,2189,1163],{"class":1088},[1067,2191,1093],{"class":1092},[1067,2193,1169],{"class":1168},[1067,2195,1172],{"class":1081},[1067,2197,2198,2200,2202],{"class":1069,"line":1175},[1067,2199,1178],{"class":1088},[1067,2201,1093],{"class":1092},[1067,2203,1147],{"class":1081},[1067,2205,2206,2208,2210,2212],{"class":1069,"line":1185},[1067,2207,1188],{"class":1088},[1067,2209,1093],{"class":1092},[1067,2211,1194],{"class":1193},[1067,2213,1172],{"class":1081},[1067,2215,2216,2218,2220,2222],{"class":1069,"line":1199},[1067,2217,1202],{"class":1088},[1067,2219,1093],{"class":1092},[1067,2221,1207],{"class":1193},[1067,2223,1172],{"class":1081},[1067,2225,2226,2228,2230,2232],{"class":1069,"line":1212},[1067,2227,1215],{"class":1088},[1067,2229,1093],{"class":1092},[1067,2231,1220],{"class":1193},[1067,2233,1172],{"class":1081},[1067,2235,2236,2238,2240,2242,2244],{"class":1069,"line":1225},[1067,2237,1228],{"class":1088},[1067,2239,1093],{"class":1092},[1067,2241,1169],{"class":1168},[1067,2243,1235],{"class":1081},[1067,2245,1239],{"class":1238},[1067,2247,2248],{"class":1069,"line":1242},[1067,2249,1245],{"class":1081},[1067,2251,2252],{"class":1069,"line":1248},[1067,2253,1251],{"class":1081},[1067,2255,2256],{"class":1069,"line":1254},[1067,2257,1257],{"class":1081},[1067,2259,2260],{"class":1069,"line":1260},[1067,2261,1263],{"class":1238},[1067,2263,2264,2266,2268],{"class":1069,"line":1266},[1067,2265,1269],{"class":1088},[1067,2267,1093],{"class":1092},[1067,2269,1147],{"class":1081},[1067,2271,2272,2274,2276,2278],{"class":1069,"line":1276},[1067,2273,1279],{"class":1088},[1067,2275,1093],{"class":1092},[1067,2277,1284],{"class":1193},[1067,2279,1172],{"class":1081},[1067,2281,2282,2284,2286,2288],{"class":1069,"line":1289},[1067,2283,1292],{"class":1088},[1067,2285,1093],{"class":1092},[1067,2287,1297],{"class":1193},[1067,2289,1172],{"class":1081},[1067,2291,2292,2294,2296,2298],{"class":1069,"line":1302},[1067,2293,1305],{"class":1088},[1067,2295,1093],{"class":1092},[1067,2297,1310],{"class":1193},[1067,2299,1172],{"class":1081},[1067,2301,2302,2304,2306,2308],{"class":1069,"line":1315},[1067,2303,1318],{"class":1088},[1067,2305,1093],{"class":1092},[1067,2307,1297],{"class":1193},[1067,2309,1172],{"class":1081},[1067,2311,2312,2314,2316,2318],{"class":1069,"line":1327},[1067,2313,1330],{"class":1088},[1067,2315,1093],{"class":1092},[1067,2317,1284],{"class":1193},[1067,2319,1172],{"class":1081},[1067,2321,2322,2324,2326,2328],{"class":1069,"line":1339},[1067,2323,1342],{"class":1088},[1067,2325,1093],{"class":1092},[1067,2327,1347],{"class":1193},[1067,2329,1172],{"class":1081},[1067,2331,2332,2334,2336,2338],{"class":1069,"line":1352},[1067,2333,1355],{"class":1088},[1067,2335,1093],{"class":1092},[1067,2337,1297],{"class":1193},[1067,2339,1172],{"class":1081},[1067,2341,2342,2344,2346,2348],{"class":1069,"line":1364},[1067,2343,1367],{"class":1088},[1067,2345,1093],{"class":1092},[1067,2347,1297],{"class":1193},[1067,2349,1172],{"class":1081},[1067,2351,2352,2354,2356,2358],{"class":1069,"line":1376},[1067,2353,1379],{"class":1088},[1067,2355,1093],{"class":1092},[1067,2357,1297],{"class":1193},[1067,2359,1172],{"class":1081},[1067,2361,2362,2364,2366,2368],{"class":1069,"line":1388},[1067,2363,1391],{"class":1088},[1067,2365,1093],{"class":1092},[1067,2367,1347],{"class":1193},[1067,2369,1172],{"class":1081},[1067,2371,2372,2374,2376,2378],{"class":1069,"line":1400},[1067,2373,1403],{"class":1088},[1067,2375,1093],{"class":1092},[1067,2377,1297],{"class":1193},[1067,2379,1172],{"class":1081},[1067,2381,2382,2384,2386,2388],{"class":1069,"line":1412},[1067,2383,1415],{"class":1088},[1067,2385,1093],{"class":1092},[1067,2387,1284],{"class":1193},[1067,2389,1172],{"class":1081},[1067,2391,2392,2394,2396,2398],{"class":1069,"line":1424},[1067,2393,1427],{"class":1088},[1067,2395,1093],{"class":1092},[1067,2397,1432],{"class":1193},[1067,2399,1172],{"class":1081},[1067,2401,2402,2404,2406,2408],{"class":1069,"line":1437},[1067,2403,1440],{"class":1088},[1067,2405,1093],{"class":1092},[1067,2407,1347],{"class":1193},[1067,2409,1172],{"class":1081},[1067,2411,2412,2414,2416,2418],{"class":1069,"line":1449},[1067,2413,1452],{"class":1088},[1067,2415,1093],{"class":1092},[1067,2417,1284],{"class":1193},[1067,2419,1172],{"class":1081},[1067,2421,2422,2424,2426,2428],{"class":1069,"line":1461},[1067,2423,1464],{"class":1088},[1067,2425,1093],{"class":1092},[1067,2427,1469],{"class":1193},[1067,2429,1172],{"class":1081},[1067,2431,2432],{"class":1069,"line":1474},[1067,2433,1257],{"class":1081},[1067,2435,2436],{"class":1069,"line":1479},[1067,2437,1482],{"class":1238},[1067,2439,2440,2442,2444],{"class":1069,"line":1485},[1067,2441,1488],{"class":1088},[1067,2443,1093],{"class":1092},[1067,2445,1147],{"class":1081},[1067,2447,2448,2450,2452,2454],{"class":1069,"line":1495},[1067,2449,1498],{"class":1088},[1067,2451,1093],{"class":1092},[1067,2453,1503],{"class":1193},[1067,2455,1172],{"class":1081},[1067,2457,2458,2460,2462,2464],{"class":1069,"line":1508},[1067,2459,1511],{"class":1088},[1067,2461,1093],{"class":1092},[1067,2463,1516],{"class":1193},[1067,2465,1172],{"class":1081},[1067,2467,2468,2470,2472,2474],{"class":1069,"line":1521},[1067,2469,1524],{"class":1088},[1067,2471,1093],{"class":1092},[1067,2473,1194],{"class":1193},[1067,2475,1172],{"class":1081},[1067,2477,2478,2480,2482,2484],{"class":1069,"line":1533},[1067,2479,1536],{"class":1088},[1067,2481,1093],{"class":1092},[1067,2483,1194],{"class":1193},[1067,2485,1172],{"class":1081},[1067,2487,2488,2490,2492,2494],{"class":1069,"line":1545},[1067,2489,1548],{"class":1088},[1067,2491,1093],{"class":1092},[1067,2493,1220],{"class":1193},[1067,2495,1172],{"class":1081},[1067,2497,2498],{"class":1069,"line":1557},[1067,2499,1257],{"class":1081},[1067,2501,2502],{"class":1069,"line":1562},[1067,2503,1565],{"class":1081},[850,2505,2506],{"id":1568},[858,2507,1571],{},[1573,2509,2510,2516,2522,2528],{},[1576,2511,2512],{"name":882,"type":1578},[835,2513,1581,2514,883],{},[858,2515,1584],{},[1576,2517,2518],{"name":893,"type":1578},[835,2519,1589,2520,883],{},[858,2521,1592],{},[1576,2523,2524],{"name":911,"type":1578},[835,2525,1597,2526,883],{},[858,2527,1600],{},[1576,2529,2530],{"name":1603,"type":1604},[835,2531,1607,2532,1611,2534,1616,2536,883],{},[858,2533,1610],{},[1613,2535,177],{"href":1615},[858,2537,1610],{},[850,2539,2540],{"id":1621},[858,2541,922],{},[835,2543,1626,2544,1630,2546,883],{},[858,2545,1629],{},[858,2547,1633],{},[1573,2549,2550,2556,2562,2572,2580,2590,2598,2606,2614,2622,2630,2638,2646,2656,2666,2678],{},[1576,2551,2552],{"name":959,"type":1578},[835,2553,1640,2554,883],{},[858,2555,1643],{},[1576,2557,2558],{"name":1646,"type":1578},[835,2559,1649,2560,883],{},[858,2561,1652],{},[1576,2563,2564],{"name":1655,"type":1578},[835,2565,1658,2566,998,2568,1663,2570,883],{},[858,2567,997],{},[858,2569,1001],{},[858,2571,1666],{},[1576,2573,2574],{"name":1669,"type":1578},[835,2575,1672,2576,1675,2578,883],{},[858,2577,993],{},[858,2579,1652],{},[1576,2581,2582],{"name":1680,"type":1578},[835,2583,1683,2584,1687,2586,1691,2588,883],{},[858,2585,1686],{},[858,2587,1690],{},[858,2589,1643],{},[1576,2591,2592],{"name":1696,"type":1578},[835,2593,1699,2594,1702,2596,883],{},[858,2595,1009],{},[858,2597,1705],{},[1576,2599,2600],{"name":1708,"type":1578},[835,2601,1711,2602,1714,2604,883],{},[858,2603,1009],{},[858,2605,1652],{},[1576,2607,2608],{"name":1719,"type":1578},[835,2609,1711,2610,1724,2612,883],{},[858,2611,989],{},[858,2613,1652],{},[1576,2615,2616],{"name":1729,"type":1578},[835,2617,1732,2618,1663,2620,883],{},[858,2619,969],{},[858,2621,1652],{},[1576,2623,2624],{"name":1739,"type":1578},[835,2625,1742,2626,1745,2628,883],{},[858,2627,973],{},[858,2629,1705],{},[1576,2631,2632],{"name":1750,"type":1578},[835,2633,1753,2634,1756,2636,883],{},[858,2635,969],{},[858,2637,1652],{},[1576,2639,2640],{"name":1761,"type":1578},[835,2641,1764,2642,1767,2644,883],{},[858,2643,973],{},[858,2645,1643],{},[1576,2647,2648],{"name":1772,"type":1578},[835,2649,1775,2650,1779,2652,1691,2654,883],{},[858,2651,1778],{},[858,2653,1782],{},[858,2655,1785],{},[1576,2657,2658],{"name":1788,"type":1578},[835,2659,1791,2660,1795,2662,1767,2664,883],{},[858,2661,1794],{},[858,2663,1798],{},[858,2665,1705],{},[1576,2667,2668],{"name":1803,"type":1578},[835,2669,1711,2670,1809,2672,998,2674,1691,2676,883],{},[858,2671,1808],{},[858,2673,1812],{},[858,2675,1815],{},[858,2677,1643],{},[1576,2679,2680],{"name":1820,"type":1578},[835,2681,1711,2682,1825,2684,1691,2686,883],{},[858,2683,1005],{},[858,2685,1828],{},[858,2687,933],{},[850,2689,2690],{"id":1833},[858,2691,1836],{},[1573,2693,2694,2700,2708,2716,2724],{},[1576,2695,2696],{"name":1841,"type":1578},[835,2697,1844,2698,883],{},[858,2699,1847],{},[1576,2701,2702],{"name":1850,"type":1578},[835,2703,1853,2704,1691,2706,883],{},[858,2705,1046],{},[858,2707,1858],{},[1576,2709,2710],{"name":1046,"type":1578},[835,2711,1863,2712,1691,2714,883],{},[858,2713,1850],{},[858,2715,1584],{},[1576,2717,2718],{"name":1870,"type":1578},[835,2719,1873,2720,1876,2722,883],{},[858,2721,1841],{},[858,2723,1584],{},[1576,2725,2726],{"name":1050,"type":1578},[835,2727,1711,2728,1885,2730,883],{},[858,2729,1038],{},[858,2731,1600],{},[842,2733],{},[845,2735,1893],{"id":1892},[1895,2737,2738,2746],{},[1898,2739,2740],{},[1901,2741,2742,2744],{},[1904,2743,1906],{},[1904,2745,1909],{},[1911,2747,2748,2756,2764,2772,2780],{},[1901,2749,2750,2754],{},[1916,2751,2752],{},[858,2753,878],{},[1916,2755,1922],{},[1901,2757,2758,2762],{},[1916,2759,2760],{},[858,2761,1929],{},[1916,2763,1932],{},[1901,2765,2766,2770],{},[1916,2767,2768],{},[858,2769,1939],{},[1916,2771,1942],{},[1901,2773,2774,2778],{},[1916,2775,2776],{},[858,2777,1949],{},[1916,2779,1952],{},[1901,2781,2782,2786],{},[1916,2783,2784],{},[858,2785,1959],{},[1916,2787,1962],{},[1964,2789,1966],{},{"title":1063,"searchDepth":1085,"depth":1085,"links":2791},[2792,2799,2804],{"id":847,"depth":1085,"text":848,"children":2793},[2794,2795,2796,2797,2798],{"id":852,"depth":1139,"text":853},{"id":886,"depth":1139,"text":887},{"id":897,"depth":1139,"text":898},{"id":915,"depth":1139,"text":916},{"id":1016,"depth":1139,"text":1017},{"id":1055,"depth":1085,"text":188,"children":2800},[2801,2802,2803],{"id":1568,"depth":1139,"text":1571},{"id":1621,"depth":1139,"text":922},{"id":1833,"depth":1139,"text":1836},{"id":1892,"depth":1085,"text":1893},{},{"title":169,"description":1982},1780436277743]