WEBVTT

00:00.000 --> 00:09.000
Yeah, happy to be here. Thank you all for joining.

00:09.000 --> 00:13.000
So, I'm going to talk about EBITPF talks.

00:13.000 --> 00:16.000
But first, a little bit about me. My name is Diana Amlinck.

00:16.000 --> 00:20.000
I work at Isabelent, which is now part of Cisco.

00:20.000 --> 00:23.000
I'm a Selium contributor.

00:23.000 --> 00:28.000
And I am a reviewer for the Selium EBITPF loader library.

00:28.000 --> 00:35.000
I've been doing EBITPF stuff since about 2021.

00:35.000 --> 00:42.000
And that is to do with why I started the box project.

00:42.000 --> 00:46.000
So, EBITPF, as we all know, is great.

00:46.000 --> 00:48.000
We can do super cool stuff at the kernel.

00:48.000 --> 00:51.000
It's safer than the alternatives.

00:51.000 --> 00:55.000
And it's super fast.

00:55.000 --> 01:02.000
But, EBITPF is also really complex, quickly evolving.

01:02.000 --> 01:07.000
And honestly, not super wall documented.

01:07.000 --> 01:11.000
As maybe perhaps any of you who are still learning at MIT,

01:11.000 --> 01:12.000
might be aware of.

01:12.000 --> 01:17.000
So, I personally, so I took this graphic, which is normally a marketing graphic.

01:17.000 --> 01:19.000
Not something for a developer.

01:20.000 --> 01:25.000
But what it's nice to explain is, it's called the adoption curve.

01:25.000 --> 01:30.000
And what I believe that, like, from nothing other than my gut,

01:30.000 --> 01:33.000
that we are somewhere at the Red Arrow.

01:33.000 --> 01:37.000
So, we had the innovators, the people who did the early network of EBITPF,

01:37.000 --> 01:39.000
who were users.

01:39.000 --> 01:43.000
And we're now somewhere quite far along, probably,

01:43.000 --> 01:45.000
in the early adopter stage.

01:45.000 --> 01:48.000
What's coming is the main early majority in the late majority.

01:48.000 --> 01:53.000
So, basically, most of the people that will eventually use EBITPF,

01:53.000 --> 01:59.000
still have got to adopt it.

01:59.000 --> 02:02.000
So, when you start learning EBITPF, or at least,

02:02.000 --> 02:06.000
you start to Google about a bunch of terms for EBITPF.

02:06.000 --> 02:09.000
And you're still more on blogs and articles,

02:09.000 --> 02:13.000
which often explain, like, a very specific thing,

02:13.000 --> 02:15.000
or, like, a very specific use case.

02:15.000 --> 02:19.000
But they don't explain everything about the exact EBITPF feature they use.

02:19.000 --> 02:23.000
They each quickly, because a lot of articles,

02:23.000 --> 02:27.000
you'll still find state things that are just no longer true.

02:27.000 --> 02:33.000
There are great videos, like, Linux plumbers and full stem on EBITPF.

02:33.000 --> 02:38.000
But they are, like, everything in there as much searchable.

02:38.000 --> 02:42.000
So, you have to either know exactly what the video is about.

02:42.000 --> 02:45.000
Or, you'll just not find what you're after.

02:45.000 --> 02:48.000
Colonel sources are demost reliable.

02:48.000 --> 02:50.000
It's the source, basically.

02:50.000 --> 02:54.000
So, it's the most reliable way to learn about EBITPF.

02:54.000 --> 02:58.000
But, especially for EBITPF beginners now,

02:58.000 --> 03:01.000
and a lot of people that are using EBITPF now,

03:01.000 --> 03:03.000
are not necessarily Colonel developers.

03:03.000 --> 03:07.000
So, reading Colonel sources is just not very beginner-friendly.

03:07.000 --> 03:09.000
And then they come to docs.

03:09.000 --> 03:15.000
So, there are, I want to shout out a few resources that are,

03:15.000 --> 03:19.000
like, the most like docs that are already out there.

03:19.000 --> 03:23.000
And they all have, like, a little bit,

03:23.000 --> 03:25.000
that is really great.

03:25.000 --> 03:28.000
The Colonel books are best source that we have,

03:28.000 --> 03:30.000
but they just don't cover everything,

03:30.000 --> 03:34.000
and they are often really focused on Colonel developers and

03:34.000 --> 03:38.000
users with the main pages for helpers, which is now no longer,

03:38.000 --> 03:42.000
not really being maintained, it's a searchable.

