<pre style='margin:0'>
Zhenfu Shi (i0ntempest) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/a90dca6a8f0a70d91a72c7dc112e805b03b29828">https://github.com/macports/macports-ports/commit/a90dca6a8f0a70d91a72c7dc112e805b03b29828</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new a90dca6a8f0 filebrowser: update to 2.32.1
</span>a90dca6a8f0 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit a90dca6a8f0a70d91a72c7dc112e805b03b29828
</span>Author: i0ntempest <i0ntempest@i0ntempest.com>
AuthorDate: Tue Jun 17 04:46:48 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    filebrowser: update to 2.32.1
</span>---
 net/filebrowser/Portfile              | 304 ++++++++++++++----------------
 net/filebrowser/files/patch-3676.diff | 123 -------------
 net/filebrowser/files/patch-3899.diff | 337 ++++++++++++++++++++++++++++++++++
 3 files changed, 475 insertions(+), 289 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/Portfile b/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 5d07a945526..042e8017720 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3,12 +3,10 @@
</span> PortSystem          1.0
 PortGroup           golang 1.0
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-go.setup            github.com/filebrowser/filebrowser 2.32.0 v
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Delete this on next update to use golang PortGroup's default ('archive')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-github.tarball_from tarball
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-set git-commit      3d6c515
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+go.setup            github.com/filebrowser/filebrowser 2.32.1 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set git-commit      56a0f92
</span> # This line is for displaying commit in CLI only
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            0
</span> categories          net sysutils
 maintainers         {i0ntempest @i0ntempest} openmaintainer
 license             Apache-2
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -22,9 +20,9 @@ long_description    filebrowser provides a file managing interface within a spec
</span> homepage            https://filebrowser.org
 
 checksums           ${distname}${extract.suffix} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  8dfd7b54cd51e79b5db87fb6a4a7b9f208309b5b \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  7bc0aa6f44994f1582cdb06f8dd6da3802af5881a2e3120bf780ed030e2cb37d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    3817808
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  b76b601d2568e935fdcf1959d9b921f1e221b9fc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  d2ce22f90f62f4b60703e6314d45323c906bf7b9d53748974284078bd6030513 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    3825174
</span> 
 go.vendors          gopkg.in/yaml.v3 \
                         lock    v3.0.1 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -41,63 +39,47 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         rmd160  8c8f0fe65acca516cbc84ba6c61a9b02e470df64 \
                         sha256  32f0b88971fbfef73e416def181ef5320c225c59ea2b2446c05a46ac1d7f3ff6 \
                         size    12570 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    gopkg.in/ini.v1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.67.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  4aa285a6719b0bb909b12bb70cb08cdf66ffeff3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  596cc2f7a771b35a1d308449ee2e3f96a79f834dd6d8d3c863c0fff321f70777 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    53538 \
</span>                     gopkg.in/check.v1 \
                         lock    10cb98267c6c \
                         rmd160  465dcadb97762c84da6fb5f6d8352abe10445817 \
                         sha256  98ec7bd0dc7d4bcee7dcafe02efab29f14dc392f43b227e517beef064e9b6369 \
                         size    32368 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    google.golang.org/protobuf \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        repo    github.com/protocolbuffers/protobuf-go \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.33.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  90cb1b10a1c9bd4a0b39a50a3fb053ed1b307ba2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  3e83377cfad949db670d49836a1580cdac30e2325603efb8721288dc24230fd1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1482916 \
</span>                     google.golang.org/appengine \
                         repo    github.com/golang/appengine \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.6.8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  ae71ed03d1b453ad1561ef937c69a909da53525e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  add6a354e7031705b39bdb1795ca064107038011f060460a23001dd339b41aac \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    628767 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.6.5 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  07930ae377345a90ef1f84200cdb2c292b192c60 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  544d882b8fc91ac0813e239d9602034bae8d9b5b7fd1e5872323680a4f493bdd \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    332918 \
