 Hello everyone, welcome to Canalized Demonstration at DefCon Car Hacking Village 2022. A little bit of quick acknowledgement before we go into the talk. Many of the images used here are not created by me and definitely the credit goes to the owners of those images. And all these views or opinions are from my learnings of car hacking and canalized team learnings of car hacking. We apologize if we miscommunicate any information. And also using this tool, you can only control certain functions of the vehicle depending upon the hardware you're using and how those functions are implemented in the vehicle, not the entire vehicle. This is not like a Swiss Army tool of doing everything in one click. No, it's not nothing like that. And a little bit of shameless promotion about me. My name is Karthik Lade and I'm currently working as an IoT security researcher at Pyattu. I love automotive and IoT security, breaking things and trying to do as much as I can. And I've been a speaker at conferences such as black at Asia Arsenal last year in Asia and the cocoon as a truck cocoon is a conference which happens in India, as I said, as I said track in that and seaside conference and besides really car hacking village. And apart from this work stuff I'm an absolute community lover and volunteer I work with the seaside community which is a completely open source community and free conference for anyone who is interested to learn. And I'm an open source contributor along with this tools, whatever I make the content which I make it on blogs and the tools and all are completely open source. And yeah, I love watching Durham one. Yeah, some people say I'm still a kid. Yeah, I'm a kid if you have to remember please give it to me. I would love to see the episodes which I don't know. And generally I go to health stations or something to do this thing. Currently I'm working on a new as I want to secure to audit platform called I would be auditor from my company. So that's about me. And I want to introduce my friend Rahul who unfortunately due to circumstances he wouldn't be here for the recording and he's currently working as a digital specialist engineer at imposes. He is the code guy. So generally it happens is like I coded and I give it to him he cleans the code and he scolds me like writing a bad code, but yeah my code works so I still depend myself. He's absolute open source contributor like me he also did level up a lot of libraries. I think I believe he worked on making mood MCU how can it be used in IOT automated projects and all his a lot passionate about robotics and mechatronics, and he thinks a lot a lot of work. So that's about us. So the main point around of this whole doolies on canvas so if we see why the industry needs canvas and why we need a lot of canvas in in vehicle networks or in vehicle in vehicles. If you can see the vehicle here in the top thing. So there are a lot of components. So what happened is car manufacturers or vehicle manufacturers when they started adding more and more actuators or sensors. They want to make a closed loop feedback based centralized network inside it. So each one can talk to each other and make the whole vehicle go forward or make certain functions. They had to make sure that each and every component is connected with each other. So if you keep going like this it literally makes a haywire of wiring and also it creates a lot of drag because of those wise and obviously the fuel efficiency and all go slow. So they had to come up with a new age protocol in 1980s where you can handle all the data in a very good centralized fashion and you don't have to drop the packets also imagine you want to slam the brakes but it is getting dropped because of a lot of traffic and that is not also to happen. So engineers at Bosch came up with canvas where like you see it is a single line. It actually connects all the components in your vehicle issues and all the stuff and well issues basically. And so actuators and sensors will connect with these issues and all. But the main point here is like you just removed all the wiring and going on single bus. Nevertheless, it also came with few drawbacks such as lack of encryption and lack of authentication while sending these things. And it's another way if we see it works more on centralized fashion so everybody is literally trusting every other packet which is flowing in the bus. So this actually opened up to a lot sort of frame attacks and protocol attacks where you actually do this and all we our tool is more focused on the frame attacks. So if you see can also this has carrier sense multiple access with collision avoidance which actually makes sure none of the packets are getting dropped. And obviously there are many other protocols like can FD and the link bus and all flex day on all this automotive internet at all just can is one of them. And yeah, it is one of the efficient ways because it has CSM as last year and also differential signaling basically to resist to the noises and get this thing. The wire which we are seeing in the previous slide it's just like a single wire a twisted pair of where which post of can high and can low and flows around through all the issues in the vehicle and all. Periodically can also can transmit up to one M bit per second but lowest bit cans go up to 125 kilo kbps. So that is there and if you see from an eagle point of view from a top point of view about a can packet you can see something called arbitration ID which actually makes shows which packet has to go print and control field and data field data field which contains the exact data. So, in a very simple piece of cake point of view, if you know what arbitration ID and what data is actually making a certain function to go on. In this case, a certain function can be a indication or turn a steering nowadays many of these things are happening drive by wire instructions. So if you steer your turning it might be happening on a canvas, any canvas it doesn't depend like everybody should be having canvases, because modern architectures have multiple canvas networks also. So basically if you know the exact packet and the data you can do a lot of stuff, but in order to get that exact packet and data and standard can format is 500 kbps so for that you get a lot and lots of packets so manually reversing all of them is very a hectic process. So this is happening for me when I was participating in different CTFs, especially kind of CTFs, I was finding it very hard to go through each packet and see the traditional way which we all know is like having them each half way replay to see if your action is actually happening or not and then do according to that, but I wanted to come up with some kind of tool which will help me, you know, which will automatically say me okay these are the packets which happened in this specific time frame which are not happening in general time frame. That is one thing. And well I was thinking, you know a lot of this canvas attacks and all this after I joined I started my journey or job real corporate job and all. So one of the attack vectors while I was working on security and automotive they are like, you know, more little words hardware based, you have to have a hardware connection with that. So I was thinking, is there any way I can put a remote thing using this tool because this now has in my mind, you know, the automatic filtering thing and also it has. Easily filter the packets and all. So now I wanted to keep it into a remote Raspberry Pi. So this is the initial layout which I was having in the mind, obviously apart from this telegram port. So my idea was to put hardware, whatever hardware I'm available and keep it in the Raspberry Pi can analyze inside Raspberry Pi and actually put it inside a vehicle through wired connection like a hardware backdoor hardware implant backdoor and but later we found a way we came to know that you can actually send to using telegram bots, you can actually send data to telegram and get this thing and all. So that was one thing telegram bots using, you can also do this thing, but also I realized, you know, after this. Well, I was well I was working on few projects of electric vehicle collecting logs of multiple multiple logs every day day in and day out and filtering them and making sure everything is in place is also very hectic. So now I want something, you know, where I can put all my logs like sessions like if you know the Bob suits right, they can actually collect all the sessions all the requests which are going in and out from the service process I was and collect them in one place. So I wanted to have this thing. So this is what canalize was started. So if I say along with my friend we were actually trying to first implement automatic filtering way by comparing with two files that was the previous version. Then we came to know you know we can use something called hash maps, and we can actually make sure that it goes automatically so you can directly get the payload refined payload outside. I was always thinking out with how can we do over the internet, like hardware implant, and how can we have a session based thing where you can collect all the dump and all. So, and also a few assumptions here. If you are using this tool, we assume that you have the required hardware and also you're in the same bus where you can log the data, and log the internet action which you want to find out the packets and make sure your power supply is taken a lot of times I had to redo it testing and all because the power supply which I was giving is not stable. And also if you're using it as a remote hardware implant like shown in the previous slide. Please make sure you have that hardware has a remote connectivity thing and all. So, why can less there are a lot of things happening as Cappy is there as Cappy has a Python can support can support and all and candle is there. But canal is more on Python can library and it is completely available for all the things which we are implemented using an IDE, which is coming. You can see there's three main stuff smart scan ID and connect to telegram basically connect to telegram works on top of ID which is there, passing comments to HPT PIP key, but all the functions which actually this tool works and all, it happened to Python can library so the code is pretty much malleable, you can add your own functions and you can do it and you can be using it remotely also. And there's one more important thing which we added while we realized while testing of this tool that you know there should be some data transfer importing a log file into it and then replaying it and recording it and all is okay. But what if wherever in whichever session you are creating a log file or a basically creating a particular data frame set of data, and you can seamlessly pull it to another session and all that also we want to influence and this happened and it's a command line based tool I personally like command line based tools more than GUI. And yeah, sometimes I hate it but yeah I love it overall. So that is there. So we wanted to get all of this. Now you might be having the questions like you know Catholic whatever you told us nice and okay but how exactly this happens in your tool. So for that, let's see the process flow a little bit. And like I was explaining, let's say the main concept here is like you make two files, which you can compare with each other. And then you actually do the whole use the whole tool to automatically do the stuff. So let's say the first file as source file and imagine you're on a road or you're riding your vehicle. You have some 40 kilometers per hour speed and suddenly do this is not in steady state, even though you are running it 40 kilometers per hour steady state. But there is a lot of data, huge amounts of data has going through in your canvas networks and doing all these things. But you apply a break or you give a signal or you turn the steering or do something which can actually be controlled on by can packets. The use of that packets compared to all the packets which are having on the bus is less than 5%. So what we do here in this tool, particularly while we are in this tool is we create a source file, which actually contains a general and not contains the intended packets. Let's say my intended packets right now is to open the doors and put on light and left indications. So we create a source file first. And then we record an action file, which we create through SmartScan or ID. In SmartScan, it is automatically done. You just need to press single buttons, click, click, click. And then you can actually pass commands to do this stuff. So that also you can do with action. What we basically do is like in source, basically you don't have the intended action in action. You have actually the intended packets are present for what you're trying to do. So then what now. Let's call it as noise. It's a general traffic in the bus. And now you can have action file where you have intended packs of action, definitely with the source. And also I have here noise start. Why noise start is like there might be additional packets which are generated in time of your action happening. It might be affecting it might not be affecting it might be different stuff. For example, if you're slamming the brakes, two packets are being generated one to send it to the actuator break actuator blitz and all to actually slam the break and also same time indicators on your input in my hub, or the dashboard has to show up that you know breaks are slammed and all. So if this might be in your interest, this might not be in your interest. So generally, if we keep only featuring this source and attack file, the action files. They basically have extra packets which you might want don't want to know, but using smart scan and ID you can actually filter into that level also. Don't worry we'll see it in a detailed demonstration and coming forward. Yeah. And there is payload events we payload what happens is like action minus source obviously and noise start you can depend that we will see. So if we put into a when diagram point of view, this is something you want this is the niche ice cream you want, which you are interested, and it might be coming with a noise and it might be having some overlapping with source. So all these things and so now you're saying like okay, we have a source file you can have an action file and you want to create a payload file you're just doing some kind of filtering picking up packets and all. I'm doing this, but what if you have multiple action files you want to record that also you can do with smart scan along with the ID smart scan you just need to do it in a recursive way. Keep telling it now you have to collect the action for the action for it will does all the things and it can analyze between them and create a payload for you. And what if you have multiple source files, since smart scan does the functions recursively, it actually records all the packets recursively without even using it continuously checks the pulse, compares between two files and doesn't think. And you can generate payloads also. But what if you have multiple source files you want to record multiple action files you want to record and you want to create multiple payload files that you can do in ID, what in ID we are using this we are leveraging the power of an ID environment which you get and Python can and also the database for advanced and faster filtering and also SQL commands because a lot of people know SQL nowadays we thought like you know instead of doing it by hand. Why don't we use SQL power of SQL here and basically help out people in making the process easy run SQL command to treat the logs you created as tables and run SQL commands and then get out of this things. Well, if you're interested on how this exact code works, I have a few, you know, main functions of it, the collect signal function. So basically what happens here is like whenever you enter into the smart scan mode, it starts this function collect signal and where it collects all the data which is appearing on the particular communication interface you have mentioned in the settings. For example, if I'm using a simulator in this case then my interface would be watchful can zero and yeah, the socket can and channel is what so I can see when the interface socket can, it simply picks up all the data, and it quickly converts into a hash map, and whenever you go to noise, you can call it as instead of signal you can call it as source. And when you go to noise, it will also create a check with the hash map or whatever the packets it is coming in the noise file, whether it is present in action or not. So here the assumption is like if it is present in both files, probably that is not your intended packet. If it is not present, then yeah that is your intended packet. We are actually checking the whole data also we are not, you know, simply checking the IDs we are also checking the data. So it comes out that way. And yeah, it's enough of what myself, the process flow and the whole, you know, the code flow and all let's actually see the real mate here, the demo. And for this demo, I'm using a similar obviously I don't own a car and I don't want to break anyone's car and nobody seriously guys nobody believes me in giving the car. So, yeah, it's good thing but it's also a bad thing because I was not able to get a real demo to this talk. I still regret that. But yeah, when if you're doing it in your car, then please make sure you don't break your car if you're using your friends cars or your colleagues or some well wish of cars. So please make sure you have the necessary permissions to all this stuff. I'm currently focusing on the IC simulator. So guys, welcome to my VM lab. Here I want to go with the VM for demonstration purposes and I just want to put it with show. I'm using three here IC simulator and can you tell support and the canalized. So once you get to want your versions and you installed all the required things. You can do this CD into the canalized and it should be something like this. So this means like you have all the things I have already listed all the requirements in the thing, whatever we are using inside is. So please run it using the three minus requirements for text and it will do all the stuff for you automatically and then use pseudo I recommend pseudo because we are putting a lot of file saving and all stuff. So you can do pseudo Python three canalized interface top five. So yeah, this is how canalized looks when you open it. So before going to the options I want to quickly show you about the settings. There are three settings here you can set up your communication channel communication interface and API token. Since it is developed on top of Python can impact using Python can. Thanks to all the developers who contributed to Python can who made our lives easy in developing this tool. You can also use all the channels and the process the Python can use supports so I want to check what channel it has. Yes, it has a weekend zero which is I'm running like you guessed is simulator here. It also runs on weekend zero and the interface is socket can. Yeah, so now let me just start with the smart spend where we said, you know, it will automatically do the stuff. Yeah, so here the few options you can play save and you can put from this thing. And also you can press the space bar and start feeling the signals and all. And yeah, if you don't like this key bindings you can change it anytime and completely open source so you can do it on your own. It's a very easy code. So, but till the time we are on a conversation that smart scan collect noise function actually silently recording all the packets which are going back. In the weekend zero. So when I just hit space bar, and I give the right and left signal just for easy purposes, and I was being it directly came with the packets. So yeah, why it immediately get the packets. I'm doing something bad here no no no so just because we are having a converse in a lot of time, it quickly found out you know using hash map it is the only packets which changed while here. And you can actually do one more thing we can go this time faster and do to see how it doesn't live. And I do. Yeah, so if you can see this 244 if you know is simulator 244 is this for signal indication, but because it does a hash map, it is constantly filtering all the stuff automatically. And you can save this logs. It should give back to two packets. For example if you're not getting that filtered thing you can do it because only once again to get the exact same packets and all, you can actually save this file, then press s to save and then let me say this is my village. 2022 block. And it will save in that particular folder in that let me just open my tools and can alize yeah if you can see here it just mentioned the lock same files along with the time stamp and sorry for my UI. You can see it also took the time stamp and all the IDs and all. So that is about the smart scan but what if you don't want to do it automatically, but you actually want to do it in a smart ID way. For that you can use channel is ID so ID it's like any other Python ID. Please edit this out. Yeah, so ID is more like any other Python based ID you here you have like command line interface you can set pass some functions there are set of predefined functions, which we will see now, and you can do that and all. I will just record a few variables here and after that I'll make a new file noise and I'll do use the scan function which is predefined here and I'll mention, you know, collect all the packets from weekend zero channel, and then do it for 60 seconds. And yeah. So what's happening now is the functions which we use to defend the scan function it is by using Python can this collecting all the packets which are happening in the bus and keeping it to a Python data frame, basically, Pandas as pandas data frame, so that we can go forward and use it much easier and all. Let me let it complete for one minute, and then we will do the same thing for action, but that time will open the doors close the doors and give indication in a particular sequence to see whether it is able to collect the same sequence pack and filter it exactly. So let's just wait till the scan completes. Basically, the more you scan for noise now the more a fault reduced your thing because it has a big directory of all the messages, which you're not interested or that is not exactly happening in your intended action time period. It's good to have a good filter so that you get much fine business. Yeah, now it completed. Let's do the same. Let's make another action by and scan it for particular 60 seconds. You can zero and then 60 seconds. But this time at the same time, what we do is we'll open the right indication and open the doors and do the left indication and close all the doors and open all the doors back and close all the doors. So technically speaking, all this package should be inside the action file which we are creating other variable where we are storing all these packets and we should be able to compare the noise and remove the noise from this action. So there are any extra things we can also do that since like I mentioned we are using SQL here. So it's simply like a table you just run your queries inside this ID itself here itself. And then you know you actually get to remove all the, you know, noise stuff you have. It is now also like you remember it is considering a lot of noise like noise star and all. Yeah, and let's see how much packets it actually collected in this format, or in this time period. Yeah, it collected around 4643 packets and in action, it collected around 4700 packets. And you can also increase the speed and see you can do this for more just for demonstration purposes here I'm doing it very, making it very simple. So yeah, that is there. And let's just filter them. So filtering is very simple using a skill commands just run an SQL command here, consider these two as tables and I want to select ID, comma, data from, let's say action obviously action and I just don't want which are there in the noise value except, you know, select ID, comma, data from noise. So that's it. And it literally stemmed through all 4700 packets and it defined like reduced it to very less number of packets let's see how many. Actually, 244 should come here also, but since we recorded for a large amount of time it didn't appear here. So yeah, it literally filtered down to six packets. This is good enough if you want to do it manually if you want to send each packet and check and all, but this is not good enough if you want to store this long in a separate way. So for that, this is actually present whatever happening here, these packets and all these are actually present in the files which we created. So we can actually use the SQL to match with the same and to color the exact timestamp and channel, which are corresponding to this ID and data for that, let me just do something like, you know, payload. Let me create a payload, which is SQL of select a dot timestamp from my a dot channel from my a dot ID from my data from action obviously to be only available action action a and I want to use this SQL function in a joint and in a joint to filter. In a joint to filter, let's call it as B on the junction a dot ID is equal to the dot ID and a dot data is equal to be taught data. So this would be the command to actually pack it back into the same. Okay, there's some issue here. Okay, so let's do something called load and actually pass the string into this just copy this. And now we can verify this, but this is the thing. And let's just load it into a payload. It is equal to SQL of just give me a second. I want to see what. Okay, I made a small error. Instead of filter I'm just saying Peter. So let me just run that once again. Let's just see what is on your filter. So what is equal to select a dot timestamp a dot channel comma a dot ID my a dot data action. In a joint filter be on a dot ID is equal to be taught ID and a dot data is equal to be taught data. I don't think this works. Yeah, I had to pass it in a string. Very sorry guys, very sorry killing your time. Okay, now let's see load. Yeah, and now let's do payload is equal to SQL of load. Yeah, now it just packed everything into the one payload five. And a lot of it is so yeah now you can see it packed with all the things and here you can see what order it became the it also packed into those stuff here you might miss the order a little bit because it is on different sorting algorithm. But when you pack it back according to timestamp it will adjust back all the things. And now you can actually play this payload thing which we created, and to see if it is happening on the same. So same thing like the same thing and all scan function like and all so we can zero and just to payload. Please don't make a stringer as like I did. I'm very ashamed of it now. So if you see it actually does in the same order which we recorded which make confirms that this tool will not reverse your can prior conversion and all those things it doesn't do all the kind of things. It actually works on time stamp basis so it does like that same close the doors. Yeah. So it completed playing all these things so this is one thing but we it is a very small thing now right now we just created two actions and one action and one noise and hardly 4,700 packets are there and only six, seven, you know payload packets are there and seven, all these things. And but yeah if you might have a question like you know why it is giving more than what it is supposed to be here. So when it checks this is that noise start I'm saying it checks that and then it sometimes it gives you, you can actually particularly remove something from this thing and you can also do that, for example, I want to remove 190 so I can do something like, you know, payload, it's on filter so let's just do filter one, which is, you know, let's say SQL of select all from filter. In fact, you can run payload also here, you don't need to worry about that, where ID is not equal to 19p and just close this and run it. So if you see filter one will actually give me the packets which you want. So in this way, like was explaining you can create multiple files payload files also if you want and all. But even though it is very small but we created a lot of stuff we ran a lot of commands we did some blunders, I did some blunders. So yeah, what if I want to have this whole session exported in ID you can also do that for example when you're doing different version projects you work you're working on assessing how good the break function is, but you want to extract, export all the things, you can simply put export, and just type the name, I want to do CHV 22, like I did. Let's just add another way we'll talk and yeah, that's it, I just pass it as a string, and I put enter right now it is exporting every single command and everything. It did completed also wave pass. So all the things which we did till now are actually done here. So let me just open that you can see here. There's a CHV 22 top folder here there we have logs, all the logs which we created filter one noise action payload, even though you don't convert into logs, because whenever you play it back actually makes in the log. You can also, for example the filter which we never used it anywhere. So it can also convert all your things into a CSV and it can save it to you. You can also do this in the CSV way, and also here we use some kind of meta language kind of stuff, the dot twice. So you can actually see all the commands which we ran till now, along with all the blunders and stuff and also if you see here, we also have this thing. The data dot class, what data dot class actually does this like I was explaining can analyze ID you can do seamless data transfer. So right now I exported this logs so I have this my payload and filter one and all. So if I want this into any other project, I don't need to copy paste copy paste and all I can simply call or import from this particular directory, this this particular payload prior log but it is that you just import that. So we'll do that I let me just exit from here. And do it into new thing where I want to show, you know, do we have this stuff from now. So let's say, let's try for filter one dot log. So let's see if we have filter one dot log or something, you know, filter one variable at least. It's not different. It's completely remote. But I can simply say, you know, just get filter one from here. In fact, I can give another name CHV is equal to, yeah, let's just filter one you just need to copy paste it and then yeah. Okay, again, blunders, a lot of blunders today. Yeah, filter one you just got the same thing you can actually do the same thing here like we did same ID so you can play it. We can zero comma filter one, and it will just keep the thing signals. So once it is done, yeah, you've got the graph one doing, yeah, left one also both of it's done. So this is how easy it is using canalized ID and recording the projects and doing all the stuff. Yeah, let's also check out the telegram part. So to do that, I'll quickly open my telegram. I have also created a bot known as canalized bot, and I have this API token. I'll just copy it here and I'll go to settings. And I'll put my API token here. That's it. So if I want to check, I can go back and check. Yeah, it's the same one, which I just used and I went back. And I want to go to initialize this bot. This bot is initialized. Let me just connect to Telegram. Let me just start this. Yeah, it gives a high cut means it has binded with your bot. And what happens here is like, we can do all the same stuff which we did till now. And if you remember, we have multiple files here, so we can actually use them and do the same kind of same commands. The same commands and to see, but we'll just restricted to 10 seconds like that. So let's do that. So let me just collect the noise once again for 10 seconds. So whenever telegram while you're using to telegram pot, please make sure your port is initialized control and also when the command execution is completed. It will give you a thumbs up symbol which indicates that you know your command is perfectly executed. Otherwise it puts you an error. And also let's do one more action by this time. Let me do the action by for 30 seconds. I want to do something. So I want to open only two doors here and then, yeah, let's see how that works for us. I'm opening the first door and doing the right signal and I'm opening the second door and then in the left signal, and I'm literally closing all the doors. So let's see how it happens in this. So same commands like IDG, like I discussed it simply uses the whole commands from IDU to do here filters now. Like we did. Here also you can see it says message received and output is good and all. Yeah. And also you can load it back into a payload. Okay, again the same error because yeah, there's no fighter there's only filter. Yeah, it's done. And you know we can actually do this also. Yeah, it is done and this I'm literally creating the file from the load, and I'm playing back the payload file. Here you can see it is following the same order of opening a door and then being the signal and then opening the other door in a few seconds it will do that. And also here the conditions like, you know, the files which we have created, we should also be having all the packets we wanted that is also a condition. So if it doesn't have because of the time frame used 30 seconds and 10 seconds if it doesn't actually was able to filter it out, then you won't be able to put up but yeah it got here it's very late. So, yeah, that is this thing like there you can also export here also you can just send an export command it will save it to your own thing. So really, I'll just put that once it is done it just gives an export time. So whenever you collect back your device, you can actually see that is also the rate of CHV like the same format all the commands logs we have used in the payloads we created and the filters is everything the same. So this is the demo of the channel as ID Robert please cut it here I will stop sharing my screen and once again my slides. So I hope you love demonstration tool demo and all I did make a lot of blunders in passing the commands and all I hope you can forgive me for that and yeah that is about ID I believe we the team channel is believe you love this and all. And also, since we are saying these things and a lot of stuff which needs improvement at one of the things is the terminal UI, we are planning to improve the US or it makes more user friendly both in ID and smart scan way. And also I know how powerful we know how powerful is and we will are looking ways to implement or like gets happy also in the ID so that it helps you doing a lot of advanced stuff also. So first I'm not sure right now because I want to master it first and then I want to put in this tool. Otherwise it just ends up like any other tool which is available. I want to solve something there. Yeah, so that is my future plans. And like we are discussing this tool is completely open source and made for community people who want to get started with hacking or who wants to make the process more enjoyable and easy. So if you have any idea, please don't forget to contribute to the tool. It's just in the GitHub. It's just a pull request away. So please do try it your thinking stuff and all. And finally, I would like to thank my mentor and my company Prashant KV and my company by two for supporting me in this, and also I would like to thank Rahul in this moment for being with me in all this days, and actually running through all my bad cold fifth runs, by the way, and all those things. And also thanks to whole guy King Willis team who pulled it out. We know how much it is hard to run a conference and interesting. And thanks to DevCon USA. Thank you all. Thank you for listening to our talk and supporting us. Thank you.