03:42.000 --> 03:44.000
So, I had, like, when I started doing this,

03:44.000 --> 03:48.000
I had so many gripes with, like, why, why come?

03:48.000 --> 03:50.000
I just find what I want to.

03:50.000 --> 03:51.000
Like, why come?

03:51.000 --> 03:53.000
I just search something and find what I need.

03:53.000 --> 03:56.000
So, that's where a lot of the, where I'm on motivation

03:56.000 --> 03:58.000
for doing this project comes from.

03:58.000 --> 04:02.000
When I, after, after I became a little bit more knowledgeable,

04:02.000 --> 04:05.000
I started to help other people on Slack,

04:05.000 --> 04:08.000
and the same questions get popping up, like,

04:08.000 --> 04:12.000
so I found myself repeating myself often,

04:12.000 --> 04:14.000
and having to maintain this, like,

04:14.000 --> 04:17.000
you list of resources, like, depending on what you're asking,

04:17.000 --> 04:20.000
I had to send people to completely different sites,

04:20.000 --> 04:23.000
or a combination of sites, like you can find this here,

04:23.000 --> 04:27.000
but if you want to know this, you need to go to this other place.

04:27.000 --> 04:29.000
They, they didn't link to each other.

04:29.000 --> 04:33.000
So, and there were just certain questions that we never answered,

04:33.000 --> 04:35.000
like, that are quite practical.

04:35.000 --> 04:37.000
Like, can I use this on Colonel X, why,

04:37.000 --> 04:40.000
this, this, this program type support this helper?

04:40.000 --> 04:45.000
How do I do loops in EBPF, which is, is not possible?

04:45.000 --> 04:49.000
So, what my goal was, is to create the one-stop shop,

04:49.000 --> 04:53.000
like, I drew the limit at everything that is kernel,

04:53.000 --> 04:55.000
and everything that is maintained,

04:55.000 --> 04:59.000
backer all developers, such as LibBPF, and so on,

04:59.000 --> 05:04.000
and I wanted to make documentation that was for users

05:04.000 --> 05:07.000
for the end user, and not necessarily for the people writing it,

05:07.000 --> 05:09.000
because they probably know a lot of this already.

05:09.000 --> 05:13.000
I want to, like, internal linking, because there's a bunch of stuff

05:13.000 --> 05:15.000
that is often, like, a program can go,

05:15.000 --> 05:18.000
how a function, which might reference something else.

05:18.000 --> 05:20.000
So, I wanted to be able to follow it,

05:20.000 --> 05:23.000
and I wanted to searchable, like, both on the site itself,

05:23.000 --> 05:28.000
but also in search engines, because, because that's where I started,

05:28.000 --> 05:30.000
like, just type in something.

05:30.000 --> 05:33.000
I wanted to answer a few of these practical,

05:33.000 --> 05:37.000
or as many of these practical questions that I, that I could.

05:37.000 --> 05:43.000
So, what I ended up with is the EBPF docs project.

05:43.000 --> 05:47.000
This is the homepage, and it's likely to do the big,

05:47.000 --> 05:51.000
the big chapter for anyone who hasn't seen it.

05:52.000 --> 05:57.000
What I, so, there's, you can internally search on this,

05:57.000 --> 06:03.000
which I find one of the nicest features, and I use a lot.

06:03.000 --> 06:08.000
And this is, like, the example of one of the pages.

06:08.000 --> 06:12.000
On the left, is your, like, site navigation,

06:12.000 --> 06:14.000
your navigation will page itself.

06:14.000 --> 06:17.000
And then what I particularly want to do,

06:17.000 --> 06:19.000
or potentially, for example, is here.

06:19.000 --> 06:23.000
So, you'll see these a lot, is the little tags with version number.

06:23.000 --> 06:27.000
And these are everywhere I can place them on the site,

06:27.000 --> 06:29.000
and they, so they state the kernel version,

06:29.000 --> 06:32.000
in which something was added, and if you follow the link,

06:32.000 --> 06:34.000
it will go to the actual commit-on-get-up,

06:34.000 --> 06:36.000
where that features added.

06:36.000 --> 06:38.000
So, if you want to check, check something,

06:38.000 --> 06:41.000
or, um, to actually dive into the sources,

06:41.000 --> 06:46.000
because this isn't enough for you, then you can do so quite easily.

06:47.000 --> 06:50.000
One of the other things it does is, every, all of my,

06:50.000 --> 06:54.000
all of the program pages have this generated list of all of the helpers

