cache. So this using the tools of downloading. So we didn't cache, cache it with Bazel downloader, and so we're examining the lock files to do both mkm and yarn would list all the packages in a lock file, but there was implementation details in both packet managers which would determine how you get laid out. So depending on the version of yarn, you may get it for node modules. I've even seen incrementally where yarn would produce different results which were but so long tail doesn't packet managers, essentially, you couldn't go from lock file to say, download this factor. This factor is this factor separately and vitamin node modules, because you would in order to put them there, was hoisting right so sometimes we can hostess without other ones would get nested. And the exact layout of that was buried in the implementation of the stacked vendors basically makes it possible, from visual perspective, to separate that action at the small action. Is and then PMPM came around. And then lockfile is beautifully rich. You have the transitive closure of all packages, and it lists their defenses. So cool. Now I know which ones on what in lockfile. And then the synlink node module is true, which I guess I'll show that, because that's pretty interesting, and that's that's key as well, why we can't use reserve sim links, but it doesn't get links faster. So the node module stream, the way it's laid out in PMPM is something called the virtual store, which, yes, we just call this the package store. And PMPM is called the virtual store, because these are actually hard links. Each file in PMPM is in a content addressable store and has hardly any of that. So they call it a virtual store. But essentially, under pnpm, you have all packages of transit closures, so they might be multiple births of the bar at that level, and then under that just a node modules folder is the actual bar, and that's where bars paths are. And then next to bar and its modules, it gets its own, you have symlinks back to the bottom of the original store to all its all its direct dependencies. And then that's how it's constructed. And so with rules js, we just, let's just redo that in the output tree, which is why we need Bazel six for the undeclared symlinks, because, well, we need similar support in remote execution. First of all, which faded, added just in time for basal six, which is awesome. And then undeclared symlinks meant that we could declare unresolved panchayats, unresolved symblings meant that we could declare those same lengths without even having that face that it's pointing to as an input to that send me function, you just make the same length and it's relative, and basically just kind of said that you have to put it there when you're you're running your thing. So that's, that's the long answer my question,