The 3-line C# riddle that everyone is getting WRONG

  Рет қаралды 37,721

Amichai Mantinband

Amichai Mantinband

2 жыл бұрын

Become a Patron: / amantinband
Subscribe: / amichaimantinband
Follow me on 'em socials:
Twitter: / amantinband
LinkedIn: / amantinband
GitHub: github.com/amantinband
#csharp #dotnet #amantinband

Пікірлер: 122
@amantinband
@amantinband 2 жыл бұрын
❤documentation? Deferred execution: docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/classification-of-standard-query-operators-by-manner-of-execution#deferred Task based asynchronous programming: docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming
@danielkiesel4440
@danielkiesel4440 2 жыл бұрын
Really enjoyed the riddle and the explanation! Small correction, though, to avoid another bug. Enumerable.Range does not take a start and an end index but instead a start index and a count. So only if the start index is 0, this happens to be to be the end index + 1.
@amantinband
@amantinband 2 жыл бұрын
Whoops, you're right, I misremembered 😅 Thanks for correcting me!
@xlerb2286
@xlerb2286 Жыл бұрын
That's a well done explanation and will help a lot of folk. Thank you for taking the time to put this together. Threading and all the weird race conditions, etc., that come along with it was my life for 5+ years up until a year ago. I diagnosed so many bugs in other dev's code caused by misunderstandings of a similar nature to the one in this riddle that it was disturbing - and these weren't inexperienced devs. Thankfully for the work I had to do async wasn't of much use but I sure did learn, sometimes painfully, the ins and outs of using Task ;) But that's all somebody else's problem now. 🙂
@mohammedelsuissey1745
@mohammedelsuissey1745 2 жыл бұрын
Great video, never knew that enum.count() would re enumerate the enumerable if it was already enumerated in the previous line!!!
@Spartan322
@Spartan322 Жыл бұрын
IEnumerables don't preserve their iterations, they merely represent something that can be iterated through, what they usually save is the instructions to manage the iterations, but never the contents, you will see the same thing with a lot of IEnumerable behavior if you don't make it an Array or List, to ensure enumerables preserve their data you need to use an array or List, otherwise there's not a single call you make to it that won't be more likely to iterate the enumerable.
@gui.ferreira
@gui.ferreira 2 жыл бұрын
Excellent video! I hope to see you dissecting more of those challenges 👏
@wolfgangdiemer2511
@wolfgangdiemer2511 2 жыл бұрын
I love such riddles. And to get a video solution, was much more, than i excepted.👍 Its good to train or refresh such stuff, cause with all that syntactic sugar, its still important to know, what's under the hood. More riddles, do it, just do it. DO IT🤙
@petewarner1077
@petewarner1077 Жыл бұрын
For the 2nd riddle, because the enumerable this time is an array of tasks, the Count() function is smart enough to use the fixed size of the array instead of re-iterating an enumerable with side effects. The code becomes deterministic. The array contains 2 completed tasks, and the output is "**2 Tasks completed!"
@parlor3115
@parlor3115 Жыл бұрын
Do you mean in this video or other videos because the enumerable is always an array of tasks in this one
@petewarner1077
@petewarner1077 Жыл бұрын
@@parlor3115 In this video, in the first part, the tasks are created by the IEnumerable returned by Enumerable.Range(...) (looking at the source, something called a RangeIterator). In the second part, the tasks are created when an array is initialised.
@parlor3115
@parlor3115 Жыл бұрын
@@petewarner1077 I don't understand. Between the two parts, he only changed the Select callback to include a delay. I'm I missing something?
@parlor3115
@parlor3115 Жыл бұрын
Ah, I missed the last part. My bad
@def1nt
@def1nt Жыл бұрын
I think, that in second example the actual object that is being assigned to IEnumerable is Array which has its own implementation of Count(), that is not being re-enumerated second time.
@diego_samano
@diego_samano 2 жыл бұрын
This is a cool dynamic. I understand the answer for using the array instead gives "**2 stars!". This is happening because the Count() method has a couple of validations to try to avoid to enumerate the enumerable. So it's checking if the source has a property that has the quantity of elements and return it. Array is an ICollection so it has a Count property.
@gregorymorse8423
@gregorymorse8423 Жыл бұрын
Count on an underlying container does not enumerate. Nothing is being validated but your comment is being invalidated
@JoshYxVdM
@JoshYxVdM Жыл бұрын
​@@gregorymorse8423 you fucking killed him dude
@andreinitescu8388
@andreinitescu8388 Жыл бұрын
Awesome! ♥♥♥Love the riddles, please add more!
@NevenMilakara
@NevenMilakara Жыл бұрын
Mind blowing! The best spent 11 minutes! :) Such a great example! :)
@harag9
@harag9 Жыл бұрын
Great riddle, please show more, though I did know the answer to this one. :) Just noticed this is a new channel, so good luck on the channel and hope it all goes well. I've Just subbed.
@amantinband
@amantinband Жыл бұрын
Thanks, Harag 🫶
@israelochoab3113
@israelochoab3113 Жыл бұрын
Great explanation, I would like to know whats is the tool that you use to underline and draw the arrows?
@user-mz4dr5hl1r
@user-mz4dr5hl1r 2 жыл бұрын
I love your voice. It's awesome. Thanks for videos
@codewkarim
@codewkarim 2 жыл бұрын
Thanks! More and more and more please!
@railkungaming
@railkungaming Жыл бұрын
If the program stop before the end of the task (in the second exemple). is the thread in the thread pool deamon ? Or its a specific mechanic (I am newcomer)
@vekzdran
@vekzdran Жыл бұрын
This was very fun! Thanks!!
@davearkley7014
@davearkley7014 2 жыл бұрын
Love it, really well explained
@KrisLyubenov
@KrisLyubenov Жыл бұрын
Very nice riddle! Subscribing for more!
@AbrahamWilson
@AbrahamWilson Жыл бұрын
Hey Amichai, thanks for the amazing content, if possible can you make a series on multithreading in C#
@DFPercush
@DFPercush Жыл бұрын
If you used a concrete type like a List and then queried .Count, it wouldn't need to enumerate the collection again, right?
@Noceo
@Noceo Жыл бұрын
Great video, even though it hurts that I got it wrong in the original poll :-|. Off-topic: What extension are you using for Intellisense? You seem to have more options that I do...
@liordagan5098
@liordagan5098 Жыл бұрын
He’s using the GitHub copilot 😁 I think he talks about it in his vscode for c# video
@RafaelMarote
@RafaelMarote 2 жыл бұрын
Great video once again. Can I ask which plugin you're using for your terminal to look like that?
@amantinband
@amantinband 2 жыл бұрын
It's oh my posh. I followed Scott's step by step: kzbin.info/www/bejne/jIWVfWSJjaukb7c
@stevekeith9507
@stevekeith9507 Жыл бұрын
Interesting riddle! But when tried with dotnet 7.0.101 version in VSCode i get 4 starts consecutively, is it becuase the c# 11 !?
@ITR
@ITR Жыл бұрын
Haven't watched the video yet (paused at 0:11), but I'm going to guess: 1: it's not going to run syncronously because the select statement isn't evaluated before WhenAll is executed, but also because Console.Write isn't asyncronous. 2: tasks.Count() uses the linq count, which just enumerates the enumerable to count it, which will return 0 because it's already been evaluated. Not sure if I'm mixing up IEnumerable and IEnumerator here. EDIT: Oh, task is threaded, not asynchronous, got them mixed up. Then there's gonna be a race condition yea. Also guess I _did_ mix up IEnumerable and IEnumerator.
@avidrucker
@avidrucker Жыл бұрын
Props to you for guessing and sharing your learning with us! I'm inspired by you - I hope I can do the same soon! 😊
@j.c6427
@j.c6427 11 ай бұрын
Hi, what is the vsc plugin you used in the video please?
@mahmudx
@mahmudx Жыл бұрын
Which app are you using to draw on the screen?
@danilodjokic5303
@danilodjokic5303 Жыл бұрын
At 7:06 you say that we continue not necessarily on the main thread, this is a bit confusing to me as the execution should sync back to the calling thread upon await, and we can avoid this behavior with an explicit ConfigureAwait(false) statement. Right ?
@Xorgye
@Xorgye Жыл бұрын
What is it that you are looking for? Task pool has its own threads by default. There is no configure await here so the code runs on another thread. The Task.WhenAll is synced on return by the await but the tasks.Count() is not because there is no await. What I think he wanted to say that in general (not this code example), technically if you await something you just continue with the same thread into that code until you come by some 'real' async code. But that doesn't seem to be the case here.
@Naresh51k
@Naresh51k 5 ай бұрын
I am using Visual Studio and running it in windows machine. The output at 8:57 when executed after using delay and asynchronous await, still my output is ***2 stars!*** and not **2 stars!. I am confused. Is it different in different OS. I see yours is Mac OS
@wvanlosser
@wvanlosser 2 жыл бұрын
Thanks for the explanation! 😃
@gregorymorse8423
@gregorymorse8423 Жыл бұрын
The answer is "**" followed by any possible interleaving of characters of "**" and "2 stars!" To be precise...
@ImnotgoingSideways
@ImnotgoingSideways Жыл бұрын
Threadpool. Deadpool's cousin who is not only aware that he's in a comic, but also that it's an online comic and knows how to screw with his universe using http requests.
@oleglang5750
@oleglang5750 2 жыл бұрын
I meant to ask you, what tool are you using in your videos to auto complete the code? Thank you!
@amantinband
@amantinband 2 жыл бұрын
GitHub Co-Pilot 🙂
@oleglang5750
@oleglang5750 Жыл бұрын
Are you using it at work or just for training to speed thing up? Great videos, I’m a fan! Thank you!!!
@andreinitescu8388
@andreinitescu8388 Жыл бұрын
Isn't it technically possible that, even if you added the Task.Delay(10), you could still see the stars displayed? Isn't possible that the two managed pool threads to be scheduled and run before the main thread finished?
@nayanchoudhary4353
@nayanchoudhary4353 Жыл бұрын
Your main thread exits before the tasks complete, the app terminates and your code cannot write to console.
@andreinitescu8388
@andreinitescu8388 Жыл бұрын
@@nayanchoudhary4353 Let me try to explain again, maybe I wasn't clear. Can't it happen that the main thread runs slower than the managed pool threads? In .NET in terms of priority, foreground and background thread have the same priority.
@nayanchoudhary4353
@nayanchoudhary4353 Жыл бұрын
@@andreinitescu8388 It's unlikely with this code. But if you have the main thread running slower than others somehow, then yes.
@Victor_Marius
@Victor_Marius Жыл бұрын
@@andreinitescu8388 yes, if you add Thread.Sleep(1000000) at the end of main or ... if main is still running after 10 seconds or so...
@kyleMcBurnett
@kyleMcBurnett Жыл бұрын
What software do you use to make these videos?
@rahimliparviz
@rahimliparviz 2 жыл бұрын
Hi, I did not get it why program did not wait await Task.Delay(10) to finish although it waited for await Task.WhenAll(tasks) to complete. Could anyone please explain it to me?
@amantinband
@amantinband 2 жыл бұрын
It's because the two tasks invoked by the Count method aren't being awaited
@rahimliparviz
@rahimliparviz 2 жыл бұрын
@@amantinband thank you so much
@LoZioIAR
@LoZioIAR 2 жыл бұрын
Good to know! Thanks!
@MilanJovanovicTech
@MilanJovanovicTech 2 жыл бұрын
I love this format!
@LouisWaweru
@LouisWaweru 2 жыл бұрын
Me too, the exercise had me spending a lot of time in the debugger (getting more confused), which helps with long term learning.
@amantinband
@amantinband 2 жыл бұрын
It was definitely funner to make!
@codex4046
@codex4046 Жыл бұрын
I knew about the whole principle but I'm so used to Rider warning me for multiple enumerations that I didn't even think of it as a possible issue.
@tomekmbb
@tomekmbb 2 жыл бұрын
I will make this my interview question for "senior" role :P
@tomthunderforest1681
@tomthunderforest1681 Жыл бұрын
Thank you for this video :)
@caueribeiro3969
@caueribeiro3969 Жыл бұрын
Man, what a great video!
@shanerogers-nz
@shanerogers-nz Жыл бұрын
Keep up the good work
@natepepin09
@natepepin09 Жыл бұрын
I knew about that aspect of enumerable but I didn't think of that in this example so I got it wrong.
@shahrukhkhan3967
@shahrukhkhan3967 Жыл бұрын
Love it & learn it.🤩
@Max_Jacoby
@Max_Jacoby Жыл бұрын
Once I made a property initialization like this Prop => new Something(); instead of Prop { get; } = new Something(); and stuck in debugging of my program for two days 😅 The lesson is don't use fancy lambdas when you create objects unless you want to confuse anyone who reads your code.
@briankarcher8338
@briankarcher8338 Жыл бұрын
Beware Count() - there be dragons! I highly recommend people actually look at the code inside of the Count() function. It is extremely important. Only way you will fully understand this extremely important and easy-to-misuse function.
@aleksandrkudiyarov2247
@aleksandrkudiyarov2247 Жыл бұрын
Since the Select() in this case is an IIListProvider, I believed that the enumeration would happen only once :(
@TwistedPersona
@TwistedPersona Жыл бұрын
Select doesn't actually enumerate. This has kicked me in the butt before too. Now if he had added .ToArray() to the end, it would have.
@iammahie
@iammahie 2 жыл бұрын
Great video 👍, can you do a video on exception handling of enumrable of tasks??
@amantinband
@amantinband 2 жыл бұрын
That's an excellent topic for a riddle or short video 👍🏼
@codahighland
@codahighland Жыл бұрын
I don't use C# a lot so I didn't know about the second enumeration, and I've never used C# tasks before. But the fact that you had results with four stars in the poll options gave away the punch line -- I know threadpools so I knew there was a race condition there.
@alexwexov4298
@alexwexov4298 2 жыл бұрын
Great !
@fasons2
@fasons2 2 жыл бұрын
This is really cool stuff
@sprytnychomik
@sprytnychomik Жыл бұрын
Now I love my SEGFAULTS even more.
@tobiassjoholm9325
@tobiassjoholm9325 19 күн бұрын
Fun!
@DerClaudius
@DerClaudius Жыл бұрын
That more than 5$ bit at the end was weird, mate
@amantinband
@amantinband Жыл бұрын
😂
@OldWiseLlama
@OldWiseLlama Жыл бұрын
To nitpick, once you call Task.Run it doesn't start running the task immediately. The task is being enqueued to the task scheduler to be executed. Let's say your application is suffering from thread pool starvation. Then the tasks might wait a while before they get started.
@IElial
@IElial Жыл бұрын
I'm troubled because it clearly (at least to my mind) expose a non desirable side-effect of Count() here. I mean, the purpose of Count() method should literally restricted only to count the number of an IEnumarable collection, nothing else. So shouldn't the Count method be guarded in some way to avoid any interaction with whatever is inside the collection it count its items ?
@EverRusting
@EverRusting Жыл бұрын
Your enumerable isn't supposed to have side effects, it's not Count's job to prevent you from messing up your enumerable
@urbanelemental3308
@urbanelemental3308 Жыл бұрын
Before I watch the video, it's "**2 stars!**", but depending on the state of task scheduler it could end up being "****2 stars!"
@lawrencejob
@lawrencejob Жыл бұрын
I thought this! I never imagined it would be ***2 stars!* though!! I assumed that the scheduler delay would be an order of magnitude slower than executing line 6 so I’m surprised it prints between the two stars!
@acidhauss7018
@acidhauss7018 Жыл бұрын
My guess: Durrr i dunno boss press f5 and see
@lawrencejob
@lawrencejob Жыл бұрын
It’s lucky console is thread safe, otherwise you’d have gotten much weirder results
@PhanTomCow666
@PhanTomCow666 2 жыл бұрын
I think it will be "**2 stars!". In this case Count() will not perform second enumeration :). Great video by the way.
@Maxim.Shiryaev
@Maxim.Shiryaev 2 жыл бұрын
Agree. An array wouldn't enumerate twice. And there is even new TryGetNonEnumeratedCount in NET 6.0
@Esgarpen
@Esgarpen Жыл бұрын
*When you get the right answer by some completely wrong logic you had* Right........... makes sense...
@petherpettersson6152
@petherpettersson6152 2 жыл бұрын
One random question, you are miss-typing the letter j several times in some videos, why is that? It's not close to semi-colon and such, what's your hand position?
@amantinband
@amantinband 2 жыл бұрын
Curios if any vim users would know to answer this for me. I have a vim mapping from "jj" to "ESC". It's for quickly switching from vim "insert mode" to vim "normal mode"
@KazimierzLuska
@KazimierzLuska Жыл бұрын
The question shouldn't be what the answer is, the question should be who wrote this code and why isn't he fired yet :D That said I didn't know that enumerating an enumerable would invokes the task.run, so thanks for the explanation.
@zhh174
@zhh174 2 жыл бұрын
My understanding from this video: linq is lazy loaded so try avoiding initializing logic in linq. If you you are doing initializing logic inside linq queries try doing ToArray,ToList,Count immediate after. If you don't you may end up executing same code more than once.
@thethreeheadedmonkey
@thethreeheadedmonkey 2 жыл бұрын
Just know how basic stuff works and you'll be fine using Linq...
@thethreeheadedmonkey
@thethreeheadedmonkey 2 жыл бұрын
I'll clarify a little: IEnumerable is not really intended for this kind of usage. IAsyncEnumerable is. There's a really good library called System.Linq.Async that helps resolve this kind of challenge while keeping a nice linq-y syntax. There have been a few really good articles about it if you look around! I think there's a two or three part series by a famous C# guy floating about explaining how to use it, how to use it with parallelism, etc.
@Shad0wB0X3r
@Shad0wB0X3r Жыл бұрын
@@thethreeheadedmonkey Nick Chapas?
@Shad0wB0X3r
@Shad0wB0X3r Жыл бұрын
@@thethreeheadedmonkey as far as I remember, IEnumerable is just used for iterating a Collection or making and object iteratable ...right ? :)
@thethreeheadedmonkey
@thethreeheadedmonkey Жыл бұрын
​@@Shad0wB0X3r IEnumerable (or iterable) is one of the simplest forms of "pull" based data flow. When you add asynchronous behaviour to them without taking some things into account, you get weird behaviour like this video showed. That's why we also have IAsyncEnumerable, which is intended to be used to make it easier to reason about asynchronous "pulls". On the other end we have "push" based data flow. That is less commonly understood (Observables and their friends). I recommend looking into reactive programming (at least to learn the basics so you have some idea of what's possible and smart to use when). The guy who wrote the articles about IAsyncEnumerable is Mark Heath. He's perhaps most well known for doing Pluralsight courses. You can find the articles about "Async Enumerable"s on his blog.
@painnmisery2582
@painnmisery2582 Жыл бұрын
:/ i was thinking ***3. used to 0 being the first index.
@mackie1001
@mackie1001 Жыл бұрын
Fun but hopefully no one is using functions with side effects inside linq, that’s just a recipe for disaster.
@justengineering1008
@justengineering1008 Жыл бұрын
last riddle: without await would be more interesting))
@yv989c
@yv989c Жыл бұрын
Years of shooting myself in the foot have paid off 😅
@mrsoomo
@mrsoomo Жыл бұрын
Wow it's black magic
@portlyoldman
@portlyoldman Жыл бұрын
Guess this is why you write unit tests….
@ugochukwuumerie6378
@ugochukwuumerie6378 2 жыл бұрын
**2
@codewkarim
@codewkarim 2 жыл бұрын
Yes because it know the count of the array, not like an IEnumerable :) I believe that's the right answer.
@asteinerd
@asteinerd Жыл бұрын
Sorry, but this is nonsense code. You should never write an open-ended linq query. ".Select" should always be finalized with ToArray(), ToList(), ToListAsync(), etc. Without doing this you're not evaluating any expression visitors up the pipe, if you're using something like EF Core and you're leaving the execution path open-ended and prone to issues down the road. The moment you evaluate, it will throw itself in memory on the runtime and the console will consistently write "**2 stars!". Also, no one should be writing tasks like this. Task.Parallel was literally designed to handle this.
@kenny-kvibe
@kenny-kvibe Жыл бұрын
this is basically the multithreaded "race condition" problem
@KevinInPhoenix
@KevinInPhoenix Жыл бұрын
What kind of mad language runs the functions when you count them? It's no wonder you created this video to describe the nonintuitive behavior of C#. I can live with the odd parameters for Range being start and count, instead of start and end, but the fact that task.Count() runs the tasks and returns the count is totally nonintuitive.
@victorlevandovskiy2798
@victorlevandovskiy2798 Жыл бұрын
Good example if person has no idea how iterator works on IEnumerable :)
@arthank1263
@arthank1263 Жыл бұрын
Yeah so, let me say this right now: count should not re-run this. I don't know who implemented count on enumerables in cs, but they need to be sent to the corner
@EverRusting
@EverRusting Жыл бұрын
Count can't count a plain enumerable without enumerating, it's literally impossible. If you find it strange then you don't know what an enumerable is.
@arthank1263
@arthank1263 Жыл бұрын
@@EverRusting it's dumb cause sure, it's lazy and it needs to go through to even know the element is there, but that's precisely what I don't like. Either don't have count, or have a way to count tasks without running them for the love of god. Imagine your os having to run tasks in a queue before being able to tell you how many there are. That'd be ridiculous.
@RahulSingh-il1xk
@RahulSingh-il1xk Жыл бұрын
Great video. Just to be sure, if we add "ToList()" at end of tasks, we should get constant answer: "**2 stars!". Correct?
@kevinof1978
@kevinof1978 Жыл бұрын
@Rahul Singh, that is correct -- calling .ToList() will evaluate the enumerable and construct the Task instances before they are awaited. Awaiting the same task more than once will still only run the task once. The reason they seem to run multiple times here is that the enumerable constructs new task instances every time it is evaluated.
@jakotheshadows87
@jakotheshadows87 Жыл бұрын
Do people often strictly need to use the IEnumerable interface that IEnumerable.Select returns? If not, why not convert it into something with more easily predictable behavior with something like .ToList() or .ToArray() as a simple matter of habit? I've pretty much never found myself thinking, "gee I sure wish this method returned an IEnumerable", I almost always want something a bit more specific.
@nanvlad
@nanvlad Жыл бұрын
Because Linq is designed to query external sources, such as Db or xml. By doing ToList() or ToArray() you get all stuff in memory and then apply all functions in a runtime. It may cost significant performance and latency issues. Moreover, Linq allows us to invoke logic on a source side, e.g. Linq2Sql just translates query to SQL and runs on a db server. That's why it's not recommended to use ToList()/ToArray() every time you need data
@pirati02
@pirati02 Жыл бұрын
Easy, ****2 stars! Task.WhenAll() enumeration tasks.Count() another enumeration.
@eadwacer524
@eadwacer524 Жыл бұрын
Literally just run it, if you see this you must have a computer.
Throw, the only .NET guard clause library you need
17:22
Amichai Mantinband
Рет қаралды 13 М.
Exceptions are evil. This is what I do instead.
24:41
Amichai Mantinband
Рет қаралды 19 М.
What it feels like cleaning up after a toddler.
00:40
Daniel LaBelle
Рет қаралды 92 МЛН
Amazing weight loss transformation !! 😱😱
00:24
Tibo InShape
Рет қаралды 67 МЛН
The weirdest way to loop in C# is also the fastest
12:55
Nick Chapsas
Рет қаралды 249 М.
Stop, Intel’s Already Dead!
13:47
Linus Tech Tips
Рет қаралды 663 М.
5 C# Naming Conventions I Wish Everyone Followed
12:46
Amichai Mantinband
Рет қаралды 16 М.
C# Async Await Mistakes | Part 1
10:19
Amichai Mantinband
Рет қаралды 32 М.
IAsyncEnumerable, My Favorite C# 8 Feature That No One Is Using
11:02
Amichai Mantinband
Рет қаралды 24 М.
Settling the Biggest Await Async Debate in .NET
14:47
Nick Chapsas
Рет қаралды 142 М.
Stop Calling Your API a "REST API"
17:42
Amichai Mantinband
Рет қаралды 16 М.
Object-Oriented Programming is Embarrassing: 4 Short Examples
28:03
What is Span in C# and why you should be using it
15:15
Nick Chapsas
Рет қаралды 251 М.
Klavye İle Trafik Işığını Yönetmek #shorts
0:18
Osman Kabadayı
Рет қаралды 9 МЛН
Rate This Smartphone Cooler Set-up ⭐
0:10
Shakeuptech
Рет қаралды 7 МЛН
$1 vs $100,000 Slow Motion Camera!
0:44
Hafu Go
Рет қаралды 29 МЛН
iPhone 15 Pro в реальной жизни
24:07
HUDAKOV
Рет қаралды 503 М.
Better Than Smart Phones☠️🤯 | #trollface
0:11
Not Sanu Moments
Рет қаралды 19 МЛН
КРУТОЙ ТЕЛЕФОН
0:16
KINO KAIF
Рет қаралды 7 МЛН