1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,15921,(e,t,r)=>{"use strict";e.i(86038),Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return k},useLinkStatus:function(){return b}};for(var i in n)Object.defineProperty(r,i,{enumerable:!0,get:n[i]});let a=e.r(44066),s=e.r(18269),o=a._(e.r(57424)),l=e.r(71363),c=e.r(92361),d=e.r(37356),u=e.r(88978),p=e.r(42187),h=e.r(95403),g=e.r(43471),f=e.r(83110),m=e.r(95462);function k(t){var r;let n,i,a,[k,b]=(0,o.useOptimistic)(g.IDLE_LINK_STATUS),y=(0,o.useRef)(null),{href:v,as:j,children:w,prefetch:S=null,passHref:N,replace:A,shallow:P,scroll:C,onClick:T,onMouseEnter:F,onTouchStart:I,legacyBehavior:O=!1,onNavigate:E,transitionTypes:L,ref:D,unstable_dynamicOnHover:R,..._}=t;n=w,O&&("string"==typeof n||"number"==typeof n)&&(n=(0,s.jsx)("a",{children:n}));let M=o.default.useContext(c.AppRouterContext),B=!1!==S,U=!1===S?"none":!0===S?"full":"auto",V="none"!==U?"auto"===U?m.FetchStrategy.PPR:m.FetchStrategy.Full:m.FetchStrategy.PPR,$="string"==typeof(r=j||v)?r:(0,l.formatUrl)(r);if(O){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});i=o.default.Children.only(n)}let K=O?i&&"object"==typeof i&&i.ref:D,W,z=o.default.useCallback(e=>(null!==M&&(y.current=(0,g.mountLinkInstance)(e,$,M,V,B,b,W)),()=>{y.current&&((0,g.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,g.unmountPrefetchableInstance)(e)}),[B,$,M,V,b,W]),J={ref:(0,d.useMergedRef)(z,K),onClick(t){O||"function"!=typeof T||T(t),O&&i.props&&"function"==typeof i.props.onClick&&i.props.onClick(t),!M||t.defaultPrevented||function(t,r,n,i,a,s,l,c="none"){if("u">typeof window){let d,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(r)){i&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:p}=e.r(65011);o.default.startTransition(()=>{p(r,i?"replace":"push",!1===a?h.ScrollBehavior.NoScroll:h.ScrollBehavior.Default,n.current,l,c)})}}(t,$,y,A,C,E,L,U)},onMouseEnter(e){O||"function"!=typeof F||F(e),O&&i.props&&"function"==typeof i.props.onMouseEnter&&i.props.onMouseEnter(e),M&&B&&(0,g.onNavigationIntent)(e.currentTarget,!0===R)},onTouchStart:function(e){O||"function"!=typeof I||I(e),O&&i.props&&"function"==typeof i.props.onTouchStart&&i.props.onTouchStart(e),M&&B&&(0,g.onNavigationIntent)(e.currentTarget,!0===R)}};return(0,u.isAbsoluteUrl)($)?J.href=$:O&&!N&&("a"!==i.type||"href"in i.props)||(J.href=(0,p.addBasePath)($)),a=O?o.default.cloneElement(i,J):(0,s.jsx)("a",{..._,...J,children:n}),(0,s.jsx)(x.Provider,{value:k,children:a})}let x=(0,o.createContext)(g.IDLE_LINK_STATUS),b=()=>(0,o.useContext)(x);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37356,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return i}});let n=e.r(57424);function i(e,t){let r=(0,n.useRef)(null),i=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=i.current;t&&(i.current=null,t())}else e&&(r.current=a(e,n)),t&&(i.current=a(t,n))},[e,t])}function a(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esMo
1dule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},88978,(e,t,r)=>{"use strict";e.i(86038),Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return k},MiddlewareNotFoundError:function(){return v},MissingStaticPage:function(){return y},NormalizeError:function(){return x},PageNotFoundError:function(){return b},SP:function(){return f},ST:function(){return m},WEB_VITALS:function(){return a},execOnce:function(){return s},getDisplayName:function(){return u},getLocationOrigin:function(){return c},getURL:function(){return d},isAbsoluteUrl:function(){return l},isResSent:function(){return p},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return h},stringifyError:function(){return j}};for(var i in n)Object.defineProperty(r,i,{enumerable:!0,get:n[i]});let a=["CLS","FCP","FID","INP","LCP","TTFB"];function s(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let o=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&o.test(e)};function c(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function d(){let{href:e}=window.location,t=c();return e.substring(t.length)}function u(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function p(e){return e.finished||e.headersSent}function h(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function g(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await g(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&p(r))return n;if(!n)throw Object.defineProperty(Error(`"${u(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let f="u">typeof performance,m=f&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class k extends Error{}class x extends Error{}class b extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class y extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class v extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function j(e){return JSON.stringify({message:e.message,stack:e.stack})}},83110,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return a}});let n=e.r(88978),i=e.r(62361);function a(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,i.hasBasePath)(r.pathname)}catch(e){return!1}}},59144,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return l},searchParamsToUrlQuery:function(){return a},urlQueryToSearchParams:function(){return o}};for(var i in n)Object.defineProperty(r,i,{enumerable:!0,get:n[i]});function a(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function s(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function o(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,s(e));else t.set(r,s(n));return t}function l(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},71363,(e,t,r)=>{"use strict";e.i(86038),Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return o},formatWithValidation:function(){return c},urlObjectKeys:function(){return l}};for(var i in n)Object.defineProperty(r,i,{enumerable:!0,get:n[i]});let a=e.r(44066)._(e.r(59144)),s=/https?|ftp|gopher|file/;function o(e){let{auth:t,hostname:r}=e,n=e.protocol||"",i=e.pathname||"",o=e.hash||"",l=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),l&&"object"==typeof l&&(l=String(a.urlQueryToSearchParams(l)));let d=e.search||l&&`?${l}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),i&&"/"!==i[0]&&(i="/"+i)):c||(c=""),o&&"#"!==o[0]&&(o="#"+o),d&&"?"!==d[0]&&(d="?"+d),i=i.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${i}${d}${o}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return o(e)}},77204,(e,t,r)=>{t.exports={en:{navLabel:"Security page navigation",security:"Security",blogs:"Blogs",contact:"Contact",eyebrow:"Application security · Bergen, Norway",title:"Ap
1plication Security & Secure Software Architecture",intro:"I help engineering teams design secure APIs, manage software-supply-chain risk, implement practical DevSecOps controls, and build secure cloud applications using Rust, Python, React and Azure.",discuss:"Discuss a security problem",notes:"Read my field notes",where:"Where I work",capabilitiesTitle:"Security close to the engineering work",verification:"Verification",evidenceTitle:"Requirements need evidence",evidence1:"I use the OWASP Application Security Verification Standard to turn broad security goals into requirements a team can test. Some controls belong in CI; others need architecture review, code review or a deliberately awkward abuse test.",evidence2:"The OWASP Top 10 is useful for explaining common risks. ASVS is what I reach for when a team needs acceptance criteria and evidence that a control actually works.",method:"Working method",methodTitle:"From a real risk to something we can verify",perspective:"A practical perspective",perspectiveTitle:"I work at the boundary between architecture and delivery",perspectiveText:"My background spans hands-on software development, technical leadership and academic research. I am most useful when a security question crosses those boundaries: an Entra design that also has to work in an API, a dependency policy developers can live with, or an architecture decision that needs evidence rather than reassurance.",ctaLabel:"Have a difficult security decision?",ctaTitle:"Tell me what you are building and where the uncertainty is.",cta:"Start a conversation",capabilities:[["Secure architecture and threat modelling","I start with the assets, people and trust boundaries that matter. The useful output is not a perfect diagram; it is a short list of risks and decisions the team can act on.","STRIDE · attack paths · trust boundaries · security ADRs"],["API security, OAuth 2.0, OIDC and Entra ID","Signing in and being allowed to perform an action are different problems. I design both, including tenant and resource-level checks that are easy to miss in APIs.","OAuth 2.0 · OIDC · Microsoft Entra ID · APIM · Zero Trust"],["Secure SDLC and security requirements","I prefer a few clear requirements in a story and pipeline over a large policy nobody reads. OWASP ASVS gives those requirements a testable foundation.","OWASP ASVS · abuse cases · acceptance criteria · security gates"],["Software supply-chain security","An SBOM is only useful when a finding can be connected to a deployed service, an owner and a decision. That connection is where I put most of the effort.","CycloneDX · Dependency-Track · provenance · CI/CD hardening"],["Security-focused code review","I pay particular attention to authorization, data access, file handling, error paths and the assumptions hidden between frontend and backend code.","Rust · Python/FastAPI · React/Next.js · PostgreSQL · MS SQL"],["Cloud and platform security","My focus is the path an identity, request or secret takes through the system: who can reach it, what they can do and what evidence remains afterwards.","Azure · Key Vault · WAF · private endpoints · security telemetry"],["AI-assisted development security","Coding agents make it cheaper to create code and easier to create risk at scale. I work on practical boundaries for tool access, data, review and auditability.","least privilege · tool isolation · audit trails · review policy"]],workflow:[["Understand","Start with the system, its sensitive assets and the ways it could realistically fail or be abused."],["Decide","Choose proportionate controls and write down ownership, trade-offs and the reasons behind them."],["Verify","Combine ASVS requirements, automated checks and focused human testing. No single tool is enough."],["Learn","Use findings and incidents to improve the shared patterns, not only the application where they appeared."]]},no:{navLabel:"Navigasjon for sikkerhetssiden",security:"Sikkerhet",blogs:"Blogg",contact:"Kontakt",eyebrow:"Applikasjonssikkerhet · Bergen, Norge",title:"Ap
1plikasjonssikkerhet og sikker programvarearkitektur",intro:"Jeg hjelper utviklingsteam med å designe sikre API-er, håndtere risiko i programvareleverandørkjeden, innføre praktiske DevSecOps-kontroller og bygge sikre skyløsninger med Rust, Python, React og Azure.",discuss:"Diskuter et sikkerhetsproblem",notes:"Les feltnotatene mine",where:"Dette arbeider jeg med",capabilitiesTitle:"Sikkerhet tett på utviklingsarbeidet",verification:"Verifisering",evidenceTitle:"Krav må kunne dokumenteres",evidence1:"Jeg bruker OWASP Application Security Verification Standard til å gjøre overordnede sikkerhetsmål om til krav teamet kan teste. Noen kontroller hører hjemme i CI; andre krever arkitekturgjennomgang, kodegjennomgang eller målrettet misbrukstesting.",evidence2:"OWASP Top 10 er nyttig for å forklare vanlige risikoer. ASVS bruker jeg når et team trenger akseptansekriterier og dokumentasjon på at en kontroll faktisk virker.",method:"Arbeidsmetode",methodTitle:"Fra reell risiko til noe vi kan verifisere",perspective:"Et praktisk perspektiv",perspectiveTitle:"Jeg arbeider i grenseflaten mellom arkitektur og leveranse",perspectiveText:"Bakgrunnen min omfatter praktisk programvareutvikling, teknisk ledelse og akademisk forskning. Jeg er mest nyttig når et sikkerhetsspørsmål krysser disse grensene: et Entra-design som også må fungere i et API, en avhengighetspolicy utviklere kan leve med, eller en arkitekturbeslutning som trenger dokumentasjon fremfor forsikringer.",ctaLabel:"Har du en vanskelig sikkerhetsbeslutning?",ctaTitle:"Fortell hva du bygger, og hvor usikkerheten ligger.",cta:"Start en samtale",capabilities:[["Sikker arkitektur og trusselmodellering","Jeg starter med verdiene, menneskene og tillitsgrensene som betyr noe. Det nyttige resultatet er ikke et perfekt diagram, men en kort liste over risikoer og beslutninger teamet kan handle på.","STRIDE · angrepsveier · tillitsgrenser · sikkerhets-ADR-er"],["API-sikkerhet, OAuth 2.0, OIDC og Entra ID","Innlogging og tillatelse til å utføre en handling er to forskjellige problemer. Jeg designer begge deler, inkludert tenant- og ressurskontroller som lett overses i API-er.","OAuth 2.0 · OIDC · Microsoft Entra ID · APIM · Zero Trust"],["Sikker SDLC og sikkerhetskrav","Jeg foretrekker noen få tydelige krav i en sak og pipeline fremfor en omfattende policy ingen leser. OWASP ASVS gir kravene et testbart fundament.","OWASP ASVS · misbrukstilfeller · akseptansekriterier · sikkerhetsporter"],["Sikkerhet i programvareleverandørkjeden","En SBOM er bare nyttig når et funn kan knyttes til en produksjonstjeneste, en eier og en beslutning. Det er denne koblingen jeg legger mest arbeid i.","CycloneDX · Dependency-Track · proveniens · CI/CD-herding"],["Sikkerhetsrettet kodegjennomgang","Jeg legger særlig vekt på autorisasjon, datatilgang, filhåndtering, feilstier og antakelsene som skjuler seg mellom frontend- og backend-kode.","Rust · Python/FastAPI · React/Next.js · PostgreSQL · MS SQL"],["Sky- og plattformsikkerhet","Jeg følger veien en identitet, forespørsel eller hemmelighet tar gjennom systemet: hvem som kan nå den, hva de kan gjøre, og hvilke spor som står igjen.","Azure · Key Vault · WAF · private endepunkter · sikkerhetstelemetri"],["Sikkerhet ved AI-assistert utvikling","Kodeagenter gjør det billigere å lage kode og enklere å skape risiko i stor skala. Jeg arbeider med praktiske grenser for verktøytilgang, data, gjennomgang og revisjonsspor.","minste privilegium · verktøyisolasjon · revisjonsspor · gjennomgangspolicy"]],workflow:[["Forstå","Start med systemet, de sensitive verdiene og hvordan det realistisk kan feile eller misbrukes."],["Beslutte","Velg forholdsmessige kontroller og dokumenter eierskap, avveininger og begrunnelser."],["Verifisere","Kombiner ASVS-krav, automatiserte kontroller og målrettet menneskelig testing. Ett verktøy er aldri nok."],["Lære","Bruk funn og hendelser til å forbedre felles mønstre, ikke bare applikasjonen der de oppstod."]]}}},26075,e=>{"use strict";var t=e.i(18269),r=e.i(15921),n=e.i(80157),i=e.i(81917),a=e.i(77204);e.s(["SecurityContent",0,function(){let{language:e}=(0,i.useLanguage)(),s=a.default[e];return(0,t.jsxs)("main",{className:"min-h-screen bg-[#0C0C0C] text-[#F5F5F5]",children:[(0,t.jsx)("nav",{"aria-label":s.navLabel,className:"sticky top-0 z-50 border-b border-white/10 bg-[#0C0C0C]/95 backdrop-blur-md",children:(0,t.jsxs)("div",{className:"mx-auto flex max-w-[1120px] items-center justify-between gap-4 px-6 py-4",children:[(0,t.jsxs)(r.default,{className:"font-black uppercase tracking-tighter",href:"/",children:["Suresh K. Mukhiya ",(0,t.jsx)("span",{className:"font-mono text-xs text-[#00FF41]",children:".PhD"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-4 font-mono text-[11px] uppercase tracking-[0.15em]",children:[(0,t.jsx)("span",{className:"hidden border-b-2 border-[#00FF41] pb-1 font-bold text-[#00FF41] md:inline",children:s.security}),(0,t.jsx)(r.default,{className:"hidden text-white/65 hover:text-white sm:inline",href:"/blogs",children:s.blogs}),(0,t.jsx)(r.default,{className:"hidden text-white/65 hover:text-white sm:inline",href:"/connect",children:s.contact}),(0,t.jsx)(n.LanguageSwitcher,{})]})]})}),(0,t.jsx)("section",{className:"border-b border-white/10 px-6 py-20 md:py-28",children:(0,t.jsxs)("div",{className:"mx-auto max-w-[1120px]",children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.3em] text-[#00FF41]",children:s.eyebrow}),(0,t.jsx)("h1",{className:"mt-6 max-w-5xl text-5xl font-black leading-[0.95] tracking-tighter md:text-7xl",children:s.title}),(0,t.jsx)("p",{className:"mt-8 max-w-3xl text-xl font-light leading-8 text-white/75 md:text-2xl md:leading-9",children:s.intro}),(0,t.jsxs)("div",{className:"mt-10 flex flex-wrap gap-4",children:[(0,t.jsx)("a",{className:"bg-[#00FF41] px-6 py-3 font-mono text-xs font-bold uppercase tracking-widest text-[#0C0C0C] hover:bg-white",href:"mailto:[email protected]?subject=Application%20security%20collaboration",children:s.discuss}),(0,t.jsx)(r.default,{className:"border border-white/20 px-6 py-3 font-mono text-xs font-bold uppercase tracking-widest hover:border-[#00FF41] hover:text-[#00FF41]",href:"/blog/the-api-knew-who-i-was-authorization",children:s.notes})]})]})}),(0,t.jsx)("section",{className:"px-6 py-20",children:(0,t.jsxs)("div",{className:"mx-auto max-w-[1120px]",children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.25em] text-[#00FF41]",children:s.where}),(0,t.jsx)("h2",{className:"mt-3 max-w-3xl text-3xl font-black tracking-tight md:text-5xl",children:s.capabilitiesTitle}),(0,t.jsx)("div",{className:"mt-12 grid gap-5 md:grid-cols-2",children:s.capabilities.map(([e,r,n])=>(0,t.jsxs)("article",{className:"border border-white/10 bg-[#141414] p-7 transition-colors hover:border-[#00FF41]/60",children:[(0,t.jsx)("h3",{className:"text-xl font-bold",children:e}),(0,t.jsx)("p",{className:"mt-4 leading-7 text-white/70",children:r}),(0,t.jsx)("p",{className:"mt-5 font-mono text-xs leading-5 text-[#00FF41]",children:n})]},e))})]})}),(0,t.jsx)("section",{className:"border-y border-white/10 bg-[#101510] px-6 py-20",children:(0,t.jsxs)("div",{className:"mx-auto grid max-w-[1120px] gap-12 lg:grid-cols-12",children:[(0,t.jsxs)("div",{className:"lg:col-span-5",children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.25em] text-[#00FF41]",children:s.verification}),(0,t.jsx)("h2",{className:"mt-3 text-3xl font-black tracking-tight md:text-4xl",children:s.evidenceTitle})]}),(0,t.jsxs)("div",{className:"lg:col-span-7",children:[(0,t.jsx)("p",{className:"text-lg leading-8 text-white/75",children:s.evidence1}),(0,t.jsx)("p",{className:"mt-5 text-lg leading-8 text-white/75",children:s.evidence2})]})]})}),(0,t.jsx)("section",{className:"px-6 py-20",children:(0,t.jsxs)("div",{className:"mx-auto max-w-[1120px]",children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.25em] text-[#00FF41]",children:s.method}),(0,t.jsx)("h2",{className:"mt-3 text-3xl font-black tracking-tight md:text-5xl",children:s.methodTitle}),(0,t.jsx)("div",{className:"mt-12 grid gap-px bg-white/10 md:grid-cols-4",children:s.workflow.map(([e,r],n)=>(0,t.jsxs)("article",{className:"bg-[#0C0C0C] p-6",children:[(0,t.jsx)("span",{className:"font-mono text-xs font-bold text-[#00FF41]",children:String(n+1).padStart(2,"0")}),(0,t.jsx)("h3",{className:"mt-5 text-xl font-bold",children:e}),(0,t.jsx)("p",{className:"mt-3 text-sm leading-6 text-white/65",children:r})]},e))})]})}),(0,t.jsx)("section",{className:"border-t border-white/10 px-6 py-20",children:(0,t.jsxs)("div",{className:"mx-auto max-w-[860px]",children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.25em] text-[#00FF41]",children:s.perspective}),(0,t.jsx)("h2",{className:"mt-3 text-3xl font-black tracking-tight",children:s.perspectiveTitle}),(0,t.jsx)("p",{className:"mt-5 text-lg leading-8 text-white/70",children:s.perspectiveText})]})}),(0,t.jsx)("section",{className:"bg-[#00FF41] px-6 py-16 text-[#071008]",children:(0,t.jsxs)("div",{className:"mx-auto flex max-w-[1120px] flex-col justify-between gap-8 md:flex-row md:items-center",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-mono text-xs font-bold uppercase tracking-[0.25em]",children:s.ctaLabel}),(0,t.jsx)("h2",{className:"mt-3 max-w-2xl text-3xl font-black tracking-tight md:text-4xl",children:s.ctaTitle})]}),(0,t.jsx)("a",{className:"shrink-0 border-2 border-[#071008] px-6 py-3 font-mono text-xs font-bold uppercase tracking-widest hover:bg-[#071008] hover:text-[#00FF41]",href:"mailto:[email protected]?subject=Application%20security%20collaboration",children:s.cta})]})})]})}])},80157,e=>{"use strict";var t=e.i(18269),r=e.i(81917);e.s(["LanguageSwitcher",0,function(){let{language:e,setLanguage:n,availableLanguages:i}=(0,r.useLanguage)();return(0,t.jsx)("div",{"aria-label":"Language / Språk",className:"flex items-center gap-1",role:"group",children:i.map(r=>(0,t.jsx)("button",{"aria-pressed":e===r.code,className:`border px-2.5 py-1 font-mono text-[10px] font-bold uppercase tracking-wider transition-colors ${e===r.code?"border-[#00FF41] bg-[#00FF41] text-[#0C0C0C]":"border-white/20 text-white/65 hover:border-white/50 hover:text-white"}`,onClick:()=>n(r.code),type:"button",children:r.nativeName},r.code))})}])}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.