wwall: Instead of 23...a6, if 23...Nxd5, then 24.Rxd5! (weaker is 24.Nxd5 Qc6 [better than 24...Rxd5 25.Rxd5 Rxd5 26.Qh8+] 24...Rxd5 25.Nxd5 Qd6 26.Rd1 wins. 24...h5 does nothing. Perhaps better is 24...Nc8 25.Nc4 f6.
Instead of 25...Qd6, which loses a tempo after it moves again, perhaps best in 25...Qf6, then 26...h4.
Instead of 26...h4, perhaps 26...Nc8 27.Nc4 Qe7.
after 27.Nc4, if 27...Qg6, then 28.Ne5. If 27...Qh6, then d6.
After 29.Rd3 (threatening 30.Rc3), 29...Rb6?? is the losing move. Perhaps best is 29...hxg3 30.hxg3 Nc8 31.Nc4 R6d7 and Black should be OK.
30.d6! is strong, threatening 31.dxc7+ and 31.dxe7. If 30...cxd6, then 31.Qxb6 wins the rook. If 30...Rbxd6, then 31.Rxd6 Rxd6 32.Nd7+ Rxd7 33.Rxd7 wins for White.
After 33.Rxd7, White threatens 34.Qxc7+ and 35.Qxb7#.
After 34. Qe5 (34.Qc3 was also good) with the threat of 35.Qxc7+, White wins after 34...Qxe5 35.fxe5 Ng6 36.Rxf7 hxg3 37.hxg3 Nxe5 38.Rxf5 Ng4 39.Rf8+ and 40.Rf4 and 41.g4.