The San Francisco 49ers have been consistent in giving fans entertainment as well as gray hairs. The Niners overcame a 16-point deficit to defeat their divisional foe Arizona Cardinals. Let’s get into the winners and losers from Sunday’s game.

Deebo Samuel

Anquan Samuel is a tank when the ball is in his hands. Defenders bounce off the rookie. You don’t see that with a first-year player. Samuel has always proven to be difficult to tackle. His route running was the area for improvement. From Week 1 through Sunday’s game against Arizona, we see rapid development. Samuel is now setting up defenders and getting open with technique, not athleticism.

Eight receptions on ten targets when the offense was missing their two top receiving threats. Deebo is the first rookie wide receiver in franchise history with back-to-back 100 yard games. Samuel is trending in the direction of a star.

Ross Dwelley

Dwelley scored twice, but he should have scored another time had it not been for a phantom holding penalty on Weston Richburg. Yes, I’m still upset at that call. Dwelley had four catches for 14 yards, and only had a long of five. Touchdowns matter. Dwelley is the first tight end to catch two touchdowns for the 49ers in a game since Celek time did it in 2015.

Emmanuel Moseley

I thought Moseley played excellent. Ahkello Witherspoon was active, but he didn’t start. Moseley gave up an early reception that was a big gain but clamped down after that. What was most impressive were the tackles he made around the line of scrimmage. Arizona throws a lot of screens to put the cornerback 1-on-1, and Moseley aggressively flew up and made the tackle. It’s the little things like those plays that make this pass defense special.

Jimmy Garoppolo

Garoppolo’s two red-zone turnovers were unacceptable. On the first interception, Jimmy G threw it right to the Cardinals linebacker. If you didn’t know any better, the defender was the intended target. It’s 3rd and five, with the score 17-16. Everything is magnified in the red zone, and taking points off the board are the worst-case scenario. Without looking back, it feels like the majority of Garoppolo’s come where he doesn’t recognize a defender. That’s what frustrates fans. The same mistakes are happening.

I saw a few people blame Dwelley on the second interception, which, come on. The ball was thrown high and away, and it’s natural to reach out and try to get a hand on it. The ball was deflected, and the Cardinals returned the interception 48 yards. Not only did that take points off the board, but it put Arizona in a position to score. A double negative for the 49ers.

Running game

Perhaps the one area we’ve overlooked George Kittle’s absence the most. It’s not fair to put all the rushing issues on one player, but when Kittle has been out, the 49ers haven’t been able to run the ball. When he’s in, there haven’t been issues. On Sunday, the Niners ran it 19 times for 34 yards. Luckily, there were short throws that were extensions of the running game. That still doesn’t excuse 1.8 yards per carry from a Kyle Shanahan attack. I don’t know if this is one person’s fault, so let’s spread it to everyone.

Goodwin/Pettis

That may be all she wrote for these two. Goodwin was only targeted twice, both on the final drive. He dropped one, and that’s how Pettis got on the field for a couple of snaps. When you are relying on a fullback and second-string tight end to generate offense over two guys, you were counting on coming into the season, which tells you all you need to know.

Nick Bosa

I’m already aware that this won’t be popular. Bosa finished the game with three tackles, one for a loss and one quarterback hit. The loss came where he was flying in from the other side of the formation, but Elijah Lee turned the play back inside. Bosa was there to clean it up. For the third game in a row, Bosa didn’t have a sack. That’s not why he’s here, though.

These last three weeks, against mobile quarterbacks, Bosa has played with blinders on. There have been a few plays where he’s either running out of his rushing lane or not “feathering,” which means slow-playing the zone read when he’s been unblocked against the edge. Next week Bosa should be able to get back to doing what he does best and not having to worry about accounting for the quarterback to run.

Kyle Juszczyk

Juice registered a career-high seven receptions for 63 yards. Juszczyk drew a dubious pass interference call that kept the 49ers’ drive alive. Though it was a bad call, he did a great job of attempting the pass, which forced the referee’s hands. If Juice doesn’t try to catch the ball, that flag doesn’t get thrown. With the running game struggling, Juszczyk came threw underneath on short throws for the offense.

Jimmy G

Garoppolo threw the ball 45 times and completed 75% of his passes. He tied a career-high for touchdown passes with four, and he also had a game-winning drive. Only three other times in franchise history has a quarterback thrown for 400 yards and four touchdowns in a game. Of Garoppolo’s 34 completions, 20 of them went for first downs. The 49ers were also 6-13 on third down, and a lot of that had to do with Garoppolo’s playmaking ability. Are those boneheaded interceptions frustrating? They are. There are far too many good plays throughout the game where Garoppolo has to scramble, buy time, and hit a wideout down the field for a first down.

Garoppolo is such a good quarterback when he’s facing pressure, and his final toss to Jeff Wilson is a prime example of that. The safety comes as a free rusher, and instead of panicking and throwing the ball too soon, Garoppolo waits until the last minute and lofts it over the defender for the go-ahead touchdown.