</span>                     golang.org/x/text \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.21.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  0a0d95c777a2df3108c79f5a23de3c226ad84d06 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  de16b0463799b320acfa2707e154091015d4b25dbaae866a8fc9bf2f72d67b5c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    8976785 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.26.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  f95d1144ef4d29234a1a145bae7914967a9bd4d3 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  8307a017f45d8b5e431f61d2a4c6674637c7b7d19d81683651cb7bfdd66cd68a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    8974692 \
</span>                     golang.org/x/sys \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.28.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  6afc12ada3ca9173b9f8ba2c66caf3dbf0ac7929 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  aa8ba4cd13aa5d7f839d604e002d2c994e6dfc09c3746f532bf69fc64617869c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1520294 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.33.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  1c0c8967ed410be496af17ad009aacd0fb89034c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  2564f2911a5c695a9ad5720065ce58783b97a2d2f3fdaa2e8742a44fc0df4e2e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    1529295 \
</span>                     golang.org/x/sync \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.10.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  3cdb4e0e41894bd4f102154d7e193423451c64c6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  0318693e1204134ef8d4110f1fd961fd0273ff4d59874c542d8b4739236bebfe \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    18107 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.15.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  1342ee64fa5d1091711e74723054b9fd0925760b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  e626d394502b207c5bd969e2433d5ec7407185edd9a9cb5dc6d76d6de73dfe6d \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    18714 \
</span>                     golang.org/x/net \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.33.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  c1974416a5379a87b032076f82d4353929b7cf30 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  c9edb767d02ea972c474508028e90d8c2b19a075f89697dbe787860f8dba3aa2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1466556 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.41.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  8290aa7aad119f865afebfbf796d176090785e8a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  1be1575ac262c68e106117084099488a69a1a9cb8dd75a799c3115781c34e0ad \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    1504649 \
</span>                     golang.org/x/image \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.19.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  e8d527797fe92eee70673ece17aa9a11c371108f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  e83fc8ef722c0aec257b26029ee693dc0c3f507c04717f6b0ea0c88b2e23b5cb \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    5104337 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    golang.org/x/exp \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    a685a6edb6d8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  68375df460486d2105cfb8be1e739f3e856bd75a \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  54961fbc9af33753e5866ef4bbe39b9c9b6328e6816467f0c0a8979aa12714cd \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1743889 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.28.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  95e07b7bdb208bd73875c110a3b62862ff12743c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  c4a853e8fadc53e62e5bd7a9ba9ed8c06ed33b68ff58556cfc15f4c14cab1179 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    5104269 \
</span>                     golang.org/x/crypto \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.31.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  ccd79163c4c288444622b7e39560353ba8caef9a \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  8c60e95193c8a72264fef36dc5f6a23e69c9a5948680829fcfbe9d28030f9dca \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1837747 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.39.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  15797b18fa1bd1dbb472844ae933e094251df727 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  356c81c31cdef4e15417b04d66837eff7383202a6fd048c8a8591e9655ed6bdc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    2158789 \
</span>                     go.uber.org/multierr \
                         repo    github.com/uber-go/multierr \
                         lock    v1.11.0 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -106,15 +88,20 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         size    16914 \
                     go.etcd.io/bbolt \
                         repo    github.com/etcd-io/bbolt \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.3.11 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  b9744d4aa7c5dad797c0737425edb4ee2a95e330 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  0fb7d28fd99a20cc8a993f9d444f609c43a88a5362369350a4b7140a4eb94212 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    133730 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.4.1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  7336c63c35f6bdc007e9c450e1c517fad201211a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  75fe7368ee68f0228d8f53097504267f669e2b5a151211e30de06be6a62095a3 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    169080 \
</span>                     github.com/yusufpapurcu/wmi \
                         lock    v1.2.4 \
                         rmd160  23599ad98727cca3e1678e909a1014e212d41fc7 \
                         sha256  05d3cee4c74f456174ea5538ee95fba675aeb520fd7bdd3872860a3c7dcafa11 \
                         size    12672 \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    github.com/xyproto/randomstring \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.0.5 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  219c61e199d6c55c9bdabaa3072295a323f09c45 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  fc2b38b4964bf4744e1012c3fcec1da24949f5a262e72b2dfb59933d923daff2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    3320 \
</span>                     github.com/xi2/xz \
                         lock    48954b6210f8 \
                         rmd160  80381ccf17a6eddadd49295e261f99955444f73e \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -126,10 +113,10 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         sha256  fc5a47cf9572def5c376f25f031722819a218db68dc2c015bcda2398a29dc9a9 \
                         size    26969 \
                     github.com/ulikunitz/xz \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.5.11 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  9cb92430df749360c976374df6f2fcf13813aa80 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  4093c9405de9126b0053ddb68a0a02ec829646cba3e38e99405eb6b1d44bef94 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    4175522 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.5.12 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  923ba7590d3cca4de73ce2e9ef67c95ee58ec043 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  95db3e60ec33a8d9c8aa67f2e73a9d7680d52386dc9f132f0caf0815862a53ae \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    4176123 \
</span>                     github.com/tomasen/realip \
                         lock    f0c99a92ddce \
                         rmd160  9647d37dc83d15756eb5b168b44370311bea8e69 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -141,35 +128,35 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         sha256  b5890171316a97614d5a45363350e9c575dfc61ec8249742e68ae97ca21a444c \
                         size    11487 \
                     github.com/stretchr/testify \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.9.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  59147e117812fdf8270ec79e46a229c472caf08d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  e6fa4f530cad5bac94bf08af05ddd1f569aeac8db4017ab4330ab7fe2802a6a3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    108716 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.10.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  43f142561513d8f10ce4971bf91cabbad9a021cc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  be33d85711f2b92b7269a39574af64701ed5b2c4e4446547ea75ea046ec97629 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    112769 \
