diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bbf4dbd..21b559d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -160,7 +160,7 @@ jobs: - name: Create artifact from binary if: (github.event_name == 'push' || github.event_name == 'pull-request' || github.event_name == 'workflow_dispatch' ) && github.event.ref == 'refs/heads/main' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.ASSET }} path: ${{ env.ASSET }} diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 04b3d46..5761d58 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -40,9 +40,6 @@ jobs: - name: Check style run: cargo fmt -- --check - - name: Lint with Rust Marker - uses: rust-marker/marker@v0.5 - test: runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index 0d9af00..babc785 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,75 +1,77 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "windows-sys", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -82,13 +84,13 @@ dependencies = [ [[package]] name = "assert_cmd" -version = "2.0.14" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" +checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85" dependencies = [ "anstyle", "bstr", - "doc-comment", + "libc", "predicates", "predicates-core", "predicates-tree", @@ -97,9 +99,9 @@ dependencies = [ [[package]] name = "assert_fs" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd762e110c8ed629b11b6cde59458cc1c71de78ebbcc30099fc8e0403a2a2ec" +checksum = "a652f6cb1f516886fcfee5e7a5c078b9ade62cfcb889524efe5a64d682dd27a9" dependencies = [ "anstyle", "doc-comment", @@ -112,15 +114,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "bio" -version = "1.6.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a72cb93babf08c85b375c2938ac678cc637936b3ebb72266d433cec2577f6c2" +checksum = "2169c40f17068bcf0563e5060ed6ccab694f68068133055f6e96bcdf987b3f32" dependencies = [ "anyhow", "approx", @@ -130,12 +132,13 @@ dependencies = [ "bytecount", "csv", "custom_derive", + "derefable", "editdistancek", "enum-map", "fxhash", - "itertools 0.11.0", + "getset", + "itertools", "itertools-num", - "lazy_static", "multimap", "ndarray", "newtype_derive", @@ -143,63 +146,56 @@ dependencies = [ "num-traits", "ordered-float", "petgraph", - "rand", "regex", "serde", "serde_derive", "statrs", "strum", "strum_macros", - "thiserror", + "thiserror 2.0.17", "triple_accel", "vec_map", ] [[package]] name = "bio-types" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d45749b87f21808051025e9bf714d14ff4627f9d8ca967eade6946ea769aa4a" +checksum = "f4dcf54f8b7f51450207d54780bab09c05f30b8b0caa991545082842e466ad7e" dependencies = [ "derive-new", "lazy_static", "regex", "strum_macros", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bstr" -version = "1.9.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -208,9 +204,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bv" @@ -224,15 +220,15 @@ dependencies = [ [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -242,27 +238,37 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.0.95" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +dependencies = [ + "find-msvc-tools", + "shlex", +] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" -version = "4.5.4" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -270,9 +276,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -282,36 +288,36 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.60", + "heck", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "comma" @@ -321,22 +327,22 @@ checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" [[package]] name = "console" -version = "0.15.8" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "unicode-width", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "core_affinity" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622892f5635ce1fc38c8f16dfc938553ed64af482edb5e150bf4caedbfcb2304" +checksum = "a034b3a7b624016c6e13f5df875747cc25f884156aad2abd12b6c46797971342" dependencies = [ "libc", "num_cpus", @@ -345,18 +351,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -373,27 +379,27 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "csv" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -404,27 +410,37 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" +[[package]] +name = "derefable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e519abf1289075763071c981958e89948b079fc54962617a0e6413d9ce44cbe7" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + [[package]] name = "derive-new" -version = "0.5.9" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] name = "dialoguer" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" dependencies = [ "console", "shell-words", "tempfile", - "thiserror", "zeroize", ] @@ -436,9 +452,9 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "editdistancek" @@ -448,15 +464,15 @@ checksum = "3e02df23d5b1c6f9e69fa603b890378123b93073df998a21e6e33b9db0a32613" [[package]] name = "either" -version = "1.11.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "enum-map" @@ -473,32 +489,32 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "fastrand" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "feature-probe" @@ -508,60 +524,71 @@ checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" [[package]] name = "file-format" -version = "0.24.0" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eab8aa2fba5f39f494000a22f44bf3c755b7d7f8ffad3f36c6d507893074159" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba1b81b3c213cf1c071f8bf3b83531f310df99642e58c48247272eef006cae5" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.0.30" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", - "libz-sys", + "libz-ng-sys", "miniz_oxide", ] [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] [[package]] name = "flume" -version = "0.10.14" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", "nanorand", - "pin-project", "spin", ] +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "fxhash" @@ -574,9 +601,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -585,11 +612,35 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "getset" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +dependencies = [ + "proc-macro-error2", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", +] + [[package]] name = "globset" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -604,16 +655,16 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.5.0", + "bitflags", "ignore", "walkdir", ] [[package]] name = "gzp" -version = "0.11.3" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c65d1899521a11810501b50b898464d133e1afc96703cff57726964cfa7baf" +checksum = "c35009b254f25c2960a5655c79a97baa4b44c6a7e3bdfcf7aeaffe707ce345ff" dependencies = [ "byteorder", "bytes", @@ -621,22 +672,26 @@ dependencies = [ "flate2", "flume", "libdeflater", - "libz-sys", + "libz-ng-sys", + "log", "num_cpus", - "thiserror", + "thiserror 2.0.17", ] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] [[package]] -name = "heck" -version = "0.4.1" +name = "hashbrown" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" @@ -646,15 +701,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "ignore" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", @@ -668,23 +723,23 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", ] [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -694,19 +749,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" [[package]] -name = "itertools" -version = "0.11.0" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -722,95 +774,92 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libdeflate-sys" -version = "0.12.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f7b0817f85e2ba608892f30fbf4c9d03f3ebf9db0c952d1b7c8f7387b54785" +checksum = "23bd6304ebf75390d8a99b88bdf2a266f62647838140cb64af8e6702f6e3fddc" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "0.12.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671e63282f642c7bcc7d292b212d5a4739fef02a77fe98429a75d308f96e7931" +checksum = "d5d4880e6d634d3d029d65fa016038e788cc728a17b782684726fb34ee140caf" dependencies = [ "libdeflate-sys", ] [[package]] name = "libm" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] -name = "libz-sys" -version = "1.1.16" +name = "libz-ng-sys" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "a7118c2c2a3c7b6edc279a8b19507672b9c4d716f95e671172dfa4e23f9fd824" dependencies = [ - "cc", "cmake", "libc", - "pkg-config", - "vcpkg", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.21" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -818,46 +867,37 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "memoffset" -version = "0.6.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", + "simd-adler32", ] [[package]] name = "multimap" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5d38b9b352dbd913288736af36af41c48d61b1a8cd34bcecd727561b7d511" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" dependencies = [ "serde", ] [[package]] name = "nalgebra" -version = "0.29.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" dependencies = [ "approx", "matrixmultiply", - "nalgebra-macros", "num-complex", "num-rational", "num-traits", @@ -867,36 +907,27 @@ dependencies = [ "typenum", ] -[[package]] -name = "nalgebra-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "nanorand" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] name = "ndarray" -version = "0.15.6" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ "matrixmultiply", "num-complex", "num-integer", "num-traits", + "portable-atomic", + "portable-atomic-util", "rawpointer", ] @@ -911,16 +942,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.25.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "autocfg", - "bitflags 1.3.2", + "bitflags", "cfg-if", + "cfg_aliases", "libc", - "memoffset", - "pin-utils", ] [[package]] @@ -929,11 +958,21 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -949,20 +988,20 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", + "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -970,9 +1009,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ "hermit-abi", "libc", @@ -980,87 +1019,82 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "ordered-float" -version = "3.9.2" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" dependencies = [ "num-traits", ] [[package]] name = "owo-colors" -version = "4.0.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" dependencies = [ - "supports-color", + "supports-color 2.1.0", + "supports-color 3.0.2", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", + "hashbrown 0.15.5", "indexmap", + "serde", ] [[package]] -name = "pin-project" -version = "1.1.5" +name = "portable-atomic" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] -name = "pin-project-internal" -version = "1.1.5" +name = "portable-atomic-util" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "portable-atomic", ] -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "predicates" -version = "3.1.0" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "difflib", @@ -1072,38 +1106,84 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.9" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.41", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", +] + [[package]] name = "proc-macro2" -version = "1.0.81" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.103", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1131,7 +1211,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] @@ -1152,9 +1232,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "regex" -version = "1.10.4" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -1164,9 +1244,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -1175,21 +1255,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rexpect" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ff60778f96fb5a48adbe421d21bf6578ed58c0872d712e7e08593c195adff8" +checksum = "2c1bcd4ac488e9d2d726d147031cceff5cff6425011ff1914049739770fa4726" dependencies = [ "comma", "nix", "regex", "tempfile", - "thiserror", + "thiserror 2.0.17", ] [[package]] @@ -1203,34 +1283,34 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.34" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -1258,22 +1338,32 @@ checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" [[package]] name = "serde" -version = "1.0.199" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.199" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] @@ -1282,11 +1372,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simba" -version = "0.6.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", "num-complex", @@ -1295,6 +1391,12 @@ dependencies = [ "wide", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "spin" version = "0.9.8" @@ -1306,12 +1408,11 @@ dependencies = [ [[package]] name = "statrs" -version = "0.16.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d08e5e1748192713cc281da8b16924fb46be7b0c2431854eadc785823e5696e" +checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e" dependencies = [ "approx", - "lazy_static", "nalgebra", "num-traits", "rand", @@ -1325,21 +1426,21 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.25.0" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", + "heck", + "proc-macro2 1.0.103", + "quote 1.0.41", "rustversion", - "syn 2.0.60", + "syn 2.0.108", ] [[package]] @@ -1352,64 +1453,94 @@ dependencies = [ "is_ci", ] +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + [[package]] name = "syn" -version = "1.0.109" +version = "0.15.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid", ] [[package]] name = "syn" -version = "2.0.60" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.103", + "quote 1.0.41", "unicode-ident", ] [[package]] name = "tempfile" -version = "3.10.1" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.4", + "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", ] [[package]] @@ -1420,13 +1551,13 @@ checksum = "22048bc95dfb2ffd05b1ff9a756290a009224b60b2f0e7525faeee7603851e63" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "umi-transfer" -version = "1.5.0" +version = "1.6.0" dependencies = [ "anyhow", "assert_cmd", @@ -1437,7 +1568,7 @@ dependencies = [ "file-format", "flate2", "gzp", - "itertools 0.12.1", + "itertools", "owo-colors", "predicates", "regex", @@ -1446,27 +1577,27 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] -name = "utf8parse" -version = "0.2.1" +name = "unicode-xid" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] -name = "vcpkg" -version = "0.2.15" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vec_map" @@ -1479,9 +1610,9 @@ dependencies = [ [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] @@ -1498,69 +1629,69 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasm-bindgen" -version = "0.2.92" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" +name = "wasm-bindgen" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ - "bumpalo", - "log", + "cfg-if", "once_cell", - "proc-macro2", - "quote", - "syn 2.0.60", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ - "quote", + "quote 1.0.41", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", - "wasm-bindgen-backend", + "bumpalo", + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] [[package]] name = "wide" -version = "0.7.16" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a1851a719f11d1d2fea40e15c72f6c00de8c142d7ac47c1441cc7e4d0d5bc6" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ "bytemuck", "safe_arch", @@ -1584,11 +1715,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1597,21 +1728,37 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ + "windows-link", "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", @@ -1624,54 +1771,80 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2 1.0.103", + "quote 1.0.41", + "syn 2.0.108", +] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" diff --git a/Cargo.toml b/Cargo.toml index 578272c..6447451 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,27 +1,25 @@ [package] name = "umi-transfer" -version = "1.5.0" +version = "1.6.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "4.3.11", features = ["derive"] } -bio = "1.6.0" -flate2 = "1.0.24" -itertools = "0.12.1" -file-format = "0.24.0" -anyhow = "1.0.82" -dialoguer = "0.11.0" -regex = "1.10.4" -owo-colors = { version = "4.0", features = ["supports-colors"] } -gzp = "0.11.3" +clap = { version = "4.5.51", features = ["derive"] } +bio = "3.0.0" +flate2 = "1.1.5" +itertools = "0.14.0" +file-format = "0.28.0" +anyhow = "1.0.100" +dialoguer = "0.12.0" +regex = "1.12.2" +owo-colors = { version = "4.2", features = ["supports-colors"] } +gzp = "2.0.0" [dev-dependencies] -assert_cmd = "2.0.14" -assert_fs = "1.1.1" -predicates = "3.1.0" -rexpect = "0.5.0" +assert_cmd = "2.1.1" +assert_fs = "1.1.3" +predicates = "3.1.3" +rexpect = "0.6.2" -[workspace.metadata.marker.lints] -marker_lints = "0.5.0" diff --git a/Dockerfile b/Dockerfile index 3f8a522..db21fac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:bookworm as buildenv +FROM rust:trixie as buildenv WORKDIR /usr/app/src COPY ./ /usr/app/src @@ -11,7 +11,7 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/rust/target \ cargo build --release -FROM debian:bookworm-slim as runner +FROM debian:trixie-slim as runner WORKDIR /root COPY --from=buildenv /usr/app/src/target/release/ /usr/local/bin/ RUN chmod 755 /usr/local/bin/umi-transfer diff --git a/README.md b/README.md index fe412f9..78a151b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # umi-transfer

