@wildshard/shard-format 0.0.1 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
- package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
- package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
- package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
- package/corpus/brasscap-mesa/cook.json +1 -0
- package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
- package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
- package/corpus/brasscap-mesa/sections/look/look.json +1 -0
- package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
- package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
- package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
- package/corpus/brasscap-mesa/sections/state/state.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
- package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
- package/corpus/brasscap-mesa/sections/world/days.json +1 -0
- package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
- package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
- package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
- package/corpus/brasscap-mesa/sections/world/props.json +1 -0
- package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
- package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
- package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
- package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
- package/corpus/brasscap-mesa/sections/world/water.json +1 -0
- package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
- package/corpus/brasscap-mesa/shard.json +1 -0
- package/corpus/brasscap-mesa/validation.json +1 -0
- package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
- package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
- package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
- package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
- package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
- package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
- package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
- package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
- package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
- package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
- package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
- package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
- package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
- package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
- package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
- package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
- package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
- package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
- package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
- package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
- package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
- package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
- package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
- package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
- package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
- package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
- package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
- package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
- package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
- package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
- package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
- package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
- package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
- package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
- package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
- package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
- package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
- package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
- package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
- package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
- package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
- package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
- package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
- package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
- package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
- package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
- package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
- package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
- package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
- package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
- package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
- package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
- package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
- package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
- package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
- package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
- package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
- package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
- package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
- package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
- package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
- package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
- package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
- package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
- package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
- package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
- package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
- package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
- package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
- package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
- package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
- package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
- package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
- package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
- package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
- package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
- package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
- package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
- package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
- package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
- package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
- package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
- package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
- package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
- package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
- package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
- package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
- package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
- package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
- package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
- package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
- package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
- package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
- package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
- package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
- package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
- package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
- package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
- package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
- package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
- package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
- package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
- package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
- package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
- package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
- package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
- package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
- package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
- package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
- package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
- package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
- package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
- package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
- package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
- package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
- package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
- package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
- package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
- package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
- package/corpus/handwritten/cook.json +1 -0
- package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
- package/corpus/handwritten/sections/actors/creatures.json +1 -0
- package/corpus/handwritten/sections/actors/crowds.json +1 -0
- package/corpus/handwritten/sections/actors/species.json +1 -0
- package/corpus/handwritten/sections/audio/audio.json +1 -0
- package/corpus/handwritten/sections/client/plan.json +1 -0
- package/corpus/handwritten/sections/combat/encounters.json +1 -0
- package/corpus/handwritten/sections/combat/items.json +1 -0
- package/corpus/handwritten/sections/combat/strikes.json +1 -0
- package/corpus/handwritten/sections/economy/ledger.json +1 -0
- package/corpus/handwritten/sections/economy/loot.json +1 -0
- package/corpus/handwritten/sections/look/look.json +1 -0
- package/corpus/handwritten/sections/look/map.json +1 -0
- package/corpus/handwritten/sections/look/materials.json +1 -0
- package/corpus/handwritten/sections/quests/quests.json +1 -0
- package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
- package/corpus/handwritten/sections/sim/hooks.json +1 -0
- package/corpus/handwritten/sections/sim/plumbing.json +1 -0
- package/corpus/handwritten/sections/sim/sim.json +1 -0
- package/corpus/handwritten/sections/state/migrations.json +1 -0
- package/corpus/handwritten/sections/state/state.json +1 -0
- package/corpus/handwritten/sections/ui/card.json +1 -0
- package/corpus/handwritten/sections/ui/compendium.json +1 -0
- package/corpus/handwritten/sections/ui/level.json +1 -0
- package/corpus/handwritten/sections/ui/ui.json +1 -0
- package/corpus/handwritten/sections/world/collision.json +1 -0
- package/corpus/handwritten/sections/world/days.json +1 -0
- package/corpus/handwritten/sections/world/edge.json +1 -0
- package/corpus/handwritten/sections/world/movers.json +1 -0
- package/corpus/handwritten/sections/world/navigation.json +1 -0
- package/corpus/handwritten/sections/world/props.json +1 -0
- package/corpus/handwritten/sections/world/spawn.json +1 -0
- package/corpus/handwritten/sections/world/terrain.json +1 -0
- package/corpus/handwritten/sections/world/tiles.json +1 -0
- package/corpus/handwritten/sections/world/traversal.json +1 -0
- package/corpus/handwritten/sections/world/water.json +1 -0
- package/corpus/handwritten/sections/world/weather.json +1 -0
- package/corpus/handwritten/shard.json +1 -0
- package/corpus/handwritten/validation.json +1 -0
- package/package.json +504 -2
- package/packages/wire/src/net-command.ts +150 -0
- package/src/cli/bin.mjs +9 -0
- package/src/cli/main.ts +148 -0
- package/src/cli/pack.ts +262 -0
- package/src/cli/validate.ts +210 -0
- package/src/cli/version.ts +13 -0
- package/src/format/aacIndex.ts +160 -0
- package/src/format/accent.ts +35 -0
- package/src/format/achievementCounters.ts +22 -0
- package/src/format/actorMoves.ts +615 -0
- package/src/format/actorProjectionV2.ts +93 -0
- package/src/format/admissionControl.ts +66 -0
- package/src/format/admissionLate.ts +22 -0
- package/src/format/admissionLimits.ts +11 -0
- package/src/format/admissionServer.ts +30 -0
- package/src/format/ambientLife.ts +123 -0
- package/src/format/arenaRoomDocument.ts +114 -0
- package/src/format/arenaScriptRows.ts +107 -0
- package/src/format/arenaView.ts +30 -0
- package/src/format/assetAdmission.ts +279 -0
- package/src/format/audio-measure.ts +184 -0
- package/src/format/audio-mp4.ts +234 -0
- package/src/format/audio-rules.ts +271 -0
- package/src/format/audio-waiver.ts +55 -0
- package/src/format/audio.ts +463 -0
- package/src/format/audioBank.ts +37 -0
- package/src/format/audioProfiles.ts +501 -0
- package/src/format/audioRouting.ts +67 -0
- package/src/format/audioScene.ts +342 -0
- package/src/format/bakedTerrainBytes.ts +35 -0
- package/src/format/bakedTerrainSampling.ts +66 -0
- package/src/format/bakedTiles.ts +407 -0
- package/src/format/binarySource.ts +32 -0
- package/src/format/bodySlots.ts +90 -0
- package/src/format/bossEncounter.ts +354 -0
- package/src/format/bossProfiles.ts +709 -0
- package/src/format/bossSocketRig.ts +92 -0
- package/src/format/bowVariantRows.ts +68 -0
- package/src/format/brains.ts +252 -0
- package/src/format/budget.ts +214 -0
- package/src/format/buildings.ts +496 -0
- package/src/format/builtIndexes.ts +26 -0
- package/src/format/catalogueEconomy.ts +65 -0
- package/src/format/caveInterior.ts +225 -0
- package/src/format/cellBounds.ts +47 -0
- package/src/format/cellField.ts +98 -0
- package/src/format/chapterDirector.ts +193 -0
- package/src/format/clientChannels.ts +450 -0
- package/src/format/clientCues.ts +34 -0
- package/src/format/clientNative.ts +358 -0
- package/src/format/clientOwnership.ts +43 -0
- package/src/format/clientPlan.ts +306 -0
- package/src/format/clientScripts.ts +116 -0
- package/src/format/clientState.ts +273 -0
- package/src/format/clientTrails.ts +56 -0
- package/src/format/collectionDisplay.ts +232 -0
- package/src/format/colourFunction.ts +44 -0
- package/src/format/colourLut.ts +4 -0
- package/src/format/commonsCosts.ts +28 -0
- package/src/format/compendiumRows.ts +151 -0
- package/src/format/compendiumSketches.ts +23 -0
- package/src/format/completion.ts +83 -0
- package/src/format/contentBounds.ts +76 -0
- package/src/format/contentCost.ts +50 -0
- package/src/format/contracts.ts +305 -0
- package/src/format/cook-data.ts +148 -0
- package/src/format/cook-preparation.ts +241 -0
- package/src/format/coverAppearance.ts +53 -0
- package/src/format/creatures.ts +175 -0
- package/src/format/crowdPresentation.ts +87 -0
- package/src/format/crowds.ts +46 -0
- package/src/format/cueDirector.ts +134 -0
- package/src/format/dayCycle.ts +28 -0
- package/src/format/dayLook.ts +44 -0
- package/src/format/decisionBindings.ts +80 -0
- package/src/format/decisionPublication.ts +35 -0
- package/src/format/decisionScripts.ts +327 -0
- package/src/format/declaredQuestPage.ts +101 -0
- package/src/format/deviceMemoryCost.ts +50 -0
- package/src/format/director.ts +52 -0
- package/src/format/directorProduct.ts +27 -0
- package/src/format/directorStages.ts +165 -0
- package/src/format/directorWhen.ts +78 -0
- package/src/format/discoveryValues.ts +416 -0
- package/src/format/easedFields.ts +48 -0
- package/src/format/edgeProfiles.ts +40 -0
- package/src/format/eliteContinuation.ts +110 -0
- package/src/format/eliteEntryRows.ts +351 -0
- package/src/format/eliteFeature.ts +605 -0
- package/src/format/eliteScripts.ts +60 -0
- package/src/format/encounterRows.ts +1030 -0
- package/src/format/encounters.ts +65 -0
- package/src/format/engine-music.ts +42 -0
- package/src/format/entryClearance.ts +86 -0
- package/src/format/entryCoverage.ts +61 -0
- package/src/format/entryGeometry.ts +56 -0
- package/src/format/entryLanding.ts +83 -0
- package/src/format/entryReads.ts +45 -0
- package/src/format/entrywayAssets.ts +33 -0
- package/src/format/entryways.ts +58 -0
- package/src/format/exchange.ts +25 -0
- package/src/format/explorerCatalogue.ts +312 -0
- package/src/format/feature-sides.ts +233 -0
- package/src/format/fieldPresentation.ts +62 -0
- package/src/format/figures.ts +437 -0
- package/src/format/findsCatalogue.ts +67 -0
- package/src/format/fixedDraws.ts +24 -0
- package/src/format/flyers.ts +226 -0
- package/src/format/forestNativeInputs.ts +37 -0
- package/src/format/forestPage.ts +285 -0
- package/src/format/forestWeather.ts +333 -0
- package/src/format/geometryPack.ts +136 -0
- package/src/format/glbBuffers.ts +77 -0
- package/src/format/glbCost.ts +212 -0
- package/src/format/glbImages.ts +95 -0
- package/src/format/glbTriangles.ts +95 -0
- package/src/format/graphArmsRows.ts +200 -0
- package/src/format/grapple.ts +123 -0
- package/src/format/grazers.ts +164 -0
- package/src/format/grid-catalogue.ts +247 -0
- package/src/format/gridReadiness.ts +49 -0
- package/src/format/groupBrains.ts +249 -0
- package/src/format/heldArms.ts +576 -0
- package/src/format/heldEquipment.ts +78 -0
- package/src/format/heldFinishes.ts +415 -0
- package/src/format/heldGear.ts +68 -0
- package/src/format/heldJianDocument.ts +75 -0
- package/src/format/heldMelee.ts +866 -0
- package/src/format/heldView.ts +26 -0
- package/src/format/heldWeaponDocuments.ts +36 -0
- package/src/format/herdShelter.ts +58 -0
- package/src/format/hooks.ts +45 -0
- package/src/format/immutable.ts +59 -0
- package/src/format/inputDeclarations.ts +157 -0
- package/src/format/islandLibrary.ts +51 -0
- package/src/format/items.ts +229 -0
- package/src/format/json.ts +143 -0
- package/src/format/keyedSky.ts +314 -0
- package/src/format/kitFigure.ts +68 -0
- package/src/format/ktx2Cost.ts +47 -0
- package/src/format/ledger.ts +56 -0
- package/src/format/liftApproach.ts +75 -0
- package/src/format/liftRider.ts +10 -0
- package/src/format/lightEmitters.ts +105 -0
- package/src/format/lights.ts +135 -0
- package/src/format/limbCollision.ts +136 -0
- package/src/format/limbPopulation.ts +33 -0
- package/src/format/limbRig.ts +202 -0
- package/src/format/loadout.ts +156 -0
- package/src/format/look-light.ts +153 -0
- package/src/format/lootBag.ts +145 -0
- package/src/format/lootEconomy.ts +235 -0
- package/src/format/materialFamilies.ts +565 -0
- package/src/format/materialGraph.ts +1220 -0
- package/src/format/materials.ts +449 -0
- package/src/format/memoryAdmission.ts +84 -0
- package/src/format/memoryGates.json +7 -0
- package/src/format/meshCollision.ts +56 -0
- package/src/format/meshCollisionAssets.ts +19 -0
- package/src/format/meshCollisionBytes.ts +102 -0
- package/src/format/meshEntryways.ts +54 -0
- package/src/format/meshopt-decoder.wasm +0 -0
- package/src/format/meshopt-module.ts +177 -0
- package/src/format/meshopt-static.mjs +11 -0
- package/src/format/meshopt-wasm.ts +61 -0
- package/src/format/migrations.ts +209 -0
- package/src/format/minimap.ts +1052 -0
- package/src/format/mixedPopulation.ts +222 -0
- package/src/format/modes.ts +304 -0
- package/src/format/mountedSpecimenRows.ts +64 -0
- package/src/format/moverLifecycle.ts +34 -0
- package/src/format/moverMotion.ts +271 -0
- package/src/format/movers.ts +224 -0
- package/src/format/namedJsonContracts.ts +423 -0
- package/src/format/nativeActors.ts +45 -0
- package/src/format/nativeAssembly.ts +141 -0
- package/src/format/nativeGround.ts +37 -0
- package/src/format/nativeGroundAssets.ts +35 -0
- package/src/format/nativeItems.ts +184 -0
- package/src/format/nativePhysics.ts +140 -0
- package/src/format/nativeQuestComposition.ts +398 -0
- package/src/format/nativeRiding.ts +103 -0
- package/src/format/nativeRuntimePlan.ts +89 -0
- package/src/format/navigation.ts +99 -0
- package/src/format/navigationBytes.ts +111 -0
- package/src/format/nearPlaceholder.ts +111 -0
- package/src/format/nearPlaceholderAssets.ts +23 -0
- package/src/format/netCommand.ts +11 -0
- package/src/format/npcs.ts +546 -0
- package/src/format/outputAddress.ts +11 -0
- package/src/format/outputDownload.ts +34 -0
- package/src/format/outputFields.ts +123 -0
- package/src/format/outputIndex.ts +352 -0
- package/src/format/overdraw.ts +41 -0
- package/src/format/pageLife.ts +303 -0
- package/src/format/pagePreparation.ts +60 -0
- package/src/format/paintedLook.ts +55 -0
- package/src/format/paintedResources.ts +158 -0
- package/src/format/panelTemplate.ts +139 -0
- package/src/format/placeholderSource.ts +209 -0
- package/src/format/platformDataSections.ts +146 -0
- package/src/format/platformFileFamilies.ts +299 -0
- package/src/format/plumbing.ts +165 -0
- package/src/format/populationEnvironment.ts +210 -0
- package/src/format/populationKeeper.ts +163 -0
- package/src/format/populationProjection.ts +496 -0
- package/src/format/populationRespawn.ts +48 -0
- package/src/format/populationRoster.ts +158 -0
- package/src/format/portalFloor.ts +56 -0
- package/src/format/portalLink.ts +112 -0
- package/src/format/portalLinkAssets.ts +42 -0
- package/src/format/portalRide.ts +22 -0
- package/src/format/postGraphDocument.ts +36 -0
- package/src/format/postGraphLook.ts +477 -0
- package/src/format/postStack.ts +114 -0
- package/src/format/practiceCourseRows.ts +466 -0
- package/src/format/preflight.ts +155 -0
- package/src/format/presentation.ts +33 -0
- package/src/format/product-audio.ts +76 -0
- package/src/format/product-reads.ts +178 -0
- package/src/format/product-stream-admit.ts +100 -0
- package/src/format/product-stream-assets.ts +493 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +12 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +242 -0
- package/src/format/product-stream-rows.ts +202 -0
- package/src/format/product-stream-tar.ts +192 -0
- package/src/format/product-stream.ts +284 -0
- package/src/format/product.ts +358 -0
- package/src/format/productValidation.ts +205 -0
- package/src/format/propMaterials.ts +254 -0
- package/src/format/props.ts +137 -0
- package/src/format/questContinuation.ts +42 -0
- package/src/format/questFigures.ts +227 -0
- package/src/format/questGraph.ts +30 -0
- package/src/format/questHost.ts +314 -0
- package/src/format/questInteractionSource.ts +57 -0
- package/src/format/questInteractions.ts +642 -0
- package/src/format/questPageComposition.ts +92 -0
- package/src/format/questPageFacets.ts +121 -0
- package/src/format/questRuntime.ts +118 -0
- package/src/format/questSteps.ts +182 -0
- package/src/format/questStory.ts +512 -0
- package/src/format/questStoryBindings.ts +43 -0
- package/src/format/questWorld.ts +36 -0
- package/src/format/quests.ts +333 -0
- package/src/format/rainPresentation.ts +131 -0
- package/src/format/rangedPage.ts +117 -0
- package/src/format/receipt-cost.ts +71 -0
- package/src/format/registeredJson.ts +530 -0
- package/src/format/returnProgramDocument.ts +40 -0
- package/src/format/returnProjectionV2.ts +84 -0
- package/src/format/riding.ts +377 -0
- package/src/format/riggedHulls.ts +160 -0
- package/src/format/roamingBossProjection.ts +178 -0
- package/src/format/roamingCombat.ts +22 -0
- package/src/format/ropeDeckSite.ts +148 -0
- package/src/format/rows.ts +86 -0
- package/src/format/runtime.ts +38 -0
- package/src/format/runtimeBinds.ts +49 -0
- package/src/format/runtimeCost.ts +80 -0
- package/src/format/runtimeSpawns.ts +73 -0
- package/src/format/scalarChannel.ts +38 -0
- package/src/format/scaledPost.ts +27 -0
- package/src/format/scaledPostContract.ts +51 -0
- package/src/format/sceneBuffers.ts +122 -0
- package/src/format/sceneDraws.ts +89 -0
- package/src/format/sceneDressing.ts +247 -0
- package/src/format/sceneInstances.ts +192 -0
- package/src/format/sceneMotion.ts +122 -0
- package/src/format/sceneRefs.ts +71 -0
- package/src/format/sceneSources.ts +730 -0
- package/src/format/script-side-grandfather.ts +62 -0
- package/src/format/script-sides.ts +289 -0
- package/src/format/scriptAbi.ts +14 -0
- package/src/format/scriptAbiV1.ts +56 -0
- package/src/format/scriptActionsV2.ts +101 -0
- package/src/format/scriptAdmission.ts +165 -0
- package/src/format/scriptAdmissionV2.ts +126 -0
- package/src/format/scriptContract.ts +170 -0
- package/src/format/scriptFuelV2.ts +124 -0
- package/src/format/scriptGroupBankV2.ts +54 -0
- package/src/format/scriptGroupStepV2.ts +165 -0
- package/src/format/scriptInputStateV2.ts +52 -0
- package/src/format/scriptLimits.ts +5 -0
- package/src/format/scriptMemoryV2.ts +17 -0
- package/src/format/scriptModuleV2.ts +116 -0
- package/src/format/scriptObservationColumnsV2.ts +226 -0
- package/src/format/scriptQueriesV2.ts +164 -0
- package/src/format/scriptQueryStateV2.ts +40 -0
- package/src/format/scriptRngV2.ts +52 -0
- package/src/format/scriptWireV2.ts +106 -0
- package/src/format/scripts.ts +31 -0
- package/src/format/sections.ts +140 -0
- package/src/format/shardSchema.ts +632 -0
- package/src/format/shardSections.ts +383 -0
- package/src/format/sketch.ts +79 -0
- package/src/format/skin-materials.ts +172 -0
- package/src/format/skinAssets.ts +107 -0
- package/src/format/skinData.ts +110 -0
- package/src/format/skinLayers.ts +90 -0
- package/src/format/skins.ts +37 -0
- package/src/format/socketLift.ts +58 -0
- package/src/format/socketLiftAssets.ts +81 -0
- package/src/format/socketRigCreature.ts +66 -0
- package/src/format/sourceResidency.ts +16 -0
- package/src/format/spawnCombat.ts +26 -0
- package/src/format/spawnScriptV2.ts +145 -0
- package/src/format/spawnScripts.ts +229 -0
- package/src/format/spawnTables.ts +46 -0
- package/src/format/spawnView.ts +26 -0
- package/src/format/speciesActorsFile.ts +86 -0
- package/src/format/speciesBookRows.ts +84 -0
- package/src/format/speciesBrain.ts +96 -0
- package/src/format/speciesLooks.ts +1021 -0
- package/src/format/speciesPrograms.ts +97 -0
- package/src/format/speciesScripts.ts +45 -0
- package/src/format/specimenCatalogue.ts +94 -0
- package/src/format/splatTerrain.ts +192 -0
- package/src/format/standalone-catalogue.ts +144 -0
- package/src/format/standaloneControl.ts +44 -0
- package/src/format/state.ts +61 -0
- package/src/format/stateLineage.ts +71 -0
- package/src/format/stealth.ts +106 -0
- package/src/format/stillImage.ts +135 -0
- package/src/format/streamedCover.ts +105 -0
- package/src/format/surfaceLooks.ts +50 -0
- package/src/format/tar-fields.ts +54 -0
- package/src/format/tar-paths.ts +103 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +203 -0
- package/src/format/targets.ts +217 -0
- package/src/format/terrain.ts +241 -0
- package/src/format/terrainTileBytes.ts +104 -0
- package/src/format/tierSelection.ts +195 -0
- package/src/format/toonLighting.ts +32 -0
- package/src/format/toonLook.ts +332 -0
- package/src/format/trail.ts +17 -0
- package/src/format/traversal.ts +13 -0
- package/src/format/treeSetRows.ts +93 -0
- package/src/format/ui.ts +90 -0
- package/src/format/uiStrings.ts +17 -0
- package/src/format/uniformRows.ts +31 -0
- package/src/format/upload-wire.ts +184 -0
- package/src/format/validationReceipt.ts +142 -0
- package/src/format/version.ts +9 -0
- package/src/format/vertexWear.ts +45 -0
- package/src/format/viewProgram.ts +329 -0
- package/src/format/voicePatches.ts +47 -0
- package/src/format/water.ts +247 -0
- package/src/format/waterWaves.ts +7 -0
- package/src/format/waterWorld.ts +34 -0
- package/src/format/weaponProfiles.ts +1315 -0
- package/src/format/weatherBundle.ts +36 -0
- package/src/format/weatherEffects.ts +78 -0
- package/src/format/weatherProgram.ts +422 -0
- package/src/format/wildlifePopulation.ts +210 -0
- package/src/format/wireLimits.ts +9 -0
- package/src/format/worldAssembly.ts +104 -0
- package/src/format/worldEntry.ts +151 -0
- package/src/format/worldPhysics.ts +292 -0
- package/src/format/worldSceneBatch.ts +106 -0
- package/src/format/worldSceneModels.ts +79 -0
- package/src/format/worldScenePages.ts +89 -0
- package/src/format/worldScenePlacement.ts +191 -0
- package/src/format/worldSceneSlabs.ts +43 -0
- package/src/format/worldSceneSurface.ts +113 -0
- package/src/format/worldSceneWeld.ts +702 -0
- package/src/format/worldScenes.ts +184 -0
- package/src/format/worldTargets.ts +111 -0
- package/src/format/worldUpdates.ts +229 -0
- package/src/hook/format-hook.d.mts +2 -0
- package/src/hook/format-hook.mjs +47 -0
- package/README.md +0 -8
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// The streaming validator's refusal when a check asks for bytes the stream
|
|
2
|
+
// did not hold (API-CLOUDFLARE AC6a2): a host never takes a guess for the
|
|
3
|
+
// check, and the corpus and pin tests prove no check does.
|
|
4
|
+
|
|
5
|
+
class StreamMissError extends Error {
|
|
6
|
+
public constructor(message: string) {
|
|
7
|
+
super(message)
|
|
8
|
+
this.name = 'StreamMissError'
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { StreamMissError }
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// `validateShardfileStream`'s ports from `node:crypto` and `node:zlib`, which
|
|
2
|
+
// a Worker has under `nodejs_compat` (API-CLOUDFLARE AC6a). A host adapter,
|
|
3
|
+
// not the portable library: tsconfig.lib.json leaves it out.
|
|
4
|
+
|
|
5
|
+
// oxlint-disable-next-line import/no-nodejs-modules -- a Node and Workers host adapter
|
|
6
|
+
import { createHash } from 'node:crypto'
|
|
7
|
+
// oxlint-disable-next-line import/no-nodejs-modules -- a Node and Workers host adapter
|
|
8
|
+
import { Readable, pipeline } from 'node:stream'
|
|
9
|
+
// oxlint-disable-next-line import/no-nodejs-modules -- a Node and Workers host adapter
|
|
10
|
+
import { createBrotliDecompress } from 'node:zlib'
|
|
11
|
+
|
|
12
|
+
import type { StreamHasher } from './product-stream-tar.ts'
|
|
13
|
+
import type { StreamValidationPorts } from './product-stream.ts'
|
|
14
|
+
|
|
15
|
+
function sha256(bytes: Readonly<Uint8Array>): string {
|
|
16
|
+
return createHash('sha256').update(bytes).digest('hex')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function hasher(): StreamHasher {
|
|
20
|
+
const hash = createHash('sha256')
|
|
21
|
+
return {
|
|
22
|
+
update: (bytes: Readonly<Uint8Array>): void => {
|
|
23
|
+
hash.update(bytes)
|
|
24
|
+
},
|
|
25
|
+
digest: (): string => hash.digest('hex'),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Brotli-decode a stored object's chunks. A decoding error ends the stream with it. */
|
|
30
|
+
function brotliDecode(
|
|
31
|
+
stored: AsyncIterable<Uint8Array>,
|
|
32
|
+
): AsyncIterable<Uint8Array> {
|
|
33
|
+
return pipeline(Readable.from(stored), createBrotliDecompress(), (): void => {
|
|
34
|
+
// The reader sees the error: the decoder's stream is destroyed with it.
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** The ports for a `.tar.br` stored object (`brotli: true`) or a plain tarball. */
|
|
39
|
+
function nodeStreamPorts(
|
|
40
|
+
options: Readonly<{ brotli: boolean }>,
|
|
41
|
+
): StreamValidationPorts {
|
|
42
|
+
return options.brotli
|
|
43
|
+
? { hash: sha256, hasher, decode: brotliDecode }
|
|
44
|
+
: { hash: sha256, hasher }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { nodeStreamPorts }
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// oxlint-disable eslint/max-params, eslint/max-statements, eslint/max-lines-per-function, typescript/prefer-readonly-parameter-types -- the old validator's steps in its order, over reads that share state; the state is only read but for the held maps
|
|
2
|
+
// `checkPacks` for the streaming validator (API-CLOUDFLARE AC6a2). A carried
|
|
3
|
+
// pack's members are checked against its slices as it streams past. A pack
|
|
4
|
+
// the tarball leaves out is rebuilt by hashing its members in entry order
|
|
5
|
+
// (`parseOutputIndex` holds them contiguous, at their listed sizes, from 0 to
|
|
6
|
+
// the pack's size). The tarball is sorted by path, not by pack order, so a
|
|
7
|
+
// member that streams early waits, held, until the members before it pass.
|
|
8
|
+
// The packs are split into groups whose held bytes stay under a cap, and
|
|
9
|
+
// each group takes its own read of the stored object.
|
|
10
|
+
|
|
11
|
+
import type { OutputIndex } from './outputIndex.ts'
|
|
12
|
+
import type { StreamHasher } from './product-stream-tar.ts'
|
|
13
|
+
|
|
14
|
+
type Pack = NonNullable<OutputIndex['packs']>[number]
|
|
15
|
+
|
|
16
|
+
/** The most member bytes one read holds for its left-out packs. */
|
|
17
|
+
const PACK_HOLD_CAP = 16_000_000
|
|
18
|
+
const NONE = 0
|
|
19
|
+
const NEXT = 1
|
|
20
|
+
|
|
21
|
+
/** A left-out pack being rebuilt: the next entry to hash, and the ones that came early. */
|
|
22
|
+
interface PackRun {
|
|
23
|
+
readonly pack: Pack
|
|
24
|
+
readonly paths: readonly string[]
|
|
25
|
+
readonly hasher: StreamHasher
|
|
26
|
+
readonly early: Map<number, Readonly<Uint8Array>>
|
|
27
|
+
cursor: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** What one read found for its packs: by pack path, the refusal or undefined. */
|
|
31
|
+
type PackVerdicts = Map<string, string | undefined>
|
|
32
|
+
|
|
33
|
+
/** Each pack member's listed path: `packFromMembers`' lookup, the last listed row of a hash winning. */
|
|
34
|
+
function memberPaths(
|
|
35
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
36
|
+
index: OutputIndex,
|
|
37
|
+
): ReadonlyMap<string, string> {
|
|
38
|
+
return new Map(
|
|
39
|
+
[...index.sections, ...index.schemas, ...index.files].map(
|
|
40
|
+
(row: Readonly<{ hash: string; path: string }>): [string, string] => [
|
|
41
|
+
row.hash,
|
|
42
|
+
row.path,
|
|
43
|
+
],
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A pack's entry paths, in entry order. */
|
|
49
|
+
function entryPaths(
|
|
50
|
+
pack: Readonly<Pack>,
|
|
51
|
+
paths: ReadonlyMap<string, string>,
|
|
52
|
+
): string[] {
|
|
53
|
+
return pack.entries.map(
|
|
54
|
+
(entry: Readonly<{ hash: string }>): string => paths.get(entry.hash) ?? '',
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** A left-out pack in `heldPeak`: sizes only. */
|
|
59
|
+
interface SizedRun {
|
|
60
|
+
readonly paths: readonly string[]
|
|
61
|
+
readonly early: Set<number>
|
|
62
|
+
cursor: number
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Which entries of which pack wait on each path. */
|
|
66
|
+
function waitsByPath<Run extends Readonly<{ paths: readonly string[] }>>(
|
|
67
|
+
runs: readonly Run[],
|
|
68
|
+
): Map<string, { run: Run; at: number }[]> {
|
|
69
|
+
const waits = new Map<string, { run: Run; at: number }[]>()
|
|
70
|
+
for (const run of runs) {
|
|
71
|
+
for (const [at, path] of run.paths.entries()) {
|
|
72
|
+
waits.set(path, [...(waits.get(path) ?? []), { run, at }])
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return waits
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The most bytes a group of left-out packs holds in one read, members arriving in `order`: `packPass`, by size. */
|
|
79
|
+
function heldPeak(
|
|
80
|
+
group: readonly (readonly string[])[],
|
|
81
|
+
order: readonly string[],
|
|
82
|
+
sizes: ReadonlyMap<string, number>,
|
|
83
|
+
): number {
|
|
84
|
+
const runs = group.map((paths: readonly string[]): SizedRun => ({
|
|
85
|
+
paths,
|
|
86
|
+
cursor: NONE,
|
|
87
|
+
early: new Set<number>(),
|
|
88
|
+
}))
|
|
89
|
+
const waits = waitsByPath(runs)
|
|
90
|
+
let held = NONE
|
|
91
|
+
let peak = NONE
|
|
92
|
+
for (const path of order) {
|
|
93
|
+
for (const { run, at } of waits.get(path) ?? []) {
|
|
94
|
+
run.early.add(at)
|
|
95
|
+
held += sizes.get(path) ?? NONE
|
|
96
|
+
peak = Math.max(peak, held)
|
|
97
|
+
while (run.early.delete(run.cursor)) {
|
|
98
|
+
held -= sizes.get(run.paths[run.cursor] ?? '') ?? NONE
|
|
99
|
+
run.cursor += NEXT
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return peak
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** The left-out packs in read groups, each under `PACK_HOLD_CAP` held (a pack alone over it still gets a group). */
|
|
107
|
+
function packGroups(
|
|
108
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
109
|
+
index: OutputIndex,
|
|
110
|
+
present: ReadonlySet<string>,
|
|
111
|
+
order: readonly string[],
|
|
112
|
+
sizes: ReadonlyMap<string, number>,
|
|
113
|
+
): Pack[][] {
|
|
114
|
+
const paths = memberPaths(index)
|
|
115
|
+
const groups: Pack[][] = []
|
|
116
|
+
let group: Pack[] = []
|
|
117
|
+
for (const pack of index.packs ?? []) {
|
|
118
|
+
if (!present.has(pack.path)) {
|
|
119
|
+
const next = [...group, pack]
|
|
120
|
+
const peak = heldPeak(
|
|
121
|
+
next.map((row: Readonly<Pack>): string[] => entryPaths(row, paths)),
|
|
122
|
+
order,
|
|
123
|
+
sizes,
|
|
124
|
+
)
|
|
125
|
+
if (peak > PACK_HOLD_CAP && group.length > NONE) {
|
|
126
|
+
groups.push(group)
|
|
127
|
+
group = [pack]
|
|
128
|
+
} else {
|
|
129
|
+
group = next
|
|
130
|
+
}
|
|
131
|
+
if (
|
|
132
|
+
group.length === NEXT &&
|
|
133
|
+
heldPeak([entryPaths(pack, paths)], order, sizes) > PACK_HOLD_CAP
|
|
134
|
+
) {
|
|
135
|
+
throw new Error(`stream: a pack over the streaming cap: ${pack.path}`)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return group.length > NONE ? [...groups, group] : groups
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** One read's pack checks: carried packs against their slices, a group of left-out packs rebuilt. */
|
|
143
|
+
interface PackPass {
|
|
144
|
+
/** Paths whose bytes this read needs. */
|
|
145
|
+
readonly wants: ReadonlySet<string>
|
|
146
|
+
/** One member's bytes, in tarball order. */
|
|
147
|
+
readonly member: (path: string, bytes: Readonly<Uint8Array>) => void
|
|
148
|
+
/** The bytes held now for left-out packs. */
|
|
149
|
+
readonly held: () => number
|
|
150
|
+
/** Each pack's refusal, or undefined, once the read ends. */
|
|
151
|
+
readonly finish: () => PackVerdicts
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function packPass(
|
|
155
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
156
|
+
index: OutputIndex,
|
|
157
|
+
packs: Readonly<{ carried: readonly Pack[]; group: readonly Pack[] }>,
|
|
158
|
+
ports: Readonly<{
|
|
159
|
+
hash: (bytes: Readonly<Uint8Array>) => string
|
|
160
|
+
hasher: () => StreamHasher
|
|
161
|
+
}>,
|
|
162
|
+
): PackPass {
|
|
163
|
+
const paths = memberPaths(index)
|
|
164
|
+
const verdicts: PackVerdicts = new Map()
|
|
165
|
+
const { carried, group } = packs
|
|
166
|
+
const carriedByPath = new Map(
|
|
167
|
+
carried.map((pack: Readonly<Pack>): [string, Pack] => [pack.path, pack]),
|
|
168
|
+
)
|
|
169
|
+
const runs: PackRun[] = group.map((pack: Readonly<Pack>): PackRun => ({
|
|
170
|
+
pack,
|
|
171
|
+
paths: entryPaths(pack, paths),
|
|
172
|
+
hasher: ports.hasher(),
|
|
173
|
+
early: new Map(),
|
|
174
|
+
cursor: NONE,
|
|
175
|
+
}))
|
|
176
|
+
const waits = waitsByPath(runs)
|
|
177
|
+
let held = NONE
|
|
178
|
+
const advance = (run: PackRun): void => {
|
|
179
|
+
for (;;) {
|
|
180
|
+
const bytes = run.early.get(run.cursor)
|
|
181
|
+
if (bytes === undefined) {
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
run.early.delete(run.cursor)
|
|
185
|
+
held -= bytes.length
|
|
186
|
+
run.hasher.update(bytes)
|
|
187
|
+
run.cursor += NEXT
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const member = (path: string, bytes: Readonly<Uint8Array>): void => {
|
|
191
|
+
const pack = carriedByPath.get(path)
|
|
192
|
+
if (pack !== undefined) {
|
|
193
|
+
const differs = pack.entries.some(
|
|
194
|
+
(
|
|
195
|
+
entry: Readonly<{ hash: string; offset: number; bytes: number }>,
|
|
196
|
+
): boolean =>
|
|
197
|
+
ports.hash(
|
|
198
|
+
bytes.subarray(entry.offset, entry.offset + entry.bytes),
|
|
199
|
+
) !== entry.hash,
|
|
200
|
+
)
|
|
201
|
+
verdicts.set(
|
|
202
|
+
pack.path,
|
|
203
|
+
differs ? `Pack member differs: ${pack.path}` : undefined,
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
for (const { run, at } of waits.get(path) ?? []) {
|
|
207
|
+
run.early.set(at, bytes)
|
|
208
|
+
held += bytes.length
|
|
209
|
+
advance(run)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const finish = (): PackVerdicts => {
|
|
213
|
+
for (const run of runs) {
|
|
214
|
+
if (run.cursor < run.paths.length) {
|
|
215
|
+
throw new Error(`missing file: ${run.paths[run.cursor] ?? ''}`)
|
|
216
|
+
}
|
|
217
|
+
verdicts.set(
|
|
218
|
+
run.pack.path,
|
|
219
|
+
run.hasher.digest() === run.pack.hash
|
|
220
|
+
? undefined
|
|
221
|
+
: `Pack differs from its members: ${run.pack.path}`,
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
return verdicts
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
wants: new Set([...carriedByPath.keys(), ...waits.keys()]),
|
|
228
|
+
member,
|
|
229
|
+
held: (): number => held,
|
|
230
|
+
finish,
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export type { PackPass, PackVerdicts }
|
|
235
|
+
export {
|
|
236
|
+
PACK_HOLD_CAP,
|
|
237
|
+
heldPeak,
|
|
238
|
+
memberPaths,
|
|
239
|
+
entryPaths,
|
|
240
|
+
packGroups,
|
|
241
|
+
packPass,
|
|
242
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// `validateShardfileProduct`'s inventory steps, replayed over what one
|
|
2
|
+
// streaming pass kept (API-CLOUDFLARE AC6a): each listed file's hash and
|
|
3
|
+
// size, the blobs' facts, server files, KTX2 device costs, the cook and its
|
|
4
|
+
// mounts, and no unlisted file. The order and the messages are the old ones.
|
|
5
|
+
// The index and script rows are valibot's output types, which the replay only
|
|
6
|
+
// reads; their parameters say so in a disable comment rather than a deep type.
|
|
7
|
+
|
|
8
|
+
import { cookMountPath, readCookData } from './cook-data.ts'
|
|
9
|
+
import { requireCookPreparation } from './cook-preparation.ts'
|
|
10
|
+
import { validatePlatformFile } from './platformFileFamilies.ts'
|
|
11
|
+
import { mountSharesBlob } from './product-reads.ts'
|
|
12
|
+
import { inspectFacts, ktx2Text } from './product-stream-facts.ts'
|
|
13
|
+
import { outputBlobKind, readCanonicalJson } from './productValidation.ts'
|
|
14
|
+
import { decisionModuleContracts } from './scriptContract.ts'
|
|
15
|
+
import { validationSourceBytes } from './validationReceipt.ts'
|
|
16
|
+
|
|
17
|
+
import type { OutputIndex } from './outputIndex.ts'
|
|
18
|
+
import type { FactsMember } from './product-stream-facts.ts'
|
|
19
|
+
import type { StreamMember } from './product-stream-tar.ts'
|
|
20
|
+
import type { ScriptAdmissionRows } from './scriptContract.ts'
|
|
21
|
+
|
|
22
|
+
/** One tar member after the walk. */
|
|
23
|
+
type KeptMember = FactsMember & StreamMember
|
|
24
|
+
|
|
25
|
+
interface Listed {
|
|
26
|
+
readonly path: string
|
|
27
|
+
readonly hash: string
|
|
28
|
+
readonly bytes: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The members the walk kept, and the paths the replay has listed so far. */
|
|
32
|
+
interface Replay {
|
|
33
|
+
readonly members: ReadonlyMap<string, KeptMember>
|
|
34
|
+
readonly listed: Set<string>
|
|
35
|
+
readonly hash: (bytes: Readonly<Uint8Array>) => string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const NONE = 0
|
|
39
|
+
|
|
40
|
+
/** A listed file: present, no larger than declared, and of its exact hash and size. */
|
|
41
|
+
function readListed(
|
|
42
|
+
replay: Readonly<Replay>,
|
|
43
|
+
entry: Readonly<Listed>,
|
|
44
|
+
): KeptMember {
|
|
45
|
+
replay.listed.add(entry.path)
|
|
46
|
+
const member = replay.members.get(entry.path)
|
|
47
|
+
if (member === undefined) {
|
|
48
|
+
throw new Error(`missing file: ${entry.path}`)
|
|
49
|
+
}
|
|
50
|
+
if (member.size > entry.bytes) {
|
|
51
|
+
throw new Error(`larger than its declared size: ${entry.path}`)
|
|
52
|
+
}
|
|
53
|
+
if (member.size !== entry.bytes || member.sha !== entry.hash) {
|
|
54
|
+
throw new Error(`Output hash or size mismatch: ${entry.path}`)
|
|
55
|
+
}
|
|
56
|
+
return member
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** A listed file's kept bytes. */
|
|
60
|
+
function listedBytes(
|
|
61
|
+
replay: Readonly<Replay>,
|
|
62
|
+
entry: Readonly<Listed>,
|
|
63
|
+
): Uint8Array {
|
|
64
|
+
const { bytes } = readListed(replay, entry)
|
|
65
|
+
if (bytes === undefined) {
|
|
66
|
+
throw new Error(`stream: ${entry.path} was not kept`)
|
|
67
|
+
}
|
|
68
|
+
return bytes
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Every listed blob through `inspectBlob`'s checks; the members by asset key, for `ktx2Costs`. */
|
|
72
|
+
function replayFiles(
|
|
73
|
+
replay: Readonly<Replay>,
|
|
74
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
75
|
+
index: OutputIndex,
|
|
76
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- format's row type, only read
|
|
77
|
+
scripts: ScriptAdmissionRows,
|
|
78
|
+
): Map<string, KeptMember> {
|
|
79
|
+
const contracts = decisionModuleContracts(scripts, index.files)
|
|
80
|
+
const assets = new Map<string, KeptMember>()
|
|
81
|
+
for (const entry of index.files) {
|
|
82
|
+
const member = readListed(replay, {
|
|
83
|
+
path: entry.path,
|
|
84
|
+
hash: entry.hash,
|
|
85
|
+
bytes: entry.compressed,
|
|
86
|
+
})
|
|
87
|
+
inspectFacts(
|
|
88
|
+
entry,
|
|
89
|
+
member,
|
|
90
|
+
entry.kind === 'wasm'
|
|
91
|
+
? (contracts.get(entry.hash) ?? { abi: 0 })
|
|
92
|
+
: undefined,
|
|
93
|
+
)
|
|
94
|
+
assets.set(
|
|
95
|
+
`${entry.commons === true ? 'commons:' : ''}${entry.hash}`,
|
|
96
|
+
member,
|
|
97
|
+
)
|
|
98
|
+
if (index.requires.commons.includes(entry.hash)) {
|
|
99
|
+
assets.set(`commons:${entry.hash}`, member)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return assets
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** J91's server files, and the declared KTX2 device costs against the verified bytes. */
|
|
106
|
+
function replayServerAndKtx2(
|
|
107
|
+
replay: Readonly<Replay>,
|
|
108
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
109
|
+
index: OutputIndex,
|
|
110
|
+
assets: ReadonlyMap<string, KeptMember>,
|
|
111
|
+
): void {
|
|
112
|
+
for (const entry of index.admission.server ?? []) {
|
|
113
|
+
const bytes = listedBytes(replay, entry)
|
|
114
|
+
if (entry.kind === 'json') {
|
|
115
|
+
if (
|
|
116
|
+
validatePlatformFile(
|
|
117
|
+
entry.name,
|
|
118
|
+
entry.schema,
|
|
119
|
+
readCanonicalJson(bytes),
|
|
120
|
+
) === undefined
|
|
121
|
+
) {
|
|
122
|
+
throw new Error(`Unregistered named JSON: ${entry.name}`)
|
|
123
|
+
}
|
|
124
|
+
} else if (outputBlobKind('binary', bytes) !== entry.kind) {
|
|
125
|
+
throw new Error('Output blob bytes differ from their declared kind')
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const [hash, cost] of Object.entries(index.ktx2Costs ?? {})) {
|
|
129
|
+
const actual = ktx2Text(assets.get(hash))
|
|
130
|
+
if (
|
|
131
|
+
actual === undefined ||
|
|
132
|
+
new TextDecoder().decode(validationSourceBytes(cost)) !== actual
|
|
133
|
+
) {
|
|
134
|
+
throw new Error('KTX2 device costs differ from verified bytes')
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** C0 (J137): the cook file, and each mount's hash and size. */
|
|
140
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
141
|
+
function replayCook(replay: Readonly<Replay>, index: OutputIndex): void {
|
|
142
|
+
const cook =
|
|
143
|
+
index.cook === undefined
|
|
144
|
+
? undefined
|
|
145
|
+
: readCookData(readCanonicalJson(listedBytes(replay, index.cook)))
|
|
146
|
+
requireCookPreparation(index, cook, replay.hash)
|
|
147
|
+
for (const mount of cook?.mounts ?? []) {
|
|
148
|
+
if (!mountSharesBlob(mount, index.files)) {
|
|
149
|
+
if (mount.path !== cookMountPath(mount.url)) {
|
|
150
|
+
throw new Error(`Mount path differs from its URL: ${mount.url}`)
|
|
151
|
+
}
|
|
152
|
+
readListed(replay, mount)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** No copied runtime files (the Worker has no import checker) and no file the index does not list. */
|
|
158
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
159
|
+
function replayInventory(replay: Readonly<Replay>, index: OutputIndex): void {
|
|
160
|
+
if ((index.runtime?.files ?? []).length > NONE) {
|
|
161
|
+
throw new Error('Copied runtime files need a runtime import checker')
|
|
162
|
+
}
|
|
163
|
+
for (const path of replay.members.keys()) {
|
|
164
|
+
if (!replay.listed.has(path)) {
|
|
165
|
+
throw new Error(`Unlisted output file: ${path}`)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** The steps from the blobs to the KTX2 costs, before the packs. */
|
|
171
|
+
function replayBeforePacks(
|
|
172
|
+
replay: Readonly<Replay>,
|
|
173
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
174
|
+
index: OutputIndex,
|
|
175
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- format's row type, only read
|
|
176
|
+
scripts: ScriptAdmissionRows,
|
|
177
|
+
): void {
|
|
178
|
+
replayServerAndKtx2(replay, index, replayFiles(replay, index, scripts))
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** `checkPacks` in pack order, from what the later reads found; then the cook, its mounts and the inventory. */
|
|
182
|
+
function replayPacksToInventory(
|
|
183
|
+
replay: Readonly<Replay>,
|
|
184
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- valibot's output type, only read
|
|
185
|
+
index: OutputIndex,
|
|
186
|
+
packs: ReadonlyMap<string, string | undefined>,
|
|
187
|
+
): void {
|
|
188
|
+
for (const pack of index.packs ?? []) {
|
|
189
|
+
if (replay.members.has(pack.path)) {
|
|
190
|
+
readListed(replay, pack)
|
|
191
|
+
}
|
|
192
|
+
const refusal = packs.get(pack.path)
|
|
193
|
+
if (refusal !== undefined) {
|
|
194
|
+
throw new Error(refusal)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
replayCook(replay, index)
|
|
198
|
+
replayInventory(replay, index)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export type { KeptMember, Replay }
|
|
202
|
+
export { listedBytes, replayBeforePacks, replayPacksToInventory }
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// The streaming half of `indexTar` (API-CLOUDFLARE AC6a): one pass over a
|
|
2
|
+
// tarball's chunks with the same refusals, in bounded memory. Each regular
|
|
3
|
+
// file is hashed as it streams; the caller says which files it wants whole.
|
|
4
|
+
|
|
5
|
+
import { BLOCK, padded } from './tar-fields.ts'
|
|
6
|
+
import { MAX_ENTRIES, claimFile, claimFolder, newClaims } from './tar-paths.ts'
|
|
7
|
+
import { readTarHeader } from './tar.ts'
|
|
8
|
+
|
|
9
|
+
import type { TarClaims } from './tar-paths.ts'
|
|
10
|
+
|
|
11
|
+
const START = 0
|
|
12
|
+
const NUL = 0
|
|
13
|
+
const NEXT = 1
|
|
14
|
+
const END_BLOCKS = 2
|
|
15
|
+
const DIRECTORY_TYPE = '5'
|
|
16
|
+
const EMPTY: Uint8Array = new Uint8Array(START)
|
|
17
|
+
|
|
18
|
+
/** An incremental SHA-256 (`node:crypto`'s `createHash('sha256')`). */
|
|
19
|
+
interface StreamHasher {
|
|
20
|
+
readonly update: (bytes: Readonly<Uint8Array>) => void
|
|
21
|
+
readonly digest: () => string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** One regular file of the tarball: its size and hash, and its bytes when the caller asked for them. */
|
|
25
|
+
interface StreamMember {
|
|
26
|
+
readonly size: number
|
|
27
|
+
readonly sha: string
|
|
28
|
+
readonly bytes: Uint8Array | undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** What the walk asks of its caller. */
|
|
32
|
+
interface WalkPorts {
|
|
33
|
+
readonly hasher: () => StreamHasher
|
|
34
|
+
/** Whether to hand this file over whole; refuse here (throw) a file too large to hold. */
|
|
35
|
+
readonly wants: (path: string, size: number) => boolean
|
|
36
|
+
/** Called once per regular file, in tarball order. */
|
|
37
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- a port's own type: the caller keeps the bytes
|
|
38
|
+
readonly member: (path: string, member: StreamMember) => void
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Exact-length reads over a chunk stream. */
|
|
42
|
+
interface ChunkReader {
|
|
43
|
+
/** Up to `length` bytes in pieces; fewer only at the end of the stream. */
|
|
44
|
+
readonly pieces: (length: number) => AsyncGenerator<Uint8Array>
|
|
45
|
+
/** `length` bytes joined, or fewer at the end of the stream. */
|
|
46
|
+
readonly read: (length: number) => Promise<Uint8Array>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isZero(bytes: Readonly<Uint8Array>): boolean {
|
|
50
|
+
return bytes.every((byte: number): boolean => byte === NUL)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function chunkReader(source: AsyncIterable<Uint8Array>): ChunkReader {
|
|
54
|
+
const chunks = source[Symbol.asyncIterator]()
|
|
55
|
+
let head = EMPTY
|
|
56
|
+
async function fill(): Promise<boolean> {
|
|
57
|
+
while (head.length === START) {
|
|
58
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a stream's chunks come one at a time
|
|
59
|
+
const next = await chunks.next()
|
|
60
|
+
if (next.done === true) {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
head = next.value
|
|
64
|
+
}
|
|
65
|
+
return true
|
|
66
|
+
}
|
|
67
|
+
async function* pieces(length: number): AsyncGenerator<Uint8Array> {
|
|
68
|
+
let left = length
|
|
69
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a stream's chunks come one at a time
|
|
70
|
+
while (left > START && (await fill())) {
|
|
71
|
+
const take = Math.min(left, head.length)
|
|
72
|
+
yield head.subarray(START, take)
|
|
73
|
+
head = head.subarray(take)
|
|
74
|
+
left -= take
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function read(length: number): Promise<Uint8Array> {
|
|
78
|
+
const out = new Uint8Array(length)
|
|
79
|
+
let at = START
|
|
80
|
+
for await (const piece of pieces(length)) {
|
|
81
|
+
out.set(piece, at)
|
|
82
|
+
at += piece.length
|
|
83
|
+
}
|
|
84
|
+
return at === length ? out : out.subarray(START, at)
|
|
85
|
+
}
|
|
86
|
+
return { pieces, read }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The end-of-archive blocks: at least two, and nothing after them but zeros. */
|
|
90
|
+
async function assertEnd(reader: ChunkReader): Promise<number> {
|
|
91
|
+
let rest = BLOCK
|
|
92
|
+
let zero = true
|
|
93
|
+
for await (const piece of reader.pieces(Number.MAX_SAFE_INTEGER)) {
|
|
94
|
+
rest += piece.length
|
|
95
|
+
zero &&= isZero(piece)
|
|
96
|
+
}
|
|
97
|
+
if (rest < END_BLOCKS * BLOCK || !zero) {
|
|
98
|
+
throw new Error('tar: bad end-of-archive blocks')
|
|
99
|
+
}
|
|
100
|
+
return rest
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Copy `size` bytes through `hasher`, and into `bytes` when held; the count copied. */
|
|
104
|
+
async function copyMember(
|
|
105
|
+
reader: ChunkReader,
|
|
106
|
+
size: number,
|
|
107
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- `bytes` is the copy's destination
|
|
108
|
+
sink: Readonly<{ hasher: StreamHasher; bytes: Uint8Array | undefined }>,
|
|
109
|
+
): Promise<number> {
|
|
110
|
+
let at = START
|
|
111
|
+
for await (const piece of reader.pieces(size)) {
|
|
112
|
+
sink.hasher.update(piece)
|
|
113
|
+
sink.bytes?.set(piece, at)
|
|
114
|
+
at += piece.length
|
|
115
|
+
}
|
|
116
|
+
return at
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Stream one regular file through its hash, held whole when wanted; then its zero padding. */
|
|
120
|
+
async function readMember(
|
|
121
|
+
reader: ChunkReader,
|
|
122
|
+
entry: Readonly<{ path: string; size: number }>,
|
|
123
|
+
ports: WalkPorts,
|
|
124
|
+
): Promise<StreamMember> {
|
|
125
|
+
const hasher = ports.hasher()
|
|
126
|
+
const bytes = ports.wants(entry.path, entry.size)
|
|
127
|
+
? new Uint8Array(entry.size)
|
|
128
|
+
: undefined
|
|
129
|
+
if ((await copyMember(reader, entry.size, { hasher, bytes })) < entry.size) {
|
|
130
|
+
throw new Error(`tar: truncated entry ${entry.path}`)
|
|
131
|
+
}
|
|
132
|
+
if (!isZero(await reader.read(padded(entry.size) - entry.size))) {
|
|
133
|
+
throw new Error(`tar: non-zero padding after ${entry.path}`)
|
|
134
|
+
}
|
|
135
|
+
return { size: entry.size, sha: hasher.digest(), bytes }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** One header and its file; the bytes it took. */
|
|
139
|
+
async function walkEntry(
|
|
140
|
+
reader: ChunkReader,
|
|
141
|
+
block: Readonly<Uint8Array>,
|
|
142
|
+
walk: Readonly<{ ports: WalkPorts; claims: TarClaims }>,
|
|
143
|
+
): Promise<number> {
|
|
144
|
+
const entry = readTarHeader(block)
|
|
145
|
+
if (entry.type === DIRECTORY_TYPE) {
|
|
146
|
+
if (entry.size !== START) {
|
|
147
|
+
throw new Error(`tar: directory with a size ${entry.path}`)
|
|
148
|
+
}
|
|
149
|
+
if (entry.path !== '') {
|
|
150
|
+
claimFolder(walk.claims, entry.path)
|
|
151
|
+
}
|
|
152
|
+
return BLOCK
|
|
153
|
+
}
|
|
154
|
+
claimFile(walk.claims, entry.path)
|
|
155
|
+
walk.ports.member(entry.path, await readMember(reader, entry, walk.ports))
|
|
156
|
+
return BLOCK + padded(entry.size)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** The next header block, refusing a tarball that ends without its end blocks. */
|
|
160
|
+
async function nextBlock(reader: ChunkReader): Promise<Uint8Array> {
|
|
161
|
+
const block = await reader.read(BLOCK)
|
|
162
|
+
if (block.length < BLOCK) {
|
|
163
|
+
throw new Error('tar: truncated (no end-of-archive blocks)')
|
|
164
|
+
}
|
|
165
|
+
return block
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Walk a tarball once, refusing what `indexTar` refuses; resolves with its byte length. */
|
|
169
|
+
async function walkTar(
|
|
170
|
+
tar: AsyncIterable<Uint8Array>,
|
|
171
|
+
ports: WalkPorts,
|
|
172
|
+
): Promise<number> {
|
|
173
|
+
const reader = chunkReader(tar)
|
|
174
|
+
const walk = { ports, claims: newClaims() }
|
|
175
|
+
let offset = START
|
|
176
|
+
for (let entries = START; ; entries += NEXT) {
|
|
177
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a tarball's headers come in order
|
|
178
|
+
const block = await nextBlock(reader)
|
|
179
|
+
if (isZero(block)) {
|
|
180
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- the walk's last step, once
|
|
181
|
+
return offset + (await assertEnd(reader))
|
|
182
|
+
}
|
|
183
|
+
if (entries === MAX_ENTRIES) {
|
|
184
|
+
throw new Error(`tar: too many entries, over ${String(MAX_ENTRIES)}`)
|
|
185
|
+
}
|
|
186
|
+
// oxlint-disable-next-line eslint/no-await-in-loop -- a tarball's entries come in order
|
|
187
|
+
offset += await walkEntry(reader, block, walk)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export type { StreamHasher, StreamMember, WalkPorts }
|
|
192
|
+
export { walkTar }
|