</span>                     github.com/spf13/viper \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.19.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  861b8da090b8900d258ad1d4da88d76d9e1afd10 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  d620ccd5e018ddc391a663d740d7429926c1b3eb9daeea236c6658123cdd2e75 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    120005 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.20.1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  ad1e5c723ee41b23fa2ab15e419ba9522c74b468 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  511becd403b332ebdfa4f43ab2b7d25e9d567a6b4c7a5bba247a8e28102f09eb \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    122252 \
</span>                     github.com/spf13/pflag \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.0.5 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  2ce81608a38c6f383a35bccd24d64361df5828c9 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  7f41acdcba65b1fab5b9b633947a139f9915b60f94bdab486cdbe9d90c54f61e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    50815 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.0.6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  71c96f5c72e1ec15157e4dd6438e69f717bd7b99 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  296b98eebe4fd4b6435afbb05a93ffd4e4cb20a54ab128f633b21cfac9f136e1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    52859 \
</span>                     github.com/spf13/cobra \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.8.1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  a735ec73fa26b66076a971e066513fff3eb7e367 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  49ca05093e0452e1b56be8a0765e23fd74be819228f0e1870c759b2e2e8178da \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    192387 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.9.1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  95925251f62ff042108f882129779eae809a9a8c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  33dec62c9ce9622184102f590c5c97e4b6aaa6341510b3defc21c1266b31f057 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    197845 \
</span>                     github.com/spf13/cast \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.6.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  c7d5bf6b598bcc91b9d56ada428f3bf8ef33e9c4 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  cd5a5e7af2e781c1fe837d31d0abad184a2858d40c702df8ba5955d86959e047 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    15629 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.9.2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  82408f9af9df6fdef7b2d17a6708f4244f4235d1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  41a899e9f36abcea37dbeb842ebf34986cd75347dfd52f8ae376786497a9d884 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    24199 \
</span>                     github.com/spf13/afero \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.11.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  a986da1741dfe513ea0a0edaed3b2961e7a06069 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  f8c35597e31410563e80730100f8bb615e359ad931a9214787feefa4085d48b6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    89254 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.14.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  95180c509220d8ffdd6cfd9f9ca708ae3be7b1a5 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  880c030de2ca2e4652a6d6cb3e17b14fe9a096077c8f0b5858bad0bfdca279f5 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    93470 \
</span>                     github.com/sourcegraph/conc \
                         lock    v0.3.0 \
                         rmd160  79458f4b5d9aca51fc58e3b3d31b54971169040b \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -180,51 +167,41 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         rmd160  5638720e2b30a7c322db690649df0c2aca5f196c \
                         sha256  d04073089f696418942a30d8cb4878e9709e79ffcfb92f1f61ba92d7bba56cc5 \
                         size    185793 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    github.com/sagikazarmark/slog-shim \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.1.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  b83db4c4f465c978a6239aeee1afe2d8ecf97353 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  53509e3267df1338fad356fa43949af957d12ba2267ec1410f498569a1866cd8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    10882 \
</span>                     github.com/sagikazarmark/locafero \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.4.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  61bc7c899fa9b193d92e2dade0894e25cd1c1d41 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  7056ea0cdb195b98b9f26d4f6aba77c73a6f7882a4f1e40c3926460a605814cb \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    9698 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.9.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  d9ce8795094d1b58cfa1b341ce18517d26aea038 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  fc5bab4edcddad796fcfd48b95f009c6750e6a1dffedc3ccb68cc4366f33f43a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    11070 \
</span>                     github.com/rogpeppe/go-internal \
                         lock    v1.9.0 \
                         rmd160  acb8f644e5634bdae632cdb61ea736422aeb88f0 \
                         sha256  65b0852e5c78fa920fef2176fa17180bf1f7f32a1163baacb44c2aa480845a16 \
                         size    133682 \
                     github.com/power-devops/perfstat \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    5aafc221ea8c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  1c4f659015f1a59d261a493397534436ccb6a608 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  617a974b1f9c38ac9fd958a8cc80c14aaf083906691dda43d642c0ef12611047 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    36009 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    82ca36839d55 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  7eee6195706388727dc34c06a62b383e4bf2461a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  412cdaaa4dc915dd407ca0f53cd7875df7b10d886984d24d563db466d733b07f \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    37883 \
</span>                     github.com/pmezard/go-difflib \
                         lock    5d4384ee4fb2 \
                         rmd160  18b381fb63f46047dcc373a07a40e026b1ce1732 \
                         sha256  64935467335b4dff1a510bc726473b9f97124ca6be3fe74c9c2382b0ff6675aa \
                         size    11401 \
                     github.com/pierrec/lz4 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v4.1.21 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  27bb411cfaae6451401eb103bed71066ce6996c6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  6e54bf8b08deda511f146588b574c5dfae219e5a946a75d6fdc2c4c2fe6a02f6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    40916306 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v4.1.22 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  6936dabff92b21b67cd3879e828099d76628eacc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  24a523681fcfcda7b460be6fa2e1c43cd64fed0fe5e0c0f75b58456a2aeff679 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    40916276 \
</span>                     github.com/pelletier/go-toml \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v2.2.3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  7384ee006e116df0c6a5437d4da3520fd2aac16b \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  34218ff07934e45ca6968d1f1052e94c8ed969268ebef9e8c260152c549d3ca1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    909291 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v2.2.4 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  c6b4175dbd349733e98c60281e26019a058414e4 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  490e728a2d923c63d04783a021b5727545f032979233b0bc6b4e20959e35614d \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    910386 \
</span>                     github.com/nwaples/rardecode \
                         lock    v1.1.3 \
                         rmd160  d1d0070297695bc0197a4d9dd67b5b5927570a99 \
                         sha256  a50747a94b7784007b06b49d0cc693997576d4fe014bc223332af0474879403e \
                         size    34487 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    github.com/mitchellh/mapstructure \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.5.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  c838fb22a642081963c8e6f236cdd4c6000bfaf4 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  bd695f63e58f35f07aac6883ac5dc53d44db6cf24caa53efaadcf0842d03d762 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    30135 \
</span>                     github.com/mitchellh/go-homedir \
                         lock    v1.1.0 \
                         rmd160  44b3985e40e5bbb22d11f8622c340f9ed727ea91 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -245,11 +222,6 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         rmd160  3d250ed7f6f152a6fa430deb82b6990c6412b7f7 \
                         sha256  ae8a1de236bfabd95fcf5cf90deaa40db6527683b6dd8be6c17605d8619a6578 \
                         size    9187 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    github.com/magiconair/properties \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.8.7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  df6e5639d11fcd7db0638153e247235b1cf17eb8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  494b9c870a97ffc3b9377280412ab0c5afff549d109b28d484b02ced07713656 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    31419 \
</span>                     github.com/kr/text \
                         lock    v0.2.0 \
                         rmd160  48558c7e8ff67d510f83c66883907e95f4783163 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -266,20 +238,15 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         sha256  74a375eafe83f302924d00ad5a59825b12e3f325e992f300e421ede9ada1c608 \
                         size    125971 \
                     github.com/klauspost/compress \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.17.7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  da60fe5ca4f98c11015a4b50f91a921266b661e3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  b87d2f4625256fbc2239542d0bbfefb6490ee5a11be922adac649224092758f6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    38745775 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.18.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  641294afaa0766e028b582ef93f027997e6b795a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  9953494099d6853773afd56ccbcc8d4928b537ad30e475983524a7a0fc87e180 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    39079077 \
</span>                     github.com/inconshreveable/mousetrap \
                         lock    v1.1.0 \
                         rmd160  88f9577df93ac0f8801d8960adc7f28e38867f3e \
                         sha256  f69af10ff08c0e87f92dac3ee5172d8ed02463725b74edfc8943ef018a1a632d \
                         size    5343 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    github.com/hashicorp/hcl \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.0.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  ad8d0b523bb708fd6ae77df8bb414c103a75aa92 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  4fc0e87ac9d3d6cd042f044df2db2703bed569051fb8c179d505edeb4433e96e \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    70636 \
</span>                     github.com/gorilla/websocket \
                         lock    v1.5.3 \
                         rmd160  3c38c85e08c20fe93c0100bf884feb8fe45fbaed \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -291,45 +258,50 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         sha256  55f5c50f77a44031da4bae5e5725a301a36a6072e42139e55afc606d631848fe \
                         size    47042 \
                     github.com/google/go-cmp \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.6.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  2c9f5dab93f8a0895591466fe4a07c5dd9166ae2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  0d550825fae514f8a947ab7e42fcb874f509d9cbfa3ad2711d7570a25f31571a \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    104795 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.7.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  3f04a79c291d786f9c69c2944bdd521402052a5c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  b621b304b529134076c9ebe09343aea7add039cd98e68be7e5a616245b0c3d03 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    105180 \