06:54.000 --> 06:56.000
that are, that you can use from it.

06:56.000 --> 06:58.000
So, this answers, like, the practical question of,

06:58.000 --> 07:00.000
can I use X and Y?

07:00.000 --> 07:03.000
And if, um, you can only do it from a certain version,

07:03.000 --> 07:05.000
we also have, like, the tags behind it.

07:05.000 --> 07:07.000
So, the helpers exist, that the program exists,

07:07.000 --> 07:11.000
that only from this version, onward, could you use them together?

07:11.000 --> 07:13.000
Same for, for, for, k-fungs.

07:13.000 --> 07:17.000
So, it just is, uh, every program that has this list,

07:17.000 --> 07:19.000
and the reverse also, too.

07:19.000 --> 07:22.000
We have map types, um, where you'll immediately notice

07:22.000 --> 07:25.000
that I missed one, um, I just haven't had, uh,

07:25.000 --> 07:27.000
I did and dive into the internal,

07:27.000 --> 07:29.000
so I haven't explained that one.

07:29.000 --> 07:31.000
Contributions are very welcome.

07:31.000 --> 07:33.000
Uh,

07:33.000 --> 07:35.000
Is this where you think stop this one?

07:35.000 --> 07:38.000
Uh, I'll get to, I'll get to the behind the scenes a bit.

07:38.000 --> 07:39.000
Yeah.

07:39.000 --> 07:42.000
So, um, maps, we have maps, it links to a few other things,

07:42.000 --> 07:45.000
internally, for example, the value size, which, um,

07:45.000 --> 07:48.000
uh, gets explains, uh, what kind of things it does,

07:48.000 --> 07:51.000
where you can use, or what Cisco, you can do for in case,

07:51.000 --> 07:53.000
that's important to you.

07:53.000 --> 07:55.000
Uh, I don't imagine it is for a lot of people.

07:55.000 --> 07:58.000
Um, also, like, flags like these,

07:58.000 --> 08:00.000
these typically don't get explained very well.

08:00.000 --> 08:04.000
When are they added, what do they do, um, stuff like this?

08:04.000 --> 08:08.000
Um, then we come to the helpers, so this is the index of the

08:08.000 --> 08:12.000
helper, uh, of the helper, so this is like the very long page.

08:12.000 --> 08:15.000
Uh, and notably, I like, bit my best to categorize these.

08:15.000 --> 08:17.000
So if you're looking for like related helpers or whatever,

08:17.000 --> 08:19.000
they're like, sort of listed together.

08:19.000 --> 08:22.000
Um, and if they're like for specific maps, maps,

08:22.000 --> 08:25.000
then it's, uh, also tells you that here immediately.

08:25.000 --> 08:29.000
Um, so, uh, these are, for example, the memory, the memory helpers.

08:29.000 --> 08:32.000
That's, uh, I hope a page looks like this.

08:32.000 --> 08:37.000
Uh, again, tech, uh, we have the definition, uh, which comes from, um,

08:37.000 --> 08:42.000
is so indirectly from the kernel, but the libbps, the libbps, uh,

08:42.000 --> 08:46.000
that it's, uh, best to like collect all the separate definitions into like one file.

08:46.000 --> 08:51.000
So I, uh, have their copyright homework, because that's where I pull my other data from.

08:51.000 --> 08:54.000
Uh, and they've explained it, it shows you what the, what the definition is.

08:54.000 --> 08:58.000
So if you need to, like manually define it, you can just grab the,

08:58.000 --> 09:01.000
grab the definition and use this in your program.

09:01.000 --> 09:03.000
Uh, and it explains it, uh,

09:03.000 --> 09:07.000
we have, again, here to this. So this is the reverse, um, for,

09:07.000 --> 09:12.000
which, in which program start, can I use this helper, which is, uh, which is also helpful.

09:12.000 --> 09:16.000
Uh, and we always attempt to add a little example.

09:16.000 --> 09:19.000
So this is often missing, I have to admit.

09:19.000 --> 09:25.000
Um, and of course, credits do to everyone who helped, uh, maintain all of the pages.

09:25.000 --> 09:31.000
Um, cavefunks, so cavefunks, this is actually the only place I know of that cavefunks are actually documented.

09:31.000 --> 09:35.000
So the helper functions, we have the mampage holder, but there are no mampages for cavefunks.

09:35.000 --> 09:39.000
Uh, so I endeavor to add these.

