diff --git a/404.html b/404.html index 62464b63c..ac87dc822 100644 --- a/404.html +++ b/404.html @@ -12,13 +12,13 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/assets/js/02365777.0748c4ea.js b/assets/js/02365777.0748c4ea.js new file mode 100644 index 000000000..1b0bca2fe --- /dev/null +++ b/assets/js/02365777.0748c4ea.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2708],{9683:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=n(7462),i=(n(7294),n(3905));n(1839);const s={id:"concepts-index",title:"Concepts Index"},r=void 0,a={unversionedId:"concepts/concepts-index",id:"concepts/concepts-index",title:"Concepts Index",description:"Visual representation of the services and devices running on your Amiga brain.",source:"@site/docs/concepts/README.md",sourceDirName:"concepts",slug:"/concepts/",permalink:"/docs/concepts/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/README.md",tags:[],version:"current",frontMatter:{id:"concepts-index",title:"Concepts Index"},sidebar:"Concepts",next:{title:"Transforms and Poses",permalink:"/docs/concepts/transforms_and_poses/"}},c={},d=[{value:"Service overviews",id:"service-overviews",level:2},{value:"Not seeing what you need?",id:"not-seeing-what-you-need",level:2}],p={toc:d};function u(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,o.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Coming soon",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Visual representation of the services and devices running on your Amiga brain.")),(0,i.kt)("h2",{id:"service-overviews"},"Service overviews"),(0,i.kt)("p",null,"We provide overviews of services running on your brain and high-level instructions\non interacting with them."),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"These overviews are useful context before going through the related\n",(0,i.kt)("a",{parentName:"p",href:"/docs/examples/examples-index#brain-adk-examples"},"Brain ADK Examples"),".")),(0,i.kt)("h2",{id:"not-seeing-what-you-need"},"Not seeing what you need?"),(0,i.kt)("p",null,"Reach out to us by creating a ",(0,i.kt)("a",{parentName:"p",href:"/docs/support/#documentation-request"},"Documentation Request"),"\nbased on the instructions on our support page."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02365777.604e44fd.js b/assets/js/02365777.604e44fd.js deleted file mode 100644 index 56c021389..000000000 --- a/assets/js/02365777.604e44fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2708],{9683:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>p});var o=n(7462),i=(n(7294),n(3905));n(1839);const s={id:"concepts-index",title:"Concepts Index"},r=void 0,a={unversionedId:"concepts/concepts-index",id:"concepts/concepts-index",title:"Concepts Index",description:"Visual representation of the services and devices running on your Amiga brain.",source:"@site/docs/concepts/README.md",sourceDirName:"concepts",slug:"/concepts/",permalink:"/docs/concepts/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/README.md",tags:[],version:"current",frontMatter:{id:"concepts-index",title:"Concepts Index"},sidebar:"Conepts",next:{title:"CANBUS",permalink:"/docs/concepts/canbus_service/"}},c={},p=[{value:"Service overviews",id:"service-overviews",level:2},{value:"Not seeing what you need?",id:"not-seeing-what-you-need",level:2}],d={toc:p};function u(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Coming soon",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Visual representation of the services and devices running on your Amiga brain.")),(0,i.kt)("h2",{id:"service-overviews"},"Service overviews"),(0,i.kt)("p",null,"We provide overviews of services running on your brain and high-level instructions\non interacting with them."),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"These overviews are useful context before going through the related\n",(0,i.kt)("a",{parentName:"p",href:"/docs/examples/examples-index#brain-adk-examples"},"Brain ADK Examples"),".")),(0,i.kt)("h2",{id:"not-seeing-what-you-need"},"Not seeing what you need?"),(0,i.kt)("p",null,"Reach out to us by creating a ",(0,i.kt)("a",{parentName:"p",href:"/docs/support/#documentation-request"},"Documentation Request"),"\nbased on the instructions on our support page."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/086f7ce7.c147e24b.js b/assets/js/086f7ce7.c147e24b.js new file mode 100644 index 000000000..fde57e975 --- /dev/null +++ b/assets/js/086f7ce7.c147e24b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8153],{75:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>r,default:()=>c,frontMatter:()=>s,metadata:()=>p,toc:()=>l});var a=n(7462),o=(n(7294),n(3905));n(1839);const s={id:"create-and-propagate-poses",title:"Create and Propagate Poses"},r=void 0,p={unversionedId:"concepts/controller_101/create-and-propagate-poses",id:"concepts/controller_101/create-and-propagate-poses",title:"Create and Propagate Poses",description:"Understanding Transforms and Poses",source:"@site/docs/concepts/controller_101/README.md",sourceDirName:"concepts/controller_101",slug:"/concepts/controller_101/",permalink:"/docs/concepts/controller_101/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/controller_101/README.md",tags:[],version:"current",frontMatter:{id:"create-and-propagate-poses",title:"Create and Propagate Poses"},sidebar:"Concepts",previous:{title:"Transforms and Poses",permalink:"/docs/concepts/transforms_and_poses/"},next:{title:"CANBUS",permalink:"/docs/concepts/canbus_service/"}},i={},l=[{value:"Understanding Transforms and Poses",id:"understanding-transforms-and-poses",level:2},{value:"Creating and Propagating Poses for the Controller",id:"creating-and-propagating-poses-for-the-controller",level:2},{value:"Example",id:"example",level:3},{value:"Code Breakdown",id:"code-breakdown",level:3},{value:"Next Steps",id:"next-steps",level:2}],m={toc:l};function c(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"understanding-transforms-and-poses"},"Understanding Transforms and Poses"),(0,o.kt)("p",null,"Before we can send our robot out to drive a ",(0,o.kt)("strong",{parentName:"p"},"track")," (or ",(0,o.kt)("strong",{parentName:"p"},"path"),"),\nwe need to understand where our robot is and where we want to send it.\nFor that purposes, please refer to ",(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("a",{parentName:"strong",href:"/docs/concepts/transforms_and_poses"},"Concepts - Transforms and Poses")),"\nbefore continuing on with this overview."),(0,o.kt)("h2",{id:"creating-and-propagating-poses-for-the-controller"},"Creating and Propagating Poses for the Controller"),(0,o.kt)("p",null,"When you want the Amiga to perform a specific movement, you need to provide it with a series\nof poses that describe that movement.\nWe call these poses ",(0,o.kt)("strong",{parentName:"p"},"waypoints")," and the series of them a *",(0,o.kt)("em",{parentName:"p"},"track"),".*"),(0,o.kt)("p",null,"For a better understanding of the ",(0,o.kt)("inlineCode",{parentName:"p"},"Pose")," structure, please refer to our\n",(0,o.kt)("a",{parentName:"p",href:"/docs/concepts/transforms_and_poses/#the-farm-ng-pose-proto"},(0,o.kt)("inlineCode",{parentName:"a"},"Pose")," proto overview"),"."),(0,o.kt)("h3",{id:"example"},"Example"),(0,o.kt)("p",null,"There are several ways of creating poses and commanding your ",(0,o.kt)("inlineCode",{parentName:"p"},"Controller")," to follow them.\nLet's check how to use the concepts learned here to create poses that represent a ",(0,o.kt)("inlineCode",{parentName:"p"},"pi turn"),"\n(also know as a U turn) using the ",(0,o.kt)("inlineCode",{parentName:"p"},"pose")," structure:"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"NOTE"),": Please note that in this example we propagate the proposes from the robot frame."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-python"},'def create_pi_turn_segment(\n previous_pose: Pose3F64, next_frame_b: str, radius: float, spacing: float = 0.1\n) -> list[Pose3F64]:\n """Compute a pi turn segment.\n\n Args:\n previous_pose (Pose3F64): The previous pose.\n next_frame_b (str): The name of the child frame of the next pose.\n radius (float): The radius of the pi turn.\n spacing (float): The spacing between waypoints, in meters.\n\n Returns:\n list[Pose3F64]: The poses of the pi turn segment.\n """\n # Calculate the total arc length of the half-circle\n arc_length = pi * radius\n\n # Determine the number of segments, ensuring at least one segment\n num_segments = max(int(arc_length / spacing), 1)\n\n # Angle increment per segment\n delta_angle = pi / num_segments\n\n # Distance increment per segment\n delta_distance = arc_length / num_segments\n\n # Create a container to store the track segment waypoints\n segment_poses: list[Pose3F64] = [previous_pose]\n\n for i in range(1, num_segments + 1):\n\n # Calculate the pose for the current segment\n turn_segment: Pose3F64 = Pose3F64(\n a_from_b=Isometry3F64([delta_distance, 0, 0], Rotation3F64.Rz(delta_angle)),\n frame_a=segment_poses[-1].frame_b,\n frame_b=f"{next_frame_b}_{i-1}",\n )\n segment_poses.append(segment_poses[-1] * turn_segment)\n\n # Rename the last pose to the desired name\n segment_poses[-1].frame_b = next_frame_b\n return segment_poses\n')),(0,o.kt)("h3",{id:"code-breakdown"},"Code Breakdown"),(0,o.kt)("p",null,"Since we're in the robot frame, we always command it to drive forward, for this reason the ",(0,o.kt)("inlineCode",{parentName:"p"},"y")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"z"),"\ncomponents of our ",(0,o.kt)("inlineCode",{parentName:"p"},"Isometry3F64")," are always zero."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The robot moves forward by delta_distance (linear movement along the x-axis)."),(0,o.kt)("li",{parentName:"ul"},"It rotates by delta_angle about the z-axis."),(0,o.kt)("li",{parentName:"ul"},"This transformation is then used to calculate the new pose of the robot for that segment.")),(0,o.kt)("p",null,"In essence, by using Isometry3F64, you're able to succinctly describe both the linear and\nangular movements of the robot for each segment of its pi turn."),(0,o.kt)("h2",{id:"next-steps"},"Next Steps"),(0,o.kt)("p",null,"Make sure to check the ",(0,o.kt)("a",{parentName:"p",href:"https://amiga.farm-ng.com/docs/concepts/"},"Concepts")," page\nto know more about all the services available in your Amiga and how they interact with each other."),(0,o.kt)("p",null,"Make sure to also check our ",(0,o.kt)("a",{parentName:"p",href:"https://amiga.farm-ng.com/docs/examples/examples-index"},"Brain Controller Examples"),"\nto test the ",(0,o.kt)("inlineCode",{parentName:"p"},"Controller")," in your Amiga."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/31bfd28b.1b334c5e.js b/assets/js/31bfd28b.26fa2c21.js similarity index 65% rename from assets/js/31bfd28b.1b334c5e.js rename to assets/js/31bfd28b.26fa2c21.js index ea6c2c78b..984faae78 100644 --- a/assets/js/31bfd28b.1b334c5e.js +++ b/assets/js/31bfd28b.26fa2c21.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4370],{9053:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>u});var c=t(7462),n=(t(7294),t(3905));t(1839);const i={id:"canbus-overview",title:"CANBUS"},o="Canbus Service Overview",r={unversionedId:"concepts/canbus_service/canbus-overview",id:"concepts/canbus_service/canbus-overview",title:"CANBUS",description:"(Coming soon!)",source:"@site/docs/concepts/canbus_service/README.md",sourceDirName:"concepts/canbus_service",slug:"/concepts/canbus_service/",permalink:"/docs/concepts/canbus_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/canbus_service/README.md",tags:[],version:"current",frontMatter:{id:"canbus-overview",title:"CANBUS"},sidebar:"Conepts",previous:{title:"Concepts Index",permalink:"/docs/concepts/"},next:{title:"OAK",permalink:"/docs/concepts/oak_service/"}},a={},u=[],v={toc:u};function p(e){let{components:s,...t}=e;return(0,n.kt)("wrapper",(0,c.Z)({},v,t,{components:s,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"canbus-service-overview"},"Canbus Service Overview"),(0,n.kt)("p",null,"(Coming soon!)"))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4370],{9053:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>u});var c=t(7462),n=(t(7294),t(3905));t(1839);const i={id:"canbus-overview",title:"CANBUS"},o="Canbus Service Overview",r={unversionedId:"concepts/canbus_service/canbus-overview",id:"concepts/canbus_service/canbus-overview",title:"CANBUS",description:"(Coming soon!)",source:"@site/docs/concepts/canbus_service/README.md",sourceDirName:"concepts/canbus_service",slug:"/concepts/canbus_service/",permalink:"/docs/concepts/canbus_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/canbus_service/README.md",tags:[],version:"current",frontMatter:{id:"canbus-overview",title:"CANBUS"},sidebar:"Concepts",previous:{title:"Create and Propagate Poses",permalink:"/docs/concepts/controller_101/"},next:{title:"OAK",permalink:"/docs/concepts/oak_service/"}},a={},u=[],v={toc:u};function p(e){let{components:s,...t}=e;return(0,n.kt)("wrapper",(0,c.Z)({},v,t,{components:s,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"canbus-service-overview"},"Canbus Service Overview"),(0,n.kt)("p",null,"(Coming soon!)"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/46688559.5df58b42.js b/assets/js/46688559.5df58b42.js new file mode 100644 index 000000000..c51510461 --- /dev/null +++ b/assets/js/46688559.5df58b42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9653],{7359:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>m});var o=n(7462),r=(n(7294),n(3905));n(1839);const a={id:"transforms-and-poses",title:"Transforms and Poses"},s=void 0,i={unversionedId:"concepts/transforms_and_poses/transforms-and-poses",id:"concepts/transforms_and_poses/transforms-and-poses",title:"Transforms and Poses",description:"Fundamental Concepts",source:"@site/docs/concepts/transforms_and_poses/README.md",sourceDirName:"concepts/transforms_and_poses",slug:"/concepts/transforms_and_poses/",permalink:"/docs/concepts/transforms_and_poses/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/transforms_and_poses/README.md",tags:[],version:"current",frontMatter:{id:"transforms-and-poses",title:"Transforms and Poses"},sidebar:"Concepts",previous:{title:"Concepts Index",permalink:"/docs/concepts/"},next:{title:"Create and Propagate Poses",permalink:"/docs/concepts/controller_101/"}},p={},m=[{value:"Fundamental Concepts",id:"fundamental-concepts",level:2},{value:"Frames of Reference",id:"frames-of-reference",level:3},{value:"Transformations",id:"transformations",level:3},{value:"Quaternions",id:"quaternions",level:4},{value:"Transform math",id:"transform-math",level:4},{value:"Poses",id:"poses",level:3},{value:"The farm-ng Pose proto",id:"the-farm-ng-pose-proto",level:3},{value:"Properties of Isometry3F64",id:"properties-of-isometry3f64",level:4},{value:"Resources",id:"resources",level:3}],l={toc:m};function d(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,o.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"fundamental-concepts"},"Fundamental Concepts"),(0,r.kt)("p",null,"Before we can create autonomy applications for our robot,\nwe need to understand where our robot and other points of reference are.\nThe following concepts are critical to understand if you wish\nto develop autonomous robotics applications with your Amiga."),(0,r.kt)("h3",{id:"frames-of-reference"},"Frames of Reference"),(0,r.kt)("p",null,"In robotics, a ",(0,r.kt)("strong",{parentName:"p"},"frame of reference"),'\n(often called a "',(0,r.kt)("strong",{parentName:"p"},"frame"),'", ',(0,r.kt)("strong",{parentName:"p"},"coordinate frame"),', or "',(0,r.kt)("strong",{parentName:"p"},"reference frame"),'")\nis a description of a coordinate system of 3 orthogonal axes (',(0,r.kt)("strong",{parentName:"p"},"x"),", ",(0,r.kt)("strong",{parentName:"p"},"y"),", & ",(0,r.kt)("strong",{parentName:"p"},"z"),") defined by\nthe position and orientation of the object."),(0,r.kt)("p",null,"The two primary frames you need to be aware of are:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"World Frame (",(0,r.kt)("inlineCode",{parentName:"strong"},"world"),")"),":\nConventionally, this is a fixed frame representing the environment in which the robot operates.\nThink of it as an anchor point that doesn't move.\nIf using RTK GPS, a typical world frame coordinate system is defined at the location\nof your RTK base station."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Robot Frame (",(0,r.kt)("inlineCode",{parentName:"strong"},"robot"),")"),": This frame is attached to the robot.\nAs the robot moves, this frame moves with it.\nConsidering the robot is not a single point, it is important to define where on the robot\nis considered the center of the ",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," frame axes.\nAt farm-ng we choose the center of the robot (in length & width) at ground level."),(0,r.kt)("p",null,"Additional relevant frames for your Amiga-based robotics applications\nmay include the ",(0,r.kt)("inlineCode",{parentName:"p"},"camera")," frame, the ",(0,r.kt)("inlineCode",{parentName:"p"},"imu")," frame, the ",(0,r.kt)("inlineCode",{parentName:"p"},"gps_antenna")," frame, and so on."),(0,r.kt)("p",null,"Each ",(0,r.kt)("strong",{parentName:"p"},"reference frame")," is represented below as a set of red-green-blue axes.\nThe frames are connected by 6 degree-of-freedom ",(0,r.kt)("strong",{parentName:"p"},"transforms"),",\nrepresented below by yellow arrows."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://github.com/farm-ng/amiga-dev-kit/assets/53625197/656fff08-0296-4d81-8990-dc65d7f1af16",alt:"image"})),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Image Credit: ",(0,r.kt)("a",{parentName:"em",href:"https://foxglove.dev/blog/understanding-ros-transforms"},"https://foxglove.dev/blog/understanding-ros-transforms"))),(0,r.kt)("h3",{id:"transformations"},"Transformations"),(0,r.kt)("p",null,"A ",(0,r.kt)("strong",{parentName:"p"},"transformation"),", or ",(0,r.kt)("strong",{parentName:"p"},"transform"),", describes how to move from one reference frame to another."),(0,r.kt)("p",null,"Typically in robotics we represent these transforms as an ",(0,r.kt)("strong",{parentName:"p"},"isometry")," transformation in 3D space.\nThis is a distance-preserving 6 degree-of-freedom (DOF) transformation\nthat includes a translation (3 DOF) and a rotation (the other 3 DOF)."),(0,r.kt)("p",null,"For instance, we can represent the transformation from the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," reference frame\nto the ",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," reference frame.\nOur naming convention at farm-ng is to call this the ",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)("inlineCode",{parentName:"strong"},"world_from_robot"))," transformation,\nfollowing a ",(0,r.kt)("inlineCode",{parentName:"p"},"_from_")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"_from_")," naming convention."),(0,r.kt)("p",null,"This transform contains the ",(0,r.kt)("strong",{parentName:"p"},"translation")," along the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," ",(0,r.kt)("strong",{parentName:"p"},"x, y, z")," axes,\nas well as the ",(0,r.kt)("strong",{parentName:"p"},"rotation")," required to align the axes."),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"translation"),", a 3-dimensional linear offset,\nis represented as a vector of ",(0,r.kt)("inlineCode",{parentName:"p"},"[x, y, z]")," coordinates in the parent reference frame."),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"rotation"),", a 3-dimensional rotation, can be represented in a number of ways,\nbut typically is represented as a ",(0,r.kt)("strong",{parentName:"p"},"quaternion"),"."),(0,r.kt)("h4",{id:"quaternions"},"Quaternions"),(0,r.kt)("p",null,"Quaternions are a type of mathematical object used to represent rotations in 3D space."),(0,r.kt)("p",null,"Quaternions consist of four numbers ",(0,r.kt)("inlineCode",{parentName:"p"},"(x, y, z, w)")," (or sometimes in order ",(0,r.kt)("inlineCode",{parentName:"p"},"(w, x, y, z)"),").\n",(0,r.kt)("inlineCode",{parentName:"p"},"w")," represents the scalar (or real) part of the rotation\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"x"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"y"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"z")," are the vector (or imaginary) parts."),(0,r.kt)("p",null,"Quaternions are an alternative to other methods like Euler angles or rotation matrices.\nQuaternions are particularly useful because they are compact,\navoid certain problems like gimbal lock, and can be more computationally efficient."),(0,r.kt)("h4",{id:"transform-math"},"Transform math"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Transforms")," can be mathematically manipulated to understand where ",(0,r.kt)("strong",{parentName:"p"},"coordinate frames"),"\nare in relation to one another.\nMost commonly, you will ",(0,r.kt)("strong",{parentName:"p"},"invert")," transforms and you will ",(0,r.kt)("strong",{parentName:"p"},"multiply")," transforms."),(0,r.kt)("p",null,"If you know the transform from the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," coordinate frame to the ",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," coordinate frame (",(0,r.kt)("inlineCode",{parentName:"p"},"world_from_robot"),"),\nyou can ",(0,r.kt)("strong",{parentName:"p"},"invert")," that transform to get the transform from the ",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," coordinate frame\nto the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," coordinate frame (",(0,r.kt)("inlineCode",{parentName:"p"},"robot_from_world"),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"world_from_robot = robot_from_imu^-1\n")),(0,r.kt)("p",null,"If you know two transforms with a common frame, you can ",(0,r.kt)("strong",{parentName:"p"},"multiply")," them."),(0,r.kt)("p",null,"Say you know ",(0,r.kt)("inlineCode",{parentName:"p"},"world_from_robot")," and the ",(0,r.kt)("inlineCode",{parentName:"p"},"robot_from_imu")," transform from your\n",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," frame to your ",(0,r.kt)("inlineCode",{parentName:"p"},"imu")," frame (where the IMU is on your robot).\nYou can calculate the transform from the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," frame to the ",(0,r.kt)("inlineCode",{parentName:"p"},"imu")," frame (",(0,r.kt)("inlineCode",{parentName:"p"},"world_from_imu"),")\nwith transform ",(0,r.kt)("strong",{parentName:"p"},"multiplication"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-python"},"world_from_imu = world_from_robot * robot_from_imu\n")),(0,r.kt)("h3",{id:"poses"},"Poses"),(0,r.kt)("p",null,"We tend to think of where our robot is as a ",(0,r.kt)("strong",{parentName:"p"},"pose"),", a combination of ",(0,r.kt)("strong",{parentName:"p"},"position")," and ",(0,r.kt)("strong",{parentName:"p"},"orientation"),".\nThe ",(0,r.kt)("strong",{parentName:"p"},"position")," being where the robot is, and the ",(0,r.kt)("strong",{parentName:"p"},"orientation")," being which way the robot is facing."),(0,r.kt)("p",null,"A pose is, however, undetermined as there needs to be a ",(0,r.kt)("strong",{parentName:"p"},"frame of reference")," the position\nand orientation are in.\nQueue ",(0,r.kt)("strong",{parentName:"p"},"transforms"),"!"),(0,r.kt)("p",null,"We can define the ",(0,r.kt)("strong",{parentName:"p"},"pose")," of our robot as the 6-DOF transformation from the ",(0,r.kt)("inlineCode",{parentName:"p"},"world")," frame\nto our ",(0,r.kt)("inlineCode",{parentName:"p"},"robot")," frame (",(0,r.kt)("inlineCode",{parentName:"p"},"world_from_robot"),")."),(0,r.kt)("p",null,"We are not limited to representing the ",(0,r.kt)("inlineCode",{parentName:"p"},"world_from_robot")," transformation as a pose.\nAny transform can be represented as a pose by correctly specifying the ",(0,r.kt)("inlineCode",{parentName:"p"},"frame_a")," (parent frame)\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"frame_b")," (child frame) in our\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-core/blob/main/protos/farm_ng/core/pose.proto"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"Pose")," protobuf definition")),"."),(0,r.kt)("h3",{id:"the-farm-ng-pose-proto"},"The farm-ng ",(0,r.kt)("inlineCode",{parentName:"h3"},"Pose")," proto"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For the latest definition of the ",(0,r.kt)("inlineCode",{parentName:"p"},"Pose")," structure, please refer to our\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-core/blob/main/protos/farm_ng/core/pose.proto"},(0,r.kt)("strong",{parentName:"a"},(0,r.kt)("inlineCode",{parentName:"strong"},"Pose")," protobuf definition")),".")),(0,r.kt)("p",null,"Each pose has an ",(0,r.kt)("inlineCode",{parentName:"p"},"Isometry3F64"),', which is a representation of rigid body transformations in 3D space.\nIn simple terms, it describes how an object moves and rotates in three-dimensional space\nwithout changing its shape.\nThe term "isometry" implies that distances between points remain unchanged during the transformation.'),(0,r.kt)("p",null,"In the context of robotics, ",(0,r.kt)("inlineCode",{parentName:"p"},"Isometry3F64")," is used to describe the movement\nand rotation of a robot in 3D space."),(0,r.kt)("h4",{id:"properties-of-isometry3f64"},"Properties of Isometry3F64"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Translation"),": This represents the linear movement of the robot.\nThis is represented as a 3D vector, where each component (x, y, z) describes movement along that axis."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Rotation"),": This represents the angular movement of the robot.\nThis rotation is represented using ",(0,r.kt)("inlineCode",{parentName:"p"},"Rotation3F64"),", which, in this context, uses the Rz method\nto denote a rotation about the z-axis."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Rz method"),": The Rz method, when applied to Rotation3F64, denotes a rotation about the z-axis.\nIn 3D space, the z-axis typically points upwards, perpendicular to the ground plane\n(assuming the x-y plane represents the ground).\nWhen you rotate an object about the z-axis, it turns around this vertical line,\nmuch like how a spinning top rotates around its central axis."),(0,r.kt)("h3",{id:"resources"},"Resources"),(0,r.kt)("p",null,"The use and multiplication of coordinate frame transforms is a fundamental concept in robotics!\nAs such, there is an abundance of quality, free resources on the topic."),(0,r.kt)("p",null,"For a slightly-less-brief introduction you can refer to ",(0,r.kt)("a",{parentName:"p",href:"https://foxglove.dev/blog/understanding-ros-transforms"},"Understanding ROS Transforms"),"."),(0,r.kt)("p",null,"If you wish to dive deeper on this topic, one option is ",(0,r.kt)("a",{parentName:"p",href:"https://ocw.mit.edu/courses/2-12-introduction-to-robotics-fall-2005/"},"MIT OpenCourseWare - Introduction To Robotics"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.0a9e2ad6.js b/assets/js/935f2afb.0a9e2ad6.js new file mode 100644 index 000000000..bf964363f --- /dev/null +++ b/assets/js/935f2afb.0a9e2ad6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"Documentation":[{"type":"category","label":"Introduction","items":[{"type":"link","label":"Introduction","href":"/docs/getting-started","docId":"getting-started"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Quick Start Guide","href":"/docs/amiga_quick_start/amiga-quick-start","docId":"amiga_quick_start/amiga-quick-start"},{"type":"link","label":"Access and Develop on the Brain","href":"/docs/ssh/","docId":"ssh/ssh"},{"type":"link","label":"Brain ADK Install","href":"/docs/brain/brain-install","docId":"brain/brain-install"},{"type":"link","label":"Next Steps","href":"/docs/brain/next-steps","docId":"brain/next-steps"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Amiga Rover","items":[{"items":[{"type":"link","label":"Dashboard Overview","href":"/docs/dashboard/","docId":"dashboard/dashboard"},{"type":"link","label":"Dashboard User Guide","href":"/docs/dashboard/dashboard-user-guide","docId":"dashboard/dashboard-user-guide"},{"type":"link","label":"Amiga Control States","href":"/docs/dashboard/control-states","docId":"dashboard/control-states"},{"type":"link","label":"Dashboard Firmware Updates","href":"/docs/dashboard/dashboard-fw","docId":"dashboard/dashboard-fw"}],"label":"Dashboard","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Pendant Overview","href":"/docs/pendant/","docId":"pendant/pendant"}],"label":"Pendant","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Intelligence Kit","items":[{"type":"link","label":"Intelligence Kit Overview","href":"/docs/intelligence-kit/overview-intel","docId":"intelligence-kit/overview-intel"},{"items":[{"type":"link","label":"Brain v1.0","href":"/docs/brain/","docId":"brain/brain"},{"type":"link","label":"Brain v2.0","href":"/docs/intelligence-kit/brain/brain-v2","docId":"intelligence-kit/brain/brain-v2"}],"label":"Brain","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"AmigaOS Artichoke 1.0 Release Notes","href":"/docs/release-notes/release-01","docId":"release-notes/release-01"}],"label":"Release Notes","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Farm Tools","items":[{"items":[{"type":"link","label":"Installation Guide","href":"/docs/farm-tools/three-point","docId":"farm-tools/three-point"}],"label":"Three Point","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Development Tools","items":[{"items":[{"type":"link","label":"Debug Cable Overview","href":"/docs/debug_cable/","docId":"debug_cable/debug-cable"},{"type":"link","label":"Service Cable Overview","href":"/docs/debug_cable/service-cable","docId":"debug_cable/service-cable"}],"label":"Cables","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Microcontroller Kit Overview","href":"/docs/mcu_kit/","docId":"mcu_kit/microcontroller-kit"}],"label":"Microcontroller Kit","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Resources/Support","items":[{"type":"link","label":"Recommended Tools","href":"/docs/hardware-tools/recommended-tools","docId":"hardware-tools/recommended-tools"},{"type":"link","label":"Frequently Asked Questions","href":"/docs/reference/faq","docId":"reference/faq"},{"type":"link","label":"Support","href":"/docs/support/","docId":"support/support"},{"type":"link","label":"GitHub 101","href":"/docs/support/github-101","docId":"support/github-101"}],"collapsed":true,"collapsible":true}],"Concepts":[{"type":"link","label":"Concepts Index","href":"/docs/concepts/","docId":"concepts/concepts-index"},{"type":"category","label":"Fundamental Concepts","items":[{"type":"link","label":"Transforms and Poses","href":"/docs/concepts/transforms_and_poses/","docId":"concepts/transforms_and_poses/transforms-and-poses"},{"type":"link","label":"Create and Propagate Poses","href":"/docs/concepts/controller_101/","docId":"concepts/controller_101/create-and-propagate-poses"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Service Overviews","items":[{"type":"link","label":"CANBUS","href":"/docs/concepts/canbus_service/","docId":"concepts/canbus_service/canbus-overview"},{"type":"link","label":"OAK","href":"/docs/concepts/oak_service/","docId":"concepts/oak_service/oak-overview"},{"type":"link","label":"GPS","href":"/docs/concepts/gps_service/","docId":"concepts/gps_service/gps-overview"},{"type":"link","label":"Filter","href":"/docs/concepts/filter_service/","docId":"concepts/filter_service/filter-overview"},{"type":"link","label":"Controller","href":"/docs/concepts/controller_service/","docId":"concepts/controller_service/controller-overview"}],"collapsed":true,"collapsible":true}],"api":[{"type":"link","label":"API Index","href":"/docs/api/","docId":"api/api-index"},{"type":"category","label":"CircuitPython ADK","items":[{"items":[{"type":"link","label":"can","href":"/docs/reference/circuitpy/utils/can","docId":"reference/circuitpy/utils/can"},{"type":"link","label":"cobid","href":"/docs/reference/circuitpy/utils/cobid","docId":"reference/circuitpy/utils/cobid"},{"type":"link","label":"general","href":"/docs/reference/circuitpy/utils/general","docId":"reference/circuitpy/utils/general"},{"type":"link","label":"io","href":"/docs/reference/circuitpy/utils/io","docId":"reference/circuitpy/utils/io"},{"type":"link","label":"main_loop","href":"/docs/reference/circuitpy/utils/main_loop","docId":"reference/circuitpy/utils/main_loop"},{"type":"link","label":"nvm","href":"/docs/reference/circuitpy/utils/nvm","docId":"reference/circuitpy/utils/nvm"},{"type":"link","label":"packet","href":"/docs/reference/circuitpy/utils/packet","docId":"reference/circuitpy/utils/packet"},{"type":"link","label":"version","href":"/docs/reference/circuitpy/utils/version","docId":"reference/circuitpy/utils/version"}],"label":"utils","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain ADK","items":[{"items":[{"type":"link","label":"canbus_client","href":"/docs/reference/brain/canbus/canbus_client","docId":"reference/brain/canbus/canbus_client"},{"type":"link","label":"packet","href":"/docs/reference/brain/canbus/packet","docId":"reference/brain/canbus/packet"}],"label":"canbus","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"examples":[{"type":"link","label":"Examples Index","href":"/docs/examples/examples-index","docId":"examples/examples-index"},{"type":"category","label":"CircuitPython Examples","items":[{"type":"link","label":"Hello Main Loop Example","href":"/docs/examples/hello_main_loop/","docId":"examples/hello_main_loop/hello-world"},{"type":"link","label":"Cansniffer Example","href":"/docs/examples/cansniffer/","docId":"examples/cansniffer/cansniffer"},{"type":"link","label":"FPV Example","href":"/docs/examples/FPV/","docId":"examples/FPV/fpv"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain Examples","items":[{"items":[{"type":"link","label":"Record and Access data","href":"/docs/examples/import_log_file/","docId":"examples/import_log_file/import-log-file"},{"type":"link","label":"Events Recorder","href":"/docs/examples/events_recorder/","docId":"examples/events_recorder/events-recorder"}],"label":"Data Recording Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"File Reader","href":"/docs/examples/file_reader/","docId":"examples/file_reader/file-reader"},{"type":"link","label":"File Converter","href":"/docs/examples/file_converter/","docId":"examples/file_converter/file-converter"},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can"},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps"}],"label":"Playback Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Camera Client","href":"/docs/examples/camera_client/","docId":"examples/camera_client/camera-client"},{"type":"link","label":"Camera Settings","href":"/docs/examples/camera_settings/","docId":"examples/camera_settings/camera-settings"},{"type":"link","label":"Camera Calibration","href":"/docs/examples/camera_calibration/","docId":"examples/camera_calibration/camera-calibration"},{"type":"link","label":"Camera Pointcloud","href":"/docs/examples/camera_pointcloud/","docId":"examples/camera_pointcloud/camera-pointcloud"},{"type":"link","label":"Camera Aruco Detector","href":"/docs/examples/camera_aruco_detector/","docId":"examples/camera_aruco_detector/camera-aruco-detector"}],"label":"Camera Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Motor State","href":"/docs/examples/motor_state/","docId":"examples/motor_state/motor-state"},{"type":"link","label":"Vehicle Twist","href":"/docs/examples/vehicle_twist/","docId":"examples/vehicle_twist/vehicle-twist"},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can"}],"label":"CAN bus Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"GPS Client","href":"/docs/examples/gps_client/","docId":"examples/gps_client/gps-client"},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps"}],"label":"GPS Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Filter Client","href":"/docs/examples/filter_client/","docId":"examples/filter_client/filter-client"}],"label":"State Estimation Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Record a Track","href":"/docs/examples/record_track/","docId":"examples/record_track/record-track"},{"type":"link","label":"Follow a track","href":"/docs/examples/controller_track/","docId":"examples/controller_track/controller-track"},{"type":"link","label":"Drive a Square","href":"/docs/examples/controller_square/","docId":"examples/controller_square/controller-square"}],"label":"Controller Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Service Client","href":"/docs/examples/service_client/","docId":"examples/service_client/service-client"},{"type":"link","label":"Service Counter","href":"/docs/examples/service_counter/","docId":"examples/service_counter/service-counter"},{"type":"link","label":"Service Propagation","href":"/docs/examples/service_propagation/","docId":"examples/service_propagation/service-propagation"}],"label":"Custom Service Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Using a VNC Viewer","href":"/docs/examples/vnc_viewer/","docId":"examples/vnc_viewer/vnc-viewer"},{"type":"link","label":"Monitor App","href":"/docs/examples/monitor_app/","docId":"examples/monitor_app/monitor-app"}],"label":"Miscellaneous Examples","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain App Tutorials","items":[{"type":"category","label":"00 - Tutorial Introduction","items":[{"type":"link","label":"00 - Introduction","href":"/docs/tutorials/introduction/tutorial-introduction","docId":"tutorials/introduction/tutorial-introduction"},{"type":"link","label":"01 - Background Knowledge","href":"/docs/tutorials/introduction/background-knowledge","docId":"tutorials/introduction/background-knowledge"},{"type":"link","label":"02 - Template Overview","href":"/docs/tutorials/introduction/template-overview","docId":"tutorials/introduction/template-overview"}],"collapsed":true,"collapsible":true},{"type":"category","label":"01 - Camera Streamer Tutorial","items":[{"type":"link","label":"00 - Camera Streamer Overview","href":"/docs/tutorials/camera_streamer/camera-streamer-overview","docId":"tutorials/camera_streamer/camera-streamer-overview"},{"type":"link","label":"01 - Template Starter","href":"/docs/tutorials/camera_streamer/template-starter","docId":"tutorials/camera_streamer/template-starter"},{"type":"link","label":"02 - Kivy Definition","href":"/docs/tutorials/camera_streamer/kivy-definition","docId":"tutorials/camera_streamer/kivy-definition"},{"type":"link","label":"03 - Python Implementation","href":"/docs/tutorials/camera_streamer/camera-stream","docId":"tutorials/camera_streamer/camera-stream"}],"collapsed":true,"collapsible":true},{"type":"category","label":"02 - Virtual Joystick Tutorial","items":[{"type":"link","label":"00 - Virtual Joystick Overview","href":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","docId":"tutorials/virtual_joystick/virtual-joystick-overview"},{"type":"link","label":"01 - Template Starter","href":"/docs/tutorials/virtual_joystick/template-starter","docId":"tutorials/virtual_joystick/template-starter"},{"type":"link","label":"02 - Device Streams","href":"/docs/tutorials/virtual_joystick/device-streams","docId":"tutorials/virtual_joystick/device-streams"},{"type":"link","label":"03 - Virtual Joystick Widget","href":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","docId":"tutorials/virtual_joystick/virtual-joystick-widget"},{"type":"link","label":"04 - Auto Control","href":"/docs/tutorials/virtual_joystick/auto-control","docId":"tutorials/virtual_joystick/auto-control"},{"type":"link","label":"05 - Further Exercises","href":"/docs/tutorials/virtual_joystick/further-exercises","docId":"tutorials/virtual_joystick/further-exercises"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Amiga Brain Development","items":[{"type":"link","label":"Developing Custom Applications","href":"/docs/brain/brain-apps","docId":"brain/brain-apps"},{"type":"link","label":"Amiga ROS Bridge","href":"/docs/brain/ros-bridge","docId":"brain/ros-bridge"}],"collapsed":true,"collapsible":true}],"contribute":[{"type":"link","label":"Documentation","href":"/docs/contribute/contribute-website","docId":"contribute/contribute-website"}]},"docs":{"amiga_quick_start/amiga-quick-start":{"id":"amiga_quick_start/amiga-quick-start","title":"Quick Start Guide","description":"Welcome to the Amiga Quick Start Guide","sidebar":"Documentation"},"api/api-index":{"id":"api/api-index","title":"API Index","description":"There are two distinct, yet compatible, APIs.","sidebar":"api"},"brain/brain":{"id":"brain/brain","title":"Brain v1.0","description":"The Brain v1.0 tag here refers to the hardware version of the brain","sidebar":"Documentation"},"brain/brain-apps":{"id":"brain/brain-apps","title":"Developing Custom Applications","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"brain/brain-install":{"id":"brain/brain-install","title":"Brain ADK Install","description":"PyPI version","sidebar":"Documentation"},"brain/next-steps":{"id":"brain/next-steps","title":"Next Steps","description":"You will not be able to follow the examples and tutorials listed","sidebar":"Documentation"},"brain/ros-bridge":{"id":"brain/ros-bridge","title":"Amiga ROS Bridge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"concepts/canbus_service/canbus-overview":{"id":"concepts/canbus_service/canbus-overview","title":"CANBUS","description":"(Coming soon!)","sidebar":"Concepts"},"concepts/concepts-index":{"id":"concepts/concepts-index","title":"Concepts Index","description":"Visual representation of the services and devices running on your Amiga brain.","sidebar":"Concepts"},"concepts/controller_101/create-and-propagate-poses":{"id":"concepts/controller_101/create-and-propagate-poses","title":"Create and Propagate Poses","description":"Understanding Transforms and Poses","sidebar":"Concepts"},"concepts/controller_service/controller-overview":{"id":"concepts/controller_service/controller-overview","title":"Controller","description":"The Controller is the autonomy hub of the Amiga.","sidebar":"Concepts"},"concepts/filter_service/filter-overview":{"id":"concepts/filter_service/filter-overview","title":"Filter","description":"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot\'s","sidebar":"Concepts"},"concepts/gps_service/gps-overview":{"id":"concepts/gps_service/gps-overview","title":"GPS","description":"The GPS service is an integral component of the Amiga\'s navigation system, utilizing a","sidebar":"Concepts"},"concepts/oak_service/oak-overview":{"id":"concepts/oak_service/oak-overview","title":"OAK","description":"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams","sidebar":"Concepts"},"concepts/transforms_and_poses/transforms-and-poses":{"id":"concepts/transforms_and_poses/transforms-and-poses","title":"Transforms and Poses","description":"Fundamental Concepts","sidebar":"Concepts"},"contribute/contribute-website":{"id":"contribute/contribute-website","title":"Documentation","description":"This page contains instructions for developers who want to contribute to the Amiga Development Kit documentation.","sidebar":"contribute"},"dashboard/control-states":{"id":"dashboard/control-states","title":"Amiga Control States","description":"Amiga control states","sidebar":"Documentation"},"dashboard/dashboard":{"id":"dashboard/dashboard","title":"Dashboard Overview","description":"DSCF6570-2-16x9-aspect-reduced","sidebar":"Documentation"},"dashboard/dashboard-fw":{"id":"dashboard/dashboard-fw","title":"Dashboard Firmware Updates","description":"Dashboard firmware updates","sidebar":"Documentation"},"dashboard/dashboard-user-guide":{"id":"dashboard/dashboard-user-guide","title":"Dashboard User Guide","description":"This is subject for change with new updates to the Dashboard.","sidebar":"Documentation"},"debug_cable/debug-cable":{"id":"debug_cable/debug-cable","title":"Debug Cable Overview","description":"image","sidebar":"Documentation"},"debug_cable/service-cable":{"id":"debug_cable/service-cable","title":"Service Cable Overview","description":"IMG-9583","sidebar":"Documentation"},"examples/camera_aruco_detector/camera-aruco-detector":{"id":"examples/camera_aruco_detector/camera-aruco-detector","title":"Camera Aruco Detector","description":"Link to cameraarucodetector/main.py","sidebar":"examples"},"examples/camera_calibration/camera-calibration":{"id":"examples/camera_calibration/camera-calibration","title":"Camera Calibration","description":"Camera Calibration","sidebar":"examples"},"examples/camera_client/camera-client":{"id":"examples/camera_client/camera-client","title":"Camera Client","description":"Link to cameraclient/main.py","sidebar":"examples"},"examples/camera_pointcloud/camera-pointcloud":{"id":"examples/camera_pointcloud/camera-pointcloud","title":"Camera Pointcloud","description":"Camera Pointcloud","sidebar":"examples"},"examples/camera_settings/camera-settings":{"id":"examples/camera_settings/camera-settings","title":"Camera Settings","description":"Camera Settings","sidebar":"examples"},"examples/cansniffer/cansniffer":{"id":"examples/cansniffer/cansniffer","title":"Cansniffer Example","description":"Link to cansniffer/code.py","sidebar":"examples"},"examples/controller_square/controller-square":{"id":"examples/controller_square/controller-square","title":"Drive a Square","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/controller_track/controller-track":{"id":"examples/controller_track/controller-track","title":"Follow a track","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/events_recorder/events-recorder":{"id":"examples/events_recorder/events-recorder","title":"Events Recorder","description":"Events Recorder","sidebar":"examples"},"examples/examples-index":{"id":"examples/examples-index","title":"Examples Index","description":"CircuitPython Examples","sidebar":"examples"},"examples/file_converter/file-converter":{"id":"examples/file_converter/file-converter","title":"File Converter","description":"This example","sidebar":"examples"},"examples/file_reader_can/file-reader-can":{"id":"examples/file_reader_can/file-reader-can","title":"File Reader CAN","description":"This file_reader_can example","sidebar":"examples"},"examples/file_reader_gps/file-reader-gps":{"id":"examples/file_reader_gps/file-reader-gps","title":"File Reader GPS","description":"This file_reader_gps_example","sidebar":"examples"},"examples/file_reader/file-reader":{"id":"examples/file_reader/file-reader","title":"File Reader","description":"In this example you will learn how to upload a given log file and","sidebar":"examples"},"examples/filter_client/filter-client":{"id":"examples/filter_client/filter-client","title":"Filter Client","description":"Link to filterclient/main.py","sidebar":"examples"},"examples/FPV/fpv":{"id":"examples/FPV/fpv","title":"FPV Example","description":"Link to FPV/code.py","sidebar":"examples"},"examples/gps_client/gps-client":{"id":"examples/gps_client/gps-client","title":"GPS Client","description":"The GPS Client example","sidebar":"examples"},"examples/hello_main_loop/hello-world":{"id":"examples/hello_main_loop/hello-world","title":"Hello Main Loop Example","description":"Link to hellomainloop/code.py","sidebar":"examples"},"examples/import_log_file/import-log-file":{"id":"examples/import_log_file/import-log-file","title":"Record and Access data","description":"This tutorial will walk you through how to record field data and","sidebar":"examples"},"examples/monitor_app/monitor-app":{"id":"examples/monitor_app/monitor-app","title":"Monitor App","description":"Building an App: Understanding the Basics","sidebar":"examples"},"examples/motor_state/motor-state":{"id":"examples/motor_state/motor-state","title":"Motor State","description":"Currently this is a very basic example","sidebar":"examples"},"examples/multi_client_geoimage/multi-client-geoimage":{"id":"examples/multi_client_geoimage/multi-client-geoimage","title":"Multi Client GeoImage","description":"Link to multiclientgeoimage/main.py"},"examples/multi_client_subscriber/multi-client-subscriber":{"id":"examples/multi_client_subscriber/multi-client-subscriber","title":"Multi Client Subscriber","description":"Link to multiclientsubscriber/main.py"},"examples/record_track/record-track":{"id":"examples/record_track/record-track","title":"Record a Track","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/service_client/service-client":{"id":"examples/service_client/service-client","title":"Service Client","description":"This example is the hello world of the farm-ng-core Event Service framework.","sidebar":"examples"},"examples/service_counter/service-counter":{"id":"examples/service_counter/service-counter","title":"Service Counter","description":"This is a subsequent example of the service_client example","sidebar":"examples"},"examples/service_propagation/service-propagation":{"id":"examples/service_propagation/service-propagation","title":"Service Propagation","description":"In this example, we will show how create a subsystem of services that can be","sidebar":"examples"},"examples/vehicle_twist/vehicle-twist":{"id":"examples/vehicle_twist/vehicle-twist","title":"Vehicle Twist","description":"Currently this is a very basic example","sidebar":"examples"},"examples/vnc_viewer/vnc-viewer":{"id":"examples/vnc_viewer/vnc-viewer","title":"Using a VNC Viewer","description":"If you want to see the screen of the Amiga and interact with it from a laptop or dev station,","sidebar":"examples"},"farm-tools/three-point":{"id":"farm-tools/three-point","title":"Installation Guide","description":"This guide is a step by step instruction on how to assemble the farm-ng three","sidebar":"Documentation"},"getting-started":{"id":"getting-started","title":"Introduction","description":"Welcome to the Amiga Development Kit","sidebar":"Documentation"},"hardware-tools/etools":{"id":"hardware-tools/etools","title":"Basic Electronics Tool Kit","description":"Basic recommended tool kit for hardware hacking"},"hardware-tools/recommended-tools":{"id":"hardware-tools/recommended-tools","title":"Recommended Tools","description":"Basic recommended tool kit for hardware hacking","sidebar":"Documentation"},"intelligence-kit/brain/brain-v2":{"id":"intelligence-kit/brain/brain-v2","title":"Brain v2.0","description":"The Brain v2.0 tag here refers to the hardware version of the brain","sidebar":"Documentation"},"intelligence-kit/overview-intel":{"id":"intelligence-kit/overview-intel","title":"Intelligence Kit Overview","description":"DSCF8544","sidebar":"Documentation"},"mcu_kit/microcontroller-kit":{"id":"mcu_kit/microcontroller-kit","title":"Microcontroller Kit Overview","description":"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit","sidebar":"Documentation"},"pendant/pendant":{"id":"pendant/pendant","title":"Pendant Overview","description":"pendant 3","sidebar":"Documentation"},"reference/brain/canbus/canbus_client":{"id":"reference/brain/canbus/canbus_client","title":"canbus.canbus_client","description":"CanbusClient Objects","sidebar":"api"},"reference/brain/canbus/packet":{"id":"reference/brain/canbus/packet","title":"canbus.packet","description":"AmigaControlState Objects","sidebar":"api"},"reference/brain/oak/camera_client":{"id":"reference/brain/oak/camera_client","title":"oak.camera_client","description":"RateLimiter Objects"},"reference/circuitpy/utils/can":{"id":"reference/circuitpy/utils/can","title":"utils.can","description":"setup\\\\can\\\\default","sidebar":"api"},"reference/circuitpy/utils/cobid":{"id":"reference/circuitpy/utils/cobid","title":"utils.cobid","description":"CanOpenObject Objects","sidebar":"api"},"reference/circuitpy/utils/general":{"id":"reference/circuitpy/utils/general","title":"utils.general","description":"path\\\\_dirname","sidebar":"api"},"reference/circuitpy/utils/io":{"id":"reference/circuitpy/utils/io","title":"utils.io","description":"sense","sidebar":"api"},"reference/circuitpy/utils/main_loop":{"id":"reference/circuitpy/utils/main_loop","title":"utils.main_loop","description":"get\\\\node\\\\id","sidebar":"api"},"reference/circuitpy/utils/nvm":{"id":"reference/circuitpy/utils/nvm","title":"utils.nvm","description":"nvm\\\\node\\\\id","sidebar":"api"},"reference/circuitpy/utils/packet":{"id":"reference/circuitpy/utils/packet","title":"utils.packet","description":"PendantButtons Objects","sidebar":"api"},"reference/circuitpy/utils/version":{"id":"reference/circuitpy/utils/version","title":"utils.version","description":"Update values following semantic versioning convention.","sidebar":"api"},"reference/faq":{"id":"reference/faq","title":"Frequently Asked Questions","description":"Using the REPL","sidebar":"Documentation"},"release-notes/release-01":{"id":"release-notes/release-01","title":"AmigaOS Artichoke 1.0 Release Notes","description":"At farm-ng we love making tools for engineers, hackers, building","sidebar":"Documentation"},"ssh/ssh":{"id":"ssh/ssh","title":"Access and Develop on the Brain","description":"Users can remotely access and start developing on the brain via SSH access.","sidebar":"Documentation"},"support/github-101":{"id":"support/github-101","title":"GitHub 101","description":"Welcome to GitHub 101!","sidebar":"Documentation"},"support/support":{"id":"support/support","title":"Support","description":"Check our FAQ\'s","sidebar":"Documentation"},"tutorials/camera_streamer/camera-stream":{"id":"tutorials/camera_streamer/camera-stream","title":"03 - Python Implementation","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/camera-streamer-overview":{"id":"tutorials/camera_streamer/camera-streamer-overview","title":"00 - Camera Streamer Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/kivy-definition":{"id":"tutorials/camera_streamer/kivy-definition","title":"02 - Kivy Definition","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/template-starter":{"id":"tutorials/camera_streamer/template-starter","title":"01 - Template Starter","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/background-knowledge":{"id":"tutorials/introduction/background-knowledge","title":"01 - Background Knowledge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/template-overview":{"id":"tutorials/introduction/template-overview","title":"02 - Template Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/tutorial-introduction":{"id":"tutorials/introduction/tutorial-introduction","title":"00 - Introduction","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/auto-control":{"id":"tutorials/virtual_joystick/auto-control","title":"04 - Auto Control","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/device-streams":{"id":"tutorials/virtual_joystick/device-streams","title":"02 - Device Streams","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/further-exercises":{"id":"tutorials/virtual_joystick/further-exercises","title":"05 - Further Exercises","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/template-starter":{"id":"tutorials/virtual_joystick/template-starter","title":"01 - Template Starter","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-overview":{"id":"tutorials/virtual_joystick/virtual-joystick-overview","title":"00 - Virtual Joystick Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-widget":{"id":"tutorials/virtual_joystick/virtual-joystick-widget","title":"03 - Virtual Joystick Widget","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.6477006d.js b/assets/js/935f2afb.6477006d.js deleted file mode 100644 index eb3e9d196..000000000 --- a/assets/js/935f2afb.6477006d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"Documentation":[{"type":"category","label":"Introduction","items":[{"type":"link","label":"Introduction","href":"/docs/getting-started","docId":"getting-started"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Quick Start Guide","href":"/docs/amiga_quick_start/amiga-quick-start","docId":"amiga_quick_start/amiga-quick-start"},{"type":"link","label":"Access and Develop on the Brain","href":"/docs/ssh/","docId":"ssh/ssh"},{"type":"link","label":"Brain ADK Install","href":"/docs/brain/brain-install","docId":"brain/brain-install"},{"type":"link","label":"Next Steps","href":"/docs/brain/next-steps","docId":"brain/next-steps"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Amiga Rover","items":[{"items":[{"type":"link","label":"Dashboard Overview","href":"/docs/dashboard/","docId":"dashboard/dashboard"},{"type":"link","label":"Dashboard User Guide","href":"/docs/dashboard/dashboard-user-guide","docId":"dashboard/dashboard-user-guide"},{"type":"link","label":"Amiga Control States","href":"/docs/dashboard/control-states","docId":"dashboard/control-states"},{"type":"link","label":"Dashboard Firmware Updates","href":"/docs/dashboard/dashboard-fw","docId":"dashboard/dashboard-fw"}],"label":"Dashboard","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Pendant Overview","href":"/docs/pendant/","docId":"pendant/pendant"}],"label":"Pendant","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Intelligence Kit","items":[{"type":"link","label":"Intelligence Kit Overview","href":"/docs/intelligence-kit/overview-intel","docId":"intelligence-kit/overview-intel"},{"items":[{"type":"link","label":"Brain v1.0","href":"/docs/brain/","docId":"brain/brain"},{"type":"link","label":"Brain v2.0","href":"/docs/intelligence-kit/brain/brain-v2","docId":"intelligence-kit/brain/brain-v2"}],"label":"Brain","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"AmigaOS Artichoke 1.0 Release Notes","href":"/docs/release-notes/release-01","docId":"release-notes/release-01"}],"label":"Release Notes","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Farm Tools","items":[{"items":[{"type":"link","label":"Installation Guide","href":"/docs/farm-tools/three-point","docId":"farm-tools/three-point"}],"label":"Three Point","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Development Tools","items":[{"items":[{"type":"link","label":"Debug Cable Overview","href":"/docs/debug_cable/","docId":"debug_cable/debug-cable"},{"type":"link","label":"Service Cable Overview","href":"/docs/debug_cable/service-cable","docId":"debug_cable/service-cable"}],"label":"Cables","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Microcontroller Kit Overview","href":"/docs/mcu_kit/","docId":"mcu_kit/microcontroller-kit"}],"label":"Microcontroller Kit","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Resources/Support","items":[{"type":"link","label":"Recommended Tools","href":"/docs/hardware-tools/recommended-tools","docId":"hardware-tools/recommended-tools"},{"type":"link","label":"Frequently Asked Questions","href":"/docs/reference/faq","docId":"reference/faq"},{"type":"link","label":"Support","href":"/docs/support/","docId":"support/support"},{"type":"link","label":"GitHub 101","href":"/docs/support/github-101","docId":"support/github-101"}],"collapsed":true,"collapsible":true}],"Conepts":[{"type":"link","label":"Concepts Index","href":"/docs/concepts/","docId":"concepts/concepts-index"},{"type":"category","label":"Service Overviews","items":[{"type":"link","label":"CANBUS","href":"/docs/concepts/canbus_service/","docId":"concepts/canbus_service/canbus-overview"},{"type":"link","label":"OAK","href":"/docs/concepts/oak_service/","docId":"concepts/oak_service/oak-overview"},{"type":"link","label":"GPS","href":"/docs/concepts/gps_service/","docId":"concepts/gps_service/gps-overview"},{"type":"link","label":"Filter","href":"/docs/concepts/filter_service/","docId":"concepts/filter_service/filter-overview"},{"type":"link","label":"Controller","href":"/docs/concepts/controller_service/","docId":"concepts/controller_service/controller-overview"}],"collapsed":true,"collapsible":true}],"api":[{"type":"link","label":"API Index","href":"/docs/api/","docId":"api/api-index"},{"type":"category","label":"CircuitPython ADK","items":[{"items":[{"type":"link","label":"can","href":"/docs/reference/circuitpy/utils/can","docId":"reference/circuitpy/utils/can"},{"type":"link","label":"cobid","href":"/docs/reference/circuitpy/utils/cobid","docId":"reference/circuitpy/utils/cobid"},{"type":"link","label":"general","href":"/docs/reference/circuitpy/utils/general","docId":"reference/circuitpy/utils/general"},{"type":"link","label":"io","href":"/docs/reference/circuitpy/utils/io","docId":"reference/circuitpy/utils/io"},{"type":"link","label":"main_loop","href":"/docs/reference/circuitpy/utils/main_loop","docId":"reference/circuitpy/utils/main_loop"},{"type":"link","label":"nvm","href":"/docs/reference/circuitpy/utils/nvm","docId":"reference/circuitpy/utils/nvm"},{"type":"link","label":"packet","href":"/docs/reference/circuitpy/utils/packet","docId":"reference/circuitpy/utils/packet"},{"type":"link","label":"version","href":"/docs/reference/circuitpy/utils/version","docId":"reference/circuitpy/utils/version"}],"label":"utils","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain ADK","items":[{"items":[{"type":"link","label":"canbus_client","href":"/docs/reference/brain/canbus/canbus_client","docId":"reference/brain/canbus/canbus_client"},{"type":"link","label":"packet","href":"/docs/reference/brain/canbus/packet","docId":"reference/brain/canbus/packet"}],"label":"canbus","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}],"examples":[{"type":"link","label":"Examples Index","href":"/docs/examples/examples-index","docId":"examples/examples-index"},{"type":"category","label":"CircuitPython Examples","items":[{"type":"link","label":"Hello Main Loop Example","href":"/docs/examples/hello_main_loop/","docId":"examples/hello_main_loop/hello-world"},{"type":"link","label":"Cansniffer Example","href":"/docs/examples/cansniffer/","docId":"examples/cansniffer/cansniffer"},{"type":"link","label":"FPV Example","href":"/docs/examples/FPV/","docId":"examples/FPV/fpv"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain Examples","items":[{"items":[{"type":"link","label":"Record and Access data","href":"/docs/examples/import_log_file/","docId":"examples/import_log_file/import-log-file"},{"type":"link","label":"Events Recorder","href":"/docs/examples/events_recorder/","docId":"examples/events_recorder/events-recorder"}],"label":"Data Recording Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"File Reader","href":"/docs/examples/file_reader/","docId":"examples/file_reader/file-reader"},{"type":"link","label":"File Converter","href":"/docs/examples/file_converter/","docId":"examples/file_converter/file-converter"},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can"},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps"}],"label":"Playback Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Camera Client","href":"/docs/examples/camera_client/","docId":"examples/camera_client/camera-client"},{"type":"link","label":"Camera Settings","href":"/docs/examples/camera_settings/","docId":"examples/camera_settings/camera-settings"},{"type":"link","label":"Camera Calibration","href":"/docs/examples/camera_calibration/","docId":"examples/camera_calibration/camera-calibration"},{"type":"link","label":"Camera Pointcloud","href":"/docs/examples/camera_pointcloud/","docId":"examples/camera_pointcloud/camera-pointcloud"},{"type":"link","label":"Camera Aruco Detector","href":"/docs/examples/camera_aruco_detector/","docId":"examples/camera_aruco_detector/camera-aruco-detector"}],"label":"Camera Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Motor State","href":"/docs/examples/motor_state/","docId":"examples/motor_state/motor-state"},{"type":"link","label":"Vehicle Twist","href":"/docs/examples/vehicle_twist/","docId":"examples/vehicle_twist/vehicle-twist"},{"type":"link","label":"File Reader CAN","href":"/docs/examples/file_reader_can/","docId":"examples/file_reader_can/file-reader-can"}],"label":"CAN bus Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"GPS Client","href":"/docs/examples/gps_client/","docId":"examples/gps_client/gps-client"},{"type":"link","label":"File Reader GPS","href":"/docs/examples/file_reader_gps/","docId":"examples/file_reader_gps/file-reader-gps"}],"label":"GPS Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Filter Client","href":"/docs/examples/filter_client/","docId":"examples/filter_client/filter-client"}],"label":"State Estimation Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Record a Track","href":"/docs/examples/record_track/","docId":"examples/record_track/record-track"},{"type":"link","label":"Follow a track","href":"/docs/examples/controller_track/","docId":"examples/controller_track/controller-track"},{"type":"link","label":"Drive a Square","href":"/docs/examples/controller_square/","docId":"examples/controller_square/controller-square"}],"label":"Controller Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Service Client","href":"/docs/examples/service_client/","docId":"examples/service_client/service-client"},{"type":"link","label":"Service Counter","href":"/docs/examples/service_counter/","docId":"examples/service_counter/service-counter"},{"type":"link","label":"Service Propagation","href":"/docs/examples/service_propagation/","docId":"examples/service_propagation/service-propagation"}],"label":"Custom Service Examples","type":"category","collapsed":true,"collapsible":true},{"items":[{"type":"link","label":"Using a VNC Viewer","href":"/docs/examples/vnc_viewer/","docId":"examples/vnc_viewer/vnc-viewer"},{"type":"link","label":"Monitor App","href":"/docs/examples/monitor_app/","docId":"examples/monitor_app/monitor-app"}],"label":"Miscellaneous Examples","type":"category","collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Brain App Tutorials","items":[{"type":"category","label":"00 - Tutorial Introduction","items":[{"type":"link","label":"00 - Introduction","href":"/docs/tutorials/introduction/tutorial-introduction","docId":"tutorials/introduction/tutorial-introduction"},{"type":"link","label":"01 - Background Knowledge","href":"/docs/tutorials/introduction/background-knowledge","docId":"tutorials/introduction/background-knowledge"},{"type":"link","label":"02 - Template Overview","href":"/docs/tutorials/introduction/template-overview","docId":"tutorials/introduction/template-overview"}],"collapsed":true,"collapsible":true},{"type":"category","label":"01 - Camera Streamer Tutorial","items":[{"type":"link","label":"00 - Camera Streamer Overview","href":"/docs/tutorials/camera_streamer/camera-streamer-overview","docId":"tutorials/camera_streamer/camera-streamer-overview"},{"type":"link","label":"01 - Template Starter","href":"/docs/tutorials/camera_streamer/template-starter","docId":"tutorials/camera_streamer/template-starter"},{"type":"link","label":"02 - Kivy Definition","href":"/docs/tutorials/camera_streamer/kivy-definition","docId":"tutorials/camera_streamer/kivy-definition"},{"type":"link","label":"03 - Python Implementation","href":"/docs/tutorials/camera_streamer/camera-stream","docId":"tutorials/camera_streamer/camera-stream"}],"collapsed":true,"collapsible":true},{"type":"category","label":"02 - Virtual Joystick Tutorial","items":[{"type":"link","label":"00 - Virtual Joystick Overview","href":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","docId":"tutorials/virtual_joystick/virtual-joystick-overview"},{"type":"link","label":"01 - Template Starter","href":"/docs/tutorials/virtual_joystick/template-starter","docId":"tutorials/virtual_joystick/template-starter"},{"type":"link","label":"02 - Device Streams","href":"/docs/tutorials/virtual_joystick/device-streams","docId":"tutorials/virtual_joystick/device-streams"},{"type":"link","label":"03 - Virtual Joystick Widget","href":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","docId":"tutorials/virtual_joystick/virtual-joystick-widget"},{"type":"link","label":"04 - Auto Control","href":"/docs/tutorials/virtual_joystick/auto-control","docId":"tutorials/virtual_joystick/auto-control"},{"type":"link","label":"05 - Further Exercises","href":"/docs/tutorials/virtual_joystick/further-exercises","docId":"tutorials/virtual_joystick/further-exercises"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Amiga Brain Development","items":[{"type":"link","label":"Developing Custom Applications","href":"/docs/brain/brain-apps","docId":"brain/brain-apps"},{"type":"link","label":"Amiga ROS Bridge","href":"/docs/brain/ros-bridge","docId":"brain/ros-bridge"}],"collapsed":true,"collapsible":true}],"contribute":[{"type":"link","label":"Documentation","href":"/docs/contribute/contribute-website","docId":"contribute/contribute-website"}]},"docs":{"amiga_quick_start/amiga-quick-start":{"id":"amiga_quick_start/amiga-quick-start","title":"Quick Start Guide","description":"Welcome to the Amiga Quick Start Guide","sidebar":"Documentation"},"api/api-index":{"id":"api/api-index","title":"API Index","description":"There are two distinct, yet compatible, APIs.","sidebar":"api"},"brain/brain":{"id":"brain/brain","title":"Brain v1.0","description":"The Brain v1.0 tag here refers to the hardware version of the brain","sidebar":"Documentation"},"brain/brain-apps":{"id":"brain/brain-apps","title":"Developing Custom Applications","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"brain/brain-install":{"id":"brain/brain-install","title":"Brain ADK Install","description":"PyPI version","sidebar":"Documentation"},"brain/next-steps":{"id":"brain/next-steps","title":"Next Steps","description":"You will not be able to follow the examples and tutorials listed","sidebar":"Documentation"},"brain/ros-bridge":{"id":"brain/ros-bridge","title":"Amiga ROS Bridge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"concepts/canbus_service/canbus-overview":{"id":"concepts/canbus_service/canbus-overview","title":"CANBUS","description":"(Coming soon!)","sidebar":"Conepts"},"concepts/concepts-index":{"id":"concepts/concepts-index","title":"Concepts Index","description":"Visual representation of the services and devices running on your Amiga brain.","sidebar":"Conepts"},"concepts/controller_service/controller-overview":{"id":"concepts/controller_service/controller-overview","title":"Controller","description":"The Controller is the autonomy hub of the Amiga.","sidebar":"Conepts"},"concepts/filter_service/filter-overview":{"id":"concepts/filter_service/filter-overview","title":"Filter","description":"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot\'s","sidebar":"Conepts"},"concepts/gps_service/gps-overview":{"id":"concepts/gps_service/gps-overview","title":"GPS","description":"The GPS service is an integral component of the Amiga\'s navigation system, utilizing a","sidebar":"Conepts"},"concepts/oak_service/oak-overview":{"id":"concepts/oak_service/oak-overview","title":"OAK","description":"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams","sidebar":"Conepts"},"contribute/contribute-website":{"id":"contribute/contribute-website","title":"Documentation","description":"This page contains instructions for developers who want to contribute to the Amiga Development Kit documentation.","sidebar":"contribute"},"dashboard/control-states":{"id":"dashboard/control-states","title":"Amiga Control States","description":"Amiga control states","sidebar":"Documentation"},"dashboard/dashboard":{"id":"dashboard/dashboard","title":"Dashboard Overview","description":"DSCF6570-2-16x9-aspect-reduced","sidebar":"Documentation"},"dashboard/dashboard-fw":{"id":"dashboard/dashboard-fw","title":"Dashboard Firmware Updates","description":"Dashboard firmware updates","sidebar":"Documentation"},"dashboard/dashboard-user-guide":{"id":"dashboard/dashboard-user-guide","title":"Dashboard User Guide","description":"This is subject for change with new updates to the Dashboard.","sidebar":"Documentation"},"debug_cable/debug-cable":{"id":"debug_cable/debug-cable","title":"Debug Cable Overview","description":"image","sidebar":"Documentation"},"debug_cable/service-cable":{"id":"debug_cable/service-cable","title":"Service Cable Overview","description":"IMG-9583","sidebar":"Documentation"},"examples/camera_aruco_detector/camera-aruco-detector":{"id":"examples/camera_aruco_detector/camera-aruco-detector","title":"Camera Aruco Detector","description":"Link to cameraarucodetector/main.py","sidebar":"examples"},"examples/camera_calibration/camera-calibration":{"id":"examples/camera_calibration/camera-calibration","title":"Camera Calibration","description":"Camera Calibration","sidebar":"examples"},"examples/camera_client/camera-client":{"id":"examples/camera_client/camera-client","title":"Camera Client","description":"Link to cameraclient/main.py","sidebar":"examples"},"examples/camera_pointcloud/camera-pointcloud":{"id":"examples/camera_pointcloud/camera-pointcloud","title":"Camera Pointcloud","description":"Camera Pointcloud","sidebar":"examples"},"examples/camera_settings/camera-settings":{"id":"examples/camera_settings/camera-settings","title":"Camera Settings","description":"Camera Settings","sidebar":"examples"},"examples/cansniffer/cansniffer":{"id":"examples/cansniffer/cansniffer","title":"Cansniffer Example","description":"Link to cansniffer/code.py","sidebar":"examples"},"examples/controller_square/controller-square":{"id":"examples/controller_square/controller-square","title":"Drive a Square","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/controller_track/controller-track":{"id":"examples/controller_track/controller-track","title":"Follow a track","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/events_recorder/events-recorder":{"id":"examples/events_recorder/events-recorder","title":"Events Recorder","description":"Events Recorder","sidebar":"examples"},"examples/examples-index":{"id":"examples/examples-index","title":"Examples Index","description":"CircuitPython Examples","sidebar":"examples"},"examples/file_converter/file-converter":{"id":"examples/file_converter/file-converter","title":"File Converter","description":"This example","sidebar":"examples"},"examples/file_reader_can/file-reader-can":{"id":"examples/file_reader_can/file-reader-can","title":"File Reader CAN","description":"This file_reader_can example","sidebar":"examples"},"examples/file_reader_gps/file-reader-gps":{"id":"examples/file_reader_gps/file-reader-gps","title":"File Reader GPS","description":"This file_reader_gps_example","sidebar":"examples"},"examples/file_reader/file-reader":{"id":"examples/file_reader/file-reader","title":"File Reader","description":"In this example you will learn how to upload a given log file and","sidebar":"examples"},"examples/filter_client/filter-client":{"id":"examples/filter_client/filter-client","title":"Filter Client","description":"Link to filterclient/main.py","sidebar":"examples"},"examples/FPV/fpv":{"id":"examples/FPV/fpv","title":"FPV Example","description":"Link to FPV/code.py","sidebar":"examples"},"examples/gps_client/gps-client":{"id":"examples/gps_client/gps-client","title":"GPS Client","description":"The GPS Client example","sidebar":"examples"},"examples/hello_main_loop/hello-world":{"id":"examples/hello_main_loop/hello-world","title":"Hello Main Loop Example","description":"Link to hellomainloop/code.py","sidebar":"examples"},"examples/import_log_file/import-log-file":{"id":"examples/import_log_file/import-log-file","title":"Record and Access data","description":"This tutorial will walk you through how to record field data and","sidebar":"examples"},"examples/monitor_app/monitor-app":{"id":"examples/monitor_app/monitor-app","title":"Monitor App","description":"Building an App: Understanding the Basics","sidebar":"examples"},"examples/motor_state/motor-state":{"id":"examples/motor_state/motor-state","title":"Motor State","description":"Currently this is a very basic example","sidebar":"examples"},"examples/multi_client_geoimage/multi-client-geoimage":{"id":"examples/multi_client_geoimage/multi-client-geoimage","title":"Multi Client GeoImage","description":"Link to multiclientgeoimage/main.py"},"examples/multi_client_subscriber/multi-client-subscriber":{"id":"examples/multi_client_subscriber/multi-client-subscriber","title":"Multi Client Subscriber","description":"Link to multiclientsubscriber/main.py"},"examples/record_track/record-track":{"id":"examples/record_track/record-track","title":"Record a Track","description":"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.","sidebar":"examples"},"examples/service_client/service-client":{"id":"examples/service_client/service-client","title":"Service Client","description":"This example is the hello world of the farm-ng-core Event Service framework.","sidebar":"examples"},"examples/service_counter/service-counter":{"id":"examples/service_counter/service-counter","title":"Service Counter","description":"This is a subsequent example of the service_client example","sidebar":"examples"},"examples/service_propagation/service-propagation":{"id":"examples/service_propagation/service-propagation","title":"Service Propagation","description":"In this example, we will show how create a subsystem of services that can be","sidebar":"examples"},"examples/vehicle_twist/vehicle-twist":{"id":"examples/vehicle_twist/vehicle-twist","title":"Vehicle Twist","description":"Currently this is a very basic example","sidebar":"examples"},"examples/vnc_viewer/vnc-viewer":{"id":"examples/vnc_viewer/vnc-viewer","title":"Using a VNC Viewer","description":"If you want to see the screen of the Amiga and interact with it from a laptop or dev station,","sidebar":"examples"},"farm-tools/three-point":{"id":"farm-tools/three-point","title":"Installation Guide","description":"This guide is a step by step instruction on how to assemble the farm-ng three","sidebar":"Documentation"},"getting-started":{"id":"getting-started","title":"Introduction","description":"Welcome to the Amiga Development Kit","sidebar":"Documentation"},"hardware-tools/etools":{"id":"hardware-tools/etools","title":"Basic Electronics Tool Kit","description":"Basic recommended tool kit for hardware hacking"},"hardware-tools/recommended-tools":{"id":"hardware-tools/recommended-tools","title":"Recommended Tools","description":"Basic recommended tool kit for hardware hacking","sidebar":"Documentation"},"intelligence-kit/brain/brain-v2":{"id":"intelligence-kit/brain/brain-v2","title":"Brain v2.0","description":"The Brain v2.0 tag here refers to the hardware version of the brain","sidebar":"Documentation"},"intelligence-kit/overview-intel":{"id":"intelligence-kit/overview-intel","title":"Intelligence Kit Overview","description":"DSCF8544","sidebar":"Documentation"},"mcu_kit/microcontroller-kit":{"id":"mcu_kit/microcontroller-kit","title":"Microcontroller Kit Overview","description":"We sell a complete kit containing all necessary components on the Amiga shop website: farm-ng microcontroller kit","sidebar":"Documentation"},"pendant/pendant":{"id":"pendant/pendant","title":"Pendant Overview","description":"pendant 3","sidebar":"Documentation"},"reference/brain/canbus/canbus_client":{"id":"reference/brain/canbus/canbus_client","title":"canbus.canbus_client","description":"CanbusClient Objects","sidebar":"api"},"reference/brain/canbus/packet":{"id":"reference/brain/canbus/packet","title":"canbus.packet","description":"AmigaControlState Objects","sidebar":"api"},"reference/brain/oak/camera_client":{"id":"reference/brain/oak/camera_client","title":"oak.camera_client","description":"RateLimiter Objects"},"reference/circuitpy/utils/can":{"id":"reference/circuitpy/utils/can","title":"utils.can","description":"setup\\\\can\\\\default","sidebar":"api"},"reference/circuitpy/utils/cobid":{"id":"reference/circuitpy/utils/cobid","title":"utils.cobid","description":"CanOpenObject Objects","sidebar":"api"},"reference/circuitpy/utils/general":{"id":"reference/circuitpy/utils/general","title":"utils.general","description":"path\\\\_dirname","sidebar":"api"},"reference/circuitpy/utils/io":{"id":"reference/circuitpy/utils/io","title":"utils.io","description":"sense","sidebar":"api"},"reference/circuitpy/utils/main_loop":{"id":"reference/circuitpy/utils/main_loop","title":"utils.main_loop","description":"get\\\\node\\\\id","sidebar":"api"},"reference/circuitpy/utils/nvm":{"id":"reference/circuitpy/utils/nvm","title":"utils.nvm","description":"nvm\\\\node\\\\id","sidebar":"api"},"reference/circuitpy/utils/packet":{"id":"reference/circuitpy/utils/packet","title":"utils.packet","description":"PendantButtons Objects","sidebar":"api"},"reference/circuitpy/utils/version":{"id":"reference/circuitpy/utils/version","title":"utils.version","description":"Update values following semantic versioning convention.","sidebar":"api"},"reference/faq":{"id":"reference/faq","title":"Frequently Asked Questions","description":"Using the REPL","sidebar":"Documentation"},"release-notes/release-01":{"id":"release-notes/release-01","title":"AmigaOS Artichoke 1.0 Release Notes","description":"At farm-ng we love making tools for engineers, hackers, building","sidebar":"Documentation"},"ssh/ssh":{"id":"ssh/ssh","title":"Access and Develop on the Brain","description":"Users can remotely access and start developing on the brain via SSH access.","sidebar":"Documentation"},"support/github-101":{"id":"support/github-101","title":"GitHub 101","description":"Welcome to GitHub 101!","sidebar":"Documentation"},"support/support":{"id":"support/support","title":"Support","description":"Check our FAQ\'s","sidebar":"Documentation"},"tutorials/camera_streamer/camera-stream":{"id":"tutorials/camera_streamer/camera-stream","title":"03 - Python Implementation","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/camera-streamer-overview":{"id":"tutorials/camera_streamer/camera-streamer-overview","title":"00 - Camera Streamer Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/kivy-definition":{"id":"tutorials/camera_streamer/kivy-definition","title":"02 - Kivy Definition","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/camera_streamer/template-starter":{"id":"tutorials/camera_streamer/template-starter","title":"01 - Template Starter","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/background-knowledge":{"id":"tutorials/introduction/background-knowledge","title":"01 - Background Knowledge","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/template-overview":{"id":"tutorials/introduction/template-overview","title":"02 - Template Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/introduction/tutorial-introduction":{"id":"tutorials/introduction/tutorial-introduction","title":"00 - Introduction","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/auto-control":{"id":"tutorials/virtual_joystick/auto-control","title":"04 - Auto Control","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/device-streams":{"id":"tutorials/virtual_joystick/device-streams","title":"02 - Device Streams","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/further-exercises":{"id":"tutorials/virtual_joystick/further-exercises","title":"05 - Further Exercises","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/template-starter":{"id":"tutorials/virtual_joystick/template-starter","title":"01 - Template Starter","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-overview":{"id":"tutorials/virtual_joystick/virtual-joystick-overview","title":"00 - Virtual Joystick Overview","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"},"tutorials/virtual_joystick/virtual-joystick-widget":{"id":"tutorials/virtual_joystick/virtual-joystick-widget","title":"03 - Virtual Joystick Widget","description":"This is out-of-date for brains running v2.x Amiga OS software.","sidebar":"examples"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9d06307a.1ab4b2cf.js b/assets/js/9d06307a.1ab4b2cf.js new file mode 100644 index 000000000..e81bfa66e --- /dev/null +++ b/assets/js/9d06307a.1ab4b2cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6724],{4016:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=i(7462),r=(i(7294),i(3905));i(1839);const a={id:"filter-overview",title:"Filter"},o="Filter Service Overview",s={unversionedId:"concepts/filter_service/filter-overview",id:"concepts/filter_service/filter-overview",title:"Filter",description:"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot's",source:"@site/docs/concepts/filter_service/README.md",sourceDirName:"concepts/filter_service",slug:"/concepts/filter_service/",permalink:"/docs/concepts/filter_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/filter_service/README.md",tags:[],version:"current",frontMatter:{id:"filter-overview",title:"Filter"},sidebar:"Concepts",previous:{title:"GPS",permalink:"/docs/concepts/gps_service/"},next:{title:"Controller",permalink:"/docs/concepts/controller_service/"}},l={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"Convergence Requirements",id:"convergence-requirements",level:2},{value:"API",id:"api",level:2},{value:"Filter Service in Practice",id:"filter-service-in-practice",level:2},{value:"Features",id:"features",level:2}],m={toc:c};function u(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"filter-service-overview"},"Filter Service Overview"),(0,r.kt)("p",null,"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot's\nposition, orientation, and movement within its environment.\nUtilizing an ",(0,r.kt)("strong",{parentName:"p"},"Unscented Kalman Filter"),", it seamlessly fuses data from various sources like wheel odometry,\nGPS, and the IMU to provide a consistent and accurate representation of the robot's current state."),(0,r.kt)("p",null,"The primary goal of the Filter service is to abstract the complexity involved in state estimation,\nproviding users with clear, reliable information about the robot's pose, heading, and movement trajectory.\nThis allows users to interact with and direct the Amiga effectively, without getting immersed in the\ntechnical depths of data fusion or sensor calibration."),(0,r.kt)("p",null,"In essence, the Filter does the intricate work of synthesizing sensor data, enabling users to\nconfidently interpret and utilize the Amiga's spatial information without needing extensive expertise\nin robotics or state estimation."),(0,r.kt)("h2",{id:"subscriptions"},"Subscriptions"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Filter")," is a client from the following services:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Canbus (for wheel odometry)"),(0,r.kt)("li",{parentName:"ul"},"GPS"),(0,r.kt)("li",{parentName:"ul"},"Oak0 (for IMU data)")),(0,r.kt)("p",null,"For the Filter service to function correctly, these services must be operational and communicating\nrelevant sensor data.\nSince the Filter relies on GPS data, the Amiga must have a GPS connected to an RTK base station."),(0,r.kt)("h2",{id:"convergence-requirements"},"Convergence Requirements"),(0,r.kt)("p",null,"For the state estimation to be considered valid and the results to be reliable, certain criteria\nneed to be met, including:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The robot is connected to Wi-Fi, ensuring communication continuity."),(0,r.kt)("li",{parentName:"ul"},"The GPS service is receiving messages, with ",(0,r.kt)("inlineCode",{parentName:"li"},"accuracyNorth")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"accuracyEast")," values smaller\nthan 0.01, indicating high precision."),(0,r.kt)("li",{parentName:"ul"},"The oak0 service is active and transmitting IMU data.")),(0,r.kt)("p",null,"Upon startup or recalibration, the robot needs to be moved slightly to allow the filter to converge\n(indicated by ",(0,r.kt)("inlineCode",{parentName:"p"},"has_converged")," = true)."),(0,r.kt)("admonition",{title:"Remember",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"State estimation is a dynamic process, and environmental factors or sensor issues can affect convergence.\nRegular calibration and adherence to the recommended workflows are essential for maintaining accurate\nstate estimation.")),(0,r.kt)("h2",{id:"api"},"API"),(0,r.kt)("p",null,"Users can interact with the filter service using these commands through an EventClient of\nthe filter service:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/calibrate"),": Triggers the calibration process, adjusting the IMU orientation relative to the robot\nand calculating gyroscope biases."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/get_state"),": Retrieves a protobuf message of type FilterState, containing the robot\u2019s pose,\nheading (in radians), convergence status, and pose uncertainty."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/get_track"),": Returns the current track of the robot, essentially the path that the robot has traveled."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/clear_track"),": Clears the current track, useful when initiating a new tracking sequence or\nrecalibrating the system.")),(0,r.kt)("h2",{id:"filter-service-in-practice"},"Filter Service in Practice"),(0,r.kt)("p",null,"When planning to record a new track, the recommended workflow is as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Start with ",(0,r.kt)("inlineCode",{parentName:"li"},"/clear_track"),'. This will clear the current track on memory and allow the user to\n"start fresh"'),(0,r.kt)("li",{parentName:"ul"},"User drives the robot to generate the desired track"),(0,r.kt)("li",{parentName:"ul"},"Once satisfied, the user stops the robot"),(0,r.kt)("li",{parentName:"ul"},"Get the track with the API ",(0,r.kt)("inlineCode",{parentName:"li"},"/get_track"),".")),(0,r.kt)("admonition",{title:"TIP",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For a comprehensive understanding of the list of variables available in the filter state messages,\nmake sure to check its ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/filter/filter.proto"},"protobuf definition"),".")),(0,r.kt)("h2",{id:"features"},"Features"),(0,r.kt)("p",null,"The Filter service, while sophisticated, is designed with user-friendliness in mind.\nIt not only provides essential information on the robot's current state but also empowers users to:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Track Creation and Retrieval"),":\nThe system automatically logs the robot's path, creating tracks that can be reviewed and utilized for\nfuture tasks. This feature is invaluable for repeated navigation tasks or analyzing the robot's\ncoverage over a workspace.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Real-time State Estimation"),":\nBy continuously synthesizing data from multiple sensors, the Filter offers real-time insights into\nthe robot's position, orientation, and trajectory.\nThis is crucial for tasks that require precise navigation or environment mapping.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Calibration on Demand"),":\nEnvironmental changes or operational demands may necessitate recalibration.\nThe /calibrate command simplifies this, enabling users to quickly recalibrate the IMU, ensuring\ncontinued accuracy in state estimation."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9d06307a.d365d5b1.js b/assets/js/9d06307a.d365d5b1.js deleted file mode 100644 index fabf8a55b..000000000 --- a/assets/js/9d06307a.d365d5b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6724],{4016:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=i(7462),r=(i(7294),i(3905));i(1839);const a={id:"filter-overview",title:"Filter"},o="Filter Service Overview",s={unversionedId:"concepts/filter_service/filter-overview",id:"concepts/filter_service/filter-overview",title:"Filter",description:"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot's",source:"@site/docs/concepts/filter_service/README.md",sourceDirName:"concepts/filter_service",slug:"/concepts/filter_service/",permalink:"/docs/concepts/filter_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/filter_service/README.md",tags:[],version:"current",frontMatter:{id:"filter-overview",title:"Filter"},sidebar:"Conepts",previous:{title:"GPS",permalink:"/docs/concepts/gps_service/"},next:{title:"Controller",permalink:"/docs/concepts/controller_service/"}},l={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"Convergence Requirements",id:"convergence-requirements",level:2},{value:"API",id:"api",level:2},{value:"Filter Service in Practice",id:"filter-service-in-practice",level:2},{value:"Features",id:"features",level:2}],m={toc:c};function u(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},m,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"filter-service-overview"},"Filter Service Overview"),(0,r.kt)("p",null,"The Filter service is the state estimation core of the Amiga, crucial for understanding the robot's\nposition, orientation, and movement within its environment.\nUtilizing an ",(0,r.kt)("strong",{parentName:"p"},"Unscented Kalman Filter"),", it seamlessly fuses data from various sources like wheel odometry,\nGPS, and the IMU to provide a consistent and accurate representation of the robot's current state."),(0,r.kt)("p",null,"The primary goal of the Filter service is to abstract the complexity involved in state estimation,\nproviding users with clear, reliable information about the robot's pose, heading, and movement trajectory.\nThis allows users to interact with and direct the Amiga effectively, without getting immersed in the\ntechnical depths of data fusion or sensor calibration."),(0,r.kt)("p",null,"In essence, the Filter does the intricate work of synthesizing sensor data, enabling users to\nconfidently interpret and utilize the Amiga's spatial information without needing extensive expertise\nin robotics or state estimation."),(0,r.kt)("h2",{id:"subscriptions"},"Subscriptions"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"Filter")," is a client from the following services:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Canbus (for wheel odometry)"),(0,r.kt)("li",{parentName:"ul"},"GPS"),(0,r.kt)("li",{parentName:"ul"},"Oak0 (for IMU data)")),(0,r.kt)("p",null,"For the Filter service to function correctly, these services must be operational and communicating\nrelevant sensor data.\nSince the Filter relies on GPS data, the Amiga must have a GPS connected to an RTK base station."),(0,r.kt)("h2",{id:"convergence-requirements"},"Convergence Requirements"),(0,r.kt)("p",null,"For the state estimation to be considered valid and the results to be reliable, certain criteria\nneed to be met, including:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The robot is connected to Wi-Fi, ensuring communication continuity."),(0,r.kt)("li",{parentName:"ul"},"The GPS service is receiving messages, with ",(0,r.kt)("inlineCode",{parentName:"li"},"accuracyNorth")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"accuracyEast")," values smaller\nthan 0.01, indicating high precision."),(0,r.kt)("li",{parentName:"ul"},"The oak0 service is active and transmitting IMU data.")),(0,r.kt)("p",null,"Upon startup or recalibration, the robot needs to be moved slightly to allow the filter to converge\n(indicated by ",(0,r.kt)("inlineCode",{parentName:"p"},"has_converged")," = true)."),(0,r.kt)("admonition",{title:"Remember",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"State estimation is a dynamic process, and environmental factors or sensor issues can affect convergence.\nRegular calibration and adherence to the recommended workflows are essential for maintaining accurate\nstate estimation.")),(0,r.kt)("h2",{id:"api"},"API"),(0,r.kt)("p",null,"Users can interact with the filter service using these commands through an EventClient of\nthe filter service:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/calibrate"),": Triggers the calibration process, adjusting the IMU orientation relative to the robot\nand calculating gyroscope biases."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/get_state"),": Retrieves a protobuf message of type FilterState, containing the robot\u2019s pose,\nheading (in radians), convergence status, and pose uncertainty."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/get_track"),": Returns the current track of the robot, essentially the path that the robot has traveled."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"/clear_track"),": Clears the current track, useful when initiating a new tracking sequence or\nrecalibrating the system.")),(0,r.kt)("h2",{id:"filter-service-in-practice"},"Filter Service in Practice"),(0,r.kt)("p",null,"When planning to record a new track, the recommended workflow is as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Start with ",(0,r.kt)("inlineCode",{parentName:"li"},"/clear_track"),'. This will clear the current track on memory and allow the user to\n"start fresh"'),(0,r.kt)("li",{parentName:"ul"},"User drives the robot to generate the desired track"),(0,r.kt)("li",{parentName:"ul"},"Once satisfied, the user stops the robot"),(0,r.kt)("li",{parentName:"ul"},"Get the track with the API ",(0,r.kt)("inlineCode",{parentName:"li"},"/get_track"),".")),(0,r.kt)("admonition",{title:"TIP",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For a comprehensive understanding of the list of variables available in the filter state messages,\nmake sure to check its ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/filter/filter.proto"},"protobuf definition"),".")),(0,r.kt)("h2",{id:"features"},"Features"),(0,r.kt)("p",null,"The Filter service, while sophisticated, is designed with user-friendliness in mind.\nIt not only provides essential information on the robot's current state but also empowers users to:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Track Creation and Retrieval"),":\nThe system automatically logs the robot's path, creating tracks that can be reviewed and utilized for\nfuture tasks. This feature is invaluable for repeated navigation tasks or analyzing the robot's\ncoverage over a workspace.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Real-time State Estimation"),":\nBy continuously synthesizing data from multiple sensors, the Filter offers real-time insights into\nthe robot's position, orientation, and trajectory.\nThis is crucial for tasks that require precise navigation or environment mapping.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Calibration on Demand"),":\nEnvironmental changes or operational demands may necessitate recalibration.\nThe /calibrate command simplifies this, enabling users to quickly recalibrate the IMU, ensuring\ncontinued accuracy in state estimation."))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a480bfc2.5ccf28df.js b/assets/js/a480bfc2.5ccf28df.js deleted file mode 100644 index 5fb522ba5..000000000 --- a/assets/js/a480bfc2.5ccf28df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[925],{5750:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var a=i(7462),n=(i(7294),i(3905));i(1839);const s={id:"oak-overview",title:"OAK"},o="Oak Service Overview",r={unversionedId:"concepts/oak_service/oak-overview",id:"concepts/oak_service/oak-overview",title:"OAK",description:"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams",source:"@site/docs/concepts/oak_service/README.md",sourceDirName:"concepts/oak_service",slug:"/concepts/oak_service/",permalink:"/docs/concepts/oak_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/oak_service/README.md",tags:[],version:"current",frontMatter:{id:"oak-overview",title:"OAK"},sidebar:"Conepts",previous:{title:"CANBUS",permalink:"/docs/concepts/canbus_service/"},next:{title:"GPS",permalink:"/docs/concepts/gps_service/"}},c={},l=[{value:"Standalone Operation",id:"standalone-operation",level:2},{value:"Message Types",id:"message-types",level:2},{value:"Requirements",id:"requirements",level:2},{value:"API",id:"api",level:2},{value:"Practical Applications",id:"practical-applications",level:2}],p={toc:l};function u(e){let{components:t,...i}=e;return(0,n.kt)("wrapper",(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"oak-service-overview"},"Oak Service Overview"),(0,n.kt)("p",null,"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams\nfrom the onboard OAK-D device, which includes stereo vision capabilities and an Inertial Measurement\nUnit (IMU).\nThis service doesn't serve a singular purpose; instead, it offers a range of data that can be\ninstrumental for various user-defined applications, from navigation and mapping to object detection\nand data collection."),(0,n.kt)("p",null,"The OAK service is autonomous, not relying on other services to function.\nHowever, its data, especially the IMU information, plays a significant role in the Amiga's autonomous\nnavigation capabilities, as it's fused with GPS and wheel odometry data in the Filter service\n(using an Unscented Kalman Filter)."),(0,n.kt)("h1",{id:"multiple-instances"},"Multiple Instances"),(0,n.kt)("p",null,"Depending on the number of OAK devices connected to the Amiga, there might be multiple instances\nof the OAK service running concurrently.\nFor example, with two OAK cameras, there will be an oak0 service and an oak1 service.\nEach instance is responsible for managing the data streams from its respective OAK-D device."),(0,n.kt)("h2",{id:"standalone-operation"},"Standalone Operation"),(0,n.kt)("p",null,"Unlike other services, each Oak service operates independently and is not a client of any other services."),(0,n.kt)("h2",{id:"message-types"},"Message Types"),(0,n.kt)("p",null,"Clients can subscribe to the OAK service to access the messages it publishes.\nThese messages can include various data types such as:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Stereo vision (right and left)"),(0,n.kt)("li",{parentName:"ul"},"RGB data"),(0,n.kt)("li",{parentName:"ul"},"Accelerometer data"),(0,n.kt)("li",{parentName:"ul"},"Gyroscope data")),(0,n.kt)("p",null,"The specifics of these messages, including their data structures and formats, are defined in the\nservice's ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/oak/oak.proto"},"protobuf definitions"),",\nwhich users can refer to for detailed information."),(0,n.kt)("h2",{id:"requirements"},"Requirements"),(0,n.kt)("p",null,"For the Oak service to function, there's only a single requirement:\nthe oak camera(s) need to be powered via the POE Switch."),(0,n.kt)("h2",{id:"api"},"API"),(0,n.kt)("p",null,"The OAK service offers a few API endpoints that allow users to interact with and configure the\nOAK-D device's settings:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/calibration"),": Retrieves the calibration of the device, specifically the intrinsic parameters of\nthe cameras.\nThis is typically a one-time requirement unless the device undergoes significant changes or maintenance.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/camera_settings/rgb"),": Allows users to configure the RGB camera settings.\nIf no settings are specified in the request, the service will return the current settings.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/camera_settings/mono"),": Similar to the RGB settings endpoint, this allows users to configure\nthe mono camera settings or retrieve them if no new configurations are specified."))),(0,n.kt)("p",null,"While the specifics of these configurations are found in the protobuf definitions, they offer users\nthe ability to customize the camera performance as per their application requirements,\npotentially adjusting parameters like exposure, focus, and white balance."),(0,n.kt)("h2",{id:"practical-applications"},"Practical Applications"),(0,n.kt)("p",null,"One of the key applications of the OAK service within the Amiga system is contributing to the robot's\nautonomous navigation.\nThe gyroscope data from the OAK service's IMU is crucial for the robot's state estimation,\nas it's fused with other data sources in the Filter service.\nThis fusion helps in achieving accurate positioning and orientation, enabling the Amiga\nto navigate effectively and autonomously."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a480bfc2.cf0886bb.js b/assets/js/a480bfc2.cf0886bb.js new file mode 100644 index 000000000..ba63102c4 --- /dev/null +++ b/assets/js/a480bfc2.cf0886bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[925],{5750:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var a=i(7462),n=(i(7294),i(3905));i(1839);const s={id:"oak-overview",title:"OAK"},o="Oak Service Overview",r={unversionedId:"concepts/oak_service/oak-overview",id:"concepts/oak_service/oak-overview",title:"OAK",description:"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams",source:"@site/docs/concepts/oak_service/README.md",sourceDirName:"concepts/oak_service",slug:"/concepts/oak_service/",permalink:"/docs/concepts/oak_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/oak_service/README.md",tags:[],version:"current",frontMatter:{id:"oak-overview",title:"OAK"},sidebar:"Concepts",previous:{title:"CANBUS",permalink:"/docs/concepts/canbus_service/"},next:{title:"GPS",permalink:"/docs/concepts/gps_service/"}},c={},l=[{value:"Standalone Operation",id:"standalone-operation",level:2},{value:"Message Types",id:"message-types",level:2},{value:"Requirements",id:"requirements",level:2},{value:"API",id:"api",level:2},{value:"Practical Applications",id:"practical-applications",level:2}],p={toc:l};function u(e){let{components:t,...i}=e;return(0,n.kt)("wrapper",(0,a.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"oak-service-overview"},"Oak Service Overview"),(0,n.kt)("p",null,"The OAK service is a versatile component in the Amiga ecosystem, providing valuable data streams\nfrom the onboard OAK-D device, which includes stereo vision capabilities and an Inertial Measurement\nUnit (IMU).\nThis service doesn't serve a singular purpose; instead, it offers a range of data that can be\ninstrumental for various user-defined applications, from navigation and mapping to object detection\nand data collection."),(0,n.kt)("p",null,"The OAK service is autonomous, not relying on other services to function.\nHowever, its data, especially the IMU information, plays a significant role in the Amiga's autonomous\nnavigation capabilities, as it's fused with GPS and wheel odometry data in the Filter service\n(using an Unscented Kalman Filter)."),(0,n.kt)("h1",{id:"multiple-instances"},"Multiple Instances"),(0,n.kt)("p",null,"Depending on the number of OAK devices connected to the Amiga, there might be multiple instances\nof the OAK service running concurrently.\nFor example, with two OAK cameras, there will be an oak0 service and an oak1 service.\nEach instance is responsible for managing the data streams from its respective OAK-D device."),(0,n.kt)("h2",{id:"standalone-operation"},"Standalone Operation"),(0,n.kt)("p",null,"Unlike other services, each Oak service operates independently and is not a client of any other services."),(0,n.kt)("h2",{id:"message-types"},"Message Types"),(0,n.kt)("p",null,"Clients can subscribe to the OAK service to access the messages it publishes.\nThese messages can include various data types such as:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Stereo vision (right and left)"),(0,n.kt)("li",{parentName:"ul"},"RGB data"),(0,n.kt)("li",{parentName:"ul"},"Accelerometer data"),(0,n.kt)("li",{parentName:"ul"},"Gyroscope data")),(0,n.kt)("p",null,"The specifics of these messages, including their data structures and formats, are defined in the\nservice's ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/oak/oak.proto"},"protobuf definitions"),",\nwhich users can refer to for detailed information."),(0,n.kt)("h2",{id:"requirements"},"Requirements"),(0,n.kt)("p",null,"For the Oak service to function, there's only a single requirement:\nthe oak camera(s) need to be powered via the POE Switch."),(0,n.kt)("h2",{id:"api"},"API"),(0,n.kt)("p",null,"The OAK service offers a few API endpoints that allow users to interact with and configure the\nOAK-D device's settings:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/calibration"),": Retrieves the calibration of the device, specifically the intrinsic parameters of\nthe cameras.\nThis is typically a one-time requirement unless the device undergoes significant changes or maintenance.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/camera_settings/rgb"),": Allows users to configure the RGB camera settings.\nIf no settings are specified in the request, the service will return the current settings.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("inlineCode",{parentName:"p"},"/camera_settings/mono"),": Similar to the RGB settings endpoint, this allows users to configure\nthe mono camera settings or retrieve them if no new configurations are specified."))),(0,n.kt)("p",null,"While the specifics of these configurations are found in the protobuf definitions, they offer users\nthe ability to customize the camera performance as per their application requirements,\npotentially adjusting parameters like exposure, focus, and white balance."),(0,n.kt)("h2",{id:"practical-applications"},"Practical Applications"),(0,n.kt)("p",null,"One of the key applications of the OAK service within the Amiga system is contributing to the robot's\nautonomous navigation.\nThe gyroscope data from the OAK service's IMU is crucial for the robot's state estimation,\nas it's fused with other data sources in the Filter service.\nThis fusion helps in achieving accurate positioning and orientation, enabling the Amiga\nto navigate effectively and autonomously."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6d99bb7.1f8afe70.js b/assets/js/a6d99bb7.1f8afe70.js deleted file mode 100644 index 8701e3b35..000000000 --- a/assets/js/a6d99bb7.1f8afe70.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9462],{4315:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=i(7462),a=(i(7294),i(3905));i(1839);const o={id:"gps-overview",title:"GPS"},r="GPS Service Overview",s={unversionedId:"concepts/gps_service/gps-overview",id:"concepts/gps_service/gps-overview",title:"GPS",description:"The GPS service is an integral component of the Amiga's navigation system, utilizing a",source:"@site/docs/concepts/gps_service/README.md",sourceDirName:"concepts/gps_service",slug:"/concepts/gps_service/",permalink:"/docs/concepts/gps_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/gps_service/README.md",tags:[],version:"current",frontMatter:{id:"gps-overview",title:"GPS"},sidebar:"Conepts",previous:{title:"OAK",permalink:"/docs/concepts/oak_service/"},next:{title:"Filter",permalink:"/docs/concepts/filter_service/"}},l={},p=[{value:"Standalone Operation",id:"standalone-operation",level:2},{value:"Message Types",id:"message-types",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Utilizing GPS Data",id:"utilizing-gps-data",level:2}],c={toc:p};function m(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"gps-service-overview"},"GPS Service Overview"),(0,a.kt)("p",null,"The GPS service is an integral component of the Amiga's navigation system, utilizing a\nhigh-precision Ublox module to determine the robot's exact position on Earth.\nThis service is indispensable for tasks that require geo-location, from simple\nnavigation to complex tasks like field mapping or precision agriculture."),(0,a.kt)("p",null,"The primary role of the GPS service is to continuously capture and broadcast detailed\npositional data, which other components and services within the Amiga's system can utilize.\nIt simplifies the intricacies of satellite-based positioning, offering users straightforward\naccess to precise, real-time location data."),(0,a.kt)("p",null,"In short, the GPS service continuously decodes and transmits location data, allowing users\nand systems to tap into accurate geospatial information without dealing with the\ncomplexities of GPS data interpretation."),(0,a.kt)("h2",{id:"standalone-operation"},"Standalone Operation"),(0,a.kt)("p",null,"Unlike other services, the GPS service operates independently and is not a client of any other services.\nIts sole responsibility is to interpret and publish the data received from the GPS module."),(0,a.kt)("h2",{id:"message-types"},"Message Types"),(0,a.kt)("p",null,"Clients can subscribe to the GPS service to receive messages, which are typically of type ",(0,a.kt)("inlineCode",{parentName:"p"},"pvt")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"relposned"),".\nThese messages contain rich data sets that include the robot's current geospatial coordinates,\nvelocity, time, and other relevant GPS data."),(0,a.kt)("admonition",{title:"INFO",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two types of GPS messages: ",(0,a.kt)("strong",{parentName:"p"},"PVT")," and ",(0,a.kt)("strong",{parentName:"p"},"RELPOSNED"),"."),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"PVT")," (Position, Velocity, and Time) messages provide the all-in-one solution: position, velocity,\nand time.\nIt contains details like longitude, latitude, altitude, speed, and UTC time."),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"RELPOSNED"),' (Relative Positioning) messages provide relative position information in a\nNorth, East, Down (N-E-D) frame. It\'s mainly used for applications requiring relative positioning\nbetween two receivers, often as a part of Real Time Kinematics (RTK) solutions.\nIt shows the difference in position between a "moving" receiver and a "fixed" reference receiver.')),(0,a.kt)("admonition",{title:"TIP",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"For a comprehensive understanding of the list of variables available in each GPS message,\nmake sure to check their ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/gps/gps.proto"},"protobuf definitions"),".")),(0,a.kt)("h2",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"For the GPS service to function optimally, certain conditions must be met:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The robot must have an active Wi-Fi connection, ensuring real-time data communication.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"NOTE"),": The robot needs to be connected to Wi-Fi for ",(0,a.kt)("inlineCode",{parentName:"li"},"relposned")," messages.\nHowever, an internet connection is not required for ",(0,a.kt)("inlineCode",{parentName:"li"},"pvt")," messages."))),(0,a.kt)("li",{parentName:"ul"},"Users need to input credentials for connecting to an RTK base station, enhancing the GPS accuracy.\nThe required credentials include:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"NTRIP ID: The server address of the base station."),(0,a.kt)("li",{parentName:"ul"},"NTRIP PORT: The port used by the NTRIP server."),(0,a.kt)("li",{parentName:"ul"},"NTRIP MOUNTPOINT: Specific mount point on the NTRIP server."),(0,a.kt)("li",{parentName:"ul"},"USER: Username for accessing the base station."),(0,a.kt)("li",{parentName:"ul"},"PASSWORD: Corresponding password for the above username.")))),(0,a.kt)("admonition",{title:"NTRIP (Network Transport of RTCM via Internet Protocol)",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"NTRIP is a protocol for streaming differential GPS (DGPS) data over the internet, enabling RTK\ncorrections in areas with cellular coverage.\nConnecting to an NTRIP service enhances the GPS accuracy, crucial for tasks requiring precision navigation.")),(0,a.kt)("admonition",{title:"Pro Tip for California Users",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you're operating in California, consider ",(0,a.kt)("a",{parentName:"p",href:"https://www.surveymonkey.com/survey-taken?sm=8oRYqrBI74rDSaBAdtcV5GY0_2FRs585_2FD4c_2BTVJDw_2Be9msUlD1XrZDpZ1Rvu0DLWBo8bsPAjLG8jj8DbutXMqryiezNdZiuVvgEb0osp55QY_3D"},(0,a.kt)("strong",{parentName:"a"},"signing up")),"\nfor a free CRTN\n(California Real Time Network) account.\nManaged by UC San Diego, ",(0,a.kt)("a",{parentName:"p",href:"http://sopac-csrc.ucsd.edu/index.php/crtn/"},"CRTN")," provides access\nto multiple base stations across the state, offering enhanced GPS accuracy.\nOther states or regions may have similar services available.\nAlways check local resources for the best positioning support in your area.")),(0,a.kt)("h2",{id:"utilizing-gps-data"},"Utilizing GPS Data"),(0,a.kt)("p",null,"The GPS data, while technical, is immensely valuable.\nWith high-precision location information, users can:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Enhance Navigation"),":\nUse the precise geospatial data in navigation tasks, allowing the Amiga to traverse pre-defined\nroutes with minimal deviation.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Inform Decision-Making"),":\nAnalyze the GPS data to make informed decisions about resource allocation, route optimization,\nand task planning.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Improve Operational Efficiency"),":\nLeverage the accuracy of real-time GPS data to enhance the reliability and efficiency of automated tasks,\nreducing the need for human intervention and potential for error."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6d99bb7.936ee5d8.js b/assets/js/a6d99bb7.936ee5d8.js new file mode 100644 index 000000000..87096e3d8 --- /dev/null +++ b/assets/js/a6d99bb7.936ee5d8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9462],{4315:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var n=i(7462),a=(i(7294),i(3905));i(1839);const o={id:"gps-overview",title:"GPS"},r="GPS Service Overview",s={unversionedId:"concepts/gps_service/gps-overview",id:"concepts/gps_service/gps-overview",title:"GPS",description:"The GPS service is an integral component of the Amiga's navigation system, utilizing a",source:"@site/docs/concepts/gps_service/README.md",sourceDirName:"concepts/gps_service",slug:"/concepts/gps_service/",permalink:"/docs/concepts/gps_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/gps_service/README.md",tags:[],version:"current",frontMatter:{id:"gps-overview",title:"GPS"},sidebar:"Concepts",previous:{title:"OAK",permalink:"/docs/concepts/oak_service/"},next:{title:"Filter",permalink:"/docs/concepts/filter_service/"}},l={},p=[{value:"Standalone Operation",id:"standalone-operation",level:2},{value:"Message Types",id:"message-types",level:2},{value:"Requirements",id:"requirements",level:2},{value:"Utilizing GPS Data",id:"utilizing-gps-data",level:2}],c={toc:p};function m(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"gps-service-overview"},"GPS Service Overview"),(0,a.kt)("p",null,"The GPS service is an integral component of the Amiga's navigation system, utilizing a\nhigh-precision Ublox module to determine the robot's exact position on Earth.\nThis service is indispensable for tasks that require geo-location, from simple\nnavigation to complex tasks like field mapping or precision agriculture."),(0,a.kt)("p",null,"The primary role of the GPS service is to continuously capture and broadcast detailed\npositional data, which other components and services within the Amiga's system can utilize.\nIt simplifies the intricacies of satellite-based positioning, offering users straightforward\naccess to precise, real-time location data."),(0,a.kt)("p",null,"In short, the GPS service continuously decodes and transmits location data, allowing users\nand systems to tap into accurate geospatial information without dealing with the\ncomplexities of GPS data interpretation."),(0,a.kt)("h2",{id:"standalone-operation"},"Standalone Operation"),(0,a.kt)("p",null,"Unlike other services, the GPS service operates independently and is not a client of any other services.\nIts sole responsibility is to interpret and publish the data received from the GPS module."),(0,a.kt)("h2",{id:"message-types"},"Message Types"),(0,a.kt)("p",null,"Clients can subscribe to the GPS service to receive messages, which are typically of type ",(0,a.kt)("inlineCode",{parentName:"p"},"pvt")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"relposned"),".\nThese messages contain rich data sets that include the robot's current geospatial coordinates,\nvelocity, time, and other relevant GPS data."),(0,a.kt)("admonition",{title:"INFO",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two types of GPS messages: ",(0,a.kt)("strong",{parentName:"p"},"PVT")," and ",(0,a.kt)("strong",{parentName:"p"},"RELPOSNED"),"."),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"PVT")," (Position, Velocity, and Time) messages provide the all-in-one solution: position, velocity,\nand time.\nIt contains details like longitude, latitude, altitude, speed, and UTC time."),(0,a.kt)("p",{parentName:"admonition"},(0,a.kt)("strong",{parentName:"p"},"RELPOSNED"),' (Relative Positioning) messages provide relative position information in a\nNorth, East, Down (N-E-D) frame. It\'s mainly used for applications requiring relative positioning\nbetween two receivers, often as a part of Real Time Kinematics (RTK) solutions.\nIt shows the difference in position between a "moving" receiver and a "fixed" reference receiver.')),(0,a.kt)("admonition",{title:"TIP",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"For a comprehensive understanding of the list of variables available in each GPS message,\nmake sure to check their ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/farm-ng/farm-ng-amiga/blob/main-v2/protos/farm_ng/gps/gps.proto"},"protobuf definitions"),".")),(0,a.kt)("h2",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"For the GPS service to function optimally, certain conditions must be met:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The robot must have an active Wi-Fi connection, ensuring real-time data communication.",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"NOTE"),": The robot needs to be connected to Wi-Fi for ",(0,a.kt)("inlineCode",{parentName:"li"},"relposned")," messages.\nHowever, an internet connection is not required for ",(0,a.kt)("inlineCode",{parentName:"li"},"pvt")," messages."))),(0,a.kt)("li",{parentName:"ul"},"Users need to input credentials for connecting to an RTK base station, enhancing the GPS accuracy.\nThe required credentials include:",(0,a.kt)("ul",{parentName:"li"},(0,a.kt)("li",{parentName:"ul"},"NTRIP ID: The server address of the base station."),(0,a.kt)("li",{parentName:"ul"},"NTRIP PORT: The port used by the NTRIP server."),(0,a.kt)("li",{parentName:"ul"},"NTRIP MOUNTPOINT: Specific mount point on the NTRIP server."),(0,a.kt)("li",{parentName:"ul"},"USER: Username for accessing the base station."),(0,a.kt)("li",{parentName:"ul"},"PASSWORD: Corresponding password for the above username.")))),(0,a.kt)("admonition",{title:"NTRIP (Network Transport of RTCM via Internet Protocol)",type:"info"},(0,a.kt)("p",{parentName:"admonition"},"NTRIP is a protocol for streaming differential GPS (DGPS) data over the internet, enabling RTK\ncorrections in areas with cellular coverage.\nConnecting to an NTRIP service enhances the GPS accuracy, crucial for tasks requiring precision navigation.")),(0,a.kt)("admonition",{title:"Pro Tip for California Users",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you're operating in California, consider ",(0,a.kt)("a",{parentName:"p",href:"https://www.surveymonkey.com/survey-taken?sm=8oRYqrBI74rDSaBAdtcV5GY0_2FRs585_2FD4c_2BTVJDw_2Be9msUlD1XrZDpZ1Rvu0DLWBo8bsPAjLG8jj8DbutXMqryiezNdZiuVvgEb0osp55QY_3D"},(0,a.kt)("strong",{parentName:"a"},"signing up")),"\nfor a free CRTN\n(California Real Time Network) account.\nManaged by UC San Diego, ",(0,a.kt)("a",{parentName:"p",href:"http://sopac-csrc.ucsd.edu/index.php/crtn/"},"CRTN")," provides access\nto multiple base stations across the state, offering enhanced GPS accuracy.\nOther states or regions may have similar services available.\nAlways check local resources for the best positioning support in your area.")),(0,a.kt)("h2",{id:"utilizing-gps-data"},"Utilizing GPS Data"),(0,a.kt)("p",null,"The GPS data, while technical, is immensely valuable.\nWith high-precision location information, users can:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Enhance Navigation"),":\nUse the precise geospatial data in navigation tasks, allowing the Amiga to traverse pre-defined\nroutes with minimal deviation.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Inform Decision-Making"),":\nAnalyze the GPS data to make informed decisions about resource allocation, route optimization,\nand task planning.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Improve Operational Efficiency"),":\nLeverage the accuracy of real-time GPS data to enhance the reliability and efficiency of automated tasks,\nreducing the need for human intervention and potential for error."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d825fa1b.216f1520.js b/assets/js/d825fa1b.216f1520.js deleted file mode 100644 index 2f6dbecec..000000000 --- a/assets/js/d825fa1b.216f1520.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7420],{8299:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(7462),i=(n(7294),n(3905));n(1839);const a={id:"controller-overview",title:"Controller"},r="Controller Service Overview",l={unversionedId:"concepts/controller_service/controller-overview",id:"concepts/controller_service/controller-overview",title:"Controller",description:"The Controller is the autonomy hub of the Amiga.",source:"@site/docs/concepts/controller_service/README.md",sourceDirName:"concepts/controller_service",slug:"/concepts/controller_service/",permalink:"/docs/concepts/controller_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/controller_service/README.md",tags:[],version:"current",frontMatter:{id:"controller-overview",title:"Controller"},sidebar:"Conepts",previous:{title:"Filter",permalink:"/docs/concepts/filter_service/"}},s={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"Requirements",id:"requirements",level:2},{value:"API",id:"api",level:2},{value:"The Controller in practice",id:"the-controller-in-practice",level:2},{value:"Features",id:"features",level:3},{value:"Requirements for Following a Track",id:"requirements-for-following-a-track",level:3},{value:"Tracks",id:"tracks",level:2},{value:"Define a Track",id:"define-a-track",level:3},{value:"Examples",id:"examples",level:3}],h={toc:c};function u(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,o.Z)({},h,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"controller-service-overview"},"Controller Service Overview"),(0,i.kt)("p",null,"The Controller is the autonomy hub of the Amiga.\nIt takes in user commands and turns them into actions the robot can perform."),(0,i.kt)("p",null,"The main goal of the Controller is to act as a bridge between what you want the Amiga to\ndo and how the robot actually does it. It hides the complicated details, letting users focus\non their main tasks without needing to know the complex workings underneath."),(0,i.kt)("p",null,"In short, the Controller does the heavy lifting, allowing users to easily command the Amiga without\ndeep technical knowledge."),(0,i.kt)("h2",{id:"subscriptions"},"Subscriptions"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Controller")," is a client of the following services:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Canbus"),(0,i.kt)("li",{parentName:"ul"},"Filter (state estimation)")),(0,i.kt)("p",null,"The State estimation filter service is a client of the following services:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Canbus"),(0,i.kt)("li",{parentName:"ul"},"GPS"),(0,i.kt)("li",{parentName:"ul"},"Oak0")),(0,i.kt)("p",null,"For this reason, all of the above-mentioned services must be up and running for the ",(0,i.kt)("inlineCode",{parentName:"p"},"Controller"),"\nto work."),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"There are a few requirements on the ",(0,i.kt)("inlineCode",{parentName:"p"},"/state")," output of the state estimation filter\nfor the controller service to consider the results valid and allow for following a track.\nThese include:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"GPS service is connected to an RTK base station"),(0,i.kt)("li",{parentName:"ul"},"State estimation is receiving all required sensor data"),(0,i.kt)("li",{parentName:"ul"},"State estimation results have converged",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Requires a few seconds of driving around after starting the filter service")))),(0,i.kt)("h2",{id:"api"},"API"),(0,i.kt)("p",null,"These are the commands you can use to interact with the controller service with\nan ",(0,i.kt)("inlineCode",{parentName:"p"},"EventClient")," of the controller service."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/get_pose"),": Retrieve the current position and orientation of the Amiga."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/set_track"),": Provide a specific track (series of waypoints) for the Amiga to follow."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/follow_track"),": Instruct the Amiga to commence following the previously set track."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/stop"),": Instruct the Amiga to halt all movements immediately.")),(0,i.kt)("h2",{id:"the-controller-in-practice"},"The Controller in practice"),(0,i.kt)("p",null,"Before the controller can drive the Amiga autonomously, users must set a predefined track\nfor the robot to follow using the ",(0,i.kt)("inlineCode",{parentName:"p"},"/set_track")," API."),(0,i.kt)("p",null,"Once a track is set, the next step is to command the controller to make the robot follow it.\nThis is done using the ",(0,i.kt)("inlineCode",{parentName:"p"},"/follow_track")," API.\nThe controller will then navigate the robot through each waypoint in the sequence, ensuring it follows\nthe predefined path."),(0,i.kt)("admonition",{title:"Remember",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"It's crucial first to set the track before asking the robot to follow it.\nThe controller expects the sequence of waypoints in the order they should be traversed.\nWithout a set track, the controller wouldn't know where to direct the robot.")),(0,i.kt)("h3",{id:"features"},"Features"),(0,i.kt)("p",null,"The controller offers a level of flexibility and intelligence that goes beyond simply following\na predefined path.\nOnce a track is set, the robot can also traverse it in a few unique ways:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Reversing the Track"),":\nAfter the Amiga has learned a track, it's not restricted to following it in just the direction\nit was taught.\nThe end point of the learned track can seamlessly become the starting point, provided the robot is\noriented towards its recorded initial position.\nThis allows the robot to navigate environments bidirectionally, offering greater autonomy and\nadaptability in dynamic settings.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Initiating from Intermediate Points"),":\nYou don't always have to start the robot from the beginning of a track.\nThe controller is smart enough to allow track following from any intermediate point within the path.\nThis is especially useful if the robot needs to start its journey from a point that's not the\ntraditional beginning or end."))),(0,i.kt)("h3",{id:"requirements-for-following-a-track"},"Requirements for Following a Track"),(0,i.kt)("p",null,"For the controller to begin guiding the robot along a track, certain conditions must be met to\nensure accurate and safe navigation:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Proximity to the Track"),": The robot must be situated within a maximum distance of 0.1 meters from\nany existing point on the track.\nThis ensures it's close enough to align itself correctly and follow the track."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Orientation or Heading"),": The robot's heading needs to align closely with the heading of the nearest\npoint on the track.\nSpecifically, it should be within 30 degrees of the track point's heading.\nThis condition ensures the robot is oriented correctly and can safely navigate along the desired\npath without sudden, unexpected maneuvers."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"A track is essentially a sequence of waypoints, guiding the robot from its starting point,\nthrough various intermediary points, to its destination.\nEach waypoint in this track provides specific spatial information about where the robot should\nbe and how it should be oriented at that point."),(0,i.kt)("h3",{id:"define-a-track"},"Define a Track"),(0,i.kt)("p",null,"A track is represented as a JSON file, where each waypoint is defined by a pose.\nA pose captures the robot's position and orientation in the world.\nHere's an example of what a single pose looks like:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "pose": {\n "aFromB": {\n "rotation": {\n "unitQuaternion": {\n "imag": {\n "z": -0.9932486190247055\n },\n "real": 0.11600508956729176\n }\n },\n "translation": {\n "x": 2674.593868581748,\n "y": 4297.325262829638\n }\n },\n "frameA": "world",\n "frameB": "robot",\n "tangentOfBInA": {\n "linearVelocity": {\n "x": 0.4467579546503179\n },\n "angularVelocity": {\n "z": 0.00475509022854358\n }\n }\n },\n "heading": -2.909058930621276\n},\n')),(0,i.kt)("h3",{id:"examples"},"Examples"),(0,i.kt)("p",null,"Now that you have a good understanding of how the controller works, try some of the\ncontroller examples:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/record_track"},"Record a Track")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/controller_track"},"Follow a Track")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/controller_square"},"Drive a Square"),(0,i.kt)("admonition",{parentName:"li",title:"Warning",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.\nMake sure the area is clear before running examples.")))),(0,i.kt)("p",null,"You can also run the examples when the Amiga dashboard is not in ",(0,i.kt)("inlineCode",{parentName:"p"},"AUTO READY")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"AUTO ACTIVE"),"\nand see the commands being sent with the red needle on the auto page without the Amiga actually moving.\n:::"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d825fa1b.a236accd.js b/assets/js/d825fa1b.a236accd.js new file mode 100644 index 000000000..358fcb63b --- /dev/null +++ b/assets/js/d825fa1b.a236accd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7420],{8299:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var o=n(7462),i=(n(7294),n(3905));n(1839);const a={id:"controller-overview",title:"Controller"},r="Controller Service Overview",l={unversionedId:"concepts/controller_service/controller-overview",id:"concepts/controller_service/controller-overview",title:"Controller",description:"The Controller is the autonomy hub of the Amiga.",source:"@site/docs/concepts/controller_service/README.md",sourceDirName:"concepts/controller_service",slug:"/concepts/controller_service/",permalink:"/docs/concepts/controller_service/",draft:!1,editUrl:"https://github.com/farm-ng/amiga-dev-kit/tree/main/website/docs/concepts/controller_service/README.md",tags:[],version:"current",frontMatter:{id:"controller-overview",title:"Controller"},sidebar:"Concepts",previous:{title:"Filter",permalink:"/docs/concepts/filter_service/"}},s={},c=[{value:"Subscriptions",id:"subscriptions",level:2},{value:"Requirements",id:"requirements",level:2},{value:"API",id:"api",level:2},{value:"The Controller in practice",id:"the-controller-in-practice",level:2},{value:"Features",id:"features",level:3},{value:"Requirements for Following a Track",id:"requirements-for-following-a-track",level:3},{value:"Tracks",id:"tracks",level:2},{value:"Define a Track",id:"define-a-track",level:3},{value:"Examples",id:"examples",level:3}],h={toc:c};function u(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,o.Z)({},h,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"controller-service-overview"},"Controller Service Overview"),(0,i.kt)("p",null,"The Controller is the autonomy hub of the Amiga.\nIt takes in user commands and turns them into actions the robot can perform."),(0,i.kt)("p",null,"The main goal of the Controller is to act as a bridge between what you want the Amiga to\ndo and how the robot actually does it. It hides the complicated details, letting users focus\non their main tasks without needing to know the complex workings underneath."),(0,i.kt)("p",null,"In short, the Controller does the heavy lifting, allowing users to easily command the Amiga without\ndeep technical knowledge."),(0,i.kt)("h2",{id:"subscriptions"},"Subscriptions"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Controller")," is a client of the following services:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Canbus"),(0,i.kt)("li",{parentName:"ul"},"Filter (state estimation)")),(0,i.kt)("p",null,"The State estimation filter service is a client of the following services:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Canbus"),(0,i.kt)("li",{parentName:"ul"},"GPS"),(0,i.kt)("li",{parentName:"ul"},"Oak0")),(0,i.kt)("p",null,"For this reason, all of the above-mentioned services must be up and running for the ",(0,i.kt)("inlineCode",{parentName:"p"},"Controller"),"\nto work."),(0,i.kt)("h2",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"There are a few requirements on the ",(0,i.kt)("inlineCode",{parentName:"p"},"/state")," output of the state estimation filter\nfor the controller service to consider the results valid and allow for following a track.\nThese include:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"GPS service is connected to an RTK base station"),(0,i.kt)("li",{parentName:"ul"},"State estimation is receiving all required sensor data"),(0,i.kt)("li",{parentName:"ul"},"State estimation results have converged",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Requires a few seconds of driving around after starting the filter service")))),(0,i.kt)("h2",{id:"api"},"API"),(0,i.kt)("p",null,"These are the commands you can use to interact with the controller service with\nan ",(0,i.kt)("inlineCode",{parentName:"p"},"EventClient")," of the controller service."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/get_pose"),": Retrieve the current position and orientation of the Amiga."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/set_track"),": Provide a specific track (series of waypoints) for the Amiga to follow."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/follow_track"),": Instruct the Amiga to commence following the previously set track."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"/stop"),": Instruct the Amiga to halt all movements immediately.")),(0,i.kt)("h2",{id:"the-controller-in-practice"},"The Controller in practice"),(0,i.kt)("p",null,"Before the controller can drive the Amiga autonomously, users must set a predefined track\nfor the robot to follow using the ",(0,i.kt)("inlineCode",{parentName:"p"},"/set_track")," API."),(0,i.kt)("p",null,"Once a track is set, the next step is to command the controller to make the robot follow it.\nThis is done using the ",(0,i.kt)("inlineCode",{parentName:"p"},"/follow_track")," API.\nThe controller will then navigate the robot through each waypoint in the sequence, ensuring it follows\nthe predefined path."),(0,i.kt)("admonition",{title:"Remember",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"It's crucial first to set the track before asking the robot to follow it.\nThe controller expects the sequence of waypoints in the order they should be traversed.\nWithout a set track, the controller wouldn't know where to direct the robot.")),(0,i.kt)("h3",{id:"features"},"Features"),(0,i.kt)("p",null,"The controller offers a level of flexibility and intelligence that goes beyond simply following\na predefined path.\nOnce a track is set, the robot can also traverse it in a few unique ways:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Reversing the Track"),":\nAfter the Amiga has learned a track, it's not restricted to following it in just the direction\nit was taught.\nThe end point of the learned track can seamlessly become the starting point, provided the robot is\noriented towards its recorded initial position.\nThis allows the robot to navigate environments bidirectionally, offering greater autonomy and\nadaptability in dynamic settings.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Initiating from Intermediate Points"),":\nYou don't always have to start the robot from the beginning of a track.\nThe controller is smart enough to allow track following from any intermediate point within the path.\nThis is especially useful if the robot needs to start its journey from a point that's not the\ntraditional beginning or end."))),(0,i.kt)("h3",{id:"requirements-for-following-a-track"},"Requirements for Following a Track"),(0,i.kt)("p",null,"For the controller to begin guiding the robot along a track, certain conditions must be met to\nensure accurate and safe navigation:"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Proximity to the Track"),": The robot must be situated within a maximum distance of 0.1 meters from\nany existing point on the track.\nThis ensures it's close enough to align itself correctly and follow the track."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Orientation or Heading"),": The robot's heading needs to align closely with the heading of the nearest\npoint on the track.\nSpecifically, it should be within 30 degrees of the track point's heading.\nThis condition ensures the robot is oriented correctly and can safely navigate along the desired\npath without sudden, unexpected maneuvers."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"A track is essentially a sequence of waypoints, guiding the robot from its starting point,\nthrough various intermediary points, to its destination.\nEach waypoint in this track provides specific spatial information about where the robot should\nbe and how it should be oriented at that point."),(0,i.kt)("h3",{id:"define-a-track"},"Define a Track"),(0,i.kt)("p",null,"A track is represented as a JSON file, where each waypoint is defined by a pose.\nA pose captures the robot's position and orientation in the world.\nHere's an example of what a single pose looks like:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-json"},'{\n "pose": {\n "aFromB": {\n "rotation": {\n "unitQuaternion": {\n "imag": {\n "z": -0.9932486190247055\n },\n "real": 0.11600508956729176\n }\n },\n "translation": {\n "x": 2674.593868581748,\n "y": 4297.325262829638\n }\n },\n "frameA": "world",\n "frameB": "robot",\n "tangentOfBInA": {\n "linearVelocity": {\n "x": 0.4467579546503179\n },\n "angularVelocity": {\n "z": 0.00475509022854358\n }\n }\n },\n "heading": -2.909058930621276\n},\n')),(0,i.kt)("h3",{id:"examples"},"Examples"),(0,i.kt)("p",null,"Now that you have a good understanding of how the controller works, try some of the\ncontroller examples:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/record_track"},"Record a Track")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/controller_track"},"Follow a Track")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/examples/controller_square"},"Drive a Square"),(0,i.kt)("admonition",{parentName:"li",title:"Warning",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The controller examples will cause the Amiga to drive when the dashboard is in auto mode.\nMake sure the area is clear before running examples.")))),(0,i.kt)("p",null,"You can also run the examples when the Amiga dashboard is not in ",(0,i.kt)("inlineCode",{parentName:"p"},"AUTO READY")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"AUTO ACTIVE"),"\nand see the commands being sent with the red needle on the auto page without the Amiga actually moving.\n:::"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.3e6eaaf8.js b/assets/js/main.3e6eaaf8.js new file mode 100644 index 000000000..9b534cba7 --- /dev/null +++ b/assets/js/main.3e6eaaf8.js @@ -0,0 +1,2 @@ +/*! For license information please see main.3e6eaaf8.js.LICENSE.txt */ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"017af9a4":[()=>Promise.all([n.e(8592),n.e(9380)]).then(n.bind(n,1220)),"@site/docs/examples/multi_client_subscriber/README.md",1220],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"02365777":[()=>Promise.all([n.e(8592),n.e(2708)]).then(n.bind(n,9683)),"@site/docs/concepts/README.md",9683],"037ab9b9":[()=>n.e(3442).then(n.t.bind(n,7085,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"086f7ce7":[()=>Promise.all([n.e(8592),n.e(8153)]).then(n.bind(n,75)),"@site/docs/concepts/controller_101/README.md",75],"09e49901":[()=>Promise.all([n.e(8592),n.e(7470)]).then(n.bind(n,1515)),"@site/docs/examples/camera_client/README.md",1515],"0c0027a6":[()=>Promise.all([n.e(8592),n.e(1077)]).then(n.bind(n,2900)),"@site/docs/examples/service_client/README.md",2900],"0f1dd641":[()=>Promise.all([n.e(8592),n.e(6287)]).then(n.bind(n,3200)),"@site/docs/reference/circuitpy/utils/can.md",3200],16345591:[()=>n.e(1615).then(n.t.bind(n,3529,19)),"~docs/default/tag-docs-tags-announcement-450.json",3529],"16601c76":[()=>Promise.all([n.e(8592),n.e(3010)]).then(n.bind(n,6017)),"@site/blog/2023-02-17-version-100.md",6017],"17196cf9":[()=>Promise.all([n.e(8592),n.e(4377)]).then(n.bind(n,843)),"@site/docs/examples/service_propagation/README.md",843],"1755b190":[()=>Promise.all([n.e(8592),n.e(1520)]).then(n.bind(n,5034)),"@site/docs/reference/circuitpy/utils/packet.md",5034],17896441:[()=>Promise.all([n.e(532),n.e(8592),n.e(143),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"18a524a5":[()=>Promise.all([n.e(8592),n.e(3425)]).then(n.bind(n,1042)),"@site/docs/examples/hello_main_loop/README.md",1042],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1f391b9e":[()=>Promise.all([n.e(532),n.e(8592),n.e(143),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"234ca8e1":[()=>Promise.all([n.e(8592),n.e(4138)]).then(n.bind(n,8184)),"@site/docs/examples/controller_track/README.md",8184],"248c4e50":[()=>Promise.all([n.e(8592),n.e(3318)]).then(n.bind(n,2141)),"@site/docs/tutorials/camera_streamer/00_intro.md",2141],"25248eb7":[()=>Promise.all([n.e(8592),n.e(2341)]).then(n.bind(n,1862)),"@site/docs/reference/circuitpy/utils/cobid.md",1862],"26c89f53":[()=>Promise.all([n.e(8592),n.e(9)]).then(n.bind(n,1113)),"@site/docs/tutorials/virtual_joystick/05_further_exercises.md",1113],"27e82f7d":[()=>Promise.all([n.e(8592),n.e(1334)]).then(n.bind(n,1076)),"@site/docs/hardware-tools/farm-ng_electronics_tools.md",1076],"283e63f8":[()=>n.e(4157).then(n.t.bind(n,2844,19)),"~blog/default/blog-tags-announcement-752.json",2844],"28d467d5":[()=>Promise.all([n.e(532),n.e(8592),n.e(3542)]).then(n.bind(n,5222)),"@site/docs/mcu_kit/README.mdx",5222],"28fb851b":[()=>Promise.all([n.e(8592),n.e(5301)]).then(n.bind(n,183)),"@site/docs/tutorials/virtual_joystick/03_virtual_joystick_widget.md",183],"2a6f4879":[()=>Promise.all([n.e(8592),n.e(4149)]).then(n.bind(n,8168)),"@site/docs/debug_cable/README.md",8168],"2f6ec8d9":[()=>n.e(1388).then(n.t.bind(n,3769,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"31bfd28b":[()=>Promise.all([n.e(8592),n.e(4370)]).then(n.bind(n,9053)),"@site/docs/concepts/canbus_service/README.md",9053],"31c9729e":[()=>Promise.all([n.e(8592),n.e(6740)]).then(n.bind(n,4322)),"@site/docs/examples/filter_client/README.md",4322],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"393be207":[()=>Promise.all([n.e(8592),n.e(7414)]).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],46688559:[()=>Promise.all([n.e(8592),n.e(9653)]).then(n.bind(n,7359)),"@site/docs/concepts/transforms_and_poses/README.md",7359],"4e9fc795":[()=>Promise.all([n.e(8592),n.e(8685)]).then(n.bind(n,2542)),"@site/docs/examples/file_reader_can/README.md",2542],"4f204c8f":[()=>Promise.all([n.e(8592),n.e(6639)]).then(n.bind(n,5391)),"@site/docs/support/github-101.md",5391],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"56f78280":[()=>Promise.all([n.e(8592),n.e(4962)]).then(n.bind(n,175)),"@site/docs/examples/import_log_file/README.md",175],"59c2e5f5":[()=>Promise.all([n.e(8592),n.e(4271)]).then(n.bind(n,7114)),"@site/docs/examples/camera_aruco_detector/README.md",7114],"5aa65751":[()=>Promise.all([n.e(8592),n.e(5666)]).then(n.bind(n,4693)),"@site/docs/farm-tools/three-point.md",4693],"5c808265":[()=>Promise.all([n.e(8592),n.e(3490)]).then(n.bind(n,3294)),"@site/docs/examples/service_counter/README.md",3294],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ecff173":[()=>Promise.all([n.e(8592),n.e(2989)]).then(n.bind(n,2879)),"@site/docs/tutorials/camera_streamer/03_camera_stream.md",2879],"5f19c161":[()=>Promise.all([n.e(532),n.e(8592),n.e(4884)]).then(n.bind(n,3262)),"@site/docs/contribute/website.mdx",3262],62005459:[()=>Promise.all([n.e(8592),n.e(8446)]).then(n.bind(n,2275)),"@site/docs/reference/brain/canbus/packet.md",2275],63097759:[()=>Promise.all([n.e(8592),n.e(1455)]).then(n.bind(n,2592)),"@site/docs/examples/file_reader/README.md",2592],"630bf199":[()=>Promise.all([n.e(8592),n.e(4654)]).then(n.bind(n,9063)),"@site/docs/brain/brain-next-steps.md",9063],"63ffe4b0":[()=>Promise.all([n.e(8592),n.e(7018)]).then(n.bind(n,7288)),"@site/docs/intelligence-kit/brain/brain-v2.md",7288],"6481ea79":[()=>Promise.all([n.e(8592),n.e(1292)]).then(n.bind(n,5915)),"@site/docs/dashboard/control_states.mdx",5915],"6487a5c3":[()=>Promise.all([n.e(8592),n.e(4731)]).then(n.bind(n,3214)),"@site/docs/examples/multi_client_geoimage/README.md",3214],"649f5488":[()=>Promise.all([n.e(8592),n.e(3487)]).then(n.bind(n,7445)),"@site/docs/amiga_quick_start/amiga-quick-start.md",7445],"65608a03":[()=>Promise.all([n.e(8592),n.e(7139)]).then(n.bind(n,3001)),"@site/docs/reference/faq.md",3001],"65c61ae9":[()=>Promise.all([n.e(8592),n.e(2483)]).then(n.bind(n,2064)),"@site/docs/reference/circuitpy/utils/main_loop.md",2064],"6875c492":[()=>Promise.all([n.e(532),n.e(8592),n.e(143),n.e(2529),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"6a1b0507":[()=>Promise.all([n.e(8592),n.e(6441)]).then(n.bind(n,2398)),"@site/docs/examples/examples_index.md",2398],"6b26a77f":[()=>Promise.all([n.e(8592),n.e(1511)]).then(n.bind(n,164)),"@site/docs/examples/controller_square/README.md",164],"733f8ea4":[()=>n.e(1085).then(n.t.bind(n,7552,19)),"~docs/default/tag-docs-tags-release-c76.json",7552],"74c3aa9e":[()=>Promise.all([n.e(8592),n.e(6537)]).then(n.bind(n,201)),"@site/docs/dashboard/README.md",201],77363477:[()=>Promise.all([n.e(8592),n.e(803)]).then(n.bind(n,6171)),"@site/docs/examples/FPV/README.mdx",6171],"77bfdb01":[()=>Promise.all([n.e(8592),n.e(8246)]).then(n.bind(n,8309)),"@site/docs/release-notes/2023-02-17-version-100.md",8309],"7d487cb4":[()=>Promise.all([n.e(8592),n.e(4857)]).then(n.bind(n,854)),"@site/docs/reference/brain/oak/camera_client.md",854],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],82487722:[()=>Promise.all([n.e(8592),n.e(3068)]).then(n.bind(n,386)),"@site/docs/examples/vehicle_twist/README.md",386],"83d480e9":[()=>n.e(205).then(n.t.bind(n,3672,19)),"~blog/default/blog-tags-release-b5c.json",3672],"8542e1eb":[()=>Promise.all([n.e(532),n.e(8592),n.e(9790)]).then(n.bind(n,8553)),"@site/docs/examples/vnc_viewer/README.md",8553],"85f96761":[()=>Promise.all([n.e(8592),n.e(6150)]).then(n.bind(n,913)),"@site/docs/reference/circuitpy/utils/version.md",913],"8ae14039":[()=>Promise.all([n.e(8592),n.e(9482)]).then(n.bind(n,161)),"@site/docs/examples/camera_calibration/README.md",161],"8bb37ca2":[()=>Promise.all([n.e(8592),n.e(3253)]).then(n.bind(n,1684)),"@site/docs/dashboard/fw_updates.md",1684],"8c1f8f8c":[()=>Promise.all([n.e(8592),n.e(8950)]).then(n.bind(n,6049)),"@site/docs/examples/camera_settings/README.md",6049],"90782b6e":[()=>Promise.all([n.e(532),n.e(8592),n.e(9945)]).then(n.bind(n,7009)),"@site/docs/brain/custom-applications.mdx",7009],"90c1d685":[()=>Promise.all([n.e(8592),n.e(3363)]).then(n.bind(n,1157)),"@site/docs/tutorials/virtual_joystick/00_overview.md",1157],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"94a4e7cf":[()=>Promise.all([n.e(8592),n.e(113)]).then(n.bind(n,4634)),"@site/docs/tutorials/virtual_joystick/04_auto_control.md",4634],"982ac012":[()=>Promise.all([n.e(8592),n.e(6983)]).then(n.bind(n,5375)),"@site/docs/api/README.md",5375],"9c021584":[()=>n.e(7438).then(n.t.bind(n,8055,19)),"~blog/default/blog-tags-release-b5c-list.json",8055],"9d06307a":[()=>Promise.all([n.e(8592),n.e(6724)]).then(n.bind(n,4016)),"@site/docs/concepts/filter_service/README.md",4016],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f03ef16":[()=>Promise.all([n.e(8592),n.e(7085)]).then(n.bind(n,2014)),"@site/docs/examples/monitor_app/README.md",2014],a1e533ff:[()=>Promise.all([n.e(8592),n.e(6193)]).then(n.bind(n,4480)),"@site/docs/examples/file_converter/README.md",4480],a480bfc2:[()=>Promise.all([n.e(8592),n.e(925)]).then(n.bind(n,5750)),"@site/docs/concepts/oak_service/README.md",5750],a5c24d1e:[()=>Promise.all([n.e(8592),n.e(2390)]).then(n.bind(n,4762)),"@site/docs/tutorials/virtual_joystick/02_device_streams.md",4762],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8592),n.e(143),n.e(2529),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a6d99bb7:[()=>Promise.all([n.e(8592),n.e(9462)]).then(n.bind(n,4315)),"@site/docs/concepts/gps_service/README.md",4315],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],ab0c67b7:[()=>Promise.all([n.e(8592),n.e(5358)]).then(n.bind(n,5292)),"@site/docs/brain/README.md",5292],ab1fde8c:[()=>Promise.all([n.e(8592),n.e(3975)]).then(n.bind(n,7620)),"@site/blog/2023-02-17-version-100.md?truncated=true",7620],ab50c39c:[()=>Promise.all([n.e(532),n.e(8592),n.e(8269)]).then(n.bind(n,1323)),"@site/docs/tutorials/introduction/00_tutorial_intro.md",1323],af96ff05:[()=>Promise.all([n.e(8592),n.e(3635)]).then(n.bind(n,4887)),"@site/docs/pendant/pendant.md",4887],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b6a7a10b:[()=>Promise.all([n.e(8592),n.e(7124)]).then(n.bind(n,5984)),"@site/docs/examples/file_reader_gps/README.md",5984],b819b42b:[()=>Promise.all([n.e(8592),n.e(2881)]).then(n.bind(n,8550)),"@site/docs/examples/camera_pointcloud/README.md",8550],b872a128:[()=>Promise.all([n.e(8592),n.e(6102)]).then(n.bind(n,3747)),"@site/docs/reference/circuitpy/utils/io.md",3747],bbecab28:[()=>n.e(3824).then(n.t.bind(n,5745,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c582042f:[()=>Promise.all([n.e(8592),n.e(9955)]).then(n.bind(n,7202)),"@site/docs/support/support.md",7202],c83def28:[()=>Promise.all([n.e(8592),n.e(9418)]).then(n.bind(n,1223)),"@site/docs/examples/record_track/README.md",1223],c8a20f2f:[()=>Promise.all([n.e(532),n.e(8592),n.e(2232)]).then(n.bind(n,3766)),"@site/docs/ssh/README.md",3766],c930ceb7:[()=>n.e(3882).then(n.t.bind(n,4469,19)),"/home/runner/work/amiga-dev-kit/amiga-dev-kit/website/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],ca9189be:[()=>Promise.all([n.e(8592),n.e(4022)]).then(n.bind(n,2033)),"@site/docs/hardware-tools/recommended_tools.md",2033],ccc49370:[()=>Promise.all([n.e(532),n.e(8592),n.e(143),n.e(2529),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],d11a4e92:[()=>Promise.all([n.e(8592),n.e(5658)]).then(n.bind(n,6411)),"@site/docs/intelligence-kit/overview-intel.md",6411],d18ac987:[()=>Promise.all([n.e(8592),n.e(4735)]).then(n.bind(n,453)),"@site/docs/brain/ros-bridge.md",453],d41c5275:[()=>Promise.all([n.e(8592),n.e(2083)]).then(n.bind(n,1636)),"@site/docs/tutorials/introduction/02_template_overview.md",1636],d5141a5a:[()=>Promise.all([n.e(532),n.e(8592),n.e(1493)]).then(n.bind(n,6995)),"@site/docs/brain/brain-install.md",6995],d589d3a7:[()=>Promise.all([n.e(8592),n.e(7162)]).then(n.bind(n,9390)),"@site/docs/getting-started.md",9390],d825fa1b:[()=>Promise.all([n.e(8592),n.e(7420)]).then(n.bind(n,8299)),"@site/docs/concepts/controller_service/README.md",8299],df203c0f:[()=>n.e(9924).then(n.bind(n,491)),"@theme/DocTagDocListPage",491],dff0b824:[()=>Promise.all([n.e(8592),n.e(9680)]).then(n.bind(n,2719)),"@site/docs/dashboard/dashboard_user_guide.md",2719],e1197922:[()=>Promise.all([n.e(8592),n.e(6353)]).then(n.bind(n,814)),"@site/docs/examples/motor_state/README.md",814],e6b8c514:[()=>Promise.all([n.e(8592),n.e(1078)]).then(n.bind(n,2636)),"@site/docs/reference/circuitpy/utils/nvm.md",2636],eacd3886:[()=>Promise.all([n.e(8592),n.e(2412)]).then(n.bind(n,957)),"@site/docs/tutorials/introduction/01_background_knowledge.md",957],ece86388:[()=>n.e(4832).then(n.t.bind(n,2747,19)),"~blog/default/blog-tags-announcement-752-list.json",2747],ed54a8f0:[()=>Promise.all([n.e(8592),n.e(8501)]).then(n.bind(n,1630)),"@site/docs/tutorials/camera_streamer/01_template_starter.md",1630],f0f730a5:[()=>Promise.all([n.e(8592),n.e(5586)]).then(n.bind(n,3678)),"@site/docs/reference/brain/canbus/canbus_client.md",3678],f14b63eb:[()=>Promise.all([n.e(8592),n.e(4306)]).then(n.bind(n,1628)),"@site/docs/examples/gps_client/README.md",1628],f5c4be88:[()=>Promise.all([n.e(8592),n.e(8770)]).then(n.bind(n,2668)),"@site/docs/tutorials/virtual_joystick/01_template_starter.md",2668],f96cfd04:[()=>Promise.all([n.e(8592),n.e(346)]).then(n.bind(n,5010)),"@site/docs/reference/circuitpy/utils/general.md",5010],fb63b99b:[()=>Promise.all([n.e(8592),n.e(3943)]).then(n.bind(n,8432)),"@site/docs/tutorials/camera_streamer/02_kivy_definition.md",8432],fd7e5383:[()=>Promise.all([n.e(8592),n.e(7282)]).then(n.bind(n,7456)),"@site/docs/debug_cable/service_cable.md",7456],febb55c6:[()=>Promise.all([n.e(8592),n.e(384)]).then(n.bind(n,567)),"@site/docs/examples/events_recorder/README.md",567],ffef86fa:[()=>Promise.all([n.e(8592),n.e(5958)]).then(n.bind(n,8811)),"@site/docs/examples/cansniffer/README.md",8811]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[e+"-"+t],p={},f=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const f=[{path:"/blog",component:p("/blog","a56"),exact:!0},{path:"/blog/2023/02/17/version-100",component:p("/blog/2023/02/17/version-100","733"),exact:!0},{path:"/blog/archive",component:p("/blog/archive","6cf"),exact:!0},{path:"/blog/tags",component:p("/blog/tags","414"),exact:!0},{path:"/blog/tags/announcement",component:p("/blog/tags/announcement","44d"),exact:!0},{path:"/blog/tags/release",component:p("/blog/tags/release","19d"),exact:!0},{path:"/docs/tags",component:p("/docs/tags","a5e"),exact:!0},{path:"/docs/tags/announcement",component:p("/docs/tags/announcement","9cf"),exact:!0},{path:"/docs/tags/release",component:p("/docs/tags/release","a4c"),exact:!0},{path:"/markdown-page",component:p("/markdown-page","b78"),exact:!0},{path:"/search",component:p("/search","688"),exact:!0},{path:"/docs",component:p("/docs","d5d"),routes:[{path:"/docs/amiga_quick_start/amiga-quick-start",component:p("/docs/amiga_quick_start/amiga-quick-start","ac7"),exact:!0,sidebar:"Documentation"},{path:"/docs/api/",component:p("/docs/api/","459"),exact:!0,sidebar:"api"},{path:"/docs/brain/",component:p("/docs/brain/","602"),exact:!0,sidebar:"Documentation"},{path:"/docs/brain/brain-apps",component:p("/docs/brain/brain-apps","0b9"),exact:!0,sidebar:"examples"},{path:"/docs/brain/brain-install",component:p("/docs/brain/brain-install","764"),exact:!0,sidebar:"Documentation"},{path:"/docs/brain/next-steps",component:p("/docs/brain/next-steps","740"),exact:!0,sidebar:"Documentation"},{path:"/docs/brain/ros-bridge",component:p("/docs/brain/ros-bridge","fac"),exact:!0,sidebar:"examples"},{path:"/docs/concepts/",component:p("/docs/concepts/","3f1"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/canbus_service/",component:p("/docs/concepts/canbus_service/","8e7"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/controller_101/",component:p("/docs/concepts/controller_101/","584"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/controller_service/",component:p("/docs/concepts/controller_service/","2e4"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/filter_service/",component:p("/docs/concepts/filter_service/","2e9"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/gps_service/",component:p("/docs/concepts/gps_service/","23d"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/oak_service/",component:p("/docs/concepts/oak_service/","246"),exact:!0,sidebar:"Concepts"},{path:"/docs/concepts/transforms_and_poses/",component:p("/docs/concepts/transforms_and_poses/","199"),exact:!0,sidebar:"Concepts"},{path:"/docs/contribute/contribute-website",component:p("/docs/contribute/contribute-website","ab0"),exact:!0,sidebar:"contribute"},{path:"/docs/dashboard/",component:p("/docs/dashboard/","890"),exact:!0,sidebar:"Documentation"},{path:"/docs/dashboard/control-states",component:p("/docs/dashboard/control-states","46f"),exact:!0,sidebar:"Documentation"},{path:"/docs/dashboard/dashboard-fw",component:p("/docs/dashboard/dashboard-fw","805"),exact:!0,sidebar:"Documentation"},{path:"/docs/dashboard/dashboard-user-guide",component:p("/docs/dashboard/dashboard-user-guide","46a"),exact:!0,sidebar:"Documentation"},{path:"/docs/debug_cable/",component:p("/docs/debug_cable/","61f"),exact:!0,sidebar:"Documentation"},{path:"/docs/debug_cable/service-cable",component:p("/docs/debug_cable/service-cable","27a"),exact:!0,sidebar:"Documentation"},{path:"/docs/examples/camera_aruco_detector/",component:p("/docs/examples/camera_aruco_detector/","5b6"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_calibration/",component:p("/docs/examples/camera_calibration/","fcc"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_client/",component:p("/docs/examples/camera_client/","858"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_pointcloud/",component:p("/docs/examples/camera_pointcloud/","f47"),exact:!0,sidebar:"examples"},{path:"/docs/examples/camera_settings/",component:p("/docs/examples/camera_settings/","cec"),exact:!0,sidebar:"examples"},{path:"/docs/examples/cansniffer/",component:p("/docs/examples/cansniffer/","9d2"),exact:!0,sidebar:"examples"},{path:"/docs/examples/controller_square/",component:p("/docs/examples/controller_square/","8cb"),exact:!0,sidebar:"examples"},{path:"/docs/examples/controller_track/",component:p("/docs/examples/controller_track/","cf9"),exact:!0,sidebar:"examples"},{path:"/docs/examples/events_recorder/",component:p("/docs/examples/events_recorder/","e62"),exact:!0,sidebar:"examples"},{path:"/docs/examples/examples-index",component:p("/docs/examples/examples-index","212"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_converter/",component:p("/docs/examples/file_converter/","04a"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader_can/",component:p("/docs/examples/file_reader_can/","275"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader_gps/",component:p("/docs/examples/file_reader_gps/","8b6"),exact:!0,sidebar:"examples"},{path:"/docs/examples/file_reader/",component:p("/docs/examples/file_reader/","4aa"),exact:!0,sidebar:"examples"},{path:"/docs/examples/filter_client/",component:p("/docs/examples/filter_client/","2c3"),exact:!0,sidebar:"examples"},{path:"/docs/examples/FPV/",component:p("/docs/examples/FPV/","02b"),exact:!0,sidebar:"examples"},{path:"/docs/examples/gps_client/",component:p("/docs/examples/gps_client/","257"),exact:!0,sidebar:"examples"},{path:"/docs/examples/hello_main_loop/",component:p("/docs/examples/hello_main_loop/","bfa"),exact:!0,sidebar:"examples"},{path:"/docs/examples/import_log_file/",component:p("/docs/examples/import_log_file/","7ff"),exact:!0,sidebar:"examples"},{path:"/docs/examples/monitor_app/",component:p("/docs/examples/monitor_app/","05f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/motor_state/",component:p("/docs/examples/motor_state/","e2f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/multi_client_geoimage/",component:p("/docs/examples/multi_client_geoimage/","875"),exact:!0},{path:"/docs/examples/multi_client_subscriber/",component:p("/docs/examples/multi_client_subscriber/","d64"),exact:!0},{path:"/docs/examples/record_track/",component:p("/docs/examples/record_track/","44c"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_client/",component:p("/docs/examples/service_client/","93f"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_counter/",component:p("/docs/examples/service_counter/","979"),exact:!0,sidebar:"examples"},{path:"/docs/examples/service_propagation/",component:p("/docs/examples/service_propagation/","5a8"),exact:!0,sidebar:"examples"},{path:"/docs/examples/vehicle_twist/",component:p("/docs/examples/vehicle_twist/","8ce"),exact:!0,sidebar:"examples"},{path:"/docs/examples/vnc_viewer/",component:p("/docs/examples/vnc_viewer/","2a6"),exact:!0,sidebar:"examples"},{path:"/docs/farm-tools/three-point",component:p("/docs/farm-tools/three-point","15d"),exact:!0,sidebar:"Documentation"},{path:"/docs/getting-started",component:p("/docs/getting-started","835"),exact:!0,sidebar:"Documentation"},{path:"/docs/hardware-tools/etools",component:p("/docs/hardware-tools/etools","69a"),exact:!0},{path:"/docs/hardware-tools/recommended-tools",component:p("/docs/hardware-tools/recommended-tools","438"),exact:!0,sidebar:"Documentation"},{path:"/docs/intelligence-kit/brain/brain-v2",component:p("/docs/intelligence-kit/brain/brain-v2","102"),exact:!0,sidebar:"Documentation"},{path:"/docs/intelligence-kit/overview-intel",component:p("/docs/intelligence-kit/overview-intel","ba4"),exact:!0,sidebar:"Documentation"},{path:"/docs/mcu_kit/",component:p("/docs/mcu_kit/","005"),exact:!0,sidebar:"Documentation"},{path:"/docs/pendant/",component:p("/docs/pendant/","082"),exact:!0,sidebar:"Documentation"},{path:"/docs/reference/brain/canbus/canbus_client",component:p("/docs/reference/brain/canbus/canbus_client","e1b"),exact:!0,sidebar:"api"},{path:"/docs/reference/brain/canbus/packet",component:p("/docs/reference/brain/canbus/packet","75e"),exact:!0,sidebar:"api"},{path:"/docs/reference/brain/oak/camera_client",component:p("/docs/reference/brain/oak/camera_client","168"),exact:!0},{path:"/docs/reference/circuitpy/utils/can",component:p("/docs/reference/circuitpy/utils/can","b3a"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/cobid",component:p("/docs/reference/circuitpy/utils/cobid","925"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/general",component:p("/docs/reference/circuitpy/utils/general","da9"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/io",component:p("/docs/reference/circuitpy/utils/io","bb1"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/main_loop",component:p("/docs/reference/circuitpy/utils/main_loop","b39"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/nvm",component:p("/docs/reference/circuitpy/utils/nvm","13e"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/packet",component:p("/docs/reference/circuitpy/utils/packet","2be"),exact:!0,sidebar:"api"},{path:"/docs/reference/circuitpy/utils/version",component:p("/docs/reference/circuitpy/utils/version","bab"),exact:!0,sidebar:"api"},{path:"/docs/reference/faq",component:p("/docs/reference/faq","19a"),exact:!0,sidebar:"Documentation"},{path:"/docs/release-notes/release-01",component:p("/docs/release-notes/release-01","7e0"),exact:!0,sidebar:"Documentation"},{path:"/docs/ssh/",component:p("/docs/ssh/","b52"),exact:!0,sidebar:"Documentation"},{path:"/docs/support/",component:p("/docs/support/","3e7"),exact:!0,sidebar:"Documentation"},{path:"/docs/support/github-101",component:p("/docs/support/github-101","459"),exact:!0,sidebar:"Documentation"},{path:"/docs/tutorials/camera_streamer/camera-stream",component:p("/docs/tutorials/camera_streamer/camera-stream","869"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/camera_streamer/camera-streamer-overview",component:p("/docs/tutorials/camera_streamer/camera-streamer-overview","3e9"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/camera_streamer/kivy-definition",component:p("/docs/tutorials/camera_streamer/kivy-definition","a1a"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/camera_streamer/template-starter",component:p("/docs/tutorials/camera_streamer/template-starter","b26"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/background-knowledge",component:p("/docs/tutorials/introduction/background-knowledge","7af"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/template-overview",component:p("/docs/tutorials/introduction/template-overview","a82"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/introduction/tutorial-introduction",component:p("/docs/tutorials/introduction/tutorial-introduction","0f2"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/auto-control",component:p("/docs/tutorials/virtual_joystick/auto-control","0b2"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/device-streams",component:p("/docs/tutorials/virtual_joystick/device-streams","754"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/further-exercises",component:p("/docs/tutorials/virtual_joystick/further-exercises","3e9"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/template-starter",component:p("/docs/tutorials/virtual_joystick/template-starter","4de"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/virtual-joystick-overview",component:p("/docs/tutorials/virtual_joystick/virtual-joystick-overview","476"),exact:!0,sidebar:"examples"},{path:"/docs/tutorials/virtual_joystick/virtual-joystick-widget",component:p("/docs/tutorials/virtual_joystick/virtual-joystick-widget","613"),exact:!0,sidebar:"examples"}]},{path:"/",component:p("/","339"),exact:!0},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(4367),n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6775),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),k=n(3320),E=n(197);function _(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,u.TH)();return e+(0,g.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function S(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(_,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),P=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const L=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);null==t||t.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function D(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),D(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(L,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const N=O,I="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function F(e){return"\nwindow['"+j+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+j+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+I+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,F(e))),r.createElement("div",{id:I}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(B,null):null}function z(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var q=n(4763);function $(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(q.Z,null,r.createElement(P.M,null,r.createElement(A.t,null,r.createElement(p,null,r.createElement(z,null),r.createElement(S,null),r.createElement(U,null),r.createElement(N,{location:T(t)},e)))))}var H=n(6887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,a;if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Z=n(9670);const V=new Set,W=new Set,K=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},Y={prefetch(e){if(!(e=>!K()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(H).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!W.has(e))(e)&&(W.add(e),D(e))},Q=Object.freeze(Y);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;D(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement($,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"getting-started","docs":[{"id":"amiga_quick_start/amiga-quick-start","path":"/docs/amiga_quick_start/amiga-quick-start","sidebar":"Documentation"},{"id":"api/api-index","path":"/docs/api/","sidebar":"api"},{"id":"brain/brain","path":"/docs/brain/","sidebar":"Documentation"},{"id":"brain/brain-apps","path":"/docs/brain/brain-apps","sidebar":"examples"},{"id":"brain/brain-install","path":"/docs/brain/brain-install","sidebar":"Documentation"},{"id":"brain/next-steps","path":"/docs/brain/next-steps","sidebar":"Documentation"},{"id":"brain/ros-bridge","path":"/docs/brain/ros-bridge","sidebar":"examples"},{"id":"concepts/canbus_service/canbus-overview","path":"/docs/concepts/canbus_service/","sidebar":"Concepts"},{"id":"concepts/concepts-index","path":"/docs/concepts/","sidebar":"Concepts"},{"id":"concepts/controller_101/create-and-propagate-poses","path":"/docs/concepts/controller_101/","sidebar":"Concepts"},{"id":"concepts/controller_service/controller-overview","path":"/docs/concepts/controller_service/","sidebar":"Concepts"},{"id":"concepts/filter_service/filter-overview","path":"/docs/concepts/filter_service/","sidebar":"Concepts"},{"id":"concepts/gps_service/gps-overview","path":"/docs/concepts/gps_service/","sidebar":"Concepts"},{"id":"concepts/oak_service/oak-overview","path":"/docs/concepts/oak_service/","sidebar":"Concepts"},{"id":"concepts/transforms_and_poses/transforms-and-poses","path":"/docs/concepts/transforms_and_poses/","sidebar":"Concepts"},{"id":"contribute/contribute-website","path":"/docs/contribute/contribute-website","sidebar":"contribute"},{"id":"dashboard/control-states","path":"/docs/dashboard/control-states","sidebar":"Documentation"},{"id":"dashboard/dashboard","path":"/docs/dashboard/","sidebar":"Documentation"},{"id":"dashboard/dashboard-fw","path":"/docs/dashboard/dashboard-fw","sidebar":"Documentation"},{"id":"dashboard/dashboard-user-guide","path":"/docs/dashboard/dashboard-user-guide","sidebar":"Documentation"},{"id":"debug_cable/debug-cable","path":"/docs/debug_cable/","sidebar":"Documentation"},{"id":"debug_cable/service-cable","path":"/docs/debug_cable/service-cable","sidebar":"Documentation"},{"id":"examples/camera_aruco_detector/camera-aruco-detector","path":"/docs/examples/camera_aruco_detector/","sidebar":"examples"},{"id":"examples/camera_calibration/camera-calibration","path":"/docs/examples/camera_calibration/","sidebar":"examples"},{"id":"examples/camera_client/camera-client","path":"/docs/examples/camera_client/","sidebar":"examples"},{"id":"examples/camera_pointcloud/camera-pointcloud","path":"/docs/examples/camera_pointcloud/","sidebar":"examples"},{"id":"examples/camera_settings/camera-settings","path":"/docs/examples/camera_settings/","sidebar":"examples"},{"id":"examples/cansniffer/cansniffer","path":"/docs/examples/cansniffer/","sidebar":"examples"},{"id":"examples/controller_square/controller-square","path":"/docs/examples/controller_square/","sidebar":"examples"},{"id":"examples/controller_track/controller-track","path":"/docs/examples/controller_track/","sidebar":"examples"},{"id":"examples/events_recorder/events-recorder","path":"/docs/examples/events_recorder/","sidebar":"examples"},{"id":"examples/examples-index","path":"/docs/examples/examples-index","sidebar":"examples"},{"id":"examples/file_converter/file-converter","path":"/docs/examples/file_converter/","sidebar":"examples"},{"id":"examples/file_reader_can/file-reader-can","path":"/docs/examples/file_reader_can/","sidebar":"examples"},{"id":"examples/file_reader_gps/file-reader-gps","path":"/docs/examples/file_reader_gps/","sidebar":"examples"},{"id":"examples/file_reader/file-reader","path":"/docs/examples/file_reader/","sidebar":"examples"},{"id":"examples/filter_client/filter-client","path":"/docs/examples/filter_client/","sidebar":"examples"},{"id":"examples/FPV/fpv","path":"/docs/examples/FPV/","sidebar":"examples"},{"id":"examples/gps_client/gps-client","path":"/docs/examples/gps_client/","sidebar":"examples"},{"id":"examples/hello_main_loop/hello-world","path":"/docs/examples/hello_main_loop/","sidebar":"examples"},{"id":"examples/import_log_file/import-log-file","path":"/docs/examples/import_log_file/","sidebar":"examples"},{"id":"examples/monitor_app/monitor-app","path":"/docs/examples/monitor_app/","sidebar":"examples"},{"id":"examples/motor_state/motor-state","path":"/docs/examples/motor_state/","sidebar":"examples"},{"id":"examples/multi_client_geoimage/multi-client-geoimage","path":"/docs/examples/multi_client_geoimage/"},{"id":"examples/multi_client_subscriber/multi-client-subscriber","path":"/docs/examples/multi_client_subscriber/"},{"id":"examples/record_track/record-track","path":"/docs/examples/record_track/","sidebar":"examples"},{"id":"examples/service_client/service-client","path":"/docs/examples/service_client/","sidebar":"examples"},{"id":"examples/service_counter/service-counter","path":"/docs/examples/service_counter/","sidebar":"examples"},{"id":"examples/service_propagation/service-propagation","path":"/docs/examples/service_propagation/","sidebar":"examples"},{"id":"examples/vehicle_twist/vehicle-twist","path":"/docs/examples/vehicle_twist/","sidebar":"examples"},{"id":"examples/vnc_viewer/vnc-viewer","path":"/docs/examples/vnc_viewer/","sidebar":"examples"},{"id":"farm-tools/three-point","path":"/docs/farm-tools/three-point","sidebar":"Documentation"},{"id":"getting-started","path":"/docs/getting-started","sidebar":"Documentation"},{"id":"hardware-tools/etools","path":"/docs/hardware-tools/etools"},{"id":"hardware-tools/recommended-tools","path":"/docs/hardware-tools/recommended-tools","sidebar":"Documentation"},{"id":"intelligence-kit/brain/brain-v2","path":"/docs/intelligence-kit/brain/brain-v2","sidebar":"Documentation"},{"id":"intelligence-kit/overview-intel","path":"/docs/intelligence-kit/overview-intel","sidebar":"Documentation"},{"id":"mcu_kit/microcontroller-kit","path":"/docs/mcu_kit/","sidebar":"Documentation"},{"id":"pendant/pendant","path":"/docs/pendant/","sidebar":"Documentation"},{"id":"reference/brain/canbus/canbus_client","path":"/docs/reference/brain/canbus/canbus_client","sidebar":"api"},{"id":"reference/brain/canbus/packet","path":"/docs/reference/brain/canbus/packet","sidebar":"api"},{"id":"reference/brain/oak/camera_client","path":"/docs/reference/brain/oak/camera_client"},{"id":"reference/circuitpy/utils/can","path":"/docs/reference/circuitpy/utils/can","sidebar":"api"},{"id":"reference/circuitpy/utils/cobid","path":"/docs/reference/circuitpy/utils/cobid","sidebar":"api"},{"id":"reference/circuitpy/utils/general","path":"/docs/reference/circuitpy/utils/general","sidebar":"api"},{"id":"reference/circuitpy/utils/io","path":"/docs/reference/circuitpy/utils/io","sidebar":"api"},{"id":"reference/circuitpy/utils/main_loop","path":"/docs/reference/circuitpy/utils/main_loop","sidebar":"api"},{"id":"reference/circuitpy/utils/nvm","path":"/docs/reference/circuitpy/utils/nvm","sidebar":"api"},{"id":"reference/circuitpy/utils/packet","path":"/docs/reference/circuitpy/utils/packet","sidebar":"api"},{"id":"reference/circuitpy/utils/version","path":"/docs/reference/circuitpy/utils/version","sidebar":"api"},{"id":"reference/faq","path":"/docs/reference/faq","sidebar":"Documentation"},{"id":"release-notes/release-01","path":"/docs/release-notes/release-01","sidebar":"Documentation"},{"id":"ssh/ssh","path":"/docs/ssh/","sidebar":"Documentation"},{"id":"support/github-101","path":"/docs/support/github-101","sidebar":"Documentation"},{"id":"support/support","path":"/docs/support/","sidebar":"Documentation"},{"id":"tutorials/camera_streamer/camera-stream","path":"/docs/tutorials/camera_streamer/camera-stream","sidebar":"examples"},{"id":"tutorials/camera_streamer/camera-streamer-overview","path":"/docs/tutorials/camera_streamer/camera-streamer-overview","sidebar":"examples"},{"id":"tutorials/camera_streamer/kivy-definition","path":"/docs/tutorials/camera_streamer/kivy-definition","sidebar":"examples"},{"id":"tutorials/camera_streamer/template-starter","path":"/docs/tutorials/camera_streamer/template-starter","sidebar":"examples"},{"id":"tutorials/introduction/background-knowledge","path":"/docs/tutorials/introduction/background-knowledge","sidebar":"examples"},{"id":"tutorials/introduction/template-overview","path":"/docs/tutorials/introduction/template-overview","sidebar":"examples"},{"id":"tutorials/introduction/tutorial-introduction","path":"/docs/tutorials/introduction/tutorial-introduction","sidebar":"examples"},{"id":"tutorials/virtual_joystick/auto-control","path":"/docs/tutorials/virtual_joystick/auto-control","sidebar":"examples"},{"id":"tutorials/virtual_joystick/device-streams","path":"/docs/tutorials/virtual_joystick/device-streams","sidebar":"examples"},{"id":"tutorials/virtual_joystick/further-exercises","path":"/docs/tutorials/virtual_joystick/further-exercises","sidebar":"examples"},{"id":"tutorials/virtual_joystick/template-starter","path":"/docs/tutorials/virtual_joystick/template-starter","sidebar":"examples"},{"id":"tutorials/virtual_joystick/virtual-joystick-overview","path":"/docs/tutorials/virtual_joystick/virtual-joystick-overview","sidebar":"examples"},{"id":"tutorials/virtual_joystick/virtual-joystick-widget","path":"/docs/tutorials/virtual_joystick/virtual-joystick-widget","sidebar":"examples"}],"draftIds":[],"sidebars":{"Documentation":{"link":{"path":"/docs/getting-started","label":"getting-started"}},"Concepts":{"link":{"path":"/docs/concepts/","label":"concepts/concepts-index"}},"api":{"link":{"path":"/docs/api/","label":"api/api-index"}},"examples":{"link":{"path":"/docs/examples/examples-index","label":"examples/examples-index"}},"contribute":{"link":{"path":"/docs/contribute/contribute-website","label":"contribute/contribute-website"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.3.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.3.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.3.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.3.1"},"docusaurus-plugin-google-analytics":{"type":"package","name":"@docusaurus/plugin-google-analytics","version":"2.3.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.3.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.3.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.3.1"}}}'),c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(412),o=n(5742),i=n(4774);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(u,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const c=e=>r.createElement(s,e);class u extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:c)(e)}return null!=e?e:null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){var n,p;let{isNavLink:f,to:m,href:h,activeClassName:g,isActive:b,"data-noBrokenLinkCheck":v,autoAddBaseUrl:y=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:_}=(0,d.C)(),x=(0,a.useContext)(u),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const C=m||h;const T=(0,s.Z)(C),A=null==C?void 0:C.replace("pathname://","");let P=void 0!==A?(R=A,y&&(e=>e.startsWith("/"))(R)?_(R):R):void 0;var R;P&&T&&(P=(0,i.applyTrailingSlash)(P,{trailingSlash:k,baseUrl:E}));const L=(0,a.useRef)(!1),D=f?o.OL:o.rU,O=c.Z.canUseIntersectionObserver,N=(0,a.useRef)(),I=()=>{L.current||null==P||(window.docusaurus.preload(P),L.current=!0)};(0,a.useEffect)((()=>(!O&&T&&null!=P&&window.docusaurus.prefetch(P),()=>{O&&N.current&&N.current.disconnect()})),[N,P,O,T]);const M=null!=(n=null==(p=P)?void 0:p.startsWith("#"))&&n,j=!P||!T||M;return j||v||x.collectLink(P),j?a.createElement("a",(0,r.Z)({ref:S,href:P},C&&!T&&{target:"_blank",rel:"noopener noreferrer"},w)):a.createElement(D,(0,r.Z)({},w,{onMouseEnter:I,onTouchStart:I,innerRef:e=>{S.current=e,O&&e&&T&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=P&&window.docusaurus.prefetch(P))}))})),N.current.observe(e))},to:P},f&&{isActive:b,activeClassName:g}))}const f=a.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){var t,n;let{id:r,message:a}=e;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?r+"."+a:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>p,yW:()=>g,gB:()=>h});var r=n(6775),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},p=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},4367:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||(window.ga("set","page",t.pathname+t.search+t.hash),window.ga("send","pageview"))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},4774:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Tt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(7462),s=n(6775),c=n(5999),u=n(5936);const d="docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=null!=(n=document.querySelector("main:first-of-type"))?n:document.getElementById(d);var n;t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){var t;const n=null!=(t=e.children)?t:m,{containerRef:a,onClick:o}=f();return r.createElement("div",{ref:a,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:"#"+d,onClick:o}),n))}var g=n(5281),b=n(9727);const v="skipToContent_fXgn";function y(){return r.createElement(h,{className:v})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const _="closeButton_CVFx";function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",_,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const S="content_knG7";function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(S,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T="announcementBar_mb4j",A="announcementBarPlaceholder_vyr4",P="announcementBarClose_gvF7",R="announcementBarContent_xLdY";function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:A}),r.createElement(C,{className:R}),i&&r.createElement(x,{onClick:n,className:P}))}var D=n(3163),O=n(2466);var N=n(902),I=n(3102);const M=r.createContext(null);function j(e){let{children:t}=e;const n=function(){const e=(0,D.e)(),t=(0,I.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(M.Provider,{value:n},t)}function F(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function B(){const e=(0,r.useContext)(M);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,I.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:F(o)})),[a,o,t])}function U(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=B();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var z=n(2949),q=n(2389);function $(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function H(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const G={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,value:n,onChange:o}=e;const i=(0,q.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(G.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",G.toggleButton,!i&&G.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement($,{className:(0,a.Z)(G.toggleIcon,G.lightToggleIcon)}),r.createElement(H,{className:(0,a.Z)(G.toggleIcon,G.darkToggleIcon)})))}const V=r.memo(Z);function W(e){let{className:t}=e;const n=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,z.I)();return n?null:r.createElement(V,{className:t,value:a,onChange:o})}var K=n(1327);function Y(){return r.createElement(K.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,D.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function X(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(Y,null),r.createElement(W,{className:"margin-right--md"}),r.createElement(Q,null))}var J=n(9960),ee=n(4996),te=n(3919),ne=n(8022),re=n(9471);function ae(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const p=(0,ee.Z)(a),f=(0,ee.Z)(t),m=(0,ee.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,te.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(re.Z,c&&{width:12,height:12}))};return o?r.createElement(J.Z,(0,l.Z)({href:u?m:o},d,g)):r.createElement(J.Z,(0,l.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ne.F)(n,t.pathname):t.pathname.startsWith(f)},d,g))}function oe(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ae,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ie(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ae,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function le(e){var t;let{mobile:n=!1,position:a,...o}=e;const i=n?ie:oe;return r.createElement(i,(0,l.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var se=n(6043),ce=n(8596),ue=n(2263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ce.Mg)(e.to,t)||!!(0,ne.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function pe(e){var t;let{items:n,position:o,className:i,onClick:s,...c}=e;const u=(0,r.useRef)(null),[d,p]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&p(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":d})},r.createElement(ae,(0,l.Z)({"aria-haspopup":"true","aria-expanded":d,role:"button",href:c.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},c,{onClick:c.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),p(!d))}}),null!=(t=c.children)?t:c.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(Ge,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),p(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function fe(e){var t;let{items:n,className:o,position:i,onClick:c,...u}=e;const d=function(){const{siteConfig:{baseUrl:e}}=(0,ue.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),p=de(n,d),{collapsed:f,toggleCollapsed:m,setCollapsed:h}=(0,se.u)({initialState:()=>!p});return(0,r.useEffect)((()=>{p&&h(!p)}),[d,p,h]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ae,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",o)},u,{onClick:e=>{e.preventDefault(),m()}}),null!=(t=u.children)?t:u.label),r.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},n.map(((e,t)=>r.createElement(Ge,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:c,activeClassName:"menu__link--active"},e,{key:t}))))))}function me(e){let{mobile:t=!1,...n}=e;const a=t?fe:pe;return r.createElement(a,n)}var he=n(4711);function ge(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const be="iconLanguage_nlXk";function ve(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ye=n(830),we=["translations"];function ke(){return ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Se="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=xe(e,we),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=Ee((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(Se))}),[]),r.createElement("button",ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ye.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(ve,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Te=n(5742),Ae=n(6177),Pe=n(239),Re=n(3320);var Le=n(3935);const De={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Oe=null;function Ne(e){let{hit:t,children:n}=e;return r.createElement(J.Z,{to:t.url},n)}function Ie(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:a}=(0,Ae.O)();return r.createElement(J.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Me(e){var t,a;let{contextualSearch:o,externalUrlRegex:i,...c}=e;const{siteMetadata:u}=(0,ue.Z)(),d=(0,Pe.l)(),p=function(){const{locale:e,tags:t}=(0,Re._q)();return["language:"+e,t.map((e=>"docusaurus_tag:"+e))]}(),f=null!=(t=null==(a=c.searchParameters)?void 0:a.facetFilters)?t:[],m=o?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(p,f):f,h={...c.searchParameters,facetFilters:m},g=(0,s.k6)(),b=(0,r.useRef)(null),v=(0,r.useRef)(null),[y,w]=(0,r.useState)(!1),[k,E]=(0,r.useState)(void 0),_=(0,r.useCallback)((()=>Oe?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,6780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Oe=t}))),[]),x=(0,r.useCallback)((()=>{_().then((()=>{b.current=document.createElement("div"),document.body.insertBefore(b.current,document.body.firstChild),w(!0)}))}),[_,w]),S=(0,r.useCallback)((()=>{var e;w(!1),null==(e=b.current)||e.remove()}),[w]),C=(0,r.useCallback)((e=>{_().then((()=>{w(!0),E(e.key)}))}),[_,w,E]),T=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ne.F)(i,t)?window.location.href=t:g.push(t)}}).current,A=(0,r.useRef)((e=>c.transformItems?c.transformItems(e):e.map((e=>({...e,url:d(e.url)}))))).current,P=(0,r.useMemo)((()=>e=>r.createElement(Ie,(0,l.Z)({},e,{onClose:S}))),[S]),R=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",u.docusaurusVersion),e)),[u.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:y,onOpen:x,onClose:S,onInput:C,searchButtonRef:v}),r.createElement(r.Fragment,null,r.createElement(Te.Z,null,r.createElement("link",{rel:"preconnect",href:"https://"+c.appId+"-dsn.algolia.net",crossOrigin:"anonymous"})),r.createElement(Ce,{onTouchStart:_,onFocus:_,onMouseOver:_,onClick:x,ref:v,translations:De.button}),y&&Oe&&b.current&&(0,Le.createPortal)(r.createElement(Oe,(0,l.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:k,navigator:T,transformItems:A,hitComponent:Ne,transformSearchClient:R},c.searchPagePath&&{resultsFooterComponent:P},c,{searchParameters:h,placeholder:De.placeholder,translations:De.modal})),b.current))}function je(){const{siteConfig:e}=(0,ue.Z)();return r.createElement(Me,e.themeConfig.algolia)}const Fe="searchBox_ZlJk";function Be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Fe)},t)}var Ue=n(143),ze=n(3438);var qe=n(373);const $e=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:le,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,ue.Z)(),p=(0,he.l)(),{search:f,hash:m}=(0,s.TH)(),h=[...n,...u.map((e=>{const n=""+("pathname://"+p.createUrl({locale:e,fullyQualified:!1}))+f+m;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(me,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(ge,{className:be}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Be,{className:n},r.createElement(je,null))},dropdown:me,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ue.Iw)(a),s=(0,ze.vY)(t,a);return null===s?null:r.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===s.path||!(null==i||!i.sidebar)&&i.sidebar===s.sidebar,label:null!=n?n:s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ue.Iw)(a),s=(0,ze.oz)(t,a).link;if(!s)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,ze.lO)(a)[0],s=null!=t?t:i.label,c=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(le,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:p}=(0,s.TH)(),f=(0,Ue.Iw)(n),m=(0,Ue.gB)(n),{savePreferredVersionName:h}=(0,qe.J)(n),g=[...o,...m.map((e=>{var t;const n=null!=(t=f.alternateDocVersions[e.name])?t:$e(e);return{label:e.label,to:""+n.path+d+p,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,ze.lO)(n)[0],v=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:$e(b).path;return g.length<=1?r.createElement(le,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(me,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Ge(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function Ze(){const e=(0,D.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ge,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ve(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function We(){const e=0===(0,w.L)().navbar.items.length,t=B();return r.createElement(r.Fragment,null,!e&&r.createElement(Ve,{onClick:()=>t.hide()}),t.content)}function Ke(){const e=(0,D.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(U,{header:r.createElement(X,null),primaryMenu:r.createElement(Ze,null),secondaryMenu:r.createElement(We,null)}):null}const Ye="navbarHideable_m1mJ",Qe="navbarHidden_jGov";function Xe(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Je(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,D.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,O.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ye,!s&&Qe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Xe,{onClick:i.toggle}),r.createElement(Ke,null))}function et(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function tt(){const{toggle:e,shown:t}=(0,D.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(et,null))}const nt="colorModeToggle_DEke";function rt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Ge,(0,l.Z)({},e,{key:t})))))}function at(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ot(){const e=(0,D.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(at,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(tt,null),r.createElement(Y,null),r.createElement(rt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(rt,{items:a}),r.createElement(W,{className:nt}),!o&&r.createElement(Be,null,r.createElement(je,null)))})}function it(){return r.createElement(Je,null,r.createElement(ot,null))}function lt(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,ee.Z)(n),u=(0,ee.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(J.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},s),o,a&&!(0,te.Z)(a)&&r.createElement(re.Z,null))}function st(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(lt,{item:n}))}function ct(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(st,{key:t,item:e})))))}function ut(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ct,{key:t,column:e}))))}function dt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function pt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(lt,{item:t})}function ft(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(pt,{item:e}),t.length!==n+1&&r.createElement(dt,null))))))}function mt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(ut,{columns:t}):r.createElement(ft,{links:t})}var ht=n(941);const gt="footerLogoLink_BH7S";function bt(e){var t;let{logo:n}=e;const{withBaseUrl:o}=(0,ee.C)(),i={light:o(n.src),dark:o(null!=(t=n.srcDark)?t:n.src)};return r.createElement(ht.Z,{className:(0,a.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function vt(e){let{logo:t}=e;return t.href?r.createElement(J.Z,{href:t.href,className:gt,target:t.target},r.createElement(bt,{logo:t})):r.createElement(bt,{logo:t})}function yt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function wt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function kt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(wt,{style:o,links:n&&n.length>0&&r.createElement(mt,{links:n}),logo:a&&r.createElement(vt,{logo:a}),copyright:t&&r.createElement(yt,{copyright:t})})}const Et=r.memo(kt),_t=(0,N.Qc)([z.S,k.pl,O.OC,qe.L5,i.VC,function(e){let{children:t}=e;return r.createElement(I.n2,null,r.createElement(D.M,null,r.createElement(j,null,t)))}]);function xt(e){let{children:t}=e;return r.createElement(_t,null,t)}function St(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const Ct="mainWrapper_z2l0";function Tt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),r.createElement(xt,null,r.createElement(i.d,{title:s,description:c}),r.createElement(y,null),r.createElement(L,null),r.createElement(it,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Ct,l)},r.createElement(o.Z,{fallback:e=>r.createElement(St,e)},t)),!n&&r.createElement(Et,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:c,logo:d}}=(0,s.L)(),{imageClassName:p,titleClassName:f,...m}=e,h=(0,i.Z)((null==d?void 0:d.href)||"/"),g=c?"":n,b=null!=(t=null==d?void 0:d.alt)?t:g;return a.createElement(o.Z,(0,r.Z)({to:h},m,(null==d?void 0:d.target)&&{target:d.target}),d&&a.createElement(u,{logo:d,alt:b,imageClassName:p}),null!=c&&a.createElement("b",{className:f},c))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s["themedImage--"+e],u)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(null!=t&&t),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){var t,n;const a=e.scrollHeight,o=null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a);return{transition:"height "+o+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:a+"px"}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function p(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const p=(0,a.useRef)(null);return u({collapsibleRef:p,collapsed:n,animation:o}),a.createElement(t,{ref:p,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(p.current,n),null==i||i(n))},className:l},r)}function f(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(p,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?f:p;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d="light",p="dark",f=e=>e===p?p:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e))(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{u.set(f(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p:d:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===p},setLightTheme(){s(d)},setDarkTheme(){s(p)}})),[o,s])}function h(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>w});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),c=n(12);const u=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},p=(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),f=(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()};const m=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);const n=(0,a.zh)(e),[i,l]=v(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}function w(){const e=(0,a._r)(),[t]=v();function n(n){var r;const a=e[n],{preferredVersionName:o}=t[n];return null!=(r=a.versions.find((e=>e.name===o)))?r:null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var r=n(7294),a=n(6775),o=n(2263);const i="q";function l(){const e=(0,a.k6)(),{siteConfig:{baseUrl:t,themeConfig:n}}=(0,o.Z)(),{algolia:{searchPagePath:l}}=n,[s,c]=(0,r.useState)("");(0,r.useEffect)((()=>{var e;const t=null!=(e=new URLSearchParams(window.location.search).get(i))?e:"";c(t)}),[]);return{searchQuery:s,setSearchQuery:(0,r.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),c(t)}),[e]),generateSearchPageLink:(0,r.useCallback)((e=>""+t+l+"?"+"q="+encodeURIComponent(e)),[t,l])}}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>p,_F:()=>m,cE:()=>d,hI:()=>w,lO:()=>b,oz:()=>v,s1:()=>g,vY:()=>y});var r=n(7294),a=n(6775),o=n(8790),i=n(143),l=n(373),s=n(1116),c=n(7392),u=n(8596);const d=!!i._r;function p(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=p(t);if(e)return e}}}const f=(e,t)=>void 0!==e&&(0,u.Mg)(e,t);function m(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||((e,t)=>e.some((e=>m(e,t))))(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function g(){var e;const t=(0,s.V)(),{pathname:n}=(0,a.TH)();return!1!==(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)&&t?h({sidebarItems:t.items,pathname:n}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,a].filter(Boolean))),[t,n,a])}function v(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+(0,c.j)(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function w(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return null!=e&&e.trim().length?e.trim()+" "+a+" "+n:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>l,_X:()=>s});var r=n(7294),a=n(6775),o=n(1688),i=n(902);function l(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),p=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),l)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function f(e){let{children:t}=e;const n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a,o;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(a=r.split("\n")[1])||null==(o=a.match(/at (?:\w+\.)?(?\w+)/))?void 0:o.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d,o5:()=>p});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=c(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>null==n.current?void 0:n.current()))})),{blockElementScrollPositionUntilNextRender:a}}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return"docs-"+e+"-"+t}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){var r;const a=(null==n?void 0:n.activePlugin.pluginId)===e?n.activeVersion:void 0,o=s[e],i=t[e].versions.find((e=>e.isLast));return l(e,(null!=(r=null!=a?a:o)?r:i).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(7294),a=n(1688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function l(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t,listen:t}}(e);const n=l(null==t?void 0:t.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error("Docusaurus storage error, can't listen for changes of key="+e,r),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,a.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace("/"+o+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return""+(a?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),a=n(8022),o=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=""+(o.pathname+o.hash);return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>_,q_:()=>P,ob:()=>h,PP:()=>L,Ep:()=>m,Hp:()=>g});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(2177);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,p(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),c=1;c{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);_+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var S,C=1;if(v){if(!(S=o(k,_,e,b))||S.index>=e.length)break;var T=S.index,A=S.index+S[0].length,P=_;for(P+=E.value.length;T>=P;)P+=(E=E.next).value.length;if(_=P-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Pd.reach&&(d.reach=N);var I=E.prev;if(D&&(I=s(t,I,D),_+=D.length),c(t,I,C),E=s(t,I,new a(p,g?r.tokenize(L,g):L,y,L)),O&&s(t,E,O),C>1){var M={cause:p+","+m,reach:N};i(e,t,n,E.prev,_,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=p(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),f=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),m=u;a(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n