</span>                     github.com/golang/snappy \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.0.4 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  23c095b7e2bc6f5a978d771e4ecc9f7b0f204491 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  6a2d69e63124670c8b8105fb34d32f3f34f6816f93bf5a6e28f85c428c5b40ae \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    66136 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.0.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  ecac40a18983ad6c8eae67112d4786a5a1171498 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  c67f26cd4d8e5fe382f9ce4e6d8cfd76d4e43383986b7f9fd9539efe3e842dd2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    66178 \
</span>                     github.com/golang/protobuf \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.5.3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  b4e09ad842f6dcd3aea36b28ec64d6d9563fd1d8 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  12e830fab630cabd279fca57e7089eeb1556e2c22b58eee64bb21bd3c8dfc706 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    171856 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.3.2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  c22496279cf6fc64781561cd1b5fef34e0ea61b8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  e467fab2ce26db4265fa0695b13d07fe825391023f7a02d5945a0f0b0913abe7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    312331 \
</span>                     github.com/golang/geo \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    6adc56603217 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  6b82cc5b25b1133b3f97415c80aa976933ccea8c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  39c685a625c4d92d0b4e4f4d9ba3ca021e61fb936a9575b9ec0e647607fdf5db \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    405608 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    e8fe6a72b492 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  18a6dd1ed8ee0b9ceca5e4a7a0e4bf75d8e21b98 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  6f660410300452279f46785e84a6bf6f5ea5c0c3baf75dec35ea355aa5fcc1d6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    436352 \
</span>                     github.com/golang-jwt/jwt \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v4.5.1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  b1e36c30230836225a5b5474286ebf492ec6f577 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  6f5cb4c2a76ad59f9d0aa6d3a4287b2fcf97309b6961c5e73a3e11a5dfc6126c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    53190 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v4.5.2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  6c674eb7c301b3b9cbc314c0645410374472feaa \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  9fc1ab8e5c8a9d80c9d0d99778e168211203f630fa82771daefee00723b55927 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    54035 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    github.com/go-viper/mapstructure \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v2.2.1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  686e57890f8c0d187bbbd63eaa22c2ef697b9848 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  40edcee009e5363289c1218e47160c0dde4ff6e20d8ec6c337ff687788ec0946 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    42354 \
</span>                     github.com/go-ole/go-ole \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.2.6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  70350a72faa92597facb55379e481ea049bb57da \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  d818d3dab064c4f8f2be9460353318207f58d562f874d06c0bff91cd423dc2af \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    52614 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.3.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  7080182feca14a6bea1be4e854c1e4c82415c366 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  7520bd87b1d52a28b98c5fa4243338c5c7cf5185fdd058f55ff6d670c455b13e \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    53295 \
</span>                     github.com/go-errors/errors \
                         lock    v1.5.1 \
                         rmd160  c523ee868f3f64919429a97f824a60fabaf7db72 \
                         sha256  1256e22b062196c40b171026ee77aeff9229c47aa609583e0eb2b5d3dd57459e \
                         size    9918 \
                     github.com/fsnotify/fsnotify \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.7.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  9198dec094f5008a8b24a2e51542ce4ec3453162 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  d7cd46fbc8e25bfd37edb1b86851dcccc18c5180f09e533c6a35e4dcf2693d22 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    57508 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.9.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  24b514b003e8a613b938e13f7df3ba60dc755499 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  46aaaf931594e32ce1e087da58dc8d3e27f0e34eaca38a9280f6c10a198d4166 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    73949 \
</span>                     github.com/frankban/quicktest \
                         lock    v1.14.6 \
                         rmd160  d517a6cb2f6acc7f969c9ed49f464014a717bf98 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -376,25 +348,25 @@ go.vendors          gopkg.in/yaml.v3 \
</span>                         sha256  cf4a32e1985c30b326c335bcb57f24888654b1779317d9655a269ce2eb33c9a9 \
                         size    3117747 \
                     github.com/asticode/go-astisub \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.26.2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  ec6efb703a0d8cf5bc149238fb0f5f3c3268f14d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  fa0e02d7c5b604b0c88e7f555a7379f4a8c6d9a535969a5f3106db4f7a41e372 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    57269 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.34.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  ab47d019e39f107b24caedb09d1df41029a76b7c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  9e216830ce4ac74aef4e2ea49d7886f16b05e08cbaafce977f0d91b82773b74b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    65392 \
