This commit is contained in:
number571 2025-10-04 23:38:36 +07:00
parent 32d1dc9231
commit 64748bc078
37 changed files with 326 additions and 195 deletions

View File

@ -4,7 +4,13 @@
## v1.7.11~
*April 30, 2025*
*??? ??, ????*
### IMPROVEMENTS
- `pkg/anonymity/qb`: move from pkg/anonymity -> pkg/anonymity/qb
- `pkg/anonymity/qb`: add WithDecryptors
- `pkg/client`: DecryptMessage with static time
### CHANGES

View File

@ -1,5 +0,0 @@
// Package anonymity allows you to perform network operations on top of anonymizing traffic.
//
// The package basically uses the fifth^ stage of anonymity with a queue-based problem.
// All applied connections use friend-to-friend (F2F) communications.
package anonymity

View File

@ -1,4 +1,4 @@
package anonymity
package qb
const (
cAction32bitMask = sAction(1 << 31)

View File

@ -1,4 +1,4 @@
package anonymity
package qb
import (
"context"
@ -7,8 +7,9 @@ import (
"sync"
"time"
"github.com/number571/go-peer/pkg/anonymity/adapters"
"github.com/number571/go-peer/pkg/anonymity/queue"
"github.com/number571/go-peer/pkg/anonymity/qb/adapters"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/hashing"
"github.com/number571/go-peer/pkg/crypto/random"
@ -19,7 +20,7 @@ import (
"github.com/number571/go-peer/pkg/state"
"github.com/number571/go-peer/pkg/storage/database"
anon_logger "github.com/number571/go-peer/pkg/anonymity/logger"
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
)
var (
@ -37,6 +38,7 @@ type sNode struct {
fMapPubKeys asymmetric.IMapPubKeys
fHandleRoutes map[uint32]IHandlerF
fHandleActions map[string]chan []byte
fDecryptors []client.IDecryptor
}
func NewNode(
@ -56,6 +58,7 @@ func NewNode(
fMapPubKeys: asymmetric.NewMapPubKeys(),
fHandleRoutes: make(map[uint32]IHandlerF, 64),
fHandleActions: make(map[string]chan []byte, 64),
fDecryptors: []client.IDecryptor{pQBProcessor.GetClient()},
}
}
@ -97,6 +100,14 @@ func (p *sNode) Run(pCtx context.Context) error {
}
}
func (p *sNode) WithDecryptors(pDecryptors ...client.IDecryptor) INode {
decryptors := make([]client.IDecryptor, 0, 1+len(pDecryptors))
decryptors = append(decryptors, p.fQBProcessor.GetClient())
decryptors = append(decryptors, pDecryptors...)
p.fDecryptors = decryptors
return p
}
func (p *sNode) runProducer(pCtx context.Context) error {
for {
select {
@ -225,6 +236,27 @@ func (p *sNode) recvResponse(pCtx context.Context, pActionKey string) ([]byte, e
}
}
func (p *sNode) tryDecryptMessage(pEncMsg []byte) (uint64, asymmetric.IPubKey, []byte, error) {
var (
id uint64
pubKey asymmetric.IPubKey
decMsg []byte
)
for i, d := range p.fDecryptors {
pk, dm, err := d.DecryptMessage(p.fMapPubKeys, pEncMsg)
if err != nil {
continue
}
id = uint64(i) // nolint: gosec
pubKey = pk
decMsg = dm
}
if pubKey == nil {
return 0, nil, nil, ErrDecryptMessage
}
return id, pubKey, decMsg, nil
}
func (p *sNode) consumeMessage(pCtx context.Context, pNetMsg layer1.IMessage) error {
logBuilder := anon_logger.NewLogBuilder(p.fSettings.GetServiceName())
@ -251,8 +283,8 @@ func (p *sNode) consumeMessage(pCtx context.Context, pNetMsg layer1.IMessage) er
return nil
}
// try decrypt message
pubKey, decMsg, err := client.DecryptMessage(p.fMapPubKeys, encMsg)
// try decrypt consumed message
id, pubKey, decMsg, err := p.tryDecryptMessage(encMsg)
if err != nil {
p.fLogger.PushInfo(logBuilder.WithType(anon_logger.CLogInfoUndecryptable))
return nil
@ -270,12 +302,13 @@ func (p *sNode) consumeMessage(pCtx context.Context, pNetMsg layer1.IMessage) er
}
// do request or response action
return p.handleDoAction(pCtx, logBuilder, pubKey, pld)
return p.handleDoAction(pCtx, logBuilder, id, pubKey, pld)
}
func (p *sNode) handleDoAction(
pCtx context.Context,
pLogBuilder anon_logger.ILogBuilder,
pID uint64,
pSender asymmetric.IPubKey,
pPld payload.IPayload64,
) error {
@ -288,7 +321,7 @@ func (p *sNode) handleDoAction(
if action.isRequest() {
// got request from another side (need generate response)
p.handleRequest(pCtx, pLogBuilder, pSender, head, body)
p.handleRequest(pCtx, pLogBuilder, pID, pSender, head, body)
return nil
}
@ -319,6 +352,7 @@ func (p *sNode) handleResponse(
func (p *sNode) handleRequest(
pCtx context.Context,
pLogBuilder anon_logger.ILogBuilder,
pID uint64,
pSender asymmetric.IPubKey,
pHead iHead,
pBody []byte,
@ -331,7 +365,7 @@ func (p *sNode) handleRequest(
}
// response can be nil
resp, err := f(pCtx, p, pSender, pBody)
resp, err := f(pCtx, p, pID, pSender, pBody)
if err != nil {
p.fLogger.PushWarn(pLogBuilder.WithType(anon_logger.CLogWarnIncorrectResponse))
return

View File

@ -1,5 +1,5 @@
// nolint: err113
package anonymity
package qb
import (
"context"
@ -11,8 +11,8 @@ import (
"testing"
"time"
"github.com/number571/go-peer/pkg/anonymity/adapters"
"github.com/number571/go-peer/pkg/anonymity/queue"
"github.com/number571/go-peer/pkg/anonymity/qb/adapters"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/hashing"
@ -26,7 +26,7 @@ import (
"github.com/number571/go-peer/pkg/storage/database"
testutils "github.com/number571/go-peer/test/utils"
anon_logger "github.com/number571/go-peer/pkg/anonymity/logger"
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
"github.com/number571/go-peer/pkg/network/conn"
)
@ -189,7 +189,7 @@ func TestFetchPayload(t *testing.T) {
nodes[1].HandleFunc(
tcHead,
func(_ context.Context, _ INode, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
func(_ context.Context, _ INode, _ uint64, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
return []byte(fmt.Sprintf("echo: '%s'", string(reqBytes))), nil
},
)
@ -238,7 +238,7 @@ func TestBroadcastPayload(t *testing.T) {
chResult := make(chan string)
nodes[1].HandleFunc(
tcHead,
func(_ context.Context, _ INode, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
func(_ context.Context, _ INode, _ uint64, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
res := fmt.Sprintf("echo: '%s'", string(reqBytes))
go func() { chResult <- res }()
return nil, nil
@ -386,7 +386,7 @@ func TestHandleWrapper(t *testing.T) {
node.HandleFunc(
111,
func(_ context.Context, _ INode, _ asymmetric.IPubKey, _ []byte) ([]byte, error) {
func(_ context.Context, _ INode, _ uint64, _ asymmetric.IPubKey, _ []byte) ([]byte, error) {
return nil, errors.New("some error") //nolint:err113
},
)
@ -600,7 +600,7 @@ func testRunNodes(ctx context.Context, t *testing.T, timeWait time.Duration, add
for _, node := range nodes {
node.HandleFunc(
tcHead,
func(_ context.Context, _ INode, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
func(_ context.Context, _ INode, _ uint64, _ asymmetric.IPubKey, reqBytes []byte) ([]byte, error) {
// send response
return []byte(string(reqBytes) + " (response)"), nil
},

5
pkg/anonymity/qb/doc.go Normal file
View File

@ -0,0 +1,5 @@
// Package qb allows you to perform network operations on top of anonymizing traffic.
//
// The package basically uses the fifth^ stage of qb with a queue-based problem.
// All applied connections use friend-to-friend (F2F) communications.
package qb

View File

@ -1,7 +1,7 @@
package anonymity
package qb
const (
errPrefix = "pkg/anonymity = "
errPrefix = "pkg/anonymity/qb = "
)
type SAnonymityError struct {
@ -30,4 +30,5 @@ var (
ErrRunning = &SAnonymityError{"node running"}
ErrProcessRun = &SAnonymityError{"process run"}
ErrHashAlreadyExist = &SAnonymityError{"hash already exist"}
ErrDecryptMessage = &SAnonymityError{"decrypt message"}
)

View File

@ -6,10 +6,10 @@ import (
"os"
"time"
"github.com/number571/go-peer/pkg/anonymity"
"github.com/number571/go-peer/pkg/anonymity/adapters"
anon_logger "github.com/number571/go-peer/pkg/anonymity/logger"
"github.com/number571/go-peer/pkg/anonymity/queue"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
"github.com/number571/go-peer/pkg/anonymity/qb/adapters"
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/logger"

View File

@ -5,7 +5,7 @@ import (
"fmt"
"time"
"github.com/number571/go-peer/pkg/anonymity"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/payload"
)
@ -45,7 +45,7 @@ func runServiceNode() anonymity.INode {
network, node := newNode("snode", nodeAddress)
node.HandleFunc(
nodeRouter,
func(_ context.Context, _ anonymity.INode, _ asymmetric.IPubKey, b []byte) ([]byte, error) {
func(_ context.Context, _ anonymity.INode, _ uint64, _ asymmetric.IPubKey, b []byte) ([]byte, error) {
return []byte("echo: " + string(b)), nil
},
)

View File

@ -6,10 +6,10 @@ import (
"os"
"time"
"github.com/number571/go-peer/pkg/anonymity"
"github.com/number571/go-peer/pkg/anonymity/adapters"
anon_logger "github.com/number571/go-peer/pkg/anonymity/logger"
"github.com/number571/go-peer/pkg/anonymity/queue"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
"github.com/number571/go-peer/pkg/anonymity/qb/adapters"
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/logger"

View File

@ -5,7 +5,7 @@ import (
"fmt"
"time"
"github.com/number571/go-peer/pkg/anonymity"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/encoding"
"github.com/number571/go-peer/pkg/payload"
@ -17,7 +17,7 @@ const (
)
var (
handler = func(ctx context.Context, n anonymity.INode, pubKey asymmetric.IPubKey, b []byte) ([]byte, error) {
handler = func(ctx context.Context, n anonymity.INode, _ uint64, pubKey asymmetric.IPubKey, b []byte) ([]byte, error) {
numBytes := [encoding.CSizeUint64]byte{}
copy(numBytes[:], b)

View File

@ -1,4 +1,4 @@
package anonymity
package qb
type iHead interface {
uint64() uint64

View File

@ -7,7 +7,7 @@ import (
"fmt"
"time"
"github.com/number571/go-peer/pkg/anonymity/queue"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/message/layer1"

View File

@ -1,4 +1,4 @@
package anonymity
package qb
import (
"time"

View File

@ -1,11 +1,12 @@
package anonymity
package qb
import (
"context"
"time"
"github.com/number571/go-peer/pkg/anonymity/adapters"
"github.com/number571/go-peer/pkg/anonymity/queue"
"github.com/number571/go-peer/pkg/anonymity/qb/adapters"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/client"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/logger"
"github.com/number571/go-peer/pkg/payload"
@ -14,7 +15,7 @@ import (
)
type (
IHandlerF func(context.Context, INode, asymmetric.IPubKey, []byte) ([]byte, error)
IHandlerF func(context.Context, INode, uint64, asymmetric.IPubKey, []byte) ([]byte, error)
)
type INode interface {
@ -28,6 +29,8 @@ type INode interface {
GetMapPubKeys() asymmetric.IMapPubKeys
GetQBProcessor() queue.IQBProblemProcessor
WithDecryptors(...client.IDecryptor) INode
SendPayload(context.Context, asymmetric.IPubKey, payload.IPayload64) error
FetchPayload(context.Context, asymmetric.IPubKey, payload.IPayload32) ([]byte, error)
}

View File

@ -21,9 +21,18 @@ var (
// Basic structure describing the user.
type sClient struct {
fPrivKey asymmetric.IPrivKey
fMessageSize uint64
fStructSize uint64
fPrivKey asymmetric.IPrivKey
fMessageSize uint64
fStructSize uint64
fStaticDecryptValues *sStaticDecryptValues
}
type sStaticDecryptValues struct {
fEncMsg layer2.IMessage
fSKey []byte
fDecSlice [][]byte
fPubKey asymmetric.IPubKey
fPayloadWrapper [][]byte
}
// Create client by private key as identification.
@ -45,7 +54,7 @@ func NewClient(pPrivKey asymmetric.IPrivKey, pMessageSize uint64) IClient {
panic("the payload size is lower than struct size")
}
return client
return client.withStaticDecryptValues()
}
func (p *sClient) GetMessageSize() uint64 {
@ -116,25 +125,89 @@ func (p *sClient) encryptWithParams(
).ToBytes(), nil
}
func (p *sClient) withStaticDecryptValues() *sClient {
encMsg, err := p.EncryptMessage(p.fPrivKey.GetPubKey(), []byte{})
if err != nil {
panic(err)
}
msg, err := layer2.LoadMessage(p.fMessageSize, encMsg)
if err != nil {
panic(ErrInitCheckMessage)
}
skey, err := p.fPrivKey.GetKEMPrivKey().Decapsulate(msg.GetEnck())
if err != nil {
panic(ErrDecryptCipherKey)
}
decJoiner := symmetric.NewCipher(skey).DecryptBytes(msg.GetEncd())
decSlice, err := joiner.LoadBytesJoiner32(decJoiner)
if err != nil || len(decSlice) != 5 {
panic(ErrDecodeBytesJoiner)
}
var (
pkid = decSlice[0]
salt = decSlice[1]
data = decSlice[2]
hash = decSlice[3]
sign = decSlice[4]
)
mapPubKeys := asymmetric.NewMapPubKeys(p.fPrivKey.GetPubKey())
sPubKey := mapPubKeys.GetPubKey(pkid)
if sPubKey == nil {
panic(ErrDecodePublicKey)
}
check := hashing.NewHMACHasher(salt, bytes.Join(
[][]byte{sPubKey.ToBytes(), p.fPrivKey.GetPubKey().ToBytes(), data},
[]byte{},
)).ToBytes()
if !bytes.Equal(check, hash) {
panic(ErrInvalidDataHash)
}
if !sPubKey.GetDSAPubKey().VerifyBytes(hash, sign) {
panic(ErrInvalidHashSign)
}
// Decode main data of message by session key.
payloadWrapper, err := joiner.LoadBytesJoiner32(data)
if err != nil || len(payloadWrapper) != 2 {
panic(ErrDecodePayloadWrapper)
}
p.fStaticDecryptValues = &sStaticDecryptValues{
fEncMsg: msg,
fSKey: skey,
fDecSlice: decSlice,
fPubKey: sPubKey,
fPayloadWrapper: payloadWrapper,
}
return p
}
// Decrypt message with private key of receiver.
// No one else except the sender will be able to decrypt the message.
func (p *sClient) DecryptMessage(pMapPubKeys asymmetric.IMapPubKeys, pMsg []byte) (asymmetric.IPubKey, []byte, error) {
var resultError error
msg, err := layer2.LoadMessage(p.fMessageSize, pMsg)
if err != nil {
return nil, nil, ErrInitCheckMessage
msg = p.fStaticDecryptValues.fEncMsg
resultError = ErrInitCheckMessage
}
// Decrypt session key by private key of receiver.
skey, err := p.fPrivKey.GetKEMPrivKey().Decapsulate(msg.GetEnck())
if err != nil {
return nil, nil, ErrDecryptCipherKey
skey = p.fStaticDecryptValues.fSKey
if resultError == nil {
resultError = ErrDecryptCipherKey
}
}
// Decrypt data block by decrypted session key. Decode data block.
decJoiner := symmetric.NewCipher(skey).DecryptBytes(msg.GetEncd())
decSlice, err := joiner.LoadBytesJoiner32(decJoiner)
if err != nil || len(decSlice) != 5 {
return nil, nil, ErrDecodeBytesJoiner
decSlice = p.fStaticDecryptValues.fDecSlice
if resultError == nil {
resultError = ErrDecodeBytesJoiner
}
}
// Decode wrapped data.
@ -149,7 +222,10 @@ func (p *sClient) DecryptMessage(pMapPubKeys asymmetric.IMapPubKeys, pMsg []byte
// Get public key from map by pkid (hash)
sPubKey := pMapPubKeys.GetPubKey(pkid)
if sPubKey == nil {
return nil, nil, ErrDecodePublicKey
sPubKey = p.fStaticDecryptValues.fPubKey
if resultError == nil {
resultError = ErrDecodePublicKey
}
}
// Validate received hash with generated hash.
@ -158,20 +234,27 @@ func (p *sClient) DecryptMessage(pMapPubKeys asymmetric.IMapPubKeys, pMsg []byte
[]byte{},
)).ToBytes()
if !bytes.Equal(check, hash) {
return nil, nil, ErrInvalidDataHash
if resultError == nil {
resultError = ErrInvalidDataHash
}
}
// Verify sign by public key of sender and hash of message.
if !sPubKey.GetDSAPubKey().VerifyBytes(hash, sign) {
return nil, nil, ErrInvalidHashSign
if resultError == nil {
resultError = ErrInvalidHashSign
}
}
// Decode main data of message by session key.
payloadWrapper, err := joiner.LoadBytesJoiner32(data)
if err != nil || len(payloadWrapper) != 2 {
return nil, nil, ErrDecodePayloadWrapper
payloadWrapper = p.fStaticDecryptValues.fPayloadWrapper
if resultError == nil {
resultError = ErrDecodePayloadWrapper
}
}
// Return public key of sender with payload.
return sPubKey, payloadWrapper[0], nil
return sPubKey, payloadWrapper[0], resultError
}

View File

@ -74,7 +74,8 @@ func TestInvalidKeys(t *testing.T) {
}
_client.fPrivKey = &tsPrivKey{}
if _, _, err := _client.DecryptMessage(nil, enc); err == nil {
mapPubKeys := asymmetric.NewMapPubKeys()
if _, _, err := _client.DecryptMessage(mapPubKeys, enc); err == nil {
t.Error("success decrypt with invalid privkey")
return
}
@ -220,7 +221,7 @@ func (p *tsPubKey) GetDSAPubKey() asymmetric.IDSAPubKey { return &tsDSAPubKey{}
func (p *tsPrivKey) ToString() string { return "" }
func (p *tsPrivKey) ToBytes() []byte { return nil }
func (p *tsPrivKey) GetPubKey() asymmetric.IPubKey { return nil }
func (p *tsPrivKey) GetPubKey() asymmetric.IPubKey { return &tsPubKey{} }
func (p *tsPrivKey) GetKEMPrivKey() asymmetric.IKEMPrivKey { return &tsKEMPrivKey{} }
func (p *tsPrivKey) GetDSAPrivKey() asymmetric.IDSAPrivKey { return &tsDSAPrivKey{} }

View File

@ -5,11 +5,19 @@ import (
)
type IClient interface {
GetMessageSize() uint64
GetPayloadLimit() uint64
IEncryptor
IDecryptor
GetPrivKey() asymmetric.IPrivKey
EncryptMessage(asymmetric.IPubKey, []byte) ([]byte, error)
GetMessageSize() uint64
GetPayloadLimit() uint64
}
type IDecryptor interface {
DecryptMessage(asymmetric.IMapPubKeys, []byte) (asymmetric.IPubKey, []byte, error)
}
type IEncryptor interface {
EncryptMessage(asymmetric.IPubKey, []byte) ([]byte, error)
}

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="code lines: 12322"><title>code lines: 12322</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="57" height="20" fill="#555"/><rect x="57" width="40" height="20" fill="#4682b4"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="295" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">code lines</text><text x="295" y="140" transform="scale(.1)" fill="#fff" textLength="510">code lines</text><text aria-hidden="true" x="770" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="320">12322</text><text x="770" y="140" transform="scale(.1)" fill="#fff" textLength="320">12322</text></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="code lines: 9551"><title>code lines: 9551</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="57" height="20" fill="#555"/><rect x="57" width="40" height="20" fill="#4682b4"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="295" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">code lines</text><text x="295" y="140" transform="scale(.1)" fill="#fff" textLength="510">code lines</text><text aria-hidden="true" x="770" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="320">9551</text><text x="770" y="140" transform="scale(.1)" fill="#fff" textLength="320">9551</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 97%"><title>coverage: 97%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#97ca00"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">97%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">97%</text></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20" role="img" aria-label="coverage: 96%"><title>coverage: 96%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="61" height="20" fill="#555"/><rect x="61" width="35" height="20" fill="#97ca00"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="315" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="510">coverage</text><text x="315" y="140" transform="scale(.1)" fill="#fff" textLength="510">coverage</text><text aria-hidden="true" x="775" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">96%</text><text x="775" y="140" transform="scale(.1)" fill="#fff" textLength="250">96%</text></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -7,7 +7,7 @@
>
<g>
<rect x="20.000000" y="20.000000" width="988.000000" height="600.000000" style="fill: rgb(4, 115, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="20.000000" y="20.000000" width="988.000000" height="600.000000" style="fill: rgb(7, 120, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -20,7 +20,7 @@
<g>
<rect x="28.000000" y="41.600000" width="960.834356" height="570.400000" style="fill: rgb(4, 115, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="28.000000" y="41.600000" width="961.356725" height="570.400000" style="fill: rgb(7, 120, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -33,44 +33,44 @@
<g>
<rect x="996.834356" y="41.600000" width="3.165644" height="570.400000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="997.356725" y="41.600000" width="2.643275" height="570.400000" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="36.000000" y="63.200000" width="503.895053" height="284.512211" style="fill: rgb(4, 114, 60);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="36.000000" y="63.200000" width="492.834361" height="291.104823" style="fill: rgb(7, 121, 64);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(44.000000,78.800000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">anonymity</text>
data-math="N">anonymity/qb</text>
</g>
<g>
<rect x="739.355540" y="292.392337" width="133.371329" height="159.236568" style="fill: rgb(8, 122, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="536.834361" y="276.079715" width="201.160046" height="184.256264" style="fill: rgb(47, 160, 84);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(747.355540,307.992337) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
transform="translate(544.834361,291.679715) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">client</text>
</g>
<g>
<rect x="547.895053" y="63.200000" width="432.939303" height="221.192337" style="fill: rgb(2, 110, 58);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="536.834361" y="63.200000" width="444.522364" height="204.879715" style="fill: rgb(2, 110, 58);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(555.895053,78.800000) scale(1.000000)"
transform="translate(544.834361,78.800000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">crypto</text>
@ -78,12 +78,12 @@
<g>
<rect x="842.797976" y="459.628905" width="138.036380" height="80.883139" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="846.900734" y="463.105604" width="134.455991" height="78.855065" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(850.797976,475.228905) scale(1.000000)"
transform="translate(854.900734,478.705604) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">encoding</text>
@ -91,12 +91,12 @@
<g>
<rect x="739.355540" y="459.628905" width="95.442436" height="144.371095" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="745.994407" y="463.105604" width="92.906327" height="140.894396" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(747.355540,475.228905) scale(1.000000)"
transform="translate(753.994407,478.705604) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger</text>
@ -104,12 +104,12 @@
<g>
<rect x="547.895053" y="292.392337" width="183.460487" height="156.646372" style="fill: rgb(2, 111, 58);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="536.834361" y="468.335979" width="201.160046" height="135.664021" style="fill: rgb(2, 111, 58);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(555.895053,307.992337) scale(1.000000)"
transform="translate(544.834361,483.935979) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">message</text>
@ -117,12 +117,12 @@
<g>
<rect x="36.000000" y="355.712211" width="503.895053" height="248.287789" style="fill: rgb(9, 124, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="36.000000" y="362.304823" width="492.834361" height="241.695177" style="fill: rgb(9, 124, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(44.000000,371.312211) scale(1.000000)"
transform="translate(44.000000,377.904823) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">network</text>
@ -130,12 +130,12 @@
<g>
<rect x="880.726869" y="292.392337" width="100.107487" height="159.236568" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="897.209828" y="276.079715" width="84.146897" height="179.025888" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(888.726869,307.992337) scale(1.000000)"
transform="translate(905.209828,291.679715) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload</text>
@ -143,12 +143,12 @@
<g>
<rect x="842.797976" y="548.512044" width="138.036380" height="55.487956" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="846.900734" y="549.960668" width="134.455991" height="54.039332" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(850.797976,564.112044) scale(1.000000)"
transform="translate(854.900734,565.560668) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">state</text>
@ -156,12 +156,12 @@
<g>
<rect x="547.895053" y="457.038709" width="183.460487" height="146.961291" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="745.994407" y="276.079715" width="143.215421" height="179.025888" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(555.895053,472.638709) scale(1.000000)"
transform="translate(753.994407,291.679715) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">storage</text>
@ -169,12 +169,12 @@
<g>
<rect x="432.675466" y="268.654693" width="53.268335" height="31.528759" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="428.953892" y="273.264911" width="49.074553" height="32.519956" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(440.675466,284.254693) scale(0.431346)"
transform="translate(436.953892,288.864911) scale(0.382807)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">action.go</text>
@ -182,13 +182,13 @@
<g>
<rect x="493.943801" y="312.575537" width="26.463439" height="27.136675" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="486.028446" y="318.287085" width="24.104436" height="28.017739" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="44.000000" y="84.800000" width="268.350184" height="254.912211" style="fill: rgb(2, 112, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="44.000000" y="84.800000" width="272.317211" height="261.504823" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
@ -201,18 +201,18 @@
<g>
<rect x="528.407240" y="312.575537" width="3.487813" height="27.136675" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="518.132882" y="318.287085" width="2.701479" height="28.017739" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="493.943801" y="268.654693" width="37.951252" height="35.920843" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="486.028446" y="273.264911" width="34.805915" height="37.022173" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(501.943801,284.254693) scale(0.326656)"
transform="translate(494.028446,288.864911) scale(0.279850)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">head.go</text>
@ -220,12 +220,12 @@
<g>
<rect x="320.350184" y="268.654693" width="104.325282" height="71.057518" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="324.317211" y="273.264911" width="96.636681" height="73.039912" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(328.350184,284.254693) scale(0.438121)"
transform="translate(332.317211,288.864911) scale(0.399984)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger/log_builder.go</text>
@ -233,12 +233,12 @@
<g>
<rect x="320.350184" y="84.800000" width="211.544869" height="175.854693" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="324.317211" y="84.800000" width="196.517149" height="180.464911" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(328.350184,100.400000) scale(1.000000)"
transform="translate(332.317211,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">queue</text>
@ -246,12 +246,12 @@
<g>
<rect x="432.675466" y="308.183452" width="53.268335" height="31.528759" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="428.953892" y="313.784867" width="49.074553" height="32.519956" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(440.675466,323.783452) scale(0.352920)"
transform="translate(436.953892,329.384867) scale(0.313206)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -259,25 +259,25 @@
<g>
<rect x="747.355540" y="313.992337" width="117.371329" height="126.937812" style="fill: rgb(8, 123, 65);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="544.834361" y="297.679715" width="183.037408" height="154.656264" style="fill: rgb(48, 160, 84);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(755.355540,329.592337) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
transform="translate(552.834361,313.279715) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">client.go</text>
</g>
<g>
<rect x="555.895053" y="84.800000" width="249.302697" height="191.592337" style="fill: rgb(2, 111, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="544.834361" y="84.800000" width="256.316294" height="175.279715" style="fill: rgb(2, 111, 59);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(563.895053,100.400000) scale(1.000000)"
transform="translate(552.834361,100.400000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">asymmetric</text>
@ -285,12 +285,12 @@
<g>
<rect x="874.778544" y="225.697516" width="84.798835" height="50.694821" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="892.476173" y="202.013771" width="69.770483" height="58.065944" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(882.778544,241.297516) scale(1.000000)"
transform="translate(900.476173,217.613771) scale(0.800156)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">hashing</text>
@ -298,18 +298,18 @@
<g>
<rect x="967.577379" y="225.697516" width="5.256976" height="50.694821" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="970.246656" y="202.013771" width="3.110069" height="58.065944" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="813.197750" y="84.800000" width="159.636606" height="77.871122" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="809.150655" y="84.800000" width="107.847720" height="109.213771" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(821.197750,100.400000) scale(0.935134)"
transform="translate(817.150655,100.400000) scale(0.597967)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">puzzle/puzzle.go</text>
@ -317,12 +317,12 @@
<g>
<rect x="874.778544" y="170.671122" width="98.055812" height="47.026395" style="fill: rgb(16, 136, 71);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="809.150655" y="202.013771" width="75.325518" height="58.065944" style="fill: rgb(16, 136, 71);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(882.778544,186.271122) scale(0.534218)"
transform="translate(817.150655,217.613771) scale(0.386234)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">random/random.go</text>
@ -330,12 +330,12 @@
<g>
<rect x="813.197750" y="170.671122" width="53.580794" height="105.721215" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="924.998375" y="84.800000" width="48.358350" height="109.213771" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(821.197750,186.271122) scale(0.177939)"
transform="translate(932.998375,100.400000) scale(0.153212)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">symmetric/symmetric.go</text>
@ -343,12 +343,12 @@
<g>
<rect x="850.797976" y="481.228905" width="47.729877" height="51.283139" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="854.900734" y="484.705604" width="46.195425" height="49.255065" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(858.797976,496.828905) scale(0.413149)"
transform="translate(862.900734,500.305604) scale(0.393170)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">bytes.go</text>
@ -356,30 +356,30 @@
<g>
<rect x="952.969417" y="530.631521" width="19.864939" height="1.880523" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="954.259013" y="532.418157" width="19.097712" height="1.542511" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="906.527853" y="481.228905" width="38.441564" height="21.641569" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="909.096159" y="484.705604" width="37.162854" height="20.627532" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="906.527853" y="510.870474" width="38.441564" height="21.641569" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="909.096159" y="513.333136" width="37.162854" height="20.627532" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="952.969417" y="481.228905" width="19.864939" height="41.402616" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="954.259013" y="484.705604" width="19.097712" height="39.712554" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(960.969417,496.828905) scale(0.023682)"
transform="translate(962.259013,500.305604) scale(0.018981)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">serialize_yaml.go</text>
@ -387,12 +387,12 @@
<g>
<rect x="747.355540" y="481.228905" width="79.442436" height="96.716522" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="753.994407" y="484.705604" width="76.906327" height="93.751103" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(755.355540,496.828905) scale(0.734287)"
transform="translate(761.994407,500.305604) scale(0.704934)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">logger.go</text>
@ -400,18 +400,18 @@
<g>
<rect x="747.355540" y="585.945427" width="79.442436" height="10.054573" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="753.994407" y="586.456706" width="76.906327" height="9.543294" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="555.895053" y="313.992337" width="118.434763" height="127.046372" style="fill: rgb(3, 113, 60);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="544.834361" y="489.935979" width="131.188857" height="106.064021" style="fill: rgb(3, 113, 60);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(563.895053,329.592337) scale(1.000000)"
transform="translate(552.834361,505.535979) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">layer1</text>
@ -419,12 +419,12 @@
<g>
<rect x="682.329815" y="313.992337" width="41.025724" height="127.046372" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="684.023218" y="489.935979" width="45.971189" height="106.064021" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(690.329815,329.592337) scale(0.434474)"
transform="translate(692.023218,505.535979) scale(0.520333)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">layer2</text>
@ -432,12 +432,12 @@
<g>
<rect x="282.309990" y="377.312211" width="160.218817" height="218.687789" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="276.994604" y="383.904823" width="156.466780" height="212.095177" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(290.309990,392.912211) scale(1.000000)"
transform="translate(284.994604,399.504823) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">conn</text>
@ -445,12 +445,12 @@
<g>
<rect x="450.528807" y="377.312211" width="81.366246" height="147.570051" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="441.461384" y="383.904823" width="79.372977" height="143.045710" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(458.528807,392.912211) scale(0.680898)"
transform="translate(449.461384,399.504823) scale(0.660135)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">connkeeper</text>
@ -458,12 +458,12 @@
<g>
<rect x="44.000000" y="377.312211" width="230.309990" height="218.687789" style="fill: rgb(22, 146, 77);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="44.000000" y="383.904823" width="224.994604" height="212.095177" style="fill: rgb(22, 146, 77);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(52.000000,392.912211) scale(1.000000)"
transform="translate(52.000000,399.504823) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
data-math="N">network.go</text>
@ -471,12 +471,12 @@
<g>
<rect x="450.528807" y="532.882262" width="75.780856" height="63.117738" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="441.461384" y="534.950533" width="73.912166" height="61.049467" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(458.528807,548.482262) scale(0.566107)"
transform="translate(449.461384,550.550533) scale(0.548411)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -484,12 +484,12 @@
<g>
<rect x="888.726869" y="313.992337" width="84.107487" height="59.053712" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="905.209828" y="297.679715" width="68.146897" height="68.694664" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(896.726869,329.592337) scale(1.000000)"
transform="translate(913.209828,313.279715) scale(0.905328)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">joiner</text>
@ -497,12 +497,12 @@
<g>
<rect x="888.726869" y="381.046050" width="38.053743" height="62.582855" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="905.209828" y="374.374379" width="68.146897" height="32.365612" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(896.726869,396.646050) scale(0.191439)"
transform="translate(913.209828,389.974379) scale(0.452664)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload32.go</text>
@ -510,12 +510,12 @@
<g>
<rect x="934.780612" y="381.046050" width="38.053743" height="62.582855" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="905.209828" y="414.739991" width="68.146897" height="32.365612" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(942.780612,396.646050) scale(0.191439)"
transform="translate(913.209828,430.339991) scale(0.452664)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">payload64.go</text>
@ -523,18 +523,18 @@
<g>
<rect x="850.797976" y="570.112044" width="115.534561" height="25.887956" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="854.900734" y="571.560668" width="112.133192" height="24.439332" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="665.557857" y="478.638709" width="57.797683" height="117.361291" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="753.994407" y="396.070895" width="127.215421" height="51.034708" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(673.557857,494.238709) scale(0.362827)"
transform="translate(761.994407,411.670895) scale(0.965412)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">cache/lru.go</text>
@ -542,12 +542,12 @@
<g>
<rect x="555.895053" y="478.638709" width="101.662804" height="117.361291" style="fill: rgb(11, 128, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="753.994407" y="297.679715" width="127.215421" height="90.391180" style="fill: rgb(11, 128, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(563.895053,494.238709) scale(1.000000)"
transform="translate(761.994407,313.279715) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">database</text>
@ -555,18 +555,18 @@
<g>
<rect x="499.327874" y="251.013775" width="24.567179" height="1.640918" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="490.671617" y="255.335854" width="22.162744" height="1.929057" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="328.350184" y="106.400000" width="162.977690" height="146.254693" style="fill: rgb(10, 126, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="332.317211" y="106.400000" width="150.354405" height="150.864911" style="fill: rgb(10, 126, 67);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(336.350184,122.000000) scale(1.000000)"
transform="translate(340.317211,122.000000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">queue.go</text>
@ -574,12 +574,12 @@
<g>
<rect x="499.327874" y="106.400000" width="24.567179" height="136.613775" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="490.671617" y="106.400000" width="22.162744" height="140.935854" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(507.327874,122.000000) scale(0.081129)"
transform="translate(498.671617,122.000000) scale(0.058359)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -587,12 +587,12 @@
<g>
<rect x="660.781742" y="106.400000" width="65.354163" height="127.563509" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="652.537115" y="106.400000" width="67.486242" height="114.554710" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(668.781742,122.000000) scale(0.856843)"
transform="translate(660.537115,122.000000) scale(0.893858)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">dsa.go</text>
@ -600,12 +600,12 @@
<g>
<rect x="734.135905" y="106.400000" width="63.061845" height="127.563509" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="728.023357" y="106.400000" width="65.127297" height="114.554710" style="fill: rgb(6, 119, 63);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(742.135905,122.000000) scale(0.817046)"
transform="translate(736.023357,122.000000) scale(0.852904)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">kem.go</text>
@ -613,12 +613,12 @@
<g>
<rect x="563.895053" y="106.400000" width="88.886689" height="161.992337" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="552.834361" y="106.400000" width="91.702754" height="145.679715" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(571.895053,122.000000) scale(1.000000)"
transform="translate(560.834361,122.000000) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">key.go</text>
@ -626,36 +626,30 @@
<g>
<rect x="660.781742" y="241.963509" width="136.416008" height="26.428828" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="652.537115" y="228.954710" width="140.613540" height="23.125006" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="926.663593" y="247.297516" width="24.913787" height="21.094821" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="935.773592" y="223.613771" width="18.473064" height="28.465944" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="882.778544" y="247.297516" width="35.885049" height="21.094821" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="900.476173" y="223.613771" width="27.297419" height="28.465944" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="649.538338" y="431.452675" width="16.791477" height="1.586034" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="563.895053" y="335.592337" width="77.643285" height="97.446372" style="fill: rgb(5, 116, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="552.834361" y="511.535979" width="87.534216" height="76.464021" style="fill: rgb(5, 116, 61);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(571.895053,351.192337) scale(0.642118)"
transform="translate(560.834361,527.135979) scale(0.745148)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">message.go</text>
@ -663,12 +657,12 @@
<g>
<rect x="649.538338" y="335.592337" width="16.791477" height="87.860338" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="648.368576" y="511.535979" width="19.654641" height="68.785474" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(657.538338,351.192337) scale(0.007495)"
transform="translate(656.368576,527.135979) scale(0.034608)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -676,12 +670,12 @@
<g>
<rect x="690.329815" y="335.592337" width="25.025724" height="91.896563" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="692.023218" y="511.535979" width="29.971189" height="72.018546" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(698.329815,351.192337) scale(0.094018)"
transform="translate(700.023218,527.135979) scale(0.145533)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">message.go</text>
@ -689,12 +683,12 @@
<g>
<rect x="290.309990" y="398.912211" width="144.218817" height="145.974835" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="284.994604" y="405.504823" width="140.466780" height="140.824357" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(298.309990,414.512211) scale(1.000000)"
transform="translate(292.994604,421.104823) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">conn.go</text>
@ -702,12 +696,12 @@
<g>
<rect x="290.309990" y="552.887046" width="136.970301" height="35.112954" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="284.994604" y="554.329180" width="133.396933" height="33.670820" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(298.309990,568.487046) scale(1.000000)"
transform="translate(292.994604,569.929180) scale(1.000000)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">settings.go</text>
@ -715,12 +709,12 @@
<g>
<rect x="458.528807" y="398.912211" width="65.366246" height="85.577752" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="449.461384" y="405.504823" width="63.372977" height="82.216813" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(466.528807,414.512211) scale(0.395563)"
transform="translate(457.461384,421.104823) scale(0.379591)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">connkeeper.go</text>
@ -728,30 +722,31 @@
<g>
<rect x="523.743248" y="492.489963" width="0.151805" height="24.392299" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="449.461384" y="495.721636" width="55.442646" height="23.228897" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="458.528807" y="492.489963" width="57.214441" height="24.392299" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="896.726869" y="335.592337" width="64.101830" height="29.453712" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
</g>
<g>
<rect x="563.895053" y="500.238709" width="85.662804" height="85.367259" style="fill: rgb(12, 128, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<rect x="913.209828" y="319.279715" width="48.981271" height="39.094664" style="fill: rgb(0, 104, 55);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(571.895053,515.838709) scale(0.659686)"
transform="translate(921.209828,334.879715) scale(0.312323)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">joiner32.go</text>
</g>
<g>
<rect x="761.994407" y="319.279715" width="108.235035" height="60.791180" style="fill: rgb(12, 128, 68);opacity:1;fill-opacity:1.00;stroke:rgb(128,128,128);stroke-width:1px;stroke-opacity:1.00;" />
<text
data-notex="1"
text-anchor="start"
transform="translate(769.994407,334.879715) scale(0.873438)"
style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(255, 255, 255); fill-opacity: 1.00; white-space: pre;"
data-math="N">database.go</text>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB