Deploy to GitHub pages
0
.nojekyll
Normal file
16
404.html
Normal file
1
assets/css/styles.bc57c28f.css
Normal file
|
After Width: | Height: | Size: 456 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 38 KiB |
BIN
assets/images/escalation-en-1383a06fd3b62043d9022637c9fbfb7b.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
1
assets/js/0cb6a320.6161fd47.js
Normal file
1
assets/js/0e384e19.e284b58b.js
Normal file
1
assets/js/0fb42ef8.b544a03f.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3218],{2447(e,t,s){s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"sets/tcp/index","title":"TCP","description":"The TCP tab is the core of DPI bypass configuration. It contains three sub-tabs matching three aspects of packet processing:","source":"@site/docs/sets/tcp/index.md","sourceDirName":"sets/tcp","slug":"/sets/tcp/","permalink":"/b4/docs/sets/tcp/","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/sets/tcp/index.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"TCP"},"sidebar":"tutorialSidebar","previous":{"title":"Targets","permalink":"/b4/docs/sets/targets"},"next":{"title":"General","permalink":"/b4/docs/sets/tcp/general"}}');var i=s(2615),r=s(416);const o={sidebar_position:2,title:"TCP"},c=void 0,a={},l=[];function p(e){const t={a:"a",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The TCP tab is the core of DPI bypass configuration. It contains three sub-tabs matching three aspects of packet processing:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"./general",children:"General"})," - limits, delays, duplication"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"./splitting",children:"Splitting"})," - breaking packets into pieces"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"./faking",children:"Faking"})," - sending fake packets, desync, mutation"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},416(e,t,s){s.d(t,{R:()=>o,x:()=>c});var n=s(9471);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
|
||||
1
assets/js/1194.669afd4b.js
Normal file
1
assets/js/1244.e5d4e576.js
Normal file
1
assets/js/1591.67fbccbd.js
Normal file
1
assets/js/1634.d60b67db.js
Normal file
1
assets/js/17896441.ea2577d6.js
Normal file
1
assets/js/1829.3cf39076.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1829],{1829(c,e,s){s.d(e,{createPacketServices:()=>a.$});var a=s(790);s(6100)}}]);
|
||||
1
assets/js/19db0f96.cbb7d1e4.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[924],{8734(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"advanced/config","title":"Configuration file","description":"English translation is in progress. See the Russian version.","source":"@site/docs/advanced/config.md","sourceDirName":"advanced","slug":"/advanced/config","permalink":"/b4/docs/advanced/config","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/advanced/config.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Configuration file"},"sidebar":"tutorialSidebar","previous":{"title":"CLI parameters","permalink":"/b4/docs/advanced/cli"},"next":{"title":"How TSPU works","permalink":"/b4/docs/advanced/tspu"}}');var i=t(2615),s=t(416);const a={sidebar_position:2,title:"Configuration file"},r=void 0,c={},d=[];function l(e){const n={a:"a",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(n.p,{children:["English translation is in progress. See the ",(0,i.jsx)(n.a,{href:"/ru/docs/advanced/config",children:"Russian version"}),"."]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},416(e,n,t){t.d(n,{R:()=>a,x:()=>r});var o=t(9471);const i={},s=o.createContext(i);function a(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
|
||||
1
assets/js/1aebc79a.06fcbd41.js
Normal file
1
assets/js/1df93b7f.d39434ab.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4583],{9446(e,t,s){s.r(t),s.d(t,{default:()=>A});var i=s(3526),n=s(3840),o=s(9641),c=s(6552),r=s(2190),l=s(7333);const a="features_t9lD",d="sectionTitle_JIRO",h="docCard_LdKM";var u=s(2615);const m=[{titleId:"home.section.intro.title",titleDefault:"Introduction",descriptionId:"home.section.intro.desc",descriptionDefault:"What b4 is, how censorship bypass works, and what you need to start.",link:"/docs/intro"},{titleId:"home.section.install.title",titleDefault:"Installation",descriptionId:"home.section.install.desc",descriptionDefault:"Install on Linux, OpenWRT, ASUS Merlin, Keenetic, MikroTik, and Docker.",link:"/docs/install/"},{titleId:"home.section.quickstart.title",titleDefault:"Quickstart",descriptionId:"home.section.quickstart.desc",descriptionDefault:"From first launch to a working bypass in 5 minutes via the web UI.",link:"/docs/quickstart"},{titleId:"home.section.sets.title",titleDefault:"Sets",descriptionId:"home.section.sets.desc",descriptionDefault:"Bypass configuration bundles: targets, TCP/UDP strategies, routing.",link:"/docs/sets/"}];function p({titleId:e,titleDefault:t,descriptionId:s,descriptionDefault:c,link:r}){return(0,u.jsx)("div",{className:(0,i.A)("col col--6"),children:(0,u.jsxs)("div",{className:h,children:[(0,u.jsx)(l.A,{as:"h3",children:(0,u.jsx)(n.A,{to:r,children:(0,u.jsx)(o.A,{id:e,children:t})})}),(0,u.jsx)("p",{children:(0,u.jsx)(o.A,{id:s,children:c})})]})})}function x(){return(0,u.jsx)("section",{className:a,children:(0,u.jsxs)("div",{className:"container",children:[(0,u.jsx)(l.A,{as:"h2",className:d,children:(0,u.jsx)(o.A,{id:"home.section.heading",children:"Documentation"})}),(0,u.jsx)("div",{className:"row",children:m.map((e,t)=>(0,u.jsx)(p,{...e},t))})]})})}const j="heroBanner_qdFl",b="buttons_AeoN",f="description_meEo";function k(){const{siteConfig:e}=(0,c.A)();return(0,u.jsx)("header",{className:(0,i.A)("hero hero--primary",j),children:(0,u.jsxs)("div",{className:"container",children:[(0,u.jsx)("h1",{className:"hero__title",children:e.title}),(0,u.jsx)("p",{className:"hero__subtitle",children:(0,u.jsx)(o.A,{id:"home.subtitle",children:"Packet-level censorship bypass for Linux and routers"})}),(0,u.jsx)("p",{className:f,children:(0,u.jsx)(o.A,{id:"home.description",children:"Web UI, automatic configuration discovery, support for routers and servers"})}),(0,u.jsxs)("div",{className:b,children:[(0,u.jsx)(n.A,{className:"button button--secondary button--lg",to:"/docs/intro",children:(0,u.jsx)(o.A,{id:"home.cta.start",children:"Get started"})}),(0,u.jsx)(n.A,{className:"button button--outline button--secondary button--lg margin-left--md",to:"https://github.com/DanielLavrushin/b4",children:(0,u.jsx)(o.A,{id:"home.cta.github",children:"GitHub"})})]})]})})}function A(){return(0,u.jsxs)(r.A,{title:(0,o.T)({id:"home.title",message:"Documentation"}),description:(0,o.T)({id:"home.meta.description",message:"b4 - censorship bypass for Linux"}),children:[(0,u.jsx)(k,{}),(0,u.jsx)("main",{children:(0,u.jsx)(x,{})})]})}}}]);
|
||||
1
assets/js/2342.11974dd9.js
Normal file
1
assets/js/2399.cee5a098.js
Normal file
1
assets/js/2aaac66a.d9b1c814.js
Normal file
1
assets/js/2b5f6f29.36c9d560.js
Normal file
1
assets/js/34271ad4.9098a06d.js
Normal file
1
assets/js/35e89358.d9082ef1.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[687],{6925(e,t,n){n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"settings/security","title":"Security","description":"Authentication","source":"@site/docs/settings/security.md","sourceDirName":"settings","slug":"/settings/security","permalink":"/b4/docs/settings/security","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/settings/security.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Security"},"sidebar":"tutorialSidebar","previous":{"title":"Geo data","permalink":"/b4/docs/settings/geodata"},"next":{"title":"Payloads","permalink":"/b4/docs/settings/payloads"}}');var i=n(2615),r=n(416);const o={sidebar_position:3,title:"Security"},c=void 0,a={},l=[{value:"Authentication",id:"authentication",level:2},{value:"HTTPS",id:"https",level:2}];function d(e){const t={admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(t.p,{children:"By default the web interface is open without a password. To restrict access, set a username and password:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Go to ",(0,i.jsx)(t.strong,{children:"Settings -> Core -> Web server"})]}),"\n",(0,i.jsxs)(t.li,{children:["Fill in the ",(0,i.jsx)(t.strong,{children:"Username"})," and ",(0,i.jsx)(t.strong,{children:"Password"})," fields"]}),"\n",(0,i.jsx)(t.li,{children:"Save the settings"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"After that, opening the web interface requires credentials."}),"\n",(0,i.jsx)(t.admonition,{title:"External access",type:"warning",children:(0,i.jsx)(t.p,{children:"If b4 is exposed externally (for example, on a VPS), set up authentication. Without it, anyone who knows the address and port gets full management access."})}),"\n",(0,i.jsx)(t.admonition,{title:"Authentication without HTTPS",type:"danger",children:(0,i.jsxs)(t.p,{children:["If authentication is enabled but HTTPS is ",(0,i.jsx)(t.strong,{children:"not configured"}),", the username and password are transmitted over the network ",(0,i.jsx)(t.strong,{children:"in plain text"}),". Anyone who can intercept traffic (for example, on public Wi-Fi) can see your credentials. Always enable HTTPS together with authentication, especially if b4 is reachable outside the local network."]})}),"\n",(0,i.jsx)(t.h2,{id:"https",children:"HTTPS"}),"\n",(0,i.jsx)(t.p,{children:"To enable HTTPS:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Prepare certificate and key files (",(0,i.jsx)(t.code,{children:".crt"}),"/",(0,i.jsx)(t.code,{children:".pem"})," and ",(0,i.jsx)(t.code,{children:".key"}),"/",(0,i.jsx)(t.code,{children:".pem"}),")"]}),"\n",(0,i.jsxs)(t.li,{children:["In the web server settings enter the file paths:","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"TLS Certificate"})," - path to the certificate file (",(0,i.jsx)(t.code,{children:".crt"})," or ",(0,i.jsx)(t.code,{children:".pem"}),")"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"TLS Key"})," - path to the key file (",(0,i.jsx)(t.code,{children:".key"})," or ",(0,i.jsx)(t.code,{children:".pem"}),")"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Save and restart"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"For a self-signed certificate (suitable for a local network):"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=b4"\n'})}),"\n",(0,i.jsxs)(t.p,{children:["Copy the files to the configuration directory (for example, ",(0,i.jsx)(t.code,{children:"/etc/b4/"}),") and point the settings at them."]}),"\n",(0,i.jsxs)(t.p,{children:["After HTTPS is enabled, the web interface is available over ",(0,i.jsx)(t.code,{children:"https://"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},416(e,t,n){n.d(t,{R:()=>o,x:()=>c});var s=n(9471);const i={},r=s.createContext(i);function o(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]);
|
||||
1
assets/js/369.51ffdcda.js
Normal file
1
assets/js/3856.dba08d38.js
Normal file
1
assets/js/3969.89a550db.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3969],{9702(e,t,a){function i(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}a.d(t,{S:()=>i}),(0,a(8).K2)(i,"populateCommonDb")},3969(e,t,a){a.d(t,{diagram:()=>C});var i=a(5786),l=a(9702),n=a(8721),r=a(7596),s=a(8),o=a(6046),c=a(7012),p=r.UI.pie,d={sections:new Map,showData:!1,config:p},u=d.sections,g=d.showData,h=structuredClone(p),f=(0,s.K2)(()=>structuredClone(h),"getConfig"),m=(0,s.K2)(()=>{u=new Map,g=d.showData,(0,r.IU)()},"clear"),w=(0,s.K2)(({label:e,value:t})=>{if(t<0)throw new Error(`"${e}" has invalid value: ${t}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);u.has(e)||(u.set(e,t),s.Rm.debug(`added new section: ${e}, with value: ${t}`))},"addSection"),S=(0,s.K2)(()=>u,"getSections"),x=(0,s.K2)(e=>{g=e},"setShowData"),D=(0,s.K2)(()=>g,"getShowData"),T={getConfig:f,clear:m,setDiagramTitle:r.ke,getDiagramTitle:r.ab,setAccTitle:r.SV,getAccTitle:r.iN,setAccDescription:r.EI,getAccDescription:r.m7,addSection:w,getSections:S,setShowData:x,getShowData:D},$=(0,s.K2)((e,t)=>{(0,l.S)(e,t),t.setShowData(e.showData),e.sections.map(t.addSection)},"populateDb"),b={parse:(0,s.K2)(async e=>{const t=await(0,o.qg)("pie",e);s.Rm.debug(t),$(t,T)},"parse")},v=(0,s.K2)(e=>`\n .pieCircle{\n stroke: ${e.pieStrokeColor};\n stroke-width : ${e.pieStrokeWidth};\n opacity : ${e.pieOpacity};\n }\n .pieOuterCircle{\n stroke: ${e.pieOuterStrokeColor};\n stroke-width: ${e.pieOuterStrokeWidth};\n fill: none;\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${e.pieTitleTextSize};\n fill: ${e.pieTitleTextColor};\n font-family: ${e.fontFamily};\n }\n .slice {\n font-family: ${e.fontFamily};\n fill: ${e.pieSectionTextColor};\n font-size:${e.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${e.pieLegendTextColor};\n font-family: ${e.fontFamily};\n font-size: ${e.pieLegendTextSize};\n }\n`,"getStyles"),y=(0,s.K2)(e=>{const t=[...e.values()].reduce((e,t)=>e+t,0),a=[...e.entries()].map(([e,t])=>({label:e,value:t})).filter(e=>e.value/t*100>=1).sort((e,t)=>t.value-e.value);return(0,c.rLf)().value(e=>e.value)(a)},"createPieArcs"),C={parser:b,db:T,renderer:{draw:(0,s.K2)((e,t,a,l)=>{s.Rm.debug("rendering pie chart\n"+e);const o=l.db,p=(0,r.D7)(),d=(0,n.$t)(o.getConfig(),p.pie),u=18,g=450,h=g,f=(0,i.D)(t),m=f.append("g");m.attr("transform","translate(225,225)");const{themeVariables:w}=p;let[S]=(0,n.I5)(w.pieOuterStrokeWidth);S??=2;const x=d.textPosition,D=Math.min(h,g)/2-40,T=(0,c.JLW)().innerRadius(0).outerRadius(D),$=(0,c.JLW)().innerRadius(D*x).outerRadius(D*x);m.append("circle").attr("cx",0).attr("cy",0).attr("r",D+S/2).attr("class","pieOuterCircle");const b=o.getSections(),v=y(b),C=[w.pie1,w.pie2,w.pie3,w.pie4,w.pie5,w.pie6,w.pie7,w.pie8,w.pie9,w.pie10,w.pie11,w.pie12];let k=0;b.forEach(e=>{k+=e});const A=v.filter(e=>"0"!==(e.data.value/k*100).toFixed(0)),K=(0,c.UMr)(C);m.selectAll("mySlices").data(A).enter().append("path").attr("d",T).attr("fill",e=>K(e.data.label)).attr("class","pieCircle"),m.selectAll("mySlices").data(A).enter().append("text").text(e=>(e.data.value/k*100).toFixed(0)+"%").attr("transform",e=>"translate("+$.centroid(e)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(o.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");const R=[...b.entries()].map(([e,t])=>({label:e,value:t})),z=m.selectAll(".legend").data(R).enter().append("g").attr("class","legend").attr("transform",(e,t)=>"translate(216,"+(22*t-22*R.length/2)+")");z.append("rect").attr("width",u).attr("height",u).style("fill",e=>K(e.label)).style("stroke",e=>K(e.label)),z.append("text").attr("x",22).attr("y",14).text(e=>o.getShowData()?`${e.label} [${e.value}]`:e.label);const M=512+Math.max(...z.selectAll("text").nodes().map(e=>e?.getBoundingClientRect().width??0));f.attr("viewBox",`0 0 ${M} 450`),(0,r.a$)(f,g,M,d.useMaxWidth)},"draw")},styles:v}}}]);
|
||||
1
assets/js/3baa195b.4f69aa9b.js
Normal file
1
assets/js/3e82e2c9.a76be4c3.js
Normal file
1
assets/js/4087.1eef5260.js
Normal file
1
assets/js/4201.a6ab29ce.js
Normal file
1
assets/js/4854.908849ea.js
Normal file
1
assets/js/48bf42f3.7f5d90cd.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[596],{7035(n,e,t){t.r(e),t.d(e,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"connections","title":"Connections","description":"English translation is in progress. See the Russian version.","source":"@site/docs/connections.md","sourceDirName":".","slug":"/connections","permalink":"/b4/docs/connections","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/connections.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10,"title":"Connections"},"sidebar":"tutorialSidebar","previous":{"title":"DPI Detector","permalink":"/b4/docs/detector"},"next":{"title":"Logs","permalink":"/b4/docs/logs"}}');var s=t(2615),i=t(416);const r={sidebar_position:10,title:"Connections"},c=void 0,a={},l=[];function d(n){const e={a:"a",p:"p",...(0,i.R)(),...n.components};return(0,s.jsxs)(e.p,{children:["English translation is in progress. See the ",(0,s.jsx)(e.a,{href:"/ru/docs/connections",children:"Russian version"}),"."]})}function u(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(d,{...n})}):d(n)}},416(n,e,t){t.d(e,{R:()=>r,x:()=>c});var o=t(9471);const s={},i=o.createContext(s);function r(n){const e=o.useContext(i);return o.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:r(n.components),o.createElement(i.Provider,{value:e},n.children)}}}]);
|
||||
1
assets/js/492.66177cb7.js
Normal file
1
assets/js/4962.87463db0.js
Normal file
1
assets/js/498efa8e.3886d14d.js
Normal file
1
assets/js/5010.6982fdfd.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5010],{5010(e,s,a){a.d(s,{createTreemapServices:()=>c.d});var c=a(8153);a(6100)}}]);
|
||||
1
assets/js/5091.e64a397a.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5091],{5091(c,e,s){s.d(e,{createArchitectureServices:()=>a.S});var a=s(2020);s(6100)}}]);
|
||||
1
assets/js/50cd606d.b864beb0.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1297],{2707(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"advanced/cli","title":"CLI parameters","description":"English translation is in progress. See the Russian version.","source":"@site/docs/advanced/cli.md","sourceDirName":"advanced","slug":"/advanced/cli","permalink":"/b4/docs/advanced/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/advanced/cli.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"CLI parameters"},"sidebar":"tutorialSidebar","previous":{"title":"Advanced","permalink":"/b4/docs/advanced/"},"next":{"title":"Configuration file","permalink":"/b4/docs/advanced/config"}}');var i=t(2615),a=t(416);const o={sidebar_position:1,title:"CLI parameters"},r=void 0,c={},d=[];function l(e){const n={a:"a",p:"p",...(0,a.R)(),...e.components};return(0,i.jsxs)(n.p,{children:["English translation is in progress. See the ",(0,i.jsx)(n.a,{href:"/ru/docs/advanced/cli",children:"Russian version"}),"."]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},416(e,n,t){t.d(n,{R:()=>o,x:()=>r});var s=t(9471);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]);
|
||||
1
assets/js/5525.b3caeaee.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5525],{7995(e,t,i){i.d(t,{A:()=>r});i(9471);var n=i(3526),o=i(9641),s=i(7333),a=i(2615);function r({className:e}){return(0,a.jsx)("main",{className:(0,n.A)("container margin-vert--xl",e),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,a.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},5525(e,t,i){i.r(t),i.d(t,{default:()=>h});i(9471);var n=i(9641),o=i(2963),s=i(2190),a=i(7995),r=i(2615);function h(){const e=(0,n.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.be,{title:e}),(0,r.jsx)(s.A,{children:(0,r.jsx)(a.A,{})})]})}}}]);
|
||||
1
assets/js/5563d910.e9764e54.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3490],{4736(t,e,s){s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"logs","title":"Logs","description":"English translation is in progress. See the Russian version.","source":"@site/docs/logs.md","sourceDirName":".","slug":"/logs","permalink":"/b4/docs/logs","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/logs.md","tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"sidebar_position":11,"title":"Logs"},"sidebar":"tutorialSidebar","previous":{"title":"Connections","permalink":"/b4/docs/connections"},"next":{"title":"MTProto / Telegram","permalink":"/b4/docs/mtproto"}}');var o=s(2615),i=s(416);const r={sidebar_position:11,title:"Logs"},a=void 0,c={},l=[];function d(t){const e={a:"a",p:"p",...(0,i.R)(),...t.components};return(0,o.jsxs)(e.p,{children:["English translation is in progress. See the ",(0,o.jsx)(e.a,{href:"/ru/docs/logs",children:"Russian version"}),"."]})}function u(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},416(t,e,s){s.d(e,{R:()=>r,x:()=>a});var n=s(9471);const o={},i=n.createContext(o);function r(t){const e=n.useContext(i);return n.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),n.createElement(i.Provider,{value:e},t.children)}}}]);
|
||||
1
assets/js/5564.612961c8.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5564],{5564(s,a,c){c.d(a,{createGitGraphServices:()=>e.b});var e=c(1524);c(6100)}}]);
|
||||
1
assets/js/5591.1df946d2.js
Normal file
1
assets/js/5616.8e203811.js
Normal file
1
assets/js/56258660.a1b47d00.js
Normal file
1
assets/js/5926.34bcd8fe.js
Normal file
1
assets/js/5993bf36.9a38ea4e.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7958],{2203(e,n,r){r.r(n),r.d(n,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"install/docker","title":"Docker","description":"Image: lavrushin/b4 on Docker Hub.","source":"@site/docs/install/docker.md","sourceDirName":"install","slug":"/install/docker","permalink":"/b4/docs/install/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/install/docker.md","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"Docker"},"sidebar":"tutorialSidebar","previous":{"title":"MikroTik","permalink":"/b4/docs/install/mikrotik"},"next":{"title":"Quickstart","permalink":"/b4/docs/quickstart"}}');var t=r(2615),c=r(416);const o={sidebar_position:6,title:"Docker"},d=void 0,i={},l=[{value:"docker-compose",id:"docker-compose",level:2},{value:"docker run",id:"docker-run",level:2},{value:"Parameters",id:"parameters",level:2},{value:"Management",id:"management",level:2},{value:"Web interface",id:"web-interface",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Image: ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/r/lavrushin/b4",children:"lavrushin/b4"})," on Docker Hub."]}),"\n",(0,t.jsx)(n.h2,{id:"docker-compose",children:"docker-compose"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"docker-compose.yml"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"services:\n b4:\n image: lavrushin/b4:latest\n container_name: b4\n network_mode: host\n cap_add:\n - NET_ADMIN\n - NET_RAW\n - SYS_MODULE\n volumes:\n - ./config:/etc/b4\n restart: unless-stopped\n"})}),"\n",(0,t.jsx)(n.p,{children:"Run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir -p config\ndocker compose up -d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"docker-run",children:"docker run"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir -p config\ndocker run -d \\\n --name b4 \\\n --network host \\\n --cap-add NET_ADMIN \\\n --cap-add NET_RAW \\\n --cap-add SYS_MODULE \\\n -v ./config:/etc/b4 \\\n --restart unless-stopped \\\n lavrushin/b4:latest\n"})}),"\n",(0,t.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Parameter"}),(0,t.jsx)(n.th,{children:"Purpose"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"network_mode: host"})}),(0,t.jsx)(n.td,{children:"b4 works with the host network stack directly"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"NET_ADMIN"})}),(0,t.jsx)(n.td,{children:"manage netfilter and firewall rules"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"NET_RAW"})}),(0,t.jsx)(n.td,{children:"use raw sockets"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SYS_MODULE"})}),(0,t.jsx)(n.td,{children:"load kernel modules (modprobe)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"-v ./config:/etc/b4"})}),(0,t.jsx)(n.td,{children:"configuration is stored on the host"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"management",children:"Management"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose logs -f b4 # logs\ndocker compose restart b4 # restart\ndocker compose down # stop\ndocker compose pull && docker compose up -d # update\n"})}),"\n",(0,t.jsx)(n.h2,{id:"web-interface",children:"Web interface"}),"\n",(0,t.jsxs)(n.p,{children:["After startup: ",(0,t.jsx)(n.code,{children:"http://localhost:7000"})]}),"\n",(0,t.jsxs)(n.p,{children:["The port is configured in ",(0,t.jsx)(n.code,{children:"config/b4.json"})," (",(0,t.jsx)(n.code,{children:"web_server.port"}),")."]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},416(e,n,r){r.d(n,{R:()=>o,x:()=>d});var s=r(9471);const t={},c=s.createContext(t);function o(e){const n=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]);
|
||||
1
assets/js/5e95c892.b9e338a4.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9647],{6393(s,e,r){r.r(e),r.d(e,{default:()=>h});r(9471);var a=r(3526),c=r(1376),u=r(2963),l=r(7377),o=r(2190),d=r(2615);function h(s){return(0,d.jsx)(u.e3,{className:(0,a.A)(c.G.wrapper.docsPages),children:(0,d.jsx)(o.A,{children:(0,l.v)(s.route.routes)})})}}}]);
|
||||
1
assets/js/6046.28ca29b2.js
Normal file
1
assets/js/6171.b9127af1.js
Normal file
1
assets/js/62fed2c4.e4e4cd7a.js
Normal file
2
assets/js/638.0c96875b.js
Normal file
9
assets/js/638.0c96875b.js.LICENSE.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
/*!
|
||||
Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable
|
||||
Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com)
|
||||
Licensed under The MIT License (http://opensource.org/licenses/MIT)
|
||||
*/
|
||||
|
||||
/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */
|
||||
|
||||
/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */
|
||||
1
assets/js/6517.9fe8ef5c.js
Normal file
1
assets/js/6659.3acb525c.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6659],{9702(t,e,a){function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(8).K2)(r,"populateCommonDb")},6659(t,e,a){a.d(e,{diagram:()=>m});var r=a(5786),i=a(9702),o=a(8721),s=a(7596),n=a(8),l=a(6046),c=s.UI.packet,d=class{constructor(){this.packet=[],this.setAccTitle=s.SV,this.getAccTitle=s.iN,this.setDiagramTitle=s.ke,this.getDiagramTitle=s.ab,this.getAccDescription=s.m7,this.setAccDescription=s.EI}static{(0,n.K2)(this,"PacketDB")}getConfig(){const t=(0,o.$t)({...c,...(0,s.zj)().packet});return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){(0,s.IU)(),this.packet=[]}},b=(0,n.K2)((t,e)=>{(0,i.S)(t,e);let a=-1,r=[],o=1;const{bitsPerRow:s}=e.getConfig();for(let{start:i,end:l,bits:c,label:d}of t.blocks){if(void 0!==i&&void 0!==l&&l<i)throw new Error(`Packet block ${i} - ${l} is invalid. End must be greater than start.`);if(i??=a+1,i!==a+1)throw new Error(`Packet block ${i} - ${l??i} is not contiguous. It should start from ${a+1}.`);if(0===c)throw new Error(`Packet block ${i} is invalid. Cannot have a zero bit field.`);for(l??=i+(c??1)-1,c??=l-i+1,a=l,n.Rm.debug(`Packet block ${i} - ${a} with label ${d}`);r.length<=s+1&&e.getPacket().length<1e4;){const[t,a]=h({start:i,end:l,bits:c,label:d},o,s);if(r.push(t),t.end+1===o*s&&(e.pushWord(r),r=[],o++),!a)break;({start:i,end:l,bits:c,label:d}=a)}}e.pushWord(r)},"populate"),h=(0,n.K2)((t,e,a)=>{if(void 0===t.start)throw new Error("start should have been set during first phase");if(void 0===t.end)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];const r=e*a-1,i=e*a;return[{start:t.start,end:r,label:t.label,bits:r-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),p={parser:{yy:void 0},parse:(0,n.K2)(async t=>{const e=await(0,l.qg)("packet",t),a=p.parser?.yy;if(!(a instanceof d))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");n.Rm.debug(e),b(e,a)},"parse")},k=(0,n.K2)((t,e,a,i)=>{const o=i.db,n=o.getConfig(),{rowHeight:l,paddingY:c,bitWidth:d,bitsPerRow:b}=n,h=o.getPacket(),p=o.getDiagramTitle(),k=l+c,u=k*(h.length+1)-(p?0:l),f=d*b+2,w=(0,r.D)(e);w.attr("viewBox",`0 0 ${f} ${u}`),(0,s.a$)(w,u,f,n.useMaxWidth);for(const[r,s]of h.entries())g(w,s,r,n);w.append("text").text(p).attr("x",f/2).attr("y",u-k/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),g=(0,n.K2)((t,e,a,{rowHeight:r,paddingX:i,paddingY:o,bitWidth:s,bitsPerRow:n,showBits:l})=>{const c=t.append("g"),d=a*(r+o)+o;for(const b of e){const t=b.start%n*s+1,e=(b.end-b.start+1)*s-i;if(c.append("rect").attr("x",t).attr("y",d).attr("width",e).attr("height",r).attr("class","packetBlock"),c.append("text").attr("x",t+e/2).attr("y",d+r/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(b.label),!l)continue;const a=b.end===b.start,o=d-2;c.append("text").attr("x",t+(a?e/2:0)).attr("y",o).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",a?"middle":"start").text(b.start),a||c.append("text").attr("x",t+e).attr("y",o).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(b.end)}},"drawWord"),u={draw:k},f={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},w=(0,n.K2)(({packet:t}={})=>{const e=(0,o.$t)(f,t);return`\n\t.packetByte {\n\t\tfont-size: ${e.byteFontSize};\n\t}\n\t.packetByte.start {\n\t\tfill: ${e.startByteColor};\n\t}\n\t.packetByte.end {\n\t\tfill: ${e.endByteColor};\n\t}\n\t.packetLabel {\n\t\tfill: ${e.labelColor};\n\t\tfont-size: ${e.labelFontSize};\n\t}\n\t.packetTitle {\n\t\tfill: ${e.titleColor};\n\t\tfont-size: ${e.titleFontSize};\n\t}\n\t.packetBlock {\n\t\tstroke: ${e.blockStrokeColor};\n\t\tstroke-width: ${e.blockStrokeWidth};\n\t\tfill: ${e.blockFillColor};\n\t}\n\t`},"styles"),m={parser:p,get db(){return new d},renderer:u,styles:w}}}]);
|
||||
1
assets/js/6965.c39d7de7.js
Normal file
1
assets/js/6ba24215.19e89ba4.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8098],{1587(e,t,o){o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"discovery","title":"Discovery","description":"English translation is in progress. See the Russian version.","source":"@site/docs/discovery.md","sourceDirName":".","slug":"/discovery","permalink":"/b4/docs/discovery","draft":false,"unlisted":false,"editUrl":"https://github.com/DanielLavrushin/b4/tree/main/docs/docs/discovery.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"Discovery"},"sidebar":"tutorialSidebar","previous":{"title":"Import from another tool","permalink":"/b4/docs/sets/import"},"next":{"title":"Domain Watchdog","permalink":"/b4/docs/watchdog"}}');var n=o(2615),i=o(416);const r={sidebar_position:7,title:"Discovery"},c=void 0,a={},d=[];function l(e){const t={a:"a",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(t.p,{children:["English translation is in progress. See the ",(0,n.jsx)(t.a,{href:"/ru/docs/discovery",children:"Russian version"}),"."]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},416(e,t,o){o.d(t,{R:()=>r,x:()=>c});var s=o(9471);const n={},i=s.createContext(n);function r(e){const t=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
|
||||
1
assets/js/7110.ba0342c4.js
Normal file
1
assets/js/7284.3baa6a6d.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7284],{7284(r,s,a){a.d(s,{diagram:()=>t});var e=a(8910),l=(a(3020),a(3405),a(8652),a(5690),a(5481),a(4685),a(1308),a(2819),a(6450),a(5697),a(378),a(8721),a(7596),a(8)),t={parser:e._$,get db(){return new e.NM},renderer:e.Lh,styles:e.tM,init:(0,l.K2)(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")}}}]);
|
||||
1
assets/js/72e0b065.506e7f78.js
Normal file
1
assets/js/740.776ed786.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[740],{740(e,s,c){c.d(s,{createPieServices:()=>a.f});var a=c(5184);c(6100)}}]);
|
||||