</span>                     github.com/asticode/go-astikit \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v0.42.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  af02900c1a200a8c35154ec7c6498273d9e4943f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  f4bbef89bee002dfe49a22332bb6b5dcc6fe73909b598c5f3e11f9522c109bb0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    43362 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v0.55.0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  513f7530552d6ad2e3ff4acaec088d1153506059 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  d09c07a78e638f0e9a18f327ab9620edf73ae80105e51adac85b7c0ccce4e6bf \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    54385 \
</span>                     github.com/asdine/storm \
                         lock    v3.2.1 \
                         rmd160  47eaabb9d1c7327074b06f42d7ea73b91f4e2dcf \
                         sha256  440de0ffdfd90c4234ebcb3a4bbf402311c353b7a8bdda5c58b7505f711bb299 \
                         size    47935 \
                     github.com/andybalholm/brotli \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lock    v1.1.0 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rmd160  4f8222020fa54dc66777c4e4a0fe1fb07c7c259f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        sha256  bf3abe06923abdba49cdbb0c8e214221a68a93632a24fd108dcece4e68f2bb8c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size    1829161 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lock    v1.1.1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        rmd160  56c173e94626705724e79a88604d952c26a2b28a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  50c0f53cfbc81248fc705f771cc166a4c3efbb2608bdda9c620e46ee6456a9e6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    1829535 \
</span>                     github.com/Sereal/Sereal \
                         lock    0b8ac451a863 \
                         rmd160  30ae87dc25e4976aabc8dc8ce74dc2fa6023aed3 \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -411,8 +383,8 @@ go.vendors          gopkg.in/yaml.v3 \
