[{"data":1,"prerenderedAt":2969},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fcli_page":829,"\u002Fdocs\u002Fbot-detection\u002Fcli_surround":2010,"\u002Fdocs\u002Fbot-detection\u002Fcli":2013},{"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":78,"body":831,"description":2002,"extension":2003,"icon":2004,"meta":2005,"module":2006,"navigation":8,"path":79,"rawbody":2007,"seo":2008,"stem":80,"__hash__":2009},"docs\u002Fdocs\u002Fbot-detection\u002F01.cli.md",{"type":832,"value":833,"toc":1991},"minimark",[834,850,955,961,977,984,1013,1072,1079,1176,1185,1188,1193,1202,1261,1267,1313,1315,1320,1323,1357,1367,1372,1378,1579,1582,1717,1729,1737,1739,1744,1757,1760,1765,1865,1867,1969,1980,1987],[835,836,837,841,842,845,846,849],"p",{},[838,839,840],"code",{},"@riavzon\u002Fbot-detector"," ships a CLI with four subcommands. You can run them with ",[838,843,844],{},"npx"," without a global install, or directly as ",[838,847,848],{},"bot-detector"," after installing the package.",[851,852,853,889,912,934],"code-group",{},[854,855,861],"pre",{"className":856,"code":857,"filename":858,"language":859,"meta":860,"style":860},"language-bash shiki shiki-themes light-plus light-plus dracula","npx @riavzon\u002Fbot-detector \u003Ccommand>\n","npm","bash","",[838,862,863],{"__ignoreMap":860},[864,865,868,871,875,879,882,886],"span",{"class":866,"line":867},"line",1,[864,869,844],{"class":870},"sHOzp",[864,872,874],{"class":873},"sFB1V"," @riavzon\u002Fbot-detector",[864,876,878],{"class":877},"saOXh"," \u003C",[864,880,881],{"class":873},"comman",[864,883,885],{"class":884},"sDd4n","d",[864,887,888],{"class":877},">\n",[854,890,893],{"className":856,"code":891,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector \u003Ccommand>\n","pnpm",[838,894,895],{"__ignoreMap":860},[864,896,897,899,902,904,906,908,910],{"class":866,"line":867},[864,898,892],{"class":870},[864,900,901],{"class":873}," dlx",[864,903,874],{"class":873},[864,905,878],{"class":877},[864,907,881],{"class":873},[864,909,885],{"class":884},[864,911,888],{"class":877},[854,913,916],{"className":856,"code":914,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector \u003Ccommand>\n","yarn",[838,917,918],{"__ignoreMap":860},[864,919,920,922,924,926,928,930,932],{"class":866,"line":867},[864,921,915],{"class":870},[864,923,901],{"class":873},[864,925,874],{"class":873},[864,927,878],{"class":877},[864,929,881],{"class":873},[864,931,885],{"class":884},[864,933,888],{"class":877},[854,935,938],{"className":856,"code":936,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector \u003Ccommand>\n","bun",[838,939,940],{"__ignoreMap":860},[864,941,942,945,947,949,951,953],{"class":866,"line":867},[864,943,944],{"class":870},"bunx",[864,946,874],{"class":873},[864,948,878],{"class":877},[864,950,881],{"class":873},[864,952,885],{"class":884},[864,954,888],{"class":877},[956,957,959],"h2",{"id":958},"init",[838,960,958],{},[835,962,963,964,966,967,976],{},"Runs the installation wizard. ",[838,965,958],{}," verifies that ",[968,969,973],"a",{"href":970,"rel":971},"https:\u002F\u002Fgithub.com\u002Fipinfo\u002Fmmdbctl",[972],"nofollow",[838,974,975],{},"mmdbctl"," is installed and installs it automatically if it is not found. It then prompts for a BGP.tools contact string, which is required to download BGP and ASN data from their API.",[835,978,979,980,983],{},"Once dependencies are confirmed, the command compiles all data sources in parallel and writes them to ",[838,981,982],{},"_data-sources\u002F"," inside the package directory:",[985,986,987,991,994,997,1000,1003,1006],"ul",{},[988,989,990],"li",{},"BGP and ASN data",[988,992,993],{},"City and geography databases",[988,995,996],{},"Tor node lists",[988,998,999],{},"Proxy and anonymizer lists",[988,1001,1002],{},"FireHOL threat levels 1-4 and the anonymous feed",[988,1004,1005],{},"Verified crawler IP ranges (Googlebot, Bingbot, Apple, Meta, and others)",[988,1007,1008,1009,1012],{},"User-Agent pattern database (",[838,1010,1011],{},"useragent.mdb",")",[851,1014,1015,1029,1044,1059],{},[854,1016,1018],{"className":856,"code":1017,"filename":858,"language":859,"meta":860,"style":860},"npx @riavzon\u002Fbot-detector init\n",[838,1019,1020],{"__ignoreMap":860},[864,1021,1022,1024,1026],{"class":866,"line":867},[864,1023,844],{"class":870},[864,1025,874],{"class":873},[864,1027,1028],{"class":873}," init\n",[854,1030,1032],{"className":856,"code":1031,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector init\n",[838,1033,1034],{"__ignoreMap":860},[864,1035,1036,1038,1040,1042],{"class":866,"line":867},[864,1037,892],{"class":870},[864,1039,901],{"class":873},[864,1041,874],{"class":873},[864,1043,1028],{"class":873},[854,1045,1047],{"className":856,"code":1046,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector init\n",[838,1048,1049],{"__ignoreMap":860},[864,1050,1051,1053,1055,1057],{"class":866,"line":867},[864,1052,915],{"class":870},[864,1054,901],{"class":873},[864,1056,874],{"class":873},[864,1058,1028],{"class":873},[854,1060,1062],{"className":856,"code":1061,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector init\n",[838,1063,1064],{"__ignoreMap":860},[864,1065,1066,1068,1070],{"class":866,"line":867},[864,1067,944],{"class":870},[864,1069,874],{"class":873},[864,1071,1028],{"class":873},[835,1073,1074,1075,1078],{},"To skip the interactive prompt in CI or automated environments, pass your contact string directly with the ",[838,1076,1077],{},"--contact"," flag:",[851,1080,1081,1109,1132,1155],{},[854,1082,1084],{"className":856,"code":1083,"filename":858,"language":859,"meta":860,"style":860},"npx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n",[838,1085,1086],{"__ignoreMap":860},[864,1087,1088,1090,1092,1095,1099,1103,1106],{"class":866,"line":867},[864,1089,844],{"class":870},[864,1091,874],{"class":873},[864,1093,1094],{"class":873}," init",[864,1096,1098],{"class":1097},"sjR7W"," --contact=",[864,1100,1102],{"class":1101},"sFkSl","\"",[864,1104,1105],{"class":873},"MyApp - contact@example.com",[864,1107,1108],{"class":1101},"\"\n",[854,1110,1112],{"className":856,"code":1111,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n",[838,1113,1114],{"__ignoreMap":860},[864,1115,1116,1118,1120,1122,1124,1126,1128,1130],{"class":866,"line":867},[864,1117,892],{"class":870},[864,1119,901],{"class":873},[864,1121,874],{"class":873},[864,1123,1094],{"class":873},[864,1125,1098],{"class":1097},[864,1127,1102],{"class":1101},[864,1129,1105],{"class":873},[864,1131,1108],{"class":1101},[854,1133,1135],{"className":856,"code":1134,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n",[838,1136,1137],{"__ignoreMap":860},[864,1138,1139,1141,1143,1145,1147,1149,1151,1153],{"class":866,"line":867},[864,1140,915],{"class":870},[864,1142,901],{"class":873},[864,1144,874],{"class":873},[864,1146,1094],{"class":873},[864,1148,1098],{"class":1097},[864,1150,1102],{"class":1101},[864,1152,1105],{"class":873},[864,1154,1108],{"class":1101},[854,1156,1158],{"className":856,"code":1157,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n",[838,1159,1160],{"__ignoreMap":860},[864,1161,1162,1164,1166,1168,1170,1172,1174],{"class":866,"line":867},[864,1163,944],{"class":870},[864,1165,874],{"class":873},[864,1167,1094],{"class":873},[864,1169,1098],{"class":1097},[864,1171,1102],{"class":1101},[864,1173,1105],{"class":873},[864,1175,1108],{"class":1101},[1177,1178,1179],"note",{},[835,1180,1181,1182,1184],{},"In non-interactive environments, ",[838,1183,958],{}," skips silently when the databases already exist. If they do not exist and no contact string is provided, it prints a warning and exits without failing.",[1186,1187],"hr",{},[956,1189,1191],{"id":1190},"refresh",[838,1192,1190],{},[835,1194,1195,1196,1198,1199,1201],{},"Redownloads and recompiles all data sources using the configuration cached from the last ",[838,1197,958],{}," run. This command requires ",[838,1200,958],{}," to have been run at least once.",[851,1203,1204,1218,1233,1248],{},[854,1205,1207],{"className":856,"code":1206,"filename":858,"language":859,"meta":860,"style":860},"npx @riavzon\u002Fbot-detector refresh\n",[838,1208,1209],{"__ignoreMap":860},[864,1210,1211,1213,1215],{"class":866,"line":867},[864,1212,844],{"class":870},[864,1214,874],{"class":873},[864,1216,1217],{"class":873}," refresh\n",[854,1219,1221],{"className":856,"code":1220,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector refresh\n",[838,1222,1223],{"__ignoreMap":860},[864,1224,1225,1227,1229,1231],{"class":866,"line":867},[864,1226,892],{"class":870},[864,1228,901],{"class":873},[864,1230,874],{"class":873},[864,1232,1217],{"class":873},[854,1234,1236],{"className":856,"code":1235,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector refresh\n",[838,1237,1238],{"__ignoreMap":860},[864,1239,1240,1242,1244,1246],{"class":866,"line":867},[864,1241,915],{"class":870},[864,1243,901],{"class":873},[864,1245,874],{"class":873},[864,1247,1217],{"class":873},[854,1249,1251],{"className":856,"code":1250,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector refresh\n",[838,1252,1253],{"__ignoreMap":860},[864,1254,1255,1257,1259],{"class":866,"line":867},[864,1256,944],{"class":870},[864,1258,874],{"class":873},[864,1260,1217],{"class":873},[835,1262,1263,1264,1266],{},"Run ",[838,1265,1190],{}," at least once every 24 hours to keep threat intelligence feeds current. Add it to a cron job or a scheduled CI pipeline:",[854,1268,1271],{"className":856,"code":1269,"filename":1270,"language":859,"meta":860,"style":860},"# Example: daily cron at 3am\n0 3 * * * cd \u002Fyour\u002Fapp && npx bot-detector refresh\n","Terminal",[838,1272,1273,1279],{"__ignoreMap":860},[864,1274,1275],{"class":866,"line":867},[864,1276,1278],{"class":1277},"sghk6","# Example: daily cron at 3am\n",[864,1280,1282,1285,1289,1293,1295,1297,1300,1303,1306,1308,1311],{"class":866,"line":1281},2,[864,1283,1284],{"class":870},"0",[864,1286,1288],{"class":1287},"spgvN"," 3",[864,1290,1292],{"class":1291},"spgJB"," *",[864,1294,1292],{"class":1291},[864,1296,1292],{"class":1291},[864,1298,1299],{"class":873}," cd",[864,1301,1302],{"class":873}," \u002Fyour\u002Fapp",[864,1304,1305],{"class":884}," && ",[864,1307,844],{"class":870},[864,1309,1310],{"class":873}," bot-detector",[864,1312,1217],{"class":873},[1186,1314],{},[956,1316,1318],{"id":1317},"generate",[838,1319,1317],{},[835,1321,1322],{},"Reads your database and compiles two custom MMDB files from your visitor history:",[985,1324,1325,1335],{},[988,1326,1327,1330,1331,1334],{},[838,1328,1329],{},"banned.mmdb",": Built from all rows in the ",[838,1332,1333],{},"banned"," table with a non-null IP address.",[988,1336,1337,1340,1341,1344,1345,1348,1349,1352,1353,1356],{},[838,1338,1339],{},"highRisk.mmdb",": Built from rows in the ",[838,1342,1343],{},"visitors"," table where ",[838,1346,1347],{},"suspicious_activity_score"," is greater than or equal to ",[838,1350,1351],{},"generator.scoreThreshold"," (default ",[838,1354,1355],{},"70",").",[835,1358,1359,1360,1362,1363,1366],{},"These files are written to ",[838,1361,982],{}," and are loaded by the ",[838,1364,1365],{},"enableKnownBadIpsCheck"," checker on startup. Once generated, previously identified threats are checked synchronously in the cheap phase, making repeat offenders extremely fast to reject.",[1368,1369,1371],"h3",{"id":1370},"flags","Flags",[835,1373,1374,1375,1377],{},"The ",[838,1376,1317],{}," command accepts the following flags:",[1379,1380,1381,1400],"table",{},[1382,1383,1384],"thead",{},[1385,1386,1387,1391,1394,1397],"tr",{},[1388,1389,1390],"th",{},"Flag",[1388,1392,1393],{},"Type",[1388,1395,1396],{},"Description",[1388,1398,1399],{},"Default",[1401,1402,1403,1437,1453,1467,1481,1495,1509,1528,1546,1562],"tbody",{},[1385,1404,1405,1411,1430,1433],{},[1406,1407,1408],"td",{},[838,1409,1410],{},"--db",[1406,1412,1413,1414,1417,1418,1417,1421,1417,1424,1417,1427],{},"enum: ",[838,1415,1416],{},"sqlite"," | ",[838,1419,1420],{},"mysql-pool",[838,1422,1423],{},"postgresql",[838,1425,1426],{},"cloudflare-d1",[838,1428,1429],{},"planetscale",[1406,1431,1432],{},"Database driver to use",[1406,1434,1435],{},[838,1436,1416],{},[1385,1438,1439,1444,1447,1450],{},[1406,1440,1441],{},[838,1442,1443],{},"--db-name",[1406,1445,1446],{},"string",[1406,1448,1449],{},"Database name (or binding name for Cloudflare D1)",[1406,1451,1452],{},"—",[1385,1454,1455,1460,1462,1465],{},[1406,1456,1457],{},[838,1458,1459],{},"--db-host",[1406,1461,1446],{},[1406,1463,1464],{},"Database host (for MySQL\u002FPostgres)",[1406,1466,1452],{},[1385,1468,1469,1474,1476,1479],{},[1406,1470,1471],{},[838,1472,1473],{},"--db-user",[1406,1475,1446],{},[1406,1477,1478],{},"Database user",[1406,1480,1452],{},[1385,1482,1483,1488,1490,1493],{},[1406,1484,1485],{},[838,1486,1487],{},"--db-password",[1406,1489,1446],{},[1406,1491,1492],{},"Database password",[1406,1494,1452],{},[1385,1496,1497,1502,1504,1507],{},[1406,1498,1499],{},[838,1500,1501],{},"--db-url",[1406,1503,1446],{},[1406,1505,1506],{},"Connection URL (for Planetscale)",[1406,1508,1452],{},[1385,1510,1511,1516,1518,1524],{},[1406,1512,1513],{},[838,1514,1515],{},"--mmdbctl",[1406,1517,1446],{},[1406,1519,1520,1521,1523],{},"Path to the ",[838,1522,975],{}," binary",[1406,1525,1526],{},[838,1527,975],{},[1385,1529,1530,1535,1538,1541],{},[1406,1531,1532],{},[838,1533,1534],{},"--types",[1406,1536,1537],{},"boolean",[1406,1539,1540],{},"Generate TypeScript types",[1406,1542,1543],{},[838,1544,1545],{},"false",[1385,1547,1548,1553,1555,1558],{},[1406,1549,1550],{},[838,1551,1552],{},"--delete",[1406,1554,1537],{},[1406,1556,1557],{},"Delete rows that compiled in this run",[1406,1559,1560],{},[838,1561,1545],{},[1385,1563,1564,1569,1572,1575],{},[1406,1565,1566],{},[838,1567,1568],{},"--score",[1406,1570,1571],{},"number",[1406,1573,1574],{},"Threat score considered \"high\"",[1406,1576,1577],{},[838,1578,1355],{},[835,1580,1581],{},"Example usage:",[851,1583,1584,1625,1657,1688],{},[854,1585,1587],{"className":856,"code":1586,"filename":858,"language":859,"meta":860,"style":860},"npx @riavzon\u002Fbot-detector generate --db mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n",[838,1588,1589],{"__ignoreMap":860},[864,1590,1591,1593,1595,1598,1601,1604,1607,1610,1613,1616,1619,1622],{"class":866,"line":867},[864,1592,844],{"class":870},[864,1594,874],{"class":873},[864,1596,1597],{"class":873}," generate",[864,1599,1600],{"class":1097}," --db",[864,1602,1603],{"class":873}," mysql-pool",[864,1605,1606],{"class":1097}," --db-host=localhost",[864,1608,1609],{"class":1097}," --db-user=root",[864,1611,1612],{"class":1097}," --db-password=secret",[864,1614,1615],{"class":1097}," --db-name=botdb",[864,1617,1618],{"class":1097}," --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl",[864,1620,1621],{"class":1097}," --score=80",[864,1623,1624],{"class":1097}," --delete\n",[854,1626,1628],{"className":856,"code":1627,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n",[838,1629,1630],{"__ignoreMap":860},[864,1631,1632,1634,1636,1638,1640,1643,1645,1647,1649,1651,1653,1655],{"class":866,"line":867},[864,1633,892],{"class":870},[864,1635,901],{"class":873},[864,1637,874],{"class":873},[864,1639,1597],{"class":873},[864,1641,1642],{"class":1097}," --db=mysql-pool",[864,1644,1606],{"class":1097},[864,1646,1609],{"class":1097},[864,1648,1612],{"class":1097},[864,1650,1615],{"class":1097},[864,1652,1618],{"class":1097},[864,1654,1621],{"class":1097},[864,1656,1624],{"class":1097},[854,1658,1660],{"className":856,"code":1659,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n",[838,1661,1662],{"__ignoreMap":860},[864,1663,1664,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686],{"class":866,"line":867},[864,1665,915],{"class":870},[864,1667,901],{"class":873},[864,1669,874],{"class":873},[864,1671,1597],{"class":873},[864,1673,1642],{"class":1097},[864,1675,1606],{"class":1097},[864,1677,1609],{"class":1097},[864,1679,1612],{"class":1097},[864,1681,1615],{"class":1097},[864,1683,1618],{"class":1097},[864,1685,1621],{"class":1097},[864,1687,1624],{"class":1097},[854,1689,1691],{"className":856,"code":1690,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n",[838,1692,1693],{"__ignoreMap":860},[864,1694,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715],{"class":866,"line":867},[864,1696,944],{"class":870},[864,1698,874],{"class":873},[864,1700,1597],{"class":873},[864,1702,1642],{"class":1097},[864,1704,1606],{"class":1097},[864,1706,1609],{"class":1097},[864,1708,1612],{"class":1097},[864,1710,1615],{"class":1097},[864,1712,1618],{"class":1097},[864,1714,1621],{"class":1097},[864,1716,1624],{"class":1097},[835,1718,1719,1721,1722,1724,1725,1728],{},[838,1720,1317],{}," requires ",[838,1723,975],{},". When the binary cannot be found at the path configured in ",[838,1726,1727],{},"generator.mmdbctlPath",", the command prompts you to install it and exits with instructions.",[1730,1731,1732],"tip",{},[835,1733,1263,1734,1736],{},[838,1735,1317],{}," periodically and after bulk ban operations so the compiled databases reflect your latest visitor history.",[1186,1738],{},[956,1740,1742],{"id":1741},"load-schema",[838,1743,1741],{},[835,1745,1746,1747,1749,1750,1752,1753,1756],{},"Creates the required database tables (",[838,1748,1343],{}," and ",[838,1751,1333],{},") in the database configured by ",[838,1754,1755],{},"defineConfiguration",". Run this once after your first configuration before starting the server.",[1368,1758,1371],{"id":1759},"flags-1",[835,1761,1374,1762,1764],{},[838,1763,1741],{}," command accepts these flags to select and configure the database connection used to create tables:",[1379,1766,1767,1779],{},[1382,1768,1769],{},[1385,1770,1771,1773,1775,1777],{},[1388,1772,1390],{},[1388,1774,1393],{},[1388,1776,1396],{},[1388,1778,1399],{},[1401,1780,1781,1805,1817,1829,1841,1853],{},[1385,1782,1783,1787,1799,1801],{},[1406,1784,1785],{},[838,1786,1410],{},[1406,1788,1413,1789,1417,1791,1417,1793,1417,1795,1417,1797],{},[838,1790,1416],{},[838,1792,1420],{},[838,1794,1423],{},[838,1796,1426],{},[838,1798,1429],{},[1406,1800,1432],{},[1406,1802,1803],{},[838,1804,1416],{},[1385,1806,1807,1811,1813,1815],{},[1406,1808,1809],{},[838,1810,1443],{},[1406,1812,1446],{},[1406,1814,1449],{},[1406,1816,1452],{},[1385,1818,1819,1823,1825,1827],{},[1406,1820,1821],{},[838,1822,1459],{},[1406,1824,1446],{},[1406,1826,1464],{},[1406,1828,1452],{},[1385,1830,1831,1835,1837,1839],{},[1406,1832,1833],{},[838,1834,1473],{},[1406,1836,1446],{},[1406,1838,1478],{},[1406,1840,1452],{},[1385,1842,1843,1847,1849,1851],{},[1406,1844,1845],{},[838,1846,1487],{},[1406,1848,1446],{},[1406,1850,1492],{},[1406,1852,1452],{},[1385,1854,1855,1859,1861,1863],{},[1406,1856,1857],{},[838,1858,1501],{},[1406,1860,1446],{},[1406,1862,1506],{},[1406,1864,1452],{},[835,1866,1581],{},[851,1868,1869,1896,1921,1946],{},[854,1870,1872],{"className":856,"code":1871,"filename":858,"language":859,"meta":860,"style":860},"npx @riavzon\u002Fbot-detector load-schema --db mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n",[838,1873,1874],{"__ignoreMap":860},[864,1875,1876,1878,1880,1883,1885,1887,1889,1891,1893],{"class":866,"line":867},[864,1877,844],{"class":870},[864,1879,874],{"class":873},[864,1881,1882],{"class":873}," load-schema",[864,1884,1600],{"class":1097},[864,1886,1603],{"class":873},[864,1888,1606],{"class":1097},[864,1890,1609],{"class":1097},[864,1892,1612],{"class":1097},[864,1894,1895],{"class":1097}," --db-name=botdb\n",[854,1897,1899],{"className":856,"code":1898,"filename":892,"language":859,"meta":860,"style":860},"pnpm dlx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n",[838,1900,1901],{"__ignoreMap":860},[864,1902,1903,1905,1907,1909,1911,1913,1915,1917,1919],{"class":866,"line":867},[864,1904,892],{"class":870},[864,1906,901],{"class":873},[864,1908,874],{"class":873},[864,1910,1882],{"class":873},[864,1912,1642],{"class":1097},[864,1914,1606],{"class":1097},[864,1916,1609],{"class":1097},[864,1918,1612],{"class":1097},[864,1920,1895],{"class":1097},[854,1922,1924],{"className":856,"code":1923,"filename":915,"language":859,"meta":860,"style":860},"yarn dlx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n",[838,1925,1926],{"__ignoreMap":860},[864,1927,1928,1930,1932,1934,1936,1938,1940,1942,1944],{"class":866,"line":867},[864,1929,915],{"class":870},[864,1931,901],{"class":873},[864,1933,874],{"class":873},[864,1935,1882],{"class":873},[864,1937,1642],{"class":1097},[864,1939,1606],{"class":1097},[864,1941,1609],{"class":1097},[864,1943,1612],{"class":1097},[864,1945,1895],{"class":1097},[854,1947,1949],{"className":856,"code":1948,"filename":937,"language":859,"meta":860,"style":860},"bunx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n",[838,1950,1951],{"__ignoreMap":860},[864,1952,1953,1955,1957,1959,1961,1963,1965,1967],{"class":866,"line":867},[864,1954,944],{"class":870},[864,1956,874],{"class":873},[864,1958,1882],{"class":873},[864,1960,1642],{"class":1097},[864,1962,1606],{"class":1097},[864,1964,1609],{"class":1097},[864,1966,1612],{"class":1097},[864,1968,1895],{"class":1097},[835,1970,1971,1973,1974,1976,1977,1979],{},[838,1972,1741],{}," reads the active ",[838,1975,1755],{}," call to determine the database driver and connection. Your application entry point must export or call ",[838,1978,1755],{}," before this command can resolve the connection.",[1177,1981,1982],{},[835,1983,1263,1984,1986],{},[838,1985,1741],{}," before starting the server for the first time. It is safe to skip on subsequent restarts.",[1988,1989,1990],"style",{},"html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}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);}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .spgJB, html code.shiki .spgJB{--shiki-light:#0000FF;--shiki-light-font-style:inherit;--shiki-default:#0000FF;--shiki-default-font-style:inherit;--shiki-dark:#BD93F9;--shiki-dark-font-style:italic}",{"title":860,"searchDepth":1281,"depth":1281,"links":1992},[1993,1994,1995,1999],{"id":958,"depth":1281,"text":958},{"id":1190,"depth":1281,"text":1190},{"id":1317,"depth":1281,"text":1317,"children":1996},[1997],{"id":1370,"depth":1998,"text":1371},3,{"id":1741,"depth":1281,"text":1741,"children":2000},[2001],{"id":1759,"depth":1998,"text":1371},"Reference for the bot-detector command-line interface.","md","i-lucide-terminal",{},null,"---\ntitle: CLI\ndescription: Reference for the bot-detector command-line interface.\nicon: i-lucide-terminal\n---\n\n`@riavzon\u002Fbot-detector` ships a CLI with four subcommands. You can run them with `npx` without a global install, or directly as `bot-detector` after installing the package.\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector \u003Ccommand>\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector \u003Ccommand>\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector \u003Ccommand>\n```\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector \u003Ccommand>\n```\n::\n\n## `init`\n\nRuns the installation wizard. `init` verifies that [`mmdbctl`](https:\u002F\u002Fgithub.com\u002Fipinfo\u002Fmmdbctl) is installed and installs it automatically if it is not found. It then prompts for a BGP.tools contact string, which is required to download BGP and ASN data from their API.\n\nOnce dependencies are confirmed, the command compiles all data sources in parallel and writes them to `_data-sources\u002F` inside the package directory:\n\n- BGP and ASN data\n- City and geography databases\n- Tor node lists\n- Proxy and anonymizer lists\n- FireHOL threat levels 1-4 and the anonymous feed\n- Verified crawler IP ranges (Googlebot, Bingbot, Apple, Meta, and others)\n- User-Agent pattern database (`useragent.mdb`)\n\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector init\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector init\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector init\n```\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector init\n```\n::\n\nTo skip the interactive prompt in CI or automated environments, pass your contact string directly with the `--contact` flag:\n\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n```\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector init --contact=\"MyApp - contact@example.com\"\n```\n::\n\n::note\nIn non-interactive environments, `init` skips silently when the databases already exist. If they do not exist and no contact string is provided, it prints a warning and exits without failing.\n::\n\n---\n\n## `refresh`\n\nRedownloads and recompiles all data sources using the configuration cached from the last `init` run. This command requires `init` to have been run at least once.\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector refresh\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector refresh\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector refresh\n```\n\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector refresh\n```\n::\n\nRun `refresh` at least once every 24 hours to keep threat intelligence feeds current. Add it to a cron job or a scheduled CI pipeline:\n\n```bash [Terminal]\n# Example: daily cron at 3am\n0 3 * * * cd \u002Fyour\u002Fapp && npx bot-detector refresh\n```\n\n---\n\n## `generate`\n\nReads your database and compiles two custom MMDB files from your visitor history:\n\n- `banned.mmdb`: Built from all rows in the `banned` table with a non-null IP address.\n- `highRisk.mmdb`: Built from rows in the `visitors` table where `suspicious_activity_score` is greater than or equal to `generator.scoreThreshold` (default `70`).\n\nThese files are written to `_data-sources\u002F` and are loaded by the `enableKnownBadIpsCheck` checker on startup. Once generated, previously identified threats are checked synchronously in the cheap phase, making repeat offenders extremely fast to reject.\n\n### Flags\n\nThe `generate` command accepts the following flags:\n\n| Flag | Type | Description | Default |\n| --- | --- | --- | --- |\n| `--db` | enum: `sqlite` \\| `mysql-pool` \\| `postgresql` \\| `cloudflare-d1` \\| `planetscale` | Database driver to use | `sqlite` |\n| `--db-name` | string | Database name (or binding name for Cloudflare D1) | — |\n| `--db-host` | string | Database host (for MySQL\u002FPostgres) | — |\n| `--db-user` | string | Database user | — |\n| `--db-password` | string | Database password | — |\n| `--db-url` | string | Connection URL (for Planetscale) | — |\n| `--mmdbctl` | string | Path to the `mmdbctl` binary | `mmdbctl` |\n| `--types` | boolean | Generate TypeScript types | `false` |\n| `--delete` | boolean | Delete rows that compiled in this run | `false` |\n| `--score` | number | Threat score considered \"high\" | `70` |\n\nExample usage:\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector generate --db mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n```\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector generate --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb --mmdbctl=\u002Fusr\u002Flocal\u002Fbin\u002Fmmdbctl --score=80 --delete\n```\n\n::\n\n`generate` requires `mmdbctl`. When the binary cannot be found at the path configured in `generator.mmdbctlPath`, the command prompts you to install it and exits with instructions.\n\n::tip\nRun `generate` periodically and after bulk ban operations so the compiled databases reflect your latest visitor history.\n::\n\n---\n\n## `load-schema`\n\nCreates the required database tables (`visitors` and `banned`) in the database configured by `defineConfiguration`. Run this once after your first configuration before starting the server.\n\n### Flags\n\nThe `load-schema` command accepts these flags to select and configure the database connection used to create tables:\n\n| Flag | Type | Description | Default |\n| --- | --- | --- | --- |\n| `--db` | enum: `sqlite` \\| `mysql-pool` \\| `postgresql` \\| `cloudflare-d1` \\| `planetscale` | Database driver to use | `sqlite` |\n| `--db-name` | string | Database name (or binding name for Cloudflare D1) | — |\n| `--db-host` | string | Database host (for MySQL\u002FPostgres) | — |\n| `--db-user` | string | Database user | — |\n| `--db-password` | string | Database password | — |\n| `--db-url` | string | Connection URL (for Planetscale) | — |\n\nExample usage:\n\n::code-group\n\n```bash [npm]\nnpx @riavzon\u002Fbot-detector load-schema --db mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n```\n\n```bash [pnpm]\npnpm dlx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n```\n\n```bash [bun]\nbunx @riavzon\u002Fbot-detector load-schema --db=mysql-pool --db-host=localhost --db-user=root --db-password=secret --db-name=botdb\n```\n\n::\n\n`load-schema` reads the active `defineConfiguration` call to determine the database driver and connection. Your application entry point must export or call `defineConfiguration` before this command can resolve the connection.\n\n::note\nRun `load-schema` before starting the server for the first time. It is safe to skip on subsequent restarts.\n::\n",{"title":78,"description":2002},"PBp5G0KL533E7RpJDtCnXtObJ3Pj3IB8jM1fPv2Z-kg",[2011,2012],{"title":14,"path":75,"stem":76,"children":-1},{"title":82,"path":83,"stem":84,"children":-1},{"id":830,"title":78,"body":2014,"description":2002,"extension":2003,"icon":2004,"meta":2967,"module":2006,"navigation":8,"path":79,"rawbody":2007,"seo":2968,"stem":80,"__hash__":2009},{"type":832,"value":2015,"toc":2957},[2016,2024,2102,2106,2115,2119,2137,2191,2195,2281,2287,2289,2293,2299,2353,2357,2389,2391,2395,2397,2417,2423,2425,2429,2587,2589,2709,2717,2723,2725,2729,2737,2739,2743,2843,2845,2941,2949,2955],[835,2017,2018,841,2020,845,2022,849],{},[838,2019,840],{},[838,2021,844],{},[838,2023,848],{},[851,2025,2026,2044,2064,2084],{},[854,2027,2028],{"className":856,"code":857,"filename":858,"language":859,"meta":860,"style":860},[838,2029,2030],{"__ignoreMap":860},[864,2031,2032,2034,2036,2038,2040,2042],{"class":866,"line":867},[864,2033,844],{"class":870},[864,2035,874],{"class":873},[864,2037,878],{"class":877},[864,2039,881],{"class":873},[864,2041,885],{"class":884},[864,2043,888],{"class":877},[854,2045,2046],{"className":856,"code":891,"filename":892,"language":859,"meta":860,"style":860},[838,2047,2048],{"__ignoreMap":860},[864,2049,2050,2052,2054,2056,2058,2060,2062],{"class":866,"line":867},[864,2051,892],{"class":870},[864,2053,901],{"class":873},[864,2055,874],{"class":873},[864,2057,878],{"class":877},[864,2059,881],{"class":873},[864,2061,885],{"class":884},[864,2063,888],{"class":877},[854,2065,2066],{"className":856,"code":914,"filename":915,"language":859,"meta":860,"style":860},[838,2067,2068],{"__ignoreMap":860},[864,2069,2070,2072,2074,2076,2078,2080,2082],{"class":866,"line":867},[864,2071,915],{"class":870},[864,2073,901],{"class":873},[864,2075,874],{"class":873},[864,2077,878],{"class":877},[864,2079,881],{"class":873},[864,2081,885],{"class":884},[864,2083,888],{"class":877},[854,2085,2086],{"className":856,"code":936,"filename":937,"language":859,"meta":860,"style":860},[838,2087,2088],{"__ignoreMap":860},[864,2089,2090,2092,2094,2096,2098,2100],{"class":866,"line":867},[864,2091,944],{"class":870},[864,2093,874],{"class":873},[864,2095,878],{"class":877},[864,2097,881],{"class":873},[864,2099,885],{"class":884},[864,2101,888],{"class":877},[956,2103,2104],{"id":958},[838,2105,958],{},[835,2107,963,2108,966,2110,976],{},[838,2109,958],{},[968,2111,2113],{"href":970,"rel":2112},[972],[838,2114,975],{},[835,2116,979,2117,983],{},[838,2118,982],{},[985,2120,2121,2123,2125,2127,2129,2131,2133],{},[988,2122,990],{},[988,2124,993],{},[988,2126,996],{},[988,2128,999],{},[988,2130,1002],{},[988,2132,1005],{},[988,2134,1008,2135,1012],{},[838,2136,1011],{},[851,2138,2139,2151,2165,2179],{},[854,2140,2141],{"className":856,"code":1017,"filename":858,"language":859,"meta":860,"style":860},[838,2142,2143],{"__ignoreMap":860},[864,2144,2145,2147,2149],{"class":866,"line":867},[864,2146,844],{"class":870},[864,2148,874],{"class":873},[864,2150,1028],{"class":873},[854,2152,2153],{"className":856,"code":1031,"filename":892,"language":859,"meta":860,"style":860},[838,2154,2155],{"__ignoreMap":860},[864,2156,2157,2159,2161,2163],{"class":866,"line":867},[864,2158,892],{"class":870},[864,2160,901],{"class":873},[864,2162,874],{"class":873},[864,2164,1028],{"class":873},[854,2166,2167],{"className":856,"code":1046,"filename":915,"language":859,"meta":860,"style":860},[838,2168,2169],{"__ignoreMap":860},[864,2170,2171,2173,2175,2177],{"class":866,"line":867},[864,2172,915],{"class":870},[864,2174,901],{"class":873},[864,2176,874],{"class":873},[864,2178,1028],{"class":873},[854,2180,2181],{"className":856,"code":1061,"filename":937,"language":859,"meta":860,"style":860},[838,2182,2183],{"__ignoreMap":860},[864,2184,2185,2187,2189],{"class":866,"line":867},[864,2186,944],{"class":870},[864,2188,874],{"class":873},[864,2190,1028],{"class":873},[835,2192,1074,2193,1078],{},[838,2194,1077],{},[851,2196,2197,2217,2239,2261],{},[854,2198,2199],{"className":856,"code":1083,"filename":858,"language":859,"meta":860,"style":860},[838,2200,2201],{"__ignoreMap":860},[864,2202,2203,2205,2207,2209,2211,2213,2215],{"class":866,"line":867},[864,2204,844],{"class":870},[864,2206,874],{"class":873},[864,2208,1094],{"class":873},[864,2210,1098],{"class":1097},[864,2212,1102],{"class":1101},[864,2214,1105],{"class":873},[864,2216,1108],{"class":1101},[854,2218,2219],{"className":856,"code":1111,"filename":892,"language":859,"meta":860,"style":860},[838,2220,2221],{"__ignoreMap":860},[864,2222,2223,2225,2227,2229,2231,2233,2235,2237],{"class":866,"line":867},[864,2224,892],{"class":870},[864,2226,901],{"class":873},[864,2228,874],{"class":873},[864,2230,1094],{"class":873},[864,2232,1098],{"class":1097},[864,2234,1102],{"class":1101},[864,2236,1105],{"class":873},[864,2238,1108],{"class":1101},[854,2240,2241],{"className":856,"code":1134,"filename":915,"language":859,"meta":860,"style":860},[838,2242,2243],{"__ignoreMap":860},[864,2244,2245,2247,2249,2251,2253,2255,2257,2259],{"class":866,"line":867},[864,2246,915],{"class":870},[864,2248,901],{"class":873},[864,2250,874],{"class":873},[864,2252,1094],{"class":873},[864,2254,1098],{"class":1097},[864,2256,1102],{"class":1101},[864,2258,1105],{"class":873},[864,2260,1108],{"class":1101},[854,2262,2263],{"className":856,"code":1157,"filename":937,"language":859,"meta":860,"style":860},[838,2264,2265],{"__ignoreMap":860},[864,2266,2267,2269,2271,2273,2275,2277,2279],{"class":866,"line":867},[864,2268,944],{"class":870},[864,2270,874],{"class":873},[864,2272,1094],{"class":873},[864,2274,1098],{"class":1097},[864,2276,1102],{"class":1101},[864,2278,1105],{"class":873},[864,2280,1108],{"class":1101},[1177,2282,2283],{},[835,2284,1181,2285,1184],{},[838,2286,958],{},[1186,2288],{},[956,2290,2291],{"id":1190},[838,2292,1190],{},[835,2294,1195,2295,1198,2297,1201],{},[838,2296,958],{},[838,2298,958],{},[851,2300,2301,2313,2327,2341],{},[854,2302,2303],{"className":856,"code":1206,"filename":858,"language":859,"meta":860,"style":860},[838,2304,2305],{"__ignoreMap":860},[864,2306,2307,2309,2311],{"class":866,"line":867},[864,2308,844],{"class":870},[864,2310,874],{"class":873},[864,2312,1217],{"class":873},[854,2314,2315],{"className":856,"code":1220,"filename":892,"language":859,"meta":860,"style":860},[838,2316,2317],{"__ignoreMap":860},[864,2318,2319,2321,2323,2325],{"class":866,"line":867},[864,2320,892],{"class":870},[864,2322,901],{"class":873},[864,2324,874],{"class":873},[864,2326,1217],{"class":873},[854,2328,2329],{"className":856,"code":1235,"filename":915,"language":859,"meta":860,"style":860},[838,2330,2331],{"__ignoreMap":860},[864,2332,2333,2335,2337,2339],{"class":866,"line":867},[864,2334,915],{"class":870},[864,2336,901],{"class":873},[864,2338,874],{"class":873},[864,2340,1217],{"class":873},[854,2342,2343],{"className":856,"code":1250,"filename":937,"language":859,"meta":860,"style":860},[838,2344,2345],{"__ignoreMap":860},[864,2346,2347,2349,2351],{"class":866,"line":867},[864,2348,944],{"class":870},[864,2350,874],{"class":873},[864,2352,1217],{"class":873},[835,2354,1263,2355,1266],{},[838,2356,1190],{},[854,2358,2359],{"className":856,"code":1269,"filename":1270,"language":859,"meta":860,"style":860},[838,2360,2361,2365],{"__ignoreMap":860},[864,2362,2363],{"class":866,"line":867},[864,2364,1278],{"class":1277},[864,2366,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387],{"class":866,"line":1281},[864,2368,1284],{"class":870},[864,2370,1288],{"class":1287},[864,2372,1292],{"class":1291},[864,2374,1292],{"class":1291},[864,2376,1292],{"class":1291},[864,2378,1299],{"class":873},[864,2380,1302],{"class":873},[864,2382,1305],{"class":884},[864,2384,844],{"class":870},[864,2386,1310],{"class":873},[864,2388,1217],{"class":873},[1186,2390],{},[956,2392,2393],{"id":1317},[838,2394,1317],{},[835,2396,1322],{},[985,2398,2399,2405],{},[988,2400,2401,1330,2403,1334],{},[838,2402,1329],{},[838,2404,1333],{},[988,2406,2407,1340,2409,1344,2411,1348,2413,1352,2415,1356],{},[838,2408,1339],{},[838,2410,1343],{},[838,2412,1347],{},[838,2414,1351],{},[838,2416,1355],{},[835,2418,1359,2419,1362,2421,1366],{},[838,2420,982],{},[838,2422,1365],{},[1368,2424,1371],{"id":1370},[835,2426,1374,2427,1377],{},[838,2428,1317],{},[1379,2430,2431,2443],{},[1382,2432,2433],{},[1385,2434,2435,2437,2439,2441],{},[1388,2436,1390],{},[1388,2438,1393],{},[1388,2440,1396],{},[1388,2442,1399],{},[1401,2444,2445,2469,2481,2493,2505,2517,2529,2545,2559,2573],{},[1385,2446,2447,2451,2463,2465],{},[1406,2448,2449],{},[838,2450,1410],{},[1406,2452,1413,2453,1417,2455,1417,2457,1417,2459,1417,2461],{},[838,2454,1416],{},[838,2456,1420],{},[838,2458,1423],{},[838,2460,1426],{},[838,2462,1429],{},[1406,2464,1432],{},[1406,2466,2467],{},[838,2468,1416],{},[1385,2470,2471,2475,2477,2479],{},[1406,2472,2473],{},[838,2474,1443],{},[1406,2476,1446],{},[1406,2478,1449],{},[1406,2480,1452],{},[1385,2482,2483,2487,2489,2491],{},[1406,2484,2485],{},[838,2486,1459],{},[1406,2488,1446],{},[1406,2490,1464],{},[1406,2492,1452],{},[1385,2494,2495,2499,2501,2503],{},[1406,2496,2497],{},[838,2498,1473],{},[1406,2500,1446],{},[1406,2502,1478],{},[1406,2504,1452],{},[1385,2506,2507,2511,2513,2515],{},[1406,2508,2509],{},[838,2510,1487],{},[1406,2512,1446],{},[1406,2514,1492],{},[1406,2516,1452],{},[1385,2518,2519,2523,2525,2527],{},[1406,2520,2521],{},[838,2522,1501],{},[1406,2524,1446],{},[1406,2526,1506],{},[1406,2528,1452],{},[1385,2530,2531,2535,2537,2541],{},[1406,2532,2533],{},[838,2534,1515],{},[1406,2536,1446],{},[1406,2538,1520,2539,1523],{},[838,2540,975],{},[1406,2542,2543],{},[838,2544,975],{},[1385,2546,2547,2551,2553,2555],{},[1406,2548,2549],{},[838,2550,1534],{},[1406,2552,1537],{},[1406,2554,1540],{},[1406,2556,2557],{},[838,2558,1545],{},[1385,2560,2561,2565,2567,2569],{},[1406,2562,2563],{},[838,2564,1552],{},[1406,2566,1537],{},[1406,2568,1557],{},[1406,2570,2571],{},[838,2572,1545],{},[1385,2574,2575,2579,2581,2583],{},[1406,2576,2577],{},[838,2578,1568],{},[1406,2580,1571],{},[1406,2582,1574],{},[1406,2584,2585],{},[838,2586,1355],{},[835,2588,1581],{},[851,2590,2591,2621,2651,2681],{},[854,2592,2593],{"className":856,"code":1586,"filename":858,"language":859,"meta":860,"style":860},[838,2594,2595],{"__ignoreMap":860},[864,2596,2597,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619],{"class":866,"line":867},[864,2598,844],{"class":870},[864,2600,874],{"class":873},[864,2602,1597],{"class":873},[864,2604,1600],{"class":1097},[864,2606,1603],{"class":873},[864,2608,1606],{"class":1097},[864,2610,1609],{"class":1097},[864,2612,1612],{"class":1097},[864,2614,1615],{"class":1097},[864,2616,1618],{"class":1097},[864,2618,1621],{"class":1097},[864,2620,1624],{"class":1097},[854,2622,2623],{"className":856,"code":1627,"filename":892,"language":859,"meta":860,"style":860},[838,2624,2625],{"__ignoreMap":860},[864,2626,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649],{"class":866,"line":867},[864,2628,892],{"class":870},[864,2630,901],{"class":873},[864,2632,874],{"class":873},[864,2634,1597],{"class":873},[864,2636,1642],{"class":1097},[864,2638,1606],{"class":1097},[864,2640,1609],{"class":1097},[864,2642,1612],{"class":1097},[864,2644,1615],{"class":1097},[864,2646,1618],{"class":1097},[864,2648,1621],{"class":1097},[864,2650,1624],{"class":1097},[854,2652,2653],{"className":856,"code":1659,"filename":915,"language":859,"meta":860,"style":860},[838,2654,2655],{"__ignoreMap":860},[864,2656,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679],{"class":866,"line":867},[864,2658,915],{"class":870},[864,2660,901],{"class":873},[864,2662,874],{"class":873},[864,2664,1597],{"class":873},[864,2666,1642],{"class":1097},[864,2668,1606],{"class":1097},[864,2670,1609],{"class":1097},[864,2672,1612],{"class":1097},[864,2674,1615],{"class":1097},[864,2676,1618],{"class":1097},[864,2678,1621],{"class":1097},[864,2680,1624],{"class":1097},[854,2682,2683],{"className":856,"code":1690,"filename":937,"language":859,"meta":860,"style":860},[838,2684,2685],{"__ignoreMap":860},[864,2686,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707],{"class":866,"line":867},[864,2688,944],{"class":870},[864,2690,874],{"class":873},[864,2692,1597],{"class":873},[864,2694,1642],{"class":1097},[864,2696,1606],{"class":1097},[864,2698,1609],{"class":1097},[864,2700,1612],{"class":1097},[864,2702,1615],{"class":1097},[864,2704,1618],{"class":1097},[864,2706,1621],{"class":1097},[864,2708,1624],{"class":1097},[835,2710,2711,1721,2713,1724,2715,1728],{},[838,2712,1317],{},[838,2714,975],{},[838,2716,1727],{},[1730,2718,2719],{},[835,2720,1263,2721,1736],{},[838,2722,1317],{},[1186,2724],{},[956,2726,2727],{"id":1741},[838,2728,1741],{},[835,2730,1746,2731,1749,2733,1752,2735,1756],{},[838,2732,1343],{},[838,2734,1333],{},[838,2736,1755],{},[1368,2738,1371],{"id":1759},[835,2740,1374,2741,1764],{},[838,2742,1741],{},[1379,2744,2745,2757],{},[1382,2746,2747],{},[1385,2748,2749,2751,2753,2755],{},[1388,2750,1390],{},[1388,2752,1393],{},[1388,2754,1396],{},[1388,2756,1399],{},[1401,2758,2759,2783,2795,2807,2819,2831],{},[1385,2760,2761,2765,2777,2779],{},[1406,2762,2763],{},[838,2764,1410],{},[1406,2766,1413,2767,1417,2769,1417,2771,1417,2773,1417,2775],{},[838,2768,1416],{},[838,2770,1420],{},[838,2772,1423],{},[838,2774,1426],{},[838,2776,1429],{},[1406,2778,1432],{},[1406,2780,2781],{},[838,2782,1416],{},[1385,2784,2785,2789,2791,2793],{},[1406,2786,2787],{},[838,2788,1443],{},[1406,2790,1446],{},[1406,2792,1449],{},[1406,2794,1452],{},[1385,2796,2797,2801,2803,2805],{},[1406,2798,2799],{},[838,2800,1459],{},[1406,2802,1446],{},[1406,2804,1464],{},[1406,2806,1452],{},[1385,2808,2809,2813,2815,2817],{},[1406,2810,2811],{},[838,2812,1473],{},[1406,2814,1446],{},[1406,2816,1478],{},[1406,2818,1452],{},[1385,2820,2821,2825,2827,2829],{},[1406,2822,2823],{},[838,2824,1487],{},[1406,2826,1446],{},[1406,2828,1492],{},[1406,2830,1452],{},[1385,2832,2833,2837,2839,2841],{},[1406,2834,2835],{},[838,2836,1501],{},[1406,2838,1446],{},[1406,2840,1506],{},[1406,2842,1452],{},[835,2844,1581],{},[851,2846,2847,2871,2895,2919],{},[854,2848,2849],{"className":856,"code":1871,"filename":858,"language":859,"meta":860,"style":860},[838,2850,2851],{"__ignoreMap":860},[864,2852,2853,2855,2857,2859,2861,2863,2865,2867,2869],{"class":866,"line":867},[864,2854,844],{"class":870},[864,2856,874],{"class":873},[864,2858,1882],{"class":873},[864,2860,1600],{"class":1097},[864,2862,1603],{"class":873},[864,2864,1606],{"class":1097},[864,2866,1609],{"class":1097},[864,2868,1612],{"class":1097},[864,2870,1895],{"class":1097},[854,2872,2873],{"className":856,"code":1898,"filename":892,"language":859,"meta":860,"style":860},[838,2874,2875],{"__ignoreMap":860},[864,2876,2877,2879,2881,2883,2885,2887,2889,2891,2893],{"class":866,"line":867},[864,2878,892],{"class":870},[864,2880,901],{"class":873},[864,2882,874],{"class":873},[864,2884,1882],{"class":873},[864,2886,1642],{"class":1097},[864,2888,1606],{"class":1097},[864,2890,1609],{"class":1097},[864,2892,1612],{"class":1097},[864,2894,1895],{"class":1097},[854,2896,2897],{"className":856,"code":1923,"filename":915,"language":859,"meta":860,"style":860},[838,2898,2899],{"__ignoreMap":860},[864,2900,2901,2903,2905,2907,2909,2911,2913,2915,2917],{"class":866,"line":867},[864,2902,915],{"class":870},[864,2904,901],{"class":873},[864,2906,874],{"class":873},[864,2908,1882],{"class":873},[864,2910,1642],{"class":1097},[864,2912,1606],{"class":1097},[864,2914,1609],{"class":1097},[864,2916,1612],{"class":1097},[864,2918,1895],{"class":1097},[854,2920,2921],{"className":856,"code":1948,"filename":937,"language":859,"meta":860,"style":860},[838,2922,2923],{"__ignoreMap":860},[864,2924,2925,2927,2929,2931,2933,2935,2937,2939],{"class":866,"line":867},[864,2926,944],{"class":870},[864,2928,874],{"class":873},[864,2930,1882],{"class":873},[864,2932,1642],{"class":1097},[864,2934,1606],{"class":1097},[864,2936,1609],{"class":1097},[864,2938,1612],{"class":1097},[864,2940,1895],{"class":1097},[835,2942,2943,1973,2945,1976,2947,1979],{},[838,2944,1741],{},[838,2946,1755],{},[838,2948,1755],{},[1177,2950,2951],{},[835,2952,1263,2953,1986],{},[838,2954,1741],{},[1988,2956,1990],{},{"title":860,"searchDepth":1281,"depth":1281,"links":2958},[2959,2960,2961,2964],{"id":958,"depth":1281,"text":958},{"id":1190,"depth":1281,"text":1190},{"id":1317,"depth":1281,"text":1317,"children":2962},[2963],{"id":1370,"depth":1998,"text":1371},{"id":1741,"depth":1281,"text":1741,"children":2965},[2966],{"id":1759,"depth":1998,"text":1371},{},{"title":78,"description":2002},1780436274295]