[{"data":1,"prerenderedAt":10333},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment_page":850,"\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment_surround":6023,"\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment":6026},{"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":27,"path":29,"stem":70,"children":71},"docs\u002Fiam\u002Findex",[72,73,76,216,219,236,240],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":77,"path":78,"stem":79,"children":80},"Essentials","\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[81,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":87,"path":88,"stem":89},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":91,"path":92,"stem":93},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":95,"path":96,"stem":97},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":99,"path":100,"stem":101},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":103,"path":104,"stem":105},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":107,"path":108,"stem":109},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":111,"path":112,"stem":113},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":115,"path":116,"stem":117},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":119,"path":120,"stem":121},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":123,"path":124,"stem":125},"MFA","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":127,"path":128,"stem":129},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":131,"path":132,"stem":133},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":135,"path":136,"stem":137},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":139,"path":140,"stem":141},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":143,"path":144,"stem":145},"Logging","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":147,"path":148,"stem":149},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":151,"path":152,"stem":153},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":155,"path":156,"stem":157},"Cookies","\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":159,"path":160,"stem":161},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":163,"path":164,"stem":165},"Password Reset","\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":167,"path":168,"stem":169,"children":170},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[171,172,176,180,210,213],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":177,"path":178,"stem":179},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":181,"path":182,"stem":183,"children":184},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[185,186,190,194,198,202,206],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":191,"path":192,"stem":193},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":195,"path":196,"stem":197},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":199,"path":200,"stem":201},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":203,"path":204,"stem":205},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":207,"path":208,"stem":209},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":147,"path":211,"stem":212},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":214,"stem":215},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":217,"stem":218},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":220,"path":221,"stem":222,"children":223,"page":53},"Guides","\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[224,228,232],{"title":225,"path":226,"stem":227},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":229,"path":230,"stem":231},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":233,"path":234,"stem":235},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":237,"path":238,"stem":239},"Configuration","\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":241,"path":242,"stem":243,"children":244,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[245,249,253],{"title":246,"path":247,"stem":248},"API Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":250,"path":251,"stem":252},"Middleware Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":254,"path":255,"stem":256},"Routes Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",[258],{"title":9,"path":66,"stem":67,"children":259,"page":53},[260,398,516,521,577,644],{"title":20,"path":22,"stem":261,"children":262},"docs\u002Fauth-h3client\u002Findex",[263,264,273,307,331,353,356,376,379],{"title":20,"path":22,"stem":261},{"title":14,"path":265,"stem":266,"children":267},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[268,269],{"title":14,"path":265,"stem":266},{"title":270,"path":271,"stem":272},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":77,"path":274,"stem":275,"children":276},"\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[277,278,282,286,290,294,298,301,304],{"title":77,"path":274,"stem":275},{"title":279,"path":280,"stem":281},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":283,"path":284,"stem":285},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":287,"path":288,"stem":289},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":291,"path":292,"stem":293},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":295,"path":296,"stem":297},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":299,"stem":300},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":155,"path":302,"stem":303},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":143,"path":305,"stem":306},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":123,"path":308,"stem":309,"children":310},"\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[311,312,316,319,323,327],{"title":123,"path":308,"stem":309},{"title":313,"path":314,"stem":315},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":163,"path":317,"stem":318},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":320,"path":321,"stem":322},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":324,"path":325,"stem":326},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":328,"path":329,"stem":330},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":332,"path":333,"stem":334,"children":335},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[336,337,341,345,349],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":342,"path":343,"stem":344},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":346,"path":347,"stem":348},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":350,"path":351,"stem":352},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":354,"stem":355},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":220,"path":357,"stem":358,"children":359,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[360,364,368,372],{"title":361,"path":362,"stem":363},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":365,"path":366,"stem":367},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":369,"path":370,"stem":371},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":373,"path":374,"stem":375},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":237,"path":377,"stem":378},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":246,"path":380,"stem":381,"children":382},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[383,384,387,390,394],{"title":246,"path":380,"stem":381},{"title":254,"path":385,"stem":386},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":250,"path":388,"stem":389},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":391,"path":392,"stem":393},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":395,"path":396,"stem":397},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":399,"path":35,"stem":400,"children":401},"Bot Detector","docs\u002Fbot-detection\u002Findex",[402,403,406,410,414,433,507,510,513],{"title":399,"path":35,"stem":400},{"title":14,"path":404,"stem":405},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":407,"path":408,"stem":409},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":411,"path":412,"stem":413},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":220,"path":415,"stem":416,"children":417,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[418,422,426,429],{"title":419,"path":420,"stem":421},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":423,"path":424,"stem":425},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":143,"path":427,"stem":428},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":430,"path":431,"stem":432},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":434,"path":435,"stem":436,"children":437},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[438,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":444,"path":445,"stem":446},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":448,"path":449,"stem":450},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":452,"path":453,"stem":454},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":456,"path":457,"stem":458},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":460,"path":461,"stem":462},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":464,"path":465,"stem":466},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":468,"path":469,"stem":470},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":472,"path":473,"stem":474},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":476,"path":477,"stem":478},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":480,"path":481,"stem":482},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":484,"path":485,"stem":486},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":488,"path":489,"stem":490},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":492,"path":493,"stem":494},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":496,"path":497,"stem":498},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":500,"path":501,"stem":502},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":504,"path":505,"stem":506},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":508,"stem":509},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":246,"path":511,"stem":512},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":237,"path":514,"stem":515},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":517,"path":11,"stem":518,"children":519},"Introduction","docs\u002Fgetting-started\u002Findex",[520],{"title":517,"path":11,"stem":518},{"title":27,"path":29,"stem":70,"children":522},[523,524,525,565,566,571,572],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79,"children":526},[527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"title":131,"path":132,"stem":133},{"title":135,"path":136,"stem":137},{"title":139,"path":140,"stem":141},{"title":143,"path":144,"stem":145},{"title":147,"path":148,"stem":149},{"title":151,"path":152,"stem":153},{"title":155,"path":156,"stem":157},{"title":159,"path":160,"stem":161},{"title":163,"path":164,"stem":165},{"title":167,"path":168,"stem":169,"children":550},[551,552,553,554,563,564],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":181,"path":182,"stem":183,"children":555},[556,557,558,559,560,561,562],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},{"title":191,"path":192,"stem":193},{"title":195,"path":196,"stem":197},{"title":199,"path":200,"stem":201},{"title":203,"path":204,"stem":205},{"title":207,"path":208,"stem":209},{"title":147,"path":211,"stem":212},{"title":38,"path":214,"stem":215},{"title":38,"path":217,"stem":218},{"title":220,"path":221,"stem":222,"children":567,"page":53},[568,569,570],{"title":225,"path":226,"stem":227},{"title":229,"path":230,"stem":231},{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":573,"page":53},[574,575,576],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":40,"path":42,"stem":578,"children":579},"docs\u002Fshield-base\u002Findex",[580,581,584,588,629,633,637,641],{"title":40,"path":42,"stem":578},{"title":14,"path":582,"stem":583},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":585,"path":586,"stem":587},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":411,"path":589,"stem":590,"children":591},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[592,593,597,601,605,609,613,617,621,625],{"title":411,"path":589,"stem":590},{"title":594,"path":595,"stem":596},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":598,"path":599,"stem":600},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":602,"path":603,"stem":604},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":606,"path":607,"stem":608},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":610,"path":611,"stem":612},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":614,"path":615,"stem":616},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":618,"path":619,"stem":620},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":622,"path":623,"stem":624},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":626,"path":627,"stem":628},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":630,"path":631,"stem":632},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":634,"path":635,"stem":636},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":638,"path":639,"stem":640},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":246,"path":642,"stem":643},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":395,"path":48,"stem":645,"children":646},"docs\u002Futils\u002Findex",[647,648,665,698,795],{"title":395,"path":48,"stem":645},{"title":649,"path":650,"stem":651,"children":652,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[653,657,661],{"title":654,"path":655,"stem":656},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":658,"path":659,"stem":660},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":662,"path":663,"stem":664},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":666,"path":667,"stem":668,"children":669,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[670,674,678,682,686,690,694],{"title":671,"path":672,"stem":673},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":675,"path":676,"stem":677},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":679,"path":680,"stem":681},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":683,"path":684,"stem":685},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":687,"path":688,"stem":689},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":691,"path":692,"stem":693},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":695,"path":696,"stem":697},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":699,"path":700,"stem":701,"children":702,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783,787,791],{"title":704,"path":705,"stem":706},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":708,"path":709,"stem":710},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":712,"path":713,"stem":714},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":716,"path":717,"stem":718},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":720,"path":721,"stem":722},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":724,"path":725,"stem":726},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":728,"path":729,"stem":730},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":732,"path":733,"stem":734},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":736,"path":737,"stem":738},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":740,"path":741,"stem":742},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":744,"path":745,"stem":746},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":748,"path":749,"stem":750},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":752,"path":753,"stem":754},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":756,"path":757,"stem":758},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":760,"path":761,"stem":762},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":764,"path":765,"stem":766},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":768,"path":769,"stem":770},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":772,"path":773,"stem":774},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":776,"path":777,"stem":778},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":780,"path":781,"stem":782},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":784,"path":785,"stem":786},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":788,"path":789,"stem":790},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":792,"path":793,"stem":794},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":796,"path":797,"stem":798,"children":799},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[800,801,805,809,813,817,821,825,829,833],{"title":796,"path":797,"stem":798},{"title":802,"path":803,"stem":804},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":806,"path":807,"stem":808},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":810,"path":811,"stem":812},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":814,"path":815,"stem":816},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":818,"path":819,"stem":820},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":822,"path":823,"stem":824},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":826,"path":827,"stem":828},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":830,"path":831,"stem":832},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":834,"path":835,"stem":836},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":838,"meta":849,"stem":62,"__hash__":63},[839,847,848],{"nested":8,"label":9,"icon":10,"to":11,"children":840},[841,842,843,844,845,846],{"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":851,"title":225,"body":852,"description":6015,"extension":6016,"icon":6017,"meta":6018,"module":6019,"navigation":8,"path":226,"rawbody":6020,"seo":6021,"stem":227,"__hash__":6022},"docs\u002Fdocs\u002Fiam\u002F03.guides\u002Fdeployment.md",{"type":853,"value":854,"toc":6006},"minimark",[855,868,876,879,940,947,2581,2584,2619,2622,2632,2638,2646,2649,2688,2695,2712,2727,2730,3582,3585,3621,3627,3635,3648,3653,3656,3733,3752,3762,3770,3787,3942,3952,3957,4146,4150,4231,4237,4268,4278,4295,4312,4316,4323,4336,4343,4347,4350,4353,4403,4412,5607,5611,5617,5627,5773,5783,5786,5902,5978,5988,6002],[856,857,858,859,863,864,867],"p",{},"The best way to deploy the service is using the public docker image.\nIt handles everything, setting up the ",[860,861,862],"code",{},"mmdbctl"," and ",[860,865,866],{},"age"," binary, to starting the service and deleting the raw unencrypted config.",[856,869,870,871,875],{},"In your compose file, you will need to provide a couple of things before starting the service, however you can automate this with scripts, see the ",[872,873,874],"a",{"href":230},"operation scripts guide",".",[856,877,878],{},"Make sure your environments haves the following installed first:",[880,881,882,895],"table",{},[883,884,885],"thead",{},[886,887,888,892],"tr",{},[889,890,891],"th",{},"Tool",[889,893,894],{},"Purpose",[896,897,898,911,922],"tbody",{},[886,899,900,908],{},[901,902,903],"td",{},[872,904,866],{"href":905,"rel":906},"https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage",[907],"nofollow",[901,909,910],{},"Encrypts the configuration file with age encryption",[886,912,913,919],{},[901,914,915],{},[872,916,918],{"href":905,"rel":917},[907],"age-keygen",[901,920,921],{},"Generates the age keypair",[886,923,924,937],{},[901,925,926,931,932],{},[872,927,930],{"href":928,"rel":929},"https:\u002F\u002Fwww.docker.com\u002F",[907],"Docker"," + ",[872,933,936],{"href":934,"rel":935},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F",[907],"Compose",[901,938,939],{},"Builds and runs the service container",[856,941,942,943,946],{},"Make a ",[872,944,945],{"href":238},"configuration"," file:",[948,949,954],"pre",{"className":950,"code":951,"filename":952,"language":5,"meta":953,"style":953},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"store\": {\n        \"main\": {\n            \"host\": \"mysql\",\n            \"port\": 3306,\n            \"user\": \"alice\",\n            \"password\": \"very_secure_password\",\n            \"database\": \"my_auth\"\n        },\n        \"rate_limiters_pool\": {\n            \"store\": {\n                \"host\": \"mysql\",\n                \"port\": 3306,\n                \"user\": \"alice\",\n                \"database\": \"my_auth\",\n                \"password\": \"very_secure_password\"\n            },\n            \"dbName\": \"my_auth\"\n        }\n    },\n    \"service\": {\n    \"Hmac\": {\n        \"sharedSecret\": \"1234567890\",\n        \"clientId\": \"1234\",\n        \"maxClockSkew\": 300000\n        },\n        \"proxy\": {\n            \"trust\": true,\n            \"ipToTrust\": \"172.20.5.4\",\n            \"server\": \"172.20.5.4\"\n        },\n        \"port\": 10000,\n        \"ipAddress\": \"0.0.0.0\",\n        \"clientIp\": \"172.20.5.4\"\n    },\n    \"password\": {\n        \"pepper\": \"pepper-secret\",\n        \"hashLength\": 50,\n        \"timeCost\": 4,\n        \"memoryCost\": 262144\n    },\n    \"botDetector\": {\n        \"enableBotDetector\": false\n    },\n    \"htmlSanitizer\": {\n        \"IrritationCount\": 50,\n        \"maxAllowedInputLength\": 20000\n    },\n    \"magic_links\": {\n        \"jwt_secret_key\": \"long_secret\",\n        \"expiresIn\": \"20m\",\n        \"domain\": \"http:\u002F\u002Fyour-domain:10000\",\n        \"notificationEmail\": {\n            \"websiteName\": \"My Cool Website\",\n            \"privacyPolicyLink\": \"https:\u002F\u002Fyour-domain\u002Fprivacy\",\n            \"contactPageLink\": \"https:\u002F\u002Fyour-domain\u002Fcontact\",\n            \"changePasswordPageLink\": \"https:\u002F\u002Fyour-domain\u002Faccounts\",\n            \"loginPageLink\": \"https:\u002F\u002Fyour-domain\u002Faccounts\"\n        }\n    },\n    \"providers\": [\n            {\n                \"name\": \"google\",\n                \"fields\": {\n                    \"iss\": \"safeString?\",\n                    \"azp\": \"safeString?\",\n                    \"sub\": \"string\",\n                    \"email\": \"safeString\",\n                    \"email_verified\": \"boolean\",\n                    \"name\": \"safeString\",\n                    \"given_name\": \"safeString\",\n                    \"picture\": \"safeString\",\n                    \"family_name\": \"safeString?\",\n                    \"locale\": \"safeString?\"\n                }\n            },\n            {\n                \"name\": \"github\",\n                \"useStandardProfile\": true\n            },\n            {\n                \"name\": \"x\",\n                \"useStandardProfile\": true\n            },\n            {\n                \"name\": \"linkedin\",\n                \"useStandardProfile\": true\n            }\n    ],\n    \n    \"jwt\": {\n        \"jwt_secret_key\": \"super_long_secret\",\n        \"access_tokens\": {\n            \"expiresIn\": \"15m\",\n            \"expiresInMs\": 900000,\n            \"algorithm\": \"HS512\"\n        },\n        \"refresh_tokens\": {\n            \"refresh_ttl\": 259200000,\n            \"domain\": \"localhost\",\n            \"MAX_SESSION_LIFE\": 2592000000,\n            \"maxAllowedSessionsPerUser\": 5,\n            \"byPassAnomaliesFor\": 10800000\n        }\n    },\n    \"email\": {\n        \"resend_key\": \"12345\",\n        \"email\": \"noreply@example.com\"\n    },\n    \"logLevel\": \"info\"\n}\n","config.json","",[860,955,956,965,986,1001,1027,1045,1066,1087,1107,1113,1127,1140,1160,1175,1194,1213,1230,1236,1254,1260,1266,1280,1294,1315,1336,1351,1356,1370,1388,1409,1427,1432,1448,1469,1487,1492,1505,1526,1543,1560,1575,1580,1594,1609,1614,1628,1644,1659,1664,1678,1699,1720,1741,1755,1776,1797,1818,1839,1857,1862,1867,1882,1888,1909,1923,1945,1965,1986,2007,2028,2047,2067,2087,2107,2125,2131,2136,2141,2161,2176,2181,2186,2206,2219,2224,2229,2249,2262,2268,2274,2280,2294,2314,2328,2348,2365,2384,2389,2403,2420,2440,2457,2474,2489,2494,2499,2512,2533,2551,2556,2575],{"__ignoreMap":953},[957,958,961],"span",{"class":959,"line":960},"line",1,[957,962,964],{"class":963},"sDd4n","{\n",[957,966,968,972,976,979,983],{"class":959,"line":967},2,[957,969,971],{"class":970},"saJyd","    \"",[957,973,975],{"class":974},"s_W10","store",[957,977,978],{"class":970},"\"",[957,980,982],{"class":981},"saOXh",":",[957,984,985],{"class":963}," {\n",[957,987,989,992,995,997,999],{"class":959,"line":988},3,[957,990,991],{"class":970},"        \"",[957,993,994],{"class":974},"main",[957,996,978],{"class":970},[957,998,982],{"class":981},[957,1000,985],{"class":963},[957,1002,1004,1007,1010,1012,1014,1018,1022,1024],{"class":959,"line":1003},4,[957,1005,1006],{"class":970},"            \"",[957,1008,1009],{"class":974},"host",[957,1011,978],{"class":970},[957,1013,982],{"class":981},[957,1015,1017],{"class":1016},"sFkSl"," \"",[957,1019,1021],{"class":1020},"sFB1V","mysql",[957,1023,978],{"class":1016},[957,1025,1026],{"class":963},",\n",[957,1028,1030,1032,1035,1037,1039,1043],{"class":959,"line":1029},5,[957,1031,1006],{"class":970},[957,1033,1034],{"class":974},"port",[957,1036,978],{"class":970},[957,1038,982],{"class":981},[957,1040,1042],{"class":1041},"spgvN"," 3306",[957,1044,1026],{"class":963},[957,1046,1048,1050,1053,1055,1057,1059,1062,1064],{"class":959,"line":1047},6,[957,1049,1006],{"class":970},[957,1051,1052],{"class":974},"user",[957,1054,978],{"class":970},[957,1056,982],{"class":981},[957,1058,1017],{"class":1016},[957,1060,1061],{"class":1020},"alice",[957,1063,978],{"class":1016},[957,1065,1026],{"class":963},[957,1067,1069,1071,1074,1076,1078,1080,1083,1085],{"class":959,"line":1068},7,[957,1070,1006],{"class":970},[957,1072,1073],{"class":974},"password",[957,1075,978],{"class":970},[957,1077,982],{"class":981},[957,1079,1017],{"class":1016},[957,1081,1082],{"class":1020},"very_secure_password",[957,1084,978],{"class":1016},[957,1086,1026],{"class":963},[957,1088,1090,1092,1095,1097,1099,1101,1104],{"class":959,"line":1089},8,[957,1091,1006],{"class":970},[957,1093,1094],{"class":974},"database",[957,1096,978],{"class":970},[957,1098,982],{"class":981},[957,1100,1017],{"class":1016},[957,1102,1103],{"class":1020},"my_auth",[957,1105,1106],{"class":1016},"\"\n",[957,1108,1110],{"class":959,"line":1109},9,[957,1111,1112],{"class":963},"        },\n",[957,1114,1116,1118,1121,1123,1125],{"class":959,"line":1115},10,[957,1117,991],{"class":970},[957,1119,1120],{"class":974},"rate_limiters_pool",[957,1122,978],{"class":970},[957,1124,982],{"class":981},[957,1126,985],{"class":963},[957,1128,1130,1132,1134,1136,1138],{"class":959,"line":1129},11,[957,1131,1006],{"class":970},[957,1133,975],{"class":974},[957,1135,978],{"class":970},[957,1137,982],{"class":981},[957,1139,985],{"class":963},[957,1141,1143,1146,1148,1150,1152,1154,1156,1158],{"class":959,"line":1142},12,[957,1144,1145],{"class":970},"                \"",[957,1147,1009],{"class":974},[957,1149,978],{"class":970},[957,1151,982],{"class":981},[957,1153,1017],{"class":1016},[957,1155,1021],{"class":1020},[957,1157,978],{"class":1016},[957,1159,1026],{"class":963},[957,1161,1163,1165,1167,1169,1171,1173],{"class":959,"line":1162},13,[957,1164,1145],{"class":970},[957,1166,1034],{"class":974},[957,1168,978],{"class":970},[957,1170,982],{"class":981},[957,1172,1042],{"class":1041},[957,1174,1026],{"class":963},[957,1176,1178,1180,1182,1184,1186,1188,1190,1192],{"class":959,"line":1177},14,[957,1179,1145],{"class":970},[957,1181,1052],{"class":974},[957,1183,978],{"class":970},[957,1185,982],{"class":981},[957,1187,1017],{"class":1016},[957,1189,1061],{"class":1020},[957,1191,978],{"class":1016},[957,1193,1026],{"class":963},[957,1195,1197,1199,1201,1203,1205,1207,1209,1211],{"class":959,"line":1196},15,[957,1198,1145],{"class":970},[957,1200,1094],{"class":974},[957,1202,978],{"class":970},[957,1204,982],{"class":981},[957,1206,1017],{"class":1016},[957,1208,1103],{"class":1020},[957,1210,978],{"class":1016},[957,1212,1026],{"class":963},[957,1214,1216,1218,1220,1222,1224,1226,1228],{"class":959,"line":1215},16,[957,1217,1145],{"class":970},[957,1219,1073],{"class":974},[957,1221,978],{"class":970},[957,1223,982],{"class":981},[957,1225,1017],{"class":1016},[957,1227,1082],{"class":1020},[957,1229,1106],{"class":1016},[957,1231,1233],{"class":959,"line":1232},17,[957,1234,1235],{"class":963},"            },\n",[957,1237,1239,1241,1244,1246,1248,1250,1252],{"class":959,"line":1238},18,[957,1240,1006],{"class":970},[957,1242,1243],{"class":974},"dbName",[957,1245,978],{"class":970},[957,1247,982],{"class":981},[957,1249,1017],{"class":1016},[957,1251,1103],{"class":1020},[957,1253,1106],{"class":1016},[957,1255,1257],{"class":959,"line":1256},19,[957,1258,1259],{"class":963},"        }\n",[957,1261,1263],{"class":959,"line":1262},20,[957,1264,1265],{"class":963},"    },\n",[957,1267,1269,1271,1274,1276,1278],{"class":959,"line":1268},21,[957,1270,971],{"class":970},[957,1272,1273],{"class":974},"service",[957,1275,978],{"class":970},[957,1277,982],{"class":981},[957,1279,985],{"class":963},[957,1281,1283,1285,1288,1290,1292],{"class":959,"line":1282},22,[957,1284,971],{"class":970},[957,1286,1287],{"class":974},"Hmac",[957,1289,978],{"class":970},[957,1291,982],{"class":981},[957,1293,985],{"class":963},[957,1295,1297,1299,1302,1304,1306,1308,1311,1313],{"class":959,"line":1296},23,[957,1298,991],{"class":970},[957,1300,1301],{"class":974},"sharedSecret",[957,1303,978],{"class":970},[957,1305,982],{"class":981},[957,1307,1017],{"class":1016},[957,1309,1310],{"class":1020},"1234567890",[957,1312,978],{"class":1016},[957,1314,1026],{"class":963},[957,1316,1318,1320,1323,1325,1327,1329,1332,1334],{"class":959,"line":1317},24,[957,1319,991],{"class":970},[957,1321,1322],{"class":974},"clientId",[957,1324,978],{"class":970},[957,1326,982],{"class":981},[957,1328,1017],{"class":1016},[957,1330,1331],{"class":1020},"1234",[957,1333,978],{"class":1016},[957,1335,1026],{"class":963},[957,1337,1339,1341,1344,1346,1348],{"class":959,"line":1338},25,[957,1340,991],{"class":970},[957,1342,1343],{"class":974},"maxClockSkew",[957,1345,978],{"class":970},[957,1347,982],{"class":981},[957,1349,1350],{"class":1041}," 300000\n",[957,1352,1354],{"class":959,"line":1353},26,[957,1355,1112],{"class":963},[957,1357,1359,1361,1364,1366,1368],{"class":959,"line":1358},27,[957,1360,991],{"class":970},[957,1362,1363],{"class":974},"proxy",[957,1365,978],{"class":970},[957,1367,982],{"class":981},[957,1369,985],{"class":963},[957,1371,1373,1375,1378,1380,1382,1386],{"class":959,"line":1372},28,[957,1374,1006],{"class":970},[957,1376,1377],{"class":974},"trust",[957,1379,978],{"class":970},[957,1381,982],{"class":981},[957,1383,1385],{"class":1384},"sjR7W"," true",[957,1387,1026],{"class":963},[957,1389,1391,1393,1396,1398,1400,1402,1405,1407],{"class":959,"line":1390},29,[957,1392,1006],{"class":970},[957,1394,1395],{"class":974},"ipToTrust",[957,1397,978],{"class":970},[957,1399,982],{"class":981},[957,1401,1017],{"class":1016},[957,1403,1404],{"class":1020},"172.20.5.4",[957,1406,978],{"class":1016},[957,1408,1026],{"class":963},[957,1410,1412,1414,1417,1419,1421,1423,1425],{"class":959,"line":1411},30,[957,1413,1006],{"class":970},[957,1415,1416],{"class":974},"server",[957,1418,978],{"class":970},[957,1420,982],{"class":981},[957,1422,1017],{"class":1016},[957,1424,1404],{"class":1020},[957,1426,1106],{"class":1016},[957,1428,1430],{"class":959,"line":1429},31,[957,1431,1112],{"class":963},[957,1433,1435,1437,1439,1441,1443,1446],{"class":959,"line":1434},32,[957,1436,991],{"class":970},[957,1438,1034],{"class":974},[957,1440,978],{"class":970},[957,1442,982],{"class":981},[957,1444,1445],{"class":1041}," 10000",[957,1447,1026],{"class":963},[957,1449,1451,1453,1456,1458,1460,1462,1465,1467],{"class":959,"line":1450},33,[957,1452,991],{"class":970},[957,1454,1455],{"class":974},"ipAddress",[957,1457,978],{"class":970},[957,1459,982],{"class":981},[957,1461,1017],{"class":1016},[957,1463,1464],{"class":1020},"0.0.0.0",[957,1466,978],{"class":1016},[957,1468,1026],{"class":963},[957,1470,1472,1474,1477,1479,1481,1483,1485],{"class":959,"line":1471},34,[957,1473,991],{"class":970},[957,1475,1476],{"class":974},"clientIp",[957,1478,978],{"class":970},[957,1480,982],{"class":981},[957,1482,1017],{"class":1016},[957,1484,1404],{"class":1020},[957,1486,1106],{"class":1016},[957,1488,1490],{"class":959,"line":1489},35,[957,1491,1265],{"class":963},[957,1493,1495,1497,1499,1501,1503],{"class":959,"line":1494},36,[957,1496,971],{"class":970},[957,1498,1073],{"class":974},[957,1500,978],{"class":970},[957,1502,982],{"class":981},[957,1504,985],{"class":963},[957,1506,1508,1510,1513,1515,1517,1519,1522,1524],{"class":959,"line":1507},37,[957,1509,991],{"class":970},[957,1511,1512],{"class":974},"pepper",[957,1514,978],{"class":970},[957,1516,982],{"class":981},[957,1518,1017],{"class":1016},[957,1520,1521],{"class":1020},"pepper-secret",[957,1523,978],{"class":1016},[957,1525,1026],{"class":963},[957,1527,1529,1531,1534,1536,1538,1541],{"class":959,"line":1528},38,[957,1530,991],{"class":970},[957,1532,1533],{"class":974},"hashLength",[957,1535,978],{"class":970},[957,1537,982],{"class":981},[957,1539,1540],{"class":1041}," 50",[957,1542,1026],{"class":963},[957,1544,1546,1548,1551,1553,1555,1558],{"class":959,"line":1545},39,[957,1547,991],{"class":970},[957,1549,1550],{"class":974},"timeCost",[957,1552,978],{"class":970},[957,1554,982],{"class":981},[957,1556,1557],{"class":1041}," 4",[957,1559,1026],{"class":963},[957,1561,1563,1565,1568,1570,1572],{"class":959,"line":1562},40,[957,1564,991],{"class":970},[957,1566,1567],{"class":974},"memoryCost",[957,1569,978],{"class":970},[957,1571,982],{"class":981},[957,1573,1574],{"class":1041}," 262144\n",[957,1576,1578],{"class":959,"line":1577},41,[957,1579,1265],{"class":963},[957,1581,1583,1585,1588,1590,1592],{"class":959,"line":1582},42,[957,1584,971],{"class":970},[957,1586,1587],{"class":974},"botDetector",[957,1589,978],{"class":970},[957,1591,982],{"class":981},[957,1593,985],{"class":963},[957,1595,1597,1599,1602,1604,1606],{"class":959,"line":1596},43,[957,1598,991],{"class":970},[957,1600,1601],{"class":974},"enableBotDetector",[957,1603,978],{"class":970},[957,1605,982],{"class":981},[957,1607,1608],{"class":1384}," false\n",[957,1610,1612],{"class":959,"line":1611},44,[957,1613,1265],{"class":963},[957,1615,1617,1619,1622,1624,1626],{"class":959,"line":1616},45,[957,1618,971],{"class":970},[957,1620,1621],{"class":974},"htmlSanitizer",[957,1623,978],{"class":970},[957,1625,982],{"class":981},[957,1627,985],{"class":963},[957,1629,1631,1633,1636,1638,1640,1642],{"class":959,"line":1630},46,[957,1632,991],{"class":970},[957,1634,1635],{"class":974},"IrritationCount",[957,1637,978],{"class":970},[957,1639,982],{"class":981},[957,1641,1540],{"class":1041},[957,1643,1026],{"class":963},[957,1645,1647,1649,1652,1654,1656],{"class":959,"line":1646},47,[957,1648,991],{"class":970},[957,1650,1651],{"class":974},"maxAllowedInputLength",[957,1653,978],{"class":970},[957,1655,982],{"class":981},[957,1657,1658],{"class":1041}," 20000\n",[957,1660,1662],{"class":959,"line":1661},48,[957,1663,1265],{"class":963},[957,1665,1667,1669,1672,1674,1676],{"class":959,"line":1666},49,[957,1668,971],{"class":970},[957,1670,1671],{"class":974},"magic_links",[957,1673,978],{"class":970},[957,1675,982],{"class":981},[957,1677,985],{"class":963},[957,1679,1681,1683,1686,1688,1690,1692,1695,1697],{"class":959,"line":1680},50,[957,1682,991],{"class":970},[957,1684,1685],{"class":974},"jwt_secret_key",[957,1687,978],{"class":970},[957,1689,982],{"class":981},[957,1691,1017],{"class":1016},[957,1693,1694],{"class":1020},"long_secret",[957,1696,978],{"class":1016},[957,1698,1026],{"class":963},[957,1700,1702,1704,1707,1709,1711,1713,1716,1718],{"class":959,"line":1701},51,[957,1703,991],{"class":970},[957,1705,1706],{"class":974},"expiresIn",[957,1708,978],{"class":970},[957,1710,982],{"class":981},[957,1712,1017],{"class":1016},[957,1714,1715],{"class":1020},"20m",[957,1717,978],{"class":1016},[957,1719,1026],{"class":963},[957,1721,1723,1725,1728,1730,1732,1734,1737,1739],{"class":959,"line":1722},52,[957,1724,991],{"class":970},[957,1726,1727],{"class":974},"domain",[957,1729,978],{"class":970},[957,1731,982],{"class":981},[957,1733,1017],{"class":1016},[957,1735,1736],{"class":1020},"http:\u002F\u002Fyour-domain:10000",[957,1738,978],{"class":1016},[957,1740,1026],{"class":963},[957,1742,1744,1746,1749,1751,1753],{"class":959,"line":1743},53,[957,1745,991],{"class":970},[957,1747,1748],{"class":974},"notificationEmail",[957,1750,978],{"class":970},[957,1752,982],{"class":981},[957,1754,985],{"class":963},[957,1756,1758,1760,1763,1765,1767,1769,1772,1774],{"class":959,"line":1757},54,[957,1759,1006],{"class":970},[957,1761,1762],{"class":974},"websiteName",[957,1764,978],{"class":970},[957,1766,982],{"class":981},[957,1768,1017],{"class":1016},[957,1770,1771],{"class":1020},"My Cool Website",[957,1773,978],{"class":1016},[957,1775,1026],{"class":963},[957,1777,1779,1781,1784,1786,1788,1790,1793,1795],{"class":959,"line":1778},55,[957,1780,1006],{"class":970},[957,1782,1783],{"class":974},"privacyPolicyLink",[957,1785,978],{"class":970},[957,1787,982],{"class":981},[957,1789,1017],{"class":1016},[957,1791,1792],{"class":1020},"https:\u002F\u002Fyour-domain\u002Fprivacy",[957,1794,978],{"class":1016},[957,1796,1026],{"class":963},[957,1798,1800,1802,1805,1807,1809,1811,1814,1816],{"class":959,"line":1799},56,[957,1801,1006],{"class":970},[957,1803,1804],{"class":974},"contactPageLink",[957,1806,978],{"class":970},[957,1808,982],{"class":981},[957,1810,1017],{"class":1016},[957,1812,1813],{"class":1020},"https:\u002F\u002Fyour-domain\u002Fcontact",[957,1815,978],{"class":1016},[957,1817,1026],{"class":963},[957,1819,1821,1823,1826,1828,1830,1832,1835,1837],{"class":959,"line":1820},57,[957,1822,1006],{"class":970},[957,1824,1825],{"class":974},"changePasswordPageLink",[957,1827,978],{"class":970},[957,1829,982],{"class":981},[957,1831,1017],{"class":1016},[957,1833,1834],{"class":1020},"https:\u002F\u002Fyour-domain\u002Faccounts",[957,1836,978],{"class":1016},[957,1838,1026],{"class":963},[957,1840,1842,1844,1847,1849,1851,1853,1855],{"class":959,"line":1841},58,[957,1843,1006],{"class":970},[957,1845,1846],{"class":974},"loginPageLink",[957,1848,978],{"class":970},[957,1850,982],{"class":981},[957,1852,1017],{"class":1016},[957,1854,1834],{"class":1020},[957,1856,1106],{"class":1016},[957,1858,1860],{"class":959,"line":1859},59,[957,1861,1259],{"class":963},[957,1863,1865],{"class":959,"line":1864},60,[957,1866,1265],{"class":963},[957,1868,1870,1872,1875,1877,1879],{"class":959,"line":1869},61,[957,1871,971],{"class":970},[957,1873,1874],{"class":974},"providers",[957,1876,978],{"class":970},[957,1878,982],{"class":981},[957,1880,1881],{"class":963}," [\n",[957,1883,1885],{"class":959,"line":1884},62,[957,1886,1887],{"class":963},"            {\n",[957,1889,1891,1893,1896,1898,1900,1902,1905,1907],{"class":959,"line":1890},63,[957,1892,1145],{"class":970},[957,1894,1895],{"class":974},"name",[957,1897,978],{"class":970},[957,1899,982],{"class":981},[957,1901,1017],{"class":1016},[957,1903,1904],{"class":1020},"google",[957,1906,978],{"class":1016},[957,1908,1026],{"class":963},[957,1910,1912,1914,1917,1919,1921],{"class":959,"line":1911},64,[957,1913,1145],{"class":970},[957,1915,1916],{"class":974},"fields",[957,1918,978],{"class":970},[957,1920,982],{"class":981},[957,1922,985],{"class":963},[957,1924,1926,1929,1932,1934,1936,1938,1941,1943],{"class":959,"line":1925},65,[957,1927,1928],{"class":970},"                    \"",[957,1930,1931],{"class":974},"iss",[957,1933,978],{"class":970},[957,1935,982],{"class":981},[957,1937,1017],{"class":1016},[957,1939,1940],{"class":1020},"safeString?",[957,1942,978],{"class":1016},[957,1944,1026],{"class":963},[957,1946,1948,1950,1953,1955,1957,1959,1961,1963],{"class":959,"line":1947},66,[957,1949,1928],{"class":970},[957,1951,1952],{"class":974},"azp",[957,1954,978],{"class":970},[957,1956,982],{"class":981},[957,1958,1017],{"class":1016},[957,1960,1940],{"class":1020},[957,1962,978],{"class":1016},[957,1964,1026],{"class":963},[957,1966,1968,1970,1973,1975,1977,1979,1982,1984],{"class":959,"line":1967},67,[957,1969,1928],{"class":970},[957,1971,1972],{"class":974},"sub",[957,1974,978],{"class":970},[957,1976,982],{"class":981},[957,1978,1017],{"class":1016},[957,1980,1981],{"class":1020},"string",[957,1983,978],{"class":1016},[957,1985,1026],{"class":963},[957,1987,1989,1991,1994,1996,1998,2000,2003,2005],{"class":959,"line":1988},68,[957,1990,1928],{"class":970},[957,1992,1993],{"class":974},"email",[957,1995,978],{"class":970},[957,1997,982],{"class":981},[957,1999,1017],{"class":1016},[957,2001,2002],{"class":1020},"safeString",[957,2004,978],{"class":1016},[957,2006,1026],{"class":963},[957,2008,2010,2012,2015,2017,2019,2021,2024,2026],{"class":959,"line":2009},69,[957,2011,1928],{"class":970},[957,2013,2014],{"class":974},"email_verified",[957,2016,978],{"class":970},[957,2018,982],{"class":981},[957,2020,1017],{"class":1016},[957,2022,2023],{"class":1020},"boolean",[957,2025,978],{"class":1016},[957,2027,1026],{"class":963},[957,2029,2031,2033,2035,2037,2039,2041,2043,2045],{"class":959,"line":2030},70,[957,2032,1928],{"class":970},[957,2034,1895],{"class":974},[957,2036,978],{"class":970},[957,2038,982],{"class":981},[957,2040,1017],{"class":1016},[957,2042,2002],{"class":1020},[957,2044,978],{"class":1016},[957,2046,1026],{"class":963},[957,2048,2050,2052,2055,2057,2059,2061,2063,2065],{"class":959,"line":2049},71,[957,2051,1928],{"class":970},[957,2053,2054],{"class":974},"given_name",[957,2056,978],{"class":970},[957,2058,982],{"class":981},[957,2060,1017],{"class":1016},[957,2062,2002],{"class":1020},[957,2064,978],{"class":1016},[957,2066,1026],{"class":963},[957,2068,2070,2072,2075,2077,2079,2081,2083,2085],{"class":959,"line":2069},72,[957,2071,1928],{"class":970},[957,2073,2074],{"class":974},"picture",[957,2076,978],{"class":970},[957,2078,982],{"class":981},[957,2080,1017],{"class":1016},[957,2082,2002],{"class":1020},[957,2084,978],{"class":1016},[957,2086,1026],{"class":963},[957,2088,2090,2092,2095,2097,2099,2101,2103,2105],{"class":959,"line":2089},73,[957,2091,1928],{"class":970},[957,2093,2094],{"class":974},"family_name",[957,2096,978],{"class":970},[957,2098,982],{"class":981},[957,2100,1017],{"class":1016},[957,2102,1940],{"class":1020},[957,2104,978],{"class":1016},[957,2106,1026],{"class":963},[957,2108,2110,2112,2115,2117,2119,2121,2123],{"class":959,"line":2109},74,[957,2111,1928],{"class":970},[957,2113,2114],{"class":974},"locale",[957,2116,978],{"class":970},[957,2118,982],{"class":981},[957,2120,1017],{"class":1016},[957,2122,1940],{"class":1020},[957,2124,1106],{"class":1016},[957,2126,2128],{"class":959,"line":2127},75,[957,2129,2130],{"class":963},"                }\n",[957,2132,2134],{"class":959,"line":2133},76,[957,2135,1235],{"class":963},[957,2137,2139],{"class":959,"line":2138},77,[957,2140,1887],{"class":963},[957,2142,2144,2146,2148,2150,2152,2154,2157,2159],{"class":959,"line":2143},78,[957,2145,1145],{"class":970},[957,2147,1895],{"class":974},[957,2149,978],{"class":970},[957,2151,982],{"class":981},[957,2153,1017],{"class":1016},[957,2155,2156],{"class":1020},"github",[957,2158,978],{"class":1016},[957,2160,1026],{"class":963},[957,2162,2164,2166,2169,2171,2173],{"class":959,"line":2163},79,[957,2165,1145],{"class":970},[957,2167,2168],{"class":974},"useStandardProfile",[957,2170,978],{"class":970},[957,2172,982],{"class":981},[957,2174,2175],{"class":1384}," true\n",[957,2177,2179],{"class":959,"line":2178},80,[957,2180,1235],{"class":963},[957,2182,2184],{"class":959,"line":2183},81,[957,2185,1887],{"class":963},[957,2187,2189,2191,2193,2195,2197,2199,2202,2204],{"class":959,"line":2188},82,[957,2190,1145],{"class":970},[957,2192,1895],{"class":974},[957,2194,978],{"class":970},[957,2196,982],{"class":981},[957,2198,1017],{"class":1016},[957,2200,2201],{"class":1020},"x",[957,2203,978],{"class":1016},[957,2205,1026],{"class":963},[957,2207,2209,2211,2213,2215,2217],{"class":959,"line":2208},83,[957,2210,1145],{"class":970},[957,2212,2168],{"class":974},[957,2214,978],{"class":970},[957,2216,982],{"class":981},[957,2218,2175],{"class":1384},[957,2220,2222],{"class":959,"line":2221},84,[957,2223,1235],{"class":963},[957,2225,2227],{"class":959,"line":2226},85,[957,2228,1887],{"class":963},[957,2230,2232,2234,2236,2238,2240,2242,2245,2247],{"class":959,"line":2231},86,[957,2233,1145],{"class":970},[957,2235,1895],{"class":974},[957,2237,978],{"class":970},[957,2239,982],{"class":981},[957,2241,1017],{"class":1016},[957,2243,2244],{"class":1020},"linkedin",[957,2246,978],{"class":1016},[957,2248,1026],{"class":963},[957,2250,2252,2254,2256,2258,2260],{"class":959,"line":2251},87,[957,2253,1145],{"class":970},[957,2255,2168],{"class":974},[957,2257,978],{"class":970},[957,2259,982],{"class":981},[957,2261,2175],{"class":1384},[957,2263,2265],{"class":959,"line":2264},88,[957,2266,2267],{"class":963},"            }\n",[957,2269,2271],{"class":959,"line":2270},89,[957,2272,2273],{"class":963},"    ],\n",[957,2275,2277],{"class":959,"line":2276},90,[957,2278,2279],{"class":963},"    \n",[957,2281,2283,2285,2288,2290,2292],{"class":959,"line":2282},91,[957,2284,971],{"class":970},[957,2286,2287],{"class":974},"jwt",[957,2289,978],{"class":970},[957,2291,982],{"class":981},[957,2293,985],{"class":963},[957,2295,2297,2299,2301,2303,2305,2307,2310,2312],{"class":959,"line":2296},92,[957,2298,991],{"class":970},[957,2300,1685],{"class":974},[957,2302,978],{"class":970},[957,2304,982],{"class":981},[957,2306,1017],{"class":1016},[957,2308,2309],{"class":1020},"super_long_secret",[957,2311,978],{"class":1016},[957,2313,1026],{"class":963},[957,2315,2317,2319,2322,2324,2326],{"class":959,"line":2316},93,[957,2318,991],{"class":970},[957,2320,2321],{"class":974},"access_tokens",[957,2323,978],{"class":970},[957,2325,982],{"class":981},[957,2327,985],{"class":963},[957,2329,2331,2333,2335,2337,2339,2341,2344,2346],{"class":959,"line":2330},94,[957,2332,1006],{"class":970},[957,2334,1706],{"class":974},[957,2336,978],{"class":970},[957,2338,982],{"class":981},[957,2340,1017],{"class":1016},[957,2342,2343],{"class":1020},"15m",[957,2345,978],{"class":1016},[957,2347,1026],{"class":963},[957,2349,2351,2353,2356,2358,2360,2363],{"class":959,"line":2350},95,[957,2352,1006],{"class":970},[957,2354,2355],{"class":974},"expiresInMs",[957,2357,978],{"class":970},[957,2359,982],{"class":981},[957,2361,2362],{"class":1041}," 900000",[957,2364,1026],{"class":963},[957,2366,2368,2370,2373,2375,2377,2379,2382],{"class":959,"line":2367},96,[957,2369,1006],{"class":970},[957,2371,2372],{"class":974},"algorithm",[957,2374,978],{"class":970},[957,2376,982],{"class":981},[957,2378,1017],{"class":1016},[957,2380,2381],{"class":1020},"HS512",[957,2383,1106],{"class":1016},[957,2385,2387],{"class":959,"line":2386},97,[957,2388,1112],{"class":963},[957,2390,2392,2394,2397,2399,2401],{"class":959,"line":2391},98,[957,2393,991],{"class":970},[957,2395,2396],{"class":974},"refresh_tokens",[957,2398,978],{"class":970},[957,2400,982],{"class":981},[957,2402,985],{"class":963},[957,2404,2406,2408,2411,2413,2415,2418],{"class":959,"line":2405},99,[957,2407,1006],{"class":970},[957,2409,2410],{"class":974},"refresh_ttl",[957,2412,978],{"class":970},[957,2414,982],{"class":981},[957,2416,2417],{"class":1041}," 259200000",[957,2419,1026],{"class":963},[957,2421,2423,2425,2427,2429,2431,2433,2436,2438],{"class":959,"line":2422},100,[957,2424,1006],{"class":970},[957,2426,1727],{"class":974},[957,2428,978],{"class":970},[957,2430,982],{"class":981},[957,2432,1017],{"class":1016},[957,2434,2435],{"class":1020},"localhost",[957,2437,978],{"class":1016},[957,2439,1026],{"class":963},[957,2441,2443,2445,2448,2450,2452,2455],{"class":959,"line":2442},101,[957,2444,1006],{"class":970},[957,2446,2447],{"class":974},"MAX_SESSION_LIFE",[957,2449,978],{"class":970},[957,2451,982],{"class":981},[957,2453,2454],{"class":1041}," 2592000000",[957,2456,1026],{"class":963},[957,2458,2460,2462,2465,2467,2469,2472],{"class":959,"line":2459},102,[957,2461,1006],{"class":970},[957,2463,2464],{"class":974},"maxAllowedSessionsPerUser",[957,2466,978],{"class":970},[957,2468,982],{"class":981},[957,2470,2471],{"class":1041}," 5",[957,2473,1026],{"class":963},[957,2475,2477,2479,2482,2484,2486],{"class":959,"line":2476},103,[957,2478,1006],{"class":970},[957,2480,2481],{"class":974},"byPassAnomaliesFor",[957,2483,978],{"class":970},[957,2485,982],{"class":981},[957,2487,2488],{"class":1041}," 10800000\n",[957,2490,2492],{"class":959,"line":2491},104,[957,2493,1259],{"class":963},[957,2495,2497],{"class":959,"line":2496},105,[957,2498,1265],{"class":963},[957,2500,2502,2504,2506,2508,2510],{"class":959,"line":2501},106,[957,2503,971],{"class":970},[957,2505,1993],{"class":974},[957,2507,978],{"class":970},[957,2509,982],{"class":981},[957,2511,985],{"class":963},[957,2513,2515,2517,2520,2522,2524,2526,2529,2531],{"class":959,"line":2514},107,[957,2516,991],{"class":970},[957,2518,2519],{"class":974},"resend_key",[957,2521,978],{"class":970},[957,2523,982],{"class":981},[957,2525,1017],{"class":1016},[957,2527,2528],{"class":1020},"12345",[957,2530,978],{"class":1016},[957,2532,1026],{"class":963},[957,2534,2536,2538,2540,2542,2544,2546,2549],{"class":959,"line":2535},108,[957,2537,991],{"class":970},[957,2539,1993],{"class":974},[957,2541,978],{"class":970},[957,2543,982],{"class":981},[957,2545,1017],{"class":1016},[957,2547,2548],{"class":1020},"noreply@example.com",[957,2550,1106],{"class":1016},[957,2552,2554],{"class":959,"line":2553},109,[957,2555,1265],{"class":963},[957,2557,2559,2561,2564,2566,2568,2570,2573],{"class":959,"line":2558},110,[957,2560,971],{"class":970},[957,2562,2563],{"class":974},"logLevel",[957,2565,978],{"class":970},[957,2567,982],{"class":981},[957,2569,1017],{"class":1016},[957,2571,2572],{"class":1020},"info",[957,2574,1106],{"class":1016},[957,2576,2578],{"class":959,"line":2577},111,[957,2579,2580],{"class":963},"}\n",[856,2582,2583],{},"Generate a key-pair for encrypting your config:",[948,2585,2590],{"className":2586,"code":2587,"filename":2588,"language":2589,"meta":953,"style":953},"language-bash shiki shiki-themes light-plus light-plus dracula","age-keygen -o age_key && age-keygen -y age_key > public_key\n","Terminal","bash",[860,2591,2592],{"__ignoreMap":953},[957,2593,2594,2597,2600,2603,2606,2608,2611,2613,2616],{"class":959,"line":960},[957,2595,918],{"class":2596},"sHOzp",[957,2598,2599],{"class":1384}," -o",[957,2601,2602],{"class":1020}," age_key",[957,2604,2605],{"class":963}," && ",[957,2607,918],{"class":2596},[957,2609,2610],{"class":1384}," -y",[957,2612,2602],{"class":1020},[957,2614,2615],{"class":981}," >",[957,2617,2618],{"class":1020}," public_key\n",[856,2620,2621],{},"This will generate 2 files:",[2623,2624,2625],"ul",{},[2626,2627,2628,2631],"li",{},[860,2629,2630],{},"age_key"," This is your private key, loosing it will prevent you from decrypting your config file, access to it from unauthorized actors will gain access to your configuration file.",[2633,2634,2635],"warning",{},[856,2636,2637],{},"Make sure you store it in a appropriate secret manager",[2623,2639,2640],{},[2626,2641,2642,2645],{},[860,2643,2644],{},"public_key"," this is the public key, you can delete it in any time and generate a new one, it does not contain sensitive information.",[856,2647,2648],{},"Encrypt your configuration file:",[948,2650,2652],{"className":2586,"code":2651,"filename":2588,"language":2589,"meta":953,"style":953},"age -a -e -r \"$(cat public_key)\" -o config.json.age config.json\n",[860,2653,2654],{"__ignoreMap":953},[957,2655,2656,2658,2661,2664,2667,2669,2672,2675,2678,2680,2682,2685],{"class":959,"line":960},[957,2657,866],{"class":2596},[957,2659,2660],{"class":1384}," -a",[957,2662,2663],{"class":1384}," -e",[957,2665,2666],{"class":1384}," -r",[957,2668,1017],{"class":1016},[957,2670,2671],{"class":1020},"$(",[957,2673,2674],{"class":2596},"cat",[957,2676,2677],{"class":1020}," public_key)",[957,2679,978],{"class":1016},[957,2681,2599],{"class":1384},[957,2683,2684],{"class":1020}," config.json.age",[957,2686,2687],{"class":1020}," config.json\n",[856,2689,2690,2691,2694],{},"This will output the encrypted config file ",[860,2692,2693],{},"config.json.age",". The docker image uses this file, and does the following:",[2623,2696,2697,2700,2703,2706,2709],{},[2626,2698,2699],{},"Pick it up from the docker secrets",[2626,2701,2702],{},"Decrypts it via the entrypoint script",[2626,2704,2705],{},"Starts the service",[2626,2707,2708],{},"The service loads the configuration file parses it and starts.",[2626,2710,2711],{},"The service is then deletes the raw file from the container.",[2713,2714,2715],"caution",{},[856,2716,2717,2718,2720,2721,2723,2724,2726],{},"The ",[860,2719,2630],{}," file and ",[860,2722,2693],{}," are kept. They needed for restarts.\nWithout the ",[860,2725,2630],{}," file, the service could not restart.",[856,2728,2729],{},"Write your compose file:",[948,2731,2736],{"className":2732,"code":2733,"filename":2734,"language":2735,"meta":953,"style":953},"language-yaml shiki shiki-themes light-plus light-plus dracula","services:\n  mysql: \n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_ROOT_PASSWORD: very_secure_password\n      MYSQL_DATABASE: my_auth\n      MYSQL_USER: alice\n      MYSQL_PASSWORD: very_secure_password\n    cap_drop: [\"ALL\"]\n    user: \"999:999\"\n    security_opt: \n      - \"no-new-privileges:true\"\n    volumes:\n      - sql_db:\u002Fvar\u002Flib\u002Fmysql\n    healthcheck:\n      test: [\"CMD-SHELL\", \"bash -lc 'exec 3\u003C>\u002Fdev\u002Ftcp\u002F127.0.0.1\u002F3306'\"]\n      interval: 10s\n      timeout: 8s \n      retries: 5\n      start_period: 7m\n    networks:\n      backend:\n        ipv4_address: 172.20.5.3   \n\n  auth:\n    image: sergio68\u002Fauth\n    read_only: true  \n    restart: unless-stopped\n    cap_drop: [\"ALL\"]\n    user: 10001:10001\n    volumes: \n      - .\u002Fauth-logs\u002Fserver:\u002Fapp\u002Fauth-logs:rw\n      - .\u002Fauth-logs\u002Fserver\u002Fbot-detector:\u002Fapp\u002Fbot-detector-logs:rw\n      - bot-detector-data:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw\n      - email-data:\u002Fapp\u002Fdist\u002Femail-db:rw\n    tmpfs:\n      - \u002Frun\u002Fapp:rw,noexec,nosuid,nodev,uid=10001,gid=10001,size=1m\n    pids_limit: 200\n    secrets:\n      - age_key\n      - encrypted_config\n    security_opt:\n      - \"no-new-privileges:true\"\n    depends_on:\n      mysql:\n        condition: service_healthy\n    networks:\n      backend:\n        ipv4_address: 172.20.5.2 \n      egress: \n        ipv4_address: 172.22.20.2\n\n  app:\n    # Your app container\n    build: .\n    depends_on:\n      auth:\n        condition: service_healthy\n    networks:\n      frontend: \n        ipv4_address: 172.21.10.4 # Can be omitted\n      backend:\n        ipv4_address: 172.20.5.4\n\nvolumes:\n  sql_db:  \n  bot-detector-data:\n  email-data:\n\nsecrets:\n  age_key:\n    file: .\u002Fsecrets\u002Fauth\u002Fage_key\n  encrypted_config:\n    file: .\u002Fsecrets\u002Fauth\u002Fconfig.json.age\n    \nnetworks: \n  backend: \n    internal: true\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.20.0.0\u002F16\n          ip_range: 172.20.5.0\u002F24\n          gateway: 172.20.5.1\n  frontend:\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.21.10.0\u002F24\n          gateway: 172.21.10.1\n  egress:\n    internal: false\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.22.20.0\u002F24\n          gateway: 172.22.20.1\n","docker-compose.yml","yaml",[860,2737,2738,2747,2757,2768,2778,2785,2795,2805,2815,2824,2844,2858,2867,2879,2886,2893,2900,2928,2938,2950,2960,2970,2977,2984,2997,3002,3009,3018,3030,3038,3054,3063,3071,3078,3085,3092,3099,3106,3113,3123,3130,3137,3144,3150,3160,3167,3174,3184,3190,3196,3207,3216,3225,3229,3236,3242,3252,3258,3265,3273,3279,3288,3300,3306,3315,3319,3326,3335,3342,3349,3353,3360,3367,3377,3384,3393,3397,3406,3415,3424,3433,3440,3447,3460,3470,3480,3487,3495,3501,3507,3518,3527,3534,3542,3550,3556,3562,3573],{"__ignoreMap":953},[957,2739,2740,2744],{"class":959,"line":960},[957,2741,2743],{"class":2742},"sXrRR","services",[957,2745,2746],{"class":981},":\n",[957,2748,2749,2752,2754],{"class":959,"line":967},[957,2750,2751],{"class":2742},"  mysql",[957,2753,982],{"class":981},[957,2755,2756],{"class":963}," \n",[957,2758,2759,2762,2764],{"class":959,"line":988},[957,2760,2761],{"class":2742},"    image",[957,2763,982],{"class":981},[957,2765,2767],{"class":2766},"sKKzR"," mysql:8\n",[957,2769,2770,2773,2775],{"class":959,"line":1003},[957,2771,2772],{"class":2742},"    restart",[957,2774,982],{"class":981},[957,2776,2777],{"class":2766}," unless-stopped\n",[957,2779,2780,2783],{"class":959,"line":1029},[957,2781,2782],{"class":2742},"    environment",[957,2784,2746],{"class":981},[957,2786,2787,2790,2792],{"class":959,"line":1047},[957,2788,2789],{"class":2742},"      MYSQL_ROOT_PASSWORD",[957,2791,982],{"class":981},[957,2793,2794],{"class":2766}," very_secure_password\n",[957,2796,2797,2800,2802],{"class":959,"line":1068},[957,2798,2799],{"class":2742},"      MYSQL_DATABASE",[957,2801,982],{"class":981},[957,2803,2804],{"class":2766}," my_auth\n",[957,2806,2807,2810,2812],{"class":959,"line":1089},[957,2808,2809],{"class":2742},"      MYSQL_USER",[957,2811,982],{"class":981},[957,2813,2814],{"class":2766}," alice\n",[957,2816,2817,2820,2822],{"class":959,"line":1109},[957,2818,2819],{"class":2742},"      MYSQL_PASSWORD",[957,2821,982],{"class":981},[957,2823,2794],{"class":2766},[957,2825,2826,2829,2831,2834,2836,2839,2841],{"class":959,"line":1115},[957,2827,2828],{"class":2742},"    cap_drop",[957,2830,982],{"class":981},[957,2832,2833],{"class":963}," [",[957,2835,978],{"class":1016},[957,2837,2838],{"class":1020},"ALL",[957,2840,978],{"class":1016},[957,2842,2843],{"class":963},"]\n",[957,2845,2846,2849,2851,2853,2856],{"class":959,"line":1129},[957,2847,2848],{"class":2742},"    user",[957,2850,982],{"class":981},[957,2852,1017],{"class":1016},[957,2854,2855],{"class":1020},"999:999",[957,2857,1106],{"class":1016},[957,2859,2860,2863,2865],{"class":959,"line":1142},[957,2861,2862],{"class":2742},"    security_opt",[957,2864,982],{"class":981},[957,2866,2756],{"class":963},[957,2868,2869,2872,2874,2877],{"class":959,"line":1162},[957,2870,2871],{"class":981},"      -",[957,2873,1017],{"class":1016},[957,2875,2876],{"class":1020},"no-new-privileges:true",[957,2878,1106],{"class":1016},[957,2880,2881,2884],{"class":959,"line":1177},[957,2882,2883],{"class":2742},"    volumes",[957,2885,2746],{"class":981},[957,2887,2888,2890],{"class":959,"line":1196},[957,2889,2871],{"class":981},[957,2891,2892],{"class":2766}," sql_db:\u002Fvar\u002Flib\u002Fmysql\n",[957,2894,2895,2898],{"class":959,"line":1215},[957,2896,2897],{"class":2742},"    healthcheck",[957,2899,2746],{"class":981},[957,2901,2902,2905,2907,2909,2911,2914,2916,2919,2921,2924,2926],{"class":959,"line":1232},[957,2903,2904],{"class":2742},"      test",[957,2906,982],{"class":981},[957,2908,2833],{"class":963},[957,2910,978],{"class":1016},[957,2912,2913],{"class":1020},"CMD-SHELL",[957,2915,978],{"class":1016},[957,2917,2918],{"class":963},", ",[957,2920,978],{"class":1016},[957,2922,2923],{"class":1020},"bash -lc 'exec 3\u003C>\u002Fdev\u002Ftcp\u002F127.0.0.1\u002F3306'",[957,2925,978],{"class":1016},[957,2927,2843],{"class":963},[957,2929,2930,2933,2935],{"class":959,"line":1238},[957,2931,2932],{"class":2742},"      interval",[957,2934,982],{"class":981},[957,2936,2937],{"class":2766}," 10s\n",[957,2939,2940,2943,2945,2948],{"class":959,"line":1256},[957,2941,2942],{"class":2742},"      timeout",[957,2944,982],{"class":981},[957,2946,2947],{"class":2766}," 8s",[957,2949,2756],{"class":963},[957,2951,2952,2955,2957],{"class":959,"line":1262},[957,2953,2954],{"class":2742},"      retries",[957,2956,982],{"class":981},[957,2958,2959],{"class":1041}," 5\n",[957,2961,2962,2965,2967],{"class":959,"line":1268},[957,2963,2964],{"class":2742},"      start_period",[957,2966,982],{"class":981},[957,2968,2969],{"class":2766}," 7m\n",[957,2971,2972,2975],{"class":959,"line":1282},[957,2973,2974],{"class":2742},"    networks",[957,2976,2746],{"class":981},[957,2978,2979,2982],{"class":959,"line":1296},[957,2980,2981],{"class":2742},"      backend",[957,2983,2746],{"class":981},[957,2985,2986,2989,2991,2994],{"class":959,"line":1317},[957,2987,2988],{"class":2742},"        ipv4_address",[957,2990,982],{"class":981},[957,2992,2993],{"class":1041}," 172.20.5.3",[957,2995,2996],{"class":963},"   \n",[957,2998,2999],{"class":959,"line":1338},[957,3000,3001],{"emptyLinePlaceholder":8},"\n",[957,3003,3004,3007],{"class":959,"line":1353},[957,3005,3006],{"class":2742},"  auth",[957,3008,2746],{"class":981},[957,3010,3011,3013,3015],{"class":959,"line":1358},[957,3012,2761],{"class":2742},[957,3014,982],{"class":981},[957,3016,3017],{"class":2766}," sergio68\u002Fauth\n",[957,3019,3020,3023,3025,3027],{"class":959,"line":1372},[957,3021,3022],{"class":2742},"    read_only",[957,3024,982],{"class":981},[957,3026,1385],{"class":1384},[957,3028,3029],{"class":963},"  \n",[957,3031,3032,3034,3036],{"class":959,"line":1390},[957,3033,2772],{"class":2742},[957,3035,982],{"class":981},[957,3037,2777],{"class":2766},[957,3039,3040,3042,3044,3046,3048,3050,3052],{"class":959,"line":1411},[957,3041,2828],{"class":2742},[957,3043,982],{"class":981},[957,3045,2833],{"class":963},[957,3047,978],{"class":1016},[957,3049,2838],{"class":1020},[957,3051,978],{"class":1016},[957,3053,2843],{"class":963},[957,3055,3056,3058,3060],{"class":959,"line":1429},[957,3057,2848],{"class":2742},[957,3059,982],{"class":981},[957,3061,3062],{"class":2766}," 10001:10001\n",[957,3064,3065,3067,3069],{"class":959,"line":1434},[957,3066,2883],{"class":2742},[957,3068,982],{"class":981},[957,3070,2756],{"class":963},[957,3072,3073,3075],{"class":959,"line":1450},[957,3074,2871],{"class":981},[957,3076,3077],{"class":2766}," .\u002Fauth-logs\u002Fserver:\u002Fapp\u002Fauth-logs:rw\n",[957,3079,3080,3082],{"class":959,"line":1471},[957,3081,2871],{"class":981},[957,3083,3084],{"class":2766}," .\u002Fauth-logs\u002Fserver\u002Fbot-detector:\u002Fapp\u002Fbot-detector-logs:rw\n",[957,3086,3087,3089],{"class":959,"line":1489},[957,3088,2871],{"class":981},[957,3090,3091],{"class":2766}," bot-detector-data:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw\n",[957,3093,3094,3096],{"class":959,"line":1494},[957,3095,2871],{"class":981},[957,3097,3098],{"class":2766}," email-data:\u002Fapp\u002Fdist\u002Femail-db:rw\n",[957,3100,3101,3104],{"class":959,"line":1507},[957,3102,3103],{"class":2742},"    tmpfs",[957,3105,2746],{"class":981},[957,3107,3108,3110],{"class":959,"line":1528},[957,3109,2871],{"class":981},[957,3111,3112],{"class":2766}," \u002Frun\u002Fapp:rw,noexec,nosuid,nodev,uid=10001,gid=10001,size=1m\n",[957,3114,3115,3118,3120],{"class":959,"line":1545},[957,3116,3117],{"class":2742},"    pids_limit",[957,3119,982],{"class":981},[957,3121,3122],{"class":1041}," 200\n",[957,3124,3125,3128],{"class":959,"line":1562},[957,3126,3127],{"class":2742},"    secrets",[957,3129,2746],{"class":981},[957,3131,3132,3134],{"class":959,"line":1577},[957,3133,2871],{"class":981},[957,3135,3136],{"class":2766}," age_key\n",[957,3138,3139,3141],{"class":959,"line":1582},[957,3140,2871],{"class":981},[957,3142,3143],{"class":2766}," encrypted_config\n",[957,3145,3146,3148],{"class":959,"line":1596},[957,3147,2862],{"class":2742},[957,3149,2746],{"class":981},[957,3151,3152,3154,3156,3158],{"class":959,"line":1611},[957,3153,2871],{"class":981},[957,3155,1017],{"class":1016},[957,3157,2876],{"class":1020},[957,3159,1106],{"class":1016},[957,3161,3162,3165],{"class":959,"line":1616},[957,3163,3164],{"class":2742},"    depends_on",[957,3166,2746],{"class":981},[957,3168,3169,3172],{"class":959,"line":1630},[957,3170,3171],{"class":2742},"      mysql",[957,3173,2746],{"class":981},[957,3175,3176,3179,3181],{"class":959,"line":1646},[957,3177,3178],{"class":2742},"        condition",[957,3180,982],{"class":981},[957,3182,3183],{"class":2766}," service_healthy\n",[957,3185,3186,3188],{"class":959,"line":1661},[957,3187,2974],{"class":2742},[957,3189,2746],{"class":981},[957,3191,3192,3194],{"class":959,"line":1666},[957,3193,2981],{"class":2742},[957,3195,2746],{"class":981},[957,3197,3198,3200,3202,3205],{"class":959,"line":1680},[957,3199,2988],{"class":2742},[957,3201,982],{"class":981},[957,3203,3204],{"class":1041}," 172.20.5.2",[957,3206,2756],{"class":963},[957,3208,3209,3212,3214],{"class":959,"line":1701},[957,3210,3211],{"class":2742},"      egress",[957,3213,982],{"class":981},[957,3215,2756],{"class":963},[957,3217,3218,3220,3222],{"class":959,"line":1722},[957,3219,2988],{"class":2742},[957,3221,982],{"class":981},[957,3223,3224],{"class":1041}," 172.22.20.2\n",[957,3226,3227],{"class":959,"line":1743},[957,3228,3001],{"emptyLinePlaceholder":8},[957,3230,3231,3234],{"class":959,"line":1757},[957,3232,3233],{"class":2742},"  app",[957,3235,2746],{"class":981},[957,3237,3238],{"class":959,"line":1778},[957,3239,3241],{"class":3240},"sghk6","    # Your app container\n",[957,3243,3244,3247,3249],{"class":959,"line":1799},[957,3245,3246],{"class":2742},"    build",[957,3248,982],{"class":981},[957,3250,3251],{"class":1041}," .\n",[957,3253,3254,3256],{"class":959,"line":1820},[957,3255,3164],{"class":2742},[957,3257,2746],{"class":981},[957,3259,3260,3263],{"class":959,"line":1841},[957,3261,3262],{"class":2742},"      auth",[957,3264,2746],{"class":981},[957,3266,3267,3269,3271],{"class":959,"line":1859},[957,3268,3178],{"class":2742},[957,3270,982],{"class":981},[957,3272,3183],{"class":2766},[957,3274,3275,3277],{"class":959,"line":1864},[957,3276,2974],{"class":2742},[957,3278,2746],{"class":981},[957,3280,3281,3284,3286],{"class":959,"line":1869},[957,3282,3283],{"class":2742},"      frontend",[957,3285,982],{"class":981},[957,3287,2756],{"class":963},[957,3289,3290,3292,3294,3297],{"class":959,"line":1884},[957,3291,2988],{"class":2742},[957,3293,982],{"class":981},[957,3295,3296],{"class":1041}," 172.21.10.4",[957,3298,3299],{"class":3240}," # Can be omitted\n",[957,3301,3302,3304],{"class":959,"line":1890},[957,3303,2981],{"class":2742},[957,3305,2746],{"class":981},[957,3307,3308,3310,3312],{"class":959,"line":1911},[957,3309,2988],{"class":2742},[957,3311,982],{"class":981},[957,3313,3314],{"class":1041}," 172.20.5.4\n",[957,3316,3317],{"class":959,"line":1925},[957,3318,3001],{"emptyLinePlaceholder":8},[957,3320,3321,3324],{"class":959,"line":1947},[957,3322,3323],{"class":2742},"volumes",[957,3325,2746],{"class":981},[957,3327,3328,3331,3333],{"class":959,"line":1967},[957,3329,3330],{"class":2742},"  sql_db",[957,3332,982],{"class":981},[957,3334,3029],{"class":963},[957,3336,3337,3340],{"class":959,"line":1988},[957,3338,3339],{"class":2742},"  bot-detector-data",[957,3341,2746],{"class":981},[957,3343,3344,3347],{"class":959,"line":2009},[957,3345,3346],{"class":2742},"  email-data",[957,3348,2746],{"class":981},[957,3350,3351],{"class":959,"line":2030},[957,3352,3001],{"emptyLinePlaceholder":8},[957,3354,3355,3358],{"class":959,"line":2049},[957,3356,3357],{"class":2742},"secrets",[957,3359,2746],{"class":981},[957,3361,3362,3365],{"class":959,"line":2069},[957,3363,3364],{"class":2742},"  age_key",[957,3366,2746],{"class":981},[957,3368,3369,3372,3374],{"class":959,"line":2089},[957,3370,3371],{"class":2742},"    file",[957,3373,982],{"class":981},[957,3375,3376],{"class":2766}," .\u002Fsecrets\u002Fauth\u002Fage_key\n",[957,3378,3379,3382],{"class":959,"line":2109},[957,3380,3381],{"class":2742},"  encrypted_config",[957,3383,2746],{"class":981},[957,3385,3386,3388,3390],{"class":959,"line":2127},[957,3387,3371],{"class":2742},[957,3389,982],{"class":981},[957,3391,3392],{"class":2766}," .\u002Fsecrets\u002Fauth\u002Fconfig.json.age\n",[957,3394,3395],{"class":959,"line":2133},[957,3396,2279],{"class":963},[957,3398,3399,3402,3404],{"class":959,"line":2138},[957,3400,3401],{"class":2742},"networks",[957,3403,982],{"class":981},[957,3405,2756],{"class":963},[957,3407,3408,3411,3413],{"class":959,"line":2143},[957,3409,3410],{"class":2742},"  backend",[957,3412,982],{"class":981},[957,3414,2756],{"class":963},[957,3416,3417,3420,3422],{"class":959,"line":2163},[957,3418,3419],{"class":2742},"    internal",[957,3421,982],{"class":981},[957,3423,2175],{"class":1384},[957,3425,3426,3429,3431],{"class":959,"line":2178},[957,3427,3428],{"class":2742},"    enable_ipv6",[957,3430,982],{"class":981},[957,3432,1608],{"class":1384},[957,3434,3435,3438],{"class":959,"line":2183},[957,3436,3437],{"class":2742},"    ipam",[957,3439,2746],{"class":981},[957,3441,3442,3445],{"class":959,"line":2188},[957,3443,3444],{"class":2742},"      config",[957,3446,2746],{"class":981},[957,3448,3449,3452,3455,3457],{"class":959,"line":2208},[957,3450,3451],{"class":981},"        -",[957,3453,3454],{"class":2742}," subnet",[957,3456,982],{"class":981},[957,3458,3459],{"class":2766}," 172.20.0.0\u002F16\n",[957,3461,3462,3465,3467],{"class":959,"line":2221},[957,3463,3464],{"class":2742},"          ip_range",[957,3466,982],{"class":981},[957,3468,3469],{"class":2766}," 172.20.5.0\u002F24\n",[957,3471,3472,3475,3477],{"class":959,"line":2226},[957,3473,3474],{"class":2742},"          gateway",[957,3476,982],{"class":981},[957,3478,3479],{"class":1041}," 172.20.5.1\n",[957,3481,3482,3485],{"class":959,"line":2231},[957,3483,3484],{"class":2742},"  frontend",[957,3486,2746],{"class":981},[957,3488,3489,3491,3493],{"class":959,"line":2251},[957,3490,3428],{"class":2742},[957,3492,982],{"class":981},[957,3494,1608],{"class":1384},[957,3496,3497,3499],{"class":959,"line":2264},[957,3498,3437],{"class":2742},[957,3500,2746],{"class":981},[957,3502,3503,3505],{"class":959,"line":2270},[957,3504,3444],{"class":2742},[957,3506,2746],{"class":981},[957,3508,3509,3511,3513,3515],{"class":959,"line":2276},[957,3510,3451],{"class":981},[957,3512,3454],{"class":2742},[957,3514,982],{"class":981},[957,3516,3517],{"class":2766}," 172.21.10.0\u002F24\n",[957,3519,3520,3522,3524],{"class":959,"line":2282},[957,3521,3474],{"class":2742},[957,3523,982],{"class":981},[957,3525,3526],{"class":1041}," 172.21.10.1\n",[957,3528,3529,3532],{"class":959,"line":2296},[957,3530,3531],{"class":2742},"  egress",[957,3533,2746],{"class":981},[957,3535,3536,3538,3540],{"class":959,"line":2316},[957,3537,3419],{"class":2742},[957,3539,982],{"class":981},[957,3541,1608],{"class":1384},[957,3543,3544,3546,3548],{"class":959,"line":2330},[957,3545,3428],{"class":2742},[957,3547,982],{"class":981},[957,3549,1608],{"class":1384},[957,3551,3552,3554],{"class":959,"line":2350},[957,3553,3437],{"class":2742},[957,3555,2746],{"class":981},[957,3557,3558,3560],{"class":959,"line":2367},[957,3559,3444],{"class":2742},[957,3561,2746],{"class":981},[957,3563,3564,3566,3568,3570],{"class":959,"line":2386},[957,3565,3451],{"class":981},[957,3567,3454],{"class":2742},[957,3569,982],{"class":981},[957,3571,3572],{"class":2766}," 172.22.20.0\u002F24\n",[957,3574,3575,3577,3579],{"class":959,"line":2391},[957,3576,3474],{"class":2742},[957,3578,982],{"class":981},[957,3580,3581],{"class":1041}," 172.22.20.1\n",[856,3583,3584],{},"The volume that required are:",[2623,3586,3587,3593,3599,3605,3611],{},[2626,3588,3589,3592],{},[860,3590,3591],{},"path\u002Fto\u002Flocal\u002Ffolder\u002Flogs:\u002Fapp\u002Fauth-logs:rw"," Logs for the auth service.",[2626,3594,3595,3598],{},[860,3596,3597],{},"path\u002Fto\u002Flocal\u002Ffolder\u002Flogs:\u002Fapp\u002Fbot-detector-logs:rw"," Logs for the bot-detector service.",[2626,3600,3601,3604],{},[860,3602,3603],{},"named-volume:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw"," - For the data sources that the bot detector uses, it used to keep the data fresh.",[2626,3606,3607,3610],{},[860,3608,3609],{},"named-volume:\u002Fapp\u002Fdist\u002Femail-db:rw"," - For the disposable email lmdb the auth service uses, also to keep it fresh.",[2626,3612,3613,3620],{},[872,3614,3617],{"href":3615,"rel":3616},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fstorage\u002Ftmpfs\u002F",[907],[860,3618,3619],{},"tmpfs"," - Do not change it. it used to decrypt the config put it in there, and load it. after it does so it deletes it.",[856,3622,3623,3624,875],{},"Optional are ",[860,3625,3626],{},".\u002Fconfig.json:\u002Frun\u002Fapp\u002Fconfig.json",[856,3628,3629,3630,875],{},"you can skip encryption, and docker secrets, if you don't want it, and provide your configuration as a ",[872,3631,3634],{"href":3632,"rel":3633},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fstorage\u002Fbind-mounts\u002F",[907],"bind mount",[856,3636,3637,3638,2918,3641,863,3644,3647],{},"Couple of key things to understand is the ",[860,3639,3640],{},"service.proxy.server",[860,3642,3643],{},"service.proxy.ipToTrust",[860,3645,3646],{},"service.clientIp"," configuration options and how the docker compose network is configured to use so.",[3649,3650,3652],"h2",{"id":3651},"network-proxy-trust","Network & Proxy Trust",[856,3654,3655],{},"The compose file defines three isolated networks:",[880,3657,3658,3670],{},[883,3659,3660],{},[886,3661,3662,3665,3668],{},[889,3663,3664],{},"Network",[889,3666,3667],{},"Subnet",[889,3669,894],{},[896,3671,3672,3697,3715],{},[886,3673,3674,3679,3684],{},[901,3675,3676],{},[860,3677,3678],{},"backend",[901,3680,3681],{},[860,3682,3683],{},"172.20.0.0\u002F16",[901,3685,3686,3687,2918,3690,3692,3693,3696],{},"Internal only. Connects ",[860,3688,3689],{},"auth",[860,3691,1021],{},", and your ",[860,3694,3695],{},"app",". No external access.",[886,3698,3699,3704,3709],{},[901,3700,3701],{},[860,3702,3703],{},"frontend",[901,3705,3706],{},[860,3707,3708],{},"172.21.10.0\u002F24",[901,3710,3711,3712,3714],{},"Connects your ",[860,3713,3695],{}," to the reverse proxy (Caddy, Nginx, etc.) and the outside world.",[886,3716,3717,3722,3727],{},[901,3718,3719],{},[860,3720,3721],{},"egress",[901,3723,3724],{},[860,3725,3726],{},"172.22.20.0\u002F24",[901,3728,3729,3730,3732],{},"Not internal. Allows ",[860,3731,3689],{}," to reach external services",[856,3734,2717,3735,3737,3738,3741,3742,863,3744,3746,3747],{},[860,3736,3678],{}," network is marked ",[860,3739,3740],{},"internal: true",", which means containers on it cannot reach the internet. The auth service and the database live here, completely isolated from direct outside access. Your app container bridges ",[860,3743,3678],{},[860,3745,3703],{},". It is the only service that can talk to both networks. See ",[872,3748,3751],{"href":3749,"rel":3750},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fnetwork\u002F",[907],"Docker Networking docs",[856,3753,2717,3754,3756,3757,3761],{},[860,3755,3721],{}," network is ",[3758,3759,3760],"strong",{},"not"," marked as internal, so it allows outbound internet access. Only the auth service is connected to it. The auth service needs outbound access for:",[2623,3763,3764,3767],{},[2626,3765,3766],{},"Emails via Resend",[2626,3768,3769],{},"Fetching fresh bot-detector data sources",[856,3771,3772,3773,3776,3777,3780,3781,3786],{},"The auth service runs behind your app, which acts as a reverse proxy \u002F intermediary. When ",[860,3774,3775],{},"service.proxy.trust"," is ",[860,3778,3779],{},"true",", the auth service configures Express's ",[872,3782,3785],{"href":3783,"rel":3784},"https:\u002F\u002Fexpressjs.com\u002Fen\u002Fguide\u002Fbehind-proxies.html",[907],"trust proxy"," setting with a callback that only trusts specific IPs:",[948,3788,3792],{"className":3789,"code":3790,"language":3791,"meta":953,"style":953},"language-ts shiki shiki-themes light-plus light-plus dracula","if (config.service?.proxy.trust) {\n    app.set(\"trust proxy\", (ip: string) => {\n        if (ip === config.service?.proxy.server || ip === config.service?.proxy.ipToTrust) return true;\n        return false;\n    });\n}\n","ts",[860,3793,3794,3823,3864,3923,3933,3938],{"__ignoreMap":953},[957,3795,3796,3800,3803,3807,3809,3811,3814,3816,3818,3820],{"class":959,"line":960},[957,3797,3799],{"class":3798},"sZ328","if",[957,3801,3802],{"class":963}," (",[957,3804,3806],{"class":3805},"sjsA6","config",[957,3808,875],{"class":963},[957,3810,1273],{"class":3805},[957,3812,3813],{"class":963},"?.",[957,3815,1363],{"class":3805},[957,3817,875],{"class":963},[957,3819,1377],{"class":3805},[957,3821,3822],{"class":963},") {\n",[957,3824,3825,3828,3830,3833,3836,3838,3840,3842,3845,3849,3851,3855,3858,3862],{"class":959,"line":967},[957,3826,3827],{"class":3805},"    app",[957,3829,875],{"class":963},[957,3831,3832],{"class":2596},"set",[957,3834,3835],{"class":963},"(",[957,3837,978],{"class":1016},[957,3839,3785],{"class":1020},[957,3841,978],{"class":1016},[957,3843,3844],{"class":963},", (",[957,3846,3848],{"class":3847},"sygFZ","ip",[957,3850,982],{"class":981},[957,3852,3854],{"class":3853},"sFs1U"," string",[957,3856,3857],{"class":963},") ",[957,3859,3861],{"class":3860},"sl46w","=>",[957,3863,985],{"class":963},[957,3865,3866,3869,3871,3873,3876,3879,3881,3883,3885,3887,3889,3891,3894,3897,3899,3901,3903,3905,3907,3909,3911,3913,3915,3918,3920],{"class":959,"line":988},[957,3867,3868],{"class":3798},"        if",[957,3870,3802],{"class":963},[957,3872,3848],{"class":3805},[957,3874,3875],{"class":981}," ===",[957,3877,3878],{"class":3805}," config",[957,3880,875],{"class":963},[957,3882,1273],{"class":3805},[957,3884,3813],{"class":963},[957,3886,1363],{"class":3805},[957,3888,875],{"class":963},[957,3890,1416],{"class":3805},[957,3892,3893],{"class":981}," ||",[957,3895,3896],{"class":3805}," ip",[957,3898,3875],{"class":981},[957,3900,3878],{"class":3805},[957,3902,875],{"class":963},[957,3904,1273],{"class":3805},[957,3906,3813],{"class":963},[957,3908,1363],{"class":3805},[957,3910,875],{"class":963},[957,3912,1395],{"class":3805},[957,3914,3857],{"class":963},[957,3916,3917],{"class":3798},"return",[957,3919,1385],{"class":1384},[957,3921,3922],{"class":963},";\n",[957,3924,3925,3928,3931],{"class":959,"line":1003},[957,3926,3927],{"class":3798},"        return",[957,3929,3930],{"class":1384}," false",[957,3932,3922],{"class":963},[957,3934,3935],{"class":959,"line":1029},[957,3936,3937],{"class":963},"    });\n",[957,3939,3940],{"class":959,"line":1047},[957,3941,2580],{"class":963},[856,3943,3944,3945,2918,3948,3951],{},"This means the auth service only accepts forwarded headers (",[860,3946,3947],{},"X-Forwarded-For",[860,3949,3950],{},"X-Forwarded-Proto",", etc.) from the IPs you explicitly whitelist. Any other source is untrusted.",[856,3953,3954,3955,875],{},"This is useful when using the BFF pattern described in ",[872,3956,131],{"href":132},[3958,3959,3960,3985,3988],"tip",{},[856,3961,3962,3963,3968,3969,3974,3975,3980,3981,3984],{},"If you use a ",[872,3964,3967],{"href":3965,"rel":3966},"https:\u002F\u002Fnitro.build\u002F",[907],"nitro","\u002F",[872,3970,3973],{"href":3971,"rel":3972},"https:\u002F\u002Fh3.dev\u002F",[907],"h3"," based frameworks such as ",[872,3976,3979],{"href":3977,"rel":3978},"https:\u002F\u002Fnuxt.com\u002F",[907],"Nuxt"," you should consider using the ",[872,3982,3983],{"href":22},"Auth-H3Client"," wrapper.\nIt does all the heavy lifting for you, haves a full OAuth client implemention, logging, and provide you with a set of higher order functions to use in your application, for easily protecting an endpoint.",[856,3986,3987],{},"Here is a small example:",[948,3989,3992],{"className":3789,"code":3990,"filename":3991,"language":3791,"meta":953,"style":953},"import { defineAuthenticatedEventHandler } from 'auth-h3client';\n\nexport default defineAuthenticatedEventHandler((event) => {\n  const user = event.context.authorizedData;\n  \n  \u002F\u002F Do authenticated stuff\n  return {\n    message: `Hello ${user.userId}!`,\n    roles: user.roles\n  };\n});\n\n","example.ts",[860,3993,3994,4022,4026,4049,4076,4080,4085,4092,4122,4136,4141],{"__ignoreMap":953},[957,3995,3996,3999,4002,4005,4008,4011,4014,4017,4020],{"class":959,"line":960},[957,3997,3998],{"class":3798},"import",[957,4000,4001],{"class":963}," { ",[957,4003,4004],{"class":3805},"defineAuthenticatedEventHandler",[957,4006,4007],{"class":963}," } ",[957,4009,4010],{"class":3798},"from",[957,4012,4013],{"class":1016}," '",[957,4015,4016],{"class":1020},"auth-h3client",[957,4018,4019],{"class":1016},"'",[957,4021,3922],{"class":963},[957,4023,4024],{"class":959,"line":967},[957,4025,3001],{"emptyLinePlaceholder":8},[957,4027,4028,4031,4034,4037,4040,4043,4045,4047],{"class":959,"line":988},[957,4029,4030],{"class":3798},"export",[957,4032,4033],{"class":3798}," default",[957,4035,4036],{"class":2596}," defineAuthenticatedEventHandler",[957,4038,4039],{"class":963},"((",[957,4041,4042],{"class":3847},"event",[957,4044,3857],{"class":963},[957,4046,3861],{"class":3860},[957,4048,985],{"class":963},[957,4050,4051,4054,4058,4061,4064,4066,4069,4071,4074],{"class":959,"line":1003},[957,4052,4053],{"class":3860},"  const",[957,4055,4057],{"class":4056},"s3JHE"," user",[957,4059,4060],{"class":981}," =",[957,4062,4063],{"class":3805}," event",[957,4065,875],{"class":963},[957,4067,4068],{"class":3805},"context",[957,4070,875],{"class":963},[957,4072,4073],{"class":3805},"authorizedData",[957,4075,3922],{"class":963},[957,4077,4078],{"class":959,"line":1029},[957,4079,3029],{"class":963},[957,4081,4082],{"class":959,"line":1047},[957,4083,4084],{"class":3240},"  \u002F\u002F Do authenticated stuff\n",[957,4086,4087,4090],{"class":959,"line":1068},[957,4088,4089],{"class":3798},"  return",[957,4091,985],{"class":963},[957,4093,4094,4097,4100,4103,4106,4108,4111,4114,4117,4120],{"class":959,"line":1089},[957,4095,4096],{"class":3805},"    message",[957,4098,982],{"class":4099},"s34zl",[957,4101,4102],{"class":1020}," `Hello ",[957,4104,4105],{"class":3860},"${",[957,4107,1052],{"class":3805},[957,4109,875],{"class":4110},"s1lnM",[957,4112,4113],{"class":3805},"userId",[957,4115,4116],{"class":3860},"}",[957,4118,4119],{"class":1020},"!`",[957,4121,1026],{"class":963},[957,4123,4124,4127,4129,4131,4133],{"class":959,"line":1109},[957,4125,4126],{"class":3805},"    roles",[957,4128,982],{"class":4099},[957,4130,4057],{"class":3805},[957,4132,875],{"class":963},[957,4134,4135],{"class":3805},"roles\n",[957,4137,4138],{"class":959,"line":1115},[957,4139,4140],{"class":963},"  };\n",[957,4142,4143],{"class":959,"line":1129},[957,4144,4145],{"class":963},"});\n",[3973,4147,4149],{"id":4148},"configuration-options","Configuration Options",[880,4151,4152,4164],{},[883,4153,4154],{},[886,4155,4156,4159,4162],{},[889,4157,4158],{},"Option",[889,4160,4161],{},"Value in example",[889,4163,894],{},[896,4165,4166,4179,4196,4215],{},[886,4167,4168,4172,4176],{},[901,4169,4170],{},[860,4171,3775],{},[901,4173,4174],{},[860,4175,3779],{},[901,4177,4178],{},"Enables proxy trust mode. Required when running behind another container.",[886,4180,4181,4185,4189],{},[901,4182,4183],{},[860,4184,3643],{},[901,4186,4187],{},[860,4188,1404],{},[901,4190,4191,4192,4195],{},"The IP address trusted to forward headers. This is your ",[3758,4193,4194],{},"app container's"," backend IP.",[886,4197,4198,4202,4206],{},[901,4199,4200],{},[860,4201,3640],{},[901,4203,4204],{},[860,4205,1404],{},[901,4207,4208,4209,4211,4212,4214],{},"Fallback trusted IP (typically the same as ",[860,4210,1395],{},"). If omitted, defaults to the ",[860,4213,1455],{}," bind address.",[886,4216,4217,4221,4225],{},[901,4218,4219],{},[860,4220,3646],{},[901,4222,4223],{},[860,4224,1404],{},[901,4226,4227,4228,4230],{},"The IP allowed to call privileged internal endpoints (e.g. custom MFA flows, operational config). Falls back to ",[860,4229,1395],{}," if not set.",[856,4232,4233,4234,4236],{},"In the compose file, your app container is assigned ",[860,4235,1404],{}," on the backend network:",[948,4238,4240],{"className":2732,"code":4239,"language":2735,"meta":953,"style":953},"app:\n    networks:\n      backend:\n        ipv4_address: 172.20.5.4\n",[860,4241,4242,4248,4254,4260],{"__ignoreMap":953},[957,4243,4244,4246],{"class":959,"line":960},[957,4245,3695],{"class":2742},[957,4247,2746],{"class":981},[957,4249,4250,4252],{"class":959,"line":967},[957,4251,2974],{"class":2742},[957,4253,2746],{"class":981},[957,4255,4256,4258],{"class":959,"line":988},[957,4257,2981],{"class":2742},[957,4259,2746],{"class":981},[957,4261,4262,4264,4266],{"class":959,"line":1003},[957,4263,2988],{"class":2742},[957,4265,982],{"class":981},[957,4267,3314],{"class":1041},[856,4269,4270,4271,863,4274,4277],{},"The auth service config sets ",[860,4272,4273],{},"ipToTrust: \"172.20.5.4\"",[860,4275,4276],{},"clientIp: \"172.20.5.4\"",", matching that exact IP. This is how the auth service knows:",[4279,4280,4281,4286],"ol",{},[2626,4282,4283,4284,875],{},"To only accept forwarded headers from ",[860,4285,1404],{},[2626,4287,4288,4289,4291,4292,875],{},"To only allow privileged internal requests from ",[860,4290,1404],{},". Any request from a different IP is rejected with ",[860,4293,4294],{},"403 Forbidden",[2633,4296,4297],{},[856,4298,4299,4300,4303,4304,2918,4306,4308,4309,4311],{},"If you change the app container's backend IP in the compose file, you ",[3758,4301,4302],{},"must"," update ",[860,4305,3643],{},[860,4307,3640],{},", and ",[860,4310,3646],{}," in your auth configuration to match. A mismatch means the auth service rejects all forwarded requests and blocks internal API calls.",[3973,4313,4315],{"id":4314},"using-the-service","Using the service",[856,4317,4318,4319,4322],{},"Your app can uses the ",[872,4320,4016],{"href":4321},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fh3-client"," library for H3\u002FNitro based frameworks, or any other http backend:",[948,4324,4326],{"className":2586,"code":4325,"filename":2588,"language":2589,"meta":953,"style":953},"curl http:\u002F\u002Fauth:10000\u002Fhealth\n",[860,4327,4328],{"__ignoreMap":953},[957,4329,4330,4333],{"class":959,"line":960},[957,4331,4332],{"class":2596},"curl",[957,4334,4335],{"class":1020}," http:\u002F\u002Fauth:10000\u002Fhealth\n",[856,4337,4338,4339,4342],{},"If you get back ",[860,4340,4341],{},"OK",", the auth service is running and reachable from your app container, explore the docs to get an understanding of the service.",[3649,4344,4346],{"id":4345},"deploying-locally","Deploying locally",[856,4348,4349],{},"If you prefer to run the auth service directly on a host machine without Docker, you will need to handle dependency installation, data source compilation, and data refresh yourself. The Docker image automates all of this, so consider it first if simplicity is a priority.",[856,4351,4352],{},"Before you start, make sure your environment has the following:",[880,4354,4355,4364],{},[883,4356,4357],{},[886,4358,4359,4362],{},[889,4360,4361],{},"Dependency",[889,4363,894],{},[896,4365,4366,4378,4390],{},[886,4367,4368,4375],{},[901,4369,4370],{},[872,4371,4374],{"href":4372,"rel":4373},"https:\u002F\u002Fnodejs.org\u002F",[907],"Node.js 20+",[901,4376,4377],{},"Runtime for the auth service",[886,4379,4380,4387],{},[901,4381,4382],{},[872,4383,4386],{"href":4384,"rel":4385},"https:\u002F\u002Fdev.mysql.com\u002Fdownloads\u002F",[907],"MySQL 8+",[901,4388,4389],{},"Database backend for users, sessions, rate limiters, and bot detection tables",[886,4391,4392,4400],{},[901,4393,4394],{},[872,4395,4398],{"href":4396,"rel":4397},"https:\u002F\u002Fgithub.com\u002Fipinfo\u002Fmmdbctl",[907],[860,4399,862],{},[901,4401,4402],{},"Compiles MMDB databases for geolocation and threat intelligence lookups",[856,4404,2717,4405,4407,4408,4411],{},[860,4406,862],{}," binary is installed automatically during the ",[860,4409,4410],{},"bot-detector init"," step if it is not already present on the system.",[4413,4414,4416,4421,4428,4517,4521,4527,4619,4635,4639,4649,5374,5394,5398,5407,5421,5431,5434,5448,5451,5512,5516,5541,5569,5583,5594,5599],"steps",{"level":4415},"4",[4417,4418,4420],"h4",{"id":4419},"install-the-package","Install the package",[856,4422,4423,4424,4427],{},"Install ",[860,4425,4426],{},"@riavzon\u002Fauth"," along with its required peer dependencies:",[4429,4430,4431,4456,4476,4497],"code-group",{},[948,4432,4435],{"className":2586,"code":4433,"filename":4434,"language":2589,"meta":953,"style":953},"pnpm add @riavzon\u002Fauth express cookie-parser mysql2\n","pnpm",[860,4436,4437],{"__ignoreMap":953},[957,4438,4439,4441,4444,4447,4450,4453],{"class":959,"line":960},[957,4440,4434],{"class":2596},[957,4442,4443],{"class":1020}," add",[957,4445,4446],{"class":1020}," @riavzon\u002Fauth",[957,4448,4449],{"class":1020}," express",[957,4451,4452],{"class":1020}," cookie-parser",[957,4454,4455],{"class":1020}," mysql2\n",[948,4457,4460],{"className":2586,"code":4458,"filename":4459,"language":2589,"meta":953,"style":953},"yarn add @riavzon\u002Fauth express cookie-parser mysql2\n","yarn",[860,4461,4462],{"__ignoreMap":953},[957,4463,4464,4466,4468,4470,4472,4474],{"class":959,"line":960},[957,4465,4459],{"class":2596},[957,4467,4443],{"class":1020},[957,4469,4446],{"class":1020},[957,4471,4449],{"class":1020},[957,4473,4452],{"class":1020},[957,4475,4455],{"class":1020},[948,4477,4480],{"className":2586,"code":4478,"filename":4479,"language":2589,"meta":953,"style":953},"npm install @riavzon\u002Fauth express cookie-parser mysql2\n","npm",[860,4481,4482],{"__ignoreMap":953},[957,4483,4484,4486,4489,4491,4493,4495],{"class":959,"line":960},[957,4485,4479],{"class":2596},[957,4487,4488],{"class":1020}," install",[957,4490,4446],{"class":1020},[957,4492,4449],{"class":1020},[957,4494,4452],{"class":1020},[957,4496,4455],{"class":1020},[948,4498,4501],{"className":2586,"code":4499,"filename":4500,"language":2589,"meta":953,"style":953},"bun add @riavzon\u002Fauth express cookie-parser mysql2\n","bun",[860,4502,4503],{"__ignoreMap":953},[957,4504,4505,4507,4509,4511,4513,4515],{"class":959,"line":960},[957,4506,4500],{"class":2596},[957,4508,4443],{"class":1020},[957,4510,4446],{"class":1020},[957,4512,4449],{"class":1020},[957,4514,4452],{"class":1020},[957,4516,4455],{"class":1020},[4417,4518,4520],{"id":4519},"compile-the-bot-detector-data-sources","Compile the Bot Detector data sources",[856,4522,4523,4524,4526],{},"The auth service depends on ",[872,4525,399],{"href":35}," for IP analysis, threat scoring, and bot classification. Before starting the service for the first time, download and compile all required data sources:",[4429,4528,4529,4554,4575,4597],{},[948,4530,4532],{"className":2586,"code":4531,"filename":4434,"language":2589,"meta":953,"style":953},"pnpm bot-detector init --contact=\"YourApp - you@example.com\"\n",[860,4533,4534],{"__ignoreMap":953},[957,4535,4536,4538,4541,4544,4547,4549,4552],{"class":959,"line":960},[957,4537,4434],{"class":2596},[957,4539,4540],{"class":1020}," bot-detector",[957,4542,4543],{"class":1020}," init",[957,4545,4546],{"class":1384}," --contact=",[957,4548,978],{"class":1016},[957,4550,4551],{"class":1020},"YourApp - you@example.com",[957,4553,1106],{"class":1016},[948,4555,4557],{"className":2586,"code":4556,"filename":4459,"language":2589,"meta":953,"style":953},"yarn bot-detector init --contact=\"YourApp - you@example.com\"\n",[860,4558,4559],{"__ignoreMap":953},[957,4560,4561,4563,4565,4567,4569,4571,4573],{"class":959,"line":960},[957,4562,4459],{"class":2596},[957,4564,4540],{"class":1020},[957,4566,4543],{"class":1020},[957,4568,4546],{"class":1384},[957,4570,978],{"class":1016},[957,4572,4551],{"class":1020},[957,4574,1106],{"class":1016},[948,4576,4578],{"className":2586,"code":4577,"filename":4479,"language":2589,"meta":953,"style":953},"npx bot-detector init --contact=\"YourApp - you@example.com\"\n",[860,4579,4580],{"__ignoreMap":953},[957,4581,4582,4585,4587,4589,4591,4593,4595],{"class":959,"line":960},[957,4583,4584],{"class":2596},"npx",[957,4586,4540],{"class":1020},[957,4588,4543],{"class":1020},[957,4590,4546],{"class":1384},[957,4592,978],{"class":1016},[957,4594,4551],{"class":1020},[957,4596,1106],{"class":1016},[948,4598,4600],{"className":2586,"code":4599,"filename":4500,"language":2589,"meta":953,"style":953},"bunx bot-detector init --contact=\"YourApp - you@example.com\"\n",[860,4601,4602],{"__ignoreMap":953},[957,4603,4604,4607,4609,4611,4613,4615,4617],{"class":959,"line":960},[957,4605,4606],{"class":2596},"bunx",[957,4608,4540],{"class":1020},[957,4610,4543],{"class":1020},[957,4612,4546],{"class":1384},[957,4614,978],{"class":1016},[957,4616,4551],{"class":1020},[957,4618,1106],{"class":1016},[856,4620,2717,4621,4624,4625,4630,4631,4634],{},[860,4622,4623],{},"--contact"," flag sets the User-Agent string used when downloading BGP and ASN data from ",[872,4626,4629],{"href":4627,"rel":4628},"https:\u002F\u002Fbgp.tools",[907],"BGP.tools",". This is a requirement from their API. The command compiles MMDB and LMDB databases. See the ",[872,4632,4633],{"href":408},"Bot Detector CLI reference"," for the full list of subcommands and options.",[4417,4636,4638],{"id":4637},"create-a-configuration-file","Create a configuration file",[856,4640,4641,4642,4644,4645,4648],{},"Write a ",[860,4643,952],{}," with your database credentials, secrets, and service settings. The full schema is documented in the ",[872,4646,4647],{"href":238},"Configuration reference",". A minimal working example:",[948,4650,4652],{"className":950,"code":4651,"filename":952,"language":5,"meta":953,"style":953},"{\n    \"store\": {\n        \"main\": {\n            \"host\": \"localhost\",\n            \"port\": 3306,\n            \"user\": \"auth_user\",\n            \"password\": \"secure_password\",\n            \"database\": \"auth_db\"\n        },\n        \"rate_limiters_pool\": {\n            \"store\": {\n                \"host\": \"localhost\",\n                \"port\": 3306,\n                \"user\": \"auth_user\",\n                \"password\": \"secure_password\",\n                \"database\": \"auth_db\"\n            },\n            \"dbName\": \"auth_db\"\n        }\n    },\n    \"service\": {\n        \"port\": 10000,\n        \"ipAddress\": \"0.0.0.0\"\n    },\n    \"password\": {\n        \"pepper\": \"your-pepper-secret\"\n    },\n    \"botDetector\": {\n        \"enableBotDetector\": true\n    },\n    \"magic_links\": {\n        \"jwt_secret_key\": \"long-random-secret\",\n        \"domain\": \"https:\u002F\u002Fyour-domain.com\",\n        \"notificationEmail\": {\n            \"websiteName\": \"Your App\",\n            \"privacyPolicyLink\": \"https:\u002F\u002Fyour-domain.com\u002Fprivacy\",\n            \"contactPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Fcontact\",\n            \"changePasswordPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Fsettings\",\n            \"loginPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Flogin\"\n        }\n    },\n    \"jwt\": {\n        \"jwt_secret_key\": \"another-long-random-secret\",\n        \"access_tokens\": {},\n        \"refresh_tokens\": {\n            \"refresh_ttl\": 604800000,\n            \"domain\": \"your-domain.com\",\n            \"MAX_SESSION_LIFE\": 2592000000,\n            \"maxAllowedSessionsPerUser\": 5,\n            \"byPassAnomaliesFor\": 300000\n        }\n    },\n    \"email\": {\n        \"resend_key\": \"your-resend-api-key\",\n        \"email\": \"noreply@your-domain.com\"\n    }\n}\n",[860,4653,4654,4658,4670,4682,4700,4714,4733,4752,4769,4773,4785,4797,4815,4829,4847,4865,4881,4885,4901,4905,4909,4921,4935,4951,4955,4967,4984,4988,5000,5012,5016,5028,5047,5066,5078,5097,5116,5135,5154,5171,5175,5179,5191,5210,5223,5235,5250,5269,5283,5297,5309,5313,5317,5329,5348,5365,5370],{"__ignoreMap":953},[957,4655,4656],{"class":959,"line":960},[957,4657,964],{"class":963},[957,4659,4660,4662,4664,4666,4668],{"class":959,"line":967},[957,4661,971],{"class":970},[957,4663,975],{"class":974},[957,4665,978],{"class":970},[957,4667,982],{"class":981},[957,4669,985],{"class":963},[957,4671,4672,4674,4676,4678,4680],{"class":959,"line":988},[957,4673,991],{"class":970},[957,4675,994],{"class":974},[957,4677,978],{"class":970},[957,4679,982],{"class":981},[957,4681,985],{"class":963},[957,4683,4684,4686,4688,4690,4692,4694,4696,4698],{"class":959,"line":1003},[957,4685,1006],{"class":970},[957,4687,1009],{"class":974},[957,4689,978],{"class":970},[957,4691,982],{"class":981},[957,4693,1017],{"class":1016},[957,4695,2435],{"class":1020},[957,4697,978],{"class":1016},[957,4699,1026],{"class":963},[957,4701,4702,4704,4706,4708,4710,4712],{"class":959,"line":1029},[957,4703,1006],{"class":970},[957,4705,1034],{"class":974},[957,4707,978],{"class":970},[957,4709,982],{"class":981},[957,4711,1042],{"class":1041},[957,4713,1026],{"class":963},[957,4715,4716,4718,4720,4722,4724,4726,4729,4731],{"class":959,"line":1047},[957,4717,1006],{"class":970},[957,4719,1052],{"class":974},[957,4721,978],{"class":970},[957,4723,982],{"class":981},[957,4725,1017],{"class":1016},[957,4727,4728],{"class":1020},"auth_user",[957,4730,978],{"class":1016},[957,4732,1026],{"class":963},[957,4734,4735,4737,4739,4741,4743,4745,4748,4750],{"class":959,"line":1068},[957,4736,1006],{"class":970},[957,4738,1073],{"class":974},[957,4740,978],{"class":970},[957,4742,982],{"class":981},[957,4744,1017],{"class":1016},[957,4746,4747],{"class":1020},"secure_password",[957,4749,978],{"class":1016},[957,4751,1026],{"class":963},[957,4753,4754,4756,4758,4760,4762,4764,4767],{"class":959,"line":1089},[957,4755,1006],{"class":970},[957,4757,1094],{"class":974},[957,4759,978],{"class":970},[957,4761,982],{"class":981},[957,4763,1017],{"class":1016},[957,4765,4766],{"class":1020},"auth_db",[957,4768,1106],{"class":1016},[957,4770,4771],{"class":959,"line":1109},[957,4772,1112],{"class":963},[957,4774,4775,4777,4779,4781,4783],{"class":959,"line":1115},[957,4776,991],{"class":970},[957,4778,1120],{"class":974},[957,4780,978],{"class":970},[957,4782,982],{"class":981},[957,4784,985],{"class":963},[957,4786,4787,4789,4791,4793,4795],{"class":959,"line":1129},[957,4788,1006],{"class":970},[957,4790,975],{"class":974},[957,4792,978],{"class":970},[957,4794,982],{"class":981},[957,4796,985],{"class":963},[957,4798,4799,4801,4803,4805,4807,4809,4811,4813],{"class":959,"line":1142},[957,4800,1145],{"class":970},[957,4802,1009],{"class":974},[957,4804,978],{"class":970},[957,4806,982],{"class":981},[957,4808,1017],{"class":1016},[957,4810,2435],{"class":1020},[957,4812,978],{"class":1016},[957,4814,1026],{"class":963},[957,4816,4817,4819,4821,4823,4825,4827],{"class":959,"line":1162},[957,4818,1145],{"class":970},[957,4820,1034],{"class":974},[957,4822,978],{"class":970},[957,4824,982],{"class":981},[957,4826,1042],{"class":1041},[957,4828,1026],{"class":963},[957,4830,4831,4833,4835,4837,4839,4841,4843,4845],{"class":959,"line":1177},[957,4832,1145],{"class":970},[957,4834,1052],{"class":974},[957,4836,978],{"class":970},[957,4838,982],{"class":981},[957,4840,1017],{"class":1016},[957,4842,4728],{"class":1020},[957,4844,978],{"class":1016},[957,4846,1026],{"class":963},[957,4848,4849,4851,4853,4855,4857,4859,4861,4863],{"class":959,"line":1196},[957,4850,1145],{"class":970},[957,4852,1073],{"class":974},[957,4854,978],{"class":970},[957,4856,982],{"class":981},[957,4858,1017],{"class":1016},[957,4860,4747],{"class":1020},[957,4862,978],{"class":1016},[957,4864,1026],{"class":963},[957,4866,4867,4869,4871,4873,4875,4877,4879],{"class":959,"line":1215},[957,4868,1145],{"class":970},[957,4870,1094],{"class":974},[957,4872,978],{"class":970},[957,4874,982],{"class":981},[957,4876,1017],{"class":1016},[957,4878,4766],{"class":1020},[957,4880,1106],{"class":1016},[957,4882,4883],{"class":959,"line":1232},[957,4884,1235],{"class":963},[957,4886,4887,4889,4891,4893,4895,4897,4899],{"class":959,"line":1238},[957,4888,1006],{"class":970},[957,4890,1243],{"class":974},[957,4892,978],{"class":970},[957,4894,982],{"class":981},[957,4896,1017],{"class":1016},[957,4898,4766],{"class":1020},[957,4900,1106],{"class":1016},[957,4902,4903],{"class":959,"line":1256},[957,4904,1259],{"class":963},[957,4906,4907],{"class":959,"line":1262},[957,4908,1265],{"class":963},[957,4910,4911,4913,4915,4917,4919],{"class":959,"line":1268},[957,4912,971],{"class":970},[957,4914,1273],{"class":974},[957,4916,978],{"class":970},[957,4918,982],{"class":981},[957,4920,985],{"class":963},[957,4922,4923,4925,4927,4929,4931,4933],{"class":959,"line":1282},[957,4924,991],{"class":970},[957,4926,1034],{"class":974},[957,4928,978],{"class":970},[957,4930,982],{"class":981},[957,4932,1445],{"class":1041},[957,4934,1026],{"class":963},[957,4936,4937,4939,4941,4943,4945,4947,4949],{"class":959,"line":1296},[957,4938,991],{"class":970},[957,4940,1455],{"class":974},[957,4942,978],{"class":970},[957,4944,982],{"class":981},[957,4946,1017],{"class":1016},[957,4948,1464],{"class":1020},[957,4950,1106],{"class":1016},[957,4952,4953],{"class":959,"line":1317},[957,4954,1265],{"class":963},[957,4956,4957,4959,4961,4963,4965],{"class":959,"line":1338},[957,4958,971],{"class":970},[957,4960,1073],{"class":974},[957,4962,978],{"class":970},[957,4964,982],{"class":981},[957,4966,985],{"class":963},[957,4968,4969,4971,4973,4975,4977,4979,4982],{"class":959,"line":1353},[957,4970,991],{"class":970},[957,4972,1512],{"class":974},[957,4974,978],{"class":970},[957,4976,982],{"class":981},[957,4978,1017],{"class":1016},[957,4980,4981],{"class":1020},"your-pepper-secret",[957,4983,1106],{"class":1016},[957,4985,4986],{"class":959,"line":1358},[957,4987,1265],{"class":963},[957,4989,4990,4992,4994,4996,4998],{"class":959,"line":1372},[957,4991,971],{"class":970},[957,4993,1587],{"class":974},[957,4995,978],{"class":970},[957,4997,982],{"class":981},[957,4999,985],{"class":963},[957,5001,5002,5004,5006,5008,5010],{"class":959,"line":1390},[957,5003,991],{"class":970},[957,5005,1601],{"class":974},[957,5007,978],{"class":970},[957,5009,982],{"class":981},[957,5011,2175],{"class":1384},[957,5013,5014],{"class":959,"line":1411},[957,5015,1265],{"class":963},[957,5017,5018,5020,5022,5024,5026],{"class":959,"line":1429},[957,5019,971],{"class":970},[957,5021,1671],{"class":974},[957,5023,978],{"class":970},[957,5025,982],{"class":981},[957,5027,985],{"class":963},[957,5029,5030,5032,5034,5036,5038,5040,5043,5045],{"class":959,"line":1434},[957,5031,991],{"class":970},[957,5033,1685],{"class":974},[957,5035,978],{"class":970},[957,5037,982],{"class":981},[957,5039,1017],{"class":1016},[957,5041,5042],{"class":1020},"long-random-secret",[957,5044,978],{"class":1016},[957,5046,1026],{"class":963},[957,5048,5049,5051,5053,5055,5057,5059,5062,5064],{"class":959,"line":1450},[957,5050,991],{"class":970},[957,5052,1727],{"class":974},[957,5054,978],{"class":970},[957,5056,982],{"class":981},[957,5058,1017],{"class":1016},[957,5060,5061],{"class":1020},"https:\u002F\u002Fyour-domain.com",[957,5063,978],{"class":1016},[957,5065,1026],{"class":963},[957,5067,5068,5070,5072,5074,5076],{"class":959,"line":1471},[957,5069,991],{"class":970},[957,5071,1748],{"class":974},[957,5073,978],{"class":970},[957,5075,982],{"class":981},[957,5077,985],{"class":963},[957,5079,5080,5082,5084,5086,5088,5090,5093,5095],{"class":959,"line":1489},[957,5081,1006],{"class":970},[957,5083,1762],{"class":974},[957,5085,978],{"class":970},[957,5087,982],{"class":981},[957,5089,1017],{"class":1016},[957,5091,5092],{"class":1020},"Your App",[957,5094,978],{"class":1016},[957,5096,1026],{"class":963},[957,5098,5099,5101,5103,5105,5107,5109,5112,5114],{"class":959,"line":1494},[957,5100,1006],{"class":970},[957,5102,1783],{"class":974},[957,5104,978],{"class":970},[957,5106,982],{"class":981},[957,5108,1017],{"class":1016},[957,5110,5111],{"class":1020},"https:\u002F\u002Fyour-domain.com\u002Fprivacy",[957,5113,978],{"class":1016},[957,5115,1026],{"class":963},[957,5117,5118,5120,5122,5124,5126,5128,5131,5133],{"class":959,"line":1507},[957,5119,1006],{"class":970},[957,5121,1804],{"class":974},[957,5123,978],{"class":970},[957,5125,982],{"class":981},[957,5127,1017],{"class":1016},[957,5129,5130],{"class":1020},"https:\u002F\u002Fyour-domain.com\u002Fcontact",[957,5132,978],{"class":1016},[957,5134,1026],{"class":963},[957,5136,5137,5139,5141,5143,5145,5147,5150,5152],{"class":959,"line":1528},[957,5138,1006],{"class":970},[957,5140,1825],{"class":974},[957,5142,978],{"class":970},[957,5144,982],{"class":981},[957,5146,1017],{"class":1016},[957,5148,5149],{"class":1020},"https:\u002F\u002Fyour-domain.com\u002Fsettings",[957,5151,978],{"class":1016},[957,5153,1026],{"class":963},[957,5155,5156,5158,5160,5162,5164,5166,5169],{"class":959,"line":1545},[957,5157,1006],{"class":970},[957,5159,1846],{"class":974},[957,5161,978],{"class":970},[957,5163,982],{"class":981},[957,5165,1017],{"class":1016},[957,5167,5168],{"class":1020},"https:\u002F\u002Fyour-domain.com\u002Flogin",[957,5170,1106],{"class":1016},[957,5172,5173],{"class":959,"line":1562},[957,5174,1259],{"class":963},[957,5176,5177],{"class":959,"line":1577},[957,5178,1265],{"class":963},[957,5180,5181,5183,5185,5187,5189],{"class":959,"line":1582},[957,5182,971],{"class":970},[957,5184,2287],{"class":974},[957,5186,978],{"class":970},[957,5188,982],{"class":981},[957,5190,985],{"class":963},[957,5192,5193,5195,5197,5199,5201,5203,5206,5208],{"class":959,"line":1596},[957,5194,991],{"class":970},[957,5196,1685],{"class":974},[957,5198,978],{"class":970},[957,5200,982],{"class":981},[957,5202,1017],{"class":1016},[957,5204,5205],{"class":1020},"another-long-random-secret",[957,5207,978],{"class":1016},[957,5209,1026],{"class":963},[957,5211,5212,5214,5216,5218,5220],{"class":959,"line":1611},[957,5213,991],{"class":970},[957,5215,2321],{"class":974},[957,5217,978],{"class":970},[957,5219,982],{"class":981},[957,5221,5222],{"class":963}," {},\n",[957,5224,5225,5227,5229,5231,5233],{"class":959,"line":1616},[957,5226,991],{"class":970},[957,5228,2396],{"class":974},[957,5230,978],{"class":970},[957,5232,982],{"class":981},[957,5234,985],{"class":963},[957,5236,5237,5239,5241,5243,5245,5248],{"class":959,"line":1630},[957,5238,1006],{"class":970},[957,5240,2410],{"class":974},[957,5242,978],{"class":970},[957,5244,982],{"class":981},[957,5246,5247],{"class":1041}," 604800000",[957,5249,1026],{"class":963},[957,5251,5252,5254,5256,5258,5260,5262,5265,5267],{"class":959,"line":1646},[957,5253,1006],{"class":970},[957,5255,1727],{"class":974},[957,5257,978],{"class":970},[957,5259,982],{"class":981},[957,5261,1017],{"class":1016},[957,5263,5264],{"class":1020},"your-domain.com",[957,5266,978],{"class":1016},[957,5268,1026],{"class":963},[957,5270,5271,5273,5275,5277,5279,5281],{"class":959,"line":1661},[957,5272,1006],{"class":970},[957,5274,2447],{"class":974},[957,5276,978],{"class":970},[957,5278,982],{"class":981},[957,5280,2454],{"class":1041},[957,5282,1026],{"class":963},[957,5284,5285,5287,5289,5291,5293,5295],{"class":959,"line":1666},[957,5286,1006],{"class":970},[957,5288,2464],{"class":974},[957,5290,978],{"class":970},[957,5292,982],{"class":981},[957,5294,2471],{"class":1041},[957,5296,1026],{"class":963},[957,5298,5299,5301,5303,5305,5307],{"class":959,"line":1680},[957,5300,1006],{"class":970},[957,5302,2481],{"class":974},[957,5304,978],{"class":970},[957,5306,982],{"class":981},[957,5308,1350],{"class":1041},[957,5310,5311],{"class":959,"line":1701},[957,5312,1259],{"class":963},[957,5314,5315],{"class":959,"line":1722},[957,5316,1265],{"class":963},[957,5318,5319,5321,5323,5325,5327],{"class":959,"line":1743},[957,5320,971],{"class":970},[957,5322,1993],{"class":974},[957,5324,978],{"class":970},[957,5326,982],{"class":981},[957,5328,985],{"class":963},[957,5330,5331,5333,5335,5337,5339,5341,5344,5346],{"class":959,"line":1757},[957,5332,991],{"class":970},[957,5334,2519],{"class":974},[957,5336,978],{"class":970},[957,5338,982],{"class":981},[957,5340,1017],{"class":1016},[957,5342,5343],{"class":1020},"your-resend-api-key",[957,5345,978],{"class":1016},[957,5347,1026],{"class":963},[957,5349,5350,5352,5354,5356,5358,5360,5363],{"class":959,"line":1778},[957,5351,991],{"class":970},[957,5353,1993],{"class":974},[957,5355,978],{"class":970},[957,5357,982],{"class":981},[957,5359,1017],{"class":1016},[957,5361,5362],{"class":1020},"noreply@your-domain.com",[957,5364,1106],{"class":1016},[957,5366,5367],{"class":959,"line":1799},[957,5368,5369],{"class":963},"    }\n",[957,5371,5372],{"class":959,"line":1820},[957,5373,2580],{"class":963},[856,5375,5376,5377,863,5380,5382,5383,2918,5385,4308,5387,5389,5390,5393],{},"When running locally without a reverse proxy, you can omit the ",[860,5378,5379],{},"service.proxy",[860,5381,3646],{}," fields entirely. Those are only needed when the auth service sits behind another container or proxy that forwards requests on its behalf. If you do place a reverse proxy in front of the service, configure ",[860,5384,3775],{},[860,5386,3643],{},[860,5388,3646],{}," to match the proxy's IP address as described in the ",[872,5391,3652],{"href":5392},"#network--proxy-trust"," section above.",[4417,5395,5397],{"id":5396},"initialize-the-database","Initialize the database",[856,5399,2717,5400,5402,5403,5406],{},[860,5401,3689],{}," CLI creates all required MySQL tables and compiles the ",[872,5404,5405],{"href":611},"disposable email domain blocklist"," into an LMDB database. Run it once before starting the service for the first time:",[948,5408,5410],{"className":2586,"code":5409,"filename":2588,"language":2589,"meta":953,"style":953},"npx @riavzon\u002Fauth .\u002Fconfig.json\n",[860,5411,5412],{"__ignoreMap":953},[957,5413,5414,5416,5418],{"class":959,"line":960},[957,5415,4584],{"class":2596},[957,5417,4446],{"class":1020},[957,5419,5420],{"class":1020}," .\u002Fconfig.json\n",[856,5422,5423,5424,5427,5428,875],{},"The CLI accepts the config path as a positional argument, or reads it from the ",[860,5425,5426],{},"CONFIG_PATH"," environment variable. If neither is provided, it defaults to ",[860,5429,5430],{},".\u002Fconfig.json",[856,5432,5433],{},"This command runs three tasks:",[4279,5435,5436,5439,5442],{},[2626,5437,5438],{},"Creates all auth MySQL tables for users, sessions, rate limiters, and related data.",[2626,5440,5441],{},"Creates the Bot Detector tables used for IP analysis and threat scoring.",[2626,5443,5444,5445,875],{},"Downloads and compiles the disposable email domain blocklist into ",[860,5446,5447],{},"dist\u002Femail-db\u002Fdisposable-emails.mdb",[856,5449,5450],{},"You can also call it programmatically if you prefer to run initialization from your own startup script:",[948,5452,5455],{"className":3789,"code":5453,"filename":5454,"language":3791,"meta":953,"style":953},"import { initAuthData } from '@riavzon\u002Fauth'\nimport config from '.\u002Fconfig.ts'\n\nawait initAuthData(config)\n","init.ts",[860,5456,5457,5477,5493,5497],{"__ignoreMap":953},[957,5458,5459,5461,5463,5466,5468,5470,5472,5474],{"class":959,"line":960},[957,5460,3998],{"class":3798},[957,5462,4001],{"class":963},[957,5464,5465],{"class":3805},"initAuthData",[957,5467,4007],{"class":963},[957,5469,4010],{"class":3798},[957,5471,4013],{"class":1016},[957,5473,4426],{"class":1020},[957,5475,5476],{"class":1016},"'\n",[957,5478,5479,5481,5483,5486,5488,5491],{"class":959,"line":967},[957,5480,3998],{"class":3798},[957,5482,3878],{"class":3805},[957,5484,5485],{"class":3798}," from",[957,5487,4013],{"class":1016},[957,5489,5490],{"class":1020},".\u002Fconfig.ts",[957,5492,5476],{"class":1016},[957,5494,5495],{"class":959,"line":988},[957,5496,3001],{"emptyLinePlaceholder":8},[957,5498,5499,5502,5505,5507,5509],{"class":959,"line":1003},[957,5500,5501],{"class":3798},"await",[957,5503,5504],{"class":2596}," initAuthData",[957,5506,3835],{"class":963},[957,5508,3806],{"class":3805},[957,5510,5511],{"class":963},")\n",[4417,5513,5515],{"id":5514},"start-the-service","Start the service",[856,5517,5518,5519,5522,5523,5526,5527,5530,5531,5533,5534,5537,5538,5540],{},"The package exports ",[860,5520,5521],{},"startServer"," from ",[860,5524,5525],{},"@riavzon\u002Fauth\u002Fservice",". This function reads your configuration file, calls ",[860,5528,5529],{},"bootstrapApp"," internally to wire up the full middleware chain, starts listening, and schedules all data refresh tasks in the background. Set ",[860,5532,5426],{}," to point at your config file and ",[860,5535,5536],{},"SKIP_CONFIG_UNLINK"," to ",[860,5539,3779],{}," so the service does not delete it after loading:",[948,5542,5544],{"className":2586,"code":5543,"filename":2588,"language":2589,"meta":953,"style":953},"SKIP_CONFIG_UNLINK=true CONFIG_PATH=.\u002Fconfig.json node .\u002Fnode_modules\u002F@riavzon\u002Fauth\u002Fdist\u002Fservice.mjs\n",[860,5545,5546],{"__ignoreMap":953},[957,5547,5548,5551,5554,5556,5559,5561,5563,5566],{"class":959,"line":960},[957,5549,5536],{"class":5550},"sWkX1",[957,5552,5553],{"class":981},"=",[957,5555,3779],{"class":1020},[957,5557,5558],{"class":5550}," CONFIG_PATH",[957,5560,5553],{"class":981},[957,5562,5430],{"class":1020},[957,5564,5565],{"class":2596}," node",[957,5567,5568],{"class":1020}," .\u002Fnode_modules\u002F@riavzon\u002Fauth\u002Fdist\u002Fservice.mjs\n",[856,5570,5571,5572,863,5575,5578,5579,5582],{},"The service binds to the ",[860,5573,5574],{},"service.port",[860,5576,5577],{},"service.ipAddress"," values from your configuration, defaulting to ",[860,5580,5581],{},"0.0.0.0:10000",". Once running, it schedules three background refresh tasks on a loop:",[2623,5584,5585,5588,5591],{},[2626,5586,5587],{},"bot-detector data source refresh every 24 hours",[2626,5589,5590],{},"detection database regeneration every 3 days",[2626,5592,5593],{},"disposable email list recompilation every 7 days.",[856,5595,5596,5597,875],{},"You do not need to set up cron jobs for these when using ",[860,5598,5521],{},[856,5600,5601,5602,5606],{},"If you prefer to embed the auth service into your own Express application instead of running the standalone process, see the ",[872,5603,5605],{"href":5604},"\u002Fdocs\u002Fiam\u002Fgetting-started#quick-start-library-mode","Library quick start"," in the Getting Started guide. The library path gives you full control over the middleware chain and route mounting.",[3973,5608,5610],{"id":5609},"keeping-data-sources-fresh","Keeping data sources fresh",[856,5612,5613,5614,5616],{},"Both the Docker image and the standalone ",[860,5615,5521],{}," process schedule background refresh tasks automatically after startup. If you use either of those, the data stays current without any extra configuration.",[856,5618,5619,5620,5622,5623,5626],{},"If you integrate ",[860,5621,4426],{}," as a library and manage your own Express server, you are responsible for keeping the data fresh. The simplest way is to call ",[860,5624,5625],{},"refreshData"," after your server starts listening. It schedules all three tasks on a recurring loop with the intervals you provide:",[948,5628,5631],{"className":3789,"code":5629,"filename":5630,"language":3791,"meta":953,"style":953},"import { refreshData } from '@riavzon\u002Fauth'\n\napp.listen(10000, () => {\n  refreshData(\n    1000 * 60 * 60 * 24,       \u002F\u002F bot-detector refresh: every 24 hours\n    1000 * 60 * 60 * 24 * 3,   \u002F\u002F bot-detector generate: every 3 days\n    1000 * 60 * 60 * 24 * 7,   \u002F\u002F shield-base email list: every 7 days\n  )\n})\n","server.ts",[860,5632,5633,5651,5655,5676,5684,5710,5737,5763,5768],{"__ignoreMap":953},[957,5634,5635,5637,5639,5641,5643,5645,5647,5649],{"class":959,"line":960},[957,5636,3998],{"class":3798},[957,5638,4001],{"class":963},[957,5640,5625],{"class":3805},[957,5642,4007],{"class":963},[957,5644,4010],{"class":3798},[957,5646,4013],{"class":1016},[957,5648,4426],{"class":1020},[957,5650,5476],{"class":1016},[957,5652,5653],{"class":959,"line":967},[957,5654,3001],{"emptyLinePlaceholder":8},[957,5656,5657,5659,5661,5664,5666,5669,5672,5674],{"class":959,"line":988},[957,5658,3695],{"class":3805},[957,5660,875],{"class":963},[957,5662,5663],{"class":2596},"listen",[957,5665,3835],{"class":963},[957,5667,5668],{"class":1041},"10000",[957,5670,5671],{"class":963},", () ",[957,5673,3861],{"class":3860},[957,5675,985],{"class":963},[957,5677,5678,5681],{"class":959,"line":1003},[957,5679,5680],{"class":2596},"  refreshData",[957,5682,5683],{"class":963},"(\n",[957,5685,5686,5689,5692,5695,5697,5699,5701,5704,5707],{"class":959,"line":1029},[957,5687,5688],{"class":1041},"    1000",[957,5690,5691],{"class":981}," *",[957,5693,5694],{"class":1041}," 60",[957,5696,5691],{"class":981},[957,5698,5694],{"class":1041},[957,5700,5691],{"class":981},[957,5702,5703],{"class":1041}," 24",[957,5705,5706],{"class":963},",       ",[957,5708,5709],{"class":3240},"\u002F\u002F bot-detector refresh: every 24 hours\n",[957,5711,5712,5714,5716,5718,5720,5722,5724,5726,5728,5731,5734],{"class":959,"line":1047},[957,5713,5688],{"class":1041},[957,5715,5691],{"class":981},[957,5717,5694],{"class":1041},[957,5719,5691],{"class":981},[957,5721,5694],{"class":1041},[957,5723,5691],{"class":981},[957,5725,5703],{"class":1041},[957,5727,5691],{"class":981},[957,5729,5730],{"class":1041}," 3",[957,5732,5733],{"class":963},",   ",[957,5735,5736],{"class":3240},"\u002F\u002F bot-detector generate: every 3 days\n",[957,5738,5739,5741,5743,5745,5747,5749,5751,5753,5755,5758,5760],{"class":959,"line":1068},[957,5740,5688],{"class":1041},[957,5742,5691],{"class":981},[957,5744,5694],{"class":1041},[957,5746,5691],{"class":981},[957,5748,5694],{"class":1041},[957,5750,5691],{"class":981},[957,5752,5703],{"class":1041},[957,5754,5691],{"class":981},[957,5756,5757],{"class":1041}," 7",[957,5759,5733],{"class":963},[957,5761,5762],{"class":3240},"\u002F\u002F shield-base email list: every 7 days\n",[957,5764,5765],{"class":959,"line":1089},[957,5766,5767],{"class":963},"  )\n",[957,5769,5770],{"class":959,"line":1109},[957,5771,5772],{"class":963},"})\n",[856,5774,5775,5776,5782],{},"See the ",[872,5777,5779,5781],{"href":5778},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi#refreshdatadatasourceinterval-generatorinterval-disposableemaillist",[860,5780,5625],{}," API reference"," for parameter details.",[856,5784,5785],{},"Alternatively, you can run the same tasks as cron jobs or scheduled tasks on the host:",[948,5787,5790],{"className":2586,"code":5788,"filename":5789,"language":2589,"meta":953,"style":953},"# Daily at 3:00 AM - refresh bot-detector data sources\n0 3 * * * cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx bot-detector refresh\n\n# Every 3 days at 4:00 AM - regenerate compiled databases\n0 4 *\u002F3 * * cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx bot-detector generate\n\n# Weekly on Sunday at 5:00 AM - refresh disposable email list\n0 5 * * 0 cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx @riavzon\u002Fshield-base --email --path=dist\n","crontab",[860,5791,5792,5797,5826,5830,5835,5863,5867,5872],{"__ignoreMap":953},[957,5793,5794],{"class":959,"line":960},[957,5795,5796],{"class":3240},"# Daily at 3:00 AM - refresh bot-detector data sources\n",[957,5798,5799,5802,5804,5807,5809,5811,5814,5817,5819,5821,5823],{"class":959,"line":967},[957,5800,5801],{"class":2596},"0",[957,5803,5730],{"class":1041},[957,5805,5691],{"class":5806},"spgJB",[957,5808,5691],{"class":5806},[957,5810,5691],{"class":5806},[957,5812,5813],{"class":1020}," cd",[957,5815,5816],{"class":1020}," \u002Fpath\u002Fto\u002Fyour\u002Fapp",[957,5818,2605],{"class":963},[957,5820,4584],{"class":2596},[957,5822,4540],{"class":1020},[957,5824,5825],{"class":1020}," refresh\n",[957,5827,5828],{"class":959,"line":988},[957,5829,3001],{"emptyLinePlaceholder":8},[957,5831,5832],{"class":959,"line":1003},[957,5833,5834],{"class":3240},"# Every 3 days at 4:00 AM - regenerate compiled databases\n",[957,5836,5837,5839,5841,5843,5846,5848,5850,5852,5854,5856,5858,5860],{"class":959,"line":1029},[957,5838,5801],{"class":2596},[957,5840,1557],{"class":1041},[957,5842,5691],{"class":5806},[957,5844,5845],{"class":1020},"\u002F3",[957,5847,5691],{"class":5806},[957,5849,5691],{"class":5806},[957,5851,5813],{"class":1020},[957,5853,5816],{"class":1020},[957,5855,2605],{"class":963},[957,5857,4584],{"class":2596},[957,5859,4540],{"class":1020},[957,5861,5862],{"class":1020}," generate\n",[957,5864,5865],{"class":959,"line":1047},[957,5866,3001],{"emptyLinePlaceholder":8},[957,5868,5869],{"class":959,"line":1068},[957,5870,5871],{"class":3240},"# Weekly on Sunday at 5:00 AM - refresh disposable email list\n",[957,5873,5874,5876,5878,5880,5882,5885,5887,5889,5891,5893,5896,5899],{"class":959,"line":1089},[957,5875,5801],{"class":2596},[957,5877,2471],{"class":1041},[957,5879,5691],{"class":5806},[957,5881,5691],{"class":5806},[957,5883,5884],{"class":1041}," 0",[957,5886,5813],{"class":1020},[957,5888,5816],{"class":1020},[957,5890,2605],{"class":963},[957,5892,4584],{"class":2596},[957,5894,5895],{"class":1020}," @riavzon\u002Fshield-base",[957,5897,5898],{"class":1384}," --email",[957,5900,5901],{"class":1384}," --path=dist\n",[948,5903,5905],{"className":3789,"code":5904,"filename":5630,"language":3791,"meta":953,"style":953},"import { scheduleTask } from '@riavzon\u002Fauth'\nscheduleTask('my-cleanup', '.\u002Fnode_modules\u002F.bin\u002Fmy-tool', ['--clean'], 1000 * 60 * 60 * 12)\n",[860,5906,5907,5925],{"__ignoreMap":953},[957,5908,5909,5911,5913,5915,5917,5919,5921,5923],{"class":959,"line":960},[957,5910,3998],{"class":3798},[957,5912,4001],{"class":963},[957,5914,687],{"class":3805},[957,5916,4007],{"class":963},[957,5918,4010],{"class":3798},[957,5920,4013],{"class":1016},[957,5922,4426],{"class":1020},[957,5924,5476],{"class":1016},[957,5926,5927,5929,5931,5933,5936,5938,5940,5942,5945,5947,5950,5952,5955,5957,5960,5963,5965,5967,5969,5971,5973,5976],{"class":959,"line":967},[957,5928,687],{"class":2596},[957,5930,3835],{"class":963},[957,5932,4019],{"class":1016},[957,5934,5935],{"class":1020},"my-cleanup",[957,5937,4019],{"class":1016},[957,5939,2918],{"class":963},[957,5941,4019],{"class":1016},[957,5943,5944],{"class":1020},".\u002Fnode_modules\u002F.bin\u002Fmy-tool",[957,5946,4019],{"class":1016},[957,5948,5949],{"class":963},", [",[957,5951,4019],{"class":1016},[957,5953,5954],{"class":1020},"--clean",[957,5956,4019],{"class":1016},[957,5958,5959],{"class":963},"], ",[957,5961,5962],{"class":1041},"1000",[957,5964,5691],{"class":981},[957,5966,5694],{"class":1041},[957,5968,5691],{"class":981},[957,5970,5694],{"class":1041},[957,5972,5691],{"class":981},[957,5974,5975],{"class":1041}," 12",[957,5977,5511],{"class":963},[3958,5979,5980],{},[856,5981,5775,5982,5987],{},[872,5983,5985,5781],{"href":5984},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi#scheduletaskname-cmd-args-interval",[860,5986,687],{}," for details.",[856,5989,5990,5991,5994,5995,5997,5998,6001],{},"Without either approach, the geolocation databases, threat lists, and email blocklist will become stale over time. The ",[860,5992,5993],{},"bot-detector refresh"," task is the most important one since threat intelligence feeds change frequently. See the ",[872,5996,4633],{"href":408}," for details on each subcommand and the ",[872,5999,6000],{"href":586},"Shield Base CLI reference"," for the email compilation flags.",[6003,6004,6005],"style",{},"html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sXrRR, html code.shiki .sXrRR{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#8BE9FD}html pre.shiki code .sKKzR, html code.shiki .sKKzR{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#F1FA8C}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}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 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 .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}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 .s1lnM, html code.shiki .s1lnM{--shiki-light:#000000FF;--shiki-default:#000000FF;--shiki-dark:#F8F8F2}html pre.shiki code .sWkX1, html code.shiki .sWkX1{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#BD93F9}html pre.shiki code .spgJB, html code.shiki .spgJB{--shiki-light:#0000FF;--shiki-light-font-style:inherit;--shiki-default:#0000FF;--shiki-default-font-style:inherit;--shiki-dark:#BD93F9;--shiki-dark-font-style:italic}",{"title":953,"searchDepth":967,"depth":967,"links":6007},[6008,6012],{"id":3651,"depth":967,"text":3652,"children":6009},[6010,6011],{"id":4148,"depth":988,"text":4149},{"id":4314,"depth":988,"text":4315},{"id":4345,"depth":967,"text":4346,"children":6013},[6014],{"id":5609,"depth":988,"text":5610},"Different way to deploy the auth service.","md","i-lucide-terminal",{},null,"---\ntitle: Deployment\ndescription: Different way to deploy the auth service.\nicon: i-lucide-terminal\n---\n\nThe best way to deploy the service is using the public docker image.\nIt handles everything, setting up the `mmdbctl` and `age` binary, to starting the service and deleting the raw unencrypted config.\n\nIn your compose file, you will need to provide a couple of things before starting the service, however you can automate this with scripts, see the [operation scripts guide](\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts).\n\nMake sure your environments haves the following installed first:\n\n| Tool | Purpose |\n|------|---------|\n| [age](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage) | Encrypts the configuration file with age encryption |\n| [age-keygen](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage) | Generates the age keypair |\n| [Docker](https:\u002F\u002Fwww.docker.com\u002F) + [Compose](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F) | Builds and runs the service container |\n\nMake a [configuration](\u002Fdocs\u002Fiam\u002Fconfiguration) file:\n\n```json [config.json]\n{\n    \"store\": {\n        \"main\": {\n            \"host\": \"mysql\",\n            \"port\": 3306,\n            \"user\": \"alice\",\n            \"password\": \"very_secure_password\",\n            \"database\": \"my_auth\"\n        },\n        \"rate_limiters_pool\": {\n            \"store\": {\n                \"host\": \"mysql\",\n                \"port\": 3306,\n                \"user\": \"alice\",\n                \"database\": \"my_auth\",\n                \"password\": \"very_secure_password\"\n            },\n            \"dbName\": \"my_auth\"\n        }\n    },\n    \"service\": {\n    \"Hmac\": {\n        \"sharedSecret\": \"1234567890\",\n        \"clientId\": \"1234\",\n        \"maxClockSkew\": 300000\n        },\n        \"proxy\": {\n            \"trust\": true,\n            \"ipToTrust\": \"172.20.5.4\",\n            \"server\": \"172.20.5.4\"\n        },\n        \"port\": 10000,\n        \"ipAddress\": \"0.0.0.0\",\n        \"clientIp\": \"172.20.5.4\"\n    },\n    \"password\": {\n        \"pepper\": \"pepper-secret\",\n        \"hashLength\": 50,\n        \"timeCost\": 4,\n        \"memoryCost\": 262144\n    },\n    \"botDetector\": {\n        \"enableBotDetector\": false\n    },\n    \"htmlSanitizer\": {\n        \"IrritationCount\": 50,\n        \"maxAllowedInputLength\": 20000\n    },\n    \"magic_links\": {\n        \"jwt_secret_key\": \"long_secret\",\n        \"expiresIn\": \"20m\",\n        \"domain\": \"http:\u002F\u002Fyour-domain:10000\",\n        \"notificationEmail\": {\n            \"websiteName\": \"My Cool Website\",\n            \"privacyPolicyLink\": \"https:\u002F\u002Fyour-domain\u002Fprivacy\",\n            \"contactPageLink\": \"https:\u002F\u002Fyour-domain\u002Fcontact\",\n            \"changePasswordPageLink\": \"https:\u002F\u002Fyour-domain\u002Faccounts\",\n            \"loginPageLink\": \"https:\u002F\u002Fyour-domain\u002Faccounts\"\n        }\n    },\n    \"providers\": [\n            {\n                \"name\": \"google\",\n                \"fields\": {\n                    \"iss\": \"safeString?\",\n                    \"azp\": \"safeString?\",\n                    \"sub\": \"string\",\n                    \"email\": \"safeString\",\n                    \"email_verified\": \"boolean\",\n                    \"name\": \"safeString\",\n                    \"given_name\": \"safeString\",\n                    \"picture\": \"safeString\",\n                    \"family_name\": \"safeString?\",\n                    \"locale\": \"safeString?\"\n                }\n            },\n            {\n                \"name\": \"github\",\n                \"useStandardProfile\": true\n            },\n            {\n                \"name\": \"x\",\n                \"useStandardProfile\": true\n            },\n            {\n                \"name\": \"linkedin\",\n                \"useStandardProfile\": true\n            }\n    ],\n    \n    \"jwt\": {\n        \"jwt_secret_key\": \"super_long_secret\",\n        \"access_tokens\": {\n            \"expiresIn\": \"15m\",\n            \"expiresInMs\": 900000,\n            \"algorithm\": \"HS512\"\n        },\n        \"refresh_tokens\": {\n            \"refresh_ttl\": 259200000,\n            \"domain\": \"localhost\",\n            \"MAX_SESSION_LIFE\": 2592000000,\n            \"maxAllowedSessionsPerUser\": 5,\n            \"byPassAnomaliesFor\": 10800000\n        }\n    },\n    \"email\": {\n        \"resend_key\": \"12345\",\n        \"email\": \"noreply@example.com\"\n    },\n    \"logLevel\": \"info\"\n}\n```\nGenerate a key-pair for encrypting your config:\n\n```bash [Terminal]\nage-keygen -o age_key && age-keygen -y age_key > public_key\n```\nThis will generate 2 files:\n- `age_key` This is your private key, loosing it will prevent you from decrypting your config file, access to it from unauthorized actors will gain access to your configuration file.\n\n::warning\nMake sure you store it in a appropriate secret manager\n::\n\n- `public_key` this is the public key, you can delete it in any time and generate a new one, it does not contain sensitive information.\n\nEncrypt your configuration file: \n\n```bash [Terminal]\nage -a -e -r \"$(cat public_key)\" -o config.json.age config.json\n```\nThis will output the encrypted config file `config.json.age`. The docker image uses this file, and does the following:\n- Pick it up from the docker secrets\n- Decrypts it via the entrypoint script\n- Starts the service\n- The service loads the configuration file parses it and starts.\n- The service is then deletes the raw file from the container.\n\n::caution\nThe `age_key` file and `config.json.age` are kept. They needed for restarts.\nWithout the `age_key` file, the service could not restart.\n::\n\nWrite your compose file:\n\n```yaml [docker-compose.yml]\nservices:\n  mysql: \n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_ROOT_PASSWORD: very_secure_password\n      MYSQL_DATABASE: my_auth\n      MYSQL_USER: alice\n      MYSQL_PASSWORD: very_secure_password\n    cap_drop: [\"ALL\"]\n    user: \"999:999\"\n    security_opt: \n      - \"no-new-privileges:true\"\n    volumes:\n      - sql_db:\u002Fvar\u002Flib\u002Fmysql\n    healthcheck:\n      test: [\"CMD-SHELL\", \"bash -lc 'exec 3\u003C>\u002Fdev\u002Ftcp\u002F127.0.0.1\u002F3306'\"]\n      interval: 10s\n      timeout: 8s \n      retries: 5\n      start_period: 7m\n    networks:\n      backend:\n        ipv4_address: 172.20.5.3   \n\n  auth:\n    image: sergio68\u002Fauth\n    read_only: true  \n    restart: unless-stopped\n    cap_drop: [\"ALL\"]\n    user: 10001:10001\n    volumes: \n      - .\u002Fauth-logs\u002Fserver:\u002Fapp\u002Fauth-logs:rw\n      - .\u002Fauth-logs\u002Fserver\u002Fbot-detector:\u002Fapp\u002Fbot-detector-logs:rw\n      - bot-detector-data:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw\n      - email-data:\u002Fapp\u002Fdist\u002Femail-db:rw\n    tmpfs:\n      - \u002Frun\u002Fapp:rw,noexec,nosuid,nodev,uid=10001,gid=10001,size=1m\n    pids_limit: 200\n    secrets:\n      - age_key\n      - encrypted_config\n    security_opt:\n      - \"no-new-privileges:true\"\n    depends_on:\n      mysql:\n        condition: service_healthy\n    networks:\n      backend:\n        ipv4_address: 172.20.5.2 \n      egress: \n        ipv4_address: 172.22.20.2\n\n  app:\n    # Your app container\n    build: .\n    depends_on:\n      auth:\n        condition: service_healthy\n    networks:\n      frontend: \n        ipv4_address: 172.21.10.4 # Can be omitted\n      backend:\n        ipv4_address: 172.20.5.4\n\nvolumes:\n  sql_db:  \n  bot-detector-data:\n  email-data:\n\nsecrets:\n  age_key:\n    file: .\u002Fsecrets\u002Fauth\u002Fage_key\n  encrypted_config:\n    file: .\u002Fsecrets\u002Fauth\u002Fconfig.json.age\n    \nnetworks: \n  backend: \n    internal: true\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.20.0.0\u002F16\n          ip_range: 172.20.5.0\u002F24\n          gateway: 172.20.5.1\n  frontend:\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.21.10.0\u002F24\n          gateway: 172.21.10.1\n  egress:\n    internal: false\n    enable_ipv6: false\n    ipam:\n      config:\n        - subnet: 172.22.20.0\u002F24\n          gateway: 172.22.20.1\n```\n\nThe volume that required are: \n- `path\u002Fto\u002Flocal\u002Ffolder\u002Flogs:\u002Fapp\u002Fauth-logs:rw` Logs for the auth service.\n- `path\u002Fto\u002Flocal\u002Ffolder\u002Flogs:\u002Fapp\u002Fbot-detector-logs:rw` Logs for the bot-detector service.\n- `named-volume:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw` - For the data sources that the bot detector uses, it used to keep the data fresh.\n- `named-volume:\u002Fapp\u002Fdist\u002Femail-db:rw` - For the disposable email lmdb the auth service uses, also to keep it fresh.\n- [`tmpfs`](https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fstorage\u002Ftmpfs\u002F) - Do not change it. it used to decrypt the config put it in there, and load it. after it does so it deletes it.\n\nOptional are `.\u002Fconfig.json:\u002Frun\u002Fapp\u002Fconfig.json`.\n\nyou can skip encryption, and docker secrets, if you don't want it, and provide your configuration as a [bind mount](https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fstorage\u002Fbind-mounts\u002F).\n\nCouple of key things to understand is the `service.proxy.server`, `service.proxy.ipToTrust` and `service.clientIp` configuration options and how the docker compose network is configured to use so.\n\n## Network & Proxy Trust\n\nThe compose file defines three isolated networks:\n\n| Network | Subnet | Purpose |\n|---------|--------|---------|\n| `backend` | `172.20.0.0\u002F16` | Internal only. Connects `auth`, `mysql`, and your `app`. No external access. |\n| `frontend` | `172.21.10.0\u002F24` | Connects your `app` to the reverse proxy (Caddy, Nginx, etc.) and the outside world. |\n| `egress` | `172.22.20.0\u002F24` | Not internal. Allows `auth` to reach external services |\n\nThe `backend` network is marked `internal: true`, which means containers on it cannot reach the internet. The auth service and the database live here, completely isolated from direct outside access. Your app container bridges `backend` and `frontend`. It is the only service that can talk to both networks. See [Docker Networking docs](https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fnetwork\u002F)\n\nThe `egress` network is **not** marked as internal, so it allows outbound internet access. Only the auth service is connected to it. The auth service needs outbound access for:\n\n- Emails via Resend\n- Fetching fresh bot-detector data sources\n\n\nThe auth service runs behind your app, which acts as a reverse proxy \u002F intermediary. When `service.proxy.trust` is `true`, the auth service configures Express's [trust proxy](https:\u002F\u002Fexpressjs.com\u002Fen\u002Fguide\u002Fbehind-proxies.html) setting with a callback that only trusts specific IPs:\n\n```ts\nif (config.service?.proxy.trust) {\n    app.set(\"trust proxy\", (ip: string) => {\n        if (ip === config.service?.proxy.server || ip === config.service?.proxy.ipToTrust) return true;\n        return false;\n    });\n}\n```\n\nThis means the auth service only accepts forwarded headers (`X-Forwarded-For`, `X-Forwarded-Proto`, etc.) from the IPs you explicitly whitelist. Any other source is untrusted.\n\nThis is useful when using the BFF pattern described in [Backend for Frontend](\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff).\n\n::tip\nIf you use a [nitro](https:\u002F\u002Fnitro.build\u002F)\u002F[h3](https:\u002F\u002Fh3.dev\u002F) based frameworks such as [Nuxt](https:\u002F\u002Fnuxt.com\u002F) you should consider using the [Auth-H3Client](\u002Fdocs\u002Fauth-h3client) wrapper.\nIt does all the heavy lifting for you, haves a full OAuth client implemention, logging, and provide you with a set of higher order functions to use in your application, for easily protecting an endpoint.\n\nHere is a small example:\n\n```ts [example.ts]\nimport { defineAuthenticatedEventHandler } from 'auth-h3client';\n\nexport default defineAuthenticatedEventHandler((event) => {\n  const user = event.context.authorizedData;\n  \n  \u002F\u002F Do authenticated stuff\n  return {\n    message: `Hello ${user.userId}!`,\n    roles: user.roles\n  };\n});\n\n```\n::\n### Configuration Options\n\n| Option | Value in example | Purpose |\n|--------|-----------------|---------|\n| `service.proxy.trust` | `true` | Enables proxy trust mode. Required when running behind another container. |\n| `service.proxy.ipToTrust` | `172.20.5.4` | The IP address trusted to forward headers. This is your **app container's** backend IP. |\n| `service.proxy.server` | `172.20.5.4` | Fallback trusted IP (typically the same as `ipToTrust`). If omitted, defaults to the `ipAddress` bind address. |\n| `service.clientIp` | `172.20.5.4` | The IP allowed to call privileged internal endpoints (e.g. custom MFA flows, operational config). Falls back to `ipToTrust` if not set. |\n\n\nIn the compose file, your app container is assigned `172.20.5.4` on the backend network:\n\n```yaml\napp:\n    networks:\n      backend:\n        ipv4_address: 172.20.5.4\n```\n\nThe auth service config sets `ipToTrust: \"172.20.5.4\"` and `clientIp: \"172.20.5.4\"`, matching that exact IP. This is how the auth service knows:\n\n1. To only accept forwarded headers from `172.20.5.4`.\n2. To only allow privileged internal requests from `172.20.5.4`. Any request from a different IP is rejected with `403 Forbidden`.\n\n::warning\nIf you change the app container's backend IP in the compose file, you **must** update `service.proxy.ipToTrust`, `service.proxy.server`, and `service.clientIp` in your auth configuration to match. A mismatch means the auth service rejects all forwarded requests and blocks internal API calls.\n::\n\n### Using the service\n\nYour app can uses the [auth-h3client](\u002Fdocs\u002Fiam\u002Fessentials\u002Fh3-client) library for H3\u002FNitro based frameworks, or any other http backend:\n\n```bash [Terminal]\ncurl http:\u002F\u002Fauth:10000\u002Fhealth\n```\n\nIf you get back `OK`, the auth service is running and reachable from your app container, explore the docs to get an understanding of the service.\n\n\n## Deploying locally\n\nIf you prefer to run the auth service directly on a host machine without Docker, you will need to handle dependency installation, data source compilation, and data refresh yourself. The Docker image automates all of this, so consider it first if simplicity is a priority.\n\nBefore you start, make sure your environment has the following:\n\n| Dependency | Purpose |\n|------------|---------|\n| [Node.js 20+](https:\u002F\u002Fnodejs.org\u002F) | Runtime for the auth service |\n| [MySQL 8+](https:\u002F\u002Fdev.mysql.com\u002Fdownloads\u002F) | Database backend for users, sessions, rate limiters, and bot detection tables |\n| [`mmdbctl`](https:\u002F\u002Fgithub.com\u002Fipinfo\u002Fmmdbctl) | Compiles MMDB databases for geolocation and threat intelligence lookups |\n\nThe `mmdbctl` binary is installed automatically during the `bot-detector init` step if it is not already present on the system.\n\n::steps{level=\"4\"}\n\n#### Install the package\n\nInstall `@riavzon\u002Fauth` along with its required peer dependencies:\n\n::code-group\n\n```bash [pnpm]\npnpm add @riavzon\u002Fauth express cookie-parser mysql2\n```\n\n```bash [yarn]\nyarn add @riavzon\u002Fauth express cookie-parser mysql2\n```\n\n```bash [npm]\nnpm install @riavzon\u002Fauth express cookie-parser mysql2\n```\n\n```bash [bun]\nbun add @riavzon\u002Fauth express cookie-parser mysql2\n```\n\n::\n\n#### Compile the Bot Detector data sources\n\nThe auth service depends on [Bot Detector](\u002Fdocs\u002Fbot-detection) for IP analysis, threat scoring, and bot classification. Before starting the service for the first time, download and compile all required data sources:\n\n::code-group\n\n```bash [pnpm]\npnpm bot-detector init --contact=\"YourApp - you@example.com\"\n```\n\n```bash [yarn]\nyarn bot-detector init --contact=\"YourApp - you@example.com\"\n```\n\n```bash [npm]\nnpx bot-detector init --contact=\"YourApp - you@example.com\"\n```\n\n```bash [bun]\nbunx bot-detector init --contact=\"YourApp - you@example.com\"\n```\n\n::\n\nThe `--contact` flag sets the User-Agent string used when downloading BGP and ASN data from [BGP.tools](https:\u002F\u002Fbgp.tools). This is a requirement from their API. The command compiles MMDB and LMDB databases. See the [Bot Detector CLI reference](\u002Fdocs\u002Fbot-detection\u002Fcli) for the full list of subcommands and options.\n\n#### Create a configuration file\n\nWrite a `config.json` with your database credentials, secrets, and service settings. The full schema is documented in the [Configuration reference](\u002Fdocs\u002Fiam\u002Fconfiguration). A minimal working example:\n\n```json [config.json]\n{\n    \"store\": {\n        \"main\": {\n            \"host\": \"localhost\",\n            \"port\": 3306,\n            \"user\": \"auth_user\",\n            \"password\": \"secure_password\",\n            \"database\": \"auth_db\"\n        },\n        \"rate_limiters_pool\": {\n            \"store\": {\n                \"host\": \"localhost\",\n                \"port\": 3306,\n                \"user\": \"auth_user\",\n                \"password\": \"secure_password\",\n                \"database\": \"auth_db\"\n            },\n            \"dbName\": \"auth_db\"\n        }\n    },\n    \"service\": {\n        \"port\": 10000,\n        \"ipAddress\": \"0.0.0.0\"\n    },\n    \"password\": {\n        \"pepper\": \"your-pepper-secret\"\n    },\n    \"botDetector\": {\n        \"enableBotDetector\": true\n    },\n    \"magic_links\": {\n        \"jwt_secret_key\": \"long-random-secret\",\n        \"domain\": \"https:\u002F\u002Fyour-domain.com\",\n        \"notificationEmail\": {\n            \"websiteName\": \"Your App\",\n            \"privacyPolicyLink\": \"https:\u002F\u002Fyour-domain.com\u002Fprivacy\",\n            \"contactPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Fcontact\",\n            \"changePasswordPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Fsettings\",\n            \"loginPageLink\": \"https:\u002F\u002Fyour-domain.com\u002Flogin\"\n        }\n    },\n    \"jwt\": {\n        \"jwt_secret_key\": \"another-long-random-secret\",\n        \"access_tokens\": {},\n        \"refresh_tokens\": {\n            \"refresh_ttl\": 604800000,\n            \"domain\": \"your-domain.com\",\n            \"MAX_SESSION_LIFE\": 2592000000,\n            \"maxAllowedSessionsPerUser\": 5,\n            \"byPassAnomaliesFor\": 300000\n        }\n    },\n    \"email\": {\n        \"resend_key\": \"your-resend-api-key\",\n        \"email\": \"noreply@your-domain.com\"\n    }\n}\n```\n\nWhen running locally without a reverse proxy, you can omit the `service.proxy` and `service.clientIp` fields entirely. Those are only needed when the auth service sits behind another container or proxy that forwards requests on its behalf. If you do place a reverse proxy in front of the service, configure `service.proxy.trust`, `service.proxy.ipToTrust`, and `service.clientIp` to match the proxy's IP address as described in the [Network & Proxy Trust](#network--proxy-trust) section above.\n\n#### Initialize the database\n\nThe `auth` CLI creates all required MySQL tables and compiles the [disposable email domain blocklist](\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail) into an LMDB database. Run it once before starting the service for the first time:\n\n```bash [Terminal]\nnpx @riavzon\u002Fauth .\u002Fconfig.json\n```\n\nThe CLI accepts the config path as a positional argument, or reads it from the `CONFIG_PATH` environment variable. If neither is provided, it defaults to `.\u002Fconfig.json`.\n\nThis command runs three tasks:\n\n1. Creates all auth MySQL tables for users, sessions, rate limiters, and related data.\n2. Creates the Bot Detector tables used for IP analysis and threat scoring.\n3. Downloads and compiles the disposable email domain blocklist into `dist\u002Femail-db\u002Fdisposable-emails.mdb`.\n\nYou can also call it programmatically if you prefer to run initialization from your own startup script:\n\n```ts [init.ts]\nimport { initAuthData } from '@riavzon\u002Fauth'\nimport config from '.\u002Fconfig.ts'\n\nawait initAuthData(config)\n```\n\n#### Start the service\n\nThe package exports `startServer` from `@riavzon\u002Fauth\u002Fservice`. This function reads your configuration file, calls `bootstrapApp` internally to wire up the full middleware chain, starts listening, and schedules all data refresh tasks in the background. Set `CONFIG_PATH` to point at your config file and `SKIP_CONFIG_UNLINK` to `true` so the service does not delete it after loading:\n\n```bash [Terminal]\nSKIP_CONFIG_UNLINK=true CONFIG_PATH=.\u002Fconfig.json node .\u002Fnode_modules\u002F@riavzon\u002Fauth\u002Fdist\u002Fservice.mjs\n```\n\nThe service binds to the `service.port` and `service.ipAddress` values from your configuration, defaulting to `0.0.0.0:10000`. Once running, it schedules three background refresh tasks on a loop:\n- bot-detector data source refresh every 24 hours\n- detection database regeneration every 3 days\n- disposable email list recompilation every 7 days.\n\nYou do not need to set up cron jobs for these when using `startServer`.\n\nIf you prefer to embed the auth service into your own Express application instead of running the standalone process, see the [Library quick start](\u002Fdocs\u002Fiam\u002Fgetting-started#quick-start-library-mode) in the Getting Started guide. The library path gives you full control over the middleware chain and route mounting.\n\n::\n\n### Keeping data sources fresh\n\nBoth the Docker image and the standalone `startServer` process schedule background refresh tasks automatically after startup. If you use either of those, the data stays current without any extra configuration.\n\nIf you integrate `@riavzon\u002Fauth` as a library and manage your own Express server, you are responsible for keeping the data fresh. The simplest way is to call `refreshData` after your server starts listening. It schedules all three tasks on a recurring loop with the intervals you provide:\n\n```ts [server.ts]\nimport { refreshData } from '@riavzon\u002Fauth'\n\napp.listen(10000, () => {\n  refreshData(\n    1000 * 60 * 60 * 24,       \u002F\u002F bot-detector refresh: every 24 hours\n    1000 * 60 * 60 * 24 * 3,   \u002F\u002F bot-detector generate: every 3 days\n    1000 * 60 * 60 * 24 * 7,   \u002F\u002F shield-base email list: every 7 days\n  )\n})\n```\n\nSee the [`refreshData` API reference](\u002Fdocs\u002Fiam\u002Fapi\u002Fapi#refreshdatadatasourceinterval-generatorinterval-disposableemaillist) for parameter details.\n\nAlternatively, you can run the same tasks as cron jobs or scheduled tasks on the host:\n\n```bash [crontab]\n# Daily at 3:00 AM - refresh bot-detector data sources\n0 3 * * * cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx bot-detector refresh\n\n# Every 3 days at 4:00 AM - regenerate compiled databases\n0 4 *\u002F3 * * cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx bot-detector generate\n\n# Weekly on Sunday at 5:00 AM - refresh disposable email list\n0 5 * * 0 cd \u002Fpath\u002Fto\u002Fyour\u002Fapp && npx @riavzon\u002Fshield-base --email --path=dist\n```\n\n```ts [server.ts]\nimport { scheduleTask } from '@riavzon\u002Fauth'\nscheduleTask('my-cleanup', '.\u002Fnode_modules\u002F.bin\u002Fmy-tool', ['--clean'], 1000 * 60 * 60 * 12)\n```\n::tip\nSee the [`scheduleTask` API reference](\u002Fdocs\u002Fiam\u002Fapi\u002Fapi#scheduletaskname-cmd-args-interval) for details.\n::\n\nWithout either approach, the geolocation databases, threat lists, and email blocklist will become stale over time. The `bot-detector refresh` task is the most important one since threat intelligence feeds change frequently. See the [Bot Detector CLI reference](\u002Fdocs\u002Fbot-detection\u002Fcli) for details on each subcommand and the [Shield Base CLI reference](\u002Fdocs\u002Fshield-base\u002Fcli) for the email compilation flags.\n\n\n\n\n",{"title":225,"description":6015},"GA7g5kJYqeZ6yDlzPvVqOV98vvc2-wWIvtESA7YvQV4",[6024,6025],{"title":38,"path":217,"stem":218,"children":-1},{"title":229,"path":230,"stem":231,"children":-1},{"id":851,"title":225,"body":6027,"description":6015,"extension":6016,"icon":6017,"meta":10331,"module":6019,"navigation":8,"path":226,"rawbody":6020,"seo":10332,"stem":227,"__hash__":6022},{"type":853,"value":6028,"toc":10322},[6029,6035,6039,6041,6083,6087,7463,7465,7489,7491,7497,7501,7507,7509,7539,7543,7555,7565,7567,8305,8307,8332,8336,8341,8349,8351,8353,8413,8426,8432,8438,8447,8571,8577,8581,8720,8722,8792,8796,8826,8832,8844,8856,8858,8862,8872,8876,8878,8880,8882,8923,8929,9990,9992,9996,10002,10128,10134,10136,10236,10304,10312,10320],[856,6030,858,6031,863,6033,867],{},[860,6032,862],{},[860,6034,866],{},[856,6036,870,6037,875],{},[872,6038,874],{"href":230},[856,6040,878],{},[880,6042,6043,6051],{},[883,6044,6045],{},[886,6046,6047,6049],{},[889,6048,891],{},[889,6050,894],{},[896,6052,6053,6062,6071],{},[886,6054,6055,6060],{},[901,6056,6057],{},[872,6058,866],{"href":905,"rel":6059},[907],[901,6061,910],{},[886,6063,6064,6069],{},[901,6065,6066],{},[872,6067,918],{"href":905,"rel":6068},[907],[901,6070,921],{},[886,6072,6073,6081],{},[901,6074,6075,931,6078],{},[872,6076,930],{"href":928,"rel":6077},[907],[872,6079,936],{"href":934,"rel":6080},[907],[901,6082,939],{},[856,6084,942,6085,946],{},[872,6086,945],{"href":238},[948,6088,6089],{"className":950,"code":951,"filename":952,"language":5,"meta":953,"style":953},[860,6090,6091,6095,6107,6119,6137,6151,6169,6187,6203,6207,6219,6231,6249,6263,6281,6299,6315,6319,6335,6339,6343,6355,6367,6385,6403,6415,6419,6431,6445,6463,6479,6483,6497,6515,6531,6535,6547,6565,6579,6593,6605,6609,6621,6633,6637,6649,6663,6675,6679,6691,6709,6727,6745,6757,6775,6793,6811,6829,6845,6849,6853,6865,6869,6887,6899,6917,6935,6953,6971,6989,7007,7025,7043,7061,7077,7081,7085,7089,7107,7119,7123,7127,7145,7157,7161,7165,7183,7195,7199,7203,7207,7219,7237,7249,7267,7281,7297,7301,7313,7327,7345,7359,7373,7385,7389,7393,7405,7423,7439,7443,7459],{"__ignoreMap":953},[957,6092,6093],{"class":959,"line":960},[957,6094,964],{"class":963},[957,6096,6097,6099,6101,6103,6105],{"class":959,"line":967},[957,6098,971],{"class":970},[957,6100,975],{"class":974},[957,6102,978],{"class":970},[957,6104,982],{"class":981},[957,6106,985],{"class":963},[957,6108,6109,6111,6113,6115,6117],{"class":959,"line":988},[957,6110,991],{"class":970},[957,6112,994],{"class":974},[957,6114,978],{"class":970},[957,6116,982],{"class":981},[957,6118,985],{"class":963},[957,6120,6121,6123,6125,6127,6129,6131,6133,6135],{"class":959,"line":1003},[957,6122,1006],{"class":970},[957,6124,1009],{"class":974},[957,6126,978],{"class":970},[957,6128,982],{"class":981},[957,6130,1017],{"class":1016},[957,6132,1021],{"class":1020},[957,6134,978],{"class":1016},[957,6136,1026],{"class":963},[957,6138,6139,6141,6143,6145,6147,6149],{"class":959,"line":1029},[957,6140,1006],{"class":970},[957,6142,1034],{"class":974},[957,6144,978],{"class":970},[957,6146,982],{"class":981},[957,6148,1042],{"class":1041},[957,6150,1026],{"class":963},[957,6152,6153,6155,6157,6159,6161,6163,6165,6167],{"class":959,"line":1047},[957,6154,1006],{"class":970},[957,6156,1052],{"class":974},[957,6158,978],{"class":970},[957,6160,982],{"class":981},[957,6162,1017],{"class":1016},[957,6164,1061],{"class":1020},[957,6166,978],{"class":1016},[957,6168,1026],{"class":963},[957,6170,6171,6173,6175,6177,6179,6181,6183,6185],{"class":959,"line":1068},[957,6172,1006],{"class":970},[957,6174,1073],{"class":974},[957,6176,978],{"class":970},[957,6178,982],{"class":981},[957,6180,1017],{"class":1016},[957,6182,1082],{"class":1020},[957,6184,978],{"class":1016},[957,6186,1026],{"class":963},[957,6188,6189,6191,6193,6195,6197,6199,6201],{"class":959,"line":1089},[957,6190,1006],{"class":970},[957,6192,1094],{"class":974},[957,6194,978],{"class":970},[957,6196,982],{"class":981},[957,6198,1017],{"class":1016},[957,6200,1103],{"class":1020},[957,6202,1106],{"class":1016},[957,6204,6205],{"class":959,"line":1109},[957,6206,1112],{"class":963},[957,6208,6209,6211,6213,6215,6217],{"class":959,"line":1115},[957,6210,991],{"class":970},[957,6212,1120],{"class":974},[957,6214,978],{"class":970},[957,6216,982],{"class":981},[957,6218,985],{"class":963},[957,6220,6221,6223,6225,6227,6229],{"class":959,"line":1129},[957,6222,1006],{"class":970},[957,6224,975],{"class":974},[957,6226,978],{"class":970},[957,6228,982],{"class":981},[957,6230,985],{"class":963},[957,6232,6233,6235,6237,6239,6241,6243,6245,6247],{"class":959,"line":1142},[957,6234,1145],{"class":970},[957,6236,1009],{"class":974},[957,6238,978],{"class":970},[957,6240,982],{"class":981},[957,6242,1017],{"class":1016},[957,6244,1021],{"class":1020},[957,6246,978],{"class":1016},[957,6248,1026],{"class":963},[957,6250,6251,6253,6255,6257,6259,6261],{"class":959,"line":1162},[957,6252,1145],{"class":970},[957,6254,1034],{"class":974},[957,6256,978],{"class":970},[957,6258,982],{"class":981},[957,6260,1042],{"class":1041},[957,6262,1026],{"class":963},[957,6264,6265,6267,6269,6271,6273,6275,6277,6279],{"class":959,"line":1177},[957,6266,1145],{"class":970},[957,6268,1052],{"class":974},[957,6270,978],{"class":970},[957,6272,982],{"class":981},[957,6274,1017],{"class":1016},[957,6276,1061],{"class":1020},[957,6278,978],{"class":1016},[957,6280,1026],{"class":963},[957,6282,6283,6285,6287,6289,6291,6293,6295,6297],{"class":959,"line":1196},[957,6284,1145],{"class":970},[957,6286,1094],{"class":974},[957,6288,978],{"class":970},[957,6290,982],{"class":981},[957,6292,1017],{"class":1016},[957,6294,1103],{"class":1020},[957,6296,978],{"class":1016},[957,6298,1026],{"class":963},[957,6300,6301,6303,6305,6307,6309,6311,6313],{"class":959,"line":1215},[957,6302,1145],{"class":970},[957,6304,1073],{"class":974},[957,6306,978],{"class":970},[957,6308,982],{"class":981},[957,6310,1017],{"class":1016},[957,6312,1082],{"class":1020},[957,6314,1106],{"class":1016},[957,6316,6317],{"class":959,"line":1232},[957,6318,1235],{"class":963},[957,6320,6321,6323,6325,6327,6329,6331,6333],{"class":959,"line":1238},[957,6322,1006],{"class":970},[957,6324,1243],{"class":974},[957,6326,978],{"class":970},[957,6328,982],{"class":981},[957,6330,1017],{"class":1016},[957,6332,1103],{"class":1020},[957,6334,1106],{"class":1016},[957,6336,6337],{"class":959,"line":1256},[957,6338,1259],{"class":963},[957,6340,6341],{"class":959,"line":1262},[957,6342,1265],{"class":963},[957,6344,6345,6347,6349,6351,6353],{"class":959,"line":1268},[957,6346,971],{"class":970},[957,6348,1273],{"class":974},[957,6350,978],{"class":970},[957,6352,982],{"class":981},[957,6354,985],{"class":963},[957,6356,6357,6359,6361,6363,6365],{"class":959,"line":1282},[957,6358,971],{"class":970},[957,6360,1287],{"class":974},[957,6362,978],{"class":970},[957,6364,982],{"class":981},[957,6366,985],{"class":963},[957,6368,6369,6371,6373,6375,6377,6379,6381,6383],{"class":959,"line":1296},[957,6370,991],{"class":970},[957,6372,1301],{"class":974},[957,6374,978],{"class":970},[957,6376,982],{"class":981},[957,6378,1017],{"class":1016},[957,6380,1310],{"class":1020},[957,6382,978],{"class":1016},[957,6384,1026],{"class":963},[957,6386,6387,6389,6391,6393,6395,6397,6399,6401],{"class":959,"line":1317},[957,6388,991],{"class":970},[957,6390,1322],{"class":974},[957,6392,978],{"class":970},[957,6394,982],{"class":981},[957,6396,1017],{"class":1016},[957,6398,1331],{"class":1020},[957,6400,978],{"class":1016},[957,6402,1026],{"class":963},[957,6404,6405,6407,6409,6411,6413],{"class":959,"line":1338},[957,6406,991],{"class":970},[957,6408,1343],{"class":974},[957,6410,978],{"class":970},[957,6412,982],{"class":981},[957,6414,1350],{"class":1041},[957,6416,6417],{"class":959,"line":1353},[957,6418,1112],{"class":963},[957,6420,6421,6423,6425,6427,6429],{"class":959,"line":1358},[957,6422,991],{"class":970},[957,6424,1363],{"class":974},[957,6426,978],{"class":970},[957,6428,982],{"class":981},[957,6430,985],{"class":963},[957,6432,6433,6435,6437,6439,6441,6443],{"class":959,"line":1372},[957,6434,1006],{"class":970},[957,6436,1377],{"class":974},[957,6438,978],{"class":970},[957,6440,982],{"class":981},[957,6442,1385],{"class":1384},[957,6444,1026],{"class":963},[957,6446,6447,6449,6451,6453,6455,6457,6459,6461],{"class":959,"line":1390},[957,6448,1006],{"class":970},[957,6450,1395],{"class":974},[957,6452,978],{"class":970},[957,6454,982],{"class":981},[957,6456,1017],{"class":1016},[957,6458,1404],{"class":1020},[957,6460,978],{"class":1016},[957,6462,1026],{"class":963},[957,6464,6465,6467,6469,6471,6473,6475,6477],{"class":959,"line":1411},[957,6466,1006],{"class":970},[957,6468,1416],{"class":974},[957,6470,978],{"class":970},[957,6472,982],{"class":981},[957,6474,1017],{"class":1016},[957,6476,1404],{"class":1020},[957,6478,1106],{"class":1016},[957,6480,6481],{"class":959,"line":1429},[957,6482,1112],{"class":963},[957,6484,6485,6487,6489,6491,6493,6495],{"class":959,"line":1434},[957,6486,991],{"class":970},[957,6488,1034],{"class":974},[957,6490,978],{"class":970},[957,6492,982],{"class":981},[957,6494,1445],{"class":1041},[957,6496,1026],{"class":963},[957,6498,6499,6501,6503,6505,6507,6509,6511,6513],{"class":959,"line":1450},[957,6500,991],{"class":970},[957,6502,1455],{"class":974},[957,6504,978],{"class":970},[957,6506,982],{"class":981},[957,6508,1017],{"class":1016},[957,6510,1464],{"class":1020},[957,6512,978],{"class":1016},[957,6514,1026],{"class":963},[957,6516,6517,6519,6521,6523,6525,6527,6529],{"class":959,"line":1471},[957,6518,991],{"class":970},[957,6520,1476],{"class":974},[957,6522,978],{"class":970},[957,6524,982],{"class":981},[957,6526,1017],{"class":1016},[957,6528,1404],{"class":1020},[957,6530,1106],{"class":1016},[957,6532,6533],{"class":959,"line":1489},[957,6534,1265],{"class":963},[957,6536,6537,6539,6541,6543,6545],{"class":959,"line":1494},[957,6538,971],{"class":970},[957,6540,1073],{"class":974},[957,6542,978],{"class":970},[957,6544,982],{"class":981},[957,6546,985],{"class":963},[957,6548,6549,6551,6553,6555,6557,6559,6561,6563],{"class":959,"line":1507},[957,6550,991],{"class":970},[957,6552,1512],{"class":974},[957,6554,978],{"class":970},[957,6556,982],{"class":981},[957,6558,1017],{"class":1016},[957,6560,1521],{"class":1020},[957,6562,978],{"class":1016},[957,6564,1026],{"class":963},[957,6566,6567,6569,6571,6573,6575,6577],{"class":959,"line":1528},[957,6568,991],{"class":970},[957,6570,1533],{"class":974},[957,6572,978],{"class":970},[957,6574,982],{"class":981},[957,6576,1540],{"class":1041},[957,6578,1026],{"class":963},[957,6580,6581,6583,6585,6587,6589,6591],{"class":959,"line":1545},[957,6582,991],{"class":970},[957,6584,1550],{"class":974},[957,6586,978],{"class":970},[957,6588,982],{"class":981},[957,6590,1557],{"class":1041},[957,6592,1026],{"class":963},[957,6594,6595,6597,6599,6601,6603],{"class":959,"line":1562},[957,6596,991],{"class":970},[957,6598,1567],{"class":974},[957,6600,978],{"class":970},[957,6602,982],{"class":981},[957,6604,1574],{"class":1041},[957,6606,6607],{"class":959,"line":1577},[957,6608,1265],{"class":963},[957,6610,6611,6613,6615,6617,6619],{"class":959,"line":1582},[957,6612,971],{"class":970},[957,6614,1587],{"class":974},[957,6616,978],{"class":970},[957,6618,982],{"class":981},[957,6620,985],{"class":963},[957,6622,6623,6625,6627,6629,6631],{"class":959,"line":1596},[957,6624,991],{"class":970},[957,6626,1601],{"class":974},[957,6628,978],{"class":970},[957,6630,982],{"class":981},[957,6632,1608],{"class":1384},[957,6634,6635],{"class":959,"line":1611},[957,6636,1265],{"class":963},[957,6638,6639,6641,6643,6645,6647],{"class":959,"line":1616},[957,6640,971],{"class":970},[957,6642,1621],{"class":974},[957,6644,978],{"class":970},[957,6646,982],{"class":981},[957,6648,985],{"class":963},[957,6650,6651,6653,6655,6657,6659,6661],{"class":959,"line":1630},[957,6652,991],{"class":970},[957,6654,1635],{"class":974},[957,6656,978],{"class":970},[957,6658,982],{"class":981},[957,6660,1540],{"class":1041},[957,6662,1026],{"class":963},[957,6664,6665,6667,6669,6671,6673],{"class":959,"line":1646},[957,6666,991],{"class":970},[957,6668,1651],{"class":974},[957,6670,978],{"class":970},[957,6672,982],{"class":981},[957,6674,1658],{"class":1041},[957,6676,6677],{"class":959,"line":1661},[957,6678,1265],{"class":963},[957,6680,6681,6683,6685,6687,6689],{"class":959,"line":1666},[957,6682,971],{"class":970},[957,6684,1671],{"class":974},[957,6686,978],{"class":970},[957,6688,982],{"class":981},[957,6690,985],{"class":963},[957,6692,6693,6695,6697,6699,6701,6703,6705,6707],{"class":959,"line":1680},[957,6694,991],{"class":970},[957,6696,1685],{"class":974},[957,6698,978],{"class":970},[957,6700,982],{"class":981},[957,6702,1017],{"class":1016},[957,6704,1694],{"class":1020},[957,6706,978],{"class":1016},[957,6708,1026],{"class":963},[957,6710,6711,6713,6715,6717,6719,6721,6723,6725],{"class":959,"line":1701},[957,6712,991],{"class":970},[957,6714,1706],{"class":974},[957,6716,978],{"class":970},[957,6718,982],{"class":981},[957,6720,1017],{"class":1016},[957,6722,1715],{"class":1020},[957,6724,978],{"class":1016},[957,6726,1026],{"class":963},[957,6728,6729,6731,6733,6735,6737,6739,6741,6743],{"class":959,"line":1722},[957,6730,991],{"class":970},[957,6732,1727],{"class":974},[957,6734,978],{"class":970},[957,6736,982],{"class":981},[957,6738,1017],{"class":1016},[957,6740,1736],{"class":1020},[957,6742,978],{"class":1016},[957,6744,1026],{"class":963},[957,6746,6747,6749,6751,6753,6755],{"class":959,"line":1743},[957,6748,991],{"class":970},[957,6750,1748],{"class":974},[957,6752,978],{"class":970},[957,6754,982],{"class":981},[957,6756,985],{"class":963},[957,6758,6759,6761,6763,6765,6767,6769,6771,6773],{"class":959,"line":1757},[957,6760,1006],{"class":970},[957,6762,1762],{"class":974},[957,6764,978],{"class":970},[957,6766,982],{"class":981},[957,6768,1017],{"class":1016},[957,6770,1771],{"class":1020},[957,6772,978],{"class":1016},[957,6774,1026],{"class":963},[957,6776,6777,6779,6781,6783,6785,6787,6789,6791],{"class":959,"line":1778},[957,6778,1006],{"class":970},[957,6780,1783],{"class":974},[957,6782,978],{"class":970},[957,6784,982],{"class":981},[957,6786,1017],{"class":1016},[957,6788,1792],{"class":1020},[957,6790,978],{"class":1016},[957,6792,1026],{"class":963},[957,6794,6795,6797,6799,6801,6803,6805,6807,6809],{"class":959,"line":1799},[957,6796,1006],{"class":970},[957,6798,1804],{"class":974},[957,6800,978],{"class":970},[957,6802,982],{"class":981},[957,6804,1017],{"class":1016},[957,6806,1813],{"class":1020},[957,6808,978],{"class":1016},[957,6810,1026],{"class":963},[957,6812,6813,6815,6817,6819,6821,6823,6825,6827],{"class":959,"line":1820},[957,6814,1006],{"class":970},[957,6816,1825],{"class":974},[957,6818,978],{"class":970},[957,6820,982],{"class":981},[957,6822,1017],{"class":1016},[957,6824,1834],{"class":1020},[957,6826,978],{"class":1016},[957,6828,1026],{"class":963},[957,6830,6831,6833,6835,6837,6839,6841,6843],{"class":959,"line":1841},[957,6832,1006],{"class":970},[957,6834,1846],{"class":974},[957,6836,978],{"class":970},[957,6838,982],{"class":981},[957,6840,1017],{"class":1016},[957,6842,1834],{"class":1020},[957,6844,1106],{"class":1016},[957,6846,6847],{"class":959,"line":1859},[957,6848,1259],{"class":963},[957,6850,6851],{"class":959,"line":1864},[957,6852,1265],{"class":963},[957,6854,6855,6857,6859,6861,6863],{"class":959,"line":1869},[957,6856,971],{"class":970},[957,6858,1874],{"class":974},[957,6860,978],{"class":970},[957,6862,982],{"class":981},[957,6864,1881],{"class":963},[957,6866,6867],{"class":959,"line":1884},[957,6868,1887],{"class":963},[957,6870,6871,6873,6875,6877,6879,6881,6883,6885],{"class":959,"line":1890},[957,6872,1145],{"class":970},[957,6874,1895],{"class":974},[957,6876,978],{"class":970},[957,6878,982],{"class":981},[957,6880,1017],{"class":1016},[957,6882,1904],{"class":1020},[957,6884,978],{"class":1016},[957,6886,1026],{"class":963},[957,6888,6889,6891,6893,6895,6897],{"class":959,"line":1911},[957,6890,1145],{"class":970},[957,6892,1916],{"class":974},[957,6894,978],{"class":970},[957,6896,982],{"class":981},[957,6898,985],{"class":963},[957,6900,6901,6903,6905,6907,6909,6911,6913,6915],{"class":959,"line":1925},[957,6902,1928],{"class":970},[957,6904,1931],{"class":974},[957,6906,978],{"class":970},[957,6908,982],{"class":981},[957,6910,1017],{"class":1016},[957,6912,1940],{"class":1020},[957,6914,978],{"class":1016},[957,6916,1026],{"class":963},[957,6918,6919,6921,6923,6925,6927,6929,6931,6933],{"class":959,"line":1947},[957,6920,1928],{"class":970},[957,6922,1952],{"class":974},[957,6924,978],{"class":970},[957,6926,982],{"class":981},[957,6928,1017],{"class":1016},[957,6930,1940],{"class":1020},[957,6932,978],{"class":1016},[957,6934,1026],{"class":963},[957,6936,6937,6939,6941,6943,6945,6947,6949,6951],{"class":959,"line":1967},[957,6938,1928],{"class":970},[957,6940,1972],{"class":974},[957,6942,978],{"class":970},[957,6944,982],{"class":981},[957,6946,1017],{"class":1016},[957,6948,1981],{"class":1020},[957,6950,978],{"class":1016},[957,6952,1026],{"class":963},[957,6954,6955,6957,6959,6961,6963,6965,6967,6969],{"class":959,"line":1988},[957,6956,1928],{"class":970},[957,6958,1993],{"class":974},[957,6960,978],{"class":970},[957,6962,982],{"class":981},[957,6964,1017],{"class":1016},[957,6966,2002],{"class":1020},[957,6968,978],{"class":1016},[957,6970,1026],{"class":963},[957,6972,6973,6975,6977,6979,6981,6983,6985,6987],{"class":959,"line":2009},[957,6974,1928],{"class":970},[957,6976,2014],{"class":974},[957,6978,978],{"class":970},[957,6980,982],{"class":981},[957,6982,1017],{"class":1016},[957,6984,2023],{"class":1020},[957,6986,978],{"class":1016},[957,6988,1026],{"class":963},[957,6990,6991,6993,6995,6997,6999,7001,7003,7005],{"class":959,"line":2030},[957,6992,1928],{"class":970},[957,6994,1895],{"class":974},[957,6996,978],{"class":970},[957,6998,982],{"class":981},[957,7000,1017],{"class":1016},[957,7002,2002],{"class":1020},[957,7004,978],{"class":1016},[957,7006,1026],{"class":963},[957,7008,7009,7011,7013,7015,7017,7019,7021,7023],{"class":959,"line":2049},[957,7010,1928],{"class":970},[957,7012,2054],{"class":974},[957,7014,978],{"class":970},[957,7016,982],{"class":981},[957,7018,1017],{"class":1016},[957,7020,2002],{"class":1020},[957,7022,978],{"class":1016},[957,7024,1026],{"class":963},[957,7026,7027,7029,7031,7033,7035,7037,7039,7041],{"class":959,"line":2069},[957,7028,1928],{"class":970},[957,7030,2074],{"class":974},[957,7032,978],{"class":970},[957,7034,982],{"class":981},[957,7036,1017],{"class":1016},[957,7038,2002],{"class":1020},[957,7040,978],{"class":1016},[957,7042,1026],{"class":963},[957,7044,7045,7047,7049,7051,7053,7055,7057,7059],{"class":959,"line":2089},[957,7046,1928],{"class":970},[957,7048,2094],{"class":974},[957,7050,978],{"class":970},[957,7052,982],{"class":981},[957,7054,1017],{"class":1016},[957,7056,1940],{"class":1020},[957,7058,978],{"class":1016},[957,7060,1026],{"class":963},[957,7062,7063,7065,7067,7069,7071,7073,7075],{"class":959,"line":2109},[957,7064,1928],{"class":970},[957,7066,2114],{"class":974},[957,7068,978],{"class":970},[957,7070,982],{"class":981},[957,7072,1017],{"class":1016},[957,7074,1940],{"class":1020},[957,7076,1106],{"class":1016},[957,7078,7079],{"class":959,"line":2127},[957,7080,2130],{"class":963},[957,7082,7083],{"class":959,"line":2133},[957,7084,1235],{"class":963},[957,7086,7087],{"class":959,"line":2138},[957,7088,1887],{"class":963},[957,7090,7091,7093,7095,7097,7099,7101,7103,7105],{"class":959,"line":2143},[957,7092,1145],{"class":970},[957,7094,1895],{"class":974},[957,7096,978],{"class":970},[957,7098,982],{"class":981},[957,7100,1017],{"class":1016},[957,7102,2156],{"class":1020},[957,7104,978],{"class":1016},[957,7106,1026],{"class":963},[957,7108,7109,7111,7113,7115,7117],{"class":959,"line":2163},[957,7110,1145],{"class":970},[957,7112,2168],{"class":974},[957,7114,978],{"class":970},[957,7116,982],{"class":981},[957,7118,2175],{"class":1384},[957,7120,7121],{"class":959,"line":2178},[957,7122,1235],{"class":963},[957,7124,7125],{"class":959,"line":2183},[957,7126,1887],{"class":963},[957,7128,7129,7131,7133,7135,7137,7139,7141,7143],{"class":959,"line":2188},[957,7130,1145],{"class":970},[957,7132,1895],{"class":974},[957,7134,978],{"class":970},[957,7136,982],{"class":981},[957,7138,1017],{"class":1016},[957,7140,2201],{"class":1020},[957,7142,978],{"class":1016},[957,7144,1026],{"class":963},[957,7146,7147,7149,7151,7153,7155],{"class":959,"line":2208},[957,7148,1145],{"class":970},[957,7150,2168],{"class":974},[957,7152,978],{"class":970},[957,7154,982],{"class":981},[957,7156,2175],{"class":1384},[957,7158,7159],{"class":959,"line":2221},[957,7160,1235],{"class":963},[957,7162,7163],{"class":959,"line":2226},[957,7164,1887],{"class":963},[957,7166,7167,7169,7171,7173,7175,7177,7179,7181],{"class":959,"line":2231},[957,7168,1145],{"class":970},[957,7170,1895],{"class":974},[957,7172,978],{"class":970},[957,7174,982],{"class":981},[957,7176,1017],{"class":1016},[957,7178,2244],{"class":1020},[957,7180,978],{"class":1016},[957,7182,1026],{"class":963},[957,7184,7185,7187,7189,7191,7193],{"class":959,"line":2251},[957,7186,1145],{"class":970},[957,7188,2168],{"class":974},[957,7190,978],{"class":970},[957,7192,982],{"class":981},[957,7194,2175],{"class":1384},[957,7196,7197],{"class":959,"line":2264},[957,7198,2267],{"class":963},[957,7200,7201],{"class":959,"line":2270},[957,7202,2273],{"class":963},[957,7204,7205],{"class":959,"line":2276},[957,7206,2279],{"class":963},[957,7208,7209,7211,7213,7215,7217],{"class":959,"line":2282},[957,7210,971],{"class":970},[957,7212,2287],{"class":974},[957,7214,978],{"class":970},[957,7216,982],{"class":981},[957,7218,985],{"class":963},[957,7220,7221,7223,7225,7227,7229,7231,7233,7235],{"class":959,"line":2296},[957,7222,991],{"class":970},[957,7224,1685],{"class":974},[957,7226,978],{"class":970},[957,7228,982],{"class":981},[957,7230,1017],{"class":1016},[957,7232,2309],{"class":1020},[957,7234,978],{"class":1016},[957,7236,1026],{"class":963},[957,7238,7239,7241,7243,7245,7247],{"class":959,"line":2316},[957,7240,991],{"class":970},[957,7242,2321],{"class":974},[957,7244,978],{"class":970},[957,7246,982],{"class":981},[957,7248,985],{"class":963},[957,7250,7251,7253,7255,7257,7259,7261,7263,7265],{"class":959,"line":2330},[957,7252,1006],{"class":970},[957,7254,1706],{"class":974},[957,7256,978],{"class":970},[957,7258,982],{"class":981},[957,7260,1017],{"class":1016},[957,7262,2343],{"class":1020},[957,7264,978],{"class":1016},[957,7266,1026],{"class":963},[957,7268,7269,7271,7273,7275,7277,7279],{"class":959,"line":2350},[957,7270,1006],{"class":970},[957,7272,2355],{"class":974},[957,7274,978],{"class":970},[957,7276,982],{"class":981},[957,7278,2362],{"class":1041},[957,7280,1026],{"class":963},[957,7282,7283,7285,7287,7289,7291,7293,7295],{"class":959,"line":2367},[957,7284,1006],{"class":970},[957,7286,2372],{"class":974},[957,7288,978],{"class":970},[957,7290,982],{"class":981},[957,7292,1017],{"class":1016},[957,7294,2381],{"class":1020},[957,7296,1106],{"class":1016},[957,7298,7299],{"class":959,"line":2386},[957,7300,1112],{"class":963},[957,7302,7303,7305,7307,7309,7311],{"class":959,"line":2391},[957,7304,991],{"class":970},[957,7306,2396],{"class":974},[957,7308,978],{"class":970},[957,7310,982],{"class":981},[957,7312,985],{"class":963},[957,7314,7315,7317,7319,7321,7323,7325],{"class":959,"line":2405},[957,7316,1006],{"class":970},[957,7318,2410],{"class":974},[957,7320,978],{"class":970},[957,7322,982],{"class":981},[957,7324,2417],{"class":1041},[957,7326,1026],{"class":963},[957,7328,7329,7331,7333,7335,7337,7339,7341,7343],{"class":959,"line":2422},[957,7330,1006],{"class":970},[957,7332,1727],{"class":974},[957,7334,978],{"class":970},[957,7336,982],{"class":981},[957,7338,1017],{"class":1016},[957,7340,2435],{"class":1020},[957,7342,978],{"class":1016},[957,7344,1026],{"class":963},[957,7346,7347,7349,7351,7353,7355,7357],{"class":959,"line":2442},[957,7348,1006],{"class":970},[957,7350,2447],{"class":974},[957,7352,978],{"class":970},[957,7354,982],{"class":981},[957,7356,2454],{"class":1041},[957,7358,1026],{"class":963},[957,7360,7361,7363,7365,7367,7369,7371],{"class":959,"line":2459},[957,7362,1006],{"class":970},[957,7364,2464],{"class":974},[957,7366,978],{"class":970},[957,7368,982],{"class":981},[957,7370,2471],{"class":1041},[957,7372,1026],{"class":963},[957,7374,7375,7377,7379,7381,7383],{"class":959,"line":2476},[957,7376,1006],{"class":970},[957,7378,2481],{"class":974},[957,7380,978],{"class":970},[957,7382,982],{"class":981},[957,7384,2488],{"class":1041},[957,7386,7387],{"class":959,"line":2491},[957,7388,1259],{"class":963},[957,7390,7391],{"class":959,"line":2496},[957,7392,1265],{"class":963},[957,7394,7395,7397,7399,7401,7403],{"class":959,"line":2501},[957,7396,971],{"class":970},[957,7398,1993],{"class":974},[957,7400,978],{"class":970},[957,7402,982],{"class":981},[957,7404,985],{"class":963},[957,7406,7407,7409,7411,7413,7415,7417,7419,7421],{"class":959,"line":2514},[957,7408,991],{"class":970},[957,7410,2519],{"class":974},[957,7412,978],{"class":970},[957,7414,982],{"class":981},[957,7416,1017],{"class":1016},[957,7418,2528],{"class":1020},[957,7420,978],{"class":1016},[957,7422,1026],{"class":963},[957,7424,7425,7427,7429,7431,7433,7435,7437],{"class":959,"line":2535},[957,7426,991],{"class":970},[957,7428,1993],{"class":974},[957,7430,978],{"class":970},[957,7432,982],{"class":981},[957,7434,1017],{"class":1016},[957,7436,2548],{"class":1020},[957,7438,1106],{"class":1016},[957,7440,7441],{"class":959,"line":2553},[957,7442,1265],{"class":963},[957,7444,7445,7447,7449,7451,7453,7455,7457],{"class":959,"line":2558},[957,7446,971],{"class":970},[957,7448,2563],{"class":974},[957,7450,978],{"class":970},[957,7452,982],{"class":981},[957,7454,1017],{"class":1016},[957,7456,2572],{"class":1020},[957,7458,1106],{"class":1016},[957,7460,7461],{"class":959,"line":2577},[957,7462,2580],{"class":963},[856,7464,2583],{},[948,7466,7467],{"className":2586,"code":2587,"filename":2588,"language":2589,"meta":953,"style":953},[860,7468,7469],{"__ignoreMap":953},[957,7470,7471,7473,7475,7477,7479,7481,7483,7485,7487],{"class":959,"line":960},[957,7472,918],{"class":2596},[957,7474,2599],{"class":1384},[957,7476,2602],{"class":1020},[957,7478,2605],{"class":963},[957,7480,918],{"class":2596},[957,7482,2610],{"class":1384},[957,7484,2602],{"class":1020},[957,7486,2615],{"class":981},[957,7488,2618],{"class":1020},[856,7490,2621],{},[2623,7492,7493],{},[2626,7494,7495,2631],{},[860,7496,2630],{},[2633,7498,7499],{},[856,7500,2637],{},[2623,7502,7503],{},[2626,7504,7505,2645],{},[860,7506,2644],{},[856,7508,2648],{},[948,7510,7511],{"className":2586,"code":2651,"filename":2588,"language":2589,"meta":953,"style":953},[860,7512,7513],{"__ignoreMap":953},[957,7514,7515,7517,7519,7521,7523,7525,7527,7529,7531,7533,7535,7537],{"class":959,"line":960},[957,7516,866],{"class":2596},[957,7518,2660],{"class":1384},[957,7520,2663],{"class":1384},[957,7522,2666],{"class":1384},[957,7524,1017],{"class":1016},[957,7526,2671],{"class":1020},[957,7528,2674],{"class":2596},[957,7530,2677],{"class":1020},[957,7532,978],{"class":1016},[957,7534,2599],{"class":1384},[957,7536,2684],{"class":1020},[957,7538,2687],{"class":1020},[856,7540,2690,7541,2694],{},[860,7542,2693],{},[2623,7544,7545,7547,7549,7551,7553],{},[2626,7546,2699],{},[2626,7548,2702],{},[2626,7550,2705],{},[2626,7552,2708],{},[2626,7554,2711],{},[2713,7556,7557],{},[856,7558,2717,7559,2720,7561,2723,7563,2726],{},[860,7560,2630],{},[860,7562,2693],{},[860,7564,2630],{},[856,7566,2729],{},[948,7568,7569],{"className":2732,"code":2733,"filename":2734,"language":2735,"meta":953,"style":953},[860,7570,7571,7577,7585,7593,7601,7607,7615,7623,7631,7639,7655,7667,7675,7685,7691,7697,7703,7727,7735,7745,7753,7761,7767,7773,7783,7787,7793,7801,7811,7819,7835,7843,7851,7857,7863,7869,7875,7881,7887,7895,7901,7907,7913,7919,7929,7935,7941,7949,7955,7961,7971,7979,7987,7991,7997,8001,8009,8015,8021,8029,8035,8043,8053,8059,8067,8071,8077,8085,8091,8097,8101,8107,8113,8121,8127,8135,8139,8147,8155,8163,8171,8177,8183,8193,8201,8209,8215,8223,8229,8235,8245,8253,8259,8267,8275,8281,8287,8297],{"__ignoreMap":953},[957,7572,7573,7575],{"class":959,"line":960},[957,7574,2743],{"class":2742},[957,7576,2746],{"class":981},[957,7578,7579,7581,7583],{"class":959,"line":967},[957,7580,2751],{"class":2742},[957,7582,982],{"class":981},[957,7584,2756],{"class":963},[957,7586,7587,7589,7591],{"class":959,"line":988},[957,7588,2761],{"class":2742},[957,7590,982],{"class":981},[957,7592,2767],{"class":2766},[957,7594,7595,7597,7599],{"class":959,"line":1003},[957,7596,2772],{"class":2742},[957,7598,982],{"class":981},[957,7600,2777],{"class":2766},[957,7602,7603,7605],{"class":959,"line":1029},[957,7604,2782],{"class":2742},[957,7606,2746],{"class":981},[957,7608,7609,7611,7613],{"class":959,"line":1047},[957,7610,2789],{"class":2742},[957,7612,982],{"class":981},[957,7614,2794],{"class":2766},[957,7616,7617,7619,7621],{"class":959,"line":1068},[957,7618,2799],{"class":2742},[957,7620,982],{"class":981},[957,7622,2804],{"class":2766},[957,7624,7625,7627,7629],{"class":959,"line":1089},[957,7626,2809],{"class":2742},[957,7628,982],{"class":981},[957,7630,2814],{"class":2766},[957,7632,7633,7635,7637],{"class":959,"line":1109},[957,7634,2819],{"class":2742},[957,7636,982],{"class":981},[957,7638,2794],{"class":2766},[957,7640,7641,7643,7645,7647,7649,7651,7653],{"class":959,"line":1115},[957,7642,2828],{"class":2742},[957,7644,982],{"class":981},[957,7646,2833],{"class":963},[957,7648,978],{"class":1016},[957,7650,2838],{"class":1020},[957,7652,978],{"class":1016},[957,7654,2843],{"class":963},[957,7656,7657,7659,7661,7663,7665],{"class":959,"line":1129},[957,7658,2848],{"class":2742},[957,7660,982],{"class":981},[957,7662,1017],{"class":1016},[957,7664,2855],{"class":1020},[957,7666,1106],{"class":1016},[957,7668,7669,7671,7673],{"class":959,"line":1142},[957,7670,2862],{"class":2742},[957,7672,982],{"class":981},[957,7674,2756],{"class":963},[957,7676,7677,7679,7681,7683],{"class":959,"line":1162},[957,7678,2871],{"class":981},[957,7680,1017],{"class":1016},[957,7682,2876],{"class":1020},[957,7684,1106],{"class":1016},[957,7686,7687,7689],{"class":959,"line":1177},[957,7688,2883],{"class":2742},[957,7690,2746],{"class":981},[957,7692,7693,7695],{"class":959,"line":1196},[957,7694,2871],{"class":981},[957,7696,2892],{"class":2766},[957,7698,7699,7701],{"class":959,"line":1215},[957,7700,2897],{"class":2742},[957,7702,2746],{"class":981},[957,7704,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725],{"class":959,"line":1232},[957,7706,2904],{"class":2742},[957,7708,982],{"class":981},[957,7710,2833],{"class":963},[957,7712,978],{"class":1016},[957,7714,2913],{"class":1020},[957,7716,978],{"class":1016},[957,7718,2918],{"class":963},[957,7720,978],{"class":1016},[957,7722,2923],{"class":1020},[957,7724,978],{"class":1016},[957,7726,2843],{"class":963},[957,7728,7729,7731,7733],{"class":959,"line":1238},[957,7730,2932],{"class":2742},[957,7732,982],{"class":981},[957,7734,2937],{"class":2766},[957,7736,7737,7739,7741,7743],{"class":959,"line":1256},[957,7738,2942],{"class":2742},[957,7740,982],{"class":981},[957,7742,2947],{"class":2766},[957,7744,2756],{"class":963},[957,7746,7747,7749,7751],{"class":959,"line":1262},[957,7748,2954],{"class":2742},[957,7750,982],{"class":981},[957,7752,2959],{"class":1041},[957,7754,7755,7757,7759],{"class":959,"line":1268},[957,7756,2964],{"class":2742},[957,7758,982],{"class":981},[957,7760,2969],{"class":2766},[957,7762,7763,7765],{"class":959,"line":1282},[957,7764,2974],{"class":2742},[957,7766,2746],{"class":981},[957,7768,7769,7771],{"class":959,"line":1296},[957,7770,2981],{"class":2742},[957,7772,2746],{"class":981},[957,7774,7775,7777,7779,7781],{"class":959,"line":1317},[957,7776,2988],{"class":2742},[957,7778,982],{"class":981},[957,7780,2993],{"class":1041},[957,7782,2996],{"class":963},[957,7784,7785],{"class":959,"line":1338},[957,7786,3001],{"emptyLinePlaceholder":8},[957,7788,7789,7791],{"class":959,"line":1353},[957,7790,3006],{"class":2742},[957,7792,2746],{"class":981},[957,7794,7795,7797,7799],{"class":959,"line":1358},[957,7796,2761],{"class":2742},[957,7798,982],{"class":981},[957,7800,3017],{"class":2766},[957,7802,7803,7805,7807,7809],{"class":959,"line":1372},[957,7804,3022],{"class":2742},[957,7806,982],{"class":981},[957,7808,1385],{"class":1384},[957,7810,3029],{"class":963},[957,7812,7813,7815,7817],{"class":959,"line":1390},[957,7814,2772],{"class":2742},[957,7816,982],{"class":981},[957,7818,2777],{"class":2766},[957,7820,7821,7823,7825,7827,7829,7831,7833],{"class":959,"line":1411},[957,7822,2828],{"class":2742},[957,7824,982],{"class":981},[957,7826,2833],{"class":963},[957,7828,978],{"class":1016},[957,7830,2838],{"class":1020},[957,7832,978],{"class":1016},[957,7834,2843],{"class":963},[957,7836,7837,7839,7841],{"class":959,"line":1429},[957,7838,2848],{"class":2742},[957,7840,982],{"class":981},[957,7842,3062],{"class":2766},[957,7844,7845,7847,7849],{"class":959,"line":1434},[957,7846,2883],{"class":2742},[957,7848,982],{"class":981},[957,7850,2756],{"class":963},[957,7852,7853,7855],{"class":959,"line":1450},[957,7854,2871],{"class":981},[957,7856,3077],{"class":2766},[957,7858,7859,7861],{"class":959,"line":1471},[957,7860,2871],{"class":981},[957,7862,3084],{"class":2766},[957,7864,7865,7867],{"class":959,"line":1489},[957,7866,2871],{"class":981},[957,7868,3091],{"class":2766},[957,7870,7871,7873],{"class":959,"line":1494},[957,7872,2871],{"class":981},[957,7874,3098],{"class":2766},[957,7876,7877,7879],{"class":959,"line":1507},[957,7878,3103],{"class":2742},[957,7880,2746],{"class":981},[957,7882,7883,7885],{"class":959,"line":1528},[957,7884,2871],{"class":981},[957,7886,3112],{"class":2766},[957,7888,7889,7891,7893],{"class":959,"line":1545},[957,7890,3117],{"class":2742},[957,7892,982],{"class":981},[957,7894,3122],{"class":1041},[957,7896,7897,7899],{"class":959,"line":1562},[957,7898,3127],{"class":2742},[957,7900,2746],{"class":981},[957,7902,7903,7905],{"class":959,"line":1577},[957,7904,2871],{"class":981},[957,7906,3136],{"class":2766},[957,7908,7909,7911],{"class":959,"line":1582},[957,7910,2871],{"class":981},[957,7912,3143],{"class":2766},[957,7914,7915,7917],{"class":959,"line":1596},[957,7916,2862],{"class":2742},[957,7918,2746],{"class":981},[957,7920,7921,7923,7925,7927],{"class":959,"line":1611},[957,7922,2871],{"class":981},[957,7924,1017],{"class":1016},[957,7926,2876],{"class":1020},[957,7928,1106],{"class":1016},[957,7930,7931,7933],{"class":959,"line":1616},[957,7932,3164],{"class":2742},[957,7934,2746],{"class":981},[957,7936,7937,7939],{"class":959,"line":1630},[957,7938,3171],{"class":2742},[957,7940,2746],{"class":981},[957,7942,7943,7945,7947],{"class":959,"line":1646},[957,7944,3178],{"class":2742},[957,7946,982],{"class":981},[957,7948,3183],{"class":2766},[957,7950,7951,7953],{"class":959,"line":1661},[957,7952,2974],{"class":2742},[957,7954,2746],{"class":981},[957,7956,7957,7959],{"class":959,"line":1666},[957,7958,2981],{"class":2742},[957,7960,2746],{"class":981},[957,7962,7963,7965,7967,7969],{"class":959,"line":1680},[957,7964,2988],{"class":2742},[957,7966,982],{"class":981},[957,7968,3204],{"class":1041},[957,7970,2756],{"class":963},[957,7972,7973,7975,7977],{"class":959,"line":1701},[957,7974,3211],{"class":2742},[957,7976,982],{"class":981},[957,7978,2756],{"class":963},[957,7980,7981,7983,7985],{"class":959,"line":1722},[957,7982,2988],{"class":2742},[957,7984,982],{"class":981},[957,7986,3224],{"class":1041},[957,7988,7989],{"class":959,"line":1743},[957,7990,3001],{"emptyLinePlaceholder":8},[957,7992,7993,7995],{"class":959,"line":1757},[957,7994,3233],{"class":2742},[957,7996,2746],{"class":981},[957,7998,7999],{"class":959,"line":1778},[957,8000,3241],{"class":3240},[957,8002,8003,8005,8007],{"class":959,"line":1799},[957,8004,3246],{"class":2742},[957,8006,982],{"class":981},[957,8008,3251],{"class":1041},[957,8010,8011,8013],{"class":959,"line":1820},[957,8012,3164],{"class":2742},[957,8014,2746],{"class":981},[957,8016,8017,8019],{"class":959,"line":1841},[957,8018,3262],{"class":2742},[957,8020,2746],{"class":981},[957,8022,8023,8025,8027],{"class":959,"line":1859},[957,8024,3178],{"class":2742},[957,8026,982],{"class":981},[957,8028,3183],{"class":2766},[957,8030,8031,8033],{"class":959,"line":1864},[957,8032,2974],{"class":2742},[957,8034,2746],{"class":981},[957,8036,8037,8039,8041],{"class":959,"line":1869},[957,8038,3283],{"class":2742},[957,8040,982],{"class":981},[957,8042,2756],{"class":963},[957,8044,8045,8047,8049,8051],{"class":959,"line":1884},[957,8046,2988],{"class":2742},[957,8048,982],{"class":981},[957,8050,3296],{"class":1041},[957,8052,3299],{"class":3240},[957,8054,8055,8057],{"class":959,"line":1890},[957,8056,2981],{"class":2742},[957,8058,2746],{"class":981},[957,8060,8061,8063,8065],{"class":959,"line":1911},[957,8062,2988],{"class":2742},[957,8064,982],{"class":981},[957,8066,3314],{"class":1041},[957,8068,8069],{"class":959,"line":1925},[957,8070,3001],{"emptyLinePlaceholder":8},[957,8072,8073,8075],{"class":959,"line":1947},[957,8074,3323],{"class":2742},[957,8076,2746],{"class":981},[957,8078,8079,8081,8083],{"class":959,"line":1967},[957,8080,3330],{"class":2742},[957,8082,982],{"class":981},[957,8084,3029],{"class":963},[957,8086,8087,8089],{"class":959,"line":1988},[957,8088,3339],{"class":2742},[957,8090,2746],{"class":981},[957,8092,8093,8095],{"class":959,"line":2009},[957,8094,3346],{"class":2742},[957,8096,2746],{"class":981},[957,8098,8099],{"class":959,"line":2030},[957,8100,3001],{"emptyLinePlaceholder":8},[957,8102,8103,8105],{"class":959,"line":2049},[957,8104,3357],{"class":2742},[957,8106,2746],{"class":981},[957,8108,8109,8111],{"class":959,"line":2069},[957,8110,3364],{"class":2742},[957,8112,2746],{"class":981},[957,8114,8115,8117,8119],{"class":959,"line":2089},[957,8116,3371],{"class":2742},[957,8118,982],{"class":981},[957,8120,3376],{"class":2766},[957,8122,8123,8125],{"class":959,"line":2109},[957,8124,3381],{"class":2742},[957,8126,2746],{"class":981},[957,8128,8129,8131,8133],{"class":959,"line":2127},[957,8130,3371],{"class":2742},[957,8132,982],{"class":981},[957,8134,3392],{"class":2766},[957,8136,8137],{"class":959,"line":2133},[957,8138,2279],{"class":963},[957,8140,8141,8143,8145],{"class":959,"line":2138},[957,8142,3401],{"class":2742},[957,8144,982],{"class":981},[957,8146,2756],{"class":963},[957,8148,8149,8151,8153],{"class":959,"line":2143},[957,8150,3410],{"class":2742},[957,8152,982],{"class":981},[957,8154,2756],{"class":963},[957,8156,8157,8159,8161],{"class":959,"line":2163},[957,8158,3419],{"class":2742},[957,8160,982],{"class":981},[957,8162,2175],{"class":1384},[957,8164,8165,8167,8169],{"class":959,"line":2178},[957,8166,3428],{"class":2742},[957,8168,982],{"class":981},[957,8170,1608],{"class":1384},[957,8172,8173,8175],{"class":959,"line":2183},[957,8174,3437],{"class":2742},[957,8176,2746],{"class":981},[957,8178,8179,8181],{"class":959,"line":2188},[957,8180,3444],{"class":2742},[957,8182,2746],{"class":981},[957,8184,8185,8187,8189,8191],{"class":959,"line":2208},[957,8186,3451],{"class":981},[957,8188,3454],{"class":2742},[957,8190,982],{"class":981},[957,8192,3459],{"class":2766},[957,8194,8195,8197,8199],{"class":959,"line":2221},[957,8196,3464],{"class":2742},[957,8198,982],{"class":981},[957,8200,3469],{"class":2766},[957,8202,8203,8205,8207],{"class":959,"line":2226},[957,8204,3474],{"class":2742},[957,8206,982],{"class":981},[957,8208,3479],{"class":1041},[957,8210,8211,8213],{"class":959,"line":2231},[957,8212,3484],{"class":2742},[957,8214,2746],{"class":981},[957,8216,8217,8219,8221],{"class":959,"line":2251},[957,8218,3428],{"class":2742},[957,8220,982],{"class":981},[957,8222,1608],{"class":1384},[957,8224,8225,8227],{"class":959,"line":2264},[957,8226,3437],{"class":2742},[957,8228,2746],{"class":981},[957,8230,8231,8233],{"class":959,"line":2270},[957,8232,3444],{"class":2742},[957,8234,2746],{"class":981},[957,8236,8237,8239,8241,8243],{"class":959,"line":2276},[957,8238,3451],{"class":981},[957,8240,3454],{"class":2742},[957,8242,982],{"class":981},[957,8244,3517],{"class":2766},[957,8246,8247,8249,8251],{"class":959,"line":2282},[957,8248,3474],{"class":2742},[957,8250,982],{"class":981},[957,8252,3526],{"class":1041},[957,8254,8255,8257],{"class":959,"line":2296},[957,8256,3531],{"class":2742},[957,8258,2746],{"class":981},[957,8260,8261,8263,8265],{"class":959,"line":2316},[957,8262,3419],{"class":2742},[957,8264,982],{"class":981},[957,8266,1608],{"class":1384},[957,8268,8269,8271,8273],{"class":959,"line":2330},[957,8270,3428],{"class":2742},[957,8272,982],{"class":981},[957,8274,1608],{"class":1384},[957,8276,8277,8279],{"class":959,"line":2350},[957,8278,3437],{"class":2742},[957,8280,2746],{"class":981},[957,8282,8283,8285],{"class":959,"line":2367},[957,8284,3444],{"class":2742},[957,8286,2746],{"class":981},[957,8288,8289,8291,8293,8295],{"class":959,"line":2386},[957,8290,3451],{"class":981},[957,8292,3454],{"class":2742},[957,8294,982],{"class":981},[957,8296,3572],{"class":2766},[957,8298,8299,8301,8303],{"class":959,"line":2391},[957,8300,3474],{"class":2742},[957,8302,982],{"class":981},[957,8304,3581],{"class":1041},[856,8306,3584],{},[2623,8308,8309,8313,8317,8321,8325],{},[2626,8310,8311,3592],{},[860,8312,3591],{},[2626,8314,8315,3598],{},[860,8316,3597],{},[2626,8318,8319,3604],{},[860,8320,3603],{},[2626,8322,8323,3610],{},[860,8324,3609],{},[2626,8326,8327,3620],{},[872,8328,8330],{"href":3615,"rel":8329},[907],[860,8331,3619],{},[856,8333,3623,8334,875],{},[860,8335,3626],{},[856,8337,3629,8338,875],{},[872,8339,3634],{"href":3632,"rel":8340},[907],[856,8342,3637,8343,2918,8345,863,8347,3647],{},[860,8344,3640],{},[860,8346,3643],{},[860,8348,3646],{},[3649,8350,3652],{"id":3651},[856,8352,3655],{},[880,8354,8355,8365],{},[883,8356,8357],{},[886,8358,8359,8361,8363],{},[889,8360,3664],{},[889,8362,3667],{},[889,8364,894],{},[896,8366,8367,8385,8399],{},[886,8368,8369,8373,8377],{},[901,8370,8371],{},[860,8372,3678],{},[901,8374,8375],{},[860,8376,3683],{},[901,8378,3686,8379,2918,8381,3692,8383,3696],{},[860,8380,3689],{},[860,8382,1021],{},[860,8384,3695],{},[886,8386,8387,8391,8395],{},[901,8388,8389],{},[860,8390,3703],{},[901,8392,8393],{},[860,8394,3708],{},[901,8396,3711,8397,3714],{},[860,8398,3695],{},[886,8400,8401,8405,8409],{},[901,8402,8403],{},[860,8404,3721],{},[901,8406,8407],{},[860,8408,3726],{},[901,8410,3729,8411,3732],{},[860,8412,3689],{},[856,8414,2717,8415,3737,8417,3741,8419,863,8421,3746,8423],{},[860,8416,3678],{},[860,8418,3740],{},[860,8420,3678],{},[860,8422,3703],{},[872,8424,3751],{"href":3749,"rel":8425},[907],[856,8427,2717,8428,3756,8430,3761],{},[860,8429,3721],{},[3758,8431,3760],{},[2623,8433,8434,8436],{},[2626,8435,3766],{},[2626,8437,3769],{},[856,8439,3772,8440,3776,8442,3780,8444,3786],{},[860,8441,3775],{},[860,8443,3779],{},[872,8445,3785],{"href":3783,"rel":8446},[907],[948,8448,8449],{"className":3789,"code":3790,"language":3791,"meta":953,"style":953},[860,8450,8451,8473,8503,8555,8563,8567],{"__ignoreMap":953},[957,8452,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471],{"class":959,"line":960},[957,8454,3799],{"class":3798},[957,8456,3802],{"class":963},[957,8458,3806],{"class":3805},[957,8460,875],{"class":963},[957,8462,1273],{"class":3805},[957,8464,3813],{"class":963},[957,8466,1363],{"class":3805},[957,8468,875],{"class":963},[957,8470,1377],{"class":3805},[957,8472,3822],{"class":963},[957,8474,8475,8477,8479,8481,8483,8485,8487,8489,8491,8493,8495,8497,8499,8501],{"class":959,"line":967},[957,8476,3827],{"class":3805},[957,8478,875],{"class":963},[957,8480,3832],{"class":2596},[957,8482,3835],{"class":963},[957,8484,978],{"class":1016},[957,8486,3785],{"class":1020},[957,8488,978],{"class":1016},[957,8490,3844],{"class":963},[957,8492,3848],{"class":3847},[957,8494,982],{"class":981},[957,8496,3854],{"class":3853},[957,8498,3857],{"class":963},[957,8500,3861],{"class":3860},[957,8502,985],{"class":963},[957,8504,8505,8507,8509,8511,8513,8515,8517,8519,8521,8523,8525,8527,8529,8531,8533,8535,8537,8539,8541,8543,8545,8547,8549,8551,8553],{"class":959,"line":988},[957,8506,3868],{"class":3798},[957,8508,3802],{"class":963},[957,8510,3848],{"class":3805},[957,8512,3875],{"class":981},[957,8514,3878],{"class":3805},[957,8516,875],{"class":963},[957,8518,1273],{"class":3805},[957,8520,3813],{"class":963},[957,8522,1363],{"class":3805},[957,8524,875],{"class":963},[957,8526,1416],{"class":3805},[957,8528,3893],{"class":981},[957,8530,3896],{"class":3805},[957,8532,3875],{"class":981},[957,8534,3878],{"class":3805},[957,8536,875],{"class":963},[957,8538,1273],{"class":3805},[957,8540,3813],{"class":963},[957,8542,1363],{"class":3805},[957,8544,875],{"class":963},[957,8546,1395],{"class":3805},[957,8548,3857],{"class":963},[957,8550,3917],{"class":3798},[957,8552,1385],{"class":1384},[957,8554,3922],{"class":963},[957,8556,8557,8559,8561],{"class":959,"line":1003},[957,8558,3927],{"class":3798},[957,8560,3930],{"class":1384},[957,8562,3922],{"class":963},[957,8564,8565],{"class":959,"line":1029},[957,8566,3937],{"class":963},[957,8568,8569],{"class":959,"line":1047},[957,8570,2580],{"class":963},[856,8572,3944,8573,2918,8575,3951],{},[860,8574,3947],{},[860,8576,3950],{},[856,8578,3954,8579,875],{},[872,8580,131],{"href":132},[3958,8582,8583,8596,8598],{},[856,8584,3962,8585,3968,8588,3974,8591,3980,8594,3984],{},[872,8586,3967],{"href":3965,"rel":8587},[907],[872,8589,3973],{"href":3971,"rel":8590},[907],[872,8592,3979],{"href":3977,"rel":8593},[907],[872,8595,3983],{"href":22},[856,8597,3987],{},[948,8599,8600],{"className":3789,"code":3990,"filename":3991,"language":3791,"meta":953,"style":953},[860,8601,8602,8622,8626,8644,8664,8668,8672,8678,8700,8712,8716],{"__ignoreMap":953},[957,8603,8604,8606,8608,8610,8612,8614,8616,8618,8620],{"class":959,"line":960},[957,8605,3998],{"class":3798},[957,8607,4001],{"class":963},[957,8609,4004],{"class":3805},[957,8611,4007],{"class":963},[957,8613,4010],{"class":3798},[957,8615,4013],{"class":1016},[957,8617,4016],{"class":1020},[957,8619,4019],{"class":1016},[957,8621,3922],{"class":963},[957,8623,8624],{"class":959,"line":967},[957,8625,3001],{"emptyLinePlaceholder":8},[957,8627,8628,8630,8632,8634,8636,8638,8640,8642],{"class":959,"line":988},[957,8629,4030],{"class":3798},[957,8631,4033],{"class":3798},[957,8633,4036],{"class":2596},[957,8635,4039],{"class":963},[957,8637,4042],{"class":3847},[957,8639,3857],{"class":963},[957,8641,3861],{"class":3860},[957,8643,985],{"class":963},[957,8645,8646,8648,8650,8652,8654,8656,8658,8660,8662],{"class":959,"line":1003},[957,8647,4053],{"class":3860},[957,8649,4057],{"class":4056},[957,8651,4060],{"class":981},[957,8653,4063],{"class":3805},[957,8655,875],{"class":963},[957,8657,4068],{"class":3805},[957,8659,875],{"class":963},[957,8661,4073],{"class":3805},[957,8663,3922],{"class":963},[957,8665,8666],{"class":959,"line":1029},[957,8667,3029],{"class":963},[957,8669,8670],{"class":959,"line":1047},[957,8671,4084],{"class":3240},[957,8673,8674,8676],{"class":959,"line":1068},[957,8675,4089],{"class":3798},[957,8677,985],{"class":963},[957,8679,8680,8682,8684,8686,8688,8690,8692,8694,8696,8698],{"class":959,"line":1089},[957,8681,4096],{"class":3805},[957,8683,982],{"class":4099},[957,8685,4102],{"class":1020},[957,8687,4105],{"class":3860},[957,8689,1052],{"class":3805},[957,8691,875],{"class":4110},[957,8693,4113],{"class":3805},[957,8695,4116],{"class":3860},[957,8697,4119],{"class":1020},[957,8699,1026],{"class":963},[957,8701,8702,8704,8706,8708,8710],{"class":959,"line":1109},[957,8703,4126],{"class":3805},[957,8705,982],{"class":4099},[957,8707,4057],{"class":3805},[957,8709,875],{"class":963},[957,8711,4135],{"class":3805},[957,8713,8714],{"class":959,"line":1115},[957,8715,4140],{"class":963},[957,8717,8718],{"class":959,"line":1129},[957,8719,4145],{"class":963},[3973,8721,4149],{"id":4148},[880,8723,8724,8734],{},[883,8725,8726],{},[886,8727,8728,8730,8732],{},[889,8729,4158],{},[889,8731,4161],{},[889,8733,894],{},[896,8735,8736,8748,8762,8778],{},[886,8737,8738,8742,8746],{},[901,8739,8740],{},[860,8741,3775],{},[901,8743,8744],{},[860,8745,3779],{},[901,8747,4178],{},[886,8749,8750,8754,8758],{},[901,8751,8752],{},[860,8753,3643],{},[901,8755,8756],{},[860,8757,1404],{},[901,8759,4191,8760,4195],{},[3758,8761,4194],{},[886,8763,8764,8768,8772],{},[901,8765,8766],{},[860,8767,3640],{},[901,8769,8770],{},[860,8771,1404],{},[901,8773,4208,8774,4211,8776,4214],{},[860,8775,1395],{},[860,8777,1455],{},[886,8779,8780,8784,8788],{},[901,8781,8782],{},[860,8783,3646],{},[901,8785,8786],{},[860,8787,1404],{},[901,8789,4227,8790,4230],{},[860,8791,1395],{},[856,8793,4233,8794,4236],{},[860,8795,1404],{},[948,8797,8798],{"className":2732,"code":4239,"language":2735,"meta":953,"style":953},[860,8799,8800,8806,8812,8818],{"__ignoreMap":953},[957,8801,8802,8804],{"class":959,"line":960},[957,8803,3695],{"class":2742},[957,8805,2746],{"class":981},[957,8807,8808,8810],{"class":959,"line":967},[957,8809,2974],{"class":2742},[957,8811,2746],{"class":981},[957,8813,8814,8816],{"class":959,"line":988},[957,8815,2981],{"class":2742},[957,8817,2746],{"class":981},[957,8819,8820,8822,8824],{"class":959,"line":1003},[957,8821,2988],{"class":2742},[957,8823,982],{"class":981},[957,8825,3314],{"class":1041},[856,8827,4270,8828,863,8830,4277],{},[860,8829,4273],{},[860,8831,4276],{},[4279,8833,8834,8838],{},[2626,8835,4283,8836,875],{},[860,8837,1404],{},[2626,8839,4288,8840,4291,8842,875],{},[860,8841,1404],{},[860,8843,4294],{},[2633,8845,8846],{},[856,8847,4299,8848,4303,8850,2918,8852,4308,8854,4311],{},[3758,8849,4302],{},[860,8851,3643],{},[860,8853,3640],{},[860,8855,3646],{},[3973,8857,4315],{"id":4314},[856,8859,4318,8860,4322],{},[872,8861,4016],{"href":4321},[948,8863,8864],{"className":2586,"code":4325,"filename":2588,"language":2589,"meta":953,"style":953},[860,8865,8866],{"__ignoreMap":953},[957,8867,8868,8870],{"class":959,"line":960},[957,8869,4332],{"class":2596},[957,8871,4335],{"class":1020},[856,8873,4338,8874,4342],{},[860,8875,4341],{},[3649,8877,4346],{"id":4345},[856,8879,4349],{},[856,8881,4352],{},[880,8883,8884,8892],{},[883,8885,8886],{},[886,8887,8888,8890],{},[889,8889,4361],{},[889,8891,894],{},[896,8893,8894,8903,8912],{},[886,8895,8896,8901],{},[901,8897,8898],{},[872,8899,4374],{"href":4372,"rel":8900},[907],[901,8902,4377],{},[886,8904,8905,8910],{},[901,8906,8907],{},[872,8908,4386],{"href":4384,"rel":8909},[907],[901,8911,4389],{},[886,8913,8914,8921],{},[901,8915,8916],{},[872,8917,8919],{"href":4396,"rel":8918},[907],[860,8920,862],{},[901,8922,4402],{},[856,8924,2717,8925,4407,8927,4411],{},[860,8926,862],{},[860,8928,4410],{},[4413,8930,8931,8933,8937,9011,9013,9017,9099,9108,9110,9116,9822,9836,9838,9844,9856,9862,9864,9874,9876,9928,9930,9944,9966,9974,9982,9986],{"level":4415},[4417,8932,4420],{"id":4419},[856,8934,4423,8935,4427],{},[860,8936,4426],{},[4429,8938,8939,8957,8975,8993],{},[948,8940,8941],{"className":2586,"code":4433,"filename":4434,"language":2589,"meta":953,"style":953},[860,8942,8943],{"__ignoreMap":953},[957,8944,8945,8947,8949,8951,8953,8955],{"class":959,"line":960},[957,8946,4434],{"class":2596},[957,8948,4443],{"class":1020},[957,8950,4446],{"class":1020},[957,8952,4449],{"class":1020},[957,8954,4452],{"class":1020},[957,8956,4455],{"class":1020},[948,8958,8959],{"className":2586,"code":4458,"filename":4459,"language":2589,"meta":953,"style":953},[860,8960,8961],{"__ignoreMap":953},[957,8962,8963,8965,8967,8969,8971,8973],{"class":959,"line":960},[957,8964,4459],{"class":2596},[957,8966,4443],{"class":1020},[957,8968,4446],{"class":1020},[957,8970,4449],{"class":1020},[957,8972,4452],{"class":1020},[957,8974,4455],{"class":1020},[948,8976,8977],{"className":2586,"code":4478,"filename":4479,"language":2589,"meta":953,"style":953},[860,8978,8979],{"__ignoreMap":953},[957,8980,8981,8983,8985,8987,8989,8991],{"class":959,"line":960},[957,8982,4479],{"class":2596},[957,8984,4488],{"class":1020},[957,8986,4446],{"class":1020},[957,8988,4449],{"class":1020},[957,8990,4452],{"class":1020},[957,8992,4455],{"class":1020},[948,8994,8995],{"className":2586,"code":4499,"filename":4500,"language":2589,"meta":953,"style":953},[860,8996,8997],{"__ignoreMap":953},[957,8998,8999,9001,9003,9005,9007,9009],{"class":959,"line":960},[957,9000,4500],{"class":2596},[957,9002,4443],{"class":1020},[957,9004,4446],{"class":1020},[957,9006,4449],{"class":1020},[957,9008,4452],{"class":1020},[957,9010,4455],{"class":1020},[4417,9012,4520],{"id":4519},[856,9014,4523,9015,4526],{},[872,9016,399],{"href":35},[4429,9018,9019,9039,9059,9079],{},[948,9020,9021],{"className":2586,"code":4531,"filename":4434,"language":2589,"meta":953,"style":953},[860,9022,9023],{"__ignoreMap":953},[957,9024,9025,9027,9029,9031,9033,9035,9037],{"class":959,"line":960},[957,9026,4434],{"class":2596},[957,9028,4540],{"class":1020},[957,9030,4543],{"class":1020},[957,9032,4546],{"class":1384},[957,9034,978],{"class":1016},[957,9036,4551],{"class":1020},[957,9038,1106],{"class":1016},[948,9040,9041],{"className":2586,"code":4556,"filename":4459,"language":2589,"meta":953,"style":953},[860,9042,9043],{"__ignoreMap":953},[957,9044,9045,9047,9049,9051,9053,9055,9057],{"class":959,"line":960},[957,9046,4459],{"class":2596},[957,9048,4540],{"class":1020},[957,9050,4543],{"class":1020},[957,9052,4546],{"class":1384},[957,9054,978],{"class":1016},[957,9056,4551],{"class":1020},[957,9058,1106],{"class":1016},[948,9060,9061],{"className":2586,"code":4577,"filename":4479,"language":2589,"meta":953,"style":953},[860,9062,9063],{"__ignoreMap":953},[957,9064,9065,9067,9069,9071,9073,9075,9077],{"class":959,"line":960},[957,9066,4584],{"class":2596},[957,9068,4540],{"class":1020},[957,9070,4543],{"class":1020},[957,9072,4546],{"class":1384},[957,9074,978],{"class":1016},[957,9076,4551],{"class":1020},[957,9078,1106],{"class":1016},[948,9080,9081],{"className":2586,"code":4599,"filename":4500,"language":2589,"meta":953,"style":953},[860,9082,9083],{"__ignoreMap":953},[957,9084,9085,9087,9089,9091,9093,9095,9097],{"class":959,"line":960},[957,9086,4606],{"class":2596},[957,9088,4540],{"class":1020},[957,9090,4543],{"class":1020},[957,9092,4546],{"class":1384},[957,9094,978],{"class":1016},[957,9096,4551],{"class":1020},[957,9098,1106],{"class":1016},[856,9100,2717,9101,4624,9103,4630,9106,4634],{},[860,9102,4623],{},[872,9104,4629],{"href":4627,"rel":9105},[907],[872,9107,4633],{"href":408},[4417,9109,4638],{"id":4637},[856,9111,4641,9112,4644,9114,4648],{},[860,9113,952],{},[872,9115,4647],{"href":238},[948,9117,9118],{"className":950,"code":4651,"filename":952,"language":5,"meta":953,"style":953},[860,9119,9120,9124,9136,9148,9166,9180,9198,9216,9232,9236,9248,9260,9278,9292,9310,9328,9344,9348,9364,9368,9372,9384,9398,9414,9418,9430,9446,9450,9462,9474,9478,9490,9508,9526,9538,9556,9574,9592,9610,9626,9630,9634,9646,9664,9676,9688,9702,9720,9734,9748,9760,9764,9768,9780,9798,9814,9818],{"__ignoreMap":953},[957,9121,9122],{"class":959,"line":960},[957,9123,964],{"class":963},[957,9125,9126,9128,9130,9132,9134],{"class":959,"line":967},[957,9127,971],{"class":970},[957,9129,975],{"class":974},[957,9131,978],{"class":970},[957,9133,982],{"class":981},[957,9135,985],{"class":963},[957,9137,9138,9140,9142,9144,9146],{"class":959,"line":988},[957,9139,991],{"class":970},[957,9141,994],{"class":974},[957,9143,978],{"class":970},[957,9145,982],{"class":981},[957,9147,985],{"class":963},[957,9149,9150,9152,9154,9156,9158,9160,9162,9164],{"class":959,"line":1003},[957,9151,1006],{"class":970},[957,9153,1009],{"class":974},[957,9155,978],{"class":970},[957,9157,982],{"class":981},[957,9159,1017],{"class":1016},[957,9161,2435],{"class":1020},[957,9163,978],{"class":1016},[957,9165,1026],{"class":963},[957,9167,9168,9170,9172,9174,9176,9178],{"class":959,"line":1029},[957,9169,1006],{"class":970},[957,9171,1034],{"class":974},[957,9173,978],{"class":970},[957,9175,982],{"class":981},[957,9177,1042],{"class":1041},[957,9179,1026],{"class":963},[957,9181,9182,9184,9186,9188,9190,9192,9194,9196],{"class":959,"line":1047},[957,9183,1006],{"class":970},[957,9185,1052],{"class":974},[957,9187,978],{"class":970},[957,9189,982],{"class":981},[957,9191,1017],{"class":1016},[957,9193,4728],{"class":1020},[957,9195,978],{"class":1016},[957,9197,1026],{"class":963},[957,9199,9200,9202,9204,9206,9208,9210,9212,9214],{"class":959,"line":1068},[957,9201,1006],{"class":970},[957,9203,1073],{"class":974},[957,9205,978],{"class":970},[957,9207,982],{"class":981},[957,9209,1017],{"class":1016},[957,9211,4747],{"class":1020},[957,9213,978],{"class":1016},[957,9215,1026],{"class":963},[957,9217,9218,9220,9222,9224,9226,9228,9230],{"class":959,"line":1089},[957,9219,1006],{"class":970},[957,9221,1094],{"class":974},[957,9223,978],{"class":970},[957,9225,982],{"class":981},[957,9227,1017],{"class":1016},[957,9229,4766],{"class":1020},[957,9231,1106],{"class":1016},[957,9233,9234],{"class":959,"line":1109},[957,9235,1112],{"class":963},[957,9237,9238,9240,9242,9244,9246],{"class":959,"line":1115},[957,9239,991],{"class":970},[957,9241,1120],{"class":974},[957,9243,978],{"class":970},[957,9245,982],{"class":981},[957,9247,985],{"class":963},[957,9249,9250,9252,9254,9256,9258],{"class":959,"line":1129},[957,9251,1006],{"class":970},[957,9253,975],{"class":974},[957,9255,978],{"class":970},[957,9257,982],{"class":981},[957,9259,985],{"class":963},[957,9261,9262,9264,9266,9268,9270,9272,9274,9276],{"class":959,"line":1142},[957,9263,1145],{"class":970},[957,9265,1009],{"class":974},[957,9267,978],{"class":970},[957,9269,982],{"class":981},[957,9271,1017],{"class":1016},[957,9273,2435],{"class":1020},[957,9275,978],{"class":1016},[957,9277,1026],{"class":963},[957,9279,9280,9282,9284,9286,9288,9290],{"class":959,"line":1162},[957,9281,1145],{"class":970},[957,9283,1034],{"class":974},[957,9285,978],{"class":970},[957,9287,982],{"class":981},[957,9289,1042],{"class":1041},[957,9291,1026],{"class":963},[957,9293,9294,9296,9298,9300,9302,9304,9306,9308],{"class":959,"line":1177},[957,9295,1145],{"class":970},[957,9297,1052],{"class":974},[957,9299,978],{"class":970},[957,9301,982],{"class":981},[957,9303,1017],{"class":1016},[957,9305,4728],{"class":1020},[957,9307,978],{"class":1016},[957,9309,1026],{"class":963},[957,9311,9312,9314,9316,9318,9320,9322,9324,9326],{"class":959,"line":1196},[957,9313,1145],{"class":970},[957,9315,1073],{"class":974},[957,9317,978],{"class":970},[957,9319,982],{"class":981},[957,9321,1017],{"class":1016},[957,9323,4747],{"class":1020},[957,9325,978],{"class":1016},[957,9327,1026],{"class":963},[957,9329,9330,9332,9334,9336,9338,9340,9342],{"class":959,"line":1215},[957,9331,1145],{"class":970},[957,9333,1094],{"class":974},[957,9335,978],{"class":970},[957,9337,982],{"class":981},[957,9339,1017],{"class":1016},[957,9341,4766],{"class":1020},[957,9343,1106],{"class":1016},[957,9345,9346],{"class":959,"line":1232},[957,9347,1235],{"class":963},[957,9349,9350,9352,9354,9356,9358,9360,9362],{"class":959,"line":1238},[957,9351,1006],{"class":970},[957,9353,1243],{"class":974},[957,9355,978],{"class":970},[957,9357,982],{"class":981},[957,9359,1017],{"class":1016},[957,9361,4766],{"class":1020},[957,9363,1106],{"class":1016},[957,9365,9366],{"class":959,"line":1256},[957,9367,1259],{"class":963},[957,9369,9370],{"class":959,"line":1262},[957,9371,1265],{"class":963},[957,9373,9374,9376,9378,9380,9382],{"class":959,"line":1268},[957,9375,971],{"class":970},[957,9377,1273],{"class":974},[957,9379,978],{"class":970},[957,9381,982],{"class":981},[957,9383,985],{"class":963},[957,9385,9386,9388,9390,9392,9394,9396],{"class":959,"line":1282},[957,9387,991],{"class":970},[957,9389,1034],{"class":974},[957,9391,978],{"class":970},[957,9393,982],{"class":981},[957,9395,1445],{"class":1041},[957,9397,1026],{"class":963},[957,9399,9400,9402,9404,9406,9408,9410,9412],{"class":959,"line":1296},[957,9401,991],{"class":970},[957,9403,1455],{"class":974},[957,9405,978],{"class":970},[957,9407,982],{"class":981},[957,9409,1017],{"class":1016},[957,9411,1464],{"class":1020},[957,9413,1106],{"class":1016},[957,9415,9416],{"class":959,"line":1317},[957,9417,1265],{"class":963},[957,9419,9420,9422,9424,9426,9428],{"class":959,"line":1338},[957,9421,971],{"class":970},[957,9423,1073],{"class":974},[957,9425,978],{"class":970},[957,9427,982],{"class":981},[957,9429,985],{"class":963},[957,9431,9432,9434,9436,9438,9440,9442,9444],{"class":959,"line":1353},[957,9433,991],{"class":970},[957,9435,1512],{"class":974},[957,9437,978],{"class":970},[957,9439,982],{"class":981},[957,9441,1017],{"class":1016},[957,9443,4981],{"class":1020},[957,9445,1106],{"class":1016},[957,9447,9448],{"class":959,"line":1358},[957,9449,1265],{"class":963},[957,9451,9452,9454,9456,9458,9460],{"class":959,"line":1372},[957,9453,971],{"class":970},[957,9455,1587],{"class":974},[957,9457,978],{"class":970},[957,9459,982],{"class":981},[957,9461,985],{"class":963},[957,9463,9464,9466,9468,9470,9472],{"class":959,"line":1390},[957,9465,991],{"class":970},[957,9467,1601],{"class":974},[957,9469,978],{"class":970},[957,9471,982],{"class":981},[957,9473,2175],{"class":1384},[957,9475,9476],{"class":959,"line":1411},[957,9477,1265],{"class":963},[957,9479,9480,9482,9484,9486,9488],{"class":959,"line":1429},[957,9481,971],{"class":970},[957,9483,1671],{"class":974},[957,9485,978],{"class":970},[957,9487,982],{"class":981},[957,9489,985],{"class":963},[957,9491,9492,9494,9496,9498,9500,9502,9504,9506],{"class":959,"line":1434},[957,9493,991],{"class":970},[957,9495,1685],{"class":974},[957,9497,978],{"class":970},[957,9499,982],{"class":981},[957,9501,1017],{"class":1016},[957,9503,5042],{"class":1020},[957,9505,978],{"class":1016},[957,9507,1026],{"class":963},[957,9509,9510,9512,9514,9516,9518,9520,9522,9524],{"class":959,"line":1450},[957,9511,991],{"class":970},[957,9513,1727],{"class":974},[957,9515,978],{"class":970},[957,9517,982],{"class":981},[957,9519,1017],{"class":1016},[957,9521,5061],{"class":1020},[957,9523,978],{"class":1016},[957,9525,1026],{"class":963},[957,9527,9528,9530,9532,9534,9536],{"class":959,"line":1471},[957,9529,991],{"class":970},[957,9531,1748],{"class":974},[957,9533,978],{"class":970},[957,9535,982],{"class":981},[957,9537,985],{"class":963},[957,9539,9540,9542,9544,9546,9548,9550,9552,9554],{"class":959,"line":1489},[957,9541,1006],{"class":970},[957,9543,1762],{"class":974},[957,9545,978],{"class":970},[957,9547,982],{"class":981},[957,9549,1017],{"class":1016},[957,9551,5092],{"class":1020},[957,9553,978],{"class":1016},[957,9555,1026],{"class":963},[957,9557,9558,9560,9562,9564,9566,9568,9570,9572],{"class":959,"line":1494},[957,9559,1006],{"class":970},[957,9561,1783],{"class":974},[957,9563,978],{"class":970},[957,9565,982],{"class":981},[957,9567,1017],{"class":1016},[957,9569,5111],{"class":1020},[957,9571,978],{"class":1016},[957,9573,1026],{"class":963},[957,9575,9576,9578,9580,9582,9584,9586,9588,9590],{"class":959,"line":1507},[957,9577,1006],{"class":970},[957,9579,1804],{"class":974},[957,9581,978],{"class":970},[957,9583,982],{"class":981},[957,9585,1017],{"class":1016},[957,9587,5130],{"class":1020},[957,9589,978],{"class":1016},[957,9591,1026],{"class":963},[957,9593,9594,9596,9598,9600,9602,9604,9606,9608],{"class":959,"line":1528},[957,9595,1006],{"class":970},[957,9597,1825],{"class":974},[957,9599,978],{"class":970},[957,9601,982],{"class":981},[957,9603,1017],{"class":1016},[957,9605,5149],{"class":1020},[957,9607,978],{"class":1016},[957,9609,1026],{"class":963},[957,9611,9612,9614,9616,9618,9620,9622,9624],{"class":959,"line":1545},[957,9613,1006],{"class":970},[957,9615,1846],{"class":974},[957,9617,978],{"class":970},[957,9619,982],{"class":981},[957,9621,1017],{"class":1016},[957,9623,5168],{"class":1020},[957,9625,1106],{"class":1016},[957,9627,9628],{"class":959,"line":1562},[957,9629,1259],{"class":963},[957,9631,9632],{"class":959,"line":1577},[957,9633,1265],{"class":963},[957,9635,9636,9638,9640,9642,9644],{"class":959,"line":1582},[957,9637,971],{"class":970},[957,9639,2287],{"class":974},[957,9641,978],{"class":970},[957,9643,982],{"class":981},[957,9645,985],{"class":963},[957,9647,9648,9650,9652,9654,9656,9658,9660,9662],{"class":959,"line":1596},[957,9649,991],{"class":970},[957,9651,1685],{"class":974},[957,9653,978],{"class":970},[957,9655,982],{"class":981},[957,9657,1017],{"class":1016},[957,9659,5205],{"class":1020},[957,9661,978],{"class":1016},[957,9663,1026],{"class":963},[957,9665,9666,9668,9670,9672,9674],{"class":959,"line":1611},[957,9667,991],{"class":970},[957,9669,2321],{"class":974},[957,9671,978],{"class":970},[957,9673,982],{"class":981},[957,9675,5222],{"class":963},[957,9677,9678,9680,9682,9684,9686],{"class":959,"line":1616},[957,9679,991],{"class":970},[957,9681,2396],{"class":974},[957,9683,978],{"class":970},[957,9685,982],{"class":981},[957,9687,985],{"class":963},[957,9689,9690,9692,9694,9696,9698,9700],{"class":959,"line":1630},[957,9691,1006],{"class":970},[957,9693,2410],{"class":974},[957,9695,978],{"class":970},[957,9697,982],{"class":981},[957,9699,5247],{"class":1041},[957,9701,1026],{"class":963},[957,9703,9704,9706,9708,9710,9712,9714,9716,9718],{"class":959,"line":1646},[957,9705,1006],{"class":970},[957,9707,1727],{"class":974},[957,9709,978],{"class":970},[957,9711,982],{"class":981},[957,9713,1017],{"class":1016},[957,9715,5264],{"class":1020},[957,9717,978],{"class":1016},[957,9719,1026],{"class":963},[957,9721,9722,9724,9726,9728,9730,9732],{"class":959,"line":1661},[957,9723,1006],{"class":970},[957,9725,2447],{"class":974},[957,9727,978],{"class":970},[957,9729,982],{"class":981},[957,9731,2454],{"class":1041},[957,9733,1026],{"class":963},[957,9735,9736,9738,9740,9742,9744,9746],{"class":959,"line":1666},[957,9737,1006],{"class":970},[957,9739,2464],{"class":974},[957,9741,978],{"class":970},[957,9743,982],{"class":981},[957,9745,2471],{"class":1041},[957,9747,1026],{"class":963},[957,9749,9750,9752,9754,9756,9758],{"class":959,"line":1680},[957,9751,1006],{"class":970},[957,9753,2481],{"class":974},[957,9755,978],{"class":970},[957,9757,982],{"class":981},[957,9759,1350],{"class":1041},[957,9761,9762],{"class":959,"line":1701},[957,9763,1259],{"class":963},[957,9765,9766],{"class":959,"line":1722},[957,9767,1265],{"class":963},[957,9769,9770,9772,9774,9776,9778],{"class":959,"line":1743},[957,9771,971],{"class":970},[957,9773,1993],{"class":974},[957,9775,978],{"class":970},[957,9777,982],{"class":981},[957,9779,985],{"class":963},[957,9781,9782,9784,9786,9788,9790,9792,9794,9796],{"class":959,"line":1757},[957,9783,991],{"class":970},[957,9785,2519],{"class":974},[957,9787,978],{"class":970},[957,9789,982],{"class":981},[957,9791,1017],{"class":1016},[957,9793,5343],{"class":1020},[957,9795,978],{"class":1016},[957,9797,1026],{"class":963},[957,9799,9800,9802,9804,9806,9808,9810,9812],{"class":959,"line":1778},[957,9801,991],{"class":970},[957,9803,1993],{"class":974},[957,9805,978],{"class":970},[957,9807,982],{"class":981},[957,9809,1017],{"class":1016},[957,9811,5362],{"class":1020},[957,9813,1106],{"class":1016},[957,9815,9816],{"class":959,"line":1799},[957,9817,5369],{"class":963},[957,9819,9820],{"class":959,"line":1820},[957,9821,2580],{"class":963},[856,9823,5376,9824,863,9826,5382,9828,2918,9830,4308,9832,5389,9834,5393],{},[860,9825,5379],{},[860,9827,3646],{},[860,9829,3775],{},[860,9831,3643],{},[860,9833,3646],{},[872,9835,3652],{"href":5392},[4417,9837,5397],{"id":5396},[856,9839,2717,9840,5402,9842,5406],{},[860,9841,3689],{},[872,9843,5405],{"href":611},[948,9845,9846],{"className":2586,"code":5409,"filename":2588,"language":2589,"meta":953,"style":953},[860,9847,9848],{"__ignoreMap":953},[957,9849,9850,9852,9854],{"class":959,"line":960},[957,9851,4584],{"class":2596},[957,9853,4446],{"class":1020},[957,9855,5420],{"class":1020},[856,9857,5423,9858,5427,9860,875],{},[860,9859,5426],{},[860,9861,5430],{},[856,9863,5433],{},[4279,9865,9866,9868,9870],{},[2626,9867,5438],{},[2626,9869,5441],{},[2626,9871,5444,9872,875],{},[860,9873,5447],{},[856,9875,5450],{},[948,9877,9878],{"className":3789,"code":5453,"filename":5454,"language":3791,"meta":953,"style":953},[860,9879,9880,9898,9912,9916],{"__ignoreMap":953},[957,9881,9882,9884,9886,9888,9890,9892,9894,9896],{"class":959,"line":960},[957,9883,3998],{"class":3798},[957,9885,4001],{"class":963},[957,9887,5465],{"class":3805},[957,9889,4007],{"class":963},[957,9891,4010],{"class":3798},[957,9893,4013],{"class":1016},[957,9895,4426],{"class":1020},[957,9897,5476],{"class":1016},[957,9899,9900,9902,9904,9906,9908,9910],{"class":959,"line":967},[957,9901,3998],{"class":3798},[957,9903,3878],{"class":3805},[957,9905,5485],{"class":3798},[957,9907,4013],{"class":1016},[957,9909,5490],{"class":1020},[957,9911,5476],{"class":1016},[957,9913,9914],{"class":959,"line":988},[957,9915,3001],{"emptyLinePlaceholder":8},[957,9917,9918,9920,9922,9924,9926],{"class":959,"line":1003},[957,9919,5501],{"class":3798},[957,9921,5504],{"class":2596},[957,9923,3835],{"class":963},[957,9925,3806],{"class":3805},[957,9927,5511],{"class":963},[4417,9929,5515],{"id":5514},[856,9931,5518,9932,5522,9934,5526,9936,5530,9938,5533,9940,5537,9942,5540],{},[860,9933,5521],{},[860,9935,5525],{},[860,9937,5529],{},[860,9939,5426],{},[860,9941,5536],{},[860,9943,3779],{},[948,9945,9946],{"className":2586,"code":5543,"filename":2588,"language":2589,"meta":953,"style":953},[860,9947,9948],{"__ignoreMap":953},[957,9949,9950,9952,9954,9956,9958,9960,9962,9964],{"class":959,"line":960},[957,9951,5536],{"class":5550},[957,9953,5553],{"class":981},[957,9955,3779],{"class":1020},[957,9957,5558],{"class":5550},[957,9959,5553],{"class":981},[957,9961,5430],{"class":1020},[957,9963,5565],{"class":2596},[957,9965,5568],{"class":1020},[856,9967,5571,9968,863,9970,5578,9972,5582],{},[860,9969,5574],{},[860,9971,5577],{},[860,9973,5581],{},[2623,9975,9976,9978,9980],{},[2626,9977,5587],{},[2626,9979,5590],{},[2626,9981,5593],{},[856,9983,5596,9984,875],{},[860,9985,5521],{},[856,9987,5601,9988,5606],{},[872,9989,5605],{"href":5604},[3973,9991,5610],{"id":5609},[856,9993,5613,9994,5616],{},[860,9995,5521],{},[856,9997,5619,9998,5622,10000,5626],{},[860,9999,4426],{},[860,10001,5625],{},[948,10003,10004],{"className":3789,"code":5629,"filename":5630,"language":3791,"meta":953,"style":953},[860,10005,10006,10024,10028,10046,10052,10072,10096,10120,10124],{"__ignoreMap":953},[957,10007,10008,10010,10012,10014,10016,10018,10020,10022],{"class":959,"line":960},[957,10009,3998],{"class":3798},[957,10011,4001],{"class":963},[957,10013,5625],{"class":3805},[957,10015,4007],{"class":963},[957,10017,4010],{"class":3798},[957,10019,4013],{"class":1016},[957,10021,4426],{"class":1020},[957,10023,5476],{"class":1016},[957,10025,10026],{"class":959,"line":967},[957,10027,3001],{"emptyLinePlaceholder":8},[957,10029,10030,10032,10034,10036,10038,10040,10042,10044],{"class":959,"line":988},[957,10031,3695],{"class":3805},[957,10033,875],{"class":963},[957,10035,5663],{"class":2596},[957,10037,3835],{"class":963},[957,10039,5668],{"class":1041},[957,10041,5671],{"class":963},[957,10043,3861],{"class":3860},[957,10045,985],{"class":963},[957,10047,10048,10050],{"class":959,"line":1003},[957,10049,5680],{"class":2596},[957,10051,5683],{"class":963},[957,10053,10054,10056,10058,10060,10062,10064,10066,10068,10070],{"class":959,"line":1029},[957,10055,5688],{"class":1041},[957,10057,5691],{"class":981},[957,10059,5694],{"class":1041},[957,10061,5691],{"class":981},[957,10063,5694],{"class":1041},[957,10065,5691],{"class":981},[957,10067,5703],{"class":1041},[957,10069,5706],{"class":963},[957,10071,5709],{"class":3240},[957,10073,10074,10076,10078,10080,10082,10084,10086,10088,10090,10092,10094],{"class":959,"line":1047},[957,10075,5688],{"class":1041},[957,10077,5691],{"class":981},[957,10079,5694],{"class":1041},[957,10081,5691],{"class":981},[957,10083,5694],{"class":1041},[957,10085,5691],{"class":981},[957,10087,5703],{"class":1041},[957,10089,5691],{"class":981},[957,10091,5730],{"class":1041},[957,10093,5733],{"class":963},[957,10095,5736],{"class":3240},[957,10097,10098,10100,10102,10104,10106,10108,10110,10112,10114,10116,10118],{"class":959,"line":1068},[957,10099,5688],{"class":1041},[957,10101,5691],{"class":981},[957,10103,5694],{"class":1041},[957,10105,5691],{"class":981},[957,10107,5694],{"class":1041},[957,10109,5691],{"class":981},[957,10111,5703],{"class":1041},[957,10113,5691],{"class":981},[957,10115,5757],{"class":1041},[957,10117,5733],{"class":963},[957,10119,5762],{"class":3240},[957,10121,10122],{"class":959,"line":1089},[957,10123,5767],{"class":963},[957,10125,10126],{"class":959,"line":1109},[957,10127,5772],{"class":963},[856,10129,5775,10130,5782],{},[872,10131,10132,5781],{"href":5778},[860,10133,5625],{},[856,10135,5785],{},[948,10137,10138],{"className":2586,"code":5788,"filename":5789,"language":2589,"meta":953,"style":953},[860,10139,10140,10144,10168,10172,10176,10202,10206,10210],{"__ignoreMap":953},[957,10141,10142],{"class":959,"line":960},[957,10143,5796],{"class":3240},[957,10145,10146,10148,10150,10152,10154,10156,10158,10160,10162,10164,10166],{"class":959,"line":967},[957,10147,5801],{"class":2596},[957,10149,5730],{"class":1041},[957,10151,5691],{"class":5806},[957,10153,5691],{"class":5806},[957,10155,5691],{"class":5806},[957,10157,5813],{"class":1020},[957,10159,5816],{"class":1020},[957,10161,2605],{"class":963},[957,10163,4584],{"class":2596},[957,10165,4540],{"class":1020},[957,10167,5825],{"class":1020},[957,10169,10170],{"class":959,"line":988},[957,10171,3001],{"emptyLinePlaceholder":8},[957,10173,10174],{"class":959,"line":1003},[957,10175,5834],{"class":3240},[957,10177,10178,10180,10182,10184,10186,10188,10190,10192,10194,10196,10198,10200],{"class":959,"line":1029},[957,10179,5801],{"class":2596},[957,10181,1557],{"class":1041},[957,10183,5691],{"class":5806},[957,10185,5845],{"class":1020},[957,10187,5691],{"class":5806},[957,10189,5691],{"class":5806},[957,10191,5813],{"class":1020},[957,10193,5816],{"class":1020},[957,10195,2605],{"class":963},[957,10197,4584],{"class":2596},[957,10199,4540],{"class":1020},[957,10201,5862],{"class":1020},[957,10203,10204],{"class":959,"line":1047},[957,10205,3001],{"emptyLinePlaceholder":8},[957,10207,10208],{"class":959,"line":1068},[957,10209,5871],{"class":3240},[957,10211,10212,10214,10216,10218,10220,10222,10224,10226,10228,10230,10232,10234],{"class":959,"line":1089},[957,10213,5801],{"class":2596},[957,10215,2471],{"class":1041},[957,10217,5691],{"class":5806},[957,10219,5691],{"class":5806},[957,10221,5884],{"class":1041},[957,10223,5813],{"class":1020},[957,10225,5816],{"class":1020},[957,10227,2605],{"class":963},[957,10229,4584],{"class":2596},[957,10231,5895],{"class":1020},[957,10233,5898],{"class":1384},[957,10235,5901],{"class":1384},[948,10237,10238],{"className":3789,"code":5904,"filename":5630,"language":3791,"meta":953,"style":953},[860,10239,10240,10258],{"__ignoreMap":953},[957,10241,10242,10244,10246,10248,10250,10252,10254,10256],{"class":959,"line":960},[957,10243,3998],{"class":3798},[957,10245,4001],{"class":963},[957,10247,687],{"class":3805},[957,10249,4007],{"class":963},[957,10251,4010],{"class":3798},[957,10253,4013],{"class":1016},[957,10255,4426],{"class":1020},[957,10257,5476],{"class":1016},[957,10259,10260,10262,10264,10266,10268,10270,10272,10274,10276,10278,10280,10282,10284,10286,10288,10290,10292,10294,10296,10298,10300,10302],{"class":959,"line":967},[957,10261,687],{"class":2596},[957,10263,3835],{"class":963},[957,10265,4019],{"class":1016},[957,10267,5935],{"class":1020},[957,10269,4019],{"class":1016},[957,10271,2918],{"class":963},[957,10273,4019],{"class":1016},[957,10275,5944],{"class":1020},[957,10277,4019],{"class":1016},[957,10279,5949],{"class":963},[957,10281,4019],{"class":1016},[957,10283,5954],{"class":1020},[957,10285,4019],{"class":1016},[957,10287,5959],{"class":963},[957,10289,5962],{"class":1041},[957,10291,5691],{"class":981},[957,10293,5694],{"class":1041},[957,10295,5691],{"class":981},[957,10297,5694],{"class":1041},[957,10299,5691],{"class":981},[957,10301,5975],{"class":1041},[957,10303,5511],{"class":963},[3958,10305,10306],{},[856,10307,5775,10308,5987],{},[872,10309,10310,5781],{"href":5984},[860,10311,687],{},[856,10313,5990,10314,5994,10316,5997,10318,6001],{},[860,10315,5993],{},[872,10317,4633],{"href":408},[872,10319,6000],{"href":586},[6003,10321,6005],{},{"title":953,"searchDepth":967,"depth":967,"links":10323},[10324,10328],{"id":3651,"depth":967,"text":3652,"children":10325},[10326,10327],{"id":4148,"depth":988,"text":4149},{"id":4314,"depth":988,"text":4315},{"id":4345,"depth":967,"text":4346,"children":10329},[10330],{"id":5609,"depth":988,"text":5610},{},{"title":225,"description":6015},1780436284382]