</span> 
 # Context menu: https://github.com/filebrowser/filebrowser/pull/3343
 patchfiles-append   patch-3343.diff
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Command runner fixes: https://github.com/filebrowser/filebrowser/pull/3676
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles-append   patch-3676.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Command runner fixes: https://github.com/filebrowser/filebrowser/pull/3899
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append   patch-3899.diff
</span> patch.args          -p1
 
 depends_build-append \
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/files/patch-3676.diff b/net/filebrowser/files/patch-3676.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 9ec18c47c80..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/filebrowser/files/patch-3676.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,123 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/cmd/utils.go b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 78f48d1307..a8ab19361a 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -194,7 +194,7 @@ func convertCmdStrToCmdArray(cmd string) []string {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   var cmdArray []string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   trimmedCmdStr := strings.TrimSpace(cmd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if trimmedCmdStr != "" {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          cmdArray = strings.Split(trimmedCmdStr, " ")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          cmdArray = strings.Split(trimmedCmdStr, ",")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   return cmdArray
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/http/tus_handlers.go b/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 7a3254ae72..773b3d0d88 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -131,6 +131,13 @@ func tusPatchHandler() handleFunc {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if uploadOffset == 0 {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  err = d.RunBeforeHook("upload", r.URL.Path, "", d.user)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          return errToStatus(err), err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           openFile, err := d.user.Fs.OpenFile(r.URL.Path, os.O_WRONLY|os.O_APPEND, files.PermFile)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   return http.StatusInternalServerError, fmt.Errorf("could not open file: %w", err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -150,6 +157,13 @@ func tusPatchHandler() handleFunc {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           w.Header().Set("Upload-Offset", strconv.FormatInt(uploadOffset+bytesWritten, 10))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if bytesWritten < int64(d.Settings.Tus.ChunkSize) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  err = d.RunAfterHook("upload", r.URL.Path, "", d.user)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          return errToStatus(err), err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           return http.StatusNoContent, nil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   })
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/runner/parser.go b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 6fd64a4b64..8161a6e543 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/runner/parser.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -8,7 +8,7 @@ import (
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // ParseCommand parses the command taking in account if the current
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // instance uses a shell to run the commands or just calls the binary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--// directyly.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// directly.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   var command []string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -26,7 +26,19 @@ func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          command = append(s.Shell, raw) //nolint:gocritic
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          cmd, args, err := SplitCommandAndArgs(s.Shell[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  return nil, err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          _, err = exec.LookPath(cmd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  return nil, err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          command = append(command, raw)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   return command, nil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/runner/runner.go b/runner/runner.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2dbafa5cd1..829e591020 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/runner/runner.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/runner/runner.go
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -17,6 +17,39 @@ type Runner struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   *settings.Settings
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// RunBeforeHook and RunAfterHook trigger the command runner at their respective times.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+func (r *Runner) RunBeforeHook(evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  path = user.FullPath(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  dst = user.FullPath(dst)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if r.Enabled {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if val, ok := r.Commands["before_"+evt]; ok {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  for _, command := range val {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          err := r.exec(command, "before_"+evt, path, dst, user)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  return err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  return nil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+func (r *Runner) RunAfterHook(evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  path = user.FullPath(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  dst = user.FullPath(dst)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if r.Enabled {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          if val, ok := r.Commands["after_"+evt]; ok {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  for _, command := range val {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          err := r.exec(command, "after_"+evt, path, dst, user)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          if err != nil {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  return err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  return nil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // RunHook runs the hooks for the before and after event.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- func (r *Runner) RunHook(fn func() error, evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   path = user.FullPath(path)
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/filebrowser/files/patch-3899.diff b/net/filebrowser/files/patch-3899.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..53a50299617
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/filebrowser/files/patch-3899.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,337 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/config.go b/cmd/config.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index de55c28e50..3d3f425583 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/config.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/config.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -145,7 +145,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintf(w, "Create User Dir:\t%t\n", set.CreateUserDir)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintf(w, "Auth method:\t%s\n", set.AuthMethod)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  fmt.Fprintf(w, "Shell:\t%s\t\n", strings.Join(set.Shell, " "))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  fmt.Fprintf(w, "Shell:\t%s\t\n", set.Shell)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintln(w, "\nBranding:")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fmt.Fprintf(w, "\tFiles override:\t%s\n", set.Branding.Files)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/config_init.go b/cmd/config_init.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 60a0f37b94..64934e2f5f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/config_init.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/config_init.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -32,7 +32,7 @@ override the options.`,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Key:           generateKey(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Signup:        mustGetBool(flags, "signup"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   CreateUserDir: mustGetBool(flags, "create-user-dir"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  Shell:         convertCmdStrToCmdArray(mustGetString(flags, "shell")),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  Shell:         mustGetString(flags, "shell"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   AuthMethod:    authMethod,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Defaults:      defaults,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Branding: settings.Branding{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/config_set.go b/cmd/config_set.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 23ff7e1bb2..40d228c133 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/config_set.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/config_set.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,7 +48,7 @@ you want to change. Other options will remain unchanged.`,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   case "auth.method":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           hasAuth = true
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   case "shell":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          set.Shell = mustGetString(flags, flag.Name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   case "create-user-dir":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           set.CreateUserDir = mustGetBool(flags, flag.Name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   case "branding.name":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/root.go b/cmd/root.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 59329c5cfe..b484212573 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/root.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/root.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -344,7 +344,7 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   RetryCount: settings.DefaultTusRetryCount,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Commands: nil,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          Shell:    nil,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          Shell:    "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Rules:    nil,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/cmd/utils.go b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 78f48d1307..b3b0374299 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/cmd/utils.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -186,15 +186,3 @@ func cleanUpMapValue(v interface{}) interface{} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// convertCmdStrToCmdArray checks if cmd string is blank (whitespace included)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// then returns empty string array, else returns the split word array of cmd.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// This is to ensure the result will never be []string{""}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-func convertCmdStrToCmdArray(cmd string) []string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  var cmdArray []string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  trimmedCmdStr := strings.TrimSpace(cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if trimmedCmdStr != "" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          cmdArray = strings.Split(trimmedCmdStr, " ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return cmdArray
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/types/settings.d.ts b/frontend/src/types/settings.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a2c19f7632..d16c7b3515 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/types/settings.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/types/settings.d.ts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6,7 +6,7 @@ interface ISettings {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   rules: any[];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   branding: SettingsBranding;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   tus: SettingsTus;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  shell: string[];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  shell: string;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   commands: SettingsCommand;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/frontend/src/views/settings/Global.vue b/frontend/src/views/settings/Global.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5bbaec7f4d..df6c6b1e93 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/frontend/src/views/settings/Global.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/frontend/src/views/settings/Global.vue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -296,12 +296,7 @@ const save = async () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (settings.value === null) return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const newSettings: ISettings = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ...settings.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    shell:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      settings.value?.shell
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        .join(" ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        .trim()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        .split(" ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        .filter((s: string) => s !== "") ?? [],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    shell: settings.value?.shell?.trim() ?? "", // Change this to a string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     commands: {},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -309,7 +304,6 @@ const save = async () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     keyof SettingsCommand
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   >;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (const key of keys) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // not sure if we can safely assume non-null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const newValue = commandObject.value[key];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!newValue) continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +315,9 @@ const save = async () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         .filter((cmd: string) => cmd !== "");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  newSettings.shell = shellValue.value.split("\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Update this line to assign the string directly, without splitting
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  newSettings.shell = shellValue.value.trim();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (newSettings.branding.theme !== getTheme()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     setTheme(newSettings.branding.theme);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -386,7 +382,7 @@ onMounted(async () => {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     originalSettings.value = original;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     settings.value = newSettings;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    shellValue.value = newSettings.shell.join("\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    shellValue.value = newSettings.shell;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } catch (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (err instanceof Error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       error.value = err;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/http/settings.go b/http/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index de3f22adc8..81f3eee21f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/http/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/http/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -16,7 +16,7 @@ type settingsData struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Rules            []rules.Rule          `json:"rules"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Branding         settings.Branding     `json:"branding"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tus              settings.Tus          `json:"tus"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  Shell            []string              `json:"shell"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Shell            string                `json:"shell"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Commands         map[string][]string   `json:"commands"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/http/tus_handlers.go b/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7a3254ae72..f9d0bbbd0d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/http/tus_handlers.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -131,6 +131,13 @@ func tusPatchHandler() handleFunc {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if uploadOffset == 0 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  err = d.RunBeforeHook("upload", r.URL.Path, "", d.user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          return errToStatus(err), err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           openFile, err := d.user.Fs.OpenFile(r.URL.Path, os.O_WRONLY|os.O_APPEND, files.PermFile)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return http.StatusInternalServerError, fmt.Errorf("could not open file: %w", err)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -150,6 +157,13 @@ func tusPatchHandler() handleFunc {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           w.Header().Set("Upload-Offset", strconv.FormatInt(uploadOffset+bytesWritten, 10))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if uint64(bytesWritten) < (d.Settings.Tus.ChunkSize) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  err = d.RunAfterHook("upload", r.URL.Path, "", d.user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          return errToStatus(err), err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return http.StatusNoContent, nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   })
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/runner/parser.go b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6fd64a4b64..a8ae934288 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/runner/parser.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,11 +8,11 @@ import (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // ParseCommand parses the command taking in account if the current
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // instance uses a shell to run the commands or just calls the binary
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// directyly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// directly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   var command []string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if len(s.Shell) == 0 || s.Shell[0] == "" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if s.Shell == "" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           cmd, args, err := SplitCommandAndArgs(raw)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return nil, err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -26,7 +26,19 @@ func ParseCommand(s *settings.Settings, raw string) ([]string, error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          command = append(s.Shell, raw) //nolint:gocritic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          cmd, args, err := SplitCommandAndArgs(s.Shell)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  return nil, err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          _, err = exec.LookPath(cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  return nil, err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          command = append(command, cmd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          command = append(command, args...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          command = append(command, raw)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return command, nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/runner/runner.go b/runner/runner.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2dbafa5cd1..829e591020 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/runner/runner.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/runner/runner.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,6 +17,39 @@ type Runner struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   *settings.Settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// RunBeforeHook and RunAfterHook trigger the command runner at their respective times.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++func (r *Runner) RunBeforeHook(evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  path = user.FullPath(path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  dst = user.FullPath(dst)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if r.Enabled {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if val, ok := r.Commands["before_"+evt]; ok {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  for _, command := range val {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          err := r.exec(command, "before_"+evt, path, dst, user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  return err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++func (r *Runner) RunAfterHook(evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  path = user.FullPath(path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  dst = user.FullPath(dst)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if r.Enabled {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if val, ok := r.Commands["after_"+evt]; ok {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  for _, command := range val {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          err := r.exec(command, "after_"+evt, path, dst, user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          if err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  return err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // RunHook runs the hooks for the before and after event.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ func (r *Runner) RunHook(fn func() error, evt, path, dst string, user *users.User) error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   path = user.FullPath(path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/settings/settings.go b/settings/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2290839667..27cdff58c0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/settings/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/settings/settings.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2,6 +2,8 @@ package settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import (
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "crypto/rand"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "encoding/json"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "fmt"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "log"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "strings"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "time"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25,7 +27,7 @@ type Settings struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Branding         Branding            `json:"branding"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tus              Tus                 `json:"tus"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Commands         map[string][]string `json:"commands"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  Shell            []string            `json:"shell"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Shell            string              `json:"shell"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Rules            []rules.Rule        `json:"rules"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,3 +83,40 @@ func GenerateKey() ([]byte, error) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return b, nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// UnmarshalJSON implements custom JSON unmarshaling for Settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++func (s *Settings) UnmarshalJSON(data []byte) error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  type Alias Settings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  aux := &struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          Shell interface{} `json:"shell"`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          *Alias
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          Alias: (*Alias)(s),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if err := json.Unmarshal(data, &aux); err != nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          return err
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Handle the Shell field conversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  switch v := aux.Shell.(type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case string:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          s.Shell = v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case []interface{}:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          // Convert array to string by joining elements
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          var parts []string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          for _, item := range v {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  if str, ok := item.(string); ok {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          parts = append(parts, str)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          s.Shell = strings.Join(parts, " ")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case nil:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          s.Shell = ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          return fmt.Errorf("invalid type for shell field: %T", v)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/settings/storage.go b/settings/storage.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a006a84b36..3199715ade 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/settings/storage.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/settings/storage.go
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,8 +72,8 @@ func (s *Storage) Save(set *Settings) error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           set.Rules = []rules.Rule{}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if set.Shell == nil {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          set.Shell = []string{}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if set.Shell == "" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          set.Shell = ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if set.Commands == nil {
</span></pre><pre style='margin:0'>

</pre>