From 4ee3da6f7ecea2cb0ca4c1a14b11fbe6dcd8ef2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferdinand=20M=C3=BCtsch?= Date: Wed, 22 Mar 2023 20:45:27 +0100 Subject: [PATCH] feat: implement file statistics (resolve #80) --- coverage/coverage.out | 2269 ++++++++++++------------ helpers/summary.go | 3 + models/compat/wakatime/v1/stats.go | 2 + models/compat/wakatime/v1/summaries.go | 19 +- models/duration.go | 25 + models/filters.go | 16 +- models/heartbeat.go | 2 + models/summary.go | 11 +- routes/routes.go | 3 + services/duration.go | 3 + services/duration_test.go | 2 + services/heartbeat.go | 1 + services/summary.go | 12 +- services/summary_test.go | 5 + static/assets/css/app.dist.css | 2 +- static/assets/css/app.dist.css.br | Bin 3476 -> 3494 bytes static/assets/js/summary.js | 70 +- views/summary.tpl.html | 17 +- 18 files changed, 1324 insertions(+), 1138 deletions(-) diff --git a/coverage/coverage.out b/coverage/coverage.out index 6b2b1d1..e51c55e 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -1,4 +1,51 @@ mode: set +github.com/muety/wakapi/utils/cron.go:5.44,7.21 2 0 +github.com/muety/wakapi/utils/cron.go:10.2,10.20 1 0 +github.com/muety/wakapi/utils/cron.go:7.21,9.3 1 0 +github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 +github.com/muety/wakapi/utils/strings.go:12.58,13.49 1 0 +github.com/muety/wakapi/utils/strings.go:13.49,14.32 1 0 +github.com/muety/wakapi/utils/strings.go:19.3,19.15 1 0 +github.com/muety/wakapi/utils/strings.go:14.32,15.22 1 0 +github.com/muety/wakapi/utils/strings.go:15.22,17.5 1 0 +github.com/muety/wakapi/utils/strings.go:23.77,24.29 1 0 +github.com/muety/wakapi/utils/strings.go:29.2,29.19 1 0 +github.com/muety/wakapi/utils/strings.go:24.29,25.18 1 0 +github.com/muety/wakapi/utils/strings.go:25.18,27.4 1 0 +github.com/muety/wakapi/utils/sync.go:11.66,13.12 2 0 +github.com/muety/wakapi/utils/sync.go:17.2,17.9 1 0 +github.com/muety/wakapi/utils/sync.go:13.12,16.3 2 0 +github.com/muety/wakapi/utils/sync.go:18.11,19.15 1 0 +github.com/muety/wakapi/utils/sync.go:20.29,21.14 1 0 +github.com/muety/wakapi/utils/dns.go:9.38,11.21 2 0 +github.com/muety/wakapi/utils/dns.go:14.2,15.39 2 0 +github.com/muety/wakapi/utils/dns.go:11.21,13.3 1 0 +github.com/muety/wakapi/utils/http.go:20.13,22.2 1 1 +github.com/muety/wakapi/utils/http.go:29.34,30.20 1 0 +github.com/muety/wakapi/utils/http.go:33.2,33.19 1 0 +github.com/muety/wakapi/utils/http.go:30.20,32.3 1 0 +github.com/muety/wakapi/utils/http.go:36.35,37.21 1 0 +github.com/muety/wakapi/utils/http.go:40.2,40.34 1 0 +github.com/muety/wakapi/utils/http.go:37.21,39.3 1 0 +github.com/muety/wakapi/utils/http.go:43.62,45.48 2 0 +github.com/muety/wakapi/utils/http.go:48.2,48.93 1 0 +github.com/muety/wakapi/utils/http.go:53.2,53.14 1 0 +github.com/muety/wakapi/utils/http.go:45.48,47.3 1 0 +github.com/muety/wakapi/utils/http.go:48.93,49.89 1 0 +github.com/muety/wakapi/utils/http.go:49.89,51.4 1 0 +github.com/muety/wakapi/utils/http.go:56.51,60.46 4 0 +github.com/muety/wakapi/utils/http.go:63.2,63.73 1 0 +github.com/muety/wakapi/utils/http.go:66.2,66.19 1 0 +github.com/muety/wakapi/utils/http.go:60.46,62.3 1 0 +github.com/muety/wakapi/utils/http.go:63.73,65.3 1 0 +github.com/muety/wakapi/utils/http.go:69.78,71.26 2 0 +github.com/muety/wakapi/utils/http.go:74.2,74.30 1 0 +github.com/muety/wakapi/utils/http.go:77.2,77.19 1 0 +github.com/muety/wakapi/utils/http.go:71.26,73.3 1 0 +github.com/muety/wakapi/utils/http.go:74.30,76.3 1 0 +github.com/muety/wakapi/utils/http.go:80.56,83.45 3 1 +github.com/muety/wakapi/utils/http.go:86.2,86.40 1 1 +github.com/muety/wakapi/utils/http.go:83.45,85.3 1 1 github.com/muety/wakapi/utils/json.go:12.75,18.62 2 0 github.com/muety/wakapi/utils/json.go:22.2,22.29 1 0 github.com/muety/wakapi/utils/json.go:26.2,26.72 1 0 @@ -27,6 +74,20 @@ github.com/muety/wakapi/utils/template.go:39.51,40.12 1 0 github.com/muety/wakapi/utils/template.go:44.17,46.4 1 0 github.com/muety/wakapi/utils/template.go:48.17,50.4 1 0 github.com/muety/wakapi/utils/template.go:55.17,57.4 1 0 +github.com/muety/wakapi/utils/auth.go:14.79,16.54 2 0 +github.com/muety/wakapi/utils/auth.go:20.2,22.16 3 0 +github.com/muety/wakapi/utils/auth.go:26.2,28.45 3 0 +github.com/muety/wakapi/utils/auth.go:31.2,32.32 2 0 +github.com/muety/wakapi/utils/auth.go:16.54,18.3 1 0 +github.com/muety/wakapi/utils/auth.go:22.16,24.3 1 0 +github.com/muety/wakapi/utils/auth.go:28.45,30.3 1 0 +github.com/muety/wakapi/utils/auth.go:35.65,37.85 2 0 +github.com/muety/wakapi/utils/auth.go:41.2,42.30 2 0 +github.com/muety/wakapi/utils/auth.go:37.85,39.3 1 0 +github.com/muety/wakapi/utils/auth.go:45.56,49.2 3 0 +github.com/muety/wakapi/utils/auth.go:51.55,54.16 3 0 +github.com/muety/wakapi/utils/auth.go:57.2,57.16 1 0 +github.com/muety/wakapi/utils/auth.go:54.16,56.3 1 0 github.com/muety/wakapi/utils/collection.go:5.52,6.26 1 0 github.com/muety/wakapi/utils/collection.go:9.2,9.28 1 0 github.com/muety/wakapi/utils/collection.go:6.26,8.3 1 0 @@ -35,9 +96,6 @@ github.com/muety/wakapi/utils/collection.go:20.2,20.11 1 0 github.com/muety/wakapi/utils/collection.go:14.22,15.18 1 0 github.com/muety/wakapi/utils/collection.go:18.3,18.12 1 0 github.com/muety/wakapi/utils/collection.go:15.18,17.4 1 0 -github.com/muety/wakapi/utils/cron.go:5.44,7.21 2 0 -github.com/muety/wakapi/utils/cron.go:10.2,10.20 1 0 -github.com/muety/wakapi/utils/cron.go:7.21,9.3 1 0 github.com/muety/wakapi/utils/date.go:9.48,11.2 1 0 github.com/muety/wakapi/utils/date.go:13.51,15.2 1 0 github.com/muety/wakapi/utils/date.go:17.52,19.2 1 0 @@ -78,230 +136,94 @@ github.com/muety/wakapi/utils/db.go:47.2,47.15 1 0 github.com/muety/wakapi/utils/db.go:50.2,50.14 1 0 github.com/muety/wakapi/utils/db.go:44.16,46.3 1 0 github.com/muety/wakapi/utils/db.go:47.15,49.3 1 0 -github.com/muety/wakapi/utils/dns.go:9.38,11.21 2 0 -github.com/muety/wakapi/utils/dns.go:14.2,15.39 2 0 -github.com/muety/wakapi/utils/dns.go:11.21,13.3 1 0 -github.com/muety/wakapi/utils/http.go:20.13,22.2 1 1 -github.com/muety/wakapi/utils/http.go:29.34,30.20 1 0 -github.com/muety/wakapi/utils/http.go:33.2,33.19 1 0 -github.com/muety/wakapi/utils/http.go:30.20,32.3 1 0 -github.com/muety/wakapi/utils/http.go:36.35,37.21 1 0 -github.com/muety/wakapi/utils/http.go:40.2,40.34 1 0 -github.com/muety/wakapi/utils/http.go:37.21,39.3 1 0 -github.com/muety/wakapi/utils/http.go:43.62,45.48 2 0 -github.com/muety/wakapi/utils/http.go:48.2,48.93 1 0 -github.com/muety/wakapi/utils/http.go:53.2,53.14 1 0 -github.com/muety/wakapi/utils/http.go:45.48,47.3 1 0 -github.com/muety/wakapi/utils/http.go:48.93,49.89 1 0 -github.com/muety/wakapi/utils/http.go:49.89,51.4 1 0 -github.com/muety/wakapi/utils/http.go:56.51,60.46 4 0 -github.com/muety/wakapi/utils/http.go:63.2,63.73 1 0 -github.com/muety/wakapi/utils/http.go:66.2,66.19 1 0 -github.com/muety/wakapi/utils/http.go:60.46,62.3 1 0 -github.com/muety/wakapi/utils/http.go:63.73,65.3 1 0 -github.com/muety/wakapi/utils/http.go:69.78,71.26 2 0 -github.com/muety/wakapi/utils/http.go:74.2,74.30 1 0 -github.com/muety/wakapi/utils/http.go:77.2,77.19 1 0 -github.com/muety/wakapi/utils/http.go:71.26,73.3 1 0 -github.com/muety/wakapi/utils/http.go:74.30,76.3 1 0 -github.com/muety/wakapi/utils/http.go:80.56,83.45 3 1 -github.com/muety/wakapi/utils/http.go:86.2,86.40 1 1 -github.com/muety/wakapi/utils/http.go:83.45,85.3 1 1 -github.com/muety/wakapi/utils/strings.go:8.34,10.2 1 0 -github.com/muety/wakapi/utils/strings.go:12.58,13.49 1 0 -github.com/muety/wakapi/utils/strings.go:13.49,14.32 1 0 -github.com/muety/wakapi/utils/strings.go:19.3,19.15 1 0 -github.com/muety/wakapi/utils/strings.go:14.32,15.22 1 0 -github.com/muety/wakapi/utils/strings.go:15.22,17.5 1 0 -github.com/muety/wakapi/utils/strings.go:23.77,24.29 1 0 -github.com/muety/wakapi/utils/strings.go:29.2,29.19 1 0 -github.com/muety/wakapi/utils/strings.go:24.29,25.18 1 0 -github.com/muety/wakapi/utils/strings.go:25.18,27.4 1 0 -github.com/muety/wakapi/utils/sync.go:11.66,13.12 2 0 -github.com/muety/wakapi/utils/sync.go:17.2,17.9 1 0 -github.com/muety/wakapi/utils/sync.go:13.12,16.3 2 0 -github.com/muety/wakapi/utils/sync.go:18.11,19.15 1 0 -github.com/muety/wakapi/utils/sync.go:20.29,21.14 1 0 -github.com/muety/wakapi/utils/auth.go:14.79,16.54 2 0 -github.com/muety/wakapi/utils/auth.go:20.2,22.16 3 0 -github.com/muety/wakapi/utils/auth.go:26.2,28.45 3 0 -github.com/muety/wakapi/utils/auth.go:31.2,32.32 2 0 -github.com/muety/wakapi/utils/auth.go:16.54,18.3 1 0 -github.com/muety/wakapi/utils/auth.go:22.16,24.3 1 0 -github.com/muety/wakapi/utils/auth.go:28.45,30.3 1 0 -github.com/muety/wakapi/utils/auth.go:35.65,37.85 2 0 -github.com/muety/wakapi/utils/auth.go:41.2,42.30 2 0 -github.com/muety/wakapi/utils/auth.go:37.85,39.3 1 0 -github.com/muety/wakapi/utils/auth.go:45.56,49.2 3 0 -github.com/muety/wakapi/utils/auth.go:51.55,54.16 3 0 -github.com/muety/wakapi/utils/auth.go:57.2,57.16 1 0 -github.com/muety/wakapi/utils/auth.go:54.16,56.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:12.98,14.16 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:17.2,17.51 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:14.16,16.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:20.119,22.22 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:26.2,34.16 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:38.2,41.36 3 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:22.22,24.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:34.16,36.3 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:44.90,46.32 2 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:51.2,51.15 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:46.32,47.50 1 0 -github.com/muety/wakapi/routes/utils/summary_utils.go:47.50,49.4 1 0 -github.com/muety/wakapi/routes/utils/user_utils.go:15.139,16.68 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:23.2,24.21 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:28.2,29.27 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:35.2,35.63 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:39.2,40.16 2 1 -github.com/muety/wakapi/routes/utils/user_utils.go:44.2,44.27 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:16.68,21.3 4 1 -github.com/muety/wakapi/routes/utils/user_utils.go:24.21,26.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:29.27,31.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:31.8,31.35 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:31.35,33.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:35.63,37.3 1 1 -github.com/muety/wakapi/routes/utils/user_utils.go:40.16,42.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:21.13,24.2 2 1 -github.com/muety/wakapi/routes/utils/badge_utils.go:26.114,28.79 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:32.2,33.75 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:39.2,47.71 4 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:51.2,53.22 3 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:79.2,79.19 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:83.2,83.31 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:28.79,30.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:33.75,34.61 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:34.61,36.4 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:47.71,49.3 1 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:54.17,56.68 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:57.12,59.63 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:60.16,62.67 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:63.18,65.69 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:66.17,68.68 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:69.15,71.66 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:73.10,76.30 2 0 -github.com/muety/wakapi/routes/utils/badge_utils.go:79.19,81.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:11.68,13.16 2 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:17.2,18.16 2 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:22.2,22.35 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:13.16,15.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:18.16,20.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:25.65,33.48 6 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:37.2,37.24 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:33.48,35.3 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:40.67,48.47 6 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:52.2,52.45 1 0 -github.com/muety/wakapi/routes/utils/heartbeat_utils.go:48.47,50.3 1 0 -github.com/muety/wakapi/routes/utils/messages.go:9.71,11.2 1 0 -github.com/muety/wakapi/routes/utils/messages.go:13.73,15.2 1 0 -github.com/muety/wakapi/routes/utils/messages.go:17.97,19.57 2 0 -github.com/muety/wakapi/routes/utils/messages.go:22.2,22.65 1 0 -github.com/muety/wakapi/routes/utils/messages.go:25.2,26.11 2 0 -github.com/muety/wakapi/routes/utils/messages.go:19.57,21.3 1 0 -github.com/muety/wakapi/routes/utils/messages.go:22.65,24.3 1 0 -github.com/muety/wakapi/routes/utils/messages.go:29.78,33.2 3 0 -github.com/muety/wakapi/routes/utils/project_utils.go:15.144,18.16 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:23.2,24.16 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:28.2,32.35 2 0 -github.com/muety/wakapi/routes/utils/project_utils.go:37.2,39.20 3 0 -github.com/muety/wakapi/routes/utils/project_utils.go:18.16,20.3 1 0 -github.com/muety/wakapi/routes/utils/project_utils.go:24.16,26.3 1 0 -github.com/muety/wakapi/routes/utils/project_utils.go:32.35,35.3 2 0 -github.com/muety/wakapi/middlewares/filetype.go:13.83,14.43 1 0 -github.com/muety/wakapi/middlewares/filetype.go:14.43,19.3 1 0 -github.com/muety/wakapi/middlewares/filetype.go:22.84,24.34 2 0 -github.com/muety/wakapi/middlewares/filetype.go:31.2,31.27 1 0 -github.com/muety/wakapi/middlewares/filetype.go:24.34,25.50 1 0 -github.com/muety/wakapi/middlewares/filetype.go:25.50,29.4 3 0 -github.com/muety/wakapi/middlewares/logging.go:20.102,21.43 1 0 -github.com/muety/wakapi/middlewares/logging.go:21.43,27.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:30.80,39.44 7 0 -github.com/muety/wakapi/middlewares/logging.go:45.2,54.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:39.44,40.38 1 0 -github.com/muety/wakapi/middlewares/logging.go:40.38,42.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:57.41,59.14 2 0 -github.com/muety/wakapi/middlewares/logging.go:62.2,62.14 1 0 -github.com/muety/wakapi/middlewares/logging.go:65.2,65.11 1 0 -github.com/muety/wakapi/middlewares/logging.go:59.14,61.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:62.14,64.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:68.41,69.42 1 0 -github.com/muety/wakapi/middlewares/logging.go:72.2,72.12 1 0 -github.com/muety/wakapi/middlewares/logging.go:69.42,71.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:103.52,105.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:117.45,118.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:118.20,122.3 3 0 -github.com/muety/wakapi/middlewares/logging.go:124.54,127.18 3 0 -github.com/muety/wakapi/middlewares/logging.go:134.2,135.15 2 0 -github.com/muety/wakapi/middlewares/logging.go:127.18,130.17 2 0 -github.com/muety/wakapi/middlewares/logging.go:130.17,132.4 1 0 -github.com/muety/wakapi/middlewares/logging.go:137.42,138.20 1 0 -github.com/muety/wakapi/middlewares/logging.go:138.20,140.3 1 0 -github.com/muety/wakapi/middlewares/logging.go:142.36,144.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:145.42,147.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:148.40,150.2 1 0 -github.com/muety/wakapi/middlewares/logging.go:151.52,153.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:15.62,17.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:19.58,21.2 1 0 -github.com/muety/wakapi/middlewares/principal.go:23.60,24.24 1 0 -github.com/muety/wakapi/middlewares/principal.go:27.2,27.31 1 0 -github.com/muety/wakapi/middlewares/principal.go:24.24,26.3 1 0 -github.com/muety/wakapi/middlewares/principal.go:49.71,50.43 1 0 -github.com/muety/wakapi/middlewares/principal.go:50.43,52.3 1 0 -github.com/muety/wakapi/middlewares/principal.go:55.81,58.2 2 0 -github.com/muety/wakapi/middlewares/principal.go:60.55,61.52 1 0 -github.com/muety/wakapi/middlewares/principal.go:61.52,63.3 1 0 -github.com/muety/wakapi/middlewares/principal.go:66.49,67.52 1 0 -github.com/muety/wakapi/middlewares/principal.go:70.2,70.12 1 0 -github.com/muety/wakapi/middlewares/principal.go:67.52,69.3 1 0 -github.com/muety/wakapi/middlewares/security.go:19.62,20.43 1 0 -github.com/muety/wakapi/middlewares/security.go:20.43,22.3 1 0 -github.com/muety/wakapi/middlewares/security.go:25.80,26.36 1 0 -github.com/muety/wakapi/middlewares/security.go:31.2,31.27 1 0 -github.com/muety/wakapi/middlewares/security.go:26.36,27.30 1 0 -github.com/muety/wakapi/middlewares/security.go:27.30,29.4 1 0 -github.com/muety/wakapi/middlewares/sentry.go:15.60,16.43 1 0 -github.com/muety/wakapi/middlewares/sentry.go:16.43,20.3 1 0 -github.com/muety/wakapi/middlewares/sentry.go:23.78,26.54 3 0 -github.com/muety/wakapi/middlewares/sentry.go:26.54,27.43 1 0 -github.com/muety/wakapi/middlewares/sentry.go:27.43,29.4 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:32.91,38.2 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:40.90,43.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:45.90,48.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:50.99,53.2 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:55.71,56.71 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:56.71,58.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:61.107,65.16 3 0 -github.com/muety/wakapi/middlewares/authenticate.go:68.2,68.16 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:72.2,72.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:93.2,94.12 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:65.16,67.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:68.16,70.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:72.31,73.31 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:78.3,78.29 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:90.3,90.9 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:73.31,76.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:78.29,81.4 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:81.9,82.36 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:87.4,88.59 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:82.36,86.5 3 0 -github.com/muety/wakapi/middlewares/authenticate.go:97.70,98.39 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:103.2,103.14 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:98.39,99.60 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:99.60,101.4 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:106.98,108.16 2 1 -github.com/muety/wakapi/middlewares/authenticate.go:112.2,115.16 4 1 -github.com/muety/wakapi/middlewares/authenticate.go:118.2,118.18 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:108.16,110.3 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:115.16,117.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:121.97,125.19 4 1 -github.com/muety/wakapi/middlewares/authenticate.go:128.2,129.16 2 1 -github.com/muety/wakapi/middlewares/authenticate.go:132.2,132.18 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:125.19,127.3 1 1 -github.com/muety/wakapi/middlewares/authenticate.go:129.16,131.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:135.92,137.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:141.2,142.16 2 0 -github.com/muety/wakapi/middlewares/authenticate.go:149.2,149.18 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:137.16,139.3 1 0 -github.com/muety/wakapi/middlewares/authenticate.go:142.16,144.3 1 0 +github.com/muety/wakapi/config/jobqueue.go:29.13,38.2 7 1 +github.com/muety/wakapi/config/jobqueue.go:40.48,41.34 1 1 +github.com/muety/wakapi/config/jobqueue.go:44.2,47.12 4 1 +github.com/muety/wakapi/config/jobqueue.go:41.34,43.3 1 0 +github.com/muety/wakapi/config/jobqueue.go:50.44,52.2 1 0 +github.com/muety/wakapi/config/jobqueue.go:54.48,55.35 1 0 +github.com/muety/wakapi/config/jobqueue.go:58.2,58.24 1 0 +github.com/muety/wakapi/config/jobqueue.go:55.35,57.3 1 0 +github.com/muety/wakapi/config/jobqueue.go:61.43,63.37 2 0 +github.com/muety/wakapi/config/jobqueue.go:70.2,70.16 1 0 +github.com/muety/wakapi/config/jobqueue.go:63.37,69.3 1 0 +github.com/muety/wakapi/config/jobqueue.go:73.20,74.30 1 0 +github.com/muety/wakapi/config/jobqueue.go:74.30,76.3 1 0 +github.com/muety/wakapi/config/jobqueue.go:79.20,81.2 1 0 +github.com/muety/wakapi/config/jobqueue.go:83.21,85.2 1 1 +github.com/muety/wakapi/config/key_utils.go:11.58,15.44 2 0 +github.com/muety/wakapi/config/key_utils.go:30.2,31.16 2 0 +github.com/muety/wakapi/config/key_utils.go:34.2,37.51 3 0 +github.com/muety/wakapi/config/key_utils.go:40.2,40.45 1 0 +github.com/muety/wakapi/config/key_utils.go:15.44,17.17 2 0 +github.com/muety/wakapi/config/key_utils.go:20.3,23.17 3 0 +github.com/muety/wakapi/config/key_utils.go:26.3,26.46 1 0 +github.com/muety/wakapi/config/key_utils.go:17.17,19.4 1 0 +github.com/muety/wakapi/config/key_utils.go:23.17,25.4 1 0 +github.com/muety/wakapi/config/key_utils.go:31.16,33.3 1 0 +github.com/muety/wakapi/config/key_utils.go:37.51,39.3 1 0 +github.com/muety/wakapi/config/db.go:40.50,41.19 1 0 +github.com/muety/wakapi/config/db.go:54.2,54.12 1 0 +github.com/muety/wakapi/config/db.go:42.23,46.5 1 0 +github.com/muety/wakapi/config/db.go:47.26,50.5 1 0 +github.com/muety/wakapi/config/db.go:51.24,52.48 1 0 +github.com/muety/wakapi/config/db.go:57.53,60.25 2 1 +github.com/muety/wakapi/config/db.go:64.2,71.3 1 1 +github.com/muety/wakapi/config/db.go:60.25,62.3 1 1 +github.com/muety/wakapi/config/db.go:74.56,75.25 1 1 +github.com/muety/wakapi/config/db.go:79.2,80.16 2 1 +github.com/muety/wakapi/config/db.go:84.2,91.3 1 1 +github.com/muety/wakapi/config/db.go:75.25,77.3 1 0 +github.com/muety/wakapi/config/db.go:80.16,82.3 1 0 +github.com/muety/wakapi/config/db.go:94.54,96.2 1 1 +github.com/muety/wakapi/config/db_opts.go:11.56,13.2 1 0 +github.com/muety/wakapi/config/db_opts.go:15.59,17.2 1 0 +github.com/muety/wakapi/config/db_opts.go:19.61,21.39 1 0 +github.com/muety/wakapi/config/db_opts.go:28.2,28.30 1 0 +github.com/muety/wakapi/config/db_opts.go:34.2,34.12 1 0 +github.com/muety/wakapi/config/db_opts.go:21.39,23.100 1 0 +github.com/muety/wakapi/config/db_opts.go:23.100,25.4 1 0 +github.com/muety/wakapi/config/db_opts.go:28.30,29.68 1 0 +github.com/muety/wakapi/config/db_opts.go:29.68,31.4 1 0 +github.com/muety/wakapi/config/eventbus.go:26.13,28.2 1 1 +github.com/muety/wakapi/config/eventbus.go:30.26,32.2 1 0 +github.com/muety/wakapi/config/fs.go:9.56,10.19 1 0 +github.com/muety/wakapi/config/fs.go:13.2,13.19 1 0 +github.com/muety/wakapi/config/fs.go:10.19,12.3 1 0 +github.com/muety/wakapi/config/sentry.go:21.35,23.2 1 0 +github.com/muety/wakapi/config/sentry.go:25.62,28.2 2 0 +github.com/muety/wakapi/config/sentry.go:38.33,45.2 2 0 +github.com/muety/wakapi/config/sentry.go:47.79,50.2 2 0 +github.com/muety/wakapi/config/sentry.go:52.72,56.2 3 0 +github.com/muety/wakapi/config/sentry.go:58.71,62.2 3 0 +github.com/muety/wakapi/config/sentry.go:64.71,68.2 3 0 +github.com/muety/wakapi/config/sentry.go:70.72,74.2 3 0 +github.com/muety/wakapi/config/sentry.go:76.72,80.2 3 0 +github.com/muety/wakapi/config/sentry.go:82.67,87.18 4 0 +github.com/muety/wakapi/config/sentry.go:99.2,99.28 1 0 +github.com/muety/wakapi/config/sentry.go:87.18,88.65 1 0 +github.com/muety/wakapi/config/sentry.go:88.65,91.45 3 0 +github.com/muety/wakapi/config/sentry.go:94.4,95.10 2 0 +github.com/muety/wakapi/config/sentry.go:91.45,93.5 1 0 +github.com/muety/wakapi/config/sentry.go:109.50,115.59 1 0 +github.com/muety/wakapi/config/sentry.go:115.59,118.38 3 0 +github.com/muety/wakapi/config/sentry.go:123.4,123.39 1 0 +github.com/muety/wakapi/config/sentry.go:126.4,126.37 1 0 +github.com/muety/wakapi/config/sentry.go:118.38,119.38 1 0 +github.com/muety/wakapi/config/sentry.go:119.38,121.6 1 0 +github.com/muety/wakapi/config/sentry.go:123.39,125.5 1 0 +github.com/muety/wakapi/config/sentry.go:128.79,129.27 1 0 +github.com/muety/wakapi/config/sentry.go:136.4,136.16 1 0 +github.com/muety/wakapi/config/sentry.go:129.27,130.84 1 0 +github.com/muety/wakapi/config/sentry.go:130.84,131.45 1 0 +github.com/muety/wakapi/config/sentry.go:131.45,133.7 1 0 +github.com/muety/wakapi/config/sentry.go:138.17,140.3 1 0 +github.com/muety/wakapi/config/sentry.go:144.43,149.51 2 0 +github.com/muety/wakapi/config/sentry.go:152.2,152.11 1 0 +github.com/muety/wakapi/config/sentry.go:149.51,151.3 1 0 +github.com/muety/wakapi/config/session.go:9.46,10.25 1 0 +github.com/muety/wakapi/config/session.go:13.2,13.21 1 0 +github.com/muety/wakapi/config/session.go:10.25,12.3 1 0 github.com/muety/wakapi/config/config.go:185.64,187.2 1 0 github.com/muety/wakapi/config/config.go:189.59,191.2 1 0 github.com/muety/wakapi/config/config.go:193.82,203.2 1 0 @@ -400,94 +322,222 @@ github.com/muety/wakapi/config/config.go:465.48,467.4 1 0 github.com/muety/wakapi/config/config.go:471.55,473.3 1 0 github.com/muety/wakapi/config/config.go:474.56,476.3 1 0 github.com/muety/wakapi/config/config.go:477.65,479.3 1 0 -github.com/muety/wakapi/config/eventbus.go:26.13,28.2 1 1 -github.com/muety/wakapi/config/eventbus.go:30.26,32.2 1 0 -github.com/muety/wakapi/config/session.go:9.46,10.25 1 0 -github.com/muety/wakapi/config/session.go:13.2,13.21 1 0 -github.com/muety/wakapi/config/session.go:10.25,12.3 1 0 -github.com/muety/wakapi/config/jobqueue.go:29.13,38.2 7 1 -github.com/muety/wakapi/config/jobqueue.go:40.48,41.34 1 1 -github.com/muety/wakapi/config/jobqueue.go:44.2,47.12 4 1 -github.com/muety/wakapi/config/jobqueue.go:41.34,43.3 1 0 -github.com/muety/wakapi/config/jobqueue.go:50.44,52.2 1 0 -github.com/muety/wakapi/config/jobqueue.go:54.48,55.35 1 0 -github.com/muety/wakapi/config/jobqueue.go:58.2,58.24 1 0 -github.com/muety/wakapi/config/jobqueue.go:55.35,57.3 1 0 -github.com/muety/wakapi/config/jobqueue.go:61.43,63.37 2 0 -github.com/muety/wakapi/config/jobqueue.go:70.2,70.16 1 0 -github.com/muety/wakapi/config/jobqueue.go:63.37,69.3 1 0 -github.com/muety/wakapi/config/jobqueue.go:73.20,74.30 1 0 -github.com/muety/wakapi/config/jobqueue.go:74.30,76.3 1 0 -github.com/muety/wakapi/config/jobqueue.go:79.20,81.2 1 0 -github.com/muety/wakapi/config/jobqueue.go:83.21,85.2 1 1 -github.com/muety/wakapi/config/key_utils.go:11.58,15.44 2 0 -github.com/muety/wakapi/config/key_utils.go:30.2,31.16 2 0 -github.com/muety/wakapi/config/key_utils.go:34.2,37.51 3 0 -github.com/muety/wakapi/config/key_utils.go:40.2,40.45 1 0 -github.com/muety/wakapi/config/key_utils.go:15.44,17.17 2 0 -github.com/muety/wakapi/config/key_utils.go:20.3,23.17 3 0 -github.com/muety/wakapi/config/key_utils.go:26.3,26.46 1 0 -github.com/muety/wakapi/config/key_utils.go:17.17,19.4 1 0 -github.com/muety/wakapi/config/key_utils.go:23.17,25.4 1 0 -github.com/muety/wakapi/config/key_utils.go:31.16,33.3 1 0 -github.com/muety/wakapi/config/key_utils.go:37.51,39.3 1 0 -github.com/muety/wakapi/config/sentry.go:21.35,23.2 1 0 -github.com/muety/wakapi/config/sentry.go:25.62,28.2 2 0 -github.com/muety/wakapi/config/sentry.go:38.33,45.2 2 0 -github.com/muety/wakapi/config/sentry.go:47.79,50.2 2 0 -github.com/muety/wakapi/config/sentry.go:52.72,56.2 3 0 -github.com/muety/wakapi/config/sentry.go:58.71,62.2 3 0 -github.com/muety/wakapi/config/sentry.go:64.71,68.2 3 0 -github.com/muety/wakapi/config/sentry.go:70.72,74.2 3 0 -github.com/muety/wakapi/config/sentry.go:76.72,80.2 3 0 -github.com/muety/wakapi/config/sentry.go:82.67,87.18 4 0 -github.com/muety/wakapi/config/sentry.go:99.2,99.28 1 0 -github.com/muety/wakapi/config/sentry.go:87.18,88.65 1 0 -github.com/muety/wakapi/config/sentry.go:88.65,91.45 3 0 -github.com/muety/wakapi/config/sentry.go:94.4,95.10 2 0 -github.com/muety/wakapi/config/sentry.go:91.45,93.5 1 0 -github.com/muety/wakapi/config/sentry.go:109.50,115.59 1 0 -github.com/muety/wakapi/config/sentry.go:115.59,118.38 3 0 -github.com/muety/wakapi/config/sentry.go:123.4,123.39 1 0 -github.com/muety/wakapi/config/sentry.go:126.4,126.37 1 0 -github.com/muety/wakapi/config/sentry.go:118.38,119.38 1 0 -github.com/muety/wakapi/config/sentry.go:119.38,121.6 1 0 -github.com/muety/wakapi/config/sentry.go:123.39,125.5 1 0 -github.com/muety/wakapi/config/sentry.go:128.79,129.27 1 0 -github.com/muety/wakapi/config/sentry.go:136.4,136.16 1 0 -github.com/muety/wakapi/config/sentry.go:129.27,130.84 1 0 -github.com/muety/wakapi/config/sentry.go:130.84,131.45 1 0 -github.com/muety/wakapi/config/sentry.go:131.45,133.7 1 0 -github.com/muety/wakapi/config/sentry.go:138.17,140.3 1 0 -github.com/muety/wakapi/config/sentry.go:144.43,149.51 2 0 -github.com/muety/wakapi/config/sentry.go:152.2,152.11 1 0 -github.com/muety/wakapi/config/sentry.go:149.51,151.3 1 0 -github.com/muety/wakapi/config/db.go:40.50,41.19 1 0 -github.com/muety/wakapi/config/db.go:54.2,54.12 1 0 -github.com/muety/wakapi/config/db.go:42.23,46.5 1 0 -github.com/muety/wakapi/config/db.go:47.26,50.5 1 0 -github.com/muety/wakapi/config/db.go:51.24,52.48 1 0 -github.com/muety/wakapi/config/db.go:57.53,60.25 2 1 -github.com/muety/wakapi/config/db.go:64.2,71.3 1 1 -github.com/muety/wakapi/config/db.go:60.25,62.3 1 1 -github.com/muety/wakapi/config/db.go:74.56,75.25 1 1 -github.com/muety/wakapi/config/db.go:79.2,80.16 2 1 -github.com/muety/wakapi/config/db.go:84.2,91.3 1 1 -github.com/muety/wakapi/config/db.go:75.25,77.3 1 0 -github.com/muety/wakapi/config/db.go:80.16,82.3 1 0 -github.com/muety/wakapi/config/db.go:94.54,96.2 1 1 -github.com/muety/wakapi/config/db_opts.go:11.56,13.2 1 0 -github.com/muety/wakapi/config/db_opts.go:15.59,17.2 1 0 -github.com/muety/wakapi/config/db_opts.go:19.61,21.39 1 0 -github.com/muety/wakapi/config/db_opts.go:28.2,28.30 1 0 -github.com/muety/wakapi/config/db_opts.go:34.2,34.12 1 0 -github.com/muety/wakapi/config/db_opts.go:21.39,23.100 1 0 -github.com/muety/wakapi/config/db_opts.go:23.100,25.4 1 0 -github.com/muety/wakapi/config/db_opts.go:28.30,29.68 1 0 -github.com/muety/wakapi/config/db_opts.go:29.68,31.4 1 0 -github.com/muety/wakapi/config/fs.go:9.56,10.19 1 0 -github.com/muety/wakapi/config/fs.go:13.2,13.19 1 0 -github.com/muety/wakapi/config/fs.go:10.19,12.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:20.102,21.43 1 0 +github.com/muety/wakapi/middlewares/logging.go:21.43,27.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:30.80,39.44 7 0 +github.com/muety/wakapi/middlewares/logging.go:45.2,54.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:39.44,40.38 1 0 +github.com/muety/wakapi/middlewares/logging.go:40.38,42.4 1 0 +github.com/muety/wakapi/middlewares/logging.go:57.41,59.14 2 0 +github.com/muety/wakapi/middlewares/logging.go:62.2,62.14 1 0 +github.com/muety/wakapi/middlewares/logging.go:65.2,65.11 1 0 +github.com/muety/wakapi/middlewares/logging.go:59.14,61.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:62.14,64.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:68.41,69.42 1 0 +github.com/muety/wakapi/middlewares/logging.go:72.2,72.12 1 0 +github.com/muety/wakapi/middlewares/logging.go:69.42,71.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:103.52,105.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:117.45,118.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:118.20,122.3 3 0 +github.com/muety/wakapi/middlewares/logging.go:124.54,127.18 3 0 +github.com/muety/wakapi/middlewares/logging.go:134.2,135.15 2 0 +github.com/muety/wakapi/middlewares/logging.go:127.18,130.17 2 0 +github.com/muety/wakapi/middlewares/logging.go:130.17,132.4 1 0 +github.com/muety/wakapi/middlewares/logging.go:137.42,138.20 1 0 +github.com/muety/wakapi/middlewares/logging.go:138.20,140.3 1 0 +github.com/muety/wakapi/middlewares/logging.go:142.36,144.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:145.42,147.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:148.40,150.2 1 0 +github.com/muety/wakapi/middlewares/logging.go:151.52,153.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:15.62,17.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:19.58,21.2 1 0 +github.com/muety/wakapi/middlewares/principal.go:23.60,24.24 1 0 +github.com/muety/wakapi/middlewares/principal.go:27.2,27.31 1 0 +github.com/muety/wakapi/middlewares/principal.go:24.24,26.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:49.71,50.43 1 0 +github.com/muety/wakapi/middlewares/principal.go:50.43,52.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:55.81,58.2 2 0 +github.com/muety/wakapi/middlewares/principal.go:60.55,61.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:61.52,63.3 1 0 +github.com/muety/wakapi/middlewares/principal.go:66.49,67.52 1 0 +github.com/muety/wakapi/middlewares/principal.go:70.2,70.12 1 0 +github.com/muety/wakapi/middlewares/principal.go:67.52,69.3 1 0 +github.com/muety/wakapi/middlewares/security.go:19.62,20.43 1 0 +github.com/muety/wakapi/middlewares/security.go:20.43,22.3 1 0 +github.com/muety/wakapi/middlewares/security.go:25.80,26.36 1 0 +github.com/muety/wakapi/middlewares/security.go:31.2,31.27 1 0 +github.com/muety/wakapi/middlewares/security.go:26.36,27.30 1 0 +github.com/muety/wakapi/middlewares/security.go:27.30,29.4 1 0 +github.com/muety/wakapi/middlewares/sentry.go:15.60,16.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:16.43,20.3 1 0 +github.com/muety/wakapi/middlewares/sentry.go:23.78,26.54 3 0 +github.com/muety/wakapi/middlewares/sentry.go:26.54,27.43 1 0 +github.com/muety/wakapi/middlewares/sentry.go:27.43,29.4 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:32.91,38.2 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:40.90,43.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:45.90,48.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:50.99,53.2 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:55.71,56.71 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:56.71,58.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:61.107,65.16 3 0 +github.com/muety/wakapi/middlewares/authenticate.go:68.2,68.16 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:72.2,72.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:93.2,94.12 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:65.16,67.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:68.16,70.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:72.31,73.31 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:78.3,78.29 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:90.3,90.9 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:73.31,76.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:78.29,81.4 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:81.9,82.36 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:87.4,88.59 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:82.36,86.5 3 0 +github.com/muety/wakapi/middlewares/authenticate.go:97.70,98.39 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:103.2,103.14 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:98.39,99.60 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:99.60,101.4 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:106.98,108.16 2 1 +github.com/muety/wakapi/middlewares/authenticate.go:112.2,115.16 4 1 +github.com/muety/wakapi/middlewares/authenticate.go:118.2,118.18 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:108.16,110.3 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:115.16,117.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:121.97,125.19 4 1 +github.com/muety/wakapi/middlewares/authenticate.go:128.2,129.16 2 1 +github.com/muety/wakapi/middlewares/authenticate.go:132.2,132.18 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:125.19,127.3 1 1 +github.com/muety/wakapi/middlewares/authenticate.go:129.16,131.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:135.92,137.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:141.2,142.16 2 0 +github.com/muety/wakapi/middlewares/authenticate.go:149.2,149.18 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:137.16,139.3 1 0 +github.com/muety/wakapi/middlewares/authenticate.go:142.16,144.3 1 0 +github.com/muety/wakapi/middlewares/filetype.go:13.83,14.43 1 0 +github.com/muety/wakapi/middlewares/filetype.go:14.43,19.3 1 0 +github.com/muety/wakapi/middlewares/filetype.go:22.84,24.34 2 0 +github.com/muety/wakapi/middlewares/filetype.go:31.2,31.27 1 0 +github.com/muety/wakapi/middlewares/filetype.go:24.34,25.50 1 0 +github.com/muety/wakapi/middlewares/filetype.go:25.50,29.4 3 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:21.13,24.2 2 1 +github.com/muety/wakapi/routes/utils/badge_utils.go:26.114,28.79 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:32.2,33.75 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:39.2,47.71 4 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:51.2,53.22 3 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:79.2,79.19 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:83.2,83.31 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:28.79,30.3 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:33.75,34.61 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:34.61,36.4 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:47.71,49.3 1 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:54.17,56.68 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:57.12,59.63 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:60.16,62.67 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:63.18,65.69 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:66.17,68.68 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:69.15,71.66 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:73.10,76.30 2 0 +github.com/muety/wakapi/routes/utils/badge_utils.go:79.19,81.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:11.68,13.16 2 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:17.2,18.16 2 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:22.2,22.35 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:13.16,15.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:18.16,20.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:25.65,33.48 6 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:37.2,37.24 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:33.48,35.3 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:40.67,48.47 6 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:52.2,52.45 1 0 +github.com/muety/wakapi/routes/utils/heartbeat_utils.go:48.47,50.3 1 0 +github.com/muety/wakapi/routes/utils/messages.go:9.71,11.2 1 0 +github.com/muety/wakapi/routes/utils/messages.go:13.73,15.2 1 0 +github.com/muety/wakapi/routes/utils/messages.go:17.97,19.57 2 0 +github.com/muety/wakapi/routes/utils/messages.go:22.2,22.65 1 0 +github.com/muety/wakapi/routes/utils/messages.go:25.2,26.11 2 0 +github.com/muety/wakapi/routes/utils/messages.go:19.57,21.3 1 0 +github.com/muety/wakapi/routes/utils/messages.go:22.65,24.3 1 0 +github.com/muety/wakapi/routes/utils/messages.go:29.78,33.2 3 0 +github.com/muety/wakapi/routes/utils/project_utils.go:15.144,18.16 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:23.2,24.16 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:28.2,32.35 2 0 +github.com/muety/wakapi/routes/utils/project_utils.go:37.2,39.20 3 0 +github.com/muety/wakapi/routes/utils/project_utils.go:18.16,20.3 1 0 +github.com/muety/wakapi/routes/utils/project_utils.go:24.16,26.3 1 0 +github.com/muety/wakapi/routes/utils/project_utils.go:32.35,35.3 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:12.98,14.16 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:17.2,17.51 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:14.16,16.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:20.119,22.22 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:26.2,34.16 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:38.2,41.36 3 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:22.22,24.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:34.16,36.3 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:44.90,46.32 2 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:51.2,51.15 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:46.32,47.50 1 0 +github.com/muety/wakapi/routes/utils/summary_utils.go:47.50,49.4 1 0 +github.com/muety/wakapi/routes/utils/user_utils.go:15.139,16.68 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:23.2,24.21 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:28.2,29.27 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:35.2,35.63 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:39.2,40.16 2 1 +github.com/muety/wakapi/routes/utils/user_utils.go:44.2,44.27 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:16.68,21.3 4 1 +github.com/muety/wakapi/routes/utils/user_utils.go:24.21,26.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:29.27,31.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:31.8,31.35 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:31.35,33.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:35.63,37.3 1 1 +github.com/muety/wakapi/routes/utils/user_utils.go:40.16,42.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:29.124,34.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:36.62,37.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:37.34,40.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:52.72,54.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:58.2,61.16 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:67.2,71.16 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:78.2,84.47 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:54.16,56.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:61.16,65.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:71.16,76.3 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:23.123,29.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:31.61,32.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:32.34,35.3 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:48.71,50.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:54.2,55.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:62.2,65.28 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:71.2,72.46 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:50.16,52.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:55.16,60.3 4 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:65.28,66.30 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:66.30,68.4 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:22.112,28.2 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:30.58,31.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:31.34,41.3 5 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:62.68,68.53 5 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:72.2,73.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.2,79.22 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:83.2,84.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:90.2,92.69 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:98.2,99.16 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:105.2,108.33 2 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.2,111.35 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.2,114.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.2,117.29 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.2,120.34 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:124.2,124.49 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:68.53,70.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:73.16,77.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.22,81.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:84.16,88.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:92.69,96.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:99.16,103.3 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:108.33,110.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.35,113.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.34,116.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.29,119.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.34,122.3 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:127.136,136.16 3 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:140.2,140.36 1 0 +github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:136.16,138.3 1 0 github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:29.120,35.2 1 0 github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:37.62,38.34 1 0 github.com/muety/wakapi/routes/compat/wakatime/v1/statusbar.go:38.34,43.3 4 0 @@ -553,61 +603,6 @@ github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:77.2,85.16 2 0 github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:89.2,89.36 1 0 github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:73.29,75.3 1 0 github.com/muety/wakapi/routes/compat/wakatime/v1/all_time.go:85.16,87.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:29.124,34.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:36.62,37.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:37.34,40.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:52.72,54.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:58.2,61.16 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:67.2,71.16 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:78.2,84.47 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:54.16,56.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:61.16,65.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/heartbeat.go:71.16,76.3 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:23.123,29.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:31.61,32.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:32.34,35.3 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:48.71,50.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:54.2,55.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:62.2,65.28 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:71.2,72.46 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:50.16,52.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:55.16,60.3 4 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:65.28,66.30 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/projects.go:66.30,68.4 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:22.112,28.2 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:30.58,31.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:31.34,41.3 5 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:62.68,68.53 5 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:72.2,73.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.2,79.22 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:83.2,84.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:90.2,92.69 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:98.2,99.16 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:105.2,108.33 2 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.2,111.35 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.2,114.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.2,117.29 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.2,120.34 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:124.2,124.49 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:68.53,70.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:73.16,77.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:79.22,81.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:84.16,88.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:92.69,96.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:99.16,103.3 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:108.33,110.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:111.35,113.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:114.34,116.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:117.29,119.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:120.34,122.3 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:127.136,136.16 3 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:140.2,140.36 1 0 -github.com/muety/wakapi/routes/compat/wakatime/v1/stats.go:136.16,138.3 1 0 -github.com/muety/wakapi/routes/api/summary.go:20.122,26.2 1 0 -github.com/muety/wakapi/routes/api/summary.go:28.63,34.2 4 0 -github.com/muety/wakapi/routes/api/summary.go:53.73,55.16 2 0 -github.com/muety/wakapi/routes/api/summary.go:61.2,61.51 1 0 -github.com/muety/wakapi/routes/api/summary.go:55.16,59.3 3 0 github.com/muety/wakapi/routes/api/avatar.go:18.40,20.16 2 0 github.com/muety/wakapi/routes/api/avatar.go:24.2,27.3 1 0 github.com/muety/wakapi/routes/api/avatar.go:20.16,21.13 1 0 @@ -734,80 +729,391 @@ github.com/muety/wakapi/routes/api/metrics.go:290.56,292.4 1 0 github.com/muety/wakapi/routes/api/metrics.go:299.16,302.3 2 0 github.com/muety/wakapi/routes/api/metrics.go:335.16,338.3 2 0 github.com/muety/wakapi/routes/api/metrics.go:340.32,347.3 1 0 -github.com/muety/wakapi/services/misc.go:44.188,56.2 1 0 -github.com/muety/wakapi/services/misc.go:58.36,60.95 2 0 -github.com/muety/wakapi/services/misc.go:64.2,65.111 2 0 -github.com/muety/wakapi/services/misc.go:69.2,69.128 1 0 -github.com/muety/wakapi/services/misc.go:77.2,77.33 1 0 -github.com/muety/wakapi/services/misc.go:82.2,82.33 1 0 -github.com/muety/wakapi/services/misc.go:87.2,87.170 1 0 -github.com/muety/wakapi/services/misc.go:60.95,62.3 1 0 -github.com/muety/wakapi/services/misc.go:65.111,67.3 1 0 -github.com/muety/wakapi/services/misc.go:69.128,71.125 2 0 -github.com/muety/wakapi/services/misc.go:71.125,73.4 1 0 -github.com/muety/wakapi/services/misc.go:77.33,78.71 1 0 -github.com/muety/wakapi/services/misc.go:78.71,80.4 1 0 -github.com/muety/wakapi/services/misc.go:82.33,83.80 1 0 -github.com/muety/wakapi/services/misc.go:83.80,85.4 1 0 -github.com/muety/wakapi/services/misc.go:87.170,88.83 1 0 -github.com/muety/wakapi/services/misc.go:88.83,90.4 1 0 -github.com/muety/wakapi/services/misc.go:94.42,96.36 2 0 -github.com/muety/wakapi/services/misc.go:99.2,102.16 3 0 -github.com/muety/wakapi/services/misc.go:107.2,111.26 4 0 -github.com/muety/wakapi/services/misc.go:123.2,123.30 1 0 -github.com/muety/wakapi/services/misc.go:96.36,98.3 1 0 -github.com/muety/wakapi/services/misc.go:102.16,105.3 2 0 -github.com/muety/wakapi/services/misc.go:111.26,113.46 2 0 -github.com/muety/wakapi/services/misc.go:113.46,116.4 2 0 -github.com/muety/wakapi/services/misc.go:116.18,119.4 2 0 -github.com/muety/wakapi/services/misc.go:123.30,124.58 1 0 -github.com/muety/wakapi/services/misc.go:124.58,128.19 1 0 -github.com/muety/wakapi/services/misc.go:132.4,135.19 1 0 -github.com/muety/wakapi/services/misc.go:128.19,130.5 1 0 -github.com/muety/wakapi/services/misc.go:135.19,137.5 1 0 -github.com/muety/wakapi/services/misc.go:138.9,140.4 1 0 -github.com/muety/wakapi/services/misc.go:144.51,147.45 2 0 -github.com/muety/wakapi/services/misc.go:147.45,148.41 1 0 -github.com/muety/wakapi/services/misc.go:152.3,155.17 3 0 -github.com/muety/wakapi/services/misc.go:160.3,160.33 1 0 -github.com/muety/wakapi/services/misc.go:148.41,151.4 2 0 -github.com/muety/wakapi/services/misc.go:155.17,158.4 2 0 -github.com/muety/wakapi/services/misc.go:160.33,161.31 1 0 -github.com/muety/wakapi/services/misc.go:165.4,169.19 2 0 -github.com/muety/wakapi/services/misc.go:161.31,162.13 1 0 -github.com/muety/wakapi/services/misc.go:169.19,171.5 1 0 -github.com/muety/wakapi/services/misc.go:173.17,175.3 1 0 -github.com/muety/wakapi/services/misc.go:186.54,187.82 1 0 -github.com/muety/wakapi/services/misc.go:191.2,195.16 4 0 -github.com/muety/wakapi/services/misc.go:200.2,201.104 2 0 -github.com/muety/wakapi/services/misc.go:210.2,210.26 1 0 -github.com/muety/wakapi/services/misc.go:187.82,189.3 1 0 -github.com/muety/wakapi/services/misc.go:195.16,198.3 2 0 -github.com/muety/wakapi/services/misc.go:201.104,202.122 1 0 -github.com/muety/wakapi/services/misc.go:202.122,204.4 1 0 -github.com/muety/wakapi/services/misc.go:205.8,208.3 2 0 -github.com/muety/wakapi/services/misc.go:210.26,211.49 1 0 -github.com/muety/wakapi/services/misc.go:215.3,216.65 2 0 -github.com/muety/wakapi/services/misc.go:230.3,230.137 1 0 -github.com/muety/wakapi/services/misc.go:234.3,235.89 2 0 -github.com/muety/wakapi/services/misc.go:211.49,213.4 1 0 -github.com/muety/wakapi/services/misc.go:216.65,218.130 1 0 -github.com/muety/wakapi/services/misc.go:218.130,220.5 1 0 -github.com/muety/wakapi/services/misc.go:220.10,220.25 1 0 -github.com/muety/wakapi/services/misc.go:220.25,223.5 2 0 -github.com/muety/wakapi/services/misc.go:230.137,231.12 1 0 -github.com/muety/wakapi/services/misc.go:235.89,237.4 1 0 -github.com/muety/wakapi/services/misc.go:241.73,243.16 2 0 -github.com/muety/wakapi/services/misc.go:247.2,247.27 1 0 -github.com/muety/wakapi/services/misc.go:243.16,246.3 2 0 -github.com/muety/wakapi/services/misc.go:250.99,252.33 2 0 -github.com/muety/wakapi/services/misc.go:252.33,256.86 3 0 -github.com/muety/wakapi/services/misc.go:261.3,264.18 1 0 -github.com/muety/wakapi/services/misc.go:256.86,259.4 2 0 -github.com/muety/wakapi/services/misc.go:264.18,266.4 1 0 -github.com/muety/wakapi/services/misc.go:270.53,273.2 2 0 -github.com/muety/wakapi/services/misc.go:275.53,278.2 2 0 -github.com/muety/wakapi/services/misc.go:280.64,283.2 2 0 +github.com/muety/wakapi/routes/api/summary.go:20.122,26.2 1 0 +github.com/muety/wakapi/routes/api/summary.go:28.63,34.2 4 0 +github.com/muety/wakapi/routes/api/summary.go:53.73,55.16 2 0 +github.com/muety/wakapi/routes/api/summary.go:61.2,61.51 1 0 +github.com/muety/wakapi/routes/api/summary.go:55.16,59.3 3 0 +github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 +github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 +github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 +github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 +github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 +github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 +github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 +github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 +github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 +github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 +github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 +github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 +github.com/muety/wakapi/models/project_label.go:14.39,16.2 1 0 +github.com/muety/wakapi/models/alias.go:18.32,20.2 1 0 +github.com/muety/wakapi/models/alias.go:22.37,23.35 1 0 +github.com/muety/wakapi/models/alias.go:28.2,28.14 1 0 +github.com/muety/wakapi/models/alias.go:23.35,24.18 1 0 +github.com/muety/wakapi/models/alias.go:24.18,26.4 1 0 +github.com/muety/wakapi/models/interval.go:41.47,42.23 1 0 +github.com/muety/wakapi/models/interval.go:47.2,47.14 1 0 +github.com/muety/wakapi/models/interval.go:42.23,43.13 1 0 +github.com/muety/wakapi/models/interval.go:43.13,45.4 1 0 +github.com/muety/wakapi/models/leaderboard.go:28.73,30.2 1 0 +github.com/muety/wakapi/models/leaderboard.go:34.56,35.103 1 0 +github.com/muety/wakapi/models/leaderboard.go:35.103,37.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:37.13,39.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:42.63,43.29 1 0 +github.com/muety/wakapi/models/leaderboard.go:43.29,45.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:48.41,49.123 1 0 +github.com/muety/wakapi/models/leaderboard.go:49.123,51.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:54.50,56.2 1 0 +github.com/muety/wakapi/models/leaderboard.go:58.65,59.95 1 0 +github.com/muety/wakapi/models/leaderboard.go:59.95,61.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:64.49,72.25 3 0 +github.com/muety/wakapi/models/leaderboard.go:83.2,83.129 1 0 +github.com/muety/wakapi/models/leaderboard.go:86.2,86.67 1 0 +github.com/muety/wakapi/models/leaderboard.go:90.2,90.79 1 0 +github.com/muety/wakapi/models/leaderboard.go:72.25,73.58 1 0 +github.com/muety/wakapi/models/leaderboard.go:76.3,77.38 2 0 +github.com/muety/wakapi/models/leaderboard.go:80.3,80.40 1 0 +github.com/muety/wakapi/models/leaderboard.go:73.58,74.12 1 0 +github.com/muety/wakapi/models/leaderboard.go:77.38,79.4 1 0 +github.com/muety/wakapi/models/leaderboard.go:83.129,85.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:86.67,88.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:90.79,92.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:95.70,96.107 1 0 +github.com/muety/wakapi/models/leaderboard.go:96.107,98.3 1 0 +github.com/muety/wakapi/models/leaderboard.go:101.45,103.25 2 0 +github.com/muety/wakapi/models/leaderboard.go:108.2,108.19 1 0 +github.com/muety/wakapi/models/leaderboard.go:103.25,104.43 1 0 +github.com/muety/wakapi/models/leaderboard.go:104.43,106.4 1 0 +github.com/muety/wakapi/models/summary.go:66.29,68.2 1 1 +github.com/muety/wakapi/models/summary.go:70.35,72.2 1 0 +github.com/muety/wakapi/models/summary.go:74.38,76.2 1 0 +github.com/muety/wakapi/models/summary.go:78.37,88.2 9 1 +github.com/muety/wakapi/models/summary.go:90.35,92.2 1 1 +github.com/muety/wakapi/models/summary.go:94.57,105.2 1 1 +github.com/muety/wakapi/models/summary.go:107.64,108.21 1 1 +github.com/muety/wakapi/models/summary.go:126.2,126.12 1 0 +github.com/muety/wakapi/models/summary.go:109.22,110.21 1 1 +github.com/muety/wakapi/models/summary.go:111.23,112.22 1 1 +github.com/muety/wakapi/models/summary.go:113.21,114.20 1 1 +github.com/muety/wakapi/models/summary.go:115.17,116.29 1 1 +github.com/muety/wakapi/models/summary.go:117.22,118.21 1 1 +github.com/muety/wakapi/models/summary.go:119.20,120.19 1 1 +github.com/muety/wakapi/models/summary.go:121.21,122.21 1 1 +github.com/muety/wakapi/models/summary.go:123.21,124.21 1 1 +github.com/muety/wakapi/models/summary.go:129.59,130.21 1 1 +github.com/muety/wakapi/models/summary.go:134.2,134.35 1 1 +github.com/muety/wakapi/models/summary.go:140.2,140.10 1 1 +github.com/muety/wakapi/models/summary.go:130.21,132.3 1 1 +github.com/muety/wakapi/models/summary.go:134.35,135.41 1 1 +github.com/muety/wakapi/models/summary.go:135.41,137.4 1 1 +github.com/muety/wakapi/models/summary.go:156.33,161.26 4 1 +github.com/muety/wakapi/models/summary.go:168.2,168.37 1 1 +github.com/muety/wakapi/models/summary.go:173.2,174.16 2 1 +github.com/muety/wakapi/models/summary.go:177.2,177.33 1 1 +github.com/muety/wakapi/models/summary.go:161.26,162.30 1 1 +github.com/muety/wakapi/models/summary.go:162.30,164.4 1 1 +github.com/muety/wakapi/models/summary.go:168.37,170.3 1 0 +github.com/muety/wakapi/models/summary.go:174.16,176.3 1 0 +github.com/muety/wakapi/models/summary.go:177.33,179.3 1 1 +github.com/muety/wakapi/models/summary.go:183.56,189.28 5 1 +github.com/muety/wakapi/models/summary.go:193.2,194.42 2 1 +github.com/muety/wakapi/models/summary.go:201.2,202.15 2 1 +github.com/muety/wakapi/models/summary.go:189.28,191.3 1 1 +github.com/muety/wakapi/models/summary.go:194.42,195.22 1 0 +github.com/muety/wakapi/models/summary.go:195.22,197.9 2 0 +github.com/muety/wakapi/models/summary.go:202.15,203.28 1 1 +github.com/muety/wakapi/models/summary.go:203.28,205.4 1 0 +github.com/muety/wakapi/models/summary.go:205.9,211.4 1 1 +github.com/muety/wakapi/models/summary.go:215.45,220.16 4 1 +github.com/muety/wakapi/models/summary.go:223.2,223.39 1 1 +github.com/muety/wakapi/models/summary.go:227.2,227.30 1 1 +github.com/muety/wakapi/models/summary.go:220.16,222.3 1 0 +github.com/muety/wakapi/models/summary.go:223.39,225.3 1 1 +github.com/muety/wakapi/models/summary.go:230.73,232.55 2 1 +github.com/muety/wakapi/models/summary.go:237.2,237.16 1 1 +github.com/muety/wakapi/models/summary.go:232.55,233.31 1 1 +github.com/muety/wakapi/models/summary.go:233.31,235.4 1 1 +github.com/muety/wakapi/models/summary.go:240.88,242.55 2 1 +github.com/muety/wakapi/models/summary.go:250.2,250.16 1 1 +github.com/muety/wakapi/models/summary.go:242.55,243.31 1 1 +github.com/muety/wakapi/models/summary.go:243.31,244.23 1 1 +github.com/muety/wakapi/models/summary.go:247.4,247.46 1 1 +github.com/muety/wakapi/models/summary.go:244.23,245.13 1 1 +github.com/muety/wakapi/models/summary.go:253.73,255.34 2 1 +github.com/muety/wakapi/models/summary.go:258.2,258.14 1 1 +github.com/muety/wakapi/models/summary.go:255.34,257.3 1 1 +github.com/muety/wakapi/models/summary.go:261.56,264.55 3 0 +github.com/muety/wakapi/models/summary.go:271.2,271.12 1 0 +github.com/muety/wakapi/models/summary.go:264.55,265.31 1 0 +github.com/muety/wakapi/models/summary.go:265.31,266.44 1 0 +github.com/muety/wakapi/models/summary.go:266.44,268.5 1 0 +github.com/muety/wakapi/models/summary.go:274.58,276.16 2 0 +github.com/muety/wakapi/models/summary.go:279.2,279.16 1 0 +github.com/muety/wakapi/models/summary.go:276.16,278.3 1 0 +github.com/muety/wakapi/models/summary.go:282.71,283.63 1 1 +github.com/muety/wakapi/models/summary.go:327.2,336.10 8 1 +github.com/muety/wakapi/models/summary.go:283.63,284.20 1 1 +github.com/muety/wakapi/models/summary.go:288.3,290.45 2 1 +github.com/muety/wakapi/models/summary.go:299.3,299.31 1 1 +github.com/muety/wakapi/models/summary.go:306.3,306.31 1 1 +github.com/muety/wakapi/models/summary.go:323.3,323.16 1 1 +github.com/muety/wakapi/models/summary.go:284.20,286.4 1 1 +github.com/muety/wakapi/models/summary.go:290.45,291.32 1 1 +github.com/muety/wakapi/models/summary.go:296.4,296.14 1 1 +github.com/muety/wakapi/models/summary.go:291.32,292.24 1 1 +github.com/muety/wakapi/models/summary.go:292.24,294.6 1 1 +github.com/muety/wakapi/models/summary.go:299.31,301.60 1 1 +github.com/muety/wakapi/models/summary.go:301.60,303.5 1 1 +github.com/muety/wakapi/models/summary.go:306.31,308.60 1 1 +github.com/muety/wakapi/models/summary.go:308.60,309.55 1 1 +github.com/muety/wakapi/models/summary.go:309.55,311.6 1 1 +github.com/muety/wakapi/models/summary.go:311.11,319.6 1 1 +github.com/muety/wakapi/models/summary.go:339.57,340.30 1 1 +github.com/muety/wakapi/models/summary.go:345.2,345.43 1 0 +github.com/muety/wakapi/models/summary.go:340.30,341.28 1 1 +github.com/muety/wakapi/models/summary.go:341.28,343.4 1 1 +github.com/muety/wakapi/models/summary.go:348.43,350.2 1 0 +github.com/muety/wakapi/models/summary.go:352.49,353.21 1 0 +github.com/muety/wakapi/models/summary.go:356.2,357.54 2 0 +github.com/muety/wakapi/models/summary.go:353.21,355.3 1 0 +github.com/muety/wakapi/models/summary.go:360.51,361.27 1 0 +github.com/muety/wakapi/models/summary.go:364.2,365.19 2 0 +github.com/muety/wakapi/models/summary.go:361.27,363.3 1 0 +github.com/muety/wakapi/models/summary.go:368.50,372.2 1 1 +github.com/muety/wakapi/models/summary.go:374.33,376.2 1 1 +github.com/muety/wakapi/models/summary.go:378.43,380.2 1 1 +github.com/muety/wakapi/models/summary.go:382.38,384.2 1 1 +github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 +github.com/muety/wakapi/models/user.go:90.34,92.2 1 0 +github.com/muety/wakapi/models/user.go:94.36,95.22 1 1 +github.com/muety/wakapi/models/user.go:98.2,99.16 2 1 +github.com/muety/wakapi/models/user.go:102.2,102.11 1 1 +github.com/muety/wakapi/models/user.go:95.22,97.3 1 1 +github.com/muety/wakapi/models/user.go:99.16,101.3 1 0 +github.com/muety/wakapi/models/user.go:107.41,110.2 2 1 +github.com/muety/wakapi/models/user.go:112.53,115.54 3 0 +github.com/muety/wakapi/models/user.go:118.2,118.51 1 0 +github.com/muety/wakapi/models/user.go:121.2,121.20 1 0 +github.com/muety/wakapi/models/user.go:115.54,117.3 1 0 +github.com/muety/wakapi/models/user.go:118.51,120.3 1 0 +github.com/muety/wakapi/models/user.go:125.52,126.28 1 0 +github.com/muety/wakapi/models/user.go:129.2,129.17 1 0 +github.com/muety/wakapi/models/user.go:126.28,128.3 1 0 +github.com/muety/wakapi/models/user.go:133.45,135.2 1 1 +github.com/muety/wakapi/models/user.go:137.51,139.2 1 1 +github.com/muety/wakapi/models/user.go:145.65,147.32 2 0 +github.com/muety/wakapi/models/user.go:150.2,150.30 1 0 +github.com/muety/wakapi/models/user.go:153.2,154.24 2 0 +github.com/muety/wakapi/models/user.go:147.32,149.3 1 0 +github.com/muety/wakapi/models/user.go:150.30,152.3 1 0 +github.com/muety/wakapi/models/user.go:157.39,159.55 2 1 +github.com/muety/wakapi/models/user.go:163.2,163.51 1 1 +github.com/muety/wakapi/models/user.go:159.55,161.3 1 1 +github.com/muety/wakapi/models/user.go:166.43,169.2 1 0 +github.com/muety/wakapi/models/user.go:171.45,174.2 1 0 +github.com/muety/wakapi/models/user.go:176.33,181.2 1 0 +github.com/muety/wakapi/models/user.go:183.41,185.2 1 0 +github.com/muety/wakapi/models/user.go:187.45,189.2 1 0 +github.com/muety/wakapi/models/user.go:191.45,193.2 1 0 +github.com/muety/wakapi/models/user.go:196.39,198.2 1 0 +github.com/muety/wakapi/models/user.go:200.39,203.2 2 0 +github.com/muety/wakapi/models/filters.go:22.33,24.2 1 1 +github.com/muety/wakapi/models/filters.go:26.48,27.22 1 1 +github.com/muety/wakapi/models/filters.go:32.2,32.14 1 1 +github.com/muety/wakapi/models/filters.go:27.22,28.18 1 1 +github.com/muety/wakapi/models/filters.go:28.18,30.4 1 1 +github.com/muety/wakapi/models/filters.go:40.56,42.2 1 1 +github.com/muety/wakapi/models/filters.go:44.66,47.2 2 1 +github.com/muety/wakapi/models/filters.go:49.59,51.2 1 1 +github.com/muety/wakapi/models/filters.go:53.70,54.16 1 1 +github.com/muety/wakapi/models/filters.go:72.2,72.10 1 1 +github.com/muety/wakapi/models/filters.go:55.22,56.41 1 1 +github.com/muety/wakapi/models/filters.go:57.17,58.31 1 0 +github.com/muety/wakapi/models/filters.go:59.23,60.43 1 1 +github.com/muety/wakapi/models/filters.go:61.21,62.39 1 0 +github.com/muety/wakapi/models/filters.go:63.22,64.41 1 0 +github.com/muety/wakapi/models/filters.go:65.20,66.37 1 1 +github.com/muety/wakapi/models/filters.go:67.21,68.39 1 0 +github.com/muety/wakapi/models/filters.go:69.21,70.39 1 0 +github.com/muety/wakapi/models/filters.go:75.49,76.44 1 1 +github.com/muety/wakapi/models/filters.go:93.2,93.29 1 1 +github.com/muety/wakapi/models/filters.go:76.44,78.3 1 1 +github.com/muety/wakapi/models/filters.go:78.8,78.41 1 1 +github.com/muety/wakapi/models/filters.go:78.41,80.3 1 0 +github.com/muety/wakapi/models/filters.go:80.8,80.53 1 1 +github.com/muety/wakapi/models/filters.go:80.53,82.3 1 1 +github.com/muety/wakapi/models/filters.go:82.8,82.49 1 1 +github.com/muety/wakapi/models/filters.go:82.49,84.3 1 0 +github.com/muety/wakapi/models/filters.go:84.8,84.51 1 1 +github.com/muety/wakapi/models/filters.go:84.51,86.3 1 0 +github.com/muety/wakapi/models/filters.go:86.8,86.47 1 1 +github.com/muety/wakapi/models/filters.go:86.47,88.3 1 0 +github.com/muety/wakapi/models/filters.go:88.8,88.49 1 1 +github.com/muety/wakapi/models/filters.go:88.49,90.3 1 0 +github.com/muety/wakapi/models/filters.go:90.8,90.49 1 1 +github.com/muety/wakapi/models/filters.go:90.49,92.3 1 0 +github.com/muety/wakapi/models/filters.go:96.46,97.30 1 1 +github.com/muety/wakapi/models/filters.go:100.2,100.66 1 0 +github.com/muety/wakapi/models/filters.go:97.30,99.3 1 1 +github.com/muety/wakapi/models/filters.go:103.34,106.2 2 1 +github.com/muety/wakapi/models/filters.go:108.31,110.51 2 0 +github.com/muety/wakapi/models/filters.go:113.2,113.14 1 0 +github.com/muety/wakapi/models/filters.go:110.51,112.3 1 0 +github.com/muety/wakapi/models/filters.go:116.51,118.2 1 0 +github.com/muety/wakapi/models/filters.go:120.37,122.51 2 0 +github.com/muety/wakapi/models/filters.go:127.2,127.14 1 0 +github.com/muety/wakapi/models/filters.go:122.51,123.37 1 0 +github.com/muety/wakapi/models/filters.go:123.37,125.4 1 0 +github.com/muety/wakapi/models/filters.go:130.59,131.18 1 0 +github.com/muety/wakapi/models/filters.go:132.22,133.20 1 0 +github.com/muety/wakapi/models/filters.go:134.23,135.21 1 0 +github.com/muety/wakapi/models/filters.go:136.21,137.19 1 0 +github.com/muety/wakapi/models/filters.go:138.17,139.15 1 0 +github.com/muety/wakapi/models/filters.go:140.22,141.20 1 0 +github.com/muety/wakapi/models/filters.go:142.20,143.18 1 0 +github.com/muety/wakapi/models/filters.go:144.21,145.19 1 0 +github.com/muety/wakapi/models/filters.go:146.21,147.19 1 0 +github.com/muety/wakapi/models/filters.go:148.10,149.21 1 0 +github.com/muety/wakapi/models/filters.go:153.33,155.16 2 0 +github.com/muety/wakapi/models/filters.go:158.2,158.32 1 0 +github.com/muety/wakapi/models/filters.go:155.16,157.3 1 0 +github.com/muety/wakapi/models/filters.go:161.44,167.2 1 1 +github.com/muety/wakapi/models/filters.go:170.70,171.22 1 1 +github.com/muety/wakapi/models/filters.go:179.2,179.17 1 1 +github.com/muety/wakapi/models/filters.go:187.2,187.23 1 1 +github.com/muety/wakapi/models/filters.go:195.2,195.21 1 1 +github.com/muety/wakapi/models/filters.go:203.2,203.22 1 1 +github.com/muety/wakapi/models/filters.go:211.2,211.21 1 1 +github.com/muety/wakapi/models/filters.go:220.2,220.10 1 1 +github.com/muety/wakapi/models/filters.go:171.22,173.31 2 1 +github.com/muety/wakapi/models/filters.go:177.3,177.22 1 1 +github.com/muety/wakapi/models/filters.go:173.31,176.4 2 1 +github.com/muety/wakapi/models/filters.go:179.17,181.26 2 0 +github.com/muety/wakapi/models/filters.go:185.3,185.17 1 0 +github.com/muety/wakapi/models/filters.go:181.26,184.4 2 0 +github.com/muety/wakapi/models/filters.go:187.23,189.32 2 1 +github.com/muety/wakapi/models/filters.go:193.3,193.23 1 1 +github.com/muety/wakapi/models/filters.go:189.32,192.4 2 1 +github.com/muety/wakapi/models/filters.go:195.21,197.30 2 0 +github.com/muety/wakapi/models/filters.go:201.3,201.21 1 0 +github.com/muety/wakapi/models/filters.go:197.30,200.4 2 0 +github.com/muety/wakapi/models/filters.go:203.22,205.31 2 0 +github.com/muety/wakapi/models/filters.go:209.3,209.22 1 0 +github.com/muety/wakapi/models/filters.go:205.31,208.4 2 0 +github.com/muety/wakapi/models/filters.go:211.21,213.30 2 0 +github.com/muety/wakapi/models/filters.go:217.3,217.21 1 0 +github.com/muety/wakapi/models/filters.go:213.30,216.4 2 0 +github.com/muety/wakapi/models/filters.go:223.83,224.41 1 1 +github.com/muety/wakapi/models/filters.go:227.2,227.28 1 1 +github.com/muety/wakapi/models/filters.go:230.2,230.10 1 1 +github.com/muety/wakapi/models/filters.go:224.41,226.3 1 0 +github.com/muety/wakapi/models/filters.go:227.28,229.3 1 1 +github.com/muety/wakapi/models/filters.go:233.43,235.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:33.34,35.2 1 1 +github.com/muety/wakapi/models/heartbeat.go:37.55,40.2 2 0 +github.com/muety/wakapi/models/heartbeat.go:42.65,44.46 2 1 +github.com/muety/wakapi/models/heartbeat.go:44.46,45.108 1 1 +github.com/muety/wakapi/models/heartbeat.go:45.108,48.4 2 1 +github.com/muety/wakapi/models/heartbeat.go:52.50,53.11 1 1 +github.com/muety/wakapi/models/heartbeat.go:70.2,70.15 1 1 +github.com/muety/wakapi/models/heartbeat.go:74.2,74.12 1 1 +github.com/muety/wakapi/models/heartbeat.go:54.22,55.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:56.21,57.17 1 1 +github.com/muety/wakapi/models/heartbeat.go:58.23,59.19 1 1 +github.com/muety/wakapi/models/heartbeat.go:60.17,61.26 1 1 +github.com/muety/wakapi/models/heartbeat.go:62.22,63.18 1 1 +github.com/muety/wakapi/models/heartbeat.go:64.21,65.17 1 0 +github.com/muety/wakapi/models/heartbeat.go:66.21,67.17 1 0 +github.com/muety/wakapi/models/heartbeat.go:70.15,72.3 1 1 +github.com/muety/wakapi/models/heartbeat.go:77.37,93.2 1 0 +github.com/muety/wakapi/models/heartbeat.go:101.41,103.16 2 1 +github.com/muety/wakapi/models/heartbeat.go:106.2,107.10 2 1 +github.com/muety/wakapi/models/heartbeat.go:103.16,105.3 1 0 +github.com/muety/wakapi/models/heartbeat.go:110.38,120.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 +github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 +github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 +github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 +github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 +github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 +github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 +github.com/muety/wakapi/models/mail.go:23.44,27.2 3 0 +github.com/muety/wakapi/models/mail.go:29.44,33.2 3 0 +github.com/muety/wakapi/models/mail.go:35.34,36.18 1 0 +github.com/muety/wakapi/models/mail.go:39.2,39.21 1 0 +github.com/muety/wakapi/models/mail.go:42.2,42.23 1 0 +github.com/muety/wakapi/models/mail.go:45.2,45.10 1 0 +github.com/muety/wakapi/models/mail.go:36.18,38.3 1 0 +github.com/muety/wakapi/models/mail.go:39.21,41.3 1 0 +github.com/muety/wakapi/models/mail.go:42.23,44.3 1 0 +github.com/muety/wakapi/models/mail.go:48.32,67.2 1 0 +github.com/muety/wakapi/models/mail.go:69.41,71.2 1 0 +github.com/muety/wakapi/models/mail_address.go:18.13,21.2 2 1 +github.com/muety/wakapi/models/mail_address.go:27.38,29.2 1 0 +github.com/muety/wakapi/models/mail_address.go:31.35,33.21 2 1 +github.com/muety/wakapi/models/mail_address.go:39.2,39.11 1 1 +github.com/muety/wakapi/models/mail_address.go:33.21,34.21 1 1 +github.com/muety/wakapi/models/mail_address.go:37.3,37.18 1 1 +github.com/muety/wakapi/models/mail_address.go:34.21,36.4 1 1 +github.com/muety/wakapi/models/mail_address.go:42.38,44.21 2 0 +github.com/muety/wakapi/models/mail_address.go:47.2,47.17 1 0 +github.com/muety/wakapi/models/mail_address.go:44.21,46.3 1 0 +github.com/muety/wakapi/models/mail_address.go:50.35,52.2 1 1 +github.com/muety/wakapi/models/mail_address.go:54.43,56.22 2 0 +github.com/muety/wakapi/models/mail_address.go:59.2,59.12 1 0 +github.com/muety/wakapi/models/mail_address.go:56.22,58.3 1 0 +github.com/muety/wakapi/models/mail_address.go:62.46,64.22 2 1 +github.com/muety/wakapi/models/mail_address.go:67.2,67.12 1 1 +github.com/muety/wakapi/models/mail_address.go:64.22,66.3 1 1 +github.com/muety/wakapi/models/mail_address.go:70.40,71.22 1 1 +github.com/muety/wakapi/models/mail_address.go:76.2,76.13 1 1 +github.com/muety/wakapi/models/mail_address.go:71.22,72.17 1 1 +github.com/muety/wakapi/models/mail_address.go:72.17,74.4 1 1 +github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 +github.com/muety/wakapi/models/shared.go:38.52,40.2 1 0 +github.com/muety/wakapi/models/shared.go:42.52,45.16 3 0 +github.com/muety/wakapi/models/shared.go:48.2,50.12 3 0 +github.com/muety/wakapi/models/shared.go:45.16,47.3 1 0 +github.com/muety/wakapi/models/shared.go:53.52,59.22 2 0 +github.com/muety/wakapi/models/shared.go:74.2,77.12 3 0 +github.com/muety/wakapi/models/shared.go:60.14,64.17 2 0 +github.com/muety/wakapi/models/shared.go:67.17,69.8 2 0 +github.com/muety/wakapi/models/shared.go:70.10,71.64 1 0 +github.com/muety/wakapi/models/shared.go:64.17,66.4 1 0 +github.com/muety/wakapi/models/shared.go:80.51,83.2 2 0 +github.com/muety/wakapi/models/shared.go:85.45,87.2 1 1 +github.com/muety/wakapi/models/shared.go:89.37,91.2 1 0 +github.com/muety/wakapi/models/shared.go:93.35,95.2 1 1 +github.com/muety/wakapi/models/shared.go:97.34,99.2 1 0 +github.com/muety/wakapi/models/duration.go:27.75,28.23 1 0 +github.com/muety/wakapi/models/duration.go:31.2,35.35 1 0 +github.com/muety/wakapi/models/duration.go:38.2,38.18 1 0 +github.com/muety/wakapi/models/duration.go:28.23,30.3 1 0 +github.com/muety/wakapi/models/duration.go:35.35,37.3 1 0 +github.com/muety/wakapi/models/duration.go:41.55,56.2 2 0 +github.com/muety/wakapi/models/duration.go:58.50,61.2 2 0 +github.com/muety/wakapi/models/duration.go:63.39,65.16 2 0 +github.com/muety/wakapi/models/duration.go:68.2,69.10 2 0 +github.com/muety/wakapi/models/duration.go:65.16,67.3 1 0 +github.com/muety/wakapi/models/duration.go:72.49,73.11 1 0 +github.com/muety/wakapi/models/duration.go:90.2,90.15 1 0 +github.com/muety/wakapi/models/duration.go:94.2,94.12 1 0 +github.com/muety/wakapi/models/duration.go:74.22,75.18 1 0 +github.com/muety/wakapi/models/duration.go:76.21,77.17 1 0 +github.com/muety/wakapi/models/duration.go:78.23,79.19 1 0 +github.com/muety/wakapi/models/duration.go:80.17,81.26 1 0 +github.com/muety/wakapi/models/duration.go:82.22,83.18 1 0 +github.com/muety/wakapi/models/duration.go:84.21,85.17 1 0 +github.com/muety/wakapi/models/duration.go:86.21,87.17 1 0 +github.com/muety/wakapi/models/duration.go:90.15,92.3 1 0 +github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 +github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 github.com/muety/wakapi/services/report.go:31.122,44.2 2 0 github.com/muety/wakapi/services/report.go:46.38,49.45 2 0 github.com/muety/wakapi/services/report.go:67.2,67.49 1 0 @@ -832,164 +1138,6 @@ github.com/muety/wakapi/services/report.go:121.2,122.12 2 0 github.com/muety/wakapi/services/report.go:93.22,96.3 2 0 github.com/muety/wakapi/services/report.go:104.16,107.3 2 0 github.com/muety/wakapi/services/report.go:116.65,119.3 2 0 -github.com/muety/wakapi/services/aggregation.go:31.142,41.2 1 0 -github.com/muety/wakapi/services/aggregation.go:50.43,53.52 2 0 -github.com/muety/wakapi/services/aggregation.go:53.52,54.80 1 0 -github.com/muety/wakapi/services/aggregation.go:54.80,56.4 1 0 -github.com/muety/wakapi/services/aggregation.go:57.58,59.3 1 0 -github.com/muety/wakapi/services/aggregation.go:62.92,63.47 1 0 -github.com/muety/wakapi/services/aggregation.go:66.2,72.16 4 0 -github.com/muety/wakapi/services/aggregation.go:78.2,79.16 2 0 -github.com/muety/wakapi/services/aggregation.go:85.2,86.44 2 0 -github.com/muety/wakapi/services/aggregation.go:91.2,93.12 3 0 -github.com/muety/wakapi/services/aggregation.go:105.2,105.41 1 0 -github.com/muety/wakapi/services/aggregation.go:123.2,123.12 1 0 -github.com/muety/wakapi/services/aggregation.go:63.47,65.3 1 0 -github.com/muety/wakapi/services/aggregation.go:72.16,75.3 2 0 -github.com/muety/wakapi/services/aggregation.go:79.16,82.3 2 0 -github.com/muety/wakapi/services/aggregation.go:86.44,88.3 1 0 -github.com/muety/wakapi/services/aggregation.go:93.12,94.28 1 0 -github.com/muety/wakapi/services/aggregation.go:94.28,96.47 2 0 -github.com/muety/wakapi/services/aggregation.go:96.47,98.5 1 0 -github.com/muety/wakapi/services/aggregation.go:98.19,100.5 1 0 -github.com/muety/wakapi/services/aggregation.go:105.41,106.71 1 0 -github.com/muety/wakapi/services/aggregation.go:110.3,110.21 1 0 -github.com/muety/wakapi/services/aggregation.go:106.71,107.12 1 0 -github.com/muety/wakapi/services/aggregation.go:110.21,114.4 1 0 -github.com/muety/wakapi/services/aggregation.go:114.9,114.62 1 0 -github.com/muety/wakapi/services/aggregation.go:114.62,118.4 1 0 -github.com/muety/wakapi/services/aggregation.go:126.60,127.115 1 0 -github.com/muety/wakapi/services/aggregation.go:127.115,129.3 1 0 -github.com/muety/wakapi/services/aggregation.go:129.8,131.60 2 0 -github.com/muety/wakapi/services/aggregation.go:131.60,133.4 1 0 -github.com/muety/wakapi/services/aggregation.go:137.83,152.41 5 0 -github.com/muety/wakapi/services/aggregation.go:152.41,162.3 3 0 -github.com/muety/wakapi/services/aggregation.go:165.83,168.27 3 0 -github.com/muety/wakapi/services/aggregation.go:173.2,174.12 2 0 -github.com/muety/wakapi/services/aggregation.go:168.27,169.34 1 0 -github.com/muety/wakapi/services/aggregation.go:169.34,171.4 1 0 -github.com/muety/wakapi/services/aggregation.go:177.79,180.27 3 0 -github.com/muety/wakapi/services/aggregation.go:180.27,182.3 1 0 -github.com/muety/wakapi/services/aggregation.go:185.34,188.2 2 0 -github.com/muety/wakapi/services/key_value.go:14.89,19.2 1 0 -github.com/muety/wakapi/services/key_value.go:21.83,23.2 1 0 -github.com/muety/wakapi/services/key_value.go:25.90,27.2 1 0 -github.com/muety/wakapi/services/key_value.go:29.78,31.16 2 0 -github.com/muety/wakapi/services/key_value.go:37.2,37.11 1 0 -github.com/muety/wakapi/services/key_value.go:31.16,36.3 1 0 -github.com/muety/wakapi/services/key_value.go:40.72,42.2 1 0 -github.com/muety/wakapi/services/key_value.go:44.60,46.2 1 0 -github.com/muety/wakapi/services/user.go:26.99,36.33 3 0 -github.com/muety/wakapi/services/user.go:57.2,57.12 1 0 -github.com/muety/wakapi/services/user.go:36.33,37.31 1 0 -github.com/muety/wakapi/services/user.go:37.31,43.73 4 0 -github.com/muety/wakapi/services/user.go:47.4,47.24 1 0 -github.com/muety/wakapi/services/user.go:43.73,45.5 1 0 -github.com/muety/wakapi/services/user.go:47.24,48.80 1 0 -github.com/muety/wakapi/services/user.go:48.80,50.6 1 0 -github.com/muety/wakapi/services/user.go:50.11,52.6 1 0 -github.com/muety/wakapi/services/user.go:60.74,61.40 1 0 -github.com/muety/wakapi/services/user.go:65.2,66.16 2 0 -github.com/muety/wakapi/services/user.go:70.2,71.15 2 0 -github.com/muety/wakapi/services/user.go:61.40,63.3 1 0 -github.com/muety/wakapi/services/user.go:66.16,68.3 1 0 -github.com/muety/wakapi/services/user.go:74.72,75.37 1 0 -github.com/muety/wakapi/services/user.go:79.2,80.16 2 0 -github.com/muety/wakapi/services/user.go:84.2,85.15 2 0 -github.com/muety/wakapi/services/user.go:75.37,77.3 1 0 -github.com/muety/wakapi/services/user.go:80.16,82.3 1 0 -github.com/muety/wakapi/services/user.go:88.76,90.2 1 0 -github.com/muety/wakapi/services/user.go:92.86,94.2 1 0 -github.com/muety/wakapi/services/user.go:96.92,98.2 1 0 -github.com/muety/wakapi/services/user.go:100.58,102.2 1 0 -github.com/muety/wakapi/services/user.go:104.71,106.2 1 0 -github.com/muety/wakapi/services/user.go:108.86,110.16 2 0 -github.com/muety/wakapi/services/user.go:113.2,113.112 1 0 -github.com/muety/wakapi/services/user.go:110.16,112.3 1 0 -github.com/muety/wakapi/services/user.go:113.112,115.3 1 0 -github.com/muety/wakapi/services/user.go:118.86,120.2 1 0 -github.com/muety/wakapi/services/user.go:122.94,124.2 1 0 -github.com/muety/wakapi/services/user.go:126.71,128.12 2 0 -github.com/muety/wakapi/services/user.go:132.2,133.42 2 0 -github.com/muety/wakapi/services/user.go:137.2,138.16 2 0 -github.com/muety/wakapi/services/user.go:142.2,143.21 2 0 -github.com/muety/wakapi/services/user.go:128.12,130.3 1 0 -github.com/muety/wakapi/services/user.go:133.42,135.3 1 0 -github.com/muety/wakapi/services/user.go:138.16,140.3 1 0 -github.com/muety/wakapi/services/user.go:146.48,148.2 1 0 -github.com/muety/wakapi/services/user.go:150.102,160.93 2 0 -github.com/muety/wakapi/services/user.go:166.2,166.38 1 0 -github.com/muety/wakapi/services/user.go:160.93,162.3 1 0 -github.com/muety/wakapi/services/user.go:162.8,164.3 1 0 -github.com/muety/wakapi/services/user.go:169.73,173.2 3 0 -github.com/muety/wakapi/services/user.go:175.78,179.2 3 0 -github.com/muety/wakapi/services/user.go:181.122,184.35 2 0 -github.com/muety/wakapi/services/user.go:190.2,190.35 1 0 -github.com/muety/wakapi/services/user.go:194.2,194.18 1 0 -github.com/muety/wakapi/services/user.go:184.35,185.89 1 0 -github.com/muety/wakapi/services/user.go:185.89,187.4 1 0 -github.com/muety/wakapi/services/user.go:190.35,192.3 1 0 -github.com/muety/wakapi/services/user.go:197.106,200.96 3 0 -github.com/muety/wakapi/services/user.go:205.2,205.68 1 0 -github.com/muety/wakapi/services/user.go:200.96,202.3 1 0 -github.com/muety/wakapi/services/user.go:202.8,204.3 1 0 -github.com/muety/wakapi/services/user.go:208.85,210.2 1 0 -github.com/muety/wakapi/services/user.go:212.57,219.2 4 0 -github.com/muety/wakapi/services/user.go:221.38,223.2 1 0 -github.com/muety/wakapi/services/user.go:225.55,227.2 1 0 -github.com/muety/wakapi/services/user.go:229.57,234.2 1 0 -github.com/muety/wakapi/services/housekeeping.go:20.144,29.2 1 0 -github.com/muety/wakapi/services/housekeeping.go:31.42,32.43 1 0 -github.com/muety/wakapi/services/housekeeping.go:36.2,38.47 2 0 -github.com/muety/wakapi/services/housekeeping.go:62.2,62.16 1 0 -github.com/muety/wakapi/services/housekeeping.go:32.43,34.3 1 0 -github.com/muety/wakapi/services/housekeeping.go:38.47,41.17 2 0 -github.com/muety/wakapi/services/housekeeping.go:47.3,47.27 1 0 -github.com/muety/wakapi/services/housekeeping.go:41.17,44.4 2 0 -github.com/muety/wakapi/services/housekeeping.go:47.27,49.31 1 0 -github.com/muety/wakapi/services/housekeeping.go:53.4,54.35 2 0 -github.com/muety/wakapi/services/housekeeping.go:49.31,50.13 1 0 -github.com/muety/wakapi/services/housekeeping.go:54.35,55.75 1 0 -github.com/muety/wakapi/services/housekeeping.go:55.75,57.6 1 0 -github.com/muety/wakapi/services/housekeeping.go:62.16,64.3 1 0 -github.com/muety/wakapi/services/housekeeping.go:67.94,69.36 2 0 -github.com/muety/wakapi/services/housekeeping.go:75.2,75.73 1 0 -github.com/muety/wakapi/services/housekeeping.go:80.2,81.74 2 0 -github.com/muety/wakapi/services/housekeeping.go:85.2,85.12 1 0 -github.com/muety/wakapi/services/housekeeping.go:69.36,72.3 2 0 -github.com/muety/wakapi/services/housekeeping.go:75.73,77.3 1 0 -github.com/muety/wakapi/services/housekeeping.go:81.74,83.3 1 0 -github.com/muety/wakapi/services/diagnostics.go:14.101,19.2 1 0 -github.com/muety/wakapi/services/diagnostics.go:21.101,24.2 2 0 -github.com/muety/wakapi/services/duration.go:18.78,24.2 2 1 -github.com/muety/wakapi/services/duration.go:26.123,29.42 2 1 -github.com/muety/wakapi/services/duration.go:35.2,36.16 2 1 -github.com/muety/wakapi/services/duration.go:43.2,48.31 4 1 -github.com/muety/wakapi/services/duration.go:96.2,98.31 2 1 -github.com/muety/wakapi/services/duration.go:111.2,111.49 1 1 -github.com/muety/wakapi/services/duration.go:115.2,115.32 1 1 -github.com/muety/wakapi/services/duration.go:29.42,30.90 1 1 -github.com/muety/wakapi/services/duration.go:30.90,32.4 1 1 -github.com/muety/wakapi/services/duration.go:36.16,38.3 1 0 -github.com/muety/wakapi/services/duration.go:48.31,49.42 1 1 -github.com/muety/wakapi/services/duration.go:53.3,55.62 2 1 -github.com/muety/wakapi/services/duration.go:59.3,59.20 1 1 -github.com/muety/wakapi/services/duration.go:64.3,74.15 3 1 -github.com/muety/wakapi/services/duration.go:77.3,83.84 2 1 -github.com/muety/wakapi/services/duration.go:93.3,93.10 1 1 -github.com/muety/wakapi/services/duration.go:49.42,50.12 1 1 -github.com/muety/wakapi/services/duration.go:55.62,57.4 1 1 -github.com/muety/wakapi/services/duration.go:59.20,61.12 2 1 -github.com/muety/wakapi/services/duration.go:74.15,76.4 1 0 -github.com/muety/wakapi/services/duration.go:83.84,85.41 2 1 -github.com/muety/wakapi/services/duration.go:88.4,88.15 1 1 -github.com/muety/wakapi/services/duration.go:85.41,87.5 1 1 -github.com/muety/wakapi/services/duration.go:89.9,91.4 1 1 -github.com/muety/wakapi/services/duration.go:98.31,99.26 1 1 -github.com/muety/wakapi/services/duration.go:99.26,104.23 1 1 -github.com/muety/wakapi/services/duration.go:107.4,107.36 1 1 -github.com/muety/wakapi/services/duration.go:104.23,106.5 1 1 -github.com/muety/wakapi/services/duration.go:111.49,113.3 1 1 github.com/muety/wakapi/services/heartbeat.go:26.141,40.33 3 0 github.com/muety/wakapi/services/heartbeat.go:48.2,48.12 1 0 github.com/muety/wakapi/services/heartbeat.go:40.33,41.31 1 0 @@ -1052,35 +1200,16 @@ github.com/muety/wakapi/services/heartbeat.go:213.96,215.2 1 0 github.com/muety/wakapi/services/heartbeat.go:217.107,219.55 2 0 github.com/muety/wakapi/services/heartbeat.go:219.55,225.36 4 0 github.com/muety/wakapi/services/heartbeat.go:225.36,230.4 2 0 -github.com/muety/wakapi/services/heartbeat.go:234.85,241.2 6 0 -github.com/muety/wakapi/services/heartbeat.go:243.74,244.32 1 0 -github.com/muety/wakapi/services/heartbeat.go:244.32,249.3 1 0 -github.com/muety/wakapi/services/heartbeat.go:252.72,254.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:256.58,258.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:260.60,262.2 1 0 -github.com/muety/wakapi/services/heartbeat.go:264.94,266.48 2 0 -github.com/muety/wakapi/services/heartbeat.go:272.2,272.18 1 0 -github.com/muety/wakapi/services/heartbeat.go:266.48,268.18 2 0 -github.com/muety/wakapi/services/heartbeat.go:268.18,270.4 1 0 -github.com/muety/wakapi/services/language_mapping.go:18.118,24.2 1 0 -github.com/muety/wakapi/services/language_mapping.go:26.86,28.2 1 0 -github.com/muety/wakapi/services/language_mapping.go:30.96,31.53 1 0 -github.com/muety/wakapi/services/language_mapping.go:35.2,36.16 2 0 -github.com/muety/wakapi/services/language_mapping.go:39.2,40.22 2 0 -github.com/muety/wakapi/services/language_mapping.go:31.53,33.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:36.16,38.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:43.92,46.16 3 0 -github.com/muety/wakapi/services/language_mapping.go:50.2,50.33 1 0 -github.com/muety/wakapi/services/language_mapping.go:53.2,53.22 1 0 -github.com/muety/wakapi/services/language_mapping.go:46.16,48.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:50.33,52.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:56.109,58.16 2 0 -github.com/muety/wakapi/services/language_mapping.go:62.2,63.20 2 0 -github.com/muety/wakapi/services/language_mapping.go:58.16,60.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:66.82,67.26 1 0 -github.com/muety/wakapi/services/language_mapping.go:70.2,72.12 3 0 -github.com/muety/wakapi/services/language_mapping.go:67.26,69.3 1 0 -github.com/muety/wakapi/services/language_mapping.go:75.74,78.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:234.85,242.2 7 0 +github.com/muety/wakapi/services/heartbeat.go:244.74,245.32 1 0 +github.com/muety/wakapi/services/heartbeat.go:245.32,250.3 1 0 +github.com/muety/wakapi/services/heartbeat.go:253.72,255.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:257.58,259.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:261.60,263.2 1 0 +github.com/muety/wakapi/services/heartbeat.go:265.94,267.48 2 0 +github.com/muety/wakapi/services/heartbeat.go:273.2,273.18 1 0 +github.com/muety/wakapi/services/heartbeat.go:267.48,269.18 2 0 +github.com/muety/wakapi/services/heartbeat.go:269.18,271.4 1 0 github.com/muety/wakapi/services/leaderboard.go:30.159,43.33 3 0 github.com/muety/wakapi/services/leaderboard.go:67.2,67.12 1 0 github.com/muety/wakapi/services/leaderboard.go:43.33,44.31 1 0 @@ -1160,6 +1289,196 @@ github.com/muety/wakapi/services/leaderboard.go:268.2,268.23 1 0 github.com/muety/wakapi/services/leaderboard.go:271.2,271.10 1 0 github.com/muety/wakapi/services/leaderboard.go:265.47,267.3 1 0 github.com/muety/wakapi/services/leaderboard.go:268.23,270.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:18.118,24.2 1 0 +github.com/muety/wakapi/services/language_mapping.go:26.86,28.2 1 0 +github.com/muety/wakapi/services/language_mapping.go:30.96,31.53 1 0 +github.com/muety/wakapi/services/language_mapping.go:35.2,36.16 2 0 +github.com/muety/wakapi/services/language_mapping.go:39.2,40.22 2 0 +github.com/muety/wakapi/services/language_mapping.go:31.53,33.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:36.16,38.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:43.92,46.16 3 0 +github.com/muety/wakapi/services/language_mapping.go:50.2,50.33 1 0 +github.com/muety/wakapi/services/language_mapping.go:53.2,53.22 1 0 +github.com/muety/wakapi/services/language_mapping.go:46.16,48.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:50.33,52.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:56.109,58.16 2 0 +github.com/muety/wakapi/services/language_mapping.go:62.2,63.20 2 0 +github.com/muety/wakapi/services/language_mapping.go:58.16,60.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:66.82,67.26 1 0 +github.com/muety/wakapi/services/language_mapping.go:70.2,72.12 3 0 +github.com/muety/wakapi/services/language_mapping.go:67.26,69.3 1 0 +github.com/muety/wakapi/services/language_mapping.go:75.74,78.2 1 0 +github.com/muety/wakapi/services/summary.go:28.189,40.33 3 1 +github.com/muety/wakapi/services/summary.go:46.2,46.12 1 1 +github.com/muety/wakapi/services/summary.go:40.33,41.31 1 1 +github.com/muety/wakapi/services/summary.go:41.31,43.4 1 0 +github.com/muety/wakapi/services/summary.go:52.167,55.66 2 1 +github.com/muety/wakapi/services/summary.go:60.2,65.20 4 1 +github.com/muety/wakapi/services/summary.go:71.2,71.65 1 1 +github.com/muety/wakapi/services/summary.go:76.2,77.16 2 1 +github.com/muety/wakapi/services/summary.go:82.2,87.79 5 1 +github.com/muety/wakapi/services/summary.go:92.2,93.30 2 1 +github.com/muety/wakapi/services/summary.go:55.66,57.3 1 0 +github.com/muety/wakapi/services/summary.go:65.20,68.3 2 1 +github.com/muety/wakapi/services/summary.go:71.65,73.3 1 0 +github.com/muety/wakapi/services/summary.go:77.16,79.3 1 0 +github.com/muety/wakapi/services/summary.go:87.79,90.3 2 1 +github.com/muety/wakapi/services/summary.go:96.126,100.41 2 1 +github.com/muety/wakapi/services/summary.go:111.2,112.44 2 1 +github.com/muety/wakapi/services/summary.go:127.2,128.16 2 1 +github.com/muety/wakapi/services/summary.go:132.2,132.30 1 1 +github.com/muety/wakapi/services/summary.go:100.41,103.17 2 1 +github.com/muety/wakapi/services/summary.go:103.17,105.4 1 1 +github.com/muety/wakapi/services/summary.go:105.9,107.4 1 0 +github.com/muety/wakapi/services/summary.go:112.44,113.87 1 1 +github.com/muety/wakapi/services/summary.go:113.87,114.71 1 1 +github.com/muety/wakapi/services/summary.go:120.4,120.36 1 1 +github.com/muety/wakapi/services/summary.go:114.71,118.13 1 0 +github.com/muety/wakapi/services/summary.go:121.9,123.4 1 0 +github.com/muety/wakapi/services/summary.go:128.16,130.3 1 0 +github.com/muety/wakapi/services/summary.go:135.127,138.16 2 1 +github.com/muety/wakapi/services/summary.go:142.2,143.50 2 1 +github.com/muety/wakapi/services/summary.go:148.2,150.26 3 1 +github.com/muety/wakapi/services/summary.go:155.2,163.34 8 1 +github.com/muety/wakapi/services/summary.go:183.2,183.25 1 1 +github.com/muety/wakapi/services/summary.go:188.2,202.30 2 1 +github.com/muety/wakapi/services/summary.go:138.16,140.3 1 0 +github.com/muety/wakapi/services/summary.go:143.50,146.3 2 1 +github.com/muety/wakapi/services/summary.go:150.26,152.3 1 1 +github.com/muety/wakapi/services/summary.go:163.34,165.20 2 1 +github.com/muety/wakapi/services/summary.go:166.30,167.29 1 1 +github.com/muety/wakapi/services/summary.go:168.31,169.30 1 1 +github.com/muety/wakapi/services/summary.go:170.29,171.28 1 1 +github.com/muety/wakapi/services/summary.go:172.25,173.24 1 1 +github.com/muety/wakapi/services/summary.go:174.30,175.29 1 1 +github.com/muety/wakapi/services/summary.go:176.29,177.28 1 1 +github.com/muety/wakapi/services/summary.go:178.29,179.28 1 1 +github.com/muety/wakapi/services/summary.go:183.25,186.3 2 1 +github.com/muety/wakapi/services/summary.go:207.76,209.2 1 0 +github.com/muety/wakapi/services/summary.go:211.62,214.2 2 0 +github.com/muety/wakapi/services/summary.go:216.81,219.2 2 0 +github.com/muety/wakapi/services/summary.go:221.66,224.2 2 0 +github.com/muety/wakapi/services/summary.go:228.125,231.30 2 1 +github.com/muety/wakapi/services/summary.go:235.2,236.28 2 1 +github.com/muety/wakapi/services/summary.go:244.2,244.40 1 1 +github.com/muety/wakapi/services/summary.go:248.2,248.67 1 1 +github.com/muety/wakapi/services/summary.go:231.30,233.3 1 1 +github.com/muety/wakapi/services/summary.go:236.28,242.3 1 1 +github.com/muety/wakapi/services/summary.go:244.40,246.3 1 1 +github.com/muety/wakapi/services/summary.go:251.87,252.72 1 1 +github.com/muety/wakapi/services/summary.go:260.2,261.16 2 1 +github.com/muety/wakapi/services/summary.go:266.2,267.37 2 1 +github.com/muety/wakapi/services/summary.go:271.2,273.30 3 1 +github.com/muety/wakapi/services/summary.go:284.2,285.29 2 1 +github.com/muety/wakapi/services/summary.go:290.2,291.16 2 1 +github.com/muety/wakapi/services/summary.go:252.72,258.3 1 1 +github.com/muety/wakapi/services/summary.go:261.16,264.3 2 0 +github.com/muety/wakapi/services/summary.go:267.37,269.3 1 1 +github.com/muety/wakapi/services/summary.go:273.30,274.48 1 1 +github.com/muety/wakapi/services/summary.go:274.48,275.41 1 1 +github.com/muety/wakapi/services/summary.go:278.4,279.29 2 1 +github.com/muety/wakapi/services/summary.go:275.41,277.5 1 1 +github.com/muety/wakapi/services/summary.go:285.29,286.18 1 1 +github.com/muety/wakapi/services/summary.go:286.18,288.4 1 1 +github.com/muety/wakapi/services/summary.go:294.97,295.24 1 1 +github.com/muety/wakapi/services/summary.go:299.2,316.30 5 1 +github.com/muety/wakapi/services/summary.go:348.2,351.26 3 1 +github.com/muety/wakapi/services/summary.go:295.24,297.3 1 0 +github.com/muety/wakapi/services/summary.go:316.30,318.41 2 1 +github.com/muety/wakapi/services/summary.go:323.3,323.38 1 1 +github.com/muety/wakapi/services/summary.go:327.3,327.37 1 1 +github.com/muety/wakapi/services/summary.go:331.3,331.34 1 1 +github.com/muety/wakapi/services/summary.go:335.3,345.25 10 1 +github.com/muety/wakapi/services/summary.go:318.41,320.12 2 1 +github.com/muety/wakapi/services/summary.go:323.38,325.4 1 0 +github.com/muety/wakapi/services/summary.go:327.37,329.4 1 1 +github.com/muety/wakapi/services/summary.go:331.34,333.4 1 1 +github.com/muety/wakapi/services/summary.go:354.127,358.32 2 1 +github.com/muety/wakapi/services/summary.go:362.2,362.27 1 1 +github.com/muety/wakapi/services/summary.go:370.2,372.26 3 1 +github.com/muety/wakapi/services/summary.go:377.2,377.43 1 1 +github.com/muety/wakapi/services/summary.go:381.2,381.17 1 1 +github.com/muety/wakapi/services/summary.go:358.32,360.3 1 1 +github.com/muety/wakapi/services/summary.go:362.27,363.37 1 1 +github.com/muety/wakapi/services/summary.go:363.37,365.4 1 1 +github.com/muety/wakapi/services/summary.go:365.9,367.4 1 1 +github.com/muety/wakapi/services/summary.go:372.26,375.3 2 1 +github.com/muety/wakapi/services/summary.go:377.43,379.3 1 1 +github.com/muety/wakapi/services/summary.go:384.130,385.25 1 1 +github.com/muety/wakapi/services/summary.go:389.2,392.44 2 1 +github.com/muety/wakapi/services/summary.go:397.2,397.40 1 1 +github.com/muety/wakapi/services/summary.go:428.2,428.54 1 1 +github.com/muety/wakapi/services/summary.go:432.2,432.18 1 1 +github.com/muety/wakapi/services/summary.go:385.25,387.3 1 0 +github.com/muety/wakapi/services/summary.go:392.44,394.3 1 1 +github.com/muety/wakapi/services/summary.go:397.40,399.51 2 1 +github.com/muety/wakapi/services/summary.go:403.3,410.15 3 1 +github.com/muety/wakapi/services/summary.go:422.3,422.22 1 1 +github.com/muety/wakapi/services/summary.go:399.51,400.12 1 1 +github.com/muety/wakapi/services/summary.go:410.15,416.38 3 1 +github.com/muety/wakapi/services/summary.go:416.38,418.5 1 0 +github.com/muety/wakapi/services/summary.go:422.22,424.4 1 1 +github.com/muety/wakapi/services/summary.go:428.54,430.3 1 1 +github.com/muety/wakapi/services/summary.go:435.59,437.2 1 1 +github.com/muety/wakapi/services/summary.go:439.63,440.37 1 0 +github.com/muety/wakapi/services/summary.go:440.37,441.36 1 0 +github.com/muety/wakapi/services/summary.go:441.36,443.4 1 0 +github.com/muety/wakapi/services/summary.go:447.85,448.40 1 1 +github.com/muety/wakapi/services/summary.go:448.40,451.3 2 1 +github.com/muety/wakapi/services/summary.go:454.99,455.42 1 1 +github.com/muety/wakapi/services/summary.go:455.42,457.17 2 1 +github.com/muety/wakapi/services/summary.go:460.3,461.29 2 1 +github.com/muety/wakapi/services/summary.go:464.3,464.22 1 1 +github.com/muety/wakapi/services/summary.go:457.17,459.4 1 0 +github.com/muety/wakapi/services/summary.go:461.29,463.4 1 1 +github.com/muety/wakapi/services/summary.go:468.114,469.33 1 1 +github.com/muety/wakapi/services/summary.go:469.33,472.17 3 1 +github.com/muety/wakapi/services/summary.go:477.3,478.28 2 1 +github.com/muety/wakapi/services/summary.go:481.3,481.24 1 1 +github.com/muety/wakapi/services/summary.go:472.17,473.33 1 1 +github.com/muety/wakapi/services/summary.go:473.33,475.5 1 1 +github.com/muety/wakapi/services/summary.go:478.28,480.4 1 1 +github.com/muety/wakapi/services/diagnostics.go:14.101,19.2 1 0 +github.com/muety/wakapi/services/diagnostics.go:21.101,24.2 2 0 +github.com/muety/wakapi/services/duration.go:18.78,24.2 2 1 +github.com/muety/wakapi/services/duration.go:26.123,29.42 2 1 +github.com/muety/wakapi/services/duration.go:35.2,36.16 2 1 +github.com/muety/wakapi/services/duration.go:43.2,48.31 4 1 +github.com/muety/wakapi/services/duration.go:99.2,101.31 2 1 +github.com/muety/wakapi/services/duration.go:114.2,114.49 1 1 +github.com/muety/wakapi/services/duration.go:118.2,118.32 1 1 +github.com/muety/wakapi/services/duration.go:29.42,30.90 1 1 +github.com/muety/wakapi/services/duration.go:30.90,32.4 1 1 +github.com/muety/wakapi/services/duration.go:36.16,38.3 1 0 +github.com/muety/wakapi/services/duration.go:48.31,49.42 1 1 +github.com/muety/wakapi/services/duration.go:53.3,54.34 2 1 +github.com/muety/wakapi/services/duration.go:58.3,58.62 1 1 +github.com/muety/wakapi/services/duration.go:62.3,62.20 1 1 +github.com/muety/wakapi/services/duration.go:67.3,77.15 3 1 +github.com/muety/wakapi/services/duration.go:80.3,86.84 2 1 +github.com/muety/wakapi/services/duration.go:96.3,96.10 1 1 +github.com/muety/wakapi/services/duration.go:49.42,50.12 1 1 +github.com/muety/wakapi/services/duration.go:54.34,56.4 1 1 +github.com/muety/wakapi/services/duration.go:58.62,60.4 1 1 +github.com/muety/wakapi/services/duration.go:62.20,64.12 2 1 +github.com/muety/wakapi/services/duration.go:77.15,79.4 1 0 +github.com/muety/wakapi/services/duration.go:86.84,88.41 2 1 +github.com/muety/wakapi/services/duration.go:91.4,91.15 1 1 +github.com/muety/wakapi/services/duration.go:88.41,90.5 1 1 +github.com/muety/wakapi/services/duration.go:92.9,94.4 1 1 +github.com/muety/wakapi/services/duration.go:101.31,102.26 1 1 +github.com/muety/wakapi/services/duration.go:102.26,107.23 1 1 +github.com/muety/wakapi/services/duration.go:110.4,110.36 1 1 +github.com/muety/wakapi/services/duration.go:107.23,109.5 1 1 +github.com/muety/wakapi/services/duration.go:114.49,116.3 1 1 +github.com/muety/wakapi/services/key_value.go:14.89,19.2 1 0 +github.com/muety/wakapi/services/key_value.go:21.83,23.2 1 0 +github.com/muety/wakapi/services/key_value.go:25.90,27.2 1 0 +github.com/muety/wakapi/services/key_value.go:29.78,31.16 2 0 +github.com/muety/wakapi/services/key_value.go:37.2,37.11 1 0 +github.com/muety/wakapi/services/key_value.go:31.16,36.3 1 0 +github.com/muety/wakapi/services/key_value.go:40.72,42.2 1 0 +github.com/muety/wakapi/services/key_value.go:44.60,46.2 1 0 github.com/muety/wakapi/services/project_label.go:21.111,28.2 1 0 github.com/muety/wakapi/services/project_label.go:30.80,32.2 1 0 github.com/muety/wakapi/services/project_label.go:34.90,35.51 1 0 @@ -1186,135 +1505,125 @@ github.com/muety/wakapi/services/project_label.go:83.24,85.3 1 0 github.com/muety/wakapi/services/project_label.go:92.89,94.14 2 0 github.com/muety/wakapi/services/project_label.go:97.2,100.4 1 0 github.com/muety/wakapi/services/project_label.go:94.14,96.3 1 0 -github.com/muety/wakapi/services/summary.go:28.189,40.33 3 1 -github.com/muety/wakapi/services/summary.go:46.2,46.12 1 1 -github.com/muety/wakapi/services/summary.go:40.33,41.31 1 1 -github.com/muety/wakapi/services/summary.go:41.31,43.4 1 0 -github.com/muety/wakapi/services/summary.go:52.167,55.66 2 1 -github.com/muety/wakapi/services/summary.go:60.2,65.20 4 1 -github.com/muety/wakapi/services/summary.go:71.2,71.65 1 1 -github.com/muety/wakapi/services/summary.go:76.2,77.16 2 1 -github.com/muety/wakapi/services/summary.go:82.2,87.105 5 1 -github.com/muety/wakapi/services/summary.go:91.2,92.30 2 1 -github.com/muety/wakapi/services/summary.go:55.66,57.3 1 0 -github.com/muety/wakapi/services/summary.go:65.20,68.3 2 1 -github.com/muety/wakapi/services/summary.go:71.65,73.3 1 0 -github.com/muety/wakapi/services/summary.go:77.16,79.3 1 0 -github.com/muety/wakapi/services/summary.go:87.105,89.3 1 1 -github.com/muety/wakapi/services/summary.go:95.126,99.41 2 1 -github.com/muety/wakapi/services/summary.go:110.2,111.44 2 1 -github.com/muety/wakapi/services/summary.go:126.2,127.16 2 1 -github.com/muety/wakapi/services/summary.go:131.2,131.30 1 1 -github.com/muety/wakapi/services/summary.go:99.41,102.17 2 1 -github.com/muety/wakapi/services/summary.go:102.17,104.4 1 1 -github.com/muety/wakapi/services/summary.go:104.9,106.4 1 0 -github.com/muety/wakapi/services/summary.go:111.44,112.87 1 1 -github.com/muety/wakapi/services/summary.go:112.87,113.71 1 1 -github.com/muety/wakapi/services/summary.go:119.4,119.36 1 1 -github.com/muety/wakapi/services/summary.go:113.71,117.13 1 0 -github.com/muety/wakapi/services/summary.go:120.9,122.4 1 0 -github.com/muety/wakapi/services/summary.go:127.16,129.3 1 0 -github.com/muety/wakapi/services/summary.go:134.127,137.16 2 1 -github.com/muety/wakapi/services/summary.go:141.2,142.74 2 1 -github.com/muety/wakapi/services/summary.go:146.2,148.26 3 1 -github.com/muety/wakapi/services/summary.go:153.2,160.34 7 1 -github.com/muety/wakapi/services/summary.go:178.2,178.25 1 1 -github.com/muety/wakapi/services/summary.go:183.2,196.30 2 1 -github.com/muety/wakapi/services/summary.go:137.16,139.3 1 0 -github.com/muety/wakapi/services/summary.go:142.74,144.3 1 1 -github.com/muety/wakapi/services/summary.go:148.26,150.3 1 1 -github.com/muety/wakapi/services/summary.go:160.34,162.20 2 1 -github.com/muety/wakapi/services/summary.go:163.30,164.29 1 1 -github.com/muety/wakapi/services/summary.go:165.31,166.30 1 1 -github.com/muety/wakapi/services/summary.go:167.29,168.28 1 1 -github.com/muety/wakapi/services/summary.go:169.25,170.24 1 1 -github.com/muety/wakapi/services/summary.go:171.30,172.29 1 1 -github.com/muety/wakapi/services/summary.go:173.29,174.28 1 1 -github.com/muety/wakapi/services/summary.go:178.25,181.3 2 1 -github.com/muety/wakapi/services/summary.go:201.76,203.2 1 0 -github.com/muety/wakapi/services/summary.go:205.62,208.2 2 0 -github.com/muety/wakapi/services/summary.go:210.81,213.2 2 0 -github.com/muety/wakapi/services/summary.go:215.66,218.2 2 0 -github.com/muety/wakapi/services/summary.go:222.125,225.30 2 1 -github.com/muety/wakapi/services/summary.go:229.2,230.28 2 1 -github.com/muety/wakapi/services/summary.go:238.2,238.40 1 1 -github.com/muety/wakapi/services/summary.go:242.2,242.67 1 1 -github.com/muety/wakapi/services/summary.go:225.30,227.3 1 1 -github.com/muety/wakapi/services/summary.go:230.28,236.3 1 1 -github.com/muety/wakapi/services/summary.go:238.40,240.3 1 1 -github.com/muety/wakapi/services/summary.go:245.87,246.72 1 1 -github.com/muety/wakapi/services/summary.go:254.2,255.16 2 1 -github.com/muety/wakapi/services/summary.go:260.2,261.37 2 1 -github.com/muety/wakapi/services/summary.go:265.2,267.30 3 1 -github.com/muety/wakapi/services/summary.go:278.2,279.29 2 1 -github.com/muety/wakapi/services/summary.go:284.2,285.16 2 1 -github.com/muety/wakapi/services/summary.go:246.72,252.3 1 1 -github.com/muety/wakapi/services/summary.go:255.16,258.3 2 0 -github.com/muety/wakapi/services/summary.go:261.37,263.3 1 1 -github.com/muety/wakapi/services/summary.go:267.30,268.48 1 1 -github.com/muety/wakapi/services/summary.go:268.48,269.41 1 1 -github.com/muety/wakapi/services/summary.go:272.4,273.29 2 1 -github.com/muety/wakapi/services/summary.go:269.41,271.5 1 1 -github.com/muety/wakapi/services/summary.go:279.29,280.18 1 1 -github.com/muety/wakapi/services/summary.go:280.18,282.4 1 1 -github.com/muety/wakapi/services/summary.go:288.97,289.24 1 1 -github.com/muety/wakapi/services/summary.go:293.2,309.30 5 1 -github.com/muety/wakapi/services/summary.go:340.2,343.26 3 1 -github.com/muety/wakapi/services/summary.go:289.24,291.3 1 0 -github.com/muety/wakapi/services/summary.go:309.30,311.41 2 1 -github.com/muety/wakapi/services/summary.go:316.3,316.38 1 1 -github.com/muety/wakapi/services/summary.go:320.3,320.37 1 1 -github.com/muety/wakapi/services/summary.go:324.3,324.34 1 1 -github.com/muety/wakapi/services/summary.go:328.3,337.25 9 1 -github.com/muety/wakapi/services/summary.go:311.41,313.12 2 1 -github.com/muety/wakapi/services/summary.go:316.38,318.4 1 0 -github.com/muety/wakapi/services/summary.go:320.37,322.4 1 1 -github.com/muety/wakapi/services/summary.go:324.34,326.4 1 1 -github.com/muety/wakapi/services/summary.go:346.127,350.32 2 1 -github.com/muety/wakapi/services/summary.go:354.2,354.27 1 1 -github.com/muety/wakapi/services/summary.go:362.2,364.26 3 1 -github.com/muety/wakapi/services/summary.go:369.2,369.43 1 1 -github.com/muety/wakapi/services/summary.go:373.2,373.17 1 1 -github.com/muety/wakapi/services/summary.go:350.32,352.3 1 1 -github.com/muety/wakapi/services/summary.go:354.27,355.37 1 1 -github.com/muety/wakapi/services/summary.go:355.37,357.4 1 1 -github.com/muety/wakapi/services/summary.go:357.9,359.4 1 1 -github.com/muety/wakapi/services/summary.go:364.26,367.3 2 1 -github.com/muety/wakapi/services/summary.go:369.43,371.3 1 1 -github.com/muety/wakapi/services/summary.go:376.130,377.25 1 1 -github.com/muety/wakapi/services/summary.go:381.2,384.44 2 1 -github.com/muety/wakapi/services/summary.go:389.2,389.40 1 1 -github.com/muety/wakapi/services/summary.go:420.2,420.54 1 1 -github.com/muety/wakapi/services/summary.go:424.2,424.18 1 1 -github.com/muety/wakapi/services/summary.go:377.25,379.3 1 0 -github.com/muety/wakapi/services/summary.go:384.44,386.3 1 1 -github.com/muety/wakapi/services/summary.go:389.40,391.51 2 1 -github.com/muety/wakapi/services/summary.go:395.3,402.15 3 1 -github.com/muety/wakapi/services/summary.go:414.3,414.22 1 1 -github.com/muety/wakapi/services/summary.go:391.51,392.12 1 1 -github.com/muety/wakapi/services/summary.go:402.15,408.38 3 1 -github.com/muety/wakapi/services/summary.go:408.38,410.5 1 0 -github.com/muety/wakapi/services/summary.go:414.22,416.4 1 1 -github.com/muety/wakapi/services/summary.go:420.54,422.3 1 1 -github.com/muety/wakapi/services/summary.go:427.59,429.2 1 1 -github.com/muety/wakapi/services/summary.go:431.63,432.37 1 0 -github.com/muety/wakapi/services/summary.go:432.37,433.36 1 0 -github.com/muety/wakapi/services/summary.go:433.36,435.4 1 0 -github.com/muety/wakapi/services/summary.go:439.85,440.40 1 1 -github.com/muety/wakapi/services/summary.go:440.40,443.3 2 1 -github.com/muety/wakapi/services/summary.go:446.99,447.42 1 1 -github.com/muety/wakapi/services/summary.go:447.42,449.17 2 1 -github.com/muety/wakapi/services/summary.go:452.3,453.29 2 1 -github.com/muety/wakapi/services/summary.go:456.3,456.22 1 1 -github.com/muety/wakapi/services/summary.go:449.17,451.4 1 0 -github.com/muety/wakapi/services/summary.go:453.29,455.4 1 1 -github.com/muety/wakapi/services/summary.go:460.114,461.33 1 1 -github.com/muety/wakapi/services/summary.go:461.33,464.17 3 1 -github.com/muety/wakapi/services/summary.go:469.3,470.28 2 1 -github.com/muety/wakapi/services/summary.go:473.3,473.24 1 1 -github.com/muety/wakapi/services/summary.go:464.17,465.33 1 1 -github.com/muety/wakapi/services/summary.go:465.33,467.5 1 1 -github.com/muety/wakapi/services/summary.go:470.28,472.4 1 1 +github.com/muety/wakapi/services/aggregation.go:31.142,41.2 1 0 +github.com/muety/wakapi/services/aggregation.go:50.43,53.52 2 0 +github.com/muety/wakapi/services/aggregation.go:53.52,54.80 1 0 +github.com/muety/wakapi/services/aggregation.go:54.80,56.4 1 0 +github.com/muety/wakapi/services/aggregation.go:57.58,59.3 1 0 +github.com/muety/wakapi/services/aggregation.go:62.92,63.47 1 0 +github.com/muety/wakapi/services/aggregation.go:66.2,72.16 4 0 +github.com/muety/wakapi/services/aggregation.go:78.2,79.16 2 0 +github.com/muety/wakapi/services/aggregation.go:85.2,86.44 2 0 +github.com/muety/wakapi/services/aggregation.go:91.2,93.12 3 0 +github.com/muety/wakapi/services/aggregation.go:105.2,105.41 1 0 +github.com/muety/wakapi/services/aggregation.go:123.2,123.12 1 0 +github.com/muety/wakapi/services/aggregation.go:63.47,65.3 1 0 +github.com/muety/wakapi/services/aggregation.go:72.16,75.3 2 0 +github.com/muety/wakapi/services/aggregation.go:79.16,82.3 2 0 +github.com/muety/wakapi/services/aggregation.go:86.44,88.3 1 0 +github.com/muety/wakapi/services/aggregation.go:93.12,94.28 1 0 +github.com/muety/wakapi/services/aggregation.go:94.28,96.47 2 0 +github.com/muety/wakapi/services/aggregation.go:96.47,98.5 1 0 +github.com/muety/wakapi/services/aggregation.go:98.19,100.5 1 0 +github.com/muety/wakapi/services/aggregation.go:105.41,106.71 1 0 +github.com/muety/wakapi/services/aggregation.go:110.3,110.21 1 0 +github.com/muety/wakapi/services/aggregation.go:106.71,107.12 1 0 +github.com/muety/wakapi/services/aggregation.go:110.21,114.4 1 0 +github.com/muety/wakapi/services/aggregation.go:114.9,114.62 1 0 +github.com/muety/wakapi/services/aggregation.go:114.62,118.4 1 0 +github.com/muety/wakapi/services/aggregation.go:126.60,127.115 1 0 +github.com/muety/wakapi/services/aggregation.go:127.115,129.3 1 0 +github.com/muety/wakapi/services/aggregation.go:129.8,131.60 2 0 +github.com/muety/wakapi/services/aggregation.go:131.60,133.4 1 0 +github.com/muety/wakapi/services/aggregation.go:137.83,152.41 5 0 +github.com/muety/wakapi/services/aggregation.go:152.41,162.3 3 0 +github.com/muety/wakapi/services/aggregation.go:165.83,168.27 3 0 +github.com/muety/wakapi/services/aggregation.go:173.2,174.12 2 0 +github.com/muety/wakapi/services/aggregation.go:168.27,169.34 1 0 +github.com/muety/wakapi/services/aggregation.go:169.34,171.4 1 0 +github.com/muety/wakapi/services/aggregation.go:177.79,180.27 3 0 +github.com/muety/wakapi/services/aggregation.go:180.27,182.3 1 0 +github.com/muety/wakapi/services/aggregation.go:185.34,188.2 2 0 +github.com/muety/wakapi/services/housekeeping.go:20.144,29.2 1 0 +github.com/muety/wakapi/services/housekeeping.go:31.42,32.43 1 0 +github.com/muety/wakapi/services/housekeeping.go:36.2,38.47 2 0 +github.com/muety/wakapi/services/housekeeping.go:62.2,62.16 1 0 +github.com/muety/wakapi/services/housekeeping.go:32.43,34.3 1 0 +github.com/muety/wakapi/services/housekeeping.go:38.47,41.17 2 0 +github.com/muety/wakapi/services/housekeeping.go:47.3,47.27 1 0 +github.com/muety/wakapi/services/housekeeping.go:41.17,44.4 2 0 +github.com/muety/wakapi/services/housekeeping.go:47.27,49.31 1 0 +github.com/muety/wakapi/services/housekeeping.go:53.4,54.35 2 0 +github.com/muety/wakapi/services/housekeeping.go:49.31,50.13 1 0 +github.com/muety/wakapi/services/housekeeping.go:54.35,55.75 1 0 +github.com/muety/wakapi/services/housekeeping.go:55.75,57.6 1 0 +github.com/muety/wakapi/services/housekeeping.go:62.16,64.3 1 0 +github.com/muety/wakapi/services/housekeeping.go:67.94,69.36 2 0 +github.com/muety/wakapi/services/housekeeping.go:75.2,75.73 1 0 +github.com/muety/wakapi/services/housekeeping.go:80.2,81.74 2 0 +github.com/muety/wakapi/services/housekeeping.go:85.2,85.12 1 0 +github.com/muety/wakapi/services/housekeeping.go:69.36,72.3 2 0 +github.com/muety/wakapi/services/housekeeping.go:75.73,77.3 1 0 +github.com/muety/wakapi/services/housekeeping.go:81.74,83.3 1 0 +github.com/muety/wakapi/services/user.go:26.99,36.33 3 0 +github.com/muety/wakapi/services/user.go:57.2,57.12 1 0 +github.com/muety/wakapi/services/user.go:36.33,37.31 1 0 +github.com/muety/wakapi/services/user.go:37.31,43.73 4 0 +github.com/muety/wakapi/services/user.go:47.4,47.24 1 0 +github.com/muety/wakapi/services/user.go:43.73,45.5 1 0 +github.com/muety/wakapi/services/user.go:47.24,48.80 1 0 +github.com/muety/wakapi/services/user.go:48.80,50.6 1 0 +github.com/muety/wakapi/services/user.go:50.11,52.6 1 0 +github.com/muety/wakapi/services/user.go:60.74,61.40 1 0 +github.com/muety/wakapi/services/user.go:65.2,66.16 2 0 +github.com/muety/wakapi/services/user.go:70.2,71.15 2 0 +github.com/muety/wakapi/services/user.go:61.40,63.3 1 0 +github.com/muety/wakapi/services/user.go:66.16,68.3 1 0 +github.com/muety/wakapi/services/user.go:74.72,75.37 1 0 +github.com/muety/wakapi/services/user.go:79.2,80.16 2 0 +github.com/muety/wakapi/services/user.go:84.2,85.15 2 0 +github.com/muety/wakapi/services/user.go:75.37,77.3 1 0 +github.com/muety/wakapi/services/user.go:80.16,82.3 1 0 +github.com/muety/wakapi/services/user.go:88.76,90.2 1 0 +github.com/muety/wakapi/services/user.go:92.86,94.2 1 0 +github.com/muety/wakapi/services/user.go:96.92,98.2 1 0 +github.com/muety/wakapi/services/user.go:100.58,102.2 1 0 +github.com/muety/wakapi/services/user.go:104.71,106.2 1 0 +github.com/muety/wakapi/services/user.go:108.86,110.16 2 0 +github.com/muety/wakapi/services/user.go:113.2,113.112 1 0 +github.com/muety/wakapi/services/user.go:110.16,112.3 1 0 +github.com/muety/wakapi/services/user.go:113.112,115.3 1 0 +github.com/muety/wakapi/services/user.go:118.86,120.2 1 0 +github.com/muety/wakapi/services/user.go:122.94,124.2 1 0 +github.com/muety/wakapi/services/user.go:126.71,128.12 2 0 +github.com/muety/wakapi/services/user.go:132.2,133.42 2 0 +github.com/muety/wakapi/services/user.go:137.2,138.16 2 0 +github.com/muety/wakapi/services/user.go:142.2,143.21 2 0 +github.com/muety/wakapi/services/user.go:128.12,130.3 1 0 +github.com/muety/wakapi/services/user.go:133.42,135.3 1 0 +github.com/muety/wakapi/services/user.go:138.16,140.3 1 0 +github.com/muety/wakapi/services/user.go:146.48,148.2 1 0 +github.com/muety/wakapi/services/user.go:150.102,160.93 2 0 +github.com/muety/wakapi/services/user.go:166.2,166.38 1 0 +github.com/muety/wakapi/services/user.go:160.93,162.3 1 0 +github.com/muety/wakapi/services/user.go:162.8,164.3 1 0 +github.com/muety/wakapi/services/user.go:169.73,173.2 3 0 +github.com/muety/wakapi/services/user.go:175.78,179.2 3 0 +github.com/muety/wakapi/services/user.go:181.122,184.35 2 0 +github.com/muety/wakapi/services/user.go:190.2,190.35 1 0 +github.com/muety/wakapi/services/user.go:194.2,194.18 1 0 +github.com/muety/wakapi/services/user.go:184.35,185.89 1 0 +github.com/muety/wakapi/services/user.go:185.89,187.4 1 0 +github.com/muety/wakapi/services/user.go:190.35,192.3 1 0 +github.com/muety/wakapi/services/user.go:197.106,200.96 3 0 +github.com/muety/wakapi/services/user.go:205.2,205.68 1 0 +github.com/muety/wakapi/services/user.go:200.96,202.3 1 0 +github.com/muety/wakapi/services/user.go:202.8,204.3 1 0 +github.com/muety/wakapi/services/user.go:208.85,210.2 1 0 +github.com/muety/wakapi/services/user.go:212.57,219.2 4 0 +github.com/muety/wakapi/services/user.go:221.38,223.2 1 0 +github.com/muety/wakapi/services/user.go:225.55,227.2 1 0 +github.com/muety/wakapi/services/user.go:229.57,234.2 1 0 github.com/muety/wakapi/services/alias.go:19.77,24.2 1 1 github.com/muety/wakapi/services/alias.go:28.60,29.43 1 1 github.com/muety/wakapi/services/alias.go:32.2,32.14 1 1 @@ -1376,369 +1685,77 @@ github.com/muety/wakapi/services/alias.go:178.3,178.30 1 0 github.com/muety/wakapi/services/alias.go:173.47,174.16 1 0 github.com/muety/wakapi/services/alias.go:174.16,176.5 1 0 github.com/muety/wakapi/services/alias.go:179.8,181.3 1 0 -github.com/muety/wakapi/models/interval.go:41.47,42.23 1 0 -github.com/muety/wakapi/models/interval.go:47.2,47.14 1 0 -github.com/muety/wakapi/models/interval.go:42.23,43.13 1 0 -github.com/muety/wakapi/models/interval.go:43.13,45.4 1 0 -github.com/muety/wakapi/models/mail.go:23.44,27.2 3 0 -github.com/muety/wakapi/models/mail.go:29.44,33.2 3 0 -github.com/muety/wakapi/models/mail.go:35.34,36.18 1 0 -github.com/muety/wakapi/models/mail.go:39.2,39.21 1 0 -github.com/muety/wakapi/models/mail.go:42.2,42.23 1 0 -github.com/muety/wakapi/models/mail.go:45.2,45.10 1 0 -github.com/muety/wakapi/models/mail.go:36.18,38.3 1 0 -github.com/muety/wakapi/models/mail.go:39.21,41.3 1 0 -github.com/muety/wakapi/models/mail.go:42.23,44.3 1 0 -github.com/muety/wakapi/models/mail.go:48.32,67.2 1 0 -github.com/muety/wakapi/models/mail.go:69.41,71.2 1 0 -github.com/muety/wakapi/models/shared.go:38.52,40.2 1 0 -github.com/muety/wakapi/models/shared.go:42.52,45.16 3 0 -github.com/muety/wakapi/models/shared.go:48.2,50.12 3 0 -github.com/muety/wakapi/models/shared.go:45.16,47.3 1 0 -github.com/muety/wakapi/models/shared.go:53.52,59.22 2 0 -github.com/muety/wakapi/models/shared.go:74.2,77.12 3 0 -github.com/muety/wakapi/models/shared.go:60.14,64.17 2 0 -github.com/muety/wakapi/models/shared.go:67.17,69.8 2 0 -github.com/muety/wakapi/models/shared.go:70.10,71.64 1 0 -github.com/muety/wakapi/models/shared.go:64.17,66.4 1 0 -github.com/muety/wakapi/models/shared.go:80.51,83.2 2 0 -github.com/muety/wakapi/models/shared.go:85.45,87.2 1 1 -github.com/muety/wakapi/models/shared.go:89.37,91.2 1 0 -github.com/muety/wakapi/models/shared.go:93.35,95.2 1 1 -github.com/muety/wakapi/models/shared.go:97.34,99.2 1 0 -github.com/muety/wakapi/models/user.go:13.13,15.2 1 1 -github.com/muety/wakapi/models/user.go:90.34,92.2 1 0 -github.com/muety/wakapi/models/user.go:94.36,95.22 1 1 -github.com/muety/wakapi/models/user.go:98.2,99.16 2 1 -github.com/muety/wakapi/models/user.go:102.2,102.11 1 1 -github.com/muety/wakapi/models/user.go:95.22,97.3 1 1 -github.com/muety/wakapi/models/user.go:99.16,101.3 1 0 -github.com/muety/wakapi/models/user.go:107.41,110.2 2 1 -github.com/muety/wakapi/models/user.go:112.53,115.54 3 0 -github.com/muety/wakapi/models/user.go:118.2,118.51 1 0 -github.com/muety/wakapi/models/user.go:121.2,121.20 1 0 -github.com/muety/wakapi/models/user.go:115.54,117.3 1 0 -github.com/muety/wakapi/models/user.go:118.51,120.3 1 0 -github.com/muety/wakapi/models/user.go:125.52,126.28 1 0 -github.com/muety/wakapi/models/user.go:129.2,129.17 1 0 -github.com/muety/wakapi/models/user.go:126.28,128.3 1 0 -github.com/muety/wakapi/models/user.go:133.45,135.2 1 1 -github.com/muety/wakapi/models/user.go:137.51,139.2 1 1 -github.com/muety/wakapi/models/user.go:145.65,147.32 2 0 -github.com/muety/wakapi/models/user.go:150.2,150.30 1 0 -github.com/muety/wakapi/models/user.go:153.2,154.24 2 0 -github.com/muety/wakapi/models/user.go:147.32,149.3 1 0 -github.com/muety/wakapi/models/user.go:150.30,152.3 1 0 -github.com/muety/wakapi/models/user.go:157.39,159.55 2 1 -github.com/muety/wakapi/models/user.go:163.2,163.51 1 1 -github.com/muety/wakapi/models/user.go:159.55,161.3 1 1 -github.com/muety/wakapi/models/user.go:166.43,169.2 1 0 -github.com/muety/wakapi/models/user.go:171.45,174.2 1 0 -github.com/muety/wakapi/models/user.go:176.33,181.2 1 0 -github.com/muety/wakapi/models/user.go:183.41,185.2 1 0 -github.com/muety/wakapi/models/user.go:187.45,189.2 1 0 -github.com/muety/wakapi/models/user.go:191.45,193.2 1 0 -github.com/muety/wakapi/models/user.go:196.39,198.2 1 0 -github.com/muety/wakapi/models/user.go:200.39,203.2 2 0 -github.com/muety/wakapi/models/durations.go:7.30,9.2 1 0 -github.com/muety/wakapi/models/durations.go:11.40,13.2 1 0 -github.com/muety/wakapi/models/durations.go:15.35,17.2 1 0 -github.com/muety/wakapi/models/durations.go:19.45,21.22 2 0 -github.com/muety/wakapi/models/durations.go:24.2,24.14 1 0 -github.com/muety/wakapi/models/durations.go:21.22,23.3 1 0 -github.com/muety/wakapi/models/durations.go:27.39,30.2 2 0 -github.com/muety/wakapi/models/durations.go:32.39,34.18 1 0 -github.com/muety/wakapi/models/durations.go:37.2,37.16 1 0 -github.com/muety/wakapi/models/durations.go:34.18,36.3 1 0 -github.com/muety/wakapi/models/durations.go:40.38,42.18 1 0 -github.com/muety/wakapi/models/durations.go:45.2,45.24 1 0 -github.com/muety/wakapi/models/durations.go:42.18,44.3 1 0 -github.com/muety/wakapi/models/heartbeat.go:33.34,35.2 1 1 -github.com/muety/wakapi/models/heartbeat.go:37.55,40.2 2 0 -github.com/muety/wakapi/models/heartbeat.go:42.65,44.46 2 1 -github.com/muety/wakapi/models/heartbeat.go:44.46,45.108 1 1 -github.com/muety/wakapi/models/heartbeat.go:45.108,48.4 2 1 -github.com/muety/wakapi/models/heartbeat.go:52.50,53.11 1 1 -github.com/muety/wakapi/models/heartbeat.go:68.2,68.15 1 1 -github.com/muety/wakapi/models/heartbeat.go:72.2,72.12 1 1 -github.com/muety/wakapi/models/heartbeat.go:54.22,55.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:56.21,57.17 1 1 -github.com/muety/wakapi/models/heartbeat.go:58.23,59.19 1 1 -github.com/muety/wakapi/models/heartbeat.go:60.17,61.26 1 1 -github.com/muety/wakapi/models/heartbeat.go:62.22,63.18 1 1 -github.com/muety/wakapi/models/heartbeat.go:64.21,65.17 1 0 -github.com/muety/wakapi/models/heartbeat.go:68.15,70.3 1 1 -github.com/muety/wakapi/models/heartbeat.go:75.37,91.2 1 0 -github.com/muety/wakapi/models/heartbeat.go:99.41,101.16 2 1 -github.com/muety/wakapi/models/heartbeat.go:104.2,105.10 2 1 -github.com/muety/wakapi/models/heartbeat.go:101.16,103.3 1 0 -github.com/muety/wakapi/models/heartbeat.go:108.38,118.2 1 0 -github.com/muety/wakapi/models/project_label.go:14.39,16.2 1 0 -github.com/muety/wakapi/models/filters.go:21.33,23.2 1 1 -github.com/muety/wakapi/models/filters.go:25.48,26.22 1 1 -github.com/muety/wakapi/models/filters.go:31.2,31.14 1 1 -github.com/muety/wakapi/models/filters.go:26.22,27.18 1 1 -github.com/muety/wakapi/models/filters.go:27.18,29.4 1 1 -github.com/muety/wakapi/models/filters.go:39.56,41.2 1 1 -github.com/muety/wakapi/models/filters.go:43.66,46.2 2 1 -github.com/muety/wakapi/models/filters.go:48.59,50.2 1 1 -github.com/muety/wakapi/models/filters.go:52.70,53.16 1 1 -github.com/muety/wakapi/models/filters.go:69.2,69.10 1 1 -github.com/muety/wakapi/models/filters.go:54.22,55.41 1 1 -github.com/muety/wakapi/models/filters.go:56.17,57.31 1 0 -github.com/muety/wakapi/models/filters.go:58.23,59.43 1 1 -github.com/muety/wakapi/models/filters.go:60.21,61.39 1 0 -github.com/muety/wakapi/models/filters.go:62.22,63.41 1 0 -github.com/muety/wakapi/models/filters.go:64.20,65.37 1 1 -github.com/muety/wakapi/models/filters.go:66.21,67.39 1 0 -github.com/muety/wakapi/models/filters.go:72.49,73.44 1 1 -github.com/muety/wakapi/models/filters.go:88.2,88.29 1 1 -github.com/muety/wakapi/models/filters.go:73.44,75.3 1 1 -github.com/muety/wakapi/models/filters.go:75.8,75.41 1 1 -github.com/muety/wakapi/models/filters.go:75.41,77.3 1 0 -github.com/muety/wakapi/models/filters.go:77.8,77.53 1 1 -github.com/muety/wakapi/models/filters.go:77.53,79.3 1 1 -github.com/muety/wakapi/models/filters.go:79.8,79.49 1 1 -github.com/muety/wakapi/models/filters.go:79.49,81.3 1 0 -github.com/muety/wakapi/models/filters.go:81.8,81.51 1 1 -github.com/muety/wakapi/models/filters.go:81.51,83.3 1 0 -github.com/muety/wakapi/models/filters.go:83.8,83.47 1 1 -github.com/muety/wakapi/models/filters.go:83.47,85.3 1 0 -github.com/muety/wakapi/models/filters.go:85.8,85.49 1 1 -github.com/muety/wakapi/models/filters.go:85.49,87.3 1 0 -github.com/muety/wakapi/models/filters.go:91.46,92.30 1 1 -github.com/muety/wakapi/models/filters.go:95.2,95.66 1 0 -github.com/muety/wakapi/models/filters.go:92.30,94.3 1 1 -github.com/muety/wakapi/models/filters.go:98.34,101.2 2 1 -github.com/muety/wakapi/models/filters.go:103.31,105.51 2 0 -github.com/muety/wakapi/models/filters.go:108.2,108.14 1 0 -github.com/muety/wakapi/models/filters.go:105.51,107.3 1 0 -github.com/muety/wakapi/models/filters.go:111.51,113.2 1 0 -github.com/muety/wakapi/models/filters.go:115.37,117.51 2 0 -github.com/muety/wakapi/models/filters.go:122.2,122.14 1 0 -github.com/muety/wakapi/models/filters.go:117.51,118.37 1 0 -github.com/muety/wakapi/models/filters.go:118.37,120.4 1 0 -github.com/muety/wakapi/models/filters.go:125.59,126.18 1 0 -github.com/muety/wakapi/models/filters.go:127.22,128.20 1 0 -github.com/muety/wakapi/models/filters.go:129.23,130.21 1 0 -github.com/muety/wakapi/models/filters.go:131.21,132.19 1 0 -github.com/muety/wakapi/models/filters.go:133.17,134.15 1 0 -github.com/muety/wakapi/models/filters.go:135.22,136.20 1 0 -github.com/muety/wakapi/models/filters.go:137.20,138.18 1 0 -github.com/muety/wakapi/models/filters.go:139.21,140.19 1 0 -github.com/muety/wakapi/models/filters.go:141.10,142.21 1 0 -github.com/muety/wakapi/models/filters.go:146.33,148.16 2 0 -github.com/muety/wakapi/models/filters.go:151.2,151.32 1 0 -github.com/muety/wakapi/models/filters.go:148.16,150.3 1 0 -github.com/muety/wakapi/models/filters.go:154.44,160.2 1 1 -github.com/muety/wakapi/models/filters.go:163.70,164.22 1 1 -github.com/muety/wakapi/models/filters.go:172.2,172.17 1 1 -github.com/muety/wakapi/models/filters.go:180.2,180.23 1 1 -github.com/muety/wakapi/models/filters.go:188.2,188.21 1 1 -github.com/muety/wakapi/models/filters.go:196.2,196.22 1 1 -github.com/muety/wakapi/models/filters.go:204.2,204.21 1 1 -github.com/muety/wakapi/models/filters.go:212.2,212.10 1 1 -github.com/muety/wakapi/models/filters.go:164.22,166.31 2 1 -github.com/muety/wakapi/models/filters.go:170.3,170.22 1 1 -github.com/muety/wakapi/models/filters.go:166.31,169.4 2 1 -github.com/muety/wakapi/models/filters.go:172.17,174.26 2 0 -github.com/muety/wakapi/models/filters.go:178.3,178.17 1 0 -github.com/muety/wakapi/models/filters.go:174.26,177.4 2 0 -github.com/muety/wakapi/models/filters.go:180.23,182.32 2 1 -github.com/muety/wakapi/models/filters.go:186.3,186.23 1 1 -github.com/muety/wakapi/models/filters.go:182.32,185.4 2 1 -github.com/muety/wakapi/models/filters.go:188.21,190.30 2 0 -github.com/muety/wakapi/models/filters.go:194.3,194.21 1 0 -github.com/muety/wakapi/models/filters.go:190.30,193.4 2 0 -github.com/muety/wakapi/models/filters.go:196.22,198.31 2 0 -github.com/muety/wakapi/models/filters.go:202.3,202.22 1 0 -github.com/muety/wakapi/models/filters.go:198.31,201.4 2 0 -github.com/muety/wakapi/models/filters.go:204.21,206.30 2 0 -github.com/muety/wakapi/models/filters.go:210.3,210.21 1 0 -github.com/muety/wakapi/models/filters.go:206.30,209.4 2 0 -github.com/muety/wakapi/models/filters.go:215.83,216.41 1 1 -github.com/muety/wakapi/models/filters.go:219.2,219.28 1 1 -github.com/muety/wakapi/models/filters.go:222.2,222.10 1 1 -github.com/muety/wakapi/models/filters.go:216.41,218.3 1 0 -github.com/muety/wakapi/models/filters.go:219.28,221.3 1 1 -github.com/muety/wakapi/models/models.go:3.14,5.2 0 1 -github.com/muety/wakapi/models/leaderboard.go:28.73,30.2 1 0 -github.com/muety/wakapi/models/leaderboard.go:34.56,35.103 1 0 -github.com/muety/wakapi/models/leaderboard.go:35.103,37.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:37.13,39.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:42.63,43.29 1 0 -github.com/muety/wakapi/models/leaderboard.go:43.29,45.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:48.41,49.123 1 0 -github.com/muety/wakapi/models/leaderboard.go:49.123,51.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:54.50,56.2 1 0 -github.com/muety/wakapi/models/leaderboard.go:58.65,59.95 1 0 -github.com/muety/wakapi/models/leaderboard.go:59.95,61.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:64.49,72.25 3 0 -github.com/muety/wakapi/models/leaderboard.go:83.2,83.129 1 0 -github.com/muety/wakapi/models/leaderboard.go:86.2,86.67 1 0 -github.com/muety/wakapi/models/leaderboard.go:90.2,90.79 1 0 -github.com/muety/wakapi/models/leaderboard.go:72.25,73.58 1 0 -github.com/muety/wakapi/models/leaderboard.go:76.3,77.38 2 0 -github.com/muety/wakapi/models/leaderboard.go:80.3,80.40 1 0 -github.com/muety/wakapi/models/leaderboard.go:73.58,74.12 1 0 -github.com/muety/wakapi/models/leaderboard.go:77.38,79.4 1 0 -github.com/muety/wakapi/models/leaderboard.go:83.129,85.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:86.67,88.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:90.79,92.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:95.70,96.107 1 0 -github.com/muety/wakapi/models/leaderboard.go:96.107,98.3 1 0 -github.com/muety/wakapi/models/leaderboard.go:101.45,103.25 2 0 -github.com/muety/wakapi/models/leaderboard.go:108.2,108.19 1 0 -github.com/muety/wakapi/models/leaderboard.go:103.25,104.43 1 0 -github.com/muety/wakapi/models/leaderboard.go:104.43,106.4 1 0 -github.com/muety/wakapi/models/mail_address.go:18.13,21.2 2 1 -github.com/muety/wakapi/models/mail_address.go:27.38,29.2 1 0 -github.com/muety/wakapi/models/mail_address.go:31.35,33.21 2 1 -github.com/muety/wakapi/models/mail_address.go:39.2,39.11 1 1 -github.com/muety/wakapi/models/mail_address.go:33.21,34.21 1 1 -github.com/muety/wakapi/models/mail_address.go:37.3,37.18 1 1 -github.com/muety/wakapi/models/mail_address.go:34.21,36.4 1 1 -github.com/muety/wakapi/models/mail_address.go:42.38,44.21 2 0 -github.com/muety/wakapi/models/mail_address.go:47.2,47.17 1 0 -github.com/muety/wakapi/models/mail_address.go:44.21,46.3 1 0 -github.com/muety/wakapi/models/mail_address.go:50.35,52.2 1 1 -github.com/muety/wakapi/models/mail_address.go:54.43,56.22 2 0 -github.com/muety/wakapi/models/mail_address.go:59.2,59.12 1 0 -github.com/muety/wakapi/models/mail_address.go:56.22,58.3 1 0 -github.com/muety/wakapi/models/mail_address.go:62.46,64.22 2 1 -github.com/muety/wakapi/models/mail_address.go:67.2,67.12 1 1 -github.com/muety/wakapi/models/mail_address.go:64.22,66.3 1 1 -github.com/muety/wakapi/models/mail_address.go:70.40,71.22 1 1 -github.com/muety/wakapi/models/mail_address.go:76.2,76.13 1 1 -github.com/muety/wakapi/models/mail_address.go:71.22,72.17 1 1 -github.com/muety/wakapi/models/mail_address.go:72.17,74.4 1 1 -github.com/muety/wakapi/models/summary.go:64.29,66.2 1 1 -github.com/muety/wakapi/models/summary.go:68.35,70.2 1 0 -github.com/muety/wakapi/models/summary.go:72.38,74.2 1 0 -github.com/muety/wakapi/models/summary.go:76.37,85.2 8 1 -github.com/muety/wakapi/models/summary.go:87.35,89.2 1 1 -github.com/muety/wakapi/models/summary.go:91.57,101.2 1 1 -github.com/muety/wakapi/models/summary.go:103.64,104.21 1 1 -github.com/muety/wakapi/models/summary.go:120.2,120.12 1 0 -github.com/muety/wakapi/models/summary.go:105.22,106.21 1 1 -github.com/muety/wakapi/models/summary.go:107.23,108.22 1 1 -github.com/muety/wakapi/models/summary.go:109.21,110.20 1 1 -github.com/muety/wakapi/models/summary.go:111.17,112.29 1 1 -github.com/muety/wakapi/models/summary.go:113.22,114.21 1 1 -github.com/muety/wakapi/models/summary.go:115.20,116.19 1 1 -github.com/muety/wakapi/models/summary.go:117.21,118.21 1 1 -github.com/muety/wakapi/models/summary.go:123.59,124.21 1 1 -github.com/muety/wakapi/models/summary.go:128.2,128.35 1 1 -github.com/muety/wakapi/models/summary.go:134.2,134.10 1 1 -github.com/muety/wakapi/models/summary.go:124.21,126.3 1 1 -github.com/muety/wakapi/models/summary.go:128.35,129.41 1 1 -github.com/muety/wakapi/models/summary.go:129.41,131.4 1 1 -github.com/muety/wakapi/models/summary.go:150.33,155.26 4 1 -github.com/muety/wakapi/models/summary.go:162.2,162.37 1 1 -github.com/muety/wakapi/models/summary.go:167.2,168.16 2 1 -github.com/muety/wakapi/models/summary.go:171.2,171.33 1 1 -github.com/muety/wakapi/models/summary.go:155.26,156.30 1 1 -github.com/muety/wakapi/models/summary.go:156.30,158.4 1 1 -github.com/muety/wakapi/models/summary.go:162.37,164.3 1 0 -github.com/muety/wakapi/models/summary.go:168.16,170.3 1 0 -github.com/muety/wakapi/models/summary.go:171.33,173.3 1 1 -github.com/muety/wakapi/models/summary.go:177.56,183.28 5 1 -github.com/muety/wakapi/models/summary.go:187.2,188.42 2 1 -github.com/muety/wakapi/models/summary.go:195.2,196.15 2 1 -github.com/muety/wakapi/models/summary.go:183.28,185.3 1 1 -github.com/muety/wakapi/models/summary.go:188.42,189.22 1 0 -github.com/muety/wakapi/models/summary.go:189.22,191.9 2 0 -github.com/muety/wakapi/models/summary.go:196.15,197.28 1 1 -github.com/muety/wakapi/models/summary.go:197.28,199.4 1 0 -github.com/muety/wakapi/models/summary.go:199.9,205.4 1 1 -github.com/muety/wakapi/models/summary.go:209.45,214.16 4 1 -github.com/muety/wakapi/models/summary.go:217.2,217.39 1 1 -github.com/muety/wakapi/models/summary.go:221.2,221.30 1 1 -github.com/muety/wakapi/models/summary.go:214.16,216.3 1 0 -github.com/muety/wakapi/models/summary.go:217.39,219.3 1 1 -github.com/muety/wakapi/models/summary.go:224.73,226.55 2 1 -github.com/muety/wakapi/models/summary.go:231.2,231.16 1 1 -github.com/muety/wakapi/models/summary.go:226.55,227.31 1 1 -github.com/muety/wakapi/models/summary.go:227.31,229.4 1 1 -github.com/muety/wakapi/models/summary.go:234.88,236.55 2 1 -github.com/muety/wakapi/models/summary.go:244.2,244.16 1 1 -github.com/muety/wakapi/models/summary.go:236.55,237.31 1 1 -github.com/muety/wakapi/models/summary.go:237.31,238.23 1 1 -github.com/muety/wakapi/models/summary.go:241.4,241.46 1 1 -github.com/muety/wakapi/models/summary.go:238.23,239.13 1 1 -github.com/muety/wakapi/models/summary.go:247.73,249.34 2 1 -github.com/muety/wakapi/models/summary.go:252.2,252.14 1 1 -github.com/muety/wakapi/models/summary.go:249.34,251.3 1 1 -github.com/muety/wakapi/models/summary.go:255.56,258.55 3 0 -github.com/muety/wakapi/models/summary.go:265.2,265.12 1 0 -github.com/muety/wakapi/models/summary.go:258.55,259.31 1 0 -github.com/muety/wakapi/models/summary.go:259.31,260.44 1 0 -github.com/muety/wakapi/models/summary.go:260.44,262.5 1 0 -github.com/muety/wakapi/models/summary.go:268.58,270.16 2 0 -github.com/muety/wakapi/models/summary.go:273.2,273.16 1 0 -github.com/muety/wakapi/models/summary.go:270.16,272.3 1 0 -github.com/muety/wakapi/models/summary.go:276.71,277.63 1 1 -github.com/muety/wakapi/models/summary.go:321.2,329.10 8 1 -github.com/muety/wakapi/models/summary.go:277.63,278.20 1 1 -github.com/muety/wakapi/models/summary.go:282.3,284.45 2 1 -github.com/muety/wakapi/models/summary.go:293.3,293.31 1 1 -github.com/muety/wakapi/models/summary.go:300.3,300.31 1 1 -github.com/muety/wakapi/models/summary.go:317.3,317.16 1 1 -github.com/muety/wakapi/models/summary.go:278.20,280.4 1 1 -github.com/muety/wakapi/models/summary.go:284.45,285.32 1 1 -github.com/muety/wakapi/models/summary.go:290.4,290.14 1 1 -github.com/muety/wakapi/models/summary.go:285.32,286.24 1 1 -github.com/muety/wakapi/models/summary.go:286.24,288.6 1 1 -github.com/muety/wakapi/models/summary.go:293.31,295.60 1 1 -github.com/muety/wakapi/models/summary.go:295.60,297.5 1 1 -github.com/muety/wakapi/models/summary.go:300.31,302.60 1 1 -github.com/muety/wakapi/models/summary.go:302.60,303.55 1 1 -github.com/muety/wakapi/models/summary.go:303.55,305.6 1 1 -github.com/muety/wakapi/models/summary.go:305.11,313.6 1 1 -github.com/muety/wakapi/models/summary.go:332.57,333.30 1 1 -github.com/muety/wakapi/models/summary.go:338.2,338.43 1 0 -github.com/muety/wakapi/models/summary.go:333.30,334.28 1 1 -github.com/muety/wakapi/models/summary.go:334.28,336.4 1 1 -github.com/muety/wakapi/models/summary.go:341.43,343.2 1 0 -github.com/muety/wakapi/models/summary.go:345.49,346.21 1 0 -github.com/muety/wakapi/models/summary.go:349.2,350.54 2 0 -github.com/muety/wakapi/models/summary.go:346.21,348.3 1 0 -github.com/muety/wakapi/models/summary.go:353.51,354.27 1 0 -github.com/muety/wakapi/models/summary.go:357.2,358.19 2 0 -github.com/muety/wakapi/models/summary.go:354.27,356.3 1 0 -github.com/muety/wakapi/models/summary.go:361.50,365.2 1 1 -github.com/muety/wakapi/models/summary.go:367.33,369.2 1 1 -github.com/muety/wakapi/models/summary.go:371.43,373.2 1 1 -github.com/muety/wakapi/models/summary.go:375.38,377.2 1 1 -github.com/muety/wakapi/models/duration.go:24.55,38.2 2 0 -github.com/muety/wakapi/models/duration.go:40.39,42.16 2 0 -github.com/muety/wakapi/models/duration.go:45.2,46.10 2 0 -github.com/muety/wakapi/models/duration.go:42.16,44.3 1 0 -github.com/muety/wakapi/models/duration.go:49.49,50.11 1 0 -github.com/muety/wakapi/models/duration.go:65.2,65.15 1 0 -github.com/muety/wakapi/models/duration.go:69.2,69.12 1 0 -github.com/muety/wakapi/models/duration.go:51.22,52.18 1 0 -github.com/muety/wakapi/models/duration.go:53.21,54.17 1 0 -github.com/muety/wakapi/models/duration.go:55.23,56.19 1 0 -github.com/muety/wakapi/models/duration.go:57.17,58.26 1 0 -github.com/muety/wakapi/models/duration.go:59.22,60.18 1 0 -github.com/muety/wakapi/models/duration.go:61.21,62.17 1 0 -github.com/muety/wakapi/models/duration.go:65.15,67.3 1 0 -github.com/muety/wakapi/models/language_mapping.go:11.42,13.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:15.51,17.2 1 0 -github.com/muety/wakapi/models/language_mapping.go:19.52,21.2 1 0 -github.com/muety/wakapi/models/alias.go:18.32,20.2 1 0 -github.com/muety/wakapi/models/alias.go:22.37,23.35 1 0 -github.com/muety/wakapi/models/alias.go:28.2,28.14 1 0 -github.com/muety/wakapi/models/alias.go:23.35,24.18 1 0 -github.com/muety/wakapi/models/alias.go:24.18,26.4 1 0 -github.com/muety/wakapi/models/heartbeats.go:7.31,9.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:11.41,13.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:15.36,17.2 1 0 -github.com/muety/wakapi/models/heartbeats.go:19.43,22.2 2 0 -github.com/muety/wakapi/models/heartbeats.go:24.41,26.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:29.2,29.16 1 0 -github.com/muety/wakapi/models/heartbeats.go:26.18,28.3 1 0 -github.com/muety/wakapi/models/heartbeats.go:32.40,34.18 1 0 -github.com/muety/wakapi/models/heartbeats.go:37.2,37.24 1 0 -github.com/muety/wakapi/models/heartbeats.go:34.18,36.3 1 0 +github.com/muety/wakapi/services/misc.go:44.188,56.2 1 0 +github.com/muety/wakapi/services/misc.go:58.36,60.95 2 0 +github.com/muety/wakapi/services/misc.go:64.2,65.111 2 0 +github.com/muety/wakapi/services/misc.go:69.2,69.128 1 0 +github.com/muety/wakapi/services/misc.go:77.2,77.33 1 0 +github.com/muety/wakapi/services/misc.go:82.2,82.33 1 0 +github.com/muety/wakapi/services/misc.go:87.2,87.170 1 0 +github.com/muety/wakapi/services/misc.go:60.95,62.3 1 0 +github.com/muety/wakapi/services/misc.go:65.111,67.3 1 0 +github.com/muety/wakapi/services/misc.go:69.128,71.125 2 0 +github.com/muety/wakapi/services/misc.go:71.125,73.4 1 0 +github.com/muety/wakapi/services/misc.go:77.33,78.71 1 0 +github.com/muety/wakapi/services/misc.go:78.71,80.4 1 0 +github.com/muety/wakapi/services/misc.go:82.33,83.80 1 0 +github.com/muety/wakapi/services/misc.go:83.80,85.4 1 0 +github.com/muety/wakapi/services/misc.go:87.170,88.83 1 0 +github.com/muety/wakapi/services/misc.go:88.83,90.4 1 0 +github.com/muety/wakapi/services/misc.go:94.42,96.36 2 0 +github.com/muety/wakapi/services/misc.go:99.2,102.16 3 0 +github.com/muety/wakapi/services/misc.go:107.2,111.26 4 0 +github.com/muety/wakapi/services/misc.go:123.2,123.30 1 0 +github.com/muety/wakapi/services/misc.go:96.36,98.3 1 0 +github.com/muety/wakapi/services/misc.go:102.16,105.3 2 0 +github.com/muety/wakapi/services/misc.go:111.26,113.46 2 0 +github.com/muety/wakapi/services/misc.go:113.46,116.4 2 0 +github.com/muety/wakapi/services/misc.go:116.18,119.4 2 0 +github.com/muety/wakapi/services/misc.go:123.30,124.58 1 0 +github.com/muety/wakapi/services/misc.go:124.58,128.19 1 0 +github.com/muety/wakapi/services/misc.go:132.4,135.19 1 0 +github.com/muety/wakapi/services/misc.go:128.19,130.5 1 0 +github.com/muety/wakapi/services/misc.go:135.19,137.5 1 0 +github.com/muety/wakapi/services/misc.go:138.9,140.4 1 0 +github.com/muety/wakapi/services/misc.go:144.51,147.45 2 0 +github.com/muety/wakapi/services/misc.go:147.45,148.41 1 0 +github.com/muety/wakapi/services/misc.go:152.3,155.17 3 0 +github.com/muety/wakapi/services/misc.go:160.3,160.33 1 0 +github.com/muety/wakapi/services/misc.go:148.41,151.4 2 0 +github.com/muety/wakapi/services/misc.go:155.17,158.4 2 0 +github.com/muety/wakapi/services/misc.go:160.33,161.31 1 0 +github.com/muety/wakapi/services/misc.go:165.4,169.19 2 0 +github.com/muety/wakapi/services/misc.go:161.31,162.13 1 0 +github.com/muety/wakapi/services/misc.go:169.19,171.5 1 0 +github.com/muety/wakapi/services/misc.go:173.17,175.3 1 0 +github.com/muety/wakapi/services/misc.go:186.54,187.82 1 0 +github.com/muety/wakapi/services/misc.go:191.2,195.16 4 0 +github.com/muety/wakapi/services/misc.go:200.2,201.104 2 0 +github.com/muety/wakapi/services/misc.go:210.2,210.26 1 0 +github.com/muety/wakapi/services/misc.go:187.82,189.3 1 0 +github.com/muety/wakapi/services/misc.go:195.16,198.3 2 0 +github.com/muety/wakapi/services/misc.go:201.104,202.122 1 0 +github.com/muety/wakapi/services/misc.go:202.122,204.4 1 0 +github.com/muety/wakapi/services/misc.go:205.8,208.3 2 0 +github.com/muety/wakapi/services/misc.go:210.26,211.49 1 0 +github.com/muety/wakapi/services/misc.go:215.3,216.65 2 0 +github.com/muety/wakapi/services/misc.go:230.3,230.137 1 0 +github.com/muety/wakapi/services/misc.go:234.3,235.89 2 0 +github.com/muety/wakapi/services/misc.go:211.49,213.4 1 0 +github.com/muety/wakapi/services/misc.go:216.65,218.130 1 0 +github.com/muety/wakapi/services/misc.go:218.130,220.5 1 0 +github.com/muety/wakapi/services/misc.go:220.10,220.25 1 0 +github.com/muety/wakapi/services/misc.go:220.25,223.5 2 0 +github.com/muety/wakapi/services/misc.go:230.137,231.12 1 0 +github.com/muety/wakapi/services/misc.go:235.89,237.4 1 0 +github.com/muety/wakapi/services/misc.go:241.73,243.16 2 0 +github.com/muety/wakapi/services/misc.go:247.2,247.27 1 0 +github.com/muety/wakapi/services/misc.go:243.16,246.3 2 0 +github.com/muety/wakapi/services/misc.go:250.99,252.33 2 0 +github.com/muety/wakapi/services/misc.go:252.33,256.86 3 0 +github.com/muety/wakapi/services/misc.go:261.3,264.18 1 0 +github.com/muety/wakapi/services/misc.go:256.86,259.4 2 0 +github.com/muety/wakapi/services/misc.go:264.18,266.4 1 0 +github.com/muety/wakapi/services/misc.go:270.53,273.2 2 0 +github.com/muety/wakapi/services/misc.go:275.53,278.2 2 0 +github.com/muety/wakapi/services/misc.go:280.64,283.2 2 0 diff --git a/helpers/summary.go b/helpers/summary.go index 842c6d2..8fe07aa 100644 --- a/helpers/summary.go +++ b/helpers/summary.go @@ -67,6 +67,9 @@ func ParseSummaryFilters(r *http.Request) *models.Filters { if q := r.URL.Query().Get("branch"); q != "" { filters.With(models.SummaryBranch, q) } + if q := r.URL.Query().Get("entity"); q != "" { + filters.With(models.SummaryBranch, q) + } return filters } diff --git a/models/compat/wakatime/v1/stats.go b/models/compat/wakatime/v1/stats.go index 5cdc449..67a5f86 100644 --- a/models/compat/wakatime/v1/stats.go +++ b/models/compat/wakatime/v1/stats.go @@ -77,6 +77,8 @@ func NewStatsFrom(summary *models.Summary, filters *models.Filters) *StatsViewMo branches[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryBranch)) } + // entities omitted intentionally + data.Editors = editors data.Languages = languages data.Machines = machines diff --git a/models/compat/wakatime/v1/summaries.go b/models/compat/wakatime/v1/summaries.go index cbbffa4..1cca54a 100644 --- a/models/compat/wakatime/v1/summaries.go +++ b/models/compat/wakatime/v1/summaries.go @@ -35,6 +35,7 @@ type SummariesData struct { OperatingSystems []*SummariesEntry `json:"operating_systems"` Projects []*SummariesEntry `json:"projects"` Branches []*SummariesEntry `json:"branches,omitempty"` + Entities []*SummariesEntry `json:"entities,omitempty"` GrandTotal *SummariesGrandTotal `json:"grand_total"` Range *SummariesRange `json:"range"` } @@ -132,8 +133,8 @@ func newDataFrom(s *models.Summary) *SummariesData { } var wg sync.WaitGroup - wg.Add(6) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.Projects { @@ -141,6 +142,7 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.Editors { @@ -148,6 +150,7 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.Languages { @@ -155,6 +158,7 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.OperatingSystems { @@ -162,6 +166,7 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.Machines { @@ -169,6 +174,7 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) go func(data *SummariesData) { defer wg.Done() for i, e := range s.Branches { @@ -176,9 +182,20 @@ func newDataFrom(s *models.Summary) *SummariesData { } }(data) + wg.Add(1) + go func(data *SummariesData) { + defer wg.Done() + for i, e := range s.Entities { + data.Entities[i] = convertEntry(e, s.TotalTimeBy(models.SummaryEntity)) + } + }(data) + if s.Branches == nil { data.Branches = nil } + if s.Entities == nil { + data.Entities = nil + } wg.Wait() return data diff --git a/models/duration.go b/models/duration.go index d83656c..7946938 100644 --- a/models/duration.go +++ b/models/duration.go @@ -5,6 +5,7 @@ import ( "github.com/emvi/logbuch" "github.com/mitchellh/hashstructure/v2" "time" + "unicode" ) type Duration struct { @@ -17,8 +18,24 @@ type Duration struct { OperatingSystem string `json:"operating_system"` Machine string `json:"machine"` Branch string `json:"branch"` + Entity string `json:"entity"` NumHeartbeats int `json:"-" hash:"ignore"` GroupHash string `json:"-" hash:"ignore"` + excludeEntity bool `json:"-" hash:"ignore"` +} + +func (d *Duration) HashInclude(field string, v interface{}) (bool, error) { + if field == "Entity" { + return !d.excludeEntity, nil + } + if field == "Time" || + field == "Duration" || + field == "NumHeartbeats" || + field == "GroupHash" || + unicode.IsLower(rune(field[0])) { + return false, nil + } + return true, nil } func NewDurationFromHeartbeat(h *Heartbeat) *Duration { @@ -32,11 +49,17 @@ func NewDurationFromHeartbeat(h *Heartbeat) *Duration { OperatingSystem: h.OperatingSystem, Machine: h.Machine, Branch: h.Branch, + Entity: h.Entity, NumHeartbeats: 1, } return d.Hashed() } +func (d *Duration) WithEntityIgnored() *Duration { + d.excludeEntity = true + return d +} + func (d *Duration) Hashed() *Duration { hash, err := hashstructure.Hash(d, hashstructure.FormatV2, nil) if err != nil { @@ -60,6 +83,8 @@ func (d *Duration) GetKey(t uint8) (key string) { key = d.Machine case SummaryBranch: key = d.Branch + case SummaryEntity: + key = d.Entity } if key == "" { diff --git a/models/filters.go b/models/filters.go index 55514ac..5eaff91 100644 --- a/models/filters.go +++ b/models/filters.go @@ -14,6 +14,7 @@ type Filters struct { Machine OrFilter Label OrFilter Branch OrFilter + Entity OrFilter } type OrFilter []string @@ -65,6 +66,8 @@ func (f *Filters) WithMultiple(entity uint8, keys []string) *Filters { f.Label = append(f.Label, keys...) case SummaryBranch: f.Branch = append(f.Branch, keys...) + case SummaryEntity: + f.Entity = append(f.Entity, keys...) } return f } @@ -84,6 +87,8 @@ func (f *Filters) One() (bool, uint8, OrFilter) { return true, SummaryLabel, f.Label } else if f.Branch != nil && f.Branch.Exists() { return true, SummaryBranch, f.Branch + } else if f.Entity != nil && f.Entity.Exists() { + return true, SummaryEntity, f.Entity } return false, 0, OrFilter{} } @@ -102,7 +107,7 @@ func (f *Filters) IsEmpty() bool { func (f *Filters) Count() int { var count int - for i := SummaryProject; i <= SummaryBranch; i++ { + for i := SummaryProject; i <= SummaryEntity; i++ { count += f.CountByEntity(i) } return count @@ -114,7 +119,7 @@ func (f *Filters) CountByEntity(entity uint8) int { func (f *Filters) EntityCount() int { var count int - for i := SummaryProject; i <= SummaryBranch; i++ { + for i := SummaryProject; i <= SummaryEntity; i++ { if c := f.CountByEntity(i); c > 0 { count++ } @@ -138,6 +143,8 @@ func (f *Filters) ResolveEntity(entityId uint8) *OrFilter { return &f.Label case SummaryBranch: return &f.Branch + case SummaryEntity: + return &f.Entity default: return &OrFilter{} } @@ -209,6 +216,7 @@ func (f *Filters) WithAliases(resolve AliasReverseResolver) *Filters { } f.Branch = updated } + // no aliases for entites / files return f } @@ -221,3 +229,7 @@ func (f *Filters) WithProjectLabels(resolve ProjectLabelReverseResolver) *Filter } return f } + +func (f *Filters) IsProjectDetails() bool { + return f != nil && f.Project != nil && f.Project.Exists() +} diff --git a/models/heartbeat.go b/models/heartbeat.go index f9043b2..f92f724 100644 --- a/models/heartbeat.go +++ b/models/heartbeat.go @@ -63,6 +63,8 @@ func (h *Heartbeat) GetKey(t uint8) (key string) { key = h.Machine case SummaryBranch: key = h.Branch + case SummaryEntity: + key = h.Entity } if key == "" { diff --git a/models/summary.go b/models/summary.go index ce38fd1..7978a49 100644 --- a/models/summary.go +++ b/models/summary.go @@ -16,6 +16,7 @@ const ( SummaryMachine uint8 = 4 SummaryLabel uint8 = 5 SummaryBranch uint8 = 6 + SummaryEntity uint8 = 7 ) const UnknownSummaryKey = "unknown" @@ -34,6 +35,7 @@ type Summary struct { Machines SummaryItems `json:"machines" gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` Labels SummaryItems `json:"labels" gorm:"-"` // labels are not persisted, but calculated at runtime, i.e. when summary is retrieved Branches SummaryItems `json:"branches" gorm:"-"` // branches are not persisted, but calculated at runtime in case a project filter is applied + Entities SummaryItems `json:"entities" gorm:"-"` // entities are not persisted, but calculated at runtime in case a project filter is applied NumHeartbeats int `json:"-"` } @@ -62,11 +64,11 @@ type SummaryParams struct { } func SummaryTypes() []uint8 { - return []uint8{SummaryProject, SummaryLanguage, SummaryEditor, SummaryOS, SummaryMachine, SummaryLabel, SummaryBranch} + return []uint8{SummaryProject, SummaryLanguage, SummaryEditor, SummaryOS, SummaryMachine, SummaryLabel, SummaryBranch, SummaryEntity} } func NativeSummaryTypes() []uint8 { - return []uint8{SummaryProject, SummaryLanguage, SummaryEditor, SummaryOS, SummaryMachine, SummaryBranch} + return []uint8{SummaryProject, SummaryLanguage, SummaryEditor, SummaryOS, SummaryMachine, SummaryBranch, SummaryEntity} } func PersistedSummaryTypes() []uint8 { @@ -81,6 +83,7 @@ func (s *Summary) Sorted() *Summary { sort.Sort(sort.Reverse(s.Editors)) sort.Sort(sort.Reverse(s.Labels)) sort.Sort(sort.Reverse(s.Branches)) + sort.Sort(sort.Reverse(s.Entities)) return s } @@ -97,6 +100,7 @@ func (s *Summary) MappedItems() map[uint8]*SummaryItems { SummaryMachine: &s.Machines, SummaryLabel: &s.Labels, SummaryBranch: &s.Branches, + SummaryEntity: &s.Entities, } } @@ -116,6 +120,8 @@ func (s *Summary) ItemsByType(summaryType uint8) *SummaryItems { return &s.Labels case SummaryBranch: return &s.Branches + case SummaryEntity: + return &s.Entities } return nil } @@ -325,6 +331,7 @@ func (s *Summary) WithResolvedAliases(resolve AliasResolver) *Summary { s.Machines = processAliases(s.Machines) s.Labels = processAliases(s.Labels) s.Branches = processAliases(s.Branches) + // no aliases for entities / files return s } diff --git a/routes/routes.go b/routes/routes.go index a060786..43a6b02 100644 --- a/routes/routes.go +++ b/routes/routes.go @@ -90,6 +90,9 @@ func typeName(t uint8) string { if t == models.SummaryBranch { return "branch" } + if t == models.SummaryEntity { + return "entity" + } return "unknown" } diff --git a/services/duration.go b/services/duration.go index d0451aa..9c819f8 100644 --- a/services/duration.go +++ b/services/duration.go @@ -51,6 +51,9 @@ func (srv *DurationService) Get(from, to time.Time, user *models.User, filters * } d1 := models.NewDurationFromHeartbeat(h) + if !filters.IsProjectDetails() { + d1 = d1.WithEntityIgnored() // only for efficiency + } if list, ok := mapping[d1.GroupHash]; !ok || len(list) < 1 { mapping[d1.GroupHash] = []*models.Duration{d1} diff --git a/services/duration_test.go b/services/duration_test.go index edddfea..0bf1106 100644 --- a/services/duration_test.go +++ b/services/duration_test.go @@ -26,6 +26,8 @@ const ( TestOsWin = "Windows" TestMachine1 = "muety-desktop" TestMachine2 = "muety-work" + TestEntity1 = "/home/bob/dev/wakapi.go" + TestEntity2 = "/home/bob/dev/SomethingElse.java" TestBranchMaster = "master" TestBranchDev = "dev" MinUnixTime1 = 1601510400000 * 1e6 diff --git a/services/heartbeat.go b/services/heartbeat.go index b9a3ed3..435dfbe 100644 --- a/services/heartbeat.go +++ b/services/heartbeat.go @@ -238,6 +238,7 @@ func (srv *HeartbeatService) updateEntityUserCacheByHeartbeat(hb *models.Heartbe go srv.updateEntityUserCache(models.SummaryOS, hb.OperatingSystem, hb.User) go srv.updateEntityUserCache(models.SummaryMachine, hb.Machine, hb.User) go srv.updateEntityUserCache(models.SummaryBranch, hb.Branch, hb.User) + go srv.updateEntityUserCache(models.SummaryEntity, hb.Entity, hb.User) } func (srv *HeartbeatService) notifyBatch(heartbeats []*models.Heartbeat) { diff --git a/services/summary.go b/services/summary.go index f571dc2..a1ebd80 100644 --- a/services/summary.go +++ b/services/summary.go @@ -84,8 +84,9 @@ func (srv *SummaryService) Aliased(from, to time.Time, user *models.User, f type summary.FillBy(models.SummaryProject, models.SummaryLabel) // first fill up labels from projects summary.FillMissing() // then, full up types which are entirely missing - if withBranches := filters != nil && filters.Project != nil && filters.Project.Exists(); !withBranches { + if withDetails := filters != nil && filters.IsProjectDetails(); !withDetails { summary.Branches = nil + summary.Entities = nil } srv.cache.SetDefault(cacheKey, summary) @@ -139,8 +140,9 @@ func (srv *SummaryService) Summarize(from, to time.Time, user *models.User, filt } types := models.PersistedSummaryTypes() - if filters != nil && filters.Project != nil && filters.Project.Exists() { + if filters != nil && filters.IsProjectDetails() { types = append(types, models.SummaryBranch) + types = append(types, models.SummaryEntity) } typedAggregations := make(chan models.SummaryItemContainer) @@ -156,6 +158,7 @@ func (srv *SummaryService) Summarize(from, to time.Time, user *models.User, filt var osItems []*models.SummaryItem var machineItems []*models.SummaryItem var branchItems []*models.SummaryItem + var entityItems []*models.SummaryItem for i := 0; i < len(types); i++ { item := <-typedAggregations @@ -172,6 +175,8 @@ func (srv *SummaryService) Summarize(from, to time.Time, user *models.User, filt machineItems = item.Items case models.SummaryBranch: branchItems = item.Items + case models.SummaryEntity: + entityItems = item.Items } } @@ -190,6 +195,7 @@ func (srv *SummaryService) Summarize(from, to time.Time, user *models.User, filt OperatingSystems: osItems, Machines: machineItems, Branches: branchItems, + Entities: entityItems, NumHeartbeats: durations.TotalNumHeartbeats(), } @@ -302,6 +308,7 @@ func (srv *SummaryService) mergeSummaries(summaries []*models.Summary) (*models. Machines: make([]*models.SummaryItem, 0), Labels: make([]*models.SummaryItem, 0), Branches: make([]*models.SummaryItem, 0), + Entities: make([]*models.SummaryItem, 0), } var processed = map[time.Time]bool{} @@ -332,6 +339,7 @@ func (srv *SummaryService) mergeSummaries(summaries []*models.Summary) (*models. finalSummary.Machines = srv.mergeSummaryItems(finalSummary.Machines, s.Machines) finalSummary.Labels = srv.mergeSummaryItems(finalSummary.Labels, s.Labels) finalSummary.Branches = srv.mergeSummaryItems(finalSummary.Branches, s.Branches) + finalSummary.Entities = srv.mergeSummaryItems(finalSummary.Entities, s.Entities) finalSummary.NumHeartbeats += s.NumHeartbeats processed[hash] = true diff --git a/services/summary_test.go b/services/summary_test.go index b9d591d..bec0161 100644 --- a/services/summary_test.go +++ b/services/summary_test.go @@ -43,6 +43,7 @@ func (suite *SummaryServiceTestSuite) SetupSuite() { OperatingSystem: TestOsLinux, Machine: TestMachine1, Branch: TestBranchMaster, + Entity: TestEntity1, Time: models.CustomTime(suite.TestStartTime), Duration: 150 * time.Second, NumHeartbeats: 2, @@ -55,6 +56,7 @@ func (suite *SummaryServiceTestSuite) SetupSuite() { OperatingSystem: TestOsLinux, Machine: TestMachine1, Branch: TestBranchMaster, + Entity: TestEntity1, Time: models.CustomTime(suite.TestStartTime.Add((30 + 130) * time.Second)), Duration: 20 * time.Second, NumHeartbeats: 1, @@ -67,6 +69,7 @@ func (suite *SummaryServiceTestSuite) SetupSuite() { OperatingSystem: TestOsLinux, Machine: TestMachine1, Branch: TestBranchDev, + Entity: TestEntity1, Time: models.CustomTime(suite.TestStartTime.Add(3 * time.Minute)), Duration: 15 * time.Second, NumHeartbeats: 3, @@ -154,6 +157,7 @@ func (suite *SummaryServiceTestSuite) TestSummaryService_Summarize() { assert.Equal(suite.T(), 185*time.Second, result.TotalTimeBy(models.SummaryLanguage)) assert.Equal(suite.T(), 185*time.Second, result.TotalTimeBy(models.SummaryEditor)) assert.Zero(suite.T(), result.TotalTimeBy(models.SummaryBranch)) // no filters -> no branches contained + assert.Zero(suite.T(), result.TotalTimeBy(models.SummaryEntity)) // no filters -> no entities contained assert.Zero(suite.T(), result.TotalTimeBy(models.SummaryLabel)) assert.Equal(suite.T(), 170*time.Second, result.TotalTimeByKey(models.SummaryEditor, TestEditorGoland)) assert.Equal(suite.T(), 15*time.Second, result.TotalTimeByKey(models.SummaryEditor, TestEditorVscode)) @@ -477,6 +481,7 @@ func (suite *SummaryServiceTestSuite) TestSummaryService_Filters() { result, _ := sut.Aliased(from, to, suite.TestUser, sut.Summarize, filters, false) assert.NotNil(suite.T(), result.Branches) // project filters were applied -> include branches + assert.NotNil(suite.T(), result.Entities) // project filters were applied -> include entities effectiveFilters := suite.DurationService.Calls[0].Arguments[3].(*models.Filters) assert.Contains(suite.T(), effectiveFilters.Project, TestProject1) // because actually requested diff --git a/static/assets/css/app.dist.css b/static/assets/css/app.dist.css index f959ecf..320df45 100644 --- a/static/assets/css/app.dist.css +++ b/static/assets/css/app.dist.css @@ -1 +1 @@ -/*! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.top-1{top:.25rem}.z-10{z-index:10}.row-span-2{grid-row:span 2/span 2}.float-right{float:right}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mb-10{margin-bottom:2.5rem}.mt-10{margin-top:2.5rem}.mb-14{margin-bottom:3.5rem}.-mt-4{margin-top:-1rem}.mt-8{margin-top:2rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.mt-4{margin-top:1rem}.mt-12{margin-top:3rem}.mb-8{margin-bottom:2rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mb-16{margin-bottom:4rem}.ml-4{margin-left:1rem}.-ml-1{margin-left:-.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-3{margin-left:.75rem}.mt-6{margin-top:1.5rem}.mb-2{margin-bottom:.5rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.-mb-1{margin-bottom:-.25rem}.ml-2{margin-left:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-12{width:3rem}.w-16{width:4rem}.w-1\/2{width:50%}.w-4{width:1rem}.\!w-auto{width:auto!important}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-40{width:10rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-4xl{max-width:56rem}.max-w-screen-xl{max-width:1280px}.max-w-screen-sm{max-width:640px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-sm{border-radius:.125rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.p-4{padding:1rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-8{padding-left:2rem;padding-right:2rem}.pt-10{padding-top:2.5rem}.pt-8{padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-4{padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-8xl{font-size:6rem;line-height:1}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-snug{line-height:1.375}.leading-none{line-height:1}.leading-6{line-height:1.5rem}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xxs{font-size:.65rem}.mt-14{margin-top:3.5rem}.text-7xl{font-size:4.5rem;line-height:1.1}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.h1-subcaption{font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-disabled{background-color:rgb(31 41 55/var(--tw-bg-opacity));color:rgb(75 85 99/var(--tw-text-opacity))}.btn-disabled,.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1}.btn-primary{background-color:rgb(4 120 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.btn-small{padding:.25rem .5rem}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.input-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.select-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem;padding:.25rem;text-align:right}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgb(156 163 175/var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(209 213 219/var(--tw-text-opacity))}.newsbox{border-radius:.375rem;border-width:2px;--tw-border-opacity:1;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));background-color:#242b3a}.newsbox,.newsbox-default{border-color:rgb(4 120 87/var(--tw-border-opacity))}.newsbox-default,.newsbox-warning{--tw-border-opacity:1}.newsbox-warning{border-color:rgb(202 138 4/var(--tw-border-opacity))}.newsbox-danger{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.leaderboard-default{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.leaderboard-self{margin-left:-10px;margin-right:-10px;padding-left:calc(1rem + 10px);padding-right:calc(1rem + 10px);--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.leaderboard-gold{border-color:gold}.leaderboard-silver{border-color:silver}.leaderboard-bronze{border-color:#cd7f32}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}.max-available{max-width:-moz-available;max-width:-webkit-fill-available;max-width:fill-available}.checked\:text-green-500:checked{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}}@media (min-width:768px){.md\:mb-0{margin-bottom:0}.md\:flex{display:flex}.md\:w-3\/4{width:75%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/2{width:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-nowrap{flex-wrap:nowrap}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-3\/4{width:75%}.lg\:w-1\/2{width:50%}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file +/*! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.right-0{right:0}.top-1{top:.25rem}.z-10{z-index:10}.col-span-2{grid-column:span 2/span 2}.row-span-2{grid-row:span 2/span 2}.float-right{float:right}.m-0{margin:0}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mb-10{margin-bottom:2.5rem}.mt-10{margin-top:2.5rem}.mb-14{margin-bottom:3.5rem}.-mt-4{margin-top:-1rem}.mt-8{margin-top:2rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.mt-4{margin-top:1rem}.mt-12{margin-top:3rem}.mb-8{margin-bottom:2rem}.mr-4{margin-right:1rem}.mr-8{margin-right:2rem}.mb-16{margin-bottom:4rem}.ml-4{margin-left:1rem}.-ml-1{margin-left:-.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-3{margin-left:.75rem}.mt-6{margin-top:1.5rem}.mb-2{margin-bottom:.5rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.-mb-1{margin-bottom:-.25rem}.ml-2{margin-left:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-4{height:1rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-12{width:3rem}.w-16{width:4rem}.w-1\/2{width:50%}.w-4{width:1rem}.\!w-auto{width:auto!important}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-40{width:10rem}.max-w-lg{max-width:32rem}.max-w-screen-lg{max-width:1024px}.max-w-4xl{max-width:56rem}.max-w-screen-xl{max-width:1280px}.max-w-screen-sm{max-width:640px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.truncate{overflow:hidden;white-space:nowrap}.text-ellipsis,.truncate{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-sm{border-radius:.125rem}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.p-4{padding:1rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-8{padding-left:2rem;padding-right:2rem}.pt-10{padding-top:2.5rem}.pt-8{padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-4{padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-8xl{font-size:6rem;line-height:1}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.leading-snug{line-height:1.375}.leading-none{line-height:1}.leading-6{line-height:1.5rem}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}body{font-family:Source Sans\ 3,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif}[v-cloak]{display:none}.bg-gray-850{background-color:#242b3a}.hover\:bg-gray-850:hover{--bg-opacity:1;background-color:#242b3a}.text-xxs{font-size:.65rem}.mt-14{margin-top:3.5rem}.text-7xl{font-size:4.5rem;line-height:1.1}.text-8xl{font-size:5rem;line-height:1.1}.imp\:cursor-not-allowed{cursor:not-allowed!important}.h1{margin:0;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.h1-subcaption{font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.btn-default{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-default:hover{--bg-opacity:1;background-color:#242b3a}.btn-disabled{background-color:rgb(31 41 55/var(--tw-bg-opacity));color:rgb(75 85 99/var(--tw-text-opacity))}.btn-disabled,.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1}.btn-primary{background-color:rgb(4 120 87/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.btn-small{padding:.25rem .5rem}.input-default{width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.input-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.select-default{cursor:pointer;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity));outline:2px solid transparent;outline-offset:2px;background-color:#242b3a}.select-default:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.menu-item{display:flex;cursor:pointer;align-items:center}.menu-item>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.menu-item{border-radius:.25rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.menu-item:hover{--bg-opacity:1;background-color:#242b3a}.submenu-item{border-radius:.25rem;padding:.25rem;text-align:right}.submenu-item:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.chip{margin-bottom:.25rem;display:inline-block;border-radius:.25rem;border-radius:9999px;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;background-color:#242b3a}.chip,.link{font-weight:600}.link{color:rgb(156 163 175/var(--tw-text-opacity))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(209 213 219/var(--tw-text-opacity))}.newsbox{border-radius:.375rem;border-width:2px;--tw-border-opacity:1;padding:.5rem 1rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity));background-color:#242b3a}.newsbox,.newsbox-default{border-color:rgb(4 120 87/var(--tw-border-opacity))}.newsbox-default,.newsbox-warning{--tw-border-opacity:1}.newsbox-warning{border-color:rgb(202 138 4/var(--tw-border-opacity))}.newsbox-danger{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.leaderboard-default{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.leaderboard-self{margin-left:-10px;margin-right:-10px;padding-left:calc(1rem + 10px);padding-right:calc(1rem + 10px);--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.leaderboard-gold{border-color:gold}.leaderboard-silver{border-color:silver}.leaderboard-bronze{border-color:#cd7f32}::-webkit-calendar-picker-indicator{filter:invert(1);cursor:pointer}.max-available{max-width:-moz-available;max-width:-webkit-fill-available;max-width:fill-available}.checked\:text-green-500:checked{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}}@media (min-width:768px){.md\:mb-0{margin-bottom:0}.md\:flex{display:flex}.md\:w-3\/4{width:75%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/2{width:50%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-nowrap{flex-wrap:nowrap}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}}@media (min-width:1024px){.lg\:inline-block{display:inline-block}.lg\:w-3\/4{width:75%}.lg\:w-1\/2{width:50%}.lg\:px-24{padding-left:6rem;padding-right:6rem}} \ No newline at end of file diff --git a/static/assets/css/app.dist.css.br b/static/assets/css/app.dist.css.br index febd26e5cc1c4c2740caf41ffbbd73de08592293..91fe9b8b511d2d7bb8c214280b3c1f84524f6348 100644 GIT binary patch literal 3494 zcmV;X4O#N>$Vvj>II!EeJ}90=LKcI?An1NgztgofhcH8tc-!7i9V3?aMe;xs++E-1 ztJC`Io`l1XA|c$T;ZJFED>~xa^vkMs>Algb?k*ou)Tz>bu~9bUKrn{=YV`l_S9;=j zc4Z3WdVG!8KMk?0BUK-|@50G^*uaE<@4xR4{n_OZt1{ZCt@JsSwd~}yEM)h`e*ecp z>*X`=hmG+SCJe3a8JoM)liB7H_20RVu^a@$Xz>5!-K(#agA3NwD>c>V;PbsNo4bOY zQ>MzhTdWTEME8KKXFlD0`5vyzn6qwQ>D;}$&u(+``vK-7+_r_!<|7q0m@~IyRELCB zf_K2SEdrao6>_RS3qCwC+YS0AmInwr`kwOsHA}{p5mD&u#gYl)Il{V>9>?s~Z+8Da z!QYkR>@V)zWcl{05Lf%{8@+VpDl_kKdG9VlkKzyuy$`c3U#t$Y$kiaZ3Y>$_eE6T~ znHM~c6jIV=tO!npl$?5QyZ6y_6W;5Gp!K1@2xU)O@Fjcp7xLTE48Na1V#TcoxS4dM z(EGHSFsGz|bcpv@^z?1G7%qpadcAeA(^5GWd!)ZL=i8PsZn-YDoqS_(*2v+>{Rg6l zI?+A~C0o0tfUQ1g+jut9m*?+(k8udE!|9#V(n$N!;@;><(9ud9#Oy2t!}NyBk>z+N zmz_i|wI#28s=nE2e?O|>%HNlb($XQv;%MS7OA$0}+azH!{#mb_SBs8>WvS1&o-3@-jks)-43TOEa>uQ>mA0 z(ne51mQXf_UIe;g{#a@nYDOw1^C|n;Q}mJc8G_`Y(I}b+k*V8B=kTbrln2G}(G&_T z#T?)YS?5V_I+cwBS*3(yHS}#M;^d$UXjweqvIT}~1tS-C!uG+w+P~y7P^y^7J>O#} zn+ipWRYADIE53q(#6pD5{R}}ntJgTl)lCv{Nc(80XJUu;QaYT8<;XFH#7gAIK5g)! znz+~7J2=}^A|CXv;2|grqdn2LMXvY(R#;VE$w82{1#@)_^Ul-u^dL7Qti#yIvEGMV z;apfhXm1s{I+@y5VEs#Aba_Qq?Jba|*iZX3gvuDakL{joo)65E!;!MaV(`c@j(?KC zCbK@DNoQT&u}zo@g^D@r6YKB@IoTQvng?iI$`&Y^Zp>dYm~u?FcO)|behjhO;;MSU z!a!96Q#UjyZ`{to@#Z!)mLHrQf|d^`2?KV8*l%IYA-nJ8V;x-NNIg-J)YZ>TqHqSoy^GqJGL6no&GyBw@ z$;-M7VDR5wx7)wTZm;|bq?%ace&VlqO2Jw8XlHZi;1vdI`Cw7BP|N)c3t)`Ghcl8l zSDpO@q}M7gLbM@wp&;#}g1n14;SZ1n+UpkD{kQ;g_84vp^~@)pD;Dd!8|)}3Z*b;; z@1T7d^BMLsn^kavrXj5D#)bGBR?yvf1XNC_1$FukJs|T@Ic?{L2E0?~q!-e6OTaWC zmC!YSny_4P#-#}P6kYF|fjT4-G#PQUdb$RR8#T265r_th)iL5_;AhAcfCR0up{J?H zNRu(#iIyF6w_e~8;lUa z(N+evilQ7++MXh)9Tr4_mB9CgLf_CDB%0kGzp?+{-&v0bfeS#RSqP9-td#o|G=v}w z<^z!++Yu;eME(KH2;jLXs2l|8y-Nk42@NWuKbBk_;|E0#%_^a32*$pz-r3QZs=Wa1 zGUf?WBMf7-AXiKqyhxdgr5c56f1DokKDxrM`iN9SWQ^DY;(bj7FvGb_XxW&0E+8b=vTYe)X^ z=y3fXG}P7kD{?C#(PgSJ#r7-{VCk)JR^)CSK>wYa`KTN&5B{qn4~fAKTH}4?0iWaP zHVgn0J+E4!(J)(p}k2Loz7I?E|odTioF z^ng*_v>l7q1z4pN4BfUR1Dz9CdHw#r@dmj4*TVV~Hb5=t12E?b_U>%iSK4p;arqrahH8SX!Ig`~N^I`98qAzFoXwmL)&B-2fF7o? zCuyAcX4nL!2}l#2XcMXadq{|74==k^Mz9wGH#z;Nv)8oNj1SDoWU_c+DGW1MUZ znvz1zwJv{=D<$`l2bp&;A;L(@oUKlcMpL6q;&`#OPMs8O%9p`u69#ZY)|!Xo6n!(f zXvmKm3&`97V}%exV6IF72LRnVQW4ov7Dm`OeU!({5aT`+Xt1~+CD}rt+Am2{+L0Eh zGXz>-(k|A0=HMaZ@0f^=&r4wD_%(9+1Tu3~B*+9MD64jbpvF~H`|Y(S0p&M#h%V8t z>*$(d4|Ew`mT3E?A2}Ua3g~Jri&5uK&;*$Kj6vK}+v_LXKow%ra&TQTArEE$_!~2N z{lkVmNT~wHGJl5A#JrJ_fBNiYrp2ux&l%CfJ^STk z#HZB#TJtlG`Ff&zN|A-8BRZBj!i?9|LFzwtL$}Zpkk?I(9ur#Sk&8T&yCd2fSF^BV zTKaLjCdUVm1(gt%e4K*D{xM{|1=4gmOWXo4p>SSe3MvYIY1+NxxF5_qot|2Bxw2ja z-+2)evVb1u#RZj(=n=>UOvQJ%Z5U74F50eTx|@t&$!tqy&)XHzkvWx$9T*h;IB92Z zPi4AOA3yzRl>#H!QoP;hk~)ksA?#b_;WvIt7?6scIG)O8lI%ewq%#RwhmaQ))NTZn zEzYcRD+hBNlE`8PvDUZtM(H&g)-K*KjQcEtLXm&qU^ymKwHsgZBEB!XpGt6XdW;ewJkwZ^i5E-ry1@bfDfkl+1K`;V$gA=TW|r^gN;Rp4Fn0*}z!hjRJ29w9AT&!;Ld zeZ3k=i|zHS5I^=;pY(p%O=~>tdzF^CJHd}F8r0g`RZQt*oQ1cm9TruN9wT)-HXy9jAK*;hu3~5cZ}*PL zK(=7_ETjGY4gyE#xV9T5*QXOs;i4ElrabqQKjTFQ)(CTBXIg{tUAKn`JsAJQoeDL|M`P>TX#Kwo! zi1E4ptT=Fb)OGE!zp^d%pS#hDH)SdcJIWC_^n{EI1KUEX<81WKOc*8l(j literal 3476 zcmV;F4Qul8m`RGLBvl5`agdu8hE@V*AzaZGkMydTP%BiHb}bC>}^{JcP7M%GTcdU#ooQcy{Fl$mRJMu{}9r z8AmD}>sQr(Y1)H1qS*t2`t^ILdzX(`h0&h6NPjOfmYtl0h0Oj~`p*?@fBDWGB!p9l z5bUuNR=ZcjVw_L<@0>~*Uarq@)`tIvpTGaBaq!j6d8Vck9YVfycfKR#oeHVoR@*2w z)7`7y6F<3omXm!!NuteV(21^ouMq{Apq#hfE8SX~5b0b&!7@J@o_6BZZWt z9W8;Kn6eK&x49p3Gfgi>{SdTSj~Aihsd|}eFa9F+vNWTo2as5{Z4s_!9b4&rT2_{Y ztw!3XA1>)|^=XC|R9B^L3f5VP|d7?wAz*>Qd)m)%6p z*^^gu=)0W^_x(OxeC=f&sjLZd`TgzJF-kSCZikJjAJ~F%lhs7*)?36|PeC29l9GrjH;+jI{^#WsLf)Pl$e#XY9^SwO($M zHi8;5MBN+~2i5VxB%W5^ zJYXtW6G(49wL1s0N~ucKsP9X$$_}!EwyOtRX~J+VQzK&fUTw>)L> zy9y^srC&h+K+FS*i+lRE*($hL21rvX7ATpna*-++bDKFjvYG%thCGkvkxdL8 zOgnmZC4SPNvT?JD%8T2SSblJJ2s%D2TMRf9;;=<09I}aTGUWpbUf|%sBrfZA)|Ewt>I*3XVU2{lv zO+l7*0E7Sby5Igyc7Nq(AXU&h_tXB2rv#i$5AL>-pbZAAbty^onvwY#R=^mCyBEe2 zhwcN=xm7WQy{a5B?Q{Ecp0l$s8>`j~T>V&C%A>$WAl%Z z=yKZvT__z7-32 zVk43F!si3$0x*QG5^FwD_3I&{i?~9ENz@E1#;%t`_i9bFOMr0&TrfAnG$BjAY;T1Z zhrPtrIIP~=c`f_s0>8?0O%ag^)?-%ei=ov-U^TPkM_e6Ab&hm4%_*1SZf;i@WQ0<% z6(s1FUG`AtOa0BmM~Eaa-J5@uP3_0DQ&^I&ASG7;^N)us2t>b{-(@;v7oVYB*_vnA zBT5%{Nk9PJMa;1L)ZNSg0h_QAv~8(PU5v7MBMZ7c8BH2jx+Xnt*@G^)rv6;pLS(v3 zZK2pxr2;fF%-PUp(Nlo=ckaMT(3u>ozZdd7(Ty$!Q#ab-B5#WWz{J3d{$;dGID22S zN$s~#{Xo#+Hgc_O{^VDynrYNT%r#fjD zslUDeCFcLZJDPU~gsNYt{tJlL0pi>@&R=z#*EpGlo8XI)dO=&ZQZxO=Uv%!hOT`tk zZ(x=PBQ5DRqsF7KQ6@pVr1d);^<=DD3#UyOzzu0z9_AU2c6zJGk18uj(*a|J5JF(C zOaO-guU%QjyL#ykc1|DV30p{U4~l8sxgAxt?O*gvlA-M(dR3hik|7PNRQK3}yCr|a znB)AU3#gM<$?H?7y`%JPq2l6gT^TCui^3uSD}k7Qo^lQO?*SRKlx2hUhlN-0WL3KSVk}{!IT5I zcA-_5?3I9|iQZJHiiU?AEni5kHJwPyMlm*JZD|LIKv$zV>M|(iEc{(Ay=xQZpci3D zv6N{ATw*S!Rf{!ghUPSdOEOxLPKym1uzcRadc=4qw+Y=7n2ulMil(@tx8FW*fug<)>9cTF5~0dY{;; z{YVvS-)fJ)$qUPX)a=E{44p~RCoB7$NqjnjB&bF0gGQ-#$B|pv>r7!w77K{gLF6US zOEhdNsz+)KpzbKnmy2>TUapmHv zgtM&d+k}1|icwaUEPDI1J80<74mB$dfzf4hQHiE8o}{-u+Zc}Z$)`%wzbUk{P9&p? zg*h1vQham@$q%dIyr9fz0*8mdF*9b|!nN$h1~^zF8tNcEzNfwyoO&_OZ@XYD$2~ec zLr@N;^W^%tKP~6M`?ZB=Z9H=8Idq*0a|#Oc(UiSkEk3tct=3vA=<*I6fuCQ=fc);S zL)x#q6rAp!L06YUJLji6ssqzEpt`o$e6mCc7W*6VYbXZQxKh-_u z$VofZo;yE@lp&<5LfZD3JT-0~u&mS{pr&BgF*bp>d&g|Tw&K7mrTrxt3Vkzf!WKDl zm_frjZVPqNdE>mXoO-|Nsy=IJ;zmcL#x1o)ix>{ivQe##IsLO1^AtVps9~6r>793_ zY4UUucsuc}?LW9)Y3p5of!Q7DsAXrG8eHXOjc4+AO261*yY5|QDj`9cPMT2M!kxdM>K^!ZsT5cfpNY4qwQJ4K zRrv3C;s$dz1rA`NyEFYxzr@nWwCC243oP;{uZF~ajZcMrA z-kM=_~Tjyx67)Fe0SfUG5Cx@ShA7OhdpYO}!>)kJ7%?N%uYo1*3Zh{E;-N|4% zB8kkBxQO*fD3gaCeydag?YZ~K1Q0+^c9KOm`n>Pv{A5t|)Fz0VW;lT_XFxB=CCUZs CFTc(J diff --git a/static/assets/js/summary.js b/static/assets/js/summary.js index 0836a21..1368282 100644 --- a/static/assets/js/summary.js +++ b/static/assets/js/summary.js @@ -13,6 +13,7 @@ const languagesCanvas = document.getElementById('chart-language') const machinesCanvas = document.getElementById('chart-machine') const labelsCanvas = document.getElementById('chart-label') const branchesCanvas = document.getElementById('chart-branches') +const entitiesCanvas = document.getElementById('chart-entities') const projectContainer = document.getElementById('project-container') const osContainer = document.getElementById('os-container') @@ -21,10 +22,11 @@ const languageContainer = document.getElementById('language-container') const machineContainer = document.getElementById('machine-container') const labelContainer = document.getElementById('label-container') const branchContainer = document.getElementById('branch-container') +const entityContainer = document.getElementById('entity-container') -const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer, branchContainer] -const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas, branchesCanvas] -const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels, wakapiData.branches] +const containers = [projectContainer, osContainer, editorContainer, languageContainer, machineContainer, labelContainer, branchContainer, entityContainer] +const canvases = [projectsCanvas, osCanvas, editorsCanvas, languagesCanvas, machinesCanvas, labelsCanvas, branchesCanvas, entitiesCanvas] +const data = [wakapiData.projects, wakapiData.operatingSystems, wakapiData.editors, wakapiData.languages, wakapiData.machines, wakapiData.labels, wakapiData.branches, wakapiData.entities] let topNPickers = [...document.getElementsByClassName('top-picker')] topNPickers.sort(((a, b) => parseInt(a.attributes['data-entity'].value) - parseInt(b.attributes['data-entity'].value))) @@ -378,6 +380,62 @@ function draw(subselection) { }) : null + let entityChart = entitiesCanvas && !entitiesCanvas.classList.contains('hidden') && shouldUpdate(7) + ? new Chart(entitiesCanvas.getContext('2d'), { + //type: 'horizontalBar', + type: "bar", + data: { + datasets: [{ + data: wakapiData.entities + .slice(0, Math.min(showTopN[7], wakapiData.entities.length)) + .map(p => parseInt(p.total)), + backgroundColor: wakapiData.entities.map((p, i) => { + const c = hexToRgb(vibrantColors ? getRandomColor(p.key) : getColor(p.key, i % baseColors.length)) + return `rgba(${c.r}, ${c.g}, ${c.b}, 1)` + }), + hoverBackgroundColor: wakapiData.entities.map((p, i) => { + const c = hexToRgb(vibrantColors ? getRandomColor(p.key) : getColor(p.key, i % baseColors.length)) + return `rgba(${c.r}, ${c.g}, ${c.b}, 0.8)` + }), + }], + labels: wakapiData.entities + .slice(0, Math.min(showTopN[7], wakapiData.entities.length)) + .map(p => extractFile(p.key)) + }, + options: { + indexAxis: 'y', + scales: { + xAxes: { + title: { + display: true, + text: 'Duration (hh:mm:ss)', + }, + ticks: { + callback: (label) => label.toString().toHHMMSS(), + } + } + }, + plugins: { + legend: { + display: false, + }, + tooltip: getTooltipOptions('entities'), + }, + maintainAspectRatio: false, + onClick: (event, data) => { + const idx = data[0].index + const name = wakapiData.entities[idx].key + const url = new URL(window.location.href) + url.searchParams.set('project', name) + window.location.href = url.href + }, + onHover: (event, elem) => { + event.native.target.style.cursor = elem[0] ? 'pointer' : 'default' + } + } + }) + : null + charts[0] = projectChart ? projectChart : charts[0] charts[1] = osChart ? osChart : charts[1] charts[2] = editorChart ? editorChart : charts[2] @@ -385,6 +443,7 @@ function draw(subselection) { charts[4] = machineChart ? machineChart : charts[4] charts[5] = labelChart ? labelChart : charts[5] charts[6] = branchChart ? branchChart : charts[6] + charts[7] = entityChart ? entityChart : charts[7] } function parseTopN() { @@ -447,6 +506,11 @@ function swapCharts(showEntity, hideEntity) { document.getElementById(`${hideEntity}-container`).parentElement.classList.add('hidden') } +function extractFile(filePath) { + const delimiter = filePath.includes('\\') ? '\\' : '/' // windows style path? + return filePath.split(delimiter).at(-1) +} + window.addEventListener('load', function () { topNPickers.forEach(e => e.addEventListener('change', () => { parseTopN() diff --git a/views/summary.tpl.html b/views/summary.tpl.html index 8b3a991..3d10cde 100644 --- a/views/summary.tpl.html +++ b/views/summary.tpl.html @@ -169,7 +169,7 @@ -
+ + +
{{ else }} @@ -238,8 +251,10 @@ wakapiData.labels = {{ .Labels | json }} {{ if .IsProjectDetails }} wakapiData.branches = {{ .Branches | json }} + wakapiData.entities = {{ .Entities | json }} {{ else }} wakapiData.branches = [] + wakapiData.entities = [] {{ end }}