- A command line tool for transferring Unique Molecular Identifiers (UMIs) provided as separate FastQ file to the header of records in paired FastQ files. + A command line tool for transferring Unique Molecular Identifiers (UMIs) provided as a separate FastQ file to the header of records in paired FastQ files.


@@ -30,7 +30,7 @@ To increase the accuracy of quantitative DNA sequencing experiments, Unique Molecular Identifiers may be used. UMIs are short sequences used to uniquely tag each molecule in a sample library, enabling precise identification of read duplicates. They must be added during library preparation and prior to sequencing, therefore require appropriate arrangements with your sequencing provider. -Most tools capable of taking UMIs into consideration during an analysis workflow, expect the respective UMI sequence to be embedded into the read's ID. Please consult your tools' manuals regarding the exact specification. +Most tools capable of taking UMIs into consideration during an analysis workflow expect the respective UMI sequence to be embedded into the read's ID. Please consult your tools' manuals regarding the exact specification. For some library preparation kits and sequencing adapters, the UMI sequence needs to be read together with the index from the antisense strand. Consequently, it will be output as a separate FastQ file during the demultiplexing process. @@ -44,7 +44,7 @@ Binaries for `umi-transfer` are available for most platforms and can be obtained ### Bioconda - `umi-transfer` is also available on [BioConda](https://bioconda.github.io/). Please refer to the [Bioconda documentation](https://bioconda.github.io/recipes/umi-transfer/README.html#package-umi-transfer) for comprehensive installation instructions. If you are already familiar with conda and BioConda, here’s a quick reference: +`umi-transfer` is also available on [BioConda](https://bioconda.github.io/). Please refer to the [Bioconda documentation](https://bioconda.github.io/recipes/umi-transfer/README.html#package-umi-transfer) for comprehensive installation instructions. If you are already familiar with conda and BioConda, here's a quick reference: ```shell mamba install umi-transfer @@ -96,14 +96,14 @@ That should create an executable `target/release/umi-transfer` that can be place ```shell ./target/release/umi-transfer --version -umi-transfer 1.5.0 +umi-transfer 1.6.0 ``` ## Usage -The tool requires three FastQ files as input. You can manually specify the names and location of the output files with `--out` and `--out2` or the tool will automatically append a `with_UMI` suffix to your input file names. It additionally accepts to choose a custom UMI delimiter with `--delim` and to set the flags `-f`, `-c` and `-z`. +The tool requires three FastQ files as input. You can manually specify the names and location of the output files with `--out` and `--out2` or the tool will automatically append a `with_UMI` suffix to your input file names. It additionally allows you to choose a custom UMI delimiter with `--delim`, the position of the integrated UMI with `--position`, and to set the flags `-f`, `-c` and `-z`. -`-c` is used to ensure the canonical `1` and `2` of paired files as read numbers in the output, regardless of the read numbers of the input reads. `-f` / `--force` will overwrite existing output files without prompting the user and `-z` enables the internal compression of the output files. Alternatively, you can also specify an output file name with `.gz` suffix to obtain compressed output. +`-c` is used to ensure the canonical read numbers `1` and `2` in paired output files, regardless of the read numbers of the input reads. `-f` / `--force` will overwrite existing output files without prompting the user and `-z` enables the internal compression of the output files. Alternatively, you can also specify an output file name with `.gz` suffix to obtain compressed output. ```raw $ umi-transfer external --help @@ -114,6 +114,10 @@ Integrate UMIs from a separate FastQ file Usage: umi-transfer external [OPTIONS] --in --in2 --umi Options: + -p, --position + Choose the target position for the UMI: 'header' or 'inline'. Defaults to 'header'. + + [default: header] [possible values: header, inline] -c, --correct_numbers Read numbers will be altered to ensure the canonical read numbers 1 and 2 in output file sequence headers. @@ -127,7 +131,7 @@ Options: -t, --threads - Number of threads to use for processing. Defaults to the number of logical cores available. + Maximum number of threads to use for processing. Preferably pick odd numbers, 9 or 11 recommended. Defaults to the maximum number of cores available. -f, --force @@ -180,13 +184,25 @@ umi-transfer external --in read1.fastq --in2 read1.fastq --umi read2.fastq --out ### Benchmarks and parameter recommendations +#### umi-transfer versions -With the release of version 1.5, `umi-transfer` features internal multi-threaded output compression. As a result, `umi-transfer` 1.5 now runs approximately 25 times faster than version 1.0 when using internal compression and about twice as fast compared to using an external compression tool. This improvement is enabled by the outstanding [`gzp` crate](https://github.com/sstadick/gzp), which abstracts a lot of the underlying complexity away from the main software. +Since the release of version 1.5, `umi-transfer` features internal multi-threaded output compression. As a result, `umi-transfer` 1.5 now runs approximately 25 times faster than version 1.0 when using internal compression and about twice as fast compared to using an external compression tool. This improvement is enabled by the outstanding [`gzp` crate](https://github.com/sstadick/gzp), which abstracts a lot of the underlying complexity away from the main software. ![Benchmark of different tool versions](docs/img/benchmark_umi-transfer-version.svg) In our first benchmark using 17 threads, version 1.5 of `umi-transfer` processed approximately 550,000 paired records per second with the default gzip compression level of 3. At the highest compression level of 9, the rate dropped to just below 200,000 records per second. While the exact numbers may vary depending on your storage, file system, and processors, we expect the relative performance rates to remain approximately constant. +| Version | Command | `--position` | ~ reads / s | +|----------|----------|----------|----------| +| 1.0 | external | N/A | 30500 | +| 1.5 | external | N/A | 591200 | +| 1.6 | external | Header | 579500 | +| 1.6 | external | Inline | 567287 | + +*Due to the new `--position` parameter for choosing the UMI integration position, Version 1.6 is about 5% slower than its predecessor. If you do not require this option, there is no need to upgrade.* + +#### umi-transfer thread setting + ![Benchmark of thread numbers](docs/img/benchmark_umi-transfer-threads.svg) In a subsequent benchmark, we tested the effect of increasing the number of threads. For the default compression level, the maximum speed was achieved with 9 to 11 threads. Since umi-transfer writes two output files simultaneously, this configuration allows for 4 to 5 threads per file to handle the output compression. @@ -228,7 +244,7 @@ umi-transfer external --in read1.fastq --in2 read3.fastq --umi read2.fastq --out It's good practice to remove the FIFOs after the program has finished: ```shell -rm output1.fastq output2.fastq +rm output1 output2 ``` ## Contribution guide for developers diff --git a/src/file_io.rs b/src/file_io.rs index 1a528da..dac51be 100644 --- a/src/file_io.rs +++ b/src/file_io.rs @@ -56,7 +56,7 @@ pub fn read_fastq(path: &PathBuf) -> Result), - Compressed(FastqWriter>), + Compressed(FastqWriter>>), } impl OutputFile { diff --git a/src/main.rs b/src/main.rs index 8b09ced..0d1f296 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ use crate::umi_external::OptsExternal; ///use crate::umi_internal::OptsInternal; mod auxiliary; mod file_io; +mod read_editing; mod umi_errors; mod umi_external; @@ -25,7 +26,7 @@ https://github.com/SciLifeLab/umi-transfer #[derive(clap::Parser)] #[clap( - version = "1.5.0", + version = "1.6.0", author = "Written by Matthias Zepper, Judit Hohenthal & Johannes Alneberg", about = "A tool for transferring Unique Molecular Identifiers (UMIs).", long_about = "Most tools capable of using UMIs to increase the accuracy of quantitative DNA sequencing experiments expect the respective UMI sequence to be embedded into the reads' IDs. You can use `umi-transfer external` to retrieve UMIs from a separate FastQ file and embed them to the IDs of your paired FastQ files." diff --git a/src/read_editing.rs b/src/read_editing.rs new file mode 100644 index 0000000..4b67ae4 --- /dev/null +++ b/src/read_editing.rs @@ -0,0 +1,153 @@ +#[derive(clap::ValueEnum, Clone, Debug)] +pub enum UMIDestination { + Header, + Inline, +} + +// Updates the header and description of the reads accordingly +pub fn umi_to_record_header( + input: bio::io::fastq::Record, + umi: &[u8], + umi_sep: Option<&String>, + edit_nr: Option, +) -> Result { + let delim = umi_sep.as_ref().map(|s| s.as_str()).unwrap_or(":"); // the delimiter for the UMI + let new_id = &[input.id(), delim, std::str::from_utf8(umi).unwrap()].concat(); + if let Some(number) = edit_nr { + let mut new_desc = String::from(input.desc().unwrap()); + new_desc.replace_range(0..1, &number.to_string()); + let desc: Option<&str> = Some(&new_desc); + let new_record = + bio::io::fastq::Record::with_attrs(new_id, desc, input.seq(), input.qual()); + Ok(new_record) + } else { + let new_record = + bio::io::fastq::Record::with_attrs(new_id, input.desc(), input.seq(), input.qual()); + Ok(new_record) + } +} + +// Updates the header and description of the reads accordingly +pub fn umi_to_record_seq( + input: bio::io::fastq::Record, + umi: &[u8], + umi_qual: &[u8], + edit_nr: Option, +) -> Result { + let mut concatenated_seq_str = String::with_capacity(umi.len() + input.seq().len()); + concatenated_seq_str.push_str(std::str::from_utf8(umi)?); + concatenated_seq_str.push_str(std::str::from_utf8(input.seq())?); + + let mut concatenated_qual_str = String::with_capacity(umi_qual.len() + input.qual().len()); + concatenated_qual_str.push_str(std::str::from_utf8(umi_qual)?); + concatenated_qual_str.push_str(std::str::from_utf8(input.qual())?); + + if let Some(number) = edit_nr { + let mut new_desc = String::from(input.desc().unwrap()); + new_desc.replace_range(0..1, &number.to_string()); + let desc: Option<&str> = Some(&new_desc); + // Unnecessary conversion to bytes and back to String, but Record::new() does + // not take arguments and the fields of struct `bio::io::fastq::Record` are private, + // so I can't implement another method to create a new record. + let new_record = bio::io::fastq::Record::with_attrs( + input.id(), + desc, + concatenated_seq_str.as_bytes(), + concatenated_qual_str.as_bytes(), + ); + Ok(new_record) + } else { + let new_record = bio::io::fastq::Record::with_attrs( + input.id(), + input.desc(), + concatenated_seq_str.as_bytes(), + concatenated_qual_str.as_bytes(), + ); + Ok(new_record) + } +} +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_umi_to_record_header_with_edits() { + let input = bio::io::fastq::Record::with_attrs( + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031", + Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT"), + b"TCGTTTTCCGC", + b"FFFFFFFFFFF", + ); + let umi = b"ACCAGCTA"; + let umi_sep = "_".to_string(); + let edit_nr = Some(5); + + let result = umi_to_record_header(input, umi, Some(&umi_sep), edit_nr).unwrap(); + assert_eq!( + result.id(), + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031_ACCAGCTA" + ); + assert_eq!(result.desc(), Some("5:N:0:GCTTCAGGGT+AAGGTAGCGT")); + assert_eq!(result.seq(), b"TCGTTTTCCGC"); + assert_eq!(result.qual(), b"FFFFFFFFFFF"); + } + + #[test] + fn test_umi_to_record_header_plain() { + let input = bio::io::fastq::Record::with_attrs( + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031", + Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT"), + b"TCGTTTTCCGC", + b"FFFFFFFFFFF", + ); + let umi = b"ACCAGCTA"; + let umi_sep = ":".to_string(); + + let result = umi_to_record_header(input, umi, Some(&umi_sep), None).unwrap(); + assert_eq!( + result.id(), + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031:ACCAGCTA" + ); + assert_eq!(result.desc(), Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT")); + assert_eq!(result.seq(), b"TCGTTTTCCGC"); + assert_eq!(result.qual(), b"FFFFFFFFFFF"); + } + + #[test] + fn test_umi_to_record_seq_with_edit_nr() { + let input = bio::io::fastq::Record::with_attrs( + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031", + Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT"), + b"TCGTTTTCCGC", + b"FFFFFFFFFFF", + ); + let umi = b"ACCAGCTA"; + let umi_qual = b"########"; + let edit_nr = Some(5); + + let result = umi_to_record_seq(input, umi, umi_qual, edit_nr).unwrap(); + assert_eq!(result.id(), "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031"); + assert_eq!(result.desc(), Some("5:N:0:GCTTCAGGGT+AAGGTAGCGT")); + assert_eq!(result.seq(), b"ACCAGCTATCGTTTTCCGC"); + assert_eq!(result.qual(), b"########FFFFFFFFFFF"); + } + + #[test] + fn test_umi_to_record_seq_without_edit_nr() { + let input = bio::io::fastq::Record::with_attrs( + "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031", + Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT"), + b"TCGTTTTCCGC", + b"FFFFFFFFFFF", + ); + let umi = b"ACCAGCTA"; + let umi_qual = b"########"; + + let result = umi_to_record_seq(input, umi, umi_qual, None).unwrap(); + assert_eq!(result.id(), "@SCILIFELAB:500:NGISTLM:1:1101:2446:1031"); + assert_eq!(result.desc(), Some("1:N:0:GCTTCAGGGT+AAGGTAGCGT")); + assert_eq!(result.seq(), b"ACCAGCTATCGTTTTCCGC"); + assert_eq!(result.qual(), b"########FFFFFFFFFFF"); + } +} diff --git a/src/umi_external.rs b/src/umi_external.rs index fec0983..215792d 100644 --- a/src/umi_external.rs +++ b/src/umi_external.rs @@ -5,9 +5,18 @@ use std::path::PathBuf; use super::file_io; use crate::auxiliary::{threads_available, threads_per_task}; +use crate::read_editing::{umi_to_record_header, umi_to_record_seq, UMIDestination}; use crate::umi_errors::RuntimeErrors; #[derive(Debug, Parser)] pub struct OptsExternal { + #[clap( + short = 'p', + long = "position", + help = "Choose the target position for the UMI: 'header' or 'inline'. Defaults to 'header'. + \n ", + default_value = "header" + )] + target_position: UMIDestination, #[clap( short = 'c', long = "correct_numbers", @@ -15,6 +24,7 @@ pub struct OptsExternal { \n " )] edit_nr: bool, + #[clap( short = 'z', long = "gzip", @@ -183,7 +193,15 @@ pub fn run(args: OptsExternal) -> Result { if r1_rec.id().eq(ru_rec.id()) { // Write to Output file let read_nr = if edit_nr { Some(1) } else { None }; - let r1_rec = update_record(r1_rec, ru_rec.seq(), args.delim.as_ref(), read_nr)?; + + let r1_rec = match args.target_position { + UMIDestination::Header => { + umi_to_record_header(r1_rec, ru_rec.seq(), args.delim.as_ref(), read_nr) + } + UMIDestination::Inline => { + umi_to_record_seq(r1_rec, ru_rec.seq(), ru_rec.qual(), read_nr) + } + }?; write_output_r1.write_record(r1_rec)?; } else { @@ -193,7 +211,15 @@ pub fn run(args: OptsExternal) -> Result { if r2_rec.id().eq(ru_rec.id()) { // Write to Output file let read_nr = if edit_nr { Some(2) } else { None }; - let r2_rec = update_record(r2_rec, ru_rec.seq(), args.delim.as_ref(), read_nr)?; + + let r2_rec = match args.target_position { + UMIDestination::Header => { + umi_to_record_header(r2_rec, ru_rec.seq(), args.delim.as_ref(), read_nr) + } + UMIDestination::Inline => { + umi_to_record_seq(r2_rec, ru_rec.seq(), ru_rec.qual(), read_nr) + } + }?; write_output_r2.write_record(r2_rec)?; } else { @@ -203,27 +229,3 @@ pub fn run(args: OptsExternal) -> Result { println!("Processed {:?} records", counter); Ok(counter) } - -// Updates the header and description of the reads accordingly -fn update_record( - input: bio::io::fastq::Record, - umi: &[u8], - umi_sep: Option<&String>, - edit_nr: Option, -) -> Result { - let delim = umi_sep.as_ref().map(|s| s.as_str()).unwrap_or(":"); // the delimiter for the UMI - if let Some(number) = edit_nr { - let new_id = &[input.id(), delim, std::str::from_utf8(umi).unwrap()].concat(); - let mut new_desc = String::from(input.desc().unwrap()); - new_desc.replace_range(0..1, &number.to_string()); - let desc: Option<&str> = Some(&new_desc); - let new_record = - bio::io::fastq::Record::with_attrs(new_id, desc, input.seq(), input.qual()); - Ok(new_record) - } else { - let new_id = &[input.id(), delim, std::str::from_utf8(umi).unwrap()].concat(); - let new_record = - bio::io::fastq::Record::with_attrs(new_id, input.desc(), input.seq(), input.qual()); - Ok(new_record) - } -} diff --git a/tests/auxiliary.rs b/tests/auxiliary.rs index 13ab695..75f21c3 100644 --- a/tests/auxiliary.rs +++ b/tests/auxiliary.rs @@ -1,4 +1,5 @@ use anyhow::{anyhow, Result}; +use assert_cmd::cargo::cargo_bin_cmd; use assert_cmd::Command; use assert_fs::fixture::{NamedTempFile, TempDir}; use assert_fs::prelude::*; @@ -30,18 +31,26 @@ pub struct TestFiles { #[allow(dead_code)] pub struct TestOutput { // Struct to hold the paths to validated output files. - pub correct_read1: PathBuf, - pub correct_read2: PathBuf, - pub compressed_correct_read1: PathBuf, - pub compressed_correct_read2: PathBuf, - pub more_compressed_correct_read1: PathBuf, - pub more_compressed_correct_read2: PathBuf, - pub corrected_read1: PathBuf, - pub corrected_read2: PathBuf, + pub header_read1: PathBuf, + pub header_read2: PathBuf, + pub header_compressed_read1: PathBuf, + pub header_compressed_read2: PathBuf, + pub header_more_compressed_read1: PathBuf, + pub header_more_compressed_read2: PathBuf, + pub header_corrected_read1: PathBuf, + pub header_corrected_read2: PathBuf, pub delim_underscore_read1: PathBuf, pub delim_underscore_read2: PathBuf, pub umi_read2_switch_read1: PathBuf, pub umi_read2_switch_read2: PathBuf, + pub inline_read1: PathBuf, + pub inline_read2: PathBuf, + pub inline_compressed_read1: PathBuf, + pub inline_compressed_read2: PathBuf, + pub inline_more_compressed_read1: PathBuf, + pub inline_more_compressed_read2: PathBuf, + pub inline_corrected_read1: PathBuf, + pub inline_corrected_read2: PathBuf, } #[allow(dead_code)] @@ -49,8 +58,7 @@ pub fn setup_integration_test( with_results: bool, ) -> (Command, TempDir, TestFiles, Option) { // Get the name of the binary (umi-transfer) - let cmd = Command::cargo_bin(assert_cmd::crate_name!()) - .expect("Failed to pull binary name from Cargo.toml at compile time."); + let cmd = cargo_bin_cmd!(); let temp_dir = assert_fs::TempDir::new().expect("Failed to create temporary directory"); @@ -92,18 +100,29 @@ pub fn setup_integration_test( let test_output = if with_results { let temp = TestOutput { - correct_read1: temp_dir.path().join("correct_read1.fq"), - correct_read2: temp_dir.path().join("correct_read2.fq"), - compressed_correct_read1: temp_dir.path().join("correct_read1.fq.gz"), - compressed_correct_read2: temp_dir.path().join("correct_read2.fq.gz"), - more_compressed_correct_read1: temp_dir.path().join("correct_read1_lvl9.fq.gz"), - more_compressed_correct_read2: temp_dir.path().join("correct_read2_lvl9.fq.gz"), - corrected_read1: temp_dir.path().join("corrected_read1.fq"), - corrected_read2: temp_dir.path().join("corrected_read2.fq"), + // Header examples + header_read1: temp_dir.path().join("header_correct_read1.fq"), + header_read2: temp_dir.path().join("header_correct_read2.fq"), + header_compressed_read1: temp_dir.path().join("header_correct_read1.fq.gz"), + header_compressed_read2: temp_dir.path().join("header_correct_read2.fq.gz"), + header_more_compressed_read1: temp_dir.path().join("header_correct_read1_lvl9.fq.gz"), + header_more_compressed_read2: temp_dir.path().join("header_correct_read2_lvl9.fq.gz"), + header_corrected_read1: temp_dir.path().join("header_corrected_read1.fq"), + header_corrected_read2: temp_dir.path().join("header_corrected_read2.fq"), + // Special cases delim_underscore_read1: temp_dir.path().join("delim_underscore_read1.fq"), delim_underscore_read2: temp_dir.path().join("delim_underscore_read2.fq"), umi_read2_switch_read1: temp_dir.path().join("umi_read2_switch_read1.fq"), umi_read2_switch_read2: temp_dir.path().join("umi_read2_switch_read2.fq"), + // Analogous inline examples + inline_read1: temp_dir.path().join("inline_correct_read1.fq"), + inline_read2: temp_dir.path().join("inline_correct_read2.fq"), + inline_compressed_read1: temp_dir.path().join("inline_correct_read1.fq.gz"), + inline_compressed_read2: temp_dir.path().join("inline_correct_read2.fq.gz"), + inline_more_compressed_read1: temp_dir.path().join("inline_correct_read1_lvl9.fq.gz"), + inline_more_compressed_read2: temp_dir.path().join("inline_correct_read2_lvl9.fq.gz"), + inline_corrected_read1: temp_dir.path().join("inline_corrected_read1.fq"), + inline_corrected_read2: temp_dir.path().join("inline_corrected_read2.fq"), }; Some(temp) } else { diff --git a/tests/integration_tests_external.rs b/tests/integration_tests_external.rs index ad36362..82888a8 100644 --- a/tests/integration_tests_external.rs +++ b/tests/integration_tests_external.rs @@ -1,4 +1,4 @@ -use assert_cmd::Command; +use assert_cmd::cargo::cargo_bin_cmd; use assert_fs::prelude::*; use predicates::prelude::*; use std::process::Command as StdCommand; @@ -10,7 +10,7 @@ mod auxiliary; #[test] fn external_fails_without_arguments() { - let mut cmd = Command::cargo_bin(assert_cmd::crate_name!()).unwrap(); + let mut cmd = cargo_bin_cmd!(); cmd.arg("external"); @@ -52,6 +52,36 @@ fn external_with_minimal_arguments_plain() { temp_dir.close().unwrap(); } +#[test] +fn external_with_inline_position() { + let (mut cmd, temp_dir, test_files, _test_output) = auxiliary::setup_integration_test(false); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.read2) + .arg("--umi") + .arg(test_files.umi) + .arg("--position") + .arg("inline"); + + cmd.assert() + .success() + .stdout(predicate::str::contains("Transferring UMIs to records")) + .stdout(predicate::str::contains("Processed 10 records")) + .stdout(predicate::str::contains("umi-transfer finished after")); + + temp_dir + .child("read1_with_UMIs.fq") + .assert(predicate::path::exists()); + + temp_dir + .child("read2_with_UMIs.fq") + .assert(predicate::path::exists()); + + temp_dir.close().unwrap(); +} + #[test] fn external_with_minimal_arguments_compressed() { let (mut cmd, temp_dir, test_files, _test_output) = auxiliary::setup_integration_test(false); @@ -211,8 +241,7 @@ fn external_fails_with_existing_output_file_and_no_force() { // Therefore, we use rexpect to run the test in a session and must use // a different Command type: std::process::Command instead of assert_cmd::Command. - let bin_path = assert_cmd::cargo::cargo_bin("umi-transfer"); - let mut cmd = StdCommand::new(bin_path); + let mut cmd = StdCommand::new(assert_cmd::cargo::cargo_bin!()); cmd.arg("external") .arg("--in") .arg(test_files.read1_gz) diff --git a/tests/integration_tests_external_filecontents.rs b/tests/integration_tests_external_filecontents.rs index eb32ad1..25fbb89 100644 --- a/tests/integration_tests_external_filecontents.rs +++ b/tests/integration_tests_external_filecontents.rs @@ -60,7 +60,7 @@ fn testing_file_comparison_fails() { // Yep, verify_file_contents() does its job. Ready to rumble! #[test] -fn external_produces_correct_output() -> TestResult { +fn external_produces_correct_output_header() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -70,26 +70,23 @@ fn external_produces_correct_output() -> TestResult { .arg("--umi") .arg(test_files.umi); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_contents( &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), - &reference.correct_read1, + &reference.header_read1, )?; - verify_file_contents( &temp_dir.child("read2_with_UMIs.fq").to_path_buf(), - &reference.correct_read2, + &reference.header_read2, )?; temp_dir.close()?; @@ -97,7 +94,7 @@ fn external_produces_correct_output() -> TestResult { } #[test] -fn external_corrects_read_numbers_in_output() -> TestResult { +fn external_produces_correct_output_inline() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -106,28 +103,26 @@ fn external_corrects_read_numbers_in_output() -> TestResult { .arg(test_files.read2) .arg("--umi") .arg(test_files.umi) - .arg("--correct_numbers"); + .arg("--position") + .arg("inline"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_contents( &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), - &reference.corrected_read1, + &reference.inline_read1, )?; - verify_file_contents( &temp_dir.child("read2_with_UMIs.fq").to_path_buf(), - &reference.corrected_read2, + &reference.inline_read2, )?; temp_dir.close()?; @@ -135,7 +130,7 @@ fn external_corrects_read_numbers_in_output() -> TestResult { } #[test] -fn external_underscore_delimiter() -> TestResult { +fn external_corrects_read_numbers_in_output_header() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -144,68 +139,62 @@ fn external_underscore_delimiter() -> TestResult { .arg(test_files.read2) .arg("--umi") .arg(test_files.umi) - .arg("--delim") - .arg("_"); + .arg("--correct_numbers"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_contents( &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), - &reference.delim_underscore_read1, + &reference.header_corrected_read1, )?; - verify_file_contents( &temp_dir.child("read2_with_UMIs.fq").to_path_buf(), - &reference.delim_underscore_read2, + &reference.header_corrected_read2, )?; temp_dir.close()?; Ok(()) } -// Not really a serious test, but one can also integrate the read sequence into the UMI header if needed ;-) - #[test] -fn external_switch_umi_and_read2() -> TestResult { +fn external_corrects_read_numbers_in_output_inline() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") .arg(test_files.read1) .arg("--in2") - .arg(test_files.umi) + .arg(test_files.read2) .arg("--umi") - .arg(test_files.read2); + .arg(test_files.umi) + .arg("--correct_numbers") + .arg("--position") + .arg("inline"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq") .assert(predicate::path::exists()); - temp_dir - .child("umi_with_UMIs.fq") + .child("read2_with_UMIs.fq") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_contents( &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), - &reference.umi_read2_switch_read1, + &reference.inline_corrected_read1, )?; - verify_file_contents( - &temp_dir.child("umi_with_UMIs.fq").to_path_buf(), - &reference.umi_read2_switch_read2, + &temp_dir.child("read2_with_UMIs.fq").to_path_buf(), + &reference.inline_corrected_read2, )?; temp_dir.close()?; @@ -213,7 +202,7 @@ fn external_switch_umi_and_read2() -> TestResult { } #[test] -fn external_produces_correct_compressed_output() -> TestResult { +fn external_produces_correct_compressed_output_header() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -224,26 +213,60 @@ fn external_produces_correct_compressed_output() -> TestResult { .arg(test_files.umi) .arg("--gzip"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq.gz") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq.gz") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_binary( &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), - &reference.compressed_correct_read1, + &reference.header_compressed_read1, + )?; + verify_file_binary( + &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), + &reference.header_compressed_read2, )?; + temp_dir.close()?; + Ok(()) +} + +#[test] +fn external_produces_correct_compressed_output_inline() -> TestResult { + let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.read2) + .arg("--umi") + .arg(test_files.umi) + .arg("--gzip") + .arg("--position") + .arg("inline"); + + cmd.assert().success(); + + temp_dir + .child("read1_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + temp_dir + .child("read2_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + + let reference = test_output.unwrap(); + verify_file_binary( + &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), + &reference.inline_compressed_read1, + )?; verify_file_binary( &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), - &reference.compressed_correct_read2, + &reference.inline_compressed_read2, )?; temp_dir.close()?; @@ -251,7 +274,7 @@ fn external_produces_correct_compressed_output() -> TestResult { } #[test] -fn external_produces_correct_compressed_output_mod_compression_level() -> TestResult { +fn external_produces_correct_compressed_output_mod_compression_level_header() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -264,26 +287,62 @@ fn external_produces_correct_compressed_output_mod_compression_level() -> TestRe .arg("9") .arg("--gzip"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq.gz") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq.gz") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_binary( &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), - &reference.more_compressed_correct_read1, + &reference.header_more_compressed_read1, + )?; + verify_file_binary( + &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), + &reference.header_more_compressed_read2, )?; + temp_dir.close()?; + Ok(()) +} + +#[test] +fn external_produces_correct_compressed_output_mod_compression_level_inline() -> TestResult { + let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.read2) + .arg("--umi") + .arg(test_files.umi) + .arg("--compression_level") + .arg("9") + .arg("--gzip") + .arg("--position") + .arg("inline"); + + cmd.assert().success(); + + temp_dir + .child("read1_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + temp_dir + .child("read2_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + + let reference = test_output.unwrap(); + verify_file_binary( + &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), + &reference.inline_more_compressed_read1, + )?; verify_file_binary( &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), - &reference.more_compressed_correct_read2, + &reference.inline_more_compressed_read2, )?; temp_dir.close()?; @@ -291,7 +350,7 @@ fn external_produces_correct_compressed_output_mod_compression_level() -> TestRe } #[test] -fn external_produces_correct_compressed_output_thread_limit() -> TestResult { +fn external_produces_correct_compressed_output_thread_limit_header() -> TestResult { let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); cmd.arg("external") .arg("--in") @@ -304,26 +363,140 @@ fn external_produces_correct_compressed_output_thread_limit() -> TestResult { .arg("3") .arg("--gzip"); - cmd.assert().success(); //further assertions have been tested in other tests + cmd.assert().success(); temp_dir .child("read1_with_UMIs.fq.gz") .assert(predicate::path::exists()); - temp_dir .child("read2_with_UMIs.fq.gz") .assert(predicate::path::exists()); let reference = test_output.unwrap(); - verify_file_binary( &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), - &reference.compressed_correct_read1, + &reference.header_compressed_read1, + )?; + verify_file_binary( + &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), + &reference.header_compressed_read2, )?; + temp_dir.close()?; + Ok(()) +} + +#[test] +fn external_produces_correct_compressed_output_thread_limit_inline() -> TestResult { + let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.read2) + .arg("--umi") + .arg(test_files.umi) + .arg("--threads") + .arg("3") + .arg("--gzip") + .arg("--position") + .arg("inline"); + + cmd.assert().success(); + + temp_dir + .child("read1_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + temp_dir + .child("read2_with_UMIs.fq.gz") + .assert(predicate::path::exists()); + + let reference = test_output.unwrap(); + verify_file_binary( + &temp_dir.child("read1_with_UMIs.fq.gz").to_path_buf(), + &reference.inline_compressed_read1, + )?; verify_file_binary( &temp_dir.child("read2_with_UMIs.fq.gz").to_path_buf(), - &reference.compressed_correct_read2, + &reference.inline_compressed_read2, + )?; + + temp_dir.close()?; + Ok(()) +} + +#[test] +fn external_underscore_delimiter() -> TestResult { + let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.read2) + .arg("--umi") + .arg(test_files.umi) + .arg("--delim") + .arg("_"); + + cmd.assert().success(); //further assertions have been tested in other tests + + temp_dir + .child("read1_with_UMIs.fq") + .assert(predicate::path::exists()); + + temp_dir + .child("read2_with_UMIs.fq") + .assert(predicate::path::exists()); + + let reference = test_output.unwrap(); + + verify_file_contents( + &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), + &reference.delim_underscore_read1, + )?; + + verify_file_contents( + &temp_dir.child("read2_with_UMIs.fq").to_path_buf(), + &reference.delim_underscore_read2, + )?; + + temp_dir.close()?; + Ok(()) +} + +// Not really a serious test, but one can also integrate the read sequence into the UMI header if needed ;-) + +#[test] +fn external_switch_umi_and_read2() -> TestResult { + let (mut cmd, temp_dir, test_files, test_output) = auxiliary::setup_integration_test(true); + cmd.arg("external") + .arg("--in") + .arg(test_files.read1) + .arg("--in2") + .arg(test_files.umi) + .arg("--umi") + .arg(test_files.read2); + + cmd.assert().success(); //further assertions have been tested in other tests + + temp_dir + .child("read1_with_UMIs.fq") + .assert(predicate::path::exists()); + + temp_dir + .child("umi_with_UMIs.fq") + .assert(predicate::path::exists()); + + let reference = test_output.unwrap(); + + verify_file_contents( + &temp_dir.child("read1_with_UMIs.fq").to_path_buf(), + &reference.umi_read2_switch_read1, + )?; + + verify_file_contents( + &temp_dir.child("umi_with_UMIs.fq").to_path_buf(), + &reference.umi_read2_switch_read2, )?; temp_dir.close()?; diff --git a/tests/integration_tests_main.rs b/tests/integration_tests_main.rs index cbe1b98..7eccb19 100644 --- a/tests/integration_tests_main.rs +++ b/tests/integration_tests_main.rs @@ -1,13 +1,12 @@ -use assert_cmd::prelude::*; +use assert_cmd::cargo::cargo_bin_cmd; use predicates::prelude::*; -use std::process::Command; #[path = "auxiliary.rs"] mod auxiliary; #[test] fn main_without_arguments_prints_help() { - let mut cmd = Command::cargo_bin(assert_cmd::crate_name!()).unwrap(); + let mut cmd = cargo_bin_cmd!(); // Clap prints help to stderr in this case, but to stdout with -h or --help. cmd.assert() .success() @@ -18,7 +17,7 @@ fn main_without_arguments_prints_help() { #[test] fn main_help_prints_help() { - let mut cmd = Command::cargo_bin(assert_cmd::crate_name!()).unwrap(); + let mut cmd = cargo_bin_cmd!(); // Clap prints help to stdout with -h or --help. for help in &["-h", "--help"] { diff --git a/tests/results/correct_read1.fq b/tests/results/header_correct_read1.fq similarity index 100% rename from tests/results/correct_read1.fq rename to tests/results/header_correct_read1.fq diff --git a/tests/results/correct_read1.fq.gz b/tests/results/header_correct_read1.fq.gz similarity index 100% rename from tests/results/correct_read1.fq.gz rename to tests/results/header_correct_read1.fq.gz diff --git a/tests/results/correct_read1_lvl9.fq.gz b/tests/results/header_correct_read1_lvl9.fq.gz similarity index 100% rename from tests/results/correct_read1_lvl9.fq.gz rename to tests/results/header_correct_read1_lvl9.fq.gz diff --git a/tests/results/correct_read2.fq b/tests/results/header_correct_read2.fq similarity index 100% rename from tests/results/correct_read2.fq rename to tests/results/header_correct_read2.fq diff --git a/tests/results/correct_read2.fq.gz b/tests/results/header_correct_read2.fq.gz similarity index 100% rename from tests/results/correct_read2.fq.gz rename to tests/results/header_correct_read2.fq.gz diff --git a/tests/results/correct_read2_lvl9.fq.gz b/tests/results/header_correct_read2_lvl9.fq.gz similarity index 100% rename from tests/results/correct_read2_lvl9.fq.gz rename to tests/results/header_correct_read2_lvl9.fq.gz diff --git a/tests/results/corrected_read1.fq b/tests/results/header_corrected_read1.fq similarity index 100% rename from tests/results/corrected_read1.fq rename to tests/results/header_corrected_read1.fq diff --git a/tests/results/corrected_read2.fq b/tests/results/header_corrected_read2.fq similarity index 100% rename from tests/results/corrected_read2.fq rename to tests/results/header_corrected_read2.fq diff --git a/tests/results/inline_correct_read1.fq b/tests/results/inline_correct_read1.fq new file mode 100644 index 0000000..fc389af --- /dev/null +++ b/tests/results/inline_correct_read1.fq @@ -0,0 +1,40 @@ +@SCILIFELAB:500:NGISTLM:1:1101:19994:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +CCTGAGACCAATCGCCGCCAGTTAAATAGCTTGCAAAATACGTGGCCTTATGGTTACAGTATGCCCATCGCAGTTCGCTACACGCAGGACGCTTTTTCACGTTCTGGTTGG ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:25581:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AGACATGACTAAAGTGCACCGCATGGAAATGAAGACGGCCATTAGCTGTACCATACTCAGGCACACAAAAATACTGATAGCAGTCGGCGTGTGAATCATTAGCCTTGCGAC ++ +:FFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31006:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TGGACGCACGTCTTTCTCCATTGCGTCGTGGCCTTGCTATTGACTCTACTGTAGACATTTTTACTTTTTATGTCCCTCATCGTCACGTTTATGGTGAACAGTGGATTAAGT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31620:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +GCCTAAACGGGCGTTCAGCAGCCAGCTTGCGGCAAAACTGCGTAACCGTCTTCTCTTTCTCTAAAAACCATTTTTCGTCCCCTTCGGGGCGGTGGTCTATAGTGTTATTAA ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31693:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AATTGAAGTGCACCTGTTTTACAGACACCTAAAGCTACATCGTCAACGTTATATTTTGATAGTTTGACGGTTAATGCTGGTAATGGTGGTTTTCTTCATTGCATTCAGATG ++ +FFFFF:FFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFF:FFFFFFFF:FFFFF:FFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:32832:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AACAACAGATCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGGGACGAAAAATGGTTTTTAGAGAACGAGAAGACGGTTACGCAGTTTTGCCGCAAGC ++ +FFFFFFF:FF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2320:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TCACTTATTTGATTTGGTCATTGGTAAAATACTGACCAGCCGTTTGAGCTTGAGTAAGCATTTGGCGCATAATCTCGGAAACCTGCTGTTGCTTGGAAAGATTGGTGTTTT ++ +:F:FFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2446:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +GATATGAGGTCGTTTTCCGCCTACTGCGACTAAAGAGATTCAGTACCTTAACGCTAAAGGTGCTTTGACTTATACCGATATTGCTGGCGACCCTGTTTTGTATGGCAACTT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:5249:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +CTAAATTGGTGAATGGCAGATTTAATACCAGCATCACCCATGCCTACAGTATTGTTATCGGTAGCAAGCACATCACCTTGAATGCCACCGGAGGCGGCTTTTTGACCGCCT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:10438:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TACCAAGGATTAACCGTCAAACTATCAAAATATAACGTTGACGATGTAGCTTTAGGTGTCTGTAAAACAGGTGCCGAAGAAGCTGGAGTAACAGAAGTGAGAACCAGCTTA ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/tests/results/inline_correct_read1.fq.gz b/tests/results/inline_correct_read1.fq.gz new file mode 100644 index 0000000..6c3cdd3 Binary files /dev/null and b/tests/results/inline_correct_read1.fq.gz differ diff --git a/tests/results/inline_correct_read1_lvl9.fq.gz b/tests/results/inline_correct_read1_lvl9.fq.gz new file mode 100644 index 0000000..5b93ec4 Binary files /dev/null and b/tests/results/inline_correct_read1_lvl9.fq.gz differ diff --git a/tests/results/inline_correct_read2.fq b/tests/results/inline_correct_read2.fq new file mode 100644 index 0000000..cd2334c --- /dev/null +++ b/tests/results/inline_correct_read2.fq @@ -0,0 +1,40 @@ +@SCILIFELAB:500:NGISTLM:1:1101:19994:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +CCTGAGACCATCATAAAACGCCTCTAATCGGTCGTCAGCCAACGTGAGAGTGTCAAAAACGATAAACCAACCATCAGCATGAGCCTGTCGCATTGCATTCATCAAACGCTG ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFF:FFFF:FFFFF:FFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:25581:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +AGACATGACAAAGCCGCCTCCGGTGGCATTCAAGGTGATGTGCTTGCTACCGATAACAATACTGTAGGCATGGGTGATGCTGGTATTAAATCTGCCATTCAAGGCTCTAAT ++ +:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31006:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +TGGACGCACAACCAAATCAAGCAACTTATCAGAAACGGCAGAAGTGCCAGCCTGCAACGTACCTTCAAGAAGTCCTTTACCAGCTTTAGCCATAGCACCAGAAACAAAACT ++ +FFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFF:FFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31620:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +GCCTAAACGGTCGGGAGAGGAGTGGCATTAACACCATCCTTCATGAACTTAATCCACTGTTCACCATAAACGTGACGATGAGGGACATAAAAAGTAAAAATGTCTACAGTA ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31693:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +AATTGAAGTCACCTCACTTAAGTGGCTGGAGACAAATAATCTCTTTAATAACCTGATTCAGCGAAACCAATCCGCGGCATTTAGTAGCGGTAAAGTTAGACCAAACCATGA ++ +FFFFF:FFFF:FFFFF:FFFFFFFFFFFFFF::F:FFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFF:FFFFFF:FF:FFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:32832:1016 3:N:0:GCTTCAGGGT+AAGGTAGCGT +AACAACAGAAGGAAAGGATACTCGTTATTATCTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGGTTGACGCCGG ++ +FFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFF:,FFFFFFFFFFFFFFF: +@SCILIFELAB:500:NGISTLM:1:1101:2320:1031 3:N:0:GCTTCAGGGT+AAGGTAGCGT +TCACTTATTTTGGATACGCCAATCATTTTTATCGAAGCGCGCATAAATTTGAGCAGATTTGTCGTCACAGGTTGCGCCGCCAAAACGGCGGCTACAGTAACTTTTCCCAGC ++ +:F:FFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFF:FFFFFFFFFFFFF,FFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2446:1031 3:N:0:GCTTCAGGGT+AAGGTAGCGT +GATATGAGGGAGGTAAAACCTCTTATGACGCTGACAACCGTCCTTTACTTGTCATGCGCTCTAATCTCTGGGCATCTGGCTATGATGTTGATGGAACTGACCAAACGTCGT ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:5249:1031 3:N:0:GCTTCAGGGT+AAGGTAGCGT +CTAAATTGGGAATTGGCACAATGCTACAATGTGCTCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGGGACGAAAAATGGTTTTTAGAGAACGAGAAG ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:F,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF: +@SCILIFELAB:500:NGISTLM:1:1101:10438:1031 3:N:0:GCTTCAGGGT+AAGGTAGCGT +TACCAAGGAAATCGTTAGTTGATGGCGAAAGGTCGCAAAGTAAGAGCTTCTCGAACTGCGCAAGGATAGGTCGAATTTTCTCATTTTCCGCCAGCAGTCCACTTCGATTTA ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:F:,F:FFFFFFFFFFFF:FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/tests/results/inline_correct_read2.fq.gz b/tests/results/inline_correct_read2.fq.gz new file mode 100644 index 0000000..0950b7b Binary files /dev/null and b/tests/results/inline_correct_read2.fq.gz differ diff --git a/tests/results/inline_correct_read2_lvl9.fq.gz b/tests/results/inline_correct_read2_lvl9.fq.gz new file mode 100644 index 0000000..2a8d462 Binary files /dev/null and b/tests/results/inline_correct_read2_lvl9.fq.gz differ diff --git a/tests/results/inline_corrected_read1.fq b/tests/results/inline_corrected_read1.fq new file mode 100644 index 0000000..fc389af --- /dev/null +++ b/tests/results/inline_corrected_read1.fq @@ -0,0 +1,40 @@ +@SCILIFELAB:500:NGISTLM:1:1101:19994:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +CCTGAGACCAATCGCCGCCAGTTAAATAGCTTGCAAAATACGTGGCCTTATGGTTACAGTATGCCCATCGCAGTTCGCTACACGCAGGACGCTTTTTCACGTTCTGGTTGG ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:25581:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AGACATGACTAAAGTGCACCGCATGGAAATGAAGACGGCCATTAGCTGTACCATACTCAGGCACACAAAAATACTGATAGCAGTCGGCGTGTGAATCATTAGCCTTGCGAC ++ +:FFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31006:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TGGACGCACGTCTTTCTCCATTGCGTCGTGGCCTTGCTATTGACTCTACTGTAGACATTTTTACTTTTTATGTCCCTCATCGTCACGTTTATGGTGAACAGTGGATTAAGT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31620:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +GCCTAAACGGGCGTTCAGCAGCCAGCTTGCGGCAAAACTGCGTAACCGTCTTCTCTTTCTCTAAAAACCATTTTTCGTCCCCTTCGGGGCGGTGGTCTATAGTGTTATTAA ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31693:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AATTGAAGTGCACCTGTTTTACAGACACCTAAAGCTACATCGTCAACGTTATATTTTGATAGTTTGACGGTTAATGCTGGTAATGGTGGTTTTCTTCATTGCATTCAGATG ++ +FFFFF:FFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFF:FFFFFFFF:FFFFF:FFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:32832:1016 1:N:0:GCTTCAGGGT+AAGGTAGCGT +AACAACAGATCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGGGACGAAAAATGGTTTTTAGAGAACGAGAAGACGGTTACGCAGTTTTGCCGCAAGC ++ +FFFFFFF:FF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2320:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TCACTTATTTGATTTGGTCATTGGTAAAATACTGACCAGCCGTTTGAGCTTGAGTAAGCATTTGGCGCATAATCTCGGAAACCTGCTGTTGCTTGGAAAGATTGGTGTTTT ++ +:F:FFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2446:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +GATATGAGGTCGTTTTCCGCCTACTGCGACTAAAGAGATTCAGTACCTTAACGCTAAAGGTGCTTTGACTTATACCGATATTGCTGGCGACCCTGTTTTGTATGGCAACTT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:5249:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +CTAAATTGGTGAATGGCAGATTTAATACCAGCATCACCCATGCCTACAGTATTGTTATCGGTAGCAAGCACATCACCTTGAATGCCACCGGAGGCGGCTTTTTGACCGCCT ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:10438:1031 1:N:0:GCTTCAGGGT+AAGGTAGCGT +TACCAAGGATTAACCGTCAAACTATCAAAATATAACGTTGACGATGTAGCTTTAGGTGTCTGTAAAACAGGTGCCGAAGAAGCTGGAGTAACAGAAGTGAGAACCAGCTTA ++ +FFFFFFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/tests/results/inline_corrected_read2.fq b/tests/results/inline_corrected_read2.fq new file mode 100644 index 0000000..ac4143f --- /dev/null +++ b/tests/results/inline_corrected_read2.fq @@ -0,0 +1,40 @@ +@SCILIFELAB:500:NGISTLM:1:1101:19994:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +CCTGAGACCATCATAAAACGCCTCTAATCGGTCGTCAGCCAACGTGAGAGTGTCAAAAACGATAAACCAACCATCAGCATGAGCCTGTCGCATTGCATTCATCAAACGCTG ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFF:FFFF:FFFFF:FFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:25581:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +AGACATGACAAAGCCGCCTCCGGTGGCATTCAAGGTGATGTGCTTGCTACCGATAACAATACTGTAGGCATGGGTGATGCTGGTATTAAATCTGCCATTCAAGGCTCTAAT ++ +:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31006:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +TGGACGCACAACCAAATCAAGCAACTTATCAGAAACGGCAGAAGTGCCAGCCTGCAACGTACCTTCAAGAAGTCCTTTACCAGCTTTAGCCATAGCACCAGAAACAAAACT ++ +FFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFF:FFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31620:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +GCCTAAACGGTCGGGAGAGGAGTGGCATTAACACCATCCTTCATGAACTTAATCCACTGTTCACCATAAACGTGACGATGAGGGACATAAAAAGTAAAAATGTCTACAGTA ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:31693:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +AATTGAAGTCACCTCACTTAAGTGGCTGGAGACAAATAATCTCTTTAATAACCTGATTCAGCGAAACCAATCCGCGGCATTTAGTAGCGGTAAAGTTAGACCAAACCATGA ++ +FFFFF:FFFF:FFFFF:FFFFFFFFFFFFFF::F:FFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFF:FFFFFF:FF:FFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:32832:1016 2:N:0:GCTTCAGGGT+AAGGTAGCGT +AACAACAGAAGGAAAGGATACTCGTTATTATCTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGGTTGACGCCGG ++ +FFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFF:,FFFFFFFFFFFFFFF: +@SCILIFELAB:500:NGISTLM:1:1101:2320:1031 2:N:0:GCTTCAGGGT+AAGGTAGCGT +TCACTTATTTTGGATACGCCAATCATTTTTATCGAAGCGCGCATAAATTTGAGCAGATTTGTCGTCACAGGTTGCGCCGCCAAAACGGCGGCTACAGTAACTTTTCCCAGC ++ +:F:FFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFF:FFFFFFFFFFFFF,FFFFF +@SCILIFELAB:500:NGISTLM:1:1101:2446:1031 2:N:0:GCTTCAGGGT+AAGGTAGCGT +GATATGAGGGAGGTAAAACCTCTTATGACGCTGACAACCGTCCTTTACTTGTCATGCGCTCTAATCTCTGGGCATCTGGCTATGATGTTGATGGAACTGACCAAACGTCGT ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +@SCILIFELAB:500:NGISTLM:1:1101:5249:1031 2:N:0:GCTTCAGGGT+AAGGTAGCGT +CTAAATTGGGAATTGGCACAATGCTACAATGTGCTCCCCCAACTTGATATTAATAACACTATAGACCACCGCCCCGAAGGGGACGAAAAATGGTTTTTAGAGAACGAGAAG ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:F,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF: +@SCILIFELAB:500:NGISTLM:1:1101:10438:1031 2:N:0:GCTTCAGGGT+AAGGTAGCGT +TACCAAGGAAATCGTTAGTTGATGGCGAAAGGTCGCAAAGTAAGAGCTTCTCGAACTGCGCAAGGATAGGTCGAATTTTCTCATTTTCCGCCAGCAGTCCACTTCGATTTA ++ +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:F:,F:FFFFFFFFFFFF:FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF