From a59dbc589f71471e91c2af3169141e5c6989c3f1 Mon Sep 17 00:00:00 2001
From: Sydney Anne Erickson <sydney@elixxir.io>
Date: Fri, 23 Sep 2022 14:57:43 -0700
Subject: [PATCH] Desktop notifications

---
 client/channels.go |   7 +++++++
 go.mod             |   7 ++++++-
 go.sum             |  13 +++++++++++++
 icon.png           | Bin 0 -> 4112 bytes
 4 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 icon.png

diff --git a/client/channels.go b/client/channels.go
index f40cf6d..57d5157 100644
--- a/client/channels.go
+++ b/client/channels.go
@@ -18,6 +18,7 @@ import (
 	"gitlab.com/elixxir/crypto/channel"
 	"gitlab.com/elixxir/crypto/fastRNG"
 	"gitlab.com/xx_network/primitives/id"
+	"github.com/gen2brain/beeep"
 	"strconv"
 	"strings"
 	"time"
@@ -170,6 +171,12 @@ func (m *Manager) ReceiveMessage(channelID *id.ID, messageID channel.MessageID,
 	message := usernameField + " " + timestampField + "\n" + messageField
 
 	c.ReceivedMsgChan <- message
+
+	err := beeep.Notify(senderUsername, strings.TrimSpace(text), "icon.png")
+	if err != nil {
+		jww.FATAL.Printf("Could not make desktop notification occur: %s", err)
+		return
+	}
 }
 
 func (m *Manager) ReceiveReply(channelID *id.ID, messageID channel.MessageID, reactionTo channel.MessageID, senderUsername, text string, timestamp time.Time, lease time.Duration, round rounds.Round, status channels.SentStatus) {
diff --git a/go.mod b/go.mod
index 9b4ade0..a2f5500 100644
--- a/go.mod
+++ b/go.mod
@@ -27,6 +27,9 @@ require (
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/gdamore/encoding v1.0.0 // indirect
 	github.com/gdamore/tcell/v2 v2.4.0 // indirect
+	github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 // indirect
+	github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 // indirect
+	github.com/godbus/dbus/v5 v5.1.0 // indirect
 	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
@@ -41,6 +44,7 @@ require (
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
+	github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect
 	github.com/pelletier/go-toml v1.9.5 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.2 // indirect
 	github.com/pkg/profile v1.6.0 // indirect
@@ -51,6 +55,7 @@ require (
 	github.com/spf13/afero v1.9.2 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
 	github.com/subosito/gotenv v1.4.0 // indirect
+	github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect
 	github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect
 	github.com/ttacon/libphonenumber v1.2.1 // indirect
 	github.com/tyler-smith/go-bip39 v1.1.0 // indirect
@@ -69,7 +74,7 @@ require (
 	golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect
 	golang.org/x/mobile v0.0.0-20210716004757-34ab1303b554 // indirect
 	golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c // indirect
-	golang.org/x/sys v0.0.0-20220731174439-a90be440212d // indirect
+	golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
 	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 	golang.org/x/text v0.3.7 // indirect
 	google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect
diff --git a/go.sum b/go.sum
index 720bf9c..6b5b6db 100644
--- a/go.sum
+++ b/go.sum
@@ -173,6 +173,8 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk
 github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
 github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM=
 github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU=
+github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 h1:jFEK/SA/7E8lg9T33+y8D4Z0I782+bbiEjmyyklRzRQ=
+github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6/go.mod h1:/WeFVhhxMOGypVKS0w8DUJxUBbHypnWkUVnW7p5c9Pw=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
@@ -200,6 +202,8 @@ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1
 github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE=
+github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4/go.mod h1:kW3HQ4UdaAyrUCSSDR4xUzBKW6O2iA4uHhk7AtyYp10=
 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
 github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
@@ -207,6 +211,8 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm
 github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
 github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
+github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -480,6 +486,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
+github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
 github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
 github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
@@ -614,6 +622,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
 github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
 github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs=
 github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo=
+github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af h1:6yITBqGTE2lEeTPG04SN9W+iWHCRyHqlVYILiSXziwk=
+github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af/go.mod h1:4F09kP5F+am0jAwlQLddpoMDM+iewkxxt6nxUQ5nq5o=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0=
 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w=
@@ -978,6 +988,7 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -986,6 +997,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80=
 golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4864c0c21707c1913bf508e970553ba8df90fbee
GIT binary patch
literal 4112
zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Bd2>3~M9S&0}C-;4JWnEM{Qf76M_$OLy!3
zFfi~R@^o<wshIP2u5XaEr*PZp_%m|nx0#<%cMx7^`^hQ$v^s-df<@y|PPX|B7L8B0
ziXDg(bW@kubMe{>mU$Zcwzso+uhlC3o09fa_@bdOU(VkP`RQT%LTBdJ{r#0H;u?AW
z|Cj2(DQ8zWh%99l?O3#B0aM@<u@Hr>OHEuZfl&dC8eZJ>Q~o^-+5GeEEc?0xSO5G!
z{xqXt{*Sks)&XaqiJ!jsz~o4I_@2Osv(NU$AK>RW#&w$OS)HYnjl~~ZRimpp|E@_G
zn;w(Vb8j|Rj9dGIV-xf59el6%N1c79&GGEzC6CE+9f#}wvn$5OD0kGe6ehN+-xO)8
z?D-(YwIc1a-M-g<f1P)76^LDOJn_6laZ1n6te&5dXP;fpGP9rd!?BpT@Q&G0L7`rS
zLZuUGuTB&#%#0}iaAD^G=9jEejuk=f)81drsaqeITK?f~>^fn050j=Py$Y{4gl^P!
z5sh7Kk#Ks)u^Ilk_A3Ql_{_@x<#->znq%i^>UPt?bas5Mu)9ZyLdlJ64%Lp6s+_+c
zG_0(i@+o<x!;8e$PvxewqZjgc|2I10-T(N)!{g11m=<>X?#&BOdN=i#>VlqX`CAMn
zuB=Y;`M<Gg8oup%TexEZ(?iF(Wp}3u`34-@+Z%iAZW~vNczcK1qQ8?v<l4El1nO?g
zes*b^wd%B%hlMdh725tQ9DXF7p1UY$-4(F>JsE|kuZsVP?6lz%4^jAY^YA^rX|E^E
z0n1s&6bXCg^&e&x?a<Miczkku)A5H*TrP6%S6rQrJ}z)%RTAE$wD1YY6%$Vj+OQf0
ze71-QXgu*ucxtP)YyV-^+~3Oby9>6fzuB}T=4@Q3%>K+?h17zHhkcg318FjRmUnim
z(uaLcN#aK?PpRH+Q6ZxzGCxVzy}5V!w-4Ui%%}dHX{UFo^tafziLYGjm)`hb5fQTL
zmd3u-o%%OqERL9_RS3_~cW?GwQ@>|zc&L|CscB$i$&y)Tj|*_AZ`>2#$M$;Ht@1?=
z3sc-#op_#n4^t6l%bfA{=vDrk?WdQ9hk9+%7c+cwHqCqG>5B)JCA{DGVfiV$78#ax
za_!twj!I42Y=sY{p7UENmfG*E%)$KTY`fM?&Wo2mo{J7tsgTiI;UL5yetTJ5e8=9c
z&9S#QJwIB+ToBPV^w_<uMJvv1)7KiYH&=81dF)Br9@WR@=o8qh(CK*YzVeoi?dH4k
zMHbrJP7%Gt6WW-<Agce{dym?uX@0ib7Y5i)NIiZ1@PxyiAqtX_eQd`g4m>}m-Id_`
zwfV;NoekTCO?ItxFlwIN+vHKR_=L%$>W@$PCMy46P!i=}?C3aBuIu!4%cHHn;mN+w
zgBk@IJ3Qw2%j>x}voA5V{Mlq;Dy1dh<e>6g^8Uqr&js(!>Ha$TX@)?pN()zu#Eq_b
zn|GOh`*Bm|^#su)6J6$L3Cx<4<`ZwX!|cep32AFLNcfBG3{hY?*kqh;F4PsMvICSH
zS~PYD7Oi!!IWp5pA<%|TyhLBD@XeOnKI|LrDYoA7da^h2+GC01T95Obl{spQmPXnA
zp4lXSpEb}Hl-`aUe0EGmTDta{q9KdW-Nyxr9=GRbncbhV{N|mFVgGX<@9($#<azAI
zrT4y%w!as4bo#G1d1~Qy!4%$0N)vK*K0LLHHMGk0U{pR8H2>c3(_bC0J(SBxI=y3g
z$dN=2lRoPMUrlD8`!>PVDlxxprQ1yLm{b9e`^r{2R`U#Eo@zYKYknkk<Q~g>!}9ln
zkNavrB~E;>a@Mby-TwCR%e$_#ZK{yb3y5FxUU64V=ti4~R$o5|o>*sIZq|R8)h~3-
zvIx0VH*1tK-F7Ii{BHMiNy+Xz4=$c7Y-!4#SuUS>!@fi7qO?&kgKN){%xT9JweHWh
z*?s(B6N~&2x2e+6Pc>aMR%+L-%be!VqWG|Ihr&q>8yy#omBppYIUWgePMY(Wqt!)y
zujZ5|!Bd4COq+6)Ut0DBc-+e>>InMidg`PX=Zhe}-m}Ye4NsmgY+2N@H)7lCAIwuT
z*T)v#P4wp2B-hTpG$-uN;Vsvr6_-AoGIfpKYs*U@!MD%0W?tXhka0+{Yr=Pn7>&Y?
zbXngu%JpYnir<j1blAK4m+5q)cV=F8{GS*vwzw|so@jBSLPl>&UBW4=Pus5q>vjBS
zY_vEw$A(YbOS~g<NlZvo=Dvo@XA0lF?k!#6Fz;te;*=DJl;86rWtQf0)HZTGQFXtX
zQ|Es$LdB$b&M%MGD^@tvJ!g15DM!gsMcHt|eVgT#u8Wu={mmvi$hfbJFXukGEK+O2
zSryUFTG`q61V!38EkE~5YfUJd)X~y-d?8byS&_hJ9Sh<9#|}68GSWj7@@hH)nVvl<
ztSE~TY34dIckzTiYr+1*?Mkddt2QUiU2Il-HSY1G5byGLW;-~Y<l6Pm$=+W&A?FX{
zrA|ASE9o27X9$1Oam&A+E9!E3$GSPmE-{8Fv-z7`?@L^t5V$IF=VsmPn*Tz@g)`Ri
zv-eGqT+qBFxhMC9j74-G+c{~O!bu<H)#k75U9^Z}Cui`EiG7AACRK%ejOyp;P*}D_
z!)aYts(53C(^rGV`lW}{<ZHH{m@o9-M(<5xoTuP~`GFl<Pia2vcr-i9_k!6}>$$5d
zWfF{!2(P@(deF2h{1oFsdjoB+HOU)gc#pjQl$tD}^mSABkNzW<rr6F8;dWB0thzXv
zdDU_Q=R@Z_<NMfx*ZA)ftgtq9pO>z7qg3L~0ri)kqayN5H~J^KOg3i9Uw%xz>xRf{
zt6$b$ho?Sa4qfv-DY5X+JdabQFK&j$c~xzi{+lJu=SF_mk${<sf)g#K+Xpg69jUcG
zDWEMRxVy4&bD+S<h3UH#Gbhget5eT&B&S?mMQHx9%$4bU$Cin8&M<zHQzH=GA>;Jx
z@?r6b8~#2qRY{-szG(+@aIeQC;rY#>mlkzouJOF_{e@`dA^|1KlRw1fT-NzvweZp*
z)}9cqE4s1kE!KM<k=uE6$NHGGNBf>9*&exbFyAA4*%6y*$|V=mZ%VrUn)xNUhvD?s
zTkA@EH@~szD@?v?thh}!UA{T==Gkr$U4c6WJ3l4N*OiD>I`Q*$rA)yq&1n-}S5C}v
zQ|VZpw07~Vv&(0eF<R$yu21{iE;}oFOJAtla<^6K|8rC32h6XD_PRYk#(zyj;E`qi
z^0Ik)r$U$1>O7jS#C7$`YK}&QrxxcwT(aX14sTo|)%`I{U~f@Pp8T4Ce`d%2xE$@i
z^6r6Bkk03tfS2j7uE+MV<;T>W+qm*DQ?vVC9t-P#Qo?mRH#j{!6t~^-{C;s|fyw8$
z*7fsFjb54dd0YIkr0W|`3Ea1R9NbghvEiHXo#i=k;j<imWqhA0^xVu+*Z)_3tb5qu
z_8p#oZYCGC*YB?TVdLcBzr$|Iw!kZMN@mXr+5A(fF!lIxgFW%e6BLY(zvT@+`z-y$
zch!J;|JgzA%deD4tD3F%iw*m7^X4xrr$5gMOBmVDESZzy<J8IIdAH`KdX(wqrpXer
zJc>K4+vRoTf@e8QXjeC1X7er8wyHuVR)X8=ti;qLmZr7W&1Y&^`l&_i4ZVN#@e3xg
z-_D{Z%en+OzWsYL=lH`t0sf^YJX{~ORWu&>eIj<J;?7<t*G;k;nGQyzb{>yxUZj-i
zzQjQ)dFslJ=91*CZ5|q>t5q5;8WW;fx6XY0grC!NSLiDLOAb>U0{oWNur=9y@GP45
zT)kDI@xbE;M#XbXJ|z4TGI+DxSczrQ&Bp?qr_S!Z6kGm{N%28p2kYxeio0HjOZrA|
zw{#qT$n?5y>y0Nj^bKcixbv>h=pCzae{=0chW06K9XBQiU5YFdY*}zTP^32_$i;HT
zRELf#8NY(JIy?BzblV*JpmZ@)T)L6tgT;|v&CSb2Hg^1<v9UQdB!a`G<G5m3-~7At
z_RH{A8A!OkeW|1`;3(HVLnK@HTEdYxC59`-GaETRThv(Z+q`sQ)n4OcH4on`oFK}f
z+<%z;8*^&Sfuw&WmQs6Me;v)+Zm@G-1dlDBe4RqLzSy6-<2%|m2Blx`n|514bwb;5
z#Y*#a#mkQhIWR60^WJd3TBC77;iZZ5<3%@w{<XN^qAB<w@#B};2aGq{BYy3uad%>A
zbzxC7nrWu`KIq%@r+kZi-d|0<B~{ejsgO}#A9^F~t7j(nH@ymz|8>&0@=r-QJ}8{B
zEA(#VuPKxIb5ieRnavle>uY|*<M>oGl7*@Naq+|bJ<fiIb-YzGyIN&FYF&2l?TTpM
zxt_ahmrAz+Z@=@=k7wc<Bwu>DOyXD)c<gGK&Hmy9_BX-R!KeOr>It|#I<eFLg|Jo?
zm*FBV7CH7(=7QF@@{iB7*Xgb7bqG`9V(~w+p67^Rjzr+e_SbtJt(v0yF{VRFKuzvA
zljxFVk>wMAzG<qRamUMQ|GBvjm=YfqUNJr%KPCL)Q=9V8lU+~TuB(`Es0o~TJj2N1
zc;Vhuh58Q%XId9^daOxN=?FaWLZ<!lnZi3WLKZDpyH0jHM^vZB3XVgLGU;;0$BWmy
z&WcF>8Ylj~l0#MC)guc>cL((kTb50^cf;BFer}5MmM|g3+K%+Mg%#8D6*aQXUa(W1
zl`&OYa1!gMTaRzBc1>MU8?rOc^levvNaLE%7JC|Z?0fQ)BihpCR_RhfRXHKnP1hd3
zIM7mY|K?&hm%#Tb1`AK^38`X_?0;-h;wj?)V)lgpX)a+mjEa}KSM65zRPd8KzE0q?
zTg=Z!p*^Mr`B%L^x_3F8t2wn}chcn<+ro@_A`)7T)KBkPCd<iWd2?ycZtf2XaxB|4
zHXT~o`l;cxm}b}gSBD}M%&yBV&wJc?>DBis>t}WcoV{*wcx#vFp~p8kb!z;B_OF}7
z-p91@rGtKYE1Txs$aUAlFCFw%=+=$CI=OL?gW%*i@3zSfIg;D`SH5c6w5iL*AcjTg
z>f;wpT`p!aEJaSCGNxKWI|IZ$jQSUA3vgcT?LE~OAbNu9F=Ir>;$wVkt_W?=(coJ0
z%_1UiOY@5R#d5W4Y@B@+Zrb(<95^8J=(9%8LKOicId=|)Pm0HHJ~(9@!s2x9F-PNH
zn-@Q;muZUoYjCuzIWEYx<K3(xLzV3gC#q!@ZqS_GJL%YrV#)a{c#61MdXEbV&DmIy
z-m`P^=ao+;IV<Sc_D#6aCIo81$H;e@w`k0}!j$;7uqDk>%E$1>zZmh4CZ3uCf^zN|
z0WUXYhWocV^@lJCJ}o@r(CRc<B>mFS>4nJ+Y=X%q>u#U_DEGyus-|&;1yjSZ(&H=J
zg;zQ}S{8A%LT2N}>fIk=|8?Fyw5wKCaHEpPL^*daDa{)adbJ<oVx=4pal4$}G1EaR
zEZ%XK{VIo^pUMyRFMV`^W801Y*VTD=-?gpi`daAunnQAK0MkVyJ;M(Rsy=RTib`t@
z`hVTQVeh5=>wQ@~H;TAwT}l_x@=^~$=_+dpxMn)CF4E9l0qsxc9Fq8~FIKW^;$~LE
RRt5$J22WQ%mvv4FO#oXlhPeO$

literal 0
HcmV?d00001

-- 
GitLab