[{"data":1,"prerenderedAt":4071},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Futils":64,"navigation":263,"navLinks_footer":835,"\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters_page":848,"\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters_surround":2616,"\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters":2619},{"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":48,"stem":71,"children":72},"Utilities","docs\u002Futils\u002Findex",[73,74,91,124,221],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":78,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[79,83,87],{"title":80,"path":81,"stem":82},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":84,"path":85,"stem":86},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":88,"path":89,"stem":90},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":92,"path":93,"stem":94,"children":95,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[96,100,104,108,112,116,120],{"title":97,"path":98,"stem":99},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":101,"path":102,"stem":103},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":105,"path":106,"stem":107},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":109,"path":110,"stem":111},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":113,"path":114,"stem":115},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":117,"path":118,"stem":119},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":121,"path":122,"stem":123},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":125,"path":126,"stem":127,"children":128,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,213,217],{"title":130,"path":131,"stem":132},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":134,"path":135,"stem":136},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":138,"path":139,"stem":140},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":142,"path":143,"stem":144},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":146,"path":147,"stem":148},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":150,"path":151,"stem":152},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":154,"path":155,"stem":156},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":158,"path":159,"stem":160},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":162,"path":163,"stem":164},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":166,"path":167,"stem":168},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":170,"path":171,"stem":172},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":174,"path":175,"stem":176},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":178,"path":179,"stem":180},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":182,"path":183,"stem":184},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":186,"path":187,"stem":188},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":190,"path":191,"stem":192},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":194,"path":195,"stem":196},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":198,"path":199,"stem":200},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":202,"path":203,"stem":204},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":206,"path":207,"stem":208},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":210,"path":211,"stem":212},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":214,"path":215,"stem":216},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":218,"path":219,"stem":220},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":222,"path":223,"stem":224,"children":225},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[226,227,231,235,239,243,247,251,255,259],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":232,"path":233,"stem":234},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":236,"path":237,"stem":238},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":240,"path":241,"stem":242},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":244,"path":245,"stem":246},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":248,"path":249,"stem":250},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":252,"path":253,"stem":254},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":256,"path":257,"stem":258},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":260,"path":261,"stem":262},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",[264],{"title":9,"path":66,"stem":67,"children":265,"page":53},[266,413,531,536,714,781],{"title":20,"path":22,"stem":267,"children":268},"docs\u002Fauth-h3client\u002Findex",[269,270,279,316,342,364,367,388,392],{"title":20,"path":22,"stem":267},{"title":14,"path":271,"stem":272,"children":273},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[274,275],{"title":14,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":280,"path":281,"stem":282,"children":283},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[284,285,289,293,297,301,305,308,312],{"title":280,"path":281,"stem":282},{"title":286,"path":287,"stem":288},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":290,"path":291,"stem":292},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":294,"path":295,"stem":296},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":298,"path":299,"stem":300},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":302,"path":303,"stem":304},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":306,"stem":307},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":309,"path":310,"stem":311},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":313,"path":314,"stem":315},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":317,"path":318,"stem":319,"children":320},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[321,322,326,330,334,338],{"title":317,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":327,"path":328,"stem":329},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":331,"path":332,"stem":333},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":335,"path":336,"stem":337},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":339,"path":340,"stem":341},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":343,"path":344,"stem":345,"children":346},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[347,348,352,356,360],{"title":343,"path":344,"stem":345},{"title":349,"path":350,"stem":351},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":353,"path":354,"stem":355},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":357,"path":358,"stem":359},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":361,"path":362,"stem":363},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":365,"stem":366},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":368,"path":369,"stem":370,"children":371,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[372,376,380,384],{"title":373,"path":374,"stem":375},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":377,"path":378,"stem":379},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":381,"path":382,"stem":383},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":385,"path":386,"stem":387},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":389,"path":390,"stem":391},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":393,"path":394,"stem":395,"children":396},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[397,398,402,406,410],{"title":393,"path":394,"stem":395},{"title":399,"path":400,"stem":401},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":403,"path":404,"stem":405},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":407,"path":408,"stem":409},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":70,"path":411,"stem":412},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":414,"path":35,"stem":415,"children":416},"Bot Detector","docs\u002Fbot-detection\u002Findex",[417,418,421,425,429,448,522,525,528],{"title":414,"path":35,"stem":415},{"title":14,"path":419,"stem":420},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":422,"path":423,"stem":424},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":426,"path":427,"stem":428},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":368,"path":430,"stem":431,"children":432,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[433,437,441,444],{"title":434,"path":435,"stem":436},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":438,"path":439,"stem":440},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":313,"path":442,"stem":443},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":445,"path":446,"stem":447},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":449,"path":450,"stem":451,"children":452},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[453,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518],{"title":449,"path":450,"stem":451},{"title":455,"path":456,"stem":457},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":459,"path":460,"stem":461},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":463,"path":464,"stem":465},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":467,"path":468,"stem":469},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":471,"path":472,"stem":473},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":475,"path":476,"stem":477},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":479,"path":480,"stem":481},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":483,"path":484,"stem":485},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":487,"path":488,"stem":489},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":491,"path":492,"stem":493},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":495,"path":496,"stem":497},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":499,"path":500,"stem":501},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":503,"path":504,"stem":505},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":507,"path":508,"stem":509},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":511,"path":512,"stem":513},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":515,"path":516,"stem":517},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":519,"path":520,"stem":521},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":523,"stem":524},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":393,"path":526,"stem":527},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":389,"path":529,"stem":530},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":532,"path":11,"stem":533,"children":534},"Introduction","docs\u002Fgetting-started\u002Findex",[535],{"title":532,"path":11,"stem":533},{"title":27,"path":29,"stem":537,"children":538},"docs\u002Fiam\u002Findex",[539,540,543,678,681,697,700],{"title":27,"path":29,"stem":537},{"title":14,"path":541,"stem":542},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":280,"path":544,"stem":545,"children":546},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[547,548,552,556,560,564,568,572,576,580,584,588,591,595,599,603,607,610,614,618,621,625,628],{"title":280,"path":544,"stem":545},{"title":549,"path":550,"stem":551},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":553,"path":554,"stem":555},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":557,"path":558,"stem":559},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":561,"path":562,"stem":563},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":565,"path":566,"stem":567},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":569,"path":570,"stem":571},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":573,"path":574,"stem":575},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":577,"path":578,"stem":579},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":581,"path":582,"stem":583},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":585,"path":586,"stem":587},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":317,"path":589,"stem":590},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":592,"path":593,"stem":594},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":596,"path":597,"stem":598},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":600,"path":601,"stem":602},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":604,"path":605,"stem":606},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":313,"path":608,"stem":609},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":611,"path":612,"stem":613},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":615,"path":616,"stem":617},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":309,"path":619,"stem":620},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":622,"path":623,"stem":624},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":327,"path":626,"stem":627},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":629,"path":630,"stem":631,"children":632},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[633,634,638,642,672,675],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":639,"path":640,"stem":641},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":643,"path":644,"stem":645,"children":646},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[647,648,652,656,660,664,668],{"title":643,"path":644,"stem":645},{"title":649,"path":650,"stem":651},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":653,"path":654,"stem":655},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":657,"path":658,"stem":659},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":661,"path":662,"stem":663},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":665,"path":666,"stem":667},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":669,"path":670,"stem":671},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":611,"path":673,"stem":674},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":676,"stem":677},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":679,"stem":680},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":368,"path":682,"stem":683,"children":684,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[685,689,693],{"title":686,"path":687,"stem":688},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":690,"path":691,"stem":692},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":694,"path":695,"stem":696},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":389,"path":698,"stem":699},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":701,"path":702,"stem":703,"children":704,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[705,708,711],{"title":393,"path":706,"stem":707},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":403,"path":709,"stem":710},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":399,"path":712,"stem":713},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":715,"children":716},"docs\u002Fshield-base\u002Findex",[717,718,721,725,766,770,774,778],{"title":40,"path":42,"stem":715},{"title":14,"path":719,"stem":720},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":722,"path":723,"stem":724},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":426,"path":726,"stem":727,"children":728},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[729,730,734,738,742,746,750,754,758,762],{"title":426,"path":726,"stem":727},{"title":731,"path":732,"stem":733},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":735,"path":736,"stem":737},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":739,"path":740,"stem":741},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":743,"path":744,"stem":745},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":747,"path":748,"stem":749},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":751,"path":752,"stem":753},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":755,"path":756,"stem":757},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":759,"path":760,"stem":761},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":763,"path":764,"stem":765},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":767,"path":768,"stem":769},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":771,"path":772,"stem":773},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":775,"path":776,"stem":777},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":393,"path":779,"stem":780},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":70,"path":48,"stem":71,"children":782},[783,784,789,798,823],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":785,"page":53},[786,787,788],{"title":80,"path":81,"stem":82},{"title":84,"path":85,"stem":86},{"title":88,"path":89,"stem":90},{"title":92,"path":93,"stem":94,"children":790,"page":53},[791,792,793,794,795,796,797],{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":109,"path":110,"stem":111},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127,"children":799,"page":53},[800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822],{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148},{"title":150,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":158,"path":159,"stem":160},{"title":162,"path":163,"stem":164},{"title":166,"path":167,"stem":168},{"title":170,"path":171,"stem":172},{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188},{"title":190,"path":191,"stem":192},{"title":194,"path":195,"stem":196},{"title":198,"path":199,"stem":200},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":222,"path":223,"stem":224,"children":824},[825,826,827,828,829,830,831,832,833,834],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},{"title":232,"path":233,"stem":234},{"title":236,"path":237,"stem":238},{"title":240,"path":241,"stem":242},{"title":244,"path":245,"stem":246},{"title":248,"path":249,"stem":250},{"title":252,"path":253,"stem":254},{"title":256,"path":257,"stem":258},{"title":260,"path":261,"stem":262},{"id":4,"extension":5,"links":836,"meta":847,"stem":62,"__hash__":63},[837,845,846],{"nested":8,"label":9,"icon":10,"to":11,"children":838},[839,840,841,842,843,844],{"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":849,"title":206,"body":850,"description":2608,"extension":2609,"icon":2610,"meta":2611,"module":2612,"navigation":8,"path":207,"rawbody":2613,"seo":2614,"stem":208,"__hash__":2615},"docs\u002Fdocs\u002Futils\u002Fshared\u002FrateLimiters.md",{"type":851,"value":852,"toc":2595},"minimark",[853,861,878,890,895,898,1296,1300,1306,1374,1378,1385,1449,1453,1456,1531,1535,1538,1610,1619,1623,1626,1633,1642,1645,1677,1743,1746,1884,1890,1898,1901,1931,1995,1998,2119,2125,2130,2133,2163,2227,2230,2346,2350,2360,2567,2570,2573,2591],[854,855,856,857,860],"p",{},"The ",[858,859,206],"code",{}," module provides three lightweight, in-memory rate limiting\nfunctions for per-process traffic control. Each factory accepts cache\nconfiguration once and returns a synchronous limiter function that evaluates a\nstring key such as an IP address, user ID, API key, or composite identifier.",[854,862,863,864,869,870,873,874,877],{},"All three functions store state in\n",[865,866,867],"a",{"href":187},[858,868,186],{},", so idle keys expire\nautomatically. The returned limiter resolves to ",[858,871,872],{},"true"," when the request is\naccepted and ",[858,875,876],{},"false"," when the current request exceeds the configured limit.",[879,880,883],"callout",{"color":881,"icon":882},"warning","i-lucide-alert-triangle",[854,884,885,886,889],{},"These limiters keep all state in local memory. They do not synchronize across\nmultiple Node.js processes, containers, or regions, and they do not generate\nHTTP headers such as ",[858,887,888],{},"Retry-After",".",[891,892,894],"h2",{"id":893},"definition","Definition",[854,896,897],{},"The module exports three factory functions and a small set of interfaces that\ndescribe the cache payload used by each strategy.",[899,900,906],"pre",{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},"language-ts shiki shiki-themes light-plus light-plus dracula","export interface Entry {\n  count: number\n  windowStart: number\n}\n\nexport interface RateEntry {\n  timestamps: number[]\n}\n\nexport interface CounterEntry {\n  currentBucket: number\n  previousBucket: number\n  bucketStart: number\n}\n\nexport interface CacheConfig {\n  maxEntries?: number\n  sweepIntervalMs?: number\n}\n\nexport function fixedWindowRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n\nexport function slidingWindowRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n\nexport function slidingWindowCounterRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n","rateLimiters.ts","ts","",[858,907,908,929,943,953,959,965,977,991,996,1001,1013,1023,1033,1043,1048,1053,1065,1076,1086,1091,1096,1111,1123,1170,1175,1187,1196,1233,1238,1250,1259],{"__ignoreMap":905},[909,910,913,917,921,925],"span",{"class":911,"line":912},"line",1,[909,914,916],{"class":915},"sZ328","export",[909,918,920],{"class":919},"sl46w"," interface",[909,922,924],{"class":923},"sFs1U"," Entry",[909,926,928],{"class":927},"sDd4n"," {\n",[909,930,932,936,940],{"class":911,"line":931},2,[909,933,935],{"class":934},"sjsA6","  count",[909,937,939],{"class":938},"saOXh",":",[909,941,942],{"class":923}," number\n",[909,944,946,949,951],{"class":911,"line":945},3,[909,947,948],{"class":934},"  windowStart",[909,950,939],{"class":938},[909,952,942],{"class":923},[909,954,956],{"class":911,"line":955},4,[909,957,958],{"class":927},"}\n",[909,960,962],{"class":911,"line":961},5,[909,963,964],{"emptyLinePlaceholder":8},"\n",[909,966,968,970,972,975],{"class":911,"line":967},6,[909,969,916],{"class":915},[909,971,920],{"class":919},[909,973,974],{"class":923}," RateEntry",[909,976,928],{"class":927},[909,978,980,983,985,988],{"class":911,"line":979},7,[909,981,982],{"class":934},"  timestamps",[909,984,939],{"class":938},[909,986,987],{"class":923}," number",[909,989,990],{"class":927},"[]\n",[909,992,994],{"class":911,"line":993},8,[909,995,958],{"class":927},[909,997,999],{"class":911,"line":998},9,[909,1000,964],{"emptyLinePlaceholder":8},[909,1002,1004,1006,1008,1011],{"class":911,"line":1003},10,[909,1005,916],{"class":915},[909,1007,920],{"class":919},[909,1009,1010],{"class":923}," CounterEntry",[909,1012,928],{"class":927},[909,1014,1016,1019,1021],{"class":911,"line":1015},11,[909,1017,1018],{"class":934},"  currentBucket",[909,1020,939],{"class":938},[909,1022,942],{"class":923},[909,1024,1026,1029,1031],{"class":911,"line":1025},12,[909,1027,1028],{"class":934},"  previousBucket",[909,1030,939],{"class":938},[909,1032,942],{"class":923},[909,1034,1036,1039,1041],{"class":911,"line":1035},13,[909,1037,1038],{"class":934},"  bucketStart",[909,1040,939],{"class":938},[909,1042,942],{"class":923},[909,1044,1046],{"class":911,"line":1045},14,[909,1047,958],{"class":927},[909,1049,1051],{"class":911,"line":1050},15,[909,1052,964],{"emptyLinePlaceholder":8},[909,1054,1056,1058,1060,1063],{"class":911,"line":1055},16,[909,1057,916],{"class":915},[909,1059,920],{"class":919},[909,1061,1062],{"class":923}," CacheConfig",[909,1064,928],{"class":927},[909,1066,1068,1071,1074],{"class":911,"line":1067},17,[909,1069,1070],{"class":934},"  maxEntries",[909,1072,1073],{"class":938},"?:",[909,1075,942],{"class":923},[909,1077,1079,1082,1084],{"class":911,"line":1078},18,[909,1080,1081],{"class":934},"  sweepIntervalMs",[909,1083,1073],{"class":938},[909,1085,942],{"class":923},[909,1087,1089],{"class":911,"line":1088},19,[909,1090,958],{"class":927},[909,1092,1094],{"class":911,"line":1093},20,[909,1095,964],{"emptyLinePlaceholder":8},[909,1097,1099,1101,1104,1108],{"class":911,"line":1098},21,[909,1100,916],{"class":915},[909,1102,1103],{"class":919}," function",[909,1105,1107],{"class":1106},"sHOzp"," fixedWindowRateLimiter",[909,1109,1110],{"class":927},"(\n",[909,1112,1114,1118,1120],{"class":911,"line":1113},22,[909,1115,1117],{"class":1116},"sygFZ","  cache",[909,1119,939],{"class":938},[909,1121,1122],{"class":923}," CacheConfig\n",[909,1124,1126,1129,1131,1134,1137,1139,1142,1145,1148,1150,1152,1154,1157,1159,1161,1164,1167],{"class":911,"line":1125},23,[909,1127,1128],{"class":927},")",[909,1130,939],{"class":938},[909,1132,1133],{"class":927}," (",[909,1135,1136],{"class":1116},"key",[909,1138,939],{"class":938},[909,1140,1141],{"class":923}," string",[909,1143,1144],{"class":927},", ",[909,1146,1147],{"class":1116},"limit",[909,1149,1073],{"class":938},[909,1151,987],{"class":923},[909,1153,1144],{"class":927},[909,1155,1156],{"class":1116},"windowMs",[909,1158,1073],{"class":938},[909,1160,987],{"class":923},[909,1162,1163],{"class":927},") ",[909,1165,1166],{"class":919},"=>",[909,1168,1169],{"class":923}," boolean\n",[909,1171,1173],{"class":911,"line":1172},24,[909,1174,964],{"emptyLinePlaceholder":8},[909,1176,1178,1180,1182,1185],{"class":911,"line":1177},25,[909,1179,916],{"class":915},[909,1181,1103],{"class":919},[909,1183,1184],{"class":1106}," slidingWindowRateLimiter",[909,1186,1110],{"class":927},[909,1188,1190,1192,1194],{"class":911,"line":1189},26,[909,1191,1117],{"class":1116},[909,1193,939],{"class":938},[909,1195,1122],{"class":923},[909,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231],{"class":911,"line":1198},27,[909,1200,1128],{"class":927},[909,1202,939],{"class":938},[909,1204,1133],{"class":927},[909,1206,1136],{"class":1116},[909,1208,939],{"class":938},[909,1210,1141],{"class":923},[909,1212,1144],{"class":927},[909,1214,1147],{"class":1116},[909,1216,1073],{"class":938},[909,1218,987],{"class":923},[909,1220,1144],{"class":927},[909,1222,1156],{"class":1116},[909,1224,1073],{"class":938},[909,1226,987],{"class":923},[909,1228,1163],{"class":927},[909,1230,1166],{"class":919},[909,1232,1169],{"class":923},[909,1234,1236],{"class":911,"line":1235},28,[909,1237,964],{"emptyLinePlaceholder":8},[909,1239,1241,1243,1245,1248],{"class":911,"line":1240},29,[909,1242,916],{"class":915},[909,1244,1103],{"class":919},[909,1246,1247],{"class":1106}," slidingWindowCounterRateLimiter",[909,1249,1110],{"class":927},[909,1251,1253,1255,1257],{"class":911,"line":1252},30,[909,1254,1117],{"class":1116},[909,1256,939],{"class":938},[909,1258,1122],{"class":923},[909,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294],{"class":911,"line":1261},31,[909,1263,1128],{"class":927},[909,1265,939],{"class":938},[909,1267,1133],{"class":927},[909,1269,1136],{"class":1116},[909,1271,939],{"class":938},[909,1273,1141],{"class":923},[909,1275,1144],{"class":927},[909,1277,1147],{"class":1116},[909,1279,1073],{"class":938},[909,1281,987],{"class":923},[909,1283,1144],{"class":927},[909,1285,1156],{"class":1116},[909,1287,1073],{"class":938},[909,1289,987],{"class":923},[909,1291,1163],{"class":927},[909,1293,1166],{"class":919},[909,1295,1169],{"class":923},[891,1297,1299],{"id":1298},"state-interfaces","State interfaces",[854,1301,1302,1303,1305],{},"The exported interfaces are the internal shapes stored in ",[858,1304,186],{},". You do\nnot need them for everyday use, but they explain how each algorithm tracks\nrecent traffic.",[1307,1308,1309,1325],"table",{},[1310,1311,1312],"thead",{},[1313,1314,1315,1319,1322],"tr",{},[1316,1317,1318],"th",{},"Interface",[1316,1320,1321],{},"Used by",[1316,1323,1324],{},"Description",[1326,1327,1328,1344,1359],"tbody",{},[1313,1329,1330,1336,1341],{},[1331,1332,1333],"td",{},[858,1334,1335],{},"Entry",[1331,1337,1338],{},[858,1339,1340],{},"fixedWindowRateLimiter",[1331,1342,1343],{},"Stores the accepted request count and the timestamp where the active fixed window started.",[1313,1345,1346,1351,1356],{},[1331,1347,1348],{},[858,1349,1350],{},"RateEntry",[1331,1352,1353],{},[858,1354,1355],{},"slidingWindowRateLimiter",[1331,1357,1358],{},"Stores every accepted request timestamp that still belongs to the active rolling window.",[1313,1360,1361,1366,1371],{},[1331,1362,1363],{},[858,1364,1365],{},"CounterEntry",[1331,1367,1368],{},[858,1369,1370],{},"slidingWindowCounterRateLimiter",[1331,1372,1373],{},"Stores the current bucket count, the previous bucket count, and the start time of the current bucket.",[891,1375,1377],{"id":1376},"shared-configuration","Shared configuration",[854,1379,1380,1381,1384],{},"Each factory accepts the same ",[858,1382,1383],{},"CacheConfig"," object. These options control only\nhow limiter state is stored and cleaned up in memory.",[1307,1386,1387,1402],{},[1310,1388,1389],{},[1313,1390,1391,1394,1397,1400],{},[1316,1392,1393],{},"Option",[1316,1395,1396],{},"Type",[1316,1398,1399],{},"Default",[1316,1401,1324],{},[1326,1403,1404,1427],{},[1313,1405,1406,1411,1416,1421],{},[1331,1407,1408],{},[858,1409,1410],{},"maxEntries",[1331,1412,1413],{},[858,1414,1415],{},"number",[1331,1417,1418],{},[858,1419,1420],{},"Infinity",[1331,1422,1423,1424,1426],{},"Maximum number of active keys kept in memory. When this limit is reached, ",[858,1425,186],{}," evicts the oldest key and that key starts fresh on its next request.",[1313,1428,1429,1434,1438,1443],{},[1331,1430,1431],{},[858,1432,1433],{},"sweepIntervalMs",[1331,1435,1436],{},[858,1437,1415],{},[1331,1439,1440],{},[858,1441,1442],{},"60000",[1331,1444,1445,1446,1448],{},"Interval in milliseconds used by ",[858,1447,186],{}," to remove expired keys in the background. Access-time checks still enforce expiry even if the sweep has not run yet.",[891,1450,1452],{"id":1451},"choosing-a-strategy","Choosing a strategy",[854,1454,1455],{},"The three factories share the same public signature, but they trade accuracy,\nmemory use, and burst handling differently.",[1307,1457,1458,1477],{},[1310,1459,1460],{},[1313,1461,1462,1465,1468,1471,1474],{},[1316,1463,1464],{},"Strategy",[1316,1466,1467],{},"Accuracy",[1316,1469,1470],{},"Memory per key",[1316,1472,1473],{},"Best for",[1316,1475,1476],{},"Tradeoff",[1326,1478,1479,1496,1513],{},[1313,1480,1481,1485,1488,1490,1493],{},[1331,1482,1483],{},[858,1484,1340],{},[1331,1486,1487],{},"Lowest",[1331,1489,1487],{},[1331,1491,1492],{},"Simple IP throttling and coarse route protection",[1331,1494,1495],{},"Boundary bursts can pass at the end of one window and the start of the next.",[1313,1497,1498,1502,1505,1507,1510],{},[1331,1499,1500],{},[858,1501,1355],{},[1331,1503,1504],{},"Highest",[1331,1506,1504],{},[1331,1508,1509],{},"Sensitive endpoints such as login, reset, or verification routes",[1331,1511,1512],{},"Stores every accepted timestamp for the active window.",[1313,1514,1515,1519,1522,1525,1528],{},[1331,1516,1517],{},[858,1518,1370],{},[1331,1520,1521],{},"High, approximate",[1331,1523,1524],{},"Low",[1331,1526,1527],{},"High-throughput APIs where timestamp arrays are too expensive",[1331,1529,1530],{},"Uses weighted buckets, so the count is an approximation.",[891,1532,1534],{"id":1533},"returned-limiter-function","Returned limiter function",[854,1536,1537],{},"Each factory returns the same limiter signature. The function is synchronous, so\nyou can call it directly inside middleware, route handlers, or in-memory\nguards.",[1307,1539,1540,1554],{},[1310,1541,1542],{},[1313,1543,1544,1547,1549,1552],{},[1316,1545,1546],{},"Parameter",[1316,1548,1396],{},[1316,1550,1551],{},"Required",[1316,1553,1324],{},[1326,1555,1556,1573,1592],{},[1313,1557,1558,1562,1567,1570],{},[1331,1559,1560],{},[858,1561,1136],{},[1331,1563,1564],{},[858,1565,1566],{},"string",[1331,1568,1569],{},"Yes",[1331,1571,1572],{},"Unique identity to limit, such as an IP address, user ID, session ID, API key, or composite key.",[1313,1574,1575,1579,1583,1586],{},[1331,1576,1577],{},[858,1578,1147],{},[1331,1580,1581],{},[858,1582,1415],{},[1331,1584,1585],{},"No",[1331,1587,1588,1589,889],{},"Maximum number of accepted requests inside the active window. Defaults to ",[858,1590,1591],{},"50",[1313,1593,1594,1598,1602,1604],{},[1331,1595,1596],{},[858,1597,1156],{},[1331,1599,1600],{},[858,1601,1415],{},[1331,1603,1585],{},[1331,1605,1606,1607,889],{},"Window size in milliseconds. Defaults to ",[858,1608,1609],{},"1000",[854,1611,1612,1613,1615,1616,1618],{},"The returned function resolves immediately to ",[858,1614,872],{}," when the request is\naccepted, or ",[858,1617,876],{}," when the request must be rejected.",[891,1620,1622],{"id":1621},"methods","Methods",[854,1624,1625],{},"The following factory functions differ only in how they count recent traffic for\neach key.",[1627,1628,1630],"h3",{"id":1629},"fixedwindowratelimitercache",[858,1631,1632],{},"fixedWindowRateLimiter(cache)",[854,1634,1635,1637,1638,1641],{},[858,1636,1340],{}," stores a single counter and a ",[858,1639,1640],{},"windowStart"," timestamp\nper key. The window is anchored to the first accepted request for that key, and\nthe counter resets when the full window duration has elapsed.",[854,1643,1644],{},"This is the lightest strategy in memory and CPU cost. It works well for coarse\nprotection, but it can admit bursts around a window boundary.",[1307,1646,1647,1659],{},[1310,1648,1649],{},[1313,1650,1651,1653,1655,1657],{},[1316,1652,1546],{},[1316,1654,1396],{},[1316,1656,1551],{},[1316,1658,1324],{},[1326,1660,1661],{},[1313,1662,1663,1668,1672,1674],{},[1331,1664,1665],{},[858,1666,1667],{},"cache",[1331,1669,1670],{},[858,1671,1383],{},[1331,1673,1569],{},[1331,1675,1676],{},"Cache settings for limiter state. See the shared configuration table above.",[1307,1678,1679,1692],{},[1310,1680,1681],{},[1313,1682,1683,1686,1688,1690],{},[1316,1684,1685],{},"Returned limiter parameter",[1316,1687,1396],{},[1316,1689,1551],{},[1316,1691,1324],{},[1326,1693,1694,1709,1726],{},[1313,1695,1696,1700,1704,1706],{},[1331,1697,1698],{},[858,1699,1136],{},[1331,1701,1702],{},[858,1703,1566],{},[1331,1705,1569],{},[1331,1707,1708],{},"Unique subject to track.",[1313,1710,1711,1715,1719,1721],{},[1331,1712,1713],{},[858,1714,1147],{},[1331,1716,1717],{},[858,1718,1415],{},[1331,1720,1585],{},[1331,1722,1723,1724,889],{},"Maximum accepted requests for the current fixed window. Defaults to ",[858,1725,1591],{},[1313,1727,1728,1732,1736,1738],{},[1331,1729,1730],{},[858,1731,1156],{},[1331,1733,1734],{},[858,1735,1415],{},[1331,1737,1585],{},[1331,1739,1740,1741,889],{},"Fixed window duration in milliseconds. Defaults to ",[858,1742,1609],{},[854,1744,1745],{},"Use this strategy when you need fast, predictable protection with minimal\noverhead, such as basic per-IP throttling on a public route.",[899,1747,1750],{"className":901,"code":1748,"filename":1749,"language":904,"meta":905,"style":905},"import { fixedWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitLoginAttempts = fixedWindowRateLimiter({\n  maxEntries: 50_000,\n  sweepIntervalMs: 30_000,\n})\n\nexport function canAttemptLogin(ip: string) {\n  return limitLoginAttempts(ip, 5, 60_000)\n}\n","loginLimiter.ts",[858,1751,1752,1779,1783,1800,1814,1825,1830,1834,1856,1880],{"__ignoreMap":905},[909,1753,1754,1757,1760,1762,1765,1768,1772,1776],{"class":911,"line":912},[909,1755,1756],{"class":915},"import",[909,1758,1759],{"class":927}," { ",[909,1761,1340],{"class":934},[909,1763,1764],{"class":927}," } ",[909,1766,1767],{"class":915},"from",[909,1769,1771],{"class":1770},"sFkSl"," '",[909,1773,1775],{"class":1774},"sFB1V","@riavzon\u002Futils",[909,1777,1778],{"class":1770},"'\n",[909,1780,1781],{"class":911,"line":931},[909,1782,964],{"emptyLinePlaceholder":8},[909,1784,1785,1788,1792,1795,1797],{"class":911,"line":945},[909,1786,1787],{"class":919},"const",[909,1789,1791],{"class":1790},"s3JHE"," limitLoginAttempts",[909,1793,1794],{"class":938}," =",[909,1796,1107],{"class":1106},[909,1798,1799],{"class":927},"({\n",[909,1801,1802,1804,1807,1811],{"class":911,"line":955},[909,1803,1070],{"class":934},[909,1805,939],{"class":1806},"s34zl",[909,1808,1810],{"class":1809},"spgvN"," 50_000",[909,1812,1813],{"class":927},",\n",[909,1815,1816,1818,1820,1823],{"class":911,"line":961},[909,1817,1081],{"class":934},[909,1819,939],{"class":1806},[909,1821,1822],{"class":1809}," 30_000",[909,1824,1813],{"class":927},[909,1826,1827],{"class":911,"line":967},[909,1828,1829],{"class":927},"})\n",[909,1831,1832],{"class":911,"line":979},[909,1833,964],{"emptyLinePlaceholder":8},[909,1835,1836,1838,1840,1843,1846,1849,1851,1853],{"class":911,"line":993},[909,1837,916],{"class":915},[909,1839,1103],{"class":919},[909,1841,1842],{"class":1106}," canAttemptLogin",[909,1844,1845],{"class":927},"(",[909,1847,1848],{"class":1116},"ip",[909,1850,939],{"class":938},[909,1852,1141],{"class":923},[909,1854,1855],{"class":927},") {\n",[909,1857,1858,1861,1863,1865,1867,1869,1872,1874,1877],{"class":911,"line":998},[909,1859,1860],{"class":915},"  return",[909,1862,1791],{"class":1106},[909,1864,1845],{"class":927},[909,1866,1848],{"class":934},[909,1868,1144],{"class":927},[909,1870,1871],{"class":1809},"5",[909,1873,1144],{"class":927},[909,1875,1876],{"class":1809},"60_000",[909,1878,1879],{"class":927},")\n",[909,1881,1882],{"class":911,"line":1003},[909,1883,958],{"class":927},[1627,1885,1887],{"id":1886},"slidingwindowratelimitercache",[858,1888,1889],{},"slidingWindowRateLimiter(cache)",[854,1891,1892,1894,1895,1897],{},[858,1893,1355],{}," stores an array of accepted timestamps for each key.\nOn every request, it removes timestamps older than ",[858,1896,1156],{},", counts the\nremaining timestamps, and accepts or rejects the request from that rolling set.",[854,1899,1900],{},"This strategy gives the most accurate rolling-window behavior. It smooths out\nboundary bursts, but it uses more memory because every accepted request adds a\ntimestamp to the active window.",[1307,1902,1903,1915],{},[1310,1904,1905],{},[1313,1906,1907,1909,1911,1913],{},[1316,1908,1546],{},[1316,1910,1396],{},[1316,1912,1551],{},[1316,1914,1324],{},[1326,1916,1917],{},[1313,1918,1919,1923,1927,1929],{},[1331,1920,1921],{},[858,1922,1667],{},[1331,1924,1925],{},[858,1926,1383],{},[1331,1928,1569],{},[1331,1930,1676],{},[1307,1932,1933,1945],{},[1310,1934,1935],{},[1313,1936,1937,1939,1941,1943],{},[1316,1938,1685],{},[1316,1940,1396],{},[1316,1942,1551],{},[1316,1944,1324],{},[1326,1946,1947,1961,1978],{},[1313,1948,1949,1953,1957,1959],{},[1331,1950,1951],{},[858,1952,1136],{},[1331,1954,1955],{},[858,1956,1566],{},[1331,1958,1569],{},[1331,1960,1708],{},[1313,1962,1963,1967,1971,1973],{},[1331,1964,1965],{},[858,1966,1147],{},[1331,1968,1969],{},[858,1970,1415],{},[1331,1972,1585],{},[1331,1974,1975,1976,889],{},"Maximum accepted requests inside the rolling window. Defaults to ",[858,1977,1591],{},[1313,1979,1980,1984,1988,1990],{},[1331,1981,1982],{},[858,1983,1156],{},[1331,1985,1986],{},[858,1987,1415],{},[1331,1989,1585],{},[1331,1991,1992,1993,889],{},"Sliding window size in milliseconds. Defaults to ",[858,1994,1609],{},[854,1996,1997],{},"Use this strategy for endpoints where fairness matters more than raw\nthroughput, such as login, password reset, or OTP verification flows.",[899,1999,2002],{"className":901,"code":2000,"filename":2001,"language":904,"meta":905,"style":905},"import { slidingWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitPasswordReset = slidingWindowRateLimiter({\n  maxEntries: 100_000,\n  sweepIntervalMs: 60_000,\n})\n\nexport function canSendResetEmail(key: string) {\n  return limitPasswordReset(key, 3, 15 * 60_000)\n}\n","passwordResetLimiter.ts",[858,2003,2004,2022,2026,2039,2050,2061,2065,2069,2088,2115],{"__ignoreMap":905},[909,2005,2006,2008,2010,2012,2014,2016,2018,2020],{"class":911,"line":912},[909,2007,1756],{"class":915},[909,2009,1759],{"class":927},[909,2011,1355],{"class":934},[909,2013,1764],{"class":927},[909,2015,1767],{"class":915},[909,2017,1771],{"class":1770},[909,2019,1775],{"class":1774},[909,2021,1778],{"class":1770},[909,2023,2024],{"class":911,"line":931},[909,2025,964],{"emptyLinePlaceholder":8},[909,2027,2028,2030,2033,2035,2037],{"class":911,"line":945},[909,2029,1787],{"class":919},[909,2031,2032],{"class":1790}," limitPasswordReset",[909,2034,1794],{"class":938},[909,2036,1184],{"class":1106},[909,2038,1799],{"class":927},[909,2040,2041,2043,2045,2048],{"class":911,"line":955},[909,2042,1070],{"class":934},[909,2044,939],{"class":1806},[909,2046,2047],{"class":1809}," 100_000",[909,2049,1813],{"class":927},[909,2051,2052,2054,2056,2059],{"class":911,"line":961},[909,2053,1081],{"class":934},[909,2055,939],{"class":1806},[909,2057,2058],{"class":1809}," 60_000",[909,2060,1813],{"class":927},[909,2062,2063],{"class":911,"line":967},[909,2064,1829],{"class":927},[909,2066,2067],{"class":911,"line":979},[909,2068,964],{"emptyLinePlaceholder":8},[909,2070,2071,2073,2075,2078,2080,2082,2084,2086],{"class":911,"line":993},[909,2072,916],{"class":915},[909,2074,1103],{"class":919},[909,2076,2077],{"class":1106}," canSendResetEmail",[909,2079,1845],{"class":927},[909,2081,1136],{"class":1116},[909,2083,939],{"class":938},[909,2085,1141],{"class":923},[909,2087,1855],{"class":927},[909,2089,2090,2092,2094,2096,2098,2100,2103,2105,2108,2111,2113],{"class":911,"line":998},[909,2091,1860],{"class":915},[909,2093,2032],{"class":1106},[909,2095,1845],{"class":927},[909,2097,1136],{"class":934},[909,2099,1144],{"class":927},[909,2101,2102],{"class":1809},"3",[909,2104,1144],{"class":927},[909,2106,2107],{"class":1809},"15",[909,2109,2110],{"class":938}," *",[909,2112,2058],{"class":1809},[909,2114,1879],{"class":927},[909,2116,2117],{"class":911,"line":1003},[909,2118,958],{"class":927},[1627,2120,2122],{"id":2121},"slidingwindowcounterratelimitercache",[858,2123,2124],{},"slidingWindowCounterRateLimiter(cache)",[854,2126,2127,2129],{},[858,2128,1370],{}," stores only the current bucket count, the\nprevious bucket count, and the current bucket start time. It estimates the\neffective request count by weighting the previous bucket according to how far\nthe current time has progressed through the active window.",[854,2131,2132],{},"This strategy is a good balance between accuracy and memory use. It avoids the\ntimestamp array used by a full sliding window while still reducing the sharp\nboundary effects of a fixed window.",[1307,2134,2135,2147],{},[1310,2136,2137],{},[1313,2138,2139,2141,2143,2145],{},[1316,2140,1546],{},[1316,2142,1396],{},[1316,2144,1551],{},[1316,2146,1324],{},[1326,2148,2149],{},[1313,2150,2151,2155,2159,2161],{},[1331,2152,2153],{},[858,2154,1667],{},[1331,2156,2157],{},[858,2158,1383],{},[1331,2160,1569],{},[1331,2162,1676],{},[1307,2164,2165,2177],{},[1310,2166,2167],{},[1313,2168,2169,2171,2173,2175],{},[1316,2170,1685],{},[1316,2172,1396],{},[1316,2174,1551],{},[1316,2176,1324],{},[1326,2178,2179,2193,2210],{},[1313,2180,2181,2185,2189,2191],{},[1331,2182,2183],{},[858,2184,1136],{},[1331,2186,2187],{},[858,2188,1566],{},[1331,2190,1569],{},[1331,2192,1708],{},[1313,2194,2195,2199,2203,2205],{},[1331,2196,2197],{},[858,2198,1147],{},[1331,2200,2201],{},[858,2202,1415],{},[1331,2204,1585],{},[1331,2206,2207,2208,889],{},"Maximum estimated requests inside the weighted window. Defaults to ",[858,2209,1591],{},[1313,2211,2212,2216,2220,2222],{},[1331,2213,2214],{},[858,2215,1156],{},[1331,2217,2218],{},[858,2219,1415],{},[1331,2221,1585],{},[1331,2223,2224,2225,889],{},"Bucket size and effective window size in milliseconds. Defaults to ",[858,2226,1609],{},[854,2228,2229],{},"Use this strategy for high-volume APIs where you need smoother throttling than a\nfixed window, but storing every timestamp would create too much overhead.",[899,2231,2234],{"className":901,"code":2232,"filename":2233,"language":904,"meta":905,"style":905},"import { slidingWindowCounterRateLimiter } from '@riavzon\u002Futils'\n\nconst limitApiKey = slidingWindowCounterRateLimiter({\n  maxEntries: 200_000,\n  sweepIntervalMs: 10_000,\n})\n\nexport function canCallApi(apiKey: string) {\n  return limitApiKey(apiKey, 100, 60_000)\n}\n","apiKeyLimiter.ts",[858,2235,2236,2254,2258,2271,2282,2293,2297,2301,2321,2342],{"__ignoreMap":905},[909,2237,2238,2240,2242,2244,2246,2248,2250,2252],{"class":911,"line":912},[909,2239,1756],{"class":915},[909,2241,1759],{"class":927},[909,2243,1370],{"class":934},[909,2245,1764],{"class":927},[909,2247,1767],{"class":915},[909,2249,1771],{"class":1770},[909,2251,1775],{"class":1774},[909,2253,1778],{"class":1770},[909,2255,2256],{"class":911,"line":931},[909,2257,964],{"emptyLinePlaceholder":8},[909,2259,2260,2262,2265,2267,2269],{"class":911,"line":945},[909,2261,1787],{"class":919},[909,2263,2264],{"class":1790}," limitApiKey",[909,2266,1794],{"class":938},[909,2268,1247],{"class":1106},[909,2270,1799],{"class":927},[909,2272,2273,2275,2277,2280],{"class":911,"line":955},[909,2274,1070],{"class":934},[909,2276,939],{"class":1806},[909,2278,2279],{"class":1809}," 200_000",[909,2281,1813],{"class":927},[909,2283,2284,2286,2288,2291],{"class":911,"line":961},[909,2285,1081],{"class":934},[909,2287,939],{"class":1806},[909,2289,2290],{"class":1809}," 10_000",[909,2292,1813],{"class":927},[909,2294,2295],{"class":911,"line":967},[909,2296,1829],{"class":927},[909,2298,2299],{"class":911,"line":979},[909,2300,964],{"emptyLinePlaceholder":8},[909,2302,2303,2305,2307,2310,2312,2315,2317,2319],{"class":911,"line":993},[909,2304,916],{"class":915},[909,2306,1103],{"class":919},[909,2308,2309],{"class":1106}," canCallApi",[909,2311,1845],{"class":927},[909,2313,2314],{"class":1116},"apiKey",[909,2316,939],{"class":938},[909,2318,1141],{"class":923},[909,2320,1855],{"class":927},[909,2322,2323,2325,2327,2329,2331,2333,2336,2338,2340],{"class":911,"line":998},[909,2324,1860],{"class":915},[909,2326,2264],{"class":1106},[909,2328,1845],{"class":927},[909,2330,2314],{"class":934},[909,2332,1144],{"class":927},[909,2334,2335],{"class":1809},"100",[909,2337,1144],{"class":927},[909,2339,1876],{"class":1809},[909,2341,1879],{"class":927},[909,2343,2344],{"class":911,"line":1003},[909,2345,958],{"class":927},[891,2347,2349],{"id":2348},"example-usage","Example usage",[854,2351,2352,2353,2355,2356,2359],{},"In a typical HTTP handler, call the limiter before you perform the expensive or\nsecurity-sensitive work. If the limiter returns ",[858,2354,876],{},", return a ",[858,2357,2358],{},"429"," response\nimmediately.",[899,2361,2364],{"className":901,"code":2362,"filename":2363,"language":904,"meta":905,"style":905},"import { fixedWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitRequests = fixedWindowRateLimiter({ maxEntries: 25_000 })\n\nexport async function handleRequest(req: Request, ip: string) {\n  if (!limitRequests(ip, 20, 60_000)) {\n    return new Response('Too Many Requests', { status: 429 })\n  }\n\n  return new Response(JSON.stringify({ ok: true }), { status: 200 })\n}\n","serverHandler.ts",[858,2365,2366,2384,2388,2412,2416,2448,2477,2512,2517,2521,2563],{"__ignoreMap":905},[909,2367,2368,2370,2372,2374,2376,2378,2380,2382],{"class":911,"line":912},[909,2369,1756],{"class":915},[909,2371,1759],{"class":927},[909,2373,1340],{"class":934},[909,2375,1764],{"class":927},[909,2377,1767],{"class":915},[909,2379,1771],{"class":1770},[909,2381,1775],{"class":1774},[909,2383,1778],{"class":1770},[909,2385,2386],{"class":911,"line":931},[909,2387,964],{"emptyLinePlaceholder":8},[909,2389,2390,2392,2395,2397,2399,2402,2404,2406,2409],{"class":911,"line":945},[909,2391,1787],{"class":919},[909,2393,2394],{"class":1790}," limitRequests",[909,2396,1794],{"class":938},[909,2398,1107],{"class":1106},[909,2400,2401],{"class":927},"({ ",[909,2403,1410],{"class":934},[909,2405,939],{"class":1806},[909,2407,2408],{"class":1809}," 25_000",[909,2410,2411],{"class":927}," })\n",[909,2413,2414],{"class":911,"line":955},[909,2415,964],{"emptyLinePlaceholder":8},[909,2417,2418,2420,2423,2425,2428,2430,2433,2435,2438,2440,2442,2444,2446],{"class":911,"line":961},[909,2419,916],{"class":915},[909,2421,2422],{"class":919}," async",[909,2424,1103],{"class":919},[909,2426,2427],{"class":1106}," handleRequest",[909,2429,1845],{"class":927},[909,2431,2432],{"class":1116},"req",[909,2434,939],{"class":938},[909,2436,2437],{"class":923}," Request",[909,2439,1144],{"class":927},[909,2441,1848],{"class":1116},[909,2443,939],{"class":938},[909,2445,1141],{"class":923},[909,2447,1855],{"class":927},[909,2449,2450,2453,2455,2458,2461,2463,2465,2467,2470,2472,2474],{"class":911,"line":967},[909,2451,2452],{"class":915},"  if",[909,2454,1133],{"class":927},[909,2456,2457],{"class":938},"!",[909,2459,2460],{"class":1106},"limitRequests",[909,2462,1845],{"class":927},[909,2464,1848],{"class":934},[909,2466,1144],{"class":927},[909,2468,2469],{"class":1809},"20",[909,2471,1144],{"class":927},[909,2473,1876],{"class":1809},[909,2475,2476],{"class":927},")) {\n",[909,2478,2479,2482,2486,2489,2491,2494,2497,2499,2502,2505,2507,2510],{"class":911,"line":979},[909,2480,2481],{"class":915},"    return",[909,2483,2485],{"class":2484},"sakC6"," new",[909,2487,2488],{"class":1106}," Response",[909,2490,1845],{"class":927},[909,2492,2493],{"class":1770},"'",[909,2495,2496],{"class":1774},"Too Many Requests",[909,2498,2493],{"class":1770},[909,2500,2501],{"class":927},", { ",[909,2503,2504],{"class":934},"status",[909,2506,939],{"class":1806},[909,2508,2509],{"class":1809}," 429",[909,2511,2411],{"class":927},[909,2513,2514],{"class":911,"line":993},[909,2515,2516],{"class":927},"  }\n",[909,2518,2519],{"class":911,"line":998},[909,2520,964],{"emptyLinePlaceholder":8},[909,2522,2523,2525,2527,2529,2531,2535,2537,2540,2542,2545,2547,2551,2554,2556,2558,2561],{"class":911,"line":1003},[909,2524,1860],{"class":915},[909,2526,2485],{"class":2484},[909,2528,2488],{"class":1106},[909,2530,1845],{"class":927},[909,2532,2534],{"class":2533},"sPzPf","JSON",[909,2536,889],{"class":927},[909,2538,2539],{"class":1106},"stringify",[909,2541,2401],{"class":927},[909,2543,2544],{"class":934},"ok",[909,2546,939],{"class":1806},[909,2548,2550],{"class":2549},"sjR7W"," true",[909,2552,2553],{"class":927}," }), { ",[909,2555,2504],{"class":934},[909,2557,939],{"class":1806},[909,2559,2560],{"class":1809}," 200",[909,2562,2411],{"class":927},[909,2564,2565],{"class":911,"line":1015},[909,2566,958],{"class":927},[2568,2569],"hr",{},[854,2571,2572],{},"These rate limiters are often used with other shared utilities in the package.\nThe following pages explain the closest related building blocks.",[2574,2575,2576,2583],"ul",{},[2577,2578,2579,2580,2582],"li",{},"See ",[865,2581,186],{"href":187}," for the TTL and eviction\nbehavior that backs these limiters.",[2577,2584,2579,2585,2587,2588,2590],{},[865,2586,158],{"href":159}," if you also need\nclient-side backoff and retry behavior after a ",[858,2589,2358],{}," response.",[2592,2593,2594],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}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 .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--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 .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}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 .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 .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--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 .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}html pre.shiki code .sPzPf, html code.shiki .sPzPf{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#BD93F9}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}",{"title":905,"searchDepth":931,"depth":931,"links":2596},[2597,2598,2599,2600,2601,2602,2607],{"id":893,"depth":931,"text":894},{"id":1298,"depth":931,"text":1299},{"id":1376,"depth":931,"text":1377},{"id":1451,"depth":931,"text":1452},{"id":1533,"depth":931,"text":1534},{"id":1621,"depth":931,"text":1622,"children":2603},[2604,2605,2606],{"id":1629,"depth":945,"text":1632},{"id":1886,"depth":945,"text":1889},{"id":2121,"depth":945,"text":2124},{"id":2348,"depth":931,"text":2349},"In-memory fixed-window, sliding-window, and sliding-window-counter rate limiters backed a memory cache.","md","i-lucide-timer-reset",{},null,"---\ntitle: rateLimiters\ndescription: In-memory fixed-window, sliding-window, and sliding-window-counter rate limiters backed a memory cache.\nicon: i-lucide-timer-reset\n---\n\nThe `rateLimiters` module provides three lightweight, in-memory rate limiting\nfunctions for per-process traffic control. Each factory accepts cache\nconfiguration once and returns a synchronous limiter function that evaluates a\nstring key such as an IP address, user ID, API key, or composite identifier.\n\nAll three functions store state in\n[`MiniCache`](\u002Fdocs\u002Futils\u002Fshared\u002Fminicache), so idle keys expire\nautomatically. The returned limiter resolves to `true` when the request is\naccepted and `false` when the current request exceeds the configured limit.\n\n::callout{icon=\"i-lucide-alert-triangle\" color=\"warning\"}\nThese limiters keep all state in local memory. They do not synchronize across\nmultiple Node.js processes, containers, or regions, and they do not generate\nHTTP headers such as `Retry-After`.\n::\n\n## Definition\n\nThe module exports three factory functions and a small set of interfaces that\ndescribe the cache payload used by each strategy.\n\n```ts [rateLimiters.ts]\nexport interface Entry {\n  count: number\n  windowStart: number\n}\n\nexport interface RateEntry {\n  timestamps: number[]\n}\n\nexport interface CounterEntry {\n  currentBucket: number\n  previousBucket: number\n  bucketStart: number\n}\n\nexport interface CacheConfig {\n  maxEntries?: number\n  sweepIntervalMs?: number\n}\n\nexport function fixedWindowRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n\nexport function slidingWindowRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n\nexport function slidingWindowCounterRateLimiter(\n  cache: CacheConfig\n): (key: string, limit?: number, windowMs?: number) => boolean\n```\n\n## State interfaces\n\nThe exported interfaces are the internal shapes stored in `MiniCache`. You do\nnot need them for everyday use, but they explain how each algorithm tracks\nrecent traffic.\n\n| Interface | Used by | Description |\n| --- | --- | --- |\n| `Entry` | `fixedWindowRateLimiter` | Stores the accepted request count and the timestamp where the active fixed window started. |\n| `RateEntry` | `slidingWindowRateLimiter` | Stores every accepted request timestamp that still belongs to the active rolling window. |\n| `CounterEntry` | `slidingWindowCounterRateLimiter` | Stores the current bucket count, the previous bucket count, and the start time of the current bucket. |\n\n## Shared configuration\n\nEach factory accepts the same `CacheConfig` object. These options control only\nhow limiter state is stored and cleaned up in memory.\n\n| Option | Type | Default | Description |\n| --- | --- | --- | --- |\n| `maxEntries` | `number` | `Infinity` | Maximum number of active keys kept in memory. When this limit is reached, `MiniCache` evicts the oldest key and that key starts fresh on its next request. |\n| `sweepIntervalMs` | `number` | `60000` | Interval in milliseconds used by `MiniCache` to remove expired keys in the background. Access-time checks still enforce expiry even if the sweep has not run yet. |\n\n## Choosing a strategy\n\nThe three factories share the same public signature, but they trade accuracy,\nmemory use, and burst handling differently.\n\n| Strategy | Accuracy | Memory per key | Best for | Tradeoff |\n| --- | --- | --- | --- | --- |\n| `fixedWindowRateLimiter` | Lowest | Lowest | Simple IP throttling and coarse route protection | Boundary bursts can pass at the end of one window and the start of the next. |\n| `slidingWindowRateLimiter` | Highest | Highest | Sensitive endpoints such as login, reset, or verification routes | Stores every accepted timestamp for the active window. |\n| `slidingWindowCounterRateLimiter` | High, approximate | Low | High-throughput APIs where timestamp arrays are too expensive | Uses weighted buckets, so the count is an approximation. |\n\n## Returned limiter function\n\nEach factory returns the same limiter signature. The function is synchronous, so\nyou can call it directly inside middleware, route handlers, or in-memory\nguards.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Unique identity to limit, such as an IP address, user ID, session ID, API key, or composite key. |\n| `limit` | `number` | No | Maximum number of accepted requests inside the active window. Defaults to `50`. |\n| `windowMs` | `number` | No | Window size in milliseconds. Defaults to `1000`. |\n\nThe returned function resolves immediately to `true` when the request is\naccepted, or `false` when the request must be rejected.\n\n## Methods\n\nThe following factory functions differ only in how they count recent traffic for\neach key.\n\n### `fixedWindowRateLimiter(cache)`\n\n`fixedWindowRateLimiter` stores a single counter and a `windowStart` timestamp\nper key. The window is anchored to the first accepted request for that key, and\nthe counter resets when the full window duration has elapsed.\n\nThis is the lightest strategy in memory and CPU cost. It works well for coarse\nprotection, but it can admit bursts around a window boundary.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `cache` | `CacheConfig` | Yes | Cache settings for limiter state. See the shared configuration table above. |\n\n| Returned limiter parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Unique subject to track. |\n| `limit` | `number` | No | Maximum accepted requests for the current fixed window. Defaults to `50`. |\n| `windowMs` | `number` | No | Fixed window duration in milliseconds. Defaults to `1000`. |\n\nUse this strategy when you need fast, predictable protection with minimal\noverhead, such as basic per-IP throttling on a public route.\n\n```ts [loginLimiter.ts]\nimport { fixedWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitLoginAttempts = fixedWindowRateLimiter({\n  maxEntries: 50_000,\n  sweepIntervalMs: 30_000,\n})\n\nexport function canAttemptLogin(ip: string) {\n  return limitLoginAttempts(ip, 5, 60_000)\n}\n```\n\n### `slidingWindowRateLimiter(cache)`\n\n`slidingWindowRateLimiter` stores an array of accepted timestamps for each key.\nOn every request, it removes timestamps older than `windowMs`, counts the\nremaining timestamps, and accepts or rejects the request from that rolling set.\n\nThis strategy gives the most accurate rolling-window behavior. It smooths out\nboundary bursts, but it uses more memory because every accepted request adds a\ntimestamp to the active window.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `cache` | `CacheConfig` | Yes | Cache settings for limiter state. See the shared configuration table above. |\n\n| Returned limiter parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Unique subject to track. |\n| `limit` | `number` | No | Maximum accepted requests inside the rolling window. Defaults to `50`. |\n| `windowMs` | `number` | No | Sliding window size in milliseconds. Defaults to `1000`. |\n\nUse this strategy for endpoints where fairness matters more than raw\nthroughput, such as login, password reset, or OTP verification flows.\n\n```ts [passwordResetLimiter.ts]\nimport { slidingWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitPasswordReset = slidingWindowRateLimiter({\n  maxEntries: 100_000,\n  sweepIntervalMs: 60_000,\n})\n\nexport function canSendResetEmail(key: string) {\n  return limitPasswordReset(key, 3, 15 * 60_000)\n}\n```\n\n### `slidingWindowCounterRateLimiter(cache)`\n\n`slidingWindowCounterRateLimiter` stores only the current bucket count, the\nprevious bucket count, and the current bucket start time. It estimates the\neffective request count by weighting the previous bucket according to how far\nthe current time has progressed through the active window.\n\nThis strategy is a good balance between accuracy and memory use. It avoids the\ntimestamp array used by a full sliding window while still reducing the sharp\nboundary effects of a fixed window.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `cache` | `CacheConfig` | Yes | Cache settings for limiter state. See the shared configuration table above. |\n\n| Returned limiter parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Unique subject to track. |\n| `limit` | `number` | No | Maximum estimated requests inside the weighted window. Defaults to `50`. |\n| `windowMs` | `number` | No | Bucket size and effective window size in milliseconds. Defaults to `1000`. |\n\nUse this strategy for high-volume APIs where you need smoother throttling than a\nfixed window, but storing every timestamp would create too much overhead.\n\n```ts [apiKeyLimiter.ts]\nimport { slidingWindowCounterRateLimiter } from '@riavzon\u002Futils'\n\nconst limitApiKey = slidingWindowCounterRateLimiter({\n  maxEntries: 200_000,\n  sweepIntervalMs: 10_000,\n})\n\nexport function canCallApi(apiKey: string) {\n  return limitApiKey(apiKey, 100, 60_000)\n}\n```\n\n## Example usage\n\nIn a typical HTTP handler, call the limiter before you perform the expensive or\nsecurity-sensitive work. If the limiter returns `false`, return a `429` response\nimmediately.\n\n```ts [serverHandler.ts]\nimport { fixedWindowRateLimiter } from '@riavzon\u002Futils'\n\nconst limitRequests = fixedWindowRateLimiter({ maxEntries: 25_000 })\n\nexport async function handleRequest(req: Request, ip: string) {\n  if (!limitRequests(ip, 20, 60_000)) {\n    return new Response('Too Many Requests', { status: 429 })\n  }\n\n  return new Response(JSON.stringify({ ok: true }), { status: 200 })\n}\n```\n\n--- \n\nThese rate limiters are often used with other shared utilities in the package.\nThe following pages explain the closest related building blocks.\n\n- See [MiniCache](\u002Fdocs\u002Futils\u002Fshared\u002Fminicache) for the TTL and eviction\n  behavior that backs these limiters.\n- See [fetchWithRetry](\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry) if you also need\n  client-side backoff and retry behavior after a `429` response.\n",{"title":206,"description":2608},"qH58gURniPHQz8U8-JObSL7lAk1c3NUrlSLMNQNT04k",[2617,2618],{"title":202,"path":203,"stem":204,"children":-1},{"title":210,"path":211,"stem":212,"children":-1},{"id":849,"title":206,"body":2620,"description":2608,"extension":2609,"icon":2610,"meta":4069,"module":2612,"navigation":8,"path":207,"rawbody":2613,"seo":4070,"stem":208,"__hash__":2615},{"type":851,"value":2621,"toc":4056},[2622,2626,2636,2642,2644,2646,2958,2960,2964,3014,3016,3020,3072,3074,3076,3136,3138,3140,3202,3208,3210,3212,3216,3222,3224,3254,3316,3318,3426,3430,3436,3438,3468,3530,3532,3644,3648,3652,3654,3684,3746,3748,3856,3858,3864,4038,4040,4042,4054],[854,2623,856,2624,860],{},[858,2625,206],{},[854,2627,863,2628,869,2632,873,2634,877],{},[865,2629,2630],{"href":187},[858,2631,186],{},[858,2633,872],{},[858,2635,876],{},[879,2637,2638],{"color":881,"icon":882},[854,2639,885,2640,889],{},[858,2641,888],{},[891,2643,894],{"id":893},[854,2645,897],{},[899,2647,2648],{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},[858,2649,2650,2660,2668,2676,2680,2684,2694,2704,2708,2712,2722,2730,2738,2746,2750,2754,2764,2772,2780,2784,2788,2798,2806,2842,2846,2856,2864,2900,2904,2914,2922],{"__ignoreMap":905},[909,2651,2652,2654,2656,2658],{"class":911,"line":912},[909,2653,916],{"class":915},[909,2655,920],{"class":919},[909,2657,924],{"class":923},[909,2659,928],{"class":927},[909,2661,2662,2664,2666],{"class":911,"line":931},[909,2663,935],{"class":934},[909,2665,939],{"class":938},[909,2667,942],{"class":923},[909,2669,2670,2672,2674],{"class":911,"line":945},[909,2671,948],{"class":934},[909,2673,939],{"class":938},[909,2675,942],{"class":923},[909,2677,2678],{"class":911,"line":955},[909,2679,958],{"class":927},[909,2681,2682],{"class":911,"line":961},[909,2683,964],{"emptyLinePlaceholder":8},[909,2685,2686,2688,2690,2692],{"class":911,"line":967},[909,2687,916],{"class":915},[909,2689,920],{"class":919},[909,2691,974],{"class":923},[909,2693,928],{"class":927},[909,2695,2696,2698,2700,2702],{"class":911,"line":979},[909,2697,982],{"class":934},[909,2699,939],{"class":938},[909,2701,987],{"class":923},[909,2703,990],{"class":927},[909,2705,2706],{"class":911,"line":993},[909,2707,958],{"class":927},[909,2709,2710],{"class":911,"line":998},[909,2711,964],{"emptyLinePlaceholder":8},[909,2713,2714,2716,2718,2720],{"class":911,"line":1003},[909,2715,916],{"class":915},[909,2717,920],{"class":919},[909,2719,1010],{"class":923},[909,2721,928],{"class":927},[909,2723,2724,2726,2728],{"class":911,"line":1015},[909,2725,1018],{"class":934},[909,2727,939],{"class":938},[909,2729,942],{"class":923},[909,2731,2732,2734,2736],{"class":911,"line":1025},[909,2733,1028],{"class":934},[909,2735,939],{"class":938},[909,2737,942],{"class":923},[909,2739,2740,2742,2744],{"class":911,"line":1035},[909,2741,1038],{"class":934},[909,2743,939],{"class":938},[909,2745,942],{"class":923},[909,2747,2748],{"class":911,"line":1045},[909,2749,958],{"class":927},[909,2751,2752],{"class":911,"line":1050},[909,2753,964],{"emptyLinePlaceholder":8},[909,2755,2756,2758,2760,2762],{"class":911,"line":1055},[909,2757,916],{"class":915},[909,2759,920],{"class":919},[909,2761,1062],{"class":923},[909,2763,928],{"class":927},[909,2765,2766,2768,2770],{"class":911,"line":1067},[909,2767,1070],{"class":934},[909,2769,1073],{"class":938},[909,2771,942],{"class":923},[909,2773,2774,2776,2778],{"class":911,"line":1078},[909,2775,1081],{"class":934},[909,2777,1073],{"class":938},[909,2779,942],{"class":923},[909,2781,2782],{"class":911,"line":1088},[909,2783,958],{"class":927},[909,2785,2786],{"class":911,"line":1093},[909,2787,964],{"emptyLinePlaceholder":8},[909,2789,2790,2792,2794,2796],{"class":911,"line":1098},[909,2791,916],{"class":915},[909,2793,1103],{"class":919},[909,2795,1107],{"class":1106},[909,2797,1110],{"class":927},[909,2799,2800,2802,2804],{"class":911,"line":1113},[909,2801,1117],{"class":1116},[909,2803,939],{"class":938},[909,2805,1122],{"class":923},[909,2807,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840],{"class":911,"line":1125},[909,2809,1128],{"class":927},[909,2811,939],{"class":938},[909,2813,1133],{"class":927},[909,2815,1136],{"class":1116},[909,2817,939],{"class":938},[909,2819,1141],{"class":923},[909,2821,1144],{"class":927},[909,2823,1147],{"class":1116},[909,2825,1073],{"class":938},[909,2827,987],{"class":923},[909,2829,1144],{"class":927},[909,2831,1156],{"class":1116},[909,2833,1073],{"class":938},[909,2835,987],{"class":923},[909,2837,1163],{"class":927},[909,2839,1166],{"class":919},[909,2841,1169],{"class":923},[909,2843,2844],{"class":911,"line":1172},[909,2845,964],{"emptyLinePlaceholder":8},[909,2847,2848,2850,2852,2854],{"class":911,"line":1177},[909,2849,916],{"class":915},[909,2851,1103],{"class":919},[909,2853,1184],{"class":1106},[909,2855,1110],{"class":927},[909,2857,2858,2860,2862],{"class":911,"line":1189},[909,2859,1117],{"class":1116},[909,2861,939],{"class":938},[909,2863,1122],{"class":923},[909,2865,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896,2898],{"class":911,"line":1198},[909,2867,1128],{"class":927},[909,2869,939],{"class":938},[909,2871,1133],{"class":927},[909,2873,1136],{"class":1116},[909,2875,939],{"class":938},[909,2877,1141],{"class":923},[909,2879,1144],{"class":927},[909,2881,1147],{"class":1116},[909,2883,1073],{"class":938},[909,2885,987],{"class":923},[909,2887,1144],{"class":927},[909,2889,1156],{"class":1116},[909,2891,1073],{"class":938},[909,2893,987],{"class":923},[909,2895,1163],{"class":927},[909,2897,1166],{"class":919},[909,2899,1169],{"class":923},[909,2901,2902],{"class":911,"line":1235},[909,2903,964],{"emptyLinePlaceholder":8},[909,2905,2906,2908,2910,2912],{"class":911,"line":1240},[909,2907,916],{"class":915},[909,2909,1103],{"class":919},[909,2911,1247],{"class":1106},[909,2913,1110],{"class":927},[909,2915,2916,2918,2920],{"class":911,"line":1252},[909,2917,1117],{"class":1116},[909,2919,939],{"class":938},[909,2921,1122],{"class":923},[909,2923,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956],{"class":911,"line":1261},[909,2925,1128],{"class":927},[909,2927,939],{"class":938},[909,2929,1133],{"class":927},[909,2931,1136],{"class":1116},[909,2933,939],{"class":938},[909,2935,1141],{"class":923},[909,2937,1144],{"class":927},[909,2939,1147],{"class":1116},[909,2941,1073],{"class":938},[909,2943,987],{"class":923},[909,2945,1144],{"class":927},[909,2947,1156],{"class":1116},[909,2949,1073],{"class":938},[909,2951,987],{"class":923},[909,2953,1163],{"class":927},[909,2955,1166],{"class":919},[909,2957,1169],{"class":923},[891,2959,1299],{"id":1298},[854,2961,1302,2962,1305],{},[858,2963,186],{},[1307,2965,2966,2976],{},[1310,2967,2968],{},[1313,2969,2970,2972,2974],{},[1316,2971,1318],{},[1316,2973,1321],{},[1316,2975,1324],{},[1326,2977,2978,2990,3002],{},[1313,2979,2980,2984,2988],{},[1331,2981,2982],{},[858,2983,1335],{},[1331,2985,2986],{},[858,2987,1340],{},[1331,2989,1343],{},[1313,2991,2992,2996,3000],{},[1331,2993,2994],{},[858,2995,1350],{},[1331,2997,2998],{},[858,2999,1355],{},[1331,3001,1358],{},[1313,3003,3004,3008,3012],{},[1331,3005,3006],{},[858,3007,1365],{},[1331,3009,3010],{},[858,3011,1370],{},[1331,3013,1373],{},[891,3015,1377],{"id":1376},[854,3017,1380,3018,1384],{},[858,3019,1383],{},[1307,3021,3022,3034],{},[1310,3023,3024],{},[1313,3025,3026,3028,3030,3032],{},[1316,3027,1393],{},[1316,3029,1396],{},[1316,3031,1399],{},[1316,3033,1324],{},[1326,3035,3036,3054],{},[1313,3037,3038,3042,3046,3050],{},[1331,3039,3040],{},[858,3041,1410],{},[1331,3043,3044],{},[858,3045,1415],{},[1331,3047,3048],{},[858,3049,1420],{},[1331,3051,1423,3052,1426],{},[858,3053,186],{},[1313,3055,3056,3060,3064,3068],{},[1331,3057,3058],{},[858,3059,1433],{},[1331,3061,3062],{},[858,3063,1415],{},[1331,3065,3066],{},[858,3067,1442],{},[1331,3069,1445,3070,1448],{},[858,3071,186],{},[891,3073,1452],{"id":1451},[854,3075,1455],{},[1307,3077,3078,3092],{},[1310,3079,3080],{},[1313,3081,3082,3084,3086,3088,3090],{},[1316,3083,1464],{},[1316,3085,1467],{},[1316,3087,1470],{},[1316,3089,1473],{},[1316,3091,1476],{},[1326,3093,3094,3108,3122],{},[1313,3095,3096,3100,3102,3104,3106],{},[1331,3097,3098],{},[858,3099,1340],{},[1331,3101,1487],{},[1331,3103,1487],{},[1331,3105,1492],{},[1331,3107,1495],{},[1313,3109,3110,3114,3116,3118,3120],{},[1331,3111,3112],{},[858,3113,1355],{},[1331,3115,1504],{},[1331,3117,1504],{},[1331,3119,1509],{},[1331,3121,1512],{},[1313,3123,3124,3128,3130,3132,3134],{},[1331,3125,3126],{},[858,3127,1370],{},[1331,3129,1521],{},[1331,3131,1524],{},[1331,3133,1527],{},[1331,3135,1530],{},[891,3137,1534],{"id":1533},[854,3139,1537],{},[1307,3141,3142,3154],{},[1310,3143,3144],{},[1313,3145,3146,3148,3150,3152],{},[1316,3147,1546],{},[1316,3149,1396],{},[1316,3151,1551],{},[1316,3153,1324],{},[1326,3155,3156,3170,3186],{},[1313,3157,3158,3162,3166,3168],{},[1331,3159,3160],{},[858,3161,1136],{},[1331,3163,3164],{},[858,3165,1566],{},[1331,3167,1569],{},[1331,3169,1572],{},[1313,3171,3172,3176,3180,3182],{},[1331,3173,3174],{},[858,3175,1147],{},[1331,3177,3178],{},[858,3179,1415],{},[1331,3181,1585],{},[1331,3183,1588,3184,889],{},[858,3185,1591],{},[1313,3187,3188,3192,3196,3198],{},[1331,3189,3190],{},[858,3191,1156],{},[1331,3193,3194],{},[858,3195,1415],{},[1331,3197,1585],{},[1331,3199,1606,3200,889],{},[858,3201,1609],{},[854,3203,1612,3204,1615,3206,1618],{},[858,3205,872],{},[858,3207,876],{},[891,3209,1622],{"id":1621},[854,3211,1625],{},[1627,3213,3214],{"id":1629},[858,3215,1632],{},[854,3217,3218,1637,3220,1641],{},[858,3219,1340],{},[858,3221,1640],{},[854,3223,1644],{},[1307,3225,3226,3238],{},[1310,3227,3228],{},[1313,3229,3230,3232,3234,3236],{},[1316,3231,1546],{},[1316,3233,1396],{},[1316,3235,1551],{},[1316,3237,1324],{},[1326,3239,3240],{},[1313,3241,3242,3246,3250,3252],{},[1331,3243,3244],{},[858,3245,1667],{},[1331,3247,3248],{},[858,3249,1383],{},[1331,3251,1569],{},[1331,3253,1676],{},[1307,3255,3256,3268],{},[1310,3257,3258],{},[1313,3259,3260,3262,3264,3266],{},[1316,3261,1685],{},[1316,3263,1396],{},[1316,3265,1551],{},[1316,3267,1324],{},[1326,3269,3270,3284,3300],{},[1313,3271,3272,3276,3280,3282],{},[1331,3273,3274],{},[858,3275,1136],{},[1331,3277,3278],{},[858,3279,1566],{},[1331,3281,1569],{},[1331,3283,1708],{},[1313,3285,3286,3290,3294,3296],{},[1331,3287,3288],{},[858,3289,1147],{},[1331,3291,3292],{},[858,3293,1415],{},[1331,3295,1585],{},[1331,3297,1723,3298,889],{},[858,3299,1591],{},[1313,3301,3302,3306,3310,3312],{},[1331,3303,3304],{},[858,3305,1156],{},[1331,3307,3308],{},[858,3309,1415],{},[1331,3311,1585],{},[1331,3313,1740,3314,889],{},[858,3315,1609],{},[854,3317,1745],{},[899,3319,3320],{"className":901,"code":1748,"filename":1749,"language":904,"meta":905,"style":905},[858,3321,3322,3340,3344,3356,3366,3376,3380,3384,3402,3422],{"__ignoreMap":905},[909,3323,3324,3326,3328,3330,3332,3334,3336,3338],{"class":911,"line":912},[909,3325,1756],{"class":915},[909,3327,1759],{"class":927},[909,3329,1340],{"class":934},[909,3331,1764],{"class":927},[909,3333,1767],{"class":915},[909,3335,1771],{"class":1770},[909,3337,1775],{"class":1774},[909,3339,1778],{"class":1770},[909,3341,3342],{"class":911,"line":931},[909,3343,964],{"emptyLinePlaceholder":8},[909,3345,3346,3348,3350,3352,3354],{"class":911,"line":945},[909,3347,1787],{"class":919},[909,3349,1791],{"class":1790},[909,3351,1794],{"class":938},[909,3353,1107],{"class":1106},[909,3355,1799],{"class":927},[909,3357,3358,3360,3362,3364],{"class":911,"line":955},[909,3359,1070],{"class":934},[909,3361,939],{"class":1806},[909,3363,1810],{"class":1809},[909,3365,1813],{"class":927},[909,3367,3368,3370,3372,3374],{"class":911,"line":961},[909,3369,1081],{"class":934},[909,3371,939],{"class":1806},[909,3373,1822],{"class":1809},[909,3375,1813],{"class":927},[909,3377,3378],{"class":911,"line":967},[909,3379,1829],{"class":927},[909,3381,3382],{"class":911,"line":979},[909,3383,964],{"emptyLinePlaceholder":8},[909,3385,3386,3388,3390,3392,3394,3396,3398,3400],{"class":911,"line":993},[909,3387,916],{"class":915},[909,3389,1103],{"class":919},[909,3391,1842],{"class":1106},[909,3393,1845],{"class":927},[909,3395,1848],{"class":1116},[909,3397,939],{"class":938},[909,3399,1141],{"class":923},[909,3401,1855],{"class":927},[909,3403,3404,3406,3408,3410,3412,3414,3416,3418,3420],{"class":911,"line":998},[909,3405,1860],{"class":915},[909,3407,1791],{"class":1106},[909,3409,1845],{"class":927},[909,3411,1848],{"class":934},[909,3413,1144],{"class":927},[909,3415,1871],{"class":1809},[909,3417,1144],{"class":927},[909,3419,1876],{"class":1809},[909,3421,1879],{"class":927},[909,3423,3424],{"class":911,"line":1003},[909,3425,958],{"class":927},[1627,3427,3428],{"id":1886},[858,3429,1889],{},[854,3431,3432,1894,3434,1897],{},[858,3433,1355],{},[858,3435,1156],{},[854,3437,1900],{},[1307,3439,3440,3452],{},[1310,3441,3442],{},[1313,3443,3444,3446,3448,3450],{},[1316,3445,1546],{},[1316,3447,1396],{},[1316,3449,1551],{},[1316,3451,1324],{},[1326,3453,3454],{},[1313,3455,3456,3460,3464,3466],{},[1331,3457,3458],{},[858,3459,1667],{},[1331,3461,3462],{},[858,3463,1383],{},[1331,3465,1569],{},[1331,3467,1676],{},[1307,3469,3470,3482],{},[1310,3471,3472],{},[1313,3473,3474,3476,3478,3480],{},[1316,3475,1685],{},[1316,3477,1396],{},[1316,3479,1551],{},[1316,3481,1324],{},[1326,3483,3484,3498,3514],{},[1313,3485,3486,3490,3494,3496],{},[1331,3487,3488],{},[858,3489,1136],{},[1331,3491,3492],{},[858,3493,1566],{},[1331,3495,1569],{},[1331,3497,1708],{},[1313,3499,3500,3504,3508,3510],{},[1331,3501,3502],{},[858,3503,1147],{},[1331,3505,3506],{},[858,3507,1415],{},[1331,3509,1585],{},[1331,3511,1975,3512,889],{},[858,3513,1591],{},[1313,3515,3516,3520,3524,3526],{},[1331,3517,3518],{},[858,3519,1156],{},[1331,3521,3522],{},[858,3523,1415],{},[1331,3525,1585],{},[1331,3527,1992,3528,889],{},[858,3529,1609],{},[854,3531,1997],{},[899,3533,3534],{"className":901,"code":2000,"filename":2001,"language":904,"meta":905,"style":905},[858,3535,3536,3554,3558,3570,3580,3590,3594,3598,3616,3640],{"__ignoreMap":905},[909,3537,3538,3540,3542,3544,3546,3548,3550,3552],{"class":911,"line":912},[909,3539,1756],{"class":915},[909,3541,1759],{"class":927},[909,3543,1355],{"class":934},[909,3545,1764],{"class":927},[909,3547,1767],{"class":915},[909,3549,1771],{"class":1770},[909,3551,1775],{"class":1774},[909,3553,1778],{"class":1770},[909,3555,3556],{"class":911,"line":931},[909,3557,964],{"emptyLinePlaceholder":8},[909,3559,3560,3562,3564,3566,3568],{"class":911,"line":945},[909,3561,1787],{"class":919},[909,3563,2032],{"class":1790},[909,3565,1794],{"class":938},[909,3567,1184],{"class":1106},[909,3569,1799],{"class":927},[909,3571,3572,3574,3576,3578],{"class":911,"line":955},[909,3573,1070],{"class":934},[909,3575,939],{"class":1806},[909,3577,2047],{"class":1809},[909,3579,1813],{"class":927},[909,3581,3582,3584,3586,3588],{"class":911,"line":961},[909,3583,1081],{"class":934},[909,3585,939],{"class":1806},[909,3587,2058],{"class":1809},[909,3589,1813],{"class":927},[909,3591,3592],{"class":911,"line":967},[909,3593,1829],{"class":927},[909,3595,3596],{"class":911,"line":979},[909,3597,964],{"emptyLinePlaceholder":8},[909,3599,3600,3602,3604,3606,3608,3610,3612,3614],{"class":911,"line":993},[909,3601,916],{"class":915},[909,3603,1103],{"class":919},[909,3605,2077],{"class":1106},[909,3607,1845],{"class":927},[909,3609,1136],{"class":1116},[909,3611,939],{"class":938},[909,3613,1141],{"class":923},[909,3615,1855],{"class":927},[909,3617,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636,3638],{"class":911,"line":998},[909,3619,1860],{"class":915},[909,3621,2032],{"class":1106},[909,3623,1845],{"class":927},[909,3625,1136],{"class":934},[909,3627,1144],{"class":927},[909,3629,2102],{"class":1809},[909,3631,1144],{"class":927},[909,3633,2107],{"class":1809},[909,3635,2110],{"class":938},[909,3637,2058],{"class":1809},[909,3639,1879],{"class":927},[909,3641,3642],{"class":911,"line":1003},[909,3643,958],{"class":927},[1627,3645,3646],{"id":2121},[858,3647,2124],{},[854,3649,3650,2129],{},[858,3651,1370],{},[854,3653,2132],{},[1307,3655,3656,3668],{},[1310,3657,3658],{},[1313,3659,3660,3662,3664,3666],{},[1316,3661,1546],{},[1316,3663,1396],{},[1316,3665,1551],{},[1316,3667,1324],{},[1326,3669,3670],{},[1313,3671,3672,3676,3680,3682],{},[1331,3673,3674],{},[858,3675,1667],{},[1331,3677,3678],{},[858,3679,1383],{},[1331,3681,1569],{},[1331,3683,1676],{},[1307,3685,3686,3698],{},[1310,3687,3688],{},[1313,3689,3690,3692,3694,3696],{},[1316,3691,1685],{},[1316,3693,1396],{},[1316,3695,1551],{},[1316,3697,1324],{},[1326,3699,3700,3714,3730],{},[1313,3701,3702,3706,3710,3712],{},[1331,3703,3704],{},[858,3705,1136],{},[1331,3707,3708],{},[858,3709,1566],{},[1331,3711,1569],{},[1331,3713,1708],{},[1313,3715,3716,3720,3724,3726],{},[1331,3717,3718],{},[858,3719,1147],{},[1331,3721,3722],{},[858,3723,1415],{},[1331,3725,1585],{},[1331,3727,2207,3728,889],{},[858,3729,1591],{},[1313,3731,3732,3736,3740,3742],{},[1331,3733,3734],{},[858,3735,1156],{},[1331,3737,3738],{},[858,3739,1415],{},[1331,3741,1585],{},[1331,3743,2224,3744,889],{},[858,3745,1609],{},[854,3747,2229],{},[899,3749,3750],{"className":901,"code":2232,"filename":2233,"language":904,"meta":905,"style":905},[858,3751,3752,3770,3774,3786,3796,3806,3810,3814,3832,3852],{"__ignoreMap":905},[909,3753,3754,3756,3758,3760,3762,3764,3766,3768],{"class":911,"line":912},[909,3755,1756],{"class":915},[909,3757,1759],{"class":927},[909,3759,1370],{"class":934},[909,3761,1764],{"class":927},[909,3763,1767],{"class":915},[909,3765,1771],{"class":1770},[909,3767,1775],{"class":1774},[909,3769,1778],{"class":1770},[909,3771,3772],{"class":911,"line":931},[909,3773,964],{"emptyLinePlaceholder":8},[909,3775,3776,3778,3780,3782,3784],{"class":911,"line":945},[909,3777,1787],{"class":919},[909,3779,2264],{"class":1790},[909,3781,1794],{"class":938},[909,3783,1247],{"class":1106},[909,3785,1799],{"class":927},[909,3787,3788,3790,3792,3794],{"class":911,"line":955},[909,3789,1070],{"class":934},[909,3791,939],{"class":1806},[909,3793,2279],{"class":1809},[909,3795,1813],{"class":927},[909,3797,3798,3800,3802,3804],{"class":911,"line":961},[909,3799,1081],{"class":934},[909,3801,939],{"class":1806},[909,3803,2290],{"class":1809},[909,3805,1813],{"class":927},[909,3807,3808],{"class":911,"line":967},[909,3809,1829],{"class":927},[909,3811,3812],{"class":911,"line":979},[909,3813,964],{"emptyLinePlaceholder":8},[909,3815,3816,3818,3820,3822,3824,3826,3828,3830],{"class":911,"line":993},[909,3817,916],{"class":915},[909,3819,1103],{"class":919},[909,3821,2309],{"class":1106},[909,3823,1845],{"class":927},[909,3825,2314],{"class":1116},[909,3827,939],{"class":938},[909,3829,1141],{"class":923},[909,3831,1855],{"class":927},[909,3833,3834,3836,3838,3840,3842,3844,3846,3848,3850],{"class":911,"line":998},[909,3835,1860],{"class":915},[909,3837,2264],{"class":1106},[909,3839,1845],{"class":927},[909,3841,2314],{"class":934},[909,3843,1144],{"class":927},[909,3845,2335],{"class":1809},[909,3847,1144],{"class":927},[909,3849,1876],{"class":1809},[909,3851,1879],{"class":927},[909,3853,3854],{"class":911,"line":1003},[909,3855,958],{"class":927},[891,3857,2349],{"id":2348},[854,3859,2352,3860,2355,3862,2359],{},[858,3861,876],{},[858,3863,2358],{},[899,3865,3866],{"className":901,"code":2362,"filename":2363,"language":904,"meta":905,"style":905},[858,3867,3868,3886,3890,3910,3914,3942,3966,3992,3996,4000,4034],{"__ignoreMap":905},[909,3869,3870,3872,3874,3876,3878,3880,3882,3884],{"class":911,"line":912},[909,3871,1756],{"class":915},[909,3873,1759],{"class":927},[909,3875,1340],{"class":934},[909,3877,1764],{"class":927},[909,3879,1767],{"class":915},[909,3881,1771],{"class":1770},[909,3883,1775],{"class":1774},[909,3885,1778],{"class":1770},[909,3887,3888],{"class":911,"line":931},[909,3889,964],{"emptyLinePlaceholder":8},[909,3891,3892,3894,3896,3898,3900,3902,3904,3906,3908],{"class":911,"line":945},[909,3893,1787],{"class":919},[909,3895,2394],{"class":1790},[909,3897,1794],{"class":938},[909,3899,1107],{"class":1106},[909,3901,2401],{"class":927},[909,3903,1410],{"class":934},[909,3905,939],{"class":1806},[909,3907,2408],{"class":1809},[909,3909,2411],{"class":927},[909,3911,3912],{"class":911,"line":955},[909,3913,964],{"emptyLinePlaceholder":8},[909,3915,3916,3918,3920,3922,3924,3926,3928,3930,3932,3934,3936,3938,3940],{"class":911,"line":961},[909,3917,916],{"class":915},[909,3919,2422],{"class":919},[909,3921,1103],{"class":919},[909,3923,2427],{"class":1106},[909,3925,1845],{"class":927},[909,3927,2432],{"class":1116},[909,3929,939],{"class":938},[909,3931,2437],{"class":923},[909,3933,1144],{"class":927},[909,3935,1848],{"class":1116},[909,3937,939],{"class":938},[909,3939,1141],{"class":923},[909,3941,1855],{"class":927},[909,3943,3944,3946,3948,3950,3952,3954,3956,3958,3960,3962,3964],{"class":911,"line":967},[909,3945,2452],{"class":915},[909,3947,1133],{"class":927},[909,3949,2457],{"class":938},[909,3951,2460],{"class":1106},[909,3953,1845],{"class":927},[909,3955,1848],{"class":934},[909,3957,1144],{"class":927},[909,3959,2469],{"class":1809},[909,3961,1144],{"class":927},[909,3963,1876],{"class":1809},[909,3965,2476],{"class":927},[909,3967,3968,3970,3972,3974,3976,3978,3980,3982,3984,3986,3988,3990],{"class":911,"line":979},[909,3969,2481],{"class":915},[909,3971,2485],{"class":2484},[909,3973,2488],{"class":1106},[909,3975,1845],{"class":927},[909,3977,2493],{"class":1770},[909,3979,2496],{"class":1774},[909,3981,2493],{"class":1770},[909,3983,2501],{"class":927},[909,3985,2504],{"class":934},[909,3987,939],{"class":1806},[909,3989,2509],{"class":1809},[909,3991,2411],{"class":927},[909,3993,3994],{"class":911,"line":993},[909,3995,2516],{"class":927},[909,3997,3998],{"class":911,"line":998},[909,3999,964],{"emptyLinePlaceholder":8},[909,4001,4002,4004,4006,4008,4010,4012,4014,4016,4018,4020,4022,4024,4026,4028,4030,4032],{"class":911,"line":1003},[909,4003,1860],{"class":915},[909,4005,2485],{"class":2484},[909,4007,2488],{"class":1106},[909,4009,1845],{"class":927},[909,4011,2534],{"class":2533},[909,4013,889],{"class":927},[909,4015,2539],{"class":1106},[909,4017,2401],{"class":927},[909,4019,2544],{"class":934},[909,4021,939],{"class":1806},[909,4023,2550],{"class":2549},[909,4025,2553],{"class":927},[909,4027,2504],{"class":934},[909,4029,939],{"class":1806},[909,4031,2560],{"class":1809},[909,4033,2411],{"class":927},[909,4035,4036],{"class":911,"line":1015},[909,4037,958],{"class":927},[2568,4039],{},[854,4041,2572],{},[2574,4043,4044,4048],{},[2577,4045,2579,4046,2582],{},[865,4047,186],{"href":187},[2577,4049,2579,4050,2587,4052,2590],{},[865,4051,158],{"href":159},[858,4053,2358],{},[2592,4055,2594],{},{"title":905,"searchDepth":931,"depth":931,"links":4057},[4058,4059,4060,4061,4062,4063,4068],{"id":893,"depth":931,"text":894},{"id":1298,"depth":931,"text":1299},{"id":1376,"depth":931,"text":1377},{"id":1451,"depth":931,"text":1452},{"id":1533,"depth":931,"text":1534},{"id":1621,"depth":931,"text":1622,"children":4064},[4065,4066,4067],{"id":1629,"depth":945,"text":1632},{"id":1886,"depth":945,"text":1889},{"id":2121,"depth":945,"text":2124},{"id":2348,"depth":931,"text":2349},{},{"title":206,"description":2608},1780436298237]