09:39.000 --> 09:44.000
Um, an example of this is, again, along the very, the, the same line.

09:44.000 --> 09:49.000
So if you're, we are used to one kind of page, then you'll probably find that this is also, uh,

09:49.000 --> 09:54.000
that this is, uh, familiar to you. Uh, it explains a bunch of things.

09:54.000 --> 09:59.000
Um, it, uh, so these cavefunks are used with different mechanism.

09:59.000 --> 10:05.000
And they have, like, flags to, uh, to tell you, uh, roughly about what, what, what the purpose of, uh,

10:05.000 --> 10:09.000
uh, over cavefunks, uh, and it tells you, for example, here that this may only be used in a sleepable program,

10:09.000 --> 10:14.000
et cetera, and it links to a bunch of page that explains what a sleepable program is.

10:14.000 --> 10:20.000
Um, again, with an example, program types that it can be used with, because that is the same, uh,

10:20.000 --> 10:22.000
that's the same kind of deal.

10:23.000 --> 10:30.000
Um, and these, uh, these are typically from also from the kernel sources, um, uh, which I, uh,

10:30.000 --> 10:35.000
uh, which I didn't have here for, so you don't have to go, go fetch them yourselves.

10:35.000 --> 10:38.000
Um, so these are concepts.

10:38.000 --> 10:42.000
So besides all of, like, documenting explicitly all of the individual things to our,

10:42.000 --> 10:46.000
I also endeavor to do a more, uh, more article style thing.

10:46.000 --> 10:50.000
So for everything that's, that needs explaining, like, what is spinning?

10:50.000 --> 10:53.000
How do I do, concurrent your loops or resource limits?

10:53.000 --> 10:58.000
Stuff like this, where you actually need a little bit of explanation to introduce a concept.

10:58.000 --> 11:00.000
Those are the concept pages.

11:00.000 --> 11:06.000
Um, so we have, uh, stuff like, uh, how to do loops, uh, in different versions.

11:06.000 --> 11:08.000
Well, when you can do loops, how do they work?

11:08.000 --> 11:15.000
What are the caveats? Um, the explaining VP of tokens? Um, uh, what they are, what they do,

11:15.000 --> 11:20.000
I need them, uh, dynamic pointers and a bunch of functions that you might use with this.

11:20.000 --> 11:25.000
So there, there are quite a few of these, and they are more in, like, a sort of football style.

11:25.000 --> 11:32.000
Um, I've also, uh, this is quite recently actually started to, uh, make pages for the,

11:32.000 --> 11:37.000
for the libbps side of this. So, um, because typically, you see, like,

11:37.000 --> 11:42.000
everywhere you go on the internet, you see these libbps, uh, internal macros.

11:42.000 --> 11:49.000
Um, the, the, the, the, the, the second, uh, all of the little macros that are used to define specific things.

11:49.000 --> 11:55.000
But no one ever explains why did this come from, what they've been mean. Um, uh, so, uh,

11:55.000 --> 12:00.000
these are all here, and they also can be linked in the future and articles where you explain, like,

12:00.000 --> 12:06.000
how to do something in EBPF. It can just link to these, these individual things, that is the idea.

12:06.000 --> 12:12.000
Uh, same goes for, so again here, we said, okay, we have the bpf core, vetoed h, and you can find all of these macros,

12:12.000 --> 12:16.000
and uh, explains what all of these individually do.

12:16.000 --> 12:21.000
So, to, behind the curtain, so this was, like, everyone who, who can go to the page can all,

12:21.000 --> 12:25.000
uh, my memory seen this. So I also want to explain what, what's behind the project.

12:25.000 --> 12:32.000
So, um, it's a, um, it's a make-dokes project, so we, it's all mag-down, um, with a, with a theme and a bunch of plugins.

12:32.000 --> 12:39.000
Uh, I use Docker to, uh, I use Docker to, um, make sure that everyone can contribute and run and do stuff,

12:39.000 --> 12:43.000
get up actions to actually deploy this, they'll once and get up on get up pages.

12:43.000 --> 12:49.000
Um, and then there are the tools, so I wrote a bunch of, uh, these are included in the repo.

12:49.000 --> 12:54.000
A bunch of these tools to the help me, um, maintain, maintain this.

12:54.000 --> 12:59.000
So the first one is the, the, the version feature finder and the feature, uh, tech generator.

12:59.000 --> 13:04.000
So the way this works is I create a ammo file. Um, it's your, the, the two users get,

