diff --git a/.gitignore b/.gitignore index f7e24c40..f276f3b8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ bin volumes /config/ -/coverage/ dist/ src/modules/*/aof diff --git a/Makefile b/Makefile index 07dd64a8..d7ca280d 100644 --- a/Makefile +++ b/Makefile @@ -8,4 +8,4 @@ run: make build && docker-compose up --build test: - go clean -testcache && go test ./src/... -coverprofile coverage/cover.out + go clean -testcache && go test ./src/... -coverprofile coverage/coverage.out diff --git a/coverage/coverage.out b/coverage/coverage.out new file mode 100644 index 00000000..678ab53b --- /dev/null +++ b/coverage/coverage.out @@ -0,0 +1,2807 @@ +mode: set +github.com/echovault/echovault/src/modules/admin/commands.go:14.112,20.29 4 1 +github.com/echovault/echovault/src/modules/admin/commands.go:20.29,21.54 1 1 +github.com/echovault/echovault/src/modules/admin/commands.go:21.54,27.42 4 1 +github.com/echovault/echovault/src/modules/admin/commands.go:27.42,29.5 1 1 +github.com/echovault/echovault/src/modules/admin/commands.go:31.4,34.12 3 1 +github.com/echovault/echovault/src/modules/admin/commands.go:37.3,37.36 1 1 +github.com/echovault/echovault/src/modules/admin/commands.go:37.36,44.43 5 1 +github.com/echovault/echovault/src/modules/admin/commands.go:44.43,46.5 1 1 +github.com/echovault/echovault/src/modules/admin/commands.go:48.4,50.21 2 1 +github.com/echovault/echovault/src/modules/admin/commands.go:54.2,56.25 2 1 +github.com/echovault/echovault/src/modules/admin/commands.go:59.110,63.35 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:63.35,64.65 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:64.65,65.41 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:65.41,67.5 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:68.4,68.12 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:70.3,70.13 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:73.2,73.51 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:76.109,77.18 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:78.9,83.36 4 0 +github.com/echovault/echovault/src/modules/admin/commands.go:83.36,84.66 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:84.66,85.52 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:85.52,89.6 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:90.5,90.13 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:92.4,93.14 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:95.3,96.26 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:98.9,102.45 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:102.45,104.4 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:105.3,105.42 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:105.42,109.37 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:109.37,110.67 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:110.67,111.53 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:111.53,112.59 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:112.59,116.8 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:118.6,118.14 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:120.5,120.54 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:120.54,123.6 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:125.9,125.50 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:125.50,129.37 3 0 +github.com/echovault/echovault/src/modules/admin/commands.go:129.37,130.67 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:130.67,131.53 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:131.53,133.24 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:133.24,136.8 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:138.6,138.14 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:140.5,140.33 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:140.33,143.6 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:145.9,147.4 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:148.3,149.26 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:150.10,151.50 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:155.109,157.2 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:159.33,166.60 1 1 +github.com/echovault/echovault/src/modules/admin/commands.go:166.60,166.86 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:174.60,176.5 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:183.62,183.88 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:191.62,191.88 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:200.62,200.88 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:210.60,212.5 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:213.110,214.49 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:214.49,216.6 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:217.5,217.41 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:225.60,227.5 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:228.110,230.18 2 0 +github.com/echovault/echovault/src/modules/admin/commands.go:230.18,232.6 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:233.5,233.53 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:241.60,243.5 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:244.110,245.47 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:245.47,247.6 1 0 +github.com/echovault/echovault/src/modules/admin/commands.go:248.5,248.41 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:36.39,41.24 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:41.24,49.3 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:52.2,52.28 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:52.28,54.54 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:54.54,55.14 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:56.9,57.17 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:57.17,58.37 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:58.37,60.6 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:63.4,65.22 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:65.22,66.61 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:66.61,68.6 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:71.4,71.39 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:71.39,72.61 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:72.61,74.6 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:80.2,81.29 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:81.29,82.33 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:82.33,84.9 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:87.2,87.20 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:87.20,89.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:92.2,92.29 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:92.29,94.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:96.2,106.13 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:109.52,114.70 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:114.70,116.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:117.2,121.3 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:124.45,130.33 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:130.33,131.30 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:131.30,132.47 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:132.47,134.5 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:134.10,137.5 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:141.2,142.45 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:142.45,144.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:146.2,153.12 4 1 +github.com/echovault/echovault/src/modules/acl/acl.go:156.73,161.37 4 1 +github.com/echovault/echovault/src/modules/acl/acl.go:161.37,162.28 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:162.28,164.12 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:167.3,167.31 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:167.31,168.30 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:168.30,170.5 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:173.3,173.32 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:173.32,174.12 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:177.3,177.52 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:177.52,178.49 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:178.49,180.5 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:183.3,183.63 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:183.63,185.4 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:187.2,187.12 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:190.95,199.19 6 1 +github.com/echovault/echovault/src/modules/acl/acl.go:199.19,207.60 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:207.60,209.4 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:210.3,210.24 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:213.2,213.19 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:213.19,222.31 4 1 +github.com/echovault/echovault/src/modules/acl/acl.go:222.31,223.28 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:223.28,226.10 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:229.3,229.17 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:229.17,231.4 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:235.2,235.19 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:235.19,237.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:240.2,240.21 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:240.21,246.3 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:248.2,248.46 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:248.46,249.38 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:249.38,252.18 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:252.18,259.5 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:263.2,263.50 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:266.125,275.16 6 1 +github.com/echovault/echovault/src/modules/acl/acl.go:275.16,277.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:279.2,279.56 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:279.56,283.17 4 1 +github.com/echovault/echovault/src/modules/acl/acl.go:283.17,285.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:289.2,289.36 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:289.36,291.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:294.2,294.43 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:294.43,296.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:299.2,299.37 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:299.37,301.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:304.2,307.29 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:307.29,309.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:312.2,312.57 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:312.57,314.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:317.2,318.65 2 1 +github.com/echovault/echovault/src/modules/acl/acl.go:318.65,319.101 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:319.101,320.63 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:320.63,322.5 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:323.4,324.16 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:326.5,327.27 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:327.27,329.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:330.3,330.88 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:334.2,334.64 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:334.64,335.101 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:335.101,336.63 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:336.63,339.5 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:340.4,340.16 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:342.5,344.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:347.2,347.94 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:347.94,349.3 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:349.5,351.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:354.2,354.93 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:354.93,356.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:356.5,358.3 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:361.2,361.55 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:361.55,365.105 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:365.105,367.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:367.6,369.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:371.3,371.104 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:371.104,373.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:373.6,375.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:376.3,376.13 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:379.2,379.19 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:379.19,381.29 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:381.29,383.4 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:386.3,386.54 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:386.54,387.56 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:387.56,388.96 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:388.96,389.50 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:389.50,391.7 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:392.6,393.18 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:395.7,397.5 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:401.3,401.55 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:401.55,402.56 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:402.56,403.98 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:403.98,404.51 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:404.51,406.7 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:407.6,408.18 2 0 +github.com/echovault/echovault/src/modules/acl/acl.go:410.7,412.5 1 0 +github.com/echovault/echovault/src/modules/acl/acl.go:416.2,416.12 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:419.32,423.33 3 1 +github.com/echovault/echovault/src/modules/acl/acl.go:423.33,428.31 5 1 +github.com/echovault/echovault/src/modules/acl/acl.go:428.31,429.37 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:429.37,431.5 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:433.3,433.25 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:436.2,436.29 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:436.29,437.33 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:437.33,439.4 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:443.29,445.2 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:447.31,449.2 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:451.30,453.2 1 1 +github.com/echovault/echovault/src/modules/acl/acl.go:455.32,457.2 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:18.105,19.34 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:19.34,21.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:22.2,23.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:23.9,25.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:26.2,26.67 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:26.67,28.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:29.2,29.38 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:32.103,33.19 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:33.19,35.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:37.2,38.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:38.9,40.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:42.2,44.30 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:44.30,45.27 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:45.27,48.9 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:52.2,52.16 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:52.16,54.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:57.2,61.18 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:61.18,63.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:63.8,65.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:66.2,66.21 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:66.21,68.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:69.2,69.17 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:69.17,71.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:73.2,74.29 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:74.29,76.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:79.2,80.51 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:80.51,81.22 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:81.22,83.12 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:85.3,85.49 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:87.2,87.51 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:87.51,88.22 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:88.22,90.12 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:92.3,92.49 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:96.2,97.48 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:97.48,98.21 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:98.21,100.12 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:102.3,102.47 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:104.2,104.48 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:104.48,105.21 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:105.21,107.12 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:109.3,109.47 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:113.2,114.79 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:114.79,115.37 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:115.37,117.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:119.2,120.30 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:120.30,121.10 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:122.100,124.53 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:125.53,127.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:128.52,130.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:135.2,137.54 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:137.54,139.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:140.2,140.54 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:140.54,142.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:144.2,146.25 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:149.101,150.18 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:150.18,152.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:154.2,158.35 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:158.35,159.36 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:159.36,160.48 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:160.48,162.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:163.4,163.12 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:165.3,165.50 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:165.50,166.51 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:166.51,169.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:173.2,173.19 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:173.19,176.34 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:176.34,179.4 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:180.3,181.28 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:181.28,183.24 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:183.24,185.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:187.3,187.26 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:190.2,190.19 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:190.19,192.46 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:192.46,193.43 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:193.43,195.38 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:195.38,197.30 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:197.30,199.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:201.5,201.28 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:206.2,206.74 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:209.99,211.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:211.9,213.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:214.2,215.33 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:215.33,217.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:218.2,219.25 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:222.103,224.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:224.9,226.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:227.2,227.45 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:227.45,229.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:230.2,230.38 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:233.105,234.18 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:234.18,236.3 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:237.2,238.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:238.9,240.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:241.2,241.53 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:241.53,243.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:244.2,244.38 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:247.103,249.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:249.9,251.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:252.2,253.74 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:256.100,257.18 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:257.18,259.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:260.2,261.9 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:261.9,263.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:264.2,266.33 3 1 +github.com/echovault/echovault/src/modules/acl/commands.go:266.33,269.19 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:269.19,271.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:271.9,273.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:275.3,275.22 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:275.22,277.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:279.3,279.18 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:279.18,281.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:283.3,283.43 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:283.43,284.61 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:284.61,286.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:287.4,287.58 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:287.58,289.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:292.3,292.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:292.52,293.23 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:293.23,295.13 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:297.4,297.39 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:300.3,300.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:300.52,301.23 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:301.23,303.13 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:305.4,305.39 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:308.3,308.49 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:308.49,309.22 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:309.22,311.13 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:313.4,313.37 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:316.3,316.49 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:316.49,317.22 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:317.22,319.13 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:321.4,321.37 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:324.3,324.45 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:324.45,325.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:325.52,327.13 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:329.4,329.41 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:332.3,332.45 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:332.45,333.52 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:333.52,335.5 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:338.3,338.55 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:338.55,340.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:342.3,342.55 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:342.55,344.4 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:345.3,345.54 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:348.2,349.25 2 1 +github.com/echovault/echovault/src/modules/acl/commands.go:352.100,353.19 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:353.19,355.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:357.2,358.9 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:358.9,360.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:362.2,366.16 4 0 +github.com/echovault/echovault/src/modules/acl/commands.go:366.16,368.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:370.2,370.15 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:370.15,371.35 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:371.35,373.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:376.2,380.20 3 0 +github.com/echovault/echovault/src/modules/acl/commands.go:380.20,381.59 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:381.59,383.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:386.2,386.37 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:386.37,387.59 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:387.59,389.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:393.2,393.29 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:393.29,397.31 3 0 +github.com/echovault/echovault/src/modules/acl/commands.go:397.31,398.35 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:398.35,401.43 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:401.43,403.6 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:403.11,406.6 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:407.5,407.10 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:411.3,411.17 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:411.17,413.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:416.2,416.38 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:419.100,420.18 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:420.18,422.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:424.2,425.9 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:425.9,427.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:429.2,433.16 4 0 +github.com/echovault/echovault/src/modules/acl/commands.go:433.16,435.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:437.2,437.15 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:437.15,438.35 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:438.35,440.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:443.2,445.20 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:445.20,448.17 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:448.17,450.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:451.3,452.17 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:452.17,454.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:457.2,457.37 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:457.37,460.17 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:460.17,462.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:463.3,464.17 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:464.17,466.4 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:469.2,470.16 2 0 +github.com/echovault/echovault/src/modules/acl/commands.go:470.16,472.3 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:474.2,474.38 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:477.33,484.60 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:484.60,486.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:494.60,496.5 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:504.62,506.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:514.62,516.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:524.62,526.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:534.62,536.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:544.62,546.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:554.62,556.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:564.62,566.7 1 1 +github.com/echovault/echovault/src/modules/acl/commands.go:577.62,579.7 1 0 +github.com/echovault/echovault/src/modules/acl/commands.go:587.62,589.7 1 0 +github.com/echovault/echovault/src/modules/acl/user.go:39.31,41.39 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:41.39,43.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:44.2,45.51 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:45.51,47.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:49.2,50.37 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:50.37,52.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:53.2,54.49 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:54.49,56.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:58.2,59.53 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:59.53,61.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:62.2,63.54 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:63.54,65.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:67.2,68.43 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:68.43,70.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:71.2,72.55 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:72.55,74.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:77.79,79.32 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:79.32,80.24 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:80.24,82.12 2 0 +github.com/echovault/echovault/src/modules/acl/user.go:84.3,84.25 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:86.2,86.33 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:86.33,87.17 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:87.17,90.4 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:91.3,91.25 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:93.2,93.8 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:96.50,97.26 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:97.26,99.35 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:99.35,101.4 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:102.3,102.36 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:102.36,104.4 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:106.3,106.37 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:106.37,112.12 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:114.3,114.20 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:114.20,115.84 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:115.84,116.65 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:116.65,118.6 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:119.5,119.45 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:121.4,121.12 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:123.3,123.20 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:123.20,124.84 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:124.84,125.68 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:125.68,127.6 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:128.5,128.45 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:130.4,130.12 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:133.3,133.43 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:133.43,136.12 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:138.3,138.46 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:138.46,140.12 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:142.3,142.36 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:142.36,143.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:143.21,145.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:147.4,147.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:147.21,149.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:153.3,153.40 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:153.40,157.12 4 0 +github.com/echovault/echovault/src/modules/acl/user.go:159.3,159.93 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:159.93,164.12 5 1 +github.com/echovault/echovault/src/modules/acl/user.go:166.3,166.57 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:166.57,169.12 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:171.3,171.57 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:171.57,174.12 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:177.3,177.44 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:177.44,179.4 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:180.3,180.36 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:180.36,181.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:181.21,183.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:185.4,185.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:185.21,187.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:191.3,191.44 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:191.44,194.12 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:196.3,196.66 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:196.66,197.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:197.21,199.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:201.4,201.21 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:201.21,203.13 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:209.2,209.26 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:209.26,210.39 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:210.39,213.4 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:216.2,216.26 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:216.26,218.42 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:218.42,221.4 2 0 +github.com/echovault/echovault/src/modules/acl/user.go:223.3,223.43 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:223.43,228.4 4 1 +github.com/echovault/echovault/src/modules/acl/user.go:230.3,230.42 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:230.42,234.4 3 1 +github.com/echovault/echovault/src/modules/acl/user.go:236.3,236.46 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:236.46,239.4 2 1 +github.com/echovault/echovault/src/modules/acl/user.go:241.2,241.12 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:244.36,258.2 13 0 +github.com/echovault/echovault/src/modules/acl/user.go:260.38,273.2 12 0 +github.com/echovault/echovault/src/modules/acl/user.go:275.40,290.2 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:292.46,293.24 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:293.24,295.3 1 1 +github.com/echovault/echovault/src/modules/acl/user.go:296.2,296.26 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:14.102,16.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:16.16,18.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:20.2,22.33 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:22.33,25.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:27.2,27.52 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:27.52,29.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:30.2,32.63 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:32.63,34.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:36.2,36.57 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:39.107,41.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:41.16,43.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:45.2,48.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:48.9,50.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:52.2,52.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:52.33,54.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:56.2,56.52 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:56.52,58.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:59.2,62.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:62.9,64.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:66.2,66.40 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:66.40,68.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:70.2,70.57 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:73.107,75.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:75.16,77.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:79.2,83.24 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:83.24,85.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:87.2,87.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:87.33,89.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:91.2,91.52 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:91.52,93.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:94.2,97.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:97.9,99.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:102.2,102.40 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:102.40,104.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:107.2,107.51 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:107.51,109.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:111.2,114.15 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:114.15,116.43 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:116.43,119.4 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:120.3,120.20 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:124.2,124.18 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:124.18,126.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:131.2,135.17 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:135.17,137.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:139.2,139.13 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:139.13,142.18 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:142.18,144.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:144.9,146.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:149.2,149.19 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:152.105,154.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:154.16,156.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:158.2,161.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:161.9,163.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:165.2,165.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:165.33,167.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:169.2,169.51 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:169.51,171.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:172.2,175.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:175.9,177.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:179.2,179.40 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:179.40,181.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:183.2,184.55 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:184.55,186.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:188.2,188.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:191.106,193.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:193.16,195.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:197.2,201.24 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:201.24,203.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:205.2,205.30 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:205.30,207.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:209.2,209.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:209.33,211.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:213.2,213.51 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:213.51,215.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:216.2,219.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:219.9,221.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:223.2,223.40 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:223.40,225.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:227.2,227.34 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:227.34,228.64 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:228.64,230.4 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:231.3,231.39 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:234.2,234.66 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:234.66,236.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:237.2,237.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:240.105,242.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:242.16,244.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:246.2,250.9 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:250.9,252.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:254.2,256.33 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:256.33,258.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:260.2,260.51 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:260.51,262.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:263.2,266.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:266.9,268.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:270.2,270.9 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:271.10,271.10 0 0 +github.com/echovault/echovault/src/modules/list/commands.go:273.17,275.34 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:275.34,276.26 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:276.26,277.10 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:279.4,279.43 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:279.43,282.5 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:284.17,286.39 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:286.39,287.26 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:287.26,288.10 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:290.4,290.43 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:290.43,293.5 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:297.2,297.61 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:297.61,299.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:301.2,301.55 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:301.55,303.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:305.2,305.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:308.106,310.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:310.16,312.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:314.2,319.116 5 1 +github.com/echovault/echovault/src/modules/list/commands.go:319.116,321.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:323.2,323.75 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:323.75,325.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:327.2,327.54 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:327.54,329.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:330.2,333.16 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:333.16,335.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:336.2,341.33 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:341.33,343.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:345.2,345.19 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:346.14,348.24 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:348.24,350.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:350.9,350.32 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:350.32,352.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:353.15,355.24 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:355.24,357.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:357.9,357.32 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:357.32,359.4 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:362.2,362.16 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:362.16,364.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:366.2,366.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:369.106,371.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:371.16,373.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:375.2,377.31 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:377.31,379.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:381.2,383.33 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:383.33,384.34 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:385.17,386.61 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:387.11,388.62 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:388.62,390.5 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:391.4,391.68 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:391.68,393.5 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:395.8,396.52 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:396.52,398.4 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:400.2,405.9 4 1 +github.com/echovault/echovault/src/modules/list/commands.go:405.9,407.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:409.2,409.73 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:409.73,411.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:412.2,412.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:415.106,417.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:417.16,419.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:421.2,425.31 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:425.31,427.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:429.2,429.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:429.33,430.34 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:431.17,432.61 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:433.11,434.62 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:434.62,436.5 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:437.4,438.68 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:438.68,440.5 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:442.8,443.52 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:443.52,445.4 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:446.3,446.35 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:449.2,453.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:453.9,455.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:457.2,457.73 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:457.73,459.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:460.2,460.38 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:463.104,465.16 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:465.16,467.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:469.2,471.33 2 1 +github.com/echovault/echovault/src/modules/list/commands.go:471.33,473.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:475.2,475.51 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:475.51,477.3 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:478.2,481.9 3 1 +github.com/echovault/echovault/src/modules/list/commands.go:481.9,483.3 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:485.2,485.33 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:486.10,487.60 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:487.60,489.4 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:490.3,490.54 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:491.14,492.70 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:492.70,494.4 1 0 +github.com/echovault/echovault/src/modules/list/commands.go:495.3,495.64 1 1 +github.com/echovault/echovault/src/modules/list/commands.go:499.33,606.2 1 0 +github.com/echovault/echovault/src/modules/list/key_funcs.go:8.51,9.18 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:9.18,11.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:12.2,12.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:15.49,16.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:16.19,18.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:19.2,19.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:22.50,23.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:23.19,25.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:26.2,26.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:29.52,30.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:30.19,32.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:33.2,33.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:36.52,37.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:37.19,39.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:40.2,40.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:43.50,44.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:44.19,46.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:47.2,47.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:50.51,51.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:51.19,53.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:54.2,54.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:57.50,58.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:58.19,60.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:61.2,61.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:64.51,65.18 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:65.18,67.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:68.2,68.30 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:71.51,72.19 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:72.19,74.3 1 1 +github.com/echovault/echovault/src/modules/list/key_funcs.go:75.2,75.38 1 1 +github.com/echovault/echovault/src/modules/connection/commands.go:11.105,12.18 1 1 +github.com/echovault/echovault/src/modules/connection/commands.go:13.10,14.50 1 1 +github.com/echovault/echovault/src/modules/connection/commands.go:15.9,16.34 1 1 +github.com/echovault/echovault/src/modules/connection/commands.go:17.9,18.72 1 1 +github.com/echovault/echovault/src/modules/connection/commands.go:22.33,29.60 1 0 +github.com/echovault/echovault/src/modules/connection/commands.go:29.60,31.5 1 0 +github.com/echovault/echovault/src/modules/pubsub/channel.go:22.51,23.32 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:23.32,25.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:28.57,29.32 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:29.32,32.3 2 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:35.61,46.33 3 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:46.33,48.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:50.2,50.16 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:53.28,54.12 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:54.12,55.7 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:55.7,60.40 3 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:60.40,61.30 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:61.30,66.21 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:66.21,68.7 1 0 +github.com/echovault/echovault/src/modules/pubsub/channel.go:72.4,72.33 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:77.51,80.40 3 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:80.40,82.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:83.2,84.11 2 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:87.53,90.40 3 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:90.40,92.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:93.2,94.13 2 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:97.44,99.2 1 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:101.36,105.2 3 1 +github.com/echovault/echovault/src/modules/pubsub/channel.go:107.34,111.2 3 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:12.110,14.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:14.9,16.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:18.2,20.24 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:20.24,22.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:24.2,27.17 3 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:30.112,32.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:32.9,34.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:36.2,40.66 3 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:43.105,45.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:45.9,47.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:48.2,48.19 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:48.19,50.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:51.2,52.38 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:55.110,56.18 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:56.18,58.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:60.2,61.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:61.9,63.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:65.2,66.19 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:66.19,68.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:70.2,70.38 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:73.106,75.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:75.9,77.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:78.2,79.49 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:82.109,84.9 2 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:84.9,86.3 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:87.2,87.36 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:90.33,97.60 1 1 +github.com/echovault/echovault/src/modules/pubsub/commands.go:97.60,99.21 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:99.21,101.6 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:102.5,102.24 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:111.60,113.21 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:113.21,115.6 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:116.5,116.24 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:125.60,127.22 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:127.22,129.6 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:130.5,130.33 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:141.60,144.5 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:154.60,157.5 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:165.60,165.86 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:166.98,168.5 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:177.62,177.88 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:185.62,185.88 1 0 +github.com/echovault/echovault/src/modules/pubsub/commands.go:194.62,194.85 1 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:20.26,25.2 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:27.103,34.17 5 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:34.17,36.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:38.2,38.37 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:38.37,42.75 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:42.75,44.4 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:46.3,46.23 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:46.23,49.19 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:49.19,51.5 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:51.10,53.5 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:54.4,55.31 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:55.31,60.20 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:60.20,62.6 1 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:64.4,64.46 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:65.9,67.47 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:67.47,72.20 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:72.20,74.6 1 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:80.112,85.17 4 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:85.17,87.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:89.2,92.24 3 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:92.24,93.19 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:93.19,96.40 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:96.40,97.31 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:97.31,98.14 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:100.5,100.34 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:100.34,103.6 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:105.9,108.40 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:108.40,109.31 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:109.31,110.14 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:112.5,112.34 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:112.34,115.6 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:123.2,123.38 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:123.38,124.30 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:124.30,125.54 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:125.54,128.5 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:134.2,134.17 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:134.17,135.36 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:135.36,137.40 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:137.40,139.58 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:139.58,140.35 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:140.35,143.7 2 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:144.6,144.14 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:147.5,147.30 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:147.30,148.35 1 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:148.35,151.7 2 0 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:157.2,158.39 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:158.39,160.3 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:162.2,162.20 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:165.84,169.38 3 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:169.38,171.29 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:171.29,172.35 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:172.35,174.5 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:175.4,175.12 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:178.3,178.41 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:178.41,180.4 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:184.51,191.19 5 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:191.19,192.39 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:192.39,193.26 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:193.26,196.5 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:198.3,199.21 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:202.2,204.38 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:204.38,206.78 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:206.78,209.12 3 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:212.3,212.50 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:212.50,215.4 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:218.2,218.53 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:221.32,226.38 4 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:226.38,227.51 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:227.51,229.4 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:231.2,231.14 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:234.52,239.35 4 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:239.35,241.66 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:241.66,243.4 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:244.3,244.20 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:244.20,246.12 2 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:248.3,248.106 1 1 +github.com/echovault/echovault/src/modules/pubsub/pubsub.go:250.2,250.20 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:18.13,19.34 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:19.34,23.3 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:25.2,26.29 2 0 +github.com/echovault/echovault/src/modules/generic/commands.go:26.29,28.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:36.101,38.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:38.16,40.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:42.2,47.16 5 1 +github.com/echovault/echovault/src/modules/generic/commands.go:47.16,49.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:53.2,53.16 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:53.16,54.34 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:54.34,56.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:56.9,58.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:61.2,61.44 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:61.44,63.34 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:63.34,65.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:66.3,66.36 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:67.8,67.51 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:67.51,69.33 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:69.33,71.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:72.3,72.45 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:73.8,75.34 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:75.34,78.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:78.9,81.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:83.2,83.16 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:83.16,85.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:86.2,88.73 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:88.73,90.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:93.2,93.28 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:93.28,95.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:97.2,97.17 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:100.102,101.44 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:101.44,103.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:105.2,108.15 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:108.15,109.29 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:109.29,110.16 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:110.16,116.5 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:121.2,121.30 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:121.30,122.15 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:122.15,127.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:132.2,132.28 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:132.28,133.31 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:133.31,134.52 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:134.52,136.5 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:137.4,138.12 2 0 +github.com/echovault/echovault/src/modules/generic/commands.go:140.3,140.60 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:140.60,142.4 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:143.3,143.55 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:147.2,147.28 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:147.28,148.58 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:148.58,150.4 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:153.2,153.38 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:156.101,158.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:158.16,160.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:161.2,163.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:163.33,165.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:167.2,168.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:168.16,170.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:171.2,175.51 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:178.102,180.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:180.16,182.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:184.2,187.27 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:187.27,188.31 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:188.31,190.12 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:192.3,192.33 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:192.33,194.18 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:194.18,196.5 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:197.4,198.12 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:200.3,200.19 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:202.2,202.15 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:202.15,203.34 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:203.34,204.14 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:204.14,207.5 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:211.2,211.28 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:211.28,213.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:215.2,217.30 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:217.30,218.24 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:218.24,220.12 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:222.3,222.96 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:225.2,225.19 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:228.101,230.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:230.16,232.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:233.2,234.27 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:234.27,236.17 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:236.17,238.12 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:240.3,240.13 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:242.2,242.51 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:245.105,247.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:247.16,249.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:251.2,253.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:253.33,255.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:257.2,257.51 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:257.51,259.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:260.2,263.31 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:263.31,265.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:267.2,269.30 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:272.108,274.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:274.16,276.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:278.2,280.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:280.33,282.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:284.2,284.52 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:284.52,286.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:287.2,291.31 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:291.31,293.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:295.2,296.46 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:296.46,298.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:300.2,300.47 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:303.101,305.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:305.16,307.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:309.2,311.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:311.33,313.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:315.2,315.52 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:315.52,317.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:318.2,322.31 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:322.31,324.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:326.2,327.39 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:327.39,329.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:331.2,331.12 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:331.12,333.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:335.2,335.47 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:338.104,340.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:340.16,342.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:344.2,348.16 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:348.16,350.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:351.2,352.42 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:352.42,354.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:356.2,356.33 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:356.33,358.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:360.2,360.51 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:360.51,362.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:363.2,365.19 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:365.19,368.3 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:370.2,372.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:373.12,374.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:374.39,376.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:377.3,377.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:378.12,379.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:379.39,381.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:382.3,382.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:383.12,384.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:384.39,386.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:387.3,387.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:387.39,389.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:390.3,390.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:391.12,392.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:392.39,393.40 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:393.40,395.5 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:396.4,396.47 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:398.3,398.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:399.10,400.71 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:403.2,403.30 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:406.106,408.16 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:408.16,410.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:412.2,416.16 3 1 +github.com/echovault/echovault/src/modules/generic/commands.go:416.16,418.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:419.2,420.44 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:420.44,422.3 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:424.2,424.33 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:424.33,426.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:428.2,428.51 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:428.51,430.3 1 0 +github.com/echovault/echovault/src/modules/generic/commands.go:431.2,433.19 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:433.19,436.3 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:438.2,440.33 2 1 +github.com/echovault/echovault/src/modules/generic/commands.go:441.12,442.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:442.39,444.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:445.3,445.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:446.12,447.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:447.39,449.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:450.3,450.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:451.12,452.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:452.39,454.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:455.3,455.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:455.39,457.4 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:458.3,458.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:459.12,460.39 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:460.39,461.40 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:461.40,463.5 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:464.4,464.47 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:466.3,466.46 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:467.10,468.71 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:471.2,471.30 1 1 +github.com/echovault/echovault/src/modules/generic/commands.go:474.33,629.2 1 0 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:8.49,9.34 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:9.34,11.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:12.2,12.30 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:15.50,16.25 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:16.25,18.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:19.2,20.30 2 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:20.30,21.15 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:21.15,23.4 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:25.2,25.18 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:28.49,29.19 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:29.19,31.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:32.2,32.30 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:35.50,36.18 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:36.18,38.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:39.2,39.21 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:42.49,43.18 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:43.18,45.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:46.2,46.21 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:49.53,50.19 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:50.19,52.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:53.2,53.21 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:56.56,57.19 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:57.19,59.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:60.2,60.21 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:63.49,64.19 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:64.19,66.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:67.2,67.21 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:70.52,71.34 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:71.34,73.3 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:74.2,74.30 1 1 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:77.54,78.34 1 0 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:78.34,80.3 1 0 +github.com/echovault/echovault/src/modules/generic/key_funcs.go:81.2,81.30 1 0 +github.com/echovault/echovault/src/modules/generic/utils.go:17.77,18.19 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:18.19,20.3 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:21.2,21.33 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:22.13,24.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:26.12,27.26 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:27.26,29.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:30.3,31.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:33.12,34.26 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:34.26,36.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:37.3,38.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:40.12,41.19 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:41.19,43.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:44.3,44.29 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:44.29,46.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:47.3,49.17 3 1 +github.com/echovault/echovault/src/modules/generic/utils.go:49.17,51.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:52.3,53.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:55.12,56.19 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:56.19,58.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:59.3,59.29 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:59.29,61.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:62.3,64.17 3 1 +github.com/echovault/echovault/src/modules/generic/utils.go:64.17,66.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:67.3,68.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:70.14,71.19 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:71.19,73.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:74.3,74.29 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:74.29,76.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:77.3,79.17 3 1 +github.com/echovault/echovault/src/modules/generic/utils.go:79.17,81.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:82.3,83.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:85.14,86.19 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:86.19,88.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:89.3,89.29 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:89.29,91.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:92.3,94.17 3 1 +github.com/echovault/echovault/src/modules/generic/utils.go:94.17,96.4 1 1 +github.com/echovault/echovault/src/modules/generic/utils.go:97.3,98.46 2 1 +github.com/echovault/echovault/src/modules/generic/utils.go:100.10,101.95 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:15.105,17.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:17.16,19.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:21.2,24.25 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:24.25,26.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:28.2,28.38 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:28.38,30.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:32.2,32.33 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:32.33,34.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:34.17,36.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:37.3,38.59 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:38.59,40.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:41.3,41.59 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:44.2,44.51 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:44.51,46.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:47.2,50.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:50.9,52.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:54.2,55.36 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:55.36,56.42 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:56.42,57.26 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:57.26,60.5 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:61.4,61.12 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:63.3,64.13 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:66.2,66.55 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:66.55,68.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:70.2,70.51 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:73.105,75.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:75.16,77.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:79.2,82.33 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:82.33,84.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:86.2,86.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:86.52,88.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:89.2,92.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:92.9,94.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:96.2,99.31 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:99.31,101.19 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:101.19,103.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:105.3,105.34 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:105.34,107.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:109.3,109.31 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:109.31,111.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:113.3,113.35 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:113.35,116.12 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:118.3,118.32 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:121.2,121.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:124.108,126.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:126.16,128.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:130.2,133.33 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:133.33,135.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:137.2,137.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:137.52,139.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:140.2,143.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:143.9,145.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:147.2,150.31 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:150.31,152.19 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:152.19,154.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:156.3,156.34 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:156.34,158.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:160.3,160.35 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:160.35,163.12 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:165.3,165.31 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:165.31,167.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:169.3,169.18 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:172.2,172.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:175.106,177.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:177.16,179.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:181.2,183.33 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:183.33,185.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:187.2,187.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:187.52,189.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:190.2,193.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:193.9,195.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:197.2,198.27 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:198.27,199.32 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:199.32,201.12 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:203.3,203.33 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:203.33,206.12 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:208.3,208.29 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:208.29,210.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:213.2,213.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:216.111,218.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:218.16,220.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:222.2,225.19 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:225.19,227.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:227.17,229.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:230.3,230.13 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:230.13,232.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:233.3,233.12 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:236.2,237.19 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:237.19,238.46 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:238.46,240.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:240.9,242.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:245.2,245.33 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:245.33,247.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:249.2,249.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:249.52,251.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:252.2,255.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:255.9,257.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:260.2,260.24 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:260.24,262.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:262.17,264.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:265.3,265.34 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:265.34,267.18 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:267.18,268.36 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:268.36,270.14 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:272.5,272.37 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:272.37,275.14 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:277.5,277.33 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:277.33,279.14 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:283.3,283.26 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:287.2,288.29 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:288.29,290.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:293.2,295.43 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:295.43,299.16 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:299.16,300.59 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:300.59,302.5 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:306.2,307.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:307.16,309.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:310.2,310.38 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:310.38,312.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:312.17,313.41 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:313.41,315.13 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:317.4,317.42 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:317.42,320.13 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:322.4,322.38 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:322.38,324.13 2 0 +github.com/echovault/echovault/src/modules/hash/commands.go:329.2,329.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:332.105,334.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:334.16,336.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:338.2,340.33 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:340.33,342.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:344.2,344.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:344.52,346.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:347.2,350.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:350.9,352.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:354.2,354.55 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:357.106,359.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:359.16,361.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:363.2,365.33 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:365.33,367.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:369.2,369.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:369.52,371.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:372.2,375.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:375.9,377.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:379.2,380.29 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:380.29,382.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:384.2,384.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:387.108,389.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:389.16,391.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:393.2,399.47 5 1 +github.com/echovault/echovault/src/modules/hash/commands.go:399.47,401.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:401.17,403.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:404.3,404.21 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:405.8,407.17 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:407.17,409.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:410.3,410.19 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:413.2,413.33 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:413.33,414.62 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:414.62,416.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:417.3,419.48 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:419.48,421.57 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:421.57,423.5 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:424.4,424.96 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:425.9,427.57 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:427.57,429.5 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:430.4,430.60 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:434.2,434.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:434.52,436.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:437.2,440.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:440.9,442.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:444.2,444.24 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:444.24,446.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:448.2,448.28 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:449.10,450.69 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:451.11,453.48 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:453.48,455.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:455.9,457.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:458.15,460.48 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:460.48,462.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:462.9,464.4 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:467.2,467.55 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:467.55,469.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:471.2,471.40 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:471.40,473.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:475.2,476.47 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:479.108,481.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:481.16,483.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:485.2,487.33 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:487.33,489.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:491.2,491.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:491.52,493.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:494.2,497.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:497.9,499.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:501.2,502.33 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:502.33,504.34 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:504.34,506.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:507.3,507.35 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:507.35,510.4 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:511.3,511.31 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:511.31,513.4 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:516.2,516.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:519.108,521.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:521.16,523.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:525.2,528.33 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:528.33,530.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:532.2,532.52 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:532.52,534.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:535.2,538.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:538.9,540.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:542.2,542.24 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:542.24,544.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:546.2,546.30 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:549.105,551.16 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:551.16,553.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:555.2,558.33 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:558.33,560.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:562.2,562.51 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:562.51,564.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:565.2,568.9 3 1 +github.com/echovault/echovault/src/modules/hash/commands.go:568.9,570.3 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:572.2,574.31 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:574.31,575.25 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:575.25,578.4 2 1 +github.com/echovault/echovault/src/modules/hash/commands.go:581.2,581.55 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:581.55,583.3 1 0 +github.com/echovault/echovault/src/modules/hash/commands.go:585.2,585.51 1 1 +github.com/echovault/echovault/src/modules/hash/commands.go:588.33,696.2 1 0 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:8.50,9.18 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:9.18,11.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:12.2,12.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:15.52,16.18 1 0 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:16.18,18.3 1 0 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:19.2,19.22 1 0 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:22.50,23.18 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:23.18,25.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:26.2,26.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:29.53,30.18 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:30.18,32.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:33.2,33.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:36.51,37.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:37.19,39.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:40.2,40.21 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:43.56,44.34 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:44.34,46.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:47.2,47.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:47.19,49.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:50.2,50.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:53.50,54.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:54.19,56.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:57.2,57.21 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:60.51,61.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:61.19,63.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:64.2,64.21 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:67.53,68.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:68.19,70.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:71.2,71.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:74.53,75.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:75.19,77.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:78.2,78.21 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:81.53,82.19 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:82.19,84.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:85.2,85.22 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:88.50,89.18 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:89.18,91.3 1 1 +github.com/echovault/echovault/src/modules/hash/key_funcs.go:92.2,92.22 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:13.105,15.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:15.16,17.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:19.2,23.33 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:23.33,25.70 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:25.70,27.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:28.3,28.55 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:28.55,30.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:31.3,32.59 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:35.2,35.51 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:35.51,37.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:38.2,41.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:41.9,43.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:45.2,47.51 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:50.106,52.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:52.16,54.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:56.2,58.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:58.33,60.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:62.2,62.52 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:62.52,64.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:65.2,68.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:68.9,70.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:72.2,74.57 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:77.106,79.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:79.16,81.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:84.2,84.37 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:84.37,86.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:87.2,87.56 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:87.56,89.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:90.2,92.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:92.9,94.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:96.2,97.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:97.15,98.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:98.34,99.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:99.14,101.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:105.2,105.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:105.31,106.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:106.34,107.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:109.3,109.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:109.53,110.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:112.3,112.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:115.2,116.30 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:116.30,118.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:118.10,119.12 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:121.3,121.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:124.2,128.26 4 1 +github.com/echovault/echovault/src/modules/set/commands.go:128.26,130.24 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:130.24,132.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:135.2,135.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:138.111,140.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:140.16,142.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:144.2,147.37 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:147.37,149.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:150.2,150.57 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:150.57,152.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:153.2,155.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:155.9,157.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:159.2,160.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:160.15,161.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:161.34,162.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:162.14,164.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:168.2,168.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:168.31,169.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:169.34,170.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:172.3,172.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:172.53,173.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:175.3,175.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:178.2,179.31 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:179.31,181.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:181.10,182.12 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:184.3,184.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:187.2,192.40 4 1 +github.com/echovault/echovault/src/modules/set/commands.go:192.40,193.60 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:193.60,195.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:196.3,196.64 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:196.64,198.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:199.3,200.26 2 0 +github.com/echovault/echovault/src/modules/set/commands.go:203.2,203.68 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:203.68,205.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:206.2,206.63 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:206.63,208.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:209.2,211.25 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:214.107,216.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:216.16,218.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:220.2,221.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:221.15,222.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:222.34,223.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:223.14,225.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:229.2,229.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:229.31,230.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:230.34,233.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:234.3,234.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:234.53,236.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:237.3,237.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:240.2,242.28 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:242.28,244.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:244.10,247.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:248.3,248.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:251.2,251.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:251.20,253.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:255.2,259.26 4 1 +github.com/echovault/echovault/src/modules/set/commands.go:259.26,261.24 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:261.24,263.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:266.2,266.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:269.111,271.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:271.16,273.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:276.2,277.56 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:277.56,279.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:280.2,280.35 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:280.35,282.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:283.2,283.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:283.20,285.27 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:285.27,287.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:289.3,289.57 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:289.57,291.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:291.9,293.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:296.2,297.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:297.15,298.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:298.34,299.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:299.14,301.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:305.2,305.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:305.27,306.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:306.34,309.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:310.3,310.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:310.53,312.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:313.3,313.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:316.2,318.28 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:318.28,320.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:320.10,323.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:324.3,324.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:327.2,327.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:327.20,329.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:331.2,333.69 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:336.112,338.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:338.16,340.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:342.2,343.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:343.15,344.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:344.34,345.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:345.14,347.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:351.2,351.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:351.31,352.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:352.34,355.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:356.3,356.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:356.53,358.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:359.3,359.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:362.2,364.28 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:364.28,366.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:366.10,369.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:370.3,370.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:373.2,376.40 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:376.40,377.60 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:377.60,379.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:380.8,381.69 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:381.69,383.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:386.2,386.68 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:386.68,388.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:389.2,391.69 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:394.110,396.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:396.16,398.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:400.2,402.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:402.33,404.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:406.2,406.52 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:406.52,408.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:409.2,412.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:412.9,414.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:416.2,416.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:416.27,418.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:420.2,420.30 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:423.109,425.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:425.16,427.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:429.2,431.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:431.33,433.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:435.2,435.52 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:435.52,437.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:438.2,441.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:441.9,443.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:445.2,448.26 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:448.26,450.24 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:450.24,452.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:455.2,455.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:458.111,460.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:460.16,462.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:464.2,467.33 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:467.33,469.29 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:469.29,471.27 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:471.27,473.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:475.3,475.26 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:478.2,478.52 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:478.52,480.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:481.2,484.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:484.9,486.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:488.2,489.36 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:489.36,490.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:490.31,492.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:492.9,494.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:496.2,498.25 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:501.106,503.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:503.16,505.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:507.2,511.36 4 1 +github.com/echovault/echovault/src/modules/set/commands.go:511.36,513.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:515.2,515.54 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:515.54,517.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:518.2,521.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:521.9,523.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:525.2,527.41 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:527.41,529.69 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:529.69,531.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:532.3,534.74 3 0 +github.com/echovault/echovault/src/modules/set/commands.go:534.74,536.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:537.8,539.61 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:539.61,541.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:542.3,544.10 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:544.10,546.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:547.3,547.22 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:550.2,552.49 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:555.105,557.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:557.16,559.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:561.2,564.19 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:564.19,566.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:566.10,568.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:569.3,569.12 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:572.2,572.33 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:572.33,574.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:576.2,576.51 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:576.51,578.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:579.2,582.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:582.9,584.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:586.2,589.28 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:589.28,591.26 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:591.26,593.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:596.2,596.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:599.112,601.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:601.16,603.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:605.2,608.19 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:608.19,610.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:610.10,612.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:613.3,613.12 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:616.2,616.33 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:616.33,618.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:620.2,620.51 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:620.51,622.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:623.2,626.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:626.9,628.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:630.2,633.28 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:633.28,635.26 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:635.26,637.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:640.2,640.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:643.105,645.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:645.16,647.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:649.2,652.33 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:652.33,654.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:656.2,656.51 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:656.51,658.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:659.2,662.9 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:662.9,664.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:666.2,668.51 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:671.107,673.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:673.16,675.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:677.2,678.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:678.15,679.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:679.34,680.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:680.14,682.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:686.2,686.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:686.27,687.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:687.34,688.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:690.3,690.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:690.53,692.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:693.3,693.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:696.2,698.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:698.33,699.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:699.14,700.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:702.3,703.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:703.10,705.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:706.3,706.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:709.2,712.35 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:712.35,714.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:714.33,716.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:719.2,719.25 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:722.112,724.16 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:724.16,726.3 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:728.2,729.15 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:729.15,730.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:730.34,731.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:731.14,733.5 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:737.2,737.31 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:737.31,738.34 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:738.34,739.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:741.3,741.53 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:741.53,743.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:744.3,744.20 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:747.2,749.33 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:749.33,750.14 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:750.14,751.12 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:753.3,754.10 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:754.10,756.4 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:757.3,757.27 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:760.2,764.40 3 1 +github.com/echovault/echovault/src/modules/set/commands.go:764.40,765.60 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:765.60,767.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:768.8,769.69 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:769.69,771.4 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:773.2,775.64 2 1 +github.com/echovault/echovault/src/modules/set/commands.go:775.64,777.3 1 0 +github.com/echovault/echovault/src/modules/set/commands.go:778.2,778.65 1 1 +github.com/echovault/echovault/src/modules/set/commands.go:781.33,916.2 1 0 +github.com/echovault/echovault/src/modules/set/key_funcs.go:10.50,11.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:11.18,13.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:14.2,14.30 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:17.51,18.19 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:18.19,20.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:21.2,21.30 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:24.51,25.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:25.18,27.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:28.2,28.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:31.56,32.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:32.18,34.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:35.2,35.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:38.52,39.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:39.18,41.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:42.2,42.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:45.56,46.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:46.18,48.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:50.2,50.56 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:50.56,52.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:54.2,54.20 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:54.20,56.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:58.2,58.29 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:61.57,62.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:62.18,64.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:65.2,65.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:68.55,69.19 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:69.19,71.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:72.2,72.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:75.54,76.19 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:76.19,78.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:79.2,79.30 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:82.56,83.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:83.18,85.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:86.2,86.30 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:89.51,90.19 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:90.19,92.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:93.2,93.22 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:96.50,97.34 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:97.34,99.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:100.2,100.22 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:103.57,104.34 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:104.34,106.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:107.2,107.22 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:110.50,111.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:111.18,113.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:114.2,114.30 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:117.52,118.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:118.18,120.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:121.2,121.21 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:124.57,125.18 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:125.18,127.3 1 1 +github.com/echovault/echovault/src/modules/set/key_funcs.go:128.2,128.21 1 1 +github.com/echovault/echovault/src/modules/set/set.go:14.34,21.2 3 1 +github.com/echovault/echovault/src/modules/set/set.go:23.41,25.26 2 1 +github.com/echovault/echovault/src/modules/set/set.go:25.26,26.23 1 1 +github.com/echovault/echovault/src/modules/set/set.go:26.23,29.4 2 1 +github.com/echovault/echovault/src/modules/set/set.go:31.2,32.14 2 1 +github.com/echovault/echovault/src/modules/set/set.go:35.43,37.2 1 1 +github.com/echovault/echovault/src/modules/set/set.go:39.35,41.32 2 1 +github.com/echovault/echovault/src/modules/set/set.go:41.32,43.3 1 1 +github.com/echovault/echovault/src/modules/set/set.go:44.2,44.12 1 1 +github.com/echovault/echovault/src/modules/set/set.go:47.35,49.2 1 1 +github.com/echovault/echovault/src/modules/set/set.go:51.47,54.16 2 1 +github.com/echovault/echovault/src/modules/set/set.go:54.16,56.3 1 0 +github.com/echovault/echovault/src/modules/set/set.go:58.2,58.46 1 1 +github.com/echovault/echovault/src/modules/set/set.go:58.46,60.3 1 0 +github.com/echovault/echovault/src/modules/set/set.go:62.2,66.15 3 1 +github.com/echovault/echovault/src/modules/set/set.go:66.15,68.44 1 1 +github.com/echovault/echovault/src/modules/set/set.go:68.44,71.4 2 1 +github.com/echovault/echovault/src/modules/set/set.go:72.8,74.40 1 1 +github.com/echovault/echovault/src/modules/set/set.go:74.40,76.38 2 1 +github.com/echovault/echovault/src/modules/set/set.go:76.38,78.59 2 1 +github.com/echovault/echovault/src/modules/set/set.go:78.59,80.6 1 1 +github.com/echovault/echovault/src/modules/set/set.go:81.5,81.8 1 1 +github.com/echovault/echovault/src/modules/set/set.go:86.2,86.12 1 1 +github.com/echovault/echovault/src/modules/set/set.go:89.44,91.26 2 1 +github.com/echovault/echovault/src/modules/set/set.go:91.26,92.24 1 1 +github.com/echovault/echovault/src/modules/set/set.go:92.24,95.4 2 1 +github.com/echovault/echovault/src/modules/set/set.go:97.2,98.14 2 1 +github.com/echovault/echovault/src/modules/set/set.go:101.41,105.2 3 1 +github.com/echovault/echovault/src/modules/set/set.go:107.41,109.2 1 1 +github.com/echovault/echovault/src/modules/set/set.go:112.46,115.27 3 1 +github.com/echovault/echovault/src/modules/set/set.go:115.27,116.31 1 1 +github.com/echovault/echovault/src/modules/set/set.go:116.31,117.24 1 1 +github.com/echovault/echovault/src/modules/set/set.go:117.24,119.5 1 1 +github.com/echovault/echovault/src/modules/set/set.go:122.2,123.13 2 1 +github.com/echovault/echovault/src/modules/set/set.go:126.54,127.22 1 1 +github.com/echovault/echovault/src/modules/set/set.go:127.22,129.3 1 1 +github.com/echovault/echovault/src/modules/set/set.go:130.2,132.10 3 1 +github.com/echovault/echovault/src/modules/set/set.go:138.57,140.19 1 1 +github.com/echovault/echovault/src/modules/set/set.go:141.9,142.24 1 1 +github.com/echovault/echovault/src/modules/set/set.go:143.9,146.43 3 1 +github.com/echovault/echovault/src/modules/set/set.go:146.43,147.56 1 1 +github.com/echovault/echovault/src/modules/set/set.go:147.56,149.10 2 1 +github.com/echovault/echovault/src/modules/set/set.go:151.4,151.32 1 1 +github.com/echovault/echovault/src/modules/set/set.go:151.32,153.5 1 1 +github.com/echovault/echovault/src/modules/set/set.go:155.3,155.36 1 1 +github.com/echovault/echovault/src/modules/set/set.go:156.10,158.11 2 1 +github.com/echovault/echovault/src/modules/set/set.go:158.11,160.4 1 0 +github.com/echovault/echovault/src/modules/set/set.go:161.3,162.11 2 1 +github.com/echovault/echovault/src/modules/set/set.go:162.11,164.4 1 1 +github.com/echovault/echovault/src/modules/set/set.go:165.3,165.42 1 1 +github.com/echovault/echovault/src/modules/set/set.go:170.31,171.19 1 1 +github.com/echovault/echovault/src/modules/set/set.go:172.9,173.17 1 1 +github.com/echovault/echovault/src/modules/set/set.go:174.9,177.15 3 1 +github.com/echovault/echovault/src/modules/set/set.go:178.10,181.28 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:16.105,18.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:18.16,20.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:22.2,31.32 7 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:31.32,32.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:32.29,33.9 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:35.3,35.41 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:36.15,37.74 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:37.74,39.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:40.16,41.25 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:42.12,43.25 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:47.2,47.66 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:47.66,49.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:51.2,53.52 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:53.52,54.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:54.15,55.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:57.3,58.23 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:59.11,60.64 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:61.15,63.49 2 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:63.49,69.5 2 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:70.4,70.49 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:70.49,76.5 2 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:77.16,82.6 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:83.12,88.6 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:93.2,93.27 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:93.27,95.34 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:95.34,96.70 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:96.70,99.61 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:99.61,101.6 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:102.5,102.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:104.4,104.70 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:104.70,108.36 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:108.36,110.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:111.5,111.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:113.4,113.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:113.39,115.13 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:117.4,117.41 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:117.41,120.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:120.25,122.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:123.5,123.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:125.4,125.55 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:129.2,129.32 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:129.32,132.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:132.17,134.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:135.3,137.10 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:137.10,139.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:140.3,141.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:141.17,143.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:145.3,145.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:145.18,148.4 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:150.3,150.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:154.2,154.60 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:154.60,156.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:157.2,160.54 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:160.54,162.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:164.2,164.63 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:167.106,169.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:169.16,171.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:172.2,174.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:174.33,176.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:178.2,178.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:178.52,180.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:181.2,184.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:184.9,186.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:188.2,188.63 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:191.107,193.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:193.16,195.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:197.2,200.40 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:201.10,202.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:203.14,204.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:204.40,206.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:206.9,208.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:209.15,211.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:212.11,214.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:217.2,218.40 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:219.10,220.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:221.14,222.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:222.40,224.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:224.9,226.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:227.15,229.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:230.11,232.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:235.2,235.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:235.33,237.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:239.2,239.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:239.52,241.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:242.2,245.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:245.9,247.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:249.2,250.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:250.33,251.47 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:251.47,253.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:256.2,256.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:259.110,261.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:261.16,263.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:265.2,269.33 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:269.33,271.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:273.2,273.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:273.52,275.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:276.2,279.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:279.9,281.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:283.2,286.38 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:286.38,287.45 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:287.45,289.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:292.2,294.28 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:294.28,296.72 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:296.72,298.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:301.2,301.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:304.106,306.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:306.16,308.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:310.2,310.63 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:310.63,312.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:313.2,313.49 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:313.49,315.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:317.2,318.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:318.15,319.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:319.34,320.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:320.14,322.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:327.2,327.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:327.37,330.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:331.2,331.56 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:331.56,333.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:334.2,336.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:336.9,338.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:341.2,343.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:343.33,344.38 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:344.38,345.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:347.3,348.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:348.17,350.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:351.3,353.10 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:353.10,355.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:356.3,356.27 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:359.2,364.34 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:364.34,365.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:365.20,367.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:367.9,369.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:372.2,374.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:377.111,379.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:379.16,381.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:383.2,386.15 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:386.15,387.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:387.34,388.14 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:388.14,390.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:395.2,395.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:395.37,398.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:399.2,399.56 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:399.56,401.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:402.2,404.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:404.9,406.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:408.2,410.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:410.33,411.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:411.37,412.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:412.58,414.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:415.4,416.11 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:416.11,418.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:419.4,419.28 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:423.2,425.40 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:425.40,426.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:426.60,428.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:429.8,430.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:430.69,432.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:434.2,436.63 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:436.63,438.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:440.2,440.64 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:443.108,445.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:445.16,447.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:449.2,453.40 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:454.10,455.55 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:456.14,457.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:457.57,459.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:459.9,459.64 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:459.64,461.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:461.9,463.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:464.15,466.23 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:467.11,469.23 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:472.2,472.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:472.33,475.61 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:475.61,477.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:478.3,478.114 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:478.114,480.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:481.3,482.99 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:485.2,485.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:485.51,487.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:488.2,490.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:490.9,492.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:493.2,499.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:499.23,501.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:502.2,503.74 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:506.107,508.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:508.16,510.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:512.2,513.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:513.16,515.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:517.2,518.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:518.15,519.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:519.34,520.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:520.14,522.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:526.2,528.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:528.33,529.38 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:529.38,532.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:533.3,533.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:533.57,535.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:536.3,538.10 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:538.10,540.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:541.3,544.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:547.2,551.33 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:551.33,552.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:552.40,553.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:553.18,555.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:555.10,557.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:561.2,563.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:566.112,568.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:568.16,570.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:572.2,575.51 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:575.51,577.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:579.2,580.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:580.16,582.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:584.2,585.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:585.15,586.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:586.34,587.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:587.14,589.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:593.2,595.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:595.33,596.38 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:596.38,598.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:599.3,599.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:599.57,601.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:602.3,604.10 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:604.10,606.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:607.3,610.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:613.2,615.71 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:615.71,616.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:616.60,618.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:619.8,619.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:619.40,620.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:620.69,622.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:624.2,626.68 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:626.68,628.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:630.2,630.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:633.106,635.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:635.16,637.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:639.2,644.56 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:644.56,646.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:647.2,647.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:647.20,648.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:648.19,650.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:651.3,651.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:651.29,653.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:654.3,655.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:655.17,657.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:658.3,658.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:658.13,660.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:661.3,662.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:666.2,666.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:666.57,668.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:669.2,669.21 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:669.21,670.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:670.20,672.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:673.3,674.53 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:674.53,676.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:679.2,679.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:679.33,680.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:680.37,681.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:681.57,682.13 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:684.4,685.35 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:685.35,687.13 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:689.4,690.18 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:690.18,693.5 2 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:694.4,698.38 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:698.38,700.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:702.4,704.27 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:708.2,708.30 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:711.105,713.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:713.16,715.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:717.2,721.42 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:721.42,723.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:725.2,725.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:725.19,727.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:727.17,729.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:730.3,730.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:733.2,733.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:733.33,735.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:737.2,737.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:737.51,739.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:740.2,743.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:743.9,745.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:747.2,748.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:748.16,750.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:752.2,753.36 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:753.36,755.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:757.2,759.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:762.108,764.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:764.16,766.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:768.2,770.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:770.33,772.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:774.2,774.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:774.52,776.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:777.2,780.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:780.9,782.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:784.2,790.36 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:790.36,792.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:792.21,794.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:794.9,796.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:799.2,801.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:804.112,806.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:806.16,808.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:810.2,813.19 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:813.19,815.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:815.17,817.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:820.2,821.19 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:821.19,822.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:822.46,824.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:824.9,826.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:829.2,829.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:829.33,831.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:833.2,833.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:833.52,835.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:836.2,839.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:839.9,841.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:843.2,846.28 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:846.28,847.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:847.17,849.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:849.9,851.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:854.2,856.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:859.106,861.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:861.16,863.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:865.2,869.62 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:869.62,871.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:873.2,873.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:873.33,875.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:877.2,877.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:877.52,879.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:880.2,883.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:883.9,885.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:887.2,888.54 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:888.54,889.44 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:889.44,891.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:892.3,892.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:895.2,895.36 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:895.36,896.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:896.40,897.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:897.18,900.5 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:900.10,902.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:906.2,906.31 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:909.105,911.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:911.16,913.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:915.2,917.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:917.33,919.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:921.2,921.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:921.51,923.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:924.2,927.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:927.9,929.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:931.2,932.28 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:932.28,933.27 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:933.27,935.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:938.2,938.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:941.107,943.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:943.16,945.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:947.2,949.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:949.33,951.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:952.2,952.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:952.52,954.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:955.2,957.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:957.9,959.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:960.2,961.20 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:961.20,963.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:965.2,967.69 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:970.117,972.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:972.16,974.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:976.2,981.16 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:981.16,983.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:985.2,986.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:986.16,988.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:990.2,990.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:990.33,992.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:994.2,994.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:994.51,996.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:997.2,1000.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1000.9,1002.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1004.2,1004.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1004.33,1005.61 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1005.61,1008.4 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1011.2,1011.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1014.116,1016.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1016.16,1018.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1020.2,1023.16 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1023.16,1025.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1027.2,1028.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1028.16,1030.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1032.2,1032.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1032.33,1034.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1036.2,1036.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1036.51,1038.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1039.2,1042.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1042.9,1044.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1046.2,1046.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1046.15,1048.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1049.2,1049.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1049.14,1051.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1053.2,1053.88 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1053.88,1055.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1057.2,1058.54 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1058.54,1060.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1062.2,1064.18 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1064.18,1065.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1065.34,1068.4 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1069.8,1070.34 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1070.34,1073.4 2 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1076.2,1076.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1079.115,1081.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1081.16,1083.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1085.2,1089.33 4 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1089.33,1091.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1093.2,1093.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1093.51,1095.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1096.2,1099.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1099.9,1101.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1103.2,1106.38 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1106.38,1107.45 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1107.45,1109.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1112.2,1115.28 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1115.28,1117.72 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1117.72,1120.4 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1123.2,1123.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1126.107,1128.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1128.16,1130.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1132.2,1141.65 9 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1141.65,1143.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1145.2,1145.62 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1145.62,1147.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1149.2,1149.54 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1149.54,1151.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1151.5,1153.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1153.8,1156.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1156.17,1158.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1159.3,1160.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1160.17,1162.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1165.2,1165.54 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1165.54,1167.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1167.5,1168.61 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1168.61,1170.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1171.3,1171.50 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1171.50,1173.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1174.3,1175.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1175.17,1177.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1178.3,1178.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1178.17,1180.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1181.3,1182.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1182.17,1184.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1187.2,1187.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1187.33,1189.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1191.2,1191.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1191.52,1193.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1194.2,1197.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1197.9,1199.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1201.2,1201.32 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1201.32,1203.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1204.2,1204.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1204.15,1206.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1208.2,1209.42 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1209.42,1210.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1210.55,1212.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1212.15,1214.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1215.4,1215.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1218.2,1218.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1218.40,1220.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1220.39,1221.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1221.46,1223.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1225.3,1225.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1225.55,1226.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1226.15,1228.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1229.4,1229.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1233.2,1235.35 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1235.35,1236.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1236.24,1237.9 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1239.3,1239.43 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1239.43,1240.85 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1240.85,1242.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1243.4,1243.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1245.3,1246.81 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1246.81,1248.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1251.2,1253.34 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1253.34,1254.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1254.17,1256.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1256.9,1258.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1261.2,1263.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1266.112,1268.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1268.16,1270.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1272.2,1282.62 10 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1282.62,1284.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1286.2,1286.54 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1286.54,1288.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1288.5,1290.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1290.8,1293.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1293.17,1295.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1296.3,1297.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1297.17,1299.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1302.2,1302.54 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1302.54,1304.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1304.5,1305.61 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1305.61,1307.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1308.3,1308.50 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1308.50,1310.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1311.3,1312.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1312.17,1314.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1315.3,1315.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1315.17,1317.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1318.3,1319.17 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1319.17,1321.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1324.2,1324.36 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1324.36,1326.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1328.2,1328.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1328.55,1330.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1331.2,1334.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1334.9,1336.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1338.2,1338.32 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1338.32,1340.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1341.2,1341.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1341.15,1343.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1345.2,1346.42 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1346.42,1347.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1347.55,1349.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1349.15,1351.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1352.4,1352.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1355.2,1355.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1355.40,1357.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1357.39,1358.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1358.46,1360.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1362.3,1362.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1362.55,1363.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1363.15,1365.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1366.4,1366.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1370.2,1372.35 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1372.35,1373.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1373.24,1374.9 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1376.3,1376.43 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1376.43,1377.85 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1377.85,1379.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1380.4,1380.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1382.3,1383.81 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1383.81,1385.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1388.2,1390.40 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1390.40,1391.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1391.60,1393.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1394.8,1395.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1395.69,1397.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1399.2,1401.71 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1401.71,1403.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1405.2,1405.72 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1408.107,1409.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1409.46,1411.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1413.2,1414.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1414.16,1416.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1418.2,1419.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1419.15,1420.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1420.34,1421.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1421.14,1423.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1427.2,1429.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1429.33,1430.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1430.37,1431.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1431.58,1433.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1434.4,1436.11 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1436.11,1438.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1439.4,1442.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1446.2,1449.35 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1449.35,1450.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1450.17,1452.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1452.9,1454.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1457.2,1459.25 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1462.112,1464.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1464.16,1466.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1468.2,1471.51 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1471.51,1473.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1475.2,1476.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1476.16,1478.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1480.2,1481.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1481.15,1482.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1482.34,1483.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1483.14,1485.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1489.2,1491.33 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1491.33,1492.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1492.37,1493.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1493.58,1495.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1496.4,1498.11 3 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1498.11,1500.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1501.4,1504.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1508.2,1510.40 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1510.40,1511.60 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1511.60,1513.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1514.8,1515.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1515.69,1517.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1519.2,1521.64 2 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1521.64,1523.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1525.2,1525.65 1 1 +github.com/echovault/echovault/src/modules/sorted_set/commands.go:1528.33,1775.2 1 0 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:10.50,11.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:11.18,13.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:14.2,14.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:17.51,18.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:18.19,20.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:21.2,21.21 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:24.52,25.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:25.19,27.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:28.2,28.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:31.51,32.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:32.18,34.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:36.2,36.63 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:36.63,38.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:40.2,40.27 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:40.27,42.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:44.2,44.36 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:47.56,48.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:48.18,50.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:51.2,51.21 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:54.53,55.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:55.19,57.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:58.2,58.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:61.52,62.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:62.18,64.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:65.2,65.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:65.58,68.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:68.39,70.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:71.3,71.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:73.2,73.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:73.18,75.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:76.2,76.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:76.17,78.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:79.2,79.49 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:82.57,83.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:83.18,85.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:86.2,86.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:86.58,89.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:89.39,91.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:92.3,92.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:94.2,94.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:94.18,96.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:97.2,97.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:97.17,99.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:100.2,100.49 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:103.51,104.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:104.18,106.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:107.2,107.54 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:107.54,109.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:110.2,110.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:110.18,112.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:113.2,113.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:113.17,115.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:116.2,116.49 1 0 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:119.53,120.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:120.18,122.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:123.2,123.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:126.50,127.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:127.34,129.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:130.2,130.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:133.57,134.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:134.34,136.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:137.2,137.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:140.51,141.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:141.34,143.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:144.2,144.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:147.50,148.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:148.18,150.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:151.2,151.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:154.54,155.18 1 0 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:155.18,157.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:158.2,158.22 1 0 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:161.52,162.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:162.19,164.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:165.2,165.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:168.60,169.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:169.19,171.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:172.2,172.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:175.61,176.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:176.19,178.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:179.2,179.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:182.62,183.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:183.19,185.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:186.2,186.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:189.55,190.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:190.19,192.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:193.2,193.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:196.53,197.35 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:197.35,199.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:200.2,200.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:203.57,204.35 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:204.35,206.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:207.2,207.22 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:210.52,211.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:211.18,213.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:214.2,214.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:214.58,217.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:217.39,219.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:220.3,220.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:222.2,222.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:222.18,224.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:225.2,225.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:225.17,227.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:228.2,228.49 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:231.57,232.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:232.18,234.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:235.2,235.58 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:235.58,238.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:238.39,240.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:241.3,241.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:243.2,243.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:243.18,245.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:246.2,246.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:246.17,248.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/key_funcs.go:249.2,249.49 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:34.53,38.28 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:38.28,44.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:45.2,45.10 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:48.46,50.2 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:52.49,54.2 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:56.58,61.41 3 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:61.41,63.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:65.2,67.15 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:67.15,69.44 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:69.44,72.4 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:73.8,75.40 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:75.40,77.58 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:77.58,79.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:79.7,81.57 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:81.57,83.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:84.5,84.8 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:89.2,89.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:92.46,94.32 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:94.32,99.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:100.2,100.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:103.41,105.2 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:109.16,111.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:111.16,113.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:114.2,115.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:115.16,117.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:118.2,119.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:119.16,121.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:122.2,123.16 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:123.16,125.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:126.2,126.51 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:126.51,128.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:129.2,129.57 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:129.57,131.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:133.2,135.36 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:135.36,136.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:136.29,137.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:137.30,147.5 3 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:148.4,148.101 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:148.101,150.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:151.4,156.35 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:156.35,158.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:160.3,160.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:163.2,163.28 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:163.28,164.38 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:164.38,166.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:166.29,172.36 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:172.36,174.6 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:176.4,176.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:178.3,178.38 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:178.38,180.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:180.30,187.5 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:188.4,188.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:191.3,191.76 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:191.76,193.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:194.3,198.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:200.2,200.19 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:203.44,204.21 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:204.21,207.3 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:208.2,208.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:211.73,213.71 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:213.71,215.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:216.2,216.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:216.15,218.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:219.2,219.16 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:219.16,221.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:223.2,225.54 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:225.54,226.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:226.39,228.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:229.3,229.39 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:232.2,232.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:232.29,233.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:233.24,234.9 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:236.3,238.17 3 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:238.17,240.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:243.2,243.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:246.64,248.28 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:248.28,249.33 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:249.33,250.29 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:250.29,252.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:255.2,255.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:264.53,265.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:265.46,267.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:268.2,268.28 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:268.28,270.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:271.2,271.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:271.37,272.36 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:272.36,274.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:275.3,275.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:275.52,277.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:279.2,279.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:283.70,284.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:285.9,286.39 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:287.9,289.52 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:289.52,294.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:295.3,295.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:296.9,299.52 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:299.52,301.48 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:301.48,306.13 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:309.4,311.42 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:311.42,313.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:314.17,315.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:316.17,317.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:318.14,320.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:327.4,327.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:331.3,331.52 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:331.52,332.65 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:332.65,334.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:334.7,339.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:341.3,341.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:342.10,349.40 4 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:349.40,350.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:350.37,353.13 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:355.4,357.42 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:357.42,358.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:359.17,360.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:361.17,362.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:363.14,365.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:371.3,371.41 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:371.41,372.65 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:372.65,374.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:374.7,376.5 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:378.3,378.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:383.74,384.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:385.9,386.39 1 0 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:387.9,389.52 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:389.52,394.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:395.3,395.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:396.9,399.52 2 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:399.52,401.48 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:401.48,402.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:405.4,407.42 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:407.42,409.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:410.17,411.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:412.17,413.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:414.14,416.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:423.4,423.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:425.3,425.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:426.10,432.40 4 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:432.40,433.37 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:433.37,434.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:436.4,438.42 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:438.42,439.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:440.17,441.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:442.17,443.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:444.14,446.46 1 1 +github.com/echovault/echovault/src/modules/sorted_set/sorted_set.go:452.3,452.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:11.97,13.60 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:13.60,15.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:16.2,16.24 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:16.24,17.48 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:17.48,18.85 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:18.85,19.10 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:21.4,22.18 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:22.18,24.5 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:25.4,25.32 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:29.2,30.62 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:30.62,32.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:33.2,33.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:33.26,34.94 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:34.94,36.4 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:37.3,37.53 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:40.2,41.63 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:41.63,43.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:44.2,44.27 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:44.27,46.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:49.2,50.85 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:50.85,51.26 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:51.26,52.12 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:54.3,54.31 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:54.31,56.12 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:58.3,58.41 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:58.41,60.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:63.2,64.30 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:64.30,66.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:66.8,68.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:70.2,70.55 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:70.55,72.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:72.8,72.31 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:72.31,73.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:73.34,75.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:78.2,78.50 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:81.69,82.25 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:82.25,84.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:85.2,87.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:87.9,89.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:90.2,90.69 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:90.69,92.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:93.2,93.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:96.65,97.23 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:97.23,99.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:100.2,102.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:102.9,104.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:105.2,105.67 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:105.67,107.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:108.2,108.18 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:111.59,112.20 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:112.20,114.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:115.2,117.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:117.9,119.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:120.2,120.34 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:120.34,122.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:123.2,123.16 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:126.53,127.17 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:127.17,129.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:130.2,132.9 3 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:132.9,134.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:135.2,135.35 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:135.35,137.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:138.2,138.15 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:141.61,142.31 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:143.10,144.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:145.12,146.16 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:146.16,148.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:149.3,149.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:150.12,151.16 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:151.16,153.4 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:154.3,154.13 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:160.43,161.14 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:161.14,163.3 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:164.2,164.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:164.30,166.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:167.2,167.30 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:167.30,169.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:171.2,172.21 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:172.21,174.3 1 0 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:176.2,177.29 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:177.29,179.13 2 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:179.13,180.9 1 1 +github.com/echovault/echovault/src/modules/sorted_set/utils.go:184.2,184.10 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:11.109,13.16 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:13.16,15.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:17.2,20.9 3 1 +github.com/echovault/echovault/src/modules/string/commands.go:20.9,22.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:24.2,26.33 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:26.33,27.61 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:27.61,29.4 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:30.3,30.58 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:30.58,32.4 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:33.3,34.58 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:37.2,37.52 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:37.52,39.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:40.2,43.9 3 1 +github.com/echovault/echovault/src/modules/string/commands.go:43.9,45.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:48.2,48.24 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:48.24,50.58 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:50.58,52.4 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:53.3,53.58 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:57.2,57.16 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:57.16,59.58 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:59.58,61.4 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:62.3,62.58 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:65.2,67.35 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:67.35,69.24 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:69.24,72.12 3 1 +github.com/echovault/echovault/src/modules/string/commands.go:75.3,76.8 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:79.2,79.67 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:79.67,81.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:83.2,83.59 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:86.107,88.16 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:88.16,90.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:92.2,94.33 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:94.33,96.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:98.2,98.53 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:98.53,100.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:101.2,105.9 3 1 +github.com/echovault/echovault/src/modules/string/commands.go:105.9,107.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:109.2,109.56 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:112.107,114.16 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:114.16,116.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:118.2,124.24 5 1 +github.com/echovault/echovault/src/modules/string/commands.go:124.24,126.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:128.2,128.33 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:128.33,130.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:132.2,132.52 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:132.52,134.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:135.2,138.9 3 1 +github.com/echovault/echovault/src/modules/string/commands.go:138.9,140.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:142.2,142.15 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:142.15,144.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:145.2,145.13 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:145.13,147.3 1 0 +github.com/echovault/echovault/src/modules/string/commands.go:149.2,149.30 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:149.30,151.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:153.2,153.22 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:153.22,155.3 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:157.2,157.17 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:157.17,160.3 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:162.2,164.14 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:164.14,166.38 2 1 +github.com/echovault/echovault/src/modules/string/commands.go:166.38,168.4 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:169.3,169.12 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:172.2,172.65 1 1 +github.com/echovault/echovault/src/modules/string/commands.go:175.33,210.2 1 0 +github.com/echovault/echovault/src/modules/string/key_funcs.go:8.54,9.19 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:9.19,11.3 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:12.2,12.30 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:15.52,16.19 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:16.19,18.3 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:19.2,19.30 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:22.52,23.19 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:23.19,25.3 1 1 +github.com/echovault/echovault/src/modules/string/key_funcs.go:26.2,26.30 1 1 diff --git a/src/modules/acl/acl.go b/src/modules/acl/acl.go index 1a6545b6..3bcfb433 100644 --- a/src/modules/acl/acl.go +++ b/src/modules/acl/acl.go @@ -16,18 +16,20 @@ import ( "reflect" "slices" "strings" + "sync" "time" ) type Connection struct { - Authenticated bool - User *User + Authenticated bool // Whether the connection has been authenticated + User *User // The user the connection is associated with } type ACL struct { - Users []*User - Connections map[*net.Conn]Connection - Config utils.Config + Users []*User // List of ACL user profiles + UsersMutex sync.RWMutex // RWMutex for concurrency control when accessing ACL profile list + Connections map[*net.Conn]Connection // Connections to the server that are currently registered with the ACL module + Config utils.Config // Server configuration that contains the relevant ACL config options GlobPatterns map[string]glob.Glob } @@ -93,6 +95,7 @@ func NewACL(config utils.Config) *ACL { acl := ACL{ Users: users, + UsersMutex: sync.RWMutex{}, Connections: make(map[*net.Conn]Connection), Config: config, GlobPatterns: make(map[string]glob.Glob), @@ -104,6 +107,9 @@ func NewACL(config utils.Config) *ACL { } func (acl *ACL) RegisterConnection(conn *net.Conn) { + acl.LockUsers() + defer acl.UnlockUsers() + // This is called only when a connection is established. defaultUserIdx := slices.IndexFunc(acl.Users, func(user *User) bool { return user.Username == "default" @@ -115,7 +121,10 @@ func (acl *ACL) RegisterConnection(conn *net.Conn) { } } -func (acl *ACL) SetUser(ctx context.Context, cmd []string) error { +func (acl *ACL) SetUser(cmd []string) error { + acl.LockUsers() + defer acl.UnlockUsers() + // Check if user with the given username already exists // If it does, replace user variable with this user for _, user := range acl.Users { @@ -144,7 +153,10 @@ func (acl *ACL) SetUser(ctx context.Context, cmd []string) error { return nil } -func (acl *ACL) DeleteUser(ctx context.Context, usernames []string) error { +func (acl *ACL) DeleteUser(_ context.Context, usernames []string) error { + acl.LockUsers() + defer acl.UnlockUsers() + var user *User for _, username := range usernames { if username == "default" { @@ -164,18 +176,21 @@ func (acl *ACL) DeleteUser(ctx context.Context, usernames []string) error { // Terminate every connection attached to this user for connRef, connection := range acl.Connections { if connection.User.Username == user.Username { - (*connRef).SetReadDeadline(time.Now().Add(-1 * time.Second)) + _ = (*connRef).SetReadDeadline(time.Now().Add(-1 * time.Second)) } } // Delete the user from the ACL acl.Users = slices.DeleteFunc(acl.Users, func(u *User) bool { - return u.Username != user.Username + return u.Username == user.Username }) } return nil } -func (acl *ACL) AuthenticateConnection(ctx context.Context, conn *net.Conn, cmd []string) error { +func (acl *ACL) AuthenticateConnection(_ context.Context, conn *net.Conn, cmd []string) error { + acl.RLockUsers() + defer acl.RUnlockUsers() + var passwords []Password var user *User @@ -194,6 +209,7 @@ func (acl *ACL) AuthenticateConnection(ctx context.Context, conn *net.Conn, cmd }) user = acl.Users[idx] } + if len(cmd) == 3 { // Process AUTH h.Write([]byte(cmd[2])) @@ -248,6 +264,9 @@ func (acl *ACL) AuthenticateConnection(ctx context.Context, conn *net.Conn, cmd } func (acl *ACL) AuthorizeConnection(conn *net.Conn, cmd []string, command utils.Command, subCommand utils.SubCommand) error { + acl.RLockUsers() + defer acl.RUnlockUsers() + // Extract command, categories, and keys comm := command.Command categories := command.Categories @@ -278,7 +297,6 @@ func (acl *ACL) AuthorizeConnection(conn *net.Conn, cmd []string, command utils. // If the command is 'auth', then return early and allow it if strings.EqualFold(comm, "auth") { - // TODO: Add rate limiting to prevent auth spamming return nil } @@ -339,7 +357,7 @@ func (acl *ACL) AuthorizeConnection(conn *net.Conn, cmd []string, command utils. return fmt.Errorf("not authorised to run %s command", comm) } - // 6. PUBSUB authorisation comes first because it has slightly different handling. + // 6. PUBSUB authorisation. if slices.Contains(categories, utils.PubSubCategory) { // In PUBSUB, KeyExtractionFunc returns channels so keys[0] is aliased to channel channel := keys[0] @@ -421,3 +439,19 @@ func (acl *ACL) CompileGlobs() { } } } + +func (acl *ACL) LockUsers() { + acl.UsersMutex.Lock() +} + +func (acl *ACL) UnlockUsers() { + acl.UsersMutex.Unlock() +} + +func (acl *ACL) RLockUsers() { + acl.UsersMutex.RLock() +} + +func (acl *ACL) RUnlockUsers() { + acl.UsersMutex.RUnlock() +} diff --git a/src/modules/acl/commands.go b/src/modules/acl/commands.go index 939e8f78..7297c6ef 100644 --- a/src/modules/acl/commands.go +++ b/src/modules/acl/commands.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/echovault/echovault/src/utils" "gopkg.in/yaml.v3" + "log" "net" "os" "path" @@ -28,7 +29,7 @@ func handleAuth(ctx context.Context, cmd []string, server utils.Server, conn *ne return []byte(utils.OkResponse), nil } -func handleGetUser(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleGetUser(_ context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) != 3 { return nil, errors.New(utils.WrongArgsResponse) } @@ -110,22 +111,23 @@ func handleGetUser(ctx context.Context, cmd []string, server utils.Server, conn // keys allKeys := user.IncludedReadKeys - for _, key := range user.IncludedWriteKeys { + for _, key := range append(user.IncludedWriteKeys, user.IncludedReadKeys...) { if !slices.Contains(allKeys, key) { allKeys = append(allKeys, key) } } res = res + fmt.Sprintf("\r\n+keys\r\n*%d", len(allKeys)) - for _, key := range user.IncludedReadKeys { - if slices.Contains(user.IncludedWriteKeys, key) { + for _, key := range allKeys { + switch { + case slices.Contains(user.IncludedWriteKeys, key) && slices.Contains(user.IncludedReadKeys, key): + // Key is RW res = res + fmt.Sprintf("\r\n+%s~%s", "%RW", key) - continue - } - res = res + fmt.Sprintf("\r\n+%s~%s", "%R", key) - } - for _, key := range user.IncludedWriteKeys { - if !slices.Contains(user.IncludedReadKeys, key) { + case slices.Contains(user.IncludedWriteKeys, key): + // Keys is W-Only res = res + fmt.Sprintf("\r\n+%s~%s", "%W", key) + case slices.Contains(user.IncludedReadKeys, key): + // Key is R-Only + res = res + fmt.Sprintf("\r\n+%s~%s", "%R", key) } } @@ -144,7 +146,7 @@ func handleGetUser(ctx context.Context, cmd []string, server utils.Server, conn return []byte(res), nil } -func handleCat(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleCat(ctx context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) > 3 { return nil, errors.New(utils.WrongArgsResponse) } @@ -201,10 +203,10 @@ func handleCat(ctx context.Context, cmd []string, server utils.Server, conn *net } } - return nil, errors.New("category not found") + return nil, fmt.Errorf("category %s not found", strings.ToUpper(cmd[2])) } -func handleUsers(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleUsers(_ context.Context, _ []string, server utils.Server, _ *net.Conn) ([]byte, error) { acl, ok := server.GetACL().(*ACL) if !ok { return nil, errors.New("could not load ACL") @@ -217,18 +219,18 @@ func handleUsers(ctx context.Context, cmd []string, server utils.Server, conn *n return []byte(res), nil } -func handleSetUser(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleSetUser(_ context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { acl, ok := server.GetACL().(*ACL) if !ok { return nil, errors.New("could not load ACL") } - if err := acl.SetUser(ctx, cmd[2:]); err != nil { + if err := acl.SetUser(cmd[2:]); err != nil { return nil, err } return []byte(utils.OkResponse), nil } -func handleDelUser(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleDelUser(ctx context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) < 3 { return nil, errors.New(utils.WrongArgsResponse) } @@ -242,7 +244,7 @@ func handleDelUser(ctx context.Context, cmd []string, server utils.Server, conn return []byte(utils.OkResponse), nil } -func handleWhoAmI(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleWhoAmI(_ context.Context, _ []string, server utils.Server, conn *net.Conn) ([]byte, error) { acl, ok := server.GetACL().(*ACL) if !ok { return nil, errors.New("could not load ACL") @@ -251,7 +253,7 @@ func handleWhoAmI(ctx context.Context, cmd []string, server utils.Server, conn * return []byte(fmt.Sprintf("+%s\r\n", connectionInfo.User.Username)), nil } -func handleList(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleList(_ context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) > 2 { return nil, errors.New(utils.WrongArgsResponse) } @@ -347,7 +349,7 @@ func handleList(ctx context.Context, cmd []string, server utils.Server, conn *ne return []byte(res), nil } -func handleLoad(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleLoad(_ context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) != 3 { return nil, errors.New(utils.WrongArgsResponse) } @@ -357,6 +359,9 @@ func handleLoad(ctx context.Context, cmd []string, server utils.Server, conn *ne return nil, errors.New("could not load ACL") } + acl.LockUsers() + defer acl.RUnlockUsers() + f, err := os.Open(acl.Config.AclConfig) if err != nil { return nil, err @@ -364,8 +369,7 @@ func handleLoad(ctx context.Context, cmd []string, server utils.Server, conn *ne defer func() { if err := f.Close(); err != nil { - // TODO: Log file close error with context - fmt.Println(err) + log.Println(err) } }() @@ -412,7 +416,7 @@ func handleLoad(ctx context.Context, cmd []string, server utils.Server, conn *ne return []byte(utils.OkResponse), nil } -func handleSave(ctx context.Context, cmd []string, server utils.Server, conn *net.Conn) ([]byte, error) { +func handleSave(_ context.Context, cmd []string, server utils.Server, _ *net.Conn) ([]byte, error) { if len(cmd) > 2 { return nil, errors.New(utils.WrongArgsResponse) } @@ -422,6 +426,9 @@ func handleSave(ctx context.Context, cmd []string, server utils.Server, conn *ne return nil, errors.New("could not load ACL") } + acl.RLockUsers() + acl.RUnlockUsers() + f, err := os.OpenFile(acl.Config.AclConfig, os.O_WRONLY|os.O_CREATE, os.ModeAppend) if err != nil { return nil, err @@ -429,8 +436,7 @@ func handleSave(ctx context.Context, cmd []string, server utils.Server, conn *ne defer func() { if err := f.Close(); err != nil { - // TODO: Log file close error with context - fmt.Println(err) + log.Println(err) } }() @@ -490,10 +496,11 @@ func Commands() []utils.Command { }, SubCommands: []utils.SubCommand{ { - Command: "cat", - Categories: []string{utils.SlowCategory}, - Description: "(ACL CAT [category]) List all the categories and commands inside a category.", - Sync: false, + Command: "cat", + Categories: []string{utils.SlowCategory}, + Description: `(ACL CAT [category]) List all the categories. +If the optional category is provided, list all the commands in the category`, + Sync: false, KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, @@ -565,7 +572,7 @@ func Commands() []utils.Command { Description: ` (ACL LOAD ) Reloads the rules from the configured ACL config file. When 'MERGE' is passed, users from config file who share a username with users in memory will be merged. -When 'REPLACED' is passed, users from config file who share a username with users in memory will replace the user in memory.`, +When 'REPLACE' is passed, users from config file who share a username with users in memory will replace the user in memory.`, Sync: true, KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil diff --git a/src/modules/acl/commands_test.go b/src/modules/acl/commands_test.go index a9313ebd..43dee8c6 100644 --- a/src/modules/acl/commands_test.go +++ b/src/modules/acl/commands_test.go @@ -1,23 +1,1431 @@ package acl -import "testing" +import ( + "context" + "crypto/sha256" + "fmt" + "github.com/echovault/echovault/src/server" + "github.com/echovault/echovault/src/utils" + "github.com/tidwall/resp" + "net" + "slices" + "strings" + "testing" +) -func Test_HandleAuth(t *testing.T) {} +var bindAddr string +var port uint16 +var mockServer *server.Server -func Test_HandleCat(t *testing.T) {} +var acl *ACL -func Test_HandleUsers(t *testing.T) {} +func init() { + bindAddr = "localhost" + port = 7490 -func Test_HandleSetUser(t *testing.T) {} + mockServer = setUpServer(bindAddr, port, true, "") -func Test_HandleGetUser(t *testing.T) {} + go func() { + mockServer.Start(context.Background()) + }() +} -func Test_HandleDelUser(t *testing.T) {} +func setUpServer(bindAddr string, port uint16, requirePass bool, aclConfig string) *server.Server { + config := utils.Config{ + BindAddr: bindAddr, + Port: port, + DataDir: "", + EvictionPolicy: utils.NoEviction, + RequirePass: requirePass, + Password: "password1", + AclConfig: aclConfig, + } -func Test_HandleWhoAmI(t *testing.T) {} + acl = NewACL(config) + acl.Users = append(acl.Users, generateInitialTestUsers()...) -func Test_HandleList(t *testing.T) {} + return server.NewServer(server.Opts{ + Config: config, + ACL: acl, + Commands: Commands(), + }) +} -func Test_HandleLoad(t *testing.T) {} +func generateInitialTestUsers() []*User { + // User with both hash password and plaintext password + withPasswordUser := CreateUser("with_password_user") + h := sha256.New() + h.Write([]byte("password3")) + withPasswordUser.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "password2"}, + {PasswordType: PasswordSHA256, PasswordValue: string(h.Sum(nil))}, + } + withPasswordUser.IncludedCategories = []string{"*"} + withPasswordUser.IncludedCommands = []string{"*"} -func Test_HandleSave(t *testing.T) {} + // User with NoPassword option + noPasswordUser := CreateUser("no_password_user") + noPasswordUser.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "password4"}, + } + noPasswordUser.NoPassword = true + + // Disabled user + disabledUser := CreateUser("disabled_user") + disabledUser.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "password5"}, + } + disabledUser.Enabled = false + + return []*User{ + withPasswordUser, + noPasswordUser, + disabledUser, + } +} + +// compareSlices compare the elements in 2 slices, it checks if every element is s1 is contained in s2 +// and vice versa. It essentially does a deep equality comparison. +// This is done manually rather than using slices.Equal because it would be ideal to throw an error +// specifying exactly which items are missing in either slice. +func compareSlices[T comparable](res, expected []T) error { + if len(res) != len(expected) { + return fmt.Errorf("expected slice of length %d, got slice of length %d", len(expected), len(res)) + } + // Check whether all elements in res are contained in expected + for _, r := range res { + if !slices.Contains(expected, r) { + return fmt.Errorf("got response item %+v, but it's not contained in expected slices", r) + } + } + // Check whether all elements in expected are contained in res + for _, e := range expected { + if !slices.Contains(res, e) { + return fmt.Errorf("expected element %+v, not found in res slice", e) + } + } + return nil +} + +// compareUsers compares 2 users and checks if all their fields are equal +func compareUsers(user1, user2 *User) error { + // Compare flags + if user1.Username != user2.Username { + return fmt.Errorf("mismatched usernames \"%s\", and \"%s\"", user1.Username, user2.Username) + } + if user1.Enabled != user2.Enabled { + return fmt.Errorf("mismatched enabled flag \"%+v\", and \"%+v\"", user1.Enabled, user2.Enabled) + } + if user1.NoPassword != user2.NoPassword { + return fmt.Errorf("mismatched nopassword flag \"%+v\", and \"%+v\"", user1.NoPassword, user2.NoPassword) + } + if user1.NoKeys != user2.NoKeys { + return fmt.Errorf("mismatched nokeys flag \"%+v\", and \"%+v\"", user1.NoKeys, user2.NoKeys) + } + + // Compare passwords + for _, password1 := range user1.Passwords { + if !slices.ContainsFunc(user2.Passwords, func(password2 Password) bool { + return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue + }) { + return fmt.Errorf("found password %+v in user1 that was not found in user2", password1) + } + } + for _, password2 := range user2.Passwords { + if !slices.ContainsFunc(user1.Passwords, func(password1 Password) bool { + return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue + }) { + return fmt.Errorf("found password %+v in user2 that was not found in user1", password2) + } + } + + // Compare permissions + permissions := [][][]string{ + {user1.IncludedCategories, user2.IncludedCategories}, + {user1.ExcludedCategories, user2.ExcludedCategories}, + {user1.IncludedCommands, user2.IncludedCommands}, + {user1.ExcludedCommands, user2.ExcludedCommands}, + {user1.IncludedReadKeys, user2.IncludedReadKeys}, + {user1.IncludedWriteKeys, user2.IncludedWriteKeys}, + {user1.IncludedPubSubChannels, user2.IncludedPubSubChannels}, + {user1.ExcludedPubSubChannels, user2.ExcludedPubSubChannels}, + } + for _, p := range permissions { + if err := compareSlices(p[0], p[1]); err != nil { + return err + } + } + + return nil +} + +func generateSHA256Password(plain string) string { + h := sha256.New() + h.Write([]byte(plain)) + return string(h.Sum(nil)) +} + +func Test_HandleAuth(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + r := resp.NewConn(conn) + + tests := []struct { + cmd []resp.Value + wantRes string + wantErr string + }{ + { // 1. Authenticate with default user without specifying username + cmd: []resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}, + wantRes: "OK", + wantErr: "", + }, + { // 2. Authenticate with plaintext password + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("with_password_user"), + resp.StringValue("password2"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 3. Authenticate with SHA256 password + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("with_password_user"), + resp.StringValue("password3"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 4. Authenticate with no password user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("no_password_user"), + resp.StringValue("password4"), + }, + wantRes: "OK", + wantErr: "", + }, + { // 5. Fail to authenticate with disabled user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("disabled_user"), + resp.StringValue("password5"), + }, + wantRes: "", + wantErr: "Error user disabled_user is disabled", + }, + { // 6. Fail to authenticate with non-existent user + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("non_existent_user"), + resp.StringValue("password6"), + }, + wantRes: "", + wantErr: "Error no user with username non_existent_user", + }, + { // 7. Command too short + cmd: []resp.Value{resp.StringValue("AUTH")}, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", utils.WrongArgsResponse), + }, + { // 8. Command too long + cmd: []resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue("user"), + resp.StringValue("password1"), + resp.StringValue("password2"), + }, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", utils.WrongArgsResponse), + }, + } + + for _, test := range tests { + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if rv.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) + } + continue + } + if rv.String() != test.wantRes { + t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, rv.String()) + } + } +} + +func Test_HandleCat(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + r := resp.NewConn(conn) + + // Authenticate connection + if err = r.WriteArray([]resp.Value{resp.StringValue("AUTH"), resp.StringValue("password1")}); err != nil { + t.Error(err) + } + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if rv.String() != "OK" { + t.Error("could not authenticate user") + } + + // Since only ACL commands are loaded in this test suite, this test will only test against the + // list of categories and commands available in the ACL module. + tests := []struct { + cmd []resp.Value + wantRes []string + wantErr string + }{ + { // 1. Return list of categories + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT")}, + wantRes: []string{ + utils.ConnectionCategory, + utils.SlowCategory, + utils.FastCategory, + utils.AdminCategory, + utils.DangerousCategory, + }, + wantErr: "", + }, + { // 2. Return list of commands in connection category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(utils.ConnectionCategory)}, + wantRes: []string{"auth"}, + wantErr: "", + }, + { // 3. Return list of commands in slow category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(utils.SlowCategory)}, + wantRes: []string{"auth", "acl|cat", "acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 4. Return list of commands in fast category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(utils.FastCategory)}, + wantRes: []string{"acl|whoami"}, + wantErr: "", + }, + { // 5. Return list of commands in admin category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(utils.AdminCategory)}, + wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 6. Return list of commands in dangerous category + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue(utils.DangerousCategory)}, + wantRes: []string{"acl|users", "acl|setuser", "acl|getuser", "acl|deluser", "acl|list", "acl|load", "acl|save"}, + wantErr: "", + }, + { // 7. Return error when category does not exist + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("non-existent")}, + wantRes: nil, + wantErr: "Error category NON-EXISTENT not found", + }, + { // 8. Command too long + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("CAT"), resp.StringValue("category1"), resp.StringValue("category2")}, + wantRes: nil, + wantErr: fmt.Sprintf("Error %s", utils.WrongArgsResponse), + }, + } + + for _, test := range tests { + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + rv, _, err = r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if rv.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, rv.Error().Error()) + } + continue + } + resArr := rv.Array() + // Check if all the elements in the expected array are in the response array + for _, expected := range test.wantRes { + if !slices.ContainsFunc(resArr, func(value resp.Value) bool { + return value.String() == expected + }) { + t.Errorf("could not find expected command \"%s\" in the response array for category", expected) + } + } + // Check if all the elements in the response array are in the expected array + for _, value := range resArr { + if !slices.ContainsFunc(test.wantRes, func(expected string) bool { + return value.String() == expected + }) { + t.Errorf("could not find response command \"%s\" in the expected array", value.String()) + } + } + } +} + +func Test_HandleUsers(t *testing.T) { + var port uint16 = 7491 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start(context.Background()) + }() + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + users := []string{"default", "with_password_user", "no_password_user", "disabled_user"} + + if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("USERS")}); err != nil { + t.Error(err) + } + + rv, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + + resArr := rv.Array() + + // Check if all the expected users are in the response array + for _, user := range users { + if !slices.ContainsFunc(resArr, func(value resp.Value) bool { + return value.String() == user + }) { + t.Errorf("could not find expected user \"%s\" in response array", user) + } + } + + // Check if all the users in the response array are in the expected users + for _, value := range resArr { + if !slices.ContainsFunc(users, func(user string) bool { + return value.String() == user + }) { + t.Errorf("could not find response user \"%s\" in expected users array", value.String()) + } + } +} + +func Test_HandleSetUser(t *testing.T) { + var port uint16 = 7492 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start(context.Background()) + }() + acl, ok := mockServer.GetACL().(*ACL) + if !ok { + t.Error("error loading ACL module") + } + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *User + cmd []resp.Value + wantRes string + wantErr string + wantUser *User + }{ + { + // 1. Create new enabled user + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_1"), + resp.StringValue("on"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_1") + user.Enabled = true + user.Normalise() + return user + }(), + }, + { + // 2. Create new disabled user + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_2"), + resp.StringValue("off"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_2") + user.Enabled = false + user.Normalise() + return user + }(), + }, + { + // 3. Create new enabled user with both plaintext and SHA256 passwords + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_3"), + resp.StringValue("on"), + resp.StringValue(">set_user_3_plaintext_password_1"), + resp.StringValue(">set_user_3_plaintext_password_2"), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_1"))), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("set_user_3_hash_password_2"))), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_3") + user.Enabled = true + user.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, + {PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, + } + user.Normalise() + return user + }(), + }, + { + // 4. Remove plaintext and SHA256 password from existing user + presetUser: func() *User { + user := CreateUser("set_user_4") + user.Enabled = true + user.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, + {PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_4"), + resp.StringValue("on"), + resp.StringValue("password1"), + resp.StringValue(fmt.Sprintf("#%s", generateSHA256Password("password2"))), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_16") + user.Enabled = true + user.NoPassword = true + user.Passwords = []Password{} + user.Normalise() + return user + }(), + }, + { + // 17. Delete all existing users passwords using 'nopass' + presetUser: func() *User { + user := CreateUser("set_user_17") + user.Enabled = true + user.NoPassword = true + user.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "password1"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_17"), + resp.StringValue("on"), + resp.StringValue("nopass"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_17") + user.Enabled = true + user.NoPassword = true + user.Passwords = []Password{} + user.Normalise() + return user + }(), + }, + { + // 18. Clear all of an existing user's passwords using 'resetpass' + presetUser: func() *User { + user := CreateUser("set_user_18") + user.Enabled = true + user.NoPassword = true + user.Passwords = []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "password1"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, + } + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_18"), + resp.StringValue("on"), + resp.StringValue("nopass"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_18") + user.Enabled = true + user.NoPassword = true + user.Passwords = []Password{} + user.Normalise() + return user + }(), + }, + { + // 19. Clear all of an existing user's command privileges using 'nocommands' + presetUser: func() *User { + user := CreateUser("set_user_19") + user.Enabled = true + user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"} + user.ExcludedCommands = []string{"rewriteaof", "save"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_19"), + resp.StringValue("on"), + resp.StringValue("nocommands"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_19") + user.Enabled = true + user.IncludedCommands = []string{} + user.ExcludedCommands = []string{"*"} + user.IncludedCategories = []string{} + user.ExcludedCategories = []string{"*"} + user.Normalise() + return user + }(), + }, + { + // 20. Clear all of an existing user's allowed keys using 'resetkeys' + presetUser: func() *User { + user := CreateUser("set_user_20") + user.Enabled = true + user.IncludedWriteKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"} + user.IncludedReadKeys = []string{"key1", "key2", "key3", "key7", "key8", "key9"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_20"), + resp.StringValue("on"), + resp.StringValue("resetkeys"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_20") + user.Enabled = true + user.NoKeys = true + user.IncludedReadKeys = []string{} + user.IncludedWriteKeys = []string{} + user.Normalise() + return user + }(), + }, + { + // 21. Allow user to access all channels using 'resetchannels' + presetUser: func() *User { + user := CreateUser("set_user_21") + user.IncludedPubSubChannels = []string{"channel1", "channel2"} + user.ExcludedPubSubChannels = []string{"channel3", "channel4"} + user.Normalise() + return user + }(), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("SETUSER"), + resp.StringValue("set_user_21"), + resp.StringValue("resetchannels"), + }, + wantRes: "OK", + wantErr: "", + wantUser: func() *User { + user := CreateUser("set_user_21") + user.IncludedPubSubChannels = []string{} + user.ExcludedPubSubChannels = []string{"*"} + user.Normalise() + return user + }(), + }, + } + + for i, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + if v.String() != test.wantRes { + t.Errorf("expected response \"%s\", got \"%s\"", test.wantRes, v.String()) + } + if test.wantUser == nil { + continue + } + expectedUser := test.wantUser + currUserIdx := slices.IndexFunc(acl.Users, func(user *User) bool { + return user.Username == expectedUser.Username + }) + if currUserIdx == -1 { + t.Errorf("expected to find user with username \"%s\" but could not find them.", expectedUser.Username) + } + if err = compareUsers(expectedUser, acl.Users[currUserIdx]); err != nil { + t.Errorf("test idx: %d, %+v", i, err) + } + } +} + +func Test_HandleGetUser(t *testing.T) { + var port uint16 = 7493 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start(context.Background()) + }() + acl, _ := mockServer.GetACL().(*ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *User + cmd []resp.Value + wantRes []resp.Value + wantErr string + }{ + { // 1. Get the user and all their details + presetUser: &User{ + Username: "get_user_1", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "get_user_password_1"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("get_user_password_2")}, + }, + IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, + ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("GETUSER"), resp.StringValue("get_user_1")}, + wantRes: []resp.Value{ + resp.StringValue("username"), + resp.ArrayValue([]resp.Value{resp.StringValue("get_user_1")}), + resp.StringValue("flags"), + resp.ArrayValue([]resp.Value{ + resp.StringValue("on"), + }), + resp.StringValue("categories"), + resp.ArrayValue([]resp.Value{ + resp.StringValue(fmt.Sprintf("+@%s", utils.WriteCategory)), + resp.StringValue(fmt.Sprintf("+@%s", utils.ReadCategory)), + resp.StringValue(fmt.Sprintf("+@%s", utils.PubSubCategory)), + resp.StringValue(fmt.Sprintf("-@%s", utils.AdminCategory)), + resp.StringValue(fmt.Sprintf("-@%s", utils.ConnectionCategory)), + resp.StringValue(fmt.Sprintf("-@%s", utils.DangerousCategory)), + }), + resp.StringValue("commands"), + resp.ArrayValue([]resp.Value{ + resp.StringValue("+acl|setuser"), + resp.StringValue("+acl|getuser"), + resp.StringValue("+acl|deluser"), + resp.StringValue("-rewriteaof"), + resp.StringValue("-save"), + resp.StringValue("-acl|load"), + resp.StringValue("-acl|save"), + }), + resp.StringValue("keys"), + resp.ArrayValue([]resp.Value{ + // Keys here + resp.StringValue("%RW~key1"), + resp.StringValue("%RW~key2"), + resp.StringValue("%R~key3"), + resp.StringValue("%R~key4"), + resp.StringValue("%W~key5"), + resp.StringValue("%W~key6"), + }), + resp.StringValue("channels"), + resp.ArrayValue([]resp.Value{ + // Channels here + resp.StringValue("+&channel1"), + resp.StringValue("+&channel2"), + resp.StringValue("-&channel3"), + resp.StringValue("-&channel4"), + }), + }, + wantErr: "", + }, + { // 2. Return user not found error + presetUser: nil, + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("GETUSER"), + resp.StringValue("non_existent_user")}, + wantRes: nil, + wantErr: "Error user not found", + }, + } + + for _, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + resArr := v.Array() + for i := 0; i < len(resArr); i++ { + if slices.Contains([]string{"username", "flags", "categories", "commands", "keys", "channels"}, resArr[i].String()) { + // String item + if resArr[i].String() != test.wantRes[i].String() { + t.Errorf("expected response component %+v, got %+v", test.wantRes[i], resArr[i]) + } + } else { + // Array item + var expected []string + for _, item := range test.wantRes[i].Array() { + expected = append(expected, item.String()) + } + + var res []string + for _, item := range resArr[i].Array() { + res = append(res, item.String()) + } + + if err = compareSlices(res, expected); err != nil { + t.Error(err) + } + } + } + } +} + +func Test_HandleDelUser(t *testing.T) { + var port uint16 = 7494 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start(context.Background()) + }() + acl, _ := mockServer.GetACL().(*ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUser *User + cmd []resp.Value + wantRes string + wantErr string + }{ + { + // 1. Delete existing user while skipping default user and non-existent user + presetUser: CreateUser("user_to_delete"), + cmd: []resp.Value{ + resp.StringValue("ACL"), + resp.StringValue("DELUSER"), + resp.StringValue("default"), + resp.StringValue("user_to_delete"), + resp.StringValue("non_existent_user"), + }, + wantRes: "OK", + wantErr: "", + }, + { + // 2. Command too short + presetUser: nil, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("DELUSER")}, + wantRes: "", + wantErr: fmt.Sprintf("Error %s", utils.WrongArgsResponse), + }, + } + + for _, test := range tests { + if test.presetUser != nil { + acl.Users = append(acl.Users, test.presetUser) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + // Check that default user still exists in the list of users + if !slices.ContainsFunc(acl.Users, func(user *User) bool { + return user.Username == "default" + }) { + t.Error("could not find user with username \"default\" in the ACL after deleting user") + } + // Check that the deleted user is no longer in the list + if slices.ContainsFunc(acl.Users, func(user *User) bool { + return user.Username == "user_to_delete" + }) { + t.Error("deleted user found in the ACL") + } + } +} + +func Test_HandleWhoAmI(t *testing.T) { + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + username string + password string + wantRes string + }{ + { // 1. With default user + username: "default", + password: "password1", + wantRes: "default", + }, + { // 2. With user authenticated by plaintext password + username: "with_password_user", + password: "password2", + wantRes: "with_password_user", + }, + { // 3. With user authenticated by SHA256 password + username: "with_password_user", + password: "password3", + wantRes: "with_password_user", + }, + } + + for _, test := range tests { + // Authenticate + if err = r.WriteArray([]resp.Value{ + resp.StringValue("AUTH"), + resp.StringValue(test.username), + resp.StringValue(test.password), + }); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if v.String() != "OK" { + t.Errorf("expected response for auth with %s:%s to be \"OK\", got %s", test.username, test.password, v.String()) + } + // Check whoami response value + if err = r.WriteArray([]resp.Value{resp.StringValue("ACL"), resp.StringValue("WHOAMI")}); err != nil { + t.Error(err) + } + v, _, err = r.ReadValue() + if err != nil { + t.Error(err) + } + if v.String() != test.wantRes { + t.Errorf("expected whoami response to be \"%s\", got \"%s\"", test.wantRes, v.String()) + } + } +} + +func Test_HandleList(t *testing.T) { + var port uint16 = 7495 + mockServer := setUpServer(bindAddr, port, false, "") + go func() { + mockServer.Start(context.Background()) + }() + acl, _ := mockServer.GetACL().(*ACL) + + conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) + if err != nil { + t.Error(err) + } + defer func() { + _ = conn.Close() + }() + + r := resp.NewConn(conn) + + tests := []struct { + presetUsers []*User + cmd []resp.Value + wantRes []string + wantErr string + }{ + { // 1. Get the user and all their details + presetUsers: []*User{ + { + Username: "list_user_1", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "list_user_password_1"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_2")}, + }, + IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, + ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + { + Username: "list_user_2", + Enabled: true, + NoPassword: true, + NoKeys: true, + Passwords: []Password{}, + IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, + ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{}, + IncludedWriteKeys: []string{}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + { + Username: "list_user_3", + Enabled: true, + NoPassword: false, + NoKeys: false, + Passwords: []Password{ + {PasswordType: PasswordPlainText, PasswordValue: "list_user_password_3"}, + {PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_4")}, + }, + IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, + ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, + IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, + ExcludedCommands: []string{"rewriteaof", "save", "acl|load", "acl|save"}, + IncludedReadKeys: []string{"key1", "key2", "key3", "key4"}, + IncludedWriteKeys: []string{"key1", "key2", "key5", "key6"}, + IncludedPubSubChannels: []string{"channel1", "channel2"}, + ExcludedPubSubChannels: []string{"channel3", "channel4"}, + }, + }, + cmd: []resp.Value{resp.StringValue("ACL"), resp.StringValue("LIST")}, + wantRes: []string{ + "default on +@all +all %RW~* +&*", + fmt.Sprintf("with_password_user on >password2 #%s +@all +all", generateSHA256Password("password3")), + "no_password_user on nopass >password4", + "disabled_user off >password5", + fmt.Sprintf(`list_user_1 on >list_user_password_1 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_2"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), + fmt.Sprintf(`list_user_2 on nopass nokeys +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save +&channel1 +&channel2 -&channel3 -&channel4`), + fmt.Sprintf(`list_user_3 on >list_user_password_3 #%s +@write +@read +@pubsub -@admin -@connection -@dangerous +acl|setuser +acl|getuser +acl|deluser -rewriteaof -save -acl|load -acl|save %s +&channel1 +&channel2 -&channel3 -&channel4`, generateSHA256Password("list_user_password_4"), "%RW~key1 %RW~key2 %R~key3 %R~key4"), + }, + wantErr: "", + }, + } + + for _, test := range tests { + for _, user := range test.presetUsers { + acl.Users = append(acl.Users, user) + } + if err = r.WriteArray(test.cmd); err != nil { + t.Error(err) + } + v, _, err := r.ReadValue() + if err != nil { + t.Error(err) + } + if test.wantErr != "" { + if v.Error().Error() != test.wantErr { + t.Errorf("expected error response \"%s\", got \"%s\"", test.wantErr, v.Error().Error()) + } + continue + } + resArr := v.Array() + if len(resArr) != len(test.wantRes) { + t.Errorf("expected response of lenght %d, got lenght %d", len(test.wantRes), len(resArr)) + } + var resStr []string + for i := 0; i < len(resArr); i++ { + resStr = strings.Split(resArr[i].String(), " ") + if !slices.ContainsFunc(test.wantRes, func(s string) bool { + expectedUserSlice := strings.Split(s, " ") + return compareSlices(resStr, expectedUserSlice) == nil + }) { + t.Errorf("could not find the following user in expected slice: %+v", resStr) + } + clear(resStr) + } + } +} diff --git a/src/modules/acl/user.go b/src/modules/acl/user.go index 51370356..1b085d4d 100644 --- a/src/modules/acl/user.go +++ b/src/modules/acl/user.go @@ -5,6 +5,11 @@ import ( "strings" ) +const ( + PasswordPlainText = "plaintext" + PasswordSHA256 = "SHA256" +) + type Password struct { PasswordType string `json:"PasswordType" yaml:"PasswordType"` // plaintext, SHA256 PasswordValue string `json:"PasswordValue" yaml:"PasswordValue"` @@ -33,6 +38,9 @@ type User struct { func (user *User) Normalise() { user.IncludedCategories = RemoveDuplicateEntries(user.IncludedCategories, "allCategories") + if len(user.IncludedCategories) == 0 { + user.IncludedCategories = []string{"*"} + } user.ExcludedCategories = RemoveDuplicateEntries(user.ExcludedCategories, "allCategories") if slices.Contains(user.ExcludedCategories, "*") { user.IncludedCategories = []string{} @@ -105,7 +113,7 @@ func (user *User) UpdateUser(cmd []string) error { } if str[0] == '<' { user.Passwords = slices.DeleteFunc(user.Passwords, func(password Password) bool { - if strings.EqualFold(password.PasswordType, "SHA256") { + if strings.EqualFold(password.PasswordType, PasswordSHA256) { return false } return password.PasswordValue == str[1:] @@ -114,7 +122,7 @@ func (user *User) UpdateUser(cmd []string) error { } if str[0] == '!' { user.Passwords = slices.DeleteFunc(user.Passwords, func(password Password) bool { - if strings.EqualFold(password.PasswordType, "plaintext") { + if strings.EqualFold(password.PasswordType, PasswordPlainText) { return false } return password.PasswordValue == str[1:] @@ -182,6 +190,7 @@ func (user *User) UpdateUser(cmd []string) error { // Parse commands if strings.EqualFold(str, "allCommands") { user.IncludedCommands = []string{"*"} + user.ExcludedCommands = []string{} continue } if len(str) > 2 && !slices.Contains([]uint8{'&', '@'}, str[1]) { @@ -212,7 +221,10 @@ func (user *User) UpdateUser(cmd []string) error { } // If nocommands is provided, disable all commands for this user if strings.EqualFold(str, "nocommands") { + user.IncludedCommands = []string{} user.ExcludedCommands = []string{"*"} + user.IncludedCategories = []string{} + user.ExcludedCategories = []string{"*"} } // If resetkeys is provided, reset all keys that the user can access if strings.EqualFold(str, "resetkeys") { @@ -222,6 +234,7 @@ func (user *User) UpdateUser(cmd []string) error { } // If resetchannels is provided, remove all the pub/sub channels that the user can access if strings.EqualFold(str, "resetchannels") { + user.IncludedPubSubChannels = []string{} user.ExcludedPubSubChannels = []string{"*"} } } @@ -278,7 +291,7 @@ func CreateUser(username string) *User { func GetPasswordType(password string) string { if password[0] == '#' { - return "SHA256" + return PasswordSHA256 } - return "plaintext" + return PasswordPlainText } diff --git a/src/modules/generic/commands.go b/src/modules/generic/commands.go index 891e7080..6b24256a 100644 --- a/src/modules/generic/commands.go +++ b/src/modules/generic/commands.go @@ -24,7 +24,7 @@ func init() { // Test run now := time.Now() timeNow = func() time.Time { - return now.Add(10 * time.Hour) + return now.Add(5 * time.Hour).Add(30 * time.Minute).Add(30 * time.Second).Add(10 * time.Millisecond) } }