[{"data":1,"prerenderedAt":6604},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts_page":850,"\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts_surround":3986,"\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts":3989},{"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":229,"body":852,"description":3978,"extension":3979,"icon":3980,"meta":3981,"module":3982,"navigation":8,"path":230,"rawbody":3983,"seo":3984,"stem":231,"__hash__":3985},"docs\u002Fdocs\u002Fiam\u002F03.guides\u002Foperation-scripts.md",{"type":853,"value":854,"toc":3961},"minimark",[855,867,878,881,886,893,898,957,961,1009,1013,1026,1037,1059,1073,1086,1102,1116,1120,1902,1906,1913,2438,2456,2458,2462,2480,2491,2497,2567,2576,2580,2599,2602,3320,3324,3331,3432,3436,3443,3451,3472,3957],[856,857,858,859,866],"p",{},"The IAM service Docker image does not include startup or encryption scripts. These are template scripts you copy into your project and adapt to your deployment workflow. They handle ",[860,861,865],"a",{"href":862,"rel":863},"https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage",[864],"nofollow","age"," key generation, configuration encryption, container orchestration, and post-launch cleanup.",[868,869,870],"note",{},[856,871,872,873,877],{},"These scripts are not part of the ",[874,875,876],"code",{},"@riavzon\u002Fauth"," npm package. Copy them into your project and adjust paths to match your directory structure.",[879,880],"hr",{},[882,883,885],"h2",{"id":884},"standalone-deployment","Standalone deployment",[856,887,888,889,892],{},"Use ",[874,890,891],{},"start.sh"," when the IAM service is the only container you need to deploy. The script handles everything in a single command: dependency verification, key generation, config encryption, container launch, and post-launch cleanup.",[894,895,897],"h3",{"id":896},"prerequisites","Prerequisites",[899,900,901,914],"table",{},[902,903,904],"thead",{},[905,906,907,911],"tr",{},[908,909,910],"th",{},"Tool",[908,912,913],{},"Purpose",[915,916,917,928,939],"tbody",{},[905,918,919,925],{},[920,921,922],"td",{},[860,923,865],{"href":862,"rel":924},[864],[920,926,927],{},"Encrypts the configuration file with age encryption",[905,929,930,936],{},[920,931,932],{},[860,933,935],{"href":862,"rel":934},[864],"age-keygen",[920,937,938],{},"Generates the age keypair",[905,940,941,954],{},[920,942,943,948,949],{},[860,944,947],{"href":945,"rel":946},"https:\u002F\u002Fwww.docker.com\u002F",[864],"Docker"," + ",[860,950,953],{"href":951,"rel":952},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F",[864],"Compose",[920,955,956],{},"Builds and runs the service container",[894,958,960],{"id":959},"usage","Usage",[962,963,969],"pre",{"className":964,"code":965,"filename":966,"language":967,"meta":968,"style":968},"language-bash shiki shiki-themes light-plus light-plus dracula","# Auto-detects config.dev.json or config.json\n.\u002Fstart.sh\n\n# Specify a config file explicitly\n.\u002Fstart.sh \u002Fpath\u002Fto\u002Fmy-config.json\n","Terminal","bash","",[874,970,971,980,987,993,999],{"__ignoreMap":968},[972,973,976],"span",{"class":974,"line":975},"line",1,[972,977,979],{"class":978},"sghk6","# Auto-detects config.dev.json or config.json\n",[972,981,983],{"class":974,"line":982},2,[972,984,986],{"class":985},"sHOzp",".\u002Fstart.sh\n",[972,988,990],{"class":974,"line":989},3,[972,991,992],{"emptyLinePlaceholder":8},"\n",[972,994,996],{"class":974,"line":995},4,[972,997,998],{"class":978},"# Specify a config file explicitly\n",[972,1000,1002,1005],{"class":974,"line":1001},5,[972,1003,1004],{"class":985},".\u002Fstart.sh",[972,1006,1008],{"class":1007},"sFB1V"," \u002Fpath\u002Fto\u002Fmy-config.json\n",[894,1010,1012],{"id":1011},"how-it-works","How it works",[856,1014,1015,1016,1018,1019,1021,1022,1025],{},"The script starts by checking that ",[874,1017,865],{},", ",[874,1020,935],{},", and ",[874,1023,1024],{},"docker"," are available on the host. If any dependency is missing, it exits immediately with an error message.",[856,1027,1028,1029,1032,1033,1036],{},"Next it resolves the configuration file. You can pass a file path as an argument, otherwise the script looks for ",[874,1030,1031],{},"config.dev.json"," first, then falls back to ",[874,1034,1035],{},"config.json",". If no configuration file is found at all, it exits.",[856,1038,1039,1040,1043,1044,1047,1048,1051,1052,1054,1055,1058],{},"The script generates a fresh ",[860,1041,865],{"href":862,"rel":1042},[864]," keypair on every run. It removes any existing ",[874,1045,1046],{},"age_key"," and ",[874,1049,1050],{},"public_key"," files, generates new ones with ",[874,1053,935],{},", and uses the public key to encrypt the resolved configuration into ",[874,1056,1057],{},"config.json.age",". This encrypted file is the only form of configuration that enters the container.",[856,1060,1061,1062,1064,1065,1068,1069,1072],{},"After encryption, it temporarily widens the ",[874,1063,1046],{}," permissions to ",[874,1066,1067],{},"750"," so Docker can read it during container startup, creates the log directories, and launches the container with ",[874,1070,1071],{},"docker compose up --build -d --force-recreate auth",".",[1074,1075,1076],"tip",{},[856,1077,1078,1079,1082,1083,1085],{},"Remove ",[874,1080,1081],{},"auth"," from ",[874,1084,1071],{}," to start the whole compose file",[856,1087,1088,1089,1091,1092,1095,1096,1098,1099,1101],{},"Once the container is running, the script tightens ",[874,1090,1046],{}," back to ",[874,1093,1094],{},"600",", deletes the ",[874,1097,1050],{},", and if the original config file was ",[874,1100,1035],{},", deletes it from the host. Development config files are kept for convenience.",[1103,1104,1105],"caution",{},[856,1106,1107,1108,1110,1111,1113,1114,1072],{},"The script deletes ",[874,1109,1035],{}," after a successful launch. the only way to restore it, is by decrypting ",[874,1112,1057],{}," with your new ",[874,1115,1046],{},[894,1117,1119],{"id":1118},"script","Script",[962,1121,1123],{"className":964,"code":1122,"filename":891,"language":967,"meta":968,"style":968},"#!\u002Fbin\u002Fsh\n\nset -eu\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\nneed() { command -v \"$1\" >\u002Fdev\u002Fnull 2>&1 || die \"Missing dependency: $1\"; }\n\nneed age\nneed age-keygen\nneed docker\n\nCONFIG_FILE=${1:-}\n\nif [ -n \"$CONFIG_FILE\" ]; then\n    if [ ! -f \"$CONFIG_FILE\" ]; then\n        die \"Config file not found: $CONFIG_FILE\"\n    fi\n    echo \"Using provided config: $CONFIG_FILE\"\nelif [ -f \"config.dev.json\" ]; then\n    CONFIG_FILE=\"config.dev.json\"\n    echo \"Using dev config: $CONFIG_FILE\"\nelif [ -f \"config.json\" ]; then\n    CONFIG_FILE=\"config.json\"\n    echo \"Using default config.json\"\nelse\n    die \"Missing config.json (or config.dev.json) in project root.\"\nfi\n\necho \"generating secrets...\"\nrm -f age_key public_key\nage-keygen -o age_key || die \"age-keygen failed\"\nage-keygen -y age_key > public_key || die \"failed to derive public key\"\n\necho \"encrypting config...\"\nage -a -e -r \"$(cat public_key)\" -o config.json.age \"$CONFIG_FILE\" || die \"encryption failed\"\n\necho \"changing permissions...\"\nchmod 750 age_key || die \"chmod age_key failed\"\n\necho \"starting docker service...\"\nmkdir -p app-logs detector-logs || die \"mkdir logs failed\"\nchmod 777 age_key .\u002Fapp-logs .\u002Fdetector-logs || die \"chmod logs failed\"\n\ndocker compose up --build -d --force-recreate auth || die \"docker compose failed\"\n\nchmod 600 age_key || true\nrm -f public_key\n\nif [ \"$CONFIG_FILE\" = \"config.json\" ]; then\n  rm -f config.json\n  echo \"Deleted sensitive config.json\"\nelse\n  echo \"Keeping config file: $CONFIG_FILE\"\nfi\n",[874,1124,1125,1130,1134,1144,1148,1191,1239,1244,1252,1260,1268,1273,1292,1297,1323,1347,1363,1369,1384,1405,1419,1433,1452,1465,1477,1483,1496,1502,1507,1519,1533,1554,1580,1585,1597,1646,1651,1663,1685,1690,1702,1728,1755,1760,1794,1799,1814,1823,1828,1854,1865,1878,1883,1897],{"__ignoreMap":968},[972,1126,1127],{"class":974,"line":975},[972,1128,1129],{"class":978},"#!\u002Fbin\u002Fsh\n",[972,1131,1132],{"class":974,"line":982},[972,1133,992],{"emptyLinePlaceholder":8},[972,1135,1136,1140],{"class":974,"line":989},[972,1137,1139],{"class":1138},"sqc-S","set",[972,1141,1143],{"class":1142},"sjR7W"," -eu\n",[972,1145,1146],{"class":974,"line":995},[972,1147,992],{"emptyLinePlaceholder":8},[972,1149,1150,1153,1157,1160,1164,1167,1171,1174,1178,1181,1184,1188],{"class":974,"line":1001},[972,1151,1152],{"class":985},"die",[972,1154,1156],{"class":1155},"sDd4n","() { ",[972,1158,1159],{"class":1138},"echo",[972,1161,1163],{"class":1162},"sFkSl"," \"",[972,1165,1166],{"class":1007},"Error: ",[972,1168,1170],{"class":1169},"spgJB","$*",[972,1172,1173],{"class":1162},"\"",[972,1175,1177],{"class":1176},"saOXh"," >&2",[972,1179,1180],{"class":1155},"; ",[972,1182,1183],{"class":1138},"exit",[972,1185,1187],{"class":1186},"spgvN"," 1",[972,1189,1190],{"class":1155},"; }\n",[972,1192,1194,1197,1199,1202,1205,1207,1211,1213,1216,1219,1222,1225,1228,1230,1233,1235,1237],{"class":974,"line":1193},6,[972,1195,1196],{"class":985},"need",[972,1198,1156],{"class":1155},[972,1200,1201],{"class":1138},"command",[972,1203,1204],{"class":1142}," -v",[972,1206,1163],{"class":1162},[972,1208,1210],{"class":1209},"sygFZ","$1",[972,1212,1173],{"class":1162},[972,1214,1215],{"class":1176}," >",[972,1217,1218],{"class":1007},"\u002Fdev\u002Fnull",[972,1220,1221],{"class":1176}," 2>&1",[972,1223,1224],{"class":1176}," ||",[972,1226,1227],{"class":985}," die",[972,1229,1163],{"class":1162},[972,1231,1232],{"class":1007},"Missing dependency: ",[972,1234,1210],{"class":1209},[972,1236,1173],{"class":1162},[972,1238,1190],{"class":1155},[972,1240,1242],{"class":974,"line":1241},7,[972,1243,992],{"emptyLinePlaceholder":8},[972,1245,1247,1249],{"class":974,"line":1246},8,[972,1248,1196],{"class":985},[972,1250,1251],{"class":1007}," age\n",[972,1253,1255,1257],{"class":974,"line":1254},9,[972,1256,1196],{"class":985},[972,1258,1259],{"class":1007}," age-keygen\n",[972,1261,1263,1265],{"class":974,"line":1262},10,[972,1264,1196],{"class":985},[972,1266,1267],{"class":1007}," docker\n",[972,1269,1271],{"class":974,"line":1270},11,[972,1272,992],{"emptyLinePlaceholder":8},[972,1274,1276,1280,1283,1286,1289],{"class":974,"line":1275},12,[972,1277,1279],{"class":1278},"sWkX1","CONFIG_FILE",[972,1281,1282],{"class":1176},"=",[972,1284,1285],{"class":1209},"${1",[972,1287,1288],{"class":1176},":-",[972,1290,1291],{"class":1209},"}\n",[972,1293,1295],{"class":974,"line":1294},13,[972,1296,992],{"emptyLinePlaceholder":8},[972,1298,1300,1304,1307,1310,1312,1315,1317,1320],{"class":974,"line":1299},14,[972,1301,1303],{"class":1302},"sZ328","if",[972,1305,1306],{"class":1155}," [ ",[972,1308,1309],{"class":1176},"-n",[972,1311,1163],{"class":1162},[972,1313,1314],{"class":1278},"$CONFIG_FILE",[972,1316,1173],{"class":1162},[972,1318,1319],{"class":1155}," ]; ",[972,1321,1322],{"class":1302},"then\n",[972,1324,1326,1329,1331,1334,1337,1339,1341,1343,1345],{"class":974,"line":1325},15,[972,1327,1328],{"class":1302},"    if",[972,1330,1306],{"class":1155},[972,1332,1333],{"class":1176},"!",[972,1335,1336],{"class":1176}," -f",[972,1338,1163],{"class":1162},[972,1340,1314],{"class":1278},[972,1342,1173],{"class":1162},[972,1344,1319],{"class":1155},[972,1346,1322],{"class":1302},[972,1348,1350,1353,1355,1358,1360],{"class":974,"line":1349},16,[972,1351,1352],{"class":985},"        die",[972,1354,1163],{"class":1162},[972,1356,1357],{"class":1007},"Config file not found: ",[972,1359,1314],{"class":1278},[972,1361,1362],{"class":1162},"\"\n",[972,1364,1366],{"class":974,"line":1365},17,[972,1367,1368],{"class":1302},"    fi\n",[972,1370,1372,1375,1377,1380,1382],{"class":974,"line":1371},18,[972,1373,1374],{"class":1138},"    echo",[972,1376,1163],{"class":1162},[972,1378,1379],{"class":1007},"Using provided config: ",[972,1381,1314],{"class":1278},[972,1383,1362],{"class":1162},[972,1385,1387,1390,1392,1395,1397,1399,1401,1403],{"class":974,"line":1386},19,[972,1388,1389],{"class":1302},"elif",[972,1391,1306],{"class":1155},[972,1393,1394],{"class":1176},"-f",[972,1396,1163],{"class":1162},[972,1398,1031],{"class":1007},[972,1400,1173],{"class":1162},[972,1402,1319],{"class":1155},[972,1404,1322],{"class":1302},[972,1406,1408,1411,1413,1415,1417],{"class":974,"line":1407},20,[972,1409,1410],{"class":1278},"    CONFIG_FILE",[972,1412,1282],{"class":1176},[972,1414,1173],{"class":1162},[972,1416,1031],{"class":1007},[972,1418,1362],{"class":1162},[972,1420,1422,1424,1426,1429,1431],{"class":974,"line":1421},21,[972,1423,1374],{"class":1138},[972,1425,1163],{"class":1162},[972,1427,1428],{"class":1007},"Using dev config: ",[972,1430,1314],{"class":1278},[972,1432,1362],{"class":1162},[972,1434,1436,1438,1440,1442,1444,1446,1448,1450],{"class":974,"line":1435},22,[972,1437,1389],{"class":1302},[972,1439,1306],{"class":1155},[972,1441,1394],{"class":1176},[972,1443,1163],{"class":1162},[972,1445,1035],{"class":1007},[972,1447,1173],{"class":1162},[972,1449,1319],{"class":1155},[972,1451,1322],{"class":1302},[972,1453,1455,1457,1459,1461,1463],{"class":974,"line":1454},23,[972,1456,1410],{"class":1278},[972,1458,1282],{"class":1176},[972,1460,1173],{"class":1162},[972,1462,1035],{"class":1007},[972,1464,1362],{"class":1162},[972,1466,1468,1470,1472,1475],{"class":974,"line":1467},24,[972,1469,1374],{"class":1138},[972,1471,1163],{"class":1162},[972,1473,1474],{"class":1007},"Using default config.json",[972,1476,1362],{"class":1162},[972,1478,1480],{"class":974,"line":1479},25,[972,1481,1482],{"class":1302},"else\n",[972,1484,1486,1489,1491,1494],{"class":974,"line":1485},26,[972,1487,1488],{"class":985},"    die",[972,1490,1163],{"class":1162},[972,1492,1493],{"class":1007},"Missing config.json (or config.dev.json) in project root.",[972,1495,1362],{"class":1162},[972,1497,1499],{"class":974,"line":1498},27,[972,1500,1501],{"class":1302},"fi\n",[972,1503,1505],{"class":974,"line":1504},28,[972,1506,992],{"emptyLinePlaceholder":8},[972,1508,1510,1512,1514,1517],{"class":974,"line":1509},29,[972,1511,1159],{"class":1138},[972,1513,1163],{"class":1162},[972,1515,1516],{"class":1007},"generating secrets...",[972,1518,1362],{"class":1162},[972,1520,1522,1525,1527,1530],{"class":974,"line":1521},30,[972,1523,1524],{"class":985},"rm",[972,1526,1336],{"class":1142},[972,1528,1529],{"class":1007}," age_key",[972,1531,1532],{"class":1007}," public_key\n",[972,1534,1536,1538,1541,1543,1545,1547,1549,1552],{"class":974,"line":1535},31,[972,1537,935],{"class":985},[972,1539,1540],{"class":1142}," -o",[972,1542,1529],{"class":1007},[972,1544,1224],{"class":1176},[972,1546,1227],{"class":985},[972,1548,1163],{"class":1162},[972,1550,1551],{"class":1007},"age-keygen failed",[972,1553,1362],{"class":1162},[972,1555,1557,1559,1562,1564,1566,1569,1571,1573,1575,1578],{"class":974,"line":1556},32,[972,1558,935],{"class":985},[972,1560,1561],{"class":1142}," -y",[972,1563,1529],{"class":1007},[972,1565,1215],{"class":1176},[972,1567,1568],{"class":1007}," public_key",[972,1570,1224],{"class":1176},[972,1572,1227],{"class":985},[972,1574,1163],{"class":1162},[972,1576,1577],{"class":1007},"failed to derive public key",[972,1579,1362],{"class":1162},[972,1581,1583],{"class":974,"line":1582},33,[972,1584,992],{"emptyLinePlaceholder":8},[972,1586,1588,1590,1592,1595],{"class":974,"line":1587},34,[972,1589,1159],{"class":1138},[972,1591,1163],{"class":1162},[972,1593,1594],{"class":1007},"encrypting config...",[972,1596,1362],{"class":1162},[972,1598,1600,1602,1605,1608,1611,1613,1616,1619,1622,1624,1626,1629,1631,1633,1635,1637,1639,1641,1644],{"class":974,"line":1599},35,[972,1601,865],{"class":985},[972,1603,1604],{"class":1142}," -a",[972,1606,1607],{"class":1142}," -e",[972,1609,1610],{"class":1142}," -r",[972,1612,1163],{"class":1162},[972,1614,1615],{"class":1007},"$(",[972,1617,1618],{"class":985},"cat",[972,1620,1621],{"class":1007}," public_key)",[972,1623,1173],{"class":1162},[972,1625,1540],{"class":1142},[972,1627,1628],{"class":1007}," config.json.age",[972,1630,1163],{"class":1162},[972,1632,1314],{"class":1278},[972,1634,1173],{"class":1162},[972,1636,1224],{"class":1176},[972,1638,1227],{"class":985},[972,1640,1163],{"class":1162},[972,1642,1643],{"class":1007},"encryption failed",[972,1645,1362],{"class":1162},[972,1647,1649],{"class":974,"line":1648},36,[972,1650,992],{"emptyLinePlaceholder":8},[972,1652,1654,1656,1658,1661],{"class":974,"line":1653},37,[972,1655,1159],{"class":1138},[972,1657,1163],{"class":1162},[972,1659,1660],{"class":1007},"changing permissions...",[972,1662,1362],{"class":1162},[972,1664,1666,1669,1672,1674,1676,1678,1680,1683],{"class":974,"line":1665},38,[972,1667,1668],{"class":985},"chmod",[972,1670,1671],{"class":1186}," 750",[972,1673,1529],{"class":1007},[972,1675,1224],{"class":1176},[972,1677,1227],{"class":985},[972,1679,1163],{"class":1162},[972,1681,1682],{"class":1007},"chmod age_key failed",[972,1684,1362],{"class":1162},[972,1686,1688],{"class":974,"line":1687},39,[972,1689,992],{"emptyLinePlaceholder":8},[972,1691,1693,1695,1697,1700],{"class":974,"line":1692},40,[972,1694,1159],{"class":1138},[972,1696,1163],{"class":1162},[972,1698,1699],{"class":1007},"starting docker service...",[972,1701,1362],{"class":1162},[972,1703,1705,1708,1711,1714,1717,1719,1721,1723,1726],{"class":974,"line":1704},41,[972,1706,1707],{"class":985},"mkdir",[972,1709,1710],{"class":1142}," -p",[972,1712,1713],{"class":1007}," app-logs",[972,1715,1716],{"class":1007}," detector-logs",[972,1718,1224],{"class":1176},[972,1720,1227],{"class":985},[972,1722,1163],{"class":1162},[972,1724,1725],{"class":1007},"mkdir logs failed",[972,1727,1362],{"class":1162},[972,1729,1731,1733,1736,1738,1741,1744,1746,1748,1750,1753],{"class":974,"line":1730},42,[972,1732,1668],{"class":985},[972,1734,1735],{"class":1186}," 777",[972,1737,1529],{"class":1007},[972,1739,1740],{"class":1007}," .\u002Fapp-logs",[972,1742,1743],{"class":1007}," .\u002Fdetector-logs",[972,1745,1224],{"class":1176},[972,1747,1227],{"class":985},[972,1749,1163],{"class":1162},[972,1751,1752],{"class":1007},"chmod logs failed",[972,1754,1362],{"class":1162},[972,1756,1758],{"class":974,"line":1757},43,[972,1759,992],{"emptyLinePlaceholder":8},[972,1761,1763,1765,1768,1771,1774,1777,1780,1783,1785,1787,1789,1792],{"class":974,"line":1762},44,[972,1764,1024],{"class":985},[972,1766,1767],{"class":1007}," compose",[972,1769,1770],{"class":1007}," up",[972,1772,1773],{"class":1142}," --build",[972,1775,1776],{"class":1142}," -d",[972,1778,1779],{"class":1142}," --force-recreate",[972,1781,1782],{"class":1007}," auth",[972,1784,1224],{"class":1176},[972,1786,1227],{"class":985},[972,1788,1163],{"class":1162},[972,1790,1791],{"class":1007},"docker compose failed",[972,1793,1362],{"class":1162},[972,1795,1797],{"class":974,"line":1796},45,[972,1798,992],{"emptyLinePlaceholder":8},[972,1800,1802,1804,1807,1809,1811],{"class":974,"line":1801},46,[972,1803,1668],{"class":985},[972,1805,1806],{"class":1186}," 600",[972,1808,1529],{"class":1007},[972,1810,1224],{"class":1176},[972,1812,1813],{"class":1138}," true\n",[972,1815,1817,1819,1821],{"class":974,"line":1816},47,[972,1818,1524],{"class":985},[972,1820,1336],{"class":1142},[972,1822,1532],{"class":1007},[972,1824,1826],{"class":974,"line":1825},48,[972,1827,992],{"emptyLinePlaceholder":8},[972,1829,1831,1833,1835,1837,1839,1841,1844,1846,1848,1850,1852],{"class":974,"line":1830},49,[972,1832,1303],{"class":1302},[972,1834,1306],{"class":1155},[972,1836,1173],{"class":1162},[972,1838,1314],{"class":1278},[972,1840,1173],{"class":1162},[972,1842,1843],{"class":1176}," =",[972,1845,1163],{"class":1162},[972,1847,1035],{"class":1007},[972,1849,1173],{"class":1162},[972,1851,1319],{"class":1155},[972,1853,1322],{"class":1302},[972,1855,1857,1860,1862],{"class":974,"line":1856},50,[972,1858,1859],{"class":985},"  rm",[972,1861,1336],{"class":1142},[972,1863,1864],{"class":1007}," config.json\n",[972,1866,1868,1871,1873,1876],{"class":974,"line":1867},51,[972,1869,1870],{"class":1138},"  echo",[972,1872,1163],{"class":1162},[972,1874,1875],{"class":1007},"Deleted sensitive config.json",[972,1877,1362],{"class":1162},[972,1879,1881],{"class":974,"line":1880},52,[972,1882,1482],{"class":1302},[972,1884,1886,1888,1890,1893,1895],{"class":974,"line":1885},53,[972,1887,1870],{"class":1138},[972,1889,1163],{"class":1162},[972,1891,1892],{"class":1007},"Keeping config file: ",[972,1894,1314],{"class":1278},[972,1896,1362],{"class":1162},[972,1898,1900],{"class":974,"line":1899},54,[972,1901,1501],{"class":1302},[894,1903,1905],{"id":1904},"docker-compose","Docker Compose",[856,1907,1908,1909,1912],{},"The script expects a ",[874,1910,1911],{},"docker-compose.yml"," in the same directory. Here is a minimal example with MySQL and the IAM service using age-encrypted secrets:",[962,1914,1918],{"className":1915,"code":1916,"filename":1911,"language":1917,"meta":968,"style":968},"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: secure_password\n      MYSQL_DATABASE: auth_db\n      MYSQL_USER: auth_user\n      MYSQL_PASSWORD: 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\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      - .\u002Fapp-logs:\u002Fapp\u002Fauth-logs:rw\n      - .\u002Fdetector-logs:\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    ports:\n      - \"10000:10000\"\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\nvolumes:\n  sql_db:  \n  bot-detector-data:\n  email-data:\n\nsecrets:\n  age_key:\n    file: .\u002Fage_key\n  encrypted_config:\n    file: .\u002Fconfig.json.age\n","yaml",[874,1919,1920,1929,1940,1951,1961,1968,1978,1988,1998,2007,2027,2041,2050,2062,2069,2076,2083,2110,2120,2132,2142,2152,2156,2163,2172,2185,2193,2209,2218,2226,2233,2240,2247,2254,2261,2268,2278,2285,2296,2303,2310,2317,2323,2333,2340,2347,2357,2361,2368,2377,2384,2391,2395,2402,2409,2420,2428],{"__ignoreMap":968},[972,1921,1922,1926],{"class":974,"line":975},[972,1923,1925],{"class":1924},"sXrRR","services",[972,1927,1928],{"class":1176},":\n",[972,1930,1931,1934,1937],{"class":974,"line":982},[972,1932,1933],{"class":1924},"  mysql",[972,1935,1936],{"class":1176},":",[972,1938,1939],{"class":1155}," \n",[972,1941,1942,1945,1947],{"class":974,"line":989},[972,1943,1944],{"class":1924},"    image",[972,1946,1936],{"class":1176},[972,1948,1950],{"class":1949},"sKKzR"," mysql:8\n",[972,1952,1953,1956,1958],{"class":974,"line":995},[972,1954,1955],{"class":1924},"    restart",[972,1957,1936],{"class":1176},[972,1959,1960],{"class":1949}," unless-stopped\n",[972,1962,1963,1966],{"class":974,"line":1001},[972,1964,1965],{"class":1924},"    environment",[972,1967,1928],{"class":1176},[972,1969,1970,1973,1975],{"class":974,"line":1193},[972,1971,1972],{"class":1924},"      MYSQL_ROOT_PASSWORD",[972,1974,1936],{"class":1176},[972,1976,1977],{"class":1949}," secure_password\n",[972,1979,1980,1983,1985],{"class":974,"line":1241},[972,1981,1982],{"class":1924},"      MYSQL_DATABASE",[972,1984,1936],{"class":1176},[972,1986,1987],{"class":1949}," auth_db\n",[972,1989,1990,1993,1995],{"class":974,"line":1246},[972,1991,1992],{"class":1924},"      MYSQL_USER",[972,1994,1936],{"class":1176},[972,1996,1997],{"class":1949}," auth_user\n",[972,1999,2000,2003,2005],{"class":974,"line":1254},[972,2001,2002],{"class":1924},"      MYSQL_PASSWORD",[972,2004,1936],{"class":1176},[972,2006,1977],{"class":1949},[972,2008,2009,2012,2014,2017,2019,2022,2024],{"class":974,"line":1262},[972,2010,2011],{"class":1924},"    cap_drop",[972,2013,1936],{"class":1176},[972,2015,2016],{"class":1155}," [",[972,2018,1173],{"class":1162},[972,2020,2021],{"class":1007},"ALL",[972,2023,1173],{"class":1162},[972,2025,2026],{"class":1155},"]\n",[972,2028,2029,2032,2034,2036,2039],{"class":974,"line":1270},[972,2030,2031],{"class":1924},"    user",[972,2033,1936],{"class":1176},[972,2035,1163],{"class":1162},[972,2037,2038],{"class":1007},"999:999",[972,2040,1362],{"class":1162},[972,2042,2043,2046,2048],{"class":974,"line":1275},[972,2044,2045],{"class":1924},"    security_opt",[972,2047,1936],{"class":1176},[972,2049,1939],{"class":1155},[972,2051,2052,2055,2057,2060],{"class":974,"line":1294},[972,2053,2054],{"class":1176},"      -",[972,2056,1163],{"class":1162},[972,2058,2059],{"class":1007},"no-new-privileges:true",[972,2061,1362],{"class":1162},[972,2063,2064,2067],{"class":974,"line":1299},[972,2065,2066],{"class":1924},"    volumes",[972,2068,1928],{"class":1176},[972,2070,2071,2073],{"class":974,"line":1325},[972,2072,2054],{"class":1176},[972,2074,2075],{"class":1949}," sql_db:\u002Fvar\u002Flib\u002Fmysql\n",[972,2077,2078,2081],{"class":974,"line":1349},[972,2079,2080],{"class":1924},"    healthcheck",[972,2082,1928],{"class":1176},[972,2084,2085,2088,2090,2092,2094,2097,2099,2101,2103,2106,2108],{"class":974,"line":1365},[972,2086,2087],{"class":1924},"      test",[972,2089,1936],{"class":1176},[972,2091,2016],{"class":1155},[972,2093,1173],{"class":1162},[972,2095,2096],{"class":1007},"CMD-SHELL",[972,2098,1173],{"class":1162},[972,2100,1018],{"class":1155},[972,2102,1173],{"class":1162},[972,2104,2105],{"class":1007},"bash -lc 'exec 3\u003C>\u002Fdev\u002Ftcp\u002F127.0.0.1\u002F3306'",[972,2107,1173],{"class":1162},[972,2109,2026],{"class":1155},[972,2111,2112,2115,2117],{"class":974,"line":1371},[972,2113,2114],{"class":1924},"      interval",[972,2116,1936],{"class":1176},[972,2118,2119],{"class":1949}," 10s\n",[972,2121,2122,2125,2127,2130],{"class":974,"line":1386},[972,2123,2124],{"class":1924},"      timeout",[972,2126,1936],{"class":1176},[972,2128,2129],{"class":1949}," 8s",[972,2131,1939],{"class":1155},[972,2133,2134,2137,2139],{"class":974,"line":1407},[972,2135,2136],{"class":1924},"      retries",[972,2138,1936],{"class":1176},[972,2140,2141],{"class":1186}," 5\n",[972,2143,2144,2147,2149],{"class":974,"line":1421},[972,2145,2146],{"class":1924},"      start_period",[972,2148,1936],{"class":1176},[972,2150,2151],{"class":1949}," 7m\n",[972,2153,2154],{"class":974,"line":1435},[972,2155,992],{"emptyLinePlaceholder":8},[972,2157,2158,2161],{"class":974,"line":1454},[972,2159,2160],{"class":1924},"  auth",[972,2162,1928],{"class":1176},[972,2164,2165,2167,2169],{"class":974,"line":1467},[972,2166,1944],{"class":1924},[972,2168,1936],{"class":1176},[972,2170,2171],{"class":1949}," sergio68\u002Fauth\n",[972,2173,2174,2177,2179,2182],{"class":974,"line":1479},[972,2175,2176],{"class":1924},"    read_only",[972,2178,1936],{"class":1176},[972,2180,2181],{"class":1142}," true",[972,2183,2184],{"class":1155},"  \n",[972,2186,2187,2189,2191],{"class":974,"line":1485},[972,2188,1955],{"class":1924},[972,2190,1936],{"class":1176},[972,2192,1960],{"class":1949},[972,2194,2195,2197,2199,2201,2203,2205,2207],{"class":974,"line":1498},[972,2196,2011],{"class":1924},[972,2198,1936],{"class":1176},[972,2200,2016],{"class":1155},[972,2202,1173],{"class":1162},[972,2204,2021],{"class":1007},[972,2206,1173],{"class":1162},[972,2208,2026],{"class":1155},[972,2210,2211,2213,2215],{"class":974,"line":1504},[972,2212,2031],{"class":1924},[972,2214,1936],{"class":1176},[972,2216,2217],{"class":1949}," 10001:10001\n",[972,2219,2220,2222,2224],{"class":974,"line":1509},[972,2221,2066],{"class":1924},[972,2223,1936],{"class":1176},[972,2225,1939],{"class":1155},[972,2227,2228,2230],{"class":974,"line":1521},[972,2229,2054],{"class":1176},[972,2231,2232],{"class":1949}," .\u002Fapp-logs:\u002Fapp\u002Fauth-logs:rw\n",[972,2234,2235,2237],{"class":974,"line":1535},[972,2236,2054],{"class":1176},[972,2238,2239],{"class":1949}," .\u002Fdetector-logs:\u002Fapp\u002Fbot-detector-logs:rw\n",[972,2241,2242,2244],{"class":974,"line":1556},[972,2243,2054],{"class":1176},[972,2245,2246],{"class":1949}," bot-detector-data:\u002Fapp\u002Fnode_modules\u002F@riavzon\u002Fbot-detector\u002Fdist\u002F_data-sources:rw\n",[972,2248,2249,2251],{"class":974,"line":1582},[972,2250,2054],{"class":1176},[972,2252,2253],{"class":1949}," email-data:\u002Fapp\u002Fdist\u002Femail-db:rw\n",[972,2255,2256,2259],{"class":974,"line":1587},[972,2257,2258],{"class":1924},"    tmpfs",[972,2260,1928],{"class":1176},[972,2262,2263,2265],{"class":974,"line":1599},[972,2264,2054],{"class":1176},[972,2266,2267],{"class":1949}," \u002Frun\u002Fapp:rw,noexec,nosuid,nodev,uid=10001,gid=10001,size=1m\n",[972,2269,2270,2273,2275],{"class":974,"line":1648},[972,2271,2272],{"class":1924},"    pids_limit",[972,2274,1936],{"class":1176},[972,2276,2277],{"class":1186}," 200\n",[972,2279,2280,2283],{"class":974,"line":1653},[972,2281,2282],{"class":1924},"    ports",[972,2284,1928],{"class":1176},[972,2286,2287,2289,2291,2294],{"class":974,"line":1665},[972,2288,2054],{"class":1176},[972,2290,1163],{"class":1162},[972,2292,2293],{"class":1007},"10000:10000",[972,2295,1362],{"class":1162},[972,2297,2298,2301],{"class":974,"line":1687},[972,2299,2300],{"class":1924},"    secrets",[972,2302,1928],{"class":1176},[972,2304,2305,2307],{"class":974,"line":1692},[972,2306,2054],{"class":1176},[972,2308,2309],{"class":1949}," age_key\n",[972,2311,2312,2314],{"class":974,"line":1704},[972,2313,2054],{"class":1176},[972,2315,2316],{"class":1949}," encrypted_config\n",[972,2318,2319,2321],{"class":974,"line":1730},[972,2320,2045],{"class":1924},[972,2322,1928],{"class":1176},[972,2324,2325,2327,2329,2331],{"class":974,"line":1757},[972,2326,2054],{"class":1176},[972,2328,1163],{"class":1162},[972,2330,2059],{"class":1007},[972,2332,1362],{"class":1162},[972,2334,2335,2338],{"class":974,"line":1762},[972,2336,2337],{"class":1924},"    depends_on",[972,2339,1928],{"class":1176},[972,2341,2342,2345],{"class":974,"line":1796},[972,2343,2344],{"class":1924},"      mysql",[972,2346,1928],{"class":1176},[972,2348,2349,2352,2354],{"class":974,"line":1801},[972,2350,2351],{"class":1924},"        condition",[972,2353,1936],{"class":1176},[972,2355,2356],{"class":1949}," service_healthy\n",[972,2358,2359],{"class":974,"line":1816},[972,2360,992],{"emptyLinePlaceholder":8},[972,2362,2363,2366],{"class":974,"line":1825},[972,2364,2365],{"class":1924},"volumes",[972,2367,1928],{"class":1176},[972,2369,2370,2373,2375],{"class":974,"line":1830},[972,2371,2372],{"class":1924},"  sql_db",[972,2374,1936],{"class":1176},[972,2376,2184],{"class":1155},[972,2378,2379,2382],{"class":974,"line":1856},[972,2380,2381],{"class":1924},"  bot-detector-data",[972,2383,1928],{"class":1176},[972,2385,2386,2389],{"class":974,"line":1867},[972,2387,2388],{"class":1924},"  email-data",[972,2390,1928],{"class":1176},[972,2392,2393],{"class":974,"line":1880},[972,2394,992],{"emptyLinePlaceholder":8},[972,2396,2397,2400],{"class":974,"line":1885},[972,2398,2399],{"class":1924},"secrets",[972,2401,1928],{"class":1176},[972,2403,2404,2407],{"class":974,"line":1899},[972,2405,2406],{"class":1924},"  age_key",[972,2408,1928],{"class":1176},[972,2410,2412,2415,2417],{"class":974,"line":2411},55,[972,2413,2414],{"class":1924},"    file",[972,2416,1936],{"class":1176},[972,2418,2419],{"class":1949}," .\u002Fage_key\n",[972,2421,2423,2426],{"class":974,"line":2422},56,[972,2424,2425],{"class":1924},"  encrypted_config",[972,2427,1928],{"class":1176},[972,2429,2431,2433,2435],{"class":974,"line":2430},57,[972,2432,2414],{"class":1924},[972,2434,1936],{"class":1176},[972,2436,2437],{"class":1949}," .\u002Fconfig.json.age\n",[856,2439,2440,2441,1047,2443,2445,2446,2448,2449,2452,2453,2455],{},"The ",[874,2442,1046],{},[874,2444,1057],{}," files are created by ",[874,2447,891],{}," before it runs ",[874,2450,2451],{},"docker compose up",". See the ",[860,2454,14],{"href":74}," guide for a full walkthrough of each volume and secret.",[879,2457],{},[882,2459,2461],{"id":2460},"multi-service-deployment","Multi-service deployment",[856,2463,2464,2465,2468,2469,2471,2472,2475,2476,2479],{},"When the IAM service runs alongside your application in a shared ",[860,2466,1905],{"href":951,"rel":2467},[864]," stack, you do not use ",[874,2470,891],{}," directly. Instead, you source two shell functions into your own startup script: ",[874,2473,2474],{},"encrypt_auth_config"," for the encryption step, and ",[874,2477,2478],{},"cleanup_auth_secrets"," for post-launch cleanup.",[856,2481,2482,2483,2486,2487,2490],{},"Save the script below as ",[874,2484,2485],{},"scripts\u002Fencrypt-auth.sh"," in your project. Your main startup script sources it with ",[874,2488,2489],{},". .\u002Fscripts\u002Fencrypt-auth.sh"," and calls the functions at the right points in your flow.",[894,2492,2494,2495],{"id":2493},"how-it-differs-from-startsh","How it differs from ",[874,2496,891],{},[899,2498,2499,2514],{},[902,2500,2501],{},[905,2502,2503,2506,2510],{},[908,2504,2505],{},"Behavior",[908,2507,2508],{},[874,2509,891],{},[908,2511,2512],{},[874,2513,2474],{},[915,2515,2516,2527,2540,2553],{},[905,2517,2518,2521,2524],{},[920,2519,2520],{},"Key generation",[920,2522,2523],{},"Fresh keypair on every run",[920,2525,2526],{},"Reuses existing key if present",[905,2528,2529,2532,2535],{},[920,2530,2531],{},"Missing config",[920,2533,2534],{},"Exits with error",[920,2536,2537,2538],{},"Falls back to existing ",[874,2539,1057],{},[905,2541,2542,2545,2550],{},[920,2543,2544],{},"Container launch",[920,2546,2547,2548],{},"Runs ",[874,2549,2451],{},[920,2551,2552],{},"Does not launch anything",[905,2554,2555,2558,2561],{},[920,2556,2557],{},"Cleanup",[920,2559,2560],{},"Built into the same script",[920,2562,2563,2564,2566],{},"Separate ",[874,2565,2478],{}," function",[856,2568,2569,2570,2572,2573,2575],{},"The key reuse behavior makes ",[874,2571,2474],{}," safe to call on every deploy without rotating the keypair. If a config file is present, it encrypts it. If only a previously encrypted ",[874,2574,1057],{}," exists, it skips encryption and uses what is already there. This is useful in CI pipelines where the age key and encrypted config may be pre-provisioned.",[894,2577,2578],{"id":2478},[874,2579,2478],{},[856,2581,2582,2583,2585,2586,2588,2589,2592,2593,2595,2596,2598],{},"After your containers are running, call ",[874,2584,2478],{},". It tightens the age key to ",[874,2587,1094],{}," (owner read\u002Fwrite), sets the encrypted config to ",[874,2590,2591],{},"640",", and deletes any production ",[874,2594,1035],{}," from the secrets directory. Development configs (",[874,2597,1031],{},") are kept.",[894,2600,1119],{"id":2601},"script-1",[962,2603,2605],{"className":964,"code":2604,"filename":2485,"language":967,"meta":968,"style":968},"set -eu\n\nencrypt_auth_config() {\n  AUTH_SECRETS_DIR=\".\u002Fsecrets\u002Fauth\"\n  AUTH_KEY=\"${AUTH_SECRETS_DIR}\u002Fage_key\"\n\n  if [ ! -f \"$AUTH_KEY\" ]; then\n    echo \"Generating new auth age key pair...\"\n    age-keygen -o \"$AUTH_KEY\" || die \"auth age-keygen failed\"\n  else\n    echo \"Using existing auth age key.\"\n  fi\n\n  AUTH_CONFIG=\"\"\n  if [ -f \"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\" ]; then\n    AUTH_CONFIG=\"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\"\n    echo \"Using auth dev config: $AUTH_CONFIG\"\n  elif [ -f \"${AUTH_SECRETS_DIR}\u002Fconfig.json\" ]; then\n    AUTH_CONFIG=\"${AUTH_SECRETS_DIR}\u002Fconfig.json\"\n    echo \"Using auth config: $AUTH_CONFIG\"\n  fi\n\n  AUTH_CONFIG_AGE=\"${AUTH_SECRETS_DIR}\u002Fconfig.json.age\"\n\n  if [ -n \"$AUTH_CONFIG\" ]; then\n    AUTH_PUB=\"$(age-keygen -y \"$AUTH_KEY\")\" || die \"failed to derive auth public key\"\n    echo \"encrypt: $AUTH_CONFIG\"\n    age -a -e -r \"$AUTH_PUB\" -o \"$AUTH_CONFIG_AGE\" \"$AUTH_CONFIG\" || die \"encrypt failed: $AUTH_CONFIG\"\n  else\n    [ -f \"$AUTH_CONFIG_AGE\" ] || die \"No auth config found: provide config.json or config.dev.json in $AUTH_SECRETS_DIR\"\n    echo \"skip (using existing): $AUTH_CONFIG_AGE\"\n  fi\n\n  echo \"Auth config encryption complete.\"\n}\n\ncleanup_auth_secrets() {\n  AUTH_SECRETS_DIR=\".\u002Fsecrets\u002Fauth\"\n  AUTH_KEY=\"${AUTH_SECRETS_DIR}\u002Fage_key\"\n  AUTH_CONFIG_AGE=\"${AUTH_SECRETS_DIR}\u002Fconfig.json.age\"\n\n  chmod 600 \"$AUTH_KEY\" || true\n  chmod 640 \"$AUTH_CONFIG_AGE\" || true\n\n  for f in \"${AUTH_SECRETS_DIR}\u002Fconfig.json\" \"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\"; do\n    if [ -f \"$f\" ]; then\n      case \"$f\" in\n        *dev*) echo \"Keeping dev config: $f\" ;;\n        *)     rm -f \"$f\"; echo \"Deleted sensitive auth config: $f\" ;;\n      esac\n    fi\n  done\n}\n",[874,2606,2607,2613,2617,2624,2638,2658,2662,2684,2695,2719,2724,2735,2740,2744,2754,2777,2794,2808,2832,2848,2861,2865,2869,2887,2891,2909,2946,2959,3005,3009,3040,3053,3057,3061,3072,3076,3080,3086,3098,3114,3130,3134,3151,3168,3172,3208,3227,3241,3271,3302,3307,3311,3316],{"__ignoreMap":968},[972,2608,2609,2611],{"class":974,"line":975},[972,2610,1139],{"class":1138},[972,2612,1143],{"class":1142},[972,2614,2615],{"class":974,"line":982},[972,2616,992],{"emptyLinePlaceholder":8},[972,2618,2619,2621],{"class":974,"line":989},[972,2620,2474],{"class":985},[972,2622,2623],{"class":1155},"() {\n",[972,2625,2626,2629,2631,2633,2636],{"class":974,"line":995},[972,2627,2628],{"class":1278},"  AUTH_SECRETS_DIR",[972,2630,1282],{"class":1176},[972,2632,1173],{"class":1162},[972,2634,2635],{"class":1007},".\u002Fsecrets\u002Fauth",[972,2637,1362],{"class":1162},[972,2639,2640,2643,2645,2647,2650,2653,2656],{"class":974,"line":1001},[972,2641,2642],{"class":1278},"  AUTH_KEY",[972,2644,1282],{"class":1176},[972,2646,1173],{"class":1162},[972,2648,2649],{"class":1007},"${",[972,2651,2652],{"class":1278},"AUTH_SECRETS_DIR",[972,2654,2655],{"class":1007},"}\u002Fage_key",[972,2657,1362],{"class":1162},[972,2659,2660],{"class":974,"line":1193},[972,2661,992],{"emptyLinePlaceholder":8},[972,2663,2664,2667,2669,2671,2673,2675,2678,2680,2682],{"class":974,"line":1241},[972,2665,2666],{"class":1302},"  if",[972,2668,1306],{"class":1155},[972,2670,1333],{"class":1176},[972,2672,1336],{"class":1176},[972,2674,1163],{"class":1162},[972,2676,2677],{"class":1278},"$AUTH_KEY",[972,2679,1173],{"class":1162},[972,2681,1319],{"class":1155},[972,2683,1322],{"class":1302},[972,2685,2686,2688,2690,2693],{"class":974,"line":1246},[972,2687,1374],{"class":1138},[972,2689,1163],{"class":1162},[972,2691,2692],{"class":1007},"Generating new auth age key pair...",[972,2694,1362],{"class":1162},[972,2696,2697,2700,2702,2704,2706,2708,2710,2712,2714,2717],{"class":974,"line":1254},[972,2698,2699],{"class":985},"    age-keygen",[972,2701,1540],{"class":1142},[972,2703,1163],{"class":1162},[972,2705,2677],{"class":1278},[972,2707,1173],{"class":1162},[972,2709,1224],{"class":1176},[972,2711,1227],{"class":985},[972,2713,1163],{"class":1162},[972,2715,2716],{"class":1007},"auth age-keygen failed",[972,2718,1362],{"class":1162},[972,2720,2721],{"class":974,"line":1262},[972,2722,2723],{"class":1302},"  else\n",[972,2725,2726,2728,2730,2733],{"class":974,"line":1270},[972,2727,1374],{"class":1138},[972,2729,1163],{"class":1162},[972,2731,2732],{"class":1007},"Using existing auth age key.",[972,2734,1362],{"class":1162},[972,2736,2737],{"class":974,"line":1275},[972,2738,2739],{"class":1302},"  fi\n",[972,2741,2742],{"class":974,"line":1294},[972,2743,992],{"emptyLinePlaceholder":8},[972,2745,2746,2749,2751],{"class":974,"line":1299},[972,2747,2748],{"class":1278},"  AUTH_CONFIG",[972,2750,1282],{"class":1176},[972,2752,2753],{"class":1162},"\"\"\n",[972,2755,2756,2758,2760,2762,2764,2766,2768,2771,2773,2775],{"class":974,"line":1325},[972,2757,2666],{"class":1302},[972,2759,1306],{"class":1155},[972,2761,1394],{"class":1176},[972,2763,1163],{"class":1162},[972,2765,2649],{"class":1007},[972,2767,2652],{"class":1278},[972,2769,2770],{"class":1007},"}\u002Fconfig.dev.json",[972,2772,1173],{"class":1162},[972,2774,1319],{"class":1155},[972,2776,1322],{"class":1302},[972,2778,2779,2782,2784,2786,2788,2790,2792],{"class":974,"line":1349},[972,2780,2781],{"class":1278},"    AUTH_CONFIG",[972,2783,1282],{"class":1176},[972,2785,1173],{"class":1162},[972,2787,2649],{"class":1007},[972,2789,2652],{"class":1278},[972,2791,2770],{"class":1007},[972,2793,1362],{"class":1162},[972,2795,2796,2798,2800,2803,2806],{"class":974,"line":1365},[972,2797,1374],{"class":1138},[972,2799,1163],{"class":1162},[972,2801,2802],{"class":1007},"Using auth dev config: ",[972,2804,2805],{"class":1278},"$AUTH_CONFIG",[972,2807,1362],{"class":1162},[972,2809,2810,2813,2815,2817,2819,2821,2823,2826,2828,2830],{"class":974,"line":1371},[972,2811,2812],{"class":1302},"  elif",[972,2814,1306],{"class":1155},[972,2816,1394],{"class":1176},[972,2818,1163],{"class":1162},[972,2820,2649],{"class":1007},[972,2822,2652],{"class":1278},[972,2824,2825],{"class":1007},"}\u002Fconfig.json",[972,2827,1173],{"class":1162},[972,2829,1319],{"class":1155},[972,2831,1322],{"class":1302},[972,2833,2834,2836,2838,2840,2842,2844,2846],{"class":974,"line":1386},[972,2835,2781],{"class":1278},[972,2837,1282],{"class":1176},[972,2839,1173],{"class":1162},[972,2841,2649],{"class":1007},[972,2843,2652],{"class":1278},[972,2845,2825],{"class":1007},[972,2847,1362],{"class":1162},[972,2849,2850,2852,2854,2857,2859],{"class":974,"line":1407},[972,2851,1374],{"class":1138},[972,2853,1163],{"class":1162},[972,2855,2856],{"class":1007},"Using auth config: ",[972,2858,2805],{"class":1278},[972,2860,1362],{"class":1162},[972,2862,2863],{"class":974,"line":1421},[972,2864,2739],{"class":1302},[972,2866,2867],{"class":974,"line":1435},[972,2868,992],{"emptyLinePlaceholder":8},[972,2870,2871,2874,2876,2878,2880,2882,2885],{"class":974,"line":1454},[972,2872,2873],{"class":1278},"  AUTH_CONFIG_AGE",[972,2875,1282],{"class":1176},[972,2877,1173],{"class":1162},[972,2879,2649],{"class":1007},[972,2881,2652],{"class":1278},[972,2883,2884],{"class":1007},"}\u002Fconfig.json.age",[972,2886,1362],{"class":1162},[972,2888,2889],{"class":974,"line":1467},[972,2890,992],{"emptyLinePlaceholder":8},[972,2892,2893,2895,2897,2899,2901,2903,2905,2907],{"class":974,"line":1479},[972,2894,2666],{"class":1302},[972,2896,1306],{"class":1155},[972,2898,1309],{"class":1176},[972,2900,1163],{"class":1162},[972,2902,2805],{"class":1278},[972,2904,1173],{"class":1162},[972,2906,1319],{"class":1155},[972,2908,1322],{"class":1302},[972,2910,2911,2914,2916,2918,2920,2922,2924,2926,2928,2930,2933,2935,2937,2939,2941,2944],{"class":974,"line":1485},[972,2912,2913],{"class":1278},"    AUTH_PUB",[972,2915,1282],{"class":1176},[972,2917,1173],{"class":1162},[972,2919,1615],{"class":1007},[972,2921,935],{"class":985},[972,2923,1561],{"class":1142},[972,2925,1163],{"class":1162},[972,2927,2677],{"class":1278},[972,2929,1173],{"class":1162},[972,2931,2932],{"class":1007},")",[972,2934,1173],{"class":1162},[972,2936,1224],{"class":1176},[972,2938,1227],{"class":985},[972,2940,1163],{"class":1162},[972,2942,2943],{"class":1007},"failed to derive auth public key",[972,2945,1362],{"class":1162},[972,2947,2948,2950,2952,2955,2957],{"class":974,"line":1498},[972,2949,1374],{"class":1138},[972,2951,1163],{"class":1162},[972,2953,2954],{"class":1007},"encrypt: ",[972,2956,2805],{"class":1278},[972,2958,1362],{"class":1162},[972,2960,2961,2964,2966,2968,2970,2972,2975,2977,2979,2981,2984,2986,2988,2990,2992,2994,2996,2998,3001,3003],{"class":974,"line":1504},[972,2962,2963],{"class":985},"    age",[972,2965,1604],{"class":1142},[972,2967,1607],{"class":1142},[972,2969,1610],{"class":1142},[972,2971,1163],{"class":1162},[972,2973,2974],{"class":1278},"$AUTH_PUB",[972,2976,1173],{"class":1162},[972,2978,1540],{"class":1142},[972,2980,1163],{"class":1162},[972,2982,2983],{"class":1278},"$AUTH_CONFIG_AGE",[972,2985,1173],{"class":1162},[972,2987,1163],{"class":1162},[972,2989,2805],{"class":1278},[972,2991,1173],{"class":1162},[972,2993,1224],{"class":1176},[972,2995,1227],{"class":985},[972,2997,1163],{"class":1162},[972,2999,3000],{"class":1007},"encrypt failed: ",[972,3002,2805],{"class":1278},[972,3004,1362],{"class":1162},[972,3006,3007],{"class":974,"line":1509},[972,3008,2723],{"class":1302},[972,3010,3011,3014,3016,3018,3020,3022,3025,3028,3030,3032,3035,3038],{"class":974,"line":1521},[972,3012,3013],{"class":1155},"    [ ",[972,3015,1394],{"class":1176},[972,3017,1163],{"class":1162},[972,3019,2983],{"class":1278},[972,3021,1173],{"class":1162},[972,3023,3024],{"class":1155}," ] ",[972,3026,3027],{"class":1176},"||",[972,3029,1227],{"class":985},[972,3031,1163],{"class":1162},[972,3033,3034],{"class":1007},"No auth config found: provide config.json or config.dev.json in ",[972,3036,3037],{"class":1278},"$AUTH_SECRETS_DIR",[972,3039,1362],{"class":1162},[972,3041,3042,3044,3046,3049,3051],{"class":974,"line":1535},[972,3043,1374],{"class":1138},[972,3045,1163],{"class":1162},[972,3047,3048],{"class":1007},"skip (using existing): ",[972,3050,2983],{"class":1278},[972,3052,1362],{"class":1162},[972,3054,3055],{"class":974,"line":1556},[972,3056,2739],{"class":1302},[972,3058,3059],{"class":974,"line":1582},[972,3060,992],{"emptyLinePlaceholder":8},[972,3062,3063,3065,3067,3070],{"class":974,"line":1587},[972,3064,1870],{"class":1138},[972,3066,1163],{"class":1162},[972,3068,3069],{"class":1007},"Auth config encryption complete.",[972,3071,1362],{"class":1162},[972,3073,3074],{"class":974,"line":1599},[972,3075,1291],{"class":1155},[972,3077,3078],{"class":974,"line":1648},[972,3079,992],{"emptyLinePlaceholder":8},[972,3081,3082,3084],{"class":974,"line":1653},[972,3083,2478],{"class":985},[972,3085,2623],{"class":1155},[972,3087,3088,3090,3092,3094,3096],{"class":974,"line":1665},[972,3089,2628],{"class":1278},[972,3091,1282],{"class":1176},[972,3093,1173],{"class":1162},[972,3095,2635],{"class":1007},[972,3097,1362],{"class":1162},[972,3099,3100,3102,3104,3106,3108,3110,3112],{"class":974,"line":1687},[972,3101,2642],{"class":1278},[972,3103,1282],{"class":1176},[972,3105,1173],{"class":1162},[972,3107,2649],{"class":1007},[972,3109,2652],{"class":1278},[972,3111,2655],{"class":1007},[972,3113,1362],{"class":1162},[972,3115,3116,3118,3120,3122,3124,3126,3128],{"class":974,"line":1692},[972,3117,2873],{"class":1278},[972,3119,1282],{"class":1176},[972,3121,1173],{"class":1162},[972,3123,2649],{"class":1007},[972,3125,2652],{"class":1278},[972,3127,2884],{"class":1007},[972,3129,1362],{"class":1162},[972,3131,3132],{"class":974,"line":1704},[972,3133,992],{"emptyLinePlaceholder":8},[972,3135,3136,3139,3141,3143,3145,3147,3149],{"class":974,"line":1730},[972,3137,3138],{"class":985},"  chmod",[972,3140,1806],{"class":1186},[972,3142,1163],{"class":1162},[972,3144,2677],{"class":1278},[972,3146,1173],{"class":1162},[972,3148,1224],{"class":1176},[972,3150,1813],{"class":1138},[972,3152,3153,3155,3158,3160,3162,3164,3166],{"class":974,"line":1757},[972,3154,3138],{"class":985},[972,3156,3157],{"class":1186}," 640",[972,3159,1163],{"class":1162},[972,3161,2983],{"class":1278},[972,3163,1173],{"class":1162},[972,3165,1224],{"class":1176},[972,3167,1813],{"class":1138},[972,3169,3170],{"class":974,"line":1762},[972,3171,992],{"emptyLinePlaceholder":8},[972,3173,3174,3177,3180,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205],{"class":974,"line":1796},[972,3175,3176],{"class":1302},"  for",[972,3178,3179],{"class":1278}," f",[972,3181,3182],{"class":1302}," in",[972,3184,1163],{"class":1162},[972,3186,2649],{"class":1007},[972,3188,2652],{"class":1278},[972,3190,2825],{"class":1007},[972,3192,1173],{"class":1162},[972,3194,1163],{"class":1162},[972,3196,2649],{"class":1007},[972,3198,2652],{"class":1278},[972,3200,2770],{"class":1007},[972,3202,1173],{"class":1162},[972,3204,1180],{"class":1155},[972,3206,3207],{"class":1302},"do\n",[972,3209,3210,3212,3214,3216,3218,3221,3223,3225],{"class":974,"line":1801},[972,3211,1328],{"class":1302},[972,3213,1306],{"class":1155},[972,3215,1394],{"class":1176},[972,3217,1163],{"class":1162},[972,3219,3220],{"class":1278},"$f",[972,3222,1173],{"class":1162},[972,3224,1319],{"class":1155},[972,3226,1322],{"class":1302},[972,3228,3229,3232,3234,3236,3238],{"class":974,"line":1816},[972,3230,3231],{"class":1302},"      case",[972,3233,1163],{"class":1162},[972,3235,3220],{"class":1278},[972,3237,1173],{"class":1162},[972,3239,3240],{"class":1302}," in\n",[972,3242,3243,3247,3251,3254,3256,3259,3261,3264,3266,3268],{"class":974,"line":1825},[972,3244,3246],{"class":3245},"swPt8","        *",[972,3248,3250],{"class":3249},"sIcdS","dev",[972,3252,3253],{"class":3245},"*",[972,3255,2932],{"class":1176},[972,3257,3258],{"class":1138}," echo",[972,3260,1163],{"class":1162},[972,3262,3263],{"class":1007},"Keeping dev config: ",[972,3265,3220],{"class":1278},[972,3267,1173],{"class":1162},[972,3269,3270],{"class":1155}," ;;\n",[972,3272,3273,3276,3279,3281,3283,3285,3287,3289,3291,3293,3296,3298,3300],{"class":974,"line":1830},[972,3274,3275],{"class":1176},"        *)",[972,3277,3278],{"class":985},"     rm",[972,3280,1336],{"class":1142},[972,3282,1163],{"class":1162},[972,3284,3220],{"class":1278},[972,3286,1173],{"class":1162},[972,3288,1180],{"class":1155},[972,3290,1159],{"class":1138},[972,3292,1163],{"class":1162},[972,3294,3295],{"class":1007},"Deleted sensitive auth config: ",[972,3297,3220],{"class":1278},[972,3299,1173],{"class":1162},[972,3301,3270],{"class":1155},[972,3303,3304],{"class":974,"line":1856},[972,3305,3306],{"class":1302},"      esac\n",[972,3308,3309],{"class":974,"line":1867},[972,3310,1368],{"class":1302},[972,3312,3313],{"class":974,"line":1880},[972,3314,3315],{"class":1302},"  done\n",[972,3317,3318],{"class":974,"line":1885},[972,3319,1291],{"class":1155},[894,3321,3323],{"id":3322},"usage-example","Usage example",[856,3325,3326,3327,3330],{},"Source the file in your main startup script and call both functions around your ",[874,3328,3329],{},"docker compose"," commands:",[962,3332,3335],{"className":964,"code":3333,"filename":3334,"language":967,"meta":968,"style":968},"#!\u002Fbin\u002Fsh\nset -eu\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\n\n. .\u002Fscripts\u002Fencrypt-auth.sh\n\nencrypt_auth_config\n\ndocker compose up --build -d || die \"docker compose failed\"\n\ncleanup_auth_secrets\n","scripts\u002Fstart.sh",[874,3336,3337,3341,3347,3351,3377,3381,3388,3392,3397,3401,3423,3427],{"__ignoreMap":968},[972,3338,3339],{"class":974,"line":975},[972,3340,1129],{"class":978},[972,3342,3343,3345],{"class":974,"line":982},[972,3344,1139],{"class":1138},[972,3346,1143],{"class":1142},[972,3348,3349],{"class":974,"line":989},[972,3350,992],{"emptyLinePlaceholder":8},[972,3352,3353,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373,3375],{"class":974,"line":995},[972,3354,1152],{"class":985},[972,3356,1156],{"class":1155},[972,3358,1159],{"class":1138},[972,3360,1163],{"class":1162},[972,3362,1166],{"class":1007},[972,3364,1170],{"class":1169},[972,3366,1173],{"class":1162},[972,3368,1177],{"class":1176},[972,3370,1180],{"class":1155},[972,3372,1183],{"class":1138},[972,3374,1187],{"class":1186},[972,3376,1190],{"class":1155},[972,3378,3379],{"class":974,"line":1001},[972,3380,992],{"emptyLinePlaceholder":8},[972,3382,3383,3385],{"class":974,"line":1193},[972,3384,1072],{"class":1138},[972,3386,3387],{"class":1007}," .\u002Fscripts\u002Fencrypt-auth.sh\n",[972,3389,3390],{"class":974,"line":1241},[972,3391,992],{"emptyLinePlaceholder":8},[972,3393,3394],{"class":974,"line":1246},[972,3395,3396],{"class":985},"encrypt_auth_config\n",[972,3398,3399],{"class":974,"line":1254},[972,3400,992],{"emptyLinePlaceholder":8},[972,3402,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421],{"class":974,"line":1262},[972,3404,1024],{"class":985},[972,3406,1767],{"class":1007},[972,3408,1770],{"class":1007},[972,3410,1773],{"class":1142},[972,3412,1776],{"class":1142},[972,3414,1224],{"class":1176},[972,3416,1227],{"class":985},[972,3418,1163],{"class":1162},[972,3420,1791],{"class":1007},[972,3422,1362],{"class":1162},[972,3424,3425],{"class":974,"line":1270},[972,3426,992],{"emptyLinePlaceholder":8},[972,3428,3429],{"class":974,"line":1275},[972,3430,3431],{"class":985},"cleanup_auth_secrets\n",[894,3433,3435],{"id":3434},"directory-layout","Directory layout",[856,3437,3438,3439,3442],{},"Place the IAM configuration and age key under ",[874,3440,3441],{},".\u002Fsecrets\u002Fauth\u002F"," in your project root:",[962,3444,3449],{"className":3445,"code":3447,"language":3448},[3446],"language-text","your-project\u002F\n  secrets\u002F\n    auth\u002F\n      config.dev.json \n      age_key           \n      config.json.age    \n  scripts\u002F\n    encrypt-auth.sh\n    start.sh\n  docker-compose.yml\n","text",[874,3450,3447],{"__ignoreMap":968},[856,3452,3453,3454,3459,3460,3465,3466,3468,3469,3471],{},"Your ",[860,3455,3458],{"href":3456,"rel":3457},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fhow-tos\u002Fproduction\u002F",[864],"Compose file"," mounts the age key and encrypted config as ",[860,3461,3464],{"href":3462,"rel":3463},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fhow-tos\u002Fuse-secrets\u002F",[864],"Docker secrets",". The secrets point to ",[874,3467,3441],{}," where ",[874,3470,2474],{}," writes its output:",[962,3473,3475],{"className":1915,"code":3474,"filename":1911,"language":1917,"meta":968,"style":968},"services:\n  mysql: \n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_ROOT_PASSWORD: secure_password\n      MYSQL_DATABASE: auth_db\n      MYSQL_USER: auth_user\n      MYSQL_PASSWORD: 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\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\n  app:\n    # Your app container\n    build: .\n    depends_on:\n      auth:\n        condition: service_healthy\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",[874,3476,3477,3483,3491,3499,3507,3513,3521,3529,3537,3545,3561,3573,3581,3591,3597,3603,3609,3633,3641,3651,3659,3667,3671,3677,3685,3695,3703,3719,3727,3735,3742,3749,3755,3761,3767,3773,3781,3787,3793,3799,3805,3815,3821,3827,3835,3839,3846,3851,3861,3867,3874,3882,3886,3892,3900,3906,3912,3916,3923,3930,3940,3947],{"__ignoreMap":968},[972,3478,3479,3481],{"class":974,"line":975},[972,3480,1925],{"class":1924},[972,3482,1928],{"class":1176},[972,3484,3485,3487,3489],{"class":974,"line":982},[972,3486,1933],{"class":1924},[972,3488,1936],{"class":1176},[972,3490,1939],{"class":1155},[972,3492,3493,3495,3497],{"class":974,"line":989},[972,3494,1944],{"class":1924},[972,3496,1936],{"class":1176},[972,3498,1950],{"class":1949},[972,3500,3501,3503,3505],{"class":974,"line":995},[972,3502,1955],{"class":1924},[972,3504,1936],{"class":1176},[972,3506,1960],{"class":1949},[972,3508,3509,3511],{"class":974,"line":1001},[972,3510,1965],{"class":1924},[972,3512,1928],{"class":1176},[972,3514,3515,3517,3519],{"class":974,"line":1193},[972,3516,1972],{"class":1924},[972,3518,1936],{"class":1176},[972,3520,1977],{"class":1949},[972,3522,3523,3525,3527],{"class":974,"line":1241},[972,3524,1982],{"class":1924},[972,3526,1936],{"class":1176},[972,3528,1987],{"class":1949},[972,3530,3531,3533,3535],{"class":974,"line":1246},[972,3532,1992],{"class":1924},[972,3534,1936],{"class":1176},[972,3536,1997],{"class":1949},[972,3538,3539,3541,3543],{"class":974,"line":1254},[972,3540,2002],{"class":1924},[972,3542,1936],{"class":1176},[972,3544,1977],{"class":1949},[972,3546,3547,3549,3551,3553,3555,3557,3559],{"class":974,"line":1262},[972,3548,2011],{"class":1924},[972,3550,1936],{"class":1176},[972,3552,2016],{"class":1155},[972,3554,1173],{"class":1162},[972,3556,2021],{"class":1007},[972,3558,1173],{"class":1162},[972,3560,2026],{"class":1155},[972,3562,3563,3565,3567,3569,3571],{"class":974,"line":1270},[972,3564,2031],{"class":1924},[972,3566,1936],{"class":1176},[972,3568,1163],{"class":1162},[972,3570,2038],{"class":1007},[972,3572,1362],{"class":1162},[972,3574,3575,3577,3579],{"class":974,"line":1275},[972,3576,2045],{"class":1924},[972,3578,1936],{"class":1176},[972,3580,1939],{"class":1155},[972,3582,3583,3585,3587,3589],{"class":974,"line":1294},[972,3584,2054],{"class":1176},[972,3586,1163],{"class":1162},[972,3588,2059],{"class":1007},[972,3590,1362],{"class":1162},[972,3592,3593,3595],{"class":974,"line":1299},[972,3594,2066],{"class":1924},[972,3596,1928],{"class":1176},[972,3598,3599,3601],{"class":974,"line":1325},[972,3600,2054],{"class":1176},[972,3602,2075],{"class":1949},[972,3604,3605,3607],{"class":974,"line":1349},[972,3606,2080],{"class":1924},[972,3608,1928],{"class":1176},[972,3610,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629,3631],{"class":974,"line":1365},[972,3612,2087],{"class":1924},[972,3614,1936],{"class":1176},[972,3616,2016],{"class":1155},[972,3618,1173],{"class":1162},[972,3620,2096],{"class":1007},[972,3622,1173],{"class":1162},[972,3624,1018],{"class":1155},[972,3626,1173],{"class":1162},[972,3628,2105],{"class":1007},[972,3630,1173],{"class":1162},[972,3632,2026],{"class":1155},[972,3634,3635,3637,3639],{"class":974,"line":1371},[972,3636,2114],{"class":1924},[972,3638,1936],{"class":1176},[972,3640,2119],{"class":1949},[972,3642,3643,3645,3647,3649],{"class":974,"line":1386},[972,3644,2124],{"class":1924},[972,3646,1936],{"class":1176},[972,3648,2129],{"class":1949},[972,3650,1939],{"class":1155},[972,3652,3653,3655,3657],{"class":974,"line":1407},[972,3654,2136],{"class":1924},[972,3656,1936],{"class":1176},[972,3658,2141],{"class":1186},[972,3660,3661,3663,3665],{"class":974,"line":1421},[972,3662,2146],{"class":1924},[972,3664,1936],{"class":1176},[972,3666,2151],{"class":1949},[972,3668,3669],{"class":974,"line":1435},[972,3670,992],{"emptyLinePlaceholder":8},[972,3672,3673,3675],{"class":974,"line":1454},[972,3674,2160],{"class":1924},[972,3676,1928],{"class":1176},[972,3678,3679,3681,3683],{"class":974,"line":1467},[972,3680,1944],{"class":1924},[972,3682,1936],{"class":1176},[972,3684,2171],{"class":1949},[972,3686,3687,3689,3691,3693],{"class":974,"line":1479},[972,3688,2176],{"class":1924},[972,3690,1936],{"class":1176},[972,3692,2181],{"class":1142},[972,3694,2184],{"class":1155},[972,3696,3697,3699,3701],{"class":974,"line":1485},[972,3698,1955],{"class":1924},[972,3700,1936],{"class":1176},[972,3702,1960],{"class":1949},[972,3704,3705,3707,3709,3711,3713,3715,3717],{"class":974,"line":1498},[972,3706,2011],{"class":1924},[972,3708,1936],{"class":1176},[972,3710,2016],{"class":1155},[972,3712,1173],{"class":1162},[972,3714,2021],{"class":1007},[972,3716,1173],{"class":1162},[972,3718,2026],{"class":1155},[972,3720,3721,3723,3725],{"class":974,"line":1504},[972,3722,2031],{"class":1924},[972,3724,1936],{"class":1176},[972,3726,2217],{"class":1949},[972,3728,3729,3731,3733],{"class":974,"line":1509},[972,3730,2066],{"class":1924},[972,3732,1936],{"class":1176},[972,3734,1939],{"class":1155},[972,3736,3737,3739],{"class":974,"line":1521},[972,3738,2054],{"class":1176},[972,3740,3741],{"class":1949}," .\u002Fauth-logs\u002Fserver:\u002Fapp\u002Fauth-logs:rw\n",[972,3743,3744,3746],{"class":974,"line":1535},[972,3745,2054],{"class":1176},[972,3747,3748],{"class":1949}," .\u002Fauth-logs\u002Fserver\u002Fbot-detector:\u002Fapp\u002Fbot-detector-logs:rw\n",[972,3750,3751,3753],{"class":974,"line":1556},[972,3752,2054],{"class":1176},[972,3754,2246],{"class":1949},[972,3756,3757,3759],{"class":974,"line":1582},[972,3758,2054],{"class":1176},[972,3760,2253],{"class":1949},[972,3762,3763,3765],{"class":974,"line":1587},[972,3764,2258],{"class":1924},[972,3766,1928],{"class":1176},[972,3768,3769,3771],{"class":974,"line":1599},[972,3770,2054],{"class":1176},[972,3772,2267],{"class":1949},[972,3774,3775,3777,3779],{"class":974,"line":1648},[972,3776,2272],{"class":1924},[972,3778,1936],{"class":1176},[972,3780,2277],{"class":1186},[972,3782,3783,3785],{"class":974,"line":1653},[972,3784,2300],{"class":1924},[972,3786,1928],{"class":1176},[972,3788,3789,3791],{"class":974,"line":1665},[972,3790,2054],{"class":1176},[972,3792,2309],{"class":1949},[972,3794,3795,3797],{"class":974,"line":1687},[972,3796,2054],{"class":1176},[972,3798,2316],{"class":1949},[972,3800,3801,3803],{"class":974,"line":1692},[972,3802,2045],{"class":1924},[972,3804,1928],{"class":1176},[972,3806,3807,3809,3811,3813],{"class":974,"line":1704},[972,3808,2054],{"class":1176},[972,3810,1163],{"class":1162},[972,3812,2059],{"class":1007},[972,3814,1362],{"class":1162},[972,3816,3817,3819],{"class":974,"line":1730},[972,3818,2337],{"class":1924},[972,3820,1928],{"class":1176},[972,3822,3823,3825],{"class":974,"line":1757},[972,3824,2344],{"class":1924},[972,3826,1928],{"class":1176},[972,3828,3829,3831,3833],{"class":974,"line":1762},[972,3830,2351],{"class":1924},[972,3832,1936],{"class":1176},[972,3834,2356],{"class":1949},[972,3836,3837],{"class":974,"line":1796},[972,3838,992],{"emptyLinePlaceholder":8},[972,3840,3841,3844],{"class":974,"line":1801},[972,3842,3843],{"class":1924},"  app",[972,3845,1928],{"class":1176},[972,3847,3848],{"class":974,"line":1816},[972,3849,3850],{"class":978},"    # Your app container\n",[972,3852,3853,3856,3858],{"class":974,"line":1825},[972,3854,3855],{"class":1924},"    build",[972,3857,1936],{"class":1176},[972,3859,3860],{"class":1186}," .\n",[972,3862,3863,3865],{"class":974,"line":1830},[972,3864,2337],{"class":1924},[972,3866,1928],{"class":1176},[972,3868,3869,3872],{"class":974,"line":1856},[972,3870,3871],{"class":1924},"      auth",[972,3873,1928],{"class":1176},[972,3875,3876,3878,3880],{"class":974,"line":1867},[972,3877,2351],{"class":1924},[972,3879,1936],{"class":1176},[972,3881,2356],{"class":1949},[972,3883,3884],{"class":974,"line":1880},[972,3885,992],{"emptyLinePlaceholder":8},[972,3887,3888,3890],{"class":974,"line":1885},[972,3889,2365],{"class":1924},[972,3891,1928],{"class":1176},[972,3893,3894,3896,3898],{"class":974,"line":1899},[972,3895,2372],{"class":1924},[972,3897,1936],{"class":1176},[972,3899,2184],{"class":1155},[972,3901,3902,3904],{"class":974,"line":2411},[972,3903,2381],{"class":1924},[972,3905,1928],{"class":1176},[972,3907,3908,3910],{"class":974,"line":2422},[972,3909,2388],{"class":1924},[972,3911,1928],{"class":1176},[972,3913,3914],{"class":974,"line":2430},[972,3915,992],{"emptyLinePlaceholder":8},[972,3917,3919,3921],{"class":974,"line":3918},58,[972,3920,2399],{"class":1924},[972,3922,1928],{"class":1176},[972,3924,3926,3928],{"class":974,"line":3925},59,[972,3927,2406],{"class":1924},[972,3929,1928],{"class":1176},[972,3931,3933,3935,3937],{"class":974,"line":3932},60,[972,3934,2414],{"class":1924},[972,3936,1936],{"class":1176},[972,3938,3939],{"class":1949}," .\u002Fsecrets\u002Fauth\u002Fage_key\n",[972,3941,3943,3945],{"class":974,"line":3942},61,[972,3944,2425],{"class":1924},[972,3946,1928],{"class":1176},[972,3948,3950,3952,3954],{"class":974,"line":3949},62,[972,3951,2414],{"class":1924},[972,3953,1936],{"class":1176},[972,3955,3956],{"class":1949}," .\u002Fsecrets\u002Fauth\u002Fconfig.json.age\n",[3958,3959,3960],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html .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 .sqc-S, html code.shiki .sqc-S{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#8BE9FD}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}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}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .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 .sWkX1, html code.shiki .sWkX1{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#BD93F9}html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}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 .swPt8, html code.shiki .swPt8{--shiki-light:#000000;--shiki-light-font-style:inherit;--shiki-default:#000000;--shiki-default-font-style:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-style:italic}html pre.shiki code .sIcdS, html code.shiki .sIcdS{--shiki-light:#811F3F;--shiki-default:#811F3F;--shiki-dark:#F1FA8C}",{"title":968,"searchDepth":982,"depth":982,"links":3962},[3963,3970],{"id":884,"depth":982,"text":885,"children":3964},[3965,3966,3967,3968,3969],{"id":896,"depth":989,"text":897},{"id":959,"depth":989,"text":960},{"id":1011,"depth":989,"text":1012},{"id":1118,"depth":989,"text":1119},{"id":1904,"depth":989,"text":1905},{"id":2460,"depth":982,"text":2461,"children":3971},[3972,3974,3975,3976,3977],{"id":2493,"depth":989,"text":3973},"How it differs from start.sh",{"id":2478,"depth":989,"text":2478},{"id":2601,"depth":989,"text":1119},{"id":3322,"depth":989,"text":3323},{"id":3434,"depth":989,"text":3435},"Template shell scripts for encrypting configuration, launching the IAM service container, and cleaning up sensitive files after deployment.","md","i-lucide-terminal",{},null,"---\ntitle: Operation Scripts\ndescription: Template shell scripts for encrypting configuration, launching the IAM service container, and cleaning up sensitive files after deployment.\nicon: i-lucide-terminal\n---\n\nThe IAM service Docker image does not include startup or encryption scripts. These are template scripts you copy into your project and adapt to your deployment workflow. They handle [age](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage) key generation, configuration encryption, container orchestration, and post-launch cleanup.\n\n::note\nThese scripts are not part of the `@riavzon\u002Fauth` npm package. Copy them into your project and adjust paths to match your directory structure.\n::\n\n---\n\n## Standalone deployment\n\nUse `start.sh` when the IAM service is the only container you need to deploy. The script handles everything in a single command: dependency verification, key generation, config encryption, container launch, and post-launch cleanup.\n\n### Prerequisites\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\n### Usage\n\n```bash [Terminal]\n# Auto-detects config.dev.json or config.json\n.\u002Fstart.sh\n\n# Specify a config file explicitly\n.\u002Fstart.sh \u002Fpath\u002Fto\u002Fmy-config.json\n```\n\n### How it works\n\nThe script starts by checking that `age`, `age-keygen`, and `docker` are available on the host. If any dependency is missing, it exits immediately with an error message.\n\nNext it resolves the configuration file. You can pass a file path as an argument, otherwise the script looks for `config.dev.json` first, then falls back to `config.json`. If no configuration file is found at all, it exits.\n\nThe script generates a fresh [age](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fage) keypair on every run. It removes any existing `age_key` and `public_key` files, generates new ones with `age-keygen`, and uses the public key to encrypt the resolved configuration into `config.json.age`. This encrypted file is the only form of configuration that enters the container.\n\nAfter encryption, it temporarily widens the `age_key` permissions to `750` so Docker can read it during container startup, creates the log directories, and launches the container with `docker compose up --build -d --force-recreate auth`.\n\n::tip\nRemove `auth` from `docker compose up --build -d --force-recreate auth` to start the whole compose file\n::\n\nOnce the container is running, the script tightens `age_key` back to `600`, deletes the `public_key`, and if the original config file was `config.json`, deletes it from the host. Development config files are kept for convenience.\n\n::caution\nThe script deletes `config.json` after a successful launch. the only way to restore it, is by decrypting `config.json.age` with your new `age_key`.\n::\n\n### Script\n\n```bash [start.sh]\n#!\u002Fbin\u002Fsh\n\nset -eu\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\nneed() { command -v \"$1\" >\u002Fdev\u002Fnull 2>&1 || die \"Missing dependency: $1\"; }\n\nneed age\nneed age-keygen\nneed docker\n\nCONFIG_FILE=${1:-}\n\nif [ -n \"$CONFIG_FILE\" ]; then\n    if [ ! -f \"$CONFIG_FILE\" ]; then\n        die \"Config file not found: $CONFIG_FILE\"\n    fi\n    echo \"Using provided config: $CONFIG_FILE\"\nelif [ -f \"config.dev.json\" ]; then\n    CONFIG_FILE=\"config.dev.json\"\n    echo \"Using dev config: $CONFIG_FILE\"\nelif [ -f \"config.json\" ]; then\n    CONFIG_FILE=\"config.json\"\n    echo \"Using default config.json\"\nelse\n    die \"Missing config.json (or config.dev.json) in project root.\"\nfi\n\necho \"generating secrets...\"\nrm -f age_key public_key\nage-keygen -o age_key || die \"age-keygen failed\"\nage-keygen -y age_key > public_key || die \"failed to derive public key\"\n\necho \"encrypting config...\"\nage -a -e -r \"$(cat public_key)\" -o config.json.age \"$CONFIG_FILE\" || die \"encryption failed\"\n\necho \"changing permissions...\"\nchmod 750 age_key || die \"chmod age_key failed\"\n\necho \"starting docker service...\"\nmkdir -p app-logs detector-logs || die \"mkdir logs failed\"\nchmod 777 age_key .\u002Fapp-logs .\u002Fdetector-logs || die \"chmod logs failed\"\n\ndocker compose up --build -d --force-recreate auth || die \"docker compose failed\"\n\nchmod 600 age_key || true\nrm -f public_key\n\nif [ \"$CONFIG_FILE\" = \"config.json\" ]; then\n  rm -f config.json\n  echo \"Deleted sensitive config.json\"\nelse\n  echo \"Keeping config file: $CONFIG_FILE\"\nfi\n```\n\n### Docker Compose\n\nThe script expects a `docker-compose.yml` in the same directory. Here is a minimal example with MySQL and the IAM service using age-encrypted secrets:\n\n```yaml [docker-compose.yml]\nservices:\n  mysql: \n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_ROOT_PASSWORD: secure_password\n      MYSQL_DATABASE: auth_db\n      MYSQL_USER: auth_user\n      MYSQL_PASSWORD: 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\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      - .\u002Fapp-logs:\u002Fapp\u002Fauth-logs:rw\n      - .\u002Fdetector-logs:\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    ports:\n      - \"10000:10000\"\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\nvolumes:\n  sql_db:  \n  bot-detector-data:\n  email-data:\n\nsecrets:\n  age_key:\n    file: .\u002Fage_key\n  encrypted_config:\n    file: .\u002Fconfig.json.age\n```\n\nThe `age_key` and `config.json.age` files are created by `start.sh` before it runs `docker compose up`. See the [Getting Started](\u002Fdocs\u002Fiam\u002Fgetting-started) guide for a full walkthrough of each volume and secret.\n\n---\n\n## Multi-service deployment\n\nWhen the IAM service runs alongside your application in a shared [Docker Compose](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F) stack, you do not use `start.sh` directly. Instead, you source two shell functions into your own startup script: `encrypt_auth_config` for the encryption step, and `cleanup_auth_secrets` for post-launch cleanup.\n\nSave the script below as `scripts\u002Fencrypt-auth.sh` in your project. Your main startup script sources it with `. .\u002Fscripts\u002Fencrypt-auth.sh` and calls the functions at the right points in your flow.\n\n### How it differs from `start.sh`\n\n| Behavior | `start.sh` | `encrypt_auth_config` |\n|----------|------------|----------------------|\n| Key generation | Fresh keypair on every run | Reuses existing key if present |\n| Missing config | Exits with error | Falls back to existing `config.json.age` |\n| Container launch | Runs `docker compose up` | Does not launch anything |\n| Cleanup | Built into the same script | Separate `cleanup_auth_secrets` function |\n\nThe key reuse behavior makes `encrypt_auth_config` safe to call on every deploy without rotating the keypair. If a config file is present, it encrypts it. If only a previously encrypted `config.json.age` exists, it skips encryption and uses what is already there. This is useful in CI pipelines where the age key and encrypted config may be pre-provisioned.\n\n### `cleanup_auth_secrets`\n\nAfter your containers are running, call `cleanup_auth_secrets`. It tightens the age key to `600` (owner read\u002Fwrite), sets the encrypted config to `640`, and deletes any production `config.json` from the secrets directory. Development configs (`config.dev.json`) are kept.\n\n### Script\n\n```bash [scripts\u002Fencrypt-auth.sh]\nset -eu\n\nencrypt_auth_config() {\n  AUTH_SECRETS_DIR=\".\u002Fsecrets\u002Fauth\"\n  AUTH_KEY=\"${AUTH_SECRETS_DIR}\u002Fage_key\"\n\n  if [ ! -f \"$AUTH_KEY\" ]; then\n    echo \"Generating new auth age key pair...\"\n    age-keygen -o \"$AUTH_KEY\" || die \"auth age-keygen failed\"\n  else\n    echo \"Using existing auth age key.\"\n  fi\n\n  AUTH_CONFIG=\"\"\n  if [ -f \"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\" ]; then\n    AUTH_CONFIG=\"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\"\n    echo \"Using auth dev config: $AUTH_CONFIG\"\n  elif [ -f \"${AUTH_SECRETS_DIR}\u002Fconfig.json\" ]; then\n    AUTH_CONFIG=\"${AUTH_SECRETS_DIR}\u002Fconfig.json\"\n    echo \"Using auth config: $AUTH_CONFIG\"\n  fi\n\n  AUTH_CONFIG_AGE=\"${AUTH_SECRETS_DIR}\u002Fconfig.json.age\"\n\n  if [ -n \"$AUTH_CONFIG\" ]; then\n    AUTH_PUB=\"$(age-keygen -y \"$AUTH_KEY\")\" || die \"failed to derive auth public key\"\n    echo \"encrypt: $AUTH_CONFIG\"\n    age -a -e -r \"$AUTH_PUB\" -o \"$AUTH_CONFIG_AGE\" \"$AUTH_CONFIG\" || die \"encrypt failed: $AUTH_CONFIG\"\n  else\n    [ -f \"$AUTH_CONFIG_AGE\" ] || die \"No auth config found: provide config.json or config.dev.json in $AUTH_SECRETS_DIR\"\n    echo \"skip (using existing): $AUTH_CONFIG_AGE\"\n  fi\n\n  echo \"Auth config encryption complete.\"\n}\n\ncleanup_auth_secrets() {\n  AUTH_SECRETS_DIR=\".\u002Fsecrets\u002Fauth\"\n  AUTH_KEY=\"${AUTH_SECRETS_DIR}\u002Fage_key\"\n  AUTH_CONFIG_AGE=\"${AUTH_SECRETS_DIR}\u002Fconfig.json.age\"\n\n  chmod 600 \"$AUTH_KEY\" || true\n  chmod 640 \"$AUTH_CONFIG_AGE\" || true\n\n  for f in \"${AUTH_SECRETS_DIR}\u002Fconfig.json\" \"${AUTH_SECRETS_DIR}\u002Fconfig.dev.json\"; do\n    if [ -f \"$f\" ]; then\n      case \"$f\" in\n        *dev*) echo \"Keeping dev config: $f\" ;;\n        *)     rm -f \"$f\"; echo \"Deleted sensitive auth config: $f\" ;;\n      esac\n    fi\n  done\n}\n```\n\n### Usage example\n\nSource the file in your main startup script and call both functions around your `docker compose` commands:\n\n```bash [scripts\u002Fstart.sh]\n#!\u002Fbin\u002Fsh\nset -eu\n\ndie() { echo \"Error: $*\" >&2; exit 1; }\n\n. .\u002Fscripts\u002Fencrypt-auth.sh\n\nencrypt_auth_config\n\ndocker compose up --build -d || die \"docker compose failed\"\n\ncleanup_auth_secrets\n```\n\n### Directory layout\n\nPlace the IAM configuration and age key under `.\u002Fsecrets\u002Fauth\u002F` in your project root:\n\n```\nyour-project\u002F\n  secrets\u002F\n    auth\u002F\n      config.dev.json \n      age_key           \n      config.json.age    \n  scripts\u002F\n    encrypt-auth.sh\n    start.sh\n  docker-compose.yml\n```\n\nYour [Compose file](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fhow-tos\u002Fproduction\u002F) mounts the age key and encrypted config as [Docker secrets](https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fhow-tos\u002Fuse-secrets\u002F). The secrets point to `.\u002Fsecrets\u002Fauth\u002F` where `encrypt_auth_config` writes its output:\n\n```yaml [docker-compose.yml]\nservices:\n  mysql: \n    image: mysql:8\n    restart: unless-stopped\n    environment:\n      MYSQL_ROOT_PASSWORD: secure_password\n      MYSQL_DATABASE: auth_db\n      MYSQL_USER: auth_user\n      MYSQL_PASSWORD: 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\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\n  app:\n    # Your app container\n    build: .\n    depends_on:\n      auth:\n        condition: service_healthy\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```",{"title":229,"description":3978},"Ua94bfnV6ZdNja3lzbYppgIQ4pIMhZ6O4IEQO4CBZcE",[3987,3988],{"title":225,"path":226,"stem":227,"children":-1},{"title":233,"path":234,"stem":235,"children":-1},{"id":851,"title":229,"body":3990,"description":3978,"extension":3979,"icon":3980,"meta":6602,"module":3982,"navigation":8,"path":230,"rawbody":3983,"seo":6603,"stem":231,"__hash__":3985},{"type":853,"value":3991,"toc":6586},[3992,3997,4003,4005,4007,4011,4013,4055,4057,4083,4085,4093,4099,4112,4120,4128,4138,4148,4150,4768,4770,4774,5218,5230,5232,5234,5245,5251,5255,5311,5317,5321,5333,5335,5989,5991,5995,6091,6093,6097,6102,6114,6584],[856,3993,858,3994,866],{},[860,3995,865],{"href":862,"rel":3996},[864],[868,3998,3999],{},[856,4000,872,4001,877],{},[874,4002,876],{},[879,4004],{},[882,4006,885],{"id":884},[856,4008,888,4009,892],{},[874,4010,891],{},[894,4012,897],{"id":896},[899,4014,4015,4023],{},[902,4016,4017],{},[905,4018,4019,4021],{},[908,4020,910],{},[908,4022,913],{},[915,4024,4025,4034,4043],{},[905,4026,4027,4032],{},[920,4028,4029],{},[860,4030,865],{"href":862,"rel":4031},[864],[920,4033,927],{},[905,4035,4036,4041],{},[920,4037,4038],{},[860,4039,935],{"href":862,"rel":4040},[864],[920,4042,938],{},[905,4044,4045,4053],{},[920,4046,4047,948,4050],{},[860,4048,947],{"href":945,"rel":4049},[864],[860,4051,953],{"href":951,"rel":4052},[864],[920,4054,956],{},[894,4056,960],{"id":959},[962,4058,4059],{"className":964,"code":965,"filename":966,"language":967,"meta":968,"style":968},[874,4060,4061,4065,4069,4073,4077],{"__ignoreMap":968},[972,4062,4063],{"class":974,"line":975},[972,4064,979],{"class":978},[972,4066,4067],{"class":974,"line":982},[972,4068,986],{"class":985},[972,4070,4071],{"class":974,"line":989},[972,4072,992],{"emptyLinePlaceholder":8},[972,4074,4075],{"class":974,"line":995},[972,4076,998],{"class":978},[972,4078,4079,4081],{"class":974,"line":1001},[972,4080,1004],{"class":985},[972,4082,1008],{"class":1007},[894,4084,1012],{"id":1011},[856,4086,1015,4087,1018,4089,1021,4091,1025],{},[874,4088,865],{},[874,4090,935],{},[874,4092,1024],{},[856,4094,1028,4095,1032,4097,1036],{},[874,4096,1031],{},[874,4098,1035],{},[856,4100,1039,4101,1043,4104,1047,4106,1051,4108,1054,4110,1058],{},[860,4102,865],{"href":862,"rel":4103},[864],[874,4105,1046],{},[874,4107,1050],{},[874,4109,935],{},[874,4111,1057],{},[856,4113,1061,4114,1064,4116,1068,4118,1072],{},[874,4115,1046],{},[874,4117,1067],{},[874,4119,1071],{},[1074,4121,4122],{},[856,4123,1078,4124,1082,4126,1085],{},[874,4125,1081],{},[874,4127,1071],{},[856,4129,1088,4130,1091,4132,1095,4134,1098,4136,1101],{},[874,4131,1046],{},[874,4133,1094],{},[874,4135,1050],{},[874,4137,1035],{},[1103,4139,4140],{},[856,4141,1107,4142,1110,4144,1113,4146,1072],{},[874,4143,1035],{},[874,4145,1057],{},[874,4147,1046],{},[894,4149,1119],{"id":1118},[962,4151,4152],{"className":964,"code":1122,"filename":891,"language":967,"meta":968,"style":968},[874,4153,4154,4158,4162,4168,4172,4198,4234,4238,4244,4250,4256,4260,4272,4276,4294,4314,4326,4330,4342,4360,4372,4384,4402,4414,4424,4428,4438,4442,4446,4456,4466,4484,4506,4510,4520,4560,4564,4574,4592,4596,4606,4626,4648,4652,4678,4682,4694,4702,4706,4730,4738,4748,4752,4764],{"__ignoreMap":968},[972,4155,4156],{"class":974,"line":975},[972,4157,1129],{"class":978},[972,4159,4160],{"class":974,"line":982},[972,4161,992],{"emptyLinePlaceholder":8},[972,4163,4164,4166],{"class":974,"line":989},[972,4165,1139],{"class":1138},[972,4167,1143],{"class":1142},[972,4169,4170],{"class":974,"line":995},[972,4171,992],{"emptyLinePlaceholder":8},[972,4173,4174,4176,4178,4180,4182,4184,4186,4188,4190,4192,4194,4196],{"class":974,"line":1001},[972,4175,1152],{"class":985},[972,4177,1156],{"class":1155},[972,4179,1159],{"class":1138},[972,4181,1163],{"class":1162},[972,4183,1166],{"class":1007},[972,4185,1170],{"class":1169},[972,4187,1173],{"class":1162},[972,4189,1177],{"class":1176},[972,4191,1180],{"class":1155},[972,4193,1183],{"class":1138},[972,4195,1187],{"class":1186},[972,4197,1190],{"class":1155},[972,4199,4200,4202,4204,4206,4208,4210,4212,4214,4216,4218,4220,4222,4224,4226,4228,4230,4232],{"class":974,"line":1193},[972,4201,1196],{"class":985},[972,4203,1156],{"class":1155},[972,4205,1201],{"class":1138},[972,4207,1204],{"class":1142},[972,4209,1163],{"class":1162},[972,4211,1210],{"class":1209},[972,4213,1173],{"class":1162},[972,4215,1215],{"class":1176},[972,4217,1218],{"class":1007},[972,4219,1221],{"class":1176},[972,4221,1224],{"class":1176},[972,4223,1227],{"class":985},[972,4225,1163],{"class":1162},[972,4227,1232],{"class":1007},[972,4229,1210],{"class":1209},[972,4231,1173],{"class":1162},[972,4233,1190],{"class":1155},[972,4235,4236],{"class":974,"line":1241},[972,4237,992],{"emptyLinePlaceholder":8},[972,4239,4240,4242],{"class":974,"line":1246},[972,4241,1196],{"class":985},[972,4243,1251],{"class":1007},[972,4245,4246,4248],{"class":974,"line":1254},[972,4247,1196],{"class":985},[972,4249,1259],{"class":1007},[972,4251,4252,4254],{"class":974,"line":1262},[972,4253,1196],{"class":985},[972,4255,1267],{"class":1007},[972,4257,4258],{"class":974,"line":1270},[972,4259,992],{"emptyLinePlaceholder":8},[972,4261,4262,4264,4266,4268,4270],{"class":974,"line":1275},[972,4263,1279],{"class":1278},[972,4265,1282],{"class":1176},[972,4267,1285],{"class":1209},[972,4269,1288],{"class":1176},[972,4271,1291],{"class":1209},[972,4273,4274],{"class":974,"line":1294},[972,4275,992],{"emptyLinePlaceholder":8},[972,4277,4278,4280,4282,4284,4286,4288,4290,4292],{"class":974,"line":1299},[972,4279,1303],{"class":1302},[972,4281,1306],{"class":1155},[972,4283,1309],{"class":1176},[972,4285,1163],{"class":1162},[972,4287,1314],{"class":1278},[972,4289,1173],{"class":1162},[972,4291,1319],{"class":1155},[972,4293,1322],{"class":1302},[972,4295,4296,4298,4300,4302,4304,4306,4308,4310,4312],{"class":974,"line":1325},[972,4297,1328],{"class":1302},[972,4299,1306],{"class":1155},[972,4301,1333],{"class":1176},[972,4303,1336],{"class":1176},[972,4305,1163],{"class":1162},[972,4307,1314],{"class":1278},[972,4309,1173],{"class":1162},[972,4311,1319],{"class":1155},[972,4313,1322],{"class":1302},[972,4315,4316,4318,4320,4322,4324],{"class":974,"line":1349},[972,4317,1352],{"class":985},[972,4319,1163],{"class":1162},[972,4321,1357],{"class":1007},[972,4323,1314],{"class":1278},[972,4325,1362],{"class":1162},[972,4327,4328],{"class":974,"line":1365},[972,4329,1368],{"class":1302},[972,4331,4332,4334,4336,4338,4340],{"class":974,"line":1371},[972,4333,1374],{"class":1138},[972,4335,1163],{"class":1162},[972,4337,1379],{"class":1007},[972,4339,1314],{"class":1278},[972,4341,1362],{"class":1162},[972,4343,4344,4346,4348,4350,4352,4354,4356,4358],{"class":974,"line":1386},[972,4345,1389],{"class":1302},[972,4347,1306],{"class":1155},[972,4349,1394],{"class":1176},[972,4351,1163],{"class":1162},[972,4353,1031],{"class":1007},[972,4355,1173],{"class":1162},[972,4357,1319],{"class":1155},[972,4359,1322],{"class":1302},[972,4361,4362,4364,4366,4368,4370],{"class":974,"line":1407},[972,4363,1410],{"class":1278},[972,4365,1282],{"class":1176},[972,4367,1173],{"class":1162},[972,4369,1031],{"class":1007},[972,4371,1362],{"class":1162},[972,4373,4374,4376,4378,4380,4382],{"class":974,"line":1421},[972,4375,1374],{"class":1138},[972,4377,1163],{"class":1162},[972,4379,1428],{"class":1007},[972,4381,1314],{"class":1278},[972,4383,1362],{"class":1162},[972,4385,4386,4388,4390,4392,4394,4396,4398,4400],{"class":974,"line":1435},[972,4387,1389],{"class":1302},[972,4389,1306],{"class":1155},[972,4391,1394],{"class":1176},[972,4393,1163],{"class":1162},[972,4395,1035],{"class":1007},[972,4397,1173],{"class":1162},[972,4399,1319],{"class":1155},[972,4401,1322],{"class":1302},[972,4403,4404,4406,4408,4410,4412],{"class":974,"line":1454},[972,4405,1410],{"class":1278},[972,4407,1282],{"class":1176},[972,4409,1173],{"class":1162},[972,4411,1035],{"class":1007},[972,4413,1362],{"class":1162},[972,4415,4416,4418,4420,4422],{"class":974,"line":1467},[972,4417,1374],{"class":1138},[972,4419,1163],{"class":1162},[972,4421,1474],{"class":1007},[972,4423,1362],{"class":1162},[972,4425,4426],{"class":974,"line":1479},[972,4427,1482],{"class":1302},[972,4429,4430,4432,4434,4436],{"class":974,"line":1485},[972,4431,1488],{"class":985},[972,4433,1163],{"class":1162},[972,4435,1493],{"class":1007},[972,4437,1362],{"class":1162},[972,4439,4440],{"class":974,"line":1498},[972,4441,1501],{"class":1302},[972,4443,4444],{"class":974,"line":1504},[972,4445,992],{"emptyLinePlaceholder":8},[972,4447,4448,4450,4452,4454],{"class":974,"line":1509},[972,4449,1159],{"class":1138},[972,4451,1163],{"class":1162},[972,4453,1516],{"class":1007},[972,4455,1362],{"class":1162},[972,4457,4458,4460,4462,4464],{"class":974,"line":1521},[972,4459,1524],{"class":985},[972,4461,1336],{"class":1142},[972,4463,1529],{"class":1007},[972,4465,1532],{"class":1007},[972,4467,4468,4470,4472,4474,4476,4478,4480,4482],{"class":974,"line":1535},[972,4469,935],{"class":985},[972,4471,1540],{"class":1142},[972,4473,1529],{"class":1007},[972,4475,1224],{"class":1176},[972,4477,1227],{"class":985},[972,4479,1163],{"class":1162},[972,4481,1551],{"class":1007},[972,4483,1362],{"class":1162},[972,4485,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504],{"class":974,"line":1556},[972,4487,935],{"class":985},[972,4489,1561],{"class":1142},[972,4491,1529],{"class":1007},[972,4493,1215],{"class":1176},[972,4495,1568],{"class":1007},[972,4497,1224],{"class":1176},[972,4499,1227],{"class":985},[972,4501,1163],{"class":1162},[972,4503,1577],{"class":1007},[972,4505,1362],{"class":1162},[972,4507,4508],{"class":974,"line":1582},[972,4509,992],{"emptyLinePlaceholder":8},[972,4511,4512,4514,4516,4518],{"class":974,"line":1587},[972,4513,1159],{"class":1138},[972,4515,1163],{"class":1162},[972,4517,1594],{"class":1007},[972,4519,1362],{"class":1162},[972,4521,4522,4524,4526,4528,4530,4532,4534,4536,4538,4540,4542,4544,4546,4548,4550,4552,4554,4556,4558],{"class":974,"line":1599},[972,4523,865],{"class":985},[972,4525,1604],{"class":1142},[972,4527,1607],{"class":1142},[972,4529,1610],{"class":1142},[972,4531,1163],{"class":1162},[972,4533,1615],{"class":1007},[972,4535,1618],{"class":985},[972,4537,1621],{"class":1007},[972,4539,1173],{"class":1162},[972,4541,1540],{"class":1142},[972,4543,1628],{"class":1007},[972,4545,1163],{"class":1162},[972,4547,1314],{"class":1278},[972,4549,1173],{"class":1162},[972,4551,1224],{"class":1176},[972,4553,1227],{"class":985},[972,4555,1163],{"class":1162},[972,4557,1643],{"class":1007},[972,4559,1362],{"class":1162},[972,4561,4562],{"class":974,"line":1648},[972,4563,992],{"emptyLinePlaceholder":8},[972,4565,4566,4568,4570,4572],{"class":974,"line":1653},[972,4567,1159],{"class":1138},[972,4569,1163],{"class":1162},[972,4571,1660],{"class":1007},[972,4573,1362],{"class":1162},[972,4575,4576,4578,4580,4582,4584,4586,4588,4590],{"class":974,"line":1665},[972,4577,1668],{"class":985},[972,4579,1671],{"class":1186},[972,4581,1529],{"class":1007},[972,4583,1224],{"class":1176},[972,4585,1227],{"class":985},[972,4587,1163],{"class":1162},[972,4589,1682],{"class":1007},[972,4591,1362],{"class":1162},[972,4593,4594],{"class":974,"line":1687},[972,4595,992],{"emptyLinePlaceholder":8},[972,4597,4598,4600,4602,4604],{"class":974,"line":1692},[972,4599,1159],{"class":1138},[972,4601,1163],{"class":1162},[972,4603,1699],{"class":1007},[972,4605,1362],{"class":1162},[972,4607,4608,4610,4612,4614,4616,4618,4620,4622,4624],{"class":974,"line":1704},[972,4609,1707],{"class":985},[972,4611,1710],{"class":1142},[972,4613,1713],{"class":1007},[972,4615,1716],{"class":1007},[972,4617,1224],{"class":1176},[972,4619,1227],{"class":985},[972,4621,1163],{"class":1162},[972,4623,1725],{"class":1007},[972,4625,1362],{"class":1162},[972,4627,4628,4630,4632,4634,4636,4638,4640,4642,4644,4646],{"class":974,"line":1730},[972,4629,1668],{"class":985},[972,4631,1735],{"class":1186},[972,4633,1529],{"class":1007},[972,4635,1740],{"class":1007},[972,4637,1743],{"class":1007},[972,4639,1224],{"class":1176},[972,4641,1227],{"class":985},[972,4643,1163],{"class":1162},[972,4645,1752],{"class":1007},[972,4647,1362],{"class":1162},[972,4649,4650],{"class":974,"line":1757},[972,4651,992],{"emptyLinePlaceholder":8},[972,4653,4654,4656,4658,4660,4662,4664,4666,4668,4670,4672,4674,4676],{"class":974,"line":1762},[972,4655,1024],{"class":985},[972,4657,1767],{"class":1007},[972,4659,1770],{"class":1007},[972,4661,1773],{"class":1142},[972,4663,1776],{"class":1142},[972,4665,1779],{"class":1142},[972,4667,1782],{"class":1007},[972,4669,1224],{"class":1176},[972,4671,1227],{"class":985},[972,4673,1163],{"class":1162},[972,4675,1791],{"class":1007},[972,4677,1362],{"class":1162},[972,4679,4680],{"class":974,"line":1796},[972,4681,992],{"emptyLinePlaceholder":8},[972,4683,4684,4686,4688,4690,4692],{"class":974,"line":1801},[972,4685,1668],{"class":985},[972,4687,1806],{"class":1186},[972,4689,1529],{"class":1007},[972,4691,1224],{"class":1176},[972,4693,1813],{"class":1138},[972,4695,4696,4698,4700],{"class":974,"line":1816},[972,4697,1524],{"class":985},[972,4699,1336],{"class":1142},[972,4701,1532],{"class":1007},[972,4703,4704],{"class":974,"line":1825},[972,4705,992],{"emptyLinePlaceholder":8},[972,4707,4708,4710,4712,4714,4716,4718,4720,4722,4724,4726,4728],{"class":974,"line":1830},[972,4709,1303],{"class":1302},[972,4711,1306],{"class":1155},[972,4713,1173],{"class":1162},[972,4715,1314],{"class":1278},[972,4717,1173],{"class":1162},[972,4719,1843],{"class":1176},[972,4721,1163],{"class":1162},[972,4723,1035],{"class":1007},[972,4725,1173],{"class":1162},[972,4727,1319],{"class":1155},[972,4729,1322],{"class":1302},[972,4731,4732,4734,4736],{"class":974,"line":1856},[972,4733,1859],{"class":985},[972,4735,1336],{"class":1142},[972,4737,1864],{"class":1007},[972,4739,4740,4742,4744,4746],{"class":974,"line":1867},[972,4741,1870],{"class":1138},[972,4743,1163],{"class":1162},[972,4745,1875],{"class":1007},[972,4747,1362],{"class":1162},[972,4749,4750],{"class":974,"line":1880},[972,4751,1482],{"class":1302},[972,4753,4754,4756,4758,4760,4762],{"class":974,"line":1885},[972,4755,1870],{"class":1138},[972,4757,1163],{"class":1162},[972,4759,1892],{"class":1007},[972,4761,1314],{"class":1278},[972,4763,1362],{"class":1162},[972,4765,4766],{"class":974,"line":1899},[972,4767,1501],{"class":1302},[894,4769,1905],{"id":1904},[856,4771,1908,4772,1912],{},[874,4773,1911],{},[962,4775,4776],{"className":1915,"code":1916,"filename":1911,"language":1917,"meta":968,"style":968},[874,4777,4778,4784,4792,4800,4808,4814,4822,4830,4838,4846,4862,4874,4882,4892,4898,4904,4910,4934,4942,4952,4960,4968,4972,4978,4986,4996,5004,5020,5028,5036,5042,5048,5054,5060,5066,5072,5080,5086,5096,5102,5108,5114,5120,5130,5136,5142,5150,5154,5160,5168,5174,5180,5184,5190,5196,5204,5210],{"__ignoreMap":968},[972,4779,4780,4782],{"class":974,"line":975},[972,4781,1925],{"class":1924},[972,4783,1928],{"class":1176},[972,4785,4786,4788,4790],{"class":974,"line":982},[972,4787,1933],{"class":1924},[972,4789,1936],{"class":1176},[972,4791,1939],{"class":1155},[972,4793,4794,4796,4798],{"class":974,"line":989},[972,4795,1944],{"class":1924},[972,4797,1936],{"class":1176},[972,4799,1950],{"class":1949},[972,4801,4802,4804,4806],{"class":974,"line":995},[972,4803,1955],{"class":1924},[972,4805,1936],{"class":1176},[972,4807,1960],{"class":1949},[972,4809,4810,4812],{"class":974,"line":1001},[972,4811,1965],{"class":1924},[972,4813,1928],{"class":1176},[972,4815,4816,4818,4820],{"class":974,"line":1193},[972,4817,1972],{"class":1924},[972,4819,1936],{"class":1176},[972,4821,1977],{"class":1949},[972,4823,4824,4826,4828],{"class":974,"line":1241},[972,4825,1982],{"class":1924},[972,4827,1936],{"class":1176},[972,4829,1987],{"class":1949},[972,4831,4832,4834,4836],{"class":974,"line":1246},[972,4833,1992],{"class":1924},[972,4835,1936],{"class":1176},[972,4837,1997],{"class":1949},[972,4839,4840,4842,4844],{"class":974,"line":1254},[972,4841,2002],{"class":1924},[972,4843,1936],{"class":1176},[972,4845,1977],{"class":1949},[972,4847,4848,4850,4852,4854,4856,4858,4860],{"class":974,"line":1262},[972,4849,2011],{"class":1924},[972,4851,1936],{"class":1176},[972,4853,2016],{"class":1155},[972,4855,1173],{"class":1162},[972,4857,2021],{"class":1007},[972,4859,1173],{"class":1162},[972,4861,2026],{"class":1155},[972,4863,4864,4866,4868,4870,4872],{"class":974,"line":1270},[972,4865,2031],{"class":1924},[972,4867,1936],{"class":1176},[972,4869,1163],{"class":1162},[972,4871,2038],{"class":1007},[972,4873,1362],{"class":1162},[972,4875,4876,4878,4880],{"class":974,"line":1275},[972,4877,2045],{"class":1924},[972,4879,1936],{"class":1176},[972,4881,1939],{"class":1155},[972,4883,4884,4886,4888,4890],{"class":974,"line":1294},[972,4885,2054],{"class":1176},[972,4887,1163],{"class":1162},[972,4889,2059],{"class":1007},[972,4891,1362],{"class":1162},[972,4893,4894,4896],{"class":974,"line":1299},[972,4895,2066],{"class":1924},[972,4897,1928],{"class":1176},[972,4899,4900,4902],{"class":974,"line":1325},[972,4901,2054],{"class":1176},[972,4903,2075],{"class":1949},[972,4905,4906,4908],{"class":974,"line":1349},[972,4907,2080],{"class":1924},[972,4909,1928],{"class":1176},[972,4911,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930,4932],{"class":974,"line":1365},[972,4913,2087],{"class":1924},[972,4915,1936],{"class":1176},[972,4917,2016],{"class":1155},[972,4919,1173],{"class":1162},[972,4921,2096],{"class":1007},[972,4923,1173],{"class":1162},[972,4925,1018],{"class":1155},[972,4927,1173],{"class":1162},[972,4929,2105],{"class":1007},[972,4931,1173],{"class":1162},[972,4933,2026],{"class":1155},[972,4935,4936,4938,4940],{"class":974,"line":1371},[972,4937,2114],{"class":1924},[972,4939,1936],{"class":1176},[972,4941,2119],{"class":1949},[972,4943,4944,4946,4948,4950],{"class":974,"line":1386},[972,4945,2124],{"class":1924},[972,4947,1936],{"class":1176},[972,4949,2129],{"class":1949},[972,4951,1939],{"class":1155},[972,4953,4954,4956,4958],{"class":974,"line":1407},[972,4955,2136],{"class":1924},[972,4957,1936],{"class":1176},[972,4959,2141],{"class":1186},[972,4961,4962,4964,4966],{"class":974,"line":1421},[972,4963,2146],{"class":1924},[972,4965,1936],{"class":1176},[972,4967,2151],{"class":1949},[972,4969,4970],{"class":974,"line":1435},[972,4971,992],{"emptyLinePlaceholder":8},[972,4973,4974,4976],{"class":974,"line":1454},[972,4975,2160],{"class":1924},[972,4977,1928],{"class":1176},[972,4979,4980,4982,4984],{"class":974,"line":1467},[972,4981,1944],{"class":1924},[972,4983,1936],{"class":1176},[972,4985,2171],{"class":1949},[972,4987,4988,4990,4992,4994],{"class":974,"line":1479},[972,4989,2176],{"class":1924},[972,4991,1936],{"class":1176},[972,4993,2181],{"class":1142},[972,4995,2184],{"class":1155},[972,4997,4998,5000,5002],{"class":974,"line":1485},[972,4999,1955],{"class":1924},[972,5001,1936],{"class":1176},[972,5003,1960],{"class":1949},[972,5005,5006,5008,5010,5012,5014,5016,5018],{"class":974,"line":1498},[972,5007,2011],{"class":1924},[972,5009,1936],{"class":1176},[972,5011,2016],{"class":1155},[972,5013,1173],{"class":1162},[972,5015,2021],{"class":1007},[972,5017,1173],{"class":1162},[972,5019,2026],{"class":1155},[972,5021,5022,5024,5026],{"class":974,"line":1504},[972,5023,2031],{"class":1924},[972,5025,1936],{"class":1176},[972,5027,2217],{"class":1949},[972,5029,5030,5032,5034],{"class":974,"line":1509},[972,5031,2066],{"class":1924},[972,5033,1936],{"class":1176},[972,5035,1939],{"class":1155},[972,5037,5038,5040],{"class":974,"line":1521},[972,5039,2054],{"class":1176},[972,5041,2232],{"class":1949},[972,5043,5044,5046],{"class":974,"line":1535},[972,5045,2054],{"class":1176},[972,5047,2239],{"class":1949},[972,5049,5050,5052],{"class":974,"line":1556},[972,5051,2054],{"class":1176},[972,5053,2246],{"class":1949},[972,5055,5056,5058],{"class":974,"line":1582},[972,5057,2054],{"class":1176},[972,5059,2253],{"class":1949},[972,5061,5062,5064],{"class":974,"line":1587},[972,5063,2258],{"class":1924},[972,5065,1928],{"class":1176},[972,5067,5068,5070],{"class":974,"line":1599},[972,5069,2054],{"class":1176},[972,5071,2267],{"class":1949},[972,5073,5074,5076,5078],{"class":974,"line":1648},[972,5075,2272],{"class":1924},[972,5077,1936],{"class":1176},[972,5079,2277],{"class":1186},[972,5081,5082,5084],{"class":974,"line":1653},[972,5083,2282],{"class":1924},[972,5085,1928],{"class":1176},[972,5087,5088,5090,5092,5094],{"class":974,"line":1665},[972,5089,2054],{"class":1176},[972,5091,1163],{"class":1162},[972,5093,2293],{"class":1007},[972,5095,1362],{"class":1162},[972,5097,5098,5100],{"class":974,"line":1687},[972,5099,2300],{"class":1924},[972,5101,1928],{"class":1176},[972,5103,5104,5106],{"class":974,"line":1692},[972,5105,2054],{"class":1176},[972,5107,2309],{"class":1949},[972,5109,5110,5112],{"class":974,"line":1704},[972,5111,2054],{"class":1176},[972,5113,2316],{"class":1949},[972,5115,5116,5118],{"class":974,"line":1730},[972,5117,2045],{"class":1924},[972,5119,1928],{"class":1176},[972,5121,5122,5124,5126,5128],{"class":974,"line":1757},[972,5123,2054],{"class":1176},[972,5125,1163],{"class":1162},[972,5127,2059],{"class":1007},[972,5129,1362],{"class":1162},[972,5131,5132,5134],{"class":974,"line":1762},[972,5133,2337],{"class":1924},[972,5135,1928],{"class":1176},[972,5137,5138,5140],{"class":974,"line":1796},[972,5139,2344],{"class":1924},[972,5141,1928],{"class":1176},[972,5143,5144,5146,5148],{"class":974,"line":1801},[972,5145,2351],{"class":1924},[972,5147,1936],{"class":1176},[972,5149,2356],{"class":1949},[972,5151,5152],{"class":974,"line":1816},[972,5153,992],{"emptyLinePlaceholder":8},[972,5155,5156,5158],{"class":974,"line":1825},[972,5157,2365],{"class":1924},[972,5159,1928],{"class":1176},[972,5161,5162,5164,5166],{"class":974,"line":1830},[972,5163,2372],{"class":1924},[972,5165,1936],{"class":1176},[972,5167,2184],{"class":1155},[972,5169,5170,5172],{"class":974,"line":1856},[972,5171,2381],{"class":1924},[972,5173,1928],{"class":1176},[972,5175,5176,5178],{"class":974,"line":1867},[972,5177,2388],{"class":1924},[972,5179,1928],{"class":1176},[972,5181,5182],{"class":974,"line":1880},[972,5183,992],{"emptyLinePlaceholder":8},[972,5185,5186,5188],{"class":974,"line":1885},[972,5187,2399],{"class":1924},[972,5189,1928],{"class":1176},[972,5191,5192,5194],{"class":974,"line":1899},[972,5193,2406],{"class":1924},[972,5195,1928],{"class":1176},[972,5197,5198,5200,5202],{"class":974,"line":2411},[972,5199,2414],{"class":1924},[972,5201,1936],{"class":1176},[972,5203,2419],{"class":1949},[972,5205,5206,5208],{"class":974,"line":2422},[972,5207,2425],{"class":1924},[972,5209,1928],{"class":1176},[972,5211,5212,5214,5216],{"class":974,"line":2430},[972,5213,2414],{"class":1924},[972,5215,1936],{"class":1176},[972,5217,2437],{"class":1949},[856,5219,2440,5220,1047,5222,2445,5224,2448,5226,2452,5228,2455],{},[874,5221,1046],{},[874,5223,1057],{},[874,5225,891],{},[874,5227,2451],{},[860,5229,14],{"href":74},[879,5231],{},[882,5233,2461],{"id":2460},[856,5235,2464,5236,2468,5239,2471,5241,2475,5243,2479],{},[860,5237,1905],{"href":951,"rel":5238},[864],[874,5240,891],{},[874,5242,2474],{},[874,5244,2478],{},[856,5246,2482,5247,2486,5249,2490],{},[874,5248,2485],{},[874,5250,2489],{},[894,5252,2494,5253],{"id":2493},[874,5254,891],{},[899,5256,5257,5271],{},[902,5258,5259],{},[905,5260,5261,5263,5267],{},[908,5262,2505],{},[908,5264,5265],{},[874,5266,891],{},[908,5268,5269],{},[874,5270,2474],{},[915,5272,5273,5281,5291,5301],{},[905,5274,5275,5277,5279],{},[920,5276,2520],{},[920,5278,2523],{},[920,5280,2526],{},[905,5282,5283,5285,5287],{},[920,5284,2531],{},[920,5286,2534],{},[920,5288,2537,5289],{},[874,5290,1057],{},[905,5292,5293,5295,5299],{},[920,5294,2544],{},[920,5296,2547,5297],{},[874,5298,2451],{},[920,5300,2552],{},[905,5302,5303,5305,5307],{},[920,5304,2557],{},[920,5306,2560],{},[920,5308,2563,5309,2566],{},[874,5310,2478],{},[856,5312,2569,5313,2572,5315,2575],{},[874,5314,2474],{},[874,5316,1057],{},[894,5318,5319],{"id":2478},[874,5320,2478],{},[856,5322,2582,5323,2585,5325,2588,5327,2592,5329,2595,5331,2598],{},[874,5324,2478],{},[874,5326,1094],{},[874,5328,2591],{},[874,5330,1035],{},[874,5332,1031],{},[894,5334,1119],{"id":2601},[962,5336,5337],{"className":964,"code":2604,"filename":2485,"language":967,"meta":968,"style":968},[874,5338,5339,5345,5349,5355,5367,5383,5387,5407,5417,5439,5443,5453,5457,5461,5469,5491,5507,5519,5541,5557,5569,5573,5577,5593,5597,5615,5649,5661,5703,5707,5733,5745,5749,5753,5763,5767,5771,5777,5789,5805,5821,5825,5841,5857,5861,5893,5911,5923,5945,5973,5977,5981,5985],{"__ignoreMap":968},[972,5340,5341,5343],{"class":974,"line":975},[972,5342,1139],{"class":1138},[972,5344,1143],{"class":1142},[972,5346,5347],{"class":974,"line":982},[972,5348,992],{"emptyLinePlaceholder":8},[972,5350,5351,5353],{"class":974,"line":989},[972,5352,2474],{"class":985},[972,5354,2623],{"class":1155},[972,5356,5357,5359,5361,5363,5365],{"class":974,"line":995},[972,5358,2628],{"class":1278},[972,5360,1282],{"class":1176},[972,5362,1173],{"class":1162},[972,5364,2635],{"class":1007},[972,5366,1362],{"class":1162},[972,5368,5369,5371,5373,5375,5377,5379,5381],{"class":974,"line":1001},[972,5370,2642],{"class":1278},[972,5372,1282],{"class":1176},[972,5374,1173],{"class":1162},[972,5376,2649],{"class":1007},[972,5378,2652],{"class":1278},[972,5380,2655],{"class":1007},[972,5382,1362],{"class":1162},[972,5384,5385],{"class":974,"line":1193},[972,5386,992],{"emptyLinePlaceholder":8},[972,5388,5389,5391,5393,5395,5397,5399,5401,5403,5405],{"class":974,"line":1241},[972,5390,2666],{"class":1302},[972,5392,1306],{"class":1155},[972,5394,1333],{"class":1176},[972,5396,1336],{"class":1176},[972,5398,1163],{"class":1162},[972,5400,2677],{"class":1278},[972,5402,1173],{"class":1162},[972,5404,1319],{"class":1155},[972,5406,1322],{"class":1302},[972,5408,5409,5411,5413,5415],{"class":974,"line":1246},[972,5410,1374],{"class":1138},[972,5412,1163],{"class":1162},[972,5414,2692],{"class":1007},[972,5416,1362],{"class":1162},[972,5418,5419,5421,5423,5425,5427,5429,5431,5433,5435,5437],{"class":974,"line":1254},[972,5420,2699],{"class":985},[972,5422,1540],{"class":1142},[972,5424,1163],{"class":1162},[972,5426,2677],{"class":1278},[972,5428,1173],{"class":1162},[972,5430,1224],{"class":1176},[972,5432,1227],{"class":985},[972,5434,1163],{"class":1162},[972,5436,2716],{"class":1007},[972,5438,1362],{"class":1162},[972,5440,5441],{"class":974,"line":1262},[972,5442,2723],{"class":1302},[972,5444,5445,5447,5449,5451],{"class":974,"line":1270},[972,5446,1374],{"class":1138},[972,5448,1163],{"class":1162},[972,5450,2732],{"class":1007},[972,5452,1362],{"class":1162},[972,5454,5455],{"class":974,"line":1275},[972,5456,2739],{"class":1302},[972,5458,5459],{"class":974,"line":1294},[972,5460,992],{"emptyLinePlaceholder":8},[972,5462,5463,5465,5467],{"class":974,"line":1299},[972,5464,2748],{"class":1278},[972,5466,1282],{"class":1176},[972,5468,2753],{"class":1162},[972,5470,5471,5473,5475,5477,5479,5481,5483,5485,5487,5489],{"class":974,"line":1325},[972,5472,2666],{"class":1302},[972,5474,1306],{"class":1155},[972,5476,1394],{"class":1176},[972,5478,1163],{"class":1162},[972,5480,2649],{"class":1007},[972,5482,2652],{"class":1278},[972,5484,2770],{"class":1007},[972,5486,1173],{"class":1162},[972,5488,1319],{"class":1155},[972,5490,1322],{"class":1302},[972,5492,5493,5495,5497,5499,5501,5503,5505],{"class":974,"line":1349},[972,5494,2781],{"class":1278},[972,5496,1282],{"class":1176},[972,5498,1173],{"class":1162},[972,5500,2649],{"class":1007},[972,5502,2652],{"class":1278},[972,5504,2770],{"class":1007},[972,5506,1362],{"class":1162},[972,5508,5509,5511,5513,5515,5517],{"class":974,"line":1365},[972,5510,1374],{"class":1138},[972,5512,1163],{"class":1162},[972,5514,2802],{"class":1007},[972,5516,2805],{"class":1278},[972,5518,1362],{"class":1162},[972,5520,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539],{"class":974,"line":1371},[972,5522,2812],{"class":1302},[972,5524,1306],{"class":1155},[972,5526,1394],{"class":1176},[972,5528,1163],{"class":1162},[972,5530,2649],{"class":1007},[972,5532,2652],{"class":1278},[972,5534,2825],{"class":1007},[972,5536,1173],{"class":1162},[972,5538,1319],{"class":1155},[972,5540,1322],{"class":1302},[972,5542,5543,5545,5547,5549,5551,5553,5555],{"class":974,"line":1386},[972,5544,2781],{"class":1278},[972,5546,1282],{"class":1176},[972,5548,1173],{"class":1162},[972,5550,2649],{"class":1007},[972,5552,2652],{"class":1278},[972,5554,2825],{"class":1007},[972,5556,1362],{"class":1162},[972,5558,5559,5561,5563,5565,5567],{"class":974,"line":1407},[972,5560,1374],{"class":1138},[972,5562,1163],{"class":1162},[972,5564,2856],{"class":1007},[972,5566,2805],{"class":1278},[972,5568,1362],{"class":1162},[972,5570,5571],{"class":974,"line":1421},[972,5572,2739],{"class":1302},[972,5574,5575],{"class":974,"line":1435},[972,5576,992],{"emptyLinePlaceholder":8},[972,5578,5579,5581,5583,5585,5587,5589,5591],{"class":974,"line":1454},[972,5580,2873],{"class":1278},[972,5582,1282],{"class":1176},[972,5584,1173],{"class":1162},[972,5586,2649],{"class":1007},[972,5588,2652],{"class":1278},[972,5590,2884],{"class":1007},[972,5592,1362],{"class":1162},[972,5594,5595],{"class":974,"line":1467},[972,5596,992],{"emptyLinePlaceholder":8},[972,5598,5599,5601,5603,5605,5607,5609,5611,5613],{"class":974,"line":1479},[972,5600,2666],{"class":1302},[972,5602,1306],{"class":1155},[972,5604,1309],{"class":1176},[972,5606,1163],{"class":1162},[972,5608,2805],{"class":1278},[972,5610,1173],{"class":1162},[972,5612,1319],{"class":1155},[972,5614,1322],{"class":1302},[972,5616,5617,5619,5621,5623,5625,5627,5629,5631,5633,5635,5637,5639,5641,5643,5645,5647],{"class":974,"line":1485},[972,5618,2913],{"class":1278},[972,5620,1282],{"class":1176},[972,5622,1173],{"class":1162},[972,5624,1615],{"class":1007},[972,5626,935],{"class":985},[972,5628,1561],{"class":1142},[972,5630,1163],{"class":1162},[972,5632,2677],{"class":1278},[972,5634,1173],{"class":1162},[972,5636,2932],{"class":1007},[972,5638,1173],{"class":1162},[972,5640,1224],{"class":1176},[972,5642,1227],{"class":985},[972,5644,1163],{"class":1162},[972,5646,2943],{"class":1007},[972,5648,1362],{"class":1162},[972,5650,5651,5653,5655,5657,5659],{"class":974,"line":1498},[972,5652,1374],{"class":1138},[972,5654,1163],{"class":1162},[972,5656,2954],{"class":1007},[972,5658,2805],{"class":1278},[972,5660,1362],{"class":1162},[972,5662,5663,5665,5667,5669,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689,5691,5693,5695,5697,5699,5701],{"class":974,"line":1504},[972,5664,2963],{"class":985},[972,5666,1604],{"class":1142},[972,5668,1607],{"class":1142},[972,5670,1610],{"class":1142},[972,5672,1163],{"class":1162},[972,5674,2974],{"class":1278},[972,5676,1173],{"class":1162},[972,5678,1540],{"class":1142},[972,5680,1163],{"class":1162},[972,5682,2983],{"class":1278},[972,5684,1173],{"class":1162},[972,5686,1163],{"class":1162},[972,5688,2805],{"class":1278},[972,5690,1173],{"class":1162},[972,5692,1224],{"class":1176},[972,5694,1227],{"class":985},[972,5696,1163],{"class":1162},[972,5698,3000],{"class":1007},[972,5700,2805],{"class":1278},[972,5702,1362],{"class":1162},[972,5704,5705],{"class":974,"line":1509},[972,5706,2723],{"class":1302},[972,5708,5709,5711,5713,5715,5717,5719,5721,5723,5725,5727,5729,5731],{"class":974,"line":1521},[972,5710,3013],{"class":1155},[972,5712,1394],{"class":1176},[972,5714,1163],{"class":1162},[972,5716,2983],{"class":1278},[972,5718,1173],{"class":1162},[972,5720,3024],{"class":1155},[972,5722,3027],{"class":1176},[972,5724,1227],{"class":985},[972,5726,1163],{"class":1162},[972,5728,3034],{"class":1007},[972,5730,3037],{"class":1278},[972,5732,1362],{"class":1162},[972,5734,5735,5737,5739,5741,5743],{"class":974,"line":1535},[972,5736,1374],{"class":1138},[972,5738,1163],{"class":1162},[972,5740,3048],{"class":1007},[972,5742,2983],{"class":1278},[972,5744,1362],{"class":1162},[972,5746,5747],{"class":974,"line":1556},[972,5748,2739],{"class":1302},[972,5750,5751],{"class":974,"line":1582},[972,5752,992],{"emptyLinePlaceholder":8},[972,5754,5755,5757,5759,5761],{"class":974,"line":1587},[972,5756,1870],{"class":1138},[972,5758,1163],{"class":1162},[972,5760,3069],{"class":1007},[972,5762,1362],{"class":1162},[972,5764,5765],{"class":974,"line":1599},[972,5766,1291],{"class":1155},[972,5768,5769],{"class":974,"line":1648},[972,5770,992],{"emptyLinePlaceholder":8},[972,5772,5773,5775],{"class":974,"line":1653},[972,5774,2478],{"class":985},[972,5776,2623],{"class":1155},[972,5778,5779,5781,5783,5785,5787],{"class":974,"line":1665},[972,5780,2628],{"class":1278},[972,5782,1282],{"class":1176},[972,5784,1173],{"class":1162},[972,5786,2635],{"class":1007},[972,5788,1362],{"class":1162},[972,5790,5791,5793,5795,5797,5799,5801,5803],{"class":974,"line":1687},[972,5792,2642],{"class":1278},[972,5794,1282],{"class":1176},[972,5796,1173],{"class":1162},[972,5798,2649],{"class":1007},[972,5800,2652],{"class":1278},[972,5802,2655],{"class":1007},[972,5804,1362],{"class":1162},[972,5806,5807,5809,5811,5813,5815,5817,5819],{"class":974,"line":1692},[972,5808,2873],{"class":1278},[972,5810,1282],{"class":1176},[972,5812,1173],{"class":1162},[972,5814,2649],{"class":1007},[972,5816,2652],{"class":1278},[972,5818,2884],{"class":1007},[972,5820,1362],{"class":1162},[972,5822,5823],{"class":974,"line":1704},[972,5824,992],{"emptyLinePlaceholder":8},[972,5826,5827,5829,5831,5833,5835,5837,5839],{"class":974,"line":1730},[972,5828,3138],{"class":985},[972,5830,1806],{"class":1186},[972,5832,1163],{"class":1162},[972,5834,2677],{"class":1278},[972,5836,1173],{"class":1162},[972,5838,1224],{"class":1176},[972,5840,1813],{"class":1138},[972,5842,5843,5845,5847,5849,5851,5853,5855],{"class":974,"line":1757},[972,5844,3138],{"class":985},[972,5846,3157],{"class":1186},[972,5848,1163],{"class":1162},[972,5850,2983],{"class":1278},[972,5852,1173],{"class":1162},[972,5854,1224],{"class":1176},[972,5856,1813],{"class":1138},[972,5858,5859],{"class":974,"line":1762},[972,5860,992],{"emptyLinePlaceholder":8},[972,5862,5863,5865,5867,5869,5871,5873,5875,5877,5879,5881,5883,5885,5887,5889,5891],{"class":974,"line":1796},[972,5864,3176],{"class":1302},[972,5866,3179],{"class":1278},[972,5868,3182],{"class":1302},[972,5870,1163],{"class":1162},[972,5872,2649],{"class":1007},[972,5874,2652],{"class":1278},[972,5876,2825],{"class":1007},[972,5878,1173],{"class":1162},[972,5880,1163],{"class":1162},[972,5882,2649],{"class":1007},[972,5884,2652],{"class":1278},[972,5886,2770],{"class":1007},[972,5888,1173],{"class":1162},[972,5890,1180],{"class":1155},[972,5892,3207],{"class":1302},[972,5894,5895,5897,5899,5901,5903,5905,5907,5909],{"class":974,"line":1801},[972,5896,1328],{"class":1302},[972,5898,1306],{"class":1155},[972,5900,1394],{"class":1176},[972,5902,1163],{"class":1162},[972,5904,3220],{"class":1278},[972,5906,1173],{"class":1162},[972,5908,1319],{"class":1155},[972,5910,1322],{"class":1302},[972,5912,5913,5915,5917,5919,5921],{"class":974,"line":1816},[972,5914,3231],{"class":1302},[972,5916,1163],{"class":1162},[972,5918,3220],{"class":1278},[972,5920,1173],{"class":1162},[972,5922,3240],{"class":1302},[972,5924,5925,5927,5929,5931,5933,5935,5937,5939,5941,5943],{"class":974,"line":1825},[972,5926,3246],{"class":3245},[972,5928,3250],{"class":3249},[972,5930,3253],{"class":3245},[972,5932,2932],{"class":1176},[972,5934,3258],{"class":1138},[972,5936,1163],{"class":1162},[972,5938,3263],{"class":1007},[972,5940,3220],{"class":1278},[972,5942,1173],{"class":1162},[972,5944,3270],{"class":1155},[972,5946,5947,5949,5951,5953,5955,5957,5959,5961,5963,5965,5967,5969,5971],{"class":974,"line":1830},[972,5948,3275],{"class":1176},[972,5950,3278],{"class":985},[972,5952,1336],{"class":1142},[972,5954,1163],{"class":1162},[972,5956,3220],{"class":1278},[972,5958,1173],{"class":1162},[972,5960,1180],{"class":1155},[972,5962,1159],{"class":1138},[972,5964,1163],{"class":1162},[972,5966,3295],{"class":1007},[972,5968,3220],{"class":1278},[972,5970,1173],{"class":1162},[972,5972,3270],{"class":1155},[972,5974,5975],{"class":974,"line":1856},[972,5976,3306],{"class":1302},[972,5978,5979],{"class":974,"line":1867},[972,5980,1368],{"class":1302},[972,5982,5983],{"class":974,"line":1880},[972,5984,3315],{"class":1302},[972,5986,5987],{"class":974,"line":1885},[972,5988,1291],{"class":1155},[894,5990,3323],{"id":3322},[856,5992,3326,5993,3330],{},[874,5994,3329],{},[962,5996,5997],{"className":964,"code":3333,"filename":3334,"language":967,"meta":968,"style":968},[874,5998,5999,6003,6009,6013,6039,6043,6049,6053,6057,6061,6083,6087],{"__ignoreMap":968},[972,6000,6001],{"class":974,"line":975},[972,6002,1129],{"class":978},[972,6004,6005,6007],{"class":974,"line":982},[972,6006,1139],{"class":1138},[972,6008,1143],{"class":1142},[972,6010,6011],{"class":974,"line":989},[972,6012,992],{"emptyLinePlaceholder":8},[972,6014,6015,6017,6019,6021,6023,6025,6027,6029,6031,6033,6035,6037],{"class":974,"line":995},[972,6016,1152],{"class":985},[972,6018,1156],{"class":1155},[972,6020,1159],{"class":1138},[972,6022,1163],{"class":1162},[972,6024,1166],{"class":1007},[972,6026,1170],{"class":1169},[972,6028,1173],{"class":1162},[972,6030,1177],{"class":1176},[972,6032,1180],{"class":1155},[972,6034,1183],{"class":1138},[972,6036,1187],{"class":1186},[972,6038,1190],{"class":1155},[972,6040,6041],{"class":974,"line":1001},[972,6042,992],{"emptyLinePlaceholder":8},[972,6044,6045,6047],{"class":974,"line":1193},[972,6046,1072],{"class":1138},[972,6048,3387],{"class":1007},[972,6050,6051],{"class":974,"line":1241},[972,6052,992],{"emptyLinePlaceholder":8},[972,6054,6055],{"class":974,"line":1246},[972,6056,3396],{"class":985},[972,6058,6059],{"class":974,"line":1254},[972,6060,992],{"emptyLinePlaceholder":8},[972,6062,6063,6065,6067,6069,6071,6073,6075,6077,6079,6081],{"class":974,"line":1262},[972,6064,1024],{"class":985},[972,6066,1767],{"class":1007},[972,6068,1770],{"class":1007},[972,6070,1773],{"class":1142},[972,6072,1776],{"class":1142},[972,6074,1224],{"class":1176},[972,6076,1227],{"class":985},[972,6078,1163],{"class":1162},[972,6080,1791],{"class":1007},[972,6082,1362],{"class":1162},[972,6084,6085],{"class":974,"line":1270},[972,6086,992],{"emptyLinePlaceholder":8},[972,6088,6089],{"class":974,"line":1275},[972,6090,3431],{"class":985},[894,6092,3435],{"id":3434},[856,6094,3438,6095,3442],{},[874,6096,3441],{},[962,6098,6100],{"className":6099,"code":3447,"language":3448},[3446],[874,6101,3447],{"__ignoreMap":968},[856,6103,3453,6104,3459,6107,3465,6110,3468,6112,3471],{},[860,6105,3458],{"href":3456,"rel":6106},[864],[860,6108,3464],{"href":3462,"rel":6109},[864],[874,6111,3441],{},[874,6113,2474],{},[962,6115,6116],{"className":1915,"code":3474,"filename":1911,"language":1917,"meta":968,"style":968},[874,6117,6118,6124,6132,6140,6148,6154,6162,6170,6178,6186,6202,6214,6222,6232,6238,6244,6250,6274,6282,6292,6300,6308,6312,6318,6326,6336,6344,6360,6368,6376,6382,6388,6394,6400,6406,6412,6420,6426,6432,6438,6444,6454,6460,6466,6474,6478,6484,6488,6496,6502,6508,6516,6520,6526,6534,6540,6546,6550,6556,6562,6570,6576],{"__ignoreMap":968},[972,6119,6120,6122],{"class":974,"line":975},[972,6121,1925],{"class":1924},[972,6123,1928],{"class":1176},[972,6125,6126,6128,6130],{"class":974,"line":982},[972,6127,1933],{"class":1924},[972,6129,1936],{"class":1176},[972,6131,1939],{"class":1155},[972,6133,6134,6136,6138],{"class":974,"line":989},[972,6135,1944],{"class":1924},[972,6137,1936],{"class":1176},[972,6139,1950],{"class":1949},[972,6141,6142,6144,6146],{"class":974,"line":995},[972,6143,1955],{"class":1924},[972,6145,1936],{"class":1176},[972,6147,1960],{"class":1949},[972,6149,6150,6152],{"class":974,"line":1001},[972,6151,1965],{"class":1924},[972,6153,1928],{"class":1176},[972,6155,6156,6158,6160],{"class":974,"line":1193},[972,6157,1972],{"class":1924},[972,6159,1936],{"class":1176},[972,6161,1977],{"class":1949},[972,6163,6164,6166,6168],{"class":974,"line":1241},[972,6165,1982],{"class":1924},[972,6167,1936],{"class":1176},[972,6169,1987],{"class":1949},[972,6171,6172,6174,6176],{"class":974,"line":1246},[972,6173,1992],{"class":1924},[972,6175,1936],{"class":1176},[972,6177,1997],{"class":1949},[972,6179,6180,6182,6184],{"class":974,"line":1254},[972,6181,2002],{"class":1924},[972,6183,1936],{"class":1176},[972,6185,1977],{"class":1949},[972,6187,6188,6190,6192,6194,6196,6198,6200],{"class":974,"line":1262},[972,6189,2011],{"class":1924},[972,6191,1936],{"class":1176},[972,6193,2016],{"class":1155},[972,6195,1173],{"class":1162},[972,6197,2021],{"class":1007},[972,6199,1173],{"class":1162},[972,6201,2026],{"class":1155},[972,6203,6204,6206,6208,6210,6212],{"class":974,"line":1270},[972,6205,2031],{"class":1924},[972,6207,1936],{"class":1176},[972,6209,1163],{"class":1162},[972,6211,2038],{"class":1007},[972,6213,1362],{"class":1162},[972,6215,6216,6218,6220],{"class":974,"line":1275},[972,6217,2045],{"class":1924},[972,6219,1936],{"class":1176},[972,6221,1939],{"class":1155},[972,6223,6224,6226,6228,6230],{"class":974,"line":1294},[972,6225,2054],{"class":1176},[972,6227,1163],{"class":1162},[972,6229,2059],{"class":1007},[972,6231,1362],{"class":1162},[972,6233,6234,6236],{"class":974,"line":1299},[972,6235,2066],{"class":1924},[972,6237,1928],{"class":1176},[972,6239,6240,6242],{"class":974,"line":1325},[972,6241,2054],{"class":1176},[972,6243,2075],{"class":1949},[972,6245,6246,6248],{"class":974,"line":1349},[972,6247,2080],{"class":1924},[972,6249,1928],{"class":1176},[972,6251,6252,6254,6256,6258,6260,6262,6264,6266,6268,6270,6272],{"class":974,"line":1365},[972,6253,2087],{"class":1924},[972,6255,1936],{"class":1176},[972,6257,2016],{"class":1155},[972,6259,1173],{"class":1162},[972,6261,2096],{"class":1007},[972,6263,1173],{"class":1162},[972,6265,1018],{"class":1155},[972,6267,1173],{"class":1162},[972,6269,2105],{"class":1007},[972,6271,1173],{"class":1162},[972,6273,2026],{"class":1155},[972,6275,6276,6278,6280],{"class":974,"line":1371},[972,6277,2114],{"class":1924},[972,6279,1936],{"class":1176},[972,6281,2119],{"class":1949},[972,6283,6284,6286,6288,6290],{"class":974,"line":1386},[972,6285,2124],{"class":1924},[972,6287,1936],{"class":1176},[972,6289,2129],{"class":1949},[972,6291,1939],{"class":1155},[972,6293,6294,6296,6298],{"class":974,"line":1407},[972,6295,2136],{"class":1924},[972,6297,1936],{"class":1176},[972,6299,2141],{"class":1186},[972,6301,6302,6304,6306],{"class":974,"line":1421},[972,6303,2146],{"class":1924},[972,6305,1936],{"class":1176},[972,6307,2151],{"class":1949},[972,6309,6310],{"class":974,"line":1435},[972,6311,992],{"emptyLinePlaceholder":8},[972,6313,6314,6316],{"class":974,"line":1454},[972,6315,2160],{"class":1924},[972,6317,1928],{"class":1176},[972,6319,6320,6322,6324],{"class":974,"line":1467},[972,6321,1944],{"class":1924},[972,6323,1936],{"class":1176},[972,6325,2171],{"class":1949},[972,6327,6328,6330,6332,6334],{"class":974,"line":1479},[972,6329,2176],{"class":1924},[972,6331,1936],{"class":1176},[972,6333,2181],{"class":1142},[972,6335,2184],{"class":1155},[972,6337,6338,6340,6342],{"class":974,"line":1485},[972,6339,1955],{"class":1924},[972,6341,1936],{"class":1176},[972,6343,1960],{"class":1949},[972,6345,6346,6348,6350,6352,6354,6356,6358],{"class":974,"line":1498},[972,6347,2011],{"class":1924},[972,6349,1936],{"class":1176},[972,6351,2016],{"class":1155},[972,6353,1173],{"class":1162},[972,6355,2021],{"class":1007},[972,6357,1173],{"class":1162},[972,6359,2026],{"class":1155},[972,6361,6362,6364,6366],{"class":974,"line":1504},[972,6363,2031],{"class":1924},[972,6365,1936],{"class":1176},[972,6367,2217],{"class":1949},[972,6369,6370,6372,6374],{"class":974,"line":1509},[972,6371,2066],{"class":1924},[972,6373,1936],{"class":1176},[972,6375,1939],{"class":1155},[972,6377,6378,6380],{"class":974,"line":1521},[972,6379,2054],{"class":1176},[972,6381,3741],{"class":1949},[972,6383,6384,6386],{"class":974,"line":1535},[972,6385,2054],{"class":1176},[972,6387,3748],{"class":1949},[972,6389,6390,6392],{"class":974,"line":1556},[972,6391,2054],{"class":1176},[972,6393,2246],{"class":1949},[972,6395,6396,6398],{"class":974,"line":1582},[972,6397,2054],{"class":1176},[972,6399,2253],{"class":1949},[972,6401,6402,6404],{"class":974,"line":1587},[972,6403,2258],{"class":1924},[972,6405,1928],{"class":1176},[972,6407,6408,6410],{"class":974,"line":1599},[972,6409,2054],{"class":1176},[972,6411,2267],{"class":1949},[972,6413,6414,6416,6418],{"class":974,"line":1648},[972,6415,2272],{"class":1924},[972,6417,1936],{"class":1176},[972,6419,2277],{"class":1186},[972,6421,6422,6424],{"class":974,"line":1653},[972,6423,2300],{"class":1924},[972,6425,1928],{"class":1176},[972,6427,6428,6430],{"class":974,"line":1665},[972,6429,2054],{"class":1176},[972,6431,2309],{"class":1949},[972,6433,6434,6436],{"class":974,"line":1687},[972,6435,2054],{"class":1176},[972,6437,2316],{"class":1949},[972,6439,6440,6442],{"class":974,"line":1692},[972,6441,2045],{"class":1924},[972,6443,1928],{"class":1176},[972,6445,6446,6448,6450,6452],{"class":974,"line":1704},[972,6447,2054],{"class":1176},[972,6449,1163],{"class":1162},[972,6451,2059],{"class":1007},[972,6453,1362],{"class":1162},[972,6455,6456,6458],{"class":974,"line":1730},[972,6457,2337],{"class":1924},[972,6459,1928],{"class":1176},[972,6461,6462,6464],{"class":974,"line":1757},[972,6463,2344],{"class":1924},[972,6465,1928],{"class":1176},[972,6467,6468,6470,6472],{"class":974,"line":1762},[972,6469,2351],{"class":1924},[972,6471,1936],{"class":1176},[972,6473,2356],{"class":1949},[972,6475,6476],{"class":974,"line":1796},[972,6477,992],{"emptyLinePlaceholder":8},[972,6479,6480,6482],{"class":974,"line":1801},[972,6481,3843],{"class":1924},[972,6483,1928],{"class":1176},[972,6485,6486],{"class":974,"line":1816},[972,6487,3850],{"class":978},[972,6489,6490,6492,6494],{"class":974,"line":1825},[972,6491,3855],{"class":1924},[972,6493,1936],{"class":1176},[972,6495,3860],{"class":1186},[972,6497,6498,6500],{"class":974,"line":1830},[972,6499,2337],{"class":1924},[972,6501,1928],{"class":1176},[972,6503,6504,6506],{"class":974,"line":1856},[972,6505,3871],{"class":1924},[972,6507,1928],{"class":1176},[972,6509,6510,6512,6514],{"class":974,"line":1867},[972,6511,2351],{"class":1924},[972,6513,1936],{"class":1176},[972,6515,2356],{"class":1949},[972,6517,6518],{"class":974,"line":1880},[972,6519,992],{"emptyLinePlaceholder":8},[972,6521,6522,6524],{"class":974,"line":1885},[972,6523,2365],{"class":1924},[972,6525,1928],{"class":1176},[972,6527,6528,6530,6532],{"class":974,"line":1899},[972,6529,2372],{"class":1924},[972,6531,1936],{"class":1176},[972,6533,2184],{"class":1155},[972,6535,6536,6538],{"class":974,"line":2411},[972,6537,2381],{"class":1924},[972,6539,1928],{"class":1176},[972,6541,6542,6544],{"class":974,"line":2422},[972,6543,2388],{"class":1924},[972,6545,1928],{"class":1176},[972,6547,6548],{"class":974,"line":2430},[972,6549,992],{"emptyLinePlaceholder":8},[972,6551,6552,6554],{"class":974,"line":3918},[972,6553,2399],{"class":1924},[972,6555,1928],{"class":1176},[972,6557,6558,6560],{"class":974,"line":3925},[972,6559,2406],{"class":1924},[972,6561,1928],{"class":1176},[972,6563,6564,6566,6568],{"class":974,"line":3932},[972,6565,2414],{"class":1924},[972,6567,1936],{"class":1176},[972,6569,3939],{"class":1949},[972,6571,6572,6574],{"class":974,"line":3942},[972,6573,2425],{"class":1924},[972,6575,1928],{"class":1176},[972,6577,6578,6580,6582],{"class":974,"line":3949},[972,6579,2414],{"class":1924},[972,6581,1936],{"class":1176},[972,6583,3956],{"class":1949},[3958,6585,3960],{},{"title":968,"searchDepth":982,"depth":982,"links":6587},[6588,6595],{"id":884,"depth":982,"text":885,"children":6589},[6590,6591,6592,6593,6594],{"id":896,"depth":989,"text":897},{"id":959,"depth":989,"text":960},{"id":1011,"depth":989,"text":1012},{"id":1118,"depth":989,"text":1119},{"id":1904,"depth":989,"text":1905},{"id":2460,"depth":982,"text":2461,"children":6596},[6597,6598,6599,6600,6601],{"id":2493,"depth":989,"text":3973},{"id":2478,"depth":989,"text":2478},{"id":2601,"depth":989,"text":1119},{"id":3322,"depth":989,"text":3323},{"id":3434,"depth":989,"text":3435},{},{"title":229,"description":3978},1780436284647]