13:04.000 --> 13:11.000
grab and get bisexual, um, Linux get up repository. Um, to, and then it will figure out, like,

13:11.000 --> 13:18.000
when we're certain symbols added. Uh, it will create a big data file of this and from this data file,

13:18.000 --> 13:23.000
I can insert it into the markdown automatically. So again, uh, we have here that, uh,

13:23.000 --> 13:28.000
I want to point out again the, the label here. Uh, so this would be a file.

13:28.000 --> 13:32.000
So I have a bunch of, so I said, okay, in the PF lives in these, in these,

13:32.000 --> 13:36.000
a lot of files, that's optimization thing. Um, please go through all of these tags.

13:36.000 --> 13:43.000
These are the tags that that BFF exist in and then go find all of these patterns. Um,

13:43.000 --> 13:47.000
so by default, it's just a normal one, but it also supports red taxes.

13:47.000 --> 13:53.000
And then it's, uh, it spits out, uh, they so just says, okay, this, this symbol was added in this version,

13:53.000 --> 13:57.000
this commit, and then, um, it's, I don't have to, most of the time,

13:57.000 --> 14:01.000
I don't actually manually have to go into the sources, and it gets inserted.

14:01.000 --> 14:05.000
So only have to create a tag, tell it what symbol I'm looking for, and it will insert, uh,

14:05.000 --> 14:13.000
nice little link in there. Um, I have the help, uh, reference generators, so these two lists of, uh,

14:13.000 --> 14:19.000
uh, the from helper to program program to helper. Um, this is a little bit more labels.

14:19.000 --> 14:25.000
So, uh, I have manually write down a sort of data file, which is a very, very small representation,

14:25.000 --> 14:30.000
and it actually models the way that the kernel results, which helper files, um,

14:30.000 --> 14:35.000
can can be used in which programs, which in the kernel is like a bunch of functions with

14:35.000 --> 14:40.000
switches that call each other, uh, and I emulated this. So I have a group.

14:40.000 --> 14:45.000
We have the base, the base group with all of these, uh, these, these helpers in there.

14:45.000 --> 14:49.000
And then, uh, I have, for example, the C group, base group, which has these,

14:49.000 --> 14:55.000
plus all of the ones that are in the base, and then it can be, uh, and then it is used by a program.

14:55.000 --> 15:01.000
So these programs use the, uh, SK filter group or a few individual ones, plus the tracing group.

15:01.000 --> 15:05.000
And these all get merged and translated into these big lists, so you can actually resolve,

15:05.000 --> 15:12.000
which, uh, uh, actually resolve, uh, how, how does work. And this was, this is all, uh,

15:12.000 --> 15:19.000
automated, so I don't have to do it by hand. Um, same, uh, uh, uh, we have the deaf, the deaf

15:19.000 --> 15:24.000
scraper, so this helps a lot with the helper functions specifically. So it takes the, uh,

15:24.000 --> 15:29.000
all of the definitions from libbpf about helpers. Um, it parses the commands that have, like,

15:29.000 --> 15:34.000
explanations on them, which also the managers generated for covert to mark down and we can just

15:34.000 --> 15:39.000
insert these. So you'll, uh, you'll see that, uh, that we have a bit here where, uh,

15:39.000 --> 15:43.000
where we have the helper definition, it is actually like the mark down version.

15:43.000 --> 15:48.000
It says we return this and this is, uh, uh, and we have the lag line. So that is all,

15:48.000 --> 15:54.000
like automatic updated, the libbpf gets updated, we update, uh, we updated on the box as well.

15:54.000 --> 16:00.000
And then for the cave function, uh, it's, uh, a little bit of the same idea.

16:00.000 --> 16:04.000
So I manually curate the list of all cave functions that are, that are in there.

16:04.000 --> 16:09.000
So I just basically watch and watch the mailing list or watch the two versions.

16:09.000 --> 16:14.000
Um, I compile a VM Linux. So I compile a Linux kernel, take the VM Linux out of it

16:14.000 --> 16:19.000
with all cave functions that are defined in there. And then I can use the kbpfk

16:19.000 --> 16:23.000
from the contact to like validate that I got all of them, but I also use the VM Linux,

16:23.000 --> 16:29.000
the btf and there to generate the signatures of all of the cave functions. So that are always, uh,

16:29.000 --> 16:36.000
correct. And then the, the flags I manually do. So I say okay, we have a set of these IDs.

16:36.000 --> 16:41.000
These are the functions. These are the flags. So that's sort of the notification things.

16:41.000 --> 16:48.000
And these are the programs, um, on which you can, you can use them. Um, and then on the page,

16:48.000 --> 16:53.000
I still have to create, uh, often manually take descriptions of what these do.

16:53.000 --> 16:57.000
But the, uh, like the, the boring part, they basically get it done for me.

16:57.000 --> 17:01.000
So that's all of these toolings really, all of these tools really help.

17:01.000 --> 17:05.000
Uh, and then the reference with all the programs that it can be used from and the reverse,

17:05.000 --> 17:09.000
are generated, of course. Um, so this makes it really, uh,

17:09.000 --> 17:15.000
this really takes away a lot of maintenance burden from this. Um, so, um,

17:15.000 --> 17:19.000
um, future things that I still want to, of course, we need to keep up a changes,

17:19.000 --> 17:24.000
because otherwise this is all, um, useless work. Um, I still want to do the little bit of

17:24.000 --> 17:30.000
user space so that we can also start to do more things on the, on the user space side of things,

17:30.000 --> 17:35.000
explaining, uh, for example, in the tutorial styles. Um, there are so much more concepts

17:35.000 --> 17:40.000
that that can use concept pages, but these are the most labor intensive to create.

17:40.000 --> 17:46.000
So, um, future work. Um, there are some gaps. Uh, I have to admit like I, uh,

17:46.000 --> 17:50.000
I don't understand everything myself. So I can't always document them. So as I'm learning,

17:50.000 --> 17:56.000
I'm filling in the box myself. Um, and one of the big things I want to do is to start explaining

17:56.000 --> 18:00.000
verify logs, because this tends to be like the biggest obstacle to new users. Like,

18:00.000 --> 18:06.000
what is how do I redevelop, how does this work? Um, and what I like, if I get

18:06.000 --> 18:14.000
error x, how do I, what do I need to do to fix it? Um, but to like get, I need some information

18:14.000 --> 18:20.000
like what are common errors, um, get some good examples of the, uh, of the looks. Um,

18:20.000 --> 18:26.000
so I want to shout out, uh, this link. It's by, uh, Johannes, uh, who's also speaker

18:26.000 --> 18:30.000
at the conference later, uh, later this day, uh, where we are trying to collect, uh,

18:30.000 --> 18:36.000
like voluntarily, collect as many, uh, verify logs and the solutions. Like, this is the

18:36.000 --> 18:40.000
load I got, this is what I did wrong. This is how I fixed it. Uh, so that we can,

18:40.000 --> 18:44.000
uh, I can use it in, uh, to document a lot of these things, um,

18:44.000 --> 18:48.000
and, and Johannes wants to, uh, try to train an AI on this to make a tool to help

18:48.000 --> 18:54.000
help programmers out, though I don't know. Let's see how that goes. Um,

18:54.000 --> 18:56.000
uh, are there any questions?

18:56.000 --> 19:00.000
We have time for questions. I, uh,

19:00.000 --> 19:02.000
uh, what we have. Um, uh, what we have. Um, uh,

19:02.000 --> 19:06.000
uh, this is a separate procedure that you've been doing, but these types of

19:06.000 --> 19:10.000
you being doing most of that, you're sent information to me, uh,

19:10.000 --> 19:14.000
like our communities, uh, uh, uh, uh, yes. Well, uh, so, uh,

19:14.000 --> 19:18.000
yeah, so the question was, do we, uh, that, that I do this work myself, or do we have

19:18.000 --> 19:24.000
other contributors? So the bulk of the work, uh, like adding adding most of the pages is, uh,

19:24.000 --> 19:28.000
a currently still done by me. The, there was a section on lip XDP, uh, which has been

19:28.000 --> 19:32.000
contributed, as all of the pages they are contributed, and we have around 20

19:32.000 --> 19:38.000
contributors who mainly do, uh, like, uh, uh, uh, fixed my work,

19:38.000 --> 19:42.000
spell checks, miss, I like things I go along, uh, stuff like that. So, uh,

19:42.000 --> 19:46.000
most of these small corrections, uh, and of course, every, like,

19:46.000 --> 19:50.000
please help out if you, if you see anything wrong, just submit it to

19:50.000 --> 19:56.000
our, um, everything else, if, uh, as long as it's good and correct.

19:56.000 --> 19:58.000
I don't have a question, I have a couple of them. Thank you.

19:58.000 --> 20:02.000
I do using the site for many months now, it's great.

20:02.000 --> 20:04.000
You're welcome. That's what I wanted.

